rk
5 小时以前 7eebfc8a64d2cbbd73453a2b653d5a5bfd66a32f
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();
        // 扣减司机余额
        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();
        // 扣减门店余额
        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;
    }
}