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