From 9f8b3700ffbcc616a97e7ee2ea283ef4df3d666a Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期四, 04 六月 2026 08:43:55 +0800
Subject: [PATCH] 代码生成

---
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java |  358 +++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 274 insertions(+), 84 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
index 6269a48..5883343 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -236,16 +236,20 @@
                 .selectAll(Orders.class)
                 .selectAs(Category::getDetail, Orders::getOrderLevel)
                 .select("s1.name", Orders::getDepositShopName)
-                .leftJoin(Category.class, Category::getId, Orders::getGoodType)
+                .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")
-                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID") ;
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
+                .leftJoin("orders o2 on o2.id = t.RELATION_ORDER_ID")
                 ;
         Utils.MP.blankToNull(pageWrap.getModel());
         queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted());
         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()));
@@ -257,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);
@@ -348,7 +354,7 @@
     }
 
     /**
-     * 璁$畻灏卞湴瀛樺彇棰勪及璐圭敤
+     * 璁$畻灏卞湴瀵勫瓨棰勪及璐圭敤
      *
      * 璁$畻瑙勫垯锛�
      * 1. 鏍规嵁鍩庡競+鐗╁搧绫诲瀷 鏌ヨ pricing_rule(type=0)锛宖ieldA=categoryId, fieldB=鍗曚环(鍒�/澶�)
@@ -357,7 +363,7 @@
      * 4. 淇濅环璐圭敤 = 鎶ヤ环閲戦 脳 淇濅环璐圭巼锛堝瓧鍏� INSURANCE_RATE锛夛紝鍏冭浆鍒�
      * 5. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤
      *
-     * @param dto 灏卞湴瀛樺彇璁′环璇锋眰鍙傛暟
+     * @param dto 灏卞湴瀵勫瓨璁′环璇锋眰鍙傛暟
      * @return 浠锋牸璁$畻缁撴灉
      */
     @Override
@@ -447,7 +453,7 @@
     }
 
     /**
-     * 璁$畻寮傚湴瀛樺彇棰勪及璐圭敤
+     * 璁$畻鍚屽煄瀵勯�侀浼拌垂鐢�
      *
      * 璁$畻瑙勫垯锛�
      * 1. 璋冪敤鑵捐鍦板浘API璁$畻瀵勪欢鐐逛笌鍙栦欢鐐圭殑椹捐溅璺濈(绫斥啋鍏噷)
@@ -462,7 +468,7 @@
      * 7. 鍔犳�ヨ垂鐢� = 鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁帮紙瀛楀吀 URGENT_COEFFICIENT锛�
      * 8. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢�
      *
-     * @param dto 寮傚湴瀛樺彇璁′环璇锋眰鍙傛暟
+     * @param dto 鍚屽煄瀵勯�佽浠疯姹傚弬鏁�
      * @return 浠锋牸璁$畻缁撴灉
      */
     @Override
@@ -499,7 +505,7 @@
             ruleMap.put(r.getFieldA(), r);
         }
 
-        // 鏌ヨ灏卞湴瀛樺彇璁′环瑙勫垯 pricing_rule type=0锛岀敤浜庤幏鍙� locallyPrice
+        // 鏌ヨ灏卞湴瀵勫瓨璁′环瑙勫垯 pricing_rule type=0锛岀敤浜庤幏鍙� locallyPrice
         List<PricingRule> localRules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
                 .eq(PricingRule::getDeleted, Constants.ZERO)
                 .eq(PricingRule::getType, Constants.ZERO)
@@ -553,7 +559,7 @@
 
             long subtotal = unitPrice * item.getQuantity();
 
-            // 灏卞湴瀛樺彇鍗曚环
+            // 灏卞湴瀵勫瓨鍗曚环
             PricingRule localRule = localRuleMap.get(String.valueOf(item.getCategoryId()));
             Long locallyPrice = localRule != null ? Long.parseLong(localRule.getFieldB()) : null;
 
@@ -812,7 +818,7 @@
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇烽�夋嫨鍙栦欢搴楅摵鎴栬緭鍏ヨ嚜閫夊彇浠跺湴鍧�");
             }
         } else {
-            // 灏卞湴瀛樺彇锛氬彇浠堕棬搴楀悓瀵勪欢闂ㄥ簵
+            // 灏卞湴瀵勫瓨锛氬彇浠堕棬搴楀悓瀵勪欢闂ㄥ簵
             takeShop = depositShop;
         }
 
