FinanceDepositServiceImpl.java 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166
  1. package com.crm.pay.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.crm.pay.dao.mapper.FinanceDepositMapper;
  4. import com.crm.pay.dao.mapper.GoldenOrderMapper;
  5. import com.crm.pay.dao.repository.*;
  6. import com.crm.pay.entity.FinanceDepositCallbackUpdateEntity;
  7. import com.crm.pay.entity.FinanceDepositCallbackValidateUpdateEntity;
  8. import com.crm.pay.service.*;
  9. import com.crm.rely.backend.configuration.LocaleMessage;
  10. import com.crm.rely.backend.core.constant.Constants;
  11. import com.crm.rely.backend.core.constant.EmailSendEnum;
  12. import com.crm.rely.backend.core.constant.MapConstants;
  13. import com.crm.rely.backend.core.constant.StatusConstants;
  14. import com.crm.rely.backend.core.dto.base.BaseResultDto;
  15. import com.crm.rely.backend.core.dto.base.PageDto;
  16. import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
  17. import com.crm.rely.backend.core.entity.system.email.SysEmailSendEntity;
  18. import com.crm.rely.backend.core.entity.web.notice.record.WebNoticeRecordAndEmailMqEntity;
  19. import com.crm.rely.backend.core.exception.PayValidatedException;
  20. import com.crm.rely.backend.core.exception.ServiceException;
  21. import com.crm.rely.backend.core.pojo.table.SysConfigTable;
  22. import com.crm.rely.backend.model.constant.ConfigConstants;
  23. import com.crm.rely.backend.model.constant.EmailTemplateConstants;
  24. import com.crm.rely.backend.model.constant.PayConstants;
  25. import com.crm.rely.backend.model.dto.finance.deposit.FinanceDepositDto;
  26. import com.crm.rely.backend.model.entity.finance.deposit.FinanceDepositAddEntity;
  27. import com.crm.rely.backend.model.entity.finance.deposit.FinanceDepositApproveEntity;
  28. import com.crm.rely.backend.model.entity.finance.deposit.FinanceDepositDeleteEntity;
  29. import com.crm.rely.backend.model.entity.finance.deposit.FinanceDepositSearchListEntity;
  30. import com.crm.rely.backend.model.entity.sys.config.SysConfigAutolimitEntity;
  31. import com.crm.rely.backend.model.entity.sys.config.SysConfigFinanceEntity;
  32. import com.crm.rely.backend.model.pojo.table.*;
  33. import com.crm.rely.backend.model.pojo.view.FinanceDepositView;
  34. import com.crm.rely.backend.model.util.CustomInfoUtil;
  35. import com.crm.rely.backend.service.EmailService;
  36. import com.crm.rely.backend.service.MqSendService;
  37. import com.crm.rely.backend.service.RedisService;
  38. import com.crm.rely.backend.util.*;
  39. import com.google.common.base.Strings;
  40. import lombok.extern.log4j.Log4j;
  41. import org.apache.commons.lang3.StringUtils;
  42. import org.springframework.beans.BeanUtils;
  43. import org.springframework.beans.factory.annotation.Autowired;
  44. import org.springframework.jms.annotation.JmsListener;
  45. import org.springframework.stereotype.Service;
  46. import org.springframework.transaction.annotation.Propagation;
  47. import org.springframework.transaction.annotation.Transactional;
  48. import org.springframework.web.context.request.RequestAttributes;
  49. import org.springframework.web.context.request.RequestContextHolder;
  50. import org.springframework.web.context.request.ServletRequestAttributes;
  51. import javax.servlet.http.HttpServletRequest;
  52. import java.math.BigDecimal;
  53. import java.sql.Time;
  54. import java.util.*;
  55. /**
  56. * @description:
  57. * @author: houn
  58. * @create: 2019-05-05 20:31
  59. */
  60. @Log4j
  61. @Service
  62. public class FinanceDepositServiceImpl implements FinanceDepositService {
  63. @Autowired
  64. private LocaleMessage localeMessage;
  65. @Autowired
  66. private FinanceDepositRepository financeDepositRepository;
  67. @Autowired
  68. private FinanceDepositMapper financeDepositMapper;
  69. @Autowired
  70. private SysConfigService sysConfigService;
  71. @Autowired
  72. private CustomLoginService customLoginService;
  73. @Autowired
  74. private CustomInfoRepository customInfoRepository;
  75. @Autowired
  76. private SysRemittanceChannelService sysRemittanceChannelService;
  77. @Autowired
  78. private SysChannelBankService sysChannelBankService;
  79. @Autowired
  80. private FinanceRateService financeRateService;
  81. @Autowired
  82. private GoldenOrderRepository goldenOrderRepository;
  83. @Autowired
  84. private GoldenOrderDetailsRepository goldenOrderDetailsRepository;
  85. @Autowired
  86. private GoldenGoodsRepository goldenGoodsRepository;
  87. @Autowired
  88. private GoldenOrderMapper goldenOrderMapper;
  89. @Autowired
  90. private RedisService redisService;
  91. @Autowired
  92. private SysRemittanceChannelRepository sysRemittanceChannelRepository;
  93. @Autowired
  94. private EmailService emailService;
  95. @Autowired
  96. private MqSendService mqSendService;
  97. /**
  98. * 保存入金信息
  99. *
  100. * @param balanceSaveEntity 入金实体
  101. * @return
  102. * @throws ServiceException
  103. * @throws PayValidatedException
  104. */
  105. @Override
  106. @Transactional(rollbackFor = Exception.class)
  107. public FinanceDepositTable save(FinanceDepositAddEntity balanceSaveEntity)
  108. throws ServiceException, PayValidatedException {
  109. //获取入金通道
  110. SysRemittanceChannelTable channel =
  111. sysRemittanceChannelService.getSysRemittanceChannelByCode(balanceSaveEntity.getPayType());
  112. if (channel == null) {
  113. throw new ServiceException(PayConstants.FINANCE_DEPOSIT_CHANNEL_NOT_EMPTY);
  114. }
  115. return save(balanceSaveEntity, channel);
  116. }
  117. /**
  118. * 添加支付订单 以后有种支付方式 调用此方法
  119. *
  120. * @param balanceSaveEntity 入金保存信息
  121. * @param channel 入金通道信息
  122. * @return 支付url
  123. */
  124. @Override
  125. @Transactional(rollbackFor = Exception.class)
  126. public FinanceDepositTable save(FinanceDepositAddEntity balanceSaveEntity, SysRemittanceChannelTable channel)
  127. throws ServiceException, PayValidatedException {
  128. return save(balanceSaveEntity, null, channel);
  129. }
  130. @Override
  131. @Transactional(rollbackFor = Exception.class)
  132. public FinanceDepositTable save(FinanceDepositAddEntity balanceSaveEntity, SysChannelBankTable sysChannelBankTable,
  133. SysRemittanceChannelTable channel)
  134. throws ServiceException, PayValidatedException {
  135. List<GoldenGoodsTable> goodsTables = goldenGoodsRepository.findAllByIdIn(balanceSaveEntity.getGoodIds());
  136. BigDecimal goodsPrice = BigDecimal.ZERO;
  137. for (GoldenGoodsTable goldenGoodsTable : goodsTables) {
  138. goodsPrice = goodsPrice.add(goldenGoodsTable.getGoodsPrice());
  139. }
  140. if (goodsPrice.compareTo(balanceSaveEntity.getAmount()) > 0 ) {
  141. throw new ServiceException("goods_amount_error");
  142. }
  143. GoldenOrderDetailsTable detailsTable = goldenOrderMapper.getByCustomIdAndGoodsIdIn(balanceSaveEntity.getAddUser(), balanceSaveEntity.getGoodIds());
  144. if(detailsTable != null){
  145. throw new ServiceException("goods_purchased_error");
  146. }
  147. if (Strings.isNullOrEmpty(balanceSaveEntity.getCurrency())) {
  148. balanceSaveEntity.setCurrency(channel.getCurrency());
  149. }
  150. if (Strings.isNullOrEmpty(balanceSaveEntity.getTransformCurrency()) && sysChannelBankTable == null) {
  151. balanceSaveEntity.setTransformCurrency(channel.getTransformCurrency());
  152. }
  153. if (balanceSaveEntity.getActivityDeposit() == null) {
  154. balanceSaveEntity.setActivityDeposit(0);
  155. }
  156. if (balanceSaveEntity.getCustomId() == null && balanceSaveEntity.getAddUser() != null) {
  157. balanceSaveEntity.setCustomId(balanceSaveEntity.getAddUser());
  158. }
  159. //验证通道
  160. if (channel == null) {
  161. throw new ServiceException(PayConstants.FINANCE_DEPOSIT_CHANNEL_NOT_EMPTY);
  162. }
  163. //获取通道银行列表
  164. if (sysChannelBankTable == null) {
  165. sysChannelBankTable = getChannelBank(balanceSaveEntity, channel);
  166. }
  167. //判断支付系统中是否已经计算过金额 如果为空 则在这里计算
  168. BigDecimal transformAmount = getTransformAmount(balanceSaveEntity, channel);
  169. //验证订单金额是否在可入金额范围内
  170. validatedAmount(balanceSaveEntity, channel, sysChannelBankTable);
  171. //获取用户信息
  172. CustomInfoTable customInfoTable = getCustomInfo(balanceSaveEntity);
  173. //如果存在限制国家
  174. if (!Strings.isNullOrEmpty(channel.getCountrys())) {
  175. //分割国家
  176. List<String> countrys = Arrays.asList(channel.getCountrys().split(","));
  177. //判断国家 如果国家不在列表中 则拒绝
  178. if (!countrys.contains(customInfoTable.getCountry())) {
  179. throw ServiceException.exception(Constants.NOT_PERMIT);
  180. }
  181. }
  182. //如果存在省份限制
  183. if (!Strings.isNullOrEmpty(channel.getStates())) {
  184. //分割国家
  185. List<String> states = Arrays.asList(channel.getStates().split(","));
  186. //判断国家 如果国家不在列表中 则拒绝
  187. if (!states.contains(customInfoTable.getState())) {
  188. throw ServiceException.exception(Constants.NOT_PERMIT);
  189. }
  190. }
  191. //使用优惠码
  192. //MarketPromoCodeTable marketPromoCodeTable = usePromoCode(balanceSaveEntity, customInfoTable);
  193. //获取交易账号信息
  194. //CustomLoginTable customLoginTable = getCustomLogin(balanceSaveEntity);
  195. //验证是否信用可亏损
  196. //validatedCreditLoss(balanceSaveEntity, customLoginTable, marketPromoCodeTable);
  197. //设置入金实体的汇率
  198. setFinanceDepositAddRate(balanceSaveEntity, channel, sysChannelBankTable);
  199. Long cId = customInfoTable.getCId();
  200. //构建订单
  201. FinanceDepositTable financeDepositTable = new FinanceDepositTable();
  202. financeDepositTable.setCustomId(balanceSaveEntity.getCustomId());
  203. financeDepositTable.setCId(cId);
  204. financeDepositTable.setCallbackValidateMq(balanceSaveEntity.getCallbackValidateMq());
  205. if (balanceSaveEntity.getCallbackValidate() != null) {
  206. financeDepositTable.setCallbackValidate(2);
  207. } else {
  208. financeDepositTable.setCallbackValidate(null);
  209. }
  210. financeDepositTable.setDepositCurrency(balanceSaveEntity.getCurrency());
  211. //financeDepositTable.setPromoCode(balanceSaveEntity.getPromoCode());
  212. financeDepositTable.setBankMsg(balanceSaveEntity.getBankMsg());
  213. financeDepositTable.setCallbackMq(balanceSaveEntity.getCallbackMq());
  214. financeDepositTable.setExtParam(balanceSaveEntity.getExtParam());
  215. financeDepositTable.setAmount(balanceSaveEntity.getAmount());
  216. financeDepositTable.setStatus(PayConstants.APPLY_STATUS);
  217. financeDepositTable.setCallbackStatus(PayConstants.CALLBACE_PROCESSING_STATUS);
  218. financeDepositTable.setDepositStatus(PayConstants.MANAGER_PENDING_STATUS);
  219. financeDepositTable.setSubmitStatus(PayConstants.SUBMIT_PENDING_STATUS);
  220. financeDepositTable.setBankCode(balanceSaveEntity.getBankCode());
  221. financeDepositTable.setPayType(balanceSaveEntity.getPayType());
  222. financeDepositTable.setCurrency(balanceSaveEntity.getCurrency());
  223. financeDepositTable.setTransformCurrency(balanceSaveEntity.getTransformCurrency());
  224. financeDepositTable.setVoucherUrl(balanceSaveEntity.getVoucherUrl());
  225. financeDepositTable.setActivityDeposit(balanceSaveEntity.getActivityDeposit());
  226. if (balanceSaveEntity.getActivityDeposit() != null && balanceSaveEntity.getActivityDeposit().equals(1)) {
  227. financeDepositTable.setActivityStatus(1);
  228. } else {
  229. financeDepositTable.setActivityStatus(2);
  230. }
  231. if ("cny".equals(financeDepositTable.getTransformCurrency().toLowerCase())
  232. || "thb".equals(financeDepositTable.getTransformCurrency().toLowerCase())
  233. || "vnd".equals(financeDepositTable.getTransformCurrency().toLowerCase())) {
  234. transformAmount = transformAmount.divide(BigDecimal.ONE, 0, BigDecimal.ROUND_UP);
  235. }
  236. //获取订单用户名称
  237. String name = customInfoTable.getName();
  238. String orderNo = getOrderNo();
  239. //获取和处理入金平台订单
  240. Integer free = getFree(channel, sysChannelBankTable);
  241. BigDecimal depositAmount = getDepositAmount(financeDepositTable);
  242. if (free != null && free.compareTo(0) > 0) {
  243. depositAmount = depositAmount.multiply(new BigDecimal(1 - (free / 100.0)));
  244. }
  245. BigDecimal cnyAmount = getCnyAmount(balanceSaveEntity);
  246. financeDepositTable.setRate(balanceSaveEntity.getRate());
  247. financeDepositTable.setTransformAmount(transformAmount);
  248. financeDepositTable.setCny(cnyAmount);
  249. financeDepositTable.setDepositAmount(depositAmount.setScale(2, BigDecimal.ROUND_DOWN));
  250. financeDepositTable.setFree(free);
  251. financeDepositTable.setSerial(orderNo);
  252. financeDepositTable.setLogin(balanceSaveEntity.getLogin());
  253. financeDepositTable.setName(name);
  254. //计算过期时间 如果通道设置中过期时间为0或者null 标识用不过期 这里也就不设置设置为null或者设置时间戳为0
  255. if (channel.getExpire() != null & !channel.getExpire().equals(0)) {
  256. financeDepositTable.setExpireTime(DateUtil.operationMinute(channel.getExpire()));
  257. }
  258. financeDepositTable.setRemittanceChannelCode(channel.getCode());
  259. financeDepositTable.setRemittanceChannelName(channel.getName());
  260. financeDepositTable.setRemittanceChannelEnName(channel.getEnName());
  261. financeDepositTable.setRemittanceChannelIcon(channel.getIcon());
  262. financeDepositTable.setRemittanceChannelEnIcon(channel.getEnIcon());
  263. financeDepositTable.setRemittanceChannelCurrency(channel.getCurrency());
  264. financeDepositTable.setRemittanceChannelRequestUrl(channel.getRequestUrl());
  265. financeDepositTable.setRemittanceChannelProperty(channel.getProperty());
  266. financeDepositTable.setRemittanceChannelIntroduce(channel.getIntroduce());
  267. financeDepositTable.setRemittanceChannelEnIntroduce(channel.getEnIntroduce());
  268. financeDepositTable.setAddIp(balanceSaveEntity.getAddIp());
  269. financeDepositTable.setAddTime(balanceSaveEntity.getAddTime());
  270. financeDepositTable.setAddUser(balanceSaveEntity.getAddUser());
  271. financeDepositTable.setCountry(customInfoTable.getCountry());
  272. financeDepositTable.setCountryEnName(customInfoTable.getCountryEnName());
  273. financeDepositTable.setCountryName(customInfoTable.getCountryName());
  274. /*financeDepositTable.setSourceCode(customInfoTable.getSourceCode());
  275. financeDepositTable.setSourceName(customInfoTable.getSourceName());
  276. financeDepositTable.setSourceNameEn(customInfoTable.getSourceNameEn());*/
  277. //保存订单信息
  278. financeDepositRepository.save(financeDepositTable);
  279. GoldenOrderTable order = saveGoldenOrder(balanceSaveEntity, goodsTables, financeDepositTable);
  280. //mqSendService.send(PayConstants.ORDER_DEPOSIT_EXPIRE, order, channel.getExpire() * 1000);
  281. return financeDepositTable;
  282. }
  283. @Transactional(rollbackFor = Exception.class)
  284. public GoldenOrderTable saveGoldenOrder(FinanceDepositAddEntity balanceSaveEntity, List<GoldenGoodsTable> goodsTables,FinanceDepositTable financeDepositTable){
  285. GoldenOrderTable order = new GoldenOrderTable();
  286. order.setSerial(financeDepositTable.getSerial());
  287. order.setCustomId(financeDepositTable.getCustomId());
  288. order.setAmount(financeDepositTable.getAmount());
  289. order.setCurrency(financeDepositTable.getCurrency());
  290. order.setTransformAmount(financeDepositTable.getAmount());
  291. order.setTransformCurrency(financeDepositTable.getCurrency());
  292. order.setAddTime(financeDepositTable.getAddTime());
  293. order.setStatus(PayConstants.ORDER_UP_PAY_STATUS);
  294. order.setPayName(balanceSaveEntity.getPayName());
  295. order.setPayPhone(balanceSaveEntity.getPayPhone());
  296. order.setChannelCode(financeDepositTable.getRemittanceChannelCode());
  297. order.setChannelName(financeDepositTable.getRemittanceChannelName());
  298. order.setChannelEnName(financeDepositTable.getRemittanceChannelEnName());
  299. goldenOrderRepository.save(order);
  300. List<GoldenOrderDetailsTable> details = new ArrayList<>();
  301. for (GoldenGoodsTable goldenGoodsTable : goodsTables) {
  302. GoldenOrderDetailsTable detailsTable = new GoldenOrderDetailsTable();
  303. BeanUtils.copyProperties(goldenGoodsTable, detailsTable);
  304. detailsTable.setGoodsId(goldenGoodsTable.getId());
  305. detailsTable.setSerial(financeDepositTable.getSerial());
  306. detailsTable.setCustomId(financeDepositTable.getCustomId());
  307. details.add(detailsTable);
  308. }
  309. goldenOrderDetailsRepository.save(details);
  310. return order;
  311. }
  312. @Override
  313. public void save(FinanceDepositTable financeDepositTable) throws ServiceException, PayValidatedException {
  314. financeDepositRepository.save(financeDepositTable);
  315. }
  316. @Override
  317. @Transactional(rollbackFor = Exception.class)
  318. public void updateCallbackValidate(FinanceDepositCallbackValidateUpdateEntity financeDepositUpdateEntity) throws ServiceException {
  319. FinanceDepositTable financeDepositTable =
  320. financeDepositRepository.findFirstBySerial(financeDepositUpdateEntity.getSerial());
  321. if (financeDepositTable == null) {
  322. return;
  323. }
  324. financeDepositUpdateEntity.setId(financeDepositTable.getId());
  325. BeanUtils.copyProperties(financeDepositUpdateEntity, financeDepositTable);
  326. if (!PayConstants.CALLBACE_VALIDATE_SUCCESS_STATUS.equals(financeDepositTable.getCallbackValidate())) {
  327. financeDepositTable.setCallbackStatus(PayConstants.CALLBACE_FAIL_STATUS);
  328. financeDepositTable.setNote("95");
  329. }
  330. financeDepositRepository.save(financeDepositTable);
  331. }
  332. @Override
  333. @Transactional(rollbackFor = Exception.class)
  334. public FinanceDepositTable approve(FinanceDepositApproveEntity entity) throws ServiceException {
  335. FinanceDepositTable financeDepositTable = financeDepositRepository.findFirstById(entity.getId());
  336. if (financeDepositTable == null) {
  337. throw ServiceException.exception(Constants.INFO_NOT_FOUND);
  338. }
  339. if (!StatusConstants.MANAGER_PENDING_STATUS.equals(financeDepositTable.getDepositStatus())
  340. || !StatusConstants.APPLY_STATUS.equals(financeDepositTable.getStatus())) {
  341. throw ServiceException.exception(Constants.CANNOT_APPROVE);
  342. }
  343. if (entity.getAmount() == null && entity.getCny() == null) {
  344. entity.setCny(financeDepositTable.getCny());
  345. entity.setAmount(financeDepositTable.getAmount());
  346. } else if (entity.getAmount() != null) {
  347. entity.setCny(entity.getAmount().multiply(financeDepositTable.getRate()));
  348. } else if (entity.getCny() != null) {
  349. BigDecimal amount = entity.getCny().divide(financeDepositTable.getRate(), 10, BigDecimal.ROUND_HALF_UP);
  350. entity.setAmount(amount);
  351. }
  352. BeanUtils.copyProperties(entity, financeDepositTable);
  353. financeDepositRepository.save(financeDepositTable);
  354. // if (StatusConstants.PASSED_STATUS.equals(financeDepositTable.getStatus())
  355. // && StatusConstants.MANAGER_COMPLETED_STATUS.equals(financeDepositTable.getDepositStatus())) {
  356. //
  357. // }
  358. CustomInfoTable customInfoTable = customInfoRepository.findFirstById(financeDepositTable.getCustomId());
  359. if (customInfoTable == null) {
  360. throw new ServiceException(Constants.USER_NOT_EXIST_ERROR);
  361. }
  362. //调整客户是否有入金成功
  363. if (StatusConstants.PASSED_STATUS.equals(entity.getStatus())) {
  364. if (customInfoTable.getPayStatus() == null || !customInfoTable.getPayStatus().equals(1)) {
  365. customInfoTable.setPayStatus(1);
  366. customInfoRepository.save(customInfoTable);
  367. }
  368. }
  369. sendCustomDepositEmail(financeDepositTable, customInfoTable);
  370. return financeDepositTable;
  371. }
  372. @Override
  373. @Transactional(rollbackFor = Exception.class)
  374. public void delete(FinanceDepositDeleteEntity entity) throws ServiceException {
  375. List<FinanceDepositTable> allByIdIn = financeDepositRepository.findAllByIdIn(entity.getIds());
  376. if (allByIdIn == null || allByIdIn.size() <= 0) {
  377. throw ServiceException.exception(Constants.INFO_NOT_FOUND);
  378. }
  379. financeDepositRepository.delete(allByIdIn);
  380. }
  381. @Override
  382. public ResultWithPagerDto<FinanceDepositDto> searchPageList(FinanceDepositSearchListEntity entity) throws ServiceException {
  383. Integer count = financeDepositMapper.countList(entity);
  384. PageDto pageDto = PageDto.format(entity, count);
  385. if (count == null || count <= 0) {
  386. return ResultWithPagerDto.success(pageDto);
  387. }
  388. BaseResultDto<List<FinanceDepositDto>> listBaseResultDto = searchList(entity);
  389. return ResultWithPagerDto.success(pageDto, listBaseResultDto.getData());
  390. }
  391. @Override
  392. public BaseResultDto<List<FinanceDepositDto>> searchList(FinanceDepositSearchListEntity entity) throws ServiceException {
  393. List<FinanceDepositView> financeDepositViews = financeDepositMapper.searchList(entity);
  394. if (financeDepositViews == null || financeDepositViews.size() <= 0) {
  395. throw new ServiceException(Constants.SYSTEM_ERROR);
  396. }
  397. List<FinanceDepositDto> financeDepositDtos = new ArrayList<>(financeDepositViews.size());
  398. for (FinanceDepositView financeDepositView : financeDepositViews) {
  399. FinanceDepositDto transform = transform(financeDepositView);
  400. financeDepositDtos.add(transform);
  401. }
  402. return BaseResultDto.success(financeDepositDtos);
  403. }
  404. @Override
  405. public FinanceDepositDto searchSingle(Long id) throws ServiceException {
  406. FinanceDepositView financeDepositMapperSingle = financeDepositMapper.getOne(id);
  407. if (financeDepositMapperSingle == null) {
  408. throw ServiceException.exception(Constants.INFO_NOT_FOUND);
  409. }
  410. return transform(financeDepositMapperSingle);
  411. }
  412. @Override
  413. @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
  414. public void updateCallback(FinanceDepositCallbackUpdateEntity financeDepositCallbackUpdateEntity) throws ServiceException {
  415. String lockKey = "FINANCE_DEPOSIT:";
  416. if (!Strings.isNullOrEmpty(financeDepositCallbackUpdateEntity.getSerial())) {
  417. lockKey = lockKey + financeDepositCallbackUpdateEntity.getSerial();
  418. } else if (!Strings.isNullOrEmpty(financeDepositCallbackUpdateEntity.getTicket())) {
  419. lockKey = lockKey + financeDepositCallbackUpdateEntity.getTicket();
  420. } else {
  421. throw ServiceException.exception(Constants.SYSTEM_ERROR);
  422. }
  423. String co = UUIDUtil.getUUID();
  424. try {
  425. if (redisService.tryLock(lockKey, co, 60 * 1000)) {
  426. //获取订单
  427. FinanceDepositTable financeDepositTable = null;
  428. if (!Strings.isNullOrEmpty(financeDepositCallbackUpdateEntity.getSerial())) {
  429. financeDepositTable =
  430. financeDepositRepository.findFirstBySerial(financeDepositCallbackUpdateEntity.getSerial());
  431. } else if (!Strings.isNullOrEmpty(financeDepositCallbackUpdateEntity.getTicket())) {
  432. financeDepositTable =
  433. financeDepositRepository.findFirstByChannelSerial(financeDepositCallbackUpdateEntity.getTicket());
  434. } else {
  435. throw ServiceException.exception(Constants.SYSTEM_ERROR);
  436. }
  437. if (financeDepositTable == null) {
  438. throw new ServiceException(Constants.SYSTEM_ERROR);
  439. }
  440. CustomInfoTable customTable = customInfoRepository.findFirstById(financeDepositTable.getCustomId());
  441. if (customTable == null) {
  442. throw new ServiceException(Constants.SYSTEM_ERROR);
  443. }
  444. GoldenOrderTable orderTable = goldenOrderRepository.findFirstBySerial(financeDepositCallbackUpdateEntity.getSerial());
  445. if (orderTable == null) {
  446. throw new ServiceException(Constants.SYSTEM_ERROR);
  447. }
  448. if (!isIpWhitelist(financeDepositTable.getRemittanceChannelCode())) {
  449. throw ServiceException.exception("ip error");
  450. }
  451. if (PayConstants.CALLBACE_SUCCESS_STATUS.equals(financeDepositTable.getCallbackStatus())) {
  452. return;
  453. }
  454. //填充订单数据
  455. if (!Strings.isNullOrEmpty(financeDepositCallbackUpdateEntity.getChannelSerial())) {
  456. financeDepositTable.setChannelSerial(financeDepositCallbackUpdateEntity.getChannelSerial());
  457. }
  458. financeDepositTable.setStatus(financeDepositCallbackUpdateEntity.getStatus());
  459. financeDepositTable.setCallbackStatus(financeDepositCallbackUpdateEntity.getCallbackStatus());
  460. financeDepositTable.setModifyTime(new Date());
  461. financeDepositTable.setCallbackTime(financeDepositCallbackUpdateEntity.getCallbackTime() == null ?
  462. new Date() : financeDepositCallbackUpdateEntity.getCallbackTime());
  463. financeDepositTable.setNote(financeDepositCallbackUpdateEntity.getNote());
  464. if (financeDepositCallbackUpdateEntity.getRate() != null) {
  465. financeDepositTable.setRate(financeDepositCallbackUpdateEntity.getRate());
  466. }
  467. //根据回调实体中是否有金额判断回调订单金额可能存在变动 并再次进行计算填充
  468. if (financeDepositCallbackUpdateEntity.getAmount() != null) {
  469. financeDepositTable.setAmount(financeDepositCallbackUpdateEntity.getAmount());
  470. if (financeDepositCallbackUpdateEntity.getTransformAmount() != null) {
  471. financeDepositTable.setTransformAmount(financeDepositCallbackUpdateEntity.getTransformAmount());
  472. } else {
  473. BigDecimal rate = financeDepositTable.getRate();
  474. BigDecimal transformAmount = financeDepositCallbackUpdateEntity.getAmount().multiply(rate);
  475. financeDepositTable.setTransformAmount(transformAmount);
  476. }
  477. } else if (financeDepositCallbackUpdateEntity.getTransformAmount() != null) {
  478. if (financeDepositCallbackUpdateEntity.getTransformAmount().compareTo(financeDepositTable.getTransformAmount()) != 0) {
  479. financeDepositTable.setTransformAmount(financeDepositCallbackUpdateEntity.getTransformAmount());
  480. BigDecimal rate = financeDepositTable.getRate();
  481. BigDecimal amount = financeDepositTable.getTransformAmount().divide(rate, 10,
  482. BigDecimal.ROUND_HALF_UP);
  483. financeDepositTable.setAmount(amount);
  484. } else {
  485. financeDepositCallbackUpdateEntity.setTransformAmount(null);
  486. }
  487. }
  488. if (financeDepositCallbackUpdateEntity.getAmount() != null || financeDepositCallbackUpdateEntity.getTransformAmount() != null) {
  489. BigDecimal depositAmount = getDepositAmount(financeDepositTable);
  490. Integer free = financeDepositTable.getFree();
  491. if (free != null && free.compareTo(0) > 0) {
  492. depositAmount = depositAmount.multiply(new BigDecimal(1 - (free / 100.0)));
  493. }
  494. financeDepositTable.setDepositAmount(depositAmount);
  495. BigDecimal cnyAmount = getCnyAmount(financeDepositTable);
  496. financeDepositTable.setCny(cnyAmount);
  497. }
  498. //保存回调数据
  499. financeDepositTable.setCallbackData(financeDepositCallbackUpdateEntity.getCallbackData());
  500. financeDepositTable.setModifyIp(getIp());
  501. if (StringUtils.isNotEmpty(financeDepositCallbackUpdateEntity.getApproveDesc())) {
  502. financeDepositTable.setApproveDesc(financeDepositCallbackUpdateEntity.getApproveDesc());
  503. financeDepositTable.setOperationType(PayConstants.OPERATION_TYPE_AUTOMATIC);
  504. financeDepositTable.setApproveTime(new Date());
  505. }
  506. //更新订单
  507. financeDepositRepository.save(financeDepositTable);
  508. //成功处理
  509. if (PayConstants.CALLBACE_SUCCESS_STATUS.equals(financeDepositTable.getCallbackStatus())) {
  510. BigDecimal totalSpendingAmount = customTable.getTotalSpendingAmount() == null ? BigDecimal.ZERO : customTable.getTotalSpendingAmount();
  511. customTable.setTotalSpendingAmount(totalSpendingAmount.add(financeDepositTable.getAmount()));
  512. customInfoRepository.save(customTable);
  513. orderTable.setStatus(PayConstants.ORDER_PAY_STATUS);
  514. orderTable.setPayTime(financeDepositTable.getCallbackTime());
  515. } else if (PayConstants.CALLBACE_FAIL_STATUS.equals(financeDepositTable.getCallbackStatus())) {
  516. orderTable.setStatus(PayConstants.ORDER_PAY_ERROR_STATUS);
  517. }
  518. orderTable.setModifyTime(new Date());
  519. goldenOrderRepository.save(orderTable);
  520. if (customTable.getTotalSpendingAmount().compareTo(new BigDecimal(5000)) >= 0) {
  521. mqSendService.send(ConfigConstants.CUSTOM_REWARD_RECORD, customTable.getId());
  522. }
  523. if (PayConstants.CALLBACE_SUCCESS_STATUS.equals(financeDepositTable.getCallbackStatus())) {
  524. List<GoldenOrderDetailsTable> detailsTables = goldenOrderDetailsRepository.getBySerial(financeDepositTable.getSerial());
  525. for (GoldenOrderDetailsTable detailsTable : detailsTables) {
  526. sendCustomGoldenOrderEmail(financeDepositTable,detailsTable,customTable.getEmail());
  527. }
  528. }
  529. }
  530. } catch (Exception e) {
  531. log.error(e.getMessage());
  532. throw ServiceException.exception(Constants.SYSTEM_ERROR);
  533. } finally {
  534. redisService.unlock(lockKey, co);
  535. }
  536. }
  537. @Override
  538. public boolean isIpWhitelist(String channelCode) throws ServiceException {
  539. SysRemittanceChannelTable payChannel = sysRemittanceChannelRepository.getFirstByCode(channelCode);
  540. if (payChannel == null) {
  541. throw new ServiceException(Constants.SYSTEM_ERROR);
  542. }
  543. if (Strings.isNullOrEmpty(payChannel.getWhitelist())) {
  544. return true;
  545. }
  546. String ip = getIp();
  547. if (Strings.isNullOrEmpty(ip)) {
  548. return false;
  549. }
  550. log.info(String.format("pay callback,Whitelist error,Whitelist :%s,ip:%s", payChannel.getWhitelist(), ip));
  551. if (Arrays.asList(payChannel.getWhitelist().split(",")).contains(ip)) {
  552. return true;
  553. }
  554. log.info(String.format("pay callback,Whitelist error"));
  555. return false;
  556. }
  557. /**
  558. * 获取通道银行信息
  559. *
  560. * @param balanceSaveEntity
  561. * @param channel
  562. * @return
  563. * @throws ServiceException
  564. */
  565. @Override
  566. public SysChannelBankTable getChannelBank(FinanceDepositAddEntity balanceSaveEntity,
  567. SysRemittanceChannelTable channel)
  568. throws ServiceException {
  569. SysChannelBankTable sysChannelBankTable = null;
  570. if (channel.getBankValid() != null && channel.getBankValid().equals(1)) {
  571. if (!Strings.isNullOrEmpty(balanceSaveEntity.getBankCode())) {
  572. sysChannelBankTable = sysChannelBankService.getByCode(balanceSaveEntity.getBankCode(),
  573. channel.getCode());
  574. if (sysChannelBankTable == null) {
  575. throw new ServiceException(Constants.SYSTEM_ERROR);
  576. }
  577. balanceSaveEntity.setTransformCurrency(sysChannelBankTable.getCurrency());
  578. } else {
  579. throw new ServiceException(Constants.SYSTEM_ERROR);
  580. }
  581. }
  582. return sysChannelBankTable;
  583. }
  584. @Override
  585. @Transactional(rollbackFor = Exception.class)
  586. public FinanceDepositTable getBySerial(String serial) throws ServiceException {
  587. FinanceDepositTable financeDepositTable = financeDepositRepository.getFirstBySerial(serial);
  588. if (financeDepositTable == null) {
  589. throw ServiceException.exception(Constants.INFO_NOT_FOUND);
  590. }
  591. return financeDepositTable;
  592. }
  593. @Override
  594. public FinanceDepositTable getByChannelSerial(String channelSerial) throws ServiceException {
  595. FinanceDepositTable financeDepositTable = financeDepositRepository.getFirstByChannelSerial(channelSerial);
  596. return financeDepositTable;
  597. }
  598. /**
  599. * 过期时间修改状态
  600. * @param content
  601. * @throws ServiceException
  602. */
  603. @JmsListener(destination = PayConstants.ORDER_DEPOSIT_EXPIRE)
  604. @Transactional(rollbackFor = Exception.class)
  605. public void orderDepositExpire(String content) throws ServiceException {
  606. log.info(String.format("ORDER_DEPOSIT_EXPIRE,content:%s", content));
  607. GoldenOrderTable order = JSON.parseObject(content, GoldenOrderTable.class);
  608. if (order == null) {
  609. log.error("ORDER_DEPOSIT_EXPIRE,entity is null");
  610. return;
  611. }
  612. GoldenOrderTable table = goldenOrderRepository.findFirstBySerial(order.getSerial());
  613. if (table == null) {
  614. return;
  615. }
  616. if (table.getStatus() == PayConstants.ORDER_UP_PAY_STATUS) {
  617. table.setStatus(PayConstants.ORDER_PAY_EXPIRED_STATUS);
  618. table.setModifyTime(new Date());
  619. goldenOrderRepository.save(table);
  620. }
  621. }
  622. private FinanceDepositDto transform(FinanceDepositView financeDepositView) {
  623. FinanceDepositDto financeDepositDto = new FinanceDepositDto();
  624. BeanUtils.copyProperties(financeDepositView, financeDepositDto);
  625. return financeDepositDto;
  626. }
  627. private void sendDepositEmail(FinanceDepositTable table) throws ServiceException {
  628. SysConfigTable sysConfigTable = sysConfigService.getByCode(ConfigConstants.FINANCE_DEPOSIT_MANAGER_EMAIL);
  629. if (sysConfigTable == null) {
  630. throw new ServiceException(Constants.SYSTEM_ERROR);
  631. }
  632. String users = sysConfigTable.getValue();
  633. if (users == null) {
  634. throw new ServiceException(Constants.SYSTEM_ERROR);
  635. }
  636. //构建map 用于后面邮件模版替换
  637. Map<String, String> map = new HashMap<>(10);
  638. map.put(MapConstants.LOGIN, table.getLogin() + "");
  639. map.put(MapConstants.NAME, table.getName());
  640. map.put(MapConstants.DEPOSIT_AMOUNT, table.getAmount() == null ? "" : String.format("%.2f",
  641. table.getAmount().doubleValue()));
  642. map.put(MapConstants.APPLY_TIME, DateUtil.formatTime(table.getAddTime()));
  643. map.put(MapConstants.SERIAL, table.getSerial());
  644. map.put(MapConstants.DATE_TIME, DateUtil.formatTime(new Date()));
  645. SysEmailSendEntity sysEmailSendEntity = new SysEmailSendEntity();
  646. sysEmailSendEntity.setSubject("CWG DEPOSIT");
  647. sysEmailSendEntity.setEmailSendEnum(EmailSendEnum.FINANCE_DEPOSIT_NOTICE);
  648. sysEmailSendEntity.setMap(map);
  649. sysEmailSendEntity.setTemplateName(EmailTemplateConstants.FINANCE_DEPOSIT_NOTICE_NAME);
  650. sysEmailSendEntity.setUsers(users);
  651. try {
  652. emailService.sendEmail(sysEmailSendEntity);
  653. } catch (Exception e) {
  654. e.printStackTrace();
  655. }
  656. }
  657. private void sendCustomDepositEmail(FinanceDepositTable table, CustomInfoTable customInfoTable) throws ServiceException {
  658. //构建map 用于后面邮件模版替换
  659. Map<String, String> map = new HashMap<>(10);
  660. String name = CustomInfoUtil.getName(customInfoTable);
  661. map.put(MapConstants.NAME, name);
  662. map.put(MapConstants.LOGIN, String.valueOf(table.getLogin()));
  663. map.put(MapConstants.DEPOSIT_AMOUNT, table.getAmount() == null ? "" : String.format("%.2f",
  664. table.getAmount().doubleValue()));
  665. map.put(MapConstants.DATE_TIME, DateUtil.formatTime(new Date()));
  666. map.put(MapConstants.APPROVE_DESC, table.getApproveDesc());
  667. map.put(MapConstants.APPROVE_STATUS, table.getStatus().equals(2) ? "通过" : "拒绝");
  668. SysEmailSendEntity sysEmailSendEntity = new SysEmailSendEntity();
  669. sysEmailSendEntity.setSubject("CWG DEPOSIT");
  670. sysEmailSendEntity.setEmailSendEnum(EmailSendEnum.CUSTOM_FINANCE_DEPOSIT_NOTICE);
  671. sysEmailSendEntity.setMap(map);
  672. sysEmailSendEntity.setTemplateName(EmailTemplateConstants.FINANCE_DEPOSIT_APPROVE_NOTICE_RESULT);
  673. sysEmailSendEntity.setUsers(customInfoTable.getEmail());
  674. try {
  675. emailService.sendEmail(sysEmailSendEntity);
  676. WebNoticeRecordAndEmailMqEntity mqEntity = new WebNoticeRecordAndEmailMqEntity(sysEmailSendEntity,
  677. table.getCId(), table.getCustomId());
  678. mqSendService.send(Constants.WEB_NOTICE_PUT_RECORD, mqEntity);
  679. } catch (Exception e) {
  680. e.printStackTrace();
  681. }
  682. }
  683. private void sendCustomGoldenOrderEmail(FinanceDepositTable table, GoldenOrderDetailsTable detailsTable,String email) throws ServiceException {
  684. //构建map 用于后面邮件模版替换
  685. Map<String, String> map = new HashMap<>(3);
  686. String name = table.getName();
  687. map.put(MapConstants.NAME, name);
  688. map.put(ConfigConstants.DOWNLOAD_URL, detailsTable.getDownload());
  689. map.put(MapConstants.DATE_TIME, DateUtil.formatTime(new Date()));
  690. SysEmailSendEntity sysEmailSendEntity = new SysEmailSendEntity();
  691. sysEmailSendEntity.setSubject("Trading Education");
  692. sysEmailSendEntity.setEmailSendEnum(EmailSendEnum.CUSTOM_ORDER_SUCCESS);
  693. sysEmailSendEntity.setMap(map);
  694. if (CountryUtil.isCN(table.getCountry())) {
  695. sysEmailSendEntity.setTemplateName(EmailTemplateConstants.CUSTOM_ORDER_SUCCESS_CN);
  696. } else {
  697. sysEmailSendEntity.setTemplateName(EmailTemplateConstants.CUSTOM_ORDER_SUCCESS_EN);
  698. }
  699. sysEmailSendEntity.setUsers(email);
  700. try {
  701. emailService.sendEmail(sysEmailSendEntity);
  702. WebNoticeRecordAndEmailMqEntity mqEntity = new WebNoticeRecordAndEmailMqEntity(sysEmailSendEntity,
  703. table.getCId(), table.getCustomId());
  704. mqSendService.send(Constants.WEB_NOTICE_PUT_RECORD, mqEntity);
  705. } catch (Exception e) {
  706. e.printStackTrace();
  707. }
  708. }
  709. private SysConfigFinanceEntity getConfigFinance() throws ServiceException {
  710. SysConfigTable sysConfigTable = sysConfigService.getByCode(ConfigConstants.FINANCE_CONFIGURE);
  711. SysConfigFinanceEntity financeEntity = JSON.parseObject(sysConfigTable.getValue(),
  712. SysConfigFinanceEntity.class);
  713. if (financeEntity == null) {
  714. throw ServiceException.exception(Constants.SYSTEM_ERROR);
  715. }
  716. return financeEntity;
  717. }
  718. /**
  719. * 验证最大和最小入金量
  720. *
  721. * @param balanceSaveEntity
  722. * @throws ServiceException
  723. */
  724. private void validatedAmount(FinanceDepositAddEntity balanceSaveEntity, SysRemittanceChannelTable channel,
  725. SysChannelBankTable sysChannelBankTable) throws ServiceException,
  726. PayValidatedException {
  727. BigDecimal max = null;
  728. BigDecimal min = null;
  729. List<String> excludeCodes = null;
  730. List<String> codes = new ArrayList<>(2);
  731. //获取自动时段最大入金量
  732. SysConfigTable sysConfigTable = sysConfigService.getByCode(ConfigConstants.AUTOLIMIT_DEPOSIT_CONFIG);
  733. SysConfigAutolimitEntity sysConfigAutolimitEntity = JSON.parseObject(sysConfigTable.getValue(),
  734. SysConfigAutolimitEntity.class);
  735. if (sysConfigAutolimitEntity == null) {
  736. throw ServiceException.exception(Constants.SYSTEM_ERROR);
  737. }
  738. if (sysConfigAutolimitEntity.getAutolimitVaild() != null && sysConfigAutolimitEntity.getAutolimitVaild().equals(1)) {
  739. //特定通道排除在外
  740. if (!Strings.isNullOrEmpty(sysConfigAutolimitEntity.getExcludeCodes())) {
  741. excludeCodes = Arrays.asList(sysConfigAutolimitEntity.getExcludeCodes().split(","));
  742. }
  743. //验证时间在那个区间
  744. if (excludeCodes == null || !excludeCodes.contains(balanceSaveEntity.getPayType())) {
  745. Date newDate = new Date();
  746. Time newTime =
  747. Time.valueOf(newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds());
  748. if (newTime.getTime() > sysConfigAutolimitEntity.getStartTime().getTime()
  749. && newTime.getTime() < sysConfigAutolimitEntity.getEndTime().getTime()) {
  750. max = sysConfigAutolimitEntity.getWithinIntervalAmount();
  751. } else {
  752. max = sysConfigAutolimitEntity.getOutRangeAmount();
  753. }
  754. }
  755. }
  756. //判断银行(货币)通道上是否携带最大最小入金量
  757. if (sysChannelBankTable != null) {
  758. if (sysChannelBankTable.getMinAmount() != null) {
  759. min = sysChannelBankTable.getMinAmount();
  760. }
  761. if (sysChannelBankTable.getMaxAmount() != null) {
  762. max = sysChannelBankTable.getMaxAmount();
  763. }
  764. }
  765. //判断通道上是否携带最大入金量
  766. if (max == null) {
  767. if (channel.getMaxAmount() == null) {
  768. codes.add(ConfigConstants.FINANCE_DEPOSIT_MAX);
  769. } else {
  770. max = channel.getMaxAmount();
  771. }
  772. }
  773. //判断通道上是否携带最小入金量
  774. if (min == null) {
  775. if (channel.getMinAmount() == null) {
  776. codes.add(ConfigConstants.FINANCE_DEPOSIT_MIN);
  777. } else {
  778. min = channel.getMinAmount();
  779. }
  780. }
  781. //如果最大最小入金量都没设置 则使用全局设置的最大最小入金量
  782. if (codes.size() > 0) {
  783. List<SysConfigTable> configTables = sysConfigService.getByCodes(codes);
  784. if (configTables == null || configTables.size() < codes.size()) {
  785. throw new ServiceException(Constants.SYSTEM_ERROR);
  786. }
  787. for (SysConfigTable configTable : configTables) {
  788. if (ConfigConstants.FINANCE_DEPOSIT_MAX.equals(configTable.getCode())) {
  789. try {
  790. max = new BigDecimal(configTable.getValue());
  791. } catch (NumberFormatException e) {
  792. throw new ServiceException(Constants.SYSTEM_ERROR);
  793. }
  794. }
  795. if (ConfigConstants.FINANCE_DEPOSIT_MIN.equals(configTable.getCode())) {
  796. try {
  797. min = new BigDecimal(configTable.getValue());
  798. } catch (NumberFormatException e) {
  799. throw new ServiceException(Constants.SYSTEM_ERROR);
  800. }
  801. }
  802. }
  803. }
  804. if (balanceSaveEntity.getAmount().intValue() < min.intValue()) {
  805. throw new PayValidatedException(localeMessage.getMessage(PayConstants.FINANCE_DEPOSIT_AMOUNT_LESS_THAN,
  806. PayConstants.FINANCE_DEPOSIT_AMOUNT_LESS_THAN) + min.intValue() + " " + channel.getCurrency());
  807. }
  808. if (balanceSaveEntity.getAmount().intValue() > max.intValue()) {
  809. throw new PayValidatedException(localeMessage.getMessage(PayConstants.FINANCE_DEPOSIT_AMOUNT_GREATER_THAN,
  810. PayConstants.FINANCE_DEPOSIT_AMOUNT_GREATER_THAN) + max.intValue() + " " + channel.getCurrency());
  811. }
  812. }
  813. private void validatedAmount(FinanceDepositAddEntity balanceSaveEntity, SysConfigFinanceEntity financeEntity) throws ServiceException, PayValidatedException {
  814. if (balanceSaveEntity.getAmount().intValue() < financeEntity.getMinDeposit().intValue()) {
  815. throw new PayValidatedException(localeMessage.getMessage(PayConstants.FINANCE_DEPOSIT_AMOUNT_LESS_THAN,
  816. PayConstants.FINANCE_DEPOSIT_AMOUNT_LESS_THAN) + financeEntity.getMinDeposit().intValue());
  817. }
  818. if (balanceSaveEntity.getAmount().intValue() > financeEntity.getMaxDeposit().intValue()) {
  819. throw new PayValidatedException(localeMessage.getMessage(PayConstants.FINANCE_DEPOSIT_AMOUNT_GREATER_THAN
  820. , PayConstants.FINANCE_DEPOSIT_AMOUNT_GREATER_THAN) + financeEntity.getMaxDeposit().intValue());
  821. }
  822. }
  823. /**
  824. * 获取交易账户
  825. *
  826. * @param balanceSaveEntity
  827. * @return
  828. * @throws ServiceException
  829. */
  830. private CustomLoginTable getCustomLogin(FinanceDepositAddEntity balanceSaveEntity) throws ServiceException {
  831. CustomLoginTable customLoginTable = customLoginService.getByCustomIdAndLogin(balanceSaveEntity.getCustomId(),
  832. balanceSaveEntity.getLogin());
  833. if (customLoginTable == null) {
  834. throw ServiceException.exception(Constants.NOT_PERMIT);
  835. }
  836. return customLoginTable;
  837. }
  838. /**
  839. * 获取客户信息
  840. *
  841. * @param balanceSaveEntity
  842. * @return
  843. * @throws ServiceException
  844. */
  845. private CustomInfoTable getCustomInfo(FinanceDepositAddEntity balanceSaveEntity) throws ServiceException {
  846. CustomInfoTable customInfoTable = customInfoRepository.getFirstById(balanceSaveEntity.getCustomId());
  847. if (customInfoTable == null) {
  848. throw new ServiceException(Constants.USER_NOT_EXIST_ERROR);
  849. }
  850. return customInfoTable;
  851. }
  852. /**
  853. * 获取实际通道使用金额
  854. *
  855. * @param balanceSaveEntity
  856. * @return
  857. * @throws ServiceException
  858. */
  859. private BigDecimal getTransformAmount(FinanceDepositAddEntity balanceSaveEntity,
  860. SysRemittanceChannelTable channel) throws ServiceException {
  861. //获取汇率 如果特定通道没有汇率 则根据我方设定汇率计算
  862. BigDecimal rate;
  863. if (balanceSaveEntity.getRate() == null) {
  864. if (channel.getRate() == null) {
  865. if (balanceSaveEntity.getCurrency().equals(balanceSaveEntity.getTransformCurrency())) {
  866. rate = BigDecimal.ONE;
  867. } else {
  868. rate = financeRateService.getRate(balanceSaveEntity.getCurrency(),
  869. balanceSaveEntity.getTransformCurrency(), 0, 1);
  870. }
  871. } else {
  872. rate = channel.getRate();
  873. }
  874. balanceSaveEntity.setRate(rate);
  875. }
  876. BigDecimal transformAmount = null;
  877. if (balanceSaveEntity.getTransformAmount() != null) {
  878. transformAmount = balanceSaveEntity.getTransformAmount();
  879. BigDecimal amount = transformAmount.divide(balanceSaveEntity.getRate(), 2, BigDecimal.ROUND_DOWN);
  880. balanceSaveEntity.setAmount(amount);
  881. } else {
  882. transformAmount = balanceSaveEntity.getAmount().multiply(balanceSaveEntity.getRate());
  883. }
  884. return transformAmount;
  885. }
  886. /**
  887. * 获取手续费
  888. *
  889. * @param channel
  890. * @param sysChannelBankTable
  891. * @return
  892. */
  893. private Integer getFree(SysRemittanceChannelTable channel, SysChannelBankTable sysChannelBankTable) {
  894. Integer free = null;
  895. //判断如果银行(支付货币)类型关闭且通道汇率不为空 且通道汇率大于0 或者银行(支付货币)开启且银行(支付货币)汇率不为空 且银行(支付货币)汇率大于0
  896. if ((channel.getBankValid() == null || channel.getBankValid().compareTo(0) == 0)
  897. && channel.getFree() != null
  898. && channel.getFree().compareTo(0) > 0) {
  899. free = channel.getFree();
  900. }
  901. if ((channel.getBankValid() != null && channel.getBankValid().compareTo(0) > 0)
  902. && sysChannelBankTable != null && sysChannelBankTable.getFree() != null
  903. && sysChannelBankTable.getFree().compareTo(0) > 0) {
  904. free = sysChannelBankTable.getFree();
  905. }
  906. return free;
  907. }
  908. private void setFinanceDepositAddRate(FinanceDepositAddEntity balanceSaveEntity,
  909. SysRemittanceChannelTable channel,
  910. SysChannelBankTable sysChannelBankTable) {
  911. if (balanceSaveEntity.getRate() != null) {
  912. return;
  913. }
  914. if (sysChannelBankTable != null && sysChannelBankTable.getRate() != null) {
  915. balanceSaveEntity.setRate(sysChannelBankTable.getRate());
  916. return;
  917. }
  918. if (channel != null && channel.getRate() != null) {
  919. balanceSaveEntity.setRate(channel.getRate());
  920. return;
  921. }
  922. }
  923. /**
  924. * 获取平台入金金额
  925. *
  926. * @param financeDepositTable
  927. * @return
  928. * @throws ServiceException
  929. */
  930. private BigDecimal getDepositAmount(FinanceDepositTable financeDepositTable) throws ServiceException {
  931. BigDecimal depositAmount = null;
  932. if (financeDepositTable.getDepositCurrency().equals(financeDepositTable.getCurrency())) {
  933. depositAmount = financeDepositTable.getAmount();
  934. } else {
  935. //获取汇率 如果特定通道没有汇率 则根据我方设定汇率计算
  936. BigDecimal rate = financeRateService.getRate(financeDepositTable.getCurrency(),
  937. financeDepositTable.getDepositCurrency(), 0, 1);
  938. if (rate == null) {
  939. log.error(String.format("currency:%s,depositCurrency:%s,type:%d", financeDepositTable.getCurrency(),
  940. financeDepositTable.getDepositCurrency(), 0));
  941. throw ServiceException.exception();
  942. }
  943. depositAmount = financeDepositTable.getAmount().multiply(rate);
  944. }
  945. return depositAmount;
  946. }
  947. /**
  948. * 获取cny金额
  949. *
  950. * @param financeDepositTable
  951. * @return
  952. * @throws ServiceException
  953. */
  954. private BigDecimal getCnyAmount(FinanceDepositTable financeDepositTable) throws ServiceException {
  955. BigDecimal cnyAmount = null;
  956. if ("CNY".equals(financeDepositTable.getTransformCurrency().toUpperCase())) {
  957. return financeDepositTable.getTransformAmount();
  958. }
  959. BigDecimal cnyRate = financeRateService.getRate(financeDepositTable.getCurrency(), "CNY", 0, 1);
  960. if (cnyRate != null) {
  961. cnyAmount = financeDepositTable.getAmount().multiply(cnyRate);
  962. }
  963. return cnyAmount;
  964. }
  965. private BigDecimal getCnyAmount(FinanceDepositAddEntity balanceSaveEntity) throws ServiceException {
  966. BigDecimal cnyAmount = null;
  967. BigDecimal cnyRate = financeRateService.getRate(balanceSaveEntity.getCurrency(), "CNY", 0, 1);
  968. if (cnyRate != null) {
  969. cnyAmount = balanceSaveEntity.getAmount().multiply(cnyRate);
  970. }
  971. return cnyAmount;
  972. }
  973. protected String getIp() throws ServiceException {
  974. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  975. if (requestAttributes == null) {
  976. return null;
  977. }
  978. HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
  979. if (request == null) {
  980. return null;
  981. }
  982. String ip = GetIpAndMac.getIp(request);
  983. return ip;
  984. }
  985. /**
  986. * 生成订单号
  987. *
  988. * @return 订单号
  989. */
  990. private String getOrderNo() {
  991. /**
  992. * 生成订单号
  993. */
  994. String orderNo = GetRandom.getOrderNo(PayConstants.DEPOSIT_HEAD);
  995. return orderNo;
  996. }
  997. }