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

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

xucaiqin пре 1 месец
родитељ
комит
3c2b1224be
39 измењених фајлова са 2327 додато и 59 уклоњено
  1. 3 2
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/ErrorCodeEnum.java
  2. 4 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java
  3. 122 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/DriverConductRulesVO.java
  4. 109 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/TruckDispatchCoefficientVO.java
  5. 109 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfAutoDispatchController.java
  6. 16 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfDriverConductRulesLogMapper.java
  7. 16 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfDriverConductRulesMapper.java
  8. 16 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfTruckDispatchCoefficientMapper.java
  9. 61 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java
  10. 148 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverConductRules.java
  11. 69 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverConductRulesLog.java
  12. 129 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruckDispatchCoefficient.java
  13. 45 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesLogRequest.java
  14. 35 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesRequest.java
  15. 113 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesUpdateRequest.java
  16. 95 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckDispatchCoefficientUpdateRequest.java
  17. 81 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverConductRulesLogVO.java
  18. 177 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverConductRulesVO.java
  19. 157 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfTruckDispatchCoefficientVO.java
  20. 16 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverConductRulesLogRepository.java
  21. 24 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverConductRulesRepository.java
  22. 24 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckDispatchCoefficientRepository.java
  23. 398 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfAutoDispatchService.java
  24. 2 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  25. 14 0
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/request/KwpBizWalletQueryRequest.java
  26. 33 16
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/wallet/KwpBizWalletService.java
  27. 1 1
      sckw-modules/sckw-product/src/main/java/com/sckw/product/controller/KwpGoodsController.java
  28. 38 25
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java
  29. 79 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java
  30. 29 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java
  31. 39 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java
  32. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveHandler.java
  33. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveMockHandler.java
  34. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java
  35. 4 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java
  36. 32 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java
  37. 7 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderAddressRepository.java
  38. 16 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderNodeRepository.java
  39. 51 11
      sql/2025/12/01/2025_12_04_donglang.sql

+ 3 - 2
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/ErrorCodeEnum.java

@@ -18,6 +18,7 @@ public enum ErrorCodeEnum {
     PERMISSION_DENIED("100003", "权限不足"),
     NETWORK_ERROR("100004", "网络连接异常"),
     DB_OPERATE_FAIL("100005", "数据库操作异常"),
+    DATA_NOT_EXIST("100006", "数据查询结果不存在"),
 
     // ====================== 设备相关错误(20000~29999)======================
     DEVICE_OFFLINE("200000", "设备离线"),
@@ -70,8 +71,8 @@ public enum ErrorCodeEnum {
     WAYBILL_ORDER_STATUS_ERROR("80005", " 物流运单状态异常"),
     WAYBILL_ORDER_TICKET_NOT_FOUND("80006", " 当前物流运单装卸货信息不存在"),
     WAYBILL_ORDER_NOT_TRUCK("80007", " 物流运单无关联车辆数据"),
-    WAYBILL_ORDER_NOT_TICKET("80007", " 物流运单无关联装卸货数据"),
-
+    WAYBILL_ORDER_NOT_TICKET("80008", " 物流运单无关联装卸货数据"),
+    WAYBILL_NODE_NOT_EXIST("80009", " 物流运单无节点数据"),
 
 
     // ====================== 司机/车辆(90000~99999)======================

+ 4 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java

@@ -116,4 +116,8 @@ public interface RemoteFleetService {
 
     RFleetVo findFleetByTruckId(Long truckId, Long entId);
 
+    TruckDispatchCoefficientVO findAutoTruckDispatchByEntId(Long entId);
+
+    DriverConductRulesVO findDriverConductRulesByEntId(Long entId);
+
 }

+ 122 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/DriverConductRulesVO.java

@@ -0,0 +1,122 @@
+package com.sckw.fleet.api.model.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 司机行为规则返回模型
+ *
+ * @author Generated
+ * @since 2024
+ */
+@Data
+public class DriverConductRulesVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5360767484446805797L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 单趟严重超时(违规次数/扣分)
+     */
+    private Integer unloadSeriousTimeout;
+
+    /**
+     * 单趟严重超时倍数
+     */
+    private BigDecimal unloadSeriousTimeoutMultiple;
+
+    /**
+     * 单据错误/缺失(违规次数/扣分)
+     */
+    private Integer documentErrorMissing;
+
+    /**
+     * 未按时到场(违规次数/扣分)
+     */
+    private Integer notOnTimeArrive;
+
+    /**
+     * 虚假卸货(违规次数/扣分)
+     */
+    private Integer fakeUnload;
+
+    /**
+     * 虚假卸货偏差距离
+     */
+    private Integer fakeUnloadDistance;
+
+    /**
+     * 违规取消运单(违规次数/扣分)
+     */
+    private Integer illegalCancelOrder;
+
+    /**
+     * 违规取消运单分钟数
+     */
+    private Integer illegalCancelOrderMinutes;
+
+    /**
+     * 连续按时到场(达标次数/加分)
+     */
+    private Integer continuousOnTimeArrive;
+
+    /**
+     * 连续按时到场次数
+     */
+    private Integer continuousOnTimeArriveTimes;
+
+    /**
+     * 连续准时卸货(达标次数/加分)
+     */
+    private Integer continuousOnTimeUnload;
+
+    /**
+     * 连续准时卸货次数
+     */
+    private Integer continuousOnTimeUnloadTimes;
+
+    /**
+     * 连续准确填写卸货信息(达标次数/加分)
+     */
+    private Integer continuousAccurateUnload;
+
+    /**
+     * 连续准确填写卸货信息次数
+     */
+    private Integer continuousAccurateUnloadTimes;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    private Long createUser;
+
+    /**
+     * 更新人(用户ID,默认-1)
+     */
+    private Long updateUser;
+
+}

+ 109 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/TruckDispatchCoefficientVO.java

@@ -0,0 +1,109 @@
+package com.sckw.fleet.api.model.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 司机行为规则返回模型
+ *
+ * @author Generated
+ * @since 2024
+ */
+@Data
+public class TruckDispatchCoefficientVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5360767484446805797L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 车辆工作时长
+     */
+    private Integer vehicleWorkHours;
+
+    /**
+     * 车辆装货时长
+     */
+    private Integer vehicleLoadingHours;
+
+    /**
+     * 车辆卸货时长
+     */
+    private Integer vehicleUnloadingHours;
+
+    /**
+     * 司机超时限制
+     */
+    private Integer driverTimeoutLimit;
+
+    /**
+     * 车辆平均载重
+     */
+    private Integer vehicleAvgLoad;
+
+    /**
+     * 车辆平均速度
+     */
+    private Integer vehicleAvgSpeed;
+
+    /**
+     * 车辆最大任务数
+     */
+    private Integer vehicleMaxTasks;
+
+    /**
+     * 司机接单限制
+     */
+    private Integer driverOrderLimit;
+
+    /**
+     * 场内车辆容量
+     */
+    private Integer yardVehicleCapacity;
+
+    /**
+     * 最大占比
+     */
+    private Integer maxRatio;
+
+    /**
+     * 缓冲系数
+     */
+    private BigDecimal bufferCoefficient;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    private Long createUser;
+
+    /**
+     * 更新人(用户ID,默认-1)
+     */
+    private Long updateUser;
+
+
+
+}

+ 109 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfAutoDispatchController.java

@@ -0,0 +1,109 @@
+package com.sckw.fleet.controller;
+
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.core.web.response.result.PageDataResult;
+import com.sckw.fleet.model.request.DriverConductRulesLogRequest;
+import com.sckw.fleet.model.request.DriverConductRulesRequest;
+import com.sckw.fleet.model.request.DriverConductRulesUpdateRequest;
+import com.sckw.fleet.model.request.TruckDispatchCoefficientUpdateRequest;
+import com.sckw.fleet.model.vo.KwfDriverConductRulesLogVO;
+import com.sckw.fleet.model.vo.KwfDriverConductRulesVO;
+import com.sckw.fleet.model.vo.KwfTruckDispatchCoefficientVO;
+import com.sckw.fleet.service.KwfAutoDispatchService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author zk
+ * @desc 司机
+ * @date 2023/7/6 0006
+ */
+@RestController
+@RequestMapping("/kwfDriver")
+@Tag(name = "司机行为规则", description = "提供司机行为规则相关操作接口")
+@RequiredArgsConstructor
+public class KwfAutoDispatchController {
+
+    private final KwfAutoDispatchService autoDispatchService;
+
+    /**
+     * 查询自动派车系数
+     *
+     * @param request
+     * @return
+     */
+    @Operation(summary = "查询自动派车系数", description = "查询自动派车系数")
+    @PostMapping("/queryAutoTruckDispatch")
+    public BaseResult<KwfTruckDispatchCoefficientVO> queryAutoTruckDispatch(@RequestBody @Valid DriverConductRulesRequest request){
+        KwfTruckDispatchCoefficientVO autoDispatchVO = autoDispatchService.queryAutoTruckDispatch(request);
+        return BaseResult.success(autoDispatchVO);
+    }
+
+
+    /**
+     * 修改自动派车系数
+     *
+     * @param request
+     * @return
+     */
+    @Operation(summary = "修改自动派车系数", description = "修改自动派车系数")
+    @PostMapping("/updateAutoDispatch")
+    public BaseResult updateAutoDispatch(@RequestBody @Valid TruckDispatchCoefficientUpdateRequest request){
+        autoDispatchService.updateAutoDispatch(request);
+        return BaseResult.success();
+    }
+
+
+
+    /**
+     * 查询司机行为规则
+     *
+     * @param request
+     * @return
+     */
+    @Operation(summary = "查询司机行为规则", description = "查询司机行为规则")
+    @PostMapping("/queryDriverConductRules")
+    public BaseResult<KwfDriverConductRulesVO> queryDriverConductRules(@RequestBody @Valid DriverConductRulesRequest request){
+        KwfDriverConductRulesVO driverConductRulesVO = autoDispatchService.queryDriverConductRules(request);
+        return BaseResult.success(driverConductRulesVO);
+    }
+
+    /**
+     * 修改司机行为规则
+     *
+     * @param request
+     * @return
+     */
+    @Operation(summary = "修改司机行为规则", description = "修改司机行为规则")
+    @PostMapping("/updateDriverConduct")
+    public BaseResult update(@RequestBody @Valid DriverConductRulesUpdateRequest request){
+        autoDispatchService.updateDriverConduct(request);
+        return BaseResult.success();
+    }
+
+    /**
+     * 分页查询司机行为规则日志
+     *
+     * @param request
+     * @return
+     */
+    @Operation(summary = "查询司机行为规则", description = "查询司机行为规则")
+    @PostMapping("/queryDriverRulesLogPage")
+    public BaseResult<PageDataResult<KwfDriverConductRulesLogVO>> queryDriverRulesLogPage(DriverConductRulesLogRequest request){
+        PageDataResult<KwfDriverConductRulesLogVO> driverConductRulesLogVOPage =
+                autoDispatchService.queryDriverRulesLogPage(request);
+        return BaseResult.success(driverConductRulesLogVOPage);
+    }
+
+
+
+
+
+
+}

+ 16 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfDriverConductRulesLogMapper.java

@@ -0,0 +1,16 @@
+package com.sckw.fleet.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.fleet.model.KwfDriverConductRulesLog;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @desc 司机行为规则日志Mapper接口
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Mapper
+public interface KwfDriverConductRulesLogMapper extends BaseMapper<KwfDriverConductRulesLog> {
+
+
+}

