diff --git a/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/examine/detail/ExamineDetailController.java b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/examine/detail/ExamineDetailController.java index 7d09176..2c8cafb 100644 --- a/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/examine/detail/ExamineDetailController.java +++ b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/examine/detail/ExamineDetailController.java @@ -1,24 +1,24 @@ package tech.unissense.pms.web.controller.business.examine.detail; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; import org.springframework.beans.factory.annotation.Autowired; import tech.unissense.pms.business.examine.config.domain.ExamineConfig; +import tech.unissense.pms.business.examine.config.enums.ReviewTypeEnum; import tech.unissense.pms.business.examine.config.service.ExamineConfigService; import tech.unissense.pms.business.examine.detail.domain.ExamineDetail; import tech.unissense.pms.business.examine.detail.dto.ExamineDetailRequestDto; import tech.unissense.pms.business.examine.detail.dto.ExamineDto; import tech.unissense.pms.business.examine.detail.service.ExamineDetailService; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import tech.unissense.pms.business.examine.user.domain.ExamineUser; import tech.unissense.pms.business.examine.user.service.ExamineUserService; import tech.unissense.pms.common.core.controller.BaseController; import tech.unissense.pms.common.core.domain.AjaxResult; -import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * 考核人员详情表(ExamineDetail)表控制层 @@ -65,15 +65,19 @@ public class ExamineDetailController extends BaseController { @GetMapping public AjaxResult list(ExamineDetailRequestDto dto) { Assert.notNull(dto.getExamineTaskId(), "考核任务ID不能为空"); - Assert.notNull(dto.getExamineId(), "考核ID不能为空"); +// Assert.notNull(dto.getExamineId(), "考核ID不能为空"); Assert.notEmpty(dto.getReviewType(), "任务类型不能为空"); - + if (dto.getExamineId() == null) { + Assert.notNull(dto.getUserId(), "用户ID不能为空"); + ExamineUser examineUser = examineUserService.queryByTaskIdAndUserId(dto.getExamineTaskId(), dto.getUserId()); + dto.setExamineId(examineUser.getId()); + } + Assert.notNull(dto.getExamineId(), "考核ID不能为空"); + //查询配置 ExamineConfig examineConfig = new ExamineConfig(); examineConfig.setExamineTaskId(dto.getExamineTaskId()); examineConfig.setReviewType(dto.getReviewType()); List configList = configService.list(examineConfig); - - return AjaxResult.success(examineDetailService.formatData(configList,dto)); } @@ -87,13 +91,22 @@ public class ExamineDetailController extends BaseController { public AjaxResult addBatch(@RequestBody ExamineDto examineDto) { Assert.notEmpty(examineDto.getExamineDetailList(), "考核详情不能为空"); Assert.notNull(examineDto.getExamineId(), "考核ID不能为空"); + Assert.notNull(examineDto.getTaskId(), "考核任务ID不能为空"); + Assert.notNull(examineDto.getManageScore(), "考核分数不能为空"); for (ExamineDetail examineDetail : examineDto.getExamineDetailList()) { examineDetail.setExamineId(examineDto.getExamineId()); } + Map scoreMap = examineDetailService.calculateScoreByDetail(examineDto.getTaskId() + , examineDto.getExamineDetailList(), ReviewTypeEnum.MANAGE); + BigDecimal bigDecimal = scoreMap.get(examineDto.getExamineId()); + if (examineDto.getManageScore().compareTo(bigDecimal) != 0) { + return AjaxResult.error("总分与明细分数不一致"); + } + //保存detail详情 this.examineDetailService.insertBatch(examineDto.getExamineDetailList()); //保存总体评价 - examineUserService.updateContent(examineDto); + examineUserService.access(examineDto); return AjaxResult.success(); } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/config/domain/ExamineConfig.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/config/domain/ExamineConfig.java index 5aba115..88682fe 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/config/domain/ExamineConfig.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/config/domain/ExamineConfig.java @@ -3,6 +3,7 @@ package tech.unissense.pms.business.examine.config.domain; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; /** * 考核配置表(ExamineConfig)实体类 @@ -34,7 +35,7 @@ public class ExamineConfig implements Serializable { /** * 权重 */ - private Double weight; + private BigDecimal weight; /** * 考核id */ diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/config/enums/ReviewTypeEnum.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/config/enums/ReviewTypeEnum.java new file mode 100644 index 0000000..0c1799e --- /dev/null +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/config/enums/ReviewTypeEnum.java @@ -0,0 +1,36 @@ +package tech.unissense.pms.business.examine.config.enums; + +import lombok.Data; +import lombok.Getter; + +/** + * @author : ch + * @version : 1.0 + * @ClassName : ReviewTypeEnum + * @Description : + * @DATE : Created in 17:36 2025/1/2 + *
       Copyright: Copyright(c) 2025     
+ *
       Company :   	紫光汇智信息技术有限公司		           
+ * Modification History: + * Date Author Version Discription + * -------------------------------------------------------------------------- + * 2025/1/2 ch 1.0 Why & What is modified: <修改原因描述> * + */ +@Getter +public enum ReviewTypeEnum { + + MANAGE("0","管理"), + SELF("1","管理"), + SYSTEM("2","管理"), + ALL("-1","管理"), + ; + private final String type; + private final String remark; + + + + ReviewTypeEnum(String type, String remark) { + this.type = type; + this.remark = remark; + } +} diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/domain/ExamineDetail.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/domain/ExamineDetail.java index c9ab9f7..253529f 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/domain/ExamineDetail.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/domain/ExamineDetail.java @@ -3,6 +3,7 @@ package tech.unissense.pms.business.examine.detail.domain; import lombok.Data; import java.io.Serializable; +import java.util.List; /** * 考核人员详情表(ExamineDetail)实体类 @@ -19,6 +20,7 @@ public class ExamineDetail implements Serializable { * 考核id */ private Integer examineId; + private List examineIdList; /** * 考核分数(原始分数) */ @@ -33,6 +35,8 @@ public class ExamineDetail implements Serializable { private Integer configId; + private Integer userId; + private Integer taskId; } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDetailRequestDto.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDetailRequestDto.java index 1bc8869..6cba7e5 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDetailRequestDto.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDetailRequestDto.java @@ -19,5 +19,6 @@ import lombok.Data; public class ExamineDetailRequestDto { private Integer examineTaskId; private Integer examineId; + private Integer userId; private String reviewType; } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDto.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDto.java index 0503a51..cef8656 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDto.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/dto/ExamineDto.java @@ -3,6 +3,7 @@ package tech.unissense.pms.business.examine.detail.dto; import lombok.Data; import tech.unissense.pms.business.examine.detail.domain.ExamineDetail; +import java.math.BigDecimal; import java.util.List; /** @@ -23,4 +24,14 @@ public class ExamineDto { private List examineDetailList; private Integer examineId; private String judgeContent; + private BigDecimal manageScore; + private Integer taskId; + /** + * 主管评分状态 0:待完成 1:已完成 + */ + private String examineStatus; + /** + * 个人评分状态 0:待完成 1:已完成 + */ + private String examineStatusSelf; } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/ExamineDetailService.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/ExamineDetailService.java index d215cf5..c2cf60b 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/ExamineDetailService.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/ExamineDetailService.java @@ -1,13 +1,16 @@ package tech.unissense.pms.business.examine.detail.service; import tech.unissense.pms.business.examine.config.domain.ExamineConfig; +import tech.unissense.pms.business.examine.config.enums.ReviewTypeEnum; import tech.unissense.pms.business.examine.detail.domain.ExamineDetail; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import tech.unissense.pms.business.examine.detail.dto.ExamineDetailRequestDto; import tech.unissense.pms.business.examine.detail.vo.ExamineDetailVo; +import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * 考核人员详情表(ExamineDetail)表服务接口 @@ -53,4 +56,18 @@ public interface ExamineDetailService { void insertBatch(List list); List formatData(List configList, ExamineDetailRequestDto dto); + /** + * 计算分数 + * @param taskId 任务id + * @param examineIdList 考核id + * @return + */ + Map calculateScoreByExamineId(Integer taskId, List examineIdList, ReviewTypeEnum typeEnum); + /** + * 计算分数 + * @param taskId 任务id + * @param examineIdList 考核id + * @return + */ + Map calculateScoreByDetail(Integer taskId,List examineList,ReviewTypeEnum typeEnum); } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/impl/ExamineDetailServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/impl/ExamineDetailServiceImpl.java index 0806cf8..da566ad 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/impl/ExamineDetailServiceImpl.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/detail/service/impl/ExamineDetailServiceImpl.java @@ -1,15 +1,21 @@ package tech.unissense.pms.business.examine.detail.service.impl; +import lombok.extern.slf4j.Slf4j; import tech.unissense.pms.business.examine.config.domain.ExamineConfig; +import tech.unissense.pms.business.examine.config.enums.ReviewTypeEnum; +import tech.unissense.pms.business.examine.config.mapper.ExamineConfigMapper; import tech.unissense.pms.business.examine.detail.domain.ExamineDetail; import tech.unissense.pms.business.examine.detail.dto.ExamineDetailRequestDto; import tech.unissense.pms.business.examine.detail.mapper.ExamineDetailMapper; import tech.unissense.pms.business.examine.detail.service.ExamineDetailService; import org.springframework.stereotype.Service; import tech.unissense.pms.business.examine.detail.vo.ExamineDetailVo; +import tech.unissense.pms.common.exception.ServiceException; import tech.unissense.pms.common.utils.bean.BeanUtils; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -21,9 +27,12 @@ import java.util.stream.Collectors; * @since 2025-01-02 10:18:06 */ @Service("examineDetailService") +@Slf4j public class ExamineDetailServiceImpl implements ExamineDetailService { @Resource private ExamineDetailMapper examineDetailMapper; + @Resource + private ExamineConfigMapper configMapper; /** * 通过ID查询单条数据 @@ -99,4 +108,42 @@ public class ExamineDetailServiceImpl implements ExamineDetailService { } + + @Override + public Map calculateScoreByExamineId(Integer taskId, List examineIdList, ReviewTypeEnum typeEnum) { + ExamineDetail examineDetailQueryDto = new ExamineDetail(); + examineDetailQueryDto.setExamineIdList(examineIdList); + List list = examineDetailMapper.list(examineDetailQueryDto); + return this.calculateScoreByDetail(taskId, list, typeEnum); + } + + @Override + public Map calculateScoreByDetail(Integer taskId, List examineList, ReviewTypeEnum typeEnum) { + ExamineConfig examineConfigQueryDto = new ExamineConfig(); + examineConfigQueryDto.setExamineTaskId(taskId); + if (!ReviewTypeEnum.ALL.getType().equals(typeEnum.getType())) { + examineConfigQueryDto.setReviewType(typeEnum.getType()); + } + List configList = configMapper.list(examineConfigQueryDto); + Map configMap = configList.stream().collect(Collectors.toMap(ExamineConfig::getId, Function.identity())); + Map scoreMap = new HashMap<>(); + for (ExamineDetail detail : examineList) { + ExamineConfig examineConfig = configMap.get(detail.getConfigId()); + if (examineConfig == null) { + continue; + } + BigDecimal score = BigDecimal.valueOf(detail.getScore()).multiply(BigDecimal.TEN); + BigDecimal weight = examineConfig.getWeight() == null ? + BigDecimal.ZERO : examineConfig.getWeight().divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + BigDecimal multiply = score.multiply(weight); + scoreMap.compute(detail.getExamineId(), (k, v) -> { + if (v == null) { + return multiply; + } + return v.add(multiply); + }); + } + + return scoreMap; + } } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/domain/ExamineUser.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/domain/ExamineUser.java index f0a05b9..7081cfe 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/domain/ExamineUser.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/domain/ExamineUser.java @@ -3,6 +3,7 @@ package tech.unissense.pms.business.examine.user.domain; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; /** * 考核人员表(ExamineUser)实体类 @@ -26,7 +27,7 @@ public class ExamineUser implements Serializable { /** * 考核分数(权重后分数) */ - private Integer score; + private BigDecimal score; /** * 总体评价 */ @@ -34,7 +35,7 @@ public class ExamineUser implements Serializable { /** * 主管评分(权重计算后) */ - private Integer manageScore; + private BigDecimal manageScore; /** * 个人评分状态 0:待完成 1:已完成 */ @@ -44,6 +45,7 @@ public class ExamineUser implements Serializable { */ private String examineStatus; + private String deptId; } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/mapper/ExamineUserMapper.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/mapper/ExamineUserMapper.java index a25816e..73caef6 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/mapper/ExamineUserMapper.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/mapper/ExamineUserMapper.java @@ -73,5 +73,7 @@ public interface ExamineUserMapper { int deleteById(Integer id); List list(ExamineUser examineUser); + + ExamineUser queryByTaskIdAndUserId(@Param("taskId") Integer examineTaskId,@Param("userId") Integer userId); } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/ExamineUserService.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/ExamineUserService.java index 08359d6..10e896c 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/ExamineUserService.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/ExamineUserService.java @@ -2,8 +2,6 @@ package tech.unissense.pms.business.examine.user.service; import tech.unissense.pms.business.examine.detail.dto.ExamineDto; import tech.unissense.pms.business.examine.user.domain.ExamineUser; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import java.util.List; @@ -50,5 +48,13 @@ public interface ExamineUserService { List list(ExamineUser examineUser); - void updateContent(ExamineDto examineDto); + void access(ExamineDto examineDto); + + /** + * 通过任务id和用户id查询 + * @param examineTaskId + * @param userId + * @return + */ + ExamineUser queryByTaskIdAndUserId(Integer examineTaskId, Integer userId); } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/impl/ExamineUserServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/impl/ExamineUserServiceImpl.java index a2b6038..8272eb9 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/impl/ExamineUserServiceImpl.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/examine/user/service/impl/ExamineUserServiceImpl.java @@ -1,13 +1,22 @@ package tech.unissense.pms.business.examine.user.service.impl; +import cn.hutool.core.util.StrUtil; +import org.springframework.beans.factory.annotation.Autowired; +import tech.unissense.pms.business.examine.config.enums.ReviewTypeEnum; import tech.unissense.pms.business.examine.detail.dto.ExamineDto; +import tech.unissense.pms.business.examine.detail.service.ExamineDetailService; import tech.unissense.pms.business.examine.user.domain.ExamineUser; import tech.unissense.pms.business.examine.user.mapper.ExamineUserMapper; import tech.unissense.pms.business.examine.user.service.ExamineUserService; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; /** * 考核人员表(ExamineUser)表服务实现类 @@ -19,6 +28,8 @@ import java.util.List; public class ExamineUserServiceImpl implements ExamineUserService { @Resource private ExamineUserMapper examineUserMapper; + @Autowired + private ExamineDetailService detailService; /** * 通过ID查询单条数据 @@ -74,10 +85,29 @@ public class ExamineUserServiceImpl implements ExamineUserService { } @Override - public void updateContent(ExamineDto examineDto) { + public void access(ExamineDto examineDto) { + ExamineUser user = examineUserMapper.queryById(examineDto.getExamineId()); ExamineUser examineUser = new ExamineUser(); examineUser.setId(examineDto.getExamineId()); examineUser.setJudgeContent(examineDto.getJudgeContent()); + examineUser.setExamineStatus(examineDto.getExamineStatus()); + examineUser.setExamineStatusSelf(examineDto.getExamineStatusSelf()); + examineUser.setManageScore(examineDto.getManageScore()); + String examineStatus = StrUtil.isNotEmpty(examineDto.getExamineStatus()) ? examineDto.getExamineStatus() : user.getExamineStatus(); + String examineStatusSelf = StrUtil.isNotEmpty(examineDto.getExamineStatusSelf()) ? examineDto.getExamineStatusSelf() : user.getExamineStatusSelf(); + //均已完成 计算总分数 + boolean flag = "1".equals(examineStatus) && "1".equals(examineStatusSelf); + if (flag) { + Map scoreMap = detailService.calculateScoreByExamineId(examineDto.getTaskId() + , Collections.singletonList(examineDto.getExamineId()), ReviewTypeEnum.ALL); + examineUser.setScore(scoreMap.get(examineDto.getExamineId())); + } examineUserMapper.update(examineUser); + + } + + @Override + public ExamineUser queryByTaskIdAndUserId(Integer examineTaskId, Integer userId) { + return examineUserMapper.queryByTaskIdAndUserId(examineTaskId, userId); } } diff --git a/pms-business/src/main/resources/mapper/business/examine/ExamineDetailMapper.xml b/pms-business/src/main/resources/mapper/business/examine/ExamineDetailMapper.xml index da85b0f..c13c03c 100644 --- a/pms-business/src/main/resources/mapper/business/examine/ExamineDetailMapper.xml +++ b/pms-business/src/main/resources/mapper/business/examine/ExamineDetailMapper.xml @@ -43,6 +43,13 @@ and config_id = #{configId} + + and examine_id in + + #{item} + + + diff --git a/pms-business/src/main/resources/mapper/business/examine/ExamineUserMapper.xml b/pms-business/src/main/resources/mapper/business/examine/ExamineUserMapper.xml index 57af891..c16b7f2 100644 --- a/pms-business/src/main/resources/mapper/business/examine/ExamineUserMapper.xml +++ b/pms-business/src/main/resources/mapper/business/examine/ExamineUserMapper.xml @@ -6,9 +6,9 @@ - + - + @@ -79,14 +79,21 @@ and manage_score = #{manageScore} - + and examine_status = #{examineStatus} and examine_status_self = #{examineStatusSelf} + + and user_id in (select id from sys_user where dept_id = #{deptId}) + + @@ -135,6 +142,12 @@ manage_score = #{manageScore}, + + and examine_status = #{examineStatus} + + + and examine_status_self = #{examineStatusSelf} + where id = #{id}