Commit 9990b9e035ef3b43f46a008b4eb8c215837f0762

Authored by 姜超
2 parents e29a7bdd 601b158c

Merge branch 'test' into 'main'

计算考评修改

计算考评修改

See merge request !128
Showing 19 changed files with 609 additions and 242 deletions
fw-morax-dao/src/main/resources/mapper/eval/EvalGroupMapper.xml
@@ -72,13 +72,15 @@ @@ -72,13 +72,15 @@
72 t3.id 72 t3.id
73 FROM 73 FROM
74 eval_group_rank t1 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 WHERE 78 WHERE
78 t1.yn = 1 79 t1.yn = 1
79 AND t1.`status` IN ( 3, 4 ) 80 AND t1.`status` IN ( 3, 4 )
80 and DATE_FORMAT(t2.begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d') 81 and DATE_FORMAT(t2.begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d')
81 and DATE_FORMAT(t2.over_time, '%Y-%m-%d') = DATE_FORMAT(#{day}, '%Y-%m-%d') 82 and DATE_FORMAT(t2.over_time, '%Y-%m-%d') = DATE_FORMAT(#{day}, '%Y-%m-%d')
  83 + AND t4.`type` = 2
82 </select> 84 </select>
83 85
84 <select id="getEffectsByRankId" resultMap="BaseResultMap"> 86 <select id="getEffectsByRankId" resultMap="BaseResultMap">
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 }
@@ -105,7 +105,7 @@ public class EvalGroupUserTask { @@ -105,7 +105,7 @@ public class EvalGroupUserTask {
105 List<EvalGroupUser> evalGroupUsers = null; 105 List<EvalGroupUser> evalGroupUsers = null;
106 for (EvalGroup evalGroup : evalGroups) { 106 for (EvalGroup evalGroup : evalGroups) {
107 for (Long postId : evalGroup.getPostIds()) { 107 for (Long postId : evalGroup.getPostIds()) {
108 - evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroups, yesterday); 108 + evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroup, yesterday);
109 evalGroupUsersForSave.addAll(evalGroupUsers); 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,6 +23,7 @@ import java.math.RoundingMode;
23 import java.util.HashMap; 23 import java.util.HashMap;
24 import java.util.List; 24 import java.util.List;
25 import java.util.Map; 25 import java.util.Map;
  26 +import java.util.stream.Collectors;
26 27
27 /** 28 /**
28 * @author jiangchao 29 * @author jiangchao
@@ -46,6 +47,7 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator { @@ -46,6 +47,7 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator {
46 47
47 @Override 48 @Override
48 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) { 49 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) {
  50 + userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
49 if (PublicUtil.isEmpty(userShops)) { 51 if (PublicUtil.isEmpty(userShops)) {
50 return; 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,6 +45,7 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
45 45
46 @Override 46 @Override
47 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) { 47 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) {
  48 + userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
48 if (PublicUtil.isEmpty(userShops)) { 49 if (PublicUtil.isEmpty(userShops)) {
49 return; 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,7 +116,6 @@ public class EvalCalculateService {
116 log.info("定时任务【缓存需要计算的考评组】开始执行"); 116 log.info("定时任务【缓存需要计算的考评组】开始执行");
117 List<EvalGroup> evalGroups = evalGroupService.getAllEffectGroups(localDate); 117 List<EvalGroup> evalGroups = evalGroupService.getAllEffectGroups(localDate);
118 Set<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toSet()); 118 Set<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toSet());
119 -// Set<Long> evalGroupIds = evalGroupService.queryCalculableEvalGroupIds(localDate);  
120 if (CollectionUtils.isEmpty(evalGroupIds)) { 119 if (CollectionUtils.isEmpty(evalGroupIds)) {
121 return; 120 return;
122 } 121 }
@@ -184,7 +183,7 @@ public class EvalCalculateService { @@ -184,7 +183,7 @@ public class EvalCalculateService {
184 log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup)); 183 log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup));
185 return; 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 if (CollectionUtils.isEmpty(userShops)) { 187 if (CollectionUtils.isEmpty(userShops)) {
189 log.error("考评组[{}]人员为空,终止计算!", evalGroupId); 188 log.error("考评组[{}]人员为空,终止计算!", evalGroupId);
190 return; 189 return;
@@ -239,10 +238,11 @@ public class EvalCalculateService { @@ -239,10 +238,11 @@ public class EvalCalculateService {
239 if (userShop.getIndicatorTotalScore().compareTo(BigDecimal.ZERO) > 0) { 238 if (userShop.getIndicatorTotalScore().compareTo(BigDecimal.ZERO) > 0) {
240 scoreRatio = userShop.getScore().divide(userShop.getIndicatorTotalScore(), 2, RoundingMode.DOWN); 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 evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate() 242 evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate()
243 .eq(EvalUserPool::getId, userShop.getPoolId()) 243 .eq(EvalUserPool::getId, userShop.getPoolId())
244 .eq(EvalUserPool::getYn, Boolean.TRUE) 244 .eq(EvalUserPool::getYn, Boolean.TRUE)
245 - .set(EvalUserPool::getReward, userShop.getReward()) 245 + .set(EvalUserPool::getReward, reward)
246 .set(EvalUserPool::getScore, userShop.getScore()) 246 .set(EvalUserPool::getScore, userShop.getScore())
247 .set(EvalUserPool::getScoreRatio, scoreRatio) 247 .set(EvalUserPool::getScoreRatio, scoreRatio)
248 .set(EvalUserPool::getMonthly, YearMonth.from(localDate)) 248 .set(EvalUserPool::getMonthly, YearMonth.from(localDate))
@@ -269,34 +269,29 @@ public class EvalCalculateService { @@ -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 List<EvalGroupUserShop> userShops = new ArrayList<>(); 274 List<EvalGroupUserShop> userShops = new ArrayList<>();
274 if (EvalScopeEnum.STAFF.equals(scopeType)) { 275 if (EvalScopeEnum.STAFF.equals(scopeType)) {
275 List<EvalGroupUser> users = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery() 276 List<EvalGroupUser> users = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery()
276 - .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId()) 277 + .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupRankStage.getId())
277 .eq(EvalGroupUser::getDataDate, localDate) 278 .eq(EvalGroupUser::getDataDate, localDate)
278 .eq(EvalGroupUser::getYn, Boolean.TRUE) 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 for (EvalGroupUser user : users) { 283 for (EvalGroupUser user : users) {
283 - if (Boolean.TRUE.equals(user.getIgnored())) {  
284 - continue;  
285 - }  
286 EvalUserPool userPool = userPoolMap.get(user.getUserId()); 284 EvalUserPool userPool = userPoolMap.get(user.getUserId());
287 userShops.add(convertBO(user, userPool)); 285 userShops.add(convertBO(user, userPool));
288 } 286 }
289 return userShops; 287 return userShops;
290 } 288 }
291 -  
292 List<Long> distShopIds = this.getEvalDistShopIds(evalGroup); 289 List<Long> distShopIds = this.getEvalDistShopIds(evalGroup);
293 - if (PublicUtil.isEmpty(distShopIds)) {  
294 - return new ArrayList<>();  
295 - }  
296 Map<Long, EvalShopPool> shopPoolBOMap = evalPoolCommonService.inspectionShopPools(evalGroup, localDate, distShopIds); 290 Map<Long, EvalShopPool> shopPoolBOMap = evalPoolCommonService.inspectionShopPools(evalGroup, localDate, distShopIds);
297 - for (Long shopId : distShopIds) { 291 + for (Long shopId : evalGroup.getShopIds()) {
298 EvalShopPool shopPool = shopPoolBOMap.get(shopId); 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 return userShops; 296 return userShops;
302 } 297 }
@@ -637,10 +632,11 @@ public class EvalCalculateService { @@ -637,10 +632,11 @@ public class EvalCalculateService {
637 userShop.setGroupId(user.getGroupId()); 632 userShop.setGroupId(user.getGroupId());
638 userShop.setScore(BigDecimal.ZERO); 633 userShop.setScore(BigDecimal.ZERO);
639 userShop.setReward(BigDecimal.ZERO); 634 userShop.setReward(BigDecimal.ZERO);
  635 + userShop.setIgnored(user.getIgnored());
640 return userShop; 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 EvalGroupUserShop userShop = new EvalGroupUserShop(); 640 EvalGroupUserShop userShop = new EvalGroupUserShop();
645 userShop.setName(shopPool.getShopName()); 641 userShop.setName(shopPool.getShopName());
646 userShop.setReferId(shopPool.getShopId()); 642 userShop.setReferId(shopPool.getShopId());
@@ -652,6 +648,7 @@ public class EvalCalculateService { @@ -652,6 +648,7 @@ public class EvalCalculateService {
652 userShop.setBeginDate(beginDate); 648 userShop.setBeginDate(beginDate);
653 userShop.setDataDate(dataDate); 649 userShop.setDataDate(dataDate);
654 userShop.setGroupId(evalGroup.getGroupId()); 650 userShop.setGroupId(evalGroup.getGroupId());
  651 + userShop.setIgnored(ignored);
655 userShop.setScore(BigDecimal.ZERO); 652 userShop.setScore(BigDecimal.ZERO);
656 userShop.setReward(BigDecimal.ZERO); 653 userShop.setReward(BigDecimal.ZERO);
657 return userShop; 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 +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 /**
@@ -69,24 +71,11 @@ public class EvalGroupUserBizService { @@ -69,24 +71,11 @@ public class EvalGroupUserBizService {
69 * @return 71 * @return
70 */ 72 */
71 @Transactional(rollbackFor = Exception.class) 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 for (EvalGroupUser user : evalGroupUsers) { 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 user.setEvalGroupRankId(evalGroup.getEvalGroupRankId()); 79 user.setEvalGroupRankId(evalGroup.getEvalGroupRankId());
91 user.setEvalGroupRankStageId(evalGroup.getEvalGroupRankStageId()); 80 user.setEvalGroupRankStageId(evalGroup.getEvalGroupRankStageId());
92 user.setEvalGroupId(evalGroup.getId()); 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,6 +17,7 @@ import cn.fw.morax.service.data.salary.SalaryGroupUserService;
17 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 17 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
18 import lombok.AllArgsConstructor; 18 import lombok.AllArgsConstructor;
19 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
  20 +import org.apache.commons.collections4.map.MultiKeyMap;
20 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
21 import org.springframework.transaction.annotation.Transactional; 22 import org.springframework.transaction.annotation.Transactional;
22 23
@@ -46,29 +47,36 @@ public class EvalPoolCommonService { @@ -46,29 +47,36 @@ public class EvalPoolCommonService {
46 private EhrRpcService ehrRpcService; 47 private EhrRpcService ehrRpcService;
47 private OopRpcService oopRpcService; 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 if (PublicUtil.isEmpty(users)) { 51 if (PublicUtil.isEmpty(users)) {
51 return new HashMap<>(); 52 return new HashMap<>();
52 } 53 }
53 Set<Long> userIds = users.stream().map(EvalGroupUser::getUserId).collect(Collectors.toSet()); 54 Set<Long> userIds = users.stream().map(EvalGroupUser::getUserId).collect(Collectors.toSet());
54 List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery() 55 List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
55 - .eq(EvalUserPool::getEvalGroupId, evalGroup.getId()) 56 + .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId())
56 .eq(EvalUserPool::getMonthly, YearMonth.from(localDate)) 57 .eq(EvalUserPool::getMonthly, YearMonth.from(localDate))
57 .in(EvalUserPool::getUserId, userIds) 58 .in(EvalUserPool::getUserId, userIds)
58 .eq(EvalUserPool::getYn, Boolean.TRUE) 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 for (EvalGroupUser user : users) { 68 for (EvalGroupUser user : users) {
67 - if (! userPoolMap.containsKey(user.getUserId())) { 69 + if (! userShopPostShopIdMap.containsKey(user.getUserId(), user.getShopId(), user.getPostId())) {
68 EvalUserPool userPool = inspectionUserPool(user); 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 return userPoolMap; 80 return userPoolMap;
73 } 81 }
74 82
@@ -87,45 +95,17 @@ public class EvalPoolCommonService { @@ -87,45 +95,17 @@ public class EvalPoolCommonService {
87 return v1; 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 if (! shopPoolMap.containsKey(shopId)) { 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 shopPoolMap.put(shopId, shopPool); 103 shopPoolMap.put(shopId, shopPool);
99 } 104 }
100 } 105 }
101 return shopPoolMap; 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 @Transactional(rollbackFor = Exception.class) 109 @Transactional(rollbackFor = Exception.class)
130 public EvalShopPool createShopPoolData(Long shopId, EvalGroup evalGroup, LocalDate localDate, EvalShopPoolStatusEnum status) { 110 public EvalShopPool createShopPoolData(Long shopId, EvalGroup evalGroup, LocalDate localDate, EvalShopPoolStatusEnum status) {
131 ShopDTO shopDTO = oopRpcService.queryShop(shopId); 111 ShopDTO shopDTO = oopRpcService.queryShop(shopId);
@@ -157,29 +137,31 @@ public class EvalPoolCommonService { @@ -157,29 +137,31 @@ public class EvalPoolCommonService {
157 @Transactional(rollbackFor = Exception.class) 137 @Transactional(rollbackFor = Exception.class)
158 public EvalUserPool inspectionUserPool(EvalGroupUser user) { 138 public EvalUserPool inspectionUserPool(EvalGroupUser user) {
159 EvalUserPool evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery() 139 EvalUserPool evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
160 - .eq(EvalUserPool::getEgc, user.getEgc()) 140 + .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
161 .eq(EvalUserPool::getUserId, user.getUserId()) 141 .eq(EvalUserPool::getUserId, user.getUserId())
  142 + .eq(EvalUserPool::getPostId, user.getPostId())
  143 + .eq(EvalUserPool::getShopId, user.getShopId())
162 .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate())) 144 .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
163 .eq(EvalUserPool::getYn, Boolean.TRUE) 145 .eq(EvalUserPool::getYn, Boolean.TRUE)
164 , Boolean.FALSE); 146 , Boolean.FALSE);
165 if (PublicUtil.isNotEmpty(evalUserPool)) { 147 if (PublicUtil.isNotEmpty(evalUserPool)) {
166 return evalUserPool; 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 return this.createUserPoolData(user); 165 return this.createUserPoolData(user);
184 } 166 }
185 167
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java
1 package cn.fw.morax.service.biz.eval; 1 package cn.fw.morax.service.biz.eval;
2 2
  3 +import cn.fw.backlog.sdk.api.result.FailBacklogItem;
3 import cn.fw.common.cache.locker.DistributedLocker; 4 import cn.fw.common.cache.locker.DistributedLocker;
4 import cn.fw.common.exception.BusinessException; 5 import cn.fw.common.exception.BusinessException;
5 import cn.fw.common.web.auth.LoginAuthBean; 6 import cn.fw.common.web.auth.LoginAuthBean;
6 import cn.fw.morax.common.config.TodoVal; 7 import cn.fw.morax.common.config.TodoVal;
7 import cn.fw.morax.common.pojo.event.ApprovalResultEvent; 8 import cn.fw.morax.common.pojo.event.ApprovalResultEvent;
  9 +import cn.fw.morax.common.utils.DateUtil;
8 import cn.fw.morax.common.utils.PublicUtil; 10 import cn.fw.morax.common.utils.PublicUtil;
9 import cn.fw.morax.common.utils.ThreadPoolUtil; 11 import cn.fw.morax.common.utils.ThreadPoolUtil;
10 import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO; 12 import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO;
11 import cn.fw.morax.domain.db.ApprovalRecord; 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 import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO; 15 import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO;
17 import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO; 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 import cn.fw.morax.domain.vo.eval.EvalRewardDistDetailVO; 18 import cn.fw.morax.domain.vo.eval.EvalRewardDistDetailVO;
22 import cn.fw.morax.domain.vo.eval.EvalRewardDistVO; 19 import cn.fw.morax.domain.vo.eval.EvalRewardDistVO;
23 import cn.fw.morax.domain.vo.eval.EvalShopPoolVO; 20 import cn.fw.morax.domain.vo.eval.EvalShopPoolVO;
24 import cn.fw.morax.rpc.backlog.TodoRpcService; 21 import cn.fw.morax.rpc.backlog.TodoRpcService;
25 import cn.fw.morax.rpc.backlog.dto.BackLogItemDTO; 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 import cn.fw.morax.rpc.erp.ErpRpcService; 25 import cn.fw.morax.rpc.erp.ErpRpcService;
27 import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO; 26 import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO;
  27 +import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO;
28 import cn.fw.morax.service.biz.ApprovalBizService; 28 import cn.fw.morax.service.biz.ApprovalBizService;
29 import cn.fw.morax.service.data.ApprovalRecordService; 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 import com.alibaba.fastjson.JSON; 31 import com.alibaba.fastjson.JSON;
35 import com.alibaba.fastjson.JSONObject; 32 import com.alibaba.fastjson.JSONObject;
36 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 33 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -47,11 +44,14 @@ import org.springframework.stereotype.Service; @@ -47,11 +44,14 @@ import org.springframework.stereotype.Service;
47 import org.springframework.transaction.annotation.Transactional; 44 import org.springframework.transaction.annotation.Transactional;
48 45
49 import java.math.BigDecimal; 46 import java.math.BigDecimal;
  47 +import java.text.DecimalFormat;
50 import java.time.LocalDate; 48 import java.time.LocalDate;
  49 +import java.time.LocalDateTime;
51 import java.util.*; 50 import java.util.*;
52 import java.util.concurrent.RejectedExecutionException; 51 import java.util.concurrent.RejectedExecutionException;
53 import java.util.concurrent.ThreadPoolExecutor; 52 import java.util.concurrent.ThreadPoolExecutor;
54 import java.util.concurrent.locks.Lock; 53 import java.util.concurrent.locks.Lock;
  54 +import java.util.stream.Collectors;
55 55
56 import static cn.fw.common.businessvalidator.Validator.BV; 56 import static cn.fw.common.businessvalidator.Validator.BV;
57 57
@@ -75,6 +75,9 @@ public class EvalRewardService { @@ -75,6 +75,9 @@ public class EvalRewardService {
75 private final EvalShopPoolService evalShopPoolService; 75 private final EvalShopPoolService evalShopPoolService;
76 private final ApprovalRecordService approvalRecordService; 76 private final ApprovalRecordService approvalRecordService;
77 private final EvalRewardDistService evalRewardDistService; 77 private final EvalRewardDistService evalRewardDistService;
  78 + private final EvalGroupRankService evalGroupRankService;
  79 + private final EvalGroupRankStageService evalGroupRankStageService;
  80 + private final EvalGroupRewardDimService evalGroupRewardDimService;
78 private final EvalRewardDistDetailService evalRewardDistDetailService; 81 private final EvalRewardDistDetailService evalRewardDistDetailService;
79 82
80 @Value("${spring.cache.custom.global-prefix}:dist:eval-reward") 83 @Value("${spring.cache.custom.global-prefix}:dist:eval-reward")
@@ -152,14 +155,32 @@ public class EvalRewardService { @@ -152,14 +155,32 @@ public class EvalRewardService {
152 log.info("分配奖惩的考评组:{}", evalGroupId); 155 log.info("分配奖惩的考评组:{}", evalGroupId);
153 EvalGroup evalGroup = evalGroupService.getById(evalGroupId); 156 EvalGroup evalGroup = evalGroupService.getById(evalGroupId);
154 BV.notNull(evalGroup, "考评组不存在,终止计算!"); 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,81 +189,98 @@ public class EvalRewardService {
168 * @param 189 * @param
169 */ 190 */
170 @Transactional(rollbackFor = Exception.class) 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 public EvalRewardDist transferPo(EvalGroup evalGroup) { 286 public EvalRewardDist transferPo(EvalGroup evalGroup) {