GoodsWholesaleServiceImpl.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package com.cyksj.service.goods.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.cyksj.common.constant.Constant;
  7. import com.cyksj.common.exception.BusinessRuntimeException;
  8. import com.cyksj.common.util.Codec;
  9. import com.cyksj.common.util.Jsons;
  10. import com.cyksj.common.util.Xmls;
  11. import com.cyksj.mapper.GoodsWholesaleMapper;
  12. import com.cyksj.mapper.GoodsWholesaleOrderDonMapper;
  13. import com.cyksj.mapper.GoodsWholesaleUserAccountMapper;
  14. import com.cyksj.mapper.GoodsWholesaleUserDepositMapper;
  15. import com.cyksj.mapper.channel.ShopConfigMapper;
  16. import com.cyksj.mapper.manage.cms.CmsUserMapper;
  17. import com.cyksj.mapper.sys.SysConfigMapper;
  18. import com.cyksj.model.dto.GoodsWholesaleUserDepositDto;
  19. import com.cyksj.model.entity.*;
  20. import com.cyksj.model.request.OrderRefundReq;
  21. import com.cyksj.service.goods.GoodsWholesaleService;
  22. import com.cyksj.service.order.OrderRefundService;
  23. import com.cyksj.service.user.UserBindRelationService;
  24. import lombok.RequiredArgsConstructor;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.springframework.dao.DuplicateKeyException;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import java.math.BigDecimal;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.Optional;
  34. /**
  35. * 项目名: yhlxj
  36. * 文件名: GoodsWholesaleServiceImpl
  37. * 创建者: JavaZou
  38. * 创建时间:2024/8/26 11:49
  39. */
  40. @Service
  41. @RequiredArgsConstructor
  42. @Slf4j
  43. public class GoodsWholesaleServiceImpl extends ServiceImpl<GoodsWholesaleMapper, GoodsWholesale> implements GoodsWholesaleService {
  44. private final GoodsWholesaleUserDepositMapper goodsWholesaleUserDepositMapper;
  45. private final OrderRefundService orderRefundService;
  46. private final ShopConfigMapper shopConfigMapper;
  47. private final CmsUserMapper cmsUserMapper;
  48. private final GoodsWholesaleOrderDonMapper wholesaleOrderDonMapper;
  49. private final GoodsWholesaleUserAccountMapper goodsWholesaleUserAccountMapper;
  50. private final SysConfigMapper sysConfigMapper;
  51. private final UserBindRelationService userBindRelationService;
  52. @Override
  53. @Transactional(rollbackFor = Throwable.class)
  54. public void depositRefund(Long id, Long adminId) throws Exception {
  55. GoodsWholesaleUserDeposit goodsWholesaleUserDeposit = goodsWholesaleUserDepositMapper.selectById(id);
  56. if (goodsWholesaleUserDeposit == null) {
  57. throw BusinessRuntimeException.getInstance("记录不存在");
  58. }
  59. if (goodsWholesaleUserDeposit.getStatus() == GoodsWholesaleUserDeposit.Status.refund) {
  60. throw BusinessRuntimeException.getInstance("押金已退");
  61. }
  62. int update = goodsWholesaleUserDepositMapper.update(null, Wrappers.lambdaUpdate(GoodsWholesaleUserDeposit.class)
  63. .set(GoodsWholesaleUserDeposit::getStatus, GoodsWholesaleUserDeposit.Status.refund)
  64. .eq(GoodsWholesaleUserDeposit::getId, id)
  65. .eq(GoodsWholesaleUserDeposit::getStatus, GoodsWholesaleUserDeposit.Status.hasPayment));
  66. if (update == 0) {
  67. throw BusinessRuntimeException.getInstance("押金已退");
  68. }
  69. String outRefundNo = orderRefundService.refundWholesaleUserDeposit(goodsWholesaleUserDeposit);
  70. goodsWholesaleUserDeposit.setRefundOutNo(outRefundNo);
  71. Optional.ofNullable(cmsUserMapper.selectById(adminId)).ifPresent(cu -> goodsWholesaleUserDeposit.setOperator(cu.getNickname()));
  72. //是否达到目标额
  73. setStatusIfGoal(goodsWholesaleUserDeposit);
  74. goodsWholesaleUserDeposit.setStatus(GoodsWholesaleUserDeposit.Status.refund);
  75. goodsWholesaleUserDepositMapper.updateById(goodsWholesaleUserDeposit);
  76. }
  77. @Override
  78. public void wxRefundNotify(Map<String, String> map) throws Exception {
  79. // 对退款数据 解密
  80. String md5Key = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData(shopConfigMapper.getByAppId(map.get("mch_id")).getSecret()).toHexString();
  81. String reqInfoXml = Codec.DoCipher.custom().setAlgorithm(Codec.DoCipher.Trans.AES_ECB_PKCS7Padding).setBase64Data(map.get("req_info")).setStringKey(md5Key).ofDecrypt().toText();
  82. log.info("=== 退款数据解密: \n {}", reqInfoXml);
  83. Map<String, String> reqInfoMap = Xmls.toMap(reqInfoXml);
  84. // 退款失败
  85. if (StrUtil.equals("CHANGE", reqInfoMap.get("refund_status"))) {
  86. throw BusinessRuntimeException.getInstance("退款异常.");
  87. } else if (StrUtil.equals("REFUNDCLOSE", reqInfoMap.get("refund_status"))) {
  88. throw BusinessRuntimeException.getInstance("退款关闭.");
  89. }
  90. /* 此处处理业务逻辑 */
  91. String outRefundNo = reqInfoMap.get("out_refund_no");
  92. String transactionId = reqInfoMap.get("transaction_id");
  93. String refundFee = reqInfoMap.get("refund_fee");
  94. GoodsWholesaleUserDeposit userDeposit = goodsWholesaleUserDepositMapper.selectOne(Wrappers.lambdaQuery(GoodsWholesaleUserDeposit.class).eq(GoodsWholesaleUserDeposit::getTransactionId, transactionId).last("limit 1"));
  95. if (userDeposit == null) {
  96. log.error("退款回调,transactionId:{}订单不存在", transactionId);
  97. return;
  98. }
  99. log.info("微信退款: 退款单号[{}] 退款成功.", outRefundNo);
  100. if (userDeposit.getStatus()!= GoodsWholesaleUserDeposit.Status.refund) {
  101. userDeposit.setStatus(GoodsWholesaleUserDeposit.Status.refund);
  102. goodsWholesaleUserDepositMapper.updateById(userDeposit);
  103. }
  104. }
  105. @Override
  106. @Transactional(rollbackFor = Throwable.class)
  107. public void uploadAccount(List<Object> acountList, Long orderId) {
  108. GoodsWholesaleOrderDon orderDon = wholesaleOrderDonMapper.selectById(orderId);
  109. if (orderDon.getStatus() != GoodsWholesaleOrderDon.Status.hasPayment) {
  110. throw BusinessRuntimeException.getInstance("订单状态错误");
  111. }
  112. int update = wholesaleOrderDonMapper.update(null, Wrappers.lambdaUpdate(GoodsWholesaleOrderDon.class)
  113. .set(GoodsWholesaleOrderDon::getStatus, GoodsWholesaleOrderDon.Status.complete)
  114. .eq(GoodsWholesaleOrderDon::getStatus, GoodsWholesaleOrderDon.Status.hasPayment)
  115. .eq(GoodsWholesaleOrderDon::getId, orderId));
  116. if (update == 0) {
  117. throw BusinessRuntimeException.getInstance("账号已发货");
  118. }
  119. String regex = "----";
  120. List<GoodsWholesaleUserAccount> insert = new ArrayList<>();
  121. GoodsWholesaleUserAccount goodsWholesaleUserAccount = null;
  122. for (Object obj : acountList) {
  123. Map<String, Object> map = Jsons.toMap(obj);
  124. String data = map.get(0).toString();
  125. String[] split = data.split(regex);
  126. String account = split[0];
  127. String password = split[1];
  128. goodsWholesaleUserAccount = new GoodsWholesaleUserAccount();
  129. goodsWholesaleUserAccount.setAccount(account);
  130. goodsWholesaleUserAccount.setPassword(password);
  131. insert.add(goodsWholesaleUserAccount);
  132. }
  133. goodsWholesaleUserAccountMapper.batchInsert(orderDon.getUserId(), orderId, insert);
  134. }
  135. @Override
  136. public void saveOrUpdateWholesale(GoodsWholesale wholesale) throws Exception {
  137. List<GoodsWholesale.GoodsWholesaleConfig> wholesaleConfig = wholesale.getWholesaleConfig();
  138. String config = Jsons.toJson(wholesaleConfig);
  139. wholesale.setConfig(config);
  140. try {
  141. this.saveOrUpdate(wholesale);
  142. } catch (DuplicateKeyException e) {
  143. throw BusinessRuntimeException.getInstance("已存在该批发规格");
  144. }
  145. }
  146. @Override
  147. public void updateOrderAccount(List<GoodsWholesaleUserAccount> goodsWholesaleUserAccounts) {
  148. goodsWholesaleUserAccounts.forEach(order -> {
  149. goodsWholesaleUserAccountMapper.updateById(order);
  150. if (order.getId() == null) {
  151. goodsWholesaleUserAccountMapper.insert(order);
  152. }
  153. });
  154. }
  155. @Override
  156. public void insertOrderAccount(List<GoodsWholesaleUserAccount> goodsWholesaleUserAccounts) {
  157. goodsWholesaleUserAccounts.forEach(order -> {
  158. goodsWholesaleUserAccountMapper.insert(order);
  159. });
  160. if (CollUtil.isNotEmpty(goodsWholesaleUserAccounts)) {
  161. Long orderId = goodsWholesaleUserAccounts.get(0).getOrderId();
  162. GoodsWholesaleOrderDon orderDon = wholesaleOrderDonMapper.selectById(orderId);
  163. orderDon.setStatus(GoodsWholesaleOrderDon.Status.complete);
  164. wholesaleOrderDonMapper.updateById(orderDon);
  165. }
  166. }
  167. @Override
  168. public void wholesaleOrderRefund(OrderRefundReq refundReq) throws Exception {
  169. Long orderId = refundReq.getOrderId();
  170. GoodsWholesaleOrderDon orderDon = wholesaleOrderDonMapper.selectById(orderId);
  171. if (orderDon == null) {
  172. return;
  173. }
  174. //余额
  175. if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
  176. return;
  177. }
  178. if (orderDon.getStatus() == GoodsWholesaleOrderDon.Status.refund) {
  179. return;
  180. }
  181. orderDon.setRefundMoney(refundReq.getRefundMoney());
  182. String outRefundNo = orderRefundService.refundWholesaleOrder(orderDon);
  183. orderDon.setOutRefundNo(outRefundNo);
  184. orderDon.setStatus(GoodsWholesaleOrderDon.Status.refund);
  185. wholesaleOrderDonMapper.updateById(orderDon);
  186. }
  187. private void setStatusIfGoal(GoodsWholesaleUserDeposit goodsWholesaleUserDeposit) throws Exception {
  188. //是否已满足 批发足够账号
  189. SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
  190. .eq(SysConfig::getSysKey, Constant.WHOLESALE_DEPOSIT_KEY)
  191. .last("limit 1"));
  192. if (sysConfig == null || StrUtil.isEmpty(sysConfig.getSysValue())) {
  193. log.error("押金配置已失效");
  194. return;
  195. }
  196. GoodsWholesaleUserDepositDto goodsWholesaleUserDepositDto = Jsons.parseObject(sysConfig.getSysValue(), GoodsWholesaleUserDepositDto.class);
  197. Integer num = goodsWholesaleUserDepositDto.getNum();
  198. List<Long> userIdList = userBindRelationService.getRelationUserIdList(goodsWholesaleUserDeposit.getUserId(), null);
  199. Integer payNum = wholesaleOrderDonMapper.getUserWholesaleNumByUserIds(userIdList, null);
  200. if (payNum >= num) {
  201. //批发数量已达
  202. goodsWholesaleUserDeposit.setIsGoal(true);
  203. }
  204. }
  205. }