Commit f3d53537eb5a684a765fabf78c6a4602abb0aa03

Authored by 姜超
2 parents caec23b0 279184b5

Merge branch 'mr-eval-report-staff-dim-2024-4-2' into 'main'

考评人员维度展示

考评人员维度展示

See merge request !605
Showing 23 changed files with 661 additions and 186 deletions
doc/2023-05-18_update.sql
  1 +-- 2024年4月3日
  2 +ALTER TABLE `fw_morax`.`eval_group_user`
  3 + ADD COLUMN `staff_status` tinyint(8) NULL COMMENT '当前员工状态:1->试用,2->正式,8->待离职,9->离职' AFTER `data_date`;
  4 +
  5 +ALTER TABLE `fw_morax`.`eval_user_report`
  6 + ADD COLUMN `staff_type` tinyint(4) default 0 COMMENT '员工分类: 0->绩效员工: 非0->其他员工(KpiIgnoreCauseEnum枚举取值)' AFTER `user_name`;
  7 +
  8 +ALTER TABLE `fw_morax`.`eval_group_user`
  9 + ADD COLUMN `leave_date` date NULL COMMENT '离职时间' AFTER `staff_status`;
  10 +
  11 +
1 12 -- 2024年3月20日
2 13 ALTER TABLE `fw_morax`.`eval_group_indicator_hit_log`
3 14 DROP INDEX `eval_reward_hit_log_index`,
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalExtractStageIndicatorBO.java
... ... @@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger;
22 22 public class EvalExtractStageIndicatorBO {
23 23 private Long evalCalcId;
24 24 private Long evalGroupRankId;
25   - private Set<Long> evalGroupIds;
  25 +// private Set<Long> evalGroupIds;
26 26 private LocalDate localDate;
27 27 private Boolean realTimeCalc;
28 28 // private AtomicInteger atomicInteger;
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupCalculableBO.java
... ... @@ -21,6 +21,6 @@ import java.util.Set;
21 21 public class EvalGroupCalculableBO {
22 22 private Long evalCalcId;
23 23 private Long evalGroupRankId;
24   - private Set<Long> evalGroupIds;
  24 +// private Set<Long> evalGroupIds;
25 25 private LocalDate localDate;
26 26 }
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupRankConfigBO.java 0 → 100644
  1 +package cn.fw.morax.domain.bo.eval;
  2 +
  3 +import cn.fw.morax.domain.db.eval.EvalGroup;
  4 +import cn.fw.morax.domain.db.eval.EvalGroupRank;
  5 +import cn.fw.morax.domain.db.eval.EvalGroupRankStage;
  6 +import lombok.AllArgsConstructor;
  7 +import lombok.Data;
  8 +import lombok.NoArgsConstructor;
  9 +
  10 +import java.time.LocalDate;
  11 +import java.util.Set;
  12 +
  13 +/**
  14 + * @author : kurisu
  15 + * @version : 1.0
  16 + * @className : KpiGroupCalculableBO
  17 + * @description : 需要计算绩效的考评组
  18 + * @date : 2022-04-16 11:31
  19 + */
  20 +@Data
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class EvalGroupRankConfigBO {
  24 +
  25 + private EvalGroupRank evalGroupRank;
  26 +
  27 + private EvalGroupRankStage evalGroupRankStage;
  28 +
  29 + private EvalGroup evalGroup;
  30 +}
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java
... ... @@ -133,7 +133,12 @@ public class EvalGroupUserShop {
133 133 /**
134 134 * 是否计不入考评考核
135 135 */
136   - private Boolean ignored;
  136 +// private Boolean ignored;
  137 +
  138 + /**
  139 + * 是否参与考评考核
  140 + */
  141 + private Boolean inclusion;
137 142  
138 143 /**
139 144 * 考评得分率排名
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupUser.java
... ... @@ -2,6 +2,7 @@ package cn.fw.morax.domain.db.eval;
2 2  
3 3 import cn.fw.common.data.entity.BaseAuditableTimeEntity;
4 4 import cn.fw.morax.domain.enums.KpiIgnoreCauseEnum;
  5 +import cn.fw.morax.domain.enums.SalaryStaffStatusEnum;
5 6 import com.baomidou.mybatisplus.annotation.TableName;
6 7 import lombok.*;
7 8  
... ... @@ -87,6 +88,16 @@ public class EvalGroupUser extends BaseAuditableTimeEntity&lt;EvalGroupUser, Long&gt;
87 88 * 数据日期
88 89 */
89 90 private LocalDate dataDate;
  91 +
  92 + /**
  93 + * 离职日期
  94 + */
  95 + private LocalDate leaveDate;
  96 +
  97 + /**
  98 + * '当前员工状态' 当前员工状态:1->试用,2->正式,8->待离职,9->离职
  99 + */
  100 + private SalaryStaffStatusEnum staffStatus;
90 101 /**
91 102 * 集团id
92 103 */
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserPool.java
... ... @@ -2,6 +2,7 @@ package cn.fw.morax.domain.db.eval;
2 2  
3 3 import cn.fw.common.data.entity.BaseAuditableTimeEntity;
4 4 import cn.fw.morax.domain.enums.EvalPoolBusinessTypeEnum;
  5 +import com.baomidou.mybatisplus.annotation.FieldStrategy;
5 6 import com.baomidou.mybatisplus.annotation.TableField;
6 7 import com.baomidou.mybatisplus.annotation.TableLogic;
7 8 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -111,6 +112,7 @@ public class EvalUserPool extends BaseAuditableTimeEntity&lt;EvalUserPool, Long&gt; {
111 112 /**
112 113 * 排名
113 114 */
  115 + @TableField(updateStrategy = FieldStrategy.IGNORED)
114 116 private Integer rank;
115 117  
116 118 /**
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserReport.java
... ... @@ -54,6 +54,12 @@ public class EvalUserReport extends BaseEntity&lt;EvalUserReport, Long&gt; {
54 54 */
55 55 private String userName;
56 56  
  57 +
  58 + /**
  59 + * 绩效员工取值0,其他非绩效员工取值 KpiIgnoreCauseEnum 枚举的值value
  60 + */
  61 + private Integer staffType;
  62 +
57 63 /**
58 64 * 岗位id
59 65 */
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/KpiIgnoreCauseEnum.java
... ... @@ -27,6 +27,8 @@ public enum KpiIgnoreCauseEnum implements IEnum&lt;Integer&gt; {
27 27 TRANSPOST_BEFORE_15(10, "15号以前调岗不计入绩效考核"),
28 28 LEAVE_DAY_OVERLENGTH_IGNORE_KPI(11, "请假超过X天不计入绩效考核"),
29 29 TURN_POSITIVE_POSITION(12, "调岗保护期内不计入绩效考核"),
  30 + EVAL_MULTISTAGE_TIME_POST_CHANGE(13, "考评多阶段时间内调岗,不纳入考评计算"),
  31 + EVAL_MULTISTAGE_TIME_LEAVE(14, "考评多阶段时间内离职,不纳入考评计算"),
30 32 ;
31 33  
32 34 /**
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java
... ... @@ -112,7 +112,7 @@ public class EvalTaskController {
112 112 throw new BusinessException("参数为空");
113 113 }
114 114 LocalDate calcDate = PublicUtil.isEmpty(date) ? evalCalc.getCalcDate() : DateUtil.date2LocalDate(date);
115   - evalCalculateTaskService.cacheStageIndicator(evalCalcId, evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), Boolean.TRUE, calcDate);
  115 + evalCalculateTaskService.cacheStageIndicator(evalCalcId, evalCalc.getEvalGroupRankId(), Boolean.TRUE, calcDate);
116 116 return success();
117 117 }
118 118  
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java
... ... @@ -45,6 +45,7 @@ import java.math.BigDecimal;
45 45 import java.math.RoundingMode;
46 46 import java.time.LocalDate;
47 47 import java.time.YearMonth;
  48 +import java.time.temporal.TemporalAdjusters;
48 49 import java.util.*;
49 50 import java.util.concurrent.RejectedExecutionException;
50 51 import java.util.concurrent.atomic.AtomicInteger;
... ... @@ -197,9 +198,9 @@ public class EvalUserReportTask {
197 198 }
198 199 List<EvalUserPool> userPools = evalUserPoolService.getPools(evalGroupRankStageId, YearMonth.from(dataDate));
199 200 // .filter(pool -> ! evalGroupUserService.probationStaff(pool.getUserId(), rankStage.getBeginTime(), rankStage.getOverTime()))
200   - List<EvalUserPool> nonProbationStaffs = userPools.stream()
201   - .filter(pool -> Boolean.TRUE.equals(pool.getInclusion()))
202   - .collect(Collectors.toList());
  201 +// List<EvalUserPool> nonProbationStaffs = userPools.stream()
  202 +// .filter(pool -> Boolean.TRUE.equals(pool.getInclusion()))
  203 +// .collect(Collectors.toList());
203 204 List<Long> disableShopIds = invalidShopLogService.queryInvalidShopIds(groupId, dataDate);
204 205 List<EvalShopPool> shopPools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
205 206 .in(EvalShopPool::getEvalGroupId, evalGroupIds)
... ... @@ -223,10 +224,10 @@ public class EvalUserReportTask {
223 224 EvalGroupReportParamsBO paramsBO = new EvalGroupReportParamsBO(stageDim, rankStage, rank.getGroupId(), multiStage, dataDate);
224 225 //排名组指标编码、人员、门店
225 226 List<EvalUserRankCodeReport> rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, evalUserRankStageReportId, paramsBO);
226   - List<EvalUserReport> evalUserReports = this.saveStaffReports(nonProbationStaffs, evalUserRankReportId, evalUserRankStageReportId,paramsBO);
227   - List<EvalUserReport> evalShopReports = this.saveShopReports(shopPools, evalUserRankReportId, evalUserRankStageReportId,paramsBO);
  227 + List<EvalUserReport> evalUserReports = this.saveStaffReports(userPools, evalUserRankReportId, evalUserRankStageReportId, paramsBO);
  228 + List<EvalUserReport> evalShopReports = this.saveShopReports(shopPools, evalUserRankReportId, evalUserRankStageReportId, paramsBO);
228 229 //人员维度
229   - calcUser(nonProbationStaffs, evalGroupIndicators, evalGroupIndicatorParamMap, evalUserReports, paramsBO);
  230 + calcUser(userPools, evalGroupIndicators, evalGroupIndicatorParamMap, evalUserReports, paramsBO);
230 231 //门店维度
231 232 calcShop(shopPools, evalGroupIndicators, evalGroupIndicatorParamMap, evalShopReports, paramsBO);
232 233 //门店维度
... ... @@ -608,27 +609,38 @@ public class EvalUserReportTask {
608 609 if (PublicUtil.isEmpty(pools)) {
609 610 return new ArrayList<>();
610 611 }
  612 + final Long evalGroupRankStageId = paramsBO.getStage().getId();
611 613 final LocalDate dataDate = paramsBO.getDataDate();
  614 + final LocalDate stageStartDate = paramsBO.getStage().getBeginTime();
612 615 List<EvalUserReport> evalUserReports = new ArrayList<>();
613 616 for (EvalUserPool userPool : pools) {
614   - EvalUserReport report = new EvalUserReport();
615   - report.setStageDim(paramsBO.getStageDimEnum());
616   - report.setEvalUserRankReportId(evalUserRankReportId);
617   - report.setEvalUserRankStageReportId(evalUserRankStageReportId);
618   - report.setDimension(ReportDimensionEnum.STAFF);
619   - report.setReward(userPool.getReward());
620   - report.setScore(userPool.getScore());
621   - report.setScoreRatio(userPool.getScoreRatio().multiply(Constant.ONE_HUNDRED));
622   - report.setUserId(userPool.getUserId());
623   - report.setUserName(userPool.getUserName());
624   - report.setPostId(userPool.getPostId());
625   - report.setPostName(userPool.getPostName());
626   - report.setShopId(userPool.getShopId());
627   - report.setShopName(userPool.getShopName());
628   - report.setEvalUserPoolId(userPool.getId());
629   - report.setDataDate(dataDate);
630   - report.setInclusion(userPool.getInclusion());
631   - evalUserReports.add(report);
  617 + EvalUserReport userReport = new EvalUserReport();
  618 + userReport.setStageDim(paramsBO.getStageDimEnum());
  619 + userReport.setEvalUserRankReportId(evalUserRankReportId);
  620 + userReport.setEvalUserRankStageReportId(evalUserRankStageReportId);
  621 + userReport.setDimension(ReportDimensionEnum.STAFF);
  622 + userReport.setReward(userPool.getReward());
  623 + userReport.setScore(userPool.getScore());
  624 + userReport.setScoreRatio(userPool.getScoreRatio().multiply(Constant.ONE_HUNDRED));
  625 + userReport.setUserId(userPool.getUserId());
  626 + userReport.setUserName(userPool.getUserName());
  627 + userReport.setPostId(userPool.getPostId());
  628 + userReport.setPostName(userPool.getPostName());
  629 + userReport.setShopId(userPool.getShopId());
  630 + userReport.setShopName(userPool.getShopName());
  631 + userReport.setEvalUserPoolId(userPool.getId());
  632 + userReport.setDataDate(dataDate);
  633 + userReport.setInclusion(userPool.getInclusion());
  634 + //默认为绩效员工
  635 + userReport.setStaffType(0);
  636 +
  637 + EvalGroupUser evalGroupUser = evalGroupUserService.getMonthStageLastData(evalGroupRankStageId, userPool.getUserId(),
  638 + stageStartDate, dataDate);
  639 + //处理员工分类
  640 + if (PublicUtil.isNotEmpty(evalGroupUser) && PublicUtil.isNotEmpty(evalGroupUser.getIgnoreCause()) ){
  641 + userReport.setStaffType(evalGroupUser.getIgnoreCause().getValue());
  642 + }
  643 + evalUserReports.add(userReport);
632 644 }
633 645 evalUserReportService.insertBatchSomeColumn(evalUserReports);
634 646 return evalUserReports;
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java
... ... @@ -959,7 +959,7 @@ public class CommonService {
959 959 /**
960 960 * 获取员工非降级旧岗位调岗日期
961 961 */
962   - private LocalDate getNewPostChangeDate(Long userId, Long postId){
  962 + public LocalDate getNewPostChangeDate(Long userId, Long postId){
963 963 String newPostChangeKey = String.join(":", staffNewPostChangeDate, userId+"", postId+"");
964 964 if (! stringRedisTemplate.hasKey(newPostChangeKey)) {
965 965 return null;
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardProportionCalculator.java
... ... @@ -49,7 +49,7 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator {
49 49  
50 50 @Override
51 51 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupRewardBO reward) {
52   - userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
  52 + userShops = userShops.stream().filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion())).collect(Collectors.toList());
53 53 if (PublicUtil.isEmpty(userShops)) {
54 54 return;
55 55 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java
... ... @@ -44,7 +44,7 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
44 44  
45 45 @Override
46 46 public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupRewardBO reward) {
47   - userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
  47 + userShops = userShops.stream().filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion())).collect(Collectors.toList());
48 48 if (PublicUtil.isEmpty(userShops)) {
49 49 return;
50 50 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
... ... @@ -9,7 +9,6 @@ import cn.fw.morax.common.utils.ThreadPoolUtil;
9 9 import cn.fw.morax.domain.bo.eval.*;
10 10 import cn.fw.morax.domain.bo.kpi.EvalGroupCalculableRankBO;
11 11 import cn.fw.morax.domain.db.eval.*;
12   -import cn.fw.morax.domain.dto.salary.SalaryExtraDTO;
13 12 import cn.fw.morax.domain.enums.*;
14 13 import cn.fw.morax.service.biz.CommonService;
15 14 import cn.fw.morax.service.biz.calculator.eval.kpi.EvalKpiBaseCalculator;
... ... @@ -40,7 +39,6 @@ import java.time.YearMonth;
40 39 import java.util.*;
41 40 import java.util.concurrent.*;
42 41 import java.util.concurrent.atomic.AtomicReference;
43   -import java.util.function.Consumer;
44 42 import java.util.stream.Collectors;
45 43  
46 44 /**
... ... @@ -169,20 +167,22 @@ public class EvalCalculateService {
169 167 Map<Long, List<EvalGroup>> stageEvalGroupMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getEvalGroupRankStageId));
170 168 //计算考评得分
171 169 CompletableFuture<Void>[] futuresArr = evalGroups.stream().map(evalGroup -> CompletableFuture.runAsync(() -> {
172   - Long start = System.currentTimeMillis();
  170 + if (Boolean.FALSE.equals(this.checkEvalConfigValid(evalGroup, dataDate))){
  171 + return;
  172 + }
  173 + final EvalGroupRankConfigBO calcConfigBo = this.getEvalCalcConfig(evalGroup, dataDate);
  174 + final Long start = System.currentTimeMillis();
173 175 log.info(" 考评组计算:考评组进行计算:{}", evalGroup.getId());
174 176 TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
175   - final Long evalGroupRankStageId = evalGroup.getEvalGroupRankStageId();
176   - final Long evalGroupId = evalGroup.getId();
177 177 try {
178   - EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(evalGroupRankStageId, dataDate, EvalCalStageDimEnum.STAGE_STAGE);
179   - calculateEvalGroup(evalGroupId, calcDateParam, EvalScopeEnum.STAFF);
180   - calculateEvalGroup(evalGroupId, calcDateParam, EvalScopeEnum.SHOP);
  178 + EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(calcConfigBo, dataDate, EvalCalStageDimEnum.STAGE_STAGE);
  179 + calculateEvalGroup(calcConfigBo, calcDateParam, EvalScopeEnum.STAFF);
  180 + calculateEvalGroup(calcConfigBo, calcDateParam, EvalScopeEnum.SHOP);
181 181 //多阶段才需要计算-阶段累计
182 182 if (calcDateParam.getMultiStage()) {
183   - EvalGroupCalcParamsBO calcDateParamM = this.getCalcDate(evalGroupRankStageId, dataDate, EvalCalStageDimEnum.STAGE_MONTH);
184   - calculateEvalGroup(evalGroupId, calcDateParamM, EvalScopeEnum.STAFF);
185   - calculateEvalGroup(evalGroupId, calcDateParamM, EvalScopeEnum.SHOP);
  183 + EvalGroupCalcParamsBO calcDateParamM = this.getCalcDate(calcConfigBo, dataDate, EvalCalStageDimEnum.STAGE_MONTH);
  184 + calculateEvalGroup(calcConfigBo, calcDateParamM, EvalScopeEnum.STAFF);
  185 + calculateEvalGroup(calcConfigBo, calcDateParamM, EvalScopeEnum.SHOP);
186 186 }
187 187 platformTransactionManager.commit(transactionStatus);
188 188 log.info(" 考评组计算:考评组计算完成:{},耗时:{} s", evalGroup.getId(), TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start));
... ... @@ -197,19 +197,24 @@ public class EvalCalculateService {
197 197 this.calcEvalRank(evalGroupRankId, dataDate);
198 198 //计算考评奖惩
199 199 CompletableFuture<List<EvalRewardPushSalaryBO>>[] futuresRewardArr = stageEvalGroupMap.entrySet().stream().map(stage -> CompletableFuture.supplyAsync(() -> {
200   - Long start = System.currentTimeMillis();
201   - log.info("考评奖惩计算:考评奖惩开始进行计算,考评排名组:{}", evalGroupRankId);
  200 + final Long evalGroupRankStageId = stage.getKey();
  201 + if (Boolean.FALSE.equals(this.checkEvalRewardConfigValid(evalGroupRankStageId, dataDate))){
  202 + return new ArrayList<>();
  203 + }
  204 + final EvalGroupRankConfigBO calcConfigBo = this.getEvalRewardCalcConfig(evalGroupRankStageId, dataDate);
  205 + final Long start = System.currentTimeMillis();
  206 + log.info("考评奖惩计算:考评奖惩开始进行计算,考评阶段:{}", evalGroupRankStageId);
202 207 List<EvalRewardPushSalaryBO> res = new ArrayList<>();
203 208 TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
204 209 try {
205   - res = calculateEvalStageReward(evalGroupRankId, stage, dataDate);
  210 + res = calculateEvalStageReward(calcConfigBo, stage, dataDate);
206 211 platformTransactionManager.commit(transactionStatus);
207 212 } catch (Exception ex) {
208 213 platformTransactionManager.rollback(transactionStatus);
209 214 log.error("计算考评奖惩数据失败:{}", bo, ex);
210 215 success.set(Boolean.FALSE);
211 216 }
212   - log.info("考评奖惩计算:考评奖惩计算完成,考评排名组:{},耗时:{} s", evalGroupRankId, TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start));
  217 + log.info("考评奖惩计算:考评奖惩计算完成,考评阶段:{},耗时:{} s", evalGroupRankStageId, TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start));
213 218 return res;
214 219 }, threadPool)).<CompletableFuture<List<EvalRewardPushSalaryBO>>>toArray(CompletableFuture[]::new);
215 220 CompletableFuture.allOf(futuresRewardArr).join();
... ... @@ -218,14 +223,14 @@ public class EvalCalculateService {
218 223 overflowsList.add(str);
219 224 } else {
220 225 //计算排名、报表数据抽取
221   - //考评奖惩
  226 + //考评奖惩推送薪酬
222 227 this.cacheEvalRewardPushSalary(futuresRewardArr);
223 228 //考评门店角色奖惩
224 229 this.cacheEvalShopRoleRewardPushSalary(evalGroupRankId, dataDate);
225 230 //保存计算结果
226 231 this.cacheSaveCalcResult(evalCalcId, bo.getEvalGroupRankId(), dataDate, evalGroups);
227 232 evalCalcService.modifyStatus(evalCalcId, EvalCalcStatusEnum.SAVE_CALC_RESULT);
228   - //是否分配奖惩
  233 + //是否分配门店奖惩
229 234 this.cacheDistShopReward(evalCalcId, evalGroupRankId, dataDate);
230 235 }
231 236 } catch (Exception re) {
... ... @@ -251,6 +256,62 @@ public class EvalCalculateService {
251 256 stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheSaveCalcResult(), json);
252 257 }
253 258  
  259 + public Boolean checkEvalConfigValid(EvalGroup evalGroup, LocalDate calcDate) {
  260 + if (PublicUtil.isEmpty(evalGroup)) {
  261 + return Boolean.FALSE;
  262 + }
  263 + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroup.getEvalGroupRankStageId(), calcDate);
  264 + if (PublicUtil.isEmpty(evalGroupRankStage)) {
  265 + log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup));
  266 + return Boolean.FALSE;
  267 + }
  268 + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId());
  269 + if (PublicUtil.isEmpty(evalGroupRank)) {
  270 + log.error("考评组[{}]排名组不存在,终止计算!", evalGroup.getEvalGroupRankId());
  271 + return Boolean.FALSE;
  272 + }
  273 + return Boolean.TRUE;
  274 + }
  275 +
  276 + public EvalGroupRankConfigBO getEvalCalcConfig(EvalGroup evalGroup, LocalDate calcDate) {
  277 + EvalGroupRankConfigBO rankConfigBO = new EvalGroupRankConfigBO();
  278 + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId());
  279 + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroup.getEvalGroupRankStageId(), calcDate);
  280 +
  281 + rankConfigBO.setEvalGroupRank(evalGroupRank);
  282 + rankConfigBO.setEvalGroupRankStage(evalGroupRankStage);
  283 + rankConfigBO.setEvalGroup(evalGroup);
  284 + return rankConfigBO;
  285 + }
  286 +
  287 + public Boolean checkEvalRewardConfigValid(Long evalGroupRankStageId, LocalDate calcDate) {
  288 + if (PublicUtil.isEmpty(evalGroupRankStageId)) {
  289 + return Boolean.FALSE;
  290 + }
  291 + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, calcDate);
  292 + if (PublicUtil.isEmpty(evalGroupRankStage)) {
  293 + log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroupRankStageId));
  294 + return Boolean.FALSE;
  295 + }
  296 + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankStage.getEvalGroupRankId());
  297 + if (PublicUtil.isEmpty(evalGroupRank)) {
  298 + log.error("考评组[{}]排名组不存在,终止计算!", evalGroupRankStage.getEvalGroupRankId());
  299 + return Boolean.FALSE;
  300 + }
  301 + return Boolean.TRUE;
  302 + }
  303 +
  304 + public EvalGroupRankConfigBO getEvalRewardCalcConfig(Long evalGroupRankStageId, LocalDate calcDate) {
  305 + EvalGroupRankConfigBO rankConfigBO = new EvalGroupRankConfigBO();
  306 + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, calcDate);
  307 + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankStage.getEvalGroupRankId());
  308 +
  309 + rankConfigBO.setEvalGroupRank(evalGroupRank);
  310 + rankConfigBO.setEvalGroupRankStage(evalGroupRankStage);
  311 + return rankConfigBO;
  312 + }
  313 +
  314 +
254 315 private void cacheEvalRewardPushSalary(CompletableFuture<List<EvalRewardPushSalaryBO>>[] futuresRewardArr) {
255 316 List<EvalRewardPushSalaryBO> evalRewardPushSalaryBOS = new ArrayList<>();
256 317 Arrays.stream(futuresRewardArr).forEach(future -> {
... ... @@ -298,17 +359,9 @@ public class EvalCalculateService {
298 359 * @param localDate
299 360 * @return
300 361 */
301   - public EvalGroupCalcParamsBO getCalcDate(Long evalGroupRankStageId, final LocalDate localDate,EvalCalStageDimEnum stageDimEnum) {
302   - EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, localDate);
303   - if (Objects.isNull(evalGroupRankStage)) {
304   - log.error("考评排名组阶段[{}]不存在,终止计算!", evalGroupRankStageId);
305   - return null;
306   - }
307   - EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankStage.getEvalGroupRankId());
308   - if (Objects.isNull(evalGroupRank)) {
309   - log.error("考评排名组[{}]不存在,终止计算!", evalGroupRankStage.getEvalGroupRankId());
310   - return null;
311   - }
  362 + public EvalGroupCalcParamsBO getCalcDate(EvalGroupRankConfigBO calcConfigBo, final LocalDate localDate,EvalCalStageDimEnum stageDimEnum) {
  363 + EvalGroupRankStage evalGroupRankStage = calcConfigBo.getEvalGroupRankStage();
  364 + EvalGroupRank evalGroupRank = calcConfigBo.getEvalGroupRank();
312 365 EvalGroupCalcParamsBO paramsBO = new EvalGroupCalcParamsBO();
313 366 LocalDate firstStageStartTime = evalGroupRankStageService.getRankStartTime(evalGroupRank.getId(), evalGroupRank.getPeriod(), localDate);
314 367 paramsBO.setCalcMonthBeginDate(firstStageStartTime);
... ... @@ -330,12 +383,11 @@ public class EvalCalculateService {
330 383 return paramsBO;
331 384 }
332 385  
333   - public void calculateEvalGroup(final Long evalGroupId, final EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) {
334   - if (Objects.isNull(calcDateParam)){
335   - log.error("参数不够,终止计算!");
336   - return;
337   - }
338   - List<EvalGroupUserShop> userShops = this.buildEvalGroupObj(evalGroupId, calcDateParam, scopeType);
  386 + public void calculateEvalGroup(EvalGroupRankConfigBO calcConfigBo, final EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) {
  387 + EvalGroup evalGroup = calcConfigBo.getEvalGroup();
  388 +
  389 + final Long evalGroupId = evalGroup.getId();
  390 + List<EvalGroupUserShop> userShops = this.buildEvalGroupObj(calcConfigBo, calcDateParam, scopeType);
339 391 if (PublicUtil.isEmpty(userShops)) {
340 392 log.error("考评组[{}]人员为空,终止计算!", evalGroupId);
341 393 return;
... ... @@ -356,28 +408,22 @@ public class EvalCalculateService {
356 408 }
357 409 }
358 410  
359   - public List<EvalRewardPushSalaryBO> calculateEvalStageReward(final Long evalGroupRankId,
  411 + public List<EvalRewardPushSalaryBO> calculateEvalStageReward(EvalGroupRankConfigBO calcConfigBo,
360 412 Map.Entry<Long, List<EvalGroup>> stageEvalGroupEntry,
361 413 LocalDate dataDate) {
362 414 final Long evalGroupRankStageId = stageEvalGroupEntry.getKey();
363 415 final List<EvalGroup> evalGroups = stageEvalGroupEntry.getValue();
364   - EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(evalGroupRankStageId, dataDate, EvalCalStageDimEnum.STAGE_STAGE);
365   - if (Objects.isNull(calcDateParam)){
366   - log.error("参数不够,终止计算!");
367   - return new ArrayList<>();
368   - }
  416 + EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(calcConfigBo, dataDate, EvalCalStageDimEnum.STAGE_STAGE);
369 417 final LocalDate calcEndDate = calcDateParam.getCalcEndDate();
370 418 final Date date = DateUtil.localDateTime2Date(calcDateParam.getCalcEndDate().atTime(23, 23, 59));
371   - EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, calcEndDate);
372   - if (Objects.isNull(evalGroupRankStage)) {
373   - log.error("考评排名组阶段[{}]不存在,终止计算!", evalGroupRankStageId);
374   - return new ArrayList<>();
375   - }
  419 + EvalGroupRank evalGroupRank = calcConfigBo.getEvalGroupRank();
  420 + EvalGroupRankStage evalGroupRankStage = calcConfigBo.getEvalGroupRankStage();
  421 + final Long evalGroupRankId = evalGroupRank.getId();
376 422  
377 423 List<EvalRewardPushSalaryBO> evalRewards = new ArrayList<>();
378 424 for (EvalScopeEnum scopeType : EvalScopeEnum.values()) {
379 425 List<EvalGroupRewardDimBO> rewardDims = this.getRewardBOS(evalGroupRankStageId, scopeType);
380   - List<EvalGroupUserShop> userShops = this.getRewardObjs(calcDateParam, evalGroupRankStageId , evalGroups, scopeType);
  426 + List<EvalGroupUserShop> userShops = this.getRewardObjs(calcConfigBo, calcDateParam, evalGroupRankStageId , evalGroups, scopeType);
381 427 if (PublicUtil.isEmpty(userShops)) {
382 428 log.error("考评阶段[{}]人员为空,终止计算!", evalGroupRankStageId);
383 429 continue;
... ... @@ -697,53 +743,25 @@ public class EvalCalculateService {
697 743 }
698 744  
699 745 /**
700   - * @param evalGroupId
701 746 * @param calcDateParam .getCalcEndDate() <=阶段的截止时间的一个计算时间
702 747 * @param scopeType
703 748 * @return
704 749 */
705   - public List<EvalGroupUserShop> buildEvalGroupObj(Long evalGroupId, EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) {
706   - EvalGroup evalGroup = evalGroupService.getById(evalGroupId);
707   - if (Objects.isNull(evalGroup)) {
708   - log.error("考评组[{}]不存在,终止计算!", evalGroupId);
709   - return new ArrayList<>();
710   - }
  750 + public List<EvalGroupUserShop> buildEvalGroupObj(EvalGroupRankConfigBO calcConfigBo, EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) {
  751 + final EvalGroupRank evalGroupRank = calcConfigBo.getEvalGroupRank();
  752 + final EvalGroupRankStage evalGroupRankStage = calcConfigBo.getEvalGroupRankStage();
  753 + final EvalGroup evalGroup = calcConfigBo.getEvalGroup();
711 754 final Long groupId = evalGroup.getGroupId();
712   - EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroup.getEvalGroupRankStageId(), calcDateParam.getCalcEndDate());
713   - if (Objects.isNull(evalGroupRankStage)) {
714   - log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup));
715   - return new ArrayList<>();
716   - }
717   - EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId());
718   - if (Objects.isNull(evalGroupRank)) {
719   - log.error("考评组[{}]排名组不存在,终止计算!", evalGroup.getEvalGroupRankId());
720   - return new ArrayList<>();
721   - }
722 755  
723 756 List<EvalGroupUserShop> userShops = new ArrayList<>();
724 757 if (EvalScopeEnum.STAFF.equals(scopeType)) {
725   - //考评不计算保护期员工
726   - List<EvalGroupUser> users = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery()
727   - .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId())
728   - .eq(EvalGroupUser::getDataDate, calcDateParam.getCalcEndDate())
729   - .eq(EvalGroupUser::getYn, Boolean.TRUE)
730   - .eq(EvalGroupUser::getIgnored, Boolean.FALSE)
731   - );
732   - //转正员工要计算
733   - List<EvalGroupUser> turnPositiveUsers = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery()
734   - .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId())
735   - .eq(EvalGroupUser::getDataDate, calcDateParam.getCalcEndDate())
736   - .eq(EvalGroupUser::getYn, Boolean.TRUE)
737   - .eq(EvalGroupUser::getIgnored, Boolean.TRUE)
738   - .eq(EvalGroupUser::getIgnoreCause, KpiIgnoreCauseEnum.TURN_POSITIVE_AFTER)
  758 + List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
  759 + .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId())
  760 + .eq(EvalUserPool::getMonthly, YearMonth.from(calcDateParam.getCalcEndDate()))
  761 + .eq(EvalUserPool::getYn, Boolean.TRUE)
739 762 );
740   - if (PublicUtil.isNotEmpty(turnPositiveUsers)) {
741   - users.addAll(turnPositiveUsers);
742   - }
743   - Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroupRankStage, users, calcDateParam.getCalcEndDate(), scopeType);
744   - for (EvalGroupUser user : users) {
745   - EvalUserPool userPool = userPoolMap.get(user.getUserId());
746   - userShops.add(convertBO(user, userPool, evalGroupRank, evalGroupRankStage,calcDateParam, scopeType));
  763 + for (EvalUserPool userPool : pools) {
  764 + userShops.add(this.convertBO(userPool, evalGroupRank, evalGroupRankStage,calcDateParam, scopeType));
747 765 }
748 766 return userShops;
749 767 }
... ... @@ -753,8 +771,7 @@ public class EvalCalculateService {
753 771 List<Long> calcShopIds = commonService.filterInvalidShop(groupId, calcDateParam.getCalcEndDate(), evalGroup.getShopIds());
754 772 for (Long shopId : calcShopIds) {
755 773 EvalShopPool shopPool = shopPoolBOMap.get(shopId);
756   -// Boolean ignored = ! distShopIds.contains(shopId);
757   - userShops.add(this.convertBO(shopPool, evalGroup, evalGroupRank, evalGroupRankStage, calcDateParam));
  774 + userShops.add(this.convertShopBO(shopPool, evalGroup, evalGroupRank, evalGroupRankStage, calcDateParam));
758 775 }
759 776 return userShops;
760 777 }
... ... @@ -799,25 +816,26 @@ public class EvalCalculateService {
799 816 Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroupRankStage, users, calcDateParam.getCalcEndDate(), scopeType);
800 817 for (EvalGroupUser user : users) {
801 818 EvalUserPool userPool = userPoolMap.get(user.getUserId());
802   - userShops.add(convertBO(user, userPool, evalGroupRank, evalGroupRankStage,calcDateParam, EvalScopeEnum.MANAGEMENT));
  819 + userShops.add(convertBO(userPool, evalGroupRank, evalGroupRankStage,calcDateParam, EvalScopeEnum.MANAGEMENT));
803 820 }
804 821 return userShops;
805 822 }
806 823  
807   - public List<EvalGroupUserShop> getRewardObjs(EvalGroupCalcParamsBO calcDateParam, Long evalGroupRankStageId , List<EvalGroup> evalGroups, EvalScopeEnum scopeType) {
  824 + public List<EvalGroupUserShop> getRewardObjs(EvalGroupRankConfigBO calcConfigBo, EvalGroupCalcParamsBO calcDateParam, Long evalGroupRankStageId , List<EvalGroup> evalGroups, EvalScopeEnum scopeType) {
808 825 List<EvalGroupUserShop> userShops = Lists.newArrayListWithCapacity(80);
809 826 if (EvalScopeEnum.MANAGEMENT.equals(scopeType)) {
810 827 userShops = this.buildManagerEvalGroupObj(evalGroupRankStageId, calcDateParam, scopeType);
811   - return userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored()))
  828 + return userShops.stream().filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion()))
812 829 .collect(Collectors.toList());
813 830 }
814 831  
815   - final List<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList());
816   - for (Long evalGroupId : evalGroupIds) {
817   - List<EvalGroupUserShop> evalGroupUserShops = this.buildEvalGroupObj(evalGroupId, calcDateParam, scopeType);
  832 + //普通岗位、门店 奖惩对象
  833 + for (EvalGroup evalGroup : evalGroups) {
  834 + calcConfigBo.setEvalGroup(evalGroup);
  835 + List<EvalGroupUserShop> evalGroupUserShops = this.buildEvalGroupObj(calcConfigBo, calcDateParam, scopeType);
818 836 if (PublicUtil.isNotEmpty(evalGroupUserShops)) {
819 837 List<EvalGroupUserShop> calcKpiEvalGroupUserShops = evalGroupUserShops.stream()
820   - .filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored()))
  838 + .filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion()))
