Commit 62ff59ec1cd5dbfa30f8b83507568340eae9ea83

Authored by 姜超
2 parents 6216249c c043db4c

Merge branch 'eval-detail' into test

fw-morax-dao/src/main/resources/mapper/eval/EvalGroupUserMapper.xml
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <mapper namespace="cn.fw.morax.dao.eval.EvalGroupUserDao"> 3 <mapper namespace="cn.fw.morax.dao.eval.EvalGroupUserDao">
4 4
5 <sql id="all_columns"> 5 <sql id="all_columns">
6 - id, egc, eval_id, eval_group_id, user_id, user_name, post_id, post_name, shop_id, 6 + id, eval_group_rank_id, eval_group_rank_stage_id, eval_group_id, user_id, user_name, post_id, post_name, shop_id,
7 shop_name, ignored, ignore_cause, ignore_cause_desc, anticipated_date, 7 shop_name, ignored, ignore_cause, ignore_cause_desc, anticipated_date,
8 remark, data_date, group_id, yn, create_time, update_time 8 remark, data_date, group_id, yn, create_time, update_time
9 </sql> 9 </sql>
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java
@@ -91,6 +91,11 @@ public class EvalGroupUserShop { @@ -91,6 +91,11 @@ public class EvalGroupUserShop {
91 private BigDecimal reward; 91 private BigDecimal reward;
92 92
93 /** 93 /**
  94 + * 是否计不入考评考核
  95 + */
  96 + private Boolean ignored;
  97 +
  98 + /**
94 * 指标总分 99 * 指标总分
95 */ 100 */
96 private BigDecimal indicatorTotalScore; 101 private BigDecimal indicatorTotalScore;
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorParam.java
@@ -113,7 +113,7 @@ public class EvalGroupIndicatorParam extends BaseAuditableTimeEntity&lt;EvalGroupIn @@ -113,7 +113,7 @@ public class EvalGroupIndicatorParam extends BaseAuditableTimeEntity&lt;EvalGroupIn
113 */ 113 */
114 public void dividePercent() { 114 public void dividePercent() {
115 this.setProportion(this.getProportion().divide(Constant.ONE_HUNDRED, 4, RoundingMode.HALF_UP)); 115 this.setProportion(this.getProportion().divide(Constant.ONE_HUNDRED, 4, RoundingMode.HALF_UP));
116 - if (PublicUtil.isNotEmpty(this.getExtraTargetValue()) && 116 + if (PublicUtil.isNotEmpty(this.getTargetValue()) &&
117 PublicUtil.isNotEmpty(this.getTargetType()) && 117 PublicUtil.isNotEmpty(this.getTargetType()) &&
118 TargetTypeEnum.RATIO.equals(this.getTargetType())) { 118 TargetTypeEnum.RATIO.equals(this.getTargetType())) {
119 this.setTargetValue(this.getTargetValue().divide(Constant.ONE_HUNDRED, 4, RoundingMode.HALF_UP)); 119 this.setTargetValue(this.getTargetValue().divide(Constant.ONE_HUNDRED, 4, RoundingMode.HALF_UP));
fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalUserRankDTO.java 0 → 100644
  1 +package cn.fw.morax.domain.dto.eval;
  2 +
  3 +import cn.fw.morax.common.utils.PublicUtil;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Builder;
  6 +import lombok.Data;
  7 +import lombok.NoArgsConstructor;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +import java.time.LocalDate;
  11 +import java.time.YearMonth;
  12 +
  13 +/**
  14 + * <p>
  15 + * 绩效组排名配置
  16 + * </p>
  17 + *
  18 + * @author jiangchao
  19 + * @since 2022-09-26
  20 + */
  21 +@Data
  22 +@Builder
  23 +@NoArgsConstructor
  24 +@AllArgsConstructor
  25 +public class EvalUserRankDTO {
  26 +
  27 + /**
  28 + * 用户id
  29 + */
  30 +// @NotNull(message = "用户id不能为空")
  31 + private Long userId;
  32 +
  33 + /**
  34 + * 门店
  35 + */
  36 + @NotNull(message = "门店")
  37 + private Long shopId;
  38 +
  39 + /**
  40 + * 岗位
  41 + */
  42 + @NotNull(message = "岗位")
  43 + private Long postId;
  44 +
  45 + /**
  46 + * 考评排名组id
  47 + */
  48 + @NotNull(message = "考评排名组id")
  49 + private Long evalGroupRankId;
  50 +
  51 + /**
  52 + * 月份
  53 + */
  54 + private YearMonth monthly;
  55 +
  56 + public void initMonthly() {
  57 + if (PublicUtil.isEmpty(this.monthly)) {
  58 + this.monthly = YearMonth.now();
  59 + }
  60 + }
  61 +
  62 +}
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalPoolVO.java 0 → 100644
  1 +package cn.fw.morax.domain.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.util.List;
  6 +
  7 +/**
  8 + * @author jiangchao
  9 + * @des:
  10 + * @date 2023/5/22 11:35
  11 + */
  12 +@Data
  13 +public class EvalPoolVO {
  14 +
  15 + /**
  16 + * 用户id
  17 + */
  18 + private Long userId;
  19 + /**
  20 + * 用户名称
  21 + */
  22 + private String userName;
  23 + /**
  24 + * 考评选择
  25 + */
  26 + private List<EvalSelectorVO> evalSelectors;
  27 +
  28 + public EvalPoolVO() {
  29 + }
  30 +
  31 + public EvalPoolVO(Long userId, String userName, List<EvalSelectorVO> evalSelectors) {
  32 + this.userId = userId;
  33 + this.userName = userName;
  34 + this.evalSelectors = evalSelectors;
  35 + }
  36 +}
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalSelectorVO.java 0 → 100644
  1 +package cn.fw.morax.domain.vo;
  2 +
  3 +import cn.fw.morax.domain.vo.eval.EvalUserGroupRankVO;
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +import java.math.BigDecimal;
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * @author : kurisu
  14 + * @version : 1.0
  15 + * @className : SelectorVO
  16 + * @description : 绩效\薪酬池选项
  17 + * @date : 2022-05-06 11:23
  18 + */
  19 +@Data
  20 +@EqualsAndHashCode
  21 +public class EvalSelectorVO {
  22 + /**
  23 + * 名称
  24 + */
  25 + private String name;
  26 +
  27 + /**
  28 + * 门店
  29 + */
  30 + @NotNull(message = "门店")
  31 + private Long shopId;
  32 +
  33 + /**
  34 + * 岗位
  35 + */
  36 + @NotNull(message = "岗位")
  37 + private Long postId;
  38 +
  39 + /**
  40 + * 排名
  41 + */
  42 + private List<EvalUserGroupRankVO> ranks;
  43 +
  44 +
  45 + public EvalSelectorVO() {
  46 + }
  47 +
  48 + public EvalSelectorVO(String name, List<EvalUserGroupRankVO> ranks) {
  49 + this.name = name;
  50 + this.ranks = ranks;
  51 + }
  52 +}
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserGroupRankVO.java 0 → 100644
  1 +package cn.fw.morax.domain.vo.eval;
  2 +
  3 +import cn.fw.morax.common.constant.Constant;
  4 +import cn.fw.morax.common.utils.PublicUtil;
  5 +import cn.fw.morax.domain.enums.EvalTypeEnum;
  6 +import cn.fw.morax.domain.enums.KpiIgnoreCauseEnum;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +
  10 +import java.math.BigDecimal;
  11 +import java.time.LocalDate;
  12 +import java.time.YearMonth;
  13 +import java.util.List;
  14 +
  15 +/**
  16 + * <p>
  17 + * 考评池
  18 + * </p>
  19 + *
  20 + * @author jiangchao
  21 + * @since 2022-12-09
  22 + */
  23 +@Data
  24 +@EqualsAndHashCode(callSuper = false)
  25 +public class EvalUserGroupRankVO {
  26 +
  27 + private static final long serialVersionUID = 1L;
  28 +
  29 + /**
  30 + * 考评排名组id
  31 + */
  32 + private Long id;
  33 +
  34 + /**
  35 + * 考评组编码
  36 + */
  37 + private String evalGroupRankName;
  38 +
  39 + /**
  40 + * 考评组id
  41 + */
  42 + private Long evalGroupRankId;
  43 +
  44 + /**
  45 + * 考评得分率
  46 + */
  47 + private BigDecimal scoreRatio;
  48 + /**
  49 + * 奖惩
  50 + */
  51 + private BigDecimal reward;
  52 +
  53 + /**
  54 + * 考评得分率(格式化)
  55 + */
  56 + private String scoreRatioFormat;
  57 +
  58 +
  59 + public void convertScoreRatio() {
  60 + if (PublicUtil.isNotEmpty(this.getScoreRatio())) {
  61 + this.setScoreRatio(this.getScoreRatio().multiply(Constant.ONE_HUNDRED));
  62 + }
  63 + }
  64 +}
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserRankStageVO.java 0 → 100644
  1 +package cn.fw.morax.domain.vo.eval;
  2 +
  3 +import lombok.Data;
  4 +import lombok.EqualsAndHashCode;
  5 +
  6 +import java.time.LocalDate;
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * <p>
  11 + * 考评组
  12 + * </p>
  13 + *
  14 + * @author jiangchao
  15 + * @since 2022-12-09
  16 + */
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = false)
  19 +public class EvalUserRankStageVO {
  20 +
  21 + /**
  22 + * 主键id
  23 + */
  24 + private Long id;
  25 + /**
  26 + * 阶段名称
  27 + */
  28 + private String name;
  29 +
  30 + /**
  31 + * 考评排名组id
  32 + */
  33 + private Long evalGroupRankId;
  34 +
  35 + /**
  36 + * 生效时间
  37 + */
  38 + private LocalDate beginTime;
  39 +
  40 + /**
  41 + * 结束时间
  42 + */
  43 + private LocalDate overTime;
  44 +
  45 + /**
  46 + * 考评池
  47 + */
  48 + private EvalUserPoolVO pool;
  49 +
  50 +
  51 +}
fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java
@@ -9,9 +9,11 @@ import cn.fw.common.web.auth.annotation.CurrentUser; @@ -9,9 +9,11 @@ import cn.fw.common.web.auth.annotation.CurrentUser;
9 import cn.fw.data.base.domain.common.Message; 9 import cn.fw.data.base.domain.common.Message;
10 import cn.fw.morax.common.utils.PublicUtil; 10 import cn.fw.morax.common.utils.PublicUtil;
11 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO; 11 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO;
  12 +import cn.fw.morax.domain.dto.eval.EvalUserRankDTO;
12 import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO; 13 import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO;
13 import cn.fw.morax.domain.enums.EvalScopeEnum; 14 import cn.fw.morax.domain.enums.EvalScopeEnum;
14 -import cn.fw.morax.domain.vo.SelectorVO; 15 +import cn.fw.morax.domain.vo.EvalPoolVO;
  16 +import cn.fw.morax.domain.vo.EvalSelectorVO;
15 import cn.fw.morax.domain.vo.eval.*; 17 import cn.fw.morax.domain.vo.eval.*;
16 import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO; 18 import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO;
17 import cn.fw.morax.service.biz.eval.*; 19 import cn.fw.morax.service.biz.eval.*;
@@ -24,12 +26,12 @@ import lombok.extern.slf4j.Slf4j; @@ -24,12 +26,12 @@ import lombok.extern.slf4j.Slf4j;
24 import org.springframework.validation.annotation.Validated; 26 import org.springframework.validation.annotation.Validated;
25 import org.springframework.web.bind.annotation.*; 27 import org.springframework.web.bind.annotation.*;
26 28
  29 +import javax.validation.Valid;
27 import javax.validation.constraints.NotNull; 30 import javax.validation.constraints.NotNull;
28 import java.time.LocalDate; 31 import java.time.LocalDate;
29 import java.time.YearMonth; 32 import java.time.YearMonth;
30 import java.util.List; 33 import java.util.List;
31 import java.util.Objects; 34 import java.util.Objects;
32 -import java.util.Set;  
33 35
34 import static cn.fw.common.businessvalidator.Validator.BV; 36 import static cn.fw.common.businessvalidator.Validator.BV;
35 import static cn.fw.common.web.util.ResultBuilder.success; 37 import static cn.fw.common.web.util.ResultBuilder.success;
@@ -69,6 +71,23 @@ public class EvalPoolController { @@ -69,6 +71,23 @@ public class EvalPoolController {
69 } 71 }
70 72
71 /** 73 /**
  74 + * 人员信息
  75 + *
  76 + * @return
  77 + * @ignoreParams currentUser
  78 + */
  79 + @GetMapping("/staff-info")
  80 + @ControllerMethod("人员信息")
  81 + public Message<EvalUserPoolVO> queryUser(@CurrentUser LoginAuthBean user) {
  82 + EvalUserPoolVO poolVO = new EvalUserPoolVO();
  83 + if (PublicUtil.isNotEmpty(user)) {
  84 + poolVO.setUserId(user.getUserId());
  85 + poolVO.setUserName(user.getUserName());
  86 + }
  87 + return success(poolVO);
  88 + }
  89 +
  90 + /**
72 * 本月可查看的其他考评池选项 91 * 本月可查看的其他考评池选项
73 * 92 *
74 * @param user 用户id 93 * @param user 用户id
@@ -80,7 +99,8 @@ public class EvalPoolController { @@ -80,7 +99,8 @@ public class EvalPoolController {
80 @GetMapping("/staff-selector") 99 @GetMapping("/staff-selector")
81 @IgnoreUserToken 100 @IgnoreUserToken
82 @ControllerMethod("本月可查看的其他考评池选项") 101 @ControllerMethod("本月可查看的其他考评池选项")
83 - public Message<Set<SelectorVO>> evalPoolSelector(@CurrentUser LoginAuthBean user, Long userId, @RequestParam(required = false) YearMonth monthly) { 102 + public Message<EvalPoolVO> evalPoolSelector(@CurrentUser LoginAuthBean user, Long userId,
  103 + @RequestParam(required = false) YearMonth monthly) {
84 if (Objects.isNull(monthly)) { 104 if (Objects.isNull(monthly)) {
85 monthly = YearMonth.now(); 105 monthly = YearMonth.now();
86 } 106 }
@@ -92,33 +112,28 @@ public class EvalPoolController { @@ -92,33 +112,28 @@ public class EvalPoolController {
92 112
93 /** 113 /**
94 * 考评详情查询 (查看自己考评详情) 114 * 考评详情查询 (查看自己考评详情)
95 - *  
96 - * @param userId 用户id  
97 - * @param monthly 月度  
98 - * @return 绩效池详情  
99 - * @ignoreParams userId  
100 */ 115 */
101 @GetMapping("/own-detail") 116 @GetMapping("/own-detail")
102 @ControllerMethod("考评详情查询") 117 @ControllerMethod("考评详情查询")
103 - public Message<EvalUserPoolVO> evalPoolOwnDetail(@CurrentUser Long userId,  
104 - @RequestParam(required = false) YearMonth monthly) {  
105 - if (Objects.isNull(monthly)) {  
106 - monthly = YearMonth.now();  
107 - }  
108 - return success(evalGroupPoolService.queryUserPoolDetail(userId, monthly)); 118 + public Message<List<EvalUserRankStageVO>> evalPoolOwnDetail(@CurrentUser Long userId,
  119 + @Valid EvalUserRankDTO dto) {
  120 + dto.initMonthly();
  121 + dto.setUserId(userId);
  122 + return success(evalGroupPoolService.queryRankStagePools(dto));
109 } 123 }
110 124
111 /** 125 /**
112 * 考评详情查询 (查看他人考评详情) 126 * 考评详情查询 (查看他人考评详情)
113 * 127 *
114 - * @param evalPoolId 用户id  
115 - * @return 绩效池详情  
116 - * @ignoreParams userId  
117 */ 128 */
118 - @GetMapping("/staff") 129 + @GetMapping("/detail")
119 @ControllerMethod("考评详情查询") 130 @ControllerMethod("考评详情查询")
120 - public Message<EvalUserPoolVO> evalPoolDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId) {  
121 - return success(evalGroupPoolService.queryPoolDetail(evalPoolId)); 131 + public Message<List<EvalUserRankStageVO>> evalPoolDetail(@Valid EvalUserRankDTO dto) {
  132 + dto.initMonthly();
  133 + if (PublicUtil.isEmpty(dto.getUserId())) {
  134 + throw new BusinessException("人员信息不能为空");
  135 + }
  136 + return success(evalGroupPoolService.queryRankStagePools(dto));
122 } 137 }
123 138
124 /** 139 /**
fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java
@@ -10,6 +10,7 @@ import cn.fw.morax.rpc.ehr.EhrRpcService; @@ -10,6 +10,7 @@ import cn.fw.morax.rpc.ehr.EhrRpcService;
10 import cn.fw.morax.rpc.ehr.dto.PerformanceStaffDTO; 10 import cn.fw.morax.rpc.ehr.dto.PerformanceStaffDTO;
11 import cn.fw.morax.server.consumer.FlowConsumer; 11 import cn.fw.morax.server.consumer.FlowConsumer;
12 import cn.fw.morax.server.task.*; 12 import cn.fw.morax.server.task.*;
  13 +import cn.fw.morax.service.biz.eval.EvalCalculateService;
13 import cn.fw.security.auth.client.annotation.Authorization; 14 import cn.fw.security.auth.client.annotation.Authorization;
14 import cn.fw.security.auth.client.enums.AuthType; 15 import cn.fw.security.auth.client.enums.AuthType;
15 import lombok.RequiredArgsConstructor; 16 import lombok.RequiredArgsConstructor;
@@ -18,6 +19,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -18,6 +19,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
18 import org.springframework.validation.annotation.Validated; 19 import org.springframework.validation.annotation.Validated;
19 import org.springframework.web.bind.annotation.*; 20 import org.springframework.web.bind.annotation.*;
20 21
  22 +import java.time.LocalDate;
21 import java.util.Date; 23 import java.util.Date;
22 import java.util.List; 24 import java.util.List;
23 25
@@ -42,18 +44,23 @@ public class EvalTaskController { @@ -42,18 +44,23 @@ public class EvalTaskController {
42 private final EvalCalcTask evalCalcTask; 44 private final EvalCalcTask evalCalcTask;
43 private final EvalGroupTask evalGroupTask; 45 private final EvalGroupTask evalGroupTask;
44 private final EvalGroupUserTask evalGroupUserTask; 46 private final EvalGroupUserTask evalGroupUserTask;
  47 + private final EvalCalculateService evalCalculateService;
45 48
46 @GetMapping("/group-user") 49 @GetMapping("/group-user")
47 @ControllerMethod("考评组人员") 50 @ControllerMethod("考评组人员")
48 - public Message<Void> processEvalUser() { 51 + public Message<Void> processEvalUser(Date date) {
49 evalGroupUserTask.processEvalUser(); 52 evalGroupUserTask.processEvalUser();
50 return success(); 53 return success();
51 } 54 }
52 55
53 @GetMapping("/calc-cache") 56 @GetMapping("/calc-cache")
54 @ControllerMethod("缓存要计算的考评") 57 @ControllerMethod("缓存要计算的考评")
55 - public Message<Void> cacheCalculableEvalGroup() {  
56 - evalCalcTask.cacheCalculableEvalGroup(); 58 + public Message<Void> cacheCalculableEvalGroup(Date date) {
  59 + if (PublicUtil.isEmpty(date)) {
  60 + evalCalculateService.cacheCalculableEvalGroupIds(LocalDate.now().minusDays(1L));
  61 + } else {
  62 + evalCalculateService.cacheCalculableEvalGroupIds(DateUtil.date2LocalDate(date));
  63 + }
57 return success(); 64 return success();
58 } 65 }
59 66
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupUserTask.java
@@ -97,7 +97,7 @@ public class EvalGroupUserTask { @@ -97,7 +97,7 @@ public class EvalGroupUserTask {
97 * @return 97 * @return
98 */ 98 */
99 private List<EvalGroupUser> queryKpiStaff(LocalDate yesterday) { 99 private List<EvalGroupUser> queryKpiStaff(LocalDate yesterday) {
100 - List<EvalGroup> evalGroups = evalGroupUserBizService.postEffectEvalGroups(); 100 + List<EvalGroup> evalGroups = evalGroupUserBizService.postEffectEvalGroups(yesterday);
101 if (! evalGroups.isEmpty()) { 101 if (! evalGroups.isEmpty()) {
102 log.info("需要生成考评组人员的考评组:{}", evalGroups); 102 log.info("需要生成考评组人员的考评组:{}", evalGroups);
103 } 103 }
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
@@ -239,10 +239,11 @@ public class EvalCalculateService { @@ -239,10 +239,11 @@ public class EvalCalculateService {
239 if (userShop.getIndicatorTotalScore().compareTo(BigDecimal.ZERO) > 0) { 239 if (userShop.getIndicatorTotalScore().compareTo(BigDecimal.ZERO) > 0) {
240 scoreRatio = userShop.getScore().divide(userShop.getIndicatorTotalScore(), 2, RoundingMode.DOWN); 240 scoreRatio = userShop.getScore().divide(userShop.getIndicatorTotalScore(), 2, RoundingMode.DOWN);
241 } 241 }
  242 + BigDecimal reward = (Boolean.TRUE.equals(userShop.getIgnored())) ? BigDecimal.ZERO : userShop.getReward();
242 evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate() 243 evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate()
243 .eq(EvalUserPool::getId, userShop.getPoolId()) 244 .eq(EvalUserPool::getId, userShop.getPoolId())
244 .eq(EvalUserPool::getYn, Boolean.TRUE) 245 .eq(EvalUserPool::getYn, Boolean.TRUE)
245 - .set(EvalUserPool::getReward, userShop.getReward()) 246 + .set(EvalUserPool::getReward, reward)
246 .set(EvalUserPool::getScore, userShop.getScore()) 247 .set(EvalUserPool::getScore, userShop.getScore())
247 .set(EvalUserPool::getScoreRatio, scoreRatio) 248 .set(EvalUserPool::getScoreRatio, scoreRatio)
248 .set(EvalUserPool::getMonthly, YearMonth.from(localDate)) 249 .set(EvalUserPool::getMonthly, YearMonth.from(localDate))
@@ -281,9 +282,9 @@ public class EvalCalculateService { @@ -281,9 +282,9 @@ public class EvalCalculateService {
281 282
282 Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, evalGroupRankStage, users, localDate); 283 Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, evalGroupRankStage, users, localDate);
283 for (EvalGroupUser user : users) { 284 for (EvalGroupUser user : users) {
284 - if (Boolean.TRUE.equals(user.getIgnored())) {  
285 - continue;  
286 - } 285 +// if (Boolean.TRUE.equals(user.getIgnored())) {
  286 +// continue;
  287 +// }
287 EvalUserPool userPool = userPoolMap.get(user.getUserId()); 288 EvalUserPool userPool = userPoolMap.get(user.getUserId());
288 userShops.add(convertBO(user, userPool)); 289 userShops.add(convertBO(user, userPool));
289 } 290 }
@@ -638,6 +639,7 @@ public class EvalCalculateService { @@ -638,6 +639,7 @@ public class EvalCalculateService {
638 userShop.setGroupId(user.getGroupId()); 639 userShop.setGroupId(user.getGroupId());
639 userShop.setScore(BigDecimal.ZERO); 640 userShop.setScore(BigDecimal.ZERO);
640 userShop.setReward(BigDecimal.ZERO); 641 userShop.setReward(BigDecimal.ZERO);
  642 + userShop.setIgnored(user.getIgnored());
641 return userShop; 643 return userShop;
642 } 644 }
643 645
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java
@@ -7,7 +7,10 @@ import cn.fw.morax.common.utils.PublicUtil; @@ -7,7 +7,10 @@ import cn.fw.morax.common.utils.PublicUtil;
7 import cn.fw.morax.domain.db.eval.*; 7 import cn.fw.morax.domain.db.eval.*;
8 import cn.fw.morax.domain.db.kpi.*; 8 import cn.fw.morax.domain.db.kpi.*;
9 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO; 9 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO;
  10 +import cn.fw.morax.domain.dto.eval.EvalUserRankDTO;
10 import cn.fw.morax.domain.enums.*; 11 import cn.fw.morax.domain.enums.*;
  12 +import cn.fw.morax.domain.vo.EvalPoolVO;
  13 +import cn.fw.morax.domain.vo.EvalSelectorVO;
11 import cn.fw.morax.domain.vo.SelectorVO; 14 import cn.fw.morax.domain.vo.SelectorVO;
12 import cn.fw.morax.domain.vo.eval.*; 15 import cn.fw.morax.domain.vo.eval.*;
13 import cn.fw.morax.domain.vo.kpi.IndicatorUserValueVO; 16 import cn.fw.morax.domain.vo.kpi.IndicatorUserValueVO;
@@ -60,6 +63,8 @@ public class EvalGroupPoolService { @@ -60,6 +63,8 @@ public class EvalGroupPoolService {
60 private final EvalIndicatorValueService evalIndicatorValueService; 63 private final EvalIndicatorValueService evalIndicatorValueService;
61 private final EvalGroupUserService evalGroupUserService; 64 private final EvalGroupUserService evalGroupUserService;
62 private final EvalGroupRewardService evalGroupRewardService; 65 private final EvalGroupRewardService evalGroupRewardService;
  66 + private final EvalGroupRankStageService evalGroupRankStageService;
  67 + private final EvalGroupRankService evalGroupRankService;
63 private final EvalGroupService evalGroupService; 68 private final EvalGroupService evalGroupService;
64 private final EvalUserPoolService evalUserPoolService; 69 private final EvalUserPoolService evalUserPoolService;
65 private final EvalShopPoolService evalShopPoolService; 70 private final EvalShopPoolService evalShopPoolService;
@@ -101,31 +106,38 @@ public class EvalGroupPoolService { @@ -101,31 +106,38 @@ public class EvalGroupPoolService {
101 * 106 *
102 * @return 107 * @return
103 */ 108 */
104 - public EvalUserPoolVO queryPoolDetail(final Long poolId) {  
105 - EvalUserPool evalUserPool = evalUserPoolService.getById(poolId);  
106 - if (PublicUtil.isEmpty(evalUserPool)) {  
107 -// throw new BusinessException("人员考评数据不存在");  
108 - return null;  
109 - }  
110 - return poolDetail(evalUserPool);  
111 - } 109 + public List<EvalUserRankStageVO> queryRankStagePools(EvalUserRankDTO dto) {
  110 + final Long userId = dto.getUserId();
  111 + final Long postId = dto.getPostId();
  112 + final Long shopId = dto.getShopId();
  113 + final Long evalGroupRankId = dto.getEvalGroupRankId();
  114 + List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
  115 + .eq(EvalUserPool::getPostId, postId)
  116 + .eq(EvalUserPool::getShopId, shopId)
  117 + .eq(EvalUserPool::getUserId, userId)
  118 + .eq(EvalUserPool::getEvalGroupRankId, evalGroupRankId)
  119 + .eq(EvalUserPool::getYn, Boolean.TRUE)
  120 + .orderByDesc(EvalUserPool::getScoreRatio)
  121 + );
  122 + Map<Long, List<EvalUserPool>> stagePoolMap = pools.stream().collect(Collectors.groupingBy(EvalUserPool::getEvalGroupRankStageId));
  123 + List<Long> evalGroupRankStageIds = pools.stream().map(EvalUserPool::getEvalGroupRankStageId).collect(Collectors.toList());
112 124
113 - /**  
114 - * 查询考评详情  
115 - *  
116 - * @param userId  
117 - * @param yearMonth  
118 - * @return  
119 - */  
120 - public EvalUserPoolVO queryUserPoolDetail(final Long userId, final YearMonth yearMonth) {  
121 - List<EvalUserPool> pools = userEvalPool(userId, yearMonth); 125 + List<EvalGroupRankStage> stages = evalGroupRankStageService.list(Wrappers.<EvalGroupRankStage>lambdaQuery()
  126 + .in(EvalGroupRankStage::getId, evalGroupRankStageIds)
  127 + .eq(EvalGroupRankStage::getYn, Boolean.TRUE)
  128 + .orderByAsc(EvalGroupRankStage::getBeginTime)
  129 + );
122 130
123 - if (PublicUtil.isEmpty(pools)) {  
124 -// throw new BusinessException("人员考评数据不存在");  
125 - return null; 131 + List<EvalUserRankStageVO> stageVos = PublicUtil.copyList(stages, EvalUserRankStageVO.class);
  132 + for (EvalUserRankStageVO stageVO : stageVos) {
  133 + List<EvalUserPool> rankPools = stagePoolMap.get(stageVO.getId());
  134 + if (PublicUtil.isNotEmpty(rankPools)) {
  135 + EvalUserPool stagePool = rankPools.get(0);
  136 + EvalUserPoolVO evalUserPoolVO = this.poolDetail(stagePool);
  137 + stageVO.setPool(evalUserPoolVO);
  138 + }
126 } 139 }
127 - EvalUserPool evalUserPool = pools.get(0);  
128 - return poolDetail(evalUserPool); 140 + return stageVos;
129 } 141 }
130 142
131 public EvalUserPoolVO poolDetail(EvalUserPool pool) { 143 public EvalUserPoolVO poolDetail(EvalUserPool pool) {
@@ -139,12 +151,6 @@ public class EvalGroupPoolService { @@ -139,12 +151,6 @@ public class EvalGroupPoolService {
139 this.setIgnore(evalUserPoolVO); 151 this.setIgnore(evalUserPoolVO);
140 evalUserPoolVO.setDataDate(localDate); 152 evalUserPoolVO.setDataDate(localDate);
141 153
142 -// Eval eval = evalService.getById(pool.getEvalId());  
143 -// BV.notNull(pool, "考评池不存在");  
144 -// if (PublicUtil.isNotEmpty(eval)) {  
145 -// evalUserPoolVO.setEvalType(eval.getType());  
146 -// }  
147 -  
148 return evalUserPoolVO; 154 return evalUserPoolVO;
149 } 155 }
150 156
@@ -256,14 +262,73 @@ public class EvalGroupPoolService { @@ -256,14 +262,73 @@ public class EvalGroupPoolService {
256 * @param yearMonth 262 * @param yearMonth
257 * @return 263 * @return
258 */ 264 */
259 - public Set<SelectorVO> evalPoolSelector(Long userId, YearMonth yearMonth) { 265 + public EvalPoolVO evalPoolSelector(Long userId, YearMonth yearMonth) {
260 List<EvalUserPool> pools = userEvalPool(userId, yearMonth); 266 List<EvalUserPool> pools = userEvalPool(userId, yearMonth);
261 if (CollectionUtils.isEmpty(pools)) { 267 if (CollectionUtils.isEmpty(pools)) {
262 - return new HashSet<>(); 268 + return null;
  269 + }
  270 + String userName = pools.stream().findFirst().map(EvalUserPool::getUserName).orElse("");
  271 + List<EvalSelectorVO> selectors = new ArrayList<>();
  272 + EvalPoolVO evalPoolVO = new EvalPoolVO(userId, userName, selectors);
  273 + Map<Long, String> rankNameMap = this.getRankNameMap(pools);
  274 + Map<String, List<EvalUserPool>> shopPostMap = pools.stream().collect(Collectors.groupingBy(pool -> pool.getShopName() + "(" + pool.getPostName() + ")"));
  275 + //门店、岗位维度
  276 + for (Map.Entry<String, List<EvalUserPool>> shopPostEntry : shopPostMap.entrySet()) {
  277 + List<EvalUserGroupRankVO> ranks = new ArrayList<>();
  278 + List<EvalUserPool> shopPostPools = shopPostEntry.getValue();
  279 + Long shopId = shopPostPools.stream().findFirst().map(EvalUserPool::getShopId).get();
  280 + Long postId = shopPostPools.stream().findFirst().map(EvalUserPool::getPostId).get();
  281 + Map<Long, List<EvalUserPool>> rankPools = shopPostPools.stream().collect(Collectors.groupingBy(EvalUserPool::getEvalGroupRankId));
  282 + //排名维度
  283 + for (Map.Entry<Long, List<EvalUserPool>> rankEntry : rankPools.entrySet()) {
  284 + List<EvalUserPool> userRankPools = rankEntry.getValue();
  285 + double averageKpiScoreRatio = userRankPools.stream()
  286 + .mapToDouble(r -> Optional.ofNullable(r.getScoreRatio()).orElse(BigDecimal.ZERO).doubleValue())
  287 + .average()
  288 + .orElse(0);
  289 + BigDecimal reward = userRankPools.stream().map(EvalUserPool::getReward).reduce(BigDecimal.ZERO, BigDecimal::add);
  290 + EvalUserGroupRankVO rank = new EvalUserGroupRankVO();
  291 + rank.setEvalGroupRankName(rankNameMap.getOrDefault(rankEntry.getKey(), ""));
  292 + rank.setScoreRatio(new BigDecimal(averageKpiScoreRatio).multiply(Constant.ONE_HUNDRED));
  293 + rank.setReward(reward);
  294 + rank.setEvalGroupRankId(rankEntry.getKey());
  295 + ranks.add(rank);
  296 + }
  297 + EvalSelectorVO evalSelectorVO = new EvalSelectorVO(shopPostEntry.getKey(), ranks);
  298 + evalSelectorVO.setShopId(shopId);
  299 + evalSelectorVO.setPostId(postId);
  300 + selectors.add(evalSelectorVO);
263 } 301 }
264 - return pools.stream().map(r -> SelectorVO.whit(r.getId(), r.getPostName(), r.getShopName() + "")).collect(Collectors.toSet()); 302 + return evalPoolVO;
265 } 303 }
266 304
  305 + public Map<Long, String> getRankNameMap(List<EvalUserPool> pools) {
  306 + List<Long> evalGroupRankIds = pools.stream().map(EvalUserPool::getEvalGroupRankId).distinct().collect(Collectors.toList());
  307 + List<EvalGroupRank> evalGroupRanks = evalGroupRankService.list(Wrappers.<EvalGroupRank>lambdaQuery()
  308 + .in(EvalGroupRank::getId, evalGroupRankIds)
  309 + .eq(EvalGroupRank::getYn, Boolean.TRUE)
  310 + );
  311 + if (PublicUtil.isEmpty(evalGroupRanks)) {
  312 + return new HashMap<>();
  313 + }
  314 + return evalGroupRanks.stream().collect(Collectors.toMap(EvalGroupRank::getId, EvalGroupRank::getName, (v1, v2) -> v1));
  315 + }
  316 +
  317 + /**
  318 + * 查询用户绩效池
  319 + *
  320 + * @param userId
  321 + * @param yearMonth
  322 + * @return
  323 + */
  324 +// public Set<SelectorVO> evalPoolSelector(Long userId, YearMonth yearMonth) {
  325 +// List<EvalUserPool> pools = userEvalPool(userId, yearMonth);
  326 +// if (CollectionUtils.isEmpty(pools)) {
  327 +// return new HashSet<>();
  328 +// }
  329 +// return pools.stream().map(r -> SelectorVO.whit(r.getId(), r.getPostName(), r.getShopName() + "")).collect(Collectors.toSet());
  330 +// }
  331 +
267 332
268 /** 333 /**
269 * 查询用户月度绩效池列表 334 * 查询用户月度绩效池列表
@@ -308,7 +373,6 @@ public class EvalGroupPoolService { @@ -308,7 +373,6 @@ public class EvalGroupPoolService {
308 if (PublicUtil.isEmpty(pool)) { 373 if (PublicUtil.isEmpty(pool)) {
309 return null; 374 return null;
310 } 375 }
311 -// BV.notNull(pool, "考评池不存在");  
312 Long userId = pool.getUserId(); 376 Long userId = pool.getUserId();
313 return getHitIndicatorDetail(evalPoolId, EvalScopeEnum.STAFF, userId, evalGroupIndicatorId, dataDate); 377 return getHitIndicatorDetail(evalPoolId, EvalScopeEnum.STAFF, userId, evalGroupIndicatorId, dataDate);
314 } 378 }
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java
@@ -53,14 +53,16 @@ public class EvalGroupUserBizService { @@ -53,14 +53,16 @@ public class EvalGroupUserBizService {
53 /** 53 /**
54 * 所有集团生效的绩效组配置 54 * 所有集团生效的绩效组配置
55 */ 55 */
56 - public List<EvalGroup> postEffectEvalGroups(){  
57 - LocalDate queryDate = LocalDate.now().minusDays(1L); 56 + public List<EvalGroup> postEffectEvalGroups(LocalDate queryDate){
58 List<EvalGroup> evalGroups = evalGroupService.getAllEffectGroups(queryDate); 57 List<EvalGroup> evalGroups = evalGroupService.getAllEffectGroups(queryDate);
59 if (PublicUtil.isEmpty(evalGroups)) { 58 if (PublicUtil.isEmpty(evalGroups)) {
60 log.info("时间:{},没有正在生效中的考评组配置", DateTimeFormatter.ofPattern("yyyy-MM-dd").format(queryDate)); 59 log.info("时间:{},没有正在生效中的考评组配置", DateTimeFormatter.ofPattern("yyyy-MM-dd").format(queryDate));
61 return new ArrayList<>(); 60 return new ArrayList<>();
62 } 61 }
63 - return evalGroups; 62 + //过滤岗位为空考评组
  63 + List<EvalGroup> postEvalGroups = evalGroups.stream()
  64 + .filter(evalGroup -> PublicUtil.isNotEmpty(evalGroup.getPostIds())).collect(Collectors.toList());
  65 + return postEvalGroups;
64 } 66 }
65 67
66 /** 68 /**