@@ -862,6 +868,7 @@
         orders.setPayStatus(Constants.ZERO); // 鏈敮浠�
         orders.setCommentStatus(Constants.ZERO); // 鏈瘎浠�
         orders.setSettlementStatus(Constants.ZERO); // 鏈粨绠�
+        orders.setExceptionStatus(Constants.ZERO); // 闈炲紓甯�
         orders.setDeleted(Constants.ZERO);
         orders.setCreateTime(now);
         orders.setUpdateTime(now);
@@ -1046,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;
     }
@@ -1083,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);
     }
 
     /**
@@ -1283,7 +1292,7 @@
         vo.setCode(order.getCode());
         vo.setPayAmountYuan(order.getPayAmount() != null ? Constants.getFormatMoney(order.getPayAmount()) : 0);
         vo.setType(order.getType());
-        vo.setTypeDesc(order.getType() != null && order.getType() == Constants.ONE ? "寮傚湴瀛樺彇" : "灏卞湴瀛樺彇");
+        vo.setTypeDesc(order.getType() != null && order.getType() == Constants.ONE ? "鍚屽煄瀵勯��" : "灏卞湴瀵勫瓨");
         vo.setDetailList(buildDetailList(id));
 
         return vo;
@@ -1302,9 +1311,9 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
 
-        // 鍓嶇疆鏉′欢鏍¢獙锛氬紓鍦板瓨鍙� + 宸插瘎瀛�
+        // 鍓嶇疆鏉′欢鏍¢獙锛氬悓鍩庡瘎閫� + 宸插瘎瀛�
         if (!Constants.ONE.equals(order.getType())) {
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸佸紓鍦板瓨鍙栬鍗曟淳鍗�");
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸佸悓鍩庡瘎閫佽鍗曟淳鍗�");
         }
         if (!Integer.valueOf(Constants.OrderStatus.deposited.getStatus()).equals(order.getStatus())) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭凡瀵勫瓨鐘舵�佽鍗曞彲娲惧崟");
@@ -1477,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()
@@ -1534,7 +1550,7 @@
      *
      * @param orders        璁㈠崟瀹炰綋锛堥渶瑕� totalAmount銆乧ityId 宸茶缃級
      * @param depositShop   瀵勪欢闂ㄥ簵锛堥渶瑕� companyType锛�
-     * @param takeShop      鍙栦欢闂ㄥ簵锛堥渶瑕� companyType锛屽氨鍦板瓨鍙栨椂涓� depositShop 鐩稿悓锛�
+     * @param takeShop      鍙栦欢闂ㄥ簵锛堥渶瑕� companyType锛屽氨鍦板瘎瀛樻椂涓� depositShop 鐩稿悓锛�
      */
     private void calculateAndSetFeeAllocation(Orders orders, ShopInfo depositShop, ShopInfo takeShop) {
         Long totalAmount = orders.getTotalAmount() != null ? orders.getTotalAmount() : 0L;
@@ -1573,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);
@@ -1746,8 +1762,13 @@
 
                 // 璇勪环鐘舵��
                 vo.setCommentStatus(o.getCommentStatus());
+
+                String dateStr = new SimpleDateFormat("dd").format(o.getPayTime() != null ? o.getPayTime() : new Date());
+                String autoNumStr = String.format("%03d", o.getAutoNum() != null ? o.getAutoNum() : 0);
+                String sort = o.getDepositShopId() + "-" + dateStr + "-" + autoNumStr;
                 //搴忓彿
-                vo.setSortnum(Constants.formatIntegerNum(o.getDepositShopId())+"-"+o.getId());
+                vo.setSortnum(sort);
+
                 if(o.getTakeShopId()!=null){
                     vo.setSortnumTake(Constants.formatIntegerNum(o.getTakeShopId())+"-"+o.getId());
                 }
@@ -2164,6 +2185,10 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
 
+        if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚父璁㈠崟鏃犳硶鍙栨秷");
+        }
+
         Integer status = order.getStatus();
         if (status == null) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佸紓甯�");
@@ -2199,8 +2224,6 @@
                     "orderNo", order.getCode());
             // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
             Member cancelMember2 = memberMapper.selectById(memberId);
