From 7ee466ebc953bb5640bcf42f2b8e2a87aa471c21 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 15 四月 2026 20:12:21 +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/PricingRuleServiceImpl.java |  138 +++++++++++++++++++++++++++++++--------------
 1 files changed, 94 insertions(+), 44 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
index 81bb4b4..189a914 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
@@ -34,6 +34,8 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -381,63 +383,111 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void saveEstimatedDelivery(EstimatedDeliverySaveDTO request) {
-        // 鏌ヨ宸叉湁瑙勫垯 type=2, fieldA=1, cityId, deleted=0
-        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
-        qw.lambda()
-                .eq(PricingRule::getType, Constants.TWO)
-                .eq(PricingRule::getFieldA, "1")
-                .eq(PricingRule::getCityId, request.getCityId())
-                .eq(PricingRule::getDeleted, Constants.ZERO)
-                .last("limit 1");
-        PricingRule existing = pricingRuleMapper.selectOne(qw);
-
+        if (request.getItems() == null || request.getItems().isEmpty()) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃舵晥閰嶇疆鍒楄〃涓嶈兘涓虹┖");
+        }
         Date now = new Date();
-        if (existing != null) {
-            // 鏇存柊
-            existing.setFieldB(request.getStartDistance());
-            existing.setFieldC(request.getStartTime());
-            existing.setFieldD(request.getContinueDistance());
-            existing.setFieldE(request.getContinueTime());
-            existing.setUpdateTime(now);
-            pricingRuleMapper.updateById(existing);
-        } else {
-            // 鏂板
-            PricingRule rule = new PricingRule();
-            rule.setType(Constants.TWO);
-            rule.setFieldA("1");
-            rule.setFieldB(request.getStartDistance());
-            rule.setFieldC(request.getStartTime());
-            rule.setFieldD(request.getContinueDistance());
-            rule.setFieldE(request.getContinueTime());
-            rule.setCityId(request.getCityId());
-            rule.setDeleted(Constants.ZERO);
-            rule.setCreateTime(now);
-            rule.setUpdateTime(now);
-            pricingRuleMapper.insert(rule);
+        for (EstimatedDeliverySaveDTO.EstimatedDeliveryItem item : request.getItems()) {
+            // 鏌ヨ宸叉湁瑙勫垯 type=2, fieldA, cityId, deleted=0
+            QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+            qw.lambda()
+                    .eq(PricingRule::getType, Constants.TWO)
+                    .eq(PricingRule::getFieldA, String.valueOf(item.getFieldA()))
+                    .eq(PricingRule::getCityId, request.getCityId())
+                    .eq(PricingRule::getDeleted, Constants.ZERO)
+                    .last("limit 1");
+            PricingRule existing = pricingRuleMapper.selectOne(qw);
+
+            if (existing != null) {
+                existing.setFieldB(item.getStartDistance());
+                existing.setFieldC(item.getStartTime());
+                existing.setFieldD(item.getContinueDistance());
+                existing.setFieldE(item.getContinueTime());
+                existing.setUpdateTime(now);
+                pricingRuleMapper.updateById(existing);
+            } else {
+                PricingRule rule = new PricingRule();
+                rule.setType(Constants.TWO);
+                rule.setFieldA(String.valueOf(item.getFieldA()));
+                rule.setFieldB(item.getStartDistance());
+                rule.setFieldC(item.getStartTime());
+                rule.setFieldD(item.getContinueDistance());
+                rule.setFieldE(item.getContinueTime());
+                rule.setCityId(request.getCityId());
+                rule.setDeleted(Constants.ZERO);
+                rule.setCreateTime(now);
+                rule.setUpdateTime(now);
+                pricingRuleMapper.insert(rule);
+            }
         }
     }
 
     @Override
