rk
16 小时以前 3e210fac9492b90e21ca9bf76c1d9a8fda1f4388
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);
@@ -2128,6 +2126,7 @@
            updateWrapper.lambda()
                    .eq(Orders::getId, order.getId())
                    .set(Orders::getType, Constants.ZERO)
                    .set(Orders::getIsConverted, Constants.ONE)
                    .set(Orders::getTakeShopId, order.getDepositShopId())
                    .set(Orders::getTakeShopName, order.getDepositShopName())
                    .set(Orders::getTakeShopAddress, order.getDepositShopAddress())
@@ -3542,6 +3541,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 +3570,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 +3778,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;