-            sendSmsNotify(cancelMember2 != null ? cancelMember2.getTelephone() : null,
-                    Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
 
             // 璋冪敤寰俊閫�娆綱3锛屽叏棰濋��娆�
             String outRefundNo = ID.nextGUID();
@@ -2238,6 +2261,8 @@
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇疯仈绯诲鏈嶅鐞�");
             }
             ordersRefundMapper.insert(refund);
+            sendSmsNotify(cancelMember2 != null ? cancelMember2.getTelephone() : null,
+                    Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
             restoreCoupon(order);
             return;
         }
@@ -2406,9 +2431,10 @@
         if (Constants.equalsInteger(order.getManualRefund(), Constants.ONE)) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞凡鎵嬪姩閫�娆�");
         }
-        // 寮傚父璁㈠崟涓嶅厑璁告墜鍔ㄩ��娆�
-        if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) {
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚父璁㈠崟涓嶆敮鎸佹墜鍔ㄩ��娆�");
+        // 灏卞湴瀵勫瓨寮傚父璁㈠崟涓嶅厑璁告墜鍔ㄩ��娆�
+        if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)
+                && Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "灏卞湴瀵勫瓨寮傚父璁㈠崟涓嶆敮鎸佹墜鍔ㄩ��娆�");
         }
 
         // 2. 鏍¢獙閫�娆鹃噾棰�
@@ -2821,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
@@ -2851,13 +2878,27 @@
         if (otherOrders.getOrderId() != null) {
             Orders order = ordersMapper.selectById(otherOrders.getOrderId());
             if (order != null) {
-                order.setOverdueStatus(Constants.TWO); // 2=宸叉敮浠�
-                // 鎬婚噾棰� = 鍘熼噾棰� + 閫炬湡璐圭敤
                 Long overdueFee = otherOrders.getPayAccount() != null ? otherOrders.getPayAccount() : 0L;
                 long newTotal = (order.getTotalAmount() != null ? order.getTotalAmount() : 0L) + overdueFee;
+
+                // 寮傚父灏卞湴瀵勫瓨璁㈠崟锛氬悓鏃舵洿鏂颁富璁㈠崟瀹為檯閫炬湡璐圭敤
+                boolean isAbnormal = Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)
+                        && Constants.equalsInteger(order.getType(), Constants.ZERO);
+                if(isAbnormal){
+                    long shopException = isAbnormal ? (order.getShopCompensationAmount() != null ? order.getShopCompensationAmount() : 0L) : 0L;
+                    long driverException = isAbnormal ? (order.getExceptionFee() != null ? order.getExceptionFee() : 0L) : 0L;
+                    long actualOverdueFee = isAbnormal ? (overdueFee - shopException - driverException) : 0L;
+                    if(actualOverdueFee!=order.getOverdueAmount()){
+                        order.setOverdueAmount(actualOverdueFee);
+                    }
+                }
+
+                order.setOverdueStatus(Constants.TWO); // 2=宸叉敮浠�
                 order.setTotalAmount(newTotal);
                 order.setUpdateTime(now);
                 ordersMapper.updateById(order);
+
+
                 // 閲嶇畻涓夋柟鏀剁泭
                 calculateAndSaveOrderFees(order.getId());
             }
@@ -3348,6 +3389,38 @@
             }
             // 瀵勫瓨鎴愬姛璧犻�佷紭鎯犲埜
             giftOrderCoupon(order.getMemberId());
