Просмотр исходного кода

Merge branch 'refs/heads/dev_20260131' into dev_20260131_youshen430

# Conflicts:
#	sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
tangyishan 1 месяц назад
Родитель
Сommit
694864efef
33 измененных файлов с 570 добавлено и 89 удалено
  1. 108 6
      sckw-auth/src/main/java/com/sckw/auth/service/impl/AuthServiceImpl.java
  2. 1 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java
  3. 2 2
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/LogisticsOrderV1Enum.java
  4. 2 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java
  5. 5 1
      sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/model/dto/req/RegisterReqDto.java
  6. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractLogisticsUnit.java
  7. 0 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckSaveParam.java
  8. 5 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  9. 23 19
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  10. 7 7
      sckw-modules/sckw-order/src/main/java/com/sckw/order/task/TradeOrderTask.java
  11. 12 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsInfoServiceImpl.java
  12. 6 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/repository/KwpGoodsRepository.java
  13. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  14. 10 3
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsMenuService.java
  15. 10 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java
  16. 18 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppForkliftController.java
  17. 26 14
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java
  18. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/EmptyLoadLeaveHandler.java
  19. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LiftRodReleaseHandler.java
  20. 13 9
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java
  21. 4 7
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ReplenishHandler.java
  22. 1 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java
  23. 10 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtGatekeeperWaybillOrder.java
  24. 59 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/ForkliftOrderFilterResp.java
  25. 32 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/ForkliftOrderFilterParam.java
  26. 15 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/GatekeeperOrderPassParam.java
  27. 9 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtForkliftWaybillOrderRepository.java
  28. 2 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderSubtaskRepository.java
  29. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java
  30. 11 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java
  31. 129 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/ForkliftOrderService.java
  32. 42 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java
  33. 3 1
      sql/2026/01/2026_01_06_donglang_create.sql

+ 108 - 6
sckw-auth/src/main/java/com/sckw/auth/service/impl/AuthServiceImpl.java

@@ -168,7 +168,7 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setClientType(loginBase.getClientType());
         loginRes.setSystemType(loginBase.getSystemType());
         loginRes.setToken(token);
-        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null,1);
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null,1,loginRes.getEntTypes());
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
@@ -262,7 +262,7 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setDriverId(user.getDriverId());
         loginRes.setRoleName(user.getRoleName());
         loginRes.setRoleList(user.getRoleInfoDto());
-        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),0);
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),0,loginRes.getEntTypes());
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
@@ -352,7 +352,7 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setRoleId(user.getRoleId());
         loginRes.setRoleName(user.getRoleName());
         loginRes.setRoleList(user.getRoleInfoDto());
-        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),0);
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),0,loginRes.getEntTypes());
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
@@ -858,7 +858,7 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setToken(newToken);
         loginRes.setRefreshToken(newRefreshToken);
         loginRes.setDriverId(driver.getId());
-        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null,1);
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null,1,loginRes.getEntTypes());
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
@@ -896,7 +896,7 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setDriverId(user.getDriverId());
         loginRes.setRoleName(user.getRoleName());
         loginRes.setRoleList(user.getRoleInfoDto());
-        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),1);
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),1,loginRes.getEntTypes());
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
@@ -960,7 +960,7 @@ public class AuthServiceImpl implements IAuthService {
         return false;
     }
 
