ExamRegistrationPaymentServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package com.keao.edu.user.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.keao.edu.common.dal.BaseDAO;
  4. import com.keao.edu.common.exception.BizException;
  5. import com.keao.edu.common.page.PageInfo;
  6. import com.keao.edu.common.service.impl.BaseServiceImpl;
  7. import com.keao.edu.thirdparty.adapay.Payment;
  8. import com.keao.edu.thirdparty.yqpay.Msg;
  9. import com.keao.edu.thirdparty.yqpay.RsqMsg;
  10. import com.keao.edu.thirdparty.yqpay.YqPayFeignService;
  11. import com.keao.edu.thirdparty.yqpay.YqPayUtil;
  12. import com.keao.edu.user.dao.ExamOrganizationRelationDao;
  13. import com.keao.edu.user.dao.ExamRegistrationPaymentDao;
  14. import com.keao.edu.user.dto.ExamPaymentInfo;
  15. import com.keao.edu.user.dto.ExamRegistrationDto;
  16. import com.keao.edu.user.dto.ExamRegistrationPaymentDto;
  17. import com.keao.edu.user.entity.ExamOrganizationRelation;
  18. import com.keao.edu.user.entity.ExamRegistration;
  19. import com.keao.edu.user.entity.ExamRegistrationPayment;
  20. import com.keao.edu.user.entity.Organization;
  21. import com.keao.edu.user.enums.StudentRegistrationStatusEnum;
  22. import com.keao.edu.user.enums.TransStatusEnum;
  23. import com.keao.edu.user.page.ExamRegistrationPaymentQueryInfo;
  24. import com.keao.edu.user.service.ExamRegistrationPaymentService;
  25. import com.keao.edu.user.service.ExamRegistrationService;
  26. import com.keao.edu.user.service.OrganizationService;
  27. import com.keao.edu.util.collection.MapUtil;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Isolation;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import org.springframework.util.CollectionUtils;
  33. import java.math.BigDecimal;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. @Service
  37. public class ExamRegistrationPaymentServiceImpl extends BaseServiceImpl<Long, ExamRegistrationPayment> implements ExamRegistrationPaymentService {
  38. @Autowired
  39. private ExamRegistrationPaymentDao examRegistrationPaymentDao;
  40. @Autowired
  41. private ExamRegistrationService examRegistrationService;
  42. @Autowired
  43. private YqPayFeignService yqPayFeignService;
  44. @Autowired
  45. private OrganizationService organizationService;
  46. @Autowired
  47. private ExamOrganizationRelationDao examOrganizationRelationDao;
  48. @Override
  49. public BaseDAO<Long, ExamRegistrationPayment> getDAO() {
  50. return examRegistrationPaymentDao;
  51. }
  52. @Override
  53. public ExamRegistrationPayment getExamIngOrder(Long examinationBasicId, Integer userId) {
  54. return examRegistrationPaymentDao.getExamIngOrder(examinationBasicId, userId);
  55. }
  56. @Override
  57. public ExamRegistrationPayment getByOrderNo(String orderNo) {
  58. return examRegistrationPaymentDao.getByOrderNo(orderNo);
  59. }
  60. @Override
  61. public ExamPaymentInfo getExamOrderInfo(String orderNo) {
  62. ExamPaymentInfo examPaymentInfo = new ExamPaymentInfo();
  63. ExamRegistrationPayment order = examRegistrationPaymentDao.getByOrderNo(orderNo);
  64. ExamRegistrationDto examRegistration = examRegistrationService.getExamRegistration(order.getExamRegistrationId());
  65. examPaymentInfo.setExamRegistrationPayment(order);
  66. examPaymentInfo.setExamRegistrationDto(examRegistration);
  67. return examPaymentInfo;
  68. }
  69. @Override
  70. @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
  71. public ExamRegistrationPayment updateOrder(Map<String, String> rpMap) {
  72. ExamRegistrationPayment order = examRegistrationPaymentDao.getByOrderNo(rpMap.get("orderNo"));
  73. if (order == null || !order.getTransStatus().equals(TransStatusEnum.ING)) {
  74. return order;
  75. }
  76. TransStatusEnum status = rpMap.get("transStatus").equals("SUCCESS") ? TransStatusEnum.SUCCESS : TransStatusEnum.FAILED;
  77. if (status.equals(TransStatusEnum.SUCCESS)) {
  78. order.setTransSuccessedTime(new Date());
  79. } else {
  80. order.setMemo(rpMap.get("memo"));
  81. }
  82. order.setTransStatus(status);
  83. order.setTransNo(rpMap.get("transNo"));
  84. order.setPayChannel(rpMap.get("channelType"));
  85. if (examRegistrationPaymentDao.update(order) <= 0) {
  86. throw new BizException("订单更新失败");
  87. }
  88. ExamRegistration examRegistration = examRegistrationService.get(order.getExamRegistrationId());
  89. if (!examRegistration.getStatus().equals(StudentRegistrationStatusEnum.PAY_WAIT)) {
  90. return order;
  91. }
  92. StudentRegistrationStatusEnum registrationStatus = order.getTransStatus().equals(TransStatusEnum.SUCCESS) ? StudentRegistrationStatusEnum.AUDIT_WAIT : StudentRegistrationStatusEnum.CANCEL;
  93. examRegistration.setStatus(registrationStatus);
  94. examRegistration.setUpdateTime(new Date());
  95. if (examRegistrationService.update(examRegistration) <= 0) {
  96. throw new BizException("报名状态更新失败");
  97. }
  98. if (!order.getTransStatus().equals(TransStatusEnum.SUCCESS)) {
  99. return order;
  100. }
  101. //更新报名人数,和报名金额
  102. ExamOrganizationRelation examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examRegistration.getExaminationBasicId(), examRegistration.getOrganId());
  103. int selfRegistrationStudentNum = examOrganizationRelation.getSelfRegistrationStudentNum() == null ? 0 : examOrganizationRelation.getSelfRegistrationStudentNum();
  104. examOrganizationRelation.setSelfRegistrationStudentNum(selfRegistrationStudentNum + 1);
  105. BigDecimal selfPaymentAmount = examOrganizationRelation.getSelfPaymentAmount() == null ? BigDecimal.ZERO : examOrganizationRelation.getSelfPaymentAmount();
  106. BigDecimal amount = selfPaymentAmount.add(examRegistration.getLevelFee()).add(examRegistration.getTheoryLevelFee());
  107. examOrganizationRelation.setSelfPaymentAmount(amount);
  108. if (examOrganizationRelationDao.update(examOrganizationRelation) <= 0) {
  109. throw new BizException("报名人数报名金额更新失败");
  110. }
  111. Organization organization = organizationService.get(examRegistration.getOrganId());
  112. List<Integer> parentOrganIds = Arrays.stream(organization.getParentOrganIdTag().split(","))
  113. .map(e -> Integer.valueOf(e)).collect(Collectors.toList());
  114. List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getExamOrganizationRelations(examRegistration.getExaminationBasicId(), parentOrganIds);
  115. for (ExamOrganizationRelation examOrgan : examOrgans) {
  116. examOrgan.setTotalRegistrationStudentNum(examOrgan.getTotalRegistrationStudentNum() + 1);
  117. BigDecimal totalAmount = examOrgan.getTotalPaymentAmount().add(examRegistration.getLevelFee()).add(examRegistration.getTheoryLevelFee());
  118. examOrgan.setTotalPaymentAmount(totalAmount);
  119. }
  120. if(!CollectionUtils.isEmpty(examOrgans)){
  121. examOrganizationRelationDao.batchUpdate(examOrgans);
  122. }
  123. return order;
  124. }
  125. @Override
  126. public PageInfo<ExamRegistrationPaymentDto> pageList(ExamRegistrationPaymentQueryInfo queryInfo) {
  127. PageInfo<ExamRegistrationPaymentDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
  128. Map<String, Object> params = new HashMap<>();
  129. MapUtil.populateMap(params, queryInfo);
  130. List<Integer> nextLevelOrganIds = organizationService.getChildOrganIds(queryInfo.getOrganId(), true);
  131. params.put("organIds", nextLevelOrganIds);
  132. List<ExamRegistrationPaymentDto> dataList = Collections.EMPTY_LIST;
  133. int count = examRegistrationPaymentDao.getOrderListCount(params);
  134. if (count > 0) {
  135. pageInfo.setTotal(count);
  136. params.put("offset", pageInfo.getOffset());
  137. dataList = examRegistrationPaymentDao.getOrderPageList(params);
  138. }
  139. pageInfo.setRows(dataList);
  140. return pageInfo;
  141. }
  142. @Override
  143. public void queryPaymentStatus() throws Exception {
  144. yqPayQuery();
  145. adaPayQuery();
  146. }
  147. @Override
  148. @Transactional(rollbackFor = Exception.class)
  149. public Boolean closeOrder(String orderNo) {
  150. ExamRegistrationPayment order = examRegistrationPaymentDao.getByOrderNo(orderNo);
  151. if (!order.getTransStatus().equals(TransStatusEnum.ING)) {
  152. throw new BizException("订单不是待支付状态,不能关闭");
  153. }
  154. Date nowDate = new Date();
  155. order.setMemo("用户主动放弃支付");
  156. order.setTransStatus(TransStatusEnum.CLOSE);
  157. order.setUpdateTime(nowDate);
  158. if (examRegistrationPaymentDao.update(order) <= 0) {
  159. throw new BizException("订单关闭失败,请重试");
  160. }
  161. ExamRegistration examRegistration = examRegistrationService.get(order.getExamRegistrationId());
  162. examRegistration.setStatus(StudentRegistrationStatusEnum.CANCEL);
  163. examRegistration.setUpdateTime(nowDate);
  164. if (examRegistrationService.update(examRegistration) <= 0) {
  165. throw new BizException("报名取消失败,请重试");
  166. }
  167. return true;
  168. }
  169. private void yqPayQuery() throws Exception {
  170. List<ExamRegistrationPayment> orders = examRegistrationPaymentDao.getOrdersByStatus("ING", "YQPAY");
  171. if (orders.size() == 0) {
  172. return;
  173. }
  174. List<String> orderNoList = orders.stream().map(ExamRegistrationPayment::getOrderNo).collect(Collectors.toList());
  175. String merOrderNos = orders.stream().map(ExamRegistrationPayment::getOrderNo).collect(Collectors.joining(","));
  176. String notifyUrl = ""; //回调地址
  177. Map<String, Object> resultMap = new LinkedHashMap<>();
  178. resultMap.put("merOrderNoList", merOrderNos);
  179. Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
  180. RsqMsg rsqMsg = new RsqMsg(requestMap);
  181. Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
  182. if (queryRs.getCode().equals("88")) {
  183. //更新订单状态
  184. String[] statusArr = {"0", "1", "7"};
  185. String responseParameters = queryRs.getResponseParameters();
  186. List<Map<String, String>> responseList = JSON.parseObject(responseParameters, List.class);
  187. for (Map<String, String> response : responseList) {
  188. Map<String, String> rpMap = response;
  189. String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
  190. TransStatusEnum status = rpMap.get("tradeState").equals("1") ? TransStatusEnum.SUCCESS : TransStatusEnum.FAILED;
  191. String memo = rpMap.get("remarks");
  192. String orderNo = rpMap.get("merOrderNo");
  193. String transNo = rpMap.get("orderNo");
  194. rpMap.put("channelType", channelType);
  195. rpMap.put("memo", memo);
  196. rpMap.put("transStatus", status.getCode());
  197. rpMap.put("orderNo", orderNo);
  198. rpMap.put("transNo", transNo);
  199. if (orderNoList.contains(orderNo)) {
  200. orderNoList.remove(orderNo);
  201. }
  202. if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
  203. try {
  204. updateOrder(rpMap); //更新订单
  205. } catch (Exception e) {
  206. e.printStackTrace();
  207. }
  208. continue;
  209. }
  210. }
  211. closeOrders(orderNoList); //关闭订单
  212. }
  213. }
  214. private void adaPayQuery() throws Exception {
  215. List<ExamRegistrationPayment> orders = examRegistrationPaymentDao.getOrdersByStatus("ING", "ADAPAY");
  216. if (orders.size() == 0) {
  217. return;
  218. }
  219. List<String> orderNoList = new ArrayList<String>();
  220. for (ExamRegistrationPayment order : orders) {
  221. if (order.getTransNo() == null) {
  222. orderNoList.add(order.getOrderNo());
  223. continue;
  224. }
  225. Map<String, Object> payment = Payment.queryPayment(order.getTransNo());
  226. Map<String, String> rpMap = new HashMap<>();
  227. rpMap.put("orderNo", order.getOrderNo());
  228. rpMap.put("transNo", order.getTransNo());
  229. rpMap.put("channelType", (String) payment.get("pay_channel"));
  230. String status = (String) payment.get("status");
  231. if (payment.containsKey("error_msg")) {
  232. rpMap.put("memo", (String) payment.get("error_msg"));
  233. }
  234. if (status.equals("succeeded")) {
  235. rpMap.put("transStatus", "SUCCESS");
  236. }
  237. if (status.equals("failed")) {
  238. rpMap.put("transStatus", "FAILED");
  239. }
  240. if (rpMap.containsKey("transStatus")) {
  241. try {
  242. updateOrder(rpMap); //更新订单
  243. } catch (Exception e) {
  244. e.printStackTrace();
  245. continue;
  246. }
  247. }
  248. if (status.equals("pending")) {
  249. orderNoList.add(order.getOrderNo());
  250. }
  251. }
  252. closeOrders(orderNoList);
  253. }
  254. private void closeOrders(List<String> orderNoList) throws Exception {
  255. if (orderNoList.size() == 0) {
  256. return;
  257. }
  258. Calendar beforeTime = Calendar.getInstance();
  259. beforeTime.add(Calendar.MINUTE, -30);// 30分钟之前的时间
  260. Date beforeDate = beforeTime.getTime();
  261. List<ExamRegistrationPayment> ordersOverTime = examRegistrationPaymentDao.findOrdersOverTime(orderNoList, TransStatusEnum.ING, beforeDate);
  262. for (ExamRegistrationPayment order : ordersOverTime) {
  263. try {
  264. Map<String, String> rpMap = new HashMap<>();
  265. rpMap.put("orderNo", order.getOrderNo());
  266. rpMap.put("transNo", order.getTransNo());
  267. rpMap.put("memo", "超时未支付关闭");
  268. rpMap.put("transStatus", "FAILED");
  269. updateOrder(rpMap); //更新订单
  270. } catch (Exception e) {
  271. e.printStackTrace();
  272. continue;
  273. }
  274. }
  275. }
  276. }