+            // 寮傚父璁㈠崟瀵勫瓨鏍搁攢锛氭爣璁板師璁㈠崟瀹屾垚
+            if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE) && order.getRelationOrderId() != null) {
+                Orders originalOrder = ordersMapper.selectById(order.getRelationOrderId());
+                if (originalOrder != null) {
+                    originalOrder.setStatus(Constants.OrderStatus.finished.getStatus());
+                    originalOrder.setInvoiceStatus(Constants.ONE);
+                    originalOrder.setSettlementStatus(Constants.ZERO);
+                    originalOrder.setFinishTime(now);
+                    originalOrder.setUpdateTime(now);
+                    ordersMapper.updateById(originalOrder);
+                    clearVerifyCodes(originalOrder.getId());
+                    // 瑙﹀彂鍘熻鍗曟敹鐩婅绠�
+                    calculateAndSaveOrderFees(originalOrder.getId());
+                    generateRevenueRecords(originalOrder.getId());
+                    // 璁板綍鍘熻鍗曟棩蹇�
+                    saveShopVerifyLog(originalOrder, Constants.OrderLogType.shopTake, "寮傚父璁㈠崟鏍搁攢锛屽師璁㈠崟瀹屾垚", remark, shopId);
+                    // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+                    sendOrderNotice(originalOrder.getMemberId(), Constants.MemberOrderNotify.FINISHED, originalOrder.getId(),
+                            "orderNo", originalOrder.getCode());
+                    // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴�
+                    String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+                    notifyBothShops(originalOrder, Constants.ShopOrderNotify.FINISHED,
+                            "orderNo", originalOrder.getCode(),
+                            "settleDays", settleDays != null ? settleDays : "7");
+                    // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
+                    if (originalOrder.getAcceptDriver() != null) {
+                        sendDriverNotice(originalOrder.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, originalOrder.getId(),
+                                "orderNo", originalOrder.getCode(),
+                                "settleDays", settleDays != null ? settleDays : "7");
+                    }
+                }
+            }
         } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
             // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
             if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
@@ -3370,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(), "璇蜂笂浼犲彇浠跺浘鐗�");
@@ -3516,30 +3589,7 @@
                 sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
                         "orderNo", order.getCode(), "shopName", shopName);
             }
-            // 寮傚父璁㈠崟瀵勫瓨鏍搁攢锛氭爣璁板師璁㈠崟瀹屾垚
-            if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE) && order.getRelationOrderId() != null) {
-                Orders originalOrder = ordersMapper.selectById(order.getRelationOrderId());
-                if (originalOrder != null) {
-                    originalOrder.setStatus(Constants.OrderStatus.finished.getStatus());
-                    originalOrder.setInvoiceStatus(Constants.ONE);
-                    originalOrder.setFinishTime(now);
-                    originalOrder.setUpdateTime(now);
-                    ordersMapper.updateById(originalOrder);
-                    // 瑙﹀彂鍘熻鍗曟敹鐩婅绠�
-                    calculateAndSaveOrderFees(originalOrder.getId());
-                    generateRevenueRecords(originalOrder.getId());
-                    // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
-                    sendOrderNotice(originalOrder.getMemberId(), Constants.MemberOrderNotify.FINISHED, originalOrder.getId(),
-                            "orderNo", originalOrder.getCode());
-                    // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
-                    if (originalOrder.getAcceptDriver() != null) {
-                        String settleDays = operationConfigBiz.getConfig().getSettlementDate();
-                        sendDriverNotice(originalOrder.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, originalOrder.getId(),
-                                "orderNo", originalOrder.getCode(),
-                                "settleDays", settleDays != null ? settleDays : "7");
-                    }
-                }
-            }
+
         } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
             // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
             if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
@@ -3562,6 +3612,7 @@
             order.setInvoiceStatus(Constants.ONE);
             order.setConfirmArriveTime(now);
             ordersMapper.updateById(order);
+            clearVerifyCodes(order.getId());
             // 璁㈠崟瀹屾垚锛岄噴鏀炬牳閿�鐮�
             releaseVerifyCode(verifyCode);
             // 淇濆瓨鍑哄簱鍥剧墖锛坥bj_type=13 闂ㄥ簵鍑哄簱鍥剧墖锛屾渶澶�3寮狅級
@@ -3640,6 +3691,7 @@
         order.setFinishTime(now);
         order.setUpdateTime(now);
         ordersMapper.updateById(order);
+        clearVerifyCodes(order.getId());
 
         // 8. 閲婃斁鏍搁攢鐮�
         if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
@@ -3738,6 +3790,7 @@
         order.setFinishTime(now);
         order.setUpdateTime(now);
         ordersMapper.updateById(order);
+        clearVerifyCodes(order.getId());
 
         // 7. 鐢熸垚鏀剁泭璁板綍
         calculateAndSaveOrderFees(orderId);
@@ -3767,13 +3820,17 @@
         }
 
         Long totalAmount = order.getTotalAmount() != null ? order.getTotalAmount() : 0L;
