rk
4 小时以前 cd6b21f04e08a61d79e4aea2593c41fdc5cd0766
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -802,6 +802,7 @@
        orders.setDeleted(Constants.ZERO);
        orders.setCreateTime(now);
        orders.setUpdateTime(now);
        orders.setIsConverted(Constants.ZERO);
        // 寄件信息
        orders.setDepositShopId(dto.getDepositShopId());
@@ -1216,7 +1217,6 @@
        com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<Orders> updateWrapper =
                new UpdateWrapper<Orders>().lambda()
                .eq(Orders::getId, order.getId())
                .set(Orders::getIsUrgent, Constants.ONE)
                .set(Orders::getPlatformRewardAmount, urgentFeeFen)
                .set(Orders::getPlatformSmsNotified, Constants.ZERO) // 重置通知状态为未通知
                .set(Orders::getPlatformSmsNotifiedTime, new Date()) // 重置通知基准时间为当前
@@ -1237,7 +1237,8 @@
        if (dto.getDriverId() != null) {
            // 校验司机信息
            DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
                    .eq(DriverInfo::getMemberId, dto.getDriverId())
                    .eq(DriverInfo::getId, dto.getDriverId())
                    .eq(DriverInfo::getVersionType, Constants.ZERO)
                    .eq(DriverInfo::getDeleted, Constants.ZERO)
                    .last("limit 1"));
            if (driverInfo == null) {
@@ -1258,13 +1259,10 @@
            updateWrapper.set(Orders::getAcceptType, 1); // 1=系统派单
            updateWrapper.set(Orders::getStatus, Constants.OrderStatus.accepted.getStatus());
            Member driver = memberMapper.selectById(dto.getDriverId());
            String driverName = driver != null ? driver.getName() : String.valueOf(dto.getDriverId());
            OrderLog driverLog = new OrderLog();
            driverLog.setOrderId(order.getId());
            driverLog.setTitle(Constants.OrderLogType.assignDriver.getTitle());
            driverLog.setLogInfo(Constants.OrderLogType.assignDriver.format(driverName, dto.getUrgentFee().toPlainString()));
            driverLog.setLogInfo(Constants.OrderLogType.assignDriver.format(driverInfo.getName(), dto.getUrgentFee().toPlainString()));
            driverLog.setObjType(Constants.OrderLogType.assignDriver.getStatus());
            driverLog.setOrderStatus(Constants.OrderStatus.accepted.getStatus());
            driverLog.setOptUserType(3);
@@ -2123,20 +2121,37 @@
            DriverInfo originalDriver = originalDriverId != null ? driverInfoMapper.selectById(originalDriverId) : null;
            ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
            // 取件点信息更新为存件门店,使用 UpdateWrapper 确保 null 字段也能生效
            // 计算就地寄存存件门店分成比例
            Integer cityId = Integer.valueOf(order.getCityId());
            boolean isCompany = depositShop != null && Constants.equalsInteger(depositShop.getCompanyType(), Constants.ONE);
            int fallbackFieldA = isCompany ? Constants.FIVE : Constants.SIX;
            BigDecimal localDepositRata = getShopRevenueShare(depositShop, "localDeposit", cityId, fallbackFieldA);
            Long totalAmount = order.getTotalAmount() != null ? order.getTotalAmount() : 0L;
            Long localDepositFee = new BigDecimal(totalAmount).multiply(localDepositRata)
                    .setScale(0, RoundingMode.HALF_UP).longValue();
            // 取件点信息更新为存件门店,重算分成
            UpdateWrapper<Orders> updateWrapper = new UpdateWrapper<>();
            updateWrapper.lambda()
                    .eq(Orders::getId, order.getId())
                    .set(Orders::getType, Constants.ZERO)
                    .set(Orders::getStatus, Constants.OrderStatus.arrived.getKey())
                    .set(Orders::getIsConverted, Constants.ONE)
                    .set(Orders::getTakeShopId, order.getDepositShopId())
                    .set(Orders::getTakeShopName, order.getDepositShopName())
                    .set(Orders::getTakeShopAddress, order.getDepositShopAddress())
                    .set(Orders::getTakeShopLinkPhone, order.getDepositShopLinkPhone())
                    .set(Orders::getTakeLocation, order.getDepositLocation())
                    .set(Orders::getTakeLocationRemark, order.getDepositLocationRemark())
                    .set(Orders::getTakeLat, order.getDepositLat())
                    .set(Orders::getTakeLgt, order.getDepositLgt())
                    .set(Orders::getExpectedTakeTime, new Date());
                    .set(Orders::getExpectedTakeTime, new Date())
                    // 存件门店分成按就地寄存重算
                    .set(Orders::getDepositShopFeeRata, localDepositRata)
                    .set(Orders::getDepositShopFee, localDepositFee)
                    // 司机、取件门店分成归零
                    .set(Orders::getDriverFeeRata, BigDecimal.ZERO)
                    .set(Orders::getDriverFee, 0L)
                    .set(Orders::getTakeShopFeeRata, BigDecimal.ZERO)
                    .set(Orders::getTakeShopFee, 0L);
            if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
                updateWrapper.lambda()
                        .set(Orders::getAcceptDriver, null)
@@ -3542,6 +3557,7 @@
                new QueryWrapper<OrdersDetail>().lambda()
                        .eq(OrdersDetail::getOrderId, orderId)
                        .eq(OrdersDetail::getDeleted, Constants.ZERO));
        OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
        Date now = new Date();