821 839 .collect(Collectors.toList());
822 840 if (PublicUtil.isNotEmpty(calcKpiEvalGroupUserShops)) {
823 841 userShops.addAll(calcKpiEvalGroupUserShops);
... ... @@ -1002,21 +1020,21 @@ public class EvalCalculateService {
1002 1020 }
1003 1021 }
1004 1022  
1005   - public List<EvalGroupUserShop> filterUserShops(EvalGroupRewardDimBO dim, EvalScopeEnum scopeType, List<EvalGroupUserShop> userShops) {
1006   - if (EvalScopeEnum.STAFF.equals(scopeType)) {
1007   - return userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
1008   - }
1009   - List<EvalGroupUserShop> filterUserShops = new ArrayList<>();
  1023 +// public List<EvalGroupUserShop> filterUserShops(EvalGroupRewardDimBO dim, EvalScopeEnum scopeType, List<EvalGroupUserShop> userShops) {
1010 1024 // if (EvalScopeEnum.STAFF.equals(scopeType)) {
1011   -// filterUserShops = userShops.stream().filter(userShop -> dim.getPostIds().contains(userShop.getPostId())).collect(Collectors.toList());
1012   -// } else {
  1025 +// return userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
  1026 +// }
  1027 +// List<EvalGroupUserShop> filterUserShops = new ArrayList<>();
  1028 +//// if (EvalScopeEnum.STAFF.equals(scopeType)) {
  1029 +//// filterUserShops = userShops.stream().filter(userShop -> dim.getPostIds().contains(userShop.getPostId())).collect(Collectors.toList());
  1030 +//// } else {
  1031 +//// filterUserShops = userShops.stream().filter(userShop -> dim.getShopIds().contains(userShop.getShopId())).collect(Collectors.toList());
  1032 +//// }
  1033 +// if (EvalScopeEnum.SHOP.equals(scopeType)) {
1013 1034 // filterUserShops = userShops.stream().filter(userShop -> dim.getShopIds().contains(userShop.getShopId())).collect(Collectors.toList());
1014 1035 // }
1015   - if (EvalScopeEnum.SHOP.equals(scopeType)) {
1016   - filterUserShops = userShops.stream().filter(userShop -> dim.getShopIds().contains(userShop.getShopId())).collect(Collectors.toList());
1017   - }
1018   - return filterUserShops;
1019   - }
  1036 +// return filterUserShops;
  1037 +// }
