From 59bfd0b8bbbf0ee94ec68e4a3a1a6e536d0ad8fd Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 20 五月 2026 23:10:43 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/gtzxinglijicun

---
 server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java                           |    3 
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java   |   24 ++
 server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java     |   51 +++++
 server/web/src/main/java/com/doumee/api/web/PaymentCallback.java                            |    3 
 server/services/src/main/java/com/doumee/dao/vo/OrdersExportVO.java                         |   14 +
 server/services/src/main/java/com/doumee/service/business/impl/DataBoardServiceImpl.java    |   30 ++-
 server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java                      |    6 
 server/web/src/main/java/com/doumee/api/web/MemberCouponApi.java                            |   12 +
 server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java        |    4 
 server/services/src/main/java/com/doumee/dao/vo/LocationTagShopCountVO.java                 |    3 
 server/services/src/main/java/com/doumee/dao/vo/ManualRefundDetailVO.java                   |   25 +++
 server/services/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java |   23 ++
 server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java                        |    5 
 server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java                              |    3 
 server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java                          |   19 ++
 server/services/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java       |    6 
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java       |   18 +
 server/services/src/main/java/com/doumee/service/business/MemberCouponService.java          |    3 
 server/services/src/main/java/com/doumee/service/business/OrdersService.java                |    1 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java       |  202 +++++++++++++++++++-----
 server/admin/src/main/java/com/doumee/api/business/OrdersController.java                    |   14 +
 server/admin/src/main/resources/application.yml                                             |    2 
 server/services/src/main/java/com/doumee/dao/dto/DriverOrderPageDTO.java                    |    3 
 23 files changed, 380 insertions(+), 94 deletions(-)

diff --git a/server/admin/src/main/java/com/doumee/api/business/OrdersController.java b/server/admin/src/main/java/com/doumee/api/business/OrdersController.java
index 5bfa6ba..d987e75 100644
--- a/server/admin/src/main/java/com/doumee/api/business/OrdersController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/OrdersController.java
@@ -12,10 +12,7 @@
 import com.doumee.dao.dto.DispatchDTO;
 import com.doumee.dao.dto.HandleOrderExceptionDTO;
 import com.doumee.dao.dto.ManualRefundDTO;
-import com.doumee.dao.vo.OrderDetailVO;
-import com.doumee.dao.vo.OrderDispatchVO;
-import com.doumee.dao.vo.OrdersExportVO;
-import com.doumee.dao.vo.OrderSummaryVO;
+import com.doumee.dao.vo.*;
 import com.doumee.service.business.OrdersService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -109,6 +106,8 @@
             vo.setOverdueAmount(String.valueOf(Constants.getFormatMoney(o.getOverdueAmount())));
             vo.setExceptionAmount(String.valueOf(Constants.getFormatMoney(o.getExceptionAmount())));
             vo.setDeductionAmount(String.valueOf(Constants.getFormatMoney(o.getDeductionAmount())));
+            vo.setShopCompensationAmount(String.valueOf(Constants.getFormatMoney(o.getShopCompensationAmount())));
+            vo.setExceptionFee(String.valueOf(Constants.getFormatMoney(o.getExceptionFee())));
             vo.setStatusDesc(o.getStatusDesc());
             vo.setSettlementDesc(o.getSettlementStatus() != null ? (o.getSettlementStatus() == 1 ? "宸茬粨绠�" : "寰呯粨绠�") : "");
             vo.setPayTime(o.getPayTime());
@@ -174,4 +173,11 @@
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
+    @ApiOperation("鎵嬪姩閫�娆捐鎯�")
+    @GetMapping("/manualRefundDetail/{orderId}")
+    @RequiresPermissions("business:orders:query")
+    public ApiResponse<ManualRefundDetailVO> manualRefundDetail(@PathVariable Integer orderId) {
+        return ApiResponse.success(ordersService.getManualRefundDetail(orderId));
+    }
+
 }
diff --git a/server/admin/src/main/resources/application.yml b/server/admin/src/main/resources/application.yml
index a67904a..2966e7d 100644
--- a/server/admin/src/main/resources/application.yml
+++ b/server/admin/src/main/resources/application.yml
@@ -12,7 +12,7 @@
 
 spring:
   profiles:
-    active: dev
+    active: pro
   # JSON杩斿洖閰嶇疆
   jackson:
     # 榛樿鏃跺尯
diff --git a/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java b/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
index 47926f8..9c99271 100644
--- a/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
+++ b/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
@@ -50,9 +50,9 @@
         dto.setRegisterCouponId(getValue(Constants.OP_REGISTER_COUPON_ID));
         dto.setRegisterGiftCouponIds(getValue(Constants.OP_REGISTER_GIFT_COUPON_IDS));
         dto.setRegisterRewardOrderCount(getValue(Constants.OP_REGISTER_REWARD_ORDER_COUNT));
-        dto.setRegisterRewardAmount(fenToYuan(getValue(Constants.OP_REGISTER_REWARD_AMOUNT)));
+        dto.setRegisterRewardAmount(getValue(Constants.OP_REGISTER_REWARD_AMOUNT));
         dto.setPlatformRewardOrderCount(getValue(Constants.OP_PLATFORM_REWARD_ORDER_COUNT));
-        dto.setPlatformRewardAmount(fenToYuan(getValue(Constants.OP_PLATFORM_REWARD_AMOUNT)));
+        dto.setPlatformRewardAmount(getValue(Constants.OP_PLATFORM_REWARD_AMOUNT));
         dto.setInvoiceMonthLimit(getValue(Constants.OP_INVOICE_MONTH_LIMIT));
         return dto;
     }
diff --git a/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java b/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
index 6faab65..2224ae4 100644
--- a/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
+++ b/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
@@ -59,7 +59,7 @@
 
             com.wechat.pay.java.service.payments.jsapi.model.Amount amount =
                     new com.wechat.pay.java.service.payments.jsapi.model.Amount();
-            amount.setTotal(1);//totalCents.intValue());
+            amount.setTotal(totalCents.intValue());
             amount.setCurrency("CNY");
             request.setAmount(amount);
 
@@ -109,8 +109,8 @@
             request.setNotifyUrl(notifyUrl);
 
             AmountReq amount = new AmountReq();
