From 59b1f0e9967902aa10f5e017d5a0bdfd1b60c9ea Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 29 四月 2026 09:42:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java |  819 +++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 576 insertions(+), 243 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 800731b..f087f1c 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
@@ -17,6 +17,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.ID;
 import com.doumee.core.utils.geocode.MapUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.core.utils.aliyun.AliSmsService;
@@ -221,14 +222,18 @@
         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.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
-        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
-        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateStartTime());
+        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateEndTime());
         queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
         queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
         queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
         queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
         queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
                 .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().getShopId() != null, i -> i.eq(Orders::getDepositShopId, pageWrap.getModel().getShopId())
+                .or().eq(Orders::getTakeShopId, pageWrap.getModel().getShopId()));
         for (PageWrap.SortData sortData : pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                 queryWrapper.orderByDesc(sortData.getProperty());
@@ -236,7 +241,14 @@
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
         }
-        return PageData.from(ordersMapper.selectJoinPage(page, Orders.class, queryWrapper));
+        PageData<Orders> pageData = PageData.from(ordersMapper.selectJoinPage(page, Orders.class, queryWrapper));
+        for (Orders o : pageData.getRecords()) {
+            if (o.getStatus() != null) {
+                Constants.OrderStatus os = Constants.OrderStatus.getByKey(o.getStatus());
+                o.setStatusDesc(os != null ? os.getValue() : "");
+            }
+        }
+        return pageData;
     }
 
     @Override
@@ -254,14 +266,18 @@
         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.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
-        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
-        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateStartTime());
+        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateEndTime());
         queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
         queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
         queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
         queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
         queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
                 .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().getShopId() != null, i -> i.eq(Orders::getDepositShopId, pageWrap.getModel().getShopId())
+                .or().eq(Orders::getTakeShopId, pageWrap.getModel().getShopId()));
 
         queryWrapper.select(
                 "IFNULL(SUM(t.total_amount), 0) as total_amount_sum",
@@ -534,18 +550,26 @@
             insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
         }
 
-        // 5. 鍔犳�ヨ垂鐢細鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁�(瀛楀吀 URGENT_COEFFICIENT)
+        // 5. 鍔犳�ヨ垂鐢細鐗╁搧浠锋牸 脳 (鍔犳�ョ郴鏁�-1)锛屽150%琛ㄧず澧炲姞50%
         long urgentFeeFen = 0L;
         String urgentRateStr = systemDictDataBiz.queryByCode(
                 Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
         BigDecimal urgentRate = new BigDecimal(urgentRateStr);
-        urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentRate)
+        BigDecimal urgentIncreaseRate = urgentRate.subtract(BigDecimal.ONE);
+        urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentIncreaseRate)
                 .setScale(0, RoundingMode.HALF_UP).longValue();
 
         // 6. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢紙鍔犳�ユ椂鎵嶅寘鍚姞鎬ヨ垂锛�
         long totalPrice = itemPriceTotal + insuranceFeeFen;
         if (Boolean.TRUE.equals(dto.getUrgent())) {
             totalPrice += urgentFeeFen;
+            // 鍔犳�ユ椂鏇存柊鐗╁搧鏄庣粏鍗曚环鍜屽皬璁�
+            for (ItemPriceVO vo : itemList) {
+                long adjustedUnitPrice = new BigDecimal(vo.getUnitPrice()).multiply(urgentRate)
+                        .setScale(0, RoundingMode.HALF_UP).longValue();
+                vo.setUnitPrice(adjustedUnitPrice);
+                vo.setSubtotal(adjustedUnitPrice * vo.getQuantity());
+            }
         }
 
         PriceCalculateVO result = new PriceCalculateVO();
@@ -696,7 +720,7 @@
                 // 鏃犲彇浠堕棬搴楋紝鏍¢獙瀛樹欢鐐逛笌鑷�夊彇浠剁偣鏄惁鍦ㄥ悓涓�鍩庡競
                 if (!MapUtil.isSameCity(depositShop.getLatitude(), depositShop.getLongitude(),
                         dto.getTakeLat().doubleValue(), dto.getTakeLgt().doubleValue())) {
-                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨璁㈠崟瀛樺彇鐐逛笉鍦ㄥ悓涓�鍩庡競锛屽闇�璇烽�夋嫨鍚屽煄闂ㄥ簵");
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀛樺彇鐐逛笉鍦ㄥ悓涓�鍩庡競锛�");
                 }
                 takeLat = dto.getTakeLat();
                 takeLgt = dto.getTakeLgt();
@@ -783,6 +807,7 @@
             // 寮傚湴锛氬彇浠剁偣淇℃伅
             orders.setTakeShopId(dto.getTakeShopId());
             orders.setTakeLocation(takeLocationValue);
+            orders.setTakeLocationRemark(takeLocationValue);
             orders.setTakeLat(takeLat);
             orders.setTakeLgt(takeLgt);
             orders.setIsUrgent(dto.getIsUrgent());
@@ -791,6 +816,7 @@
             // 灏卞湴锛氬彇浠剁偣鍚屽瘎浠跺簵閾�
             orders.setTakeShopId(dto.getDepositShopId());
             orders.setTakeLocation(depositShop.getAddress());
+            orders.setTakeLocationRemark(depositShop.getAddress());
             orders.setTakeLat(BigDecimal.valueOf(depositShop.getLatitude()));
             orders.setTakeLgt(BigDecimal.valueOf(depositShop.getLongitude()));
             orders.setIsUrgent(Constants.ZERO);
@@ -818,6 +844,12 @@
         orders.setEstimatedAmount(priceResult.getTotalPrice());
         orders.setTotalAmount(priceResult.getTotalPrice());
         orders.setUrgentAmount(priceResult.getUrgentFee());
