Przeglądaj źródła

门卫app功能代码

donglang 2 miesięcy temu
rodzic
commit
c24e93d886
16 zmienionych plików z 1061 dodań i 11 usunięć
  1. 1 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/ForkliftStatusEnum.java
  2. 71 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/GatekeeperStatusEnum.java
  3. 25 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java
  4. 6 6
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppForkliftController.java
  5. 73 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppGatekeeperController.java
  6. 17 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtGatekeeperWaybillOrderMapper.java
  7. 112 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtGatekeeperWaybillOrder.java
  8. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/ForkliftOrderResp.java
  9. 171 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/GatekeeperOrderResp.java
  10. 3 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/ForkliftOrderQueryParam.java
  11. 32 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/GatekeeperOrderPassParam.java
  12. 35 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/GatekeeperOrderQueryParam.java
  13. 23 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtGatekeeperWaybillOrderRepository.java
  14. 1 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/ForkliftOrderService.java
  15. 465 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java
  16. 25 0
      sql/2026/01/2026_01_06_donglang_create.sql

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

@@ -7,7 +7,7 @@ import java.util.EnumSet;
 
 /**
  * @author lfdc
- * @desc 车辆运单状态枚举
+ * @desc 铲车司机运单状态枚举
  * @date 2023-07-14 14:07:23
  */
 @Getter

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

@@ -0,0 +1,71 @@
+package com.sckw.core.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.EnumSet;
+
+/**
+ * @author lfdc
+ * @desc 车辆往来运单状态枚举
+ * @date 2023-07-14 14:07:23
+ */
+@Getter
+@AllArgsConstructor
+public enum GatekeeperStatusEnum {
+
+    /**
+     * 待进场
+     */
+    PENDING_ENTRY(1,  "待进场"),
+
+    /**
+     * 已进场
+     */
+    IN_YARD(5,  "已进场"),
+
+    /**
+     * 待离场
+     */
+    PENDING_EXIT(10, "待离场"),
+
+    /**
+     * 空载待离场
+     */
+    EMPTY_PENDING_EXIT(15, "空载待离场"),
+
+    /**
+     * 已放行未离场
+     */
+    RELEASED_NOT_EXITED(20, "已放行未离场"),
+
+    /**
+     * 已离场
+     */
+    EXITED(25, "已离场"),
+
+    /**
+     * 空载离场
+     */
+    EMPTY_EXITED(30, "空载离场"),
+
+    ;
+
+    private final Integer code;
+
+    private final String destination;
+
+
+    public static String getDesc(Integer status) {
+        if (status == null) {
+            return null;
+        }
+        for (GatekeeperStatusEnum forkliftStatusEnum : EnumSet.allOf(GatekeeperStatusEnum.class)) {
+            if (forkliftStatusEnum.code.equals(status)) {
+                return forkliftStatusEnum.destination;
+            }
+        }
+        return null;
+    }
+
+}

+ 25 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java

@@ -924,6 +924,31 @@ public class DateUtils extends DateUtil {
         return endDate;
     }
 