-            amount.setRefund(1L);//refundCents);
-            amount.setTotal(1L);//totalCents);
+            amount.setRefund(refundCents);
+            amount.setTotal(totalCents);
             amount.setCurrency("CNY");
             request.setAmount(amount);
 
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DriverOrderPageDTO.java b/server/services/src/main/java/com/doumee/dao/dto/DriverOrderPageDTO.java
index 099bd9d..405bb8f 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/DriverOrderPageDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/DriverOrderPageDTO.java
@@ -16,4 +16,7 @@
     @ApiModelProperty(value = "璁㈠崟鐘舵�佺瓫閫夛細null=鍏ㄩ儴锛�3=寰呭彇浠讹紱4=閰嶉�佷腑锛�7=宸插畬鎴�")
     private Integer status;
 
+
+    @ApiModelProperty(value = "鎼滅储鍏抽敭璇嶏紙鏀朵欢浜�/鏀朵欢浜虹數璇濇ā绯�/璁㈠崟鍙风簿鍑嗭級")
+    private String keyword;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/LocationTagShopCountVO.java b/server/services/src/main/java/com/doumee/dao/vo/LocationTagShopCountVO.java
index dec34ee..e3ea8d2 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/LocationTagShopCountVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/LocationTagShopCountVO.java
@@ -24,4 +24,7 @@
 
     @ApiModelProperty("闂ㄥ簵鏁伴噺")
     private Integer shopCount;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", hidden = true)
+    private Integer sortnum;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ManualRefundDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/ManualRefundDetailVO.java
new file mode 100644
index 0000000..c668a25
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/ManualRefundDetailVO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("鎵嬪姩閫�娆捐鎯�")
+public class ManualRefundDetailVO {
+
+    @ApiModelProperty(value = "閫�娆鹃噾棰濓紙鍒嗭級")
+    private Long refundAmount;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鎵f閲戦锛堝垎锛�")
+    private Long depositShopDeduct;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鎵f閲戦锛堝垎锛�")
+    private Long takeShopDeduct;
+
+    @ApiModelProperty(value = "鍙告満鎵f閲戦锛堝垎锛�")
+    private Long driverDeduct;
+
+    @ApiModelProperty(value = "閫�娆惧娉�")
+    private String refundRemark;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
index b4bdd4f..b66b8c1 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
@@ -76,6 +76,8 @@
     private Date arriveTime;
 
     // ---- 瀛樹欢闂ㄥ簵 ----
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵涓婚敭", example = "1")
+    private Integer depositShopId;
 
     @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍚嶇О")
     private String depositShopName;
@@ -132,6 +134,9 @@
     @ApiModelProperty(value = "瀹為檯鏀粯璐圭敤锛堝垎锛�")
     private Long actualPayAmount;
 
+    @ApiModelProperty(value = "浼樻儬鍒告姷鎵i噾棰濓紙鍒嗭級")
+    private Long deductionAmount;
+
     // ---- 閫炬湡 ----
 
     //閫炬湡鐘舵��: 0=鏈埌搴楁湭閫炬湡 1=鏈埌搴楀瓨鍦ㄩ�炬湡 2=宸插埌搴楁湭瀛樺湪閫炬湡 3=宸插埌搴楀緟鏀粯閫炬湡 4=閫炬湡宸叉敮浠�
diff --git a/server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java b/server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
index 5027afa..30c81f7 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
@@ -148,4 +148,7 @@
 
     @ApiModelProperty(value = "浼樻儬鍒告姷鎵i噾棰濓紙鍒嗭級")
     private Long deductionAmount;
+
+    @ApiModelProperty(value = "鏄惁寮傚父璁㈠崟锛�0=鍚︼紱1=鏄�")
+    private Integer abnormalOrder;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
index e4c37a4..3f37105 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
@@ -6,6 +6,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -82,4 +83,22 @@
 
     @ApiModelProperty(value = "浼樻儬鍒告姷鎵i噾棰濓紙鍒嗭級")
     private Long deductionAmount;
+
+    @ApiModelProperty(value = "璇勪环鍐呭")
+    private String commentContent;
+
+    @ApiModelProperty(value = "璇勪环鏃堕棿")
+    private Date commentTime;
+
+    @ApiModelProperty(value = "璇勪环闄勪欢鍥剧墖")
+    private List<String> commentImages;
+
+    @ApiModelProperty(value = "瀵勫瓨闂ㄥ簵璇勫垎")
+    private Integer depositScore;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵璇勫垎")
+    private Integer takeScore;
+
+    @ApiModelProperty(value = "鍙告満璇勫垎")
+    private Integer driverScore;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/OrdersExportVO.java b/server/services/src/main/java/com/doumee/dao/vo/OrdersExportVO.java
index 1466f5e..ca23c55 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/OrdersExportVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/OrdersExportVO.java
@@ -47,15 +47,21 @@
     @ExcelColumn(name = "浼樻儬鍒告姌鎵�(鍏�)", index = 12)
     private String deductionAmount;
 
-    @ExcelColumn(name = "璁㈠崟鐘舵��", index = 13)
+    @ExcelColumn(name = "闂ㄥ簵琛ュ伩璐圭敤(鍏�)", index = 13)
+    private String shopCompensationAmount;
+
+    @ExcelColumn(name = "鍙告満琛ュ伩璐圭敤(鍏�)", index = 14)
+    private String exceptionFee;
+
+    @ExcelColumn(name = "璁㈠崟鐘舵��", index = 15)
     private String statusDesc;
 
-    @ExcelColumn(name = "缁撶畻鐘舵��", index = 14)
+    @ExcelColumn(name = "缁撶畻鐘舵��", index = 16)
     private String settlementDesc;
 
-    @ExcelColumn(name = "鏀粯鏃堕棿", index = 15, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16)
+    @ExcelColumn(name = "鏀粯鏃堕棿", index = 17, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16)
     private Date payTime;
 
-    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 16, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16)
+    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 18, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16)
     private Date createTime;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
