donglang 1 mesiac pred
rodič
commit
2d222632df
30 zmenil súbory, kde vykonal 822 pridanie a 412 odobranie
  1. 1 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java
  2. 5 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  3. 5 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/KwcContractLogisticsDto.java
  4. 1 5
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java
  5. 22 6
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/RUpdateDriverScoreDto.java
  6. 16 16
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/DriverConductRulesVO.java
  7. 54 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  8. 10 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java
  9. 5 0
      sckw-modules/sckw-fleet/pom.xml
  10. 1 2
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfAutoDispatchController.java
  11. 16 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfDriverScoreController.java
  12. 17 57
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java
  13. 25 25
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverConductRules.java
  14. 0 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesLogRequest.java
  15. 24 24
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverConductRulesUpdateRequest.java
  16. 49 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverScorerDetailRequest.java
  17. 64 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/DriverScorerDetailVO.java
  18. 32 32
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverConductRulesVO.java
  19. 13 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverVo.java
  20. 18 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverScoreDetailRepository.java
  21. 29 38
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfAutoDispatchService.java
  22. 155 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverScoreService.java
  23. 38 5
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java
  24. 32 60
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java
  25. 23 12
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java
  26. 30 27
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java
  27. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java
  28. 35 30
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java
  29. 92 61
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java
  30. 9 9
      sql/2025/12/01/2025_12_04_donglang.sql

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