-    public EstimatedDeliveryVO getEstimatedDelivery(Integer cityId) {
+    public List<EstimatedDeliveryVO> getEstimatedDelivery(Integer cityId) {
         QueryWrapper<PricingRule> qw = new QueryWrapper<>();
         qw.lambda()
                 .eq(PricingRule::getType, Constants.TWO)
-                .eq(PricingRule::getFieldA, "1")
+                .in(PricingRule::getFieldA, "1", "2")
+                .eq(PricingRule::getCityId, cityId)
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .orderByAsc(PricingRule::getFieldA);
+        List<PricingRule> rules = pricingRuleMapper.selectList(qw);
+
+        // 灏嗗凡鏈夎鍒欐寜fieldA鍒嗙粍
+        Map<String, PricingRule> ruleMap = new HashMap<>();
+        for (PricingRule rule : rules) {
+            ruleMap.put(rule.getFieldA(), rule);
+        }
+
+        // 鍥哄畾杩斿洖2鏉★細fieldA=1(鏍囬�熻揪), fieldA=2(鏋侀�熻揪)锛屾棤鏁版嵁鏃惰繑鍥炵┖瀵硅薄
+        List<EstimatedDeliveryVO> voList = new ArrayList<>();
+        for (int fieldA = 1; fieldA <= 2; fieldA++) {
+            EstimatedDeliveryVO vo = new EstimatedDeliveryVO();
+            vo.setCityId(cityId);
+            vo.setFieldA(fieldA);
+            PricingRule rule = ruleMap.get(String.valueOf(fieldA));
+            if (rule != null) {
+                vo.setPricingRuleId(rule.getId());
+                vo.setStartDistance(rule.getFieldB());
+                vo.setStartTime(rule.getFieldC());
+                vo.setContinueDistance(rule.getFieldD());
+                vo.setContinueTime(rule.getFieldE());
+            }
+            voList.add(vo);
+        }
+        return voList;
+    }
+
+    @Override
+    public BigDecimal calculateEstimatedTime(Integer cityId, Integer fieldA, BigDecimal distance) {
+        if (cityId == null || fieldA == null || distance == null) {
+            return null;
+        }
+        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(PricingRule::getType, Constants.TWO)
+                .eq(PricingRule::getFieldA, String.valueOf(fieldA))
                 .eq(PricingRule::getCityId, cityId)
                 .eq(PricingRule::getDeleted, Constants.ZERO)
                 .last("limit 1");
         PricingRule rule = pricingRuleMapper.selectOne(qw);
-
-        EstimatedDeliveryVO vo = new EstimatedDeliveryVO();
-        vo.setCityId(cityId);
-        if (rule != null) {
-            vo.setPricingRuleId(rule.getId());
-            vo.setStartDistance(rule.getFieldB());
-            vo.setStartTime(rule.getFieldC());
-            vo.setContinueDistance(rule.getFieldD());
-            vo.setContinueTime(rule.getFieldE());
+        if (rule == null) {
+            return null;
         }
-        return vo;
+        // fieldB=璧烽�侀噷绋�, fieldC=璧烽�佹椂闀�, fieldD=缁�侀噷绋�, fieldE=缁�佹椂闀�
+        BigDecimal startDistance = new BigDecimal(rule.getFieldB());
+        BigDecimal startTime = new BigDecimal(rule.getFieldC());
+        BigDecimal continueDistance = new BigDecimal(rule.getFieldD());
+        BigDecimal continueTime = new BigDecimal(rule.getFieldE());
+
+        // 璺濈 <= 璧烽�侀噷绋� 鈫� 鐩存帴杩斿洖璧烽�佹椂闀�
+        if (distance.compareTo(startDistance) <= 0) {
+            return startTime;
+        }
+        // 瓒呭嚭閮ㄥ垎锛氬悜涓婂彇鏁� * 缁�佹椂闀� + 璧烽�佹椂闀�
+        BigDecimal extraDistance = distance.subtract(startDistance);
+        BigDecimal extraCount = extraDistance.divide(continueDistance, 0, RoundingMode.CEILING);
+        return startTime.add(extraCount.multiply(continueTime));
     }
 
     @Override

--
Gitblit v1.9.3