index 56b90b1..7898c65 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
@@ -6,6 +6,9 @@
 @Data
 public class ShopCenterVO {
 
+    @ApiModelProperty(value = "闂ㄥ簵涓婚敭")
+    private Integer id;
+
     @ApiModelProperty(value = "闂ㄥ簵澶村儚鍏ㄨ矾寰�")
     private String fullCoverImg;
 
diff --git a/server/services/src/main/java/com/doumee/service/business/MemberCouponService.java b/server/services/src/main/java/com/doumee/service/business/MemberCouponService.java
index 79682b3..e08e0c3 100644
--- a/server/services/src/main/java/com/doumee/service/business/MemberCouponService.java
+++ b/server/services/src/main/java/com/doumee/service/business/MemberCouponService.java
@@ -5,6 +5,7 @@
 import com.doumee.dao.business.model.MemberCoupon;
 
 import java.util.List;
+import java.util.Map;
 
 public interface MemberCouponService {
 
@@ -27,4 +28,6 @@
     PageData<MemberCoupon> findMemberPage(Integer memberId, Integer status, PageWrap<MemberCoupon> pageWrap);
 
     void claimCoupon(Integer memberId, Integer couponId);
+
+    Map<String, Integer> findPendingCount(Integer memberId);
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/OrdersService.java b/server/services/src/main/java/com/doumee/service/business/OrdersService.java
index ffff06d..02be838 100644
--- a/server/services/src/main/java/com/doumee/service/business/OrdersService.java
+++ b/server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -466,4 +466,5 @@
      */
     Boolean checkOperationRadius(Integer orderId, Integer userId, Integer userType, Double lng, Double lat);
 
+    ManualRefundDetailVO getManualRefundDetail(Integer orderId);
 }
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java
index f2a9b5a..3bbf999 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java
@@ -164,6 +164,12 @@
         if (coupon.getPrice() >= coupon.getLimitPrice()) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浼樻儬閲戦蹇呴』灏忎簬婊¢");
         }
+        if (coupon.getLimitPrice() < 1000) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "婊″噺閲戦鏈�浣�10鍏�");
+        }
+        if (coupon.getLimitPrice() - coupon.getPrice() < 1000) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "婊″噺閲戦蹇呴』澶т簬鎵e噺閲戦10鍏冧互涓�");
+        }
         if (Objects.isNull(coupon.getPushDays()) || coupon.getPushDays() < 1) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎺ㄩ�佸悗棰嗗彇鏈夋晥澶╂暟蹇呴』澶т簬绛変簬1澶�");
         }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DataBoardServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DataBoardServiceImpl.java
index 9514975..ce7f4a7 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DataBoardServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DataBoardServiceImpl.java
@@ -150,10 +150,10 @@
         Map<String, Long> map = members.stream()
                 .collect(Collectors.groupingBy(m -> sdf.format(m.getCreateTime()), Collectors.counting()));
 