1020 1038  
1021 1039 /**
1022 1040 * 计算绩效金额
... ... @@ -1354,16 +1372,15 @@ public class EvalCalculateService {
1354 1372 return poolDetail;
1355 1373 }
1356 1374  
1357   - public EvalGroupUserShop convertBO(EvalGroupUser user,
1358   - EvalUserPool userPool,
  1375 + public EvalGroupUserShop convertBO(EvalUserPool userPool,
1359 1376 EvalGroupRank evalGroupRank,
1360 1377 EvalGroupRankStage evalGroupRankStage,
1361 1378 EvalGroupCalcParamsBO calcDateParam,
1362 1379 EvalScopeEnum evalScopeType) {
1363 1380 EvalGroupUserShop userShop = new EvalGroupUserShop();
1364   - userShop.setName(user.getUserName());
  1381 + userShop.setName(userPool.getUserName());
1365 1382 userShop.setScopeType(evalScopeType);
1366   - userShop.setEvalGroupId(user.getEvalGroupId());
  1383 + userShop.setEvalGroupId(userPool.getEvalGroupId());
1367 1384 userShop.setEvalGroupRankId(evalGroupRankStage.getEvalGroupRankId());
1368 1385 userShop.setEvalGroupRankStageId(evalGroupRankStage.getId());
1369 1386 userShop.setPoolId(userPool.getId());
... ... @@ -1372,14 +1389,14 @@ public class EvalCalculateService {
1372 1389 userShop.setShopId(userPool.getShopId());
1373 1390 userShop.setScoreRatio(Optional.ofNullable(userPool.getScoreRatio()).orElse(BigDecimal.ZERO));
1374 1391 userShop.setStageAccumulationScoreRatio(Optional.ofNullable(userPool.getStageAccumulationScoreRatio()).orElse(BigDecimal.ZERO));
1375   - userShop.setReferId(user.getUserId());
  1392 + userShop.setReferId(userPool.getUserId());
1376 1393 userShop.setBeginDate(calcDateParam.getCalcBeginDate());
1377   - userShop.setDataDate(user.getDataDate());
  1394 + userShop.setDataDate(userPool.getDataDate());
1378 1395 userShop.setMultiStage(evalGroupRank.getMultiStage());
1379   - userShop.setGroupId(user.getGroupId());
  1396 + userShop.setGroupId(userPool.getGroupId());
1380 1397 userShop.setScore(BigDecimal.ZERO);
1381 1398 // userShop.setReward(BigDecimal.ZERO);
1382   - userShop.setIgnored(user.getIgnored());
  1399 + userShop.setInclusion(userPool.getInclusion());
1383 1400 userShop.setStageDimEnum(calcDateParam.getStageDimEnum());
1384 1401 if (PublicUtil.isNotEmpty(calcDateParam.getCalcMonthBeginDate())) {
1385 1402 userShop.setCalcMonthBeginDate(calcDateParam.getCalcMonthBeginDate());
... ... @@ -1412,7 +1429,7 @@ public class EvalCalculateService {
1412 1429 // return userShop;
1413 1430 // }
1414 1431  
1415   - public EvalGroupUserShop convertBO(EvalShopPool shopPool,
  1432 + public EvalGroupUserShop convertShopBO(EvalShopPool shopPool,
1416 1433 EvalGroup evalGroup,
1417 1434 EvalGroupRank evalGroupRank,
1418 1435 EvalGroupRankStage evalGroupRankStage,
... ... @@ -1438,7 +1455,7 @@ public class EvalCalculateService {
1438 1455 userShop.setMultiStage(evalGroupRank.getMultiStage());
1439 1456 userShop.setGroupId(evalGroup.getGroupId());
1440 1457 // userShop.setIgnored(ignored);
1441   - userShop.setIgnored(Boolean.FALSE);
  1458 + userShop.setInclusion(Boolean.TRUE);
1442 1459 userShop.setScore(BigDecimal.ZERO);
1443 1460 userShop.setStageDimEnum(calcDateParam.getStageDimEnum());
1444 1461 if (PublicUtil.isNotEmpty(calcDateParam.getCalcMonthBeginDate())) {
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateTaskService.java
... ... @@ -13,8 +13,6 @@ import cn.fw.morax.domain.bo.eval.EvalGroupCalculableBO;
13 13 import cn.fw.morax.domain.bo.eval.EvalRankReportBO;
14 14 import cn.fw.morax.domain.db.eval.*;
15 15 import cn.fw.morax.domain.db.kpi.Indicators;
16   -import cn.fw.morax.domain.db.kpi.KpiGroupUser;
17   -import cn.fw.morax.domain.db.kpi.KpiPool;
18 16 import cn.fw.morax.domain.db.kpi.KpiStageMqLog;
19 17 import cn.fw.morax.domain.enums.*;
20 18 import cn.fw.morax.rpc.ehr.EhrRpcService;
... ... @@ -22,6 +20,7 @@ import cn.fw.morax.rpc.ehr.dto.ManagerDTO;
22 20 import cn.fw.morax.rpc.ehr.dto.ManagerStaffDTO;
23 21 import cn.fw.morax.sdk.dto.common.IndicatorReportTypeEnum;
24 22 import cn.fw.morax.sdk.dto.kpi.KpiStageReportNoticeMQ;
  23 +import cn.fw.morax.service.biz.CommonService;
25 24 import cn.fw.morax.service.component.KpiStageIndicatorReportProducer;
26 25 import cn.fw.morax.service.data.eval.*;
27 26 import cn.fw.morax.service.data.kpi.IndicatorsService;
... ... @@ -42,6 +41,7 @@ import org.springframework.transaction.TransactionDefinition;
42 41 import org.springframework.transaction.TransactionStatus;
43 42 import org.springframework.transaction.annotation.Transactional;
44 43  
  44 +import java.math.BigDecimal;
45 45 import java.time.LocalDate;
46 46 import java.time.LocalDateTime;
47 47 import java.time.YearMonth;
... ... @@ -90,6 +90,7 @@ public class EvalCalculateTaskService {
90 90 private final IndicatorsService indicatorsService;
91 91 private final EvalGroupService evalGroupService;
92 92 private final EvalCalcService evalCalcService;
  93 + private final CommonService commonService;
93 94 private final EhrRpcService ehrRpcService;
94 95  
95 96 /**
... ... @@ -121,11 +122,11 @@ public class EvalCalculateTaskService {
121 122 if (EvalCalcStatusEnum.COLLECT_STAGE_DATA.equals(evalCalc.getStatus())) {
122 123 //多阶段先抽取指标数据
123 124 if (evalCalc.getMultiStage()) {
124   - this.cacheStageIndicator(evalCalcId, evalGroupRankId, evalGroupIds, Boolean.TRUE, localDate);
  125 + this.cacheStageIndicator(evalCalcId, evalGroupRankId, Boolean.TRUE, localDate);
125 126 return;
126 127 }
127 128 //单阶段直接计算
128   - this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate());
  129 + this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate());
129 130 return;
130 131 }
131 132 //抽取人员信息
... ... @@ -170,11 +171,11 @@ public class EvalCalculateTaskService {
170 171 if (EvalCalcStatusEnum.COLLECT_STAGE_DATA.equals(evalCalc.getStatus())) {
171 172 //多阶段先抽取指标数据
172 173 if (evalCalc.getMultiStage()) {
173   - this.cacheStageIndicator(evalCalcId, evalGroupRankId, evalGroupIds, Boolean.FALSE, localDate);
  174 + this.cacheStageIndicator(evalCalcId, evalGroupRankId, Boolean.FALSE, localDate);
174 175 continue;
175 176 }
176 177 //单阶段直接计算
177   - this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate());
  178 + this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate());
178 179 continue;
179 180 }
180 181 //抽取人员信息
... ... @@ -259,7 +260,12 @@ public class EvalCalculateTaskService {
259 260 continue;
260 261 }
261 262 try {
262   - this.extractEvalUser(bo);
  263 + //实时计算抽取每天的人员数据
  264 + if (Boolean.TRUE.equals(bo.getRealTimeCalc())) {
  265 + this.extractStageEveryDateEvalUser(bo);
  266 + } else {
  267 + this.extractEvalUser(bo);
  268 + }
263 269 } catch (Exception re) {
264 270 log.error("考评人员抽取异常", re);
265 271 bo.getAtomicInteger().incrementAndGet();
... ... @@ -304,7 +310,9 @@ public class EvalCalculateTaskService {
304 310 evalGroupIds.add(evalGroup.getId());
305 311 //昨天已经在 阶段结束时间之后
306 312 for (Long postId : Optional.ofNullable(evalGroup.getPostIds()).orElse(new ArrayList<>())) {
307   - evalGroupUsersForSave.addAll(evalGroupUserBizService.fetchBuildKpiUser(groupId, postId, evalGroup, dataDate));
  313 + List<EvalGroupUser> evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(groupId, postId, evalGroup, dataDate);
  314 + this.setMultiStageIgnoreCase(evalGroupRank, stage, evalGroupUsers);
  315 + evalGroupUsersForSave.addAll(evalGroupUsers);
308 316 }
309 317 }
310 318 //管理层人员
... ... @@ -313,48 +321,206 @@ public class EvalCalculateTaskService {
313 321 for (Long postId : rewardDim.getPostIds()) {
314 322 List<EvalGroupUser> manageEvalGroupUsers = evalGroupUserBizService.fetchPostUsers(groupId, postId, rewardDim.getShopIds(), dataDate);
315 323 if (PublicUtil.isNotEmpty(manageEvalGroupUsers)) {
316   - for (EvalGroupUser user : manageEvalGroupUsers) {
317   - user.setEvalGroupRankId(evalGroupRankId);
318   - user.setEvalGroupRankStageId(evalGroupRankStageId);
319   - user.setEvalGroupId(-1L);
320   - user.setEgc("");
321   - }
  324 + this.initManageEvalUser(manageEvalGroupUsers, evalGroupRankId, evalGroupRankStageId);
  325 + this.setMultiStageIgnoreCase(evalGroupRank, stage, manageEvalGroupUsers);
322 326 managerEvalGroupUsersForSave.addAll(manageEvalGroupUsers);
323 327 }
324 328 }
325 329 }
326 330 //去重
327   - List<EvalGroupUser> repeatUsers = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery()
328   - .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupRankStageId)
329   - .eq(EvalGroupUser::getDataDate, dataDate)
330   - .eq(EvalGroupUser::getYn, Boolean.TRUE)
331   - .select(EvalGroupUser::getId)
332   - );
333   - if (PublicUtil.isNotEmpty(repeatUsers)) {
334   - evalGroupUserService.removeByIds(repeatUsers.stream().map(EvalGroupUser::getId).collect(Collectors.toSet()));
  331 + Set<Long> repeatUserIds = this.queryRepeatUserEvalIds(evalGroupRankStageId, dataDate);
  332 + if (PublicUtil.isNotEmpty(repeatUserIds)) {
  333 + evalGroupUserService.removeByIds(repeatUserIds);
335 334 }
336 335 if (PublicUtil.isNotEmpty(evalGroupUsersForSave)) {
337 336 evalGroupUserService.insertBatchSomeColumn(evalGroupUsersForSave);
338   - this.updatePoolOtherInfo(evalGroupUsersForSave, EvalScopeEnum.STAFF);
  337 + evalPoolCommonService.createUserPools(evalGroupUsersForSave, EvalScopeEnum.STAFF);
339 338 }
340 339 if (PublicUtil.isNotEmpty(managerEvalGroupUsersForSave)) {
341 340 evalGroupUserService.insertBatchSomeColumn(managerEvalGroupUsersForSave);
342   - this.updatePoolOtherInfo(managerEvalGroupUsersForSave, EvalScopeEnum.MANAGEMENT);
  341 + evalPoolCommonService.createUserPools(managerEvalGroupUsersForSave, EvalScopeEnum.MANAGEMENT);
343 342 }
344 343 }
345 344 evalCalcService.modifyStatus(evalCalcId, EvalCalcStatusEnum.COLLECT_STAGE_DATA);
346 345 //多阶段
347 346 if (bo.getMultiStage()) {
348   - this.cacheStageIndicator(evalCalcId, evalGroupRankId, evalGroupIds, realTimeCalc, yesterday);
  347 + this.cacheStageIndicator(evalCalcId, evalGroupRankId, realTimeCalc, yesterday);
  348 + } else {
  349 + this.cacheCalcGroupIds(evalCalcId, evalGroupRankId, yesterday);
  350 + }
  351 + platformTransactionManager.commit(transactionStatus);
  352 + } catch (Exception e) {
  353 + platformTransactionManager.rollback(transactionStatus);
  354 + throw e;
  355 + }
  356 +
  357 + }
  358 +
  359 + public void extractStageEveryDateEvalUser(EvalExtractUserBO bo) {
  360 + final Long evalCalcId = bo.getEvalCalcId();
  361 + final Long evalGroupRankId = bo.getEvalGroupRankId();
  362 + final Boolean realTimeCalc = bo.getRealTimeCalc();
  363 + final LocalDate yesterday = bo.getLocalDate();
  364 + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankId);
  365 + if (PublicUtil.isEmpty(evalGroupRank)) {
  366 + log.error("考评抽取人员找不到考评排名组信息:{}", JSON.toJSONString(bo));
  367 + return;
  368 + }
  369 + final Long groupId = evalGroupRank.getGroupId();
  370 + List<EvalGroupRankStage> stages = evalGroupRankStageService.getRankStages(evalGroupRankId, yesterday, realTimeCalc);
  371 + TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
  372 + try {
  373 + for (EvalGroupRankStage stage : stages) {
  374 + final Long start = System.currentTimeMillis();
  375 + log.info(" 考评抽取历史人员数据:考评排名组阶段id:{}", stage.getId());
  376 + Set<Long> stageRepeatEvalUserIds = new HashSet<>();
  377 + final Long evalGroupRankStageId = stage.getId();
  378 + List<EvalGroupUser> evalGroupUsersForSave = Lists.newArrayListWithCapacity(100);
  379 + List<EvalGroupUser> managerEvalGroupUsersForSave = Lists.newArrayListWithCapacity(100);
  380 + List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery()
  381 + .eq(EvalGroup::getEvalGroupRankStageId, evalGroupRankStageId)
  382 + .eq(EvalGroup::getYn, Boolean.TRUE)
  383 + );
  384 + LocalDate stageEveryDataTime = stage.getBeginTime();
  385 + //计算时间 在阶段结束时间之后 阶段结束时间
  386 + final LocalDate stageEndTime = yesterday.isAfter(stage.getOverTime()) ? stage.getOverTime() : yesterday;
  387 +
  388 + //阶段开始时间大于 阶段结束时间
  389 + while (stageEndTime.compareTo(stageEveryDataTime) >= 0) {
  390 + log.info("抽取考评排名组人员信息:{},阶段:{},日期:{}", evalGroupRankId, evalGroupRankStageId, stageEveryDataTime);
  391 + //先记录 重复员工信息
  392 + stageRepeatEvalUserIds.addAll(this.queryRepeatUserEvalIds(evalGroupRankStageId, stageEveryDataTime));
  393 + //普通岗位员工
  394 + for (EvalGroup evalGroup : evalGroups) {
  395 + for (Long postId : Optional.ofNullable(evalGroup.getPostIds()).orElse(new ArrayList<>())) {
  396 + List<EvalGroupUser> evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(groupId, postId, evalGroup, stageEveryDataTime);
  397 + this.setMultiStageIgnoreCase(evalGroupRank, stage, evalGroupUsers);
  398 + evalGroupUsersForSave.addAll(evalGroupUsers);
  399 + evalPoolCommonService.createUserPools(evalGroupUsers, EvalScopeEnum.STAFF);
  400 + }
  401 + }
  402 + //管理层人员
  403 + List<EvalGroupRewardDim> rewardDims = evalGroupRewardDimService.getManageReward(evalGroupRankStageId);
  404 + for (EvalGroupRewardDim rewardDim : rewardDims) {
  405 + for (Long postId : rewardDim.getPostIds()) {
  406 + List<EvalGroupUser> manageEvalGroupUsers = evalGroupUserBizService.fetchPostUsers(groupId, postId, rewardDim.getShopIds(), stageEveryDataTime);
  407 + this.initManageEvalUser(manageEvalGroupUsers, evalGroupRankId, evalGroupRankStageId);
  408 + this.setMultiStageIgnoreCase(evalGroupRank, stage, managerEvalGroupUsersForSave);
  409 + managerEvalGroupUsersForSave.addAll(manageEvalGroupUsers);
  410 + evalPoolCommonService.createUserPools(manageEvalGroupUsers, EvalScopeEnum.MANAGEMENT);
  411 + }
  412 + }
  413 + //日期+1
  414 + stageEveryDataTime = stageEveryDataTime.plusDays(1);
  415 + }
  416 + //去重
  417 + if (PublicUtil.isNotEmpty(stageRepeatEvalUserIds)) {
  418 + evalGroupUserService.removeByIds(stageRepeatEvalUserIds);
  419 + }
  420 + if (PublicUtil.isNotEmpty(evalGroupUsersForSave)) {
  421 + evalGroupUserService.insertBatchSomeColumn(evalGroupUsersForSave);
  422 + }
  423 + if (PublicUtil.isNotEmpty(managerEvalGroupUsersForSave)) {
  424 + evalGroupUserService.insertBatchSomeColumn(managerEvalGroupUsersForSave);
  425 + }
  426 + log.info(" 考评抽取历史人员数据完成:考评排名组阶段id:{},耗时:{} s", stage.getId(), TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start));
  427 + }
  428 + //多阶段
  429 + if (bo.getMultiStage()) {
  430 + this.cacheStageIndicator(evalCalcId, evalGroupRankId, realTimeCalc, yesterday);
349 431 } else {
350   - this.cacheCalcGroupIds(evalCalcId, evalGroupRankId, evalGroupIds, yesterday);
  432 + this.cacheCalcGroupIds(evalCalcId, evalGroupRankId, yesterday);
351 433 }
352 434 platformTransactionManager.commit(transactionStatus);
353 435 } catch (Exception e) {
354 436 platformTransactionManager.rollback(transactionStatus);
355 437 throw e;
356 438 }
  439 + }
  440 +
  441 + /**
  442 + * 设置阶段忽略原因
  443 + * 1. 阶段内有调岗,不参与考评
  444 + * 2. 阶段内离职,不参与考评
  445 + */
  446 + public void setMultiStageIgnoreCase(EvalGroupRank evalGroupRank, EvalGroupRankStage stage, List<EvalGroupUser> evalGroupUsers) {
  447 + if (Boolean.FALSE.equals(evalGroupRank.getMultiStage())) {
  448 + return;
  449 + }
  450 + if (PublicUtil.isEmpty(evalGroupUsers)) {
  451 + return;
  452 + }
  453 + for (EvalGroupUser evalGroupUser : evalGroupUsers) {
  454 + final Long userId = evalGroupUser.getUserId();
  455 + final Long postId = evalGroupUser.getPostId();
  456 + final LocalDate newPostChangeDate = commonService.getNewPostChangeDate(userId, postId);
  457 + final LocalDate oldPostChangeDate = commonService.getOldPostChangeDate(userId, postId);
  458 + if (PublicUtil.isNotEmpty(newPostChangeDate)) {
  459 + //调岗时间大于阶段开始时间 阶段结束时间大于调岗时间(在阶段时间范围内调岗)
  460 + if (newPostChangeDate.compareTo(stage.getBeginTime()) > 0 && stage.getOverTime().compareTo(newPostChangeDate) > 0) {
  461 + evalGroupUser.setIgnored(Boolean.TRUE);
  462 + evalGroupUser.setIgnoreCauseDesc(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE.getName());
  463 + evalGroupUser.setIgnoreCause(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE);
  464 + }
  465 + }
  466 + if (PublicUtil.isNotEmpty(oldPostChangeDate)) {
  467 + //调岗时间大于阶段开始时间 阶段结束时间大于调岗时间(在阶段时间范围内调岗)
  468 + if (oldPostChangeDate.compareTo(stage.getBeginTime()) > 0 && stage.getOverTime().compareTo(oldPostChangeDate) > 0) {
  469 + evalGroupUser.setIgnored(Boolean.TRUE);
  470 + evalGroupUser.setIgnoreCause(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE);
  471 + evalGroupUser.setIgnoreCauseDesc(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE.getName());
  472 + }
  473 + }
  474 + final LocalDate leaveDate = evalGroupUser.getLeaveDate();
  475 + if (PublicUtil.isNotEmpty(leaveDate)) {
  476 + //调岗时间大于阶段开始时间 阶段结束时间大于调岗时间(在阶段时间范围内调岗)
  477 + if (leaveDate.compareTo(stage.getBeginTime()) > 0 && stage.getOverTime().compareTo(leaveDate) > 0) {
  478 + evalGroupUser.setIgnored(Boolean.TRUE);
  479 + evalGroupUser.setIgnoreCause(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_LEAVE);
  480 + evalGroupUser.setIgnoreCauseDesc(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_LEAVE.getName());
  481 + }
  482 + }
  483 + }
  484 + }
  485 +
  486 + /**
  487 + * 多阶段重置 是否参与考评字段
  488 + * 张三3月18号离职,按照规则 15号之后离职需要参与绩效考核。第二阶段考评 3月11号 到 3月20号 ,这个期间张三不是所有时间都在考评范围内,所以不参与考评。
  489 + */
  490 + public void multiStageResetPoolInclusion(EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage, LocalDate dataDate) {
  491 + if (Boolean.TRUE.equals(evalGroupRank.getMultiStage())) {
  492 + List<EvalUserPool> stageEvalUserPools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
  493 + .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId())
  494 + .eq(EvalUserPool::getMonthly, YearMonth.from(dataDate))
  495 + .eq(EvalUserPool::getYn, Boolean.TRUE));
  496 + for (EvalUserPool evalUserPool : stageEvalUserPools) {
  497 + evalUserPool.setInclusion(Boolean.FALSE);
  498 + evalUserPool.setReward(BigDecimal.ZERO);
  499 + evalUserPoolService.updateById(evalUserPool);
  500 + }
  501 + }
  502 + }
  503 +
  504 + public Set<Long> queryRepeatUserEvalIds(Long evalGroupRankStageId, LocalDate dataDate) {
  505 + List<EvalGroupUser> repeatUsers = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery()
  506 + .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupRankStageId)
  507 + .eq(EvalGroupUser::getDataDate, dataDate)
  508 + .eq(EvalGroupUser::getYn, Boolean.TRUE)
  509 + .select(EvalGroupUser::getId)
  510 + );
  511 + return repeatUsers.stream().map(EvalGroupUser::getId).collect(Collectors.toSet());
  512 + }
