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

Merge remote-tracking branch 'origin/dev_20260131' into dev_20260131

xucaiqin 1 месяц назад
Родитель
Сommit
650b533376
48 измененных файлов с 1170 добавлено и 107 удалено
  1. 20 0
      sckw-auth/src/main/java/com/sckw/auth/model/vo/res/LoginResVo1.java
  2. 62 5
      sckw-auth/src/main/java/com/sckw/auth/service/impl/AuthServiceImpl.java
  3. 2 2
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/LoadingTypeEnum.java
  4. 5 0
      sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/model/dto/req/KwsUserReqDto.java
  5. 1 1
      sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/model/dto/res/KwsUserResDto.java
  6. 8 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfDriverController.java
  7. 3 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckAxleNumController.java
  8. 3 3
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckController.java
  9. 3 2
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruck.java
  10. 2 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/dto/KwfDriverDto.java
  11. 1 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/enums/TruckTypeEnum.java
  12. 10 2
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/reponse/TruckDetailResp.java
  13. 15 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/reponse/TruckResp.java
  14. 1 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/AssociatedTrackRequest.java
  15. 73 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverAssociatedTruckSaveRequest.java
  16. 1 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckAxleNumUpdateParam.java
  17. 5 2
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckBlacklistParam.java
  18. 34 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckDetailParam.java
  19. 1 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckReviewParam.java
  20. 9 8
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckSaveParam.java
  21. 2 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckUpdateStatusParam.java
  22. 70 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java
  23. 35 29
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  24. 10 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsEnterpriseController.java
  25. 9 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsMenuController.java
  26. 2 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuDao.java
  27. 1 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuMappingDao.java
  28. 12 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuMpMapper.java
  29. 12 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuRightsMpMapper.java
  30. 4 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/KwsUser.java
  31. 46 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/AppMenuPermQueryReqVo.java
  32. 25 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EnterprisePageQueryReqVo.java
  33. 95 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/AppMenuPermItemResVo.java
  34. 3 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/EntInfoResp.java
  35. 2 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/KwsUserResVo.java
  36. 7 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsEntTypeRepository.java
  37. 55 14
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  38. 357 13
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsMenuService.java
  39. 33 1
      sckw-modules/sckw-system/src/main/resources/mapper/KwsMenuDao.xml
  40. 8 0
      sckw-modules/sckw-system/src/main/resources/mapper/KwsMenuMappingDao.xml
  41. 1 0
      sckw-modules/sckw-system/src/main/resources/mapper/KwsUserDao.xml
  42. 3 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java
  43. 11 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java
  44. 2 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java
  45. 32 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderResp.java
  46. 68 11
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java
  47. 4 4
      sckw-modules/sckw-transport/src/main/resources/bootstrap-cxf.yml
  48. 2 1
      sql/2026/01/2026_01_06_donglang_create.sql

+ 20 - 0
sckw-auth/src/main/java/com/sckw/auth/model/vo/res/LoginResVo1.java

@@ -152,6 +152,11 @@ public class LoginResVo1 implements Serializable {
     @Schema(description = "岗位角色id")
     private Long roleId;
 
+    /**
+     * 司机id
+     */
+    @Schema(description = "司机id")
+    private Long driverId;
     @Schema(description = "岗位角色列表")
     private List<RoleInfoDto> roleList;
 
@@ -160,6 +165,21 @@ public class LoginResVo1 implements Serializable {
      */
     private List<TabBarItem> tabBar;
 
+    @Schema(description = "是否展示订单统计模块")
+    private Boolean showOrderStatisticsModule;
+
+    @Schema(description = "是否展示销售统计模块")
+    private Boolean showSalesStatisticsModule;
+
+    @Schema(description = "是否展示钱包模块")
+    private Boolean showWalletModule;
+
+    @Schema(description = "是否展示地址模块")
+    private Boolean showAddressModule;
+
+    @Schema(description = "钱包模块展示项")
+    private List<String> walletModuleItems;
+
     @Data
     public static class TabBarItem implements Serializable {
         @Serial

+ 62 - 5
sckw-auth/src/main/java/com/sckw/auth/service/impl/AuthServiceImpl.java

@@ -172,6 +172,7 @@ public class AuthServiceImpl implements IAuthService {
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
+        applyAppModulePermissions(loginRes, loginBase, null);
         loginRes.setRefreshToken(refreshToken);
         return HttpResult.ok(loginRes);
     }
@@ -258,12 +259,14 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setRefreshToken(refreshToken);
         loginRes.setDeptId(user.getDeptId());
         loginRes.setRoleId(user.getRoleId());
+        loginRes.setDriverId(user.getDriverId());
         loginRes.setRoleName(user.getRoleName());
         loginRes.setRoleList(user.getRoleInfoDto());
         List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),0);
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
+        applyAppModulePermissions(loginRes, loginBase, user.getRoleName());
         if (user.getSystemType().equals(SystemTypeEnum.MANAGE.getCode())) {
             loginRes.setValid(true);
         } else {
@@ -353,6 +356,7 @@ public class AuthServiceImpl implements IAuthService {
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
+        applyAppModulePermissions(loginRes, loginBase, user.getRoleName());
         if (user.getSystemType().equals(SystemTypeEnum.MANAGE.getCode())) {
             loginRes.setValid(true);
         } else {
@@ -516,6 +520,9 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setToken(token);
         loginRes.setDeptId(user.getDeptId());
         loginRes.setRoleId(user.getRoleId());
+        LoginBase loginBase = new LoginBase();
+        loginBase.setClientType(clientType);
+        applyAppModulePermissions(loginRes, loginBase, user.getRoleName());
         if (user.getSystemType().equals(SystemTypeEnum.MANAGE.getCode())) {
             loginRes.setValid(true);
         } else {
@@ -850,10 +857,12 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setSystemType(tokenSystemType);
         loginRes.setToken(newToken);
         loginRes.setRefreshToken(newRefreshToken);
+        loginRes.setDriverId(driver.getId());
         List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null,1);
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
+        applyAppModulePermissions(loginRes, loginBase, null);
         return loginRes;
     }
     
@@ -884,12 +893,14 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setRefreshToken(newRefreshToken);
         loginRes.setDeptId(user.getDeptId());
         loginRes.setRoleId(user.getRoleId());
+        loginRes.setDriverId(user.getDriverId());
         loginRes.setRoleName(user.getRoleName());
         loginRes.setRoleList(user.getRoleInfoDto());
         List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),1);
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
+        applyAppModulePermissions(loginRes, loginBase, user.getRoleName());
         if (user.getSystemType().equals(SystemTypeEnum.MANAGE.getCode())) {
             loginRes.setValid(true);
         } else {
@@ -906,10 +917,56 @@ public class AuthServiceImpl implements IAuthService {
                 || Objects.equals(clientType, ClientTypeEnum.mobile.getValue());
     }
 
+    private void applyAppModulePermissions(LoginResVo1 loginRes, LoginBase loginBase, String roleName) {
+        loginRes.setShowOrderStatisticsModule(Boolean.FALSE);
+        loginRes.setShowSalesStatisticsModule(Boolean.FALSE);
+        loginRes.setShowWalletModule(Boolean.FALSE);
+        loginRes.setShowAddressModule(Boolean.FALSE);
+        loginRes.setWalletModuleItems(Collections.emptyList());
+        if (!isAppLogin(loginBase) || StringUtils.isBlank(roleName)) {
+            return;
+        }
+        boolean isSeller = containsAnyRole(roleName, "销售");
+        boolean isFinance = containsAnyRole(roleName, "财务");
+        boolean isPurchase = containsAnyRole(roleName, "采购", "买家");
+        if (isSeller) {
+            loginRes.setShowOrderStatisticsModule(Boolean.TRUE);
+            loginRes.setShowSalesStatisticsModule(Boolean.TRUE);
+            return;
+        }
+        if (isFinance) {
+            loginRes.setShowOrderStatisticsModule(Boolean.TRUE);
+            loginRes.setShowWalletModule(Boolean.TRUE);
+            loginRes.setWalletModuleItems(Arrays.asList("PENDING_PERFORMANCE_BALANCE", "PENDING_FREIGHT"));
+            return;
+        }
+        if (isPurchase) {
+            loginRes.setShowOrderStatisticsModule(Boolean.TRUE);
+            loginRes.setShowWalletModule(Boolean.TRUE);
+            loginRes.setShowAddressModule(Boolean.TRUE);
+            loginRes.setWalletModuleItems(Arrays.asList("PREPAY_BALANCE", "PENDING_FREIGHT"));
+        }
+    }
+
+    private boolean containsAnyRole(String roleName, String... roleKeywords) {
+        if (StringUtils.isBlank(roleName) || roleKeywords == null) {
+            return false;
+        }
+        for (String roleKeyword : roleKeywords) {
+            if (StringUtils.isNotBlank(roleKeyword) && roleName.contains(roleKeyword)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private List<LoginResVo1.TabBarItem> buildAppTabBar(LoginBase loginBase, String roleName,int flag) {
         if (!isAppLogin(loginBase)) {
             return List.of();
         }
+        if (containsAnyRole(roleName, "采购")) {
+            return buildBuyerTabBar();
+        }
         boolean isDoorKeeper = StringUtils.isNotBlank(roleName) && roleName.contains("门卫");
         boolean isForkliftDriver = StringUtils.isNotBlank(roleName) && roleName.contains("铲车司机");
         boolean isBuyer = StringUtils.isNotBlank(roleName) && roleName.contains("买家");
@@ -968,7 +1025,7 @@ public class AuthServiceImpl implements IAuthService {
                 "个人中心",
                 "/static/tabbar/my_select.png",
                 "/static/tabbar/my.png",
-                "/pages/forklift/my"
+                "/pages/myCenter/index"
         ));
         return items;
     }
@@ -992,7 +1049,7 @@ public class AuthServiceImpl implements IAuthService {
                 "个人中心",
                 "/static/tabbar/my_select.png",
                 "/static/tabbar/my.png",
-                "/pages/forklift/my"
+                "/pages/myCenter/index"
         ));
         return items;
     }
@@ -1027,7 +1084,7 @@ public class AuthServiceImpl implements IAuthService {
                 "个人中心",
                 "/static/tabbar/my_select.png",
                 "/static/tabbar/my.png",
-                "/pages/purchaser/my"
+                "/pages/myCenter/index"
         ));
         return items;
     }
@@ -1044,7 +1101,7 @@ public class AuthServiceImpl implements IAuthService {
                 "个人中心",
                 "/static/tabbar/my_select.png",
                 "/static/tabbar/my.png",
-                "/pages/doorkeeper/my"
+                "/pages/myCenter/index"
         ));
         return items;
     }
@@ -1061,7 +1118,7 @@ public class AuthServiceImpl implements IAuthService {
                 "个人中心",
                 "/static/tabbar/my_select.png",
                 "/static/tabbar/my.png",
-                "/pages/forklift/my"
+                "/pages/myCenter/index"
         ));
         return items;
     }

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