-        return buildTrendList(range, (date) -> {
+        return buildTrendList(range, (key, label) -> {
             MemberTrendVO vo = new MemberTrendVO();
-            vo.setDate(date);
-            vo.setCount(map.getOrDefault(date, 0L));
+            vo.setDate(label);
+            vo.setCount(map.getOrDefault(key, 0L));
             return vo;
         });
     }
@@ -169,10 +169,10 @@
         Map<String, List<Orders>> grouped = orders.stream()
                 .collect(Collectors.groupingBy(o -> sdf.format(o.getCreateTime())));
 
-        return buildTrendList(range, (date) -> {
-            List<Orders> dayOrders = grouped.getOrDefault(date, Collections.emptyList());
+        return buildTrendList(range, (key, label) -> {
+            List<Orders> dayOrders = grouped.getOrDefault(key, Collections.emptyList());
             OrderTrendVO vo = new OrderTrendVO();
-            vo.setDate(date);
+            vo.setDate(label);
             vo.setLocalCount(dayOrders.stream().filter(o -> Constants.equalsInteger(o.getType(), Constants.ZERO)).count());
             vo.setRemoteCount(dayOrders.stream().filter(o -> Constants.equalsInteger(o.getType(), Constants.ONE)).count());
             return vo;
@@ -227,11 +227,11 @@
             }
         }
 
-        return buildTrendList(range, (date) -> {
+        return buildTrendList(range, (key, label) -> {
             RevenueTrendVO vo = new RevenueTrendVO();
-            vo.setDate(date);
-            long local = localOrderRevenue.getOrDefault(date, 0L);
-            long remote = remoteOrderRevenue.getOrDefault(date, 0L);
+            vo.setDate(label);
+            long local = localOrderRevenue.getOrDefault(key, 0L);
+            long remote = remoteOrderRevenue.getOrDefault(key, 0L);
             vo.setLocalRevenue(BigDecimal.valueOf(local).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
             vo.setRemoteRevenue(BigDecimal.valueOf(remote).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
             return vo;
@@ -718,7 +718,7 @@
 
     @FunctionalInterface
     private interface TrendVOBuilder<T> {
-        T build(String date);
+        T build(String key, String label);
     }
 
     private <T> List<T> buildTrendList(TrendDateRange range, TrendVOBuilder<T> builder) {
@@ -732,7 +732,8 @@
             Calendar end = Calendar.getInstance();
             end.setTime(range.endDate);
             while (!loop.after(end)) {
-                result.add(builder.build(sdf.format(loop.getTime())));
+                String dateStr = sdf.format(loop.getTime());
+                result.add(builder.build(dateStr, dateStr));
                 loop.add(Calendar.DAY_OF_MONTH, 1);
             }
         } else {
@@ -741,8 +742,9 @@
             endCal.setTime(range.endDate);
             int endMonth = endCal.get(Calendar.MONTH); // 0-based
             for (int m = 0; m <= endMonth; m++) {
-                String label = String.format("%02d", m + 1);
-                result.add(builder.build(label));
+                String key = String.format("%02d", m + 1);
+                String label = (m + 1) + "鏈�";
+                result.add(builder.build(key, label));
             }
         }
         return result;
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
index 64a3ac6..509cf69 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -246,7 +246,6 @@
         IPage<DriverInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         MPJLambdaWrapper<DriverInfo> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-        pageWrap.getModel().setDeleted(Constants.ZERO);
 
         // 鍙告満濮撳悕/鎵嬫満鍙凤紙鍏抽敭瀛楁ā绯婃煡璇級
         if (StringUtils.isNotBlank(pageWrap.getModel().getKeyword())) {
@@ -282,7 +281,8 @@
         queryWrapper.selectAll(DriverInfo.class)
                 .select(" ( select ifnull(sum(r.OPT_TYPE * r.AMOUNT),0) from revenue r where r.MEMBER_TYPE = 1 and r.MEMBER_ID= t.id and r.VAILD_STATUS = 1 ) as memberAmount ")
                 .selectAs(Category::getName,DriverInfo::getCarTypeName)
-                .leftJoin(Category.class, Category::getId,DriverInfo::getCarType);
+                .leftJoin(Category.class, Category::getId,DriverInfo::getCarType)
+                .eq(DriverInfo::getDeleted, Constants.ZERO);
         queryWrapper.orderByDesc(DriverInfo::getId);
         PageData<DriverInfo> pageData = PageData.from(driverInfoMapper.selectPage(page, queryWrapper));
         for (DriverInfo d : pageData.getRecords()) {
@@ -560,8 +560,13 @@
             driverInfoMapper.insert(newChange);
             saveDriverAttachments(newChange.getId(), request, now);
             // 鏍囪鍘嗗彶鐨勫彉鏇寸増鏈负鍒犻櫎
-
-
+            driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                    .set(DriverInfo::getDeleted, Constants.ONE)
+                    .set(DriverInfo::getUpdateTime, now)
+                    .eq(DriverInfo::getMemberId, memberId)
+                    .eq(DriverInfo::getVersionType, Constants.ONE)
+                    .eq(DriverInfo::getDeleted, Constants.ZERO)
+                    .ne(DriverInfo::getId, newChange.getId()));
 
         } else {
             // auditStatus=0/2锛氱洿鎺ユ洿鏂板彉鏇寸増鏈�
@@ -1881,6 +1886,9 @@
         if (!driverId.equals(order.getAcceptDriver())) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
         }
+        if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚父璁㈠崟鏃犳硶杩涜纭閫佽揪");
+        }
 
         // 3. 淇濆瓨閫佽揪鍥剧墖
         Date now = new Date();
@@ -2271,7 +2279,13 @@
                 .eq(status != null, Orders::getStatus, status)
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .orderByDesc(Orders::getAcceptTime);
-
+        // 鍏抽敭璇嶆悳绱細鏀朵欢浜�/鏀朵欢浜虹數璇濇ā绯娿�佽鍗曞彿绮惧噯
+        if (StringUtils.isNotBlank(model.getKeyword())) {
+            String kw = model.getKeyword().trim();
+            wrapper.and(w -> w.like(Orders::getTakeUser, kw)
+                    .or().like(Orders::getTakePhone, kw)
+                    .or().like(Orders::getCode, kw));
+        }
         IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
 
         List<DriverGrabOrderVO> voList = new ArrayList<>();
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
index 7e792fa..7de8bb1 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -26,7 +26,9 @@
 
 import java.util.Calendar;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 @Service
@@ -197,6 +199,22 @@
     }
 
     @Override
+    public Map<String, Integer> findPendingCount(Integer memberId) {
+        Long waitClaim = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>().lambda()
+                .eq(MemberCoupon::getMemberId, memberId)
+                .eq(MemberCoupon::getStatus, Constants.CouponStatus.waitClaim.getKey())
+                .eq(MemberCoupon::getIsdeleted, Constants.ZERO));
+        Long waitUse = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>().lambda()
+                .eq(MemberCoupon::getMemberId, memberId)
+                .eq(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey())
+                .eq(MemberCoupon::getIsdeleted, Constants.ZERO));
+        Map<String, Integer> result = new LinkedHashMap<>();
+        result.put("waitClaim", waitClaim != null ? waitClaim.intValue() : 0);
+        result.put("waitUse", waitUse != null ? waitUse.intValue() : 0);
+        return result;
+    }
+
+    @Override
     @Transactional(rollbackFor = {Exception.class, BusinessException.class})
     public void claimCoupon(Integer memberId, Integer couponId) {
         // 鏌ヨ璇ヤ細鍛樼殑寰呴鍙栦紭鎯犲埜璁板綍
@@ -207,11 +225,6 @@
                 .eq(MemberCoupon::getIsdeleted, Constants.ZERO));
         if (mc == null) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
-        }
-        // 鏍¢獙浼樻儬鍒告槸鍚︽湁鏁�
-        Coupon coupon = couponMapper.selectById(couponId);
-        if (coupon == null || coupon.getStatus() != Constants.ZERO) {
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浼樻儬鍒告棤鏁�");
         }
         // 鏍囪宸查鍙栵紝璁$畻鏈夋晥鏈�
         Date now = new Date();
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 88412db..6b196d9 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -410,9 +410,9 @@
             }
         }
         // 鏍规嵁openid鏌ヨ褰撳墠缁戝畾鐨勯棬搴�
-        if (StringUtils.isNotBlank(member.getOpenid())) {
+        if (Objects.nonNull(member.getLoginShopId())) {
             ShopInfo bindShop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
-                    .eq(ShopInfo::getOpenid, member.getOpenid())
+                    .eq(ShopInfo::getId, member.getLoginShopId())
                     .eq(ShopInfo::getDeleted, Constants.ZERO)
                     .last("limit 1"));
             if (bindShop != null) {
@@ -725,6 +725,12 @@
         );
     }
 
+    /**
+     * 娉ㄥ唽婊骞磋禒閫佷紭鎯犲埜锛堝畾鏃朵换鍔¤皟鐢級
+     * 瑙勫垯锛氭牴鎹繍钀ラ厤缃� registerCouponYears锛堟弧鍑犲勾璧犻�侊級銆乺egisterCouponGiftCount锛堣嚦澶氳禒閫佹鏁帮級銆乺egisterCouponId锛堣禒閫佷紭鎯犲埜ID鍒楄〃锛夛紝
+     * 閬嶅巻鎵�鏈夋櫘閫氫細鍛橈紝璁$畻娉ㄥ唽骞撮檺锛屾瘡婊¢厤缃勾鏁拌禒閫佷竴娆★紝绱璧犻�佹鏁颁笉瓒呰繃閰嶇疆涓婇檺銆�
+     * 渚嬪锛氶厤缃弧2骞磋禒閫併�佽嚦澶�3娆★紝鍒欐敞鍐岀2/4/6骞村悇璧犻�佷竴娆★紝鍏�3娆°��
+     */
     @Override
     public void giftRegisterCoupon() {
         // 1. 璇诲彇閰嶇疆
@@ -753,11 +759,17 @@
             return;
         }
 
-        // 3. 鏌ヨ鎵�鏈夋櫘閫氫細鍛�
+        // 3. 鏁版嵁搴撳眰闈㈣繃婊わ細娉ㄥ唽婊onfigYears涓旀湭璧犳弧鐨勬櫘閫氫細鍛�
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.YEAR, -configYears);
+        Date minRegisterDate = cal.getTime();
+
         List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                 .eq(Member::getDeleted, Constants.ZERO)
                 .eq(Member::getStatus, Constants.ZERO)
                 .eq(Member::getUserType, Constants.ZERO)
+                .le(Member::getCreateTime, minRegisterDate)
+                .lt(Member::getRegisterCouponGiftCount, maxGiftCount)
                 .isNotNull(Member::getCreateTime));
 
         Date now = new Date();
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 3524470..6269a48 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
@@ -133,6 +133,8 @@
 
     @Autowired
     private MemberCouponMapper memberCouponMapper;
