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/service/business/impl/OrdersServiceImpl.java |  202 ++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 155 insertions(+), 47 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 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;
+    }
+
 }

--
Gitblit v1.9.3