+        Long shopCompensationAmount = order.getShopCompensationAmount() != null ? order.getShopCompensationAmount() : 0L;
+        Long exceptionFee = order.getExceptionFee() != null ? order.getExceptionFee() : 0L;
+        // 鍒嗘垚鍩烘暟 = 鎬婚噾棰� - 闂ㄥ簵寮傚父閲戦 - 鍙告満寮傚父閲戦
+        Long feeBase = totalAmount - shopCompensationAmount - exceptionFee;
         // 璐圭巼锛堜负绌烘椂榛樿0锛�
         BigDecimal depositRate = order.getDepositShopFeeRata() != null ? order.getDepositShopFeeRata() : BigDecimal.ZERO;
         BigDecimal takeRate = order.getTakeShopFeeRata() != null ? order.getTakeShopFeeRata() : BigDecimal.ZERO;
         BigDecimal driverRate = order.getDriverFeeRata() != null ? order.getDriverFeeRata() : BigDecimal.ZERO;
 
         //瀛樹欢闂ㄥ簵鏀剁泭
-        Long depositShopFee = new BigDecimal(totalAmount)
+        Long depositShopFee = new BigDecimal(feeBase)
                 .multiply(depositRate)
                 .setScale(0, RoundingMode.HALF_UP)
                 .longValue();
@@ -3783,14 +3840,14 @@
 
         if (Constants.equalsInteger(order.getType(), Constants.ONE)) {
             // 寮傚湴瀵勫瓨锛氬瓨浠堕棬搴� + 鍙告満
-            driverFee = new BigDecimal(totalAmount)
+            driverFee = new BigDecimal(feeBase)
                     .multiply(driverRate)
                     .setScale(0, RoundingMode.HALF_UP)
                     .longValue();
 
             // 寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵锛氬姞涓婂彇浠堕棬搴楁敹鐩�
             if (order.getTakeShopId() != null) {
-                takeShopFee = new BigDecimal(totalAmount)
+                takeShopFee = new BigDecimal(feeBase)
                         .multiply(takeRate)
                         .setScale(0, RoundingMode.HALF_UP)
                         .longValue();
@@ -3828,6 +3885,29 @@
             }
         }
 
+        // 寮傚父璁㈠崟锛氬瓨浠堕棬搴楀紓甯歌ˉ鍋挎敹鐩婏紙鍗曠嫭涓�鏉¤褰曪紝type=5锛�
+        if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)
+                && order.getShopCompensationAmount() != null && order.getShopCompensationAmount() > 0
+                && order.getDepositShopId() != null) {
+            ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+            if (depositShop != null && depositShop.getId() != null) {
+                Revenue shopExRevenue = new Revenue();
+                shopExRevenue.setMemberId(depositShop.getId());
+                shopExRevenue.setMemberType(Constants.TWO); // 2=闂ㄥ簵
+                shopExRevenue.setType(5); // 5=寮傚父閲戦
+                shopExRevenue.setOptType(Constants.ONE); // 1=鏀跺叆
+                shopExRevenue.setAmount(order.getShopCompensationAmount());
+                shopExRevenue.setVaildStatus(Constants.ZERO);
+                shopExRevenue.setObjId(orderId);
+                shopExRevenue.setObjType(Constants.ZERO);
+                shopExRevenue.setStatus(Constants.ZERO);
+                shopExRevenue.setOrderNo(order.getCode());
+                shopExRevenue.setDeleted(Constants.ZERO);
+                shopExRevenue.setCreateTime(now);
+                revenueMapper.insert(shopExRevenue);
+            }
+        }
+
         // 鍙栦欢闂ㄥ簵鏀剁泭锛堝紓鍦板瘎瀛樹笖鏈夊彇浠堕棬搴楋級
         if (takeShopFee > 0 && order.getTakeShopId() != null) {
             ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
@@ -3846,27 +3926,33 @@
             }
         }
 
-        // 寮傚父璁㈠崟锛氬徃鏈哄紓甯歌ˉ鍋匡紙寮傚湴 + 寮傚父鏍囪 + 鏈夊紓甯歌ˉ鍋块噾棰濓級
+        // 寮傚父璁㈠崟锛氬徃鏈哄紓甯歌ˉ鍋匡紙寮傚湴 + 寮傚父鏍囪锛屼粠鍏宠仈寮傚父瀛愯鍗曡幏鍙杄xceptionFee锛�
         if (Constants.equalsInteger(order.getType(), Constants.ONE)
                 && Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)