+    @Autowired
+    private CouponMapper couponMapper;
 
     @Autowired
     private AreasBiz areasBiz;
@@ -662,7 +664,7 @@
                 .le(MemberCoupon::getLimitPrice, totalPrice)
                 .ge(MemberCoupon::getEndDate, now)
                 .orderByDesc(MemberCoupon::getPrice)
-                .orderByAsc(MemberCoupon::getEndDate));
+                .orderByAsc(MemberCoupon::getCreateDate));
         result.setAvailableCoupons(availableCoupons);
 
         if (couponId == null) {
@@ -1151,6 +1153,11 @@
         if (Objects.isNull(order)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
+        // 瀹炰粯閲戦 = 鏀粯閲戦 - 閫�娆鹃噾棰� + 閫炬湡璐圭敤
+        long pay = order.getPayAmount() != null ? order.getPayAmount() : 0L;
+        long refund = order.getRefundAmount() != null ? order.getRefundAmount() : 0L;
+        long overdue = order.getOverdueAmount() != null ? order.getOverdueAmount() : 0L;
+        order.setPayAmount(pay - refund + overdue);
 
         OrderDetailVO vo = new OrderDetailVO();
         vo.setOrder(order);
@@ -1217,6 +1224,25 @@
             for (OrderItemVO v:vo.getDetailList()) {
                 v.setTypeName(category.getName());
             }
+        }
+
+        // 璇勪环淇℃伅
+        List<OrderComment> comments = orderCommentMapper.selectList(new QueryWrapper<OrderComment>().lambda()
+                .eq(OrderComment::getOrderId, id)
+                .eq(OrderComment::getDeleted, Constants.ZERO));
+        if (CollectionUtils.isNotEmpty(comments)) {
+            for (OrderComment c : comments) {
+                if (Constants.equalsInteger(c.getTargetType(), Constants.ONE)) {
+                    vo.setDepositScore(c.getScore());
+                } else if (Constants.equalsInteger(c.getTargetType(), Constants.TWO)) {
+                    vo.setTakeScore(c.getScore());
+                } else if (Constants.equalsInteger(c.getTargetType(), Constants.THREE)) {
+                    vo.setDriverScore(c.getScore());
+                }
+            }
+            vo.setCommentContent(comments.get(0).getContent());
+            vo.setCommentTime(comments.get(0).getCreateTime());
+            vo.setCommentImages(getFileUrls(id, Constants.FileType.COMMENT_ATTACH.getKey(), imgPrefix));
         }
 
         // 鍙栨秷/閫�娆剧姸鎬佹椂鏌ヨ閫�娆捐褰�
@@ -1655,7 +1681,8 @@
                 cal.set(Calendar.MINUTE, 0);
                 cal.set(Calendar.SECOND, 0);
                 cal.set(Calendar.MILLISECOND, 0);
-                wrapper.ge(Orders::getFinishTime, cal.getTime());
+                wrapper.ge(Orders::getFinishTime, cal.getTime())
+                        .eq(Orders::getStatus, Constants.OrderStatus.finished.getKey());
             }
         }
         // 鍏抽敭璇嶆悳绱細鏀朵欢浜�/鏀朵欢浜虹數璇濇ā绯娿�佽鍗曞彿绮惧噯
@@ -1737,6 +1764,8 @@
                 fillOverdueStatus(vo, o, details);
                 // 浼樻儬鍒告姷鎵i噾棰�
                 vo.setDeductionAmount(o.getDeductionAmount());
+                // 寮傚父璁㈠崟鏍囪瘑
+                vo.setAbnormalOrder(o.getExceptionStatus());
                 // 鍙紑绁ㄩ噾棰濓紙鏀粯閲戦 - 閫�娆鹃噾棰濓級
                 if (model != null && model.getInvoiceStatus() != null && Constants.equalsInteger(model.getInvoiceStatus(), Constants.ONE)) {
                     long payAmt = o.getPayAmount() != null ? o.getPayAmount() : 0L;
@@ -1815,7 +1844,7 @@
                     .or(w3-> w3.eq(Orders::getType, Constants.ONE).eq(Orders::getDepositShopId, shopId)
                             .eq(Orders::getStatus, Constants.OrderStatus.waitDeposit.getStatus()))
                     .or(w2 -> w2.eq(Orders::getType, Constants.ONE).eq(Orders::getTakeShopId, shopId)
-                            .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus())))
+                            .in(Orders::getStatus, Constants.OrderStatus.arrived.getStatus(),Constants.OrderStatus.delivering.getStatus())))
             );
         } else {
             wrapper.and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId));
@@ -1975,6 +2004,7 @@
         vo.setUrgentAmount(order.getUrgentAmount());
         vo.setIsUrgent(order.getIsUrgent());
         vo.setActualPayAmount(Constants.equalsInteger(order.getPayStatus(), Constants.ONE)?order.getPayAmount():order.getEstimatedAmount());
+        vo.setDeductionAmount(order.getDeductionAmount());
 
         // 鏍囪
         vo.setExceptionStatus(order.getExceptionStatus());