+        // 瀛樺偍鍔犳�ョ郴鏁�
+        if (Constants.ONE.equals(dto.getType()) && Constants.ONE.equals(dto.getIsUrgent())) {
+            String urgentRateStr = systemDictDataBiz.queryByCode(
+                    Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
+            orders.setUrgentRata(new BigDecimal(urgentRateStr));
+        }
         if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) {
             orders.setDeclaredAmount(dto.getDeclaredAmount().multiply(new BigDecimal(100)).longValue());
         } else {
@@ -835,7 +867,27 @@
         ordersMapper.insert(orders);
         Integer orderId = orders.getId();
 
+        // 鍒涘缓璁㈠崟鏃ュ織
+        OrderLog createLog = new OrderLog();
+        createLog.setOrderId(orderId);
+        createLog.setTitle(Constants.OrderLogType.createOrder.getTitle());
+        createLog.setLogInfo(Constants.OrderLogType.createOrder.format(orderCode));
+        createLog.setObjType(Constants.OrderLogType.createOrder.getStatus());
+        createLog.setOrderStatus(orders.getStatus());
+        createLog.setOptUserId(memberId);
+        createLog.setOptUserType(0);
+        createLog.setCreateTime(now);
+        createLog.setDeleted(Constants.ZERO);
+        orderLogService.create(createLog);
+
         // ========== 7. 鍒涘缓璁㈠崟鏄庣粏 ==========
+        // 寮傚湴瀵勫瓨鏋侀�熻揪鏃讹紝鎸夊姞鎬ユ瘮渚嬭绠楁槑缁嗚鍗曚环
+        BigDecimal urgentIncreaseRate = null;
+        if (Constants.ONE.equals(dto.getType()) && Constants.ONE.equals(dto.getIsUrgent())) {
+            String urgentRateStr = systemDictDataBiz.queryByCode(
+                    Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
+            urgentIncreaseRate = new BigDecimal(urgentRateStr).subtract(BigDecimal.ONE);
+        }
         for (ItemPriceVO itemVO : priceResult.getItemList()) {
             OrdersDetail detail = new OrdersDetail();
             detail.setOrderId(orderId);
@@ -843,11 +895,29 @@
             detail.setLuggageName(itemVO.getCategoryName());
             detail.setLuggageDetail(itemVO.getDetail());
             detail.setNum(itemVO.getQuantity());
-            detail.setUnitPrice(itemVO.getUnitPrice());
+            long detailUnitPrice = itemVO.getUnitPrice();
+            if (urgentIncreaseRate != null) {
+                detailUnitPrice = new BigDecimal(detailUnitPrice)
+                        .multiply(BigDecimal.ONE.add(urgentIncreaseRate))
+                        .setScale(0, RoundingMode.HALF_UP).longValue();
+            }
+            detail.setUnitPrice(detailUnitPrice);
             detail.setStartDistance(itemVO.getStartDistance());
-            detail.setStartPrice(itemVO.getStartPrice());
+            if (urgentIncreaseRate != null && itemVO.getStartPrice() != null) {
+                detail.setStartPrice(new BigDecimal(itemVO.getStartPrice())
+                        .multiply(BigDecimal.ONE.add(urgentIncreaseRate))
+                        .setScale(0, RoundingMode.HALF_UP).longValue());
+            } else {
+                detail.setStartPrice(itemVO.getStartPrice());
+            }
             detail.setExtraDistance(itemVO.getExtraDistance());
-            detail.setExtraPrice(itemVO.getExtraPrice());
+            if (urgentIncreaseRate != null && itemVO.getExtraPrice() != null) {
+                detail.setExtraPrice(new BigDecimal(itemVO.getExtraPrice())
+                        .multiply(BigDecimal.ONE.add(urgentIncreaseRate))
+                        .setScale(0, RoundingMode.HALF_UP).longValue());
+            } else {
+                detail.setExtraPrice(itemVO.getExtraPrice());
+            }
             detail.setLocallyPrice(itemVO.getLocallyPrice());
             detail.setDeleted(Constants.ZERO);
             detail.setCreateTime(now);
@@ -985,6 +1055,12 @@
         OrderDetailVO vo = new OrderDetailVO();
         vo.setOrder(order);
 
+        // 璁㈠崟鐘舵�佹弿杩�
+        if (order.getStatus() != null) {
+            Constants.OrderStatus os = Constants.OrderStatus.getByKey(order.getStatus());
+            vo.setStatusDesc(os != null ? os.getValue() : "");
+        }
+
         // 鍥剧墖璺緞鍓嶇紑
         String imgPrefix = getOrdersPrefix();
 
@@ -1109,20 +1185,6 @@
 
         String optUserName = getCurrentUserName();
 
-        // 鍔犳�ヨ垂鏃ュ織锛堟瘡娆″崟鐙褰曟湰娆″姞鎬ヨ垂锛�
-        Constants.OrderLogType urgentLogType = Constants.OrderLogType.urgent;
-        OrderLog feeLog = new OrderLog();
-        feeLog.setOrderId(order.getId());
-        feeLog.setTitle(urgentLogType.getTitle());
-        feeLog.setLogInfo(urgentLogType.getStatusInfo().replace("{param}", dto.getUrgentFee().toPlainString()));
-        feeLog.setObjType(urgentLogType.getStatus());
-        feeLog.setOrderStatus(order.getStatus());
-        feeLog.setOptUserType(3);
-        feeLog.setOptUserName(optUserName);
-        feeLog.setCreateTime(new Date());
-        feeLog.setDeleted(Constants.ZERO);
-        orderLogService.create(feeLog);
-
         // 鍔犳�ヨ垂鐢� 鍏冣啋鍒�
         long urgentFeeFen = dto.getUrgentFee().multiply(new BigDecimal(100)).longValue();
 
@@ -1147,25 +1209,70 @@
             updateWrapper.set(Orders::getRemark, dto.getRemark());
         }
 
-        // 鎸囨淳鍙告満锛堥潪蹇呭~锛�
+        // 鏃ュ織锛氬彧瀛樹竴鏉★紝鏈夊徃鏈虹敤 assignDriver锛屾棤鍙告満鐢� urgent
         if (dto.getDriverId() != null) {
+            // 鏍¢獙鍙告満淇℃伅
+            DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                    .eq(DriverInfo::getMemberId, dto.getDriverId())
+                    .eq(DriverInfo::getDeleted, Constants.ZERO)
+                    .last("limit 1"));
+            if (driverInfo == null) {
+                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+            }
+            if (!Integer.valueOf(3).equals(driverInfo.getAuditStatus())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙告満鏈敮浠樻娂閲戯紝鏃犳硶娲惧崟");
+            }
+            if (!Constants.ZERO.equals(driverInfo.getStatus())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙告満宸茶绂佺敤锛屾棤娉曟淳鍗�");
+            }
+
+            // 鏇存柊鎺ュ崟鍙告満淇℃伅鍙婅鍗曠姸鎬�
+            Date now = new Date();
             updateWrapper.set(Orders::getAssignDriverId, dto.getDriverId());
+            updateWrapper.set(Orders::getAcceptDriver, dto.getDriverId());
+            updateWrapper.set(Orders::getAcceptTime, now);
+            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());
 
-            Constants.OrderLogType dispatchLogType = Constants.OrderLogType.dispatch;
             OrderLog driverLog = new OrderLog();
             driverLog.setOrderId(order.getId());
-            driverLog.setTitle(dispatchLogType.getTitle());
-            driverLog.setLogInfo(dispatchLogType.getStatusInfo().replace("{param}", driverName));
-            driverLog.setObjType(dispatchLogType.getStatus());
-            driverLog.setOrderStatus(order.getStatus());
+            driverLog.setTitle(Constants.OrderLogType.assignDriver.getTitle());
+            driverLog.setLogInfo(Constants.OrderLogType.assignDriver.format(driverName, dto.getUrgentFee().toPlainString()));
+            driverLog.setObjType(Constants.OrderLogType.assignDriver.getStatus());
+            driverLog.setOrderStatus(Constants.OrderStatus.accepted.getStatus());
             driverLog.setOptUserType(3);
             driverLog.setOptUserName(optUserName);
-            driverLog.setCreateTime(new Date());
+            driverLog.setCreateTime(now);
             driverLog.setDeleted(Constants.ZERO);
             orderLogService.create(driverLog);
+
+            // 鐭俊閫氱煡鎸囨淳鍙告満锛堝姞鎬ユ淳鍗曪級
+            String address1 = order.getDepositLocationRemark();
+            String address2 = order.getTakeLocationRemark();
+            long totalDriverFee = (order.getDriverFee() != null ? order.getDriverFee() : 0L) + urgentFeeFen;
+            sendSmsNotify(driverInfo.getTelephone(),
+                    Constants.SmsNotify.DRIVER_URGENT_DISPATCH,
+                    "orderNo", order.getCode(),
+                    "address1", address1,
+                    "address2", address2,
+                    "money1", String.valueOf(totalDriverFee / 100.0),
+                    "money2", String.valueOf(urgentFeeFen / 100.0));
+        } else {
+            // 鏈寚娲惧徃鏈猴紝鍙褰曞姞鎬ユ棩蹇�
+            OrderLog feeLog = new OrderLog();
+            feeLog.setOrderId(order.getId());
+            feeLog.setTitle(Constants.OrderLogType.urgent.getTitle());
+            feeLog.setLogInfo(Constants.OrderLogType.urgent.format(dto.getUrgentFee().toPlainString()));
+            feeLog.setObjType(Constants.OrderLogType.urgent.getStatus());
+            feeLog.setOrderStatus(order.getStatus());
+            feeLog.setOptUserType(3);
+            feeLog.setOptUserName(optUserName);
+            feeLog.setCreateTime(new Date());
+            feeLog.setDeleted(Constants.ZERO);
+            orderLogService.create(feeLog);
         }
 
         ordersMapper.update(updateWrapper);
@@ -1371,8 +1478,12 @@
                 .select("s1.link_phone", Orders::getDepositShopLinkPhone)
                 .select("s2.name", Orders::getTakeShopName)
                 .select("s2.address", Orders::getTakeShopAddress)
+                .select("s2.link_phone", Orders::getTakeShopLinkPhone)
+                .select("d.name", Orders::getDriverName)
+                .select("d.telephone", Orders::getDriverPhone)
                 .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
                 .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
+                .leftJoin("driver_info d on d.id = t.ACCEPT_DRIVER")
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .eq(Orders::getMemberId, memberId)
                 .eq(status != null, Orders::getStatus, status)
@@ -1407,10 +1518,15 @@
                     vo.setTakeShopId(o.getTakeShopId());
                     vo.setTakeShopName(o.getTakeShopName());
                     vo.setTakeShopAddress(o.getTakeShopAddress());
+                    vo.setTakeShopPhone(o.getTakeShopLinkPhone());
                 } else {
                     vo.setTakeLocation(o.getTakeLocation());
                     vo.setTakeLocationRemark(o.getTakeLocationRemark());
                 }
+
+                // 鍙告満淇℃伅
+                vo.setDriverName(o.getDriverName());
+                vo.setDriverPhone(o.getDriverPhone());
 
                 // 鍙栦欢鑱旂郴浜�
                 vo.setTakeUser(o.getTakeUser());
@@ -1432,13 +1548,8 @@
                 // 鐗╁搧鏄庣粏
                 vo.setDetailList(buildDetailList(details));
 
-                // 閫炬湡淇℃伅锛堜粎寰呭彇浠剁姸鎬佽绠楋級
-                if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
-                    OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
-                    vo.setOverdue(overdueInfo.getOverdue());
-                    vo.setOverdueDays(overdueInfo.getOverdueDays());
-                    vo.setOverdueFee(overdueInfo.getOverdueFee());
-                }
+                // 閫炬湡鐘舵��
+                fillOverdueStatus(vo, o, details);
                 voList.add(vo);
             }
         }