@@ -17,12 +17,12 @@ public enum LoadingTypeEnum {
     /**
      * 装载
      */
-    LOADING(0,  "装载"),
+    LOADING(0,  "装载任务"),
 
     /**
      * 补货
      */
-    SUPPLEMENT(1, "补货"),
+    SUPPLEMENT(1, "补货任务"),
 
     ;
 

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

@@ -63,4 +63,9 @@ public class KwsUserReqDto extends BaseModel {
      */
     private String salt;
 
+    /**
+     * 司机id
+     */
+    private Long driverId;
+
 }

+ 1 - 1
sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/model/dto/res/KwsUserResDto.java

@@ -135,5 +135,5 @@ public class KwsUserResDto implements Serializable {
     @JsonSerialize(using = LongToStringUtils.class)
     private Long roleId;
     private List<RoleInfoDto> roleInfoDto;
-
+    private Long driverId;
 }

+ 8 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfDriverController.java

@@ -16,6 +16,7 @@ import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.fleet.model.dto.*;
 import com.sckw.fleet.model.request.AssociatedTrackAddRequest;
 import com.sckw.fleet.model.request.AssociatedTrackRequest;
+import com.sckw.fleet.model.request.DriverAssociatedTruckSaveRequest;
 import com.sckw.fleet.model.vo.KwfDriverAssociatedTrackVO;
 import com.sckw.fleet.model.vo.KwfDriverDetailVo;
 import com.sckw.fleet.model.vo.KwfDriverVo;
@@ -308,6 +309,13 @@ public class KwfDriverController {
         return BaseResult.success();
     }
 
+    @Operation(summary = "保存车辆并关联司机", description = "保存车辆档案并关联司机")
+    @PostMapping("/saveTruckAndAssociate")
+    public BaseResult saveTruckAndAssociate(@RequestBody @Valid DriverAssociatedTruckSaveRequest param){
+        driverService.saveTruckAndAssociate(param);
+        return BaseResult.success();
+    }
+
     /**
      * 删除司机关联车辆
      *

+ 3 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckAxleNumController.java

@@ -5,8 +5,10 @@ import com.sckw.core.web.response.BaseResult;
 import com.sckw.fleet.model.request.TruckAxleNumUpdateParam;
 import com.sckw.fleet.model.vo.TruckAxleNumVO;
 import com.sckw.fleet.service.KwfTruckAxleNumService;
+import jakarta.validation.Valid;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -41,7 +43,7 @@ public class KwfTruckAxleNumController {
      * @return
      */
     @PostMapping("/updateTruckAxleNum")
-    public BaseResult updateTruckAxleNum(TruckAxleNumUpdateParam param) {
+    public BaseResult updateTruckAxleNum(@RequestBody @Valid TruckAxleNumUpdateParam param) {
         kwfTruckAxleNumService.updateTruckAxleNum(param);
         return BaseResult.success();
     }

+ 3 - 3
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckController.java

@@ -402,13 +402,13 @@ public class KwfTruckController {
     /**
      * 车辆详情
      *
-     * @param id
+     * @param param
      * @return
      */
     @Operation(summary = "车辆详情", description = "车辆详情")
     @PostMapping("/truckDetail")
-    public BaseResult<TruckDetailResp> truckDetail(Long id){
-        TruckDetailResp truckDetailResp = truckService.truckDetail(id);
+    public BaseResult<TruckDetailResp> truckDetail(@RequestBody @Valid TruckDetailParam param){
+        TruckDetailResp truckDetailResp = truckService.truckDetail(param);
         return BaseResult.success(truckDetailResp);
     }
 

+ 3 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruck.java

@@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @desc 车辆信息
@@ -162,13 +163,13 @@ public class KwfTruck extends BaseModel {
      * 年审到期时间
      */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Data annualInspectionTime;
+    private Date annualInspectionTime;
 
     /**
      * 道路运输证有效期
      */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Data transportValidityTime;
+    private Date transportValidityTime;
 
     /**
      * 定位设备

+ 2 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/dto/KwfDriverDto.java

@@ -17,6 +17,8 @@ public class KwfDriverDto {
      */
     private String id;
 
+    private Long driverId;
+
     /**
      * 司机名称
      */

+ 1 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/enums/TruckTypeEnum.java

@@ -17,7 +17,7 @@ public enum TruckTypeEnum {
     /**
      * 牵引车
      */
-    TRACTOR(1, "牵引车")
+    TRACTOR(2, "牵引车")
 
     ;
 

+ 10 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/reponse/TruckDetailResp.java

@@ -7,6 +7,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * @author zk
@@ -115,14 +116,14 @@ public class TruckDetailResp implements Serializable {
      */
     @NotNull(message = "年审到期时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Data annualInspectionTime;
+    private Date annualInspectionTime;
 
     /**
      * 道路运输证有效期
      */
     @NotNull(message = "道路运输证有效期不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Data transportValidityTime;
+    private Date transportValidityTime;
 
     /**
      * 定位设备
@@ -172,4 +173,11 @@ public class TruckDetailResp implements Serializable {
     @Schema(description = "目标状态: 0-正常、1-黑名单")
     private Integer blacklist;
 
+    /**
+     * 审核驳回理由
+     */
+    @Schema(description = "审核驳回理由")
+    private String remark;
+
+
 }

+ 15 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/reponse/TruckResp.java

@@ -90,6 +90,13 @@ public class TruckResp implements Serializable {
     @Schema(description = "目标状态: 0-正常、1-黑名单")
     private Integer blacklist;
 
+    /**
+     * 年审到期时间
+     */
+    @Schema(description = "年审到期时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date annualInspectionTime;
+
     /**
      * 创建时间
      */
@@ -97,4 +104,12 @@ public class TruckResp implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
+    /**
+     * 审核驳回理由
+     */
+    @Schema(description = "审核驳回理由")
+    private String remark;
+
+
+
 }

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

@@ -1,6 +1,7 @@
 package com.sckw.fleet.model.request;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 

+ 73 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverAssociatedTruckSaveRequest.java

@@ -0,0 +1,73 @@
+package com.sckw.fleet.model.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 司机侧新增车辆并关联请求
+ */
+@Data
+public class DriverAssociatedTruckSaveRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5419891383273186634L;
+
+    @Schema(description = "司机id")
+    @NotNull(message = "司机id不能为空")
+    private Long driverId;
+
+    @Schema(description = "车牌号")
+    @NotBlank(message = "车牌号不能为空")
+    private String truckNo;
+
+    @Schema(description = "车辆类型")
+    @NotNull(message = "车辆类型不能为空")
+    private Integer type;
+
+    @Schema(description = "车轴配置id")
+    @NotNull(message = "车辆轴数不能为空")
+    private Long truckAxleId;
+
+    @Schema(description = "发动机号")
+    @NotBlank(message = "发动机号不能为空")
+    private String engineNo;
+
+    @Schema(description = "能源类型")
+    @NotNull(message = "能源类型不能为空")
+    private Integer energyType;
+
+    @Schema(description = "排放标准")
+    @NotNull(message = "排放标准不能为空")
+    private Integer eev;
+
+    @Schema(description = "货车行驶证")
+    @NotBlank(message = "货车行驶证不能为空")
+    private String truckLicense;
+
+    @Schema(description = "环保清单")
+    @NotBlank(message = "环保清单不能为空")
+    private String environmentalList;
+
+    @Schema(description = "道路运输许可证")
+    @NotBlank(message = "道路运输许可证不能为空")
+    private String transportLicense;
+
+    @Schema(description = "车队id")
+    private Long fleetId;
+
+    @Schema(description = "vin")
+    private String vin;
+
+    @Schema(description = "品牌")
+    private String brand;
+
+    @Schema(description = "定位设备")
+    private String positionDevice;
+    @Schema(description = "企业id")
+    private String entId;
+}

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

@@ -26,7 +26,7 @@ public class TruckAxleNumUpdateParam extends PageReq implements Serializable {
 
 
     @Data
-    public class TruckAxleNumUpdateParamVO implements Serializable {
+    public static class TruckAxleNumUpdateParamVO implements Serializable {
 
         @Serial
         private static final long serialVersionUID = -7905792845847783871L;

+ 5 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckBlacklistParam.java

@@ -2,6 +2,7 @@ package com.sckw.fleet.model.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;
@@ -18,11 +19,13 @@ public class TruckBlacklistParam extends PageReq implements Serializable {
     @Serial
     private static final long serialVersionUID = -1021090755043784996L;
 
+
+    @NotNull(message = "车辆主键不能为空")
     @Schema(description = "车辆主键")
     private Long id;
 
-
-    @Schema(description = "目标状态: 0-正常、1-黑名单")
+    @NotNull(message = "车辆状态不能为空")
+    @Schema(description = "状态: 0-正常、1-黑名单")
     private Integer blacklist;
 
 }

+ 34 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckDetailParam.java

@@ -0,0 +1,34 @@
+package com.sckw.fleet.model.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 zk
+ * @desc 车辆信息
+ * @date 2023/7/11 0011
+ */
+@Data
+public class TruckDetailParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -7408567583394698831L;
+
+    /**
+     * 车辆主键id
+     */
+    @Schema(description = "车辆主键id")
+    private Long id;
+
+    /**
+     * 车牌号
+     */
+    @Schema(description = "车牌号")
+    private String truckNo;
+
+
+}

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

@@ -28,7 +28,7 @@ public class TruckReviewParam extends PageReq implements Serializable {
     private Integer status;
 
     @Schema(description = "驳回理由")
-    private Integer remark;
+    private String remark;
 
 
 

+ 9 - 8
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckSaveParam.java

@@ -8,6 +8,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * @author zk
@@ -37,7 +38,7 @@ public class TruckSaveParam implements Serializable {
     /**
      * 车辆类别(牵引车、货车)
      */
-    @NotBlank(message = "车辆类别不能为空")
+    @NotNull(message = "车辆类别不能为空")
     @Schema(description = "车辆类别(牵引车、货车)")
     private Integer type;
 
@@ -63,16 +64,16 @@ public class TruckSaveParam implements Serializable {
     /**
      * 能源类型(1-传统能源车辆、2-新能源车辆)
      */
-    @NotBlank(message = "能源类型不能为空")
+    @NotNull(message = "能源类型不能为空")
     @Schema(description = "能源类型(1-传统能源车辆、2-新能源车辆)")
-    private int energyType;
+    private Integer energyType;
 
     /**
      * 排放标准(1-国四、2-国五、3-国六)
      */
-    @NotBlank(message = "排放标准不能为空")
+    @NotNull(message = "排放标准不能为空")
     @Schema(description = "排放标准(1-国四、2-国五、3-国六)")
-    private int eev;
+    private Integer eev;
 
     /**
      * 发动机号
@@ -86,14 +87,14 @@ public class TruckSaveParam implements Serializable {
      */
     @NotNull(message = "年审到期时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Data annualInspectionTime;
+    private Date annualInspectionTime;
 
     /**
      * 道路运输证有效期
      */
     @NotNull(message = "道路运输证有效期不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Data transportValidityTime;
+    private Date transportValidityTime;
 
     /**
      * 定位设备
@@ -125,7 +126,7 @@ public class TruckSaveParam implements Serializable {
     /**
      * 车队id
      */
-    @NotBlank(message = "车队不能为空")
+    @NotNull(message = "车队不能为空")
     @Schema(description = "车队id")
     private Long fleetId;
 

+ 2 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckUpdateStatusParam.java

@@ -2,6 +2,7 @@ package com.sckw.fleet.model.request;
 
 import com.sckw.core.web.request.PageReq;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -20,7 +21,7 @@ public class TruckUpdateStatusParam extends PageReq implements Serializable {
     @Serial
     private static final long serialVersionUID = -1021090755043784996L;
 
-    @NotNull(message = "车辆ID列表不能为空")
+    @NotEmpty(message = "车辆ID列表不能为空")
     @Schema(description = "车辆ID列表")
     private List<Long> ids;
 

+ 70 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java

@@ -12,6 +12,7 @@ import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.common.enums.enums.FileEnum;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.base.BaseModel;
@@ -30,6 +31,8 @@ import com.sckw.fleet.model.*;
 import com.sckw.fleet.model.dto.*;
 import com.sckw.fleet.model.request.AssociatedTrackAddRequest;
 import com.sckw.fleet.model.request.AssociatedTrackRequest;
+import com.sckw.fleet.model.request.DriverAssociatedTruckSaveRequest;
+import com.sckw.fleet.model.request.TruckSaveParam;
 import com.sckw.fleet.model.vo.*;
 import com.sckw.fleet.repository.*;
 import com.sckw.redis.constant.RedisConstant;
@@ -368,6 +371,71 @@ public class KwfDriverService {
         return truck;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void saveTruckAndAssociate(DriverAssociatedTruckSaveRequest request) {
+        log.info("开始新增车辆档案并关联司机,request={}", JSON.toJSONString(request));
+        
+        String entId = request.getEntId();
+        if (org.apache.commons.lang3.StringUtils.isBlank(entId)) {
+            log.error("新增车辆档案失败:企业id不能为空");
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "企业id不能为空");
+        }
+
+        // 构建车辆保存参数
+        TruckSaveParam truckSaveParam = new TruckSaveParam();
+        truckSaveParam.setTruckNo(request.getTruckNo());
+        truckSaveParam.setType(request.getType());
+        truckSaveParam.setCarAxis(String.valueOf(request.getTruckAxleId()));
+        truckSaveParam.setEnergyType(request.getEnergyType());
+        truckSaveParam.setEev(request.getEev());
+        truckSaveParam.setEngineNo(request.getEngineNo());
+        truckSaveParam.setTruckLicense(request.getTruckLicense());
+        truckSaveParam.setTransportLicense(request.getTransportLicense());
+        truckSaveParam.setEnvironmentalList(request.getEnvironmentalList());
+        truckSaveParam.setFleetId(request.getFleetId());
+        truckSaveParam.setVin(request.getVin());
+        truckSaveParam.setBrand(request.getBrand());
+        truckSaveParam.setPositionDevice(request.getPositionDevice());
+        
+        log.info("调用truckService.saveTruck保存车辆档案,truckNo={}", request.getTruckNo());
+        try {
+            truckService.saveTruck(truckSaveParam);
+            log.info("车辆档案保存成功,truckNo={}", request.getTruckNo());
+        } catch (Exception e) {
+            log.error("车辆档案保存异常,truckNo={}", request.getTruckNo(), e);
+            throw new BusinessException("车辆档案保存异常");
+        }
+
+        // 查询刚保存的车辆信息
+        log.info("查询刚保存的车辆信息,truckNo={}", request.getTruckNo());
+        KwfTruck truck = truckRepository.getOne(Wrappers.<KwfTruck>lambdaQuery()
+                .eq(KwfTruck::getTruckNo, request.getTruckNo())
+                .last("limit 1"));
+        
+        if (truck == null) {
+            log.error("车辆档案保存后查询失败,truckNo={}", request.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_NOT_FOUND, "车辆档案保存失败");
+        }
+        log.info("查询车辆信息成功,truckId={}, truckNo={}", truck.getId(), truck.getTruckNo());
+
+        // 构建关联请求并执行关联
+        AssociatedTrackAddRequest associatedTrackAddRequest = new AssociatedTrackAddRequest();
+        associatedTrackAddRequest.setEntId(Long.valueOf(entId));
+        associatedTrackAddRequest.setDriverId(request.getDriverId());
+        associatedTrackAddRequest.setTruckNo(truck.getTruckNo());
+        associatedTrackAddRequest.setTruckAxleId(request.getTruckAxleId());
+        
+        log.info("开始关联司机与车辆,driverId={}, truckNo={}", request.getDriverId(), truck.getTruckNo());
+        try {
+            addAssociatedTrack(associatedTrackAddRequest);
+            log.info("司机与车辆关联成功,driverId={}, truckNo={}", request.getDriverId(), truck.getTruckNo());
+        } catch (Exception e) {
+            log.error("司机与车辆关联异常,driverId={}, truckNo={}", request.getDriverId(), truck.getTruckNo(), e);
+            throw new BusinessException( "司机与车辆关联异常");
+        }
+        
+        log.info("新增车辆档案并关联司机流程结束");
+    }
 
     /**
      * 查询司机的当天完成量、7天完成量、30天完成量
@@ -513,6 +581,7 @@ public class KwfDriverService {
         /**车队班组绑定**/
         requireBizSuccess(driverFleetEdit(driver.getId(), params.getFleetId()), "车队班组绑定");
         //同步信息到员工列表(system 服务,参与同一全局事务)
+        params.setDriverId(driver.getId());
         userEdit(params);
         return HttpResult.ok(result.getMsg(), driver);
     }
@@ -553,6 +622,7 @@ public class KwfDriverService {
         kwsUserReqDto.setUpdateBy(LoginUserHolder.getUserId());
         kwsUserReqDto.setUpdateTime(date);
         kwsUserReqDto.setDelFlag(0);
+        kwsUserReqDto.setDriverId(params.getDriverId());
         remoteUserService.saveUser(kwsUserReqDto);
     }
 

+ 35 - 29
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -2080,7 +2080,8 @@ public class KwfTruckService {
                 .eq(param.getType() != null, KwfTruck::getType, param.getType())
                 .eq(param.getCarAxis() != null, KwfTruck::getCarAxis, param.getCarAxis())
                 .eq(param.getEnergyType() != null, KwfTruck::getEnergyType, param.getEnergyType())
-                .eq(param.getEev() != null, KwfTruck::getEev, param.getEev());
+                .eq(param.getEev() != null, KwfTruck::getEev, param.getEev())
+                .in(CollectionUtils.isNotEmpty(validTruckIds), KwfTruck::getId, validTruckIds);
         //黑名单
         if (param.getStatus() != null) {
             if (Objects.equals(param.getStatus(), 4)) {
@@ -2090,10 +2091,6 @@ public class KwfTruckService {
             }
         }
 
-        // 查询关联司机
-        if (CollectionUtils.isNotEmpty(validTruckIds)) {
-            wrapper.in(KwfTruck::getId, validTruckIds);
-        }
         wrapper.orderByDesc(KwfTruck::getCreateTime)
                 .orderByDesc(KwfTruck::getId);
 
@@ -2126,6 +2123,8 @@ public class KwfTruckService {
             truckResp.setStatusDesc(TruckStatusEnum.getName(truck.getStatus()));
             truckResp.setCreateTime(truck.getCreateTime());
             truckResp.setBlacklist(truck.getBlacklist());
+            truckResp.setRemark(truck.getRemark());
+            truckResp.setAnnualInspectionTime(truck.getAnnualInspectionTime());
             //查询车辆轴数
             TmsTruckAxleNum axleNum = getCarAxisInfo(truck.getCarAxis());
             truckResp.setCarAxis(truck.getCarAxis());
@@ -2145,10 +2144,16 @@ public class KwfTruckService {
      * @param param
      * @return
      */
-    public TruckDetailResp truckDetail(Long id) {
-        log.info("查询司机详情,id:{}", id);
+    public TruckDetailResp truckDetail(TruckDetailParam param) {
+        log.info("查询司机详情,id:{}", JSON.toJSONString(param));
+        if (param.getId() == null && (param.getTruckNo() == null || param.getTruckNo().trim().isEmpty())) {
+            return new TruckDetailResp();
+        }
+        
         KwfTruck truck = kwfTruckRepository.getOne(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(KwfTruck::getId, id));
+                .eq(param.getId() != null, KwfTruck::getId, param.getId())
+                .eq(param.getTruckNo() != null && !param.getTruckNo().trim().isEmpty(), KwfTruck::getTruckNo, param.getTruckNo())
+                .last("limit 1"));
         if (truck == null) {
             return new TruckDetailResp();
         }
@@ -2174,6 +2179,7 @@ public class KwfTruckService {
         truckDetailResp.setTransportLicense(truck.getTransportLicense());
         truckDetailResp.setEnvironmentalList(truck.getEnvironmentalList());
         truckDetailResp.setBlacklist(truck.getBlacklist());
+        truckDetailResp.setRemark(truck.getRemark());
         //轴数
         TmsTruckAxleNum axleNum = getCarAxisInfo(truck.getCarAxis());
         truckDetailResp.setCarAxis(truck.getCarAxis());
@@ -2199,6 +2205,7 @@ public class KwfTruckService {
      */
     public void saveTruck(TruckSaveParam param) {
         log.info("保存车辆,id:{}", JSON.toJSONString(param));
+
         // 新增
         if (param.getId() == null) {
             KwfTruck kwfTruck = kwfTruckRepository.getOne(Wrappers.<KwfTruck>lambdaQuery()
@@ -2271,19 +2278,11 @@ public class KwfTruckService {
         log.info("车辆停用/启用,param:{}", JSON.toJSONString(param));
         // 1. 校验状态合法性
         if (param.getStatus() != 0 && param.getStatus() != 1) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "仅支持修改为正常(0)或停用(1)状态");
-        }
-        int targetStatus;
-        if (param.getStatus() == 0) {
-            // 如果当前已经是正常,则操作为“停用”,目标状态设为正常(1)
-            targetStatus = 1;
-        } else {
-            // 如果当前已经是停用,则操作为“正常”,目标状态设为停用(0)
-            targetStatus = 0;
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "仅支持修改为正常或停用状态");
         }
         LambdaUpdateWrapper<KwfTruck> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.in(KwfTruck::getId, param.getIds());
-        updateWrapper.set(KwfTruck::getStatus, targetStatus);
+        updateWrapper.set(KwfTruck::getStatus, param.getStatus());
         kwfTruckRepository.update(updateWrapper);
 
     }
@@ -2295,17 +2294,16 @@ public class KwfTruckService {
      */
     public void toggleBlacklist(TruckBlacklistParam param) {
         log.info("黑名单业务:{}", JSON.toJSONString(param));
-        int targetBlacklist;
-        if (param.getBlacklist() == 1) {
-            // 如果当前已经是黑名单,则操作为“移出”,黑名单状态设为正常(0)
-            targetBlacklist = 0;
-        } else {
-            // 如果当前不是黑名单,则操作为“加入”,黑名单状态设为黑名单(1)
-            targetBlacklist = 1;
+        // 校验
+        if (param.getBlacklist() != 0 && param.getBlacklist() != 1) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "仅支持修改为正常或黑名单状态");
+        }
+        KwfTruck truck = kwfTruckRepository.getById(param.getId());
+        if (truck == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_REVIEW_ERROR, "车辆不存在");
         }
-        kwfTruckRepository.update(Wrappers.<KwfTruck>lambdaUpdate()
-                .eq(KwfTruck::getId, param.getId())
-                .set(KwfTruck::getBlacklist, targetBlacklist));
+        truck.setBlacklist(param.getBlacklist());
+        kwfTruckRepository.updateById(truck);
     }
 
     /**
@@ -2315,15 +2313,23 @@ public class KwfTruckService {
      */
     public void reviewTruck(TruckReviewParam param) {
         log.info("车辆审核:{}", JSON.toJSONString(param));
+        // 校验
+        if (param.getStatus() != 0 && param.getStatus() != 3) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "仅支持修改为正常或审核失败状态");
+        }
         KwfTruck truck = kwfTruckRepository.getById(param.getId());
-        if (truck == null || !Objects.equals(TruckStatusEnum.PENDING_REVIEW.getCode(), param.getStatus())) {
+        if (truck == null || !Objects.equals(TruckStatusEnum.PENDING_REVIEW.getCode(), truck.getStatus())) {
             throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_REVIEW_ERROR, "车辆审核状态异常:当前状态非待审核");
         }
         if (Objects.equals(TruckStatusEnum.REVIEW_REJECTED.getCode(), param.getStatus())
                 && StringUtils.isBlank(param.getRemark())) {
             throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_REVIEW_ERROR, "审核理由不能为空");
         }
+
         truck.setStatus(param.getStatus());
+        if (Objects.equals(TruckStatusEnum.REVIEW_REJECTED.getCode(), param.getStatus())){
+            truck.setRemark(param.getRemark());
+        }
         kwfTruckRepository.updateById(truck);
     }
 

+ 10 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsEnterpriseController.java

@@ -380,6 +380,16 @@ public class KwsEnterpriseController {
     public BaseResult<EntInfoResp> queryKwsEnterprise(@RequestBody EntInfoReq req) {
         return BaseResult.success(kwsEntService.queryKwsEnterprise(req));
     }
+
+    /**
+     * 按页面类型查询企业列表
+     */
+    @PostMapping("/queryEnterpriseByPageType")
+    @Operation(summary = "按企业类型查询企业列表")
+    public BaseResult<List<EntInfo>> queryEnterpriseByPageType(@Valid @RequestBody EnterprisePageQueryReqVo req) {
+        return BaseResult.success(kwsEntService.queryEnterpriseByPageType(req));
+    }
+
     /**
      * 查询企业信息
      * @param entName

+ 9 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsMenuController.java

@@ -49,6 +49,15 @@ public class KwsMenuController {
         return HttpResult.ok(kwsMenuService.findTree(reqVo));
     }
 
+    /**
+     * App 端查询菜单/按钮权限;permQueryType=3 时返回菜单并在每条记录下挂 buttons
+     */
+    @PostMapping("/appMenuOrButtonPerms")
+    @Operation(summary = "App 菜单/按钮权限列表(支持菜单下挂按钮)")
+    public HttpResult appMenuOrButtonPerms(@RequestBody @Valid AppMenuPermQueryReqVo reqVo) {
+        return HttpResult.ok(kwsMenuService.queryAppMenuOrButtonPerms(reqVo));
+    }
+
     @PostMapping("/list")
     @Operation(summary = "导航首页统计")
     public HttpResult list(@RequestBody @Valid FindMenuTreeReqVo reqVo) {

+ 2 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuDao.java

@@ -71,6 +71,8 @@ public interface KwsMenuDao {
      */
     List<KwsMenuResVo> findList(FindMenuTreePojo params);
 
+    List<KwsMenuResVo> findList1(FindMenuTreePojo params);
+
     /**
      * @param kwsMenuParam 实体
      * @return KwsMenu

+ 1 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuMappingDao.java

@@ -40,6 +40,7 @@ public interface KwsMenuMappingDao {
      * @date: 2023/9/5
      */
     List<KwsMenuMapping> selectByMenuIds(@Param(value = "idList") List<Long> idList);
+    List<KwsMenuMapping> selectByMappingIds(@Param(value = "idList") List<Long> idList);
 
     /**
      * @param kwsMenuMapping 实体

+ 12 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuMpMapper.java

@@ -0,0 +1,12 @@
+package com.sckw.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.system.model.KwsMenu;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 菜单表 MyBatis-Plus 查询(与 {@link KwsMenuDao} 传统 XML 并存,仅用于 Lambda 条件查询)
+ */
+@Mapper
+public interface KwsMenuMpMapper extends BaseMapper<KwsMenu> {
+}

+ 12 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsMenuRightsMpMapper.java

@@ -0,0 +1,12 @@
+package com.sckw.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.system.model.KwsMenuRights;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 菜单权限表 MyBatis-Plus 查询(与 {@link KwsMenuRightsDao} 传统 XML 并存)
+ */
+@Mapper
+public interface KwsMenuRightsMpMapper extends BaseMapper<KwsMenuRights> {
+}

+ 4 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/KwsUser.java

@@ -62,5 +62,9 @@ public class KwsUser extends BaseModel {
      * 盐
      */
     private String salt;
+    /**
+     * 司机id
+     */
+    private String driverId;
 
 }

+ 46 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/AppMenuPermQueryReqVo.java

@@ -0,0 +1,46 @@
+package com.sckw.system.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * App 端查询菜单或按钮权限入参
+ * <p>
+ * permQueryType:1-仅菜单(目录+菜单),2-仅按钮,3-菜单且每项下带出该菜单下的按钮权限
+ */
+@Data
+public class AppMenuPermQueryReqVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 查询类型:1 仅菜单,2 仅按钮,3 菜单并带出下属按钮
+     */
+    public static final int PERM_QUERY_MENU = 1;
+    public static final int PERM_QUERY_BUTTON = 2;
+    public static final int PERM_QUERY_MENU_WITH_BUTTONS = 3;
+
+    @NotBlank(message = "客户端类型不能为空")
+    @Schema(description = "终端类型:3-企业APP 等,与菜单 client_type 一致")
+    private String clientType;
+
+    /**
+     * 与 {@link FindMenuTreeReqVo#getUserId()} 一致:企业 APP 传参用户 id 时走对应权限链路
+     */
+    @Schema(description = "用户 id,APP 与 findMenuTree 一致时可传")
+    private Long userId;
+
+    @NotNull(message = "权限查询类型不能为空")
+    @Min(1)
+    @Max(3)
+    @Schema(description = "1-仅菜单(目录+菜单),2-仅按钮,3-菜单且每项携带 buttons 按钮列表")
+    private Integer permQueryType;
+}

+ 25 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EnterprisePageQueryReqVo.java

@@ -0,0 +1,25 @@
+package com.sckw.system.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 按页面类型查询企业列表请求。
+ */
+@Data
+public class EnterprisePageQueryReqVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 5625981857792796638L;
+
+    @NotNull(message = "企业类型不能为空")
+    @Schema(description = "企业类型(1供应商,2采购商,3物流属性)")
+    private Integer enterpriseType;
+
+    @Schema(description = "企业名称,支持模糊查询")
+    private String entName;
+}

+ 95 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/AppMenuPermItemResVo.java

@@ -0,0 +1,95 @@
+package com.sckw.system.model.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+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.Date;
+import java.util.List;
+
+/**
+ * App 菜单/按钮权限项:字段与菜单表对齐,序列化时对空值统一为默认非 null,便于前端直接使用。
+ */
+@Data
+public class AppMenuPermItemResVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "菜单主键")
+    private Long id;
+
+    @Schema(description = "父级菜单 id,无父级时为 0")
+    private Long parentId;
+
+    @Schema(description = "终端类型:1运营端、2企业PC、3企业APP、4司机端")
+    private Integer clientType;
+
+    @Schema(description = "权限标识")
+    private String perms;
+
+    @Schema(description = "名称")
+    private String name;
+
+    @Schema(description = "类型:0目录/1菜单/2按钮")
+    private Integer type;
+
+    @Schema(description = "前端路由或页面路径")
+    private String url;
+
+    @Schema(description = "按钮对应后端接口地址")
+    private String links;
+
+    @Schema(description = "菜单图标")
+    private String icon;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "层级")
+    private Integer level;
+
+    @Schema(description = "是否定制:0否 1是")
+    private Integer custom;
+
+    @Schema(description = "是否默认展示")
+    private Integer isDisplay;
+
+    @Schema(description = "菜单开放类型:0普通 1超管 2非普通用户")
+    private Integer isMain;
+
+    @Schema(description = "适用企业类型(多值拼接)")
+    private String usingRoles;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "状态:0正常 1锁定")
+    private Integer status;
+
+    @Schema(description = "创建人")
+    private Long createBy;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @Schema(description = "更新人")
+    private Long updateBy;
+
+    @Schema(description = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @Schema(description = "删除标识:0正常")
+    private Integer delFlag;
+
+    /**
+     * 菜单+按钮查询时为下属按钮列表;仅菜单/仅按钮查询时为无元素的列表,避免 null。
+     */
+    @Schema(description = "下属按钮权限;非菜单+按钮模式为空列表")
+    private List<AppMenuPermItemResVo> buttons = new ArrayList<>();
+}

+ 3 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/EntInfoResp.java

@@ -18,6 +18,9 @@ public class EntInfoResp implements Serializable {
     @Serial
     private static final long serialVersionUID = -8957989833318602612L;
 
+    @Schema(description = "当前企业是否为买家:true-买家,false-卖家")
+    private Boolean buyer;
+
     private List<EntInfo> entInfos;
 
     @Data

+ 2 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/KwsUserResVo.java

@@ -134,4 +134,6 @@ public class KwsUserResVo implements Serializable {
     private Date updateTime;
     private List<RoleInfoDto> roleInfoDto;
 
+    private Long driverId;
+
 }

+ 7 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsEntTypeRepository.java

@@ -33,6 +33,13 @@ public class KwsEntTypeRepository extends ServiceImpl<KwsEntTypeDao, KwsEntType>
                 .in(KwsEntType::getType, entTypes));
     }
 
+
+    public List<KwsEntType> queryByType(Integer entType) {
+        return list(Wrappers.<KwsEntType>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(BaseModel::getStatus,0)
+                .eq(KwsEntType::getType, entType));
+    }
     public KwsEntType queryByEntId(String entId) {
         return getOne(Wrappers.<KwsEntType>lambdaQuery().eq(BaseModel::getDelFlag,0)
                 .eq(KwsEntType::getEntId, entId)

+ 55 - 14
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -1,3 +1,4 @@
+
 package com.sckw.system.service;
 
 import cn.hutool.core.collection.CollUtil;
@@ -1558,36 +1559,37 @@ public class KwsEnterpriseService {
 
     @NotNull
     private EntInfoResp getInfoResp(EntInfoReq req) {
+        EntInfoResp entInfoResp = buildEntInfoResp(req);
         List<KwsEntType> kwsEntTypes = kwsEntTypeRepository.queryByType(req.getEntType());
         if (CollectionUtils.isEmpty(kwsEntTypes)) {
-            return new EntInfoResp();
+            return entInfoResp;
         }
         Set<Long> entIds = kwsEntTypes.stream().map(KwsEntType::getEntId).collect(Collectors.toSet());
         //根据企业id查询企业信息
         List<KwsEnterprise> kwsEnterprises = kwsEnterpriseRepository.queryByEntIds(entIds, req.getEntName());
         if (CollectionUtils.isEmpty(kwsEnterprises)) {
-            return new EntInfoResp();
+            return entInfoResp;
         }
         //组装返回对象
         List<EntInfoResp.EntInfo> entInfos = kwsEnterprises.stream().map(k -> {
-            EntInfoResp.EntInfo entInfoResp = new EntInfoResp.EntInfo();
-            entInfoResp.setEntId(String.valueOf(k.getId()));
-            entInfoResp.setEntName(k.getFirmName());
-            return entInfoResp;
+            EntInfoResp.EntInfo info = new EntInfoResp.EntInfo();
+            info.setEntId(String.valueOf(k.getId()));
+            info.setEntName(k.getFirmName());
+            return info;
         }).collect(Collectors.toList());
-        EntInfoResp entInfoResp = new EntInfoResp();
         entInfoResp.setEntInfos(entInfos);
         return entInfoResp;
     }
 
     @NotNull
     private EntInfoResp getEntInfoResp(EntInfoReq req) {
+        EntInfoResp entInfoResp = buildEntInfoResp(req);
         if (org.apache.commons.lang3.StringUtils.isBlank(req.getEntId())) {
             throw new BusinessException("企业id不能为空");
         }
         List<KwsEnterprise> kwsEnterprises = kwsEnterpriseRepository.queryByEntIdAndName(req.getEntId(), req.getEntName());
         if (CollectionUtils.isEmpty(kwsEnterprises)) {
-            return new EntInfoResp();
+            return entInfoResp;
         }
         Set<Long> entIds = kwsEnterprises.stream().map(BaseModel::getId).collect(Collectors.toSet());
 
@@ -1599,21 +1601,26 @@ public class KwsEnterpriseService {
         //根据类型进行过滤
         List<KwsEntType> kwsEntTypes = kwsEntTypeRepository.queryByEntIdsAndType(entIds, req.getEntType());
         if (CollectionUtils.isEmpty(kwsEntTypes)) {
-            return new EntInfoResp();
+            return entInfoResp;
         }
         Set<Long> entIdList = kwsEntTypes.stream().map(KwsEntType::getEntId).collect(Collectors.toSet());
         //过滤类型表中包含的数据
         List<EntInfoResp.EntInfo> entInfos = kwsEnterprises.stream().filter(x -> entIdList.contains(x.getId())).map(k -> {
-            EntInfoResp.EntInfo entInfoResp = new EntInfoResp.EntInfo();
-            entInfoResp.setEntId(String.valueOf(k.getId()));
-            entInfoResp.setEntName(k.getFirmName());
-            return entInfoResp;
+            EntInfoResp.EntInfo info = new EntInfoResp.EntInfo();
+            info.setEntId(String.valueOf(k.getId()));
+            info.setEntName(k.getFirmName());
+            return info;
         }).collect(Collectors.toList());
-        EntInfoResp entInfoResp = new EntInfoResp();
         entInfoResp.setEntInfos(entInfos);
         return entInfoResp;
     }
 
+    private EntInfoResp buildEntInfoResp(EntInfoReq req) {
+        EntInfoResp entInfoResp = new EntInfoResp();
+        entInfoResp.setBuyer(Objects.equals(req.getLoginEntType(), String.valueOf(EntTypeEnum.PURCHASER.getCode())));
+        return entInfoResp;
+    }
+
     /**
      * @return
      */
@@ -1675,6 +1682,40 @@ public class KwsEnterpriseService {
 
     }
 
+    public List<EntInfo> queryEnterpriseByPageType(EnterprisePageQueryReqVo req) {
+        log.info("查询企业信息请求参数:{}", JSON.toJSONString(req));
+
+        Long loginEntId = LoginUserHolder.getEntId();
+        if (Objects.isNull(loginEntId)) {
+            return Collections.emptyList();
+        }
+
+        List<KwsEntType> entTypes = kwsEntTypeDao.findListByEntId(loginEntId);
+        boolean matchEnterpriseType = CollectionUtils.isNotEmpty(entTypes)
+                && entTypes.stream().anyMatch(item -> Objects.equals(item.getType(), req.getEnterpriseType()));
+        if (!matchEnterpriseType) {
+            return Collections.emptyList();
+        }
+
+        List<KwsEnterprise> enterprises = kwsEnterpriseRepository.list(Wrappers.<KwsEnterprise>lambdaQuery()
+                .eq(BaseModel::getDelFlag, Global.UN_DELETED)
+                .eq(BaseModel::getStatus, Global.NO)
+                .eq(KwsEnterprise::getApproval, ApprovalEnum.OK.getCode())
+                .eq(KwsEnterprise::getId, loginEntId)
+                .like(StringUtils.isNotBlank(req.getEntName()), KwsEnterprise::getFirmName, req.getEntName())
+                .orderByAsc(KwsEnterprise::getFirmName));
+        if (CollectionUtils.isEmpty(enterprises)) {
+            return Collections.emptyList();
+        }
+
+        return enterprises.stream().map(item -> {
+            EntInfo info = new EntInfo();
+            info.setEntId(String.valueOf(item.getId()));
+            info.setEntName(item.getFirmName());
+            return info;
+        }).collect(Collectors.toList());
+    }
+
     public EntInfo queryEnt(String entName) {
         return kwsEnterpriseDao.query(entName);
     }

+ 357 - 13
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsMenuService.java

@@ -3,6 +3,8 @@ package com.sckw.system.service;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
@@ -48,6 +50,12 @@ public class KwsMenuService {
     @Autowired
     KwsMenuDao kwsMenuDao;
 
+    @Autowired
+    private KwsMenuMpMapper kwsMenuMpMapper;
+
+    @Autowired
+    private KwsMenuRightsMpMapper kwsMenuRightsMpMapper;
+
     @Autowired
     KwsMenuRightsDao kwsMenuRightsDao;
 
@@ -278,14 +286,336 @@ public class KwsMenuService {
      * @author: czh
      * @date: 2023/7/7
      */
+
+    /**
+     * 查询 App 端菜单或按钮权限列表。
+     * <p>
+     * 核心逻辑:
+     * 1. 解析客户端类型和权限查询类型。
+     * 2. 填充查询条件对象(包括系统类型、角色ID、企业类型等)。
+     * 3. 判断是否绕过权限校验(运营端主账号拥有所有权限)。
+     * 4. 根据是否绕过权限,执行不同的菜单查询策略。
+     * 5. 如果是企业用户且使用 App 端,应用菜单映射逻辑(App 菜单映射到 PC 菜单)。
+     * 6. 对结果进行排序(先按层级,再按序号)。
+     * 7. 如果请求包含按钮信息,则组装菜单及其子按钮;否则直接返回菜单列表。
+     *
+     * @param reqVo 查询请求参数,包含客户端类型、用户ID、权限查询类型等
+     * @return 菜单或按钮权限项列表
+     */
+    public List<AppMenuPermItemResVo> queryAppMenuOrButtonPerms(AppMenuPermQueryReqVo reqVo) {
+        // 解析客户端类型,去除空格并转为整数
+        int clientType = Integer.parseInt(reqVo.getClientType().trim());
+        // 获取权限查询类型(如:仅菜单、仅按钮、菜单+按钮)
+        int permQueryType = reqVo.getPermQueryType();
+
+        // 构建查询条件对象
+        FindMenuTreePojo pojo = new FindMenuTreePojo();
+        pojo.setClientType(clientType);
+        // 填充用户相关的查询条件(如角色ID、企业类型、系统类型等)
+        extracted(reqVo.getUserId(), reqVo.getClientType(), pojo);
+
+        // 判断是否绕过权限校验:运营端系统类型且为主账号时,无需校验具体权限
+        boolean bypassRights = Objects.equals(LoginUserHolder.getSystemType(), SystemTypeEnum.MANAGE.getCode())
+                && Objects.equals(LoginUserHolder.getIsMain(), Global.YES);
+
+        // 根据是否绕过权限,选择查询策略
+        List<KwsMenu> menus = bypassRights
+                ? selectMenusByMpWithoutRights(clientType, permQueryType, pojo) // 无权限限制查询
+                : selectMenusByMpWithRights(clientType, permQueryType, pojo);   // 有权限限制查询
+
+
+        // 对菜单列表进行排序:先按层级(level)升序,再按序号(sort)升序,null 值排在最后
+//        menus.sort(Comparator.comparing(KwsMenu::getLevel, Comparator.nullsLast(Integer::compareTo))
+//                .thenComparing(KwsMenu::getSort, Comparator.nullsLast(Integer::compareTo)));
+
+        // 如果查询类型为“菜单带按钮”,则组装菜单及其嵌套的按钮列表
+        if (permQueryType == AppMenuPermQueryReqVo.PERM_QUERY_MENU_WITH_BUTTONS) {
+            return assembleMenusWithNestedButtons(menus, pojo);
+        }
+        return menus.stream().map(this::toAppMenuPermItemResVo).toList();
+    }
+
+    /**
+     * 将菜单实体转为权限 VO,并对所有字段做空值默认填充,保证返回 JSON 中字段均有明确取值。
+     */
+    private AppMenuPermItemResVo toAppMenuPermItemResVo(KwsMenu source) {
+        AppMenuPermItemResVo v = new AppMenuPermItemResVo();
+        if (source != null) {
+            BeanUtils.copyProperties(source, v);
+        }
+        //fillAppMenuPermVoDefaults(v);
+        return v;
+    }
+
+    private void fillAppMenuPermVoDefaults(AppMenuPermItemResVo v) {
+        if (v.getId() == null) {
+            v.setId(0L);
+        }
+        if (v.getParentId() == null) {
+            v.setParentId(0L);
+        }
+        if (v.getClientType() == null) {
+            v.setClientType(0);
+        }
+        if (v.getPerms() == null) {
+            v.setPerms("");
+        }
+        if (v.getName() == null) {
+            v.setName("");
+        }
+        if (v.getType() == null) {
+            v.setType(0);
+        }
+        if (v.getUrl() == null) {
+            v.setUrl("");
+        }
+        if (v.getLinks() == null) {
+            v.setLinks("");
+        }
+        if (v.getIcon() == null) {
+            v.setIcon("");
+        }
+        if (v.getSort() == null) {
+            v.setSort(0);
+        }
+        if (v.getLevel() == null) {
+            v.setLevel(0);
+        }
+        if (v.getCustom() == null) {
+            v.setCustom(0);
+        }
+        if (v.getIsDisplay() == null) {
+            v.setIsDisplay(0);
+        }
+        if (v.getIsMain() == null) {
+            v.setIsMain(0);
+        }
+        if (v.getUsingRoles() == null) {
+            v.setUsingRoles("");
+        }
+        if (v.getRemark() == null) {
+            v.setRemark("");
+        }
+        if (v.getStatus() == null) {
+            v.setStatus(0);
+        }
+        if (v.getCreateBy() == null) {
+            v.setCreateBy(0L);
+        }
+        if (v.getUpdateBy() == null) {
+            v.setUpdateBy(0L);
+        }
+        if (v.getCreateTime() == null) {
+            v.setCreateTime(new Date(0));
+        }
+        if (v.getUpdateTime() == null) {
+            v.setUpdateTime(new Date(0));
+        }
+        if (v.getDelFlag() == null) {
+            v.setDelFlag(0);
+        }
+        if (v.getButtons() == null) {
+            v.setButtons(new ArrayList<>());
+        }
+    }
+
+    /**
+     * 在已确定的菜单(目录+菜单)集合上,用 MyBatis-Plus 批量查询 parent 在其 id 集合下的按钮并挂到每条菜单下。
+     * <p>
+     * 步骤:
+     * 1. 提取所有菜单的 ID 作为父 ID 集合。
+     * 2. 批量查询这些父 ID 下的所有按钮类型的菜单。
+     * 3. 将按钮按父 ID 分组。
+     * 4. 遍历菜单列表,为每个菜单设置其对应的子按钮列表。
+     *
+     * @param menus 菜单列表(不含按钮)
+     * @param pojo  查询条件对象,用于过滤按钮的企业类型权限
+     * @return 组装好子按钮的菜单权限项列表
+     */
+    private List<AppMenuPermItemResVo> assembleMenusWithNestedButtons(List<KwsMenu> menus, FindMenuTreePojo pojo) {
+        // 如果菜单列表为空,直接返回空列表
+        if (CollectionUtils.isEmpty(menus)) {
+            return Collections.emptyList();
+        }
+        // 提取所有菜单的 ID,作为查询子按钮的父 ID 条件
+        List<Long> parentIds = menus.stream().map(KwsMenu::getId).toList();
+        // 获取客户端类型,确保查询的按钮与菜单属于同一客户端
+        Integer btnClientType = menus.get(0).getClientType();
+
+        // 构建按钮查询条件
+        LambdaQueryWrapper<KwsMenu> bw = Wrappers.lambdaQuery(KwsMenu.class)
+                .eq(KwsMenu::getDelFlag, Global.NO) // 未删除
+                .eq(KwsMenu::getType, MenuTypeEnum.BUTTON.getCode()) // 仅限按钮类型
+                .eq(KwsMenu::getClientType, btnClientType) // 匹配客户端类型
+                .in(KwsMenu::getParentId, parentIds); // 父 ID 在菜单 ID 集合中
+        // 追加企业类型过滤,确保按钮也符合当前用户的企业类型权限
+        appendUsingRolesFilter(bw, pojo.getEntTypeList());
+        // 按序号升序排列
+        bw.orderByAsc(KwsMenu::getSort);
+
+        // 执行查询,获取所有相关按钮
+        List<KwsMenu> buttonRows = kwsMenuMpMapper.selectList(bw);
+        // 将按钮按父 ID 分组,使用 LinkedHashMap 保持插入顺序
+        Map<Long, List<KwsMenu>> buttonsByParent = buttonRows.stream()
+                .collect(Collectors.groupingBy(KwsMenu::getParentId, LinkedHashMap::new, Collectors.toList()));
+
+        List<AppMenuPermItemResVo> result = new ArrayList<>(menus.size());
+        for (KwsMenu m : menus) {
+            AppMenuPermItemResVo vo = toAppMenuPermItemResVo(m);
+            List<KwsMenu> children = buttonsByParent.getOrDefault(m.getId(), Collections.emptyList());
+            List<AppMenuPermItemResVo> btnVos = new ArrayList<>(children.size());
+            for (KwsMenu c : children) {
+                btnVos.add(toAppMenuPermItemResVo(c));
+            }
+            vo.setButtons(btnVos);
+            result.add(vo);
+        }
+        return result;
+    }
+
+    /**
+     * 无需权限校验的菜单查询(通常用于运营端主账号)。
+     * <p>
+     * 直接根据客户端类型、权限查询类型和企业类型过滤菜单,不关联菜单权限表。
+     *
+     * @param clientType    客户端类型
+     * @param permQueryType 权限查询类型(菜单或按钮)
+     * @param pojo          查询条件对象,包含企业类型列表
+     * @return 菜单列表
+     */
+    private List<KwsMenu> selectMenusByMpWithoutRights(int clientType, int permQueryType, FindMenuTreePojo pojo) {
+        // 构建基础查询条件:未删除且匹配客户端类型
+        LambdaQueryWrapper<KwsMenu> mw = Wrappers.lambdaQuery(KwsMenu.class)
+                .eq(KwsMenu::getDelFlag, Global.NO)
+                .eq(KwsMenu::getClientType, clientType);
+        
+        // 追加权限查询类型过滤(区分查询菜单/目录还是按钮)
+        appendPermQueryType(mw, permQueryType);
+        // 追加企业类型过滤(基于 using_roles 字段模糊匹配)
+        appendUsingRolesFilter(mw, pojo.getEntTypeList());
+        
+        // 执行查询并返回结果
+        return kwsMenuMpMapper.selectList(mw);
+    }
+
+    /**
+     * 需要权限校验的菜单查询。
+     * <p>
+     * 首先从菜单权限表(kws_menu_rights)中查询当前用户/企业有权限的菜单ID集合,
+     * 然后根据这些ID查询具体的菜单信息,并附加其他过滤条件。
+     *
+     * @param clientType    客户端类型
+     * @param permQueryType 权限查询类型
+     * @param pojo          查询条件对象,包含角色ID、企业ID、企业类型列表
+     * @return 菜单列表
+     */
+    private List<KwsMenu> selectMenusByMpWithRights(int clientType, int permQueryType, FindMenuTreePojo pojo) {
+        // 构建菜单权限查询条件
+        LambdaQueryWrapper<KwsMenuRights> rw = Wrappers.lambdaQuery(KwsMenuRights.class)
+                .eq(KwsMenuRights::getDelFlag, Global.NO) // 未删除
+                .select(KwsMenuRights::getMenuId); // 只查询菜单ID字段,优化性能
+        
+        // 如果有角色ID限制,则加入 in 条件
+        if (CollectionUtils.isNotEmpty(pojo.getRoleIds())) {
+            rw.in(KwsMenuRights::getRoleId, pojo.getRoleIds());
+        }
+        // 如果有企业ID限制,则加入 eq 条件
+        if (pojo.getEntId() != null) {
+            rw.eq(KwsMenuRights::getEntId, pojo.getEntId());
+        }
+        
+        // 执行查询,获取有权限的菜单ID行记录
+        List<KwsMenuRights> rightsRows = kwsMenuRightsMpMapper.selectList(rw);
+        
+        // 提取菜单ID集合,去重
+        Set<Long> menuIds = rightsRows.stream()
+                .map(KwsMenuRights::getMenuId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        
+        // 如果没有权限ID,直接返回空列表
+        if (menuIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+        
+        // 构建菜单查询条件
+        LambdaQueryWrapper<KwsMenu> mw = Wrappers.lambdaQuery(KwsMenu.class)
+                .eq(KwsMenu::getDelFlag, Global.NO) // 未删除
+                .eq(KwsMenu::getClientType, clientType) // 匹配客户端类型
+                .in(KwsMenu::getId, menuIds); // 限制在有权重的菜单ID范围内
+        
+        // 追加权限查询类型过滤
+        appendPermQueryType(mw, permQueryType);
+        // 追加企业类型过滤
+        appendUsingRolesFilter(mw, pojo.getEntTypeList());
+        
+        return kwsMenuMpMapper.selectList(mw);
+    }
+
+    /**
+     * 根据权限查询类型,向查询条件中追加菜单类型过滤。
+     * <p>
+     * 如果查询类型为按钮,则只查询按钮类型;
+     * 否则查询目录类型(type=0 或 type=DIRECTORY)。
+     *
+     * @param mw            菜单查询包装器
+     * @param permQueryType 权限查询类型常量
+     */
+    private void appendPermQueryType(LambdaQueryWrapper<KwsMenu> mw, int permQueryType) {
+        if (permQueryType == AppMenuPermQueryReqVo.PERM_QUERY_BUTTON) {
+            // 仅查询按钮类型
+            mw.eq(KwsMenu::getType, MenuTypeEnum.BUTTON.getCode());
+        } else {
+            // 查询目录或菜单类型(排除按钮)
+            // 注意:这里兼容了 type=0 的历史数据或特定定义
+            mw.and(w -> w.eq(KwsMenu::getType, 0).or().eq(KwsMenu::getType, MenuTypeEnum.DIRECTORY.getCode()));
+        }
+    }
+
+    /**
+     * 向查询条件中追加企业类型(using_roles)的模糊匹配过滤。
+     * <p>
+     * 多个企业类型之间使用 OR 连接,即只要 matching 其中一个类型即可。
+     * SQL 示例: AND (using_roles LIKE '%type1%' OR using_roles LIKE '%type2%')
+     *
+     * @param mw           菜单查询包装器
+     * @param entTypeList  企业类型列表
+     */
+    private void appendUsingRolesFilter(LambdaQueryWrapper<KwsMenu> mw, List<String> entTypeList) {
+        // 如果企业类型列表为空,不进行过滤
+        if (CollectionUtils.isEmpty(entTypeList)) {
+            return;
+        }
+        // 构建 (like A or like B or ...) 的条件组
+        mw.and(w -> {
+            for (int i = 0; i < entTypeList.size(); i++) {
+                String t = entTypeList.get(i);
+                if (i == 0) {
+                    // 第一个条件直接使用 like
+                    w.like(KwsMenu::getUsingRoles, t);
+                } else {
+                    // 后续条件使用 or like
+                    w.or().like(KwsMenu::getUsingRoles, t);
+                }
+            }
+        });
+    }
+
+
+
     public List<FindMenuTreeResVo> findTree(FindMenuTreeReqVo reqVo) {
         FindMenuTreePojo findMenuTreePojo = new FindMenuTreePojo();
         BeanUtils.copyProperties(reqVo, findMenuTreePojo);
 
         //填充用户参数
         extracted(reqVo.getUserId(), reqVo.getClientType(), findMenuTreePojo);
-
-        List<KwsMenuResVo> menuList = kwsMenuDao.findList(findMenuTreePojo);
+        List<KwsMenuResVo> menuList = new ArrayList<>();
+        if (Objects.equals(LoginUserHolder.getSystemType(), SystemTypeEnum.COMPANY.getCode()) && org.apache.commons.lang3.StringUtils.equals(reqVo.getClientType(), String.valueOf(Global.NUMERICAL_THREE))) {
+            menuList = kwsMenuDao.findList1(findMenuTreePojo);
+        }else {
+            menuList = kwsMenuDao.findList(findMenuTreePojo);
+        }
+       // List<KwsMenuResVo> menuList = kwsMenuDao.findList(findMenuTreePojo);
         if (CollectionUtils.isEmpty(menuList)) {
             return Collections.emptyList();
         }
@@ -294,17 +624,18 @@ public class KwsMenuService {
         List<KwsMenuResVo> finalList = new ArrayList<>();
         if (SystemTypeEnum.COMPANY.getCode().equals(LoginUserHolder.getSystemType()) &&
                 ClientTypeEnum.app.getValue().equals(LoginUserHolder.getClientType())) {
-            List<KwsMenuMapping> kwsMenuMappings = kwsMenuMappingDao.selectByMenuIds(menuList.stream().map(KwsMenuResVo::getId).toList());
-            if (CollectionUtils.isEmpty(kwsMenuMappings)) {
-                return Collections.emptyList();
-            }
-
-            List<Long> mapIds = kwsMenuMappings.stream().map(KwsMenuMapping::getMappingId).toList();
-            List<KwsMenu> kwsMenus = kwsMenuDao.selectByKeys(mapIds);
-            if (CollectionUtils.isEmpty(kwsMenus)) {
-                return Collections.emptyList();
-            }
-            finalList = BeanUtils.copyToList(kwsMenus, KwsMenuResVo.class);
+//            List<KwsMenuMapping> kwsMenuMappings = kwsMenuMappingDao.selectByMenuIds(menuList.stream().map(KwsMenuResVo::getId).toList());
+//            if (CollectionUtils.isEmpty(kwsMenuMappings)) {
+//                return Collections.emptyList();
+//            }
+//
+//            List<Long> mapIds = kwsMenuMappings.stream().map(KwsMenuMapping::getMappingId).toList();
+//            List<KwsMenu> kwsMenus = kwsMenuDao.selectByKeys(mapIds);
+//            if (CollectionUtils.isEmpty(kwsMenus)) {
+//                return Collections.emptyList();
+//            }
+            finalList = menuList;
+          //  finalList = BeanUtils.copyToList(kwsMenus, KwsMenuResVo.class);
         } else {
             finalList = menuList;
         }
@@ -349,7 +680,20 @@ public class KwsMenuService {
         }
         //pc端和app权限不做过滤,
         // 根据用户id查询角色id
+        if (Objects.equals(LoginUserHolder.getSystemType(), SystemTypeEnum.COMPANY.getCode()) && org.apache.commons.lang3.StringUtils.equals(clientType, String.valueOf(Global.NUMERICAL_THREE)) && Objects.equals(LoginUserHolder.getIsMain(), Global.YES)) {
+            return;
+        }
+
         if (Objects.equals(LoginUserHolder.getSystemType(), SystemTypeEnum.COMPANY.getCode()) && org.apache.commons.lang3.StringUtils.equals(clientType, String.valueOf(Global.NUMERICAL_THREE))) {
+            if (Objects.isNull(userId)) {
+                userId = LoginUserHolder.getUserId();
+            }
+            KwsUser kwsUser = kwsUserDao.selectByKey(userId);
+            if (Objects.isNull(kwsUser)) {
+                throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.ACCOUNT_NOT_EXISTS);
+            }
+            //改为单一角色切换形式,获取当前激活的角色。
+            findMenuTreePojo.setRoleIds(Collections.singletonList(LoginUserHolder.getCurrentRoleId()));
             return;
         }
         //特殊处理,后面会做菜单关联

+ 33 - 1
sckw-modules/sckw-system/src/main/resources/mapper/KwsMenuDao.xml

@@ -299,7 +299,39 @@
     </if>
     ORDER BY sm.level, sm.sort
   </select>
-
+  <select id="findList1" resultType="com.sckw.system.model.vo.res.KwsMenuResVo"
+          parameterType="com.sckw.system.model.pojo.FindMenuTreePojo" >
+    select distinct
+    <include refid="Base_Column_List" />
+    from kws_menu sm
+    left join kws_menu_rights smr on sm.id = smr.menu_id
+    where sm.del_flag = 0 and  smr.del_flag = 0
+    <if test="clientType != null">
+      and sm.client_type = #{clientType}
+    </if>
+    <if test="name != null and name != ''">
+      and sm.name = #{name, jdbcType=VARCHAR}
+    </if>
+    <if test="entTypeList != null and entTypeList.size() > 0">
+      and
+      <foreach collection="entTypeList" item="item" open="(" close=")" separator=" or ">
+        using_roles like concat('%', #{item}, '%')
+      </foreach>
+    </if>
+    <if test="entId != null">
+      and smr.ent_id = #{entId}
+    </if>
+    <if test="roleIds != null and roleIds.size() > 0">
+      and smr.role_id in
+      <foreach collection="roleIds" separator="," open="(" close=")" item="item">
+        #{item}
+      </foreach>
+    </if>
+    <if test="type != null">
+      and sm.type = #{type}
+    </if>
+    ORDER BY sm.level, sm.sort
+  </select>
   <select id="selectByKeys" resultType="com.sckw.system.model.KwsMenu">
     select
     <include refid="Base_Column_List" />

+ 8 - 0
sckw-modules/sckw-system/src/main/resources/mapper/KwsMenuMappingDao.xml

@@ -56,4 +56,12 @@
         and a.del_flag = 0
     </select>
 
+    <select id="selectByMappingIds" resultType="com.sckw.system.model.KwsMenuMapping">
+        select a.* from kws_menu_mapping a where a.mapping_id in
+        <foreach collection="idList" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        and a.del_flag = 0
+    </select>
+
 </mapper>

+ 1 - 0
sckw-modules/sckw-system/src/main/resources/mapper/KwsUserDao.xml

@@ -335,6 +335,7 @@
                su.status,
                su.salt,
                su.ent_id,
+               su.driver_id,
                u1.name createByName,
                su.create_time,
                su.update_time

+ 3 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java

@@ -16,6 +16,7 @@ import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.*;
 import com.sckw.transport.repository.*;
@@ -72,6 +73,8 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
 
     @Autowired
     LogisticsScoreFeignService logisticsScoreFeignService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    GoodsInfoService goodsInfoService;
 
     /**
      * 模板方法 - 定义处理流程

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

@@ -12,6 +12,7 @@ import com.sckw.core.utils.DateUtils;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
+import com.sckw.product.api.model.KwpGoods;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.transport.model.*;
@@ -102,13 +103,20 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
                 forklift.setWOrderId(waybillOrder.getId());
                 forklift.setLOrderId(waybillOrder.getLOrderId());
 
+                //查询字典
+                Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(
+                        Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
+                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<>());
+
                 // 查询商品信息
                 KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
-                if (orderGoods != null) {
+                KwpGoods goods = goodsInfoService.getGoodsById(orderGoods.getGoodsId());
+                if (goods != null) {
                     List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), orderGoods.getGoodsType());
                     forklift.setDictId(CollectionUtils.isNotEmpty(dictResDtoList) ? dictResDtoList.get(0).getId() : -1L);
-                    forklift.setGoodsId(orderGoods.getGoodsId());
-                    forklift.setGoodsName(orderGoods.getGoodsName());
+                    forklift.setGoodsId(goods.getId());
+                    forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
                 }
                 forklift.setLoadingType(0);
                 forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());

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

@@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
@@ -194,7 +195,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
      */
     private KwtLogisticsOrder checkLogOrder(OrderCirculateTakingQueryParam param) {
         KwtLogisticsOrder logOrder = logisticsOrderRepository.queryByLogOrderIdAndStatus(param.getLogOrderId(), LogisticsOrderV1Enum.IN_TRANSIT.getCode());
-        if (logOrder == null) {
+        if (logOrder == null || logOrder.getEndTime().isBefore(LocalDateTime.now())) {
             throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_STATUS_ERROR, "物流订单非可接单状态");
         }
         return logOrder;

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

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * @author :chenXiaoFei
@@ -147,4 +148,35 @@ public class WaybillOrderResp implements Serializable {
      */
     @Schema(description = "货物实际费用")
     private String actualGoodsPrice;
+
+    /**
+     * 车辆轴数
+     */
+    @Schema(description = "车辆轴数")
+    private String carAxisName;
+
+    /**
+     * 计费方式
+     */
+    @Schema(description = "计费方式")
+    private String priceType;
+
+    /**
+     * 计费方式描述
+     */
+    @Schema(description = "计费方式描述")
+    private String priceTypeDesc;
+
+    /**
+     * 皮重
+     */
+    @Schema(description = "皮重")
+    private BigDecimal tareAmount;
+
+    /**
+     * 毛重
+     */
+    @Schema(description = "毛重")
+    private BigDecimal grossAmount;
+
 }

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

@@ -3250,8 +3250,10 @@ public class KwtWaybillOrderV1Service {
     private OrderData batchQueryOrderData(OrderIds orderIds) {
         OrderData orderData = new OrderData();
 
+        List<KwtWaybillOrder> waybillOrders = kwtWaybillOrderRepository.queryByBillOrderIds(orderIds.getWayBillOrderIds());
+
         // 查询主运单信息
-        orderData.setWaybillOrderMap(getLongKwtWaybillOrderMap(orderIds.getWayBillOrderIds()));
+        orderData.setWaybillOrderMap(getLongKwtWaybillOrderMap(waybillOrders));
 
         // 查询承运托运单位信息
         orderData.setLogisticsOrderUnitMap(getStringKwtLogisticsOrderUnitMap(
@@ -3269,6 +3271,12 @@ public class KwtWaybillOrderV1Service {
         // 查询物流订单信息
         queryLogisticsOrders(orderIds, orderData);
 
+        // 轴数
+        queryCarAxis(waybillOrders, orderData);
+
+        //装卸货信息
+        queryTareAndGrossAmount(waybillOrders, orderData);
+
         return orderData;
     }
 
@@ -3377,6 +3385,34 @@ public class KwtWaybillOrderV1Service {
         }
     }
 
+    /**
+     * 查询运单轴数
+     */
+    private void queryCarAxis(List<KwtWaybillOrder> waybillOrders, OrderData orderData) {
+        List<Long> truckIds = waybillOrders.stream().map(KwtWaybillOrder::getTruckId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        List<RTruckVo> truckVoList = remoteFleetService.findTruckByTruckIds(truckIds);
+        if (CollectionUtils.isNotEmpty(truckVoList)) {
+            Map<Long, RTruckVo> truckVoMap = truckVoList.stream().collect(Collectors.toMap(RTruckVo::getId, Function.identity(), (x, y) -> x));
+            orderData.setCarAxisMap(truckVoMap);
+        }
+    }
+
+    /**
+     *
+     * 查询运单皮重、毛重
+     * @param waybillOrders
+     */
+    private void queryTareAndGrossAmount(List<KwtWaybillOrder> waybillOrders, OrderData orderData) {
+        List<Long> wbOrderIdList = waybillOrders.stream().map(KwtWaybillOrder::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        List<KwtWaybillOrderTicket> orderTicketList = kwtWaybillOrderTicketRepository.queryByWOrderIds(wbOrderIdList);
+        if (CollectionUtils.isNotEmpty(orderTicketList)) {
+            Map<String, KwtWaybillOrderTicket> ticketMap = orderTicketList.stream().collect(
+                    Collectors.toMap(ticket -> ticket.getWOrderId() + "-" + ticket.getType(),
+                            Function.identity(), (x, y) -> x));
+            orderData.setTicketMap(ticketMap);
+        }
+    }
+
     /**
      * 查询字典数据
      */
@@ -3424,6 +3460,8 @@ public class KwtWaybillOrderV1Service {
                 orderData.getLogIdAndOrderMap(),
                 dictValueAndDictResDtoMap,
                 orderData.getWOrderIdAndOffsiteNodeMap(),
+                orderData.getCarAxisMap(),
+                orderData.getTicketMap(),
                 logisticsOrderMap,
                 tradeOrderContractVoMap,
                 orderContracGoodstoMap);
@@ -3453,12 +3491,13 @@ public class KwtWaybillOrderV1Service {
         private Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsIdMap;
         private Map<Long, KwpGoods> kwpGoodsMap;
         private Map<Long, KwtLogisticsOrder> logIdAndOrderMap;
+        private Map<Long, RTruckVo> carAxisMap;
+        private Map<String, KwtWaybillOrderTicket> ticketMap;
     }
 
 
     @NotNull
-    private Map<Long, KwtWaybillOrder> getLongKwtWaybillOrderMap(Set<Long> wayBillOrderIds) {
-        List<KwtWaybillOrder> waybillOrders = kwtWaybillOrderRepository.queryByBillOrderIds(wayBillOrderIds);
+    private Map<Long, KwtWaybillOrder> getLongKwtWaybillOrderMap(List<KwtWaybillOrder> waybillOrders) {
         Map<Long, KwtWaybillOrder> waybillOrderIdAndBillOrderMap = Maps.newHashMap();
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(waybillOrders)){
             waybillOrderIdAndBillOrderMap = waybillOrders.stream()
@@ -4025,6 +4064,8 @@ public class KwtWaybillOrderV1Service {
                                                         Map<Long, KwtLogisticsOrder> finalLogIdAndOrderMap,
                                                         Map<String, Map<String, String>> dictValueAndDictResDtoMap,
                                                         Map<Long, KwtWaybillOrderNode> wOrderIdAndOffsiteNodeMap,
+                                                        Map<Long, RTruckVo> carAxisMap,
+                                                        Map<String, KwtWaybillOrderTicket> ticketMap,
                                                         Map<Long, KwtLogisticsOrder> logisticsOrderMap,
                                                         Map<Long, TradeOrderContractVo> tradeOrderContractVoMap,
                                                         Map<String, TradeContractGoodsDto> orderContracGoodstoMap) {
@@ -4048,6 +4089,15 @@ public class KwtWaybillOrderV1Service {
         waybillOrderResp.setTruckNo(billOrder.getTruckNo());
         waybillOrderResp.setDriverName(billOrder.getDriverName());
         waybillOrderResp.setDriverPhone(billOrder.getDriverPhone());
+        //轴数
+        RTruckVo rTruckVo = carAxisMap.getOrDefault(billOrder.getTruckId(), new RTruckVo());
+        waybillOrderResp.setCarAxisName(rTruckVo.getCarAxis());
+
+        //皮重、毛重
+        KwtWaybillOrderTicket tareAmountTicket = ticketMap.getOrDefault(billOrder.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtWaybillOrderTicket());
+        waybillOrderResp.setTareAmount(tareAmountTicket.getTareAmount());
+        waybillOrderResp.setGrossAmount(tareAmountTicket.getGrossAmount());
+
         Long lOrderId = record.getLOrderId();
 
         KwtLogisticsOrderGoods goods = finalLogOrderIdAndGoodsIdMap.getOrDefault(lOrderId,
@@ -4101,6 +4151,10 @@ public class KwtWaybillOrderV1Service {
         waybillOrderResp.setStatus(String.valueOf(record.getStatus()));
         waybillOrderResp.setStatusDesc(CarWaybillV1Enum.geDesc(record.getStatus()));
         KwtLogisticsOrder logOrder = logisticsOrderMap.getOrDefault(lOrderId, new KwtLogisticsOrder());
+        //计费方式
+        waybillOrderResp.setPriceType(String.valueOf(logOrder.getBillingMode()));
+        waybillOrderResp.setPriceTypeDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(), logOrder.getBillingMode()));
+
         KwtLogisticsOrderGoods kwtLogisticsOrderGoods = finalLogOrderIdAndGoodsIdMap.getOrDefault(lOrderId, new KwtLogisticsOrderGoods());
         TradeOrderContractVo tradeOrderContractVo = tradeOrderContractVoMap.getOrDefault(logOrder.getTOrderId(), new TradeOrderContractVo());
         TradeContractGoodsDto contractGoodsDto = orderContracGoodstoMap.getOrDefault(tradeOrderContractVo.getContractId()+"-"+kwtLogisticsOrderGoods.getGoodsId(), new TradeContractGoodsDto());
@@ -4520,6 +4574,11 @@ public class KwtWaybillOrderV1Service {
                     contractGoodsDto.getPrice().multiply(subtask.getLoadAmount()) : BigDecimal.ZERO;
             resp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() +"元");
             resp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP).toPlainString()+"元");
+            // 票据信息
+            String shipmentTicketKey = subtask.getWOrderId() + "-" + AddressTypeEnum.SHIPMENT.getCode();
+            KwtWaybillOrderTicket tareAmountTicket = ticketMap.getOrDefault(shipmentTicketKey, new KwtWaybillOrderTicket());
+            resp.setTareAmount(tareAmountTicket.getTareAmount());
+            resp.setGrossAmount(tareAmountTicket.getGrossAmount());
         }else if (org.apache.commons.lang3.StringUtils.equals(logOrder.getBillingMode(), DictEnum.CHARGING_TYPE_2.getValue())){
             BigDecimal actualPrice = Objects.nonNull(logOrder.getPrice()) && Objects.nonNull(subtask.getUnloadAmount()) ?
                     logOrder.getPrice().multiply(subtask.getUnloadAmount()) : BigDecimal.ZERO;
@@ -4527,6 +4586,12 @@ public class KwtWaybillOrderV1Service {
                     contractGoodsDto.getPrice().multiply(subtask.getUnloadAmount()) : BigDecimal.ZERO;
             resp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP).toPlainString()+"元");
             resp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP).toPlainString()+"元");
+
+            String takeTicketKey = subtask.getWOrderId() + "-" + AddressTypeEnum.TAKE.getCode();
+            KwtWaybillOrderTicket grossAmountTicket = ticketMap.getOrDefault(takeTicketKey, new KwtWaybillOrderTicket());
+            resp.setTareAmount(grossAmountTicket.getTareAmount());
+            resp.setGrossAmount(grossAmountTicket.getGrossAmount());
+
         }
         resp.setTruckNo(billOrder.getTruckNo());
         resp.setCarAxis(truck != null ? truck.getCarAxis() : "");
@@ -4580,14 +4645,6 @@ public class KwtWaybillOrderV1Service {
                     .ifPresent(x -> resp.setSupplyEntName(x.getFirmName()));
         }
 
-        // 票据信息
-        String shipmentTicketKey = subtask.getWOrderId() + "-" + AddressTypeEnum.SHIPMENT.getCode();
-        String takeTicketKey = subtask.getWOrderId() + "-" + AddressTypeEnum.TAKE.getCode();
-        KwtWaybillOrderTicket tareAmountTicket = ticketMap.getOrDefault(shipmentTicketKey, new KwtWaybillOrderTicket());
-        KwtWaybillOrderTicket grossAmountTicket = ticketMap.getOrDefault(takeTicketKey, new KwtWaybillOrderTicket());
-        resp.setTareAmount(tareAmountTicket.getTareAmount());
-        resp.setGrossAmount(grossAmountTicket.getGrossAmount());
-
         // 状态信息
         resp.setStatus(subtask.getStatus());
         resp.setStatusDesc(CarWaybillV1Enum.geDesc(subtask.getStatus()));

+ 4 - 4
sckw-modules/sckw-transport/src/main/resources/bootstrap-cxf.yml

@@ -3,16 +3,16 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: @nacos.server@
+        server-addr: 118.116.4.155:8848
         # 命名空间
-        namespace: @nacos.namespace@
+        namespace: sckw-ng-service-platform-xf
         # 共享配置
         group: sckw-ng-service-platform
       config:
         # 配置中心地址
-        server-addr: @nacos.server@
+        server-addr: 118.116.4.155:8848
         # 命名空间
-        namespace: @nacos.namespace@
+        namespace: sckw-ng-service-platform-xf
         # 共享配置
         group: sckw-ng-service-platform
         # 配置文件格式

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

@@ -6,7 +6,8 @@ CREATE table kwt_forklift_waybill_order
     ent_id                          bigint          NOT NULL DEFAULT '-1' COMMENT '企业id',
     w_order_id                      bigint          NOT NULL DEFAULT '-1' COMMENT '物流运单id',
     l_order_id                      bigint          NOT NULL DEFAULT '-1' COMMENT '物流订单id',
-    good_id                         bigint          NOT NULL DEFAULT '-1' COMMENT '商品id',
+    dict_id                         bigint          NOT NULL DEFAULT '-1' COMMENT '商品类型id',
+    goods_id                        bigint          NOT NULL DEFAULT '-1' COMMENT '商品id',
     goods_name                      varchar(20)     NOT NULL default '' COMMENT '商品名称',
     loading_type                    int             NOT NULL DEFAULT '0' COMMENT '装载类型(0装载,1补货)',
     status                          int             NOT NULL DEFAULT '0' COMMENT '状态(1-待接单,5-已接单、10-已装载)',