@@ -1988,13 +2018,12 @@
             vo.setPayCountdownMs(calcPayCountdownMs(order));
         }
         //搴忓彿
-        vo.setSortnum(Constants.formatIntegerNum(order.getDepositShopId())+"-"+order.getId());
-        if(order.getTakeShopId()!=null){
-            String dateStr = new SimpleDateFormat("dd").format(order.getPayTime() != null ? order.getPayTime() : new Date());
-            String autoNumStr = String.format("%03d", order.getAutoNum() != null ? order.getAutoNum() : 0);
-            String sort = order.getTakeShopId() + "-" + dateStr + "-" + autoNumStr;
-            vo.setSortnumTake(sort);
-        }
+//        vo.setSortnum(Constants.formatIntegerNum(order.getDepositShopId())+"-"+order.getId());
+        String dateStr = new SimpleDateFormat("dd").format(order.getPayTime() != null ? order.getPayTime() : new Date());
+        String autoNumStr = String.format("%03d", order.getAutoNum() != null ? order.getAutoNum() : 0);
+        String sort = order.getDepositShopId() + "-" + dateStr + "-" + autoNumStr;
+        vo.setSortnum(sort);
+        vo.setDepositShopId(order.getDepositShopId());
         // 瀛樹欢闂ㄥ簵
         if (order.getDepositShopId() != null) {
             ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
@@ -2282,16 +2311,71 @@
      * 淇濆瓨鍙栨秷璁㈠崟鎿嶄綔鏃ュ織
      */
     private void restoreCoupon(Orders order) {
-//        if (order.getCouponId() == null || order.getDeductionAmount() == null || order.getDeductionAmount() <= 0) {
-//            return;
-//        }
-//        memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
-//                .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey())
-//                .set(MemberCoupon::getUseDate, null)
-//                .set(MemberCoupon::getOrderId, null)
-//                .eq(MemberCoupon::getId, order.getCouponId())
-//                .eq(MemberCoupon::getOrderId, order.getId())
-//                .eq(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey()));
+        if (order.getCouponId() == null || order.getDeductionAmount() == null || order.getDeductionAmount() <= 0) {
+            return;
+        }
+        memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
+                .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey())
+                .set(MemberCoupon::getUseDate, null)
+                .set(MemberCoupon::getOrderId, null)
+                .eq(MemberCoupon::getId, order.getCouponId())
+                .eq(MemberCoupon::getOrderId, order.getId())
+                .eq(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey()));
+    }
+
+    private void giftOrderCoupon(Integer memberId) {
+        String orderCountStr = operationConfigBiz.getConfig().getOrderCouponOrderCount();
+        String giftCountStr = operationConfigBiz.getConfig().getOrderCouponGiftCount();
+        String couponIdsStr = operationConfigBiz.getConfig().getOrderCouponId();
+        if (StringUtils.isAnyBlank(orderCountStr, giftCountStr, couponIdsStr)) return;
+
+        int orderCount = Integer.parseInt(orderCountStr);
+        int maxGift = Integer.parseInt(giftCountStr);
+
+        Member member = memberMapper.selectById(memberId);
+        if (member == null) return;
+        int gifted = member.getOrderCouponGiftCount() != null ? member.getOrderCouponGiftCount() : 0;
+        if (gifted >= maxGift) return;
+
+        long completedCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getMemberId, memberId)
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .notIn(Orders::getStatus,
+                        Constants.OrderStatus.waitPay.getKey(),
+                        Constants.OrderStatus.waitDeposit.getKey()));
+        if (completedCount < orderCount || completedCount % orderCount != 0) return;
+
+        String[] idArr = couponIdsStr.split(",");
+        Date now = new Date();
+        for (String idStr : idArr) {
+            String trimmed = idStr.trim();
+            if (StringUtils.isBlank(trimmed)) continue;
+            Coupon coupon = couponMapper.selectById(Integer.valueOf(trimmed));
+            if (coupon == null || Constants.equalsInteger(coupon.getIsdeleted(), Constants.ONE)) continue;
+            MemberCoupon mc = new MemberCoupon();
+            mc.setCouponId(coupon.getId());
+            mc.setMemberId(memberId);
+            mc.setStatus(Constants.CouponStatus.waitClaim.getKey());
+            Calendar validCal = Calendar.getInstance();
+            validCal.add(Calendar.DAY_OF_MONTH, coupon.getPushDays() != null ? coupon.getPushDays() : 7);
+            mc.setValidDate(validCal.getTime());
+            mc.setName(coupon.getName());
+            mc.setInfo(coupon.getInfo());
+            mc.setType(coupon.getType());
+            mc.setLimitPrice(coupon.getLimitPrice());
+            mc.setPrice(coupon.getPrice());
+            mc.setGetMethod(coupon.getGetMethod());
+            mc.setCouponType(coupon.getCouponType());
+            mc.setPushDays(coupon.getPushDays());
+            mc.setValidDays(coupon.getValidDays());
+            mc.setIsdeleted(Constants.ZERO);
+            mc.setCreateDate(now);
+            mc.setEditDate(now);
+            memberCouponMapper.insert(mc);
+        }
+
+        member.setOrderCouponGiftCount(gifted + 1);
+        memberMapper.updateById(member);
     }
 
     private void saveCancelLog(Orders order, Constants.OrderLogType logType, String reason, Integer memberId) {
@@ -2406,7 +2490,7 @@
                 refund.setRefundTime(now);
                 ordersRefundMapper.updateById(refund);
                 // 閫�娆炬垚鍔燂紝鎵ц鎵f
-                processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct);
+                //processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct);
             } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(refundStatus)) {
                 refund.setStatus(Constants.ZERO); // 閫�娆句腑锛岀瓑鍥炶皟
                 ordersRefundMapper.updateById(refund);
@@ -2428,7 +2512,6 @@
         // 7. 鏇存柊璁㈠崟锛氭爣璁板凡鎵嬪姩閫�娆撅紝绱姞閫�娆鹃噾棰�
         ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                 .set(Orders::getManualRefund, Constants.ONE)
-                .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + dto.getRefundAmount())
                 .set(Orders::getUpdateTime, now)
                 .eq(Orders::getId, order.getId()));
     }