357 513  
  514 + public void initManageEvalUser(List<EvalGroupUser> manageEvalGroupUsers, Long evalGroupRankId, Long evalGroupRankStageId) {
  515 + if (PublicUtil.isEmpty(manageEvalGroupUsers)) {
  516 + return;
  517 + }
  518 + for (EvalGroupUser user : manageEvalGroupUsers) {
  519 + user.setEvalGroupRankId(evalGroupRankId);
  520 + user.setEvalGroupRankStageId(evalGroupRankStageId);
  521 + user.setEvalGroupId(-1L);
  522 + user.setEgc("");
  523 + }
358 524 }
359 525  
360 526 public void updatePoolOtherInfo(List<EvalGroupUser> users, EvalScopeEnum scopeType) {
... ... @@ -363,12 +529,16 @@ public class EvalCalculateTaskService {
363 529 //忽略就不计算
364 530 Boolean inclusion = Boolean.TRUE.equals(user.getIgnored()) ? Boolean.FALSE : Boolean.TRUE;
365 531 userPool.setInclusion(inclusion);
  532 + //不纳入计算,奖惩清空
  533 + if (Boolean.FALSE.equals(inclusion)) {
  534 + userPool.setReward(BigDecimal.ZERO);
  535 + }
366 536 evalUserPoolService.updateById(userPool);
367 537 }
368 538 }
369 539  
370   - public void cacheStageIndicator(final Long evalCalcId, final Long evalGroupRankId, final Set<Long> evalGroupIds, Boolean realTimeCalc, final LocalDate localDate) {
371   - String json = JSONObject.toJSONString(new EvalExtractStageIndicatorBO(evalCalcId, evalGroupRankId, evalGroupIds, localDate, realTimeCalc));
  540 + public void cacheStageIndicator(final Long evalCalcId, final Long evalGroupRankId, Boolean realTimeCalc, final LocalDate localDate) {
  541 + String json = JSONObject.toJSONString(new EvalExtractStageIndicatorBO(evalCalcId, evalGroupRankId, localDate, realTimeCalc));
372 542 stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheSendStageIndicatorMQ(), json);
373 543 }
374 544  
... ... @@ -397,6 +567,7 @@ public class EvalCalculateTaskService {
397 567  
398 568 public void extractStageIndicator(EvalExtractStageIndicatorBO stageIndicatorBO) {
399 569 final Long evalGroupRankId = stageIndicatorBO.getEvalGroupRankId();
  570 + final Long evalCalcId = stageIndicatorBO.getEvalCalcId();
400 571 final LocalDate dataDate = stageIndicatorBO.getLocalDate();
401 572 final Boolean realTimeCalc = stageIndicatorBO.getRealTimeCalc();
402 573  
... ... @@ -418,7 +589,7 @@ public class EvalCalculateTaskService {
418 589 if (PublicUtil.isEmpty(sysIndicatorCodes)) {
419 590 evalCalc.setStatus(EvalCalcStatusEnum.CALC_EVAL);
420 591 evalCalcService.updateById(evalCalc);
421   - cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate());
  592 + cacheCalcGroupIds(evalCalcId, evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate());
422 593 platformTransactionManager.commit(status);
423 594 return;
424 595 }
... ... @@ -428,14 +599,15 @@ public class EvalCalculateTaskService {
428 599 //保存发送记录,构建发送mq
429 600 EvalRankReportBO evalRankReportBO = this.getReportObj(evalGroupRank, dataDate, evalGroupRankStages);
430 601 for (String sysIndicatorCode : sysIndicatorCodes) {
431   - stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages, sysIndicatorCode, dataDate, evalCalc.getId()));
  602 + stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages, sysIndicatorCode, dataDate, evalCalcId));
  603 + stageReportNoticeMQS.addAll(this.sendLeaveStaffNotice(evalRankReportBO, evalGroupRankStages, sysIndicatorCode, dataDate, evalCalcId));