-    private List<LoginResVo1.TabBarItem> buildAppTabBar(LoginBase loginBase, String roleName,int flag) {
+    private List<LoginResVo1.TabBarItem> buildAppTabBar(LoginBase loginBase, String roleName,int flag,  String entTypeNames) {
         if (!isAppLogin(loginBase)) {
             return List.of();
         }
@@ -974,6 +974,11 @@ public class AuthServiceImpl implements IAuthService {
         boolean isDriver = StringUtils.isNotBlank(roleName) && roleName.contains("司机");
         boolean isLogistics = StringUtils.isNotBlank(roleName) && roleName.contains("物流");
         boolean isFinance = StringUtils.isNotBlank(roleName) && roleName.contains("财务");
+        //企业属性 (1供应商,2采购商,34PL物流,43PL物流)
+        boolean isSupplierAdmin = StringUtils.isNotBlank(roleName) && roleName.contains("供应商管理员") && org.apache.commons.lang3.StringUtils.equals(entTypeNames, "1")  ;
+        boolean isLogisticsAdmin = StringUtils.isNotBlank(roleName) && roleName.contains("物流商管理员") && org.apache.commons.lang3.StringUtils.equals(entTypeNames, "3");
+        boolean isPurchaseAdmin = StringUtils.isNotBlank(roleName) && roleName.contains("采购商管理员") && org.apache.commons.lang3.StringUtils.equals(entTypeNames, "2");
+
         if (isDoorKeeper) {
             return buildDoorKeeperTabBar();
         }
@@ -992,9 +997,106 @@ public class AuthServiceImpl implements IAuthService {
         if (isLogistics){
             return buildLogisticsTabBar();
         }
+        if (isSupplierAdmin){
+            return buildSupplierAdminTabBar();
+        }
+        if (isLogisticsAdmin){
+            return buildLogisticsAdminTabBar();
+        }
+        if (isPurchaseAdmin){
+            return buildPurchaseAdminTabBar();}
         return List.of();
     }
 
+    private List<LoginResVo1.TabBarItem> buildPurchaseAdminTabBar() {
+        List<LoginResVo1.TabBarItem> items = new ArrayList<>();
+        items.add(buildTabBarItem(
+                "商城",
+                "/static/tabbar/mall_select.png",
+                "/static/tabbar/mall.png",
+                "/pages/mall/index"
+        ));
+        items.add(buildTabBarItem(
+                "贸易订单",
+                "/static/tabbar/trade_select.png",
+                "/static/tabbar/trade.png",
+                "/pages/tradeOrder/index"
+        ));
+        items.add(buildTabBarItem(
+                "物流订单",
+                "/static/tabbar/logOrder_select.png",
+                "/static/tabbar/logOrder.png",
+                "/pages/logistics/order/index"
+        ));
+        items.add(buildTabBarItem(
+                "物流运单",
+                "/static/tabbar/waybill_select.png",
+                "/static/tabbar/waybill.png",
+                "/pages/logistics/waybill/index"
+        ));
+        items.add(buildTabBarItem(
+                "个人中心",
+                "/static/tabbar/my_select.png",
+                "/static/tabbar/my.png",
+                "/pages/myCenter/index"
+        ));
+        return items;
+    }
+
+    private List<LoginResVo1.TabBarItem> buildLogisticsAdminTabBar() {
+        List<LoginResVo1.TabBarItem> items = new ArrayList<>();
+
+        items.add(buildTabBarItem(
+                "物流订单",
+                "/static/tabbar/logOrder_select.png",
+                "/static/tabbar/logOrder.png",
+                "/pages/logistics/order/index"
+        ));
+        items.add(buildTabBarItem(
+                "物流运单",
+                "/static/tabbar/waybill_select.png",
+                "/static/tabbar/waybill.png",
+                "/pages/logistics/waybill/index"
+        ));
+        items.add(buildTabBarItem(
+                "个人中心",
+                "/static/tabbar/my_select.png",
+                "/static/tabbar/my.png",
+                "/pages/myCenter/index"
+        ));
+        return items;
+    }
+
+    private List<LoginResVo1.TabBarItem> buildSupplierAdminTabBar() {
+        List<LoginResVo1.TabBarItem> items = new ArrayList<>();
+        items.add(buildTabBarItem(
+                "贸易订单",
+                "/static/tabbar/trade_select.png",
+                "/static/tabbar/trade.png",
+                "/pages/tradeOrder/index"
+        ));
+        items.add(buildTabBarItem(
+                "物流订单",
+                "/static/tabbar/logOrder_select.png",
+                "/static/tabbar/logOrder.png",
+                "/pages/logistics/order/index"
+        ));
+        items.add(buildTabBarItem(
+                "物流运单",
+                "/static/tabbar/waybill_select.png",
+                "/static/tabbar/waybill.png",
+                "/pages/logistics/waybill/index"
+        ));
+        items.add(buildTabBarItem(
+                "个人中心",
+                "/static/tabbar/my_select.png",
+                "/static/tabbar/my.png",
+                "/pages/myCenter/index"
+        ));
+        return items;
+
+    }
+
     private List<LoginResVo1.TabBarItem> buildSellerTabBar() {
         List<LoginResVo1.TabBarItem> items = new ArrayList<>();
         items.add(buildTabBarItem(

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

@@ -30,7 +30,7 @@ public enum CarWaybillV1Enum {
     /**
      * 离场过磅:  弃用
      */
-    WEIGHT_TRAFFIC(11, "离场过磅"),
+    WEIGHT_TRAFFIC(110, "离场过磅"),
 
 
     /**

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

@@ -18,7 +18,7 @@ public enum LogisticsOrderV1Enum {
     /**
      * 物流订单-待接单
      */
-    PENDING_ORDER(1, "pendingOrder", "1", "待处理"),
+  //  PENDING_ORDER(1, "pendingOrder", "1", "待处理"),
     /**
      * 物流订单-待派车
      */
@@ -36,7 +36,7 @@ public enum LogisticsOrderV1Enum {
      */
     COMPLETED(20, "haveReconciled", "20", "已完成"),
 
-    REJECT_ORDER(99, "rejectOrder", "99", "已拒单"),
+    //REJECT_ORDER(99, "rejectOrder", "99", "已拒单"),
 
     ;
 

+ 2 - 0
sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java

@@ -82,4 +82,6 @@ public interface GoodsInfoService {
     List<KwpGoods> findGoodsByGoodsName(String goodsName);
 
     AddressInfoDetail getGoodsAddress(Long goodsId);
+
+    List<KwpGoods> queryGoodsByEntId(Long entId);
 }

+ 5 - 1
sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/model/dto/req/RegisterReqDto.java

@@ -1,5 +1,6 @@
 package com.sckw.system.api.model.dto.req;
 
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 import java.io.Serial;
@@ -55,6 +56,9 @@ public class RegisterReqDto implements Serializable {
      * 当前使用系统专场标识
      */
     private String special;
-
+    /**
+     * 企业类型 多个类型用","隔开
+     */
+    private String entTypes;
 
 }

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractLogisticsUnit.java

@@ -26,7 +26,7 @@ public class KwcContractLogisticsUnit implements Serializable {
     private Long contractId;
 
     /**
-     * 单位类型(1托运单位、2承运单位)
+     * 单位类型(3托运单位、4承运单位)
      */
     private Integer unitType;
 

+ 0 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckSaveParam.java

@@ -71,7 +71,6 @@ public class TruckSaveParam implements Serializable {
     /**
      * 排放标准(1-国四、2-国五、3-国六)
      */
-    @NotNull(message = "排放标准不能为空")
     @Schema(description = "排放标准(1-国四、2-国五、3-国六)")
     private Integer eev;
 

+ 5 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -2205,6 +2205,11 @@ public class KwfTruckService {
      */
     public void saveTruck(TruckSaveParam param) {
         log.info("保存车辆,id:{}", JSON.toJSONString(param));
+        if (Objects.equals(param.getEnergyType(), TruckEnergyTypeEnum.TRADITIONAL.getCode())) {
+            if (param.getEev() == null) {
+                throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "传统能源车辆的排放标准不能为空!");
+            }
+        }
 
         // 新增
         if (param.getId() == null) {

+ 23 - 19
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -2226,7 +2226,7 @@ public class KwoTradeOrderService {
         List<TradeContractUnitDto> unitList = tradeContractResDto.getUnitList();
         List<KwoTradeOrderUnit> list = new ArrayList<>();
         WalletPrepaidDto walletFreeze = new WalletPrepaidDto();
-        walletFreeze.setOrderNo(String.valueOf(order.getId()));
+        walletFreeze.setOrderNo(order.getTOrderNo());
         walletFreeze.setTradeAmount(order.getPrice());
         unitList.forEach(e -> {
             KwoTradeOrderUnit unit = BeanUtil.copyProperties(e, KwoTradeOrderUnit.class);
@@ -2255,6 +2255,7 @@ public class KwoTradeOrderService {
             walletFreeze.setOrderType(4);
             walletFreeze.setTradeType(4);
             walletFreeze.setRemark("贸易订单号:" + walletFreeze.getOrderNo() + ",下单冻结");
+            log.info("贸易订单号:{},订单下单调用钱包服务冻结预付余额,参数:{}", walletFreeze.getOrderNo(),JSON.toJSONString(walletFreeze));
             freezeBaseResult = paymentFeignService.updatePrepaidBalance(walletFreeze);
         }
 
@@ -2294,23 +2295,23 @@ public class KwoTradeOrderService {
                 freezeDto.setSupEntId(unit.getEntId());
             }
         });
-        freezeDto.setOrderNo(String.valueOf(order.getId()));
+        freezeDto.setOrderNo(order.getTOrderNo());
         freezeDto.setOrderType(4);
         freezeDto.setTradeType(5);
         freezeDto.setRemark("贸易订单号:" + freezeDto.getOrderNo() + ",撤销订单");
         BaseResult<Object> balanceResult;
         try {
+            log.info("贸易订单号:{},订单撤销调用钱包服务解冻预付余额,参数:{}", freezeDto.getOrderNo(),JSON.toJSONString(freezeDto));
             balanceResult = paymentFeignService.updatePrepaidBalance(freezeDto);
         } catch (Exception e) {
-            log.error("线下钱包扣减预付余额、增加冻结金额异常", e);
-            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额异常");
+            String errMsg = freezeDto.getRemark()+"异常";
+            log.error(errMsg, e);
+            throw new BusinessException(errMsg);
         }
-        if (balanceResult == null || balanceResult.getCode() != HttpStatus.SUCCESS_CODE) {
-            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额失败");
-        }
-        Boolean aBoolean = (Boolean) balanceResult.getData();
-        if (!Boolean.TRUE.equals(aBoolean)) {
-            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额失败");
+        if (balanceResult == null || balanceResult.getCode() != HttpStatus.SUCCESS_CODE || !Boolean.TRUE.equals(balanceResult.getData())) {
+            String errMsg = freezeDto.getRemark()+"失败";
+            log.error("{}:{}", errMsg, balanceResult != null ? balanceResult.getMessage(): "");
+            throw new BusinessException(errMsg);
         }
 
         // 3. 贸易合同该商品有采购数量,则更新采购数量(加回本单总量)
@@ -2434,9 +2435,9 @@ public class KwoTradeOrderService {
             //钱包退回金额
             WalletPrepaidDto walletFreeze = new WalletPrepaidDto();
 //            walletFreeze.setTTradeOrderId(kwoTradeOrder.getId());
-            walletFreeze.setOrderNo(String.valueOf(kwoTradeOrder.getId()));
-            walletFreeze.setProEntId(unitMap.get(String.valueOf(CooperateTypeEnum.PURCHASER.getCode())).getEntId());
-            walletFreeze.setSupEntId(unitMap.get(String.valueOf(CooperateTypeEnum.SUPPLIER.getCode())).getEntId());
+            walletFreeze.setOrderNo(kwoTradeOrder.getTOrderNo());
+            walletFreeze.setProEntId(unitMap.get(String.valueOf(1)).getEntId());
+            walletFreeze.setSupEntId(unitMap.get(String.valueOf(2)).getEntId());
             walletFreeze.setOrderType(4);
             walletFreeze.setTradeType(5);
             walletFreeze.setRemark("贸易订单:" + walletFreeze.getOrderNo() + ",审核拒绝解冻");
@@ -2448,6 +2449,7 @@ public class KwoTradeOrderService {
 
             } else if (Objects.equals(kwoTradeOrder.getSettlement(), 2)) {
                 //预付制结算解冻
+                log.info("贸易订单号:{},订单审核拒绝调用钱包服务解冻预付余额,参数:{}", walletFreeze.getOrderNo(),JSON.toJSONString(walletFreeze));
                 booleanBaseResult = paymentFeignService.updatePrepaidBalance(walletFreeze);
             }
             if (booleanBaseResult.getCode() != 60200) {
@@ -2840,12 +2842,13 @@ public class KwoTradeOrderService {
                 }
                 //钱包退回金额
                 WalletPrepaidDto unFreezePrepaidDto = new WalletPrepaidDto();
-                unFreezePrepaidDto.setOrderNo(String.valueOf(kwoTradeOrder.getId()));
-                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(CooperateTypeEnum.PURCHASER.getCode())).getEntId());
-                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(CooperateTypeEnum.SUPPLIER.getCode())).getEntId());
+                unFreezePrepaidDto.setOrderNo(kwoTradeOrder.getTOrderNo());
+                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(1)).getEntId());
+                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(2)).getEntId());
                 unFreezePrepaidDto.setOrderType(4);
                 unFreezePrepaidDto.setTradeType(5);
                 unFreezePrepaidDto.setRemark("贸易订单:" + unFreezePrepaidDto.getOrderNo() + ",");
+                log.info("贸易订单号:{},订单完结调用钱包服务解冻预付余额,参数:{}", unFreezePrepaidDto.getOrderNo(),JSON.toJSONString(unFreezePrepaidDto));
                 BaseResult<Object> unFreezeResult = paymentFeignService.updatePrepaidBalance(unFreezePrepaidDto);
                 if (unFreezeResult.getCode() != HttpStatus.SUCCESS_CODE) {
                     log.error("贸易订单号:{},订单完结解冻失败,异常信息为:{}", unFreezePrepaidDto.getOrderNo(), unFreezeResult.getMessage());
@@ -2853,13 +2856,14 @@ public class KwoTradeOrderService {
                 }
                 //2计算订单金额
                 WalletPrepaidDto consumePrepaidDto = new WalletPrepaidDto();
-                unFreezePrepaidDto.setOrderNo(String.valueOf(kwoTradeOrder.getId()));
-                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(CooperateTypeEnum.PURCHASER.getCode())).getEntId());
-                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(CooperateTypeEnum.SUPPLIER.getCode())).getEntId());
+                unFreezePrepaidDto.setOrderNo(kwoTradeOrder.getTOrderNo());
+                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(1)).getEntId());
+                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(2)).getEntId());
                 unFreezePrepaidDto.setOrderType(4);
                 unFreezePrepaidDto.setTradeType(6);
                 consumePrepaidDto.setTradeAmount(kwoTradeOrder.getPrice());
                 consumePrepaidDto.setRemark("贸易订单号:" + consumePrepaidDto.getOrderNo() + ",订单完结消费");
+                log.info("贸易订单号:{},订单完结调用钱包服务消费预付余额,参数:{}", consumePrepaidDto.getOrderNo(),JSON.toJSONString(consumePrepaidDto));
                 BaseResult<Object> consumeResult = paymentFeignService.updatePrepaidBalance(consumePrepaidDto);
                 if (consumeResult.getCode() != HttpStatus.SUCCESS_CODE) {
                     log.error("贸易订单号:{},订单完结消费失败,异常信息为:{}", consumePrepaidDto.getOrderNo(), consumeResult.getMessage());

+ 7 - 7
sckw-modules/sckw-order/src/main/java/com/sckw/order/task/TradeOrderTask.java

@@ -122,7 +122,7 @@ public class TradeOrderTask {
                         }
                     });
                 } else {
-                    if (logisticOrderList.stream().allMatch(d -> Arrays.asList(LogisticsOrderV1Enum.COMPLETED.getCode(), LogisticsOrderV1Enum.REJECT_ORDER.getCode()).contains(d.getStatus()))) {
+                    if (logisticOrderList.stream().allMatch(d -> Arrays.asList(LogisticsOrderV1Enum.COMPLETED.getCode()).contains(d.getStatus()))) {
                         threadPoolExecutor.execute(() -> {
                             try {
                                 List<KwoTradeOrderUnit> orderUnits = kwoTradeOrderUnitMapper.selectList(new LambdaQueryWrapper<KwoTradeOrderUnit>().eq(KwoTradeOrderUnit::getTOrderId, kwoTradeOrder.getId()).eq(KwoTradeOrderUnit::getDelFlag, 0));
@@ -266,8 +266,8 @@ public class TradeOrderTask {
                 //钱包退回金额
                 WalletPrepaidDto unFreezePrepaidDto = new WalletPrepaidDto();
                 unFreezePrepaidDto.setOrderNo(kwoTradeOrder.getTOrderNo());
-                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(CooperateTypeEnum.PURCHASER.getCode())).getEntId());
-                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(CooperateTypeEnum.SUPPLIER.getCode())).getEntId());
+                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(1)).getEntId());
+                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(2)).getEntId());
                 unFreezePrepaidDto.setOrderType(4);
                 unFreezePrepaidDto.setTradeType(5);
                 unFreezePrepaidDto.setRemark("贸易订单:" + unFreezePrepaidDto.getOrderNo() + ",");