@@ -1478,13 +1589,31 @@
                 .select("s1.link_phone", Orders::getDepositShopLinkPhone)
                 .select("s2.name", Orders::getTakeShopName)
                 .select("s2.address", Orders::getTakeShopAddress)
+                .select("s2.link_phone", Orders::getTakeShopLinkPhone)
+                .select("d.name", Orders::getDriverName)
+                .select("d.telephone", Orders::getDriverPhone)
                 .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
                 .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
-                .eq(Orders::getPayStatus, Constants.ONE)
-                .and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId))
-                .eq(status != null, Orders::getStatus, status)
-                .in(statusList != null, Orders::getStatus, statusList)
-                .orderByDesc(Orders::getCreateTime);
+                .leftJoin("driver_info d on d.id = t.ACCEPT_DRIVER")
+                .eq(Orders::getPayStatus, Constants.ONE);
+
+        // 闂ㄥ簵寰呭鐞嗚鍗曪細鎸変笟鍔$幆鑺傚尯鍒嗛棬搴楄鑹�
+        if (combinedStatus != null && Constants.equalsInteger(combinedStatus, Constants.SEVEN)) {
+            wrapper.and(w -> w
+                    .and(w1 -> w1.eq(Orders::getDepositShopId, shopId)
+                            .in(Orders::getStatus, Constants.OrderStatus.waitDeposit.getStatus(),
+                                    Constants.OrderStatus.deposited.getStatus()))
+                    .or(w2 -> w2.eq(Orders::getTakeShopId, shopId)
+                            .in(Orders::getStatus, Constants.OrderStatus.delivering.getStatus(),
+                                    Constants.OrderStatus.arrived.getStatus()))
+            );
+        } else {
+            wrapper.and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId));
+        }
+
+        wrapper.eq(status != null, Orders::getStatus, status)
+                .in(statusList != null && !Constants.equalsInteger(combinedStatus, Constants.SEVEN), Orders::getStatus, statusList)
+                .orderByDesc(Orders::getId);
 
         IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
         List<MyOrderVO> voList = new ArrayList<>();
@@ -1499,6 +1628,7 @@
                         Constants.equalsInteger(o.getType(), Constants.ZERO)?o.getType():Objects.nonNull(o.getTakeShopId())?Constants.ONE:Constants.TWO)
                 );
                 vo.setCreateTime(o.getCreateTime());
+                vo.setRemark(o.getRemark());
                 vo.setExpectedTakeTime(o.getExpectedTakeTime());
 
                 vo.setDepositShopName(o.getDepositShopName());
@@ -1515,10 +1645,15 @@
                 if (o.getTakeShopId() != null) {
                     vo.setTakeShopName(o.getTakeShopName());
                     vo.setTakeShopAddress(o.getTakeShopAddress());
+                    vo.setTakeShopPhone(o.getTakeShopLinkPhone());
                 } else {
                     vo.setTakeLocation(o.getTakeLocation());
                     vo.setTakeLocationRemark(o.getTakeLocationRemark());
                 }
+
+                // 鍙告満淇℃伅
+                vo.setDriverName(o.getDriverName());
+                vo.setDriverPhone(o.getDriverPhone());
 
                 vo.setTakeUser(o.getTakeUser());
                 vo.setTakePhone(o.getTakePhone());
@@ -1532,12 +1667,16 @@
 
                 vo.setDetailList(buildDetailList(details));
 
-                if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
-                    OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
-                    vo.setOverdue(overdueInfo.getOverdue());
-                    vo.setOverdueDays(overdueInfo.getOverdueDays());
-                    vo.setOverdueFee(overdueInfo.getOverdueFee());
-                }
+
+                // 閫炬湡鐘舵��
+                fillOverdueStatus(vo, o, details);
+
+//                if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
+//                    OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
+//                    vo.setOverdue(overdueInfo.getOverdue());
+//                    vo.setOverdueDays(overdueInfo.getOverdueDays());
+//                    vo.setOverdueFee(overdueInfo.getOverdueFee());
+//                }
                 voList.add(vo);
             }
         }
@@ -1583,7 +1722,7 @@
             }
         }
         if (order == null) {
-            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏍搁攢鐮佹棤鏁�");
         }
         return buildOrderDetailVO(order, false);
     }
@@ -1614,6 +1753,7 @@
         vo.setDeclaredAmount(order.getDeclaredAmount());
         vo.setDeclaredFee(order.getDeclaredFee());
         vo.setUrgentAmount(order.getUrgentAmount());
+        vo.setIsUrgent(order.getIsUrgent());
         vo.setActualPayAmount(Constants.equalsInteger(order.getPayStatus(), Constants.ONE)?order.getPayAmount():order.getEstimatedAmount());
 
         // 鏍囪
@@ -1685,66 +1825,20 @@
                         .eq(OrdersDetail::getDeleted, Constants.ZERO));
         vo.setDetailList(buildDetailList(details));
 
-        Integer orderStatus = order.getStatus();
-        if(Constants.equalsInteger(orderStatus, Constants.FIVE)){
-            // 閫炬湡淇℃伅
-            OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
-            if (Constants.ONE.equals(order.getType())
-                    && order.getTakeShopId() != null) {
-                // 寮傚湴瀵勫瓨 + 鏈夊彇浠堕棬搴楋細
-                // 鏍规嵁琛屾潕杞Щ鍒板簵鏃堕棿(arriveTime)褰撳ぉ鏅氫笂12鐐瑰垽鏂槸鍚﹂�炬湡
-                if (order.getArriveTime() != null) {
-                    Calendar arriveCal = Calendar.getInstance();
-                    arriveCal.setTime(order.getArriveTime());
-                    arriveCal.set(Calendar.HOUR_OF_DAY, 23);
-                    arriveCal.set(Calendar.MINUTE, 59);
-                    arriveCal.set(Calendar.SECOND, 59);
-                    Date arriveEndOfDay = arriveCal.getTime();
-                    boolean isOverdue = new Date().after(arriveEndOfDay);
-                    vo.setOverdue(isOverdue);
-                    if (isOverdue) {
-                        vo.setOverdueDays(overdueInfo.getOverdueDays() > 0 ? overdueInfo.getOverdueDays() : 1);
-                        vo.setOverdueFee(overdueInfo.getOverdueFee());
-                    } else {
-                        vo.setOverdueDays(0);
-                        vo.setOverdueFee(0L);
-                    }
-                } else {
-                    vo.setOverdue(false);
-                    vo.setOverdueDays(0);
-                    vo.setOverdueFee(0L);
-                }
-            } else if (Constants.ZERO.equals(order.getType())) {
-                // 灏卞湴瀵勫瓨锛氫繚鎸佸師閫昏緫
-                vo.setOverdue(overdueInfo.getOverdue());
-                vo.setOverdueDays(overdueInfo.getOverdueDays());
-                vo.setOverdueFee(overdueInfo.getOverdueFee());
-            }
-        } else {
-            vo.setOverdue(false);
-            vo.setOverdueDays(0);
-            vo.setOverdueFee(0L);
-        }
+        // 閫炬湡鐘舵�侊細0=鏈埌搴楁湭閫炬湡 1=鏈埌搴楀瓨鍦ㄩ�炬湡 2=宸插埌搴楁湭閫炬湡 3=宸插埌搴楀緟鏀粯閫炬湡 4=閫炬湡宸叉敮浠�
+        fillOverdueStatus(vo, order, details);
 
-        // 閫�娆句俊鎭紙status=96鍏抽棴/99鍙栨秷鏃惰繑鍥烇級
-        if (orderStatus != null &&
-                (Constants.equalsInteger(orderStatus, Constants.OrderStatus.cancelled.getStatus()))) {
+        // 閫�娆句俊鎭紙status=99鍙栨秷鏃惰繑鍥烇級
+        if (order.getStatus() != null &&
+                Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.cancelled.getStatus())) {
             vo.setRefundApplyTime(order.getCancelTime());
-            // 鏌ヨ閫�娆捐褰曡幏鍙栭��娆鹃噾棰濆拰澶囨敞
             OrdersRefund ordersRefund = ordersRefundMapper.selectOne(
                     new QueryWrapper<OrdersRefund>().lambda()
                             .eq(OrdersRefund::getOrderId, order.getId())
                             .eq(OrdersRefund::getDeleted, Constants.ZERO)
                             .orderByDesc(OrdersRefund::getCreateTime)
                             .last("limit 1"));
-            if (ordersRefund != null) {
-                vo.setRefundAmount(ordersRefund.getRefundAmount() != null
-                        ? ordersRefund.getRefundAmount() : order.getRefundAmount());
-                vo.setRefundRemark(ordersRefund.getRemark());
-                vo.setRefundTime(ordersRefund.getRefundTime());
-            } else {
-                vo.setRefundAmount(order.getRefundAmount());
-            }
+            vo.setRefundInfo(ordersRefund);
         }
 
         // 鏍搁攢鐮�
