Commit c043db4c44f1cf71f9f37161f4707934fc4238bf

Authored by 姜超
1 parent a9445e72

feature(*): 查看考评详情

查看考评详情
fw-morax-dao/src/main/resources/mapper/eval/EvalGroupUserMapper.xml
... ... @@ -3,7 +3,7 @@
3 3 <mapper namespace="cn.fw.morax.dao.eval.EvalGroupUserDao">
4 4  
5 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 7 shop_name, ignored, ignore_cause, ignore_cause_desc, anticipated_date,
8 8 remark, data_date, group_id, yn, create_time, update_time
9 9 </sql>
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java
... ... @@ -91,6 +91,11 @@ public class EvalGroupUserShop {
91 91 private BigDecimal reward;
92 92  
93 93 /**
  94 + * 是否计不入考评考核
  95 + */
  96 + private Boolean ignored;
  97 +
  98 + /**
94 99 * 指标总分
95 100 */
96 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 113 */
114 114 public void dividePercent() {
115 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 117 PublicUtil.isNotEmpty(this.getTargetType()) &&
118 118 TargetTypeEnum.RATIO.equals(this.getTargetType())) {
119 119 this.setTargetValue(this.getTargetValue().divide(Constant.ONE_HUNDRED, 4, RoundingMode.HALF_UP));
... ...
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
... ... @@ -5,6 +5,7 @@ import lombok.Builder;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 7  
  8 +import javax.validation.constraints.NotNull;
8 9 import java.math.BigDecimal;
9 10 import java.util.List;
10 11  
... ... @@ -24,6 +25,18 @@ public class EvalSelectorVO {
24 25 private String name;
25 26  
26 27 /**
  28 + * 门店
  29 + */
  30 + @NotNull(message = "门店")
  31 + private Long shopId;
  32 +
  33 + /**
  34 + * 岗位
  35 + */
  36 + @NotNull(message = "岗位")
  37 + private Long postId;
  38 +
  39 + /**
27 40 * 排名
28 41 */
29 42 private List<EvalUserGroupRankVO> ranks;
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java
... ... @@ -12,6 +12,7 @@ import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO;
12 12 import cn.fw.morax.domain.dto.eval.EvalUserRankDTO;
13 13 import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO;
14 14 import cn.fw.morax.domain.enums.EvalScopeEnum;
  15 +import cn.fw.morax.domain.vo.EvalPoolVO;
15 16 import cn.fw.morax.domain.vo.EvalSelectorVO;
16 17 import cn.fw.morax.domain.vo.eval.*;
17 18 import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO;
... ... @@ -70,6 +71,23 @@ public class EvalPoolController {
70 71 }
71 72  
72 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 + /**
73 91 * 本月可查看的其他考评池选项
74 92 *
75 93 * @param user 用户id
... ... @@ -81,8 +99,8 @@ public class EvalPoolController {
81 99 @GetMapping("/staff-selector")
82 100 @IgnoreUserToken
83 101 @ControllerMethod("本月可查看的其他考评池选项")
84   - public Message<List<EvalSelectorVO>> evalPoolSelector(@CurrentUser LoginAuthBean user, Long userId,
85   - @RequestParam(required = false) YearMonth monthly) {
  102 + public Message<EvalPoolVO> evalPoolSelector(@CurrentUser LoginAuthBean user, Long userId,
  103 + @RequestParam(required = false) YearMonth monthly) {
86 104 if (Objects.isNull(monthly)) {
87 105 monthly = YearMonth.now();
88 106 }
... ...
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 10 import cn.fw.morax.rpc.ehr.dto.PerformanceStaffDTO;
11 11 import cn.fw.morax.server.consumer.FlowConsumer;
12 12 import cn.fw.morax.server.task.*;
  13 +import cn.fw.morax.service.biz.eval.EvalCalculateService;
13 14 import cn.fw.security.auth.client.annotation.Authorization;
14 15 import cn.fw.security.auth.client.enums.AuthType;
15 16 import lombok.RequiredArgsConstructor;
... ... @@ -18,6 +19,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
18 19 import org.springframework.validation.annotation.Validated;
19 20 import org.springframework.web.bind.annotation.*;
20 21  
  22 +import java.time.LocalDate;
21 23 import java.util.Date;
22 24 import java.util.List;
23 25  
... ... @@ -42,18 +44,23 @@ public class EvalTaskController {
42 44 private final EvalCalcTask evalCalcTask;
43 45 private final EvalGroupTask evalGroupTask;
44 46 private final EvalGroupUserTask evalGroupUserTask;
  47 + private final EvalCalculateService evalCalculateService;
45 48  
46 49 @GetMapping("/group-user")
47 50 @ControllerMethod("考评组人员")
48   - public Message<Void> processEvalUser() {
  51 + public Message<Void> processEvalUser(Date date) {
49 52 evalGroupUserTask.processEvalUser();
50 53 return success();
51 54 }
52 55  
53 56 @GetMapping("/calc-cache")
54 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 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 97 * @return
98 98 */
99 99 private List<EvalGroupUser> queryKpiStaff(LocalDate yesterday) {
100   - List<EvalGroup> evalGroups = evalGroupUserBizService.postEffectEvalGroups();
  100 + List<EvalGroup> evalGroups = evalGroupUserBizService.postEffectEvalGroups(yesterday);
101 101 if (! evalGroups.isEmpty()) {
102 102 log.info("需要生成考评组人员的考评组:{}", evalGroups);
103 103 }
... ... @@ -105,7 +105,7 @@ public class EvalGroupUserTask {
105 105 List<EvalGroupUser> evalGroupUsers = null;
106 106 for (EvalGroup evalGroup : evalGroups) {
107 107 for (Long postId : evalGroup.getPostIds()) {
108   - evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroups, yesterday);
  108 + evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroup, yesterday);
109 109 evalGroupUsersForSave.addAll(evalGroupUsers);
110 110 }
111 111 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
... ... @@ -239,10 +239,11 @@ public class EvalCalculateService {
239 239 if (userShop.getIndicatorTotalScore().compareTo(BigDecimal.ZERO) > 0) {
240 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 243 evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate()
243 244 .eq(EvalUserPool::getId, userShop.getPoolId())
244 245 .eq(EvalUserPool::getYn, Boolean.TRUE)
245   - .set(EvalUserPool::getReward, userShop.getReward())
  246 + .set(EvalUserPool::getReward, reward)
246 247 .set(EvalUserPool::getScore, userShop.getScore())
247 248 .set(EvalUserPool::getScoreRatio, scoreRatio)
248 249 .set(EvalUserPool::getMonthly, YearMonth.from(localDate))
... ... @@ -280,9 +281,9 @@ public class EvalCalculateService {
280 281  
281 282 Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, users, localDate);
282 283 for (EvalGroupUser user : users) {
283   - if (Boolean.TRUE.equals(user.getIgnored())) {
284   - continue;
285   - }
  284 +// if (Boolean.TRUE.equals(user.getIgnored())) {
  285 +// continue;
  286 +// }
286 287 EvalUserPool userPool = userPoolMap.get(user.getUserId());
287 288 userShops.add(convertBO(user, userPool));
288 289 }
... ... @@ -637,6 +638,7 @@ public class EvalCalculateService {
637 638 userShop.setGroupId(user.getGroupId());
638 639 userShop.setScore(BigDecimal.ZERO);
639 640 userShop.setReward(BigDecimal.ZERO);
  641 + userShop.setIgnored(user.getIgnored());
640 642 return userShop;
641 643 }
642 644  
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java
... ... @@ -9,6 +9,7 @@ import cn.fw.morax.domain.db.kpi.*;
9 9 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO;
10 10 import cn.fw.morax.domain.dto.eval.EvalUserRankDTO;
11 11 import cn.fw.morax.domain.enums.*;
  12 +import cn.fw.morax.domain.vo.EvalPoolVO;
12 13 import cn.fw.morax.domain.vo.EvalSelectorVO;
13 14 import cn.fw.morax.domain.vo.SelectorVO;
14 15 import cn.fw.morax.domain.vo.eval.*;
... ... @@ -132,34 +133,13 @@ public class EvalGroupPoolService {
132 133 List<EvalUserPool> rankPools = stagePoolMap.get(stageVO.getId());
133 134 if (PublicUtil.isNotEmpty(rankPools)) {
134 135 EvalUserPool stagePool = rankPools.get(0);
135   - EvalUserPoolVO evalUserPoolVO = PublicUtil.copy(stagePool, EvalUserPoolVO.class);
  136 + EvalUserPoolVO evalUserPoolVO = this.poolDetail(stagePool);
136 137 stageVO.setPool(evalUserPoolVO);
137 138 }
138 139 }
139 140 return stageVos;
140 141 }
141 142  
142   -// /**
143   -// * 查询考评详情
144   -// *
145   -// * @param userId
146   -// * @param yearMonth
147   -// * @return
148   -// */
149   -// public List<EvalUserGroupRankVO> queryUserPoolDetail(final Long userId, final YearMonth yearMonth) {
150   -// List<EvalUserPool> pools = userEvalPool(userId, yearMonth);
151   -// if (PublicUtil.isEmpty(pools)) {
152   -// return new ArrayList<>();
153   -// }
154   -// EvalUserPool userPool = pools.get(0);
155   -// Long postId = userPool.getPostId();
156   -// Long shopId = userPool.getShopId();
157   -//
158   -// pools.stream().filter()
159   -//
160   -// return poolDetail(evalUserPool);
161   -// }
162   -
163 143 public EvalUserPoolVO poolDetail(EvalUserPool pool) {
164 144 EvalUserPoolVO evalUserPoolVO = PublicUtil.copy(pool, EvalUserPoolVO.class);
165 145 evalUserPoolVO.convertScoreRatio();
... ... @@ -282,21 +262,25 @@ public class EvalGroupPoolService {
282 262 * @param yearMonth
283 263 * @return
284 264 */
285   - public List<EvalSelectorVO> evalPoolSelector(Long userId, YearMonth yearMonth) {
  265 + public EvalPoolVO evalPoolSelector(Long userId, YearMonth yearMonth) {
286 266 List<EvalUserPool> pools = userEvalPool(userId, yearMonth);
287 267 if (CollectionUtils.isEmpty(pools)) {
288   - return new ArrayList<>();
  268 + return null;
289 269 }
  270 + String userName = pools.stream().findFirst().map(EvalUserPool::getUserName).orElse("");
290 271 List<EvalSelectorVO> selectors = new ArrayList<>();
  272 + EvalPoolVO evalPoolVO = new EvalPoolVO(userId, userName, selectors);
291 273 Map<Long, String> rankNameMap = this.getRankNameMap(pools);
292 274 Map<String, List<EvalUserPool>> shopPostMap = pools.stream().collect(Collectors.groupingBy(pool -> pool.getShopName() + "(" + pool.getPostName() + ")"));
293 275 //门店、岗位维度
294 276 for (Map.Entry<String, List<EvalUserPool>> shopPostEntry : shopPostMap.entrySet()) {
295   -
296 277 List<EvalUserGroupRankVO> ranks = new ArrayList<>();
297   - Map<Long, List<EvalUserPool>> rankPools = shopPostEntry.getValue().stream().collect(Collectors.groupingBy(EvalUserPool::getEvalGroupRankId));
  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 + //排名维度
298 283 for (Map.Entry<Long, List<EvalUserPool>> rankEntry : rankPools.entrySet()) {
299   - String rankName = rankNameMap.getOrDefault(rankEntry.getKey(), "");
300 284 List<EvalUserPool> userRankPools = rankEntry.getValue();
301 285 double averageKpiScoreRatio = userRankPools.stream()
302 286 .mapToDouble(r -> Optional.ofNullable(r.getScoreRatio()).orElse(BigDecimal.ZERO).doubleValue())
... ... @@ -307,12 +291,15 @@ public class EvalGroupPoolService {
307 291 rank.setEvalGroupRankName(rankNameMap.getOrDefault(rankEntry.getKey(), ""));
308 292 rank.setScoreRatio(new BigDecimal(averageKpiScoreRatio).multiply(Constant.ONE_HUNDRED));
309 293 rank.setReward(reward);
  294 + rank.setEvalGroupRankId(rankEntry.getKey());
310 295 ranks.add(rank);
311 296 }
312 297 EvalSelectorVO evalSelectorVO = new EvalSelectorVO(shopPostEntry.getKey(), ranks);
  298 + evalSelectorVO.setShopId(shopId);
  299 + evalSelectorVO.setPostId(postId);
313 300 selectors.add(evalSelectorVO);
314 301 }
315   - return selectors;
  302 + return evalPoolVO;
316 303 }
317 304  
318 305 public Map<Long, String> getRankNameMap(List<EvalUserPool> pools) {
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java
... ... @@ -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 57 List<EvalGroup> evalGroups = evalGroupService.getAllEffectGroups(queryDate);
59 58 if (PublicUtil.isEmpty(evalGroups)) {
60 59 log.info("时间:{},没有正在生效中的考评组配置", DateTimeFormatter.ofPattern("yyyy-MM-dd").format(queryDate));
61 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 /**
... ... @@ -69,24 +71,11 @@ public class EvalGroupUserBizService {
69 71 * @return
70 72 */
71 73 @Transactional(rollbackFor = Exception.class)
72   - public List<EvalGroupUser> fetchBuildKpiUser(Long postId, List<EvalGroup> evalGroups, LocalDate localDate){
73   - Set<Long> shopIds = new HashSet<>();
74   - Map<Long, EvalGroup> shopKpiGroupMap = new HashMap<>();
75   - for (EvalGroup evalGroup : evalGroups) {
76   - shopIds.addAll(evalGroup.getShopIds());
77   - for (Long shopId : evalGroup.getShopIds()) {
78   - shopKpiGroupMap.put(shopId, evalGroup);
79   - }
80   - }
81   - List<EvalGroupUser> evalGroupUsers = this.fetchPostUsers(postId, new ArrayList<>(shopIds), localDate);
  74 + public List<EvalGroupUser> fetchBuildKpiUser(Long postId, EvalGroup evalGroup, LocalDate localDate){
  75 + List<EvalGroupUser> evalGroupUsers = this.fetchPostUsers(postId, evalGroup.getShopIds(), localDate);
82 76  
83 77 //构建考评组信息
84 78 for (EvalGroupUser user : evalGroupUsers) {
85   - if (! shopKpiGroupMap.containsKey(user.getShopId())) {
86   - log.error("员工门店没有绩效组配置,门店:{},岗位:{},员工:{}", user.getShopId(), user.getPostId(), user.getId());
87   - continue;
88   - }
89   - EvalGroup evalGroup = shopKpiGroupMap.get(user.getShopId());
90 79 user.setEvalGroupRankId(evalGroup.getEvalGroupRankId());
91 80 user.setEvalGroupRankStageId(evalGroup.getEvalGroupRankStageId());
92 81 user.setEvalGroupId(evalGroup.getId());
... ...