@@ -869,7 +869,7 @@ public class DateUtils extends DateUtil {
      * @param endTime 结束时间
      * @return
      */
-    public Long calculateTimeDiffMinutes(Date startTime, Date endTime) {
+    public static Long calculateTimeDiffMinutes(Date startTime, Date endTime) {
         // 校验
         if (startTime == null || endTime == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR,

+ 5 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java

@@ -122,4 +122,9 @@ public interface RemoteContractService {
      */
     ContractLogisticsScoreVO findLogisticsScoreByEntId(Long supEntId, Long entId);
 
+    /**
+     * 根据企业查询自动派单有效的物流合同
+     */
+    KwcContractLogisticsDto findLogContractByEntId(Long entId);
+
 }

+ 5 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/KwcContractLogisticsDto.java

@@ -144,4 +144,9 @@ public class KwcContractLogisticsDto implements Serializable {
      */
     private BigDecimal commonPrice;
 
+    /**
+     * 供应企业id
+     */
+    private Long supEntId;
+
 }

+ 1 - 5
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java

@@ -3,7 +3,6 @@ package com.sckw.fleet.api;
 import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.*;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -126,11 +125,8 @@ public interface RemoteFleetService {
 
     List<RTruckVo> findTruckByEntIds(Long entId);
 
-    RDriverScoreVo findDriverScoreIdByEntIds(Long proEntId, Long entId, Long driverId);
+    void updateDriverScoreByEntId(RUpdateDriverScoreDto dto);
 
-    RDriverScoreVo addDriverScoreIdByEntIds(Long proEntId, Long entId, Long driverId, BigDecimal score);
-
-    void updateDriverScoreIdByEntIds(RUpdateDriverScoreDto score);
 
 
 }

+ 22 - 6
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/RUpdateDriverScoreDto.java

@@ -1,5 +1,6 @@
 package com.sckw.fleet.api.model.dto;
 
+import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -17,18 +18,33 @@ import java.math.BigDecimal;
 @AllArgsConstructor
 public class RUpdateDriverScoreDto {
 
-    /** 司机评分id */
-    private Long id;
-
-    /** 供应商企业id */
+    /**
+     * 供应商企业id
+     */
     @NotNull
     private Long supEntId;
 
-    /** 物流企业id */
+    /**
+     * 物流企业id
+     */
     @NotNull
     private Long logEntId;
+    /**
+     * 司机评分id
+     */
+    @NotNull
+    private Long driverId;
 
-    /** 变动评分 */
+    /**
+     * 评分
+     */
+    @NotNull
     private BigDecimal score;
 
+    /**
+     * 行为
+     */
+    @NotBlank
+    private String action;
+
 }

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

@@ -30,9 +30,9 @@ public class DriverConductRulesVO implements Serializable {
     private Long entId;
 
     /**
-     * 单趟严重超时(违规次数/扣分)
+     * 单趟严重超时分数
      */
-    private Integer unloadSeriousTimeout;
+    private Integer unloadSeriousTimeoutScore;
 
     /**
      * 单趟严重超时倍数
@@ -40,19 +40,19 @@ public class DriverConductRulesVO implements Serializable {
     private BigDecimal unloadSeriousTimeoutMultiple;
 
     /**
-     * 单据错误/缺失(违规次数/扣分)
+     * 单据错误/缺失分数
      */
-    private Integer documentErrorMissing;
+    private Integer documentErrorMissingScore;
 
     /**
-     * 未按时到场(违规次数/扣分)
+     * 未按时到场分数
      */
-    private Integer notOnTimeArrive;
+    private Integer notOnTimeArriveScore;
 
     /**
-     * 虚假卸货(违规次数/扣分)
+     * 虚假卸货分数
      */
-    private Integer fakeUnload;
+    private Integer fakeUnloadScore;
 
     /**
      * 虚假卸货偏差距离
@@ -60,9 +60,9 @@ public class DriverConductRulesVO implements Serializable {
     private Integer fakeUnloadDistance;
 
     /**
-     * 违规取消运单(违规次数/扣分)
+     * 违规取消运单分数
      */
-    private Integer illegalCancelOrder;
+    private Integer illegalCancelOrderScore;
 
     /**
      * 违规取消运单分钟数
@@ -70,9 +70,9 @@ public class DriverConductRulesVO implements Serializable {
     private Integer illegalCancelOrderMinutes;
 
     /**
-     * 连续按时到场(达标次数/加分)
+     * 连续按时到场分数
      */
-    private Integer continuousOnTimeArrive;
+    private Integer continuousOnTimeArriveScore;
 
     /**
      * 连续按时到场次数
@@ -80,9 +80,9 @@ public class DriverConductRulesVO implements Serializable {
     private Integer continuousOnTimeArriveTimes;
 
     /**
-     * 连续准时卸货(达标次数/加分)
+     * 连续准时卸货分数
      */
-    private Integer continuousOnTimeUnload;
+    private Integer continuousOnTimeUnloadScore;
 
     /**
      * 连续准时卸货次数
@@ -90,9 +90,9 @@ public class DriverConductRulesVO implements Serializable {
     private Integer continuousOnTimeUnloadTimes;
 
     /**
-     * 连续准确填写卸货信息(达标次数/加分)
+     * 连续准确填写卸货信息分数
      */
-    private Integer continuousAccurateUnload;
+    private Integer continuousAccurateUnloadScore;
 
     /**
      * 连续准确填写卸货信息次数

+ 54 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -12,9 +12,12 @@ import com.sckw.contract.model.entity.*;
 import com.sckw.contract.repository.*;
 import com.sckw.contract.service.KwcContractLogisticsUnitService;
 import com.sckw.contract.service.operateService.KwcContractTradeService;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
+import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.ContractStatusEnum;
 import com.sckw.core.model.enums.CooperateTypeEnum;
+import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.model.enums.SigningWayEnum;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
@@ -408,5 +411,56 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         return vo;
     }
 
+    @Override
+    public KwcContractLogisticsDto findLogContractByEntId(Long entId) {
+        //查询物流企业合同信息
+        List<KwcContractLogisticsUnit> contractLogisticsUnits = kwcContractLogisticsUnitRepository.queryByEntIdAndEntType(entId, EntTypeEnum.LOGISTICS4.getCode());
+        if (contractLogisticsUnits == null) {
+            return new KwcContractLogisticsDto();
+        }
+        List<Long> contractIds = contractLogisticsUnits.stream().map(KwcContractLogisticsUnit::getContractId).distinct().collect(Collectors.toList());
+
+        //查询自动派车且有效的物流合同
+        List<KwcContractLogistics> kwcContractLogistics = contractLogisticsRepository.queryByIdsAndDispatch(contractIds);
+        if (kwcContractLogistics == null) {
+            return new KwcContractLogisticsDto();
+        }
+        if (kwcContractLogistics.size() > 1) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "只能存在有且只有一条的自动派单有效的物流合同!");
+        }
+
+        return kwcContractLogistics.stream().findFirst().map(log -> {
+            KwcContractLogisticsDto dto = new KwcContractLogisticsDto();
+            dto.setId(log.getId());
+            dto.setEntId(log.getEntId());
+            dto.setContractNo(log.getContractNo());
+            dto.setName(log.getName());
+            dto.setSigningWay(log.getSigningWay());
+            dto.setCharging(log.getCharging());
+            dto.setTrading(log.getTrading());
+            dto.setDispatching(log.getDispatching());
+            dto.setStartTime(log.getStartTime());
+            dto.setEndTime(log.getEndTime());
+            dto.setAmount(log.getAmount());
+            dto.setPerformedAmount(log.getPerformedAmount());
+            dto.setSigningUrl(log.getSigningUrl());
+            dto.setSignedUrl(log.getSignedUrl());
+            dto.setSigningNo(log.getSigningNo());
+            dto.setContractPid(log.getContractPid());
+            dto.setRemark(log.getRemark());
+            dto.setStatus(log.getStatus());
+            dto.setBusinessId(log.getBusinessId());
+            dto.setCommonPrice(log.getCommonPrice());
+
+            //查询供应企业
+            KwcContractLogisticsUnit unit = kwcContractLogisticsUnitRepository
+                    .queryByContractIdAndEntType(log.getId(), entId, EntTypeEnum.LOGISTICS3.getCode());
+            if (unit != null) {
+                dto.setSupEntId(unit.getEntId());
+            }
+            return dto;
+        }).orElse(new KwcContractLogisticsDto());
+    }
+
 
 }

+ 10 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java

@@ -93,4 +93,14 @@ public class KwcContractLogisticsUnitRepository extends ServiceImpl<KwcContractL
                 .eq(KwcContractLogisticsUnit::getContractId, tradeContractId)
                 .last("limit 1"));
     }
+
+    public KwcContractLogisticsUnit queryByContractIdAndEntType(Long contractId, Long entId, Integer entType) {
+        return getOne(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
+                .eq(KwcContractLogisticsUnit::getContractId, contractId)
+                .eq(KwcContractLogisticsUnit::getEntId, entId)
+                .eq(KwcContractLogisticsUnit::getUnitType, entType)
+                .eq(KwcContractLogisticsUnit::getDelFlag,0)
+                .last("limit 1"));
+    }
+
 }

+ 5 - 0
sckw-modules/sckw-fleet/pom.xml

@@ -91,6 +91,11 @@
             <artifactId>sckw-file-api</artifactId>
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-contract-api</artifactId>
+            <version>${basic.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-log</artifactId>

+ 1 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfAutoDispatchController.java

@@ -96,8 +96,7 @@ public class KwfAutoDispatchController {
     @Operation(summary = "分页查询司机行为规则日志", description = "分页查询司机行为规则日志")
     @PostMapping("/queryDriverRulesLogPage")
     public BaseResult<PageDataResult<KwfDriverConductRulesLogVO>> queryDriverRulesLogPage(DriverConductRulesLogRequest request){
-        PageDataResult<KwfDriverConductRulesLogVO> driverConductRulesLogVOPage =
-                autoDispatchService.queryDriverRulesLogPage(request);
+        PageDataResult<KwfDriverConductRulesLogVO> driverConductRulesLogVOPage = autoDispatchService.queryDriverRulesLogPage(request);
         return BaseResult.success(driverConductRulesLogVOPage);
     }
 

+ 16 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfDriverScoreController.java

@@ -2,7 +2,10 @@ package com.sckw.fleet.controller;
 
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.fleet.api.model.dto.UpdateDriverScoreDto;
+import com.sckw.fleet.model.request.DriverScorerDetailRequest;
+import com.sckw.fleet.model.vo.DriverScorerDetailVO;
 import com.sckw.fleet.service.KwfDriverScoreService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -31,4 +34,17 @@ public class KwfDriverScoreController {
         kwfDriverScoreService.update(updateDriverScoreDto);
         return HttpResult.ok();
     }
+
+
+    /**
+     * @desc 分页查询司机评分明细
+     * @author zk
+     * @date 2023/7/6
+     **/
+    @PostMapping("/queryScoreDetailPage")
+    public BaseResult<PageDataResult<DriverScorerDetailVO>> queryScoreDetailPage(@Validated @RequestBody DriverScorerDetailRequest request) {
+        PageDataResult<DriverScorerDetailVO> ScorerDetailPageList = kwfDriverScoreService.queryScoreDetailPage(request);
+        return BaseResult.success(ScorerDetailPageList);
+    }
+
 }

+ 17 - 57
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -1,14 +1,11 @@
 package com.sckw.fleet.dubbo;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessException;
-import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.StringUtils;
-import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.*;
@@ -16,8 +13,8 @@ import com.sckw.fleet.dao.KwfDriverMapper;
 import com.sckw.fleet.dao.KwfTruckMapper;
 import com.sckw.fleet.model.*;
 import com.sckw.fleet.repository.*;
+import com.sckw.fleet.service.KwfDriverScoreService;
 import com.sckw.system.api.RemoteSystemService;
-import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -25,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -58,6 +54,8 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     private final KwfDriverConductRulesRepository driverConductRulesRepository;
     private final KwfTruckAxleNumRepository truckAxleNumRepository;
     private final KwfDriverScoreRepository driverScoreRepository;
+    private final KwfDriverScoreService driverScoreService;
+
 
     /**
      * @param driverIds 司机档案主键id,多个已逗号隔开
@@ -583,19 +581,19 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         DriverConductRulesVO rulesVO = new DriverConductRulesVO();
         rulesVO.setId(result.getId());
         rulesVO.setEntId(result.getEntId());
-        rulesVO.setUnloadSeriousTimeout(result.getUnloadSeriousTimeout());
+        rulesVO.setUnloadSeriousTimeoutScore(result.getUnloadSeriousTimeoutScore());
         rulesVO.setUnloadSeriousTimeoutMultiple(result.getUnloadSeriousTimeoutMultiple());
-        rulesVO.setDocumentErrorMissing(result.getDocumentErrorMissing());
-        rulesVO.setNotOnTimeArrive(result.getNotOnTimeArrive());
-        rulesVO.setFakeUnload(result.getFakeUnload());
+        rulesVO.setDocumentErrorMissingScore(result.getDocumentErrorMissingScore());
+        rulesVO.setNotOnTimeArriveScore(result.getNotOnTimeArriveScore());
+        rulesVO.setFakeUnloadScore(result.getFakeUnloadScore());
         rulesVO.setFakeUnloadDistance(result.getFakeUnloadDistance());
-        rulesVO.setIllegalCancelOrder(result.getIllegalCancelOrder());
+        rulesVO.setIllegalCancelOrderScore(result.getIllegalCancelOrderScore());
         rulesVO.setIllegalCancelOrderMinutes(result.getIllegalCancelOrderMinutes());
-        rulesVO.setContinuousOnTimeArrive(result.getContinuousOnTimeArrive());
+        rulesVO.setContinuousOnTimeArriveScore(result.getContinuousOnTimeArriveScore());
         rulesVO.setContinuousOnTimeArriveTimes(result.getContinuousOnTimeArriveTimes());
-        rulesVO.setContinuousOnTimeUnload(result.getContinuousOnTimeUnload());
+        rulesVO.setContinuousOnTimeUnloadScore(result.getContinuousOnTimeUnloadScore());
         rulesVO.setContinuousOnTimeUnloadTimes(result.getContinuousOnTimeUnloadTimes());
-        rulesVO.setContinuousAccurateUnload(result.getContinuousAccurateUnload());
+        rulesVO.setContinuousAccurateUnloadScore(result.getContinuousAccurateUnloadScore());
         rulesVO.setContinuousAccurateUnloadTimes(result.getContinuousAccurateUnloadTimes());
         rulesVO.setCreateTime(result.getCreateTime());
         rulesVO.setUpdateTime(result.getUpdateTime());
@@ -614,50 +612,12 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         return truckList.stream().map(this::getTruckVo).collect(Collectors.toList());
     }
 
+    /**
+     * 修改司机评分
+     * @param driverScoreDto
 
-    public RDriverScoreVo findDriverScoreIdByEntIds(Long proEntId, Long logEntId, Long driverId) {
-        KwfDriverScore driverScore = driverScoreRepository.findDriverScoreByEntIds(proEntId, logEntId, driverId);
-        if(driverScore == null){
-            return new RDriverScoreVo();
-        }
-        RDriverScoreVo vo = new RDriverScoreVo();
-        vo.setProviderEntId(driverScore.getProviderEntId());
-        vo.setLogisticsEntId(driverScore.getLogisticsEntId());
-        vo.setDriverId(driverScore.getDriverId());
-        vo.setScore(driverScore.getScore());
-
-        return vo;
-    }
-
-    public  RDriverScoreVo addDriverScoreIdByEntIds(Long proEntId, Long entId, Long driverId, BigDecimal score) {
-        KwfDriverScore driverScore = new KwfDriverScore();
-        driverScore.setProviderEntId(proEntId);
-        driverScore.setLogisticsEntId(entId);
-        driverScore.setDriverId(driverId);
-        driverScore.setScore(score);
-        driverScore.setCreateBy(LoginUserHolder.getUserId());
-        driverScore.setUpdateBy(LoginUserHolder.getUserId());
-        boolean saveResult = driverScoreRepository.save(driverScore);
-        if (!saveResult) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "添加司机评分失败!");
-        }
-
-        RDriverScoreVo vo = new RDriverScoreVo();
-        vo.setProviderEntId(driverScore.getProviderEntId());
-        vo.setLogisticsEntId(driverScore.getLogisticsEntId());
-        vo.setDriverId(driverScore.getDriverId());
-        vo.setScore(driverScore.getScore());
-
-        return vo;
-    }
-
-    public void updateDriverScoreIdByEntIds(RUpdateDriverScoreDto score) {
-        KwfDriverScore driverScore = new KwfDriverScore();
-        driverScore.setId(score.getId());
-        driverScore.setScore(score.getScore());
-        boolean saveResult = driverScoreRepository.updateById(driverScore);
-        if (!saveResult) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "修改司机评分失败!");
-        }
+     */
+    public void updateDriverScoreByEntId(RUpdateDriverScoreDto driverScoreDto) {
+        driverScoreService.updateDriverScore(driverScoreDto);
     }
 }

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

@@ -34,14 +34,14 @@ public class KwfDriverConductRules implements Serializable {
     /**
      * 企业id
      */
-    @TableField("net_id")
+    @TableField("ent_id")
     private Long entId;
 
     /**
-     * 单趟严重超时(违规次数/扣分)
+     * 单趟严重超时
      */
-    @TableField("unload_serious_timeout")
-    private Integer unloadSeriousTimeout;
+    @TableField("unload_serious_timeout_score")
+    private Integer unloadSeriousTimeoutScore;
 
     /**
      * 单趟严重超时倍数
@@ -50,22 +50,22 @@ public class KwfDriverConductRules implements Serializable {
     private BigDecimal unloadSeriousTimeoutMultiple;
 
     /**
-     * 单据错误/缺失(违规次数/扣分)
+     * 单据错误/缺失
      */
-    @TableField("document_error_missing")
-    private Integer documentErrorMissing;
+    @TableField("document_error_missing_score")
+    private Integer documentErrorMissingScore;
 
     /**
-     * 未按时到场(违规次数/扣分)
+     * 未按时到场
      */
-    @TableField("not_on_time_arrive")
-    private Integer notOnTimeArrive;
+    @TableField("not_on_time_arrive_score")
+    private Integer notOnTimeArriveScore;
 
     /**
-     * 虚假卸货(违规次数/扣分)
+     * 虚假卸货
      */
-    @TableField("fake_unload")
-    private Integer fakeUnload;
+    @TableField("fake_unload_score")
+    private Integer fakeUnloadScore;
 
     /**
      * 虚假卸货偏差距离
@@ -74,10 +74,10 @@ public class KwfDriverConductRules implements Serializable {
     private Integer fakeUnloadDistance;
 
     /**
-     * 违规取消运单(违规次数/扣分)
+     * 违规取消运单
      */
-    @TableField("illegal_cancel_order")
-    private Integer illegalCancelOrder;
+    @TableField("illegal_cancel_order_score")
+    private Integer illegalCancelOrderScore;
 
     /**
      * 违规取消运单分钟数
@@ -86,10 +86,10 @@ public class KwfDriverConductRules implements Serializable {
     private Integer illegalCancelOrderMinutes;
 
     /**
-     * 连续按时到场(达标次数/加分)
+     * 连续按时到场
      */
-    @TableField("continuous_on_time_arrive")
-    private Integer continuousOnTimeArrive;
+    @TableField("continuous_on_time_arrive_score")
+    private Integer continuousOnTimeArriveScore;
 
     /**
      * 连续按时到场次数
@@ -98,10 +98,10 @@ public class KwfDriverConductRules implements Serializable {
     private Integer continuousOnTimeArriveTimes;
 
     /**
-     * 连续准时卸货(达标次数/加分)
+     * 连续准时卸货
      */
-    @TableField("continuous_on_time_unload")
-    private Integer continuousOnTimeUnload;
+    @TableField("continuous_on_time_unload_score")
+    private Integer continuousOnTimeUnloadScore;
 
     /**
      * 连续准时卸货次数
@@ -110,10 +110,10 @@ public class KwfDriverConductRules implements Serializable {
     private Integer continuousOnTimeUnloadTimes;
 
     /**
-     * 连续准确填写卸货信息(达标次数/加分)
+     * 连续准确填写卸货信息
      */
-    @TableField("continuous_accurate_unload")
-    private Integer continuousAccurateUnload;
+    @TableField("continuous_accurate_unload_score")
+    private Integer continuousAccurateUnloadScore;
 
     /**
      * 连续准确填写卸货信息次数

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

@@ -23,7 +23,6 @@ public class DriverConductRulesLogRequest extends PageReq implements Serializabl
      * 业务id
      */
     @Schema(description = "业务id")
-    @NotNull(message = "业务id不能为空!")
     private Long bizId;
 
     /**

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

@@ -25,10 +25,10 @@ public class DriverConductRulesUpdateRequest implements Serializable {
     private Long id;
 
     /**
-     * 单趟严重超时(违规次数/扣分)
+     * 单趟严重超时分数
      */
-    @Schema(description = "单趟严重超时")
-    private Integer unloadSeriousTimeout;
+    @Schema(description = "单趟严重超时分数")
+    private Integer unloadSeriousTimeoutScore;
 
     /**
      * 单趟严重超时倍数
@@ -37,22 +37,22 @@ public class DriverConductRulesUpdateRequest implements Serializable {
     private BigDecimal unloadSeriousTimeoutMultiple;
 
     /**
-     * 单据错误/缺失(违规次数/扣分)
+     * 单据错误/缺失分数
      */
-    @Schema(description = "单据错误/缺失")
-    private Integer documentErrorMissing;
+    @Schema(description = "单据错误/缺失分数")
+    private Integer documentErrorMissingScore;
 
     /**
-     * 未按时到场(违规次数/扣分)
+     * 未按时到场分数
      */
-    @Schema(description = "未按时到场")
-    private Integer notOnTimeArrive;
+    @Schema(description = "未按时到场分数")
+    private Integer notOnTimeArriveScore;
 
     /**
-     * 虚假卸货(违规次数/扣分)
+     * 虚假卸货分数
      */
-    @Schema(description = "虚假卸货")
-    private Integer fakeUnload;
+    @Schema(description = "虚假卸货分数")
+    private Integer fakeUnloadScore;
 
     /**
      * 虚假卸货偏差距离
@@ -61,10 +61,10 @@ public class DriverConductRulesUpdateRequest implements Serializable {
     private Integer fakeUnloadDistance;
 
     /**
-     * 违规取消运单(违规次数/扣分)
+     * 违规取消运单分数
      */
-    @Schema(description = "违规取消运单")
-    private Integer illegalCancelOrder;
+    @Schema(description = "违规取消运单分数")
+    private Integer illegalCancelOrderScore;
 
     /**
      * 违规取消运单分钟数
@@ -73,10 +73,10 @@ public class DriverConductRulesUpdateRequest implements Serializable {
     private Integer illegalCancelOrderMinutes;
 
     /**
-     * 连续按时到场(达标次数/加分)
+     * 连续按时到场分数
      */
-    @Schema(description = "连续按时到场")
-    private Integer continuousOnTimeArrive;
+    @Schema(description = "连续按时到场分数")
+    private Integer continuousOnTimeArriveScore;
 
     /**
      * 连续按时到场次数
@@ -85,10 +85,10 @@ public class DriverConductRulesUpdateRequest implements Serializable {
     private Integer continuousOnTimeArriveTimes;
 
     /**
-     * 连续准时卸货(达标次数/加分)
+     * 连续准时卸货分数
      */
-    @Schema(description = "连续准时卸货")
-    private Integer continuousOnTimeUnload;
+    @Schema(description = "连续准时卸货分数")
+    private Integer continuousOnTimeUnloadScore;
 
     /**
      * 连续准时卸货次数
@@ -97,10 +97,10 @@ public class DriverConductRulesUpdateRequest implements Serializable {
     private Integer continuousOnTimeUnloadTimes;
 
     /**
-     * 连续准确填写卸货信息(达标次数/加分)
+     * 连续准确填写卸货信息分数
      */
-    @Schema(description = "连续准确填写卸货信息")
-    private Integer continuousAccurateUnload;
+    @Schema(description = "连续准确填写卸货信息分数")
+    private Integer continuousAccurateUnloadScore;
 
     /**
      * 连续准确填写卸货信息次数

+ 49 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/DriverScorerDetailRequest.java

@@ -0,0 +1,49 @@
+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: donglang
+ * @CreateTime: 2025-12-11  14:46
+ * @Description: 司机评分明细查询参数
+ */
+@Data
+public class DriverScorerDetailRequest extends PageReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1811204375484765953L;
+
+    /**
+     * 评分id
+     */
+    @NotNull(message = "评分id不能为空")
+    @Schema(description = "评分id")
+    private Long scoreId;
+
+    /**
+     * 物流企业id
+     */
+    @NotNull(message = "物流企业id不能为空")
+    @Schema(description = "物流企业id")
+    private Long entId;
+
+    /**
+     * 司机id
+     */
+    @NotNull(message = "司机id不能为空")
+    @Schema(description = "司机id")
+    private Long driverId;
+
+    /**
+     * 行为
+     */
+    @Schema(description = "行为")
+    private String action;
+
+}

+ 64 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/DriverScorerDetailVO.java

@@ -0,0 +1,64 @@
+package com.sckw.fleet.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: donglang
+ * @CreateTime: 2025-12-11  14:46
+ * @Description: 司机评分明细返回模型
+ */
+@Data
+public class DriverScorerDetailVO {
+    /**
+     * 评分id
+     */
+    @Schema(description = "评分id")
+    private Long scoreId;
+
+    /**
+     * 供应企业id
+     */
+    @Schema(description = "供应企业id")
+    private Long supEntId;
+
+    /**
+     * 供应企业名称
+     */
+    @Schema(description = "供应企业名称")
+    private String supEntName;
+
+
+    /**
+     * 司机id
+     */
+    @Schema(description = "司机id")
+    private Long driverId;
+
+    /**
+     * 司机名称
+     */
+    @Schema(description = "司机名称")
+    private String driverName;
+
+    /**
+     * 行为
+     */
+    @Schema(description = "行为")
+    private String action;
+
+    /**
+     * 评分变动分数
+     */
+    @Schema(description = "评分变动分数")
+    private BigDecimal scoreChange;
+
+    /**
+     * 变动后评分
+     */
+    @Schema(description = "变动后评分")
+    private BigDecimal score;
+
+}

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

@@ -34,10 +34,10 @@ public class KwfDriverConductRulesVO implements Serializable {
     private Long entId;
 
     /**
-     * 单趟严重超时(违规次数/扣分)
+     * 单趟严重超时分数
      */
-    @Schema(description = "单趟严重超时")
-    private Integer unloadSeriousTimeout;
+    @Schema(description = "单趟严重超时分数")
+    private Integer unloadSeriousTimeoutScore;
 
     /**
      * 单趟严重超时倍数
@@ -46,22 +46,22 @@ public class KwfDriverConductRulesVO implements Serializable {
     private BigDecimal unloadSeriousTimeoutMultiple;
 
     /**
-     * 单据错误/缺失(违规次数/扣分)
+     * 单据错误/缺失分数
      */
-    @Schema(description = "单据错误/缺失")
-    private Integer documentErrorMissing;
+    @Schema(description = "单据错误/缺失分数")
+    private Integer documentErrorMissingScore;
 
     /**
-     * 未按时到场(违规次数/扣分)
+     * 未按时到场分数
      */
-    @Schema(description = "未按时到场")
-    private Integer notOnTimeArrive;
+    @Schema(description = "未按时到场分数")
+    private Integer notOnTimeArriveScore;
 
     /**
-     * 虚假卸货(违规次数/扣分)
+     * 虚假卸货分数
      */
-    @Schema(description = "虚假卸货")
-    private Integer fakeUnload;
+    @Schema(description = "虚假卸货分数")
+    private Integer fakeUnloadScore;
 
     /**
      * 虚假卸货偏差距离
@@ -70,10 +70,10 @@ public class KwfDriverConductRulesVO implements Serializable {
     private Integer fakeUnloadDistance;
 
     /**
-     * 违规取消运单(违规次数/扣分)
+     * 违规取消运单分数
      */
-    @Schema(description = "违规取消运单")
-    private Integer illegalCancelOrder;
+    @Schema(description = "违规取消运单分数")
+    private Integer illegalCancelOrderScore;
 
     /**
      * 违规取消运单分钟数
@@ -82,10 +82,10 @@ public class KwfDriverConductRulesVO implements Serializable {
     private Integer illegalCancelOrderMinutes;
 
     /**
-     * 连续按时到场(达标次数/加分)
+     * 连续按时到场分数
      */
-    @Schema(description = "连续按时到场")
-    private Integer continuousOnTimeArrive;
+    @Schema(description = "连续按时到场分数")
+    private Integer continuousOnTimeArriveScore;
 
     /**
      * 连续按时到场次数
@@ -94,10 +94,10 @@ public class KwfDriverConductRulesVO implements Serializable {
     private Integer continuousOnTimeArriveTimes;
 
     /**
-     * 连续准时卸货(达标次数/加分)
+     * 连续准时卸货分数
      */
-    @Schema(description = "连续准时卸货")
-    private Integer continuousOnTimeUnload;
+    @Schema(description = "连续准时卸货分数")
+    private Integer continuousOnTimeUnloadScore;
 
     /**
      * 连续准时卸货次数
@@ -106,10 +106,10 @@ public class KwfDriverConductRulesVO implements Serializable {
     private Integer continuousOnTimeUnloadTimes;
 
     /**
-     * 连续准确填写卸货信息(达标次数/加分)
+     * 连续准确填写卸货信息分数
      */
-    @Schema(description = "连续准确填写卸货信息")
-    private Integer continuousAccurateUnload;
+    @Schema(description = "连续准确填写卸货信息分数")
+    private Integer continuousAccurateUnloadScore;
 
     /**
      * 连续准确填写卸货信息次数
@@ -152,19 +152,19 @@ public class KwfDriverConductRulesVO implements Serializable {
         KwfDriverConductRulesVO rulesVO = KwfDriverConductRulesVO.getInstance();
         rulesVO.setId(rules.getId());
         rulesVO.setEntId(rules.getEntId());
-        rulesVO.setUnloadSeriousTimeout(rules.getUnloadSeriousTimeout());
+        rulesVO.setUnloadSeriousTimeoutScore(rules.getUnloadSeriousTimeoutScore());
         rulesVO.setUnloadSeriousTimeoutMultiple(rules.getUnloadSeriousTimeoutMultiple());
-        rulesVO.setDocumentErrorMissing(rules.getDocumentErrorMissing());
-        rulesVO.setNotOnTimeArrive(rules.getNotOnTimeArrive());
-        rulesVO.setFakeUnload(rules.getFakeUnload());
+        rulesVO.setDocumentErrorMissingScore(rules.getDocumentErrorMissingScore());
+        rulesVO.setNotOnTimeArriveScore(rules.getNotOnTimeArriveScore());
+        rulesVO.setFakeUnloadScore(rules.getFakeUnloadScore());
         rulesVO.setFakeUnloadDistance(rules.getFakeUnloadDistance());
-        rulesVO.setIllegalCancelOrder(rules.getIllegalCancelOrder());
+        rulesVO.setIllegalCancelOrderScore(rules.getIllegalCancelOrderScore());
         rulesVO.setIllegalCancelOrderMinutes(rules.getIllegalCancelOrderMinutes());
-        rulesVO.setContinuousOnTimeArrive(rules.getContinuousOnTimeArrive());
+        rulesVO.setContinuousOnTimeArriveScore(rules.getContinuousOnTimeArriveScore());
         rulesVO.setContinuousOnTimeArriveTimes(rules.getContinuousOnTimeArriveTimes());
-        rulesVO.setContinuousOnTimeUnload(rules.getContinuousOnTimeUnload());
+        rulesVO.setContinuousOnTimeUnloadScore(rules.getContinuousOnTimeUnloadScore());
         rulesVO.setContinuousOnTimeUnloadTimes(rules.getContinuousOnTimeUnloadTimes());
-        rulesVO.setContinuousAccurateUnload(rules.getContinuousAccurateUnload());
+        rulesVO.setContinuousAccurateUnloadScore(rules.getContinuousAccurateUnloadScore());
         rulesVO.setContinuousAccurateUnloadTimes(rules.getContinuousAccurateUnloadTimes());
         rulesVO.setCreateTime(rules.getCreateTime());
         rulesVO.setUpdateTime(rules.getUpdateTime());

+ 13 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverVo.java

@@ -9,6 +9,7 @@ import lombok.experimental.Accessors;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -193,6 +194,18 @@ public class KwfDriverVo implements Serializable {
     @ExcelProperty(value = "备注", index = 20)
     private int monthlyTaskAmount;
 
+    /**
+     * 评分id
+     */
+    @ExcelProperty(value = "评分id", index = 22)
+    private Long scoreId;
+
+    /**
+     * 评分
+     */
+    @ExcelProperty(value = "评分", index = 21)
+    private BigDecimal score;
+
 
     public String getAuthStatusName() {
         return authStatus == 1 ? "正常" : authStatus == 2 ? "临时" : "异常";

+ 18 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverScoreDetailRepository.java

@@ -0,0 +1,18 @@
+package com.sckw.fleet.repository;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.fleet.dao.KwfDriverScoreDetailMapper;
+import com.sckw.fleet.model.KwfDriverScoreDetail;
+import org.springframework.stereotype.Repository;
+
+
+/**
+ * @author PC
+ * 司机评分
+ */
+@Repository
+public class KwfDriverScoreDetailRepository extends ServiceImpl<KwfDriverScoreDetailMapper, KwfDriverScoreDetail> {
+
+
+
+}

+ 29 - 38
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfAutoDispatchService.java

@@ -69,7 +69,6 @@ public class KwfAutoDispatchService {
                 .eq(KwfTruckDispatchCoefficient::getEntId, LoginUserHolder.getEntId()));
         //无数据则初始化
         if (dispatchCoefficient == null && request.getIsInit()) {
-            log.info("当前企业[{}]无自动派车系数数据,执行初始化", entId);
             dispatchCoefficient = initAutoDispatchCoefficient(entId);
         }
         KwfTruckDispatchCoefficientVO driverConductRulesVO = KwfTruckDispatchCoefficientVO.toVO(dispatchCoefficient);
@@ -81,6 +80,7 @@ public class KwfAutoDispatchService {
      * 初始化自动派车系数
      */
     private KwfTruckDispatchCoefficient initAutoDispatchCoefficient(Long entId) {
+        log.info("当前企业[{}]无自动派车系数数据,执行初始化", entId);
         KwfTruckDispatchCoefficient dispatchCoefficient = new KwfTruckDispatchCoefficient();
         dispatchCoefficient.setEntId(entId);
         dispatchCoefficient.setVehicleWorkHours(10);
@@ -96,12 +96,6 @@ public class KwfAutoDispatchService {
         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;
     }
 
@@ -224,7 +218,6 @@ public class KwfAutoDispatchService {
                 .eq(KwfDriverConductRules::getEntId, LoginUserHolder.getEntId()));
         //无数据则初始化
         if (driverConductRules == null && request.getIsInit()) {
-            log.info("当前企业[{}]无司机行为规则数据,执行初始化", entId);
             driverConductRules = initDriverConductRules(entId);
         }
         KwfDriverConductRulesVO resultVO = KwfDriverConductRulesVO.toVO(driverConductRules);
@@ -236,30 +229,25 @@ public class KwfAutoDispatchService {
      * 初始化司机行为规则
      */
     private KwfDriverConductRules initDriverConductRules(Long entId) {
+        log.info("当前企业[{}]无司机行为规则数据,执行初始化", entId);
         KwfDriverConductRules rules = new KwfDriverConductRules();
         rules.setEntId(entId);
-        rules.setUnloadSeriousTimeout(5);
+        rules.setUnloadSeriousTimeoutScore(5);
         rules.setUnloadSeriousTimeoutMultiple(new BigDecimal("2.00"));
-        rules.setDocumentErrorMissing(2);
-        rules.setNotOnTimeArrive(2);
-        rules.setFakeUnload(5);
+        rules.setDocumentErrorMissingScore(2);
+        rules.setNotOnTimeArriveScore(2);
+        rules.setFakeUnloadScore(5);
         rules.setFakeUnloadDistance(5);
-        rules.setIllegalCancelOrder(1);
+        rules.setIllegalCancelOrderScore(1);
         rules.setIllegalCancelOrderMinutes(60);
-        rules.setContinuousOnTimeArrive(5);
+        rules.setContinuousOnTimeArriveScore(5);
         rules.setContinuousOnTimeArriveTimes(10);
-        rules.setContinuousOnTimeUnload(5);
+        rules.setContinuousOnTimeUnloadScore(5);
         rules.setContinuousOnTimeUnloadTimes(10);
-        rules.setContinuousAccurateUnload(5);
+        rules.setContinuousAccurateUnloadScore(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;
     }
 
@@ -280,19 +268,19 @@ public class KwfAutoDispatchService {
         KwfDriverConductRules newDriverConductRules = new KwfDriverConductRules();
         BeanUtils.copyProperties(oldDriverConductRules, newDriverConductRules);
 
-        newDriverConductRules.setUnloadSeriousTimeout(request.getUnloadSeriousTimeout());
+        newDriverConductRules.setUnloadSeriousTimeoutScore(request.getUnloadSeriousTimeoutScore());
         newDriverConductRules.setUnloadSeriousTimeoutMultiple(request.getUnloadSeriousTimeoutMultiple());
-        newDriverConductRules.setDocumentErrorMissing(request.getDocumentErrorMissing());
-        newDriverConductRules.setNotOnTimeArrive(request.getNotOnTimeArrive());
-        newDriverConductRules.setFakeUnload(request.getFakeUnload());
+        newDriverConductRules.setDocumentErrorMissingScore(request.getDocumentErrorMissingScore());
+        newDriverConductRules.setNotOnTimeArriveScore(request.getNotOnTimeArriveScore());
+        newDriverConductRules.setFakeUnloadScore(request.getFakeUnloadScore());
         newDriverConductRules.setFakeUnloadDistance(request.getFakeUnloadDistance());
-        newDriverConductRules.setIllegalCancelOrder(request.getIllegalCancelOrder());
+        newDriverConductRules.setIllegalCancelOrderScore(request.getIllegalCancelOrderScore());
         newDriverConductRules.setIllegalCancelOrderMinutes(request.getIllegalCancelOrderMinutes());
-        newDriverConductRules.setContinuousOnTimeArrive(request.getContinuousOnTimeArrive());
+        newDriverConductRules.setContinuousOnTimeArriveScore(request.getContinuousOnTimeArriveScore());
         newDriverConductRules.setContinuousOnTimeArriveTimes(request.getContinuousOnTimeArriveTimes());
-        newDriverConductRules.setContinuousOnTimeUnload(request.getContinuousOnTimeUnload());
+        newDriverConductRules.setContinuousOnTimeUnloadScore(request.getContinuousOnTimeUnloadScore());
         newDriverConductRules.setContinuousOnTimeUnloadTimes(request.getContinuousOnTimeUnloadTimes());
-        newDriverConductRules.setContinuousAccurateUnload(request.getContinuousAccurateUnload());
+        newDriverConductRules.setContinuousAccurateUnloadScore(request.getContinuousAccurateUnloadScore());
         newDriverConductRules.setContinuousAccurateUnloadTimes(request.getContinuousAccurateUnloadTimes());
         newDriverConductRules.setUpdateUser(LoginUserHolder.getUserId());
 
@@ -333,19 +321,19 @@ public class KwfAutoDispatchService {
         }
         List<String> changeItems = new ArrayList<>();
         // 对比所有字段
-        compareAndAddItem(changeItems, "单趟严重超时", oldRule.getUnloadSeriousTimeout(), request.getUnloadSeriousTimeout());
+        compareAndAddItem(changeItems, "单趟严重超时", oldRule.getUnloadSeriousTimeoutScore(), request.getUnloadSeriousTimeoutScore());
         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.getDocumentErrorMissingScore(), request.getDocumentErrorMissingScore());
+        compareAndAddItem(changeItems, "未按时到场", oldRule.getNotOnTimeArriveScore(), request.getNotOnTimeArriveScore());
+        compareAndAddItem(changeItems, "虚假卸货", oldRule.getFakeUnloadScore(), request.getFakeUnloadScore());
         compareAndAddItem(changeItems, "虚假卸货偏差距离", oldRule.getFakeUnloadDistance(), request.getFakeUnloadDistance());
-        compareAndAddItem(changeItems, "违规取消运单", oldRule.getIllegalCancelOrder(), request.getIllegalCancelOrder());
+        compareAndAddItem(changeItems, "违规取消运单", oldRule.getIllegalCancelOrderScore(), request.getIllegalCancelOrderScore());
         compareAndAddItem(changeItems, "违规取消运单分钟数", oldRule.getIllegalCancelOrderMinutes(), request.getIllegalCancelOrderMinutes());
-        compareAndAddItem(changeItems, "连续按时到场", oldRule.getContinuousOnTimeArrive(), request.getContinuousOnTimeArrive());
+        compareAndAddItem(changeItems, "连续按时到场", oldRule.getContinuousOnTimeArriveScore(), request.getContinuousOnTimeArriveScore());
         compareAndAddItem(changeItems, "连续按时到场次数", oldRule.getContinuousOnTimeArriveTimes(), request.getContinuousOnTimeArriveTimes());
-        compareAndAddItem(changeItems, "连续准时卸货", oldRule.getContinuousOnTimeUnload(), request.getContinuousOnTimeUnload());
+        compareAndAddItem(changeItems, "连续准时卸货", oldRule.getContinuousOnTimeUnloadScore(), request.getContinuousOnTimeUnloadScore());
         compareAndAddItem(changeItems, "连续准时卸货次数", oldRule.getContinuousOnTimeUnloadTimes(), request.getContinuousOnTimeUnloadTimes());
-        compareAndAddItem(changeItems, "连续准确填写卸货信息", oldRule.getContinuousAccurateUnload(), request.getContinuousAccurateUnload());
+        compareAndAddItem(changeItems, "连续准确填写卸货信息", oldRule.getContinuousAccurateUnloadScore(), request.getContinuousAccurateUnloadScore());
         compareAndAddItem(changeItems, "连续准确填写卸货信息次数", oldRule.getContinuousAccurateUnloadTimes(), request.getContinuousAccurateUnloadTimes());
 
         if (changeItems.isEmpty()) {
@@ -376,6 +364,9 @@ public class KwfAutoDispatchService {
      * @return
      */
     public PageDataResult<KwfDriverConductRulesLogVO> queryDriverRulesLogPage(DriverConductRulesLogRequest request) {
+        if (request.getBizId() == null) {
+            return PageDataResult.empty(request.getPageNum(), request.getPageSize());
+        }
         log.info("查询司机行为规则日志:{}", JSON.toJSONString(request));
         LambdaQueryWrapper<KwfDriverConductRulesLog> queryWrapper = Wrappers.<KwfDriverConductRulesLog>lambdaQuery()
                 .eq(KwfDriverConductRulesLog::getBizId, request.getBizId())

+ 155 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverScoreService.java

@@ -2,19 +2,40 @@ package com.sckw.fleet.service;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sckw.contract.api.RemoteContractService;
+import com.sckw.contract.api.model.vo.ContractLogisticsScoreVO;
+import com.sckw.contract.api.model.vo.KwcContractLogisticsDto;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
+import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.IdWorker;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.result.PageDataResult;
+import com.sckw.fleet.api.RemoteFleetService;
+import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.dto.UpdateDriverScoreDto;
+import com.sckw.fleet.api.model.vo.RDriverVo;
 import com.sckw.fleet.dao.KwfDriverMapper;
 import com.sckw.fleet.dao.KwfDriverScoreDetailMapper;
 import com.sckw.fleet.dao.KwfDriverScoreMapper;
 import com.sckw.fleet.model.KwfDriver;
 import com.sckw.fleet.model.KwfDriverScore;
 import com.sckw.fleet.model.KwfDriverScoreDetail;
+import com.sckw.fleet.model.request.DriverScorerDetailRequest;
+import com.sckw.fleet.model.vo.DriverScorerDetailVO;
+import com.sckw.fleet.repository.KwfDriverScoreDetailRepository;
+import com.sckw.fleet.repository.KwfDriverScoreRepository;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -30,6 +51,7 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Service
+@RequiredArgsConstructor
 public class KwfDriverScoreService {
 
     @Autowired
@@ -38,6 +60,15 @@ public class KwfDriverScoreService {
     private KwfDriverScoreMapper kwfDriverScoreMapper;
     @Autowired
     private KwfDriverScoreDetailMapper kwfDriverScoreDetailMapper;
+    private final KwfDriverScoreRepository driverScoreRepository;
+    private final KwfDriverScoreDetailRepository driverScoreDetailRepository;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteContractService remoteContractService;
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteSystemService remoteSystemService;
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteFleetService remoteFleetService;
 
     /**
      * 更新司机评分
@@ -259,4 +290,128 @@ public class KwfDriverScoreService {
         List<KwfDriverScoreDetail> driverScoreDetails;
     }
 
+    /**
+     * 分页查询司机评分明细
+     * @param request
+     * @return
+     */
+    public PageDataResult<DriverScorerDetailVO> queryScoreDetailPage(DriverScorerDetailRequest request) {
+        log.info("分页查询司机评分明细:{}", JSON.toJSONString(request));
+
+        LambdaQueryWrapper<KwfDriverScoreDetail> queryWrapper = Wrappers.<KwfDriverScoreDetail>lambdaQuery()
+                .eq(KwfDriverScoreDetail::getDriverId, request.getDriverId())
+                .eq(KwfDriverScoreDetail::getScoreId, request.getScoreId())
+                .like(StringUtils.isNotBlank(request.getAction()), KwfDriverScoreDetail::getAction, request.getAction())
+                .eq(KwfDriverScoreDetail::getDelFlag, 0)
+                .orderByDesc(KwfDriverScoreDetail::getId);
+        Page<KwfDriverScoreDetail> scoreDetailPageList = driverScoreDetailRepository.page(new Page<>(request.getPageNum(), request.getPageSize()), queryWrapper);
+        List<KwfDriverScoreDetail> records = scoreDetailPageList.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前司机的无司机评分记录,司机id:{}", request.getDriverId());
+            return PageDataResult.empty(request.getPageNum(), request.getPageSize());
+        }
+
+        List<DriverScorerDetailVO> scorerDetailVOList = new ArrayList<>();
+        for (KwfDriverScoreDetail detail : records) {
+            DriverScorerDetailVO detailVO = new DriverScorerDetailVO();
+            detailVO.setScoreId(detail.getScoreId());
+            detailVO.setDriverId(detail.getDriverId());
+            detailVO.setAction(detail.getAction());
+            detailVO.setScoreChange(detail.getScoreChange());
+            detailVO.setScore(detail.getScore());
+            scorerDetailVOList.add(detailVO);
+
+            //查询当前物流企业自动派单且生效的物流合同
+            KwcContractLogisticsDto logContractByEntId = remoteContractService.findLogContractByEntId(request.getEntId());
+            if (logContractByEntId != null) {
+                KwsEnterpriseResDto entDto = remoteSystemService.queryEnterpriseByEntId(logContractByEntId.getEntId());
+                detailVO.setSupEntId(logContractByEntId.getEntId());
+                detailVO.setSupEntName(entDto == null ? null : entDto.getFirmName());
+            }
+            RDriverVo driver = remoteFleetService.findDriver(request.getDriverId());
+            if (driver != null) {
+                detailVO.setDriverName(driver.getName());
+            }
+        }
+        log.info("分页查询司机评分明细成功!");
+        return PageDataResult.success(request.getPageNum(), request.getPageSize(), (long) scorerDetailVOList.size(), scorerDetailVOList);
+    }
+
+
+    /**
+     * 修改司机评分
+     * @param dto
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateDriverScore(RUpdateDriverScoreDto dto) {
+        if (dto.getScore() == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "分数不能为空!");
+        }
+        //1. 查询司机的评分
+        KwfDriverScore driverScore = driverScoreRepository.findDriverScoreByEntIds(dto.getSupEntId(), dto.getLogEntId(), dto.getDriverId());
+        //2.司机没评分,初始化时间分数(企业分数)
+        if (driverScore == null) {
+            log.info("司机无评分, 需初始化司机分数,司机id:{}", dto.getDriverId());
+            ContractLogisticsScoreVO logisticsScore = remoteContractService.findLogisticsScoreByEntId(dto.getSupEntId(), dto.getLogEntId());
+            if (logisticsScore == null) {
+                throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "修改司机分数,企业无评分!");
+            }
+            //初始化司机分数
+            driverScore = initDriverScore(dto, logisticsScore.getScore());
+        }
+        //司机当前分数
+        BigDecimal currentScore = driverScore.getScore() == null || driverScore.getScore().compareTo(BigDecimal.ZERO) < 0
+                ? BigDecimal.ZERO : driverScore.getScore();
+        //司机加减分数
+        BigDecimal scoreChange = dto.getScore();
+
+        //3. 修改司机评分
+        driverScore.setScore(currentScore.add(scoreChange));
+        driverScoreRepository.updateById(driverScore);
+
+        //4.新增司机评分明细
+        addDriverScoreDetail(driverScore, scoreChange, dto.getAction());
+    }
+
+
+    /**
+     * 初始化司机分数
+     * @param dto
+     * @param entScore
+     */
+    private KwfDriverScore initDriverScore(RUpdateDriverScoreDto dto, BigDecimal entScore) {
+        KwfDriverScore driverScore = new KwfDriverScore();
+        driverScore.setProviderEntId(dto.getSupEntId());
+        driverScore.setLogisticsEntId(dto.getLogEntId());
+        driverScore.setDriverId(dto.getDriverId());
+        driverScore.setScore(entScore);
+        driverScore.setCreateBy(LoginUserHolder.getUserId() == null ? -1 : LoginUserHolder.getUserId());
+        driverScore.setUpdateBy(LoginUserHolder.getUserId() == null ? -1 : LoginUserHolder.getUserId());
+        boolean saveResult = driverScoreRepository.save(driverScore);
+        if (!saveResult) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "初始化司机评分失败!");
+        }
+        return driverScore;
+    }
+
+    /**
+     * 新增司机评分明细
+     * @param action
+     * @param driverScore
+     * @param scoreChange
+     * @param scoreChange
+     */
+    private void addDriverScoreDetail(KwfDriverScore driverScore, BigDecimal scoreChange, String action) {
+        KwfDriverScoreDetail scoreDetail = new KwfDriverScoreDetail();
+        scoreDetail.setScoreId(driverScore.getId());
+        scoreDetail.setDriverId(driverScore.getDriverId());
+        scoreDetail.setAction(action);
+        scoreDetail.setScoreChange(scoreChange);
+        scoreDetail.setScore(driverScore.getScore());
+        scoreDetail.setCreateBy(LoginUserHolder.getUserId() == null ? -1 : LoginUserHolder.getUserId());
+        scoreDetail.setUpdateBy(LoginUserHolder.getUserId() == null ? -1 : LoginUserHolder.getUserId());
+        driverScoreDetailRepository.save(scoreDetail);
+    }
+
+
 }

+ 38 - 5
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java

@@ -6,6 +6,8 @@ import com.alibaba.excel.read.metadata.ReadSheet;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.sckw.contract.api.RemoteContractService;
+import com.sckw.contract.api.model.vo.KwcContractLogisticsDto;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
@@ -19,7 +21,6 @@ import com.sckw.core.model.file.FileInfo;
 import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.excel.easyexcel.ExcelImportListener;
 import com.sckw.excel.utils.ExcelUtil;
@@ -30,10 +31,7 @@ import com.sckw.fleet.model.dto.*;
 import com.sckw.fleet.model.request.AssociatedTrackAddRequest;
 import com.sckw.fleet.model.request.AssociatedTrackRequest;
 import com.sckw.fleet.model.vo.*;
-import com.sckw.fleet.repository.KwfDriverAssociatedTruckRepository;
-import com.sckw.fleet.repository.KwfTruckAxleNumRepository;
-import com.sckw.fleet.repository.KwfTruckReportRepository;
-import com.sckw.fleet.repository.KwfTruckRepository;
+import com.sckw.fleet.repository.*;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.system.api.RemoteSystemService;
@@ -96,10 +94,17 @@ public class KwfDriverService {
     KwfTruckRepository truckRepository;
     @Autowired
     KwfDriverAssociatedTruckRepository driverAssociatedTruckRepository;
+    @Autowired
+    KwfDriverScoreRepository driverScoreRepository;
+    @Autowired
+    KwfDriverScoreDetailRepository driverScoreDetailRepository;
+
     @Autowired
     KwfTruckAxleNumRepository truckAxleNumRepository;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private TransportRemoteService transportRemoteService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
+    private RemoteContractService remoteContractService;
 
     /**
      * @param key 逐渐id
@@ -293,6 +298,9 @@ public class KwfDriverService {
             //获取司机完成量(查询司机的当天完成量、7天完成量、30天完成量)
             getDriverTaskAmounts(driver.getEntId(), driver.getId(), driver);
 
+            //获取司机评分
+            getDriverScore(driver.getEntId(), driver.getId(), driver);
+
         }
         return drivers;
     }
@@ -375,6 +383,31 @@ public class KwfDriverService {
         driver.setMonthlyTaskAmount(taskVO.getMonthlyTaskAmount());
     }
 
+    /**
+     * 司机评分
+     *
+     * @param truck
+     * @param ents
+     * @return
+     */
+    private void getDriverScore(String entId, String driverId, KwfDriverVo driver) {
+        if (StringUtils.isEmpty(entId) || StringUtils.isEmpty(driverId)) {
+            return;
+        }
+        //查询当前物流企业自动派单且生效的物流合同
+        KwcContractLogisticsDto logContractByEntId = remoteContractService.findLogContractByEntId(Long.valueOf(entId));
+        if (logContractByEntId == null) {
+            return;
+        }
+        //司机评分
+        KwfDriverScore driverScoreByEntIds = driverScoreRepository.findDriverScoreByEntIds(Long.valueOf(logContractByEntId.getSupEntId()), Long.valueOf(entId), Long.valueOf(driverId));
+        if (driverScoreByEntIds == null) {
+            return;
+        }
+        driver.setScoreId(driverScoreByEntIds.getId());
+        driver.setScore(driverScoreByEntIds.getScore());
+    }
+
         /**
          * @param params 查询参数
          * @desc 查询

+ 32 - 60
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java

@@ -4,7 +4,8 @@ package com.sckw.transport.handler;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.contract.api.RemoteContractService;
-import com.sckw.contract.api.model.vo.ContractLogisticsScoreVO;
+import com.sckw.contract.api.feign.LogisticsScoreFeignService;
+import com.sckw.contract.api.model.dto.req.LogisticsScoreDetailFeignDto;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
@@ -12,10 +13,12 @@ import com.sckw.core.utils.CollectionUtils;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
-import com.sckw.fleet.api.model.vo.RDriverScoreVo;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
-import com.sckw.transport.model.*;
+import com.sckw.transport.model.KwtLogisticsOrderUnit;
+import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderNode;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
 import com.sckw.transport.model.param.*;
 import com.sckw.transport.repository.*;
 import lombok.extern.slf4j.Slf4j;
@@ -68,6 +71,8 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
 
+    @Autowired
+    LogisticsScoreFeignService logisticsScoreFeignService;
 
     /**
      * 模板方法 - 定义处理流程
@@ -297,31 +302,6 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
         log.info("司机{}最新{}条节点全部未超时,加分:{},节点ID:{}", waybillOrder.getDriverId(), continuousOnTimes, continuousOnTimeScore, nodeIds);
     }
 
-    /**
-     * 计算两个时间的分钟差值
-     * @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;
-    }
 
     /**
      * 修改司机评分
@@ -330,39 +310,31 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
      * @param driverId
      * @param score
      */
-    public void updateDriverScore(Long supeEntId, Long entId, Long driverId, Integer score) {
-        if (score == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "加分分数不能为空!");
-        }
-        //1. 查询司机的评分
-        RDriverScoreVo driverScore = remoteFleetService.findDriverScoreIdByEntIds(supeEntId, entId, driverId);
-        //2.司机没评分,初始化时间分数(企业分数)
-        if (driverScore == null) {
-            ContractLogisticsScoreVO logisticsScore = remoteContractService.findLogisticsScoreByEntId(supeEntId, entId);
-            if (logisticsScore == null) {
-                throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "修改司机分数,企业无评分!");
-            }
-            driverScore = remoteFleetService.addDriverScoreIdByEntIds(supeEntId, entId, driverId, logisticsScore.getScore());
-            if (driverScore == null) {
-                throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "初始化司机评分失败!");
-            }
-        }
-        //司机当前分数
-        BigDecimal currentScore = driverScore.getScore() == null || driverScore.getScore() .compareTo(BigDecimal.ZERO) < 0
-                ? BigDecimal.ZERO : driverScore.getScore();
-        //司机加减分数
-        BigDecimal scoreChange = BigDecimal.valueOf(score);
-
-        //3. 修改司机评分
-        RUpdateDriverScoreDto driverScoreDto = new RUpdateDriverScoreDto();
-        driverScoreDto.setId(driverScore.getDriverId());
-        driverScoreDto.setScore(currentScore.add(scoreChange));
-        remoteFleetService.updateDriverScoreIdByEntIds(driverScoreDto);
-
-        //4.新增司机评分明细
-
+    public void updateDriverScore(Long supeEntId, Long entId, Long driverId, Integer score, String action) {
+        RUpdateDriverScoreDto dto = new RUpdateDriverScoreDto();
+        dto.setSupEntId(supeEntId);
+        dto.setLogEntId(entId);
+        dto.setDriverId(driverId);
+        dto.setScore(BigDecimal.valueOf(score));
+        dto.setAction(action);
+
+        remoteFleetService.updateDriverScoreByEntId(dto);
     }
 
-
+    /**
+     * 更新企业评分
+     * @param waybillOrder
+     * @param supplierId
+     * @param score
+     */
+    public void updateLogEntScore(KwtWaybillOrder waybillOrder, Long supplierId, Integer score, String remark) {
+        LogisticsScoreDetailFeignDto detailDto = new LogisticsScoreDetailFeignDto();
+        detailDto.setProviderEntId(supplierId);
+        detailDto.setLogisticsEntId(waybillOrder.getEntId());
+        detailDto.setInfluenceBy(waybillOrder.getDriverId());
+        detailDto.setAction(remark);
+        detailDto.setScoreChange(BigDecimal.valueOf(score));
+        logisticsScoreFeignService.updateLogisticsScore(detailDto);
+    }
 }
 

+ 23 - 12
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java

@@ -4,6 +4,7 @@ package com.sckw.transport.handler;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.utils.DateUtils;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.order.api.model.OrderDetailVo;
 import com.sckw.order.api.model.UpdateActualAmountParam;
@@ -121,20 +122,28 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
         return "司机[" + waybillOrder.getDriverName() + "]取消订单";
     }
 
+    /**
+     * 校验司机是否违规取消运单
+     * @param param
+     * @param waybillOrder
+     */
     @Override
     protected void calculateAutoDispatchScore(WaybillOrderCancelParam param, KwtWaybillOrder waybillOrder) {
         if (true) {
             //先不执行自动派单逻辑
             return;
         }
-        // 获取司机行为规则配置(司机违规取消运单分钟数)
+        // 获取司机行为规则配置
         DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
-        Integer illegalCancelOrder = driverRulesVO.getIllegalCancelOrder();
-        Integer illegalCancelOrderMinutes = driverRulesVO.getIllegalCancelOrderMinutes();
-        if (illegalCancelOrderMinutes == null) {
-            log.warn("获取司机违规取消运单分钟数失败:企业{}的司机违规取消运单分钟数配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机违规取消运单分钟数配置为空!");
+        //分数
+        Integer cancelOrderScore = driverRulesVO.getIllegalCancelOrderScore();
+        //分钟数
+        Integer cancelOrderMinutes = driverRulesVO.getIllegalCancelOrderMinutes();
+        if (cancelOrderScore <= 0 || cancelOrderMinutes<= 0) {
+            log.warn("【司机违规取消运单】企业{}的司机违规取消运单分钟数/分数异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机违规取消运单】配置的分钟数/分数需大于0!");
         }
+
         //司机接单时间
         KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.PENDING_VEHICLE.getCode());
         Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
@@ -143,14 +152,16 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
         Date cancelNodeTime = cancelNode.getCreateTime() != null ? cancelNode.getCreateTime() : null;
 
         // 计算两个时间的分钟差
-        Long timeDiffMinutes = calculateTimeDiffMinutes(takingOrderTime, cancelNodeTime);
-        if (timeDiffMinutes > illegalCancelOrderMinutes.longValue()) {
-            log.info("司机取消运单超时!司机违规取消运单分钟数限制:" + illegalCancelOrderMinutes + "分钟,实际:" + timeDiffMinutes + "分钟");
+        Long timeDiffMinutes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, cancelNodeTime);
+        if (timeDiffMinutes > cancelOrderMinutes.longValue()) {
+            log.info("司机违规取消运单超时!司机违规取消运单分钟数限制:" + cancelOrderMinutes + "分钟,实际:" + timeDiffMinutes + "分钟");
             //1、更新司机分数(减分)
-            illegalCancelOrder = -Math.abs(illegalCancelOrder);
-            Long supplierId = getSupplierId(waybillOrder);
-            updateDriverScore(supplierId, waybillOrder.getEntId(), waybillOrder.getDriverId(), illegalCancelOrder);
+            cancelOrderScore = -Math.abs(cancelOrderScore);
+            Long supEntId = getSupplierId(waybillOrder);
+            updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), cancelOrderScore, "司机违规取消运单");
+
             //2、更新企业分数(减分)
+            updateLogEntScore(waybillOrder, supEntId, cancelOrderScore, "司机违规取消运单");
 
         }
 

+ 30 - 27
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -7,6 +7,7 @@ import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.utils.DateUtils;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
@@ -136,22 +137,24 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         //计算司机到达装货点是否超时
         Boolean isTimeOut = isTimeOut(waybillOrder.getEntId(), waybillOrder.getId());
         if (isTimeOut) {
-            //1、更新司机分数(减分)
             DriverConductRulesVO rulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
-            Integer notOnTimeArrive = rulesVO.getNotOnTimeArrive();
-            if (notOnTimeArrive == null) {
-                log.warn("该司机扣分失败,企业{}的司机超时到达装货点分数配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-                throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机超时到达装货点分数配置为空!");
+            Integer notOnTimeArrive = rulesVO.getNotOnTimeArriveScore();
+            if (notOnTimeArrive <= 0) {
+                log.warn("【司机未按时到场】司机扣分失败,企业{}的司机未按时到场分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+                throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】分数配置需大于0!");
             }
-            // 扣分:将配置值转为负数实现扣分
+            //1、更新司机分数(减分)
             notOnTimeArrive = -Math.abs(notOnTimeArrive);
-            Long supplierId = getSupplierId(waybillOrder);
-            updateDriverScore(supplierId, waybillOrder.getEntId(), waybillOrder.getDriverId(), notOnTimeArrive);
-            //2、更新企业分数(减分)
+            Long supEntId = getSupplierId(waybillOrder);
+            updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), notOnTimeArrive, "司机未按时到场");
 
+            //2、更新企业分数(减分)
+            updateLogEntScore(waybillOrder, supEntId, notOnTimeArrive, "司机未按时到场");
         }
     }
 
+
+
     /**
      * 司机到达装货点是否超时
      * @param entId
@@ -160,9 +163,9 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         // 获取自动派单系数配置(司机超时限制)
         TruckDispatchCoefficientVO truckDispatchVO = getAutoTruckDispatchByEntId(entId);
         Integer driverTimeout = truckDispatchVO.getDriverTimeoutLimit();
-        if (driverTimeout == null  || driverTimeout < 0) {
-            log.warn("企业{}的司机超时限制配置为空,运单ID:{}", entId,wOrderId);
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机超时限制配置不能小于0!");
+        if (driverTimeout <= 0) {
+            log.warn("【司机未按时到场】企业{}的司机超时限制配置异常,运单ID:{}", entId,wOrderId);
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】司机超时限制配置需大于0!");
         }
         //司机接单时间
         KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(wOrderId, CarWaybillV1Enum.PENDING_VEHICLE.getCode());
@@ -172,10 +175,10 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         Date comeIntoTime = comeIntoNode.getCreateTime() != null ? comeIntoNode.getCreateTime() : null;
 
         // 计算两个时间的分钟差
-        Long timeDiffMinutes = calculateTimeDiffMinutes(takingOrderTime, comeIntoTime);
+        Long timeDiffMinutes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, comeIntoTime);
         //超时
         if (timeDiffMinutes > driverTimeout.longValue()) {
-            log.info("司机到底装货点耗时超时!司机超时限制:" + driverTimeout + "分钟,实际:" + timeDiffMinutes + "分钟");
+            log.info("司机到耗时超时!司机超时限制:" + driverTimeout + "分钟,实际:" + timeDiffMinutes + "分钟");
             return true;
         }
         return false;
@@ -187,13 +190,15 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param waybillOrder
      */
     private void checkContinuousArriveTimes(KwtWaybillOrder waybillOrder) {
-        // 获取司机行为规则配置(连续按时到场次数)
+        // 获取司机行为规则配置
         DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
+        //连续按时到场分数
+        Integer continuousOnTimeScore = driverRulesVO.getContinuousOnTimeArriveScore();
+        //连续按时到场次数
         Integer continuousOnTimeArriveTimes = driverRulesVO.getContinuousOnTimeArriveTimes();
-        Integer continuousOnTimeArrive = driverRulesVO.getContinuousOnTimeArrive();
-        if (continuousOnTimeArriveTimes <= 0 || continuousOnTimeArrive <= 0) {
-            log.warn("该司机无需加分,企业{}的连续按时到场配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "连续按时到场次数和分数不能小于等于0!");
+        if (continuousOnTimeScore <= 0 || continuousOnTimeArriveTimes <= 0) {
+            log.warn("【司机连续按时到场】该司机无需加分,企业{}的连续按时到场次数/分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机连续按时到场】次数/分数需大于0!");
         }
 
         //查询该司机连续到达装货点的节点数据
@@ -207,8 +212,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         List<Long> nodeIds = new ArrayList<>();
         for (KwtWaybillOrderNode orderNode : waybillOrderNodeList) {
             //计算每次运单到达场地耗时时间
-            Boolean isTimeOut = isTimeOut(waybillOrder.getEntId(), orderNode.getWOrderId());
-            if (isTimeOut) {
+            if (isTimeOut(waybillOrder.getEntId(), orderNode.getWOrderId())){
                 log.info("司机{}存在超时情况,运单id:{}", orderNode.getDriverId(), orderNode.getWOrderId());
                 return;
             }
@@ -224,21 +228,20 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         }
         // 校验是否达到次数
         if (continuousCount < continuousOnTimeArriveTimes) {
-            log.info("司机{}连续按时到场次数{},未达到配置阈值{}", waybillOrder.getDriverId(), continuousCount, continuousOnTimeArriveTimes);
+            log.info("【司机连续按时到场】司机{}连续按时到场次数{},未达到配置阈值{}", waybillOrder.getDriverId(), continuousCount, continuousOnTimeArriveTimes);
             return;
         }
 
         //1. 给连续的10次节点数据打标
-        updateNode(waybillOrder, nodeIds, continuousOnTimeArriveTimes, continuousOnTimeArrive);
+        updateNode(waybillOrder, nodeIds, continuousOnTimeArriveTimes, continuousOnTimeScore);
 
         //2 .更新司机分数(加分)
-        Long supplierId = getSupplierId(waybillOrder);
-        updateDriverScore(supplierId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousOnTimeArrive);
+        Long supEntId = getSupplierId(waybillOrder);
+        updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousOnTimeScore, "司机连续按时到场");
 
         //3. 更新企业分数(加分)
+        updateLogEntScore(waybillOrder, supEntId, continuousOnTimeScore, "司机连续按时到场");
 
     }
 
-
-
 }

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

@@ -84,7 +84,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    protected void doBusiness(OrderCirculateTakingQueryParam param, KwtWaybillOrder waybill) {
+    public void doBusiness(OrderCirculateTakingQueryParam param, KwtWaybillOrder waybill) {
         KwtLogisticsOrder logOrder = BusinessContext.get("logOrder");
         OrderDetailVo tradeOrder = BusinessContext.get("tradeOrder");
         RDriverVo driver = BusinessContext.get("driver");

+ 35 - 30
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java

@@ -7,6 +7,7 @@ import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
 import com.sckw.core.utils.DistanceUtils;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
@@ -222,8 +223,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
         }
         Map<Integer, KwtWaybillOrderAddress> addressMap = addressList.stream()
                 .filter(addr -> addr.getAddressType() != null)
-                .collect(Collectors.toMap(KwtWaybillOrderAddress::getAddressType, Function.identity(),
-                        (x,y) ->x));
+                .collect(Collectors.toMap(KwtWaybillOrderAddress::getAddressType, Function.identity(), (x,y) ->x));
 
         //1. 校验司机是否虚假卸货
         checkFakeUnloadDistance(waybillOrder, addressMap);
@@ -250,13 +250,15 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
     @NotNull
     private void checkFakeUnloadDistance(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
         log.info("校验司机是否虚假卸货:waybillOrderId:{}", waybillOrder.getId());
-        // 获取司机行为规则配置(虚假卸货偏差距离)
+        // 获取司机行为规则配置
         DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
-        Integer fakeUnload = driverRulesVO.getFakeUnload();
+        //虚假卸货分数
+        Integer fakeUnloadScore = driverRulesVO.getFakeUnloadScore();
+        //虚假卸货偏离距离
         Integer distance = driverRulesVO.getFakeUnloadDistance();
-        if (distance < 0) {
-            log.warn("获取虚假卸货偏差距离失败:企业{}的虚假卸货偏差距离配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "虚假卸货偏差距离配置异常!");
+        if (fakeUnloadScore <= 0 || distance <= 0) {
+            log.warn("【虚假卸货】企业{}的虚假卸货配置分数/偏差距离异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【虚假卸货】配置分数/偏差距离需大于0!");
         }
         //运单应卸货地址
         KwtWaybillOrderAddress takeAddress = addressMap.getOrDefault(AddressTypeEnum.TAKE.getCode(), new KwtWaybillOrderAddress());
@@ -270,13 +272,13 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
                 Optional.ofNullable(unloadingNodes.getLng()).map(Double::valueOf).orElse(null),
                 Optional.ofNullable(unloadingNodes.getLat()).map(Double::valueOf).orElse(null));
         if (distanceKm > distance) {
-            log.info("【司机虚假卸货】运单ID={},卸货地址偏差={}KM",waybillOrder.getId(), distanceKm);
+            log.info("【虚假卸货】运单ID={},卸货地址偏差={}KM",waybillOrder.getId(), distanceKm);
             //1、更新司机分数(减分)
-            fakeUnload = -Math.abs(fakeUnload);
-            Long supplierId = getSupplierId(waybillOrder);
-            updateDriverScore(supplierId, waybillOrder.getEntId(), waybillOrder.getDriverId(), fakeUnload);
+            fakeUnloadScore = -Math.abs(fakeUnloadScore);
+            Long supEntId = getSupplierId(waybillOrder);
+            updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), fakeUnloadScore, "虚假卸货");
             //2、更新企业分数(减分)
-
+            updateLogEntScore(waybillOrder, supEntId, fakeUnloadScore, "虚假卸货");
         }
 
 
@@ -288,24 +290,25 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
      * @param addressMap  运单地址
      */
     protected void checkWaybillCompletionTimeout(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
-        //查询司机行为规则配置(严重超时倍数)
+        //查询司机行为规则配置
         DriverConductRulesVO rulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
         //严重超时倍数
         BigDecimal timeoutMultiple = rulesVO.getUnloadSeriousTimeoutMultiple();
         //严重超时分数
-        Integer timeoutScore = rulesVO.getUnloadSeriousTimeout();
+        Integer timeoutScore = rulesVO.getUnloadSeriousTimeoutScore();
         if (timeoutMultiple == null || timeoutMultiple.compareTo(BigDecimal.ZERO) <= 0 || timeoutScore <= 0) {
-            log.warn("该司机扣分失败,企业{}的司机严重超时数据配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机严重超时数据配置异常!");
+            log.warn("【卸货严重超时】扣分失败,企业{}的司机卸货严重超时倍数/分数配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【卸货严重超时】配置严重超时倍数/分数需大于0!");
         }
         //校验是否超时
         Boolean timeOut = isTimeOut(waybillOrder, addressMap, timeoutMultiple);
         if (timeOut) {
             //1、更新司机分数(减分)
             timeoutScore = -Math.abs(timeoutScore);
-            Long supplierId = getSupplierId(waybillOrder);
-            updateDriverScore(supplierId, waybillOrder.getEntId(), waybillOrder.getDriverId(), timeoutScore);
+            Long supEntId = getSupplierId(waybillOrder);
+            updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), timeoutScore, "卸货严重超时");
             //2、更新企业分数(减分)
+            updateLogEntScore(waybillOrder, supEntId, timeoutScore, "卸货严重超时");
         }
 
     }
@@ -319,7 +322,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
         log.info("校验司机运单完成是否超时:运单ID:{}", waybillOrder.getId());
         //运单总耗时
         Long orderTotalTimes = calOrderTotalTimes(waybillOrder);
-        //平台配置的运单单趟总耗时
+        //平台配置的单趟总耗时
         Integer singleTripTotalTimes = calSingleTripTotalTimes(waybillOrder, addressMap);
         //计算超时阈值
         BigDecimal threshold = timeoutMultiple.compareTo(BigDecimal.ZERO) == 0 ?
@@ -345,7 +348,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
         KwtWaybillOrderNode overOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.WAIT_UNLOADING.getCode());
         Date overOrderTime = overOrderNodes.getCreateTime() != null ? overOrderNodes.getCreateTime() : null;
         //运单总耗时(分钟)
-        Long orderTotalTimes = calculateTimeDiffMinutes(takingOrderTime, overOrderTime);
+        Long orderTotalTimes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, overOrderTime);
         log.info("司机完成运单总耗时:{}", orderTotalTimes);
         return orderTotalTimes;
     }
@@ -368,7 +371,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
         if (vehicleLoadingHours <= 0 || vehicleUnloadingHours <= 0 || vehicleAvgSpeed <= 0) {
             log.warn("企业{}的司机装货时长/卸货时长/平均行驶速度配置数据异常(装货:{},卸货:{},速度:{}),运单ID:{}",
                     waybillOrder.getEntId(), vehicleLoadingHours, vehicleUnloadingHours, vehicleAvgSpeed, waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机配置的装货时长/卸货时长/平均行驶速度需要0!");
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机配置的装货时长/卸货时长/平均行驶速度需要大于0!");
         }
         //查询运单装卸货地址
         KwtWaybillOrderAddress shipmentAddress = addressMap.getOrDefault(AddressTypeEnum.SHIPMENT.getCode(), new KwtWaybillOrderAddress());
@@ -400,7 +403,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
     }
 
     /**
-     * 校验连续准时卸货次数
+     * 校验连续准时卸货
      * @param waybillOrder
      */
     private void checkContinuousUnload(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
@@ -408,11 +411,11 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
         DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
         //连续卸货次数
         Integer continuousOnTimes = driverRulesVO.getContinuousOnTimeUnloadTimes();
-        //连续卸货加分分数
-        Integer continuousOnTimeUnload = driverRulesVO.getContinuousOnTimeUnload();
-        if (continuousOnTimes <= 0 || continuousOnTimeUnload <= 0) {
-            log.warn("该司机无需加分,企业{}的连续按时到场配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "连续准时卸货次数和分数不能小于等于0!");
+        //连续卸货分数
+        Integer continuousUnloadScore = driverRulesVO.getContinuousOnTimeUnloadScore();
+        if (continuousOnTimes <= 0 || continuousUnloadScore <= 0) {
+            log.warn("【连续准时卸货】该司机无需加分,企业{}的连续按时到场配置次数/分数异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【连续准时卸货】配置次数/分数需大于0!");
         }
 
         //查询该司机连续准时卸货的节点数据
@@ -446,12 +449,14 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
             return;
         }
         //1. 给连续的10次节点数据打标
-        updateNode(waybillOrder, nodeIds, continuousCount, continuousOnTimeUnload);
+        updateNode(waybillOrder, nodeIds, continuousCount, continuousUnloadScore);
 
         //2 .更新司机分数(加分)
-        Long supplierId = getSupplierId(waybillOrder);
-        updateDriverScore(supplierId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousOnTimeUnload);
+        Long supEntId = getSupplierId(waybillOrder);
+        updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousUnloadScore, "连续准时卸货");
+
         //3. 更新企业分数(加分)
+        updateLogEntScore(waybillOrder, supEntId, continuousUnloadScore, "连续准时卸货");
 
     }
 

+ 92 - 61
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -12,6 +12,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.sckw.contract.api.RemoteContractService;
+import com.sckw.contract.api.feign.LogisticsScoreFeignService;
+import com.sckw.contract.api.model.dto.req.LogisticsScoreDetailFeignDto;
 import com.sckw.contract.api.model.vo.TradeContractUnitDto;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
@@ -33,6 +35,7 @@ import com.sckw.core.web.response.HttpResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.DateUtil;
 import com.sckw.fleet.api.RemoteFleetService;
+import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.*;
 import com.sckw.mongo.model.SckwWaybillOrder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
@@ -159,6 +162,9 @@ public class KwtWaybillOrderV1Service {
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
 
+    @Autowired
+    LogisticsScoreFeignService logisticsScoreFeignService;
+
     /**
      * @param params 请求参数
      * @desc 统计
@@ -3750,20 +3756,19 @@ public class KwtWaybillOrderV1Service {
             return;
         }
         //单据错误驳回分数
-        Integer documentErrorMissing = driverRulesVO.getDocumentErrorMissing();
-        if (documentErrorMissing <= 0) {
-            log.warn("司机扣分失败:企业{}的司机单据错误/缺失分数配置需大于0,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机扣分失败,单据错误/缺失分数配置需大于0!");
+        Integer documentErrorScore = driverRulesVO.getDocumentErrorMissingScore();
+        if (documentErrorScore <= 0) {
+            log.warn("【单据错误/缺失】司机扣分失败:企业{}的司机单据错误/缺失分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【单据错误/缺失】司机扣分失败,单据错误/缺失分数配置需大于0!");
         }
 
         //1、更新司机分数(减分)
-        documentErrorMissing = -Math.abs(documentErrorMissing);
-
+        documentErrorScore = -Math.abs(documentErrorScore);
+        Long supEntId = getSupplierId(waybillOrder);
+        updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), documentErrorScore, "单据错误/缺失");
 
         //2、更新企业分数(减分)
-
-
-
+        updateLogEntScore(waybillOrder, supEntId, documentErrorScore, "单据错误/缺失");
 
     }
 
@@ -3773,14 +3778,13 @@ public class KwtWaybillOrderV1Service {
      */
     private void checkCompletionTimeout(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap,
                                         DriverConductRulesVO driverRulesVO) {
-        //单趟严重超时
+        //单趟严重超时
         BigDecimal timeoutMultiple = driverRulesVO.getUnloadSeriousTimeoutMultiple();
-
         //单趟严重超时分数
-        Integer timeoutScore = driverRulesVO.getUnloadSeriousTimeout();
-        if (timeoutScore <= 0) {
-            log.warn("司机扣分失败:企业{}的司机单趟严重超时分数配置需大于0,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机扣分失败,司机单趟严重超时分数配置需大于0!");
+        Integer timeoutScore = driverRulesVO.getUnloadSeriousTimeoutScore();
+        if (timeoutMultiple == null || timeoutMultiple.compareTo(BigDecimal.ZERO) <= 0 || timeoutScore <= 0) {
+            log.warn("【卸货严重超时】司机扣分失败:企业{}的司机卸货严重超时倍数/分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【卸货严重超时】司机扣分失败,司机卸货严重超时配置倍数/分数需大于0!");
         }
 
         //校验司机运单完成是否超时
@@ -3788,9 +3792,11 @@ public class KwtWaybillOrderV1Service {
         if (isTimeOut) {
             //1、更新司机分数(减分)
             timeoutScore = -Math.abs(timeoutScore);
-
+            Long supEntId = getSupplierId(waybillOrder);
+            updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), timeoutScore, "卸货严重超时");
 
             //2、更新企业分数(减分)
+            updateLogEntScore(waybillOrder, supEntId, timeoutScore, "卸货严重超时");
         }
     }
 
@@ -3803,7 +3809,7 @@ public class KwtWaybillOrderV1Service {
         log.info("校验司机运单完成是否超时:运单ID:{}", waybillOrder.getId());
         //运单总耗时
         Long orderTotalTimes = calOrderTotalTimes(waybillOrder);
-        //平台配置的运单单趟总耗时
+        //平台配置的单趟总耗时
         Integer singleTripTotalTimes = calSingleTripTotalTimes(waybillOrder, addressMap);
         //计算超时阈值
         BigDecimal threshold = timeoutMultiple.compareTo(BigDecimal.ZERO) == 0 ?
@@ -3835,7 +3841,7 @@ public class KwtWaybillOrderV1Service {
         }
         Date overOrderTime = overOrderNodes.getCreateTime() != null ? overOrderNodes.getCreateTime() : null;
         //运单总耗时(分钟)
-        Long orderTotalTimes = calculateTimeDiffMinutes(takingOrderTime, overOrderTime);
+        Long orderTotalTimes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, overOrderTime);
         log.info("司机完成运单总耗时:{}", orderTotalTimes);
         return orderTotalTimes;
     }
@@ -3892,31 +3898,6 @@ public class KwtWaybillOrderV1Service {
 
     }
 
-
-    /**
-     * 计算两个时间的分钟差值
-     * @param startTime 开始时间
-     * @param endTime 结束时间
-     * @return
-     */
-    private 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;
-    }
-
-
     /**
      * 校验司机连续准时卸货
      * @param waybillOrder
@@ -3930,10 +3911,10 @@ public class KwtWaybillOrderV1Service {
         //连续卸货次数
         Integer continuousOnTimes = driverRulesVO.getContinuousOnTimeUnloadTimes();
         //连续卸货加分分数
-        Integer continuousOnTimeUnload = driverRulesVO.getContinuousOnTimeUnload();
-        if (continuousOnTimes <= 0 || continuousOnTimeUnload <= 0) {
-            log.warn("该司机无需加分,获取连续准时卸货数据失败:企业{}的连续按时到场配置需大于0,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "连续准时卸货次数和分数需大于0!");
+        Integer continuousScore = driverRulesVO.getContinuousOnTimeUnloadScore();
+        if (continuousOnTimes <= 0 || continuousScore <= 0) {
+            log.warn("【连续准时卸货】获取连续准时卸货数据失败:企业{}的连续按时到场次数/分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【连续准时卸货】配置的次数/分数需大于0!");
         }
 
         //查询该司机连续审核通过节点数据
@@ -3967,12 +3948,14 @@ public class KwtWaybillOrderV1Service {
             return;
         }
         //1. 给连续的10次节点数据打标
-        updateNode(waybillOrder, nodeIds, continuousOnTimeUnload);
+        updateNode(waybillOrder, nodeIds, continuousScore);
 
         //2 .更新司机分数(加分)
-
+        Long supEntId = getSupplierId(waybillOrder);
+        updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousScore, "连续准时卸货");
 
         //3. 更新企业分数(加分)
+        updateLogEntScore(waybillOrder, supEntId, continuousScore, "连续准时卸货");
     }
 
     /**
@@ -3986,16 +3969,16 @@ public class KwtWaybillOrderV1Service {
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到司机行为规则数据!");
         }
         //连续卸货次数
-        Integer continuousAccurateUnloadTimes = driverRulesVO.getContinuousAccurateUnloadTimes();
+        Integer continuousUnloadTimes = driverRulesVO.getContinuousAccurateUnloadTimes();
         //连续卸货加分分数
-        Integer continuousAccurateUnload = driverRulesVO.getContinuousAccurateUnload();
-        if (continuousAccurateUnloadTimes <= 0 || continuousAccurateUnload <= 0) {
-            log.warn("该司机无需加分,获取连续准确填写卸货信息数据失败:企业{}的连续按时到场配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "连续准确填写卸货信息次数和分数不能小于等于0!");
+        Integer continuousScore = driverRulesVO.getContinuousAccurateUnloadScore();
+        if (continuousUnloadTimes <= 0 || continuousScore <= 0) {
+            log.warn("【连续准确填写卸货信息】企业{}的连续准确填写卸货信息配置的次数/分数异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【连续准确填写卸货信息】配置的次数/分数需大于0!");
         }
 
         //查询该司机连续审核通过节点数据
-        List<KwtWaybillOrderNode> waybillOrderNodeList = getWaybillOrderNodesByStatus(waybillOrder, continuousAccurateUnloadTimes, CarWaybillV1Enum.WAIT_UNLOADING);
+        List<KwtWaybillOrderNode> waybillOrderNodeList = getWaybillOrderNodesByStatus(waybillOrder, continuousUnloadTimes, CarWaybillV1Enum.WAIT_UNLOADING);
         if (waybillOrderNodeList == null)  {
             return;
         }
@@ -4007,24 +3990,26 @@ public class KwtWaybillOrderV1Service {
             continuousCount++;
             qualifiedNodeIds.add(orderNode.getId());
             // 达到10次,返回最新的10条ID
-            if (continuousCount >= continuousAccurateUnloadTimes) {
+            if (continuousCount >= continuousUnloadTimes) {
                 // 截断前10条
-                nodeIds = qualifiedNodeIds.subList(0, continuousAccurateUnloadTimes);
+                nodeIds = qualifiedNodeIds.subList(0, continuousUnloadTimes);
                 break;
             }
         }
         // 校验是否达到次数
-        if (continuousCount < continuousAccurateUnloadTimes) {
-            log.info("司机{}连续准确填写卸货信息次数{},未达到配置阈值{}", waybillOrder.getDriverId(), continuousCount, continuousAccurateUnloadTimes);
+        if (continuousCount < continuousUnloadTimes) {
+            log.info("司机{}连续准确填写卸货信息次数{},未达到配置阈值{}", waybillOrder.getDriverId(), continuousCount, continuousUnloadTimes);
             return;
         }
         //1. 给连续的10次节点数据打标
-        updateNode(waybillOrder, nodeIds, continuousAccurateUnloadTimes);
+        updateNode(waybillOrder, nodeIds, continuousScore);
 
         //2 .更新司机分数(加分)
-
+        Long supEntId = getSupplierId(waybillOrder);
+        updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousScore, "连续准确填写卸货信息");
 
         //3. 更新企业分数(加分)
+        updateLogEntScore(waybillOrder, supEntId, continuousScore, "连续准确填写卸货信息");
     }
 
     /**
@@ -4062,6 +4047,52 @@ public class KwtWaybillOrderV1Service {
         log.info("司机{}连续执行运单节点,加分:{},节点ID:{}", waybillOrder.getDriverId(), continuousOnTimeScore, JSON.toJSONString(nodeIds));
     }
 
+    // 查询供应商id
+    protected Long getSupplierId(KwtWaybillOrder waybillOrder) {
+        if (waybillOrder == null) {
+            return 0L;
+        }
+        //查询订单托运单位(自动派单订单承运单位只为供应商)
+        KwtLogisticsOrderUnit logisticsOrderUnit = kwtLogisticsOrderUnitRepository.queryByLOrderIdAndUnitType(waybillOrder.getLOrderId(), 1);
+        if (logisticsOrderUnit == null || logisticsOrderUnit.getEntId() == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ENT, "未找到关联的物流订单托运企业(供应商)!");
+        }
+        return logisticsOrderUnit.getEntId();
+    }
+
+    /**
+     * 修改司机评分
+     * @param supeEntId
+     * @param entId
+     * @param driverId
+     * @param score
+     */
+    public void updateDriverScore(Long supeEntId, Long entId, Long driverId, Integer score, String action) {
+        RUpdateDriverScoreDto dto = new RUpdateDriverScoreDto();
+        dto.setSupEntId(supeEntId);
+        dto.setLogEntId(entId);
+        dto.setDriverId(driverId);
+        dto.setScore(BigDecimal.valueOf(score));
+        dto.setAction(action);
+        remoteFleetService.updateDriverScoreByEntId(dto);
+    }
+
+    /**
+     * 更新企业评分
+     * @param waybillOrder
+     * @param supplierId
+     * @param score
+     */
+    public void updateLogEntScore(KwtWaybillOrder waybillOrder, Long supplierId, Integer score, String remark) {
+        LogisticsScoreDetailFeignDto detailDto = new LogisticsScoreDetailFeignDto();
+        detailDto.setProviderEntId(supplierId);
+        detailDto.setLogisticsEntId(waybillOrder.getEntId());
+        detailDto.setInfluenceBy(waybillOrder.getDriverId());
+        detailDto.setAction(remark);
+        detailDto.setScoreChange(BigDecimal.valueOf(score));
+        logisticsScoreFeignService.updateLogisticsScore(detailDto);
+    }
+
 
     private void noticeTraderOrder(KwtLogisticsOrder kwtLogisticsOrder, KwtLogisticsOrder kwtLogistics) {
 

+ 9 - 9
sql/2025/12/01/2025_12_04_donglang.sql

@@ -3,19 +3,19 @@ create table kwf_driver_conduct_rules
 (
     id                               bigint         NOT NULL AUTO_INCREMENT COMMENT '主键',
     ent_id                           bigint         NOT NULL DEFAULT '-1'comment '企业id',
-    unload_serious_timeout           int            NOT NULL DEFAULT '-1'comment '单趟严重超时(违规次数/扣分)',
+    unload_serious_timeout_score     int            NOT NULL DEFAULT '-1'comment '单趟严重超时分数',
     unload_serious_timeout_multiple  decimal(8,2)   NOT NULL DEFAULT '00.00' comment '单趟严重超时倍数',
-    document_error_missing           int            NOT NULL DEFAULT '-1'comment '单据错误/缺失(违规次数/扣分)',
-    not_on_time_arrive               int            NOT NULL DEFAULT '-1'comment '未按时到场(违规次数/扣分)',
-    fake_unload                      int            NOT NULL DEFAULT '-1'comment '虚假卸货(违规次数/扣分)',
+    document_error_missing_score     int            NOT NULL DEFAULT '-1'comment '单据错误/缺失分数',
+    not_on_time_arrive_score         int            NOT NULL DEFAULT '-1'comment '未按时到场分数',
+    fake_unload_score                int            NOT NULL DEFAULT '-1'comment '虚假卸货分数',
     fake_unload_distance             int            NOT NULL DEFAULT '-1'comment '虚假卸货偏差距离',
-    illegal_cancel_order             int            NOT NULL DEFAULT '-1'comment '违规取消运单(违规次数/扣分)',
+    illegal_cancel_order_score       int            NOT NULL DEFAULT '-1'comment '违规取消运单分数',
     illegal_cancel_order_minutes     int            NOT NULL DEFAULT '-1'comment '违规取消运单分钟数',
-    continuous_on_time_arrive        int            NOT NULL DEFAULT '-1'comment '连续按时到场(达标次数/加分)',
+    continuous_on_time_arrive_score  int            NOT NULL DEFAULT '-1'comment '连续按时到场分数',
     continuous_on_time_arrive_times  int            NOT NULL DEFAULT '-1'comment '连续按时到场次数',
-    continuous_on_time_unload        int            NOT NULL DEFAULT '-1'comment '连续准时卸货(达标次数/加分)',
+    continuous_on_time_unload_score  int            NOT NULL DEFAULT '-1'comment '连续准时卸货分数',
     continuous_on_time_unload_times  int            NOT NULL DEFAULT '-1'comment '连续准时卸货次数',
-    continuous_accurate_unload       int            NOT NULL DEFAULT '-1'comment '连续准确填写卸货信息(达标次数/加分)',
+    continuous_accurate_unload_score int            NOT NULL DEFAULT '-1'comment '连续准确填写卸货信息分数',
     continuous_accurate_unload_times int            NOT NULL DEFAULT '-1'comment '连续准确填写卸货信息次数',
     create_time                     datetime        NOT NULL default CURRENT_TIMESTAMP comment '创建时间',
     update_time                     datetime        NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间',
@@ -40,7 +40,7 @@ create table kwf_driver_conduct_rules_log
 ) comment '司机行为规则日志表';
 
 
-create table kwt_truck_dispatch_coefficient
+create table kwf_truck_dispatch_coefficient
 (
     id                              bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
     ent_id                          bigint          NOT NULL DEFAULT '-1' comment '企业id',