+ 16 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfDriverConductRulesMapper.java

@@ -0,0 +1,16 @@
+package com.sckw.fleet.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.fleet.model.KwfDriverConductRules;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @desc 司机行为规则Mapper接口
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Mapper
+public interface KwfDriverConductRulesMapper extends BaseMapper<KwfDriverConductRules> {
+
+
+}

+ 16 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfTruckDispatchCoefficientMapper.java

@@ -0,0 +1,16 @@
+package com.sckw.fleet.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.fleet.model.KwfTruckDispatchCoefficient;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @desc 司机行为规则Mapper接口
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Mapper
+public interface KwfTruckDispatchCoefficientMapper extends BaseMapper<KwfTruckDispatchCoefficient> {
+
+
+}

+ 61 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -44,6 +44,8 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     private final KwfTruckRouteRepository kwfTruckRouteRepository;
     private final KwfTruckAxleNumRepository kwfTruckAxleNumRepository;
     private final KwfFleetRepository kwfFleetRepository;
+    private final KwfTruckDispatchCoefficientRepository truckDispatchCoefficientRepository;
+    private final KwfDriverConductRulesRepository driverConductRulesRepository;
 
     /**
      * @param driverIds 司机档案主键id,多个已逗号隔开
@@ -489,5 +491,64 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         kwfTruckRepository.save(truck);
     }
 
+    @Override
+    public TruckDispatchCoefficientVO findAutoTruckDispatchByEntId(Long entId) {
+        KwfTruckDispatchCoefficient result = truckDispatchCoefficientRepository.findAutoTruckDispatchByEntId(entId);
+        if (result == null) {
+            return new TruckDispatchCoefficientVO();
+        }
+
+        TruckDispatchCoefficientVO rulesVO = new TruckDispatchCoefficientVO();
+        rulesVO.setId(result.getId());
+        rulesVO.setEntId(result.getEntId());
+        rulesVO.setVehicleWorkHours(result.getVehicleWorkHours());
+        rulesVO.setVehicleLoadingHours(result.getVehicleLoadingHours());
+        rulesVO.setVehicleUnloadingHours(result.getVehicleUnloadingHours());
+        rulesVO.setDriverTimeoutLimit(result.getDriverTimeoutLimit());
+        rulesVO.setVehicleAvgLoad(result.getVehicleAvgLoad());
+        rulesVO.setVehicleAvgSpeed(result.getVehicleAvgSpeed());
+        rulesVO.setVehicleMaxTasks(result.getVehicleMaxTasks());
+        rulesVO.setDriverOrderLimit(result.getDriverOrderLimit());
+        rulesVO.setYardVehicleCapacity(result.getYardVehicleCapacity());
+        rulesVO.setMaxRatio(result.getMaxRatio());
+        rulesVO.setBufferCoefficient(result.getBufferCoefficient());
+        rulesVO.setCreateTime(result.getCreateTime());
+        rulesVO.setUpdateTime(result.getUpdateTime());
+        rulesVO.setCreateUser(result.getCreateUser());
+        rulesVO.setUpdateUser(result.getUpdateUser());
+        return rulesVO;
+
+    }
 
+    @Override
+    public DriverConductRulesVO findDriverConductRulesByEntId(Long entId) {
+        KwfDriverConductRules result = driverConductRulesRepository.findDriverConductRulesByEntId(entId);
+        if (result == null) {
+            return new DriverConductRulesVO();
+        }
+
+        DriverConductRulesVO rulesVO = new DriverConductRulesVO();
+        rulesVO.setId(result.getId());
+        rulesVO.setEntId(result.getEntId());
+        rulesVO.setUnloadSeriousTimeout(result.getUnloadSeriousTimeout());
+        rulesVO.setUnloadSeriousTimeoutMultiple(result.getUnloadSeriousTimeoutMultiple());
+        rulesVO.setDocumentErrorMissing(result.getDocumentErrorMissing());
+        rulesVO.setNotOnTimeArrive(result.getNotOnTimeArrive());
+        rulesVO.setFakeUnload(result.getFakeUnload());
+        rulesVO.setFakeUnloadDistance(result.getFakeUnloadDistance());
+        rulesVO.setIllegalCancelOrder(result.getIllegalCancelOrder());
+        rulesVO.setIllegalCancelOrderMinutes(result.getIllegalCancelOrderMinutes());
+        rulesVO.setContinuousOnTimeArrive(result.getContinuousOnTimeArrive());
+        rulesVO.setContinuousOnTimeArriveTimes(result.getContinuousOnTimeArriveTimes());
+        rulesVO.setContinuousOnTimeUnload(result.getContinuousOnTimeUnload());
+        rulesVO.setContinuousOnTimeUnloadTimes(result.getContinuousOnTimeUnloadTimes());
+        rulesVO.setContinuousAccurateUnload(result.getContinuousAccurateUnload());
+        rulesVO.setContinuousAccurateUnloadTimes(result.getContinuousAccurateUnloadTimes());
+        rulesVO.setCreateTime(result.getCreateTime());
+        rulesVO.setUpdateTime(result.getUpdateTime());
+        rulesVO.setCreateUser(result.getCreateUser());
+        rulesVO.setUpdateUser(result.getUpdateUser());
+
+        return rulesVO;
+    }
 }

+ 148 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverConductRules.java

@@ -0,0 +1,148 @@
+package com.sckw.fleet.model;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 司机行为规则表
+ * 表名:kwf_driver_conduct_rules
+ *
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@TableName("kwf_driver_conduct_rules")
+public class KwfDriverConductRules implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    @TableField("net_id")
+    private Long entId;
+
+    /**
+     * 单趟严重超时(违规次数/扣分)
+     */
+    @TableField("unload_serious_timeout")
+    private Integer unloadSeriousTimeout;
+
+    /**
+     * 单趟严重超时倍数
+     */
+    @TableField("unload_serious_timeout_multiple")
+    private BigDecimal unloadSeriousTimeoutMultiple;
+
+    /**
+     * 单据错误/缺失(违规次数/扣分)
+     */
+    @TableField("document_error_missing")
+    private Integer documentErrorMissing;
+
+    /**
+     * 未按时到场(违规次数/扣分)
+     */
+    @TableField("not_on_time_arrive")
+    private Integer notOnTimeArrive;
+
+    /**
+     * 虚假卸货(违规次数/扣分)
+     */
+    @TableField("fake_unload")
+    private Integer fakeUnload;
+
+    /**
+     * 虚假卸货偏差距离
+     */
+    @TableField("fake_unload_distance")
+    private Integer fakeUnloadDistance;
+
+    /**
+     * 违规取消运单(违规次数/扣分)
+     */
+    @TableField("illegal_cancel_order")
+    private Integer illegalCancelOrder;
+
+    /**
+     * 违规取消运单分钟数
+     */
+    @TableField("illegal_cancel_order_minutes")
+    private Integer illegalCancelOrderMinutes;
+
+    /**
+     * 连续按时到场(达标次数/加分)
+     */
+    @TableField("continuous_on_time_arrive")
+    private Integer continuousOnTimeArrive;
+
+    /**
+     * 连续按时到场次数
+     */
+    @TableField("continuous_on_time_arrive_times")
+    private Integer continuousOnTimeArriveTimes;
+
+    /**
+     * 连续准时卸货(达标次数/加分)
+     */
+    @TableField("continuous_on_time_unload")
+    private Integer continuousOnTimeUnload;
+
+    /**
+     * 连续准时卸货次数
+     */
+    @TableField("continuous_on_time_unload_times")
+    private Integer continuousOnTimeUnloadTimes;
+
+    /**
+     * 连续准确填写卸货信息(达标次数/加分)
+     */
+    @TableField("continuous_accurate_unload")
+    private Integer continuousAccurateUnload;
+
+    /**
+     * 连续准确填写卸货信息次数
+     */
+    @TableField("continuous_accurate_unload_times")
+    private Integer continuousAccurateUnloadTimes;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time", fill = FieldFill.INSERT) // 插入时自动填充
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) // 插入/更新时自动填充
+    private Date updateTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    @TableField(value = "create_user", fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 更新人(用户ID,默认-1)
+     */
+    @TableField(value = "update_user", fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+}

+ 69 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverConductRulesLog.java

@@ -0,0 +1,69 @@
+package com.sckw.fleet.model;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 司机行为规则日志表
+ * 表名:kwf_driver_conduct_rules_Log
+ *
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("kwf_driver_conduct_rules_log")
+public class KwfDriverConductRulesLog implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -4512558808118804362L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 业务id
+     */
+    @TableField("biz_id")
+    private Long bizId;
+
+    /**
+     * 状态(0-自动派单,1-司机行为规则)
+     */
+    @TableField("status")
+    private int status;
+
+    /**
+     * 日志内容
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time", fill = FieldFill.INSERT) // 插入时自动填充
+    private Date createTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    @TableField(value = "create_user", fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 更新人(用户ID,默认-1)
+     */
+    @TableField(value = "update_user", fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+}

+ 129 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruckDispatchCoefficient.java

@@ -0,0 +1,129 @@
+package com.sckw.fleet.model;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 自动派车系数表
+ * 表名:kwf_driver_conduct_rules
+ *
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("kwf_truck_dispatch_coefficient")
+public class KwfTruckDispatchCoefficient implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3044887895472142092L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    @TableField("ent_id")
+    private Long entId;
+
+    /**
+     * 车辆工作时长
+     */
+    @TableField("vehicle_work_hours")
+    private Integer vehicleWorkHours;
+
+    /**
+     * 车辆装货时长
+     */
+    @TableField("vehicle_loading_hours")
+    private Integer vehicleLoadingHours;
+
+    /**
+     * 车辆卸货时长
+     */
+    @TableField("vehicle_unloading_hours")
+    private Integer vehicleUnloadingHours;
+
+    /**
+     * 司机超时限制
+     */
+    @TableField("driver_timeout_limit")
+    private Integer driverTimeoutLimit;
+
+    /**
+     * 车辆平均载重
+     */
+    @TableField("vehicle_avg_load")
+    private Integer vehicleAvgLoad;
+
+    /**
+     * 车辆平均速度
+     */
+    @TableField("vehicle_avg_speed")
+    private Integer vehicleAvgSpeed;
+
+    /**
+     * 车辆最大任务数
+     */
+    @TableField("vehicle_max_tasks")
+    private Integer vehicleMaxTasks;
+
+    /**
+     * 司机接单限制
+     */
+    @TableField("driver_order_limit")
+    private Integer driverOrderLimit;
+
+    /**
+     * 场内车辆容量
+     */
+    @TableField("yard_vehicle_capacity")
+    private Integer yardVehicleCapacity;
+
+    /**
+     * 最大占比
+     */
+    @TableField("max_ratio")
+    private Integer maxRatio;
+
+    /**
+     * 缓冲系数
+     */
+    @TableField("buffer_coefficient")
+    private BigDecimal bufferCoefficient;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time", fill = FieldFill.INSERT) // 插入时自动填充
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) // 插入/更新时自动填充
+    private Date updateTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    @TableField(value = "create_user", fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 更新人(用户ID,默认-1)
+     */
+    @TableField(value = "update_user", fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+}

+ 45 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesLogRequest.java

@@ -0,0 +1,45 @@
+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;
+import java.io.Serializable;
+
+/**
+ * @author zk
+ * @desc 司机行为规则日志查询模型
+ * @date 2023/7/12 0012
+ */
+@Data
+public class DriverConductRulesLogRequest extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -205819475634182202L;
+
+    /**
+     * 业务id
+     */
+    @Schema(description = "业务id")
+    @NotNull(message = "业务id不能为空!")
+    private Long bizId;
+
+    /**
+     * 状态(0-自动派单,1-司机行为规则)
+     */
+    @Schema(description = "状态(0-自动派单,1-司机行为规则)")
+    @NotNull(message = "状态不能为空!")
+    private int status;
+
+    /**
+     * 内容
+     */
+    @Schema(description = "内容")
+    private String description;
+
+
+
+
+}

