فهرست منبع

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

donglang 4 روز پیش
والد
کامیت
a9c09f8e97

+ 7 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/OrderListResDTO.java

@@ -149,6 +149,13 @@ public class OrderListResDTO {
      * 计费方式
      */
     private Integer chargeType;
+
+
+    /**
+     * 是否需要增派运力(0-否,1-是)
+     */
+    private Integer addVehicles;
+
     /**
      * 装货地址信息
      */

+ 5 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderListResVO.java

@@ -95,6 +95,11 @@ public class OrderListResVO {
      */
     private String sourceLabel;
 
+    /**
+     * 是否需要增派运力(0-否,1-是)
+     */
+    private Integer addVehicles;
+
     /**
      * 合同主键
      */

+ 1 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -1629,6 +1629,7 @@ public class KwoTradeOrderService {
             vo.setWaitEntrustAmount(setScale(getWaitEntrustAmount(e.getAmount(), e.getEntrustAmount())));
             vo.setActualPrice(actualAmount.multiply(unitPrice).setScale(2, RoundingMode.HALF_UP)).setUnitPrice(setScale(e.getUnitPrice())).setPrice(setScale(e.getPrice())).setUnit(e.getUnit()).setUnitLabel(unitType == null ? e.getUnit() : (unitType.get(e.getUnit()) == null ? e.getUnit() : unitType.get(e.getUnit()).getLabel())).setAmount(setScale(vo.getAmount())).setEntrustAmount(setScale(e.getEntrustAmount())).setActualAmount(setScale(e.getActualAmount())).setCreateByName(Objects.isNull(userCache) ? null : userCache.getName());
             vo.setDeliveryTypeLabel(DictEnum.getLabel(DictTypeEnum.LOAD_UNLOAD_WAY.getType(), String.valueOf(e.getChargeType())));
+            vo.setAddVehicles(e.getAddVehicles());
             loadAddress.ifPresent(d -> {
                 vo.setLoadName(d.getName());
                 vo.setLoadAddress(d.getCityName() + " " + d.getDetailAddress());

+ 3 - 1
sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml

@@ -30,6 +30,7 @@
         <result column="unit" property="unit"/>
         <result column="createBy" property="createBy"/>
         <result column="createTime" property="createTime"/>
+        <result column="addVehicles" property="addVehicles"/>
 
         <collection property="loadAddresses" ofType="com.sckw.order.model.dto.LoadAddressDTO">
             <id column="loadAddressId" property="loadAddressId"/>
@@ -73,7 +74,8 @@
         a.remark         AS remark,
         a.unit           AS unit,
         a.create_by      AS createBy,
-        a.create_time    AS createTime
+        a.create_time    AS createTime,
+        a.add_vehicles   AS addVehicles
     </sql>
 
     <select id="tradeOrderSelect" resultMap="mainEntityMap">

+ 7 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java

@@ -148,5 +148,12 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                 .orderByDesc(KwtLogisticsOrder::getId));
     }
 
+    public List<KwtLogisticsOrder> queryByLOrderIdsAndStatus(List<Long> logOrderIds) {
+        return list(Wrappers.<KwtLogisticsOrder>lambdaQuery()
+                .eq(KwtLogisticsOrder::getDelFlag,0)
+                .in(KwtLogisticsOrder::getId, logOrderIds)
+                .eq(KwtLogisticsOrder::getStatus, 10));
+    }
+
 
 }

+ 98 - 49
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtAcceptCarriageOrderService.java

@@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.google.common.collect.Lists;
-import com.mysql.cj.x.protobuf.MysqlxDatatypes;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
 import com.sckw.core.common.enums.StringConstant;
@@ -31,7 +30,6 @@ import com.sckw.excel.utils.DateUtil;
 import com.sckw.excel.utils.ValidUtil;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RTruckVo;
-import com.sckw.fleet.api.model.vo.TmsTruckAxleNumVO;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.manage.api.RemoteManageService;
 import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
@@ -85,6 +83,7 @@ import java.text.DecimalFormat;
 import java.text.ParseException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -3220,24 +3219,12 @@ public class KwtAcceptCarriageOrderService {
         List<KwtLogisticsOrderGoods> savelogOrderGoodsList = Lists.newArrayList();
         List<KwtLogisticsOrderContract> saveContractList = Lists.newArrayList();
         List<KwtLogisticsOrderUnit> savelogOrderUnitList = Lists.newArrayList();
+        List<KwtLogisticsOrderCirculate> savelogOrderCirculateList = Lists.newArrayList();
+        //装卸地之间距离
+        String distance = getDistance(orderDTO);
         //实际派车数 20
         Integer actualDisPatch = orderDTO.getActualDisPatch() == null ? 0 : orderDTO.getActualDisPatch();
         //已派车辆数(累计已分配的车辆数)
-        //装卸地之间距离
-        double distanceKm = LocUtils.calculateDistanceByAmap(
-                Optional.ofNullable(orderDTO.getLoadLng()).map(String::valueOf).orElse(null),
-                Optional.ofNullable(orderDTO.getLoadLat()).map(String::valueOf).orElse(null),
-                Optional.ofNullable(orderDTO.getUnloadLng()).map(String::valueOf).orElse(null),
-                Optional.ofNullable(orderDTO.getUnloadLat()).map(String::valueOf).orElse(null));
-        // 如果高德API调用失败,使用原始方法作为备选
-        if (distanceKm == -1) {
-            distanceKm = DistanceUtils.calculateDistance(
-                    Optional.ofNullable(orderDTO.getLoadLng()).map(Double::valueOf).orElse(null),
-                    Optional.ofNullable(orderDTO.getLoadLat()).map(Double::valueOf).orElse(null),
-                    Optional.ofNullable(orderDTO.getUnloadLng()).map(Double::valueOf).orElse(null),
-                    Optional.ofNullable(orderDTO.getUnloadLat()).map(Double::valueOf).orElse(null));
-        }
-        String distance = String.valueOf(distanceKm);
         Integer dispatched = 0;
         for (LogisticData x : logisticInfo) {
             Long lOrderId = new IdWorker(NumberConstant.ONE).nextId();
@@ -3249,7 +3236,7 @@ public class KwtAcceptCarriageOrderService {
                     break;
                 }
                 //校验物流企业可派车辆
-                List<RTruckVo> signEntAvailableVehicle = getSignEntAvailableVehicle(orderDTO.getGoodsId(), x.getAcceptCompanyId());
+                List<RTruckVo> signEntAvailableVehicle = getSignEntAvailableVehicle(orderDTO, x.getAcceptCompanyId());
                 if (CollectionUtils.isEmpty(signEntAvailableVehicle)) {
                     continue;
                 }
@@ -3280,7 +3267,7 @@ public class KwtAcceptCarriageOrderService {
                 setLogisticUnitInfo(orderDTO, x, lOrderId, savelogOrderUnitList);
 
                 //创建物流派单数据
-                setLogisticCirculateInfo(x, lOrderId, signEntAvailableVehicle);
+                setLogisticCirculateInfo(orderDTO, x, lOrderId, actualUseVehicles, savelogOrderCirculateList);
 
             } else {
                 //物流订单信息
@@ -3300,7 +3287,7 @@ public class KwtAcceptCarriageOrderService {
         }
 
         // 批量保存并检查结果
-        saveBatch(saveLogisticsOrderList, saveAddressList, savelogOrderGoodsList, saveContractList, savelogOrderUnitList, lOrderNo);
+        saveBatch(saveLogisticsOrderList, saveAddressList, savelogOrderGoodsList, saveContractList, savelogOrderUnitList, savelogOrderCirculateList, lOrderNo);
 
         //校验派车总量,处理未达标场景
         int unDispatched = actualDisPatch - dispatched;
@@ -3313,37 +3300,38 @@ public class KwtAcceptCarriageOrderService {
     }
 
     /**
-     * 创建物流派单数据
-     * @param x
-     * @param lOrderId
-     * @param signEntAvailableVehicle
+     * 获取装卸货地之间的导航距离
+     * @param orderDTO
+     * @return
      */
-    private void setLogisticCirculateInfo(LogisticData x, Long lOrderId, List<RTruckVo> signEntAvailableVehicle) {
-        DispatchCarReq req = new DispatchCarReq();
-        req.setEntId(String.valueOf(x.getAcceptCompanyId()));
-        req.setLogisticOrderId(String.valueOf(lOrderId));
-
-        List<DispatchCarReq.CarInfo> carInfoList = signEntAvailableVehicle.stream().map(ve -> {
-            DispatchCarReq.CarInfo carInfo = new DispatchCarReq.CarInfo();
-            carInfo.setTruckId(Optional.ofNullable(ve.getId()).map(String::valueOf).orElse(null));
-            carInfo.setTruckNo(ve.getTruckNo());
-            return carInfo;
-        }).collect(Collectors.toList());
-
-        req.setCarInfos(carInfoList);
-        logisticsConsignmentService.dispatchCar(req);
+    private static String getDistance(AddLogisticOrderDTO orderDTO) {
+        double distanceKm = LocUtils.calculateDistanceByAmap(
+                Optional.ofNullable(orderDTO.getLoadLng()).map(String::valueOf).orElse(null),
+                Optional.ofNullable(orderDTO.getLoadLat()).map(String::valueOf).orElse(null),
+                Optional.ofNullable(orderDTO.getUnloadLng()).map(String::valueOf).orElse(null),
+                Optional.ofNullable(orderDTO.getUnloadLat()).map(String::valueOf).orElse(null));
+        // 如果高德API调用失败,使用原始方法作为备选
+        if (distanceKm == -1) {
+            distanceKm = DistanceUtils.calculateDistance(
+                    Optional.ofNullable(orderDTO.getLoadLng()).map(Double::valueOf).orElse(null),
+                    Optional.ofNullable(orderDTO.getLoadLat()).map(Double::valueOf).orElse(null),
+                    Optional.ofNullable(orderDTO.getUnloadLng()).map(Double::valueOf).orElse(null),
+                    Optional.ofNullable(orderDTO.getUnloadLat()).map(Double::valueOf).orElse(null));
+        }
+        String distance = String.valueOf(distanceKm);
+        return distance;
     }
 
     /**
      * 单个物流企业满足轴数可派车
-     * @param goodId
+     * @param orderDTO
      * @param logEntId
      * @return
      */
-    public List<RTruckVo> getSignEntAvailableVehicle(Long goodId, Long logEntId) {
+    public List<RTruckVo> getSignEntAvailableVehicle(AddLogisticOrderDTO orderDTO, Long logEntId) {
 
         //查询商品轴数
-        KwpGoods goodsById = goodsInfoService.getGoodsById(goodId);
+        KwpGoods goodsById = goodsInfoService.getGoodsById(orderDTO.getGoodsId());
         if (goodsById == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "【创建物流订单】商品信息不能为空!");
         }
@@ -3356,13 +3344,14 @@ public class KwtAcceptCarriageOrderService {
         //过滤满足轴数的车辆
         List<RTruckVo> truckVoFilterList = truckVoList.stream()
                 .filter(Objects::nonNull)
-                .filter(truck -> axleNumStrId.contains(truck.getCarAxis()))
+                .filter(truck -> truck.getCarAxisId() != null)
+                .filter(truck ->    axleNumStrId.contains(String.valueOf(truck.getCarAxisId())))
                 .collect(Collectors.toList());
 
         //过滤满足车辆最大可派任务数的车辆
         return truckVoFilterList.stream().filter(Objects::nonNull)
                 // 过滤已派单且生效中的车辆 + 校验最大可派任务数
-                .filter(this::isTruckAvailable)
+                .filter(truck -> isTruckAvailable(truck, orderDTO.getEntId()))
                 .collect(Collectors.toList());
     }
 
@@ -3372,7 +3361,7 @@ public class KwtAcceptCarriageOrderService {
      * @param truck
      * @return
      */
-    private boolean isTruckAvailable(RTruckVo truck) {
+    private boolean isTruckAvailable(RTruckVo truck, Long entId) {
         // 查询车辆对应的物流订单合同(按车辆编号)
         String truckNo = truck.getTruckNo();
         if (StringUtils.isEmpty(truckNo)) {
@@ -3383,8 +3372,15 @@ public class KwtAcceptCarriageOrderService {
         if (CollectionUtils.isEmpty(circulatesList)) {
             return false;
         }
+        List<Long> lOrderIds = circulatesList.stream().map(KwtLogisticsOrderCirculate::getLOrderId).distinct().collect(Collectors.toList());
+        //查询当前车辆正在运输的物流订单
+        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByLOrderIdsAndStatus(lOrderIds);
+        List<Long> inTransitLOrderIds = logisticsOrders.stream().map(KwtLogisticsOrder::getId).distinct().collect(Collectors.toList());
+        //过滤出正在运输的派车订单数据
+        List<KwtLogisticsOrderCirculate> orderCirculates = circulatesList.stream()
+                .filter(cir -> inTransitLOrderIds.contains(cir.getLOrderId()))
+                .collect(Collectors.toList());
 
-        Long entId = LoginUserHolder.getEntId();
         TruckDispatchCoefficientVO truckDispatchVO = fleetService.findAutoTruckDispatchByEntId(entId);
         if (truckDispatchVO == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
@@ -3395,15 +3391,18 @@ public class KwtAcceptCarriageOrderService {
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "自动派单车辆最大任务数需大于0!");
         }
         //TODO 车辆最大可派任务数校验
-        boolean available = circulatesList.size() < vehicleMaxTasks;
+        boolean available = orderCirculates.size() <= vehicleMaxTasks;
         return available;
 
     }
 
-    private void saveBatch(List<KwtLogisticsOrder> saveLogisticsOrderList, List<KwtLogisticsOrderAddress> saveAddressList, List<KwtLogisticsOrderGoods> savelogOrderGoodsList, List<KwtLogisticsOrderContract> saveContractList, List<KwtLogisticsOrderUnit> savelogOrderUnitList, String lOrderNo) {
-        log.info("开始批量保存物流订单数据,订单数量:{},地址数量:{},商品数量:{},合同数量:{},单位数量:{}",
+    private void saveBatch(List<KwtLogisticsOrder> saveLogisticsOrderList, List<KwtLogisticsOrderAddress> saveAddressList,
+                           List<KwtLogisticsOrderGoods> savelogOrderGoodsList, List<KwtLogisticsOrderContract> saveContractList,
+                           List<KwtLogisticsOrderUnit> savelogOrderUnitList, List<KwtLogisticsOrderCirculate> savelogOrderCirculateList,
+                           String lOrderNo) {
+        log.info("开始批量保存物流订单数据,订单数量:{},地址数量:{},商品数量:{},合同数量:{},单位数量:{}, 派车数量:{}",
                 saveLogisticsOrderList.size(), saveAddressList.size(), savelogOrderGoodsList.size(),
-                saveContractList.size(), savelogOrderUnitList.size());
+                saveContractList.size(), savelogOrderUnitList.size(), savelogOrderCirculateList.size());
 
         try {
             if (!saveLogisticsOrderList.isEmpty()) {
@@ -3446,6 +3445,23 @@ public class KwtAcceptCarriageOrderService {
                 }
             }
 
+            if (!savelogOrderCirculateList.isEmpty()) {
+                boolean result6 = logisticsOrderCirculateRepository.saveBatch(savelogOrderCirculateList);
+                log.info("物流订单派车保存结果:{}", result6);
+                if (!result6) {
+                    throw new BusinessException("物流订单派车保存失败");
+                }
+                //派车成功修改物流订单状态
+                saveLogisticsOrderList.forEach(
+                        logOrder -> logOrder.setStatus(LogisticsOrderV1Enum.IN_TRANSIT.getCode())
+                );
+
+                Boolean updateFlag = logisticsOrderRepository.updateBatchById(saveLogisticsOrderList);
+                if (!updateFlag) {
+                    throw new BusinessException("修改物流订单状态失败");
+                }
+            }
+
             log.info("物流订单批量保存成功,订单编号:{}", lOrderNo);
         } catch (Exception e) {
             log.error("物流订单批量保存失败,订单编号:{},错误信息:{}", lOrderNo, e.getMessage(), e);
@@ -3650,4 +3666,37 @@ public class KwtAcceptCarriageOrderService {
         kwtLogisticsOrder.setDistance(distance);
         saveLogisticsOrderList.add(kwtLogisticsOrder);
     }
+
+    /**
+     * 创建物流派单数据
+     * @param x
+     * @param lOrderId
+     * @param signEntAvailableVehicle
+     */
+    private void setLogisticCirculateInfo(AddLogisticOrderDTO orderDTO, LogisticData x, Long lOrderId,
+                                          List<RTruckVo> signEntAvailableVehicle,
+                                          List<KwtLogisticsOrderCirculate> savelogOrderCirculateList) {
+        for (RTruckVo truckVo : signEntAvailableVehicle) {
+            KwtLogisticsOrderCirculate logisticsOrderCirculate = new KwtLogisticsOrderCirculate();
+            logisticsOrderCirculate.setEntId(x.getAcceptCompanyId());
+            logisticsOrderCirculate.setLOrderId(lOrderId);
+            logisticsOrderCirculate.setTruckId(truckVo.getId());
+            logisticsOrderCirculate.setTruckNo(truckVo.getTruckNo());
+            logisticsOrderCirculate.setDriverId(-9L);
+            Date startDate = Objects.nonNull(orderDTO.getStartTime()) ?
+                    Date.from(orderDTO.getStartTime().atStartOfDay(ZoneId.systemDefault()).toInstant()) : null;
+            logisticsOrderCirculate.setStartTime(startDate);
+            Date endDate = Objects.nonNull(orderDTO.getEndTime()) ?
+                    Date.from(orderDTO.getEndTime().atStartOfDay(ZoneId.systemDefault()).toInstant())  : null;
+            logisticsOrderCirculate.setEndTime(endDate);
+            logisticsOrderCirculate.setUnit(orderDTO.getGoodsUnit());
+            logisticsOrderCirculate.setEntrustAmount(BigDecimal.ZERO);
+            Date date = new Date();
+            logisticsOrderCirculate.setCreateBy(LoginUserHolder.getUserId());
+            logisticsOrderCirculate.setCreateTime(date);
+            logisticsOrderCirculate.setUpdateBy(LoginUserHolder.getUserId());
+            logisticsOrderCirculate.setUpdateTime(date);
+            savelogOrderCirculateList.add(logisticsOrderCirculate);
+        }
+    }
 }