@@ -2511,10 +2594,11 @@
         Long driverDeduct = deductJson.getLong("driverDeduct");
         processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct);
 
-        // 鏍囪璁㈠崟宸叉墜鍔ㄩ��娆撅紝绱姞閫�娆鹃噾棰�
+        // 鏍囪璁㈠崟宸叉墜鍔ㄩ��娆撅紝绱姞閫�娆鹃噾棰濓紝鍚屾鏇存柊totalAmount
         ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                 .set(Orders::getManualRefund, Constants.ONE)
                 .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + refundRecord.getRefundAmount())
+                .setSql(" TOTAL_AMOUNT = IFNULL(TOTAL_AMOUNT, 0) - " + refundRecord.getRefundAmount())
                 .set(Orders::getUpdateTime, new Date())
                 .eq(Orders::getId, order.getId()));
     }
@@ -3262,6 +3346,8 @@
                 sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
                         "orderNo", order.getCode(), "shopName", shopName);
             }
+            // 瀵勫瓨鎴愬姛璧犻�佷紭鎯犲埜
+            giftOrderCoupon(order.getMemberId());
         } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
             // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
             if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
@@ -3881,14 +3967,16 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏍搁攢鐮佹棤鏁�");
         }
 
-        // 浠呭紓鍦板瘎瀛� + 鏈夊彇浠堕棬搴� + 娲鹃�佷腑(4) 鍙牳閿�
-        if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
+        // 浠呭紓鍦板瘎瀛� + 鏈夊彇浠堕棬搴� + 娲鹃�佷腑(4) 鍙牳閿�锛堝紓甯歌鍗曞厑璁革級
+        if (!Constants.equalsInteger(order.getType(), Constants.ONE)
+                && !Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曟敮鎸佸徃鏈烘牳閿�");
         }
-        if (order.getTakeShopId() == null) {
+        if (order.getTakeShopId() == null && !Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤闇�鍙告満鏍搁攢");
         }
-        if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
+        if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())
+                && !Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.deposited.getStatus())) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
         }
 
@@ -4601,7 +4689,7 @@
                     sendSmsNotify(member != null ? member.getTelephone() : null,
                             Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
                 }
-
+                restoreCoupon(order);
                 count++;
             } catch (Exception e) {
                 log.error("鍙栨秷瓒呮椂璁㈠崟寮傚父, orderId={}, error={}", order.getId(), e.getMessage());
@@ -5019,29 +5107,26 @@
                 }
                 targetLat = order.getDepositLat();
                 targetLgt = order.getDepositLgt();
-            } else if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
-                // status=5 闂ㄥ簵瀹屾垚鏍搁攢
-                if (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.getTakeShopId(), userId)) {
-                        throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
-                    }
-                    targetLat = order.getTakeLat();
-                    targetLgt = order.getTakeLgt();
+            } 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(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+                }
+                targetLat = order.getTakeLat();
+                targetLgt = order.getTakeLgt();
             } else {
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佷笉鍏佽姝ゆ搷浣�");
             }
         } else if (Constants.equalsInteger(userType, Constants.ONE)) {
             // 鍙告満鎿嶄綔
-            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.deposited.getStatus())) {
+            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
                 // status=2 鍙告満鍙栦欢
                 if (!Constants.equalsInteger(order.getAcceptDriver(), userId)) {
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
@@ -5082,8 +5167,8 @@
         if (original.getTakeShopId() != null) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞凡鍏宠仈鍙栦欢闂ㄥ簵锛屼笉鏀寔寮傚父澶勭悊");
         }
-        if (!Constants.equalsInteger(original.getStatus(), Constants.FIVE)) {
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸佸凡閫佽揪鐘舵�佺殑璁㈠崟");
+        if (!Constants.equalsInteger(original.getStatus(), Constants.OrderStatus.delivering.getKey())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸侀厤閫佷腑鐨勮鍗曡繘琛屽紓甯稿鐞�");
         }
         if (Constants.equalsInteger(original.getExceptionStatus(), Constants.ONE)) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞凡澶勭悊杩囧紓甯革紝璇峰嬁閲嶅鎿嶄綔");
@@ -5299,4 +5384,27 @@
         }
     }
 
