|
@@ -0,0 +1,264 @@
|
|
|
|
|
+package com.sckw.fleet.service;
|
|
|
|
|
+
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
|
+import com.alibaba.fastjson.TypeReference;
|
|
|
|
|
+import com.sckw.core.utils.CollectionUtils;
|
|
|
|
|
+import com.sckw.core.utils.IdWorker;
|
|
|
|
|
+import com.sckw.core.web.context.LoginUserHolder;
|
|
|
|
|
+import com.sckw.fleet.api.model.dto.UpdateDriverScoreDto;
|
|
|
|
|
+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 lombok.AllArgsConstructor;
|
|
|
|
|
+import lombok.Data;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @Author: tangyishan
|
|
|
|
|
+ * @CreateTime: 2025-12-11 15:05
|
|
|
|
|
+ * @Description: 司机评分服务
|
|
|
|
|
+ */
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+@Service
|
|
|
|
|
+public class KwfDriverScoreService {
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private KwfDriverMapper kwfDriverMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private KwfDriverScoreMapper kwfDriverScoreMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private KwfDriverScoreDetailMapper kwfDriverScoreDetailMapper;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 更新司机评分
|
|
|
|
|
+ */
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public void update(UpdateDriverScoreDto updateDriverScoreDto) {
|
|
|
|
|
+ log.info("进入KwfDriverScoreService.updateScore()方法,修改司机评分参数为:{}", JSON.toJSONString(updateDriverScoreDto));
|
|
|
|
|
+ //查询出当前物流企业的所有司机
|
|
|
|
|
+ List<KwfDriver> drivers= kwfDriverMapper.findListByEntId(updateDriverScoreDto.getLogisticsEntId());
|
|
|
|
|
+ if(CollectionUtils.isEmpty(drivers)){
|
|
|
|
|
+ //无司机,直接返回
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<Long, KwfDriver> driversMap = drivers.stream().collect(Collectors.toMap(KwfDriver::getId, v -> v));
|
|
|
|
|
+ //查询指定供应商,指定物流的下的所有司机的评分
|
|
|
|
|
+ KwfDriverScore driverScoreDto = new KwfDriverScore();
|
|
|
|
|
+ driverScoreDto.setProviderEntId(updateDriverScoreDto.getProviderEntId());
|
|
|
|
|
+ driverScoreDto.setLogisticsEntId(updateDriverScoreDto.getLogisticsEntId());
|
|
|
|
|
+ List<KwfDriverScore> kwfDriverScores = kwfDriverScoreMapper.selectKwfDriverScoreList(driverScoreDto).stream().filter(v-> driversMap.containsKey(v.getDriverId())).toList();
|
|
|
|
|
+ //对未进行评分初始化的司机进行初始化
|
|
|
|
|
+ KwfDriverScoreAndDetail kwfDriverScoreAndDetail = initDriverScore(updateDriverScoreDto, driversMap, kwfDriverScores);
|
|
|
|
|
+ //将刚初始化的评分记录放入司机评分集合中
|
|
|
|
|
+ if(kwfDriverScoreAndDetail != null){
|
|
|
|
|
+ kwfDriverScores.addAll(kwfDriverScoreAndDetail.getDriverScores());
|
|
|
|
|
+ }
|
|
|
|
|
+ //
|
|
|
|
|
+ //根据不同的操作类型调用不同的更新方法
|
|
|
|
|
+ if(Objects.equals(updateDriverScoreDto.getOperatorType(), 1)){
|
|
|
|
|
+// initDriverScore(updateDriverScoreDto, driversMap,driverScoreMap);
|
|
|
|
|
+ }else if(Objects.equals(updateDriverScoreDto.getOperatorType(), 2)){
|
|
|
|
|
+ //修改司机评分
|
|
|
|
|
+ updateDriverScore(updateDriverScoreDto, driversMap,kwfDriverScores);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ //重置司机评分
|
|
|
|
|
+ resetDriverScore(updateDriverScoreDto, driversMap,kwfDriverScores);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 初始化司机评分
|
|
|
|
|
+ */
|
|
|
|
|
+ private KwfDriverScoreAndDetail initDriverScore(UpdateDriverScoreDto updateDriverScoreDto, Map<Long, KwfDriver> driversMap,List<KwfDriverScore> kwfDriverScores){
|
|
|
|
|
+ List<Long> driverIds = kwfDriverScores.stream().map(KwfDriverScore::getDriverId).toList();
|
|
|
|
|
+ //找出没有评分记录的司机
|
|
|
|
|
+ List<KwfDriver> noScoreDrivers = driversMap.values().stream().filter(driver -> !driverIds.contains(driver.getId())).toList();
|
|
|
|
|
+ //所有司机均有评分,继承之前的评分,无需进行初始化
|
|
|
|
|
+ if(noScoreDrivers.isEmpty()){
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ //构建司机评分记录和评分明细集合
|
|
|
|
|
+ KwfDriverScoreAndDetail kwfDriverScoreAndDetail = buildDriverScoreInitRecord(updateDriverScoreDto, noScoreDrivers);
|
|
|
|
|
+ //批量插入评分记录
|
|
|
|
|
+ kwfDriverScoreMapper.insertBatch(kwfDriverScoreAndDetail.getDriverScores());
|
|
|
|
|
+ //批量插入评分明细
|
|
|
|
|
+ kwfDriverScoreDetailMapper.insertBatch(kwfDriverScoreAndDetail.getDriverScoreDetails());
|
|
|
|
|
+ return kwfDriverScoreAndDetail;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 修改司机评分
|
|
|
|
|
+ */
|
|
|
|
|
+ private void updateDriverScore(UpdateDriverScoreDto updateDriverScoreDto, Map<Long, KwfDriver> driversMap,List<KwfDriverScore> kwfDriverScores){
|
|
|
|
|
+ //driversMap-物流企业下所有司机,kwfDriverScores-指定供应商,指定物流的所有司机的评分
|
|
|
|
|
+ //深拷贝出新的司机评分集合
|
|
|
|
|
+ List<KwfDriverScore> kwfDriverScoresNew = JSON.parseObject(JSON.toJSONString(kwfDriverScores), new TypeReference<>() {});
|
|
|
|
|
+ //给所有司机进行改分,收集超额的分
|
|
|
|
|
+ BigDecimal min = new BigDecimal("0.00");
|
|
|
|
|
+ BigDecimal max = new BigDecimal("100.00");
|
|
|
|
|
+ BigDecimal exceedScore = new BigDecimal("0.00");
|
|
|
|
|
+ for (KwfDriverScore driverScore : kwfDriverScoresNew) {
|
|
|
|
|
+ BigDecimal score = driverScore.getScore();
|
|
|
|
|
+ BigDecimal resultScore = score.add(updateDriverScoreDto.getScoreChange());
|
|
|
|
|
+ if(resultScore.compareTo(min) < 0){
|
|
|
|
|
+ exceedScore = exceedScore.add(resultScore);
|
|
|
|
|
+ driverScore.setScore(new BigDecimal("0.00"));
|
|
|
|
|
+ }else if(resultScore.compareTo(max)>0){
|
|
|
|
|
+ exceedScore = exceedScore.add(resultScore.subtract(max));
|
|
|
|
|
+ driverScore.setScore(new BigDecimal("100.00"));
|
|
|
|
|
+ }else {
|
|
|
|
|
+ driverScore.setScore(resultScore);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ //有超额的分,依次分配或扣减分数最低或做高的司机评分到平均分
|
|
|
|
|
+ if(exceedScore.compareTo(BigDecimal.ZERO) != 0){
|
|
|
|
|
+ //默认按照评分升序排序,如果是减分操作,则按照降序排序
|
|
|
|
|
+ Comparator<KwfDriverScore> comparator = Comparator.comparing(KwfDriverScore::getScore);
|
|
|
|
|
+ if(updateDriverScoreDto.getScoreChange().compareTo(BigDecimal.ZERO) < 0){
|
|
|
|
|
+ comparator = comparator.reversed();
|
|
|
|
|
+ }
|
|
|
|
|
+ kwfDriverScoresNew = kwfDriverScoresNew.stream().sorted(comparator).toList();
|
|
|
|
|
+ //分配超额的分,加分操作依次给最低的司机加到分均分,减分操作依次给最高分的司机减到分均分
|
|
|
|
|
+ for (KwfDriverScore kwfDriverScore : kwfDriverScoresNew) {
|
|
|
|
|
+ //超额的分已经分配完,退出循环
|
|
|
|
|
+ if(exceedScore.compareTo(BigDecimal.ZERO) == 0){
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ //计算当前司机最大可改的分
|
|
|
|
|
+ BigDecimal changeMaxScore = updateDriverScoreDto.getLogisticsEntScore().subtract(kwfDriverScore.getScore());
|
|
|
|
|
+ //计算司机实际可改的分
|
|
|
|
|
+ BigDecimal changeScore = exceedScore.abs().compareTo(changeMaxScore.abs()) < 0 ? exceedScore : changeMaxScore;
|
|
|
|
|
+ kwfDriverScore.setScore(kwfDriverScore.getScore().add(changeScore));
|
|
|
|
|
+ //计算剩余可分配的分
|
|
|
|
|
+ exceedScore = exceedScore.subtract(changeScore);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ //构建司机评分记录和评分明细集合
|
|
|
|
|
+ KwfDriverScoreAndDetail kwfDriverScoreAndDetail = buildDriverScoreUpdateRecord(updateDriverScoreDto, driversMap, kwfDriverScores, kwfDriverScoresNew);
|
|
|
|
|
+ //批量更新评分记录
|
|
|
|
|
+ kwfDriverScoreMapper.updateScoreBatch(kwfDriverScoreAndDetail.getDriverScores());
|
|
|
|
|
+ //批量插入评分明细
|
|
|
|
|
+ kwfDriverScoreDetailMapper.insertBatch(kwfDriverScoreAndDetail.getDriverScoreDetails());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 重置司机评分
|
|
|
|
|
+ */
|
|
|
|
|
+ private void resetDriverScore(UpdateDriverScoreDto updateDriverScoreDto, Map<Long, KwfDriver> driversMap,List<KwfDriverScore> kwfDriverScores){
|
|
|
|
|
+ //driversMap-物流企业下所有司机,kwfDriverScores-指定供应商,指定物流的所有司机的评分
|
|
|
|
|
+ //构建司机评分记录和评分明细集合
|
|
|
|
|
+ KwfDriverScoreAndDetail kwfDriverScoreAndDetail = buildDriverScoreResetRecord(updateDriverScoreDto, driversMap, kwfDriverScores);
|
|
|
|
|
+ //批量更新评分记录
|
|
|
|
|
+ kwfDriverScoreMapper.updateScoreBatch(kwfDriverScoreAndDetail.getDriverScores());
|
|
|
|
|
+ //批量插入评分明细
|
|
|
|
|
+ kwfDriverScoreDetailMapper.insertBatch(kwfDriverScoreAndDetail.getDriverScoreDetails());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private KwfDriverScoreAndDetail buildDriverScoreInitRecord(UpdateDriverScoreDto updateDriverScoreDto,List<KwfDriver> drivers){
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+ //构建司机评分记录集合
|
|
|
|
|
+ List<KwfDriverScore> driverScores = new ArrayList<>();
|
|
|
|
|
+ List<KwfDriverScoreDetail> driverScoreDetails = new ArrayList<>();
|
|
|
|
|
+ IdWorker idWorker = new IdWorker(1L);
|
|
|
|
|
+ for (KwfDriver driver : drivers) {
|
|
|
|
|
+ long scoreId = idWorker.nextId();
|
|
|
|
|
+ //构建司机评分记录
|
|
|
|
|
+ KwfDriverScore driverScore = new KwfDriverScore();
|
|
|
|
|
+ driverScore.setId(scoreId);
|
|
|
|
|
+ driverScore.setProviderEntId(updateDriverScoreDto.getProviderEntId());
|
|
|
|
|
+ driverScore.setLogisticsEntId(updateDriverScoreDto.getLogisticsEntId());
|
|
|
|
|
+ driverScore.setDriverId(driver.getId());
|
|
|
|
|
+ driverScore.setProviderEntName(updateDriverScoreDto.getProviderEntName());
|
|
|
|
|
+ driverScore.setScore(updateDriverScoreDto.getLogisticsEntScore());
|
|
|
|
|
+ driverScore.setCreateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+ driverScore.setCreateTime(now);
|
|
|
|
|
+ driverScore.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+ driverScore.setUpdateTime(now);
|
|
|
|
|
+ driverScores.add(driverScore);
|
|
|
|
|
+ //构建司机评分明细
|
|
|
|
|
+ KwfDriverScoreDetail scoreDetail = buildDriverScoreDetail(updateDriverScoreDto, driverScore, driver, new BigDecimal("0.00"));
|
|
|
|
|
+ driverScoreDetails.add(scoreDetail);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return new KwfDriverScoreAndDetail(driverScores, driverScoreDetails);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private KwfDriverScoreAndDetail buildDriverScoreUpdateRecord(UpdateDriverScoreDto updateDriverScoreDto,Map<Long, KwfDriver> driversMap,List<KwfDriverScore> kwfDriverScores,List<KwfDriverScore> kwfDriverScoresNew){
|
|
|
|
|
+ //原评分记录集合
|
|
|
|
|
+ Map<Long, KwfDriverScore> originDriverScoreMap = kwfDriverScores.stream().collect(Collectors.toMap(KwfDriverScore::getId, v -> v));
|
|
|
|
|
+ //构建司机评分记录集合
|
|
|
|
|
+ List<KwfDriverScoreDetail> driverScoreDetails = new ArrayList<>();
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+ for (KwfDriverScore driverScore : kwfDriverScoresNew) {
|
|
|
|
|
+ //更新评分记录更新信息
|
|
|
|
|
+ driverScore.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+ driverScore.setUpdateTime(now);
|
|
|
|
|
+ //构建司机评分明细信息
|
|
|
|
|
+ KwfDriverScore originDriverScore = originDriverScoreMap.get(driverScore.getDriverId());
|
|
|
|
|
+ KwfDriverScoreDetail scoreDetail = buildDriverScoreDetail(updateDriverScoreDto, driverScore, driversMap.get(driverScore.getDriverId()), originDriverScore.getScore());
|
|
|
|
|
+ driverScoreDetails.add(scoreDetail);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return new KwfDriverScoreAndDetail(kwfDriverScoresNew, driverScoreDetails);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private KwfDriverScoreAndDetail buildDriverScoreResetRecord(UpdateDriverScoreDto updateDriverScoreDto,Map<Long, KwfDriver> driversMap,List<KwfDriverScore> kwfDriverScores){
|
|
|
|
|
+ //构建司机评分记录集合
|
|
|
|
|
+ List<KwfDriverScoreDetail> driverScoreDetails = new ArrayList<>();
|
|
|
|
|
+ for (KwfDriverScore driverScore : kwfDriverScores) {
|
|
|
|
|
+ BigDecimal originDriverScore = driverScore.getScore();
|
|
|
|
|
+ //更新评分记录更新信息
|
|
|
|
|
+ driverScore.setScore(updateDriverScoreDto.getLogisticsEntScore());
|
|
|
|
|
+ driverScore.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+ driverScore.setUpdateTime(new Date());
|
|
|
|
|
+ //构建司机评分明细信息
|
|
|
|
|
+ KwfDriverScoreDetail scoreDetail = buildDriverScoreDetail(updateDriverScoreDto, driverScore, driversMap.get(driverScore.getDriverId()), originDriverScore);
|
|
|
|
|
+ driverScoreDetails.add(scoreDetail);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return new KwfDriverScoreAndDetail(kwfDriverScores, driverScoreDetails);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ private KwfDriverScoreDetail buildDriverScoreDetail(UpdateDriverScoreDto updateDriverScoreDto,KwfDriverScore driverScore,KwfDriver driver,BigDecimal originDriverScore){
|
|
|
|
|
+ IdWorker idWorker = new IdWorker(1L);
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+ //构建司机评分明细信息
|
|
|
|
|
+ KwfDriverScoreDetail scoreDetail = new KwfDriverScoreDetail();
|
|
|
|
|
+ scoreDetail.setId(idWorker.nextId());
|
|
|
|
|
+ scoreDetail.setScoreId(driverScore.getId());
|
|
|
|
|
+ if(driver != null){
|
|
|
|
|
+ scoreDetail.setDriverId(driver.getId());
|
|
|
|
|
+ scoreDetail.setDriverName(driver.getName());
|
|
|
|
|
+ }
|
|
|
|
|
+ scoreDetail.setAction(updateDriverScoreDto.getAction());
|
|
|
|
|
+ BigDecimal scoreChange = driverScore.getScore().subtract(originDriverScore);
|
|
|
|
|
+ scoreDetail.setScoreChange(scoreChange);
|
|
|
|
|
+ scoreDetail.setScore(driverScore.getScore());
|
|
|
|
|
+ scoreDetail.setCreateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+ scoreDetail.setCreateTime(now);
|
|
|
|
|
+ scoreDetail.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+ scoreDetail.setUpdateTime(now);
|
|
|
|
|
+ return scoreDetail;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Data
|
|
|
|
|
+ @AllArgsConstructor
|
|
|
|
|
+ public static class KwfDriverScoreAndDetail{
|
|
|
|
|
+ List<KwfDriverScore> driverScores;
|
|
|
|
|
+ List<KwfDriverScoreDetail> driverScoreDetails;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|