From bd6229ebd9cb543a22944ecb1142fad92b675dce Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 13 十月 2025 14:26:25 +0800
Subject: [PATCH] bug 修复

---
 server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java |  173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 165 insertions(+), 8 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
index 6c9445e..20bf1f1 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -1,10 +1,16 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.config.wx.SendWxMessage;
+import com.doumee.config.wx.TransferToUser;
+import com.doumee.config.wx.WXPayUtility;
+import com.doumee.config.wx.WxMiniConfig;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.MemberRevenueMapper;
@@ -22,10 +28,13 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.UUID;
 
 /**
  * 鎻愮幇鐢宠璁板綍Service瀹炵幇
@@ -43,6 +52,9 @@
 
     @Autowired
     private MemberRevenueMapper memberRevenueMapper;
+
+    @Autowired
+    private SendWxMessage sendWxMessage;
 
     @Override
     public Integer create(WithdrawalOrders withdrawalOrders) {
@@ -171,38 +183,183 @@
      * 鎻愮幇鐢宠
      * @param withdrawalDTO
      */
-
     @Override
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
-    public void  applyWithdrawal(WithdrawalDTO withdrawalDTO){
+    public TransferToUser.TransferToUserResponse  applyWithdrawal(WithdrawalDTO withdrawalDTO){
         if(Objects.isNull(withdrawalDTO)
-        || Objects.isNull(withdrawalDTO.getAmount())){
+        || Objects.isNull(withdrawalDTO.getAmount())
+        || org.apache.commons.lang3.StringUtils.isBlank(withdrawalDTO.getName())
+        || withdrawalDTO.getAmount().compareTo(BigDecimal.ZERO)<=Constants.ZERO
+        ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         Member member = memberMapper.selectById(withdrawalDTO.getMember().getId());
         if(Objects.isNull(member)){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛淇℃伅寮傚父,璇疯仈绯荤鐞嗗憳");
         }
-        if(member.getAmount() < withdrawalDTO.getAmount()){
+        if(member.getAmount() < withdrawalDTO.getAmount().multiply(new BigDecimal("100")).intValue()){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鍙彁鐜颁綑棰濅笉瓒炽��");
+        }
+        if(StringUtils.isEmpty(member.getName())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璇峰厛鍘荤淮鎶ょ湡瀹炲鍚嶅悗杩涜鎻愮幇鐢宠");
         }
         WithdrawalOrders withdrawalOrders = new WithdrawalOrders();
         withdrawalOrders.setCreateTime(new Date());
         withdrawalOrders.setMemberId(member.getId());
-        withdrawalOrders.setAmount(withdrawalDTO.getAmount());
+        withdrawalOrders.setOutBillNo(UUID.randomUUID().toString().replace("-",""));
+        withdrawalOrders.setAmount((withdrawalDTO.getAmount().multiply(new BigDecimal("100"))).longValue());
         withdrawalOrders.setStatus(Constants.ZERO);
         withdrawalOrders.setType(Constants.ZERO);
+        withdrawalOrders.setDeleted(Constants.ZERO);
 
-        //TODO 鍙戣捣鎻愮幇鐢宠
+        //鍙戣捣鎻愮幇鐢宠
+        TransferToUser.TransferToUserRequest transferToUserRequest = new TransferToUser.TransferToUserRequest();
+        transferToUserRequest.openid = member.getOpenid();
+        transferToUserRequest.outBillNo =  withdrawalOrders.getOutBillNo();
+        transferToUserRequest.transferAmount = withdrawalOrders.getAmount();
+        transferToUserRequest.transferRemark = "鎻愮幇鐢宠";
+        try {
+            TransferToUser.TransferToUserResponse response =  WxMiniConfig.transferToUser.run(transferToUserRequest,withdrawalDTO.getName());
+            withdrawalOrders.setRemark(JSONObject.toJSONString(response));
+            if(response.state.name().equals("WAIT_USER_CONFIRM") || response.state.name().equals("ACCEPTED")){
+                withdrawalOrders.setWxExternalNo(response.transferBillNo);
+            }
+            withdrawalOrdersMapper.insert(withdrawalOrders);
+            //鏇存柊鐢ㄦ埛浣欓
+            memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT -  " + withdrawalOrders.getAmount() ).eq(Member::getId,member.getId()));
+            //瀛樺偍娴佹按璁板綍
+            MemberRevenue memberRevenue = new MemberRevenue();
+            memberRevenue.setCreateTime(new Date());
+            memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo());
+            memberRevenue.setDeleted(Constants.ZERO);
+            memberRevenue.setMemberId(member.getId());
+            memberRevenue.setType(Constants.THREE);
+            memberRevenue.setOptType(-Constants.ONE);
+            memberRevenue.setBeforeAmount(member.getAmount());
+            memberRevenue.setAmount(withdrawalOrders.getAmount());
+            memberRevenue.setAfterAmount(member.getAmount() - withdrawalOrders.getAmount());
+            memberRevenue.setObjId(withdrawalOrders.getId());
+            memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
+            memberRevenue.setObjType(Constants.ONE);
+            memberRevenue.setDeleted(Constants.ZERO);
+            memberRevenue.setStatus(Constants.TWO);
+            memberRevenueMapper.insert(memberRevenue);
+            return response;
+        } catch (WXPayUtility.ApiException e) {
+            String message = JSONObject.parseObject(e.getBody()).getString("message");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),message);
+        }
+    }
 
 
+    @Override
+    public void transferSuccess(String outBillNo,Boolean isSuccess){
+        WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda()
+                .eq(WithdrawalOrders::getOutBillNo,outBillNo).last("limit 1"));
+        Member member = memberMapper.selectById(withdrawalOrders.getMemberId());
+        if(Objects.isNull(member)){
+            return;
+        }
+        if(Objects.nonNull(withdrawalOrders)){
+            //杞处鎴愬姛
+            if(isSuccess){
+                withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>().lambda()
+                        .set(WithdrawalOrders::getStatus,Constants.ONE)
+                        .set(WithdrawalOrders::getUpdateTime, DateUtil.getCurrDateTime())
+                        .eq(WithdrawalOrders::getOutBillNo,outBillNo)
+                );
+                //淇敼娴佹按璁板綍鐘舵��
+                memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda()
+                        .set(MemberRevenue::getStatus,Constants.ZERO)
+                        .set(MemberRevenue::getUpdateTime, DateUtil.getCurrDateTime())
+                        .eq(MemberRevenue::getObjId,withdrawalOrders.getId())
+                        .eq(MemberRevenue::getObjType,Constants.ONE)
+                );
+                withdrawalOrders.setUpdateTime(new Date());
+                sendWxMessage.withdrawalMessage(member.getOpenid(),withdrawalOrders);
+            }else {
+                //鏇存柊鐢ㄦ埛浣欓
+                memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT +  " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId()));
+                //淇敼娴佹按璁板綍鐘舵��
+                memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda()
+                        .set(MemberRevenue::getStatus,Constants.ONE)
+                        .set(MemberRevenue::getUpdateTime, DateUtil.getCurrDateTime())
+                        .eq(MemberRevenue::getObjId,withdrawalOrders.getId())
+                        .eq(MemberRevenue::getObjType,Constants.ONE)
+                );
+                //瀛樺偍娴佹按璁板綍
+                MemberRevenue memberRevenue = new MemberRevenue();
+                memberRevenue.setCreateTime(new Date());
+                memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo());
+                memberRevenue.setDeleted(Constants.ZERO);
+                memberRevenue.setMemberId(withdrawalOrders.getMemberId());
+                memberRevenue.setType(Constants.FOUR);
+                memberRevenue.setOptType(Constants.ONE);
+                memberRevenue.setBeforeAmount(member.getAmount());
+                memberRevenue.setAmount(withdrawalOrders.getAmount());
+                memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount());
+                memberRevenue.setObjId(withdrawalOrders.getId());
+                memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
+                memberRevenue.setObjType(Constants.ONE);
+                memberRevenue.setDeleted(Constants.ZERO);
+                memberRevenue.setStatus(Constants.ZERO);
+                memberRevenueMapper.insert(memberRevenue);
+            }
+        }
 