@@ -1767,46 +1861,17 @@
             vo.setMemberVerifyCode(order.getMemberVerifyCode());
         }
 
-        // 寮傚湴瀵勫瓨缁忕含搴︼紙灏卞湴瀵勫瓨涓嶈繑鍥烇級
-        if (Constants.ONE.equals(order.getType())) {
-            // status=3(宸叉帴鍗�)锛氳繑鍥炲瓨浠堕棬搴楃粡绾害 + 鍙告満缁忕含搴�
-            if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
-                ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
-                if (depositShop != null) {
-                    vo.setDepositShopLng(depositShop.getLongitude());
-                    vo.setDepositShopLat(depositShop.getLatitude());
-                }
-                if (order.getAcceptDriver() != null) {
-                    DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
-                    if (driver != null) {
-                        vo.setDriverLng(driver.getLongitude());
-                        vo.setDriverLat(driver.getLatitude());
-                    }
-                }
-            }
-            // status=4(閰嶉�佷腑)锛氳繑鍥炲彇浠剁偣缁忕含搴� + 鍙告満缁忕含搴�
-            if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
-                // 鍙栦欢鐐圭粡绾害锛堜紭鍏堝彇浠堕棬搴楋紝鍚﹀垯璁㈠崟涓婄殑鍙栦欢鍧愭爣锛�
-                if (order.getTakeShopId() != null) {
-                    ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
-                    if (takeShop != null) {
-                        vo.setTakeLng(takeShop.getLongitude());
-                        vo.setTakeLat(takeShop.getLatitude());
-                    }
-                } else if (order.getTakeLgt() != null && order.getTakeLat() != null) {
-                    vo.setTakeLng(order.getTakeLgt().doubleValue());
-                    vo.setTakeLat(order.getTakeLat().doubleValue());
-                }
-                if (order.getAcceptDriver() != null) {
-                    DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
-                    if (driver != null) {
-                        vo.setDriverLng(driver.getLongitude());
-                        vo.setDriverLat(driver.getLatitude());
-                    }
-                }
-            }
+        vo.setDepositShopLng(order.getDepositLgt().doubleValue());
+        vo.setDepositShopLat(order.getDepositLat().doubleValue());
+        // 鍙栦欢鐐圭粡绾害
+        vo.setTakeLng(order.getTakeLgt().doubleValue());
+        vo.setTakeLat(order.getTakeLat().doubleValue());
+        //鍙告満缁忕含搴�
+        DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+        if (driver != null) {
+            vo.setDriverLng(driver.getLongitude());
+            vo.setDriverLat(driver.getLatitude());
         }
-
         // 璇勪环淇℃伅
         vo.setCommentStatus(order.getCommentStatus());
         if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
@@ -1855,7 +1920,7 @@
             order.setStatus(Constants.OrderStatus.cancelled.getStatus());
             order.setCancelTime(now);
             ordersMapper.updateById(order);