@@ -280,8 +280,8 @@ public class TradeOrderTask {
                 //2计算订单金额
                 WalletPrepaidDto consumePrepaidDto = new WalletPrepaidDto();
                 unFreezePrepaidDto.setOrderNo(kwoTradeOrder.getTOrderNo());
-                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(CooperateTypeEnum.PURCHASER.getCode())).getEntId());
-                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(CooperateTypeEnum.SUPPLIER.getCode())).getEntId());
+                unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(1)).getEntId());
+                unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(2)).getEntId());
                 unFreezePrepaidDto.setOrderType(4);
                 unFreezePrepaidDto.setTradeType(6);
                 consumePrepaidDto.setTradeAmount(kwoTradeOrder.getPrice());
@@ -306,8 +306,8 @@ public class TradeOrderTask {
         //钱包退回金额
         WalletPrepaidDto unFreezePrepaidDto = new WalletPrepaidDto();
         unFreezePrepaidDto.setOrderNo(kwoTradeOrder.getTOrderNo());
-        unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(CooperateTypeEnum.PURCHASER.getCode())).getEntId());
-        unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(CooperateTypeEnum.SUPPLIER.getCode())).getEntId());
+        unFreezePrepaidDto.setProEntId(unitMap.get(String.valueOf(1)).getEntId());
+        unFreezePrepaidDto.setSupEntId(unitMap.get(String.valueOf(2)).getEntId());
         unFreezePrepaidDto.setOrderType(4);
         unFreezePrepaidDto.setTradeType(5);
         unFreezePrepaidDto.setRemark("贸易订单:" + unFreezePrepaidDto.getOrderNo() + ",");