+ 35 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesRequest.java

@@ -0,0 +1,35 @@
+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/12 0012
+ */
+@Data
+public class DriverConductRulesRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -1143520801815863768L;
+
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    @NotNull(message = "企业id不能为空!")
+    private Long entId;
+
+    /**
+     * 是否初始化
+     */
+    @Schema(description = "是否初始化")
+    @NotNull(message = "是否初始化不能为空!")
+    private Boolean isInit = false;
+
+}

+ 113 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesUpdateRequest.java

@@ -0,0 +1,113 @@
+package com.sckw.fleet.model.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author zk
+ * @desc 司机行为规则
+ * @date 2023/7/12 0012
+ */
+@Data
+public class DriverConductRulesUpdateRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2169056896415427633L;
+
+    /**
+     * 主键
+     */
+    @Schema(description = "主键id")
+    private Long id;
+
+    /**
+     * 单趟严重超时(违规次数/扣分)
+     */
+    @Schema(description = "单趟严重超时")
+    private Integer unloadSeriousTimeout;
+
+    /**
+     * 单趟严重超时倍数
+     */
+    @Schema(description = "单趟严重超时倍数")
+    private BigDecimal unloadSeriousTimeoutMultiple;
+
+    /**
+     * 单据错误/缺失(违规次数/扣分)
+     */
+    @Schema(description = "单据错误/缺失")
+    private Integer documentErrorMissing;
+
+    /**
+     * 未按时到场(违规次数/扣分)
+     */
+    @Schema(description = "未按时到场")
+    private Integer notOnTimeArrive;
+
+    /**
+     * 虚假卸货(违规次数/扣分)
+     */
+    @Schema(description = "虚假卸货")
+    private Integer fakeUnload;
+
+    /**
+     * 虚假卸货偏差距离
+     */
+    @Schema(description = "虚假卸货偏差距离")
+    private Integer fakeUnloadDistance;
+
+    /**
+     * 违规取消运单(违规次数/扣分)
+     */
+    @Schema(description = "违规取消运单")
+    private Integer illegalCancelOrder;
+
+    /**
+     * 违规取消运单分钟数
+     */
+    @Schema(description = "违规取消运单分钟数")
+    private Integer illegalCancelOrderMinutes;
+
+    /**
+     * 连续按时到场(达标次数/加分)
+     */
+    @Schema(description = "连续按时到场")
+    private Integer continuousOnTimeArrive;
+
+    /**
+     * 连续按时到场次数
+     */
+    @Schema(description = "连续按时到场次数")
+    private Integer continuousOnTimeArriveTimes;
+
+    /**
+     * 连续准时卸货(达标次数/加分)
+     */
+    @Schema(description = "连续准时卸货")
+    private Integer continuousOnTimeUnload;
+
+    /**
+     * 连续准时卸货次数
+     */
+    @Schema(description = "连续准时卸货次数")
+    private Integer continuousOnTimeUnloadTimes;
+
+    /**
+     * 连续准确填写卸货信息(达标次数/加分)
+     */
+    @Schema(description = "连续准确填写卸货信息")
+    private Integer continuousAccurateUnload;
+
+    /**
+     * 连续准确填写卸货信息次数
+     */
+    @Schema(description = "连续准确填写卸货信息次数")
+    private Integer continuousAccurateUnloadTimes;
+
+
+
+}

+ 95 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckDispatchCoefficientUpdateRequest.java

@@ -0,0 +1,95 @@
+package com.sckw.fleet.model.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author zk
+ * @desc 司机行为规则
+ * @date 2023/7/12 0012
+ */
+@Data
+public class TruckDispatchCoefficientUpdateRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5148978183713446040L;
+
+    /**
+     * 主键
+     */
+    @Schema(description = "主键id")
+    private Long id;
+
+    /**
+     * 车辆工作时长
+     */
+    @Schema(description = "车辆工作时长")
+    private Integer vehicleWorkHours;
+
+    /**
+     * 车辆装货时长
+     */
+    @Schema(description = "车辆装货时长")
+    private Integer vehicleLoadingHours;
+
+    /**
+     * 车辆卸货时长
+     */
+    @Schema(description = "车辆卸货时长")
+    private Integer vehicleUnloadingHours;
+
+    /**
+     * 司机超时限制
+     */
+    @Schema(description = "司机超时限制")
+    private Integer driverTimeoutLimit;
+
+    /**
+     * 车辆平均载重
+     */
+    @Schema(description = "车辆平均载重")
+    private Integer vehicleAvgLoad;
+
+    /**
+     * 车辆平均速度
+     */
+    @Schema(description = "车辆平均速度")
+    private Integer vehicleAvgSpeed;
+
+    /**
+     * 车辆最大任务数
+     */
+    @Schema(description = "车辆最大任务数")
+    private Integer vehicleMaxTasks;
+
+    /**
+     * 司机接单限制
+     */
+    @Schema(description = "司机接单限制")
+    private Integer driverOrderLimit;
+
+    /**
+     * 场内车辆容量
+     */
+    @Schema(description = "场内车辆容量")
+    private Integer yardVehicleCapacity;
+
+    /**
+     * 最大占比
+     */
+    @Schema(description = "最大占比")
+    private Integer maxRatio;
+
+    /**
+     * 缓冲系数
+     */
+    @Schema(description = "缓冲系数")
+    private BigDecimal bufferCoefficient;
+
+
+
+}

+ 81 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverConductRulesLogVO.java

@@ -0,0 +1,81 @@
+package com.sckw.fleet.model.vo;
+
+import com.sckw.fleet.model.KwfDriverConductRulesLog;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 司机行为规则返回模型
+ *
+ * @author Generated
+ * @since 2024
+ */
+@Data
+public class KwfDriverConductRulesLogVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5360767484446805797L;
+
+    /**
+     * 主键
+     */
+    @Schema(description = "主键id")
+    private Long id;
+
+    /**
+     * 业务id
+     */
+    @Schema(description = "业务id")
+
+    private Long bizId;
+
+    /**
+     * 状态(0-自动派单,1-司机行为规则)
+     */
+    @Schema(description = "状态(0-自动派单,1-司机行为规则)")
+    private int status;
+
+    /**
+     * 日志内容
+     */
+    @Schema(description = "主键id")
+    private String description;
+
+    /**
+     * 创建时间
+     */
+    @Schema(description = "主键id")
+    private Date createTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    @Schema(description = "创建人")
+    private Long createUser;
+
+
+    private static KwfDriverConductRulesLogVO getInstance(){
+        return new KwfDriverConductRulesLogVO();
+    }
+
+    public static KwfDriverConductRulesLogVO toVO(KwfDriverConductRulesLog rules){
+        if (rules == null) {
+            return KwfDriverConductRulesLogVO.getInstance();
+        }
+        KwfDriverConductRulesLogVO rulesVO = KwfDriverConductRulesLogVO.getInstance();
+        rulesVO.setId(rules.getId());
+        rulesVO.setBizId(rules.getBizId());
+        rulesVO.setStatus(rules.getStatus());
+        rulesVO.setDescription(rules.getDescription());
+        rulesVO.setCreateTime(rules.getCreateTime());
+        rulesVO.setCreateUser(rules.getCreateUser());
+
+        return rulesVO;
+    }
+
+
+}

+ 177 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverConductRulesVO.java