+    @Override
+    public ManualRefundDetailVO getManualRefundDetail(Integer orderId) {
+        OrdersRefund refundRecord = ordersRefundMapper.selectOne(new QueryWrapper<OrdersRefund>().lambda()
+                .eq(OrdersRefund::getOrderId, orderId)
+                .eq(OrdersRefund::getType, Constants.FOUR)
+                .eq(OrdersRefund::getDeleted, Constants.ZERO)
+                .orderByDesc(OrdersRefund::getCreateTime)
+                .last("limit 1"));
+        if (refundRecord == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        ManualRefundDetailVO vo = new ManualRefundDetailVO();
+        vo.setRefundAmount(refundRecord.getRefundAmount());
+        if (StringUtils.isNotBlank(refundRecord.getDeductInfo())) {
+            JSONObject json = JSONObject.parseObject(refundRecord.getDeductInfo());
+            vo.setDepositShopDeduct(json.getLong("depositShopDeduct"));
+            vo.setTakeShopDeduct(json.getLong("takeShopDeduct"));
+            vo.setDriverDeduct(json.getLong("driverDeduct"));
+        }
+        vo.setRefundRemark(refundRecord.getRefundRemark());
+        return vo;
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
index e302df5..1c7807f 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -19,6 +19,7 @@
 import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.MultifileMapper;
 import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.OtherOrdersMapper;
 import com.doumee.dao.business.PricingRuleMapper;
 import com.doumee.dao.business.RevenueMapper;
 import com.doumee.dao.business.ShopInfoMapper;
@@ -27,6 +28,7 @@
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.Multifile;
 import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.OtherOrders;
 import com.doumee.dao.business.model.PricingRule;
 import com.doumee.dao.business.model.Revenue;
 import com.doumee.dao.business.model.ShopInfo;
@@ -122,6 +124,9 @@
 
     @Autowired
     private CategoryMapper categoryMapper;
+
+    @Autowired
+    private OtherOrdersMapper otherOrdersMapper;
 
     @Override
     public Integer create(ShopInfo shopInfo) {
@@ -342,6 +347,8 @@
             newChange.setCreateTime(now);
             newChange.setUpdateTime(now);
             newChange.setRegionMemberId(member.getId());
+            newChange.setRevenueShareConfig(changeVersion.getRevenueShareConfig());
+            newChange.setDeliveryArea(changeVersion.getDeliveryArea());
             setDepositAmountFromPricingRule(newChange);
             shopInfoMapper.insert(newChange);
 
@@ -564,6 +571,7 @@
                 changeVersion.setAuditUserId(auditDTO.getAuditUser());
                 changeVersion.setRevenueShareConfig(revenueShareConfig);
                 changeVersion.setUpdateTime(now);
+                setDefaultDeliveryRange(changeVersion);
                 shopInfoMapper.updateById(changeVersion);
 
                 // 鏍囪鍘嗗彶鐨勫彉鏇寸増鏈负鍒犻櫎
@@ -1213,8 +1221,20 @@
             vo.setTagId(tag.getId());
             vo.setTagName(tag.getName());
             vo.setShopCount(count != null ? count.intValue() : 0);
+            vo.setSortnum(tag.getSortnum());
             result.add(vo);
         }
+
+        // 鎸夐棬搴楁暟閲忓�掑簭锛岀浉鍚屾椂鎸夋帓搴忕爜闄嶅簭
+        result.sort((a, b) -> {
+            int cmp = Integer.compare(
+                    b.getShopCount() != null ? b.getShopCount() : 0,
+                    a.getShopCount() != null ? a.getShopCount() : 0);
+            if (cmp != 0) return cmp;
+            return Integer.compare(
+                    b.getSortnum() != null ? b.getSortnum() : 0,
+                    a.getSortnum() != null ? a.getSortnum() : 0);
+        });
 
         // 鎬绘暟鏀惧湪鍒楄〃绗竴涓�
         Long totalCount = shopInfoMapper.selectCount(baseQw);
@@ -1396,6 +1416,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
         ShopCenterVO vo = new ShopCenterVO();
+        vo.setId(shop.getId());
         vo.setShopName(shop.getName());
         vo.setLinkName(shop.getLinkName());
         vo.setCompanyType(shop.getCompanyType());
@@ -1597,14 +1618,34 @@
                 .count();
         vo.setFinishedOrderCount((int) finishedCount);
 
-        // 鎬昏惀鏀堕噾棰� = sum(totalAmount - refundAmount)
-        long totalRevenue = orders.stream()
+        // 鎬昏惀鏀堕噾棰� = sum(鏀粯閲戦 - 閫�娆鹃噾棰�) + 閫炬湡閲戦
+        long baseRevenue = orders.stream()
                 .mapToLong(o -> {
-                    long total = o.getTotalAmount() != null ? o.getTotalAmount() : 0L;
+                    long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L;
                     long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L;
-                    return total - refund;
+                    return pay - refund;
                 }).sum();
-        vo.setTotalRevenue(totalRevenue);
+
+        // 鏌ヨ璇ラ棬搴楀弬涓庣殑閫炬湡璐圭敤锛堜粠other_orders琛ㄨ幏鍙栵紝type=2宸叉敮浠橈級
+        QueryWrapper<OtherOrders> overdueQw = new QueryWrapper<>();
+        overdueQw.lambda()
+                .eq(OtherOrders::getDeleted, Constants.ZERO)
+                .eq(OtherOrders::getType, Constants.TWO)
+                .eq(OtherOrders::getPayStatus, Constants.ONE)
+                .inSql(OtherOrders::getOrderId,
+                        "SELECT id FROM orders WHERE DELETED = 0 AND (DEPOSIT_SHOP_ID = " + shopId + " OR TAKE_SHOP_ID = " + shopId + ")");
+        if (query.getStartDate() != null) {
+            overdueQw.lambda().ge(OtherOrders::getCreateTime, query.getStartDate());
+        }
+        if (query.getEndDate() != null) {
+            overdueQw.lambda().le(OtherOrders::getCreateTime, Utils.Date.getEnd(query.getEndDate()));
+        }
+        List<OtherOrders> overdueOrders = otherOrdersMapper.selectList(overdueQw);
+        long overdueTotal = overdueOrders.stream()
+                .mapToLong(o -> o.getPayAccount() != null ? o.getPayAccount() : 0L)
+                .sum();
+
+        vo.setTotalRevenue(baseRevenue + overdueTotal);
 
         // 闂ㄥ簵鍒嗘垚閲戦
         long shopFee = 0L;
diff --git a/server/web/src/main/java/com/doumee/api/web/MemberCouponApi.java b/server/web/src/main/java/com/doumee/api/web/MemberCouponApi.java
index af4b87b..cea3fa8 100644
--- a/server/web/src/main/java/com/doumee/api/web/MemberCouponApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/MemberCouponApi.java
@@ -14,6 +14,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Map;
+
 @Slf4j
 @Api(tags = "浼氬憳浼樻儬鍒�")
 @RestController
@@ -35,6 +37,16 @@
     }
 
     @LoginRequired
+    @ApiOperation(value = "寰呴鍙�/寰呬娇鐢ㄦ暟閲�", notes = "瑙掓爣鐢�")
+    @GetMapping("/pendingCount")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<Map<String, Integer>> pendingCount() {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", memberCouponService.findPendingCount(getMemberId()));
+    }
+
+    @LoginRequired
     @ApiOperation(value = "棰嗗彇浼樻儬鍒�", notes = "灏忕▼搴忕")
     @GetMapping("/claim")
     @ApiImplicitParams({
diff --git a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
index 3c79742..e0b60ed 100644
--- a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
+++ b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -202,7 +202,8 @@
                     log.info("閫�娆捐褰曠姸鎬佸凡鏇存柊, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus());
 
                     // 鎵嬪姩閫�娆�(type=4)閫�娆炬垚鍔� 鈫� 鎵ц鎵f
-                    if (Status.SUCCESS.equals(refundStatus) && Constants.equalsInteger(refundRecord.getType(), Constants.FOUR)) {
+                    if (Status.SUCCESS.equals(refundStatus)
+                            && Constants.equalsInteger(refundRecord.getType(), Constants.FOUR)) {
                         try {
                             ordersService.processManualRefundCallback(refundRecord);
                         } catch (Exception ex) {

--
Gitblit v1.9.3