+    /**
+     * 计算两个时间之间的小时数(包含小数)
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return 小时数(例如:1.5 表示 1小时30分钟)
+     */
+    public static double hoursBetween(Date startTime, Date endTime) {
+        if (startTime == null || endTime == null) {
+            throw new IllegalArgumentException("时间参数不能为空");
+        }
+
+        // 结束时间必须大于开始时间 校验
+        if (endTime.before(startTime)) {
+            throw new IllegalArgumentException("结束时间必须大于开始时间");
+        }
+
+        // 计算毫秒差
+        long diffMs = endTime.getTime() - startTime.getTime();
+
+        // 毫秒转小时
+        double hours = diffMs / (1000.0 * 3600.0);
+
+        return hours;
+    }
+
 
     public static void main(String[] args) {
         getPreviousMonthsExclusive(5).forEach(x->{

+ 6 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/ForkliftAppController.java → sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppForkliftController.java

@@ -26,10 +26,10 @@ import org.springframework.web.bind.annotation.RestController;
  */
 
 @RestController
-@RequestMapping("/forklift")
+@RequestMapping("/appForklift")
 @RequiredArgsConstructor
-@Tag(name = "APP铲车司机接口", description = "app端轨迹接口")
-public class ForkliftAppController {
+@Tag(name = "APP铲车司机接口", description = "app端铲车司机接口")
+public class AppForkliftController {
 
     private final ForkliftOrderService forkliftOrderService;
 
@@ -66,7 +66,7 @@ public class ForkliftAppController {
      */
     @Operation(summary = "铲车接单", description = "铲车接单")
     @PostMapping("/forkliftOrderTaking")
-    public BaseResult<PageDataResult<ForkliftOrderResp>> forkliftOrderTaking(@RequestBody @Valid ForkliftOrderTakingParam param){
+    public BaseResult forkliftOrderTaking(@RequestBody @Valid ForkliftOrderTakingParam param){
         forkliftOrderService.forkliftOrderTaking(param);
         return BaseResult.success();
     }
@@ -79,7 +79,7 @@ public class ForkliftAppController {
      */
     @Operation(summary = "铲车取消接单", description = "铲车取消接单")
     @PostMapping("/cancelForkliftOrder")
-    public BaseResult<PageDataResult<ForkliftOrderResp>> cancelForkliftOrder(@RequestBody @Valid ForkliftOrderCancelParam param){
+    public BaseResult cancelForkliftOrder(@RequestBody @Valid ForkliftOrderCancelParam param){
         forkliftOrderService.cancelForkliftOrder(param);
         return BaseResult.success();
     }
@@ -92,7 +92,7 @@ public class ForkliftAppController {
      */
     @Operation(summary = "装载完成", description = "装载完成")
     @PostMapping("/loadingCompleted")
-    public BaseResult<PageDataResult<ForkliftOrderResp>> loadingCompleted(@RequestBody @Valid ForkliftOrderCancelParam param){
+    public BaseResult loadingCompleted(@RequestBody @Valid ForkliftOrderCancelParam param){
         forkliftOrderService.loadingCompleted(param);
         return BaseResult.success();
     }

+ 73 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppGatekeeperController.java

@@ -0,0 +1,73 @@
+package com.sckw.transport.controller.enterpriseApp;
+
+
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.core.web.response.result.PageDataResult;
+import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
+import com.sckw.transport.service.app.GatekeeperOrderService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+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: donglang
+ * Time: 2026-01-05
+ * Des: 铲车司机Controller
+ * Version: 1.0
+ */
+
+@RestController
+@RequestMapping("/appGatekeeper")
+@RequiredArgsConstructor
+@Tag(name = "APP门卫接口", description = "app端门卫接口")
+public class AppGatekeeperController {
+
+    private final GatekeeperOrderService gatekeeperOrderService;
+
+    /**
+     * 分页查询门卫订单
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "分页查询门卫订单", description = "分页查询门卫订单")
+    @PostMapping("/pageQueryForkliftOrder")
+    public BaseResult<PageDataResult<GatekeeperOrderResp>> pageQueryForkliftOrder(@RequestBody @Valid GatekeeperOrderQueryParam param){
+        PageDataResult<GatekeeperOrderResp> gatekeeperOrderList = gatekeeperOrderService.pageQueryGatekeeperOrder(param);
+        return BaseResult.success(gatekeeperOrderList);
+    }
+
+    /**
+     * 门卫订单状态统计
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "门卫订单状态统计", description = "门卫订单状态统计")
+    @PostMapping("/statisticsGatekeeperOrder")
+    public BaseResult<StatisticsWaybillResp> statisticsGatekeeperOrder(@RequestBody @Valid GatekeeperOrderQueryParam param){
+        return BaseResult.success(gatekeeperOrderService.statisticsGatekeeperOrder(param));
+    }
+
+    /**
+     * 放行
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "放行", description = "放行")
+    @PostMapping("/pass")
+    public BaseResult pass(@RequestBody @Valid GatekeeperOrderPassParam param){
+        gatekeeperOrderService.pass(param);
+        return BaseResult.success();
+    }
+
+}

+ 17 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtGatekeeperWaybillOrderMapper.java

@@ -0,0 +1,17 @@
+package com.sckw.transport.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.model.KwtForkliftWaybillOrder;
+import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author zk
+ * @desc 门卫车辆订单
+ * @date 2026/01/06
+ */
+@Mapper
+public interface KwtGatekeeperWaybillOrderMapper extends BaseMapper<KwtGatekeeperWaybillOrder> {
+
+
+}

+ 112 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtGatekeeperWaybillOrder.java

@@ -0,0 +1,112 @@
+package com.sckw.transport.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Author: donglang
+ * Time: 2026-03-16
+ * Des: 门卫车辆运单
+ * Version: 1.0
+ */
+
+@Data
+@TableName("kwt_gatekeeper_waybill_order")
+public class KwtGatekeeperWaybillOrder implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5810681430391604257L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 物流运单id
+     */
+    private Long wOrderId;
+
+    /**
+     * 物流订单id
+     */
+    private Long lOrderId;
+
+    /**
+     * 商品id
+     */
+    private Long goodId;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 状态(1-待进场,5-已进场、10-待离场、15-空载待离场、20-已放行未离场、25-已离场、30-空载离场)
+     */
+    private Integer status;
+
+    /**
+     * 进场时间
+     */
+    private Date intoTime;
+
+    /**
+     * 离场时间
+     */
+    private Date leaveTime;
+
+    /**
+     * 运单接单时间
+     */
+    private Date waybillAcceptTime;
+
+    /**
+     * 车辆类型
+     */
+    private String truckType;
+
+    /**
+     * 车辆轴数
+     */
+    private String carAxis;
+
+    /**
+     * 法定载重
+     */
+    private BigDecimal legalLoad;
+
+    /**
+     * 创建时间
+     */
+
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 创建人
+     */
+    private Long createUser;
+
+    /**
+     * 更新人
+     */
+    private Long updateUser;
+
+}

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

@@ -11,7 +11,7 @@ import java.util.Date;
 /**
  * @author :chenXiaoFei
  * @version :1.0
- * @description : 分页查询运单信息响应参数
+ * @description : 分页查询铲车运单信息响应参数
  * @create :2025-11-11 20:16:00
  */
 @Data

+ 171 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/GatekeeperOrderResp.java

@@ -0,0 +1,171 @@
+package com.sckw.transport.model.param.forklift.reponse;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 分页查询门卫运单信息响应参数
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+public class GatekeeperOrderResp implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -6153312023002477484L;
+
+    /**
+     * 门卫订单主键id
+     */
+    @Schema(description = "门卫订单主键id")
+    private Long id;
+
+    /**
+     * 运单编号
+     */
+    @Schema(description = "运单编号")
+    private String wOrderNo;
+
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    private Long entId;
+
+    /**
+     * 物流运单id
+     */
+    @Schema(description = "物流运单id")
+    private Long wOrderId;
+
+    /**
+     * 物流订单id
+     */
+    @Schema(description = "物流订单id")
+    private Long lOrderId;
+
+
+
+    /**
+     * 状态(1-待进场,5-已进场、10-待离场、15-空载待离场、20-已放行未离场、25-已离场、30-空载离场)
+     */
+    @Schema(description = "状态 (1-待进场,5-已进场、10-待离场、15-空载待离场、20-已放行未离场、25-已离场、30-空载离场)")
+    private Integer status;
+
+    /**
+     * 购买企业id
+     */
+    private Long prEntId;
+
+    /**
+     * 购买企业名称
+     */
+    private String prEntName;
+
+    /**
+     * 运输司机车牌主键id
+     */
+    private Long truckId;
+
+    /**
+     * 运输司机车牌号
+     */
+    private String truckNo;
+
+    /**
+     * 运输司机姓名
+     */
+    private String name ;
+
+    /**
+     * 运输司机电话
+     */
+    private String phone;
+
+    /**
+     * 运输司机身份证号
+     */
+    private String idCard;
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 任务量
+     */
+    @Schema(description = "任务量")
+    private BigDecimal taskNum;
+
+    /**
+     * 皮重
+     */
+    @Schema(description = "皮重")
+    private BigDecimal tareAmount;
+
+    /**
+     * 毛重
+     */
+    @Schema(description = "毛重")
+    private BigDecimal grossAmount;
+
+    /**
+     * 车辆类型
+     */
+    @Schema(description = "车辆类型")
+    private String truckType;
+
+    /**
+     * 车辆轴数
+     */
+    @Schema(description = "车辆轴数")
+    private String carAxisName;
+
+    /**
+     * 法定载重
+     */
+    private BigDecimal legalLoad;
+
+    /**
+     * 进场时间
+     */
+    @Schema(description = "进场时间")
+    private Date intoTime;
+
+    /**
+     * 出场时间
+     */
+    @Schema(description = "出场时间")
+    private Date leaveTime;
+
+    /**
+     * 场内耗时
+     */
+    @Schema(description = "场内耗时")
+    private double durationTime;
+
+    /**
+     * 运单接单时间
+     */
+    @Schema(description = "运单接单时间")
+    private Date waybillAcceptTime;
+
+    /**
+     * 更新时间
+     */
+    @Schema(description = "更新时间")
+    private Date updateTime;
+
+}

+ 3 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/ForkliftOrderQueryParam.java

@@ -21,10 +21,10 @@ public class ForkliftOrderQueryParam extends PageReq implements Serializable {
     private static final long serialVersionUID = 8601314159466179906L;
 
     /**
-     * 司机id
+     * 铲车司机id
      */
-    @NotNull(message = "司机id不能为空,")
-    @Schema(description = "司机id")
+    @NotNull(message = "铲车司机id不能为空,")
+    @Schema(description = "铲车司机id")
     private Long driverId;
 
     /**

+ 32 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/GatekeeperOrderPassParam.java

@@ -0,0 +1,32 @@
+package com.sckw.transport.model.param.forklift.request;
+
+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 :2026-01-05 08:59:00
+ */
+@Data
+public class GatekeeperOrderPassParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8601314159466179906L;
+
+    /**
+     * 门卫订单id
+     */
+    @NotNull(message = "门卫订单id不能为空")
+    @Schema(description = "门卫订单id")
+    private Long id;
+
+
+
+
+}

+ 35 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/GatekeeperOrderQueryParam.java

@@ -0,0 +1,35 @@
+package com.sckw.transport.model.param.forklift.request;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description :
+ * @create :2026-01-05 08:59:00
+ */
+@Data
+public class GatekeeperOrderQueryParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5431003248533000828L;
+
+    /**
+     * 搜索关键字
+     */
+    @Schema(description = "搜索关键字")
+    private String keyWords;
+
+    /**
+     * 状态
+     */
+    @Schema(description = "状态 (1-待进场,2-待离场、3-场内车辆、4-异常、5-记录)")
+    private Integer status;
+
+
+}

+ 23 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtGatekeeperWaybillOrderRepository.java

@@ -0,0 +1,23 @@
+package com.sckw.transport.repository;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.dao.KwtGatekeeperWaybillOrderMapper;
+import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author: 门卫车辆订单
+ * @CreateTime: 2025-10-12
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Repository
+public class KwtGatekeeperWaybillOrderRepository extends ServiceImpl<KwtGatekeeperWaybillOrderMapper, KwtGatekeeperWaybillOrder> {
+
+
+
+
+  
+
+}

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/ForkliftOrderService.java

@@ -225,6 +225,7 @@ public class ForkliftOrderService {
         forklift.setAcceptOrderTime(forkliftOrder.getForkliftAcceptTime());
         forklift.setFinishTime(forkliftOrder.getFinishTime());
         forklift.setFinishTime(forkliftOrder.getWaybillAcceptTime());
+        forklift.setWaybillAcceptTime(forkliftOrder.getWaybillAcceptTime());
         forklift.setCarAxisName(forkliftOrder.getCarAxis());
         forklift.setTruckType(forkliftOrder.getTruckType());
 

+ 465 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -0,0 +1,465 @@
+package com.sckw.transport.service.app;
+
+
+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.GatekeeperStatusEnum;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
+import com.sckw.core.web.response.result.PageDataResult;
+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.forklift.reponse.GatekeeperOrderResp;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
+import com.sckw.transport.repository.*;
+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.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Author: donglang
+ * Time: 2026-01-05
+ * Des: 铲车司机Service
+ * Version: 1.0
+ */
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class GatekeeperOrderService {
+
+
+    private final KwtGatekeeperWaybillOrderRepository gatekeeperWaybillOrderRepository;
+
+    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;
+
+
+    @Autowired
+    WaybillOrderService waybillOrderService;
+
+    /**
+     * 分页查询门卫订单
+     * @param param
+     * @return
+     */
+    public PageDataResult<GatekeeperOrderResp> pageQueryGatekeeperOrder(GatekeeperOrderQueryParam param) {
+        log.info("查询门卫订单:{}", JSON.toJSONString(param));
+        LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = Wrappers.<KwtGatekeeperWaybillOrder>lambdaQuery()
+                .orderByDesc(KwtGatekeeperWaybillOrder::getCreateTime)
+                .orderByDesc(KwtGatekeeperWaybillOrder::getId);
+        //待进场
+        if (param.getStatus() == 1) {
+            wrapper.eq(KwtGatekeeperWaybillOrder::getStatus, GatekeeperStatusEnum.PENDING_ENTRY.getCode());
+            //待离场
+        } else if (param.getStatus() == 2) {
+            wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
+                    GatekeeperStatusEnum.PENDING_EXIT.getCode(),
+                    GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode(),
+                    GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
+            //场内车辆,状态为4是:处理场内异常车辆逻辑
+        } else if (param.getStatus() == 3 || param.getStatus() == 4) {
+            wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
+                    GatekeeperStatusEnum.IN_YARD.getCode(),
+                    GatekeeperStatusEnum.PENDING_EXIT.getCode(),
+                    GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode(),
+                    GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
+            //出入记录
+        } else if (param.getStatus() == 5) {
+            wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
+                    GatekeeperStatusEnum.EXITED.getCode(),
+                    GatekeeperStatusEnum.EMPTY_EXITED.getCode());
+        }
+        //查询门卫订单
+        Page<KwtGatekeeperWaybillOrder> pageByStatus = gatekeeperWaybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+        List<KwtGatekeeperWaybillOrder> records = pageByStatus.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前无运单订单信息");
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
+        List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(records);
+        //处理异常车辆数据
+        gatekeeperOrderPageResult = filterGatekeeperOrderResp(param, gatekeeperOrderPageResult);
+
+        //排序
+        sort(param, gatekeeperOrderPageResult);
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), gatekeeperOrderPageResult);
+    }
+
+
+
+    /**
+     * 获取门卫订单数据
+     * @param records
+     * @return
+     */
+    private List<GatekeeperOrderResp> getGatekeeperOrderPageResult(List<KwtGatekeeperWaybillOrder> records) {
+        Set<Long> wOrderIds = records.stream().map(KwtGatekeeperWaybillOrder::getWOrderId).filter(Objects::nonNull).collect(Collectors.toSet());
+        //查询运单
+        List<KwtWaybillOrder> waybillOrders = waybillOrderRepository.queryByBillOrderIds(wOrderIds);
+        if (CollectionUtils.isEmpty(waybillOrders)) {
+            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<String, OrderUnitInfoDetailVO> tradeOrderAndUnit = orderUnitInfoDetailVOS.stream().collect(Collectors.toMap(unit -> unit.getTOrderId() + "-" + unit.getUnitType(), Function.identity(), (x, y) -> x));
+
+        //组装铲车订单数据
+        return records.stream()
+                .map(gatekeeperWaybillOrder -> buildGatekeeperOrderResp(gatekeeperWaybillOrder, waybillOrderMap, subtaskMap, waybillOrderTicketMap, logisticsOrderMap, logisticsOrderGoodsMap, goodsIdAndGoodsMap, dictValueAndDictResDtoMap, tradeOrderAndUnit))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 组装门卫订单信息
+     * @param gatekeeperWaybillOrder
+     * @param waybillOrderMap
+     * @param subtaskMap
+     * @return
+     */
+    private GatekeeperOrderResp buildGatekeeperOrderResp(KwtGatekeeperWaybillOrder gatekeeperWaybillOrder,
+                                                     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) {
+
+        GatekeeperOrderResp gatekeeper = new GatekeeperOrderResp();
+        gatekeeper.setId(gatekeeperWaybillOrder.getId());
+        gatekeeper.setEntId(gatekeeperWaybillOrder.getEntId());
+        gatekeeper.setWOrderId(gatekeeperWaybillOrder.getWOrderId());
+        gatekeeper.setLOrderId(gatekeeperWaybillOrder.getLOrderId());
+        gatekeeper.setStatus(gatekeeperWaybillOrder.getStatus());
+        gatekeeper.setCarAxisName(gatekeeperWaybillOrder.getCarAxis());
+        gatekeeper.setLegalLoad(gatekeeper.getLegalLoad());
+        gatekeeper.setTruckType(gatekeeperWaybillOrder.getTruckType());
+        gatekeeper.setIntoTime(gatekeeperWaybillOrder.getIntoTime());
+        gatekeeper.setLeaveTime(gatekeeperWaybillOrder.getLeaveTime());
+        gatekeeper.setWaybillAcceptTime(gatekeeperWaybillOrder.getWaybillAcceptTime());
+
+        //运单数据
+        KwtWaybillOrder waybillOrder = waybillOrderMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId(), new KwtWaybillOrder());
+        gatekeeper.setTruckId(waybillOrder.getTruckId());
+        gatekeeper.setTruckNo(waybillOrder.getTruckNo());
+        gatekeeper.setName(waybillOrder.getDriverName());
+        gatekeeper.setPhone(waybillOrder.getDriverPhone());
+        gatekeeper.setIdCard(waybillOrder.getDriverIdcard());
+
+        //子运单数据
+        KwtWaybillOrderSubtask subtask = subtaskMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId(), new KwtWaybillOrderSubtask());
+        gatekeeper.setTaskNum(subtask.getEntrustAmount());
+
+        //采购企业信息
+        KwtLogisticsOrder logisticsOrder = logisticsOrderMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrder());
+        OrderUnitInfoDetailVO orderUnit = tradeOrderAndUnit.getOrDefault(logisticsOrder.getTOrderId() + "-" + 1, new OrderUnitInfoDetailVO());
+        gatekeeper.setPrEntId(orderUnit.getEntId());
+        gatekeeper.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<>());
+        gatekeeper.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
+        gatekeeper.setGoodsId(goods.getId());
+
+        //装卸货信息
+        KwtWaybillOrderTicket ticket = waybillOrderTicketMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId() + "-" + 1, new KwtWaybillOrderTicket());
+        gatekeeper.setTareAmount(ticket.getTareAmount());
+        gatekeeper.setGrossAmount(ticket.getGrossAmount());
+
+        return gatekeeper;
+    }
+
+    /**
+     * 处理异常车辆数据
+     * @param param
+     * @param gatekeeperOrderPageResult
+     * @return
+     */
+    private static List<GatekeeperOrderResp> filterGatekeeperOrderResp(GatekeeperOrderQueryParam param, List<GatekeeperOrderResp> gatekeeperOrderPageResult) {
+        double configHours = 0;
+        //处理异常车辆数据
+        if (param.getStatus() != 4) {
+            return gatekeeperOrderPageResult;
+        }
+        return gatekeeperOrderPageResult.stream().filter(order -> {
+            if (order.getIntoTime() == null) {
+                return false;
+            }
+            // 计算已停留小时数
+            double stayHours = DateUtils.hoursBetween(order.getIntoTime(), new Date());
+            order.setDurationTime(stayHours);
+            return stayHours > configHours;
+        }).collect(Collectors.toList());
+    }
+
+    /**
+     * 排序
+     * @param param
+     * @param gatekeeperOrderPageResult
+     */
+    private void sort(GatekeeperOrderQueryParam param, List<GatekeeperOrderResp> gatekeeperOrderPageResult) {
+        // 根据状态进行排序
+        switch (param.getStatus()) {
+            case 1:
+                // 待进场: 运输司机接单时间升序
+                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getWaybillAcceptTime));
+                break;
+            case 2:
+                // 待离场:先按照待离场展示,后按照空载待离场和已放行未离场展示,在按照状态变更时间升序
+                gatekeeperOrderPageResult.sort(Comparator.comparing((GatekeeperOrderResp order) -> order.getStatus() != 10)
+                        .thenComparing(GatekeeperOrderResp::getUpdateTime));
+            case 3:
+                // 场内车辆: 车辆进场时间升序
+                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getIntoTime));
+                break;
+            case 4:
+                // 异常车辆: 场内耗时倒序
+                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getDurationTime).reversed());
+                break;
+            case 5:
+                // 出入记录: 离场时间倒序
+                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getLeaveTime).reversed());
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    /**
+     * 铲车订单状态统计
+     * @param param
+     * @return
+     */
+    public StatisticsWaybillResp statisticsGatekeeperOrder(GatekeeperOrderQueryParam param) {
+        log.info("铲车订单状态统计:{}", JSON.toJSONString(param));
+        StatisticsWaybillResp resp = new StatisticsWaybillResp();
+
+        LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = Wrappers.<KwtGatekeeperWaybillOrder>lambdaQuery()
+                .orderByDesc(KwtGatekeeperWaybillOrder::getCreateTime)
+                .orderByDesc(KwtGatekeeperWaybillOrder::getId);
+
+        //查询门卫订单
+        List<KwtGatekeeperWaybillOrder> orderList = gatekeeperWaybillOrderRepository.list(wrapper);
+        if (CollectionUtils.isEmpty(orderList)) {
+            log.info("当前无门卫统计记录,统计结果为空");
+            resp.setOrderStatusStatistics(buildDefaultStatusStatistics());
+            return resp;
+        }
+        List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(orderList);
+        resp.setOrderStatusStatistics(calculateStatusStatistics(gatekeeperOrderPageResult));
+        return resp;
+
+    }
+
+    /**
+     * 构建默认的状态统计列表(三种状态,数量均为0)
+     * @return 默认统计列表
+     */
+    private List<StatisticsWaybillResp.OrderBillStatusStatistics> buildDefaultStatusStatistics() {
+        List<StatisticsWaybillResp.OrderBillStatusStatistics> defaultList = new ArrayList<>();
+        // 待进场
+        StatisticsWaybillResp.OrderBillStatusStatistics pendingEntry = new StatisticsWaybillResp.OrderBillStatusStatistics();
+        pendingEntry.setOrderStatus("1");
+        pendingEntry.setOrderStatusDesc("待进场");
+        pendingEntry.setOrderNum("0");
+        defaultList.add(pendingEntry);
+        // 待离场
+        StatisticsWaybillResp.OrderBillStatusStatistics pendingExit = new StatisticsWaybillResp.OrderBillStatusStatistics();
+        pendingExit.setOrderStatus("2");
+        pendingExit.setOrderStatusDesc("待离场");
+        pendingExit.setOrderNum("0");
+        defaultList.add(pendingExit);
+        // 场内车辆
+        StatisticsWaybillResp.OrderBillStatusStatistics inPark = new StatisticsWaybillResp.OrderBillStatusStatistics();
+        inPark.setOrderStatus("3");
+        inPark.setOrderStatusDesc("场内车辆");
+        inPark.setOrderNum("0");
+        defaultList.add(inPark);
+        // 异常车辆
+        StatisticsWaybillResp.OrderBillStatusStatistics isAbnormal = new StatisticsWaybillResp.OrderBillStatusStatistics();
+        isAbnormal.setOrderStatus("4");
+        isAbnormal.setOrderStatusDesc("异常车辆");
+        isAbnormal.setOrderNum("0");
+        defaultList.add(isAbnormal);
+
+        return defaultList;
+    }
+
+    /**
+     * 计算运单状态统计
+     * @param gatekeeperOrderList
+     * @return
+     */
+    private static List<StatisticsWaybillResp.OrderBillStatusStatistics> calculateStatusStatistics(List<GatekeeperOrderResp> gatekeeperOrderList) {
+        // 定义状态码聚合规则
+        Map<List<String>, String[]> aggregateRules = Map.of(
+                Arrays.asList("1", "5", "10", "11", "15"), new String[]{"1", "待进场"},
+                Arrays.asList("10", "15", "20"), new String[]{"2", "待离场"},
+                Arrays.asList("5", "10", "15", "20"), new String[]{"3", "场内车辆"},
+                Arrays.asList("5", "10", "15", "20"), new String[]{"4", "异常车辆"}
+        );
+
+        // 按原始状态统计数量
+        Map<String, Long> statusCountMap = gatekeeperOrderList.stream()
+                .collect(Collectors.groupingBy(va ->String.valueOf(va.getStatus()), Collectors.counting()));
+
+        // 进行状态聚合
+        List<StatisticsWaybillResp.OrderBillStatusStatistics> aggregatedList = aggregateRules.entrySet().stream()
+                .map(rule -> {
+                    List<String> originalStatuses = rule.getKey();
+                    String[] aggregateInfo = rule.getValue();
+                    long totalNum = 0;
+
+                    // 处理状态为4的异常车辆
+                    if (Objects.equals(aggregateInfo[0],4)) {
+                        double configHours = 0;
+                        totalNum = gatekeeperOrderList.stream().filter(order -> {
+                            // 1. 必须包含在定义的异常状态源中 (5,10,15,20)
+                            if (!originalStatuses.contains(String.valueOf(order.getStatus()))) {
+                                return false;
+                            }
+                            // 2. 进场时间不为空
+                            if (order.getIntoTime() == null) {
+                                return false;
+                            }
+                            // 3. 计算停留时长
+                            double stayHours = DateUtils.hoursBetween(order.getIntoTime(), new Date());
+                            return stayHours > configHours;
+                        }).count();
+                    } else {
+                        // 汇总对应状态的数量
+                        totalNum = originalStatuses.stream()
+                                .mapToLong(status -> statusCountMap.getOrDefault(status, 0L))
+                                .sum();
+                    }
+
+                    // 构建聚合结果对象
+                    StatisticsWaybillResp.OrderBillStatusStatistics aggregateStat = new StatisticsWaybillResp.OrderBillStatusStatistics();
+                    aggregateStat.setOrderStatus(aggregateInfo[0]); // 聚合状态编码
+                    aggregateStat.setOrderStatusDesc(aggregateInfo[1]); // 聚合状态描述
+                    aggregateStat.setOrderNum(String.valueOf(totalNum)); // 汇总数量
+                    return aggregateStat;
+                })
+                .sorted(Comparator.comparing(StatisticsWaybillResp.OrderBillStatusStatistics::getOrderStatus))
+                .collect(Collectors.toList());
+        return aggregatedList;
+    }
+
+
+
+    /**
+     * 门卫放行
+     * @param param
+     * @return
+     */
+    public void pass(GatekeeperOrderPassParam param) {
+        log.info("门卫放行:{}", JSON.toJSONString(param));
+        KwtGatekeeperWaybillOrder gatekeeperWaybillOrder = gatekeeperWaybillOrderRepository.getById(param.getId());
+        if (gatekeeperWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前车辆订单不存在!");
+        }
+        if (GatekeeperStatusEnum.PENDING_EXIT.getCode().equals(gatekeeperWaybillOrder.getStatus())
+                || GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode().equals(gatekeeperWaybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前车辆订单状态异常,不能装载完成!");
+        }
+        //车辆放行后状态更改为:已放行未离场
+        gatekeeperWaybillOrder.setStatus(GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeperWaybillOrder);
+    }
+
+
+
+}

+ 25 - 0
sql/2026/01/2026_01_06_donglang_create.sql

@@ -25,3 +25,28 @@ create table kwt_forklift_waybill_order
 
     PRIMARY KEY (`id`) USING BTREE
 ) comment '铲车司机运单';
+
+
+
+create table kwt_gatekeeper_waybill_order
+(
+    id                              bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
+    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 '商品名称',
+    status                          int             NOT NULL DEFAULT '0' COMMENT '状态(1-待进场,5-已进场、10-待离场、15-空载待离场、20-已放行未离场、25-已离场、30-空载离场)',
+    into_time                       datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '进场时间',
+    leave_time                      datetime        DEFAULT NULL 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 '车辆轴数',
+    legal_load                      decimal(10,2)   DEFAULT NULL 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 '门卫车辆运单';