-                && order.getExceptionFee() != null && order.getExceptionFee() > 0
                 && order.getAcceptDriver() != null) {
-            DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
-            if (driver != null && driver.getMemberId() != null) {
-                Revenue exRevenue = new Revenue();
-                exRevenue.setMemberId(driver.getMemberId());
-                exRevenue.setMemberType(Constants.ONE); // 1=鍙告満
-                exRevenue.setType(5); // 5=寮傚父閲戦
-                exRevenue.setOptType(Constants.ONE); // 1=鏀跺叆
-                exRevenue.setAmount(order.getExceptionFee());
-                exRevenue.setVaildStatus(Constants.ZERO);
-                exRevenue.setObjId(orderId);
-                exRevenue.setObjType(Constants.ZERO);
-                exRevenue.setStatus(Constants.ZERO);
-                exRevenue.setOrderNo(order.getCode());
-                exRevenue.setDeleted(Constants.ZERO);
-                exRevenue.setCreateTime(now);
-                revenueMapper.insert(exRevenue);
+            Orders childOrder = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                    .eq(Orders::getRelationOrderId, orderId)
+                    .eq(Orders::getExceptionStatus, Constants.ONE)
+                    .eq(Orders::getDeleted, Constants.ZERO)
+                    .last("limit 1"));
+            if (childOrder != null && childOrder.getExceptionFee() != null && childOrder.getExceptionFee() > 0) {
+                DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+                if (driver != null && driver.getMemberId() != null) {
+                    Revenue exRevenue = new Revenue();
+                    exRevenue.setMemberId(driver.getMemberId());
+                    exRevenue.setMemberType(Constants.ONE); // 1=鍙告満
+                    exRevenue.setType(5); // 5=寮傚父閲戦
+                    exRevenue.setOptType(Constants.ONE); // 1=鏀跺叆
+                    exRevenue.setAmount(childOrder.getExceptionFee());
+                    exRevenue.setVaildStatus(Constants.ZERO);
+                    exRevenue.setObjId(orderId);
+                    exRevenue.setObjType(Constants.ZERO);
+                    exRevenue.setStatus(Constants.ZERO);
+                    exRevenue.setOrderNo(order.getCode());
+                    exRevenue.setDeleted(Constants.ZERO);
+                    exRevenue.setCreateTime(now);
+                    revenueMapper.insert(exRevenue);
+                }
             }
         }
 
@@ -4100,8 +4186,7 @@
         if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)
                 && order.getRelationOrderId() != null) {
             Orders originalOrder = ordersMapper.selectById(order.getRelationOrderId());
-            long driverExceptionFee = (originalOrder != null && originalOrder.getExceptionFee() != null)
-                    ? originalOrder.getExceptionFee() : 0L;
+            long driverExceptionFee = order.getExceptionFee() != null ? order.getExceptionFee() : 0L;
             long shopExceptionFee = order.getShopCompensationAmount() != null ? order.getShopCompensationAmount() : 0L;
             long totalExceptionFee = driverExceptionFee + shopExceptionFee;
 
@@ -4115,13 +4200,14 @@
                 overdueFee = totalExceptionFee;
                 overdueDays = totalExceptionFee > 0 ? 1 : 0;
             } else {
-                // 闈炲綋澶╁彇浠讹細姝e父閫炬湡璁$畻 + 鍙告満寮傚父璐圭敤锛堜笉鍚棬搴楀紓甯歌垂鐢級
+                // 闈炲綋澶╁彇浠讹細姝e父閫炬湡璁$畻 + 鍙告満寮傚父璐圭敤锛堜笉鍚棬搴楀紓甯歌垂鐢級锛岄棬搴楀紓甯搁噾棰濇竻闆�
                 OverdueFeeVO normalOverdue = calculateOverdueFeeInternal(order, details);
                 long normalFee = (normalOverdue != null && normalOverdue.getOverdueFee() != null)
                         ? normalOverdue.getOverdueFee() : 0L;
                 overdueFee = normalFee + driverExceptionFee;
                 overdueDays = (normalOverdue != null && normalOverdue.getOverdueDays() != null)
                         ? normalOverdue.getOverdueDays() : 0;
+                order.setShopCompensationAmount(0L);
             }
 
             order.setConfirmArriveTime(now);
@@ -4827,6 +4913,7 @@
                 order.setFinishTime(now);
                 order.setUpdateTime(now);
                 ordersMapper.updateById(order);
+                clearVerifyCodes(order.getId());
 
                 // 閲婃斁鏍搁攢鐮�
                 if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
