rk
7 小时以前 9f8b3700ffbcc616a97e7ee2ea283ef4df3d666a
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -237,6 +237,7 @@
                .selectAs(Category::getDetail, Orders::getOrderLevel)
                .select("s1.name", Orders::getDepositShopName)
                .select("o2.code", Orders::getRelationOrderCode)
                .select("s2.name", Orders::getTakeShopName)
                .leftJoin(Category.class, Category::getId, Orders::getGoodLevel)
                .leftJoin(DriverInfo.class, DriverInfo::getId, Orders::getAcceptDriver)
                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
@@ -248,6 +249,7 @@
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()), Orders::getCode, pageWrap.getModel().getCode());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()),  "s2.name",  pageWrap.getModel().getTakeShopName());
        queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()),  Orders::getType,Constants.ONE);
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateStartTime());
        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
@@ -259,6 +261,8 @@
                .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
        queryWrapper.eq(pageWrap.getModel().getSettlementStatus() != null, Orders::getSettlementStatus, pageWrap.getModel().getSettlementStatus());
        queryWrapper.eq(pageWrap.getModel().getAcceptDriver() != null, Orders::getAcceptDriver, pageWrap.getModel().getAcceptDriver());
        queryWrapper.and(pageWrap.getModel().getTakeKeyword() != null, i -> i.like(Orders::getTakeUser, pageWrap.getModel().getTakeKeyword())
                .or().like(Orders::getTakePhone, pageWrap.getModel().getTakeKeyword()));
        queryWrapper.and(pageWrap.getModel().getShopId() != null, i -> i.eq(Orders::getDepositShopId, pageWrap.getModel().getShopId())
                .or().eq(Orders::getTakeShopId, pageWrap.getModel().getShopId()));
        queryWrapper.orderByDesc(Orders::getId);
@@ -1049,7 +1053,8 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "用户信息异常,无法发起支付");
        }
        PayResponse payResponse = wxPayV3(orders.getOutTradeNo(), orders.getTotalAmount(), orders.getId(),
                member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
                member.getOpenid(), Constants.equalsInteger(orders.getType(), Constants.ONE)
                        ? Constants.OrdersAttach.DELIVERY_ORDER : Constants.OrdersAttach.STORAGE_ORDER);
        payResponse.setLockKey(lockKey);
        return payResponse;
    }