432 604  
433 605 //关联指标也发MQ
434 606 Indicators indicators = indicatorsService.queryByCode(sysIndicatorCode, Boolean.FALSE);
435 607 if (PublicUtil.isNotEmpty(indicators) && PublicUtil.isNotEmpty(indicators.getOriginIndicatorCode())) {
436 608 final String originIndicatorCode = indicators.getOriginIndicatorCode();
437   - stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages,
438   - originIndicatorCode, dataDate, evalCalc.getId()));
  609 + stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages, originIndicatorCode, dataDate, evalCalcId));
  610 + stageReportNoticeMQS.addAll(this.sendLeaveStaffNotice(evalRankReportBO, evalGroupRankStages, originIndicatorCode, dataDate, evalCalcId));
439 611 }
440 612 }
441 613 platformTransactionManager.commit(status);
... ... @@ -512,6 +684,82 @@ public class EvalCalculateTaskService {
512 684 return reportNoticeMQS;
513 685 }
514 686  
  687 + /**
  688 + * 发送绩效数据上报mq
  689 + *
  690 + * @param dataDate
  691 + */
  692 + public List<KpiStageReportNoticeMQ> sendLeaveStaffNotice(EvalRankReportBO evalRankReportBO, List<EffectEvalStageBO> stages, String indicatorCode, final LocalDate dataDate, final Long evalCalcId) {
  693 + final Date monthlyEndTime = DateUtil.localDateTime2Date(YearMonth.from(dataDate).atEndOfMonth().atTime(23, 59, 59));
  694 + final Date monthlyStartTime = DateUtil.localDateTime2Date(evalRankReportBO.getWholeBeginTime().atTime(0, 0, 1));
  695 + List<KpiStageReportNoticeMQ> reportNoticeMQS = new ArrayList<>();
  696 +
  697 + for (EffectEvalStageBO evalStageBO : stages) {
  698 + final LocalDate stageEndTime = evalStageBO.getStageEndTime().isAfter(dataDate)
  699 + ? dataDate : evalStageBO.getStageEndTime();
  700 +
  701 + final Long evalGroupRankStageId = evalStageBO.getEvalGroupRankStageId();
  702 + List<EvalUserPool> userPools = evalUserPoolService.getLeaveOrChangePostPools(evalGroupRankStageId, stageEndTime);
  703 + if (PublicUtil.isEmpty(userPools)) {
  704 + log.info("阶段没有离职调岗员工:{}", JSON.toJSONString(evalStageBO));
  705 + continue;
  706 + }
  707 +
  708 + for (EvalUserPool userPool : userPools) {
  709 + final LocalDate staffLastDate = userPool.getDataDate();
  710 + //阶段时间、阶段累计时间
  711 + //员工离岗时间 与 阶段结束时间判断
  712 + final LocalDate staffStageEndTime = staffLastDate.compareTo(stageEndTime) > 0
  713 + ? stageEndTime : staffLastDate;
  714 + final Date staffStageEndDateTime = DateUtil.localDateTime2Date(staffStageEndTime.atTime(23, 59, 59));
  715 +
  716 + KpiStageMqLog mqLog = this.createLeaveStaffMqLog(userPool, evalRankReportBO, evalStageBO, indicatorCode, evalCalcId, staffStageEndTime);
  717 + KpiStageReportNoticeMQ noticeMQ = KpiStageReportNoticeMQ.builder()
  718 + .indicatorCode(mqLog.getIndicatorCode())
  719 + .shopIds(new ArrayList<Long>(){{add(userPool.getShopId());}})
  720 + .userIds(new ArrayList<Long>(){{add(userPool.getUserId());}})
  721 + .groupId(mqLog.getGroupId())
  722 + .build();
  723 + List<KpiStageReportNoticeMQ.ReportDate> reportStages = new ArrayList<>();
  724 + KpiStageReportNoticeMQ.ReportDate reportStage = noticeMQ.new ReportDate(IndicatorReportTypeEnum.STAGE.getValue(),
  725 + DateUtil.localDateTime2Date(evalStageBO.getStageBeginTime().atTime(0, 0, 1)),
  726 + staffStageEndDateTime,
  727 + DateUtil.localDateTime2Date(evalStageBO.getStageEndTime().atTime(23, 59, 59))
  728 + );
  729 + reportStages.add(reportStage);
  730 + mqLog.setStatus(KpiStageMqLogStatusEnum.WAIT_REPORT);
  731 + mqLog.setStageTimeStr(JSON.toJSONString(reportStages));
  732 + kpiStageMqLogService.save(mqLog);
  733 + KpiStageReportNoticeMQ.ReportDate monthly = noticeMQ.new ReportDate(IndicatorReportTypeEnum.WHOLE.getValue(),
  734 + monthlyStartTime,
  735 + staffStageEndDateTime,
  736 + monthlyEndTime
  737 + );
  738 + noticeMQ.setWhole(monthly);
  739 + noticeMQ.setStages(reportStages);
  740 + noticeMQ.setUid(mqLog.getId().toString());
  741 +
  742 + reportNoticeMQS.add(noticeMQ);
  743 + //1. 初始状态放入
  744 + stringRedisTemplate.opsForHash().put(
  745 + evalCalculationVal.getMqCodeLogStatusKey(mqLog.getEvalCalcId()),
  746 + mqLog.getIndicatorCode(),
  747 + String.valueOf(mqLog.getStatus().getValue())
  748 + );
  749 + //设置过期
  750 + stringRedisTemplate.expire(
  751 + evalCalculationVal.getMqCodeLogStatusKey(mqLog.getEvalCalcId()),
  752 + 6L, TimeUnit.HOURS);
  753 + log.info("1. 初始状态放入 redis K: {},HK: {},HV: {},24H后过期",
  754 + evalCalculationVal.getMqCodeLogStatusKey(mqLog.getEvalCalcId()),
  755 + mqLog.getIndicatorCode(),
  756 + mqLog.getStatus().getValue()
  757 + );
  758 + }
  759 + }
  760 + return reportNoticeMQS;
  761 + }
  762 +
