Browse Source

开发铲车司机业务功能

donglang 4 months ago
parent
commit
ec051db951

+ 1 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/ErrorCodeEnum.java

@@ -87,6 +87,7 @@ public enum ErrorCodeEnum {
 
     // ====================== 铲车订单(100000~110000)======================
     FORKLIFT_ORDER_NOT_FOUND("100000", "当前铲车订单不存在"),
+    FORKLIFT_ORDER_STATUS_ERROR("100000", "当前铲车订单状态异常"),
 
 
 

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

@@ -27,7 +27,7 @@ public enum ForkliftStatusEnum {
     /**
      * 已完成
      */
-    COMPLETED(10, "已完成"),
+    COMPLETED(10, "已装载"),
 
     ;
 
@@ -36,7 +36,7 @@ public enum ForkliftStatusEnum {
     private final String destination;
 
 
-    public static String geDesc(Integer status) {
+    public static String getDesc(Integer status) {
         if (status == null) {
             return null;
         }

+ 10 - 10
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/ForkliftAppController.java

@@ -7,6 +7,7 @@ import com.sckw.transport.model.param.forklift.reponse.ForkliftOrderResp;
 import com.sckw.transport.model.param.forklift.request.ForkliftOrderCancelParam;
 import com.sckw.transport.model.param.forklift.request.ForkliftOrderQueryParam;
 import com.sckw.transport.model.param.forklift.request.ForkliftOrderTakingParam;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.service.app.ForkliftOrderService;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.validation.Valid;
@@ -31,29 +32,28 @@ public class ForkliftAppController {
     private final ForkliftOrderService forkliftOrderService;
 
     /**
-     * 分页查询铲车运单(待接单)
+     * 分页查询铲车订单
      *
      * @param param
      * @return
      */
     @Operation(summary = "分页铲车运单", description = "分页查询铲车的运单")
-    @PostMapping("/pageQueryForkliftWaybillOrder")
-    public BaseResult<PageDataResult<ForkliftOrderResp>> pageQueryForkliftWaybillOrder(@RequestBody @Valid ForkliftOrderQueryParam param){
-        PageDataResult<ForkliftOrderResp> LogisticsOrderList = forkliftOrderService.pageQueryForkliftWaybillOrder(param);
+    @PostMapping("/pageQueryForkliftOrder")
+    public BaseResult<PageDataResult<ForkliftOrderResp>> pageQueryForkliftOrder(@RequestBody @Valid ForkliftOrderQueryParam param){
+        PageDataResult<ForkliftOrderResp> LogisticsOrderList = forkliftOrderService.pageQueryForkliftOrder(param);
         return BaseResult.success(LogisticsOrderList);
     }
 
     /**
-     * 分页查询铲车订单
+     * 铲车订单状态统计
      *
      * @param param
      * @return
      */
-    @Operation(summary = "分页铲车运单", description = "分页查询铲车的运单")
-    @PostMapping("/pageQueryForkliftOrder")
-    public BaseResult<PageDataResult<ForkliftOrderResp>> pageQueryForkliftOrder(@RequestBody @Valid ForkliftOrderQueryParam param){
-        PageDataResult<ForkliftOrderResp> LogisticsOrderList = forkliftOrderService.pageQueryForkliftOrder(param);
-        return BaseResult.success(LogisticsOrderList);
+    @Operation(summary = "铲车订单状态统计", description = "铲车订单状态统计")
+    @PostMapping("/statisticsForkliftOrder")
+    public BaseResult<StatisticsWaybillResp> statisticsForkliftOrder(@RequestBody @Valid ForkliftOrderQueryParam param){
+        return BaseResult.success(forkliftOrderService.statisticsForkliftOrder(param));
     }
 
     /**

+ 20 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtForkliftWaybillOrder.java

@@ -69,11 +69,31 @@ public class KwtForkliftWaybillOrder implements Serializable {
      */
     private String driverPhone;
 
+    /**
+     * 装载接单时间
+     */
+    private Date forkliftAcceptTime;
+
     /**
      * 装载完成时间
      */
     private Date finishTime;
 
+    /**
+     * 运单接单时间
+     */
+    private Date waybillAcceptTime;
+
+    /**
+     * 车辆类型
+     */
+    private String truckType;
+
+    /**
+     * 车辆轴数
+     */
+    private String carAxis;
+
     /**
      * 创建时间
      */

+ 68 - 109
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/ForkliftOrderResp.java

@@ -1,11 +1,7 @@
 package com.sckw.transport.model.param.forklift.reponse;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.sckw.payment.api.model.dto.WalletVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -34,7 +30,7 @@ public class ForkliftOrderResp implements Serializable {
      * 铲车订单编号
      */
     @Schema(description = "铲车订单编号")
-    private Long fOrderNo;
+    private String fOrderNo;
 
     /**
      * 企业id
@@ -67,146 +63,109 @@ public class ForkliftOrderResp implements Serializable {
     private Integer status;
 
     /**
-     * 装载员id
+     * 购买企业id
      */
-    @Schema(description = "装载员id")
-    private Long driverId;
+    private Long prEntId;
 
     /**
-     * 装载员姓名
+     * 购买企业名称
      */
-    @Schema(description = "装载员姓名")
-    private String driverName;
+    private String prEntName;
 
     /**
-     * 装载员联系电话
+     * 运输司机车牌主键id
      */
-    @Schema(description = "装载员联系电话")
-    private String driverPhone;
+    private Long truckId;
 
     /**
-     * 装载接单时间
+     * 运输司机车牌号
      */
-    @Schema(description = "装载接单时间")
-    private Date acceptOrderTime;
+    private String truckNo;
 
     /**
-     * 装载完成时间
+     * 运输司机姓名
      */
-    @Schema(description = "装载完成时间")
-    private Date finishTime;
+    private String name ;
 
     /**
-     * 创建时间
+     * 运输司机电话
      */
-    @Schema(description = "创建时间")
-    private Date createTime;
+    private String phone;
 
     /**
-     * 更新时间
+     * 商品id
      */
-    @Schema(description = "更新时间")
-    private Date updateTime;
+    private Long goodsId;
 
     /**
-     * 创建人
+     * 商品名称
      */
-    @Schema(description = "创建人")
-    private Long createUser;
+    private String goodsName;
 
     /**
-     * 更新人
+     * 任务量
      */
-    @Schema(description = "更新人")
-    private Long updateUser;
-
+    @Schema(description = "任务量")
+    private BigDecimal taskNum;
 
     /**
-     * 运单信息
+     * 皮重
      */
-    @Schema(description = "运单信息")
-    private WayBillOrderVo wayBillVo;
-
-
-    public class WayBillOrderVo implements Serializable {
-
-
-        @Serial
-        private static final long serialVersionUID = 6810301814510319609L;
-
-        /**
-         * 运单ID
-         */
-        @Schema(description = "运单ID")
-        private Long wOrderId;
-
-        /**
-         * 司机ID
-         */
-        @Schema(description = "司机ID")
-        private Long driverId;
+    @Schema(description = "皮重")
+    private BigDecimal tareAmount;
 
-        /**
-         * 司机姓名
-         */
-        @Schema(description = "司机姓名")
-        private String driverName;
-
-        /**
-         * 司机电话
-         */
-        @Schema(description = "司机电话")
-        private String driverPhone;
-
-
-        /**
-         * 运单接单时间
-         */
-        @Schema(description = "运单接单时间")
-        private Date wayAcceptOrderTime;
+    /**
+     * 毛重
+     */
+    @Schema(description = "毛重")
+    private BigDecimal grossAmount;
 
-        /**
-         * 商品名称
-         */
-        @Schema(description = "商品名称")
-        private String goodsName;
+    /**
+     * 车辆类型
+     */
+    @Schema(description = "车辆类型")
+    private String truckType;
 
-        /**
-         * 任务量
-         */
-        @Schema(description = "任务量")
-        private BigDecimal taskNum;
+    /**
+     * 车辆轴数
+     */
+    @Schema(description = "车辆轴数")
+    private String carAxisName;
 
-        /**
-         * 皮重
-         */
-        @Schema(description = "皮重")
-        private BigDecimal tareAmount;
+    /**
+     * 装载员id
+     */
+    @Schema(description = "装载员id")
+    private Long driverId;
 
-        /**
-         * 车辆类型
-         */
-        @Schema(description = "车辆类型")
-        private String truckType;
+    /**
+     * 装载员姓名
+     */
+    @Schema(description = "装载员姓名")
+    private String driverName;
 
-        /**
-         * 车辆轴数
-         */
-        @Schema(description = "车辆轴数")
-        private String carAxisName;
+    /**
+     * 装载员联系电话
+     */
+    @Schema(description = "装载员联系电话")
+    private String driverPhone;
 
+    /**
+     * 装载接单时间
+     */
+    @Schema(description = "装载接单时间")
+    private Date acceptOrderTime;
 
-        /**
-         * 采购企业id
-         */
-        @Schema(description = "采购企业id")
-        private Long entId;
+    /**
+     * 装载完成时间
+     */
+    @Schema(description = "装载完成时间")
+    private Date finishTime;
 
-        /**
-         * 采购单位
-         */
-        @Schema(description = "采购单位")
-        private String firmName;
-    }
+    /**
+     * 运单接单时间
+     */
+    @Schema(description = "运单接单时间")
+    private Date waybillAcceptTime;
 
 }

+ 4 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/ForkliftOrderTakingParam.java

@@ -20,11 +20,11 @@ public class ForkliftOrderTakingParam implements Serializable {
     private static final long serialVersionUID = 8601314159466179906L;
 
     /**
-     * 单id
+     * 铲车订单id
      */
-    @NotNull(message = "单id不能为空")
-    @Schema(description = "单id")
-    private Long waybillOrderId;
+    @NotNull(message = "铲车订单id不能为空")
+    @Schema(description = "铲车订单id")
+    private Long forkliftOrderId;
 
 
     /**

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

@@ -25,6 +25,13 @@ public class KwtForkliftWaybillOrderRepository extends ServiceImpl<KwtForkliftWa
                 .last("limit 1"));
     }
 
+    public KwtForkliftWaybillOrder queryForkliftWaybillOrderByFOrderId(Long forkliftId) {
+        return getOne(Wrappers.<KwtForkliftWaybillOrder>lambdaQuery()
+                .eq(KwtForkliftWaybillOrder::getId, forkliftId)
+                .orderByDesc(KwtForkliftWaybillOrder::getId)
+                .last("limit 1"));
+    }
+
 
   
 

+ 0 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java

@@ -341,10 +341,4 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
         return page(page,wrapper);
     }
 
-    public List<KwtWaybillOrder> findOneById(List<Long> wOrderId) {
-        return list(Wrappers.<KwtWaybillOrder>lambdaQuery()
-                .in(KwtWaybillOrder::getId,wOrderId)
-                .eq(KwtWaybillOrder::getDelFlag,0)
-                .orderByDesc(KwtWaybillOrder::getId));
-    }
 }

+ 261 - 57
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/ForkliftOrderService.java

@@ -5,23 +5,31 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sckw.contract.api.RemoteContractService;
+import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.ForkliftStatusEnum;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.response.result.PageDataResult;
-import com.sckw.transport.model.KwtForkliftWaybillOrder;
-import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.order.api.model.OrderUnitInfoDetailVO;
+import com.sckw.product.api.dubbo.GoodsInfoService;
+import com.sckw.product.api.model.KwpGoods;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.WaybillOrderLoadingParam;
 import com.sckw.transport.model.param.forklift.reponse.ForkliftOrderResp;
 import com.sckw.transport.model.param.forklift.request.ForkliftOrderCancelParam;
 import com.sckw.transport.model.param.forklift.request.ForkliftOrderQueryParam;
 import com.sckw.transport.model.param.forklift.request.ForkliftOrderTakingParam;
-import com.sckw.transport.repository.KwtForkliftWaybillOrderRepository;
-import com.sckw.transport.repository.KwtWaybillOrderRepository;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
+import com.sckw.transport.repository.*;
 import jakarta.annotation.Resource;
 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.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.script.DefaultRedisScript;
@@ -44,9 +52,25 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public class ForkliftOrderService {
 
+    private final KwtForkliftWaybillOrderRepository forkliftWaybillOrderRepository;
     private final KwtWaybillOrderRepository waybillOrderRepository;
+    private final KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
+    private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
+    private final KwtLogisticsOrderRepository logisticsOrderRepository;
+    private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteContractService remoteContractService;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
+    TradeOrderInfoService tradeOrderInfoService;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    RemoteSystemService remoteSystemService;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    GoodsInfoService goodsInfoService;
 
-    private final KwtForkliftWaybillOrderRepository forkliftWaybillOrderRepository;
 
     @Autowired
     WaybillOrderService waybillOrderService;
@@ -64,29 +88,6 @@ public class ForkliftOrderService {
     // 锁重试间隔100毫秒
     private static final long LOCK_RETRY_INTERVAL = 100;
 
-    /**
-     * 分页查询铲车运单
-     * @param param
-     * @return
-     */
-    public PageDataResult<ForkliftOrderResp> pageQueryForkliftWaybillOrder(ForkliftOrderQueryParam param) {
-        log.info("查询铲车司机的物流运单:{}", JSON.toJSONString(param));
-        //查询到底装货点的运单
-        Page<KwtWaybillOrder> pageByStatus = waybillOrderRepository.findPageByStatus(param.getPageNum(), param.getPageSize());
-        List<KwtWaybillOrder> records = pageByStatus.getRecords();
-        if (CollectionUtils.isEmpty(records)) {
-            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
-        }
-        List<ForkliftOrderResp> forkliftOrderList = new ArrayList<>();
-        for (KwtWaybillOrder record : records) {
-            ForkliftOrderResp forklift = new ForkliftOrderResp();
-            forklift.setDriverId(record.getDriverId());
-            forklift.setDriverName(record.getDriverName());
-            forkliftOrderList.add(forklift);
-        }
-        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), forkliftOrderList);
-    }
-
 
     /**
      * 分页查询铲车订单
@@ -106,32 +107,231 @@ public class ForkliftOrderService {
         } else if (ForkliftStatusEnum.COMPLETED.getCode().equals(param.getStatus())) {
             wrapper.eq(KwtForkliftWaybillOrder::getStatus, 10);
         }
+        //查询铲车订单
         Page<KwtForkliftWaybillOrder> pageByStatus = forkliftWaybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
         List<KwtForkliftWaybillOrder> records = pageByStatus.getRecords();
         if (CollectionUtils.isEmpty(records)) {
-            log.info("当前铲车司机无铲车订单,铲车司机id:{}", param.getDriverId());
+            log.info("当前铲车司机无铲车订单信息,铲车司机id:{}", param.getDriverId());
             return PageDataResult.empty(param.getPageNum(), param.getPageSize());
         }
+        List<ForkliftOrderResp> forkliftOrderPageResult = getForkliftOrderPageResult(records);
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), forkliftOrderPageResult);
+    }
+
+    /**
+     * 获取铲车订单数据
+     * @param records
+     * @return
+     */
+    private List<ForkliftOrderResp> getForkliftOrderPageResult(List<KwtForkliftWaybillOrder> records) {
+        Set<Long> wOrderIds = records.stream().map(KwtForkliftWaybillOrder::getWOrderId).filter(Objects::nonNull).collect(Collectors.toSet());
         //查询运单
-        List<Long> wOrderId = records.stream().map(KwtForkliftWaybillOrder::getWOrderId).filter(Objects::nonNull).collect(Collectors.toList());
-        List<KwtWaybillOrder> waybillOrders = waybillOrderRepository.findOneById(wOrderId);
+        List<KwtWaybillOrder> waybillOrders = waybillOrderRepository.queryByBillOrderIds(wOrderIds);
         if (CollectionUtils.isEmpty(waybillOrders)) {
-            log.info("当前铲车司机无物流运单,运单id:{}", JSON.toJSONString(param));
-            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+            log.info("【铲车】无物流运单信息,运单id:{}", JSON.toJSONString(wOrderIds));
+            return Collections.emptyList();
+        }
+        Map<Long, KwtWaybillOrder> waybillOrderMap = waybillOrders.stream()
+                .collect(Collectors.toMap(KwtWaybillOrder::getId, Function.identity(), (x, y) -> x));
+
+        //查询子运单
+        List<KwtWaybillOrderSubtask> waybillOrderSubtasks = waybillOrderSubtaskRepository.findOneByWOrderIds(wOrderIds);
+        if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
+            log.info("【铲车】无物流子运单信息,运单id:{}", JSON.toJSONString(wOrderIds));
+            return Collections.emptyList();
+        }
+        Map<Long, KwtWaybillOrderSubtask> subtaskMap = waybillOrderSubtasks.stream()
+                .collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderId, Function.identity(), (x, y) -> x));
+        Set<Long> lOrderIds = waybillOrderSubtasks.stream().map(KwtWaybillOrderSubtask::getLOrderId).collect(Collectors.toSet());
+
+        //查询运单装卸货
+        List<KwtWaybillOrderTicket> waybillOrderTickets = waybillOrderTicketRepository.queryByWOrderIds(new ArrayList<>(wOrderIds));
+        if (CollectionUtils.isEmpty(waybillOrderTickets)) {
+            log.info("【铲车】无运单装卸货信息,运单id:{}", JSON.toJSONString(wOrderIds));
+            return Collections.emptyList();
+        }
+        Map<String, KwtWaybillOrderTicket> waybillOrderTicketMap = waybillOrderTickets.stream()
+                .collect(Collectors.toMap(ticket -> ticket.getWOrderId() + "-" + ticket.getType(), Function.identity(), (x, y) -> x));
+
+        //查询物流订单
+        List<KwtLogisticsOrder> logisticsOrder = logisticsOrderRepository.queryByLogOrderIds(lOrderIds);
+        if (CollectionUtils.isEmpty(logisticsOrder)) {
+            log.info("【铲车】无物流订单信息,物流订单id:{}", JSON.toJSONString(lOrderIds));
+            return Collections.emptyList();
+        }
+        Map<Long, KwtLogisticsOrder> logisticsOrderMap = logisticsOrder.stream().collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (x, y) -> x));
+        Set<Long> tOrderIds = logisticsOrder.stream().map(KwtLogisticsOrder::getTOrderId).collect(Collectors.toSet());
+
+        //查询物流商品
+        List<KwtLogisticsOrderGoods> logisticsOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds((List<Long>) lOrderIds);
+        if (CollectionUtils.isEmpty(logisticsOrderGoods)) {
+            log.info("【铲车】无订单商品信息,物流订单id:{}", JSON.toJSONString(lOrderIds));
+            return Collections.emptyList();
+        }
+        Map<Long, KwtLogisticsOrderGoods> logisticsOrderGoodsMap = logisticsOrderGoods.stream().collect(Collectors.toMap(KwtLogisticsOrderGoods::getId, Function.identity(), (x, y) -> x));
+
+        //交易商品信息
+        List<Long> goodsIds = logisticsOrderGoods.stream().map(KwtLogisticsOrderGoods::getGoodsId).distinct().collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(goodsIds)) {
+            log.info("【铲车】无订单商品信息,商品id:{}", JSON.toJSONString(goodsIds));
+        }
+        Map<Long, KwpGoods> goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
+
+        //查询字典
+        Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
+
+        //查询贸易订单企业信息
+        List<OrderUnitInfoDetailVO> orderUnitInfoDetailVOS = tradeOrderInfoService.queryOrderUnitInfByTOrderId(tOrderIds);
+        if (CollectionUtils.isEmpty(orderUnitInfoDetailVOS)) {
+            log.info("【铲车】无订单企业信息,物流订单id:{}", JSON.toJSONString(lOrderIds));
+            return Collections.emptyList();
         }
-        Map<Long, KwtWaybillOrder> waybillOrderMap = waybillOrders.stream().collect(Collectors.toMap(KwtWaybillOrder::getId, Function.identity(), (x, y) -> x));
+        Map<String, OrderUnitInfoDetailVO> tradeOrderAndUnit = orderUnitInfoDetailVOS.stream().collect(Collectors.toMap(unit -> unit.getTOrderId() + "-" + unit.getUnitType(), Function.identity(), (x, y) -> x));
+
+        //组装铲车订单数据
+        return records.stream()
+                .map(forkliftOrder -> buildForkliftOrderResp(forkliftOrder, waybillOrderMap, subtaskMap, waybillOrderTicketMap, logisticsOrderMap, logisticsOrderGoodsMap, goodsIdAndGoodsMap, dictValueAndDictResDtoMap, tradeOrderAndUnit))
+                .collect(Collectors.toList());
+    }
 
-        List<ForkliftOrderResp> forkliftOrderList = new ArrayList<>();
-        for (KwtForkliftWaybillOrder record : records) {
 
+    /**
+     * 组装铲车订单信息
+     * @param forkliftOrder
+     * @param waybillOrderMap
+     * @param subtaskMap
+     * @return
+     */
+    private ForkliftOrderResp buildForkliftOrderResp(KwtForkliftWaybillOrder forkliftOrder,
+                                                     Map<Long, KwtWaybillOrder> waybillOrderMap,
+                                                     Map<Long, KwtWaybillOrderSubtask> subtaskMap,
+                                                     Map<String, KwtWaybillOrderTicket> waybillOrderTicketMap,
+                                                     Map<Long, KwtLogisticsOrder> logisticsOrderMap,
+                                                     Map<Long, KwtLogisticsOrderGoods> logisticsOrderGoodsMap,
+                                                     Map<Long, KwpGoods> goodsIdAndGoodsMap,
+                                                     Map<String, Map<String, String>> dictValueAndDictResDtoMap,
+                                                     Map<String, OrderUnitInfoDetailVO> tradeOrderAndUnit) {
+        ForkliftOrderResp forklift = new ForkliftOrderResp();
+        forklift.setId(forkliftOrder.getId());
+        forklift.setFOrderNo(forkliftOrder.getFOrderNo());
+        forklift.setEntId(forkliftOrder.getEntId());
+        forklift.setWOrderId(forkliftOrder.getWOrderId());
+        forklift.setLOrderId(forkliftOrder.getLOrderId());
+        forklift.setLoadingType(forkliftOrder.getLoadingType());
+        forklift.setStatus(forkliftOrder.getStatus());
+        forklift.setDriverId(forkliftOrder.getDriverId());
+        forklift.setDriverName(forkliftOrder.getDriverName());
+        forklift.setDriverPhone(forkliftOrder.getDriverPhone());
+        forklift.setAcceptOrderTime(forkliftOrder.getForkliftAcceptTime());
+        forklift.setFinishTime(forkliftOrder.getFinishTime());
+        forklift.setFinishTime(forkliftOrder.getWaybillAcceptTime());
+        forklift.setCarAxisName(forkliftOrder.getCarAxis());
+        forklift.setTruckType(forkliftOrder.getTruckType());
+
+        //运单数据
+        KwtWaybillOrder waybillOrder = waybillOrderMap.getOrDefault(forkliftOrder.getWOrderId(), new KwtWaybillOrder());
+        forklift.setTruckId(waybillOrder.getTruckId());
+        forklift.setTruckNo(waybillOrder.getTruckNo());
+        forklift.setName(waybillOrder.getDriverName());
+        forklift.setPhone(waybillOrder.getDriverPhone());
+
+
+        //子运单数据
+        KwtWaybillOrderSubtask subtask = subtaskMap.getOrDefault(forkliftOrder.getWOrderId(), new KwtWaybillOrderSubtask());
+        forklift.setTaskNum(subtask.getEntrustAmount());
+
+        //采购企业信息
+        KwtLogisticsOrder logisticsOrder = logisticsOrderMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrder());
+        OrderUnitInfoDetailVO orderUnit = tradeOrderAndUnit.getOrDefault(logisticsOrder.getTOrderId() + "-" + 1, new OrderUnitInfoDetailVO());
+        forklift.setPrEntId(orderUnit.getEntId());
+        forklift.setPrEntName(orderUnit.getFirmName());
+
+        //商品信息
+        KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrderGoods());
+        KwpGoods goods = goodsIdAndGoodsMap.getOrDefault(orderGoods.getGoodsId(), new KwpGoods());
+        Map<String, String> goodsTypeMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), new HashMap<>());
+        Map<String, String> goodsSpecMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.GOODS_SPEC.getType(), new HashMap<>());
+        forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
+        forklift.setGoodsId(goods.getId());
+
+        //装卸货信息
+        KwtWaybillOrderTicket ticket = waybillOrderTicketMap.getOrDefault(forkliftOrder.getWOrderId() + "-" + 1, new KwtWaybillOrderTicket());
+        forklift.setTareAmount(ticket.getTareAmount());
+        forklift.setGrossAmount(ticket.getGrossAmount());
+
+        return forklift;
+    }
 
 
-            ForkliftOrderResp forklift = new ForkliftOrderResp();
-            forklift.setDriverId(record.getDriverId());
-            forklift.setDriverName(record.getDriverName());
-            forkliftOrderList.add(forklift);
+    /**
+     * 铲车订单状态统计
+     * @param param
+     * @return
+     */
+    public StatisticsWaybillResp statisticsForkliftOrder(ForkliftOrderQueryParam param) {
+        log.info("铲车订单状态统计:{}", JSON.toJSONString(param));
+        StatisticsWaybillResp resp = new StatisticsWaybillResp();
+        if (StringUtils.isBlank(param.getDriverId())) {
+            resp.setOrderStatusStatistics(buildDefaultStatusStatistics());
+             return resp;
         }
-        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), forkliftOrderList);
+
+        LambdaQueryWrapper<KwtForkliftWaybillOrder> queryWrapper = Wrappers.<KwtForkliftWaybillOrder>lambdaQuery()
+                .eq(KwtForkliftWaybillOrder::getDriverId, param.getDriverId())
+                .eq(KwtForkliftWaybillOrder::getStatus, param.getStatus())
+                .orderByDesc(KwtForkliftWaybillOrder::getCreateTime)
+                .orderByDesc(KwtForkliftWaybillOrder::getId);
+
+        //查询铲车订单
+        Page<KwtForkliftWaybillOrder> forkliftOrderPage = forkliftWaybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
+        List<KwtForkliftWaybillOrder> records = forkliftOrderPage.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前铲车司机的无铲车运单,统计结果为空, 铲车司机id:{}", param.getDriverId());
+            resp.setOrderStatusStatistics(buildDefaultStatusStatistics());
+            return resp;
+        }
+        List<ForkliftOrderResp> forkliftOrderPageResult = getForkliftOrderPageResult(records);
+        Map<Integer, Long> statusCountMap = forkliftOrderPageResult.stream().collect(Collectors.groupingBy(ForkliftOrderResp::getStatus, Collectors.counting()));
+        List<StatisticsWaybillResp.OrderBillStatusStatistics> orderStatusStatistics = new ArrayList<>();
+        for (int targetStatus : Arrays.asList(1, 5, 10)) {
+            Long count = statusCountMap.getOrDefault(targetStatus, 0L);
+            StatisticsWaybillResp.OrderBillStatusStatistics aggregateStat = new StatisticsWaybillResp.OrderBillStatusStatistics();
+            aggregateStat.setOrderStatus(String.valueOf(targetStatus));
+            aggregateStat.setOrderStatusDesc(ForkliftStatusEnum.getDesc(targetStatus));
+            aggregateStat.setOrderNum(String.valueOf(count));
+
+            orderStatusStatistics.add(aggregateStat);
+            resp.setOrderStatusStatistics(orderStatusStatistics);
+        }
+        return resp;
+    }
+
+
+    /**
+     * 构建默认的状态统计列表(三种状态,数量均为0)
+     * @return 默认统计列表
+     */
+    private List<StatisticsWaybillResp.OrderBillStatusStatistics> buildDefaultStatusStatistics() {
+        List<StatisticsWaybillResp.OrderBillStatusStatistics> defaultList = new ArrayList<>();
+        // 待接单
+        StatisticsWaybillResp.OrderBillStatusStatistics underWay = new StatisticsWaybillResp.OrderBillStatusStatistics();
+        underWay.setOrderStatus("1");
+        underWay.setOrderStatusDesc("待接单");
+        underWay.setOrderNum("0");
+        defaultList.add(underWay);
+        // 已接单
+        StatisticsWaybillResp.OrderBillStatusStatistics review = new StatisticsWaybillResp.OrderBillStatusStatistics();
+        review.setOrderStatus("5");
+        review.setOrderStatusDesc("已接单");
+        review.setOrderNum("0");
+        defaultList.add(review);
+        // 已完成
+        StatisticsWaybillResp.OrderBillStatusStatistics completed = new StatisticsWaybillResp.OrderBillStatusStatistics();
+        completed.setOrderStatus("10");
+        completed.setOrderStatusDesc("已装载");
+        completed.setOrderNum("0");
+        defaultList.add(completed);
+        return defaultList;
     }
 
     /**
@@ -147,8 +347,8 @@ public class ForkliftOrderService {
         // 1. 幂等性校验
         checkIdempotent(param);
 
-        // 2. 构建分布式锁Key(物流运单ID+铲车司机id 唯一标识)
-        String lockKey = TAKING_ORDER_LOCK_PREFIX + param.getWaybillOrderId() + "_" + param.getDriverId();
+        // 2. 构建分布式锁Key(铲车订单ID+铲车司机id 唯一标识)
+        String lockKey = TAKING_ORDER_LOCK_PREFIX + param.getForkliftOrderId() + "_" + param.getDriverId();
         String requestId = UUID.randomUUID().toString();
         boolean lockAcquired = false;
 
@@ -181,7 +381,7 @@ public class ForkliftOrderService {
      */
     private KwtWaybillOrder checkWOrderStatus(ForkliftOrderTakingParam param) {
         //校验
-        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(param.getWaybillOrderId());
+        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(param.getForkliftOrderId());
         if (waybillOrder == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "当前运单不是可接单状态!");
         }
