Commit e50dcf17b3eb1a52d77663ce3362e6656a100249

Authored by 姜超
2 parents fa9e0337 b4782e5b

Merge branch 'eval-report' into 'main'

Eval report



See merge request !137
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRankStageDao.java
... ... @@ -18,6 +18,5 @@ import java.util.List;
18 18 */
19 19 public interface EvalGroupRankStageDao extends BaseMapper<EvalGroupRankStage> {
20 20  
21   - List<EvalGroupRankStage> getEffects(@Param("dataDate") LocalDate dataDate);
22 21  
23 22 }
... ...
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalUserExtraReportDao.java 0 → 100644
  1 +package cn.fw.morax.dao.eval;
  2 +
  3 +
  4 +import cn.fw.morax.domain.db.eval.EvalUserExtraReport;
  5 +import cn.fw.morax.domain.db.eval.EvalUserReport;
  6 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  7 +
  8 +/**
  9 + * <p>
  10 + * 报表编码数据 Mapper 接口
  11 + * </p>
  12 + *
  13 + * @author jiangchao
  14 + * @since 2023-03-31
  15 + */
  16 +public interface EvalUserExtraReportDao extends BaseMapper<EvalUserExtraReport> {
  17 +
  18 +}
... ...
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalUserRankStageReportDao.java 0 → 100644
  1 +package cn.fw.morax.dao.eval;
  2 +
  3 +
  4 +import cn.fw.morax.domain.db.eval.EvalUserRankStageReport;
  5 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  6 +
  7 +/**
  8 + * <p>
  9 + * 报表绩效排名组 Mapper 接口
  10 + * </p>
  11 + *
  12 + * @author jiangchao
  13 + * @since 2023-03-31
  14 + */
  15 +public interface EvalUserRankStageReportDao extends BaseMapper<EvalUserRankStageReport> {
  16 +
  17 +}
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserExtraReport.java 0 → 100644
  1 +package cn.fw.morax.domain.db.eval;
  2 +
  3 +import cn.fw.common.data.entity.BaseEntity;
  4 +import cn.fw.common.data.mybatis.handler.LongListTypeHandler;
  5 +import cn.fw.common.data.mybatis.handler.StringListTypeHandler;
  6 +import com.baomidou.mybatisplus.annotation.TableField;
  7 +import com.baomidou.mybatisplus.annotation.TableName;
  8 +import lombok.*;
  9 +import lombok.experimental.Accessors;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * <p>
  15 + * 报表编码维度数据表(额外数据)
  16 + * </p>
  17 + *
  18 + * @author jiangchao
  19 + * @since 2023-04-17
  20 + */
  21 +@Data
  22 +@EqualsAndHashCode(callSuper = false)
  23 +@Accessors(chain = true)
  24 +@TableName(autoResultMap = true)
  25 +@Builder
  26 +@NoArgsConstructor
  27 +@AllArgsConstructor
  28 +public class EvalUserExtraReport extends BaseEntity<EvalUserExtraReport, Long> {
  29 +
  30 + private static final long serialVersionUID = 1L;
  31 +
  32 + /**
  33 + * 考评报表id
  34 + */
  35 + private Long evalUserReportId;
  36 +
  37 + /**
  38 + * 适用门店ids
  39 + */
  40 + @TableField(typeHandler = LongListTypeHandler.class)
  41 + private List<Long> shopIds;
  42 +
  43 + /**
  44 + * 人员ids
  45 + */
  46 + @TableField(typeHandler = LongListTypeHandler.class)
  47 + private List<Long> staffIds;
  48 +
  49 + /**
  50 + * 适用角色编码
  51 + */
  52 + @TableField(typeHandler = StringListTypeHandler.class)
  53 + private List<String> roleCodes;
  54 + /**
  55 + * 适用角色名称
  56 + */
  57 + @TableField(typeHandler = StringListTypeHandler.class)
  58 + private List<String> roleNames;
  59 +
  60 +}
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserRankCodeReport.java
... ... @@ -31,6 +31,11 @@ public class EvalUserRankCodeReport extends BaseEntity&lt;EvalUserRankCodeReport, L
31 31 private Long evalUserRankReportId;
32 32  
33 33 /**
  34 + * 报表考评排名组阶段id
  35 + */
  36 + private Long evalUserRankStageReportId;
  37 +
  38 + /**
34 39 * 考评指标id
35 40 */
36 41 private Long evalGroupIndicatorId;
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserRankReport.java
... ... @@ -39,17 +39,14 @@ public class EvalUserRankReport extends BaseEntity&lt;EvalUserRankReport, Long&gt; {
39 39 private String rankName;
40 40  
41 41 /**
42   - * 考评组id
  42 + * 多阶段
43 43 */
44   - @TableField(typeHandler = LongListTypeHandler.class)
45   - private List<Long> evalGroupIds;
  44 + private Boolean multiStage;
46 45  
47 46 /**
48   - * 考评所有门店id
  47 + * 门店
49 48 */
50   - @TableField(typeHandler = LongListTypeHandler.class)
51 49 private List<Long> shopIds;
52   -
53 50 /**
54 51 * 集团id
55 52 */
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserRankStageReport.java 0 → 100644
  1 +package cn.fw.morax.domain.db.eval;
  2 +
  3 +import cn.fw.common.data.entity.BaseEntity;
  4 +import cn.fw.common.data.mybatis.handler.LongListTypeHandler;
  5 +import com.baomidou.mybatisplus.annotation.TableField;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.experimental.Accessors;
  10 +
  11 +import java.time.LocalDate;
  12 +import java.time.LocalDateTime;
  13 +import java.time.YearMonth;
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * <p>
  18 + * 报表绩效排名组
  19 + * </p>
  20 + *
  21 + * @author jiangchao
  22 + * @since 2023-03-31
  23 + */
  24 +@Data
  25 +@EqualsAndHashCode(callSuper = false)
  26 +@Accessors(chain = true)
  27 +@TableName(autoResultMap = true)
  28 +public class
  29 +EvalUserRankStageReport extends BaseEntity<EvalUserRankStageReport, Long> {
  30 +
  31 + private static final long serialVersionUID = 1L;
  32 +
  33 + /**
  34 + * 报表考评排名组id
  35 + */
  36 + private Long evalUserRankReportId;
  37 +
  38 + /**
  39 + * 考评排名组id
  40 + */
  41 + private Long evalGroupRankId;
  42 +
  43 + /**
  44 + * 考评排名组阶段id
  45 + */
  46 + private Long evalGroupRankStageId;
  47 +
  48 + /**
  49 + * 考评排名组阶段名称
  50 + */
  51 + private String stageName;
  52 +
  53 + /**
  54 + * 考评组id
  55 + */
  56 + @TableField(typeHandler = LongListTypeHandler.class)
  57 + private List<Long> evalGroupIds;
  58 +
  59 + /**
  60 + * 生效时间
  61 + */
  62 + private LocalDateTime beginTime;
  63 +
  64 + /**
  65 + * 结束时间
  66 + */
  67 + private LocalDateTime overTime;
  68 +
  69 +}
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserReport.java
... ... @@ -34,6 +34,11 @@ public class EvalUserReport extends BaseEntity&lt;EvalUserReport, Long&gt; {
34 34 private Long evalUserRankReportId;
35 35  
36 36 /**
  37 + * 报表考评排名组阶段id
  38 + */
  39 + private Long evalUserRankStageReportId;
  40 +
  41 + /**
37 42 * 维度
38 43 */
39 44 private ReportDimensionEnum dimension;
... ... @@ -78,16 +83,31 @@ public class EvalUserReport extends BaseEntity&lt;EvalUserReport, Long&gt; {
78 83 */
79 84 private LocalDate dataDate;
80 85  
81   -// /**
82   -// * 月份
83   -// */
84   -// private YearMonth monthly;
  86 + /**
  87 + * 考评奖惩
  88 + */
  89 + private BigDecimal reward;
  90 +
  91 + /**
  92 + * 考评得分
  93 + */
  94 + private BigDecimal score;
  95 +
  96 + /**
  97 + * 考评得分率
  98 + */
  99 + private BigDecimal scoreRatio;
85 100  
86 101 /**
87 102 * 绩效池id
88 103 */
89 104 private Long evalUserPoolId;
90 105  
  106 + /**
  107 + * 绩效池id
  108 + */
  109 + private Long evalShopPoolId;
  110 +
91 111 public EvalUserReport() {
92 112 }
93 113  
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java
... ... @@ -3,18 +3,32 @@ package cn.fw.morax.server.task;
3 3 import cn.fw.common.cache.locker.DistributedLocker;
4 4 import cn.fw.morax.common.constant.Constant;
5 5 import cn.fw.morax.common.constant.TimeTaskConstant;
  6 +import cn.fw.morax.common.utils.DateUtil;
6 7 import cn.fw.morax.common.utils.PublicUtil;
  8 +import cn.fw.morax.domain.bo.salary.SalaryGroupProjectBO;
7 9 import cn.fw.morax.domain.db.eval.*;
8 10 import cn.fw.morax.domain.db.kpi.IndicatorUserValue;
  11 +import cn.fw.morax.domain.db.salary.ReportSalaryDim;
  12 +import cn.fw.morax.domain.db.salary.ReportSalaryDimExtra;
  13 +import cn.fw.morax.domain.db.salary.ReportSalaryDimValue;
  14 +import cn.fw.morax.domain.db.salary.SalaryPool;
9 15 import cn.fw.morax.domain.enums.*;
  16 +import cn.fw.morax.domain.vo.salary.SalaryGroupProjectParamVO;
  17 +import cn.fw.morax.rpc.ehr.EhrRpcService;
  18 +import cn.fw.morax.rpc.ehr.dto.ManagerDTO;
  19 +import cn.fw.morax.rpc.ehr.dto.ManagerStaffRoleDTO;
  20 +import cn.fw.morax.rpc.ehr.dto.ManagerStaffShopDTO;
  21 +import cn.fw.morax.rpc.ehr.dto.StaffBaseInfoDTO;
10 22 import cn.fw.morax.service.biz.CommonService;
11 23 import cn.fw.morax.service.data.eval.*;
12 24 import cn.fw.morax.service.data.kpi.IndicatorUserValueService;
  25 +import com.alibaba.fastjson.JSON;
13 26 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
14 27 import com.google.common.collect.Maps;
15 28 import lombok.Getter;
16 29 import lombok.RequiredArgsConstructor;
17 30 import lombok.extern.slf4j.Slf4j;
  31 +import org.apache.rocketmq.common.filter.impl.Op;
18 32 import org.redisson.api.RLock;
19 33 import org.springframework.beans.factory.annotation.Value;
20 34 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
... ... @@ -26,6 +40,7 @@ import org.springframework.transaction.TransactionStatus;
26 40 import org.springframework.transaction.annotation.Transactional;
27 41  
28 42 import java.math.BigDecimal;
  43 +import java.math.RoundingMode;
29 44 import java.time.LocalDate;
30 45 import java.time.YearMonth;
31 46 import java.time.temporal.TemporalAdjusters;
... ... @@ -51,18 +66,21 @@ public class EvalUserReportTask {
51 66 private final EvalGroupIndicatorHitLogService evalGroupIndicatorHitLogService;
52 67 private final EvalGroupIndicatorParamService evalGroupIndicatorParamService;
53 68 private final EvalUserRankCodeReportService evalUserRankCodeReportService;
  69 + private final EvalUserRankStageReportService evalUserRankStageReportService;
54 70 private final EvalUserValueReportService evalUserValueReportService;
55 71 private final EvalGroupIndicatorService evalGroupIndicatorService;
56   - private final IndicatorUserValueService indicatorUserValueService;
57   - private final EvalIndicatorValueService evalIndicatorValueService;
58 72 private final PlatformTransactionManager platformTransactionManager;
59 73 private final EvalUserRankReportService evalUserRankReportService;
  74 + private final EvalGroupRankStageService evalGroupRankStageService;
  75 + private final EvalUserExtraReportService evalUserExtraReportService;
60 76 private final EvalUserReportService evalUserReportService;
61 77 private final TransactionDefinition transactionDefinition;
62 78 private final EvalUserPoolService evalUserPoolService;
  79 + private final EvalShopPoolService evalShopPoolService;
63 80 private final EvalGroupRankService evalGroupRankService;
64   - private final EvalGroupService evalGroupService;
65 81 private final DistributedLocker distributedLocker;
  82 + private final EvalGroupService evalGroupService;
  83 + private final EhrRpcService ehrRpcService;
66 84 private final CommonService commonService;
67 85  
68 86 @Value("${spring.cache.custom.global-prefix}:eval:user:report")
... ... @@ -76,7 +94,7 @@ public class EvalUserReportTask {
76 94 @Scheduled(cron = TimeTaskConstant.EVAL_REPORT)
77 95 @Transactional(rollbackFor = Exception.class)
78 96 public void evalUserReportTask() {
79   -// this.evalUserReport(LocalDate.now().minusDays(1));
  97 + this.evalUserReport(LocalDate.now().minusDays(1));
80 98 }
81 99  
82 100 /**
... ... @@ -121,44 +139,65 @@ public class EvalUserReportTask {
121 139 * @param date
122 140 */
123 141 public void createRankReport(EvalGroupRank rank, Long groupId, LocalDate date) {
124   - List<EvalGroup> evalGroups = evalGroupService.getEffectsByRankId(rank.getId(), date);
125   - List<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList());
126   - if (PublicUtil.isEmpty(evalGroupIds)) {
127   - return;
128   - }
129   - List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
130   - .in(EvalUserPool::getEvalGroupId, evalGroupIds)
131   - .eq(EvalUserPool::getMonthly, YearMonth.from(date))
132   - .eq(EvalUserPool::getYn, Boolean.TRUE)
133   - );
134   - if (PublicUtil.isEmpty(pools)) {
  142 + //查已经开始的考评阶段
  143 + List<EvalGroupRankStage> stages = evalGroupRankStageService.getRankStartStages(rank.getId(), date);
  144 + if (PublicUtil.isEmpty(stages)) {
135 145 return;
136 146 }
137   - List<EvalGroupIndicator> evalGroupIndicators = evalGroupIndicatorService.list(Wrappers.<EvalGroupIndicator>lambdaQuery()
138   - .in(EvalGroupIndicator::getEvalGroupId, evalGroupIds)
139   - .eq(EvalGroupIndicator::getYn, Boolean.TRUE)
140   - .orderByAsc(EvalGroupIndicator::getId)
141   - );
142   -
  147 + List<EvalGroup> evalGroups = evalGroupService.getEvalGroups(rank.getId());
  148 + Map<Long, List<EvalGroup>> stageEvalGroupMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getEvalGroupRankStageId));
143 149 //排名组
144   - EvalUserRankReport reportRank = this.saveRankReport(rank, evalGroupIds, evalGroups, date, groupId);
  150 + EvalUserRankReport reportRank = this.saveRankReport(rank, evalGroups, date, groupId);
145 151 final Long evalUserRankReportId = reportRank.getId();
146   - //排名组指标编码、人员、门店
147   - List<EvalUserRankCodeReport> rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, date);
148   - List<EvalUserReport> evalUserReports = this.saveStaffReports(pools, date, evalUserRankReportId);
149   - List<EvalUserReport> evalShopReports = this.saveShopReports(pools, date, evalUserRankReportId);
150   - //人员维度
151   - List<EvalUserValueReport> reportUserValues = calcUser(pools, evalGroupIndicators, evalUserReports, date);
152   - //门店维度
153   - calcShop(evalShopReports, rankCodes, reportUserValues, evalUserReports, date);
  152 + for (EvalGroupRankStage rankStage : stages) {
  153 + //如果当前时间 大于 考评阶段结束时间,使用考评结束时间进行查询
  154 + LocalDate dataDate = (date.compareTo(rankStage.getOverTime()) > 0) ? rankStage.getOverTime() : date;
  155 + List<EvalGroup> stageEvalGroups = stageEvalGroupMap.get(rankStage.getId());
  156 + List<Long> evalGroupIds = stageEvalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList());
  157 + if (PublicUtil.isEmpty(evalGroupIds)) {
  158 + continue;
  159 + }
  160 + List<EvalUserPool> userPools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
  161 + .in(EvalUserPool::getEvalGroupId, evalGroupIds)
  162 + .eq(EvalUserPool::getMonthly, YearMonth.from(dataDate))
  163 + .eq(EvalUserPool::getYn, Boolean.TRUE)
  164 + );
  165 + List<EvalShopPool> shopPools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
  166 + .in(EvalShopPool::getEvalGroupId, evalGroupIds)
  167 + .eq(EvalShopPool::getMonthly, YearMonth.from(dataDate))
  168 + .eq(EvalShopPool::getYn, Boolean.TRUE)
  169 + );
  170 + List<EvalGroupIndicator> evalGroupIndicators = evalGroupIndicatorService.list(Wrappers.<EvalGroupIndicator>lambdaQuery()
  171 + .in(EvalGroupIndicator::getEvalGroupId, evalGroupIds)
  172 + .eq(EvalGroupIndicator::getYn, Boolean.TRUE)
  173 + .orderByAsc(EvalGroupIndicator::getId)
  174 + );
  175 +
  176 + //排名组阶段
  177 + EvalUserRankStageReport rankStageReport = this.saveRankStageReport(reportRank, rank, rankStage, stageEvalGroups);
  178 + final Long evalUserRankStageReportId = rankStageReport.getId();
  179 + //排名组指标编码、人员、门店
  180 + List<EvalUserRankCodeReport> rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, evalUserRankStageReportId, dataDate);
  181 + List<EvalUserReport> evalUserReports = this.saveStaffReports(userPools, dataDate, evalUserRankReportId, evalUserRankStageReportId);
  182 + List<EvalUserReport> evalShopReports = this.saveShopReports(shopPools, dataDate, evalUserRankReportId, evalUserRankStageReportId);
  183 + //人员维度
  184 + List<EvalUserValueReport> reportUserValues = calcUser(userPools, evalGroupIndicators, evalUserReports, dataDate);
  185 + //门店维度
  186 + calcShop(shopPools, evalGroupIndicators, evalShopReports, dataDate);
  187 + //门店维度
  188 + calcManager(userPools, reportUserValues, rankCodes, evalUserReports, rankStageReport, date);
  189 + }
  190 +