515 763 public KpiStageMqLog createMqLog(EvalRankReportBO evalRankReportBO, EffectEvalStageBO stageBO, String indicatorCode, Long evalCalcId, LocalDate dataDate) {
516 764 final LocalDate wholeBeginTime = evalRankReportBO.getWholeBeginTime();
517 765 final Long groupId = stageBO.getGroupId();
... ... @@ -528,6 +776,22 @@ public class EvalCalculateTaskService {
528 776 return mqLog;
529 777 }
530 778  
  779 + public KpiStageMqLog createLeaveStaffMqLog(EvalUserPool evalUserPool, EvalRankReportBO evalRankReportBO, EffectEvalStageBO stageBO, String indicatorCode, Long evalCalcId, LocalDate dataDate) {
  780 + final LocalDate wholeBeginTime = evalRankReportBO.getWholeBeginTime();
  781 + final Long groupId = stageBO.getGroupId();
  782 +
  783 + KpiStageMqLog mqLog = new KpiStageMqLog();
  784 + mqLog.setIndicatorCode(indicatorCode);
  785 + mqLog.setWholeBeginTime(wholeBeginTime);
  786 + mqLog.setWholeEndTime(dataDate);
  787 + mqLog.setEvalCalcId(evalCalcId);
  788 + mqLog.setDataDate(dataDate);
  789 + mqLog.setGroupId(groupId);
  790 + mqLog.setUserIds(new ArrayList<Long>(){{add(evalUserPool.getUserId());}});
  791 + mqLog.setShopIds(new ArrayList<Long>(){{add(evalUserPool.getShopId());}});
  792 + return mqLog;
  793 + }
  794 +
531 795 public void checkExtractStageIndicatorTimeOut() {
532 796 Lock lock = distributedLocker.lock(evalCalculationVal.getCheckExtractStageTimeOutKey());
533 797 if (!((RLock) lock).isLocked()) {
... ... @@ -543,7 +807,7 @@ public class EvalCalculateTaskService {
543 807 .eq(EvalCalc::getYn, Boolean.TRUE)
544 808 );
545 809 for (EvalCalc evalCalc : evalCalcs) {
546   - cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate());
  810 + cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate());
547 811 evalCalcService.modifyStatus(evalCalc.getId(), EvalCalcStatusEnum.CALC_EVAL);
548 812 stringRedisTemplate.delete(evalCalculationVal.getMqCodeLogStatusKey(evalCalc.getId()));
549 813 }
... ... @@ -555,8 +819,8 @@ public class EvalCalculateTaskService {
555 819  
556 820 }
557 821  
558   - private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final Set<Long> evalGroupIds, final LocalDate localDate) {
559   - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, evalGroupIds, localDate));
  822 + private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final LocalDate localDate) {
  823 + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, localDate));
