Răsfoiți Sursa

修改自动派车的贸易订单审核bug

donglang 4 zile în urmă
părinte
comite
ba34e105f3

+ 2 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java

@@ -864,7 +864,8 @@ public class DateUtils extends DateUtil {
         LocalDate end = endTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 
         // 计算日历天数差
-        return java.time.temporal.ChronoUnit.DAYS.between(start, end);
+        long daysDiff = java.time.temporal.ChronoUnit.DAYS.between(start, end);
+        return daysDiff + 1;
     }
 
     /**

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -431,7 +431,7 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         if (CollectionUtils.isEmpty(contractLogisticsUnits)) {
             return null;
         }
-        List<Long> contractIds = contractLogisticsUnits.stream().map(KwcContractLogisticsUnit::getContractId).distinct().collect(Collectors.toList());
+        Set<Long> contractIds = contractLogisticsUnits.stream().map(KwcContractLogisticsUnit::getContractId).collect(Collectors.toSet());
 
         //查询自动派车且有效的物流合同
         List<KwcContractLogistics> kwcContractLogistics = contractLogisticsRepository.queryByIdsAndDispatch(contractIds);

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java

@@ -118,7 +118,7 @@ public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogis
     }
 
 
-    public List<KwcContractLogistics> queryByIdsAndDispatch(List<Long> ids) {
+    public List<KwcContractLogistics> queryByIdsAndDispatch(Set<Long> ids) {
         return list(Wrappers.<KwcContractLogistics>lambdaQuery()
                 .in(KwcContractLogistics::getId, ids)
                 .eq(KwcContractLogistics::getDispatchWay, 2)

+ 42 - 22
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -2191,40 +2191,60 @@ public class KwcContractTradeService {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "商品id不能为空!");
         }
 
-        //查询供应商企业物流合同信息
+        //1. 查询供应商企业物流合同关联的unit信息
         List<KwcContractLogisticsUnit> contractLogisticsUnits = kwcContractLogisticsUnitRepository.queryByEntIdAndType(entId);
         if (CollectionUtils.isEmpty(contractLogisticsUnits)) {
             return Collections.emptyList();
         }
         Set<Long> unitContractIds = contractLogisticsUnits.stream().map(KwcContractLogisticsUnit::getContractId).collect(Collectors.toSet());
 
-        //查询物流商品合同信息
-        List<KwcContractLogisticsGoods> contractLogisticsGoods = kwcContractLogisticsGoodsRepository.queryByContractIds(unitContractIds);
-        if (CollectionUtils.isEmpty(contractLogisticsGoods)) {
+        //2. 查询自动派车物流合同信息
+        List<KwcContractLogistics> contractLogisticsList = contractLogisticsRepository.queryByIdsAndDispatch(unitContractIds);
+        if (CollectionUtils.isEmpty(contractLogisticsList)) {
             return Collections.emptyList();
         }
-        Map<Long, List<KwcContractLogisticsGoods>> logisticsGoodsMap = contractLogisticsGoods.stream().collect(Collectors.groupingBy(KwcContractLogisticsGoods::getContractId));
-        List<Long> contractIdList = new ArrayList<>();
-        //校验合同里是否都包含贸易合同里的商品
-        for (Map.Entry<Long, List<KwcContractLogisticsGoods>> entry : logisticsGoodsMap.entrySet()) {
-            Long contractId = entry.getKey();
-            List<KwcContractLogisticsGoods> logisticsGoodList = entry.getValue();
-            if (CollectionUtils.isEmpty(logisticsGoodList)) {
-                continue;
+
+        // 3. 拆分合同:通用价格>0的直接保留,通用价格=0的需要校验商品id
+        List<Long> validContractIds = new ArrayList<>();
+        List<Long> needCheckGoodsContractIds = new ArrayList<>();
+
+        for (KwcContractLogistics contractLogistics : contractLogisticsList) {
+            if (contractLogistics.getCommonPrice().compareTo(BigDecimal.ZERO) > 0) {
+                //通用价格大于0,无需校验goodsIds
+                validContractIds.add(contractLogistics.getId());
+            } else {
+                // 通用价格=0,需要校验商品
+                needCheckGoodsContractIds.add(contractLogistics.getId());
             }
-            //提取当前合同下的所有商品ID
-            Set<Long> currentGoodsIds  = logisticsGoodList.stream().map(KwcContractLogisticsGoods::getGoodsId).filter(Objects::nonNull).collect(Collectors.toSet());
-            boolean isContains = goodsIds.stream().allMatch(currentGoodsIds::contains);
-            if (isContains) {
-                contractIdList.add(contractId);
+        }
+
+        // 4. 处理需要校验商品的合同ID
+        if (CollectionUtils.isNotEmpty(needCheckGoodsContractIds)) {
+            //查询物流商品合同信息
+            List<KwcContractLogisticsGoods> contractLogisticsGoods = kwcContractLogisticsGoodsRepository.queryByContractIds(unitContractIds);
+            if (CollectionUtils.isNotEmpty(contractLogisticsGoods)) {
+                // 按合同ID分组商品信息
+                Map<Long, List<KwcContractLogisticsGoods>> logisticsGoodsMap = contractLogisticsGoods.stream().collect(Collectors.groupingBy(KwcContractLogisticsGoods::getContractId));
+                for (Long contractId : needCheckGoodsContractIds) {
+                    List<KwcContractLogisticsGoods> logisticsGoodList = logisticsGoodsMap.get(contractId);
+                    // 提取当前合同下的所有商品ID
+                    Set<Long> currentGoodsIds = logisticsGoodList.stream().map(KwcContractLogisticsGoods::getGoodsId).filter(Objects::nonNull).collect(Collectors.toSet());
+                    // 校验目标商品ID是否全部包含
+                    boolean isContains = goodsIds.stream().allMatch(currentGoodsIds::contains);
+                    if (isContains) {
+                        validContractIds.add(contractId);
+                    }
+                }
             }
         }
-        if (CollectionUtils.isEmpty(contractIdList)) {
+        if (CollectionUtils.isEmpty(validContractIds)) {
             return Collections.emptyList();
         }
-        //查询自动派车物流合同
-        List<KwcContractLogistics> contractLogisticsList = contractLogisticsRepository.queryByIdsAndDispatch(contractIdList);
-        return toLogisticsEntDtoVO(entId, contractLogisticsList);
+        List<KwcContractLogistics> finalContractList = contractLogisticsList.stream()
+                .filter(contract -> validContractIds.contains(contract.getId()))
+                .collect(Collectors.toList());
+
+        return toLogisticsEntDtoVO(entId, finalContractList);
     }
 
     /**
@@ -2308,7 +2328,7 @@ public class KwcContractTradeService {
         //查询物流商品合同信息
         KwcContractLogisticsGoods goods = kwcContractLogisticsGoodsRepository.queryByContractIdAndGoodId(contractId, goodsId);
         if (goods == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "当前物流合同商品信息不存在!");
+            return new LogisticsGoodsDto();
         }
         LogisticsGoodsDto dto = new LogisticsGoodsDto();
         dto.setGoodsId(goods.getGoodsId());

+ 1 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -565,7 +565,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     public TruckDispatchCoefficientVO findAutoTruckDispatchByEntId(Long entId) {
         KwfTruckDispatchCoefficient result = truckDispatchCoefficientRepository.findAutoTruckDispatchByEntId(entId);
         if (result == null) {
-            return new TruckDispatchCoefficientVO();
+            return null;
         }
 
         TruckDispatchCoefficientVO rulesVO = new TruckDispatchCoefficientVO();

+ 15 - 10
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -2254,7 +2254,7 @@ public class KwoTradeOrderService {
             addLogisticOrderParam.setDispatchWay(DispatchWayEnums.AUTO_DISPATCH.getCode());
 
             //实际派车数
-            Integer actualDisPatch = getActualDisPatch(kwoTradeOrder, addressList);
+            Integer actualDisPatch = getActualDisPatch(kwoTradeOrder, unitMap, addressList);
             addLogisticOrderParam.setActualDisPatch(actualDisPatch);
 
         } else if (Objects.equals(tradeContractResDto.getConsignment(), 2)) {
@@ -2407,15 +2407,18 @@ public class KwoTradeOrderService {
 
     @NotNull
     private List<LogisticsEntDtoVO> checkAutoContractLogOrder(Map<String, KwoTradeOrderUnit> unitMap, KwoTradeOrderGoods byOrderId, TradeContractResDto tradeContractResDto) {
-        List<LogisticsEntDtoVO> validContractLog;
         KwoTradeOrderUnit tradeOrderUnit = unitMap.get(String.valueOf(Global.NUMERICAL_TWO));
         //查询满足自动派单的物流合同
         List<LogisticsEntDtoVO> contractLogisticsList = remoteContractService.queryAutoContractLogOrder(tradeOrderUnit.getEntId(), Lists.newArrayList(byOrderId.getId()));
-        validContractLog = contractLogisticsList.stream().filter(Objects::nonNull).filter(log -> log.getStartTime() != null && log.getEndTime() != null).filter(log -> {
-            boolean startTimeOk = log.getStartTime().after(tradeContractResDto.getStartTime());
-            boolean endTimeOk = tradeContractResDto.getEndTime() == null || log.getEndTime().before(tradeContractResDto.getEndTime());
-            return startTimeOk && endTimeOk;
-        }).collect(Collectors.toList());
+        List<LogisticsEntDtoVO> validContractLog = contractLogisticsList.stream().filter(Objects::nonNull)
+                .filter(log -> log.getStartTime() != null)
+                .filter(log -> {
+                    // 开始时间:物流合同开始时间 ≥ 贸易合同开始时间
+                    boolean startTimeOk = !log.getStartTime().before(tradeContractResDto.getStartTime());
+                    // 结束时间:物流合同开始时间 <= 贸易合同开始时间
+                    boolean endTimeOk = log.getEndTime() == null || tradeContractResDto.getEndTime() == null || !log.getEndTime().after(tradeContractResDto.getEndTime());
+                    return startTimeOk && endTimeOk;
+                }).collect(Collectors.toList());
         if (CollectionUtils.isEmpty(validContractLog)) {
             throw new BusinessException("未找到该商品有效的自动派车物流合同,请先签订自动派车物流合同");
         }
@@ -2438,14 +2441,16 @@ public class KwoTradeOrderService {
      * @param addressList
      * @return
      */