@@ -0,0 +1,177 @@
+package com.sckw.fleet.model.vo;
+
+import com.sckw.fleet.model.KwfDriverConductRules;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 司机行为规则返回模型
+ *
+ * @author Generated
+ * @since 2024
+ */
+@Data
+public class KwfDriverConductRulesVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5360767484446805797L;
+
+    /**
+     * 主键
+     */
+    @Schema(description = "主键id")
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    private Long entId;
+
+    /**
+     * 单趟严重超时(违规次数/扣分)
+     */
+    @Schema(description = "单趟严重超时")
+    private Integer unloadSeriousTimeout;
+
+    /**
+     * 单趟严重超时倍数
+     */
+    @Schema(description = "单趟严重超时倍数")
+    private BigDecimal unloadSeriousTimeoutMultiple;
+
+    /**
+     * 单据错误/缺失(违规次数/扣分)
+     */
+    @Schema(description = "单据错误/缺失")
+    private Integer documentErrorMissing;
+
+    /**
+     * 未按时到场(违规次数/扣分)
+     */
+    @Schema(description = "未按时到场")
+    private Integer notOnTimeArrive;
+
+    /**
+     * 虚假卸货(违规次数/扣分)
+     */
+    @Schema(description = "虚假卸货")
+    private Integer fakeUnload;
+
+    /**
+     * 虚假卸货偏差距离
+     */
+    @Schema(description = "虚假卸货偏差距离")
+    private Integer fakeUnloadDistance;
+
+    /**
+     * 违规取消运单(违规次数/扣分)
+     */
+    @Schema(description = "违规取消运单")
+    private Integer illegalCancelOrder;
+
+    /**
+     * 违规取消运单分钟数
+     */
+    @Schema(description = "违规取消运单分钟数")
+    private Integer illegalCancelOrderMinutes;
+
+    /**
+     * 连续按时到场(达标次数/加分)
+     */
+    @Schema(description = "连续按时到场")
+    private Integer continuousOnTimeArrive;
+
+    /**
+     * 连续按时到场次数
+     */
+    @Schema(description = "连续按时到场次数")
+    private Integer continuousOnTimeArriveTimes;
+
+    /**
+     * 连续准时卸货(达标次数/加分)
+     */
+    @Schema(description = "连续准时卸货")
+    private Integer continuousOnTimeUnload;
+
+    /**
+     * 连续准时卸货次数
+     */
+    @Schema(description = "连续准时卸货次数")
+    private Integer continuousOnTimeUnloadTimes;
+
+    /**
+     * 连续准确填写卸货信息(达标次数/加分)
+     */
+    @Schema(description = "连续准确填写卸货信息")
+    private Integer continuousAccurateUnload;
+
+    /**
+     * 连续准确填写卸货信息次数
+     */
+    @Schema(description = "连续准确填写卸货信息次数")
+    private Integer continuousAccurateUnloadTimes;
+
+    /**
+     * 创建时间
+     */
+    @Schema(description = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @Schema(description = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    @Schema(description = "创建人")
+    private Long createUser;
+
+    /**
+     * 更新人(用户ID,默认-1)
+     */
+    @Schema(description = "更新人")
+    private Long updateUser;
+
+    private static KwfDriverConductRulesVO getInstance(){
+        return new KwfDriverConductRulesVO();
+    }
+
+    public static KwfDriverConductRulesVO toVO(KwfDriverConductRules rules){
+        if (rules == null) {
+            return KwfDriverConductRulesVO.getInstance();
+        }
+        KwfDriverConductRulesVO rulesVO = KwfDriverConductRulesVO.getInstance();
+        rulesVO.setId(rules.getId());
+        rulesVO.setEntId(rules.getEntId());
+        rulesVO.setUnloadSeriousTimeout(rules.getUnloadSeriousTimeout());
+        rulesVO.setUnloadSeriousTimeoutMultiple(rules.getUnloadSeriousTimeoutMultiple());
+        rulesVO.setDocumentErrorMissing(rules.getDocumentErrorMissing());
+        rulesVO.setNotOnTimeArrive(rules.getNotOnTimeArrive());
+        rulesVO.setFakeUnload(rules.getFakeUnload());
+        rulesVO.setFakeUnloadDistance(rules.getFakeUnloadDistance());
+        rulesVO.setIllegalCancelOrder(rules.getIllegalCancelOrder());
+        rulesVO.setIllegalCancelOrderMinutes(rules.getIllegalCancelOrderMinutes());
+        rulesVO.setContinuousOnTimeArrive(rules.getContinuousOnTimeArrive());
+        rulesVO.setContinuousOnTimeArriveTimes(rules.getContinuousOnTimeArriveTimes());
+        rulesVO.setContinuousOnTimeUnload(rules.getContinuousOnTimeUnload());
+        rulesVO.setContinuousOnTimeUnloadTimes(rules.getContinuousOnTimeUnloadTimes());
+        rulesVO.setContinuousAccurateUnload(rules.getContinuousAccurateUnload());
+        rulesVO.setContinuousAccurateUnloadTimes(rules.getContinuousAccurateUnloadTimes());
+        rulesVO.setCreateTime(rules.getCreateTime());
+        rulesVO.setUpdateTime(rules.getUpdateTime());
+        rulesVO.setCreateUser(rules.getCreateUser());
+        rulesVO.setUpdateUser(rules.getUpdateUser());
+
+        return rulesVO;
+    }
+
+}

+ 157 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfTruckDispatchCoefficientVO.java

@@ -0,0 +1,157 @@
+package com.sckw.fleet.model.vo;
+
+import com.sckw.fleet.model.KwfTruckDispatchCoefficient;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 司机行为规则返回模型
+ *
+ * @author Generated
+ * @since 2024
+ */
+@Data
+public class KwfTruckDispatchCoefficientVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5360767484446805797L;
+
+    /**
+     * 主键
+     */
+    @Schema(description = "主键id")
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    private Long entId;
+
+    /**
+     * 车辆工作时长
+     */
+    @Schema(description = "车辆工作时长")
+    private Integer vehicleWorkHours;
+
+    /**
+     * 车辆装货时长
+     */
+    @Schema(description = "车辆装货时长")
+    private Integer vehicleLoadingHours;
+
+    /**
+     * 车辆卸货时长
+     */
+    @Schema(description = "车辆卸货时长")
+    private Integer vehicleUnloadingHours;
+
+    /**
+     * 司机超时限制
+     */
+    @Schema(description = "司机超时限制")
+    private Integer driverTimeoutLimit;
+
+    /**
+     * 车辆平均载重
+     */
+    @Schema(description = "车辆平均载重")
+    private Integer vehicleAvgLoad;
+
+    /**
+     * 车辆平均速度
+     */
+    @Schema(description = "车辆平均速度")
+    private Integer vehicleAvgSpeed;
+
+    /**
+     * 车辆最大任务数
+     */
+    @Schema(description = "车辆最大任务数")
+    private Integer vehicleMaxTasks;
+
+    /**
+     * 司机接单限制
+     */
+    @Schema(description = "司机接单限制")
+    private Integer driverOrderLimit;
+
+    /**
+     * 场内车辆容量
+     */
+    @Schema(description = "场内车辆容量")
+    private Integer yardVehicleCapacity;
+
+    /**
+     * 最大占比
+     */
+    @Schema(description = "最大占比")
+    private Integer maxRatio;
+
+    /**
+     * 缓冲系数
+     */
+    @Schema(description = "缓冲系数")
+    private BigDecimal bufferCoefficient;
+
+    /**
+     * 创建时间
+     */
+    @Schema(description = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @Schema(description = "更新时间")
+    private Date updateTime;
+
+    /**
+     * 创建人(用户ID,默认-1)
+     */
+    @Schema(description = "创建人")
+    private Long createUser;
+
+    /**
+     * 更新人(用户ID,默认-1)
+     */
+    @Schema(description = "更新人")
+    private Long updateUser;
+
+    private static KwfTruckDispatchCoefficientVO getInstance(){
+        return new KwfTruckDispatchCoefficientVO();
+    }
+
+    public static KwfTruckDispatchCoefficientVO toVO(KwfTruckDispatchCoefficient result){
+        if (result == null) {
+            return KwfTruckDispatchCoefficientVO.getInstance();
+        }
+        KwfTruckDispatchCoefficientVO rulesVO = KwfTruckDispatchCoefficientVO.getInstance();
+        rulesVO.setId(result.getId());
+        rulesVO.setEntId(result.getEntId());
+        rulesVO.setVehicleWorkHours(result.getVehicleWorkHours());
+        rulesVO.setVehicleLoadingHours(result.getVehicleLoadingHours());
+        rulesVO.setVehicleUnloadingHours(result.getVehicleUnloadingHours());
+        rulesVO.setDriverTimeoutLimit(result.getDriverTimeoutLimit());
+        rulesVO.setVehicleAvgLoad(result.getVehicleAvgLoad());
+        rulesVO.setVehicleAvgSpeed(result.getVehicleAvgSpeed());
+        rulesVO.setVehicleMaxTasks(result.getVehicleMaxTasks());
+        rulesVO.setDriverOrderLimit(result.getDriverOrderLimit());
+        rulesVO.setYardVehicleCapacity(result.getYardVehicleCapacity());
+        rulesVO.setMaxRatio(result.getMaxRatio());
+        rulesVO.setBufferCoefficient(result.getBufferCoefficient());
+        rulesVO.setCreateTime(result.getCreateTime());
+        rulesVO.setUpdateTime(result.getUpdateTime());
+        rulesVO.setCreateUser(result.getCreateUser());
+        rulesVO.setUpdateUser(result.getUpdateUser());
+
+        return rulesVO;
+    }
+
+
+}

+ 16 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverConductRulesLogRepository.java

@@ -0,0 +1,16 @@
+package com.sckw.fleet.repository;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.fleet.dao.KwfDriverConductRulesLogMapper;
+import com.sckw.fleet.model.KwfDriverConductRulesLog;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @desc 司机行为规则日志 Repository接口
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Repository
+public class KwfDriverConductRulesLogRepository extends ServiceImpl<KwfDriverConductRulesLogMapper, KwfDriverConductRulesLog> {
+
+}

+ 24 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverConductRulesRepository.java

@@ -0,0 +1,24 @@
+package com.sckw.fleet.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.fleet.dao.KwfDriverConductRulesMapper;
+import com.sckw.fleet.model.KwfDriverConductRules;
+import org.springframework.stereotype.Repository;
+
+import java.util.Objects;
+
+/**
+ * @desc 司机行为规则 Repository接口
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Repository
+public class KwfDriverConductRulesRepository extends ServiceImpl<KwfDriverConductRulesMapper, KwfDriverConductRules> {
+
+    public KwfDriverConductRules findDriverConductRulesByEntId(Long entId) {
+        return getOne(Wrappers.<KwfDriverConductRules>lambdaQuery()
+                .eq(Objects.nonNull(entId), KwfDriverConductRules::getEntId, entId));
+    }
+
+}

+ 24 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckDispatchCoefficientRepository.java

@@ -0,0 +1,24 @@
+package com.sckw.fleet.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.fleet.dao.KwfTruckDispatchCoefficientMapper;
+import com.sckw.fleet.model.KwfTruckDispatchCoefficient;
+import org.springframework.stereotype.Repository;
+
+import java.util.Objects;
+
+/**
+ * @desc 司机行为规则 Repository接口
+ * @author donglang
+ * @date 2025-12-04
+ */
+@Repository
+public class KwfTruckDispatchCoefficientRepository extends ServiceImpl<KwfTruckDispatchCoefficientMapper, KwfTruckDispatchCoefficient> {
+
+    public KwfTruckDispatchCoefficient findAutoTruckDispatchByEntId(Long entId) {
+        return getOne(Wrappers.<KwfTruckDispatchCoefficient>lambdaQuery()
+                .eq(Objects.nonNull(entId), KwfTruckDispatchCoefficient::getEntId, entId));
+    }
+
+}

+ 398 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfAutoDispatchService.java

@@ -0,0 +1,398 @@
+package com.sckw.fleet.service;
+
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
+import com.sckw.core.exception.BusinessPlatfromException;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.result.PageDataResult;
+import com.sckw.fleet.model.KwfDriverConductRules;
+import com.sckw.fleet.model.KwfDriverConductRulesLog;
+import com.sckw.fleet.model.KwfTruckDispatchCoefficient;
+import com.sckw.fleet.model.request.DriverConductRulesLogRequest;
+import com.sckw.fleet.model.request.DriverConductRulesRequest;
+import com.sckw.fleet.model.request.DriverConductRulesUpdateRequest;
+import com.sckw.fleet.model.request.TruckDispatchCoefficientUpdateRequest;
+import com.sckw.fleet.model.vo.KwfDriverConductRulesLogVO;
+import com.sckw.fleet.model.vo.KwfDriverConductRulesVO;
+import com.sckw.fleet.model.vo.KwfTruckDispatchCoefficientVO;
+import com.sckw.fleet.repository.KwfDriverConductRulesLogRepository;
+import com.sckw.fleet.repository.KwfDriverConductRulesRepository;
+import com.sckw.fleet.repository.KwfTruckDispatchCoefficientRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+*Author: donglang
+*Time: 2025-12-04
+*Des: 司机行为规则
+*Version: 1.0
+*/
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class KwfAutoDispatchService {
+
+    private final KwfDriverConductRulesRepository driverConductRulesRepository;
+
+    private final KwfDriverConductRulesLogRepository driverConductRulesLogRepository;
+
+    private final KwfTruckDispatchCoefficientRepository truckDispatchCoefficientRepository;
+
+
+    /**
+     * 查询自动派车系数
+     * @param request
+     * @return
+     */
+    public KwfTruckDispatchCoefficientVO queryAutoTruckDispatch(DriverConductRulesRequest request) {
+        log.info("查询自动派车系数:{}", JSON.toJSONString(request));
+        Long entId = LoginUserHolder.getEntId();
+        if (entId == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "当前登录用户未关联企业ID,无法查询规则");
+        }
+        KwfTruckDispatchCoefficient dispatchCoefficient = truckDispatchCoefficientRepository.getOne(Wrappers.<KwfTruckDispatchCoefficient>lambdaQuery()
+                .eq(KwfTruckDispatchCoefficient::getEntId, LoginUserHolder.getEntId()));
+        //无数据则初始化
+        if (dispatchCoefficient == null && request.getIsInit()) {
+            log.info("当前企业[{}]无自动派车系数数据,执行初始化", entId);
+            dispatchCoefficient = initAutoDispatchCoefficient(entId);
+        }
+        KwfTruckDispatchCoefficientVO driverConductRulesVO = KwfTruckDispatchCoefficientVO.toVO(dispatchCoefficient);
+        log.info("查询自动派车系数完成,企业ID:{},规则数据:{}", entId, JSON.toJSONString(driverConductRulesVO));
+        return driverConductRulesVO;
+    }
+
+    /**
+     * 初始化自动派车系数
+     */
+    private KwfTruckDispatchCoefficient initAutoDispatchCoefficient(Long entId) {
+        KwfTruckDispatchCoefficient dispatchCoefficient = new KwfTruckDispatchCoefficient();
+        dispatchCoefficient.setEntId(entId);
+        dispatchCoefficient.setVehicleWorkHours(10);
+        dispatchCoefficient.setVehicleLoadingHours(1);
+        dispatchCoefficient.setVehicleUnloadingHours(1);
+        dispatchCoefficient.setDriverTimeoutLimit(2);
+        dispatchCoefficient.setVehicleAvgLoad(26);
+        dispatchCoefficient.setVehicleAvgSpeed(50);
+        dispatchCoefficient.setVehicleMaxTasks(3);
+        dispatchCoefficient.setDriverOrderLimit(10);
+        dispatchCoefficient.setYardVehicleCapacity(70);
+        dispatchCoefficient.setMaxRatio(50);
+        dispatchCoefficient.setBufferCoefficient(new BigDecimal("1.20"));
+        dispatchCoefficient.setCreateUser(LoginUserHolder.getUserId());
+        dispatchCoefficient.setUpdateUser(LoginUserHolder.getUserId());
+
+        boolean saveResult = truckDispatchCoefficientRepository.save(dispatchCoefficient);
+        if (!saveResult) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "新增自动派车系数失败");
+        }
+        log.info("企业[{}]自动派车系数初始化保存成功,规则ID:{}", entId, dispatchCoefficient.getId());
+        return dispatchCoefficient;
+    }
+
+
+    /**
+     * 修改自动派车系数
+     * @param request
+     * @return
+     */
+    public void updateAutoDispatch(TruckDispatchCoefficientUpdateRequest request) {
+        log.info("更新自动派车系数:{}", JSON.toJSONString(request));
+        KwfTruckDispatchCoefficient oldDispatchCoefficient = truckDispatchCoefficientRepository.getById(request.getId());
+        if (oldDispatchCoefficient == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "查询自动派车系数数据不存在!");
+        }
+
+        KwfTruckDispatchCoefficient newDispatchCoefficient = new KwfTruckDispatchCoefficient();
+        BeanUtils.copyProperties(oldDispatchCoefficient, newDispatchCoefficient);
+
+        oldDispatchCoefficient.setVehicleWorkHours(request.getVehicleWorkHours());
+        oldDispatchCoefficient.setVehicleLoadingHours(request.getVehicleLoadingHours());
+        oldDispatchCoefficient.setVehicleUnloadingHours(request.getVehicleUnloadingHours());
+        oldDispatchCoefficient.setDriverTimeoutLimit(request.getDriverTimeoutLimit());
+        oldDispatchCoefficient.setVehicleAvgLoad(request.getVehicleAvgLoad());
+        oldDispatchCoefficient.setVehicleAvgSpeed(request.getVehicleAvgSpeed());
+        oldDispatchCoefficient.setVehicleMaxTasks(request.getVehicleMaxTasks());
+        oldDispatchCoefficient.setDriverOrderLimit(request.getDriverOrderLimit());
+        oldDispatchCoefficient.setYardVehicleCapacity(request.getYardVehicleCapacity());
+        oldDispatchCoefficient.setMaxRatio(request.getMaxRatio());
+        oldDispatchCoefficient.setBufferCoefficient(request.getBufferCoefficient());
+        oldDispatchCoefficient.setUpdateUser(LoginUserHolder.getUserId());
+
+        boolean updateResult = truckDispatchCoefficientRepository.updateById(newDispatchCoefficient);
+        if (!updateResult) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_UPDATE_FAIL, "更新自动派车系数失败");
+        }
+        // 生成差异化修改文案
+        String modifyDesc = getAutoDispatchModifyDesc(oldDispatchCoefficient, request);
+        if (StringUtils.isEmpty(modifyDesc)) {
+            return;
+        }
+
+        //生成规则更新日志
+        KwfDriverConductRulesLog rulesLog = new KwfDriverConductRulesLog();
+        rulesLog.setBizId(request.getId());
+        rulesLog.setDescription(modifyDesc);
+        rulesLog.setStatus(0);
+        rulesLog.setCreateUser(LoginUserHolder.getUserId());
+        rulesLog.setUpdateUser(LoginUserHolder.getUserId());
+
+        boolean saveResult = driverConductRulesLogRepository.save(rulesLog);
+        if (!saveResult) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "新增自动派车系数日志失败");
+        }
+        log.info("更新自动派车系数成功!修改内容:{}", modifyDesc);
+    }
+
+
+
+
+    /**
+     * 生成司机行为规则修改的差异化文案
+     * @param oldDispatch 旧派车系数
+     * @param request 新的更新入参
+     * @return 差异化修改文案
+     */
+    private String getAutoDispatchModifyDesc(KwfTruckDispatchCoefficient oldDispatch, TruckDispatchCoefficientUpdateRequest request) {
+        if (oldDispatch == null || request == null) {
+            return "";
+        }
+        List<String> changeItems = new ArrayList<>();
+        // 对比所有字段
+        compareAndAddItem(changeItems, "车辆工作时长", oldDispatch.getVehicleWorkHours(), request.getVehicleWorkHours());
+        compareAndAddItem(changeItems, "车辆装货时长", oldDispatch.getVehicleLoadingHours(), request.getVehicleLoadingHours());
+        compareAndAddItem(changeItems, "车辆卸货时长", oldDispatch.getVehicleUnloadingHours(), request.getVehicleUnloadingHours());
+        compareAndAddItem(changeItems, "司机超时限制", oldDispatch.getDriverTimeoutLimit(), request.getDriverTimeoutLimit());
+        compareAndAddItem(changeItems, "车辆平均载重", oldDispatch.getVehicleAvgLoad(), request.getVehicleAvgLoad());
+        compareAndAddItem(changeItems, "车辆平均速度", oldDispatch.getVehicleAvgSpeed(), request.getVehicleAvgSpeed());
+        compareAndAddItem(changeItems, "车辆最大任务数", oldDispatch.getVehicleMaxTasks(), request.getVehicleMaxTasks());
+        compareAndAddItem(changeItems, "司机接单限制", oldDispatch.getDriverOrderLimit(), request.getDriverOrderLimit());
+        compareAndAddItem(changeItems, "场内车辆容量", oldDispatch.getYardVehicleCapacity(), request.getYardVehicleCapacity());
+        compareAndAddItem(changeItems, "最大占比", oldDispatch.getMaxRatio(), request.getMaxRatio());
+        compareAndAddItem(changeItems, "缓冲系数", oldDispatch.getBufferCoefficient(), request.getBufferCoefficient());
+
+        if (changeItems.isEmpty()) {
+            return "";
+        }
+        // 修改项拼接
+        return StringUtils.join(changeItems, ",");
+    }
+
+
+    /**
+     * 对比单个字段值,有变化则添加到文案列表
+     * @param items 文案列表
+     * @param fieldName 字段业务名称
+     * @param oldValue 旧值
+     * @param newValue 新值
+     */
+    private void compareAndAddItem(List<String> items, String fieldName, BigDecimal oldValue, BigDecimal newValue) {
+        // 仅当值不同时添加文案
+        if (Objects.equals(oldValue, newValue)) {
+            items.add(String.format("%s由【%s】设置为【%s】", fieldName, oldValue, newValue));
+        }
+    }
+
+
+    /**
+     * 查询司机行为规则
+     * @param request
+     * @return
+     */
+    public KwfDriverConductRulesVO queryDriverConductRules(DriverConductRulesRequest request) {
+        log.info("查询司机行为规则:{}", JSON.toJSONString(request));
+        Long entId = LoginUserHolder.getEntId();
+        if (entId == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "当前登录用户未关联企业ID,无法查询规则");
+        }
+        KwfDriverConductRules driverConductRules = driverConductRulesRepository.getOne(Wrappers.<KwfDriverConductRules>lambdaQuery()
+                .eq(KwfDriverConductRules::getEntId, LoginUserHolder.getEntId()));
+        //无数据则初始化
+        if (driverConductRules == null && request.getIsInit()) {
+            log.info("当前企业[{}]无司机行为规则数据,执行初始化", entId);
+            driverConductRules = initDriverConductRules(entId);
+        }
+        KwfDriverConductRulesVO resultVO = KwfDriverConductRulesVO.toVO(driverConductRules);
+        log.info("查询司机行为规则完成,企业ID:{},规则数据:{}", entId, JSON.toJSONString(resultVO));
+        return resultVO;
+    }
+
+    /**
+     * 初始化司机行为规则
+     */
+    private KwfDriverConductRules initDriverConductRules(Long entId) {
+        KwfDriverConductRules rules = new KwfDriverConductRules();
+        rules.setEntId(entId);
+        rules.setUnloadSeriousTimeout(5);
+        rules.setUnloadSeriousTimeoutMultiple(new BigDecimal("2.00"));
+        rules.setDocumentErrorMissing(2);
+        rules.setNotOnTimeArrive(2);
+        rules.setFakeUnload(5);
+        rules.setFakeUnloadDistance(5);
+        rules.setIllegalCancelOrder(1);
+        rules.setIllegalCancelOrderMinutes(60);
+        rules.setContinuousOnTimeArrive(5);
+        rules.setContinuousOnTimeArriveTimes(10);
+        rules.setContinuousOnTimeUnload(5);
+        rules.setContinuousOnTimeUnloadTimes(10);
+        rules.setContinuousAccurateUnload(5);
+        rules.setContinuousAccurateUnloadTimes(10);
+        rules.setCreateUser(LoginUserHolder.getUserId());
+        rules.setUpdateUser(LoginUserHolder.getUserId());
+
+        boolean saveResult = driverConductRulesRepository.save(rules);
+        if (!saveResult) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "新增司机行为规则失败");
+        }
+        log.info("企业[{}]司机行为规则初始化保存成功,规则ID:{}", entId, rules.getId());
+        return rules;
+    }
+
+    /**
+     * 更新司机行为规则
+     * @param request
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateDriverConduct(DriverConductRulesUpdateRequest request) {
+        log.info("更新司机行为规则:{}", JSON.toJSONString(request));
+
+        KwfDriverConductRules oldDriverConductRules = driverConductRulesRepository.getById(request.getId());
+        if (oldDriverConductRules == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "查询司机行为规则数据不存在!");
+        }
+
+        KwfDriverConductRules newDriverConductRules = new KwfDriverConductRules();
+        BeanUtils.copyProperties(oldDriverConductRules, newDriverConductRules);
+
+        newDriverConductRules.setUnloadSeriousTimeout(request.getUnloadSeriousTimeout());
+        newDriverConductRules.setUnloadSeriousTimeoutMultiple(request.getUnloadSeriousTimeoutMultiple());
+        newDriverConductRules.setDocumentErrorMissing(request.getDocumentErrorMissing());
+        newDriverConductRules.setNotOnTimeArrive(request.getNotOnTimeArrive());
+        newDriverConductRules.setFakeUnload(request.getFakeUnload());
+        newDriverConductRules.setFakeUnloadDistance(request.getFakeUnloadDistance());
+        newDriverConductRules.setIllegalCancelOrder(request.getIllegalCancelOrder());
+        newDriverConductRules.setIllegalCancelOrderMinutes(request.getIllegalCancelOrderMinutes());
+        newDriverConductRules.setContinuousOnTimeArrive(request.getContinuousOnTimeArrive());
+        newDriverConductRules.setContinuousOnTimeArriveTimes(request.getContinuousOnTimeArriveTimes());
+        newDriverConductRules.setContinuousOnTimeUnload(request.getContinuousOnTimeUnload());
+        newDriverConductRules.setContinuousOnTimeUnloadTimes(request.getContinuousOnTimeUnloadTimes());
+        newDriverConductRules.setContinuousAccurateUnload(request.getContinuousAccurateUnload());
+        newDriverConductRules.setContinuousAccurateUnloadTimes(request.getContinuousAccurateUnloadTimes());
+        newDriverConductRules.setUpdateUser(LoginUserHolder.getUserId());
+
+        boolean updateResult = driverConductRulesRepository.updateById(newDriverConductRules);
+        if (!updateResult) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_UPDATE_FAIL, "更新司机行为规则失败");
+        }
+        // 生成差异化修改文案
+        String modifyDesc = getDriverModifyDesc(oldDriverConductRules, request);
+        if (StringUtils.isEmpty(modifyDesc)) {
+            return;
+        }
+
+        //生成规则更新日志
+        KwfDriverConductRulesLog rulesLog = new KwfDriverConductRulesLog();
+        rulesLog.setBizId(request.getId());
+        rulesLog.setDescription(modifyDesc);
+        rulesLog.setStatus(1);
+        rulesLog.setCreateUser(LoginUserHolder.getUserId());
+        rulesLog.setUpdateUser(LoginUserHolder.getUserId());
+
+        boolean saveResult = driverConductRulesLogRepository.save(rulesLog);
+        if (!saveResult) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "新增司机行为规则日志失败");
+        }
+        log.info("更新司机行为规则成功!修改内容:{}", modifyDesc);
+    }
+
+    /**
+     * 生成司机行为规则修改的差异化文案
+     * @param oldRule 旧规则数据
+     * @param request 新的更新入参
+     * @return 差异化修改文案
+     */
+    private String getDriverModifyDesc(KwfDriverConductRules oldRule, DriverConductRulesUpdateRequest request) {
+        if (oldRule == null || request == null) {
+            return "";
+        }
+        List<String> changeItems = new ArrayList<>();
+        // 对比所有字段
+        compareAndAddItem(changeItems, "单趟严重超时", oldRule.getUnloadSeriousTimeout(), request.getUnloadSeriousTimeout());
+        compareAndAddItem(changeItems, "单趟严重超时倍数", oldRule.getUnloadSeriousTimeoutMultiple(), request.getUnloadSeriousTimeoutMultiple());
+        compareAndAddItem(changeItems, "单据错误/缺失", oldRule.getDocumentErrorMissing(), request.getDocumentErrorMissing());
+        compareAndAddItem(changeItems, "未按时到场", oldRule.getNotOnTimeArrive(), request.getNotOnTimeArrive());
+        compareAndAddItem(changeItems, "虚假卸货", oldRule.getFakeUnload(), request.getFakeUnload());
+        compareAndAddItem(changeItems, "虚假卸货偏差距离", oldRule.getFakeUnloadDistance(), request.getFakeUnloadDistance());
+        compareAndAddItem(changeItems, "违规取消运单", oldRule.getIllegalCancelOrder(), request.getIllegalCancelOrder());
+        compareAndAddItem(changeItems, "违规取消运单分钟数", oldRule.getIllegalCancelOrderMinutes(), request.getIllegalCancelOrderMinutes());
+        compareAndAddItem(changeItems, "连续按时到场", oldRule.getContinuousOnTimeArrive(), request.getContinuousOnTimeArrive());
+        compareAndAddItem(changeItems, "连续按时到场次数", oldRule.getContinuousOnTimeArriveTimes(), request.getContinuousOnTimeArriveTimes());
+        compareAndAddItem(changeItems, "连续准时卸货", oldRule.getContinuousOnTimeUnload(), request.getContinuousOnTimeUnload());
+        compareAndAddItem(changeItems, "连续准时卸货次数", oldRule.getContinuousOnTimeUnloadTimes(), request.getContinuousOnTimeUnloadTimes());
+        compareAndAddItem(changeItems, "连续准确填写卸货信息", oldRule.getContinuousAccurateUnload(), request.getContinuousAccurateUnload());
+        compareAndAddItem(changeItems, "连续准确填写卸货信息次数", oldRule.getContinuousAccurateUnloadTimes(), request.getContinuousAccurateUnloadTimes());
+
+        if (changeItems.isEmpty()) {
+            return "";
+        }
+        // 修改项拼接
+        return StringUtils.join(changeItems, ",");
+    }
+
+    /**
+     * 对比单个字段值,有变化则添加到文案列表
+     * @param items 文案列表
+     * @param fieldName 字段业务名称
+     * @param oldValue 旧值
+     * @param newValue 新值
+     */
+    private void compareAndAddItem(List<String> items, String fieldName, Integer oldValue, Integer newValue) {
+        // 仅当值不同时添加文案  //TODO  donglang BigDecimal
+        if (Objects.equals(oldValue, newValue)) {
+            items.add(String.format("%s由【%s】设置为【%s】", fieldName, oldValue, newValue));
+        }
+    }
+
+
+    /**
+     * 查询司机行为规则
+     * @param request
+     * @return
+     */
+    public PageDataResult<KwfDriverConductRulesLogVO> queryDriverRulesLogPage(DriverConductRulesLogRequest request) {
+        log.info("查询司机行为规则日志:{}", JSON.toJSONString(request));
+        LambdaQueryWrapper<KwfDriverConductRulesLog> queryWrapper = Wrappers.<KwfDriverConductRulesLog>lambdaQuery()
+                .eq(KwfDriverConductRulesLog::getBizId, request.getBizId())
+                .eq(KwfDriverConductRulesLog::getStatus, request.getStatus())
+                .like(StringUtils.isNotBlank(request.getDescription()), KwfDriverConductRulesLog::getDescription, request.getDescription())
+                .orderByDesc(KwfDriverConductRulesLog::getCreateTime);
+        //查询司机行为规则日志
+        Page<KwfDriverConductRulesLog> driverConductRulesLog = driverConductRulesLogRepository.page(
+                new Page<>(request.getPageNum(), request.getPageSize()), queryWrapper);
+        List<KwfDriverConductRulesLog> records = driverConductRulesLog.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前无司机行为规则日志数据,bizId:{}", request.getBizId());
+            return PageDataResult.empty(request.getPageNum(), request.getPageSize());
+        }
+        List<KwfDriverConductRulesLogVO> rulesLogVOS = records.stream().map(KwfDriverConductRulesLogVO::toVO).collect(Collectors.toList());
+        log.info("查询司机行为规则日志成功!");
+        return PageDataResult.success(request.getPageNum(), request.getPageSize(), (long) rulesLogVOS.size(), rulesLogVOS);
+    }
+
+}