@@ -5108,14 +5195,14 @@
                 targetLat = order.getDepositLat();
                 targetLgt = order.getDepositLgt();
             } else if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())&&Constants.equalsInteger(order.getType(), Constants.ZERO)) {
-                // 灏卞湴瀛樺彇 鈫� 瀵规瘮瀛樹欢闂ㄥ簵
+                // 灏卞湴瀵勫瓨 鈫� 瀵规瘮瀛樹欢闂ㄥ簵
                 if (!Constants.equalsInteger(order.getDepositShopId(), userId)) {
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
                 }
                 targetLat = order.getDepositLat();
                 targetLgt = order.getDepositLgt();
             } else if ((Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())||Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus()))&&Constants.equalsInteger(order.getType(), Constants.ONE)) {
-                // 寮傚湴瀛樺彇 鈫� 瀵规瘮鍙栦欢闂ㄥ簵
+                // 鍚屽煄瀵勯�� 鈫� 瀵规瘮鍙栦欢闂ㄥ簵
                 if (!Constants.equalsInteger(order.getTakeShopId(), userId)) {
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
                 }
@@ -5181,7 +5268,7 @@
 
         Date now = new Date();
 
-        // ========== B. 鍒涘缓鏂拌鍗曪紙灏卞湴瀛樺彇锛� ==========
+        // ========== B. 鍒涘缓鏂拌鍗曪紙灏卞湴瀵勫瓨锛� ==========
         String orderCode = "JC" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now)
                 + String.format("%04d", new java.util.Random().nextInt(10000));
         String orderTradeNo = generateOrderTradeNo();
@@ -5222,7 +5309,7 @@
             }
         }
 
-        // 瀛樹欢闂ㄥ簵鍒嗘垚鍗犳瘮锛堝氨鍦板瓨鍙栵級
+        // 瀛樹欢闂ㄥ簵鍒嗘垚鍗犳瘮锛堝氨鍦板瘎瀛橈級
         Integer cityId = Integer.valueOf(original.getCityId());
         boolean isCompany = Constants.equalsInteger(newShop.getCompanyType(), Constants.ONE);
         int fallbackFieldA = isCompany ? Constants.FIVE : Constants.SIX;
@@ -5232,7 +5319,7 @@
         newOrder.setCode(orderCode);
         newOrder.setOutTradeNo(orderTradeNo);
         newOrder.setMemberId(original.getMemberId());
-        newOrder.setType(Constants.ZERO); // 灏卞湴瀛樺彇
+        newOrder.setType(Constants.ZERO); // 灏卞湴瀵勫瓨
         newOrder.setCityId(original.getCityId());
         newOrder.setStatus(Constants.ONE); // 寰呭瘎瀛�
         newOrder.setPayStatus(Constants.ONE); // 宸叉敮浠�
@@ -5283,8 +5370,8 @@
         newOrder.setDeclaredAmount(0L);
         newOrder.setDeclaredFee(0L);
         newOrder.setPrice(price);
-        newOrder.setBasicAmount(basicAmount);
-        newOrder.setEstimatedAmount(basicAmount);
+        newOrder.setBasicAmount(0L);//);
+        newOrder.setEstimatedAmount(0L);//basicAmount);
         newOrder.setTotalAmount(0L);
         newOrder.setPayAmount(0L);
         newOrder.setManualRefund(Constants.ZERO);
@@ -5299,6 +5386,8 @@
 
         // 闂ㄥ簵琛ュ伩閲戦
         newOrder.setShopCompensationAmount(dto.getShopCompensation());
+        // 鍙告満寮傚父琛ュ伩閲戦
+        newOrder.setExceptionFee(dto.getDriverCompensation());
 
         newOrder.setRemark(dto.getRemark());
         newOrder.setPlatformSmsNotified(Constants.ZERO);
@@ -5355,7 +5444,6 @@
         // ========== E. 鏇存柊鍘熻鍗� ==========
         ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                 .set(Orders::getExceptionStatus, Constants.ONE)
-                .set(Orders::getExceptionFee, dto.getDriverCompensation())
                 .set(Orders::getUpdateTime, now)
                 .eq(Orders::getId, original.getId()));
 
@@ -5407,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. 姝e父锛氬徃鏈洪�佽揪 (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;
+    }
+
 }

--
Gitblit v1.9.3