TtqfServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. package com.ydtech.modules.ttqf.service.impl;
  2. import cn.hutool.extra.spring.SpringUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.ipaynow.jiaxin.domain.QueryPresignResultModel;
  7. import com.ipaynow.jiaxin.response.BillDownloadResponse;
  8. import com.ipaynow.jiaxin.response.ReceiptlDownloadResponse;
  9. import com.ydtech.core.page.HttpResult;
  10. import com.ydtech.exception.SystemException;
  11. import com.ydtech.modules.admin.constants.ManagementSource;
  12. import com.ydtech.modules.admin.dao.SysAmountAuditingMapper;
  13. import com.ydtech.modules.admin.dao.SysUserAccountHistoryMapper;
  14. import com.ydtech.modules.admin.dao.SysUserBankCardMapper;
  15. import com.ydtech.modules.admin.model.SysUser;
  16. import com.ydtech.modules.admin.model.po.SysAmountAuditingEntity;
  17. import com.ydtech.modules.admin.model.po.SysAmountAuditingHistory;
  18. import com.ydtech.modules.admin.model.po.SysUserAccount;
  19. import com.ydtech.modules.admin.model.po.SysUserAccountHistory;
  20. import com.ydtech.modules.admin.model.vo.SysAmountAuditingVo;
  21. import com.ydtech.modules.admin.service.*;
  22. import com.ydtech.modules.lg.model.PushLgEntity;
  23. import com.ydtech.modules.lg.service.PushLgEntityService;
  24. import com.ydtech.modules.ttqf.LgInformationPush;
  25. import com.ydtech.modules.ttqf.PayConstantStatus;
  26. import com.ydtech.modules.ttqf.RetrieveTTQFApi;
  27. import com.ydtech.modules.ttqf.TtqfDecrypt;
  28. import com.ydtech.modules.ttqf.dao.PaySignCallbackMapper;
  29. import com.ydtech.modules.ttqf.dao.PayTtqfLogMapper;
  30. import com.ydtech.modules.ttqf.dao.PaymentNoticeMapper;
  31. import com.ydtech.modules.ttqf.entity.PaySignCallback;
  32. import com.ydtech.modules.ttqf.entity.PayTtqfLog;
  33. import com.ydtech.modules.ttqf.entity.PayUserSign;
  34. import com.ydtech.modules.ttqf.entity.PaymentNoticeEntity;
  35. import com.ydtech.modules.ttqf.entity.response.TtqfResponse;
  36. import com.ydtech.modules.ttqf.entity.vo.UserWithdrawal;
  37. import com.ydtech.modules.ttqf.entity.vo.WithdrawalFRes;
  38. import com.ydtech.modules.ttqf.service.PayUserSignService;
  39. import com.ydtech.modules.ttqf.service.TtqfService;
  40. import com.ydtech.utils.StringUtils;
  41. import lombok.extern.slf4j.Slf4j;
  42. import org.apache.commons.lang3.ObjectUtils;
  43. import org.springframework.beans.BeanUtils;
  44. import org.springframework.beans.factory.annotation.Autowired;
  45. import org.springframework.stereotype.Service;
  46. import org.springframework.transaction.annotation.Transactional;
  47. import java.math.BigDecimal;
  48. import java.util.Date;
  49. import java.util.Objects;
  50. @Slf4j
  51. @Service
  52. public class TtqfServiceImpl implements TtqfService {
  53. @Autowired
  54. private PayTtqfLogMapper logMapper;
  55. @Autowired
  56. private SysSwitchConfigService sysSwitchConfigService;
  57. @Autowired
  58. private PayUserSignService userSignService;
  59. @Autowired
  60. private SysAmountAuditingService sysAmountAuditingService;
  61. @Autowired
  62. private PaySignCallbackMapper signCallbackMapper;
  63. @Autowired
  64. private PaymentNoticeMapper noticeMapper;
  65. @Autowired
  66. private PayUserSignService signService;
  67. @Autowired
  68. private SysAmountAuditingHistoryService sysAmountAuditingHistoryService;
  69. @Autowired
  70. private SysUserAccountService sysUserAccountService;
  71. @Autowired
  72. private SysUserAccountHistoryMapper sysUserAccountHistoryMapper;
  73. @Autowired
  74. private SysAmountAuditingMapper amountAuditingMapper;
  75. @Autowired
  76. private PushLgEntityService pushLgEntityService;
  77. @Autowired
  78. private SysUserService userService;
  79. @Override
  80. public Object getUserPay(String userId) {
  81. QueryWrapper<PayTtqfLog> queryWrapper = new QueryWrapper<>();
  82. queryWrapper.select("lo.mch_batch_no,\n" +
  83. "\tlo.mch_order_no,\n" +
  84. "\tlo.amount,\n" +
  85. "\tlo.fee_amount,\n" +
  86. "\tn.`status`,\n" +
  87. "\tn.message,\n" +
  88. "\tn.pay_time ").eq("user_id",userId);
  89. return new Object();
  90. }
  91. @Override
  92. public TtqfResponse userSign(String obj) {
  93. try {
  94. String parse = TtqfDecrypt.parse(obj);
  95. if (!StringUtils.isEmpty(parse)){
  96. //保存签约回调信息
  97. PaySignCallback paySignCallback = JSONObject.parseObject(parse, PaySignCallback.class);
  98. paySignCallback.setCreateTime(new Date());
  99. int insert = signCallbackMapper.insert(paySignCallback);
  100. if (0 < insert){
  101. //用户签约回调成功之后更新为签约状态并支持线上打款 签约成功更新状态
  102. userSignService.updateUserSign(paySignCallback);
  103. SpringUtil.getBean(LgInformationPush.class).push(paySignCallback);
  104. }
  105. }
  106. }catch (Exception r){
  107. log.info("接收签约通知回调保存失败 + PaySignCallback ================={}", r.getMessage());
  108. }
  109. return TtqfResponse.ok();
  110. }
  111. @Override
  112. @Transactional(rollbackFor = Exception.class)
  113. public TtqfResponse paymentNotice(String obj) {
  114. String parse = TtqfDecrypt.parse(obj);
  115. if (!StringUtils.isEmpty(parse)){
  116. PaymentNoticeEntity noticeEntity = JSONObject.parseObject(parse, PaymentNoticeEntity.class);
  117. if (null != noticeEntity){
  118. LambdaQueryWrapper<PaymentNoticeEntity> paymentNoticeEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
  119. paymentNoticeEntityLambdaQueryWrapper.eq(PaymentNoticeEntity::getMchOrderNo, noticeEntity.getMchOrderNo());
  120. PaymentNoticeEntity notice = noticeMapper.selectOne(paymentNoticeEntityLambdaQueryWrapper);
  121. if (null == notice){
  122. noticeEntity.setCreateTime(new Date());
  123. noticeMapper.insert(noticeEntity);
  124. }
  125. }
  126. LambdaQueryWrapper<PayTtqfLog> wrapper = new LambdaQueryWrapper<>();
  127. wrapper.eq(PayTtqfLog::getMchOrderNo, noticeEntity.getMchOrderNo());
  128. PayTtqfLog ttqfLog = logMapper.selectOne(wrapper);
  129. SysAmountAuditingVo amountAuditingVo = new SysAmountAuditingVo();
  130. amountAuditingVo.setAmount(noticeEntity.getAmount());
  131. amountAuditingVo.setUserId(ttqfLog.getUserId());
  132. writeRecord(amountAuditingVo,ttqfLog.getSysAmountAuditingId(),noticeEntity.getFeeAmount());
  133. }
  134. log.info("接收打款通知回调 + paymentNotice ================={}", parse);
  135. return TtqfResponse.ok();
  136. }
  137. public void writeRecord(SysAmountAuditingVo sysAmountAuditingVo,String id,BigDecimal feeAmount){
  138. SysAmountAuditingEntity sysAmountAuditingEntity = sysAmountAuditingService.getById(id);
  139. if (ObjectUtils.isEmpty(sysAmountAuditingEntity)){
  140. return;
  141. }
  142. sysAmountAuditingVo.setId(sysAmountAuditingEntity.getId());
  143. //提现审核金额
  144. BigDecimal amount = sysAmountAuditingVo.getAmount();
  145. //提现人
  146. String userId = sysAmountAuditingVo.getUserId();
  147. // 用户扣减金额
  148. if (StringUtils.isNotEmpty(userId)) {
  149. //提现人账户
  150. SysUserAccount sysUserAccount = sysUserAccountService.getById(userId);
  151. if (ObjectUtils.isNotEmpty(sysUserAccount)) {
  152. //已到账金额 = 原先的到账金额+ 已到账的金额
  153. sysUserAccount.setSumAmountAccount((sysUserAccount.getSumAmountAccount() == null ? BigDecimal.ZERO : sysUserAccount.getSumAmountAccount()).add(amount));
  154. //支付中的金额 = 原先的支付金额 -去提现的金额
  155. sysUserAccount.setSumAmountPayment((sysUserAccount.getSumAmountPayment() == null ? BigDecimal.ZERO : sysUserAccount.getSumAmountPayment()).subtract(amount));
  156. sysUserAccountService.updateById(sysUserAccount);
  157. }
  158. sysAmountAuditingVo.setAuditingStatus("3");
  159. sysAmountAuditingVo.setAuditingTime(new Date());
  160. sysAmountAuditingVo.setBankNumber(sysAmountAuditingEntity.getBankNumber());
  161. sysAmountAuditingVo.setUserName(userService.getByUserId(sysAmountAuditingEntity.getUserId()).getName());
  162. sysAmountAuditingVo.setUserId(sysAmountAuditingEntity.getUserId());
  163. BeanUtils.copyProperties(sysAmountAuditingVo, sysAmountAuditingEntity);
  164. sysAmountAuditingEntity.setCreateTime(null);
  165. amountAuditingMapper.updateById(sysAmountAuditingEntity);
  166. //通过审核表id查询历史记录表
  167. LambdaQueryWrapper<SysUserAccountHistory> lqw = new LambdaQueryWrapper<>();
  168. lqw.eq(SysUserAccountHistory::getAuditiingId, sysAmountAuditingEntity.getId());
  169. lqw.eq(SysUserAccountHistory::getUserId, userId);
  170. //插入轨迹表审核成功数据
  171. SysUserAccountHistory sysUserAccountHistory = sysUserAccountHistoryMapper.selectOne(lqw);
  172. //插入轨迹表
  173. SysAmountAuditingHistory sysAmountAuditingHistory = new SysAmountAuditingHistory(null, sysAmountAuditingEntity.getId(), amount, userId, new Date(), "4", "1", sysUserAccountHistory.getId());
  174. sysAmountAuditingHistoryService.save(sysAmountAuditingHistory);
  175. sendCollect(sysAmountAuditingEntity,sysAmountAuditingHistory.getAuditingStatus(),feeAmount);
  176. }
  177. }
  178. @Override
  179. public HttpResult billDownload(Integer type, String date) {
  180. BillDownloadResponse response = RetrieveTTQFApi.billDownload(type, date);
  181. if (PayConstantStatus.BIZ_CODE.equals(response.getBizCode())){
  182. return HttpResult.ok(response.getResultModel().getBillUrl());
  183. }
  184. return HttpResult.error(response.getBizMsg());
  185. }
  186. @Override
  187. public HttpResult receiptDownload(String mchOrderNo, String orderNo) {
  188. ReceiptlDownloadResponse response = RetrieveTTQFApi.receiptDownload(mchOrderNo,orderNo);
  189. if (PayConstantStatus.BIZ_CODE.equals(response.getBizCode())){
  190. return HttpResult.ok(response.getResultModel().getReceiptUrl());
  191. }
  192. return HttpResult.error(response.getBizMsg());
  193. }
  194. @Override
  195. public HttpResult queryPressing(UserWithdrawal withdrawal) {
  196. if (!sysSwitchConfigService.getBalanceExtractStatus()){
  197. return HttpResult.ok(WithdrawalFRes.builder().bizCode("0").msg("").url("").build());
  198. }
  199. SysUser sysUser = SpringUtil.getBean(SysUserBankCardMapper.class).selectByIdPay(withdrawal.getUserId());
  200. if (Objects.isNull(sysUser)){
  201. return HttpResult.error("用户不存在,请检查");
  202. }
  203. if (StringUtils.isEmpty(sysUser.getIdentity())){
  204. return HttpResult.error("用户身份证号不存在,请检查");
  205. }
  206. if (!ManagementSource.MS_02.getCode().equals(sysUser.getManagementSource())){
  207. return HttpResult.ok(WithdrawalFRes.builder().bizCode("0").msg("").url("").build());
  208. }
  209. PayUserSign payUserSign = signService.selectOne(sysUser.getIdentity(),sysUser.getId());
  210. if (!Objects.isNull(payUserSign)){
  211. String signUrl = RetrieveTTQFApi.contractH5(sysUser.getIdentity());
  212. if (Objects.equals(PayConstantStatus.SIGN_STATUS,payUserSign.getSign()) &&
  213. Objects.equals(PayConstantStatus.AUTH_STATUS,payUserSign.getAuthStatus())){
  214. return HttpResult.ok(WithdrawalFRes.builder().bizCode("3").msg("已签约").url(signUrl).build());
  215. }
  216. return HttpResult.ok(WithdrawalFRes.builder().bizCode("2").msg("签约中").url(signUrl).build());
  217. }
  218. try {
  219. boolean sign = false;
  220. QueryPresignResultModel resultModel = RetrieveTTQFApi.queryPressing(sysUser.getIdentity());
  221. if (Objects.equals(PayConstantStatus.SIGN_STATUS,resultModel.getSignStatus()) &&
  222. Objects.equals(PayConstantStatus.AUTH_STATUS,resultModel.getAuthStatus())){
  223. sign = true;
  224. }
  225. return HttpResult.ok(WithdrawalFRes.builder().bizCode(sign ? "3" : "1").url("").msg(sign ? "已签约" : "未签约").build());
  226. }catch (Exception e){
  227. log.info("查询签约状态异常:{}", e.getMessage());
  228. return HttpResult.error();
  229. }
  230. }
  231. @Override
  232. public HttpResult signingAddress(UserWithdrawal withdrawal) {
  233. try {
  234. SysUser sysUser = SpringUtil.getBean(SysUserBankCardMapper.class).selectByIdPay(withdrawal.getUserId());
  235. if (Objects.isNull(sysUser)){
  236. return HttpResult.error("用户不存在,请检查");
  237. }
  238. if (StringUtils.isEmpty(sysUser.getIdentity())){
  239. return HttpResult.error("用户身份证号不存在,请检查");
  240. }
  241. String pres = RetrieveTTQFApi.pres(sysUser, withdrawal);
  242. if (!StringUtils.isEmpty(pres)){
  243. signService.saveUserSign(sysUser.getIdentity(),sysUser.getId());
  244. }
  245. return HttpResult.ok(WithdrawalFRes.builder().bizCode("").url(pres).msg("").build());
  246. }catch (Exception e){
  247. log.error("获取用户签约信息异常{}",e.getMessage());
  248. throw new SystemException("提现申请提交失败");
  249. }
  250. }
  251. @Override
  252. @Transactional(rollbackFor = Exception.class)
  253. public HttpResult userCashOut(UserWithdrawal withdrawal) {
  254. try {
  255. SysUser sysUser = SpringUtil.getBean(SysUserBankCardMapper.class).selectByIdPay(withdrawal.getUserId());
  256. if (Objects.isNull(sysUser)){
  257. return HttpResult.error("用户不存在,请检查");
  258. }
  259. if (StringUtils.isEmpty(sysUser.getIdentity())){
  260. return HttpResult.error("用户身份证号不存在,请检查");
  261. }
  262. if (!ManagementSource.MS_02.getCode().equals(sysUser.getManagementSource())){
  263. return HttpResult.error("用户不是个代,请线下申请提现");
  264. }
  265. boolean balance = RetrieveTTQFApi.extractBalance(sysUser, withdrawal);
  266. return HttpResult.ok(balance);
  267. }catch (Exception e){
  268. log.error("提现申请提交失败{}",e.getMessage());
  269. throw new RuntimeException("提现申请提交失败");
  270. }
  271. }
  272. public void sendCollect(SysAmountAuditingEntity sysAmountAuditingEntity,String auditingStatus,BigDecimal feeAmount ){
  273. PushLgEntity lgEntity = new PushLgEntity();
  274. lgEntity.setApplicationTime(new Date());
  275. lgEntity.setBusinessUmber(sysAmountAuditingEntity.getId());
  276. lgEntity.setPayee(sysAmountAuditingEntity.getUserName());
  277. lgEntity.setPayeeId(sysAmountAuditingEntity.getUserId());
  278. lgEntity.setReceivingAccount(sysAmountAuditingEntity.getBankNumber());
  279. lgEntity.setExtractMoney(sysAmountAuditingEntity.getAmount());
  280. lgEntity.setServiceCharge(feeAmount);
  281. lgEntity.setExtractStatus(auditingStatus);
  282. pushLgEntityService.sendLgData(lgEntity);
  283. }
  284. }