+ 2 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -366,7 +366,8 @@ public class KwfTruckService {
         KwfTruckReport truckReport = kwfTruckReportRepository.getOne(Wrappers.<KwfTruckReport>lambdaQuery()
                 .eq(BaseModel::getDelFlag, 0)
                 .eq(KwfTruckReport::getTruckId, truckId)
-                .eq(KwfTruckReport::getEntId, entId));
+                .eq(KwfTruckReport::getEntId, entId)
+                .last("limit 1"));
         if (truckReport == null) {
             return new KwfDriver();
         }

+ 14 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/request/KwpBizWalletQueryRequest.java

@@ -15,16 +15,30 @@ import lombok.Data;
 @Data
 public class KwpBizWalletQueryRequest extends PageRequest {
 
+    /**
+     * 供应商企业id
+     */
+    @Schema(description = "供应商企业id")
+    private Long supEntId;
+
     /**
      * 供应商企业名称
      */
     @Schema(description = "供应商企业名称")
     private String supEntName;
 
+    /**
+     * 采购商企业id
+     */
+    @Schema(description = "采购商企业id")
+    private Long proEntId;
+
     /**
      * 采购商企业名称
      */
     @Schema(description = "采购商企业名称")
     private String proEntName;
 
+
+
 }

+ 33 - 16
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/wallet/KwpBizWalletService.java