-        //鏇存柊鐢ㄦ埛浣欓
+    }
 
+    @Override
+    public void cancelTransfer(TransferToUser.CancelTransferRequest request){
+        if(Objects.isNull(request)
+        || StringUtils.isEmpty(request.outBillNo)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda().eq(WithdrawalOrders::getOutBillNo,request.outBillNo).last("limit 1"));
+        if(Objects.isNull(withdrawalOrders)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        Member member = memberMapper.selectById(withdrawalOrders.getMemberId());
+        if(Objects.isNull(member)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        try {
+            TransferToUser.CancelTransferResponse response =  WxMiniConfig.transferToUser.cancelRun(request);
+            if(response.state.equals("CANCELING")){
+                //鏍囪鎻愮幇澶辫触 鍔犲洖瀵瑰簲鐨勬彁鐜伴噾棰�
+                withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>()
+                        .lambda().set(WithdrawalOrders::getStatus,Constants.TWO)
+                        .eq(WithdrawalOrders::getId,withdrawalOrders.getId()));
 
-        //瀛樺偍娴佹按璁板綍
+                memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda().set(MemberRevenue::getStatus,Constants.ONE)
+                                .set(MemberRevenue::getUpdateTime,new Date())
+                        .eq(MemberRevenue::getObjId,withdrawalOrders.getId()))
+                ;
 
+                //鏇存柊鐢ㄦ埛浣欓
+                memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT + " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId()));
 
+                //瀛樺偍娴佹按璁板綍
+                MemberRevenue memberRevenue = new MemberRevenue();
+                memberRevenue.setCreateTime(new Date());
+                memberRevenue.setMemberId(withdrawalOrders.getMemberId());
+                memberRevenue.setType(Constants.FOUR);
+                memberRevenue.setOptType(Constants.ONE);
+                memberRevenue.setBeforeAmount(member.getAmount());
+                memberRevenue.setAmount(withdrawalOrders.getAmount());
+                memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount());
+                memberRevenue.setObjId(withdrawalOrders.getId());
+                memberRevenue.setObjType(Constants.ONE);
+                memberRevenue.setDeleted(Constants.ZERO);
+                memberRevenue.setStatus(Constants.ZERO);
+                memberRevenueMapper.insert(memberRevenue);
+
+            }
+            System.out.println(JSONObject.toJSONString(response));
+        } catch (WXPayUtility.ApiException e) {
+            String message = JSONObject.parseObject(e.getBody()).getString("message");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),message);
+        }
 
     }
 

--
Gitblit v1.9.3