560 824 stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json);
561 825 }
562 826  
... ... @@ -599,7 +863,7 @@ public class EvalCalculateTaskService {
599 863 evalCalc.setStatus(EvalCalcStatusEnum.CALC_EVAL);
600 864 evalCalcService.save(evalCalc);
601 865 evalCalcs.add(evalCalc);
602   - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, evalGroupIds, localDate));
  866 + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, localDate));
603 867 stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json);
604 868 }
605 869 if (Boolean.TRUE.equals(distReward)) {
... ... @@ -646,7 +910,7 @@ public class EvalCalculateTaskService {
646 910 evalCalc.setYn(Boolean.TRUE);
647 911 evalCalc.setStatus(EvalCalcStatusEnum.CALC_EVAL);
648 912 evalCalcService.save(evalCalc);
649   - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, evalGroupIds, localDate));
  913 + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, localDate));
650 914 stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json);
651 915 }
652 916  
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java
... ... @@ -7,6 +7,7 @@ import cn.fw.morax.domain.db.eval.EvalUserPool;
7 7 import cn.fw.morax.domain.dto.IgnoreCauseDTO;
8 8 import cn.fw.morax.domain.dto.IgnoreCauseReqDTO;
9 9 import cn.fw.morax.domain.dto.query.ShopsPostsQueryDTO;
  10 +import cn.fw.morax.domain.enums.SalaryStaffStatusEnum;