-            saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", reason, memberId);
+            saveCancelLog(order, Constants.OrderLogType.memberCancel, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", memberId);
             // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
             Member cancelMember1 = memberMapper.selectById(memberId);
             sendSmsNotify(cancelMember1 != null ? cancelMember1.getTelephone() : null,
@@ -1871,7 +1936,7 @@
             order.setRefundAmount(order.getPayAmount());
             ordersMapper.updateById(order);
 
-            saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", reason, memberId);
+            saveCancelLog(order, Constants.OrderLogType.memberCancel, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", memberId);
             // 閫氱煡浼氬憳锛氬凡鍙栨秷
             sendOrderNotice(memberId, Constants.MemberOrderNotify.CANCELLED, orderId,
                     "orderNo", order.getCode());
@@ -1881,9 +1946,10 @@
                     Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
 
             // 璋冪敤寰俊閫�娆綱3锛屽叏棰濋��娆�
+            String outRefundNo = ID.nextGUID();
             com.wechat.pay.java.service.refund.model.Refund refundResult;
             try {
-                refundResult = wxPayV3Service.refund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount(),
+                refundResult = wxPayV3Service.refund(outRefundNo, order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount(),
                         "璁㈠崟閫�娆�", wxPayProperties.getV3RefundNotifyUrl());
             } catch (Exception e) {
                 log.error("寰呭瘎瀛樿鍗曢��娆捐皟鐢ㄥ紓甯�, orderId={}", orderId, e);
@@ -1901,7 +1967,7 @@
             refund.setDeleted(Constants.ZERO);
             refund.setBeforeStatus(Constants.OrderStatus.waitDeposit.getStatus());
             refund.setRefundAmount(order.getPayAmount());
-            refund.setRefundCode(refundResult.getOutRefundNo());
+            refund.setRefundCode(outRefundNo);
 
             if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(refundStatus)) {
                 // 閫�娆炬垚鍔�
@@ -1926,23 +1992,38 @@
         // 宸插瘎瀛�/宸叉帴鍗曪細鐩存帴灏嗚鍗曠被鍨嬫敼涓哄氨鍦板瘎瀛�
         if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())
                 || Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
-            order.setType(Constants.ZERO); // 灏卞湴瀵勫瓨
-            ordersMapper.updateById(order);
-            saveCancelLog(order, "浼氬憳鍙栨秷寮傚湴瀵勫瓨璁㈠崟锛岃浆涓哄氨鍦板瘎瀛�", reason, memberId);
-            // 閫氱煡瀛樹欢闂ㄥ簵
-            if (order.getDepositShopId() != null) {
-                sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.REFUNDING, orderId,
-                        "orderNo", order.getCode());
-                ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
-                sendSmsNotify(depositShop != null ? depositShop.getLinkPhone() : null,
-                        Constants.SmsNotify.SHOP_REFUNDING, "orderNo", order.getCode());
+            // 鍏堜繚瀛樺師鍙告満淇℃伅锛岀敤浜庡悗缁�氱煡
+            Integer originalDriverId = order.getAcceptDriver();
+            DriverInfo originalDriver = originalDriverId != null ? driverInfoMapper.selectById(originalDriverId) : null;
+
+            ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+            // 鍙栦欢鐐逛俊鎭洿鏂颁负瀛樹欢闂ㄥ簵锛屼娇鐢� UpdateWrapper 纭繚 null 瀛楁涔熻兘鐢熸晥
+            UpdateWrapper<Orders> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda()
+                    .eq(Orders::getId, order.getId())
+                    .set(Orders::getType, Constants.ZERO)
+                    .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());
+            if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+                updateWrapper.lambda()
+                        .set(Orders::getAcceptDriver, null)
+                        .set(Orders::getAcceptType, null)
+                        .set(Orders::getAcceptTime, null);
             }
+            ordersMapper.update(null, updateWrapper);
+            saveCancelLog(order, Constants.OrderLogType.memberCancelToConvert, "浼氬憳鍙栨秷寮傚湴瀵勫瓨璁㈠崟锛岃浆涓哄氨鍦板瘎瀛�", memberId);
             // 閫氱煡鍙告満锛氳鍗曞凡鍙栨秷锛堝凡鎺ュ崟鎯呭喌涓嬪徃鏈洪渶鍋滄鏈嶅姟锛�
-            if (order.getAcceptDriver() != null && Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
-                sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.REFUNDING, orderId,
+            if (originalDriverId != null && Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+                sendDriverNotice(originalDriverId, Constants.DriverOrderNotify.REFUNDING, orderId,
                         "orderNo", order.getCode());
-                DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
-                sendSmsNotify(driver != null ? driver.getTelephone() : null,
+                sendSmsNotify(originalDriver != null ? originalDriver.getTelephone() : null,
                         Constants.SmsNotify.DRIVER_REFUNDING, "orderNo", order.getCode());
             }
             return;
@@ -1954,12 +2035,12 @@
     /**
      * 淇濆瓨鍙栨秷璁㈠崟鎿嶄綔鏃ュ織
      */
-    private void saveCancelLog(Orders order, String title, String reason, Integer memberId) {
+    private void saveCancelLog(Orders order, Constants.OrderLogType logType, String reason, Integer memberId) {
         OrderLog log = new OrderLog();
         log.setOrderId(order.getId());
-        log.setTitle(title);
-        log.setLogInfo(reason);
-        log.setObjType(Constants.ORDER_LOG_CANCEL);
+        log.setTitle(logType.getTitle());
+        log.setLogInfo(logType.format(reason));
+        log.setObjType(logType.getStatus());
         log.setOrderStatus(order.getStatus());
         log.setOptUserId(memberId);
         log.setOptUserType(0); // 0=鐢ㄦ埛
@@ -1971,12 +2052,13 @@
     /**
      * 淇濆瓨闂ㄥ簵鏍搁攢鏃ュ織
      */
-    private void saveShopVerifyLog(Orders order, String title, String logInfo, String remark, Integer shopId) {
+    private void saveShopVerifyLog(Orders order, Constants.OrderLogType logType, String logInfo, String remark, Integer shopId) {
         OrderLog log = new OrderLog();
         log.setOrderId(order.getId());
-        log.setTitle(title);
-        log.setLogInfo(logInfo);
+        log.setTitle(logType.getTitle());
+        log.setLogInfo(logInfo != null ? logInfo : logType.getStatusInfo());
         log.setRemark(remark);
+        log.setObjType(logType.getStatus());
         log.setOrderStatus(order.getStatus());
         log.setOptUserId(shopId);
         log.setOptUserType(2); // 2=闂ㄥ簵
@@ -2094,6 +2176,20 @@
             }
         }
         ordersMapper.updateById(order);
+
+        // 鏀粯鎴愬姛鏃ュ織
+        OrderLog payLog = new OrderLog();
+        payLog.setOrderId(order.getId());
+        payLog.setTitle(Constants.OrderLogType.payOrder.getTitle());
+        payLog.setLogInfo(Constants.OrderLogType.payOrder.format(
+                String.valueOf(order.getTotalAmount() != null ? order.getTotalAmount() / 100.0 : 0)));
+        payLog.setObjType(Constants.OrderLogType.payOrder.getStatus());
+        payLog.setOrderStatus(order.getStatus());
+        payLog.setOptUserId(order.getMemberId());
+        payLog.setOptUserType(0);
+        payLog.setCreateTime(now);
+        payLog.setDeleted(Constants.ZERO);
+        orderLogService.create(payLog);
 
         // 閫氱煡浼氬憳锛氳鍗曞緟鏍搁獙
         sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_VERIFY, order.getId(),
@@ -2228,6 +2324,7 @@
     public PayResponse payShopDeposit(Integer memberId) {
         // 1. 鏌ヨ闂ㄥ簵淇℃伅
         ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+                .eq(ShopInfo::getDeleted,Constants.ZERO)
                 .eq(ShopInfo::getRegionMemberId,memberId));
         if (shopInfo == null) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵涓嶅瓨鍦�");
@@ -2307,11 +2404,19 @@
         shopInfo.setUpdateTime(now);
         shopInfoMapper.updateById(shopInfo);
 
+        // 鐭俊閫氱煡闂ㄥ簵锛氭垚鍔熷叆椹�
+        String rawPassword = shopInfo.getTelephone() != null && shopInfo.getTelephone().length() >= 6
+                ? shopInfo.getTelephone().substring(shopInfo.getTelephone().length() - 6) + "@123456" : "";
+        sendSmsNotify(shopInfo.getTelephone(),
+                Constants.SmsNotify.SHOP_AUTH_SUCCESS,
+                "storeName", shopInfo.getName(),
+                "password", rawPassword);
+
         // 6. 鎶奸噾鏀粯瀹屾垚鍚庯紝鑻ュ煄甯傛湭寮�閫氬垯鑷姩寮�閫�
         if (shopInfo.getAreaId() != null) {
-            Areas shopArea = areasBiz.resolveArea(shopInfo.getAreaId());
+            Areas shopArea = areasService.getById(shopInfo.getAreaId());
             if (shopArea != null && shopArea.getParentId() != null) {
-                Areas cityArea = areasBiz.resolveArea(shopArea.getParentId());
+                Areas cityArea = areasService.getById(shopArea.getParentId());
                 if (cityArea != null && !Constants.equalsInteger(cityArea.getStatus(), Constants.ONE)) {
                     cityArea.setStatus(Constants.ONE);
                     cityArea.setEditDate(now);
@@ -2341,7 +2446,8 @@
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .eq(Orders::getStatus, Constants.OrderStatus.finished.getStatus())
                 .eq(Orders::getSettlementStatus, Constants.ZERO)
-                .le(Orders::getFinishTime, deadline));
+                .le(Orders::getFinishTime, deadline)
+        );
         if (ordersList == null || ordersList.isEmpty()) {
             return;
         }
@@ -2386,7 +2492,7 @@
                 } else if (Constants.equalsInteger(revenue.getMemberType(), Constants.TWO)) {
                     // 闂ㄥ簵锛氶�氳繃 memberId 鏌� ShopInfo(regionMemberId)锛屾洿鏂� balance / totalBalance
                     ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
-                            .eq(ShopInfo::getRegionMemberId, revenue.getMemberId())
+                            .eq(ShopInfo::getId, revenue.getMemberId())
                             .eq(ShopInfo::getDeleted, Constants.ZERO)
                             .last("limit 1"));
                     if (shop != null) {
@@ -2588,6 +2694,186 @@
 
     @Override
     @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void verifyOrder(String verifyCode, Integer shopId, List<String> images, String remark) {
+        if (StringUtils.isBlank(verifyCode)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
+        }
+        // 鍏堟煡浼氬憳鏍搁攢鐮�
+        Orders query = new Orders();
+        query.setMemberVerifyCode(verifyCode);
+        query.setDeleted(Constants.ZERO);
+        Orders byMemberCode = findOne(query);
+        if (byMemberCode != null) {
+            shopVerifyOrder(verifyCode, shopId, images, remark);
+        } else {
+            driverVerifyOrder(verifyCode, images, remark, shopId);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void verifyOrderByShopId(Integer orderId, Integer shopId, List<String> images, String remark) {
+        if (orderId == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟涓婚敭涓嶈兘涓虹┖");
+        }
+        // 鏍规嵁璁㈠崟涓婚敭鏌ユ壘璁㈠崟
+        Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getId, orderId)
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 鏌ヨ闂ㄥ簵鍚嶇О鐢ㄤ簬鏃ュ織
+        String shopName = "";
+        ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+        if (shopInfo != null) {
+            shopName = shopInfo.getName() != null ? shopInfo.getName() : "";
+        }
+
+        Integer status = order.getStatus();
+        Date now = new Date();
+        if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+            // 寰呭瘎瀛�(1) 鈫� 宸插瘎瀛�(2)锛屼袱绉嶇被鍨嬮�氱敤
+            // 鏍¢獙褰撳墠闂ㄥ簵鏄惁涓鸿鍗曠殑瀛樹欢闂ㄥ簵
+            if (!shopId.equals(order.getDepositShopId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            order.setStatus(Constants.equalsInteger(order.getType(),Constants.ZERO)?Constants.OrderStatus.arrived.getStatus():Constants.OrderStatus.deposited.getStatus());
+            order.setDepositTime(now);
+            // 閲婃斁褰撳墠鏍搁攢鐮侊紝鐢熸垚鏂扮殑鏍搁攢鐮佷緵鍙栦欢鏃朵娇鐢�
+            String verifyCode = order.getMemberVerifyCode();
+            if (StringUtils.isNotBlank(verifyCode)) {
+                releaseVerifyCode(verifyCode);
+            }
+            order.setMemberVerifyCode(generateVerifyCode());
+            ordersMapper.updateById(order);
+            // 淇濆瓨瀵勫瓨鍥剧墖锛坥bj_type=2 璁㈠崟瀵勫瓨鍥剧墖锛屾渶澶�3寮狅級
+            saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId);
+            // 璁板綍璁㈠崟鏃ュ織
+            saveShopVerifyLog(order, Constants.OrderLogType.shopDeposit, Constants.OrderLogType.shopDeposit.format(shopName), remark, shopId);
+            // 閫氱煡浼氬憳锛氶棬搴楁牳閿�鎴愬姛
+            if (Constants.equalsInteger(order.getType(), Constants.ONE)) {
+                // 寮傚湴瀵勫瓨 鈫� 寰呮姠鍗�
+                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_GRAB, order.getId(),
+                        "orderNo", order.getCode());
+            } else {
+                // 灏卞湴瀵勫瓨 鈫� 寰呭彇浠舵彁閱�
+                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
+                        "orderNo", order.getCode(), "shopName", shopName);
+            }
+        } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+            // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
+            if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            // 鏍¢獙鍙栦欢闂ㄥ簵涓庡綋鍓嶇櫥褰曢棬搴椾竴鑷�
+            if (!shopId.equals(order.getTakeShopId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            // 鏍¢獙鏄惁宸茬‘璁ら【瀹㈠埌搴�
+            if (order.getConfirmArriveTime() == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇峰厛纭椤惧鍒板簵");
+            }
+            // 鏍¢獙鏄惁瀛樺湪寰呭鐞嗙殑閫炬湡璐圭敤
+            if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀛樺湪閫炬湡璐圭敤寰呭鐞嗭紝璇峰厛瀹屾垚閫炬湡璐圭敤鏀粯");
+            }
+            // 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
+            order.setStatus(Constants.OrderStatus.finished.getStatus());
+            order.setConfirmArriveTime(now);
+            ordersMapper.updateById(order);
+            // 璁㈠崟瀹屾垚锛岄噴鏀炬牳閿�鐮�
+            String verifyCode = order.getMemberVerifyCode();
+            if (StringUtils.isNotBlank(verifyCode)) {
+                releaseVerifyCode(verifyCode);
+            }
+            // 淇濆瓨鍑哄簱鍥剧墖锛坥bj_type=13 闂ㄥ簵鍑哄簱鍥剧墖锛屾渶澶�3寮狅級
+            saveVerifyImages(order.getId(), images, Constants.FileType.STORE_OUT.getKey(), shopId);
+            // 鐢熸垚鏀剁泭璁板綍
+            calculateAndSaveOrderFees(order.getId());
+            generateRevenueRecords(order.getId());
+            // 璁板綍璁㈠崟鏃ュ織
+            saveShopVerifyLog(order, Constants.OrderLogType.shopTake, Constants.OrderLogType.shopTake.format(shopName), remark, shopId);
+            // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+            sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
+                    "orderNo", order.getCode());
+            // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴楋細璁㈠崟宸插畬鎴�
+            String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+            notifyBothShops(order, Constants.ShopOrderNotify.FINISHED,
+                    "orderNo", order.getCode(),
+                    "settleDays", settleDays != null ? settleDays : "7");
+            // 閫氱煡鍙告満锛氳鍗曞凡瀹屾垚
+            if (order.getAcceptDriver() != null) {
+                sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, order.getId(),
+                        "orderNo", order.getCode(),
+                        "settleDays", settleDays != null ? settleDays : "7");
+            }
+        }else if(Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getKey())){
+            // 浠呭紓鍦板瘎瀛� + 鏈夊彇浠堕棬搴� + 娲鹃�佷腑(4) 鍙牳閿�
+            if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曟敮鎸佸徃鏈烘牳閿�");
+            }
+            if (order.getTakeShopId() == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤闇�鍙告満鏍搁攢");
+            }
+            if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
+            }
+            // 鏍¢獙鍙栦欢闂ㄥ簵涓庡綋鍓嶇櫥褰曢棬搴椾竴鑷�
+            if (!shopId.equals(order.getTakeShopId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            // 娲鹃�佷腑(4) 鈫� 宸插埌搴�(5)
+            order.setStatus(Constants.OrderStatus.arrived.getStatus());
+            order.setArriveTime(new Date());
+            if (StringUtils.isNotBlank(remark)) {
+                order.setRemark(remark);
+            }
+            ordersMapper.updateById(order);
+
+            // 閲婃斁鍙告満鏍搁攢鐮�
+            releaseVerifyCode(order.getDriverVerifyCode());
+
+            // 淇濆瓨闄勪欢锛坥bj_type=3 闂ㄥ簵鍏ュ簱鍥剧墖锛屾渶澶�3寮狅級
+            saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_TAKE.getKey(), order.getAcceptDriver());
+
+            // 閫氱煡浼氬憳锛氳鍗曞凡閫佽揪
+            String destination = order.getTakeShopAddress() != null ? order.getTakeShopAddress() : "";
+            if (order.getMemberVerifyCode() != null) {
+                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.ARRIVED_HAS_SHOP, order.getId(),
+                        "orderNo", order.getCode(),
+                        "destination", destination,
+                        "pickupCode", order.getMemberVerifyCode());
+            } else {
+                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.ARRIVED_NO_SHOP, order.getId(),
+                        "orderNo", order.getCode(),
+                        "destination", destination);
+            }
+
+            // 閫氱煡鍙栦欢闂ㄥ簵锛氳鍗曞凡閫佽揪
+            if (order.getTakeShopId() != null) {
+                sendShopNotice(order.getTakeShopId(), Constants.ShopOrderNotify.ARRIVED, order.getId(),
+                        "orderNo", order.getCode(),
+                        "destination", destination);
+            }
+
+            // 鐭俊閫氱煡浼氬憳锛氳鏉庡凡閫佽揪
+            Member arrivedMember = memberMapper.selectById(order.getMemberId());
+            if (arrivedMember != null) {
+                sendSmsNotify(arrivedMember.getTelephone(), Constants.SmsNotify.MEMBER_ARRIVED,
+                        "orderNo", order.getCode(),
+                        "address", destination,
+                        "code", order.getMemberVerifyCode() != null ? order.getMemberVerifyCode() : "");
+            }
+        }else {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
     public void shopVerifyOrder(String verifyCode, Integer shopId, List<String> images, String remark) {
         if (StringUtils.isBlank(verifyCode)) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
@@ -2625,7 +2911,7 @@
             // 淇濆瓨瀵勫瓨鍥剧墖锛坥bj_type=2 璁㈠崟瀵勫瓨鍥剧墖锛屾渶澶�3寮狅級
             saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId);
             // 璁板綍璁㈠崟鏃ュ織
-            saveShopVerifyLog(order, "闂ㄥ簵纭瀵勫瓨", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ瘎瀛�", remark, shopId);
+            saveShopVerifyLog(order, Constants.OrderLogType.shopDeposit, Constants.OrderLogType.shopDeposit.format(shopName), remark, shopId);
             // 閫氱煡浼氬憳锛氶棬搴楁牳閿�鎴愬姛
             if (Constants.equalsInteger(order.getType(), Constants.ONE)) {
                 // 寮傚湴瀵勫瓨 鈫� 寰呮姠鍗�
@@ -2634,7 +2920,7 @@
             } else {
                 // 灏卞湴瀵勫瓨 鈫� 寰呭彇浠舵彁閱�
                 sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
-                        "orderNo", order.getCode());
+                        "orderNo", order.getCode(), "shopName", shopName);
             }
         } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
             // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