+ 12 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsInfoServiceImpl.java

@@ -190,4 +190,16 @@ public class GoodsInfoServiceImpl implements GoodsInfoService {
         goods.setDelFlag(g.getDelFlag());
         return goods;
     }
+
+    @Override
+    public List<KwpGoods> queryGoodsByEntId(Long entId) {
+        List<com.sckw.product.model.KwpGoods> kwpGoods = kwpGoodsRepository.queryGoodsByEntId(entId);
+        if (CollectionUtils.isEmpty(kwpGoods)){
+            return Collections.emptyList();
+        }
+
+        return kwpGoods.stream()
+                .map(GoodsInfoServiceImpl::getKwpGoods)
+                .collect(Collectors.toList());
+    }
 }

+ 6 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/repository/KwpGoodsRepository.java

@@ -39,4 +39,10 @@ public class KwpGoodsRepository extends ServiceImpl<KwpGoodsMapper, KwpGoods> {
                 .eq(KwpGoods::getDelFlag,0)
                 .like(StringUtils.isNotBlank(goodsName),KwpGoods::getName,goodsName));
     }
+
+    public List<KwpGoods> queryGoodsByEntId(Long entId) {
+        return list(Wrappers.<KwpGoods>lambdaQuery()
+                .eq(KwpGoods::getEntId,entId)
+                .eq(KwpGoods::getDelFlag,0));
+    }
 }

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -836,6 +836,7 @@ public class KwsEnterpriseService {
             registerReqDto.setPhone(reqVo.getPhone());
             registerReqDto.setIsMain(Global.YES);
             registerReqDto.setSystemType(SystemTypeEnum.COMPANY.getCode());
+            registerReqDto.setEntTypes(reqVo.getEntTypes());
             RegisterResDto register = kwsUserService.register(registerReqDto);
 
             EntRegisterReqVo entRegisterReqVo = new EntRegisterReqVo();

+ 10 - 3
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsMenuService.java

@@ -643,7 +643,7 @@ public class KwsMenuService {
 //            if (Boolean.TRUE.equals(reqVo.getIncludeButton())) {
 //
 //            }
-            finalList = supplementButtons(finalList);
+            finalList = supplementButtons(finalList, findMenuTreePojo.getEntTypeList());
         }
 
 
@@ -723,7 +723,7 @@ public class KwsMenuService {
      * 查询所有菜单类型节点(type=1)的子按钮(type=2),
      * 合并到列表中以便递归构建包含按钮的完整树。
      */
-    private List<KwsMenuResVo> supplementButtons(List<KwsMenuResVo> menuList) {
+    private List<KwsMenuResVo> supplementButtons(List<KwsMenuResVo> menuList, List<String> entTypeList) {
         List<Long> menuTypeIds = menuList.stream()
                 .filter(m -> Objects.equals(m.getType(), MenuTypeEnum.DIRECTORY.getCode()))
                 .map(KwsMenuResVo::getId)
@@ -732,7 +732,14 @@ public class KwsMenuService {
             return menuList;
         }
 
-        List<KwsMenu> buttons = kwsMenuDao.selectByParentIds(menuTypeIds, MenuTypeEnum.BUTTON.getCode());
+        LambdaQueryWrapper<KwsMenu> buttonWrapper = Wrappers.lambdaQuery(KwsMenu.class)
+                .eq(KwsMenu::getDelFlag, Global.NO)
+                .eq(KwsMenu::getType, MenuTypeEnum.BUTTON.getCode())
+                .in(KwsMenu::getParentId, menuTypeIds)
+                .orderByAsc(KwsMenu::getSort);
+        appendUsingRolesFilter(buttonWrapper, entTypeList);
+
+        List<KwsMenu> buttons = kwsMenuMpMapper.selectList(buttonWrapper);
         if (CollectionUtils.isEmpty(buttons)) {
             return menuList;
         }

+ 10 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java

@@ -243,7 +243,16 @@ public class KwsUserService {
                 throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.MENU_NOT_EXISTS);
             }
             kwsMenus = kwsMenus.stream().filter(item -> item.getClientType().equals(Global.NUMERICAL_TWO)).collect(Collectors.toList());
-            editRoleReqVo.setName(Global.MANAGE_NAME);
+
+            //企业属性 (1供应商,2采购商,34PL物流,43PL物流)
+            if (org.apache.commons.lang3.StringUtils.equals("1",reqDto.getEntTypes())){
+                editRoleReqVo.setName("供应商管理员");
+            }else if (org.apache.commons.lang3.StringUtils.equals("2",reqDto.getEntTypes())){
+                editRoleReqVo.setName("采购商管理员");
+            }else if (org.apache.commons.lang3.StringUtils.equals("3",reqDto.getEntTypes())){
+                editRoleReqVo.setName("物流商管理员");
+            }
+           // editRoleReqVo.setName(Global.MANAGE_NAME);
             editRoleReqVo.setCurrentUnitId(null);
             editRoleReqVo.setMenuIds(String.join(Global.COMMA, kwsMenus.stream().map(KwsMenu::getId).map(String::valueOf).toList()));
             editRoleReqVo.setVisiblePersonal(false);

+ 18 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppForkliftController.java

@@ -3,8 +3,10 @@ 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.ForkliftOrderFilterResp;
 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.ForkliftOrderFilterParam;
 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;
@@ -18,6 +20,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * Author: donglang
  * Time: 2026-01-05
@@ -46,6 +50,20 @@ public class AppForkliftController {
         return BaseResult.success(LogisticsOrderList);
     }
 
+    /**
+     * 筛选
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "筛选", description = "筛选")
+    @PostMapping("/filterQuery")
+    public BaseResult<List<ForkliftOrderFilterResp>> filterQuery(@RequestBody @Valid ForkliftOrderFilterParam param){
+        List<ForkliftOrderFilterResp> LogisticsOrderList = forkliftOrderService.filterQuery(param);
+        return BaseResult.success(LogisticsOrderList);
+    }
+
+
     /**
      * 铲车订单状态统计
      *

+ 26 - 14
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -145,16 +145,13 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
                 KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
                 KwpGoods goods = goodsInfoService.getGoodsById(orderGoods.getGoodsId());
                 if (goods != null) {
-                    List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), orderGoods.getGoodsType());
+                    List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.GOODS_SPEC.getType(), goods.getSpec());
                     forklift.setDictId(CollectionUtils.isNotEmpty(dictResDtoList) ? dictResDtoList.get(0).getId() : -1L);
                     forklift.setGoodsId(goods.getId());
                     forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
                 }
                 forklift.setLoadingType(LoadingTypeEnum.LOADING.getCode());
                 forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
-                forklift.setDriverId(waybillOrder.getDriverId());
-                forklift.setDriverName(waybillOrder.getDriverName());
-                forklift.setDriverPhone(waybillOrder.getDriverPhone());
                 forklift.setWaybillAcceptTime(waybillOrder.getCreateTime());
 
                 // 任务量
@@ -194,11 +191,12 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         }
         //修改门卫已进场
         gatekeeper.setStatus(GatekeeperStatusEnum.IN_YARD.getCode());
+        gatekeeper.setIntoTime(new Date());
         gatekeeperWaybillOrderRepository.updateById(gatekeeper);
     }
 
     /**
-     * 创建铲车记录
+     * 创建过磅记录
      * @param waybillOrder
      */
     private void createWeighbridges(KwtWaybillOrder waybillOrder) {
@@ -363,30 +361,44 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      */
     @Override
     protected void createNodeTrace(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        if (checkIsFirst(waybillOrder)) {
-            // 第一条:装载完成
+        List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository.queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId());
+        if (CollectionUtils.isEmpty(weighbridges)) {
+            // 第一条:称重完成
             KwtWaybillOrderNode node1 = getWaybillOrderNode(param, waybillOrder);
             node1.setRemark("车辆[" + waybillOrder.getTruckNo() + "]已到达装货点");
             waybillOrderNodeRepository.save(node1);
             log.info("记录【已装货】节点轨迹成功,节点ID:{}", node1.getId());
             // 间隔5秒钟,防止时间相同
             Date fiveSecondsLater = new Date(System.currentTimeMillis() + 5000);
+
             // 第二条:称重信息
             KwtWaybillOrderNode node2 = getWaybillOrderNode(param, waybillOrder);
             String tareAmount = Objects.isNull(param.getTareAmount()) ? "0.00" : param.getTareAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
             node2.setRemark("[" + param.getWeighbridgeName() + "]首次称重[" + tareAmount + "吨]");
             node2.setCreateTime(fiveSecondsLater);
             waybillOrderNodeRepository.save(node2);
-            log.info("记录【称重】节点轨迹成功,节点ID:{}", node2.getId());
+            log.info("记录【过磅称重】节点轨迹成功,节点ID:{}", node2.getId());
         } else {
-            if (this.targetStatus == null) {
-                throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[离场过磅]是否空载离场数据为空!");
-            }
-            String remark = buildRemark(waybillOrder, param, this.targetStatus);
+            // 第一条:称重完成
             KwtWaybillOrderNode node1 = getWaybillOrderNode(param, waybillOrder);
-            node1.setRemark(remark);
+            //过磅次数
+            int size = weighbridges.size() + 1;
+            String grossAmount = Objects.isNull(param.getGrossAmount()) ? "0.00" : param.getGrossAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
+            node1.setRemark("第" + size + "次称重,[" + param.getWeighbridgeName() +  "]称重["  + grossAmount + "吨]");
             waybillOrderNodeRepository.save(node1);
-            log.info("记录【多次过磅】节点轨迹成功,节点ID:{}", node1.getId());
+            log.info("记录【过磅称重】节点轨迹成功,节点ID:{}", node1.getId());
+
+            // 间隔5秒钟,防止时间相同
+//            Date fiveSecondsLater = new Date(System.currentTimeMillis() + 5000);
+//            if (this.targetStatus == null) {
+//                throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[离场过磅]是否空载离场数据为空!");
+//            }
+//            String remark = buildRemark(waybillOrder, param, this.targetStatus);
+//            KwtWaybillOrderNode node2 = getWaybillOrderNode(param, waybillOrder);
+//            node2.setRemark(remark);
+//            node2.setCreateTime(fiveSecondsLater);
+//            waybillOrderNodeRepository.save(node2);
+//            log.info("记录【多次过磅】节点轨迹成功,节点ID:{}", node2.getId());
         }
     }
 

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

@@ -91,6 +91,6 @@ public class EmptyLoadLeaveHandler extends AbstractWaybillOrderHandler<WaybillOr
 
     @Override
     protected String getRemark(WaybillOrderEmptyLoadLeaveParam param, KwtWaybillOrder waybillOrder) {
-        return "司机[" + waybillOrder.getDriverName() + "]空载待放行";
+        return "司机[" + waybillOrder.getDriverName() + "]已确认空载离场";
     }
 }

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LiftRodReleaseHandler.java

@@ -124,6 +124,6 @@ public class LiftRodReleaseHandler extends AbstractWaybillOrderHandler<WaybillOr
 
     @Override
     protected String getRemark(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybillOrder) {
-        return "司机[" + waybillOrder.getDriverName() + "]已确认离场";
+        return "司机[" + waybillOrder.getDriverName() + "]已离场";
     }
 }

+ 13 - 9
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java

@@ -4,15 +4,13 @@ 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.utils.CollectionUtils;
+import com.sckw.transport.model.KwtForkliftWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
-import com.sckw.transport.model.KwtWaybillOrderWeighbridge;
 import com.sckw.transport.model.param.WaybillOrderLoadingParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
 import java.util.Objects;
 
 /**
@@ -32,8 +30,9 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
 
     @Override
     protected void checkState(WaybillOrderLoadingParam param, KwtWaybillOrder waybillOrder) {
-        if (!Objects.equals(CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(), waybillOrder.getStatus())) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“到达装货地点”状态, 无法推进下一节点!");
+        if (!Objects.equals(CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(), waybillOrder.getStatus())
+                && !Objects.equals(CarWaybillV1Enum.REPLENISHING.getCode(), waybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“到达装货地点”或“卸货中”状态, 无法推进下一节点!");
         }
     }
 
@@ -54,10 +53,9 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
 
     @Override
     protected void getStatus(KwtWaybillOrder waybillOrder) {
-        List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository
-                .queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId());
         //第一次过磅,状态为:已装货;后续过磅,状态为:补货完成
-        CarWaybillV1Enum status = CollectionUtils.isEmpty(weighbridges) ?  CarWaybillV1Enum.EXIT_COMPLETED : CarWaybillV1Enum.REPLENISH_FINISH;
+        CarWaybillV1Enum status = Objects.equals(waybillOrder.getStatus(), CarWaybillV1Enum.REFUSE_TRAFFIC.getCode())
+                ? CarWaybillV1Enum.EXIT_COMPLETED : CarWaybillV1Enum.REPLENISH_FINISH;
 
         // 1. 修改运单状态
         waybillOrder.setStatus(status.getCode());
@@ -72,6 +70,12 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
 
     @Override
     protected String getRemark(WaybillOrderLoadingParam param, KwtWaybillOrder waybillOrder) {
-        return "[" + waybillOrder.getDriverName() + "]已装载完成";
+        // 查询铲车订单
+        KwtForkliftWaybillOrder forkliftWaybillOrder = forkliftWaybillOrderRepository
+                .queryForkliftWaybillOrderByWOrderId(waybillOrder.getId());
+        if (forkliftWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前铲车订单不存在!");
+        }
+        return "装载员[" + forkliftWaybillOrder.getDriverName() + "]已完成装载,装载单号[" + forkliftWaybillOrder.getFOrderNo() + "]";
     }
 }

+ 4 - 7
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ReplenishHandler.java

@@ -40,8 +40,8 @@ public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderRe
 
     @Override
     protected void checkState(WaybillOrderReplenishParam param, KwtWaybillOrder waybill) {
-        if (!Objects.equals(CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(), waybill.getStatus())) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“空载待离场”状态, 无法推进下一节点!");
+        if (!Objects.equals(CarWaybillV1Enum.WAIT_LEAVE.getCode(), waybill.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“待离场”状态, 无法推进下一节点!");
         }
     }
 
@@ -76,16 +76,13 @@ public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderRe
                 KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
                 KwpGoods goods = goodsInfoService.getGoodsById(orderGoods.getGoodsId());
                 if (goods != null) {
-                    List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), orderGoods.getGoodsType());
+                    List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.GOODS_SPEC.getType(), goods.getSpec());
                     forklift.setDictId(CollectionUtils.isNotEmpty(dictResDtoList) ? dictResDtoList.get(0).getId() : -1L);
                     forklift.setGoodsId(goods.getId());
                     forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
                 }
                 forklift.setLoadingType(LoadingTypeEnum.SUPPLEMENT.getCode());
                 forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
-                forklift.setDriverId(waybillOrder.getDriverId());
-                forklift.setDriverName(waybillOrder.getDriverName());
-                forklift.setDriverPhone(waybillOrder.getDriverPhone());
                 forklift.setWaybillAcceptTime(waybillOrder.getCreateTime());
 
                 // 任务量
@@ -133,6 +130,6 @@ public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderRe
 
     @Override
     protected String getRemark(WaybillOrderReplenishParam param, KwtWaybillOrder waybillOrder) {
-        return "司机[" + waybillOrder.getDriverName() + "]已确认补货";
+        return "司机[" + waybillOrder.getDriverName() + "]返场补货";
     }
 }

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -157,6 +157,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
                     gatekeeper.setGoodsId(orderGoods.getGoodsId());
                     gatekeeper.setGoodsName(orderGoods.getGoodsName());
                 }
+                gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
                 gatekeeper.setStatus(GatekeeperStatusEnum.PENDING_ENTRY.getCode());
                 gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
                 gatekeeper.setTruckType(truck.getTruckType());

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

@@ -73,6 +73,16 @@ public class KwtGatekeeperWaybillOrder implements Serializable {
      */
     private Date leaveTime;
 
+    /**
+     * 门卫id
+     */
+    private Long gatekeeperUserId;
+
+    /**
+     * 门卫姓名
+     */
+    private String gatekeeperName;
+
     /**
      * 运单接单时间
      */

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

@@ -0,0 +1,59 @@
+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.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 铲车筛选返回
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+public class ForkliftOrderFilterResp implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5633966065692727347L;
+
+    /**
+     * 商品类别名称
+     */
+    @Schema(description = "商品一级名称")
+    private String groupName;
+
+    /**
+     * 商品类别值
+     */
+    private String groupValue;
+
+    /**
+     * 规格类别
+     */
+    private List<SpecOptionDTO> options = new ArrayList<>();
+
+
+    @Data
+    public static class SpecOptionDTO {
+
+        /**
+         * 类型id
+         */
+        private Long id;
+
+        /**
+         * 名称
+         */
+        private String label;
+
+        /**
+         * 实际值
+         */
+        private String value;
+    }
+
+    }

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

@@ -0,0 +1,32 @@
+package com.sckw.transport.model.param.forklift.request;
+
+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 :2026-01-05 08:59:00
+ */
+@Data
+public class ForkliftOrderFilterParam extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 527604637646248848L;
+
+    /**
+     * 归属企业id
+     */
+    @NotNull(message = "归属企业id不能为空!")
+    @Schema(description = "归属企业id")
+    private Long entId;
+
+
+
+}

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