10 11 import cn.fw.morax.domain.vo.eval.EvalGroupUserVO;
11 12 import cn.fw.morax.rpc.ehr.EhrRpcService;
12 13 import cn.fw.morax.rpc.ehr.dto.PerformanceStaffDTO;
... ... @@ -191,6 +192,7 @@ public class EvalGroupUserBizService {
191 192 */
192 193 public void handleStaffKpi(PerformanceStaffDTO staff, EvalGroupUser evalUser, IgnoreCauseReqDTO rejectCauseReq) {
193 194 try {
  195 + evalUser.setStaffStatus(SalaryStaffStatusEnum.ofValue(staff.getStaffStatus()));
194 196 //获取忽略绩效理由
195 197 IgnoreCauseDTO ignoreCauseDTO = commonService.findIgnoreCauseDTO(staff, rejectCauseReq);
196 198  
... ... @@ -269,6 +271,9 @@ public class EvalGroupUserBizService {
269 271 if (PublicUtil.isNotEmpty(now)) {
270 272 evalGroupUser.setDataDate(now);
271 273 }
  274 + if (PublicUtil.isNotEmpty(staff.getLeaveDate())) {
  275 + evalGroupUser.setLeaveDate(staff.getLeaveDate());
  276 + }
272 277 return evalGroupUser;
273 278 }
274 279  
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java
... ... @@ -180,6 +180,69 @@ public class EvalPoolCommonService {
180 180 return userPool;
181 181 }
182 182  
  183 +// @Transactional(rollbackFor = Exception.class)
  184 + public void createUserPools(List<EvalGroupUser> users, EvalScopeEnum scopeType) {
  185 + for (EvalGroupUser user : Optional.ofNullable(users).orElse(new ArrayList<>())) {
  186 + this.createUserPool(user, scopeType);
  187 + }
  188 + }
  189 +
  190 + /**
  191 + * 查询薪酬池
  192 + *
  193 + * @param user
  194 + * @return
  195 + */
  196 +// @Transactional(rollbackFor = Exception.class)
  197 + public void createUserPool(EvalGroupUser user, EvalScopeEnum scopeType) {
  198 + EvalPoolBusinessTypeEnum businessType = EvalScopeEnum.MANAGEMENT.equals(scopeType)
  199 + ? EvalPoolBusinessTypeEnum.REWARD : EvalPoolBusinessTypeEnum.SCORE_REWARD;
  200 +
  201 + EvalUserPool evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
  202 + .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
  203 + .eq(EvalUserPool::getUserId, user.getUserId())
  204 + .eq(EvalUserPool::getPostId, user.getPostId())
  205 + .eq(EvalUserPool::getShopId, user.getShopId())
  206 + .eq(EvalUserPool::getBusinessType, businessType)
  207 + .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
  208 + .eq(EvalUserPool::getYn, Boolean.TRUE)
  209 + , Boolean.FALSE);
  210 + if (PublicUtil.isNotEmpty(evalUserPool)) {
  211 + Boolean inclusion = Boolean.TRUE.equals(user.getIgnored()) ? Boolean.FALSE : Boolean.TRUE;
  212 + evalUserPool.setInclusion(inclusion);
  213 + //不纳入计算,奖惩清空
  214 + if (Boolean.FALSE.equals(inclusion)) {
  215 + evalUserPool.setReward(BigDecimal.ZERO);
  216 + evalUserPool.setRank(null);
  217 + }
  218 + evalUserPool.setDataDate(user.getDataDate());
  219 + evalUserPoolService.updateById(evalUserPool);
  220 + return;
  221 + }
  222 + //同一个考评组的 调岗员工 修改调岗数据(调岗同岗位,合并数据,不同岗位,两条数据)
  223 + evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
  224 + .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
  225 + .eq(EvalUserPool::getEvalGroupId, user.getEvalGroupId())
  226 + .eq(EvalUserPool::getUserId, user.getUserId())
  227 + .eq(EvalUserPool::getPostId, user.getPostId())
  228 + .eq(EvalUserPool::getBusinessType, businessType)
  229 + .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
  230 + .eq(EvalUserPool::getYn, Boolean.TRUE)
  231 + , Boolean.FALSE);
  232 + if (PublicUtil.isNotEmpty(evalUserPool)) {
  233 + evalUserPool.setPostId(user.getPostId());
  234 + evalUserPool.setPostName(user.getPostName());
  235 + evalUserPool.setShopId(user.getShopId());
  236 + evalUserPool.setShopName(user.getShopName());
  237 + if (PublicUtil.isNotEmpty(user.getEgc())) {
  238 + evalUserPool.setEgc(user.getEgc());
  239 + }
  240 + evalUserPoolService.updateById(evalUserPool);
  241 + return;
  242 + }
  243 + this.createUserPoolData(user, scopeType);
  244 + }
  245 +
183 246 /**
184 247 * 获取员工社保公积金门店
185 248 *
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiStageIndicatorBizService.java
... ... @@ -102,6 +102,10 @@ public class KpiStageIndicatorBizService {
102 102 final Long evalCalcId = kpiStageMqLog.getEvalCalcId();
103 103  
104 104 EvalCalc evalCalc = evalCalcService.getById(evalCalcId);
  105 + if (PublicUtil.isEmpty(evalCalc) || PublicUtil.isEmpty(evalCalc.getStatus())) {
  106 + log.info("确认完成阶段数据上报 evalCalc为空,evalCalcId:{}", evalCalcId);
  107 + return Message.success();
  108 + }
105 109 //正在收集数据
106 110 if (EvalCalcStatusEnum.COLLECT_STAGE_DATA.equals(evalCalc.getStatus())) {
107 111 //在确认最晚时间之内 完成,其他业务系统可能还没确认
... ... @@ -141,7 +145,7 @@ public class KpiStageIndicatorBizService {
141 145 log.info("当前状态: {}, 无需重复处理!",evalCalc1.getStatus().getValue());
142 146 }else {
143 147 evalCalcService.modifyStatus(evalCalcId, EvalCalcStatusEnum.CALC_EVAL);
144   - cacheCalcGroupIds(evalCalcId, evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate());
  148 + cacheCalcGroupIds(evalCalcId, evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate());
145 149 }
146 150 stringRedisTemplate.delete(evalCalculationVal.getMqCodeLogStatusKey(kpiStageMqLog.getEvalCalcId()));
147 151 }
... ... @@ -150,8 +154,8 @@ public class KpiStageIndicatorBizService {
150 154 return Message.success();
151 155 }
152 156  
153   - private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final Set<Long> evalGroupIds, final LocalDate localDate) {
154   - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, evalGroupIds, localDate));
  157 + private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final LocalDate localDate) {
  158 + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, localDate));
155 159 stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json);
156 160 }
157 161  
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupUserService.java
... ... @@ -20,6 +20,8 @@ public interface EvalGroupUserService extends ILocalService&lt;EvalGroupUser&gt; {
20 20  
21 21 EvalGroupUser getMonthLastData(Long evalGroupId, Long userId, YearMonth yearMonth);
22 22  
  23 + EvalGroupUser getMonthStageLastData(Long evalGroupStageId, Long userId, LocalDate startDate, LocalDate endDate);
  24 +
23 25 /**
24 26 * 试用期员工
25 27 *
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserPoolService.java
... ... @@ -7,6 +7,7 @@ import cn.fw.morax.domain.enums.EvalScopeEnum;
7 7 import cn.fw.morax.domain.vo.eval.EvalUserPoolVO;
8 8 import com.baomidou.mybatisplus.extension.service.IService;
9 9  
  10 +import java.time.LocalDate;
10 11 import java.time.YearMonth;
11 12 import java.util.List;
12 13  
... ... @@ -37,4 +38,12 @@ public interface EvalUserPoolService extends IService&lt;EvalUserPool&gt; {
37 38 List<EvalUserPool> getPools(Long evalGroupRankStageId, YearMonth monthly);
38 39  
39 40 List<EvalUserPool> getRankPools(Long evalGroupRankStageId, YearMonth monthly, EvalScopeEnum scopeType);
  41 +
  42 + /**
  43 + * 获取离职或调岗人员
  44 + * @param evalGroupRankStageId
  45 + * @param monthly
  46 + * @return
  47 + */
  48 + List<EvalUserPool> getLeaveOrChangePostPools(Long evalGroupRankStageId, LocalDate stageEndTime);
40 49 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupServiceUserImpl.java
... ... @@ -33,6 +33,20 @@ public class EvalGroupServiceUserImpl extends ServiceImpl&lt;EvalGroupUserDao, Eval
33 33 }
34 34  
35 35 @Override
  36 + public EvalGroupUser getMonthStageLastData(Long evalGroupStageId, Long userId, LocalDate startDate, LocalDate endDate) {
  37 + return this.getOne(Wrappers.<EvalGroupUser>lambdaQuery()
  38 + .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupStageId)
  39 + .eq(EvalGroupUser::getUserId, userId)
  40 + .ge(EvalGroupUser::getDataDate, startDate)
  41 + .le(EvalGroupUser::getDataDate, endDate)
  42 + .eq(EvalGroupUser::getYn, Boolean.TRUE)
  43 + .orderByDesc(EvalGroupUser::getDataDate)
  44 + .last(" limit 1 ")
  45 + , Boolean.FALSE
  46 + );
  47 + }
  48 +
  49 + @Override
36 50 public Boolean probationStaff(Long userId, LocalDate beginTime, LocalDate endTime) {
37 51 List<EvalGroupUser> users = this.list(Wrappers.<EvalGroupUser>lambdaQuery()
38 52 .ge(EvalGroupUser::getDataDate, beginTime)
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserPoolServiceImpl.java
... ... @@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
14 14 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
15 15 import org.springframework.stereotype.Service;
16 16  
  17 +import java.time.LocalDate;
17 18 import java.time.YearMonth;
18 19 import java.util.ArrayList;
19 20 import java.util.List;
... ... @@ -87,4 +88,21 @@ public class EvalUserPoolServiceImpl extends ServiceImpl&lt;EvalUserPoolDao, EvalUs
87 88 );
88 89 return pools;
89 90 }
  91 +
  92 + @Override
  93 + public List<EvalUserPool> getLeaveOrChangePostPools(Long evalGroupRankStageId, LocalDate stageEndTime) {
  94 + if (PublicUtil.isEmpty(evalGroupRankStageId)) {
  95 + return new ArrayList<>();
  96 + }
  97 + YearMonth monthly = YearMonth.from(stageEndTime);
  98 + //在考评期间,但结束日期不是阶段结束日期
  99 + List<EvalUserPool> pools = this.list(Wrappers.<EvalUserPool>lambdaQuery()
  100 + .in(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStageId)
  101 + .eq(EvalUserPool::getMonthly, monthly)
  102 + .ne(EvalUserPool::getDataDate, stageEndTime)
  103 + .eq(EvalUserPool::getBusinessType, EvalPoolBusinessTypeEnum.SCORE_REWARD)
  104 + .eq(EvalUserPool::getYn, Boolean.TRUE)
  105 + );
  106 + return pools;
  107 + }
90 108 }
... ...