@@ -2644,6 +2930,14 @@
             // 鏍¢獙鍙栦欢闂ㄥ簵涓庡綋鍓嶇櫥褰曢棬搴椾竴鑷�
             if (!shopId.equals(order.getTakeShopId())) {
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            // 鏍¢獙鏄惁宸茬‘璁ら【瀹㈠埌搴�
+            if (order.getConfirmArriveTime() == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇峰厛纭椤惧鍒板簵");
+            }
+            // 鏍¢獙鏄惁瀛樺湪寰呭鐞嗙殑閫炬湡璐圭敤
+            if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀛樺湪閫炬湡璐圭敤寰呭鐞嗭紝璇峰厛瀹屾垚閫炬湡璐圭敤鏀粯");
             }
             // 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
             order.setStatus(Constants.OrderStatus.finished.getStatus());
@@ -2657,7 +2951,7 @@
             calculateAndSaveOrderFees(order.getId());
             generateRevenueRecords(order.getId());
             // 璁板綍璁㈠崟鏃ュ織
-            saveShopVerifyLog(order, "闂ㄥ簵纭鍙栦欢", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ彇浠讹紝璁㈠崟瀹屾垚", remark, shopId);
+            saveShopVerifyLog(order, Constants.OrderLogType.shopTake, Constants.OrderLogType.shopTake.format(shopName), remark, shopId);
             // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
             sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
                     "orderNo", order.getCode());
@@ -2751,12 +3045,13 @@
             ordersRefundMapper.insert(refundRecord);
 
             // 璋冪敤寰俊閫�娆綱3锛堟斁鍦ㄦ渶鍚庯紝纭繚鍓嶇疆鎿嶄綔鍏ㄩ儴鎴愬姛锛�
+            String outRefundNo2 = ID.nextGUID();
             Refund refundResult = wxPayV3Service.refund(
-                    order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount(),
+                    outRefundNo2, order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount(),
                     "璁㈠崟閫�娆�", wxPayProperties.getV3RefundNotifyUrl());
 
             // 閫�娆炬垚鍔熷悗鍥炲~閫�娆惧崟鍙凤紝鏍囪閫�娆句腑
-            refundRecord.setRefundCode(refundResult.getOutRefundNo());
+            refundRecord.setRefundCode(outRefundNo2);
             refundRecord.setStatus(Constants.ZERO); // 閫�娆句腑
             ordersRefundMapper.updateById(refundRecord);
         }
@@ -2770,7 +3065,7 @@
         if (order.getRefundAmount() != null && order.getRefundAmount() > 0) {
             logInfo += "锛岄��娆�" + Constants.getFormatMoney(order.getRefundAmount()) + "鍏�";
         }
-        saveShopVerifyLog(order, "闂ㄥ簵纭鍑哄簱", logInfo, remark, shopId);
+        saveShopVerifyLog(order, Constants.OrderLogType.shopOutStock, logInfo, remark, shopId);
         // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
         sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
                 "orderNo", order.getCode());
