Răsfoiți Sursa

1、车辆运单审核/完成单证接口

zk 2 ani în urmă
părinte
comite
b8f26c16ab

+ 6 - 2
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillEnum.java

@@ -35,9 +35,9 @@ public enum CarWaybillEnum {
      */
     COMPLETION_UNLOADING(7, "completionUnloading", "7", "已卸货"),
     /**
-     * 已核
+     * 已核-通过
      */
-    APPROVAL_COMPLETED(8, "approvalCompleted", "8", "已核单"),
+    APPROVAL_PASS(8, "approvalCompleted", "8", "已核单"),
     /**
      * 拒接单
      */
@@ -50,6 +50,10 @@ public enum CarWaybillEnum {
      * 已撤销
      */
     REVOKED(11, "revoked", "11", "已撤销"),
+    /**
+     * 已核单-不通过
+     */
+    APPROVAL_NO_PASS(12, "revoked", "11", "已撤销"),
     ;
 
     private final Integer code;

+ 7 - 2
sckw-common/sckw-common-mongo/src/main/java/com/sckw/mongo/model/SckwLogisticsOrder.java

@@ -54,6 +54,11 @@ public class SckwLogisticsOrder {
      */
     private String tOrderNo;
 
+    /**
+     * 物流订单类型(1 贸易订单生成物流订单、2 自建物流订单)
+     */
+    private Integer type;
+
     /**
      * 结算周期(周结、月结、季结)
      */
@@ -160,9 +165,9 @@ public class SckwLogisticsOrder {
     private String remark;
 
     /**
-     * 用户状态(0正常、1已锁)
+     * 业务状态
      */
-    private String status = "0";
+    private Integer status;
 
     /**
      * 企业id

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

@@ -202,6 +202,28 @@ public class KwtWaybillOrderController {
         return waybillOrderService.unloading(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 修改单证
+     * @author zk
+     * @date 2023/7/26
+     **/
+    @PostMapping("/editTicket")
+    public HttpResult editTicket(@RequestBody @Valid WaybillOrderTicketDto params){
+        return waybillOrderService.editTicket(params);
+    }
+
+    /**
+     * @param params {}
+     * @desc 单证审核
+     * @author zk
+     * @date 2023/7/26
+     **/
+    @PostMapping("/approvalTicket")
+    public HttpResult approvalTicket(@RequestBody @Valid WaybillOrderApprovalDto params){
+        return waybillOrderService.approvalTicket(params);
+    }
+
 
 
     //取消派车(未接单前)
@@ -210,9 +232,9 @@ public class KwtWaybillOrderController {
     //确认接单-趟次/循环
     //拒绝接单-趟次/循环
     //确认/拒绝出车
-    //到达装货地点 arriveLoadLocation
+    //到达装货地点
     //确认装货
-    //到达卸货地点 arriveUnloadLocation
+    //到达卸货地点
     //确认卸货
     //修改单证
     //单证审核

+ 9 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java

@@ -100,4 +100,13 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      * @return
      */
     OrderFinishVO selectOrderFinishData(@Param("orderId") String orderId);
+
+    /**
+     * @param params {lOrderId 物流订单id}
+     * @desc 查询下级分包物流订单
+     * @author zk
+     * @date 2023/7/20
+     **/
+    List<KwtLogisticsOrder> findLogisticsOrder(Map params);
+
 }

+ 9 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderTicketMapper.java

@@ -3,8 +3,17 @@ package com.sckw.transport.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.transport.model.KwtWaybillOrderTicket;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 @Mapper
 public interface KwtWaybillOrderTicketMapper extends BaseMapper<KwtWaybillOrderTicket> {
 
+    /**
+     * @param wOrderId 车辆订单id
+     * @param type 磅单类型(1装货单/2卸货单)
+     * @desc 查询车辆运单榜单信息
+     * @author zk
+     * @date 2023/7/27
+     **/
+    KwtWaybillOrderTicket findWaybillOrderTicket(@Param("wOrderId") Long wOrderId, @Param("type") Integer type);
 }

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderTicket.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.sckw.core.model.base.BaseModel;
 import lombok.Data;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @author lfdc
@@ -44,4 +45,9 @@ public class KwtWaybillOrderTicket extends BaseModel {
      */
     private String urls;
 
+    /**
+     * 装卸货时间
+     */
+    private Date time;
+
 }

+ 35 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderApprovalDto.java

@@ -0,0 +1,35 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+
+/**
+ * @author zk
+ * @desc 车辆运单审核
+ * @date 2023/7/27 0027
+ */
+@Data
+public class WaybillOrderApprovalDto {
+    /**
+     * 车辆运单id
+     */
+    @JsonProperty("wOrderId")
+    @NotNull(message = "车辆运单ID不能为空")
+    private Long wOrderId;
+
+    /**
+     * 磅单类型(0 审核-通过/1 已核-不通过)
+     */
+     @JsonProperty("status")
+     @NotNull(message = "磅单类型不能为空")
+     private Integer status;
+
+    /**
+     * 备注
+     */
+    @Size(max=100, message = "原因长度不能大于100个字符!")
+    private String remark;
+}

+ 10 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketDto.java

@@ -7,6 +7,7 @@ import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @author zk
@@ -25,10 +26,10 @@ public class WaybillOrderTicketDto {
 
     /**
      * 磅单类型(1装货单/2卸货单)
-
+     */
     @JsonProperty("type")
     @NotNull(message = "磅单类型不能为空")
-    private Integer type;*/
+    private Integer type;
 
     /**
      * 装卸货数量
@@ -57,6 +58,13 @@ public class WaybillOrderTicketDto {
     @NotBlank(message = "凭证不能为空")
     private String urls;
 
+    /**
+     * 装卸货时间
+     */
+    @JsonProperty("time")
+    @NotBlank(message = "时间不能为空")
+    private Date time;
+
     /**
      * 备注
      */

+ 165 - 10
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java

@@ -16,10 +16,7 @@ import com.sckw.mongo.model.SckwWaybillOrder;
 import com.sckw.stream.model.SckwBusSum;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
-import com.sckw.transport.model.dto.OperateWaybillDto;
-import com.sckw.transport.model.dto.OperateSendCarDto;
-import com.sckw.transport.model.dto.SendCarDto1;
-import com.sckw.transport.model.dto.WaybillOrderTicketDto;
+import com.sckw.transport.model.dto.*;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +25,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestBody;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -64,7 +63,7 @@ public class KwtWaybillOrderService {
 
     /**
      * @param params
-     * @desc 派车-趟次
+     * @desc 派车
      * @author zk
      * @date 2023/7/19
      **/
@@ -487,16 +486,21 @@ public class KwtWaybillOrderService {
                         BigDecimal entrustAmount = logisticsOrder.getEntrustAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getEntrustAmount();
                         logisticsOrder.setEntrustAmount(entrustAmount.add(ranksAmount));
                     }
-                    //承运订单:待派车->运输中
+                    /**承运订单:待派车->运输中**/
                     logisticsOrder.setStatus(LogisticsOrderEnum.IN_TRANSIT.getCode());
                     logisticsOrderDao.updateById(order);
 
-                    //承运订单状态记录
+                    /**承运订单状态记录**/
                     KwtLogisticsOrderTrack orderTrack = new KwtLogisticsOrderTrack();
                     orderTrack.setLOrderId(order.getId());
                     orderTrack.setStatus(order.getStatus());
                     orderTrack.setRemark(LogisticsOrderEnum.getName(order.getStatus()));
                     logisticsOrderTrackDao.insert(orderTrack);
+
+                    /**Mongodb数据更新**/
+                    //2承运订单
+                    SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+                    editSckwLogisticsOrder(lOrder, logisticsOrder);
                 }
             }
         }
@@ -622,6 +626,7 @@ public class KwtWaybillOrderService {
         lOrder.set_id(order.getId());
         lOrder.setLOrderId(order.getId());
         lOrder.setEntrustAmount(order.getEntrustAmount());
+        lOrder.setStatus(order.getStatus());
         lOrder.setUpdateTime(order.getUpdateTime());
         lOrder.setUpdateBy(order.getUpdateBy());
         //rabbitMq业务汇总数据发送/消费对象
@@ -1063,7 +1068,7 @@ public class KwtWaybillOrderService {
      * @date 2023/7/26
      **/
     @Transactional(rollbackFor = Exception.class)
-    public HttpResult unloading(@RequestBody @Valid WaybillOrderTicketDto params){
+    public HttpResult unloading(WaybillOrderTicketDto params){
         /**数据校验**/
         KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
         if (waybillOrder == null) {
@@ -1095,13 +1100,17 @@ public class KwtWaybillOrderService {
         /**4更新承运订单entrustAmount**/
         //更新卸货量/卸货时间/亏吨/亏吨扣款
         KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(waybillOrder.getLOrderId());
-        //承运订单卸货量=承运订单原卸货量+当前车辆运单卸货量
+        //承运订单卸货量=承运订单原卸货量+当前车辆运单卸货量
         BigDecimal unloadAmount = logisticsOrder.getUnloadAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getUnloadAmount();
         logisticsOrder.setUnloadAmount(unloadAmount.add(waybillOrder.getUnloadAmount()));
         logisticsOrder.setUnloadTime(waybillOrder.getUpdateTime());
+        //承运订单亏吨量=承运订单装货量-承运订单卸货量
         logisticsOrder.setDeficitAmount(logisticsOrder.getLoadAmount().subtract(logisticsOrder.getUnloadAmount()));
-        logisticsOrder.setDeficitPrice(null);
+        //承运订单亏吨扣款
+        deficitPrice(logisticsOrder);
         logisticsOrderDao.updateById(logisticsOrder);
+        //校验当前承运订单是否运输完成
+        setLogisticsByUnloading(logisticsOrder.getId());
 
         /**5Mongodb数据更新**/
         //1车辆运单
@@ -1116,6 +1125,8 @@ public class KwtWaybillOrderService {
         SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
         lOrder.setUnloadTime(logisticsOrder.getUnloadTime());
         lOrder.setUnloadAmount(logisticsOrder.getUnloadAmount());
+        lOrder.setDeficitAmount(logisticsOrder.getDeficitAmount());
+        lOrder.setDeficitPrice(logisticsOrder.getDeficitPrice());
         editSckwLogisticsOrder(lOrder, logisticsOrder);
 
         /**6发送消息**/
@@ -1123,4 +1134,148 @@ public class KwtWaybillOrderService {
         return HttpResult.ok("装货成功!");
     }
 
+    /**
+     * @param logisticsOrder 物流订单
+     * @desc 计算物流订单亏吨扣款
+     * @author zk
+     * @date 2023/7/27
+     **/
+    public void deficitPrice(KwtLogisticsOrder logisticsOrder) {
+        //承运订单亏吨扣款=(承运订单亏吨量 -(承运订单装货量 * 承运订单合理损耗))* 扣亏货值
+        BigDecimal loadAmount = logisticsOrder.getLoadAmount();
+        BigDecimal deficitAmount = logisticsOrder.getDeficitAmount();
+        BigDecimal loss = logisticsOrder.getLoss() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getLoss();
+        BigDecimal goodsPrice = logisticsOrder.getGoodsPrice() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getGoodsPrice();
+        BigDecimal deficitPrice = deficitAmount.subtract(loadAmount.multiply(loss).setScale(4, RoundingMode.HALF_UP))
+                .multiply(goodsPrice).setScale(4, RoundingMode.HALF_UP);
+        logisticsOrder.setDeficitPrice(deficitPrice);
+    }
+
+    /**
+     * @param lOrderId 承运订单ID
+     * @description 校验当前承运订单是否运输完成
+     * @author zk
+     * @date 2023/7/27
+     **/
+    public void setLogisticsByUnloading(Long lOrderId) {
+        /**
+         校验当前承运订单是否运输完成(虑该当前承运订单上下级物流订单)
+         存在下级分包,下级物流订单和当前物流订单全部运输完成则修改当前物流订单状态为已完成(HAVE_FINISHED)
+         当前物流订单属于分包:需要判断上级及同级分包全部运输完成修改上级物流订单状态为已完成(HAVE_FINISHED)-一直向上到一级物流订单
+         **/
+        //承运单信息
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(lOrderId);
+        /**校验当前承运订单是否运输完成**/
+        if (logisticsOrder.getAmount().compareTo(logisticsOrder.getLoadAmount()) < 0) {
+            return;
+        }
+
+        /**存在下级分包**/
+        BigDecimal subcontractAmount = logisticsOrder.getSubcontractAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getSubcontractAmount();
+        if (subcontractAmount.compareTo(new BigDecimal(Global.AMOUNT)) == 0) {
+            List<KwtLogisticsOrder> logisticsOrders = logisticsOrderDao.findLogisticsOrder(
+                    new HashMap(){{put("upperlOrderId", logisticsOrder.getId()); put("lOrderId", logisticsOrder.getId());}});
+            for (KwtLogisticsOrder logisticsOrder1:logisticsOrders) {
+                if (logisticsOrder1.getStatus() == LogisticsOrderEnum.TO_BE_PLANNED.getCode()
+                        || logisticsOrder1.getStatus() == LogisticsOrderEnum.PENDING_ORDER.getCode()
+                        || logisticsOrder1.getStatus() == LogisticsOrderEnum.WAIT_DELIVERY.getCode()
+                        || logisticsOrder1.getStatus() == LogisticsOrderEnum.IN_TRANSIT.getCode()) {
+                    //下级分包承运订单运输未完成
+                    return;
+                }
+            }
+            /**下级分包承运订单运输完成**/
+            logisticsOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
+            logisticsOrderDao.updateById(logisticsOrder);
+
+            /**承运订单状态记录**/
+            KwtLogisticsOrderTrack orderTrack = new KwtLogisticsOrderTrack();
+            orderTrack.setLOrderId(logisticsOrder.getId());
+            orderTrack.setStatus(logisticsOrder.getStatus());
+            orderTrack.setRemark(LogisticsOrderEnum.getName(logisticsOrder.getStatus()));
+            logisticsOrderTrackDao.insert(orderTrack);
+
+            /**Mongodb数据更新**/
+            //2承运订单
+            SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+            editSckwLogisticsOrder(lOrder, logisticsOrder);
+        }
+
+        /**当前物流订单属于分包(存在上级物流订单)**/
+        //当前承运订单所属分包层级
+        //int level = checkLogisticsLevel(logisticsOrder);
+        String pids = logisticsOrder.getPids();
+        if (StringUtils.isNotBlank(pids)) {
+            String [] idArray = pids.split(",");
+            for (String id : idArray) {
+                KwtLogisticsOrder order = logisticsOrderDao.selectById(id);
+
+            }
+        }
+    }
+
+    /**
+     * @param params {}
+     * @desc 修改单证
+     * @author zk
+     * @date 2023/7/26
+     **/
+    public HttpResult editTicket(WaybillOrderTicketDto params) {
+        /**校验**/
+        KwtWaybillOrderTicket ticket = waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), params.getType());
+        if (ticket == null) {
+            return HttpResult.error("车辆运单榜单信息不存在!");
+        }
+
+        /**更新榜单信息**/
+        BeanUtils.copyProperties(params, ticket);
+        waybillOrderTicketDao.updateById(ticket);
+
+        /**更新承运订单装卸货量**/
+
+        return HttpResult.ok("修改单证成功!");
+    }
+
+    /**
+     * @param params {}
+     * @desc 单证审核
+     * @author zk
+     * @date 2023/7/26
+     **/
+    public HttpResult approvalTicket(WaybillOrderApprovalDto params) {
+        /**数据校验**/
+        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
+        if (waybillOrder == null) {
+            return HttpResult.error("车辆运单不存在!");
+        }
+        //已卸货/审批不通过车辆运单才能审核
+        if (waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_UNLOADING.getCode()
+                && waybillOrder.getStatus() != CarWaybillEnum.APPROVAL_NO_PASS.getCode()) {
+            return HttpResult.error("车辆运单当前状态已不能审核!");
+        }
+        //已卸货/审批不通过车辆运单只能审批通过或审批不通过
+        if (params.getStatus() != Global.NO && params.getStatus() != Global.YES) {
+            return HttpResult.error("车辆运单当前状态只能审批通过或审批不通过!");
+        }
+
+        /**业务处理**/
+        /**1更新车辆运单**/
+        int status = params.getStatus() == Global.NO ? CarWaybillEnum.APPROVAL_PASS.getCode() : CarWaybillEnum.APPROVAL_NO_PASS.getCode();
+        waybillOrder.setStatus(status);
+        waybillOrderDao.updateById(waybillOrder);
+
+        /**2新增运单状态记录**/
+        setWaybillOrderTrack(waybillOrder.getId(), waybillOrder.getStatus(), params.getRemark());
+
+        /**3Mongodb数据更新**/
+        //1车辆运单
+        SckwWaybillOrder wOrder = new SckwWaybillOrder();
+        wOrder.set_id(waybillOrder.getId());
+        editSckwWaybillOrder(wOrder, waybillOrder, 2);
+
+        /**4发送消息**/
+
+        return HttpResult.ok("车辆运单审核完成!");
+    }
+
 }

+ 25 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

@@ -373,4 +373,29 @@
             </if>
         </where>
     </select>
+
+    <select id="findLogisticsOrder" resultType="com.sckw.transport.model.KwtLogisticsOrder" parameterType="java.util.Map" >
+        select
+        id, ent_id entId, t_order_id tOrderId, t_order_no tOrderNo, l_order_no lOrderNo, pid, pids,
+        settlement_cycle settlementCycle, price, price_type priceType, billing_mode billingMode,
+        amount, unit, loss, loss_unit lossUnit, goods_price goodsPrice, goods_price_unit goodsPriceUnit,
+        start_time startTime, end_time endTime, subcontract_amount subcontractAmount, entrust_amount entrustAmount,
+        unload_amount unloadAmount, load_amount loadAmount, ignore_amount ignoreAmount, deficit_amount deficitAmount,
+        deficit_price deficitPrice, payment, tax_rate taxRate, remark, `status`, create_by createBy,
+        create_time createTime, update_by updateBy, update_time updateTime
+        from kwt_logistics_order
+        where del_flag = 0
+        <if test="id != null and id != ''">
+            and id = #{id, jdbcType=BIGINT}
+        </if>
+        <if test="upperlOrderId != null and upperlOrderId != ''">
+            and FIND_IN_SET(#{upperlOrderId, jdbcType=BIGINT}, pids)
+            and id != #{lOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="belowlOrderId != null and belowlOrderId != ''">
+            and FIND_IN_SET(id, #{belowlOrderId, jdbcType=VARCHAR})
+            and id != #{lOrderId, jdbcType=BIGINT}
+        </if>
+
+    </select>
 </mapper>

+ 16 - 1
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderTicketMapper.xml

@@ -9,6 +9,7 @@
         <result column="gross_amount" jdbcType="DECIMAL" property="grossAmount" />
         <result column="tare_amount" jdbcType="DECIMAL" property="tareAmount" />
         <result column="urls" jdbcType="VARCHAR" property="urls" />
+        <result column="time" jdbcType="TIMESTAMP" property="time" />
         <result column="remark" jdbcType="VARCHAR" property="remark" />
         <result column="status" jdbcType="INTEGER" property="status" />
         <result column="create_by" jdbcType="BIGINT" property="createBy" />
@@ -18,8 +19,22 @@
         <result column="del_flag" jdbcType="INTEGER" property="delFlag" />
     </resultMap>
     <sql id="Base_Column_List">
-        id, w_order_id, `type`, amount, gross_amount, tare_amount, urls, remark, `status`,
+        id, w_order_id, `type`, amount, gross_amount, tare_amount, urls, time, remark, `status`,
         create_by, create_time, update_by, update_time, del_flag
     </sql>
 
+    <select id="findWaybillOrderTicket" resultType="com.sckw.transport.model.KwtWaybillOrderTicket" >
+        select
+        id, w_order_id wOrderId, `type`, amount, gross_amount grossAmount, tare_amount tareAmount,
+        urls, time, remark, `status`, create_by createBy, create_time createTime, update_by updateBy,
+        update_time updateTime
+        from kwt_waybill_order_ticket
+        where del_flag = 0
+        <if test="wOrderId != null and wOrderId != ''">
+            and w_order_id != #{wOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="type != null and type != ''">
+            and type != #{type, jdbcType=INTEGER}
+        </if>
+    </select>
 </mapper>