154 191  
155 192 }
156 193 public List<EvalUserValueReport> calcUser(List<EvalUserPool> pools,
157 194 List<EvalGroupIndicator> evalGroupIndicators,
158 195 List<EvalUserReport> evalUserReports,
159 196 LocalDate date) {
  197 + if (PublicUtil.isEmpty(pools)) {
  198 + return new ArrayList<>();
  199 + }
160 200 List<EvalUserValueReport> reportUserValues = new ArrayList<>();
161   - List<Long> userIds = pools.stream().map(EvalUserPool::getUserId).distinct().collect(Collectors.toList());
162 201 List<Long> poolIds = pools.stream().map(EvalUserPool::getId).collect(Collectors.toList());
163 202 List<Long> evalGroupIndicatorIds = evalGroupIndicators.stream().map(EvalGroupIndicator::getId).collect(Collectors.toList());
164 203 List<EvalGroupIndicatorHitLog> hitLogs = evalGroupIndicatorHitLogService.getHitLogs(evalGroupIndicatorIds, poolIds, EvalScopeEnum.STAFF, date);
... ... @@ -177,37 +216,33 @@ public class EvalUserReportTask {
177 216 List<EvalGroupIndicatorHitLog> userHitLogs = indicatorHitLogMap.getOrDefault(evalGroupIndicatorId, new ArrayList<>());
178 217 Map<Long, EvalGroupIndicatorHitLog> poolHitLogMap = userHitLogs.stream()
179 218 .collect(Collectors.toMap(EvalGroupIndicatorHitLog::getPoolId, Function.identity(), (v1, v2) -> v1));
180   - for (EvalUserPool userPool : pools) {
181   - if (! userPool.getEvalGroupId().equals(groupIndicator.getEvalGroupId())) {
  219 + for (EvalUserPool pool : pools) {
  220 + if (! pool.getEvalGroupId().equals(groupIndicator.getEvalGroupId())) {
182 221 continue;
183 222 }
184   - Optional<EvalGroupIndicatorHitLog> hitLog = Optional.ofNullable(poolHitLogMap.get(userPool.getId()));
  223 +
  224 + Optional<EvalGroupIndicatorHitLog> hitLog = Optional.ofNullable(poolHitLogMap.get(pool.getId()));
  225 + if (pool.getDataDate().compareTo(date) != 0) {
  226 + hitLog = evalGroupIndicatorHitLogService.getHitLog(evalGroupIndicatorId, pool.getId(), EvalScopeEnum.STAFF, pool.getDataDate());
  227 + }
185 228 BigDecimal value = (ScoreWayEnum.LADDER.equals(scoreWay)) ?
186 229 hitLog.map(EvalGroupIndicatorHitLog::getHitLadderValue).orElse(BigDecimal.ZERO) :
187 230 hitLog.map(EvalGroupIndicatorHitLog::getHitCommissionValue).orElse(BigDecimal.ZERO);
188   - Long evalUserReportId = userPoolReportIdMap.get(userPool.getId());
  231 + Long evalUserReportId = userPoolReportIdMap.get(pool.getId());
189 232 reportUserValues.add(convertDB(evalUserReportId, groupIndicator, value, date, params));
190 233 }
191 234  
192 235 //是否有子指标
193 236 if (IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(codeType)) {
194 237 for (EvalGroupIndicatorParam param : params) {
195   - if (TargetTypeEnum.NO.equals(param.getTargetType())) {
196   - Map<Long, BigDecimal> userValueMap = queryUserOriginValue(param, userIds, date);
197   - for (EvalUserPool userPool : pools) {
198   - BigDecimal value = userValueMap.getOrDefault(userPool.getUserId(), BigDecimal.ZERO);
199   - Long evalUserReportId = userPoolReportIdMap.get(userPool.getId());
200   - reportUserValues.add(convertParamDB(evalUserReportId, param, value, date));
201   - }
202   - } else {
203   - Map<Long, EvalGroupIndicatorTargetHitLog> hitLogMap = queryUserTargetValue(param.getId(), poolIds, date);
204   - for (EvalUserPool userPool : pools) {
205   - EvalGroupIndicatorTargetHitLog hitLog = hitLogMap.get(userPool.getId());
206   - BigDecimal value = Optional.ofNullable(hitLog)
207   - .map(EvalGroupIndicatorTargetHitLog::getReachValue).orElse(BigDecimal.ZERO).multiply(Constant.ONE_HUNDRED);
208   - Long evalUserReportId = userPoolReportIdMap.get(userPool.getId());
209   - reportUserValues.add(convertParamDB(evalUserReportId, param, value, date));
210   - }
  238 + Map<Long, EvalGroupIndicatorTargetHitLog> targetHitLogMap = queryTargetValue(param.getId(), poolIds, date, EvalScopeEnum.STAFF);
  239 + for (EvalUserPool pool : pools) {
  240 + Boolean staffChange = pool.getDataDate().compareTo(date) != 0;
  241 + EvalGroupIndicatorTargetHitLog targetHitLog = (staffChange)
  242 + ? queryTargetValue(param.getId(), pool.getId(), pool.getDataDate(), EvalScopeEnum.STAFF) : targetHitLogMap.get(pool.getId());
  243 + BigDecimal value = this.getParamValue(targetHitLog);
  244 + Long evalUserReportId = userPoolReportIdMap.get(pool.getId());
  245 + reportUserValues.add(convertParamDB(evalUserReportId, param, value, date));
211 246 }
212 247 }
213 248 }
... ... @@ -218,44 +253,149 @@ public class EvalUserReportTask {
218 253 return reportUserValues;
219 254 }
220 255  
221   - public void calcShop(List<EvalUserReport> evalShopReports,
222   - List<EvalUserRankCodeReport> rankCodes,
223   - List<EvalUserValueReport> reportUserValues,
224   - List<EvalUserReport> evalUserReports,
225   - LocalDate date) {
226   - List<EvalUserValueReport> reportShopValues = new ArrayList<>();
227   - for (EvalUserReport shopReport : evalShopReports) {
  256 + public void calcShop(List<EvalShopPool> pools,
  257 + List<EvalGroupIndicator> evalGroupIndicators,
  258 + List<EvalUserReport> evalShopReports,
  259 + LocalDate date) {
  260 + if (PublicUtil.isEmpty(pools)) {
  261 + return ;
  262 + }
  263 + List<EvalUserValueReport> reportUserValues = new ArrayList<>();
  264 + List<Long> poolIds = pools.stream().map(EvalShopPool::getId).collect(Collectors.toList());
  265 + List<Long> evalGroupIndicatorIds = evalGroupIndicators.stream().map(EvalGroupIndicator::getId).collect(Collectors.toList());
  266 + List<EvalGroupIndicatorHitLog> hitLogs = evalGroupIndicatorHitLogService.getHitLogs(evalGroupIndicatorIds, poolIds, EvalScopeEnum.SHOP, date);
  267 + Map<Long, List<EvalGroupIndicatorHitLog>> indicatorHitLogMap = hitLogs.stream().collect(Collectors.groupingBy(EvalGroupIndicatorHitLog::getEvalGroupIndicatorId));
  268 + Map<Long, Long> shopPoolReportIdMap = evalShopReports.stream().collect(Collectors.toMap(EvalUserReport::getEvalShopPoolId, EvalUserReport::getId, (v1, v2) -> v1));
  269 +
  270 + for (EvalGroupIndicator groupIndicator : evalGroupIndicators) {
  271 + final ScoreWayEnum scoreWay = groupIndicator.getScoreWay();
  272 + final IndicatorCodeTypeEnum codeType = groupIndicator.getCodeType();
  273 + final Long evalGroupIndicatorId = groupIndicator.getId();
  274 + List<EvalGroupIndicatorParam> params = evalGroupIndicatorParamService.list(Wrappers.<EvalGroupIndicatorParam>lambdaQuery()
  275 + .eq(EvalGroupIndicatorParam::getEvalGroupIndicatorId, evalGroupIndicatorId)
  276 + .eq(EvalGroupIndicatorParam::getYn, Boolean.TRUE)
  277 + );
  278 +
  279 + List<EvalGroupIndicatorHitLog> userHitLogs = indicatorHitLogMap.getOrDefault(evalGroupIndicatorId, new ArrayList<>());
  280 + Map<Long, EvalGroupIndicatorHitLog> poolHitLogMap = userHitLogs.stream()
  281 + .collect(Collectors.toMap(EvalGroupIndicatorHitLog::getPoolId, Function.identity(), (v1, v2) -> v1));
  282 + for (EvalShopPool pool : pools) {
  283 + if (! pool.getEvalGroupId().equals(groupIndicator.getEvalGroupId())) {
  284 + continue;
  285 + }
  286 +
  287 + Optional<EvalGroupIndicatorHitLog> hitLog = Optional.ofNullable(poolHitLogMap.get(pool.getId()));
  288 + BigDecimal value = (ScoreWayEnum.LADDER.equals(scoreWay)) ?
  289 + hitLog.map(EvalGroupIndicatorHitLog::getHitLadderValue).orElse(BigDecimal.ZERO) :
  290 + hitLog.map(EvalGroupIndicatorHitLog::getHitCommissionValue).orElse(BigDecimal.ZERO);
  291 + Long evalUserReportId = shopPoolReportIdMap.get(pool.getId());
  292 + reportUserValues.add(convertDB(evalUserReportId, groupIndicator, value, date, params));
  293 + }
228 294  
229   - Set<Long> shopReportIds = evalUserReports.stream()
230   - .filter(user -> shopReport.getShopId().equals(user.getShopId()) && Boolean.TRUE.equals(user.getInclusion()))
  295 + //是否有子指标
  296 + if (IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(codeType)) {
  297 + for (EvalGroupIndicatorParam param : params) {
  298 + Map<Long, EvalGroupIndicatorTargetHitLog> targetHitLogMap = queryTargetValue(param.getId(), poolIds, date, EvalScopeEnum.SHOP);
  299 + for (EvalShopPool pool : pools) {
  300 + EvalGroupIndicatorTargetHitLog targetHitLog = targetHitLogMap.get(pool.getId());
  301 + BigDecimal value = this.getParamValue(targetHitLog);
  302 + Long evalUserReportId = shopPoolReportIdMap.get(pool.getId());
  303 + reportUserValues.add(convertParamDB(evalUserReportId, param, value, date));
  304 + }
  305 + }
  306 + }
  307 + }
  308 + if (PublicUtil.isNotEmpty(reportUserValues)) {
  309 + evalUserValueReportService.saveBatch(reportUserValues);
  310 + }
  311 + }
  312 +
  313 + public void calcManager(List<EvalUserPool> pools,
  314 + List<EvalUserValueReport> reportUserValues,
  315 + List<EvalUserRankCodeReport> rankCodes,
  316 + List<EvalUserReport> evalUserReports,
  317 + EvalUserRankStageReport rankStageReport,
  318 + LocalDate date) {
  319 + if (PublicUtil.isEmpty(pools)) {
  320 + return;
  321 + }
  322 + List<Long> shopIds = pools.stream().map(EvalUserPool::getShopId).distinct().collect(Collectors.toList());
  323 + List<ManagerDTO> managerDTOS = ehrRpcService.getRealTimeShopManager(new ArrayList<>(shopIds));
  324 + log.info("查询门店实时管理者:{},{}", JSON.toJSONString(shopIds), JSON.toJSONString(managerDTOS));
  325 + if (PublicUtil.isEmpty(managerDTOS)) {
  326 + return;
  327 + }
  328 + Map<Long, StaffBaseInfoDTO> managerMap = staffInfoMap(managerDTOS);
  329 + List<EvalUserValueReport> valueReports = new ArrayList<>();
  330 + for (ManagerDTO manager : managerDTOS) {
  331 + if (PublicUtil.isEmpty(manager.getManageStaffList())) {
  332 + continue;
  333 + }
  334 + List<Long> manageStaffIds = manager.getManageStaffList().stream().map(StaffBaseInfoDTO::getId).distinct().collect(Collectors.toList());
  335 + Set<Long> managerStaffDimReportIds = evalUserReports.stream()
  336 + .filter(user -> manageStaffIds.contains(user.getUserId()))
231 337 .map(EvalUserReport::getId).collect(Collectors.toSet());
  338 + if (PublicUtil.isEmpty(managerStaffDimReportIds)) {
  339 + continue;
  340 + }
  341 + EvalUserReport evalUserReport = createManager(rankStageReport, date);
  342 + final Long managerEvalUserReportId = this.saveManagerDimDB(evalUserReport, manager, pools, managerMap, manageStaffIds);
232 343  
233   - final Long evalUserReportId = shopReport.getId();
234   - for (EvalUserRankCodeReport rankCode : rankCodes) {
235   - final String code = rankCode.getCode();
236   - final IndicatorCodeTypeEnum codeType = rankCode.getCodeType();
237   -
238   - Double averageRatioDouble = reportUserValues.stream()
239   - .filter(user -> shopReportIds.contains(user.getEvalUserReportId()) && code.equals(user.getCode()))
240   - .mapToDouble(userValue -> Optional.ofNullable(userValue.getValue()).orElse(BigDecimal.ZERO).doubleValue())
241   - .average()
242   - .orElse(0);
243   - BigDecimal value = new BigDecimal(averageRatioDouble.toString());
244   - EvalUserValueReport shopValue = new EvalUserValueReport(evalUserReportId, code, codeType, value, date);
245   - reportShopValues.add(shopValue);
  344 + for (EvalUserRankCodeReport codeReport : rankCodes) {
  345 + BigDecimal value = calcAverageValue(reportUserValues, managerStaffDimReportIds, codeReport.getCode());
  346 + valueReports.add(this.convertManagerValue(managerEvalUserReportId, codeReport, value, date));
246 347 }
247 348 }
248   - if (PublicUtil.isNotEmpty(reportShopValues)) {
249   - evalUserValueReportService.saveBatch(reportShopValues);
  349 + if (PublicUtil.isNotEmpty(valueReports)) {
  350 + evalUserValueReportService.saveBatch(valueReports);
  351 + }
  352 + }
  353 +
  354 + public BigDecimal calcAverageValue(List<EvalUserValueReport> valueReports, Set<Long> managerStaffDimReportIds, String code) {
  355 + Double averageRatioDouble = valueReports.stream()
  356 + .filter(user -> managerStaffDimReportIds.contains(user.getEvalUserReportId()) && code.equals(user.getCode()))
  357 + .mapToDouble(userValue -> Optional.ofNullable(userValue.getValue()).orElse(BigDecimal.ZERO).doubleValue())
  358 + .average()
  359 + .orElse(0);
  360 + return new BigDecimal(averageRatioDouble.toString());
  361 + }
  362 +
  363 + public BigDecimal getParamValue(EvalGroupIndicatorTargetHitLog hitLog) {
  364 + if (PublicUtil.isEmpty(hitLog) || PublicUtil.isEmpty(hitLog.getUseTarget())) {
  365 + return BigDecimal.ZERO;
  366 + }
  367 + BigDecimal value = null;
  368 + switch (hitLog.getUseTarget()) {
  369 + case NO: {
  370 + value = Optional.ofNullable(hitLog.getValue()).orElse(BigDecimal.ZERO);
  371 + break;
  372 + }
  373 + case FIRST_TARGET: {
  374 + value = Optional.ofNullable(hitLog.getReachValue()).orElse(BigDecimal.ZERO);
  375 + break;
  376 + }
  377 + case EXTRA_TARGET: {
  378 + value = Optional.ofNullable(hitLog.getExtraReachValue()).orElse(BigDecimal.ZERO);
  379 + break;
  380 + }
250 381 }
  382 +
  383 + return value;
251 384 }
252 385  
253   - public List<EvalUserReport> saveStaffReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId) {
  386 + public List<EvalUserReport> saveStaffReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId, Long evalUserRankStageReportId) {
  387 + if (PublicUtil.isEmpty(pools)) {
  388 + return new ArrayList<>();
  389 + }
254 390 List<EvalUserReport> evalUserReports = new ArrayList<>();
255 391 for (EvalUserPool userPool : pools) {
256 392 EvalUserReport report = new EvalUserReport();
257 393 report.setEvalUserRankReportId(evalUserRankReportId);
  394 + report.setEvalUserRankStageReportId(evalUserRankStageReportId);
258 395 report.setDimension(ReportDimensionEnum.STAFF);
  396 + report.setReward(userPool.getReward());
  397 + report.setScore(userPool.getScore());
  398 + report.setScoreRatio(userPool.getScoreRatio().multiply(Constant.ONE_HUNDRED));
259 399 report.setUserId(userPool.getUserId());
260 400 report.setUserName(userPool.getUserName());
261 401 report.setPostId(userPool.getPostId());
... ... @@ -271,15 +411,22 @@ public class EvalUserReportTask {
271 411 return evalUserReports;
272 412 }
273 413  
274   - public List<EvalUserReport> saveShopReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId) {
  414 + public List<EvalUserReport> saveShopReports(List<EvalShopPool> shopPools, LocalDate date, Long evalUserRankReportId, Long evalUserRankStageReportId) {
  415 + if (PublicUtil.isEmpty(shopPools)) {
  416 + return new ArrayList<>();
  417 + }
275 418 List<EvalUserReport> evalShopReports = new ArrayList<>();
276   - Map<Long, String> shopMap = pools.stream().collect(Collectors.toMap(EvalUserPool::getShopId, EvalUserPool::getShopName, (v1, v2) -> v1));
277   - for (Long shopId : shopMap.keySet()) {
  419 + for (EvalShopPool shopPool : shopPools) {
278 420 EvalUserReport report = new EvalUserReport();
279 421 report.setDimension(ReportDimensionEnum.SHOP);
280 422 report.setEvalUserRankReportId(evalUserRankReportId);
281   - report.setShopId(shopId);
282   - report.setShopName(shopMap.get(shopId));
  423 + report.setReward(shopPool.getReward());
  424 + report.setScore(shopPool.getScore());
  425 + report.setScoreRatio(shopPool.getScoreRatio().multiply(Constant.ONE_HUNDRED));
  426 + report.setEvalUserRankStageReportId(evalUserRankStageReportId);
  427 + report.setShopId(shopPool.getShopId());
  428 + report.setEvalShopPoolId(shopPool.getId());
  429 + report.setShopName(shopPool.getShopName());
283 430 report.setDataDate(date);
284 431 evalShopReports.add(report);
285 432 }
... ... @@ -287,46 +434,32 @@ public class EvalUserReportTask {
287 434 return evalShopReports;
288 435 }
289 436  
290   - public Map<Long, BigDecimal> queryUserOriginValue(EvalGroupIndicatorParam param, List<Long> userIds, LocalDate dataDate) {
291   - final String code = param.getCode();
292   - final IndicatorCodeTypeEnum codeType = param.getCodeType();
293   - Map<Long, BigDecimal> referValueMap = Maps.newHashMapWithExpectedSize(userIds.size());
294   - //无目标
295   - if (IndicatorCodeTypeEnum.INDICATOR.equals(codeType)) {
296   - List<IndicatorUserValue> indicatorUserValues = indicatorUserValueService.list(Wrappers.<IndicatorUserValue>lambdaQuery()
297   - .eq(IndicatorUserValue::getIndicatorCode, code)
298   - .eq(IndicatorUserValue::getDataDate, dataDate)
299   - .in(IndicatorUserValue::getUserId, userIds)
300   - .eq(IndicatorUserValue::getDimensionType, DimensionTypeEnum.STAFF)
301   - .eq(IndicatorUserValue::getYn, Boolean.TRUE)
302   - );
303   - for (IndicatorUserValue userValue : indicatorUserValues) {
304   - referValueMap.put(userValue.getUserId(), commonService.queryIndicatorValueVO(code, userValue,
305   - param.getTargetType(), param.getDataType()));
306   - }
307   - return referValueMap;
308   - }
309   - for (Long userId : userIds) {
310   - EvalIndicatorValue evalIndicatorValue = evalIndicatorValueService.queryLastValue(userId,
311   - DimensionTypeEnum.STAFF, code, dataDate);
312   - referValueMap.put(userId, commonService.queryEvalIndicatorValueVO(code, evalIndicatorValue, param.getTargetType(), param.getDataType()));
313   - }
314   - return referValueMap;
315   - }
316   -
317   - public Map<Long, EvalGroupIndicatorTargetHitLog> queryUserTargetValue(Long referId, List<Long> poolIds, LocalDate dataDate) {
  437 + public Map<Long, EvalGroupIndicatorTargetHitLog> queryTargetValue(Long referId, List<Long> poolIds, LocalDate dataDate, EvalScopeEnum scopeType) {
318 438 List<EvalGroupIndicatorTargetHitLog> targetHitLogs = evalGroupIndicatorTargetHitLogService.list(Wrappers.<EvalGroupIndicatorTargetHitLog>lambdaQuery()
319 439 .eq(EvalGroupIndicatorTargetHitLog::getReferId, referId)
320 440 .eq(EvalGroupIndicatorTargetHitLog::getTargetType, IndicatorTypeEnum.EXAMINE)
321 441 .eq(EvalGroupIndicatorTargetHitLog::getDataDate, dataDate)
322 442 .in(EvalGroupIndicatorTargetHitLog::getPoolId, poolIds)
323   - .eq(EvalGroupIndicatorTargetHitLog::getScopeType, EvalScopeEnum.STAFF)
  443 + .eq(EvalGroupIndicatorTargetHitLog::getScopeType, scopeType)
324 444 .eq(EvalGroupIndicatorTargetHitLog::getYn, Boolean.TRUE)
325 445 );
326 446 return targetHitLogs.stream()
327 447 .collect(Collectors.toMap(EvalGroupIndicatorTargetHitLog::getPoolId, Function.identity(), (v1, v2) -> v1));
328 448 }
329 449  
  450 + public EvalGroupIndicatorTargetHitLog queryTargetValue(Long referId, Long poolId, LocalDate dataDate, EvalScopeEnum scopeType) {
  451 + EvalGroupIndicatorTargetHitLog targetHitLog = evalGroupIndicatorTargetHitLogService.getOne(Wrappers.<EvalGroupIndicatorTargetHitLog>lambdaQuery()
  452 + .eq(EvalGroupIndicatorTargetHitLog::getReferId, referId)
  453 + .eq(EvalGroupIndicatorTargetHitLog::getTargetType, IndicatorTypeEnum.EXAMINE)
  454 + .eq(EvalGroupIndicatorTargetHitLog::getDataDate, dataDate)
  455 + .eq(EvalGroupIndicatorTargetHitLog::getPoolId, poolId)
  456 + .eq(EvalGroupIndicatorTargetHitLog::getScopeType, scopeType)
  457 + .eq(EvalGroupIndicatorTargetHitLog::getYn, Boolean.TRUE)
  458 + , Boolean.FALSE
  459 + );
  460 + return targetHitLog;
  461 + }
  462 +
330 463 public void cleanTodayData(LocalDate date) {
331 464 evalUserRankReportService.remove(Wrappers.<EvalUserRankReport>lambdaUpdate()
332 465 .eq(EvalUserRankReport::getDataDate, date)
... ... @@ -354,6 +487,9 @@ public class EvalUserReportTask {
354 487 }
355 488 List<Long> rankReportIds = rankReports.stream().map(EvalUserRankReport::getId).collect(Collectors.toList());
356 489 evalUserRankReportService.removeByIds(rankReportIds);
  490 + evalUserRankStageReportService.remove(Wrappers.<EvalUserRankStageReport>lambdaUpdate()
  491 + .in(EvalUserRankStageReport::getEvalUserRankReportId, rankReportIds)
  492 + );
357 493 evalUserRankCodeReportService.remove(Wrappers.<EvalUserRankCodeReport>lambdaUpdate()
358 494 .in(EvalUserRankCodeReport::getEvalUserRankReportId, rankReportIds)
359 495 );
... ... @@ -371,7 +507,8 @@ public class EvalUserReportTask {
371 507 );
372 508 }
373 509  
374   - public List<EvalUserRankCodeReport> saveRankCodeReports(List<EvalGroupIndicator> evalGroupIndicators, Long reportRankId, LocalDate date) {
  510 + public List<EvalUserRankCodeReport> saveRankCodeReports(List<EvalGroupIndicator> evalGroupIndicators, Long reportRankId,
  511 + Long evalUserRankStageReportId, LocalDate date) {
375 512 Set<String> codes = new HashSet<>();
376 513 List<EvalUserRankCodeReport> rankCodes = new ArrayList<>();
377 514 AtomicInteger order = new AtomicInteger();
... ... @@ -380,7 +517,7 @@ public class EvalUserReportTask {
380 517 if (! codes.add(groupIndicator.getCode())) {
381 518 continue;
382 519 }
383   - rankCodes.add(this.convertRankCodeDB(groupIndicator, date, reportRankId, order));
  520 + rankCodes.add(this.convertRankCodeDB(groupIndicator, date, reportRankId, evalUserRankStageReportId, order));
384 521  
385 522 //组合指标
386 523 if (PublicUtil.isNotEmpty(groupIndicator.getCodeType()) &&
... ... @@ -391,7 +528,7 @@ public class EvalUserReportTask {
391 528 .eq(EvalGroupIndicatorParam::getYn, Boolean.TRUE)
392 529 );
393 530 for (EvalGroupIndicatorParam indicatorParam : params) {
394   - rankCodes.add(this.convertParamToRankCodeDB(indicatorParam, date, reportRankId, order, groupIndicator));
  531 + rankCodes.add(this.convertParamToRankCodeDB(indicatorParam, date, reportRankId, evalUserRankStageReportId, order, groupIndicator));
395 532 }
396 533 }
397 534  
... ... @@ -413,20 +550,121 @@ public class EvalUserReportTask {
413 550 return evalGroupRanks.stream().collect(Collectors.groupingBy(EvalGroupRank::getGroupId));
414 551 }
415 552  
416   - public EvalUserRankReport saveRankReport(EvalGroupRank rank, List<Long> evalGroupIds, List<EvalGroup> evalGroups, LocalDate date, Long groupId) {
  553 + public EvalUserRankReport saveRankReport(EvalGroupRank rank, List<EvalGroup> evalGroups, LocalDate date, Long groupId) {
417 554 List<Long> shopIds = evalGroups.stream().map(EvalGroup::getShopIds).distinct().collect(ArrayList::new, List::addAll, List::addAll);
418 555 EvalUserRankReport reportRank = new EvalUserRankReport();
419 556 reportRank.setRankId(rank.getId());
420 557 reportRank.setRankName(rank.getName());
421   - reportRank.setEvalGroupIds(evalGroupIds);
422   - reportRank.setShopIds(shopIds);
  558 + reportRank.setMultiStage(rank.getMultiStage());
423 559 reportRank.setDataDate(date);
424 560 reportRank.setMonthly(YearMonth.from(date));
  561 + reportRank.setShopIds(shopIds);
425 562 reportRank.setGroupId(groupId);
426 563 evalUserRankReportService.save(reportRank);
427 564 return reportRank;
428 565 }
429 566  
  567 + public EvalUserRankStageReport saveRankStageReport(EvalUserRankReport rankReport, EvalGroupRank rank,
  568 + EvalGroupRankStage rankStage, List<EvalGroup> evalGroups) {
  569 + List<Long> shopIds = evalGroups.stream().map(EvalGroup::getShopIds).distinct().collect(ArrayList::new, List::addAll, List::addAll);
  570 + List<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList());
  571 + EvalUserRankStageReport reportRankStage = new EvalUserRankStageReport();
  572 + reportRankStage.setEvalUserRankReportId(rankReport.getId());
  573 + reportRankStage.setEvalGroupRankId(rank.getId());
  574 + reportRankStage.setEvalGroupRankStageId(rankStage.getId());
  575 + if (PublicUtil.isNotEmpty(rankStage.getName())) {
  576 + reportRankStage.setStageName(rankStage.getName());
  577 + }
  578 + reportRankStage.setEvalGroupIds(evalGroupIds);
  579 + reportRankStage.setBeginTime(rankStage.getBeginTime().atTime(0,0,1));
  580 + reportRankStage.setOverTime(rankStage.getOverTime().atTime(23,23,59));
  581 + evalUserRankStageReportService.save(reportRankStage);
  582 + return reportRankStage;
  583 + }
  584 +
  585 + public EvalUserReport createManager(EvalUserRankStageReport rankStageReport, LocalDate date) {
  586 + EvalUserReport evalUserReport = new EvalUserReport();
  587 + evalUserReport.setEvalUserRankReportId(rankStageReport.getEvalUserRankReportId());
  588 + evalUserReport.setEvalUserRankStageReportId(rankStageReport.getId());
  589 + evalUserReport.setDimension(ReportDimensionEnum.MANAGER);
  590 + evalUserReport.setDataDate(date);
  591 + return evalUserReport;
  592 + }
  593 +
  594 + public Long saveManagerDimDB(EvalUserReport evalUserReport, ManagerDTO manager, List<EvalUserPool> pools, Map<Long, StaffBaseInfoDTO> managerMap, List<Long> manageStaffIds) {
  595 + evalUserReport.setUserId(manager.getStaffId());
  596 + evalUserReport.setUserName(manager.getStaffName());
  597 + if (managerMap.containsKey(manager.getStaffId())) {
  598 + StaffBaseInfoDTO staffInfo = managerMap.get(manager.getStaffId());
  599 + evalUserReport.setShopId(staffInfo.getShopId());
  600 + evalUserReport.setShopName(staffInfo.getShopName());
  601 + evalUserReport.setPostId(staffInfo.getPostId());
  602 + evalUserReport.setPostName(staffInfo.getPostName());
  603 + }
  604 +
  605 + List<String> roleCodes = manager.getScopeList().stream()
  606 + .flatMap(managerStaffVo -> managerStaffVo.getRoleList().stream())
  607 + .map(ManagerStaffRoleDTO::getRoleCode)
  608 + .distinct()
  609 + .collect(Collectors.toList());
  610 + List<String> roleNames = manager.getScopeList().stream()
  611 + .flatMap(managerStaffVo -> managerStaffVo.getRoleList().stream())
  612 + .map(ManagerStaffRoleDTO::getRoleName)
  613 + .distinct()
  614 + .collect(Collectors.toList());
  615 + List<Long> shopIds = manager.getScopeList().stream()
  616 + .flatMap(managerStaffVo -> managerStaffVo.getShopList().stream())
  617 + .map(ManagerStaffShopDTO::getShopId)
  618 + .distinct()
  619 + .collect(Collectors.toList());
  620 +
  621 + Double averageScoreDouble = pools.stream()
  622 + .filter(pool -> manageStaffIds.contains(pool.getUserId()))
  623 + .mapToDouble(userValue -> Optional.ofNullable(userValue.getScore()).orElse(BigDecimal.ZERO).doubleValue())
  624 + .average()
  625 + .orElse(0);
  626 + BigDecimal score = new BigDecimal(averageScoreDouble.toString()).divide(BigDecimal.ONE, 4, RoundingMode.HALF_UP);
  627 +
  628 + Double averageScoreRatioDouble = pools.stream()
  629 + .filter(pool -> manageStaffIds.contains(pool.getUserId()))
  630 + .mapToDouble(userValue -> Optional.ofNullable(userValue.getScoreRatio()).orElse(BigDecimal.ZERO).doubleValue())
  631 + .average()
  632 + .orElse(0);
  633 + BigDecimal scoreRatio = new BigDecimal(averageScoreRatioDouble.toString()).divide(BigDecimal.ONE, 4, RoundingMode.HALF_UP);
  634 +
  635 + Double averageRewardDouble = pools.stream()
  636 + .filter(pool -> manageStaffIds.contains(pool.getUserId()))
  637 + .mapToDouble(userValue -> Optional.ofNullable(userValue.getScore()).orElse(BigDecimal.ZERO).doubleValue())
  638 + .average()
  639 + .orElse(0);
  640 + BigDecimal reward = new BigDecimal(averageRewardDouble.toString()).divide(BigDecimal.ONE, 4, RoundingMode.HALF_UP);
  641 +
  642 + evalUserReport.setScore(score);
  643 + evalUserReport.setScoreRatio(scoreRatio.multiply(Constant.ONE_HUNDRED));
  644 + evalUserReport.setReward(reward);
  645 +
  646 + evalUserReportService.save(evalUserReport);
  647 + EvalUserExtraReport evalUserExtraReport = EvalUserExtraReport.builder()
  648 + .evalUserReportId(evalUserReport.getId())
  649 + .roleCodes(roleCodes)
  650 + .roleNames(roleNames)
  651 + .shopIds(shopIds)
  652 + .staffIds(manageStaffIds)
  653 + .build();
  654 + evalUserExtraReportService.save(evalUserExtraReport);
  655 + return evalUserReport.getId();
  656 + }
  657 +
  658 + public EvalUserValueReport convertManagerValue(Long managerEvalUserReportId, EvalUserRankCodeReport codeReport, BigDecimal value, LocalDate date) {
  659 + EvalUserValueReport userValue = new EvalUserValueReport();
  660 + userValue.setEvalUserReportId(managerEvalUserReportId);
  661 + userValue.setCode(codeReport.getCode());
  662 + userValue.setCodeType(codeReport.getCodeType());
  663 + userValue.setValue(Optional.ofNullable(value).orElse(BigDecimal.ZERO));
  664 + userValue.setDataDate(date);
  665 + return userValue;
  666 + }
  667 +
430 668 public EvalUserValueReport convertDB(Long evalUserReportId, EvalGroupIndicator groupIndicator, BigDecimal value,
431 669 LocalDate date, List<EvalGroupIndicatorParam> params) {
432 670 EvalUserValueReport userValue = new EvalUserValueReport();
... ... @@ -459,9 +697,11 @@ public class EvalUserReportTask {
459 697 return userValue;
460 698 }
461 699  
462   - public EvalUserRankCodeReport convertRankCodeDB(EvalGroupIndicator groupIndicator, LocalDate date, Long reportRankId, AtomicInteger order) {
  700 + public EvalUserRankCodeReport convertRankCodeDB(EvalGroupIndicator groupIndicator, LocalDate date, Long reportRankId,
  701 + Long evalUserRankStageReportId, AtomicInteger order) {
463 702 EvalUserRankCodeReport rankCode = new EvalUserRankCodeReport();
464 703 rankCode.setEvalUserRankReportId(reportRankId);
  704 + rankCode.setEvalUserRankStageReportId(evalUserRankStageReportId);
465 705 rankCode.setEvalGroupIndicatorId(groupIndicator.getId());
466 706 rankCode.setCode(groupIndicator.getCode());
467 707 rankCode.setCodeType(groupIndicator.getCodeType());
... ... @@ -477,10 +717,18 @@ public class EvalUserReportTask {
477 717 return rankCode;
478 718 }
479 719  
  720 + public Map<Long, StaffBaseInfoDTO> staffInfoMap(List<ManagerDTO> managerDTOS) {
  721 + List<Long> staffIds = managerDTOS.stream().map(ManagerDTO::getStaffId).collect(Collectors.toList());
  722 + List<StaffBaseInfoDTO> staffInfos = ehrRpcService.queryStaffBaseInfo(staffIds);
  723 + return staffInfos.stream().collect(Collectors.toMap(StaffBaseInfoDTO::getId, Function.identity(), (v1, v2) -> v1));
  724 + }
  725 +
480 726 public EvalUserRankCodeReport convertParamToRankCodeDB(EvalGroupIndicatorParam indicatorParam, LocalDate date, Long reportRankId,
  727 + Long evalUserRankStageReportId,
481 728 AtomicInteger order, EvalGroupIndicator groupIndicator) {
482 729 EvalUserRankCodeReport rankCode = new EvalUserRankCodeReport();
483 730 rankCode.setEvalUserRankReportId(reportRankId);
  731 + rankCode.setEvalUserRankStageReportId(evalUserRankStageReportId);
484 732 rankCode.setEvalGroupIndicatorId(indicatorParam.getEvalGroupIndicatorId());
485 733 rankCode.setCode(indicatorParam.getCode());
486 734 rankCode.setCodeType(indicatorParam.getCodeType());
... ... @@ -494,5 +742,4 @@ public class EvalUserReportTask {
494 742 return rankCode;
495 743 }
496 744  
497   -
498 745 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRankStageService.java
... ... @@ -17,5 +17,11 @@ import java.util.List;
17 17 */
18 18 public interface EvalGroupRankStageService extends IService<EvalGroupRankStage> {
19 19  
20   - List<EvalGroupRankStage> getEffects(LocalDate dataDate);
  20 + /**
  21 + * 获取排名组开始的阶段
  22 + * @param rankId
  23 + * @return
  24 + */
  25 + List<EvalGroupRankStage> getRankStartStages(Long rankId, LocalDate date);
  26 +
21 27 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserExtraReportService.java 0 → 100644
  1 +package cn.fw.morax.service.data.eval;
  2 +
  3 +
  4 +import cn.fw.morax.domain.db.eval.EvalUserExtraReport;
  5 +import cn.fw.morax.domain.db.eval.EvalUserReport;
  6 +import com.baomidou.mybatisplus.extension.service.IService;
  7 +
  8 +/**
  9 + * <p>
  10 + * 报表编码数据 服务类
  11 + * </p>
  12 + *
  13 + * @author jiangchao
  14 + * @since 2023-03-31
  15 + */
  16 +public interface EvalUserExtraReportService extends IService<EvalUserExtraReport> {
  17 +
  18 +}
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserRankStageReportService.java 0 → 100644
  1 +package cn.fw.morax.service.data.eval;
  2 +
  3 +
  4 +import cn.fw.morax.domain.db.eval.EvalUserRankStageReport;
  5 +import com.baomidou.mybatisplus.extension.service.IService;
  6 +
  7 +/**
  8 + * <p>
  9 + * 报表绩效排名组 服务类
  10 + * </p>
  11 + *
  12 + * @author jiangchao
  13 + * @since 2023-03-31
  14 + */
  15 +public interface EvalUserRankStageReportService extends IService<EvalUserRankStageReport> {
  16 +
  17 +}
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupIndicatorHitLogServiceImpl.java
1 1 package cn.fw.morax.service.data.eval.impl;
2 2  
3 3  
  4 +import cn.fw.morax.common.utils.PublicUtil;
4 5 import cn.fw.morax.dao.eval.EvalGroupIndicatorHitLogDao;
5 6 import cn.fw.morax.domain.db.eval.EvalGroupIndicatorHitLog;
6 7 import cn.fw.morax.domain.enums.EvalScopeEnum;
... ... @@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
10 11 import org.springframework.stereotype.Service;
11 12  
12 13 import java.time.LocalDate;
  14 +import java.util.ArrayList;
13 15 import java.util.List;
14 16 import java.util.Objects;
15 17 import java.util.Optional;
... ... @@ -58,6 +60,9 @@ public class EvalGroupIndicatorHitLogServiceImpl extends ServiceImpl&lt;EvalGroupIn
58 60  
59 61 @Override
60 62 public List<EvalGroupIndicatorHitLog> getHitLogs(List<Long> evalGroupIndicatorIds, List<Long> poolIds, EvalScopeEnum scopeType, LocalDate dataDate) {
  63 + if (PublicUtil.isEmpty(evalGroupIndicatorIds) || PublicUtil.isEmpty(poolIds)) {
  64 + return new ArrayList<>();
  65 + }
61 66 List<EvalGroupIndicatorHitLog> indicatorHitLogs = this.list(Wrappers.<EvalGroupIndicatorHitLog>lambdaQuery()
62 67 .in(EvalGroupIndicatorHitLog::getEvalGroupIndicatorId, evalGroupIndicatorIds)
63 68 .eq(EvalGroupIndicatorHitLog::getDataDate, dataDate)
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRankStageServiceImpl.java
... ... @@ -4,6 +4,7 @@ package cn.fw.morax.service.data.eval.impl;
4 4 import cn.fw.morax.dao.eval.EvalGroupRankStageDao;
5 5 import cn.fw.morax.domain.db.eval.EvalGroupRankStage;
6 6 import cn.fw.morax.service.data.eval.EvalGroupRankStageService;
  7 +import com.baomidou.mybatisplus.core.toolkit.Wrappers;
7 8 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
8 9 import org.springframework.stereotype.Service;
9 10  
... ... @@ -22,7 +23,13 @@ import java.util.List;
22 23 public class EvalGroupRankStageServiceImpl extends ServiceImpl<EvalGroupRankStageDao, EvalGroupRankStage> implements EvalGroupRankStageService {
23 24  
24 25 @Override
25   - public List<EvalGroupRankStage> getEffects(LocalDate dataDate) {
26   - return this.baseMapper.getEffects(dataDate);
  26 + public List<EvalGroupRankStage> getRankStartStages(Long rankId, LocalDate date) {
  27 + List<EvalGroupRankStage> stages = this.baseMapper.selectList(Wrappers.<EvalGroupRankStage>lambdaQuery()
  28 + .eq(EvalGroupRankStage::getEvalGroupRankId, rankId)
  29 + .eq(EvalGroupRankStage::getYn, Boolean.TRUE)
  30 + .le(EvalGroupRankStage::getBeginTime, date)
  31 + .orderByAsc(EvalGroupRankStage::getBeginTime)
  32 + );
  33 + return stages;
27 34 }
28 35 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserExtraReportServiceImpl.java 0 → 100644
  1 +package cn.fw.morax.service.data.eval.impl;
  2 +
  3 +
  4 +import cn.fw.morax.dao.eval.EvalUserExtraReportDao;
  5 +import cn.fw.morax.dao.eval.EvalUserReportDao;
  6 +import cn.fw.morax.domain.db.eval.EvalUserExtraReport;
  7 +import cn.fw.morax.domain.db.eval.EvalUserReport;
  8 +import cn.fw.morax.service.data.eval.EvalUserExtraReportService;
  9 +import cn.fw.morax.service.data.eval.EvalUserReportService;
  10 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  11 +import org.springframework.stereotype.Service;
  12 +
  13 +/**
  14 + * <p>
  15 + * 报表编码数据 服务实现类
  16 + * </p>
  17 + *
  18 + * @author jiangchao
  19 + * @since 2023-03-31
  20 + */
  21 +@Service
  22 +public class EvalUserExtraReportServiceImpl extends ServiceImpl<EvalUserExtraReportDao, EvalUserExtraReport> implements EvalUserExtraReportService {
  23 +
  24 +}
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserRankStageServiceImplReport.java 0 → 100644
  1 +package cn.fw.morax.service.data.eval.impl;
  2 +
  3 +
  4 +import cn.fw.morax.dao.eval.EvalUserRankStageReportDao;
  5 +import cn.fw.morax.domain.db.eval.EvalUserRankStageReport;
  6 +import cn.fw.morax.service.data.eval.EvalUserRankStageReportService;
  7 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8 +import org.springframework.stereotype.Service;
  9 +
  10 +/**
  11 + * <p>
  12 + * 报表绩效排名组 服务实现类
  13 + * </p>
  14 + *
  15 + * @author jiangchao
  16 + * @since 2023-03-31
  17 + */
  18 +@Service
  19 +public class EvalUserRankStageServiceImplReport extends ServiceImpl<EvalUserRankStageReportDao, EvalUserRankStageReport>
  20 + implements EvalUserRankStageReportService {
  21 +
  22 +}
... ...