@@ -1,6 +1,7 @@
 package com.sckw.transport.model.param.forklift.request;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -26,6 +27,20 @@ public class GatekeeperOrderPassParam implements Serializable {
     @Schema(description = "门卫订单id")
     private Long id;
 
+    /**
+     * 门卫id
+     */
+    @NotNull(message = "门卫id不能为空")
+    @Schema(description = "门卫id")
+    private Long gatekeeperUserId;
+
+    /**
+     * 门卫姓名
+     */
+    @NotBlank(message = "门卫姓名不能为空")
+    @Schema(description = "门卫姓名")
+    private String gatekeeperName;
+
 
 
 

+ 9 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtForkliftWaybillOrderRepository.java

@@ -50,7 +50,15 @@ public class KwtForkliftWaybillOrderRepository extends ServiceImpl<KwtForkliftWa
                 .last("limit 1"));
     }
 
+    public KwtForkliftWaybillOrder queryForkliftWaybillOrderByWOrderId(Long wOrderId) {
+        return getOne(Wrappers.<KwtForkliftWaybillOrder>lambdaQuery()
+                .eq(KwtForkliftWaybillOrder::getWOrderId, wOrderId)
+                .orderByDesc(KwtForkliftWaybillOrder::getId)
+                .last("limit 1"));
+    }
+
+
+
 
