From 55642c818f14bf8cf52c98e6858014bd8dc3d3a7 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期四, 16 四月 2026 20:10:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java |  167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 2 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 2602c77..83e7959 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
@@ -11,12 +11,15 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.DriverInfoMapper;
+import com.doumee.dao.business.RevenueMapper;
 import com.doumee.dao.business.ShopInfoMapper;
 import com.doumee.dao.business.WithdrawalOrdersMapper;
 import com.doumee.dao.business.model.DriverInfo;
+import com.doumee.dao.business.model.Revenue;
 import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.business.model.WithdrawalOrders;
 import com.doumee.dao.dto.WithdrawalApproveDTO;
+import com.doumee.dao.dto.WithdrawalDTO;
 import com.doumee.dao.system.SystemUserMapper;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.WithdrawalOrdersService;
@@ -25,10 +28,13 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  * 鎻愮幇鐢宠璁板綍Service瀹炵幇
@@ -49,6 +55,9 @@
 
     @Autowired
     private DriverInfoMapper driverInfoMapper;
+
+    @Autowired
+    private RevenueMapper revenueMapper;
 
     @Override
     public Integer create(WithdrawalOrders withdrawalOrders) {
@@ -238,15 +247,60 @@
 
         // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
         Integer currentUserId = getCurrentUserId();
+        Date now = new Date();
 
         WithdrawalOrders update = new WithdrawalOrders();
         update.setId(dto.getId());
         update.setStatus(dto.getStatus());
         update.setUserId(currentUserId);
-        update.setApproveTime(new Date());
+        update.setApproveTime(now);
         update.setApproveRemark(dto.getApproveRemark());
-        update.setUpdateTime(new Date());
+        update.setUpdateTime(now);
         withdrawalOrdersMapper.updateById(update);
+
+        // 椹冲洖鏃堕��鍥炰綑棰�
+        if (Constants.TWO.equals(dto.getStatus())) {
+            Long amountFen = order.getAmount() != null ? order.getAmount() : 0L;
+            if (amountFen > 0 && order.getMemberId() != null) {
+                if (Constants.equalsInteger(order.getMemberType(), Constants.ONE)) {
+                    // 鍙告満锛氶�氳繃 memberId 鏌� DriverInfo锛岄��鍥� balance
+                    DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                            .eq(DriverInfo::getMemberId, order.getMemberId())
+                            .eq(DriverInfo::getDeleted, Constants.ZERO)
+                            .last("limit 1"));
+                    if (driver != null) {
+                        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                                .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amountFen)
+                                .eq(DriverInfo::getId, driver.getId()));
+                    }
+                } else if (Constants.equalsInteger(order.getMemberType(), Constants.TWO)) {
+                    // 闂ㄥ簵锛氶�氳繃 memberId 鏌� ShopInfo锛岄��鍥� balance
+                    ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+                            .eq(ShopInfo::getRegionMemberId, order.getMemberId())
+                            .eq(ShopInfo::getDeleted, Constants.ZERO)
+                            .last("limit 1"));
+                    if (shop != null) {
+                        shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda()
+                                .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amountFen)
+                                .eq(ShopInfo::getId, shop.getId()));
+                    }
+                }
+                // 鍒涘缓閫�鍥� Revenue 璁板綍
+                Revenue revenue = new Revenue();
+                revenue.setMemberId(order.getMemberId());
+                revenue.setMemberType(order.getMemberType());
+                revenue.setType(Constants.TWO); // 2=鎻愮幇閫�鍥�
+                revenue.setOptType(Constants.ONE); // 1=鏀跺叆
+                revenue.setAmount(amountFen);
+                revenue.setVaildStatus(Constants.ONE); // 宸插叆璐�
+                revenue.setObjId(order.getId());
+                revenue.setObjType(Constants.ONE); // 1=鎻愮幇涓氬姟
+                revenue.setStatus(Constants.ZERO);
+                revenue.setDeleted(Constants.ZERO);
+                revenue.setCreateTime(now);
+                revenueMapper.insert(revenue);
+            }
+        }
     }
 
     private Integer getCurrentUserId() {
@@ -289,4 +343,113 @@
         }
     }
 