-    public Integer getActualDisPatch(KwoTradeOrder tradeOrder, List<KwoTradeOrderAddress> addressList) {
-        TruckDispatchCoefficientVO truckDispatchVO = remoteFleetService.findAutoTruckDispatchByEntId(tradeOrder.getEntId());
+    public Integer getActualDisPatch(KwoTradeOrder tradeOrder, Map<String, KwoTradeOrderUnit> unitMap, List<KwoTradeOrderAddress> addressList) {
+        //获取供应企业id
+        KwoTradeOrderUnit tradeOrderUnit = unitMap.get(String.valueOf(Global.NUMERICAL_TWO));
+        TruckDispatchCoefficientVO truckDispatchVO = remoteFleetService.findAutoTruckDispatchByEntId(tradeOrderUnit.getEntId());
         if (truckDispatchVO == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
         }
         ActualDisPatchDto dto = new ActualDisPatchDto();
         dto.setTradeOrderId(tradeOrder.getId());
-        dto.setEntId(tradeOrder.getEntId());
+        dto.setEntId(tradeOrderUnit.getEntId());
         dto.setStartTime(tradeOrder.getStartTime());
         dto.setEndTime(tradeOrder.getEndTime());
         dto.setAmount(tradeOrder.getAmount());

+ 2 - 2
sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteSystemServiceImpl.java

@@ -1071,13 +1071,13 @@ public class RemoteSystemServiceImpl implements RemoteSystemService {
         BigDecimal totalTimeBig = new BigDecimal(totalTransportationTime);
         BigDecimal singleTripBig = new BigDecimal(singleTripTotalTimes);
         BigDecimal roundTripBig = totalTimeBig.divide(singleTripBig, 2, RoundingMode.HALF_UP);
-        Integer maxRoundTripTimes = roundTripBig.setScale(0, RoundingMode.FLOOR).intValue();
+        Integer maxRoundTripTimes = roundTripBig.setScale(0, RoundingMode.CEILING).intValue();
 
         //单车总运量 = 车辆平均载重 X 单车最大往返次数
         int totalVehicle = vehicleAvgLoad * maxRoundTripTimes;
         BigDecimal totalVehicleBig = new BigDecimal(totalVehicle);
         //所需车辆数 = 订单总量/单车总运量
-        BigDecimal vehiclesNum = dto.getAmount().multiply(totalVehicleBig);
+        BigDecimal vehiclesNum = dto.getAmount().divide(totalVehicleBig, 0, RoundingMode.CEILING);
 
         //实际派车 = 所需车辆数 X 缓冲系数(向上取整)
         BigDecimal actualVehicleBig = vehiclesNum.multiply(bufferCoefficient);