@@ -26,7 +26,6 @@ import com.sckw.payment.request.KwpBizWalletPrepayRequest;
 import com.sckw.payment.request.KwpBizWalletQueryRequest;
 import com.sckw.payment.request.KwpBizWalletSaveRequest;
 import com.sckw.system.api.RemoteSystemService;
-import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.EntTypeResDto;
 import com.sckw.system.api.model.dto.res.KwsEntDeptDto;
 import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
@@ -232,22 +231,8 @@ public class KwpBizWalletService {
             return walletList;
         }
         return walletList.stream()
-                // 过滤供应商企业名称
-                .filter(wallet -> {
-                    if (org.springframework.util.StringUtils.hasText(request.getSupEntName())) {
-                        return wallet.getEntName() != null && wallet.getEntName().toLowerCase().contains(request.getSupEntName().toLowerCase());
-                    }
-                    return true;
-                })
-                // 过滤采购商企业名称
                 .map(wallet -> {
-                    List<KwpBizWalletVO> filteredVOs = wallet.getWalletVOList().stream()
-                            .filter(vo -> {
-                                if (org.springframework.util.StringUtils.hasText(request.getProEntName())) {
-                                    return vo.getProEntName() != null && vo.getProEntName().toLowerCase().contains(request.getProEntName().toLowerCase());
-                                }
-                                return true;
-                            }).collect(Collectors.toList());
+                    List<KwpBizWalletVO> filteredVOs = matchesAllConditions(request, wallet);
                     wallet.setWalletVOList(filteredVOs);
                     return wallet;
                 })
@@ -257,6 +242,38 @@ public class KwpBizWalletService {
     }
 
 
+    /**
+     * 过滤条件
+     * @param request
+     * @param wallet
+     * @return
+     */
+    private static List<KwpBizWalletVO> matchesAllConditions(KwpBizWalletQueryRequest request, KwpBizWalletPageResponse wallet) {
+        List<KwpBizWalletVO> filteredVOs = wallet.getWalletVOList().stream().filter(vo -> {
+            boolean matches = true;
+            // 过滤供应商企业ID
+            if (matches && request.getSupEntId() != null) {
+                matches = vo.getSupEntId() != null && vo.getSupEntId().equals(request.getSupEntId());
+            }
+            // 过滤供应商企业名称
+            if (matches && org.springframework.util.StringUtils.hasText(request.getSupEntName())) {
+                matches = vo.getSupEntName() != null && vo.getSupEntName().toLowerCase().contains(request.getSupEntName().toLowerCase());
+            }
+
+            // 过滤采购商企业ID
+            if (matches && request.getProEntId() != null) {
+                matches = vo.getProEntId() != null && vo.getProEntId().equals(request.getProEntId());
+            }
+            // 过滤采购商企业名称
+            if (matches && org.springframework.util.StringUtils.hasText(request.getProEntName())) {
+                matches = vo.getProEntName() != null && vo.getProEntName().toLowerCase().contains(request.getProEntName().toLowerCase());
+            }
+            return matches;
+        }).collect(Collectors.toList());
+        return filteredVOs;
+    }
+
+
     /**
      * 查询企业名称
      */

