Преглед изворни кода

1.新增销售报表接口
2.修改运单过磅逻辑

donglang пре 1 месец
родитељ
комит
d30a408933

+ 5 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/ForkliftStatusEnum.java

@@ -29,6 +29,11 @@ public enum ForkliftStatusEnum {
      */
     COMPLETED(10, "已装载"),
 
+    /**
+     * 已取消
+     */
+    CANCEL(99, "已装载"),
+
     ;
 
     private final Integer code;

+ 5 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/GatekeeperStatusEnum.java

@@ -44,6 +44,11 @@ public enum GatekeeperStatusEnum {
      */
     EMPTY_EXITED(25, "空载离场"),
 
+    /**
+     * 取消
+     */
+    CANCEL(99, "取消"),
+
     ;
 
     private final Integer code;

+ 55 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppSalesWayBillController.java

@@ -0,0 +1,55 @@
+package com.sckw.transport.controller.enterpriseApp;
+
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.transport.model.param.SalesWaybillOrderQueryParam;
+import com.sckw.transport.model.param.SalesWaybillOrderResp;
+import com.sckw.transport.service.KwtLogisticsConsignmentService;
+import com.sckw.transport.service.KwtWaybillManagementService;
+import com.sckw.transport.service.KwtWaybillManagementV1Service;
+import com.sckw.transport.service.app.SalesWaybillOrderService;
+import io.swagger.v3.oas.annotations.Operation;
+import jakarta.validation.Valid;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author jc
+ * @description 企业端app运单controller
+ * @date 2023-08-21 16:08:41
+ */
+@Slf4j
+@RestController
+@RequestMapping("/appSalesWaybill")
+public class AppSalesWayBillController {
+
+    @Autowired
+    KwtWaybillManagementService waybillManagementService;
+    @Autowired
+    KwtWaybillManagementV1Service waybillManagementV1Service;
+    @Autowired
+    KwtLogisticsConsignmentService logisticsConsignmentService;
+    @Autowired
+    SalesWaybillOrderService salesWaybillOrderService;
+
+
+    /**
+     * 分页查询运单
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "分页查询运单", description = "查询司机关联车辆接单的运单")
+    @PostMapping("/querySalesStatistics")
+    public BaseResult<SalesWaybillOrderResp> querySalesStatistics(@RequestBody @Valid SalesWaybillOrderQueryParam param){
+        SalesWaybillOrderResp salesWaybillOrderResp = salesWaybillOrderService.querySalesStatistics(param);
+        return BaseResult.success(salesWaybillOrderResp);
+    }
+
+
+
+}
+

+ 22 - 9
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java

@@ -4,22 +4,16 @@ package com.sckw.transport.handler;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.model.enums.GatekeeperStatusEnum;
+import com.sckw.core.model.enums.GatekeeperTypeEnum;
 import com.sckw.core.utils.DateUtils;
-import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.order.api.model.OrderDetailVo;
 import com.sckw.order.api.model.UpdateActualAmountParam;
-import com.sckw.transport.model.KwtLogisticsOrder;
-import com.sckw.transport.model.KwtWaybillOrder;
-import com.sckw.transport.model.KwtWaybillOrderNode;
-import com.sckw.transport.model.KwtWaybillOrderSubtask;
+import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.WaybillOrderCancelParam;
-import com.sckw.transport.repository.KwtLogisticsOrderRepository;
-import com.sckw.transport.repository.KwtWaybillOrderRepository;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboReference;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -66,6 +60,10 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
 
         //4.更新上游订单:更新贸易订单运输量
 //        updateTradeOrder(logOrder, entrustAmount);
+
+        //5.取消门卫订单
+        cancelGatekeeperStatus(waybill);
+
     }
 
     /**
@@ -122,6 +120,21 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
         log.info("更新上游贸易订单运输量成功, 贸易订单ID:{}", tradeOrder.getId());
     }
 
+
+    /**
+     * 取消门卫订单
+     * @param waybill
+     */
+    private void cancelGatekeeperStatus(KwtWaybillOrder waybill) {
+        KwtGatekeeperWaybillOrder gatekeeperWaybillOrder = gatekeeperWaybillOrderRepository
+                .queryGatekeeperWaybillOrderByWOrderId(waybill.getId(), GatekeeperTypeEnum.LOADING.getCode());
+        if (gatekeeperWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "门卫订单不存在!");
+        }
+        gatekeeperWaybillOrder.setStatus(GatekeeperStatusEnum.CANCEL.getCode());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeperWaybillOrder);
+    }
+
     @Override
     protected String getProcessName() {
         return "取消接单";

+ 21 - 11
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -39,9 +39,6 @@ import java.util.stream.Collectors;
 @Service
 public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCmeIntoWeighParam> {
 
-    //用于存储动态状态
-    private Integer targetStatus;
-
     @Override
     protected KwtWaybillOrder getWaybillOrder(WaybillOrderCmeIntoWeighParam param) {
         return getWaybillOrder(param.getWaybillOrderId());
@@ -281,8 +278,8 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
     //
 
     /**
-     * 计算并设定离场目标状态
-     *                      空载离场:净重<=0.5,        状态更改为:空载待离场
+     * 计算并设定离场目标状态   其它情况:净重<-0.5          状态更改为:直接返回
+     *                      空载离场:-0.5<=净重<=0.5,  状态更改为:空载待离场
      *                      正常流程:0.5<净重<=任务量,  状态更改为:待离场
      *                      超载流程:净重>任务量,       状态更改为:卸货中
      * @param waybillOrder
@@ -294,11 +291,21 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         if (waybillSubtask.getEntrustAmount() == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[称重过磅]子运单任务量信息缺失!");
         }
-        BigDecimal entrustAmount = waybillSubtask.getEntrustAmount();
 
-        //场景一:空载离场,净重<=0.5
+        KwtForkliftWaybillOrder forklift = forkliftWaybillOrderRepository.queryForkliftWaybillOrderByWOrderId(waybillOrder.getId());
+        if (Objects.equals(forklift.getStatus(), ForkliftStatusEnum.ORDER_TAKING.getCode())) {
+            //如果铲车司机未接单,则二次过磅的时候,直接返回,不走其它流程
+            return;
+        }
+
+        BigDecimal entrustAmount = waybillSubtask.getEntrustAmount();
+        //场景一:净重<-0.5
+        if (loadAmount.compareTo(BigDecimal.valueOf(-0.5)) < 0) {
+            return;
+        }
+        //场景二:空载离场,-0.5<=净重<=0.5
         if (loadAmount.compareTo(BigDecimal.valueOf(0.5)) <= 0) {
-            this.targetStatus = 1;
+            waybillOrder.setTargetStatus(1);
             return;
         }
         // 非空载情况,必须校验是否完成装载
@@ -306,11 +313,11 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
 
         // 场景二:正常流程,0.5<净重<=任务量
         if (loadAmount.compareTo(entrustAmount) <= 0) {
-            this.targetStatus = 2;
+            waybillOrder.setTargetStatus(2);
             return;
         }
         // 场景三:超载流程, 净重>任务量
-        this.targetStatus = 3;
+        waybillOrder.setTargetStatus(3);
     }
 
     /**
@@ -335,7 +342,10 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         if (checkIsFirst(waybillOrder)) {
             status = CarWaybillV1Enum.REFUSE_TRAFFIC.getCode();
         } else {
-            status = switch (this.targetStatus) {
+            if (waybillOrder.getTargetStatus() == null) {
+                return;
+            }
+            status = switch (waybillOrder.getTargetStatus()) {
                 case 1 -> CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode();
                 case 2 -> CarWaybillV1Enum.WAIT_LEAVE.getCode();
                 case 3 -> CarWaybillV1Enum.UNLOADING.getCode();

+ 24 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/EmptyLoadLeaveHandler.java

@@ -4,9 +4,8 @@ package com.sckw.transport.handler;
 import com.alibaba.fastjson.JSON;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
-import com.sckw.core.model.enums.CarWaybillV1Enum;
-import com.sckw.core.model.enums.GatekeeperStatusEnum;
-import com.sckw.core.model.enums.GatekeeperTypeEnum;
+import com.sckw.core.model.enums.*;
+import com.sckw.transport.model.KwtForkliftWaybillOrder;
 import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
@@ -45,6 +44,10 @@ public class EmptyLoadLeaveHandler extends AbstractWaybillOrderHandler<WaybillOr
 
         // 修改门卫数据状态:待放行
         updateGatekeeperOrderStatus(waybillOrder);
+
+        // 校验铲车订单是否是待接单
+        updateForkliftOrderStatus(waybillOrder);
+
     }
 
 
@@ -68,6 +71,24 @@ public class EmptyLoadLeaveHandler extends AbstractWaybillOrderHandler<WaybillOr
         gatekeeperWaybillOrderRepository.updateById(gatekeeper);
     }
 
+    /**
+     * 修改门卫订单状态
+     * @param waybillOrder
+     * @return
+     */
+    public void updateForkliftOrderStatus(KwtWaybillOrder waybillOrder) {
+        KwtForkliftWaybillOrder forkliftWaybillOrder = forkliftWaybillOrderRepository
+                .queryForkliftWaybillOrderByWOrderIdAndType(waybillOrder.getId(), LoadingTypeEnum.LOADING.getCode());
+        if (forkliftWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "铲车订单数据不存在!");
+        }
+        // 司机空载离场,铲车待接单的状态改为:取消
+        if (ForkliftStatusEnum.PENDING_ORDERS.getCode().equals(forkliftWaybillOrder.getStatus())) {
+            forkliftWaybillOrder.setStatus(ForkliftStatusEnum.CANCEL.getCode());
+            forkliftWaybillOrderRepository.updateById(forkliftWaybillOrder);
+        }
+    }
+
 
     @Override
     protected void calculateAutoDispatchScore(WaybillOrderEmptyLoadLeaveParam param, KwtWaybillOrder waybillOrder) {

+ 3 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java

@@ -30,10 +30,7 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
 
     @Override
     protected void checkState(WaybillOrderLoadingParam param, KwtWaybillOrder waybillOrder) {
-        if (!Objects.equals(CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(), waybillOrder.getStatus())
-                && !Objects.equals(CarWaybillV1Enum.REPLENISHING.getCode(), waybillOrder.getStatus())) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“到达装货地点”或“卸货中”状态, 无法推进下一节点!");
-        }
+
     }
 
     @Override
@@ -54,8 +51,8 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
     @Override
     protected void getStatus(KwtWaybillOrder waybillOrder) {
         //第一次过磅,状态为:已装货;后续过磅,状态为:补货完成
-        CarWaybillV1Enum status = Objects.equals(waybillOrder.getStatus(), CarWaybillV1Enum.REFUSE_TRAFFIC.getCode())
-                ? CarWaybillV1Enum.EXIT_COMPLETED : CarWaybillV1Enum.REPLENISH_FINISH;
+        CarWaybillV1Enum status = Objects.equals(waybillOrder.getStatus(), CarWaybillV1Enum.REPLENISHING.getCode())
+                ? CarWaybillV1Enum.REPLENISH_FINISH : CarWaybillV1Enum.EXIT_COMPLETED;
 
         // 1. 修改运单状态
         waybillOrder.setStatus(status.getCode());

+ 4 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrder.java

@@ -176,4 +176,8 @@ public class KwtWaybillOrder implements Serializable {
      * 派车方式
      */
     private Integer dispatchWay;
+
+    //用于存储动态状态
+    @TableField(exist = false)
+    private Integer targetStatus;
 }

+ 32 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/SalesWaybillOrderQueryParam.java

@@ -0,0 +1,32 @@
+package com.sckw.transport.model.param;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description :
+ * @create :2025-11-13 08:59:00
+ */
+@Data
+public class SalesWaybillOrderQueryParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -9098396227857171692L;
+
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    @NotNull(message = "企业id不能为空!")
+    private Long entId;
+
+
+
+}

+ 8 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtForkliftWaybillOrderRepository.java

@@ -57,6 +57,14 @@ public class KwtForkliftWaybillOrderRepository extends ServiceImpl<KwtForkliftWa
                 .last("limit 1"));
     }
 
+    public KwtForkliftWaybillOrder queryForkliftWaybillOrderByWOrderIdAndType(Long wOrderId, Integer type) {
+        return getOne(Wrappers.<KwtForkliftWaybillOrder>lambdaQuery()
+                .eq(KwtForkliftWaybillOrder::getWOrderId, wOrderId)
+                .eq(KwtForkliftWaybillOrder::getLoadingType, type)
+                .orderByDesc(KwtForkliftWaybillOrder::getId)
+                .last("limit 1"));
+    }
+
 
 
 

+ 109 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/SalesWaybillOrderService.java

@@ -0,0 +1,109 @@
+package com.sckw.transport.service.app;
+
+
+import com.alibaba.fastjson.JSON;
+import com.sckw.fleet.api.RemoteFleetService;
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.product.api.dubbo.GoodsInfoService;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.transport.handler.*;
+import com.sckw.transport.model.param.SalesWaybillOrderQueryParam;
+import com.sckw.transport.model.param.SalesWaybillOrderResp;
+import com.sckw.transport.model.param.WaybillOrderReq;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
+import com.sckw.transport.repository.*;
+import com.sckw.transport.service.KwtWaybillOrderV1Service;
+import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zk
+ * @desc 司机app接单Service
+ * @date 2023/7/19 0019
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class SalesWaybillOrderService {
+
+    private final KwtLogisticsOrderRepository logisticsOrderRepository;
+    private final KwtLogisticsOrderCirculateRepository logisticsOrderCirculateRepository;
+    private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
+    private final KwtLogisticsOrderAddressRepository logisticsOrderAddressRepository;
+    private final KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
+
+    private final KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
+    private final KwtWaybillOrderRepository waybillOrderRepository;
+    private final KwtWaybillOrderAddressRepository waybillOrderAddressRepository;
+    private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
+    private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    RemoteSystemService remoteSystemService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
+    TradeOrderInfoService tradeOrderInfoService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    RemoteFleetService remoteFleetService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    GoodsInfoService goodsInfoService;
+
+    private final TakingOrderHandler takingOrderHandler;
+    private final CancelHandler cancelHandler;
+    private final ComeIntoHandler comeIntoHandler;
+    private final LoadingHandler loadingHandler;
+    private final LeaveMockHandler leaveMockHandler;
+    private final LeaveHandler leaveHandler;
+    private final EmptyLoadLeaveHandler emptyLoadLeaveHandler;
+    private final ReplenishHandler replenishHandler;
+    private final LiftRodReleaseHandler liftRodReleaseHandler;
+
+    private final UnloadingHandler unloadingHandler;
+
+    private final KwtWaybillOrderV1Service waybillOrderV1Service;
+
+    // 注入RedisTemplate用于分布式锁
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
+    // 分布式锁相关常量
+    private static final String TAKING_ORDER_LOCK_PREFIX = "transport:taking_order:lock:";
+    // 锁超时时间30秒
+    private static final long LOCK_EXPIRE_SECONDS = 30;
+    // 锁等待时间500毫秒
+    private static final long LOCK_WAIT_MILLIS = 500;
+    // 锁重试间隔100毫秒
+    private static final long LOCK_RETRY_INTERVAL = 100;
+
+    //载重任务量浮动吨数
+    private static final BigDecimal TWO_TONS = new BigDecimal("2");
+    //载重任务量计算比例
+    private static final BigDecimal EIGHTY_PERCENT = new BigDecimal("0.8");
+
+    /**
+     * 查询销售数据
+     * @param param
+     * @return
+     */
+    public SalesWaybillOrderResp querySalesStatistics(SalesWaybillOrderQueryParam param) {
+        log.info("查询销售数据:{}", JSON.toJSONString(param));
+        SalesWaybillOrderResp salesResp = new SalesWaybillOrderResp();
+        // 查询执行中订单(物流订单)
+        WaybillOrderReq req = new WaybillOrderReq();
+        req.setEntId(String.valueOf(param.getEntId()));
+
+        StatisticsWaybillResp statisticsWaybillResp = waybillOrderV1Service.statisticsWaybillOrder(req);
+
+
+        log.info("查询销售数据成功,结果:{}", JSON.toJSONString(salesResp));
+
+        return salesResp;
+
+    }
+
+}