@@ -3570,17 +3586,26 @@
                int actualDays = calcActualDepositDays(now, order.getDepositTime());
                order.setDepositDays(actualDays);
                int estimatedDays = order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1;
                int refundDays = estimatedDays - actualDays;
                if (refundDays > 0) {
                    // 退款金额 = 退款天数 × Σ(物品单价 × 数量)
                    long dailyBaseFee = 0L;
                    for (OrdersDetail d : details) {
                        dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L)
                                * (d.getNum() != null ? d.getNum() : 0);
                long dailyBaseFee = 0L;
                for (OrdersDetail d : details) {
                    dailyBaseFee += (d.getLocallyPrice() != null ? d.getLocallyPrice() : 0L)
                            * (d.getNum() != null ? d.getNum() : 0);
                }
                if (Constants.equalsInteger(order.getIsConverted(), Constants.ONE)) {
                    // 转换订单:实际费用与已付金额对比
                    long actualFee = (long) actualDays * dailyBaseFee;
                    long payAmount = order.getPayAmount() != null ? order.getPayAmount() : 0L;
                    if (actualFee < payAmount) {
                        order.setRefundAmount(payAmount - actualFee);
                    }
                    long refundAmount = (long) refundDays * dailyBaseFee;
                    order.setRefundAmount(refundAmount);
                } else {
                    // 普通订单:按预计天数与实际天数差计算退款
                    int estimatedDays = order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1;
                    int refundDays = estimatedDays - actualDays;
                    if (refundDays > 0) {
                        order.setRefundAmount((long) refundDays * dailyBaseFee);
                    }
                }
            }
@@ -3769,6 +3794,31 @@
        if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
            // ========== 就地寄存 ==========
            // 转换订单(异地转就地):按寄存时间到当前时间计算实际费用
            if (Constants.equalsInteger(order.getIsConverted(), Constants.ONE)) {
                int actualDays = calcActualDepositDays(now, order.getDepositTime());
                long actualFee = (long) actualDays * dailyBaseFee;
                long payAmount = order.getPayAmount() != null ? order.getPayAmount() : 0L;
                OverdueFeeVO vo = new OverdueFeeVO();
                vo.setDailyBaseFee(dailyBaseFee);
                if (actualFee <= payAmount) {
                    // 实际费用 <= 已付金额:未逾期
                    vo.setOverdue(false);
                    vo.setOverdueDays(0);
                    vo.setOverdueFee(0L);
                } else {
                    // 实际费用 > 已付金额:逾期,差价为逾期费用
                    int overDays = actualDays - (order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1);
                    vo.setOverdue(true);
                    vo.setOverdueDays(Math.max(overDays, 1));
                    vo.setOverdueFee(actualFee - payAmount);
                }
                return vo;
            }
            // 普通就地寄存
            overdueDays = calcLocalOverdueDays(now, order.getExpectedTakeTime());
            overdueFee = (long) overdueDays * dailyBaseFee;