@@ -1086,7 +1091,8 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "用户信息异常,无法发起支付");
        }
        return wxPayV3(orders.getOutTradeNo(), orders.getTotalAmount(), orders.getId(),
                member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
                member.getOpenid(), Constants.equalsInteger(orders.getType(), Constants.ONE)
                        ? Constants.OrdersAttach.DELIVERY_ORDER : Constants.OrdersAttach.STORAGE_ORDER);
    }
    /**
@@ -1480,6 +1486,13 @@
        }
    }
    private void clearVerifyCodes(Integer orderId) {
        ordersMapper.update(null, new UpdateWrapper<Orders>().lambda()
                .eq(Orders::getId, orderId)
                .set(Orders::getMemberVerifyCode, null)
                .set(Orders::getDriverVerifyCode, null));
    }
    private String getOrdersPrefix() {
        try {
            return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
@@ -1576,9 +1589,9 @@
        }
        // 计算薪酬(分)
        long driverFee = new BigDecimal(totalAmount).multiply(driverRata).longValue();
        long depositShopFee = new BigDecimal(totalAmount).multiply(depositShopRata).longValue();
        long takeShopFee = new BigDecimal(totalAmount).multiply(takeShopRata).longValue();
        long driverFee = new BigDecimal(totalAmount).multiply(driverRata).setScale(0, RoundingMode.HALF_UP).longValue();
        long depositShopFee = new BigDecimal(totalAmount).multiply(depositShopRata).setScale(0, RoundingMode.HALF_UP).longValue();
        long takeShopFee = new BigDecimal(totalAmount).multiply(takeShopRata).setScale(0, RoundingMode.HALF_UP).longValue();
        orders.setDriverFee(driverFee);
        orders.setDepositShopFee(depositShopFee);
@@ -2834,7 +2847,8 @@
        // 5. 唤起微信支付V3
        return wxPayV3(otherOrders.getOutTradeNo(), otherOrders.getPayAccount(), otherOrders.getId(),
                member.getOpenid(), Constants.OrdersAttach.OVERDUE_FEE);
                member.getOpenid(), Constants.equalsInteger(order.getType(), Constants.ONE)
                        ? Constants.OrdersAttach.DELIVERY_OVERDUE_FEE : Constants.OrdersAttach.OVERDUE_FEE);
    }
    @Override
@@ -3385,6 +3399,7 @@
                    originalOrder.setFinishTime(now);
                    originalOrder.setUpdateTime(now);
                    ordersMapper.updateById(originalOrder);
                    clearVerifyCodes(originalOrder.getId());
                    // 触发原订单收益计算
                    calculateAndSaveOrderFees(originalOrder.getId());
                    generateRevenueRecords(originalOrder.getId());
@@ -3428,7 +3443,7 @@
            order.setFinishTime(now);
            order.setInvoiceStatus(Constants.ONE);
            ordersMapper.updateById(order);
            // 就地寄存(type=0)取件时图片不必填,其他类型取件必填
            clearVerifyCodes(order.getId());
            if (!Constants.equalsInteger(order.getType(), Constants.ZERO)) {
                if (images == null || images.isEmpty()) {
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "请上传取件图片");
@@ -3597,6 +3612,7 @@
            order.setInvoiceStatus(Constants.ONE);
            order.setConfirmArriveTime(now);
            ordersMapper.updateById(order);
            clearVerifyCodes(order.getId());
            // 订单完成,释放核销码
            releaseVerifyCode(verifyCode);
            // 保存出库图片(obj_type=13 门店出库图片,最多3张)
@@ -3675,6 +3691,7 @@
        order.setFinishTime(now);
        order.setUpdateTime(now);
        ordersMapper.updateById(order);
        clearVerifyCodes(order.getId());
        // 8. 释放核销码
        if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
@@ -3773,6 +3790,7 @@
        order.setFinishTime(now);
        order.setUpdateTime(now);
        ordersMapper.updateById(order);
        clearVerifyCodes(order.getId());
        // 7. 生成收益记录
        calculateAndSaveOrderFees(orderId);
@@ -4895,6 +4913,7 @@
                order.setFinishTime(now);
                order.setUpdateTime(now);
                ordersMapper.updateById(order);
                clearVerifyCodes(order.getId());
                // 释放核销码
                if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
@@ -5476,4 +5495,106 @@
        return vo;
    }
    @Override
    public List<OrderTimelineVO> getOrderTimeline(Integer orderId) {
        Orders order = ordersMapper.selectById(orderId);
        if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        List<OrderTimelineVO> timeline = new ArrayList<>();
        String imgPrefix = getOrdersPrefix();
        // 门店/司机名称
        String depositShopName = "";
        if (order.getDepositShopId() != null) {
            ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
            if (depositShop != null) {
                depositShopName = depositShop.getName();
            }
        }
        String takeShopName = "";
        if (order.getTakeShopId() != null) {
            ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
            if (takeShop != null) {
                takeShopName = takeShop.getName();
            }
        }
        String driverName = "";
        if (order.getAcceptDriver() != null) {
            DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
            if (driver != null) {
                driverName = driver.getName();
            }
        }
        boolean isLocal = Constants.equalsInteger(order.getType(), Constants.ZERO);
        boolean hasTakeShop = order.getTakeShopId() != null;
        boolean isException = Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE);
        int status = order.getStatus() != null ? order.getStatus() : 0;
        // 1. 门店寄存 (status >= 2)
        if (status >= Constants.OrderStatus.deposited.getKey() && order.getDepositTime() != null) {
            OrderTimelineVO node = new OrderTimelineVO();
            node.setTitle("门店【" + depositShopName + "】确认收件");
            node.setTime(order.getDepositTime());
            node.setImages(getFileUrls(orderId, Constants.FileType.ORDER_DEPOSIT.getKey(), imgPrefix));
            timeline.add(node);
        }
        if (!isLocal) {
            // 2. 司机取件 (status >= 4)
            if (status >= Constants.OrderStatus.delivering.getKey() && order.getDriverTakeTime() != null) {
                OrderTimelineVO node = new OrderTimelineVO();
                node.setTitle("司机【" + driverName + "】确认取件");
                node.setTime(order.getDriverTakeTime());
                node.setImages(getFileUrls(orderId, Constants.FileType.DRIVER_TAKE.getKey(), imgPrefix));
                timeline.add(node);
            }
            if (isException) {
                // 异常:关联查询异常订单
                Orders exceptionOrder = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
                        .eq(Orders::getRelationOrderId, orderId)
                        .eq(Orders::getExceptionStatus, Constants.ONE)
                        .last("limit 1"));
                if (exceptionOrder != null) {
                    OrderTimelineVO node = new OrderTimelineVO();
                    node.setTitle("行李已异常转存,新订单号【" + exceptionOrder.getCode() + "】");
                    node.setTime(exceptionOrder.getCreateTime());
                    timeline.add(node);
                }
            } else {
                // 3. 正常:司机送达 (status >= 5)
                if(StringUtils.isBlank(takeShopName)){
                    if (status >= Constants.OrderStatus.arrived.getKey() && order.getArriveTime() != null) {
                        OrderTimelineVO node = new OrderTimelineVO();
                        node.setTitle("司机【" + driverName + "】确认送达");
                        node.setTime(order.getArriveTime());
                        node.setImages(getFileUrls(orderId, Constants.FileType.DRIVER_DONE.getKey(), imgPrefix));
                        timeline.add(node);
                    }
                }
                // 4. 有门店:门店收件 (status >= 5)
                if (hasTakeShop && status >= Constants.OrderStatus.arrived.getKey() && order.getArriveTime() != null) {
                    OrderTimelineVO node = new OrderTimelineVO();
                    node.setTitle("门店【" + takeShopName + "】确认收件");
                    node.setTime(order.getArriveTime());
                    node.setImages(getFileUrls(orderId, Constants.FileType.ORDER_TAKE.getKey(), imgPrefix));
                    timeline.add(node);
                }
            }
        }
        // 最后:订单完成 (status = 7)
        if (status == Constants.OrderStatus.finished.getKey() && order.getFinishTime() != null) {
            OrderTimelineVO node = new OrderTimelineVO();
            node.setTitle("订单已完成");
            node.setTime(order.getFinishTime());
            timeline.add(node);
        }
        timeline.sort((a, b) -> b.getTime() != null && a.getTime() != null ? b.getTime().compareTo(a.getTime()) : 0);
        return timeline;
    }
}