+ 1 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/controller/KwpGoodsController.java

@@ -153,7 +153,7 @@ public class KwpGoodsController {
      * @return: com.sckw.core.web.response.HttpResult
      */
     @GetMapping("/batchPutOnShelves")
-    public HttpResult batchPutOnShelves(@RequestParam Long id) {
+    public HttpResult batchPutOnShelves(@RequestParam List<Long> id) {
         kwpGoodsService.batchPutOnShelves(id);
         return HttpResult.ok("上架成功");
     }

+ 38 - 25
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -841,38 +841,51 @@ public class KwpGoodsService {
      * @return: void
      */
     @Transactional(rollbackFor = Exception.class)
-    public void batchPutOnShelves(Long id) {
+    public void batchPutOnShelves(List<Long> ids) {
         LambdaQueryWrapper<KwpGoods> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(KwpGoods::getId, id).eq(KwpGoods::getEntId, LoginUserHolder.getEntId()).eq(KwpGoods::getDelFlag, Global.NO).last("LIMIT 1");
-        KwpGoods goods = kwpGoodsMapper.selectOne(wrapper);
-        if (Objects.isNull(goods)) {
+        wrapper.in(KwpGoods::getId, ids)
+                .eq(KwpGoods::getEntId, LoginUserHolder.getEntId())
+                .eq(KwpGoods::getDelFlag, Global.NO);
+        List<KwpGoods> goodsList = kwpGoodsMapper.selectList(wrapper);
+        if (CollectionUtils.isEmpty(goodsList)) {
             throw new BusinessException("商品不存在!");
         }
-        if (Objects.equals(GoodsStatusEnum.PUT_ON_SHELVES.getCode(), goods.getStatus())) {
+        //校验
+        boolean hasPutOnShelves = goodsList.stream()
+                .anyMatch(good -> Objects.equals(GoodsStatusEnum.PUT_ON_SHELVES.getCode(), good.getStatus()));
+        if (hasPutOnShelves) {
             throw new BusinessException("上架操作仅针对“已下架”“草稿”状态的单据!");
         }
-        if (Objects.equals(GoodsStatusEnum.SAVED.getCode(), goods.getStatus())) {
-            UpdateGoodsParam updateParam = BeanUtils.copyProperties(goods, UpdateGoodsParam.class);
-            updateParam.setAttributes(BeanUtils.copyToList(kwpGoodsAttributeService.getByGoodsId(id), GoodsAttributes.class));
-            //价格
-            List<KwpGoodsPriceRange> priceRanges = kwpGoodsPriceRangeService.getByGoodsId(id);
-            BigDecimal price = Optional.ofNullable(priceRanges)
-                    .filter(priceRangeList -> !priceRangeList.isEmpty())
-                    .map(priceRangeList -> priceRangeList.get(0))
-                    .map(KwpGoodsPriceRange::getPrice)
-                    .orElse(null);
-            updateParam.setPrice(price);
-            updateParam.setImages(BeanUtils.copyToList(kwpGoodsImageService.getByGoodsId(id), GoodsImages.class));
-            updateParam.setAddressInfo(BeanUtils.copyProperties(kwpGoodsAddressService.getByGoodsId(id), AddressInfo.class));
-            String msg = judgeParameters(updateParam);
-            if (StringUtils.isNotBlank(msg)) {
-                throw new CustomPromptException(HttpStatus.GOODS_PUT_ON_SHELVES_FAIL_CODE, msg);
+
+        for (KwpGoods goods : goodsList) {
+            if (Objects.equals(GoodsStatusEnum.SAVED.getCode(), goods.getStatus())) {
+                UpdateGoodsParam updateParam = BeanUtils.copyProperties(goods, UpdateGoodsParam.class);
+                updateParam.setAttributes(BeanUtils.copyToList(kwpGoodsAttributeService.getByGoodsId(goods.getId()), GoodsAttributes.class));
+                //价格
+                List<KwpGoodsPriceRange> priceRanges = kwpGoodsPriceRangeService.getByGoodsId(goods.getId());
+                BigDecimal price = Optional.ofNullable(priceRanges)
+                        .filter(priceRangeList -> !priceRangeList.isEmpty())
+                        .map(priceRangeList -> priceRangeList.get(0))
+                        .map(KwpGoodsPriceRange::getPrice)
+                        .orElse(null);
+                updateParam.setPrice(price);
+                updateParam.setImages(BeanUtils.copyToList(kwpGoodsImageService.getByGoodsId(goods.getId()), GoodsImages.class));
+                updateParam.setAddressInfo(BeanUtils.copyProperties(kwpGoodsAddressService.getByGoodsId(goods.getId()), AddressInfo.class));
+                String msg = judgeParameters(updateParam);
+                if (StringUtils.isNotBlank(msg)) {
+                    throw new CustomPromptException(HttpStatus.GOODS_PUT_ON_SHELVES_FAIL_CODE, msg);
+                }
             }
+
+            LambdaUpdateWrapper<KwpGoods> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(KwpGoods::getStatus, GoodsStatusEnum.PUT_ON_SHELVES.getCode())
+                    .set(KwpGoods::getAddedTime, new Date())
+                    .eq(KwpGoods::getId, goods.getId());
+            kwpGoodsMapper.update(null, updateWrapper);
         }
-        LambdaUpdateWrapper<KwpGoods> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.set(KwpGoods::getStatus, GoodsStatusEnum.PUT_ON_SHELVES.getCode()).set(KwpGoods::getAddedTime, new Date()).eq(KwpGoods::getId, id);
-        kwpGoodsMapper.update(null, updateWrapper);
-        sendMsg(MessageEnum.PRODUCT_ON_SHELVES, goods);
+        goodsList.forEach(e -> {
+            sendMsg(MessageEnum.PRODUCT_ON_SHELVES, e);
+        });
     }
 
     /**

+ 79 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java

@@ -4,7 +4,10 @@ package com.sckw.transport.handler;
 import com.alibaba.fastjson.JSON;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.fleet.api.RemoteFleetService;
+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.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderNode;
@@ -16,6 +19,9 @@ import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
 /**
  * Author: donglang
  * Time: 2025-11-19
@@ -72,7 +78,9 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
             updateStatus(waybillOrder);
             // 6. 生成节点轨迹
             createNodeTrace(param, waybillOrder);
-            // 7. 后置处理
+            //7.自动派单计算分值
+            calculateAutoDispatchScore(param, waybillOrder);
+            // 8. 后置处理
             OrderTakingResp handlerResult = afterProcess(param, waybillOrder);
 
             log.info("{}处理完成", getProcessName());
@@ -157,7 +165,11 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
         return node;
     }
 
-    // 7. 后置处理
+    // //7.自动派单计算分值
+    protected abstract void calculateAutoDispatchScore(T param, KwtWaybillOrder waybillOrder);
+
+
+    // 8. 后置处理
     protected OrderTakingResp afterProcess(T param, KwtWaybillOrder waybillOrder) {
         return new OrderTakingResp();
     }
@@ -191,8 +203,73 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
         return subtask;
     }
 
+    /**
+     * 查询运单节点
+     */
+    protected KwtWaybillOrderNode getNodesByOrderId(Long waybillOrderId, Integer status) {
+        KwtWaybillOrderNode orderNode = waybillOrderNodeRepository.queryNodesByOrderId(waybillOrderId, status);
+        if (orderNode == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_NODE_NOT_EXIST, "未找到关联的运单节点数据!");
+        }
+        return orderNode;
+    }
+
+
 
 
 
+
+
+    /**
+     * 查询司机所在企业的派车系数
+     */
+    protected TruckDispatchCoefficientVO getAutoTruckDispatchByEntId(Long entId) {
+        TruckDispatchCoefficientVO truckDispatchVO = remoteFleetService.findAutoTruckDispatchByEntId(entId);
+        if (truckDispatchVO == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
+        }
+        return truckDispatchVO;
+    }
+
+    /**
+     * 查询司机所在企业的司机行为规则
+     */
+    protected DriverConductRulesVO getDriverConductRulesByEntId(Long entId) {
+        DriverConductRulesVO driverRulesVO = remoteFleetService.findDriverConductRulesByEntId(entId);
+        if (driverRulesVO == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到司机行为规则数据!");
+        }
+        return driverRulesVO;
+    }
+
+
+
+    /**
+     * 计算两个时间的分钟差值(正数:comeIntoTime 在 takingOrderTime 之后;负数:时间顺序异常;null:时间为空)
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return
+     */
+    public Long calculateTimeDiffMinutes(Date startTime, Date endTime) {
+        // 校验
+        if (startTime == null || endTime == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR,
+                    "计算时间差失败:,startTime=[" + startTime + "], endTime=[" + endTime + "]");
+        }
+
+        // 计算时间戳差值(毫秒)
+        long diffMillis = endTime.getTime() - startTime.getTime();
+
+        long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(diffMillis);
+
+        // 时间顺序异常提醒(结束时间早于开始时间)
+        if (diffMinutes < 0) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR,
+                    "时间顺序异常,结束时间早于开始时间,startTime=[" + startTime + "], endTime=[" + endTime + "], 差值:[" + diffMinutes + "]分钟");
+        }
+        return diffMinutes;
+    }
+
+
 }
 

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

@@ -4,10 +4,12 @@ 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.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.order.api.model.OrderDetailVo;
 import com.sckw.order.api.model.UpdateActualAmountParam;
 import com.sckw.transport.model.KwtLogisticsOrder;
 import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderNode;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
 import com.sckw.transport.model.param.WaybillOrderCancelParam;
 import com.sckw.transport.repository.KwtLogisticsOrderRepository;
@@ -16,8 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.Objects;
-import java.util.Optional;
 
 /**
  * Author: donglang
@@ -119,5 +121,31 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
         return "司机[" + waybillOrder.getDriverName() + "]取消订单";
     }
 
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderCancelParam param, KwtWaybillOrder waybillOrder) {
+        // 获取司机行为规则配置(司机违规取消运单分钟数)
+        DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
+        Integer illegalCancelOrderMinutes = driverRulesVO.getIllegalCancelOrderMinutes();
+        if (illegalCancelOrderMinutes == null) {
+            log.warn("获取司机违规取消运单分钟数失败:企业{}的司机违规取消运单分钟数配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机违规取消运单分钟数配置为空!");
+        }
+        //司机接单时间
+        KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.PENDING_VEHICLE.getCode());
+        Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
+        //司机取消接单时间
+        KwtWaybillOrderNode cancelNode = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.APPROVAL_TREAT.getCode());
+        Date cancelNodeTime = cancelNode.getCreateTime() != null ? cancelNode.getCreateTime() : null;
+
+        // 计算两个时间的分钟差
+        Long timeDiffMinutes = calculateTimeDiffMinutes(takingOrderTime, cancelNodeTime);
+
+        if (timeDiffMinutes > illegalCancelOrderMinutes.longValue()) {
+            log.info("司机取消运单超时!司机违规取消运单分钟数限制:" + illegalCancelOrderMinutes + "分钟,实际:" + timeDiffMinutes + "分钟");
+            //执行扣分逻辑 TODO DONGLANG
+        }
+
+    }
+
 
 }

+ 39 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -8,6 +8,7 @@ import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.fleet.api.model.vo.RTruckVo;
+import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderNode;
 import com.sckw.transport.model.KwtWaybillOrderTicket;
@@ -18,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.Objects;
 
 /**
@@ -99,4 +101,41 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         log.info("记录【称重】节点轨迹成功,节点ID:{}", node2.getId());
     }
 
+    /**
+     * 自动派单计算分值
+     * @param param
+     * @param waybillOrder
+     */
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
+        // 获取自动派单系数配置(司机超时限制)
+        TruckDispatchCoefficientVO truckDispatchVO = getAutoTruckDispatchByEntId(waybillOrder.getEntId());
+        Integer driverTimeout = truckDispatchVO.getDriverTimeoutLimit();
+        if (driverTimeout == null) {
+            log.warn("企业{}的司机超时限制配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机超时限制配置为空!");
+        }
+        //司机接单时间
+        KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.PENDING_VEHICLE.getCode());
+        Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
+        //司机到底装货点时间
+        KwtWaybillOrderNode comeIntoNode = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.REFUSE_TRAFFIC.getCode());
+        Date comeIntoTime = comeIntoNode.getCreateTime() != null ? comeIntoNode.getCreateTime() : null;
+
+        // 计算两个时间的分钟差
+        Long timeDiffMinutes = calculateTimeDiffMinutes(takingOrderTime, comeIntoTime);
+        //超时
+        if (timeDiffMinutes > driverTimeout.longValue()) {
+            log.info("司机到底装货点耗时超时!司机超时限制:" + driverTimeout + "分钟,实际:" + timeDiffMinutes + "分钟");
+            //执行扣分逻辑 TODO DONGLANG
+
+        }
+
+
+
+
+
+    }
+
+
 }

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveHandler.java

