| | |
| | | orders.setDeleted(Constants.ZERO); |
| | | orders.setCreateTime(now); |
| | | orders.setUpdateTime(now); |
| | | orders.setIsConverted(Constants.ZERO); |
| | | |
| | | // 寄件信息 |
| | | orders.setDepositShopId(dto.getDepositShopId()); |
| | |
| | | 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()) // 重置通知基准时间为当前 |
| | |
| | | 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) { |
| | |
| | | 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); |
| | |
| | | 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) |
| | |
| | | new QueryWrapper<OrdersDetail>().lambda() |
| | | .eq(OrdersDetail::getOrderId, orderId) |
| | | .eq(OrdersDetail::getDeleted, Constants.ZERO)); |
| | | |
| | | OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details); |
| | | |
| | | Date now = new Date(); |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | 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; |
| | | |