Ver Fonte

1、4.2派车;

zk há 1 ano atrás
pai
commit
f17e656632

+ 2 - 2
sckw-common/sckw-common-core/src/main/java/com/sckw/core/filter/RequestCheckFilter.java

@@ -67,8 +67,8 @@ public class RequestCheckFilter implements Filter {
             EXCLUDEPATH.addAll(Arrays.asList(links.split(Global.COMMA)));
         }
 
-        String importLinks = customConfig.getSpecialLinks();
-        if (StringUtils.isNotBlank(importLinks)) {
+        String specialLinks = customConfig.getSpecialLinks();
+        if (StringUtils.isNotBlank(specialLinks)) {
             IMPORT_PASS_PATH.addAll(Arrays.asList(links.split(Global.COMMA)));
         }
 //        String withoutLinks = customConfig.getWithoutLinks();

+ 2 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtWaybillOrderController.java

@@ -156,11 +156,8 @@ public class KwtWaybillOrderController {
      * @date 2023/5/30
      **/
     @PostMapping("/sendCarV1")
-    public HttpResult sendCarV1(@RequestBody @Valid ValiList<SendCarDto1> params){
-        if (CollectionUtils.isEmpty(params)) {
-            return HttpResult.error("请选择委派车辆信息!");
-        }
-        return waybillOrderService.sendCar(params);
+    public HttpResult sendCarV1(@RequestBody @Valid SendCarDto2 params){
+        return waybillOrderService.sendCarV1(params);
     }
 
     /**

+ 3 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderAmountMapper.java

@@ -1,8 +1,10 @@
 package com.sckw.transport.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.model.KwtLogisticsOrderAddress;
 import com.sckw.transport.model.KwtLogisticsOrderAmount;
 import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
 
 /**
  * @author zk
@@ -12,4 +14,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KwtLogisticsOrderAmountMapper extends BaseMapper<KwtLogisticsOrderAmount> {
 
+    List<KwtLogisticsOrderAmount> findByAddress(KwtLogisticsOrderAddress params);
 }

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderAddress.java

@@ -86,6 +86,11 @@ public class KwtWaybillOrderAddress implements Serializable {
      */
     private Integer entryType;
 
+    /**
+     * 计划时间
+     */
+    private Date planTime;
+
     /**
      * 排序(升序)
      */

+ 29 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/SendCarDto2.java

@@ -0,0 +1,29 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import java.util.List;
+
+/**
+ * @author zk
+ * @desc 派车(多装多卸)
+ * @date 2024/3/1 0001
+ */
+@Data
+public class SendCarDto2{
+
+    /**
+     * 派车类型(1 趟次、2 循环)
+     */
+    @JsonProperty("type")
+    @NotNull(message = "派车类型不能为空")
+    private Integer type;
+
+    /**
+     * 车辆司机信息
+     */
+    @JsonProperty("sends")
+    private @Valid List<SendCarInfoDto> sends;
+}

+ 63 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/SendCarEntrustDto.java

@@ -0,0 +1,63 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+
+/**
+ * @author zk
+ * @desc 派车-运输委托信息
+ * @date 2024/3/1 0001
+ */
+@Data
+public class SendCarEntrustDto {
+
+    /**
+     * 物流订单id
+     */
+    @JsonProperty("lOrderId")
+    @NotNull(message = "物流订单ID不能为空")
+    private Long lOrderId;
+
+    /**
+     * 物流订单装卸货地址信息
+     */
+    @JsonProperty("addressId")
+    @NotNull(message = "装卸货地址信息不能为空")
+    private Long addressId;
+
+    /**
+     * 地址类型(1装货地址、2卸货地址)
+     */
+    @JsonProperty("addressType")
+    @NotNull(message = "装卸货地址类型不能为空")
+    private int addressType;
+
+    /**
+     * 计划时间
+     */
+    @JsonProperty("planTime")
+    @JsonFormat(locale="zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @NotNull(message = "计划时间不能为空")
+    private Date planTime;
+
+    /**
+     * 上游给运单委派量
+     */
+    @JsonProperty("entrustAmount")
+    @NotNull(message = "核定载量不能为空")
+    @DecimalMin(value= "0", inclusive=false, message = "核定载量必须等于或大于0")
+    private Double entrustAmount;
+
+    /**
+     * 排序序号
+     */
+    @JsonProperty("sort")
+    @NotNull(message = "排序序号不能为空")
+    private Integer sort;
+}

+ 45 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/SendCarInfoDto.java

@@ -0,0 +1,45 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zk
+ * @desc 派车(多装多卸)
+ * @date 2024/3/1 0001
+ */
+@Data
+public class SendCarInfoDto {
+
+    /**
+     * 司机id
+     */
+    @JsonProperty("driverId")
+    @NotNull(message = "司机信息ID不能为空")
+    private Long driverId;
+
+    /**
+     * 车牌号
+     */
+    @JsonProperty("truckId")
+    @NotNull(message = "车辆信息ID不能为空")
+    private Long truckId;
+
+    /**
+     * 趟次
+     */
+    @JsonProperty("count")
+    @DecimalMin(value= "0", inclusive=false, message = "趟次必须等于或大于0")
+    private Integer count;
+
+    /**
+     * 运输委托信息
+     */
+    @JsonProperty("entrusts")
+    private @Valid List<SendCarEntrustDto> entrusts;
+}

+ 105 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java

@@ -83,6 +83,8 @@ public class KwtWaybillOrderService {
     @Autowired
     KwtLogisticsOrderCirculateMapper logisticsOrderCirculateDao;
     @Autowired
+    KwtLogisticsOrderAmountMapper logisticsOrderAmountDao;
+    @Autowired
     KwtWaybillOrderTicketService waybillOrderTicketService;
     @Autowired
     KwtLogisticsOrderGoodsService kwtLogisticsOrderGoodsService;
@@ -448,6 +450,27 @@ public class KwtWaybillOrderService {
         return HttpResult.ok();
     }
 
+    /**
+     * @param params
+     * @desc 派车-多装多卸
+     * @author zk
+     * @date 2023/7/19
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult sendCarV1(SendCarDto2 params) {
+        /**校验**/
+        HttpResult result = checkWaybillOrderV1(params);
+        if (result.getCode() != HttpStatus.SUCCESS_CODE) {
+            return result;
+        }
+
+
+
+
+        System.out.println(JSON.toJSONString(params));
+        return HttpResult.ok();
+    }
+
     /**
      * @param params         派车请求参数
      * @param logisticsOrder 物流订单
@@ -499,6 +522,88 @@ public class KwtWaybillOrderService {
         return HttpResult.ok(ranksAmount);
     }
 
+    /**
+     * @param params         派车请求参数
+     * @param logisticsOrder 物流订单
+     * @desc 派车校验
+     * @author zk
+     * @date 2023/7/19
+     **/
+    public HttpResult checkWaybillOrderV1(SendCarDto2 params) {
+        /**控制校验**/
+        if (CollectionUtils.isEmpty(params.getSends())) {
+            return HttpResult.error("请选择委派信息!");
+        } else {
+            for (SendCarInfoDto sendCar:params.getSends()) {
+                if (CollectionUtils.isEmpty(sendCar.getEntrusts())) {
+                    return HttpResult.error("请选择委派信息!");
+                }
+            }
+        }
+
+        //车辆司机信息
+        List<SendCarInfoDto> sends = params.getSends();
+        //物流订单ID
+        List<Long> lOrderIds = new ArrayList<>();
+        //物流订单装卸货地址委派量统计
+        Map<Long, BigDecimal> truckTotalEntrustAmount = new HashMap<>(NumberConstant.SIXTEEN);
+        for (SendCarInfoDto sendCar:sends) {
+            //运输委托信息
+            List<SendCarEntrustDto> entrusts = sendCar.getEntrusts();
+            /**数据组装**/
+            entrusts.forEach(e -> {
+                lOrderIds.add(e.getLOrderId());
+                //承运订单该车辆计划运输总量:核定载量 * 趟次
+                BigDecimal entrustAmount = new BigDecimal(e.getEntrustAmount() * sendCar.getCount());
+                if (truckTotalEntrustAmount.get(e.getAddressId()) != null) {
+                    truckTotalEntrustAmount.put(e.getAddressId(), truckTotalEntrustAmount.get(e.getAddressId()).add(entrustAmount));
+                } else {
+                    truckTotalEntrustAmount.put(e.getAddressId(), entrustAmount);
+                }
+            });
+        }
+        List<Long> lOrderIdsList = lOrderIds.stream().distinct().collect(Collectors.toList());
+
+        /**校验物流运单是否可以派车**/
+        for (Long lOrderId:lOrderIdsList) {
+            KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(lOrderId);
+            if (logisticsOrder == null) {
+                return HttpResult.error("订单"+lOrderId+"已不存在!");
+            }
+
+            //状态校验
+            if (logisticsOrder.getStatus() != LogisticsOrderEnum.WAIT_DELIVERY.getCode() && logisticsOrder.getStatus() != LogisticsOrderEnum.IN_TRANSIT.getCode()) {
+                return HttpResult.error("订单" + logisticsOrder.getLOrderNo() + LogisticsOrderEnum.getName(logisticsOrder.getStatus()) + "不能派车!");
+            }
+
+            //剩余可运量校验
+            BigDecimal entrustAmount = logisticsOrder.getEntrustAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getEntrustAmount();
+            BigDecimal subcontractAmount = logisticsOrder.getSubcontractAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getSubcontractAmount();
+            //历史下游司机委派量 + 分包量
+            BigDecimal entrustAmountTotal = entrustAmount.add(subcontractAmount);
+            if (entrustAmountTotal.compareTo(logisticsOrder.getAmount()) > 0) {
+                return HttpResult.error("订单" + logisticsOrder.getLOrderNo() + "剩余可运量已不能派车!");
+            }
+
+            /**校验是车辆委托量否超过物流订单剩余量-趟次**/
+            //物流订单地址委托量信息-装货信息
+            KwtLogisticsOrderAddress queryAmount = new KwtLogisticsOrderAddress();
+            queryAmount.setLOrderId(lOrderId);
+            queryAmount.setAddressType(AddressDefaultTypeEnum.SHIPMENT.getCode());
+            List<KwtLogisticsOrderAmount> logisticsOrderAmounts = logisticsOrderAmountDao.findByAddress(queryAmount);
+            for (KwtLogisticsOrderAmount orderAmount:logisticsOrderAmounts) {
+                BigDecimal truckEntrustAmount = truckTotalEntrustAmount.get(orderAmount.getAddressId());
+                //当前下游司机委派量 + 历史下游司机委派量 + 分包量
+                BigDecimal actualAmount = truckEntrustAmount.add(entrustAmountTotal);
+                if (actualAmount.doubleValue() > orderAmount.getAmount().doubleValue()) {
+                    return HttpResult.error("订单" + logisticsOrder.getLOrderNo() + "累计派车量已大于剩余可运量!");
+                }
+            }
+        }
+
+        return HttpResult.ok(truckTotalEntrustAmount);
+    }
+
     /**
      * @param params         派车请求参数
      * @param logisticsOrder 物流订单

+ 15 - 5
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderAmountMapper.xml

@@ -2,10 +2,20 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sckw.transport.dao.KwtLogisticsOrderAmountMapper">
 
-    <select id="findByAddress" resultType="com.sckw.transport.model.KwtLogisticsOrderAmount" >
-        select * from kwt_logistics_order_amount
-        where del_flag = 0
-        and l_order_id = #{lOrderId, jdbcType=BIGINT}
-        and address_id = #{addressId, jdbcType=BIGINT}
+    <select id="findByAddress" parameterType="com.sckw.transport.model.KwtLogisticsOrderAddress"
+            resultType="com.sckw.transport.model.KwtLogisticsOrderAmount" >
+        select
+        kloa1.id, kloa1.l_order_id lOrderId, kloa1.address_id addressId, kloa1.amount, kloa1.subcontract_amount subcontractAmount,
+        kloa1.entrust_amount entrustAmount, kloa1.load_amount loadAmount, kloa1.unload_amount unloadAmount, kloa1.ignore_amount ignoreAmount,
+        kloa1.load_time loadTime, kloa1.unload_time unloadTime, kloa1.total_load_amount totalLoadAmount, kloa1.total_unload_amount totalUnloadAmount
+        from kwt_logistics_order_amount kloa1
+        left join kwt_logistics_order_address kloa2 on kloa2.id = kloa1.address_id
+        where kloa1.del_flag = 0 and kloa2.del_flag = 0
+        <if test="lOrderId != null and lOrderId !=''">
+            and kloa1.l_order_id = #{lOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="addressType != null and addressType !=''">
+            and kloa2.address_type = #{addressType, jdbcType=INTEGER}
+        </if>
     </select>
 </mapper>