+    @Override
+    public void applyDriverWithdrawal(WithdrawalDTO dto, Integer memberId) {
+        DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+        long amountFen = dto.getAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
+        long balance = driver.getBalance() != null ? driver.getBalance() : 0L;
+        if (amountFen <= 0) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎻愮幇閲戦蹇呴』澶т簬0");
+        }
+        if (amountFen > balance) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎻愮幇閲戦涓嶈兘瓒呰繃鍙敤浣欓");
+        }
+        String billNo = generateBillNo();
+        Date now = new Date();
+        // 鎵e噺鍙告満浣欓
+        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + amountFen)
+                .eq(DriverInfo::getId, driver.getId()));
+        // 鍒涘缓鎻愮幇璁板綍
+        WithdrawalOrders order = new WithdrawalOrders();
+        order.setMemberId(memberId);
+        order.setMemberType(Constants.ONE);
+        order.setAmount(amountFen);
+        order.setStatus(Constants.ZERO);
+        order.setType(Constants.ZERO);
+        order.setOutBillNo(billNo);
+        order.setAliAccount(dto.getAliAccount());
+        order.setDeleted(Constants.ZERO);
+        order.setCreateTime(now);
+        order.setUpdateTime(now);
+        order.setCreateUser(memberId);
+        withdrawalOrdersMapper.insert(order);
+        // 鍒涘缓鏀嚭 Revenue 璁板綍
+        Revenue revenue = new Revenue();
+        revenue.setMemberId(memberId);
+        revenue.setMemberType(Constants.ONE);
+        revenue.setType(Constants.ONE);
+        revenue.setOptType(-Constants.ONE);
+        revenue.setAmount(amountFen);
+        revenue.setVaildStatus(Constants.ONE);
+        revenue.setObjId(order.getId());
+        revenue.setObjType(Constants.ONE);
+        revenue.setStatus(Constants.ZERO);
+        revenue.setDeleted(Constants.ZERO);
+        revenue.setCreateTime(now);
+        revenueMapper.insert(revenue);
+    }
+
+    @Override
+    public void applyShopWithdrawal(WithdrawalDTO dto, Integer shopId) {
+        ShopInfo shop = shopInfoMapper.selectById(shopId);
+        if (shop == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        long amountFen = dto.getAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
+        long balance = shop.getBalance() != null ? shop.getBalance() : 0L;
+        if (amountFen <= 0) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎻愮幇閲戦蹇呴』澶т簬0");
+        }
+        if (amountFen > balance) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎻愮幇閲戦涓嶈兘瓒呰繃鍙敤浣欓");
+        }
+        String billNo = generateBillNo();
+        Date now = new Date();
+        // 鎵e噺闂ㄥ簵浣欓
+        shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda()
+                .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + amountFen)
+                .eq(ShopInfo::getId, shopId));
+        // 鍒涘缓鎻愮幇璁板綍
+        WithdrawalOrders order = new WithdrawalOrders();
+        order.setMemberId(shop.getRegionMemberId());
+        order.setMemberType(Constants.TWO);
+        order.setAmount(amountFen);
+        order.setStatus(Constants.ZERO);
+        order.setType(Constants.ZERO);
+        order.setOutBillNo(billNo);
+        order.setAliAccount(dto.getAliAccount());
+        order.setDeleted(Constants.ZERO);
+        order.setCreateTime(now);
+        order.setUpdateTime(now);
+        order.setCreateUser(shop.getRegionMemberId());
+        withdrawalOrdersMapper.insert(order);
+        // 鍒涘缓鏀嚭 Revenue 璁板綍
+        Revenue revenue = new Revenue();
+        revenue.setMemberId(shop.getRegionMemberId());
+        revenue.setMemberType(Constants.TWO);
+        revenue.setType(Constants.ONE); // 1=鎻愮幇鏀嚭
+        revenue.setOptType(-Constants.ONE); // -1=鏀嚭
+        revenue.setAmount(amountFen);
+        revenue.setVaildStatus(Constants.ONE); // 宸插叆璐�
+        revenue.setObjId(order.getId());
+        revenue.setObjType(Constants.ONE); // 1=鎻愮幇涓氬姟
+        revenue.setStatus(Constants.ZERO);
+        revenue.setDeleted(Constants.ZERO);
+        revenue.setCreateTime(now);
+        revenueMapper.insert(revenue);
+    }
+
+    private String generateBillNo() {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        String random = String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999));
+        return "TX" + sdf.format(new Date()) + random;
+    }
+
 }

--
Gitblit v1.9.3