Merged
Merge Request #128 · created by 姜超


计算考评修改

计算考评修改


From test into main

Merged by 姜超

1 participants
fw-morax-dao/src/main/resources/mapper/eval/EvalGroupMapper.xml
... ... @@ -72,13 +72,15 @@
72 72 t3.id
73 73 FROM
74 74 eval_group_rank t1
75   - LEFT JOIN eval_group_rank_stage t2 ON t1.id = t2.eval_group_rank_id AND t2.yn = 1
76   - LEFT JOIN eval_group t3 ON t2.id = t3.eval_group_rank_stage_id AND t3.yn = 1
  75 + INNER JOIN eval_group_rank_stage t2 ON t1.id = t2.eval_group_rank_id AND t2.yn = 1
  76 + INNER JOIN eval_group t3 ON t2.id = t3.eval_group_rank_stage_id AND t3.yn = 1
  77 + INNER JOIN eval_group_reward_dim t4 ON t3.id = t4.eval_group_id AND t4.yn = 1
77 78 WHERE
78 79 t1.yn = 1
79 80 AND t1.`status` IN ( 3, 4 )
80 81 and DATE_FORMAT(t2.begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d')
81 82 and DATE_FORMAT(t2.over_time, '%Y-%m-%d') = DATE_FORMAT(#{day}, '%Y-%m-%d')
  83 + AND t4.`type` = 2
82 84 </select>
83 85  
84 86 <select id="getEffectsByRankId" resultMap="BaseResultMap">
... ...
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/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 import cn.fw.data.base.domain.common.Message;
10 10 import cn.fw.morax.common.utils.PublicUtil;
11 11 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO;
  12 +import cn.fw.morax.domain.dto.eval.EvalUserRankDTO;
12 13 import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO;
13 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 17 import cn.fw.morax.domain.vo.eval.*;
16 18 import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO;
17 19 import cn.fw.morax.service.biz.eval.*;
... ... @@ -24,12 +26,12 @@ import lombok.extern.slf4j.Slf4j;
24 26 import org.springframework.validation.annotation.Validated;
25 27 import org.springframework.web.bind.annotation.*;
26 28  
  29 +import javax.validation.Valid;
27 30 import javax.validation.constraints.NotNull;
28 31 import java.time.LocalDate;
29 32 import java.time.YearMonth;
30 33 import java.util.List;
31 34 import java.util.Objects;
32   -import java.util.Set;
33 35  
34 36 import static cn.fw.common.businessvalidator.Validator.BV;
35 37 import static cn.fw.common.web.util.ResultBuilder.success;
... ... @@ -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 93 * @param user 用户id
... ... @@ -80,7 +99,8 @@ public class EvalPoolController {
80 99 @GetMapping("/staff-selector")
81 100 @IgnoreUserToken
82 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 104 if (Objects.isNull(monthly)) {
85 105 monthly = YearMonth.now();
86 106 }
... ... @@ -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 116 @GetMapping("/own-detail")
102 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 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 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/calculator/eval/reward/EvalRewardProportionCalculator.java
... ... @@ -23,6 +23,7 @@ import java.math.RoundingMode;
23 23 import java.util.HashMap;
24 24 import java.util.List;
25 25 import java.util.Map;
  26 +import java.util.stream.Collectors;
26 27  
27 28 /**
28 29 * @author jiangchao
... ... @@ -46,6 +47,7 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator {
46 47  
47 48 @Override
48 49 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) {
  50 + userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
49 51 if (PublicUtil.isEmpty(userShops)) {
50 52 return;
51 53 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java
... ... @@ -45,6 +45,7 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
45 45  
46 46 @Override
47 47 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) {
  48 + userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
48 49 if (PublicUtil.isEmpty(userShops)) {
49 50 return;
50 51 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
... ... @@ -116,7 +116,6 @@ public class EvalCalculateService {
116 116 log.info("定时任务【缓存需要计算的考评组】开始执行");
117 117 List<EvalGroup> evalGroups = evalGroupService.getAllEffectGroups(localDate);
118 118 Set<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toSet());
119   -// Set<Long> evalGroupIds = evalGroupService.queryCalculableEvalGroupIds(localDate);
120 119 if (CollectionUtils.isEmpty(evalGroupIds)) {
121 120 return;
122 121 }
... ... @@ -184,7 +183,7 @@ public class EvalCalculateService {
184 183 log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup));
185 184 return;
186 185 }
187   - List<EvalGroupUserShop> userShops = this.buildEvalGroupObj(evalGroup, evalGroupRankStage.getBeginTime(), localDate, scopeType);
  186 + List<EvalGroupUserShop> userShops = this.buildEvalGroupObj(evalGroup, evalGroupRankStage, localDate, scopeType);
188 187 if (CollectionUtils.isEmpty(userShops)) {
189 188 log.error("考评组[{}]人员为空,终止计算!", evalGroupId);
190 189 return;
... ... @@ -239,10 +238,11 @@ public class EvalCalculateService {
239 238 if (userShop.getIndicatorTotalScore().compareTo(BigDecimal.ZERO) > 0) {
240 239 scoreRatio = userShop.getScore().divide(userShop.getIndicatorTotalScore(), 2, RoundingMode.DOWN);
241 240 }
  241 + BigDecimal reward = (Boolean.TRUE.equals(userShop.getIgnored())) ? BigDecimal.ZERO : userShop.getReward();
242 242 evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate()
243 243 .eq(EvalUserPool::getId, userShop.getPoolId())
244 244 .eq(EvalUserPool::getYn, Boolean.TRUE)
245   - .set(EvalUserPool::getReward, userShop.getReward())
  245 + .set(EvalUserPool::getReward, reward)
246 246 .set(EvalUserPool::getScore, userShop.getScore())
247 247 .set(EvalUserPool::getScoreRatio, scoreRatio)
248 248 .set(EvalUserPool::getMonthly, YearMonth.from(localDate))
... ... @@ -269,34 +269,29 @@ public class EvalCalculateService {
269 269 }
270 270  
271 271  
272   - public List<EvalGroupUserShop> buildEvalGroupObj(EvalGroup evalGroup, LocalDate beginDate, LocalDate localDate, EvalScopeEnum scopeType) {
  272 + public List<EvalGroupUserShop> buildEvalGroupObj(EvalGroup evalGroup, EvalGroupRankStage evalGroupRankStage, LocalDate localDate, EvalScopeEnum scopeType) {
  273 + LocalDate beginDate = evalGroupRankStage.getBeginTime();
273 274 List<EvalGroupUserShop> userShops = new ArrayList<>();
274 275 if (EvalScopeEnum.STAFF.equals(scopeType)) {
275 276 List<EvalGroupUser> users = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery()
276   - .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId())
  277 + .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupRankStage.getId())
277 278 .eq(EvalGroupUser::getDataDate, localDate)
278 279 .eq(EvalGroupUser::getYn, Boolean.TRUE)
279 280 );
280 281  
281   - Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, users, localDate);
  282 + Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, evalGroupRankStage, users, localDate);
282 283 for (EvalGroupUser user : users) {
283   - if (Boolean.TRUE.equals(user.getIgnored())) {
284   - continue;
285   - }
286 284 EvalUserPool userPool = userPoolMap.get(user.getUserId());
287 285 userShops.add(convertBO(user, userPool));
288 286 }
289 287 return userShops;
290 288 }
291   -
292 289 List<Long> distShopIds = this.getEvalDistShopIds(evalGroup);
293   - if (PublicUtil.isEmpty(distShopIds)) {
294   - return new ArrayList<>();
295   - }
296 290 Map<Long, EvalShopPool> shopPoolBOMap = evalPoolCommonService.inspectionShopPools(evalGroup, localDate, distShopIds);
297   - for (Long shopId : distShopIds) {
  291 + for (Long shopId : evalGroup.getShopIds()) {
298 292 EvalShopPool shopPool = shopPoolBOMap.get(shopId);
299   - userShops.add(convertBO(shopPool, evalGroup, beginDate, localDate));
  293 + Boolean ignored = ! distShopIds.contains(shopId);
  294 + userShops.add(convertBO(shopPool, evalGroup, beginDate, localDate, ignored));
300 295 }
301 296 return userShops;
302 297 }
... ... @@ -637,10 +632,11 @@ public class EvalCalculateService {
637 632 userShop.setGroupId(user.getGroupId());
638 633 userShop.setScore(BigDecimal.ZERO);
639 634 userShop.setReward(BigDecimal.ZERO);
  635 + userShop.setIgnored(user.getIgnored());
640 636 return userShop;
641 637 }
642 638  
643   - public EvalGroupUserShop convertBO(EvalShopPool shopPool, EvalGroup evalGroup, LocalDate beginDate, LocalDate dataDate) {
  639 + public EvalGroupUserShop convertBO(EvalShopPool shopPool, EvalGroup evalGroup, LocalDate beginDate, LocalDate dataDate, Boolean ignored) {
644 640 EvalGroupUserShop userShop = new EvalGroupUserShop();
645 641 userShop.setName(shopPool.getShopName());
646 642 userShop.setReferId(shopPool.getShopId());
... ... @@ -652,6 +648,7 @@ public class EvalCalculateService {
652 648 userShop.setBeginDate(beginDate);
653 649 userShop.setDataDate(dataDate);
654 650 userShop.setGroupId(evalGroup.getGroupId());
  651 + userShop.setIgnored(ignored);
655 652 userShop.setScore(BigDecimal.ZERO);
656 653 userShop.setReward(BigDecimal.ZERO);
657 654 return userShop;
... ...
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 import cn.fw.morax.domain.db.eval.*;
8 8 import cn.fw.morax.domain.db.kpi.*;
9 9 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO;
  10 +import cn.fw.morax.domain.dto.eval.EvalUserRankDTO;
10 11 import cn.fw.morax.domain.enums.*;
  12 +import cn.fw.morax.domain.vo.EvalPoolVO;
  13 +import cn.fw.morax.domain.vo.EvalSelectorVO;
11 14 import cn.fw.morax.domain.vo.SelectorVO;
12 15 import cn.fw.morax.domain.vo.eval.*;
13 16 import cn.fw.morax.domain.vo.kpi.IndicatorUserValueVO;
... ... @@ -60,6 +63,8 @@ public class EvalGroupPoolService {
60 63 private final EvalIndicatorValueService evalIndicatorValueService;
61 64 private final EvalGroupUserService evalGroupUserService;
62 65 private final EvalGroupRewardService evalGroupRewardService;
  66 + private final EvalGroupRankStageService evalGroupRankStageService;
  67 + private final EvalGroupRankService evalGroupRankService;
63 68 private final EvalGroupService evalGroupService;
64 69 private final EvalUserPoolService evalUserPoolService;
65 70 private final EvalShopPoolService evalShopPoolService;
... ... @@ -101,31 +106,38 @@ public class EvalGroupPoolService {
101 106 *
102 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 143 public EvalUserPoolVO poolDetail(EvalUserPool pool) {
... ... @@ -139,12 +151,6 @@ public class EvalGroupPoolService {
139 151 this.setIgnore(evalUserPoolVO);
140 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 154 return evalUserPoolVO;
149 155 }
150 156  
... ... @@ -256,14 +262,73 @@ public class EvalGroupPoolService {
256 262 * @param yearMonth
257 263 * @return
258 264 */
259   - public Set<SelectorVO> evalPoolSelector(Long userId, YearMonth yearMonth) {
  265 + public EvalPoolVO evalPoolSelector(Long userId, YearMonth yearMonth) {
260 266 List<EvalUserPool> pools = userEvalPool(userId, yearMonth);
261 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 373 if (PublicUtil.isEmpty(pool)) {
309 374 return null;
310 375 }
311   -// BV.notNull(pool, "考评池不存在");
312 376 Long userId = pool.getUserId();
313 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 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());
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java
... ... @@ -17,6 +17,7 @@ import cn.fw.morax.service.data.salary.SalaryGroupUserService;
17 17 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
18 18 import lombok.AllArgsConstructor;
19 19 import lombok.extern.slf4j.Slf4j;
  20 +import org.apache.commons.collections4.map.MultiKeyMap;
20 21 import org.springframework.stereotype.Service;
21 22 import org.springframework.transaction.annotation.Transactional;
22 23  
... ... @@ -46,29 +47,36 @@ public class EvalPoolCommonService {
46 47 private EhrRpcService ehrRpcService;
47 48 private OopRpcService oopRpcService;
48 49  
49   - public Map<Long, EvalUserPool> inspectionUserPoolMap(EvalGroup evalGroup, List<EvalGroupUser> users, LocalDate localDate) {
  50 + public Map<Long, EvalUserPool> inspectionUserPoolMap(EvalGroup evalGroup, EvalGroupRankStage evalGroupRankStage, List<EvalGroupUser> users, LocalDate localDate) {
50 51 if (PublicUtil.isEmpty(users)) {
51 52 return new HashMap<>();
52 53 }
53 54 Set<Long> userIds = users.stream().map(EvalGroupUser::getUserId).collect(Collectors.toSet());
54 55 List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
55   - .eq(EvalUserPool::getEvalGroupId, evalGroup.getId())
  56 + .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId())
56 57 .eq(EvalUserPool::getMonthly, YearMonth.from(localDate))
57 58 .in(EvalUserPool::getUserId, userIds)
58 59 .eq(EvalUserPool::getYn, Boolean.TRUE)
59 60 );
60 61  
61   - Map<Long, EvalUserPool> userPoolMap = pools.stream().collect(Collectors.toMap(EvalUserPool::getUserId, Function.identity(), (v1, v2) -> {
62   - log.error("同一个考评组、考评人员出现两条考评池数据。用户id:{},考评组:{}", v1.getUserId(), evalGroup);
63   - return v1;
64   - }));
  62 + //人员可能在考评组中出现多次(调岗)
  63 + MultiKeyMap<Long, EvalUserPool> userShopPostShopIdMap = new MultiKeyMap<>();
  64 + for (EvalUserPool pool : pools) {
  65 + userShopPostShopIdMap.put(pool.getUserId(), pool.getShopId(), pool.getPostId(), pool);
  66 + }
65 67  
66 68 for (EvalGroupUser user : users) {
67   - if (! userPoolMap.containsKey(user.getUserId())) {
  69 + if (! userShopPostShopIdMap.containsKey(user.getUserId(), user.getShopId(), user.getPostId())) {
68 70 EvalUserPool userPool = inspectionUserPool(user);
69   - userPoolMap.put(userPool.getUserId(), userPool);
  71 + userShopPostShopIdMap.put(user.getUserId(), user.getShopId(), user.getPostId(), userPool);
70 72 }
71 73 }
  74 +
  75 + Map<Long, EvalUserPool> userPoolMap = userShopPostShopIdMap.values().stream().collect(Collectors.toMap(EvalUserPool::getUserId, Function.identity(), (v1, v2) -> {
  76 + log.error("同一个考评组、考评人员出现两条考评池数据。用户id:{},考评组:{}", v1.getUserId(), evalGroup);
  77 + return v1;
  78 + }));
  79 +
72 80 return userPoolMap;
73 81 }
74 82  
... ... @@ -87,45 +95,17 @@ public class EvalPoolCommonService {
87 95 return v1;
88 96 }));
89 97  
90   - if (PublicUtil.isEmpty(distShopIds)) {
91   - return new HashMap<>();
92   - }
93   - for (Long shopId : distShopIds) {
  98 + for (Long shopId : evalGroupShopIds) {
94 99 if (! shopPoolMap.containsKey(shopId)) {
95   -// EvalShopPoolStatusEnum status = (distShopIds.contains(shopId))
96   -// ? EvalShopPoolStatusEnum.CALC_REWARD : EvalShopPoolStatusEnum.NO_REWARD;
97   - EvalShopPool shopPool = this.inspectionShopPool(shopId, evalGroup, localDate, EvalShopPoolStatusEnum.CALC_REWARD);
  100 + EvalShopPoolStatusEnum status = (distShopIds.contains(shopId))
  101 + ? EvalShopPoolStatusEnum.CALC_REWARD : EvalShopPoolStatusEnum.NO_REWARD;
  102 + EvalShopPool shopPool = this.createShopPoolData(shopId, evalGroup, localDate, status);
98 103 shopPoolMap.put(shopId, shopPool);
99 104 }
100 105 }
101 106 return shopPoolMap;
102 107 }
103 108  
104   - /**
105   - * 查询考评门店池
106   - *
107   - * @return
108   - */
109   - @Transactional(rollbackFor = Exception.class)
110   - public EvalShopPool inspectionShopPool(Long shopId, EvalGroup evalGroup, LocalDate localDate, EvalShopPoolStatusEnum status) {
111   - EvalShopPool evalShopPool = evalShopPoolService.getOne(Wrappers.<EvalShopPool>lambdaQuery()
112   - .eq(EvalShopPool::getId, evalGroup.getId())
113   - .eq(EvalShopPool::getShopId, shopId)
114   - .eq(EvalShopPool::getYn, Boolean.TRUE)
115   - .eq(EvalShopPool::getMonthly, YearMonth.from(localDate).minusMonths(1))
116   - , Boolean.FALSE);
117   - if (PublicUtil.isNotEmpty(evalShopPool)) {
118   - evalShopPoolService.update(Wrappers.<EvalShopPool>lambdaUpdate()
119   - .eq(EvalShopPool::getId, evalShopPool.getId())
120   - .set(EvalShopPool::getMonthly, YearMonth.from(localDate))
121   - .set(EvalShopPool::getUpdateTime, new Date())
122   - );
123   - evalShopPool.setMonthly(YearMonth.from(localDate));
124   - return evalShopPool;
125   - }
126   - return this.createShopPoolData(shopId, evalGroup, localDate, status);
127   - }
128   -
129 109 @Transactional(rollbackFor = Exception.class)
130 110 public EvalShopPool createShopPoolData(Long shopId, EvalGroup evalGroup, LocalDate localDate, EvalShopPoolStatusEnum status) {
131 111 ShopDTO shopDTO = oopRpcService.queryShop(shopId);
... ... @@ -157,29 +137,31 @@ public class EvalPoolCommonService {
157 137 @Transactional(rollbackFor = Exception.class)
158 138 public EvalUserPool inspectionUserPool(EvalGroupUser user) {
159 139 EvalUserPool evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
160   - .eq(EvalUserPool::getEgc, user.getEgc())
  140 + .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
161 141 .eq(EvalUserPool::getUserId, user.getUserId())
  142 + .eq(EvalUserPool::getPostId, user.getPostId())
  143 + .eq(EvalUserPool::getShopId, user.getShopId())
162 144 .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
163 145 .eq(EvalUserPool::getYn, Boolean.TRUE)
164 146 , Boolean.FALSE);
165 147 if (PublicUtil.isNotEmpty(evalUserPool)) {
166 148 return evalUserPool;
167 149 }
168   - evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
169   - .eq(EvalUserPool::getEgc, user.getEgc())
170   - .eq(EvalUserPool::getUserId, user.getUserId())
171   - .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()).minusMonths(1))
172   - .eq(EvalUserPool::getYn, Boolean.TRUE)
173   - , Boolean.FALSE);
174   - if (PublicUtil.isNotEmpty(evalUserPool)) {
175   - evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate()
176   - .eq(EvalUserPool::getId, evalUserPool.getId())
177   - .set(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
178   - .set(EvalUserPool::getUpdateTime, new Date())
179   - );
180   - evalUserPool.setMonthly(YearMonth.from(user.getDataDate()));
181   - return evalUserPool;
182   - }
  150 +// evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
  151 +// .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
  152 +// .eq(EvalUserPool::getUserId, user.getUserId())
  153 +// .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()).minusMonths(1))
  154 +// .eq(EvalUserPool::getYn, Boolean.TRUE)
  155 +// , Boolean.FALSE);
  156 +// if (PublicUtil.isNotEmpty(evalUserPool)) {
  157 +// evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate()
  158 +// .eq(EvalUserPool::getId, evalUserPool.getId())
  159 +// .set(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
  160 +// .set(EvalUserPool::getUpdateTime, new Date())
  161 +// );
  162 +// evalUserPool.setMonthly(YearMonth.from(user.getDataDate()));
  163 +// return evalUserPool;
  164 +// }
183 165 return this.createUserPoolData(user);
184 166 }
185 167  
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java
1 1 package cn.fw.morax.service.biz.eval;
2 2  
  3 +import cn.fw.backlog.sdk.api.result.FailBacklogItem;
3 4 import cn.fw.common.cache.locker.DistributedLocker;
4 5 import cn.fw.common.exception.BusinessException;
5 6 import cn.fw.common.web.auth.LoginAuthBean;
6 7 import cn.fw.morax.common.config.TodoVal;
7 8 import cn.fw.morax.common.pojo.event.ApprovalResultEvent;
  9 +import cn.fw.morax.common.utils.DateUtil;
8 10 import cn.fw.morax.common.utils.PublicUtil;
9 11 import cn.fw.morax.common.utils.ThreadPoolUtil;
10 12 import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO;
11 13 import cn.fw.morax.domain.db.ApprovalRecord;
12   -import cn.fw.morax.domain.db.eval.EvalGroup;
13   -import cn.fw.morax.domain.db.eval.EvalRewardDist;
14   -import cn.fw.morax.domain.db.eval.EvalRewardDistDetail;
15   -import cn.fw.morax.domain.db.eval.EvalShopPool;
  14 +import cn.fw.morax.domain.db.eval.*;
16 15 import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO;
17 16 import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO;
18   -import cn.fw.morax.domain.enums.ApprovalTypeEnum;
19   -import cn.fw.morax.domain.enums.EvalRewardDistStatusEnum;
20   -import cn.fw.morax.domain.enums.EvalRewardPushStatusEnum;
  17 +import cn.fw.morax.domain.enums.*;
21 18 import cn.fw.morax.domain.vo.eval.EvalRewardDistDetailVO;
22 19 import cn.fw.morax.domain.vo.eval.EvalRewardDistVO;
23 20 import cn.fw.morax.domain.vo.eval.EvalShopPoolVO;
24 21 import cn.fw.morax.rpc.backlog.TodoRpcService;
25 22 import cn.fw.morax.rpc.backlog.dto.BackLogItemDTO;
  23 +import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanItemReqDTO;
  24 +import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanReqDTO;
26 25 import cn.fw.morax.rpc.erp.ErpRpcService;
27 26 import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO;
  27 +import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO;
28 28 import cn.fw.morax.service.biz.ApprovalBizService;
29 29 import cn.fw.morax.service.data.ApprovalRecordService;
30   -import cn.fw.morax.service.data.eval.EvalGroupService;
31   -import cn.fw.morax.service.data.eval.EvalRewardDistDetailService;
32   -import cn.fw.morax.service.data.eval.EvalRewardDistService;
33   -import cn.fw.morax.service.data.eval.EvalShopPoolService;
  30 +import cn.fw.morax.service.data.eval.*;
34 31 import com.alibaba.fastjson.JSON;
35 32 import com.alibaba.fastjson.JSONObject;
36 33 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
... ... @@ -47,11 +44,14 @@ import org.springframework.stereotype.Service;
47 44 import org.springframework.transaction.annotation.Transactional;
48 45  
49 46 import java.math.BigDecimal;
  47 +import java.text.DecimalFormat;
50 48 import java.time.LocalDate;
  49 +import java.time.LocalDateTime;
51 50 import java.util.*;
52 51 import java.util.concurrent.RejectedExecutionException;
53 52 import java.util.concurrent.ThreadPoolExecutor;
54 53 import java.util.concurrent.locks.Lock;
  54 +import java.util.stream.Collectors;
55 55  
56 56 import static cn.fw.common.businessvalidator.Validator.BV;
57 57  
... ... @@ -75,6 +75,9 @@ public class EvalRewardService {
75 75 private final EvalShopPoolService evalShopPoolService;
76 76 private final ApprovalRecordService approvalRecordService;
77 77 private final EvalRewardDistService evalRewardDistService;
  78 + private final EvalGroupRankService evalGroupRankService;
  79 + private final EvalGroupRankStageService evalGroupRankStageService;
  80 + private final EvalGroupRewardDimService evalGroupRewardDimService;
78 81 private final EvalRewardDistDetailService evalRewardDistDetailService;
79 82  
80 83 @Value("${spring.cache.custom.global-prefix}:dist:eval-reward")
... ... @@ -152,14 +155,32 @@ public class EvalRewardService {
152 155 log.info("分配奖惩的考评组:{}", evalGroupId);
153 156 EvalGroup evalGroup = evalGroupService.getById(evalGroupId);
154 157 BV.notNull(evalGroup, "考评组不存在,终止计算!");
  158 + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId());
  159 + BV.notNull(evalGroupRank, "考评排名组不存在,终止计算!");
  160 + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getById(evalGroup.getEvalGroupRankStageId());
  161 + BV.notNull(evalGroupRankStage, "考评阶段不存在,终止计算!");
  162 +
  163 +
  164 +// List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
  165 +// .eq(EvalShopPool::getEvalGroupId, evalGroupId)
  166 +// .eq(EvalShopPool::getYn, Boolean.TRUE)
  167 +// );
  168 +// if (PublicUtil.isEmpty(pools)) {
  169 +// log.error("考评池不存在,终止计算!");
  170 +// return;
  171 +// }
  172 +// BV.isNotEmpty(pools, "考评池不存在,终止计算!");
155 173  
156   - List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
157   - .eq(EvalShopPool::getEvalGroupId, evalGroupId)
158   - .eq(EvalShopPool::getYn, Boolean.TRUE)
  174 + List<EvalGroupRewardDim> shopRewardDims = evalGroupRewardDimService.list(Wrappers.<EvalGroupRewardDim>lambdaQuery()
  175 + .eq(EvalGroupRewardDim::getEvalGroupId, evalGroup.getId())
  176 + .eq(EvalGroupRewardDim::getType, EvalScopeEnum.SHOP)
  177 + .eq(EvalGroupRewardDim::getYn, Boolean.TRUE)
159 178 );
160   - BV.isNotEmpty(pools, "考评池不存在,终止计算!");
161   -
162   - sendDistRewardTodo(pools, evalGroup );
  179 + if (PublicUtil.isEmpty(shopRewardDims)) {
  180 + log.error("考评奖惩没有门店:{}", JSON.toJSONString(evalGroup));
  181 + return;
  182 + }
  183 +// sendDistRewardTodo(shopRewardDims, evalGroup, evalGroupRank, evalGroupRankStage);
163 184 }
164 185  
165 186 /**
... ... @@ -168,81 +189,98 @@ public class EvalRewardService {
168 189 * @param
169 190 */
170 191 @Transactional(rollbackFor = Exception.class)
171   - public void sendDistRewardTodo(List<EvalShopPool> pools, EvalGroup evalGroup) {
172   -// Eval eval = evalService.getById(evalGroup.getEvalGroupRankId());
173   -// BV.notNull(eval, "考评配置不存在,请重试");
174   -//
175   -// DecimalFormat decimalFormat = new DecimalFormat("##########.##");
176   -// final String roleCode = evalGroup.getRoleCodes().stream().findFirst().get();
177   -// final String evalGroupName = evalGroup.getName();
178   -// final String evalName = eval.getName();
179   -// final EvalTypeEnum evalType = eval.getType();
180   -// List<Long> shopIds = evalGroup.getShopIds();
181   -//
182   -// Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L));
183   -//
184   -// List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>();
185   -// List<RpcUserRoleInfoDTO> users = this.getUserEnableRoleInfos(roleCode, shopIds);
186   -// for (RpcUserRoleInfoDTO user : users) {
187   -// List<Long> manageShopIds = user.getRangeList().stream()
188   -// .filter(range -> shopIds.contains(range.getShopId()))
189   -// .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList());
190   -// if (PublicUtil.isEmpty(manageShopIds)) {
191   -// continue;
192   -// }
193   -//
194   -// List<Long> poolIds = new ArrayList<>();
195   -// BigDecimal reward = BigDecimal.ZERO;
196   -// for (EvalShopPool pool : pools) {
197   -// if (manageShopIds.contains(pool.getShopId())) {
198   -// poolIds.add(pool.getId());
199   -// reward = reward.add(pool.getReward());
200   -// }
201   -// }
202   -// //奖惩为0不分配
203   -// if (BigDecimal.ZERO.compareTo(reward) == 0) {
204   -// return;
205   -// }
206   -//
207   -// EvalRewardDist rewardDist = transferPo(evalGroup);
208   -// rewardDist.setUserId(user.getUserId());
209   -// rewardDist.setEvalShopPoolIds(poolIds);
210   -// rewardDist.setShopIds(manageShopIds);
211   -// rewardDist.setEvalName(evalName);
212   -// rewardDist.setEvalType(evalType);
213   -// rewardDist.setReward(reward);
214   -// evalRewardDistService.save(rewardDist);
215   -//
216   -// BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO();
217   -// planItemReq.setDataId(rewardDist.getId().toString());
218   -// planItemReq.setUserId(user.getUserId());
219   -// planItemReq.setPlanTime(new Date());
220   -// planItemReq.setExpireTime(expireTime);
221   -//
222   -// Map<String, String> dynamicMap = new HashMap<>(8);
223   -// dynamicMap.put("evalGroupName", evalGroupName);
224   -// dynamicMap.put("evalName", evalName);
225   -// dynamicMap.put("evalType", evalType.getName());
226   -// dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward()));
227   -// planItemReq.setDynamicMap(dynamicMap);
228   -//
229   -// Map<String, Object> extraData = new HashMap<>();
230   -// planItemReq.setExtraData(extraData);
231   -// itemList.add(planItemReq);
232   -// }
233   -//
234   -//
235   -// //推送待办
236   -// BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList);
237   -// List<FailBacklogItem> failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>());
238   -// if (PublicUtil.isNotEmpty(failItems)) {
239   -// log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems));
240   -// }
  192 + public void sendDistRewardTodo(List<EvalGroupRewardDim> shopRewardDims, EvalGroup evalGroup,
  193 + EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage) {
  194 + String evalGroupRankName = evalGroupRank.getName();
  195 + String evalGroupRankStageName = evalGroupRankStage.getName();
  196 + DecimalFormat decimalFormat = new DecimalFormat("##########.##");
  197 + List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>();
  198 +
  199 + List<Long> distPoolIds = new ArrayList<>();
  200 + final Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L));
  201 + for (EvalGroupRewardDim rewardDim : shopRewardDims) {
  202 + final String roleCode = rewardDim.getDistRoleCode();
  203 + List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
  204 + .eq(EvalShopPool::getEvalGroupId, evalGroup.getId())
  205 + .in(EvalShopPool::getShopId, rewardDim.getShopIds())
  206 + .eq(EvalShopPool::getYn, Boolean.TRUE)
  207 + );
  208 + if (PublicUtil.isEmpty(pools)) {
  209 + log.error("分配奖惩待办,未找到考评池:{}", JSON.toJSONString(rewardDim));
  210 + continue;
  211 + }
  212 + List<Long> distShopIds = pools.stream().filter(pool -> pool.getReward().compareTo(BigDecimal.ZERO) == 0)
  213 + .map(EvalShopPool::getShopId).collect(Collectors.toList());
  214 +
  215 + List<RpcUserRoleInfoDTO> users = this.getUserEnableRoleInfos(roleCode, distShopIds);
  216 + for (RpcUserRoleInfoDTO user : users) {
  217 + List<Long> manageShopIds = user.getRangeList().stream()
  218 + .filter(range -> distShopIds.contains(range.getShopId()))
  219 + .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList());
  220 + if (PublicUtil.isEmpty(manageShopIds)) {
  221 + continue;
  222 + }
  223 + List<Long> poolIds = new ArrayList<>();
  224 + BigDecimal reward = BigDecimal.ZERO;
  225 + for (EvalShopPool pool : pools) {
  226 + if (manageShopIds.contains(pool.getShopId())) {
  227 + poolIds.add(pool.getId());
  228 + distPoolIds.add(pool.getId());
  229 + reward = reward.add(pool.getReward());
  230 + }
  231 + }
  232 + //奖惩为0不分配
  233 + if (BigDecimal.ZERO.compareTo(reward) == 0) {
  234 + return;
  235 + }
  236 +
  237 + EvalRewardDist rewardDist = transferPo(evalGroup);
  238 + rewardDist.setUserId(user.getUserId());
  239 + rewardDist.setEvalShopPoolIds(poolIds);
  240 + rewardDist.setShopIds(manageShopIds);
  241 + rewardDist.setEvalName(evalGroupRankName);
  242 +// rewardDist.setEvalType(evalType);
  243 + rewardDist.setReward(reward);
  244 + evalRewardDistService.save(rewardDist);
  245 +
  246 + BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO();
  247 + planItemReq.setDataId(rewardDist.getId().toString());
  248 + planItemReq.setUserId(user.getUserId());
  249 + planItemReq.setPlanTime(new Date());
  250 + planItemReq.setExpireTime(expireTime);
  251 +
  252 + Map<String, String> dynamicMap = new HashMap<>(8);
  253 + dynamicMap.put("evalGroupName", evalGroupRankName);
  254 + dynamicMap.put("evalName", evalGroupRankStageName);
  255 +// dynamicMap.put("evalType", evalType.getName());
  256 + dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward()));
  257 + planItemReq.setDynamicMap(dynamicMap);
  258 +
  259 + Map<String, Object> extraData = new HashMap<>();
  260 + planItemReq.setExtraData(extraData);
  261 + itemList.add(planItemReq);
  262 + }
241 263  
242   -// if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) {
243   -// pool.setStatus(EvalShopPoolStatusEnum.WAIT_DIST_REWARD);
244   -// evalShopPoolService.updateById(pool);
245   -// }
  264 + }
  265 +
  266 +
  267 + //推送待办
  268 + BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList);
  269 + List<FailBacklogItem> failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>());
  270 + if (PublicUtil.isNotEmpty(failItems)) {
  271 + log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems));
  272 + }
  273 +
  274 + if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) {
  275 + if (PublicUtil.isNotEmpty(distPoolIds)) {
  276 + evalShopPoolService.update(Wrappers.<EvalShopPool>lambdaUpdate()
  277 + .in(EvalShopPool::getId, distPoolIds)
  278 + .set(EvalShopPool::getStatus, EvalShopPoolStatusEnum.WAIT_DIST_REWARD)
  279 + .set(EvalShopPool::getYn, Boolean.FALSE)
  280 + .set(EvalShopPool::getUpdateTime, new Date())
  281 + );
  282 + }
  283 + }
246 284 }
247 285  
248 286 public EvalRewardDist transferPo(EvalGroup evalGroup) {
... ...