ApiCarFreeChargeServiceImpl.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.jkcredit.invoice.hub.service.apiCarFree;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.jkcredit.invoice.hub.constant.CommonConstant;
  5. import com.jkcredit.invoice.hub.enums.ApiResponseCodeEnum;
  6. import com.jkcredit.invoice.hub.model.dto.apiCarFree.InvoiceResult;
  7. import com.jkcredit.invoice.hub.model.dto.apiCarFree.InvoiceResultDto;
  8. import com.jkcredit.invoice.hub.model.dto.needCharge.NeedChargeDto;
  9. import com.jkcredit.invoice.hub.model.dto.realCharge.RealChargeDto;
  10. import com.jkcredit.invoice.hub.model.dto.searchInvoice.SearchInvoiceDto;
  11. import com.jkcredit.invoice.hub.model.dto.searchInvoiceResult.SearchInvoiceResultDto;
  12. import com.jkcredit.invoice.hub.model.dto.user.UserDto;
  13. import com.jkcredit.invoice.hub.model.dto.userBalance.UserBalanceDto;
  14. import com.jkcredit.invoice.hub.model.dto.userBalance.UserBalanceInvoiceDto;
  15. import com.jkcredit.invoice.hub.model.po.carFreeCarrierBillStart.CarFreeCarrierBillStartPo;
  16. import com.jkcredit.invoice.hub.puducer.ChargeProducer;
  17. import com.jkcredit.invoice.hub.service.carFreeCarrierBillStart.CarFreeCarrierBillStartService;
  18. import com.jkcredit.invoice.hub.service.needCharge.NeedChargeService;
  19. import com.jkcredit.invoice.hub.service.realCharge.RealChargeService;
  20. import com.jkcredit.invoice.hub.service.searchInvoice.SearchInvoiceService;
  21. import com.jkcredit.invoice.hub.service.searchInvoiceResult.SearchInvoiceResultService;
  22. import com.jkcredit.invoice.hub.service.user.UserService;
  23. import com.jkcredit.invoice.hub.service.userBalance.UserBalanceService;
  24. import com.jkcredit.invoice.hub.spi.rest.data.ApiResponseData;
  25. import com.jkcredit.invoice.hub.util.BeanUtil;
  26. import com.jkcredit.invoice.hub.util.CommonUtil;
  27. import lombok.extern.slf4j.Slf4j;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.data.redis.core.RedisTemplate;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import java.util.*;
  33. import java.util.stream.Collectors;
  34. /**
  35. * @description:
  36. * @author: xusonglin
  37. * @create: 2020/1/19 14:05
  38. * @version: V1.0
  39. **/
  40. @Slf4j
  41. @Service
  42. public class ApiCarFreeChargeServiceImpl implements ApiCarFreeChargeService {
  43. @Autowired
  44. CarFreeCarrierBillStartService startService;
  45. @Autowired
  46. ApiCarFreeService carFreeService;
  47. @Autowired
  48. SearchInvoiceService searchInvoiceService;
  49. @Autowired
  50. private RedisTemplate redisTemplate;
  51. @Autowired
  52. private ChargeProducer chargeProducer;
  53. @Autowired
  54. UserBalanceService userBalanceService;
  55. @Autowired
  56. SearchInvoiceResultService searchInvoiceResultService;
  57. @Autowired
  58. NeedChargeService needChargeService;
  59. @Autowired
  60. RealChargeService realChargeService;
  61. @Autowired
  62. UserService userService;
  63. @Override
  64. @Transactional(rollbackFor = Exception.class)
  65. public void charge(List<CarFreeCarrierBillStartPo> startPoList) {
  66. for (CarFreeCarrierBillStartPo po : startPoList) {
  67. // 封装查询参数
  68. JSONObject param = new JSONObject();
  69. param.put("num", po.getNum());
  70. // 接口调用
  71. ApiResponseData apiResponseData = carFreeService.wayBillNumFindInvoice(param);
  72. // 判断接口是否调用成功
  73. if (apiResponseData.getData().equals(CommonConstant.SUCCESS_CODE)
  74. && apiResponseData.getCode().equals(ApiResponseCodeEnum.CODE_200.getValue())) {
  75. // 接口调用成功
  76. InvoiceResultDto invoiceResultDto = JSON.toJavaObject(JSON.parseObject(apiResponseData.getMsg()), InvoiceResultDto.class);
  77. List<InvoiceResult> newSearchInvoiceResultList;
  78. // 根据运单发票状态更新运单状态
  79. if (invoiceResultDto.getWaybillStatus().equals("3")) {
  80. // 开票完成
  81. startService.updateBillStartStatus(invoiceResultDto.getWaybillNum(), CommonConstant.STATUS_INVOICE_OVER);
  82. } else {
  83. // 开票中
  84. startService.updateBillStartStatus(invoiceResultDto.getWaybillNum(), CommonConstant.STATUS_MAKING_INVOICE);
  85. }
  86. if (invoiceResultDto.getResult() != null) {
  87. // 判断运单查询发票返回共用信息在数据库中是否存在,不存在则存入
  88. SearchInvoiceDto searchInvoiceDto = searchInvoiceService.getSearchInvoiceByNum(invoiceResultDto.getWaybillNum());
  89. if (searchInvoiceDto == null) {
  90. searchInvoiceService.saveSearchInvoice(invoiceResultDto);
  91. }
  92. log.info("invoiceResultDto.getResult().size() = {}", invoiceResultDto.getResult().size());
  93. if (invoiceResultDto.getResult().size() > 0) {
  94. //去重列表
  95. newSearchInvoiceResultList = invoiceResultDto.getResult().stream().collect(
  96. Collectors.collectingAndThen(
  97. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(InvoiceResult::getFee))), ArrayList::new));
  98. //计费
  99. newSearchInvoiceResultList.stream().forEach(t -> {
  100. t.setTransactionId(t.getTransactionId());
  101. if (!redisTemplate.hasKey(CommonConstant.TRANSACTION_ID_KEY + t.getTransactionId())) {
  102. // todo 此处计费需要使用消息实现
  103. // UserBalanceDto userBalanceDto = userBalanceService.getUserBalance(po.getUserId());
  104. // UserBalanceInvoiceDto userBalanceInvoiceDto = new UserBalanceInvoiceDto();
  105. // BeanUtil.copyProperties(userBalanceInvoiceDto, userBalanceDto);
  106. // userBalanceInvoiceDto.setNum(t.getWaybillNum());
  107. // userBalanceInvoiceDto.setTransactionId(t.getTransactionId());
  108. // //发送到消息队列
  109. // log.info("发送到消息队列");
  110. // chargeProducer.send(userBalanceInvoiceDto);
  111. // 将需要计费数据插入数据库
  112. UserDto userDto = userService.getUser(po.getUserId());
  113. NeedChargeDto needChargeDto = new NeedChargeDto();
  114. needChargeDto.setUserId(po.getUserId());
  115. needChargeDto.setNum(t.getWaybillNum());
  116. needChargeDto.setPrice(userDto.getPrice());
  117. needChargeDto.setTransactionId(t.getTransactionId());
  118. needChargeService.saveNeedCharge(needChargeDto);
  119. // 计费
  120. UserBalanceDto userBalanceDto = userBalanceService.getUserBalance(po.getUserId());
  121. userBalanceDto.setBalance(userBalanceDto.getBalance().subtract(userDto.getPrice()));
  122. userBalanceService.updateUserBalance(userBalanceDto);
  123. // 实际扣费数据
  124. RealChargeDto realChargeDto = new RealChargeDto();
  125. realChargeDto.setUserId(userBalanceDto.getUserId());
  126. realChargeDto.setPrice(userDto.getPrice());
  127. realChargeDto.setNum(po.getNum());
  128. realChargeDto.setTransactionId(t.getTransactionId());
  129. realChargeService.saveRealCharge(realChargeDto);
  130. log.warn("计费日志:{},计费用户id:{}", JSON.toJSONString(t), po.getUserId());
  131. }
  132. });
  133. }
  134. // 遍历发票集合
  135. invoiceResultDto.getResult().stream().forEach(t -> {
  136. t.setTransactionId(t.getTransactionId());
  137. if (!redisTemplate.hasKey(CommonConstant.NUM_FIND_INVOICE_KEY + t.getInvoiceNum() + "_" + t.getInvoiceCode())) {
  138. SearchInvoiceResultDto dto = new SearchInvoiceResultDto();
  139. BeanUtil.copyProperties(dto, t);
  140. dto.setUserId(po.getUserId());
  141. //插入发票信息
  142. searchInvoiceResultService.saveSearchInvoiceResult(dto);
  143. log.info("插入的发票信息:{}", JSON.toJSONString(t));
  144. //存入redis发票信息
  145. redisTemplate.opsForValue().set(CommonConstant.NUM_FIND_INVOICE_KEY + t.getInvoiceNum() + "_" + t.getInvoiceCode(), JSON.toJSONString(t));
  146. //存入redis交易id
  147. redisTemplate.opsForValue().set(CommonConstant.TRANSACTION_ID_KEY + t.getTransactionId(), t.getTransactionId());
  148. }
  149. });
  150. }
  151. } else {
  152. log.error("定时任务处理运单失败;失败原因:调用接口失败;时间:{};运单编号:{}", CommonUtil.dateFormat(new Date()), po.getNum());
  153. }
  154. }
  155. }
  156. }