-  
 
 }

+ 2 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderSubtaskRepository.java

@@ -66,12 +66,14 @@ public class KwtWaybillOrderSubtaskRepository extends ServiceImpl<KwtWaybillOrde
 
     public IPage<KwtWaybillOrderSubtask> queryByPage( Set<Long> logOrderIds, Set<Long> billOrderIds,
                                                      Integer status,
+                                                      List<Integer> waybillOrderStatus,
                                                      int pageNum,
                                                      int pageSize) {
         return page(new Page<>(pageNum, pageSize),
                 Wrappers.<KwtWaybillOrderSubtask>lambdaQuery()
                         .eq(BaseModel::getDelFlag,0)
                         .eq(Objects.nonNull( status),KwtWaybillOrderSubtask::getStatus, status)
+                        .in(CollectionUtils.isNotEmpty( waybillOrderStatus),KwtWaybillOrderSubtask::getStatus, waybillOrderStatus)
                         .in(CollectionUtils.isNotEmpty(logOrderIds),KwtWaybillOrderSubtask::getLOrderId, logOrderIds)
                         .in(CollectionUtils.isNotEmpty(billOrderIds),KwtWaybillOrderSubtask::getWOrderId, billOrderIds)
                         .orderByDesc(BaseModel::getUpdateTime)

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -3934,7 +3934,7 @@ public class KwtLogisticsConsignmentService {
 
     private void noticeTrader(Long tradeOrderId, List<KwtLogisticsOrder> orders) {
         boolean b = orders.stream()
-                .allMatch(x -> Arrays.asList(LogisticsOrderV1Enum.COMPLETED.getCode(), LogisticsOrderV1Enum.REJECT_ORDER.getCode())
+                .allMatch(x -> Arrays.asList(LogisticsOrderV1Enum.COMPLETED.getCode())
                         .contains(x.getStatus()));
         if (!b) {
             return;

+ 11 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -3052,8 +3052,9 @@ public class KwtWaybillOrderV1Service {
         // 分页查询子运单信息
         log.info("开始分页查询子运单信息,物流订单ID数量: {}, 运单ID数量: {}, 状态: {}",
                 logOrderIds.size(), billOrderIds.size(), status);
+        List<Integer> waybillOrderStatus = getWaybillOrderStatus();
         IPage<KwtWaybillOrderSubtask> page = waybillOrderSubtaskRepository.queryByPage(
-                logOrderIds, billOrderIds, status, req.getPageNum(), req.getPageSize());
+                logOrderIds, billOrderIds, status,waybillOrderStatus, req.getPageNum(), req.getPageSize());
 
         List<KwtWaybillOrderSubtask> records = page.getRecords();
         if (CollectionUtils.isEmpty(records)) {
@@ -5409,8 +5410,9 @@ public class KwtWaybillOrderV1Service {
         StatisticsWaybillResp statisticsWaybillResp = new StatisticsWaybillResp();
 
         statisticsWaybillResp.setTotalNum("0");
+        List<Integer> waybillOrderStatus = getWaybillOrderStatus();
         List<CarWaybillV1Enum> carWaybillV1Enums = Arrays.stream(CarWaybillV1Enum.values())
-                .filter(x -> !Objects.equals(x.getCode(), CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode()))
+                .filter(x -> !waybillOrderStatus.contains(x.getCode()))
                 .sorted(Comparator.comparing(CarWaybillV1Enum::getCode))
                 .collect(Collectors.toList());
 
@@ -5470,6 +5472,13 @@ public class KwtWaybillOrderV1Service {
        return statisticsWaybillResp;
     }
 
+    private List<Integer>  getWaybillOrderStatus() {
+       return Arrays.asList(CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(), CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+                CarWaybillV1Enum.WAIT_LEAVE.getCode(), CarWaybillV1Enum.UNLOADING.getCode(),
+                CarWaybillV1Enum.WAIT_RELEASE.getCode(), CarWaybillV1Enum.REPLENISHING.getCode(),
+                CarWaybillV1Enum.REPLENISH_FINISH.getCode(), CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode());
+    }
+
     private static StatisticsWaybillResp.OrderBillStatusStatistics getOrderBillStatusStatistics(CarWaybillV1Enum c, Map<Integer, List<KwtWaybillOrderSubtask>> finalStausAndBillOrdersMap) {
         StatisticsWaybillResp.OrderBillStatusStatistics orderBillStatusStatistics = new StatisticsWaybillResp.OrderBillStatusStatistics();
         orderBillStatusStatistics.setOrderStatus(String.valueOf(c.getCode()));

+ 129 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/ForkliftOrderService.java

@@ -6,6 +6,7 @@ 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.constant.Global;
@@ -17,14 +18,15 @@ 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.KwtForkliftWaybillOrder;
-import com.sckw.transport.model.KwtLogisticsOrder;
-import com.sckw.transport.model.KwtWaybillOrder;
-import com.sckw.transport.model.KwtWaybillOrderTicket;
+import com.sckw.system.api.model.dto.res.SysDictResDto;
+import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.WaybillOrderLoadingParam;
+import com.sckw.transport.model.param.forklift.reponse.ForkliftOrderFilterResp;
 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.ForkliftOrderFilterParam;
 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;
@@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.script.DefaultRedisScript;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
@@ -62,6 +65,7 @@ public class ForkliftOrderService {
     private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
     private final KwtLogisticsOrderRepository logisticsOrderRepository;
     private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
+    private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
@@ -372,6 +376,90 @@ public class ForkliftOrderService {
         return forklift;
     }
 
+    /**
+     * 筛选
+     * @param param
+     * @return
+     */
+    public List<ForkliftOrderFilterResp> filterQuery(ForkliftOrderFilterParam param) {
+        log.info("铲车司机列表筛选:{}", JSON.toJSONString(param));
+        // 1.查询归属企业下的商品
+        List<KwpGoods> goodsList = goodsInfoService.queryGoodsByEntId(param.getEntId());
+        if (CollectionUtils.isEmpty(goodsList)) {
+            return Collections.emptyList();
+        }
+
+        // 2.提取商goods_type
+        List<String> goodsTypeSet = goodsList.stream().map(KwpGoods::getGoodsType).filter(Objects::nonNull).collect(Collectors.toList());
+
+        // 3.查询出所有商品类型的字典数据
+        List<SysDictResDto> allTypeDictList = remoteSystemService.queryDictByType(DictTypeEnum.PRODUCT_NAME_TYPE.getType());
+        // 过滤出当前商品对应的类型
+        List<SysDictResDto> goodsTypeDictList = allTypeDictList.stream()
+                .filter(dict -> goodsTypeSet.contains(dict.getValue()))
+                .collect(Collectors.toList());
+
+        if (CollectionUtils.isEmpty(goodsTypeDictList)) {
+            return Collections.emptyList();
+        }
+
+        // 查询上一级类型
+        List<SysDictResDto> classificationDictList = remoteSystemService.queryDictByType(DictTypeEnum.CLASSIFICATION_TYPE.getType());
+        Map<Long, SysDictResDto> classificationMap = classificationDictList.stream()
+                .collect(Collectors.toMap(SysDictResDto::getId, dict -> dict));
+
+
+        // 5. 查询所有商品规格字典(goods_spec)
+        List<SysDictResDto> specDictList = remoteSystemService.queryDictByType(DictTypeEnum.GOODS_SPEC.getType());
+        Map<String, SysDictResDto> specDictMap = specDictList.stream()
+                .collect(Collectors.toMap(SysDictResDto::getValue, d -> d));
+
+        // 6. 按 classification_type类型分组
+        Map<Long, List<SysDictResDto>> groupByClassification = goodsTypeDictList.stream()
+                .collect(Collectors.groupingBy(SysDictResDto::getParentId));
+
+        // 7. 组装最终返回结果
+        List<ForkliftOrderFilterResp> result = new ArrayList<>();
+        for (Map.Entry<Long, List<SysDictResDto>> entry : groupByClassification.entrySet()) {
+            Long parentId = entry.getKey();
+            List<SysDictResDto> childTypes = entry.getValue();
+
+            SysDictResDto firstType = classificationMap.get(parentId);
+            if (firstType == null) {
+                continue;
+            }
+            // 获取该组下所有规格
+            Set<String> specValues = goodsList.stream()
+                    .filter(g -> childTypes.stream().anyMatch(t -> t.getValue().equals(g.getGoodsType())))
+                    .map(KwpGoods::getSpec)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            List<ForkliftOrderFilterResp.SpecOptionDTO> options = new ArrayList<>();
+            // 规格
+            for (String specValue : specValues) {
+                SysDictResDto spec = specDictMap.get(specValue);
+                if (spec == null) {
+                    continue;
+                }
+                ForkliftOrderFilterResp.SpecOptionDTO opt = new ForkliftOrderFilterResp.SpecOptionDTO();
+                opt.setId(spec.getId());
+                opt.setLabel(spec.getLabel());
+                opt.setValue(spec.getValue());
+                options.add(opt);
+            }
+
+            // 组装返回对象
+            ForkliftOrderFilterResp resp = new ForkliftOrderFilterResp();
+            resp.setGroupName(firstType.getLabel());
+            resp.setGroupValue(firstType.getValue());
+            resp.setOptions(options);
+            result.add(resp);
+        }
+
+        return result;
+
+    }
 
     /**
      * 铲车订单状态统计
@@ -557,7 +645,8 @@ public class ForkliftOrderService {
      * 铲车接单
      * @param param
      */
-    private void createForkliftWaybillOrder(ForkliftOrderTakingParam param) {
+    @Transactional(rollbackFor = Exception.class)
+    public void createForkliftWaybillOrder(ForkliftOrderTakingParam param) {
         log.info("生成铲车订单,入参参数:{}", JSON.toJSONString(param));
         KwtForkliftWaybillOrder forkliftWaybillOrder = forkliftWaybillOrderRepository.queryForkliftWaybillOrderByFOrderId(param.getForkliftOrderId());
         if (forkliftWaybillOrder == null) {
@@ -573,9 +662,44 @@ public class ForkliftOrderService {
         forkliftWaybillOrder.setDriverName(param.getDriverName());
         forkliftWaybillOrder.setForkliftAcceptTime(new Date());
         forkliftWaybillOrderRepository.updateById(forkliftWaybillOrder);
+
+        // 创建司机日志记录
+        creatWaybillOrderNode(param, forkliftWaybillOrder);
         log.info("铲车接单成功,订单ID:{}", forkliftWaybillOrder.getWOrderId());
     }
 
+    /**
+     * 创建日子轨迹记录
+     * @param param
+     * @param forkliftWaybillOrder
+     * @return
+     */
+    public void creatWaybillOrderNode(ForkliftOrderTakingParam param, KwtForkliftWaybillOrder forkliftWaybillOrder) {
+        log.info("[铲车接单]创建车辆运单-节点轨迹入参参数:{}", JSON.toJSONString(param));
+        // 查询运单
+        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(forkliftWaybillOrder.getWOrderId());
+        if (waybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的运单!");
+        }
+        // 查询子运单
+        KwtWaybillOrderSubtask subtask = waybillOrderSubtaskRepository.queryByWOrderId(forkliftWaybillOrder.getWOrderId());
+        if (subtask == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的子运单!");
+        }
+
+        KwtWaybillOrderNode node = new KwtWaybillOrderNode();
+        node.setWOrderId(forkliftWaybillOrder.getWOrderId());
+        node.setWSubtaskId(subtask.getId());
+        node.setOrderStatus(subtask.getStatus());
+        node.setTruckNo(waybillOrder.getTruckNo());
+        node.setTruckId(waybillOrder.getTruckId());
+        node.setDriverId(waybillOrder.getDriverId());
+        node.setDriverName(waybillOrder.getDriverName());
+        node.setRemark("装载员[" + param.getDriverName() + "]已接单,装载单号[" + forkliftWaybillOrder.getFOrderNo() + "]");
+        waybillOrderNodeRepository.save(node);
+        log.info("[铲车接单]记录节点轨迹成功,节点ID:{}", node.getId());
+    }
+
     /**
      * 铲车取消接单
      * @param param

+ 42 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -56,6 +56,7 @@ public class GatekeeperOrderService {
     private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
     private final KwtLogisticsOrderRepository logisticsOrderRepository;
     private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
+    private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
@@ -553,35 +554,42 @@ public class GatekeeperOrderService {
             throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前门卫订单不存在!");
         }
         //1. 更改门卫状态为:已放行
-        updateGatekeeperOrderStatus(gatekeeper);
+        updateGatekeeperOrderStatus(gatekeeper, param);
 
         //2. 更改司机状态为:已放行未离场
-        updateWaybillOrderStatus(gatekeeper);
+        updateWaybillOrderStatus(gatekeeper, param);
     }
 
     /**
      * 更改门卫状态为:已放行
      * @param gatekeeper
      */
-    private void updateGatekeeperOrderStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+    private void updateGatekeeperOrderStatus(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param) {
         if (!GatekeeperStatusEnum.PENDING_RELEASE.getCode().equals(gatekeeper.getStatus())) {
             throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前车辆订单状态异常,不能放行!");
         }
         //门卫放行后状态更改为:已放行
         gatekeeper.setStatus(GatekeeperStatusEnum.READY_RELEASE.getCode());
+        gatekeeper.setLeaveTime(new Date());
+        gatekeeper.setGatekeeperUserId(param.getGatekeeperUserId());
+        gatekeeper.setGatekeeperName(param.getGatekeeperName());
+        gatekeeper.setUpdateUser(param.getGatekeeperUserId());
         gatekeeperWaybillOrderRepository.updateById(gatekeeper);
     }
 
     /**
-     * 更改司机状态为:已放行未离场
+      * 更改司机状态为:已放行未离场
      * @param gatekeeper
      */
-    private void updateWaybillOrderStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+    private void updateWaybillOrderStatus(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param) {
         // 1. 修改运单状态:已放行未离场
         updateWaybillStatus(gatekeeper);
 
         // 2. 修改子运单状态:已放行未离场
         updateWaybillSubtaskStatus(gatekeeper);
+
+        // 3.创建运单轨迹日日志
+        creatWaybillOrderNode(gatekeeper, param);
     }
 
     /**
@@ -618,6 +626,35 @@ public class GatekeeperOrderService {
         waybillOrderSubtaskRepository.updateById(waybillSubtask);
     }
 
+    /**
+     * 创建日子轨迹记录
+     * @param gatekeeper
+     * @return
+     */
+    public void creatWaybillOrderNode(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param) {
+        log.info("[门卫放行]创建车辆运单-节点轨迹入参参数:{}", JSON.toJSONString(gatekeeper));
+        // 查询运单
+        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(gatekeeper.getWOrderId());
+        if (waybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的运单!");
+        }
+        // 查询子运单
+        KwtWaybillOrderSubtask subtask = waybillOrderSubtaskRepository.queryByWOrderId(gatekeeper.getWOrderId());
+        if (subtask == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的子运单!");
+        }
+        KwtWaybillOrderNode node = new KwtWaybillOrderNode();
+        node.setWOrderId(gatekeeper.getWOrderId());
+        node.setWSubtaskId(subtask.getId());
+        node.setOrderStatus(subtask.getStatus());
+        node.setTruckId(waybillOrder.getTruckId());
+        node.setDriverId(waybillOrder.getDriverId());
+        node.setDriverName(waybillOrder.getDriverName());
+        node.setRemark("门卫[" + param.getGatekeeperName() + "]已放行");
+        waybillOrderNodeRepository.save(node);
+        log.info("[门卫放行]记录节点轨迹成功,节点ID:{}", node.getId());
+    }
+
 
 
 }

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

@@ -43,7 +43,9 @@ create table kwt_gatekeeper_waybill_order
     goods_name                      varchar(20)     NOT 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 '离场时间',
+    leave_time                      datetime        DEFAULT NULL COMMENT '放行时间',
+    gatekeeper_user_id              bigint          DEFAULT DEFAULT '-1' COMMENT '门卫用户id',
+    gatekeeper_name                 varchar(40)     DEFAULT '' COMMENT '门卫姓名',
     waybill_accept_time             datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '运单接单时间',
     entrust_amount                  decimal(10,6)   DEFAULT NULL COMMENT '任务量',
     truck_type                      varchar(5)      NOT NULL default '' COMMENT '车辆类型',