@@ -2904,8 +3199,8 @@
         // 瀛樹欢闂ㄥ簵鏀剁泭
         if (depositShopFee > 0 && order.getDepositShopId() != null) {
             ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
-            if (depositShop != null && depositShop.getRegionMemberId() != null) {
-                revenueMapper.insert(buildRevenue(depositShop.getRegionMemberId(), Constants.TWO,
+            if (depositShop != null && depositShop.getId() != null) {
+                revenueMapper.insert(buildRevenue(depositShop.getId(), Constants.TWO,
                         depositShopFee, orderId, order.getCode()));
             }
         }
@@ -2913,8 +3208,8 @@
         // 鍙栦欢闂ㄥ簵鏀剁泭锛堝紓鍦板瘎瀛樹笖鏈夊彇浠堕棬搴楋級
         if (takeShopFee > 0 && order.getTakeShopId() != null) {
             ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
-            if (takeShop != null && takeShop.getRegionMemberId() != null) {
-                revenueMapper.insert(buildRevenue(takeShop.getRegionMemberId(), Constants.TWO,
+            if (takeShop != null && takeShop.getId() != null) {
+                revenueMapper.insert(buildRevenue(takeShop.getId(), Constants.TWO,
                         takeShopFee, orderId, order.getCode()));
             }
         }
@@ -3102,9 +3397,9 @@
             ordersMapper.updateById(order);
 
             // 璁板綍璁㈠崟鏃ュ織
-            saveShopVerifyLog(order, "纭椤惧鍒板簵锛堥�炬湡锛�",
-                    "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝閫炬湡" + overdueInfo.getOverdueDays()
-                            + "澶╋紝閫炬湡璐圭敤" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "鍏�",
+            String overdueLogInfo = "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝閫炬湡" + overdueInfo.getOverdueDays()
+                            + "澶╋紝閫炬湡璐圭敤" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "鍏�";
+            saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArriveOverdue, overdueLogInfo,
                     null, shopId);
         } else {
             // 鏈�炬湡锛氭爣璁伴�炬湡鐘舵�佷负0锛岃鍗曚繚鎸佸綋鍓嶇姸鎬�
@@ -3148,7 +3443,7 @@
             if (order.getRefundAmount() != null && order.getRefundAmount() > 0) {
                 logInfo += "锛岄渶閫�娆�" + Constants.getFormatMoney(order.getRefundAmount()) + "鍏�";
             }
-            saveShopVerifyLog(order, "纭椤惧鍒板簵", logInfo, null, shopId);
+            saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArrive, logInfo, null, shopId);
         }
     }
 
@@ -3225,6 +3520,62 @@
     }
 
     /**
+    /**
+     * 濉厖閫炬湡鐘舵�佸埌 VO锛圡yOrderVO锛�
+     * overdueStatus: 0=鏈埌搴楁湭閫炬湡 1=鏈埌搴楀瓨鍦ㄩ�炬湡 2=宸插埌搴楁湭閫炬湡 3=宸插埌搴楀緟鏀粯閫炬湡 4=閫炬湡宸叉敮浠�
+     */
+    private void fillOverdueStatus(MyOrderVO vo, Orders order, List<OrdersDetail> details) {
+        Integer[] result = calcOverdueStatus(order, details);
+        vo.setOverdueStatus(result[0]);
+        vo.setOverdue(result[1] == 1);
+        vo.setOverdueDays(result[2]);
+        vo.setOverdueFee(result[3].longValue());
+    }
+
+    /**
+     * 濉厖閫炬湡鐘舵�佸埌 VO锛圡yOrderDetailVO锛�
+     */
+    private void fillOverdueStatus(MyOrderDetailVO vo, Orders order, List<OrdersDetail> details) {
+        Integer[] result = calcOverdueStatus(order, details);
+        vo.setOverdueStatus(result[0]);
+        vo.setOverdue(result[1] == 1);
+        vo.setOverdueDays(result[2]);
+        vo.setOverdueFee(result[3].longValue());
+    }
+
+    /**
+     * 璁$畻閫炬湡鐘舵��
+     * @return [overdueStatus, isOverdue(0/1), overdueDays, overdueFee]
+     */
+    private Integer[] calcOverdueStatus(Orders order, List<OrdersDetail> details) {
+        // 4=閫炬湡宸叉敮浠橈紙璁㈠崟 overdueStatus=2锛�
+        if (Constants.equalsInteger(order.getOverdueStatus(), Constants.TWO)) {
+            return new Integer[]{4, 1, order.getOverdueDays(), order.getOverdueAmount() != null ? order.getOverdueAmount().intValue() : 0};
+        }
+        // 3=宸插埌搴楀緟鏀粯閫炬湡锛堣鍗� overdueStatus=1锛�
+        if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+            return new Integer[]{3, 1, order.getOverdueDays(), order.getOverdueAmount() != null ? order.getOverdueAmount().intValue() : 0};
+        }
+        // 璁$畻瀹炴椂閫炬湡
+        OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
+        boolean hasOverdue = overdueInfo.getOverdue() != null && overdueInfo.getOverdue()
+                && overdueInfo.getOverdueFee() != null && overdueInfo.getOverdueFee() > 0;
+        if (order.getConfirmArriveTime() != null) {
+            // 宸插埌搴�
+            int days = hasOverdue ? overdueInfo.getOverdueDays() : 0;
+            long fee = hasOverdue ? overdueInfo.getOverdueFee() : 0L;
+            return new Integer[]{2, hasOverdue ? 1 : 0, days, (int) fee};
+        } else {
+            // 鏈埌搴�
+            if (hasOverdue) {
+                return new Integer[]{1, 1, overdueInfo.getOverdueDays(), overdueInfo.getOverdueFee().intValue()};
+            } else {
+                return new Integer[]{0, 0, 0, 0};
+            }
+        }
+    }
+
+    /**
      * 閫炬湡璐圭敤鍐呴儴璁$畻锛堜笉鏌ュ簱锛屾帴鍙楅鏌ヨ鐨勬暟鎹級
      * 渚涘垎椤电瓑宸叉煡璇㈡槑缁嗙殑涓氬姟鍦烘櫙澶嶇敤锛岄伩鍏嶉噸澶嶆煡璇�
      */
@@ -3241,8 +3592,8 @@
         // 鐗╁搧鍩虹鏃ヨ垂鐢� = 危(鍗曚环 脳 鏁伴噺)
         long dailyBaseFee = 0L;
         for (OrdersDetail d : details) {
-            dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L)
-                    * (d.getNum() != null ? d.getNum() : 0);
+            dailyBaseFee += (d.getLocallyPrice() != null ? d.getLocallyPrice() : 0L)
+                    * (d.getNum() != null ? d.getNum() : 1);
         }
 
         Date now = new Date();