@@ -195,10 +395,10 @@ public class ForkliftOrderService {
      */
     private void checkIdempotent(ForkliftOrderTakingParam param) {
         // 查询该物流运单+铲车司机id下是否已有接单状态运单
-        KwtForkliftWaybillOrder existingOrder = forkliftWaybillOrderRepository.queryForkliftWaybillOrderByWOrderId(param.getWaybillOrderId(), param.getDriverId());
+        KwtForkliftWaybillOrder existingOrder = forkliftWaybillOrderRepository.queryForkliftWaybillOrderByWOrderId(param.getForkliftOrderId(), param.getDriverId());
         if (existingOrder != null) {
             log.warn("重复接单校验失败,已存在有效铲车订单,fLogOrderId:{}, driverId:{}, waybillOrderId:{}",
-                    existingOrder.getId(), param.getDriverId(), param.getWaybillOrderId());
+                    existingOrder.getId(), param.getDriverId(), param.getForkliftOrderId());
             throw new BusinessPlatfromException(ErrorCodeEnum.REPEAT_SUBMIT,
                     String.format("该铲车[%s]已针对该物流运单接单,订单ID:%s", existingOrder.getDriverId(), existingOrder.getId()));
         }
@@ -260,18 +460,15 @@ public class ForkliftOrderService {
      */
     private void createForkliftWaybillOrder(ForkliftOrderTakingParam param, KwtWaybillOrder waybillOrder) {
         log.info("生成铲车订单,入参参数:{}", JSON.toJSONString(param));
-        KwtForkliftWaybillOrder forkliftWaybillOrder = new KwtForkliftWaybillOrder();
-        forkliftWaybillOrder.setFOrderNo("W" + System.currentTimeMillis());
-        forkliftWaybillOrder.setEntId(null);
-        forkliftWaybillOrder.setLOrderId(waybillOrder.getLOrderId());
-        forkliftWaybillOrder.setLoadingType(param.getLoadingType());
+        KwtForkliftWaybillOrder forkliftWaybillOrder = forkliftWaybillOrderRepository.queryForkliftWaybillOrderByFOrderId(param.getForkliftOrderId());
+        if (forkliftWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前铲车订单不存在!");
+        }
+        if (ForkliftStatusEnum.PENDING_ORDERS.getCode().equals(forkliftWaybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前铲车订单状态异常,不能接单!");
+        }
+
         forkliftWaybillOrder.setStatus(ForkliftStatusEnum.ORDER_TAKING.getCode());
-        forkliftWaybillOrder.setDriverName(null);
-        forkliftWaybillOrder.setDriverPhone(null);
-        forkliftWaybillOrder.setFinishTime(new Date());
-        forkliftWaybillOrder.setCreateUser(null);
-        forkliftWaybillOrder.setUpdateUser(null);
-        forkliftWaybillOrderRepository.save(forkliftWaybillOrder);
         log.info("创建铲车订单成功,订单ID:{}", waybillOrder.getId());
     }
 
@@ -287,6 +484,9 @@ public class ForkliftOrderService {
         if (forkliftWaybillOrder == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前铲车订单不存在!");
         }
+        if (ForkliftStatusEnum.ORDER_TAKING.getCode().equals(forkliftWaybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前铲车订单状态异常,不能取消订单!");
+        }
         forkliftWaybillOrder.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
         forkliftWaybillOrderRepository.updateById(forkliftWaybillOrder);
     }
@@ -302,6 +502,10 @@ public class ForkliftOrderService {
         if (forkliftWaybillOrder == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前铲车订单不存在!");
         }
+        if (ForkliftStatusEnum.ORDER_TAKING.getCode().equals(forkliftWaybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前铲车订单状态异常,不能装载完成!");
+        }
+
         forkliftWaybillOrder.setStatus(ForkliftStatusEnum.COMPLETED.getCode());
         forkliftWaybillOrderRepository.updateById(forkliftWaybillOrder);
 

+ 9 - 3
sql/2026/01/2026_01_06_donglang_create.sql

@@ -6,16 +6,22 @@ create table kwt_forklift_waybill_order
     ent_id                          bigint          NOT NULL DEFAULT '-1' COMMENT '企业id',
     w_order_id                      bigint          NOT NULL DEFAULT '-1' COMMENT '物流运单id',
     l_order_id                      bigint          NOT NULL DEFAULT '-1' COMMENT '物流订单id',
+    good_id                         bigint          NOT NULL DEFAULT '-1' COMMENT '商品id',
+    goods_name                      varchar(20)     NOT NULL NULL default '' COMMENT '商品名称',
     loading_type                    int             NOT NULL DEFAULT '0' COMMENT '装载类型(0装载,1补货)',
-    status                          int             NOT NULL DEFAULT '0' COMMENT '状态(1接单,5-已接单、10-已装载)',
-    driver_id                      bigint          NOT NULL DEFAULT '-1' COMMENT '装载员id',
+    status                          int             NOT NULL DEFAULT '0' COMMENT '状态(1-待接单,5-已接单、10-已装载)',
+    driver_id                       bigint          NOT NULL DEFAULT '-1' COMMENT '装载员id',
     driver_name                     varchar(40)     DEFAULT NULL default '' COMMENT '装载员姓名',
     driver_phone                    varchar(20)     DEFAULT NULL default '' COMMENT '装载员联系电话',
-    accept_order_time                     datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '装载完成时间',
+    forklift_accept_time            datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '装载接单时间',
     finish_time                     datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '装载完成时间',
+    waybill_accept_time             datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '运单接单时间',
+    truck_type                      varchar(5)      DEFAULT NULL default '' COMMENT '车辆类型',
+    carAxis                         varchar(5)      DEFAULT NULL default '' COMMENT '车辆轴数',
     create_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     update_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间',
     create_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '创建人',
     update_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '更新人',
+
     PRIMARY KEY (`id`) USING BTREE
 ) comment '铲车司机运单';