@@ -49,6 +49,11 @@ public class LeaveHandler extends AbstractWaybillOrderHandler<WaybillOrderLeaveP
         // 离场无额外业务逻辑
     }
 
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderLeaveParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
     @Override
     protected String getProcessName() {
         return "离场";

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveMockHandler.java

@@ -61,6 +61,11 @@ public class LeaveMockHandler extends AbstractWaybillOrderHandler<WaybillOrderLe
         updateLoadAmount(param, waybillOrder, ticketMap);
     }
 
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderLeaveMockParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
     /**
      * 填充毛重
      * @param param

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java

@@ -39,6 +39,11 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
         // 装货无额外业务逻辑
     }
 
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderLoadingParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
     @Override
     protected String getProcessName() {
         return "已装货";

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

@@ -116,6 +116,10 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         log.info("物流订单接单完成,运单ID:{}", waybillOrder.getId());
     }
 
+    @Override
+    protected void calculateAutoDispatchScore(OrderCirculateTakingQueryParam param, KwtWaybillOrder waybillOrder) {
+
+    }
 
 
     /**

+ 32 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java

@@ -6,10 +6,12 @@ import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.order.api.model.OrderDetailVo;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.WaybillOrderUnloadParam;
 import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
+import com.sckw.transport.utils.DistanceUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -200,4 +202,34 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
             log.info("记录【卸货】节点轨迹成功,节点ID:{}", node.getId());
         }
     }
+
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderUnloadParam param, KwtWaybillOrder waybillOrder) {
+        // 获取司机行为规则配置(虚假卸货偏差距离)
+        DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
+        Integer distance = driverRulesVO.getFakeUnloadDistance();
+        if (distance == null) {
+            log.warn("获取虚假卸货偏差距离失败:企业{}的虚假卸货偏差距离配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "虚假卸货偏差距离配置为空!");
+        }
+        //查询运单卸货地址
+        KwtWaybillOrderAddress address = waybillOrderAddressRepository.queryByBillOrderIdAndType(waybillOrder.getId(), AddressTypeEnum.SHIPMENT.getCode());
+        if (address == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_TICKET, "物流运单无关联卸货地址信息!");
+        }
+        //实际卸货地址
+        KwtWaybillOrderNode unloadingNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.COMPLETION_LOADING.getCode());
+
+        //应卸货地与实际卸货地之间距离
+        double distanceKm = DistanceUtils.calculateDistance(
+                Optional.ofNullable(address.getLng()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(address.getLat()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(unloadingNodes.getLng()).map(Double::valueOf).orElse(null),
+                Optional.ofNullable(unloadingNodes.getLat()).map(Double::valueOf).orElse(null));
+        if (distanceKm > distance) {
+            log.info("司机未在真实卸货地点进行卸货!卸货地址偏差:" + distanceKm + "KM");
+            //执行扣分逻辑 TODO DONGLANG
+        }
+
+    }
 }

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

@@ -33,4 +33,11 @@ public class KwtWaybillOrderAddressRepository extends ServiceImpl<KwtWaybillOrde
                 .eq(KwtWaybillOrderAddress::getDelFlag, 0)
                 .in(KwtWaybillOrderAddress::getWSubtaskId, subWayBillOrderIds));
     }
+
+    public KwtWaybillOrderAddress queryByBillOrderIdAndType(Long wOrderId, Integer type) {
+        return getOne(Wrappers.<KwtWaybillOrderAddress>lambdaQuery()
+                .eq(KwtWaybillOrderAddress::getWOrderId, wOrderId)
+                .eq(KwtWaybillOrderAddress::getType, type)
+                .eq(KwtWaybillOrderAddress::getDelFlag,0));
+    }
 }

+ 16 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderNodeRepository.java

@@ -32,4 +32,20 @@ public class KwtWaybillOrderNodeRepository extends ServiceImpl<KwtWaybillOrderNo
         wrapper.orderByAsc(KwtWaybillOrderNode::getId);
         return this.list(wrapper);
     }
+
+    /**
+     * 通过运单id查询运单节点数据
+     * @param wOrderId
+     * @return
+     */
+    public KwtWaybillOrderNode queryNodesByOrderId(Long wOrderId, Integer status) {
+        return getOne(Wrappers.<KwtWaybillOrderNode>lambdaQuery()
+                .eq(KwtWaybillOrderNode::getWOrderId, wOrderId)
+                .eq(KwtWaybillOrderNode::getOrderStatus, status)
+                .orderByAsc(KwtWaybillOrderNode::getCreateTime)
+                .orderByAsc(KwtWaybillOrderNode::getId));
+    }
+
+
+
 }

+ 51 - 11
sql/2025/12/01/2025_12_04_donglang.sql

@@ -1,17 +1,22 @@
 
 create table kwf_driver_conduct_rules
 (
-    id                              bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
-    net_id                          bigint          NOT NULL comment '企业id',
-    not_on_time_arrive              int             NOT NULL comment '未按时到场(违规次数/扣分)',
-    illegal_cancel_order            int             NOT NULL comment '违规取消运单(违规次数/扣分)',
-    unload_serious_timeout          int             NOT NULL comment '卸货严重超时(违规次数/扣分)',
-    fake_unload                     int             NOT NULL comment '虚假卸货(违规次数/扣分)',
-    document_error_missing          int             NOT NULL comment '单据错误/缺失(违规次数/扣分)',
-    continuous_on_time_arrive       int             NOT NULL comment '连续按时到场(达标次数/加分)',
-    continuous_on_time_unload       int             NOT NULL comment '连续准时卸货(达标次数/加分)',
-    continuous_accurate_unload      int             NOT NULL comment '连续准确填写卸货信息(达标次数/加分)',
-    del_flag                        int             NOT NULL DEFAULT '0' COMMENT '是否删除(0未删除,1删除)',
+    id                               bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
+    ent_id                           bigint          NOT NULL comment '企业id',
+    unload_serious_timeout           int             NOT NULL comment '单趟严重超时(违规次数/扣分)',
+    unload_serious_timeout_multiple  decimal(8,2)    NOT NULL DEFAULT '00.00' comment '单趟严重超时倍数',
+    document_error_missing           int             NOT NULL comment '单据错误/缺失(违规次数/扣分)',
+    not_on_time_arrive               int             NOT NULL comment '未按时到场(违规次数/扣分)',
+    fake_unload                      int             NOT NULL comment '虚假卸货(违规次数/扣分)',
+    fake_unload_distance             int             NOT NULL comment '虚假卸货偏差距离',
+    illegal_cancel_order             int             NOT NULL comment '违规取消运单(违规次数/扣分)',
+    illegal_cancel_order_minutes     int              NOT NULL comment '违规取消运单分钟数',
+    continuous_on_time_arrive        int             NOT NULL comment '连续按时到场(达标次数/加分)',
+    continuous_on_time_arrive_times  int             NOT NULL comment '连续按时到场次数',
+    continuous_on_time_unload        int             NOT NULL comment '连续准时卸货(达标次数/加分)',
+    continuous_on_time_unload_times  int             NOT NULL comment '连续准时卸货次数',
+    continuous_accurate_unload       int             NOT NULL comment '连续准确填写卸货信息(达标次数/加分)',
+    continuous_accurate_unload_times int             NOT NULL comment '连续准确填写卸货信息次数',
     create_time                     datetime        NOT NULL default CURRENT_TIMESTAMP comment '创建时间',
     update_time                     datetime        NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间',
     create_user                     bigint          NOT NULL DEFAULT '-1' comment '创建人',
@@ -21,5 +26,40 @@ create table kwf_driver_conduct_rules
 
 
 
+create table kwf_driver_conduct_rules_log
+(
+    id                              bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
+    dcr_id                          bigint          NOT NULL comment '司机行为规则id',
+    description                  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci   DEFAULT NULL COMMENT '日志内容',
+    del_flag                        int             NOT NULL DEFAULT '0' COMMENT '是否删除(0未删除,1删除)',
+    create_time                     datetime        NOT NULL default CURRENT_TIMESTAMP comment '创建时间',
+    update_time                     datetime        NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间',
+    create_user                     bigint          NOT NULL DEFAULT '-1' comment '创建人',
+    update_user                     bigint          NOT NULL DEFAULT '-1' comment '更新人',
+    PRIMARY KEY (`id`) USING BTREE
+) comment '司机行为规则日志表';
+
+
+create table kwt_truck_dispatch_coefficient
+(
+    id                              bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
+    ent_id                          bigint          NOT NULL comment '企业id',
+    vehicle_work_hours              int             NOT NULL comment  '车辆工作时长',
+    vehicle_loading_hours           int             NOT NULL comment  '车辆装货时长',
+    vehicle_unloading_hours         int             NOT NULL comment '车辆卸货时长',
+    driver_timeout_limit            int             NOT NULL comment '司机超时限制',
+    vehicle_avg_load                int             NOT NULL comment '车辆平均载重',
+    vehicle_avg_speed               int             NOT NULL comment '车辆平均速度',
+    vehicle_max_tasks               int             NOT NULL comment '车辆最大任务数',
+    driver_order_limit              int             NOT NULL comment '司机接单限制',
+    yard_vehicle_capacity           int             NOT NULL comment '场内车辆容量',
+    max_ratio                       int             NOT NULL comment '最大占比',
+    buffer_coefficient              decimal(8,2)    NOT NULL DEFAULT '00.00' comment '缓冲系数',
+    create_time                     datetime        NOT NULL default CURRENT_TIMESTAMP comment '创建时间',
+    update_time                     datetime        NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间',
+    create_user                     bigint          NOT NULL DEFAULT '-1' comment '创建人',
+    update_user                     bigint          NOT NULL DEFAULT '-1' comment '更新人',
+    PRIMARY KEY (`id`) USING BTREE
+) comment '自动派单系数表';