@@ -3326,25 +3677,20 @@
 
     /**
      * 灏卞湴瀵勫瓨閫炬湡澶╂暟璁$畻
-     * 杩囦簡棰勮鍙栦欢鏃堕棿褰撳ぉ鐨�12鐐瑰悗鎵嶇畻涓�澶�
+     * 杩囦簡棰勮鍙栦欢鏃ユ湡鐨勬鏃ワ紙鍙瘮杈冨勾鏈堟棩锛夊悗寮�濮嬭閫炬湡澶╂暟
      */
     private int calcLocalOverdueDays(Date now, Date expectedTakeTime) {
-        if (expectedTakeTime == null || !now.after(expectedTakeTime)) {
+        if (expectedTakeTime == null) {
             return 0;
         }
-        // 鍩哄噯鏃堕棿 = 棰勮鍙栦欢鏃ユ湡鐨�12:00
+        // 鍙彇骞存湀鏃�
         Calendar baseCal = Calendar.getInstance();
         baseCal.setTime(expectedTakeTime);
-        baseCal.set(Calendar.HOUR_OF_DAY, 12);
+        baseCal.set(Calendar.HOUR_OF_DAY, 0);
         baseCal.set(Calendar.MINUTE, 0);
         baseCal.set(Calendar.SECOND, 0);
         baseCal.set(Calendar.MILLISECOND, 0);
-        Date baseTime = baseCal.getTime();
 
-        if (!now.after(baseTime)) {
-            return 0;
-        }
-        // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡锛堟寜澶╁彇宸級
         Calendar nowCal = Calendar.getInstance();
         nowCal.setTime(now);
         nowCal.set(Calendar.HOUR_OF_DAY, 0);
@@ -3352,40 +3698,31 @@
         nowCal.set(Calendar.SECOND, 0);
         nowCal.set(Calendar.MILLISECOND, 0);
 
-        Calendar baseDateCal = Calendar.getInstance();
-        baseDateCal.setTime(baseTime);
-        baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
-        baseDateCal.set(Calendar.MINUTE, 0);
-        baseDateCal.set(Calendar.SECOND, 0);
-        baseDateCal.set(Calendar.MILLISECOND, 0);
-
-        long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
-        int days = (int) (diffMs / (1000 * 60 * 60 * 24));
-        return Math.max(days, 0);
+        // 鍩哄噯鏃ユ湡 = 棰勮鍙栦欢鏃ユ湡鐨勬鏃ワ紝褰撳ぉ鍙婁箣鍓嶄笉绠楅�炬湡
+        if (nowCal.before(baseCal)) {
+            return 0;
+        }
+        // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
+        long diffMs = nowCal.getTimeInMillis() - baseCal.getTimeInMillis();
+        return (int) (diffMs / (1000 * 60 * 60 * 24));
     }
 
     /**
      * 寮傚湴瀵勫瓨閫炬湡澶╂暟璁$畻
-     * 杩囦簡杞Щ鍒板簵鏃堕棿褰撳ぉ鐨勬櫄涓�12鐐癸紙24:00锛夊悗鎵嶇畻绗竴澶�
+     * 杩囦簡杞Щ鍒板簵鏃ユ湡鐨勬鏃ワ紙鍙瘮杈冨勾鏈堟棩锛夊悗寮�濮嬭閫炬湡澶╂暟
      */
     private int calcRemoteOverdueDays(Date now, Date arriveTime) {
-        if (arriveTime == null || !now.after(arriveTime)) {
+        if (arriveTime == null) {
             return 0;
         }
-        // 鍩哄噯鏃堕棿 = 杞Щ鍒板簵鏃ユ湡鐨勬鏃� 00:00锛堝嵆褰撳ぉ24:00锛�
+        // 鍙彇骞存湀鏃�
         Calendar baseCal = Calendar.getInstance();
         baseCal.setTime(arriveTime);
         baseCal.set(Calendar.HOUR_OF_DAY, 0);
         baseCal.set(Calendar.MINUTE, 0);
         baseCal.set(Calendar.SECOND, 0);
         baseCal.set(Calendar.MILLISECOND, 0);
-        baseCal.add(Calendar.DAY_OF_MONTH, 1); // 娆℃棩00:00 = 褰撳ぉ24:00
-        Date baseTime = baseCal.getTime();
 
-        if (!now.after(baseTime)) {
-            return 0;
-        }
-        // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
         Calendar nowCal = Calendar.getInstance();
         nowCal.setTime(now);
         nowCal.set(Calendar.HOUR_OF_DAY, 0);
@@ -3393,16 +3730,14 @@
         nowCal.set(Calendar.SECOND, 0);
         nowCal.set(Calendar.MILLISECOND, 0);
 
-        Calendar baseDateCal = Calendar.getInstance();
-        baseDateCal.setTime(baseTime);
-        baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
-        baseDateCal.set(Calendar.MINUTE, 0);
-        baseDateCal.set(Calendar.SECOND, 0);
-        baseDateCal.set(Calendar.MILLISECOND, 0);
-
-        long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
-        int days = (int) (diffMs / (1000 * 60 * 60 * 24));
-        return Math.max(days, 0);
+        // 鍩哄噯鏃ユ湡 = 鍒板簵鏃ユ湡鐨勬鏃ワ紝褰撳ぉ鍙婁箣鍓嶄笉绠楅�炬湡
+        baseCal.add(Calendar.DAY_OF_MONTH, 1);
+        if (nowCal.before(baseCal)) {
+            return 0;
+        }
+        // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
+        long diffMs = nowCal.getTimeInMillis() - baseCal.getTimeInMillis();
+        return (int) (diffMs / (1000 * 60 * 60 * 24));
     }
 
     @Override
@@ -3411,7 +3746,7 @@
         QueryWrapper<Orders> wrapper = new QueryWrapper<>();
         wrapper.eq("MEMBER_ID", memberId)
                 .in("STATUS", 0, 1, 2, 3, 4, 5)
-                .orderByDesc("CREATE_TIME")
+                .orderByAsc("CREATE_TIME")
                 .last("LIMIT 1");
         Orders order = ordersMapper.selectOne(wrapper);
         if (order == null) {
@@ -3421,6 +3756,7 @@
         ActiveOrderTipVO vo = new ActiveOrderTipVO();
         vo.setOrderId(order.getId());
         vo.setStatus(order.getStatus());
+        vo.setStatusDesc(Constants.OrderStatus.getDescByKey(order.getStatus(), order.getType()));
 
         // 鏋勫缓鎻愮ず鏂囨
         boolean isLocal = Constants.equalsInteger(order.getType(), Constants.ZERO);
@@ -3527,9 +3863,9 @@
                 // 鍐欏叆鎿嶄綔鏃ュ織
                 OrderLog orderLog = new OrderLog();
                 orderLog.setOrderId(order.getId());
-                orderLog.setTitle("绯荤粺鑷姩鍙栨秷锛堣秴鏃舵湭鏀粯锛�");
-                orderLog.setLogInfo("璁㈠崟瓒呮椂" + autoCancelMinutes + "鍒嗛挓鏈敮浠橈紝绯荤粺鑷姩鍙栨秷");
-                orderLog.setObjType(Constants.ORDER_LOG_CANCEL);
+                orderLog.setTitle(Constants.OrderLogType.systemCancel.getTitle());
+                orderLog.setLogInfo(Constants.OrderLogType.systemCancel.format("璁㈠崟瓒呮椂" + autoCancelMinutes + "鍒嗛挓鏈敮浠橈紝绯荤粺鑷姩鍙栨秷"));
+                orderLog.setObjType(Constants.OrderLogType.systemCancel.getStatus());
                 orderLog.setOrderStatus(Constants.OrderStatus.cancelled.getStatus());
                 orderLog.setOptUserType(3); // 3=绯荤粺
                 orderLog.setCreateTime(now);
@@ -3693,9 +4029,9 @@
                 // 璁板綍鎿嶄綔鏃ュ織
                 OrderLog orderLog = new OrderLog();
                 orderLog.setOrderId(order.getId());
-                orderLog.setTitle("绯荤粺鑷姩瀹屾垚");
-                orderLog.setLogInfo("璁㈠崟宸查�佽揪瓒呰繃" + autoConfirmDays + "澶╂湭纭锛岀郴缁熻嚜鍔ㄥ畬鎴�");
-                orderLog.setObjType(Constants.ORDER_LOG_CANCEL);
+                orderLog.setTitle(Constants.OrderLogType.systemComplete.getTitle());
+                orderLog.setLogInfo(Constants.OrderLogType.systemComplete.format("璁㈠崟宸查�佽揪瓒呰繃" + autoConfirmDays + "澶╂湭纭锛岀郴缁熻嚜鍔ㄥ畬鎴�"));
+                orderLog.setObjType(Constants.OrderLogType.systemComplete.getStatus());
                 orderLog.setOrderStatus(Constants.OrderStatus.finished.getStatus());
                 orderLog.setOptUserType(3); // 3=绯荤粺
                 orderLog.setCreateTime(now);
@@ -3742,31 +4078,28 @@
             for (int i = 0; i < paramPairs.length - 1; i += 2) {
                 templateParam.put(paramPairs[i], paramPairs[i + 1]);
             }
-            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+            String error = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
                     templateParam.toJSONString());
-            if (result) {
-                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
-            } else {
-                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
-            }
-            // 瀛樺偍鐭俊璁板綍
             Smsrecord record = new Smsrecord();
             record.setPhone(phone);
             record.setContent(content);
-            record.setType(Constants.ONE); // 1=璁㈠崟閫氱煡
-            record.setStatus(result ? Constants.ONE : Constants.ZERO); // 1=宸插彂閫�, 0=鍙戦�佸け璐�
+            record.setType(Constants.ONE);
+            record.setStatus(error == null ? Constants.ONE : Constants.ZERO);
+            if (error != null) {
+                record.setRemark(error);
+            }
             record.setCreateTime(new Date());
             record.setDeleted(Constants.ZERO);
             smsrecordMapper.insert(record);
         } catch (Exception e) {
             log.error("鐭俊鍙戦�佸紓甯�: phone={}, template={}, error={}", phone, smsNotify.name(), e.getMessage());
-            // 寮傚父涔熻褰�
             try {
                 Smsrecord record = new Smsrecord();
                 record.setPhone(phone);
                 record.setContent(content);
                 record.setType(Constants.ONE);
-                record.setStatus(Constants.ZERO); // 鍙戦�佸け璐�
+                record.setStatus(Constants.ZERO);
+                record.setRemark(e.getMessage());
                 record.setCreateTime(new Date());
                 record.setDeleted(Constants.ZERO);
                 smsrecordMapper.insert(record);

--
Gitblit v1.9.3