Blame view

fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java 26.1 KB
911bd821   姜超   feature(*): 报表相关实体类
1
2
3
  package cn.fw.morax.server.task;
  
  import cn.fw.common.cache.locker.DistributedLocker;
6329e44a   姜超   feature(*): 考评人员数...
4
  import cn.fw.morax.common.constant.Constant;
911bd821   姜超   feature(*): 报表相关实体类
5
6
7
  import cn.fw.morax.common.constant.TimeTaskConstant;
  import cn.fw.morax.common.utils.PublicUtil;
  import cn.fw.morax.domain.db.eval.*;
b5cb9dec   姜超   feature(*): 考评人员报...
8
  import cn.fw.morax.domain.db.kpi.IndicatorUserValue;
b5cb9dec   姜超   feature(*): 考评人员报...
9
  import cn.fw.morax.domain.enums.*;
b5cb9dec   姜超   feature(*): 考评人员报...
10
  import cn.fw.morax.service.biz.CommonService;
911bd821   姜超   feature(*): 报表相关实体类
11
  import cn.fw.morax.service.data.eval.*;
b5cb9dec   姜超   feature(*): 考评人员报...
12
  import cn.fw.morax.service.data.kpi.IndicatorUserValueService;
911bd821   姜超   feature(*): 报表相关实体类
13
  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
b5cb9dec   姜超   feature(*): 考评人员报...
14
  import com.google.common.collect.Maps;
911bd821   姜超   feature(*): 报表相关实体类
15
16
17
18
19
20
21
22
  import lombok.Getter;
  import lombok.RequiredArgsConstructor;
  import lombok.extern.slf4j.Slf4j;
  import org.redisson.api.RLock;
  import org.springframework.beans.factory.annotation.Value;
  import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  import org.springframework.scheduling.annotation.Scheduled;
  import org.springframework.stereotype.Component;
b5cb9dec   姜超   feature(*): 考评人员报...
23
24
25
  import org.springframework.transaction.PlatformTransactionManager;
  import org.springframework.transaction.TransactionDefinition;
  import org.springframework.transaction.TransactionStatus;
911bd821   姜超   feature(*): 报表相关实体类
26
  import org.springframework.transaction.annotation.Transactional;
911bd821   姜超   feature(*): 报表相关实体类
27
28
  
  import java.math.BigDecimal;
911bd821   姜超   feature(*): 报表相关实体类
29
30
  import java.time.LocalDate;
  import java.time.YearMonth;
6b3d17b7   姜超   feature(*): 考评人员报...
31
  import java.time.temporal.TemporalAdjusters;
911bd821   姜超   feature(*): 报表相关实体类
32
  import java.util.*;
74f1e91d   姜超   feature(*): 考评人员报表修改
33
  import java.util.concurrent.atomic.AtomicInteger;
911bd821   姜超   feature(*): 报表相关实体类
34
  import java.util.concurrent.locks.Lock;
b5cb9dec   姜超   feature(*): 考评人员报...
35
  import java.util.function.Function;
911bd821   姜超   feature(*): 报表相关实体类
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  import java.util.stream.Collectors;
  
  /**
   * @author : jiangchao
   * @className : KpiReportRatioTask
   * @description : 绩效报表定时器
   * @date : 2022-04-07 15:29
   */
  @Component
  @Slf4j
  @RequiredArgsConstructor
  @ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
  public class EvalUserReportTask {
  
74f1e91d   姜超   feature(*): 考评人员报表修改
50
51
52
53
54
      private final EvalGroupIndicatorTargetHitLogService evalGroupIndicatorTargetHitLogService;
      private final EvalGroupIndicatorHitLogService evalGroupIndicatorHitLogService;
      private final EvalGroupIndicatorParamService evalGroupIndicatorParamService;
      private final EvalUserRankCodeReportService evalUserRankCodeReportService;
      private final EvalUserValueReportService evalUserValueReportService;
911bd821   姜超   feature(*): 报表相关实体类
55
      private final EvalGroupIndicatorService evalGroupIndicatorService;
b5cb9dec   姜超   feature(*): 考评人员报...
56
57
      private final IndicatorUserValueService indicatorUserValueService;
      private final EvalIndicatorValueService evalIndicatorValueService;
74f1e91d   姜超   feature(*): 考评人员报表修改
58
59
60
61
      private final PlatformTransactionManager platformTransactionManager;
      private final EvalUserRankReportService evalUserRankReportService;
      private final EvalUserReportService evalUserReportService;
      private final TransactionDefinition transactionDefinition;
911bd821   姜超   feature(*): 报表相关实体类
62
63
64
65
      private final EvalUserPoolService evalUserPoolService;
      private final EvalGroupRankService evalGroupRankService;
      private final EvalGroupService evalGroupService;
      private final DistributedLocker distributedLocker;
74f1e91d   姜超   feature(*): 考评人员报表修改
66
      private final CommonService commonService;
911bd821   姜超   feature(*): 报表相关实体类
67
68
69
70
71
72
  
      @Value("${spring.cache.custom.global-prefix}:eval:user:report")
      @Getter
      private String evalUserReportDistKey;
  
      /**
4834ef00   姜超   feature(*): 门店考评
73
       * 考评报表定时任务
911bd821   姜超   feature(*): 报表相关实体类
74
75
76
77
78
       *
       */
      @Scheduled(cron = TimeTaskConstant.EVAL_REPORT)
      @Transactional(rollbackFor = Exception.class)
      public void evalUserReportTask() {
0992692a   姜超   feature(*): 考评不抽取日志
79
  //        this.evalUserReport(LocalDate.now().minusDays(1));
911bd821   姜超   feature(*): 报表相关实体类
80
81
82
83
      }
  
      /**
       * 绩效报表定时任务
b5cb9dec   姜超   feature(*): 考评人员报...
84
85
86
87
       * 1. 遍历考评排名组
       * 2. 创建考评排名组报表
       * 3. 创建考评排名组编码
       * 4. 统计数据
911bd821   姜超   feature(*): 报表相关实体类
88
89
90
       *
       * @param date
       */
911bd821   姜超   feature(*): 报表相关实体类
91
92
93
94
95
      public void evalUserReport(LocalDate date) {
          Lock lock = distributedLocker.lock(getEvalUserReportDistKey());
          if (! ((RLock) lock).isLocked()) {
              return;
          }
b5cb9dec   姜超   feature(*): 考评人员报...
96
          TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
911bd821   姜超   feature(*): 报表相关实体类
97
98
          try {
              log.info("定时任务【考评人员报表数据抽取】开始执行");
e376b24c   姜超   feature(*): 修改个人考评
99
100
              Map<Long, List<EvalGroupRank>> groupEvalGroupMap = queryEffectRank(date);
              for (Map.Entry<Long, List<EvalGroupRank>> entry : groupEvalGroupMap.entrySet()) {
74f1e91d   姜超   feature(*): 考评人员报表修改
101
                  for (EvalGroupRank rank : entry.getValue()) {
392d707a   姜超   feature(*): 门店考评
102
                      //清除当月数据(当月只有一条数据)
6b3d17b7   姜超   feature(*): 考评人员报...
103
                      cleanRankCurMonthData(rank.getId(), date);
0c5cfae9   姜超   feature(*): 考评人员报...
104
                      //抽取排名组数据
74f1e91d   姜超   feature(*): 考评人员报表修改
105
                      createRankReport(rank, entry.getKey(), date);
b5cb9dec   姜超   feature(*): 考评人员报...
106
                  }
74f1e91d   姜超   feature(*): 考评人员报表修改
107
              }
b5cb9dec   姜超   feature(*): 考评人员报...
108
109
110
              platformTransactionManager.commit(transactionStatus);
          } catch (Exception e){
              platformTransactionManager.rollback(transactionStatus);
74f1e91d   姜超   feature(*): 考评人员报表修改
111
              log.error("考评人员报表数据抽取失败, " + e.getMessage(), e);
b5cb9dec   姜超   feature(*): 考评人员报...
112
113
114
115
          } finally {
              lock.unlock();
          }
      }
911bd821   姜超   feature(*): 报表相关实体类
116
  
b5cb9dec   姜超   feature(*): 考评人员报...
117
      /**
0c5cfae9   姜超   feature(*): 考评人员报...
118
       * 计算排名组报表数据
b5cb9dec   姜超   feature(*): 考评人员报...
119
120
121
122
       * @param rank
       * @param groupId
       * @param date
       */
0c5cfae9   姜超   feature(*): 考评人员报...
123
      public void createRankReport(EvalGroupRank rank, Long groupId, LocalDate date) {
8945afe5   姜超   feature(*): 考评保存修改
124
          List<EvalGroup> evalGroups = evalGroupService.getEffectsByRankId(rank.getId(), date);
b5cb9dec   姜超   feature(*): 考评人员报...
125
126
127
128
129
130
131
132
133
134
135
136
          List<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList());
          if (PublicUtil.isEmpty(evalGroupIds)) {
              return;
          }
          List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
                  .in(EvalUserPool::getEvalGroupId, evalGroupIds)
                  .eq(EvalUserPool::getMonthly, YearMonth.from(date))
                  .eq(EvalUserPool::getYn, Boolean.TRUE)
          );
          if (PublicUtil.isEmpty(pools)) {
              return;
          }
b5cb9dec   姜超   feature(*): 考评人员报...
137
138
139
140
141
          List<EvalGroupIndicator> evalGroupIndicators = evalGroupIndicatorService.list(Wrappers.<EvalGroupIndicator>lambdaQuery()
                  .in(EvalGroupIndicator::getEvalGroupId, evalGroupIds)
                  .eq(EvalGroupIndicator::getYn, Boolean.TRUE)
                  .orderByAsc(EvalGroupIndicator::getId)
          );
911bd821   姜超   feature(*): 报表相关实体类
142
  
74f1e91d   姜超   feature(*): 考评人员报表修改
143
144
          //排名组
          EvalUserRankReport reportRank = this.saveRankReport(rank, evalGroupIds, evalGroups, date, groupId);
6b3d17b7   姜超   feature(*): 考评人员报...
145
          final Long evalUserRankReportId = reportRank.getId();
74f1e91d   姜超   feature(*): 考评人员报表修改
146
          //排名组指标编码、人员、门店
392d707a   姜超   feature(*): 门店考评
147
          List<EvalUserRankCodeReport> rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, date);
6b3d17b7   姜超   feature(*): 考评人员报...
148
149
          List<EvalUserReport> evalUserReports = this.saveStaffReports(pools, date, evalUserRankReportId);
          List<EvalUserReport> evalShopReports = this.saveShopReports(pools, date, evalUserRankReportId);
b5cb9dec   姜超   feature(*): 考评人员报...
150
          //人员维度
74f1e91d   姜超   feature(*): 考评人员报表修改
151
          List<EvalUserValueReport> reportUserValues = calcUser(pools, evalGroupIndicators, evalUserReports, date);
b5cb9dec   姜超   feature(*): 考评人员报...
152
          //门店维度
74f1e91d   姜超   feature(*): 考评人员报表修改
153
154
          calcShop(evalShopReports, rankCodes, reportUserValues, evalUserReports, date);
  
b5cb9dec   姜超   feature(*): 考评人员报...
155
      }
74f1e91d   姜超   feature(*): 考评人员报表修改
156
157
158
159
160
      public List<EvalUserValueReport> calcUser(List<EvalUserPool> pools,
                                                List<EvalGroupIndicator> evalGroupIndicators,
                                                List<EvalUserReport> evalUserReports,
                                                LocalDate date) {
          List<EvalUserValueReport> reportUserValues = new ArrayList<>();
b5cb9dec   姜超   feature(*): 考评人员报...
161
162
163
          List<Long> userIds = pools.stream().map(EvalUserPool::getUserId).distinct().collect(Collectors.toList());
          List<Long> poolIds = pools.stream().map(EvalUserPool::getId).collect(Collectors.toList());
          List<Long> evalGroupIndicatorIds = evalGroupIndicators.stream().map(EvalGroupIndicator::getId).collect(Collectors.toList());
b5cb9dec   姜超   feature(*): 考评人员报...
164
          List<EvalGroupIndicatorHitLog> hitLogs = evalGroupIndicatorHitLogService.getHitLogs(evalGroupIndicatorIds, poolIds, EvalScopeEnum.STAFF, date);
b5cb9dec   姜超   feature(*): 考评人员报...
165
          Map<Long, List<EvalGroupIndicatorHitLog>> indicatorHitLogMap = hitLogs.stream().collect(Collectors.groupingBy(EvalGroupIndicatorHitLog::getEvalGroupIndicatorId));
6a629d48   姜超   feature(*): 门店考评
166
          Map<Long, Long> userPoolReportIdMap = evalUserReports.stream().collect(Collectors.toMap(EvalUserReport::getEvalUserPoolId, EvalUserReport::getId, (v1, v2) -> v1));
74f1e91d   姜超   feature(*): 考评人员报表修改
167
  
b5cb9dec   姜超   feature(*): 考评人员报...
168
169
170
          for (EvalGroupIndicator groupIndicator : evalGroupIndicators) {
              final ScoreWayEnum scoreWay = groupIndicator.getScoreWay();
              final IndicatorCodeTypeEnum codeType = groupIndicator.getCodeType();
b5cb9dec   姜超   feature(*): 考评人员报...
171
              final Long evalGroupIndicatorId = groupIndicator.getId();
6329e44a   姜超   feature(*): 考评人员数...
172
173
174
175
              List<EvalGroupIndicatorParam> params = evalGroupIndicatorParamService.list(Wrappers.<EvalGroupIndicatorParam>lambdaQuery()
                      .eq(EvalGroupIndicatorParam::getEvalGroupIndicatorId, evalGroupIndicatorId)
                      .eq(EvalGroupIndicatorParam::getYn, Boolean.TRUE)
              );
b5cb9dec   姜超   feature(*): 考评人员报...
176
177
178
179
180
  
              List<EvalGroupIndicatorHitLog> userHitLogs = indicatorHitLogMap.getOrDefault(evalGroupIndicatorId, new ArrayList<>());
              Map<Long, EvalGroupIndicatorHitLog> poolHitLogMap = userHitLogs.stream()
                      .collect(Collectors.toMap(EvalGroupIndicatorHitLog::getPoolId, Function.identity(), (v1, v2) -> v1));
              for (EvalUserPool userPool : pools) {
b12ce044   姜超   feature(*): 封装代码
181
182
183
                  if (! userPool.getEvalGroupId().equals(groupIndicator.getEvalGroupId())) {
                      continue;
                  }
b5cb9dec   姜超   feature(*): 考评人员报...
184
185
186
187
                  Optional<EvalGroupIndicatorHitLog> hitLog = Optional.ofNullable(poolHitLogMap.get(userPool.getId()));
                  BigDecimal value = (ScoreWayEnum.LADDER.equals(scoreWay)) ?
                          hitLog.map(EvalGroupIndicatorHitLog::getHitLadderValue).orElse(BigDecimal.ZERO) :
                          hitLog.map(EvalGroupIndicatorHitLog::getHitCommissionValue).orElse(BigDecimal.ZERO);
74f1e91d   姜超   feature(*): 考评人员报表修改
188
                  Long evalUserReportId = userPoolReportIdMap.get(userPool.getId());
6329e44a   姜超   feature(*): 考评人员数...
189
                  reportUserValues.add(convertDB(evalUserReportId, groupIndicator, value, date, params));
b5cb9dec   姜超   feature(*): 考评人员报...
190
              }
911bd821   姜超   feature(*): 报表相关实体类
191
  
b5cb9dec   姜超   feature(*): 考评人员报...
192
193
              //是否有子指标
              if (IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(codeType)) {
b5cb9dec   姜超   feature(*): 考评人员报...
194
195
                  for (EvalGroupIndicatorParam param : params) {
                      if (TargetTypeEnum.NO.equals(param.getTargetType())) {
a3384f7e   姜超   feature(*): 考评数据抽取修改
196
                          Map<Long, BigDecimal> userValueMap = queryUserOriginValue(param, userIds, date);
b5cb9dec   姜超   feature(*): 考评人员报...
197
198
                          for (EvalUserPool userPool : pools) {
                              BigDecimal value = userValueMap.getOrDefault(userPool.getUserId(), BigDecimal.ZERO);
74f1e91d   姜超   feature(*): 考评人员报表修改
199
                              Long evalUserReportId = userPoolReportIdMap.get(userPool.getId());
392d707a   姜超   feature(*): 门店考评
200
                              reportUserValues.add(convertParamDB(evalUserReportId, param, value, date));
b5cb9dec   姜超   feature(*): 考评人员报...
201
202
203
204
205
206
                          }
                      } else {
                          Map<Long, EvalGroupIndicatorTargetHitLog> hitLogMap = queryUserTargetValue(param.getId(), poolIds, date);
                          for (EvalUserPool userPool : pools) {
                              EvalGroupIndicatorTargetHitLog hitLog = hitLogMap.get(userPool.getId());
                              BigDecimal value = Optional.ofNullable(hitLog)
0eb5ae3e   姜超   feature(*): 考评数据抽取修改
207
                                      .map(EvalGroupIndicatorTargetHitLog::getReachValue).orElse(BigDecimal.ZERO).multiply(Constant.ONE_HUNDRED);
74f1e91d   姜超   feature(*): 考评人员报表修改
208
                              Long evalUserReportId = userPoolReportIdMap.get(userPool.getId());
392d707a   姜超   feature(*): 门店考评
209
                              reportUserValues.add(convertParamDB(evalUserReportId, param, value, date));
b5cb9dec   姜超   feature(*): 考评人员报...
210
211
                          }
                      }
911bd821   姜超   feature(*): 报表相关实体类
212
                  }
b5cb9dec   姜超   feature(*): 考评人员报...
213
214
215
              }
          }
          if (PublicUtil.isNotEmpty(reportUserValues)) {
74f1e91d   姜超   feature(*): 考评人员报表修改
216
              evalUserValueReportService.saveBatch(reportUserValues);
b5cb9dec   姜超   feature(*): 考评人员报...
217
          }
74f1e91d   姜超   feature(*): 考评人员报表修改
218
          return reportUserValues;
b5cb9dec   姜超   feature(*): 考评人员报...
219
      }
911bd821   姜超   feature(*): 报表相关实体类
220
  
74f1e91d   姜超   feature(*): 考评人员报表修改
221
222
223
224
225
      public void calcShop(List<EvalUserReport> evalShopReports,
                           List<EvalUserRankCodeReport> rankCodes,
                           List<EvalUserValueReport> reportUserValues,
                           List<EvalUserReport> evalUserReports,
                           LocalDate date) {
9ee4f27d   姜超   feature(*): 考评人员报...
226
          List<EvalUserValueReport> reportShopValues = new ArrayList<>();
74f1e91d   姜超   feature(*): 考评人员报表修改
227
228
229
230
231
232
233
          for (EvalUserReport shopReport : evalShopReports) {
  
              Set<Long> shopReportIds = evalUserReports.stream()
                      .filter(user -> shopReport.getShopId().equals(user.getShopId()) && Boolean.TRUE.equals(user.getInclusion()))
                      .map(EvalUserReport::getId).collect(Collectors.toSet());
  
              final Long evalUserReportId = shopReport.getId();
9ee4f27d   姜超   feature(*): 考评人员报...
234
              for (EvalUserRankCodeReport rankCode : rankCodes) {
b5cb9dec   姜超   feature(*): 考评人员报...
235
236
                  final String code = rankCode.getCode();
                  final IndicatorCodeTypeEnum codeType = rankCode.getCodeType();
911bd821   姜超   feature(*): 报表相关实体类
237
  
b5cb9dec   姜超   feature(*): 考评人员报...
238
                  Double averageRatioDouble = reportUserValues.stream()
74f1e91d   姜超   feature(*): 考评人员报表修改
239
                          .filter(user -> shopReportIds.contains(user.getEvalUserReportId()) && code.equals(user.getCode()))
b5cb9dec   姜超   feature(*): 考评人员报...
240
241
242
                          .mapToDouble(userValue -> Optional.ofNullable(userValue.getValue()).orElse(BigDecimal.ZERO).doubleValue())
                          .average()
                          .orElse(0);
74f1e91d   姜超   feature(*): 考评人员报表修改
243
244
                  BigDecimal value = new BigDecimal(averageRatioDouble.toString());
                  EvalUserValueReport shopValue = new EvalUserValueReport(evalUserReportId, code, codeType, value, date);
b5cb9dec   姜超   feature(*): 考评人员报...
245
246
247
248
                  reportShopValues.add(shopValue);
              }
          }
          if (PublicUtil.isNotEmpty(reportShopValues)) {
74f1e91d   姜超   feature(*): 考评人员报表修改
249
              evalUserValueReportService.saveBatch(reportShopValues);
b5cb9dec   姜超   feature(*): 考评人员报...
250
251
252
          }
      }
  
6b3d17b7   姜超   feature(*): 考评人员报...
253
      public List<EvalUserReport> saveStaffReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId) {
74f1e91d   姜超   feature(*): 考评人员报表修改
254
255
256
          List<EvalUserReport> evalUserReports = new ArrayList<>();
          for (EvalUserPool userPool : pools) {
              EvalUserReport report = new EvalUserReport();
d50d5802   姜超   feature(*): 字段修改
257
              report.setEvalUserRankReportId(evalUserRankReportId);
74f1e91d   姜超   feature(*): 考评人员报表修改
258
259
260
261
262
263
264
              report.setDimension(ReportDimensionEnum.STAFF);
              report.setUserId(userPool.getUserId());
              report.setUserName(userPool.getUserName());
              report.setPostId(userPool.getPostId());
              report.setPostName(userPool.getPostName());
              report.setShopId(userPool.getShopId());
              report.setShopName(userPool.getShopName());
6a629d48   姜超   feature(*): 门店考评
265
              report.setEvalUserPoolId(userPool.getId());
74f1e91d   姜超   feature(*): 考评人员报表修改
266
              report.setDataDate(date);
f3cb2328   姜超   feature(*): 考评数据抽取修改
267
              report.setInclusion(userPool.getInclusion());
74f1e91d   姜超   feature(*): 考评人员报表修改
268
269
270
271
272
273
              evalUserReports.add(report);
          }
          evalUserReportService.saveBatch(evalUserReports);
          return evalUserReports;
      }
  
6b3d17b7   姜超   feature(*): 考评人员报...
274
      public List<EvalUserReport> saveShopReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId) {
74f1e91d   姜超   feature(*): 考评人员报表修改
275
276
277
278
279
          List<EvalUserReport> evalShopReports = new ArrayList<>();
          Map<Long, String> shopMap = pools.stream().collect(Collectors.toMap(EvalUserPool::getShopId, EvalUserPool::getShopName, (v1, v2) -> v1));
          for (Long shopId : shopMap.keySet()) {
              EvalUserReport report = new EvalUserReport();
              report.setDimension(ReportDimensionEnum.SHOP);
d50d5802   姜超   feature(*): 字段修改
280
              report.setEvalUserRankReportId(evalUserRankReportId);
74f1e91d   姜超   feature(*): 考评人员报表修改
281
282
283
              report.setShopId(shopId);
              report.setShopName(shopMap.get(shopId));
              report.setDataDate(date);
74f1e91d   姜超   feature(*): 考评人员报表修改
284
              evalShopReports.add(report);
b5cb9dec   姜超   feature(*): 考评人员报...
285
          }
74f1e91d   姜超   feature(*): 考评人员报表修改
286
287
          evalUserReportService.saveBatch(evalShopReports);
          return evalShopReports;
b5cb9dec   姜超   feature(*): 考评人员报...
288
289
      }
  
a3384f7e   姜超   feature(*): 考评数据抽取修改
290
291
292
      public Map<Long, BigDecimal> queryUserOriginValue(EvalGroupIndicatorParam param, List<Long> userIds, LocalDate dataDate) {
          final String code = param.getCode();
          final IndicatorCodeTypeEnum codeType = param.getCodeType();
b5cb9dec   姜超   feature(*): 考评人员报...
293
294
295
          Map<Long, BigDecimal> referValueMap = Maps.newHashMapWithExpectedSize(userIds.size());
          //无目标
          if (IndicatorCodeTypeEnum.INDICATOR.equals(codeType)) {
6b3d17b7   姜超   feature(*): 考评人员报...
296
              List<IndicatorUserValue> indicatorUserValues = indicatorUserValueService.list(Wrappers.<IndicatorUserValue>lambdaQuery()
b5cb9dec   姜超   feature(*): 考评人员报...
297
298
                              .eq(IndicatorUserValue::getIndicatorCode, code)
                              .eq(IndicatorUserValue::getDataDate, dataDate)
6b3d17b7   姜超   feature(*): 考评人员报...
299
300
                              .in(IndicatorUserValue::getUserId, userIds)
                              .eq(IndicatorUserValue::getDimensionType, DimensionTypeEnum.STAFF)
b5cb9dec   姜超   feature(*): 考评人员报...
301
302
303
                              .eq(IndicatorUserValue::getYn, Boolean.TRUE)
              );
              for (IndicatorUserValue userValue : indicatorUserValues) {
de63cefc   姜超   feature(*): 考评数据抽取修改
304
305
                  referValueMap.put(userValue.getUserId(), commonService.queryIndicatorValueVO(code, userValue,
                          param.getTargetType(), param.getDataType()));
b5cb9dec   姜超   feature(*): 考评人员报...
306
307
              }
              return referValueMap;
911bd821   姜超   feature(*): 报表相关实体类
308
          }
b5cb9dec   姜超   feature(*): 考评人员报...
309
310
          for (Long userId : userIds) {
              EvalIndicatorValue evalIndicatorValue = evalIndicatorValueService.queryLastValue(userId,
6b3d17b7   姜超   feature(*): 考评人员报...
311
                      DimensionTypeEnum.STAFF, code, dataDate);
0eb5ae3e   姜超   feature(*): 考评数据抽取修改
312
              referValueMap.put(userId, commonService.queryEvalIndicatorValueVO(code, evalIndicatorValue, param.getTargetType(), param.getDataType()));
b5cb9dec   姜超   feature(*): 考评人员报...
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
          }
          return referValueMap;
      }
  
      public Map<Long, EvalGroupIndicatorTargetHitLog> queryUserTargetValue(Long referId, List<Long> poolIds, LocalDate dataDate) {
          List<EvalGroupIndicatorTargetHitLog> targetHitLogs = evalGroupIndicatorTargetHitLogService.list(Wrappers.<EvalGroupIndicatorTargetHitLog>lambdaQuery()
                  .eq(EvalGroupIndicatorTargetHitLog::getReferId, referId)
                  .eq(EvalGroupIndicatorTargetHitLog::getTargetType, IndicatorTypeEnum.EXAMINE)
                  .eq(EvalGroupIndicatorTargetHitLog::getDataDate, dataDate)
                  .in(EvalGroupIndicatorTargetHitLog::getPoolId, poolIds)
                  .eq(EvalGroupIndicatorTargetHitLog::getScopeType, EvalScopeEnum.STAFF)
                  .eq(EvalGroupIndicatorTargetHitLog::getYn, Boolean.TRUE)
          );
          return targetHitLogs.stream()
                  .collect(Collectors.toMap(EvalGroupIndicatorTargetHitLog::getPoolId, Function.identity(), (v1, v2) -> v1));
911bd821   姜超   feature(*): 报表相关实体类
328
329
      }
  
b5cb9dec   姜超   feature(*): 考评人员报...
330
      public void cleanTodayData(LocalDate date) {
74f1e91d   姜超   feature(*): 考评人员报表修改
331
          evalUserRankReportService.remove(Wrappers.<EvalUserRankReport>lambdaUpdate()
9ee4f27d   姜超   feature(*): 考评人员报...
332
                  .eq(EvalUserRankReport::getDataDate, date)
b5cb9dec   姜超   feature(*): 考评人员报...
333
          );
74f1e91d   姜超   feature(*): 考评人员报表修改
334
          evalUserRankCodeReportService.remove(Wrappers.<EvalUserRankCodeReport>lambdaUpdate()
9ee4f27d   姜超   feature(*): 考评人员报...
335
                  .eq(EvalUserRankCodeReport::getDataDate, date)
b5cb9dec   姜超   feature(*): 考评人员报...
336
          );
74f1e91d   姜超   feature(*): 考评人员报表修改
337
          evalUserValueReportService.remove(Wrappers.<EvalUserValueReport>lambdaUpdate()
9ee4f27d   姜超   feature(*): 考评人员报...
338
                  .eq(EvalUserValueReport::getDataDate, date)
b5cb9dec   姜超   feature(*): 考评人员报...
339
          );
6b3d17b7   姜超   feature(*): 考评人员报...
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
          evalUserReportService.remove(Wrappers.<EvalUserReport>lambdaUpdate()
                  .eq(EvalUserReport::getDataDate, date)
          );
      }
  
      public void cleanRankCurMonthData(Long rankId, LocalDate endDate) {
          LocalDate startDate = endDate.with(TemporalAdjusters.firstDayOfMonth());
          List<EvalUserRankReport> rankReports = evalUserRankReportService.list(Wrappers.<EvalUserRankReport>lambdaQuery()
                  .eq(EvalUserRankReport::getRankId, rankId)
                  .ge(EvalUserRankReport::getDataDate, startDate)
                  .le(EvalUserRankReport::getDataDate, endDate)
          );
          if (PublicUtil.isEmpty(rankReports)) {
              return;
          }
          List<Long> rankReportIds = rankReports.stream().map(EvalUserRankReport::getId).collect(Collectors.toList());
          evalUserRankReportService.removeByIds(rankReportIds);
          evalUserRankCodeReportService.remove(Wrappers.<EvalUserRankCodeReport>lambdaUpdate()
d50d5802   姜超   feature(*): 字段修改
358
                  .in(EvalUserRankCodeReport::getEvalUserRankReportId, rankReportIds)
6b3d17b7   姜超   feature(*): 考评人员报...
359
360
361
          );
  
          List<EvalUserReport> userReports = evalUserReportService.list(Wrappers.<EvalUserReport>lambdaQuery()
d50d5802   姜超   feature(*): 字段修改
362
                  .in(EvalUserReport::getEvalUserRankReportId, rankReportIds)
6b3d17b7   姜超   feature(*): 考评人员报...
363
364
365
366
367
368
369
370
371
          );
          List<Long> userReportIds = userReports.stream().map(EvalUserReport::getId).collect(Collectors.toList());
          if (PublicUtil.isEmpty(userReportIds)) {
              return;
          }
          evalUserReportService.removeByIds(userReportIds);
          evalUserValueReportService.remove(Wrappers.<EvalUserValueReport>lambdaUpdate()
                  .in(EvalUserValueReport::getEvalUserReportId, userReportIds)
          );
b5cb9dec   姜超   feature(*): 考评人员报...
372
      }
911bd821   姜超   feature(*): 报表相关实体类
373
  
392d707a   姜超   feature(*): 门店考评
374
      public List<EvalUserRankCodeReport> saveRankCodeReports(List<EvalGroupIndicator> evalGroupIndicators, Long reportRankId, LocalDate date) {
b5cb9dec   姜超   feature(*): 考评人员报...
375
          Set<String> codes = new HashSet<>();
9ee4f27d   姜超   feature(*): 考评人员报...
376
          List<EvalUserRankCodeReport> rankCodes = new ArrayList<>();
74f1e91d   姜超   feature(*): 考评人员报表修改
377
378
379
380
          AtomicInteger order = new AtomicInteger();
          for (EvalGroupIndicator groupIndicator : evalGroupIndicators) {
              //一个编码只能展示一次
              if (! codes.add(groupIndicator.getCode())) {
b5cb9dec   姜超   feature(*): 考评人员报...
381
382
                  continue;
              }
8e34d367   姜超   feature(*): 数据抽取修改
383
384
              rankCodes.add(this.convertRankCodeDB(groupIndicator, date, reportRankId, order));
  
6a629d48   姜超   feature(*): 门店考评
385
              //组合指标
43c9cba5   姜超   feature(*): 编码名称修改
386
387
              if (PublicUtil.isNotEmpty(groupIndicator.getCodeType()) &&
                      IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(groupIndicator.getCodeType())) {
8e34d367   姜超   feature(*): 数据抽取修改
388
389
390
391
392
393
394
395
                  //子指标
                  List<EvalGroupIndicatorParam> params = evalGroupIndicatorParamService.list(Wrappers.<EvalGroupIndicatorParam>lambdaQuery()
                          .eq(EvalGroupIndicatorParam::getEvalGroupIndicatorId, groupIndicator.getId())
                          .eq(EvalGroupIndicatorParam::getYn, Boolean.TRUE)
                  );
                  for (EvalGroupIndicatorParam indicatorParam : params) {
                      rankCodes.add(this.convertParamToRankCodeDB(indicatorParam, date, reportRankId, order, groupIndicator));
                  }
6a629d48   姜超   feature(*): 门店考评
396
              }
74f1e91d   姜超   feature(*): 考评人员报表修改
397
  
911bd821   姜超   feature(*): 报表相关实体类
398
          }
74f1e91d   姜超   feature(*): 考评人员报表修改
399
          evalUserRankCodeReportService.saveBatch(rankCodes);
b5cb9dec   姜超   feature(*): 考评人员报...
400
401
402
          return rankCodes;
      }
  
e376b24c   姜超   feature(*): 修改个人考评
403
404
405
406
407
      public Map<Long, List<EvalGroupRank>> queryEffectRank(LocalDate date) {
          List<SettingStatusEnum> status = new ArrayList<SettingStatusEnum>(){{
              add(SettingStatusEnum.EFFECTIVE);
              add(SettingStatusEnum.BE_EFFECTIVE);
          }};
b5cb9dec   姜超   feature(*): 考评人员报...
408
          List<EvalGroupRank> evalGroupRanks = evalGroupRankService.list(Wrappers.<EvalGroupRank>lambdaQuery()
e376b24c   姜超   feature(*): 修改个人考评
409
                  .in(EvalGroupRank::getStatus, status)
6a629d48   姜超   feature(*): 门店考评
410
                  .ge(EvalGroupRank::getOverTime, date)
b5cb9dec   姜超   feature(*): 考评人员报...
411
412
413
414
415
                  .eq(EvalGroupRank::getYn, Boolean.TRUE)
          );
          return evalGroupRanks.stream().collect(Collectors.groupingBy(EvalGroupRank::getGroupId));
      }
  
74f1e91d   姜超   feature(*): 考评人员报表修改
416
      public EvalUserRankReport saveRankReport(EvalGroupRank rank, List<Long> evalGroupIds, List<EvalGroup> evalGroups, LocalDate date, Long groupId) {
b5cb9dec   姜超   feature(*): 考评人员报...
417
          List<Long> shopIds = evalGroups.stream().map(EvalGroup::getShopIds).distinct().collect(ArrayList::new, List::addAll, List::addAll);
9ee4f27d   姜超   feature(*): 考评人员报...
418
          EvalUserRankReport reportRank = new EvalUserRankReport();
b5cb9dec   姜超   feature(*): 考评人员报...
419
420
421
422
423
          reportRank.setRankId(rank.getId());
          reportRank.setRankName(rank.getName());
          reportRank.setEvalGroupIds(evalGroupIds);
          reportRank.setShopIds(shopIds);
          reportRank.setDataDate(date);
6329e44a   姜超   feature(*): 考评人员数...
424
          reportRank.setMonthly(YearMonth.from(date));
b5cb9dec   姜超   feature(*): 考评人员报...
425
          reportRank.setGroupId(groupId);
74f1e91d   姜超   feature(*): 考评人员报表修改
426
          evalUserRankReportService.save(reportRank);
b5cb9dec   姜超   feature(*): 考评人员报...
427
428
429
          return reportRank;
      }
  
6329e44a   姜超   feature(*): 考评人员数...
430
431
      public EvalUserValueReport convertDB(Long evalUserReportId, EvalGroupIndicator groupIndicator, BigDecimal value,
                                           LocalDate date, List<EvalGroupIndicatorParam> params) {
9ee4f27d   姜超   feature(*): 考评人员报...
432
          EvalUserValueReport userValue = new EvalUserValueReport();
74f1e91d   姜超   feature(*): 考评人员报表修改
433
          userValue.setEvalUserReportId(evalUserReportId);
b5cb9dec   姜超   feature(*): 考评人员报...
434
435
436
437
          userValue.setCode(groupIndicator.getCode());
          userValue.setCodeType(groupIndicator.getCodeType());
          userValue.setValue(Optional.ofNullable(value).orElse(BigDecimal.ZERO));
          userValue.setDataDate(date);
6329e44a   姜超   feature(*): 考评人员数...
438
439
440
441
442
          if (IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(groupIndicator.getCodeType())) {
              userValue.setValue(userValue.getValue().multiply(Constant.ONE_HUNDRED));
          } else {
              Optional<EvalGroupIndicatorParam> paramOptional = params.stream().findFirst();
              if (paramOptional.isPresent()) {
0eb5ae3e   姜超   feature(*): 考评数据抽取修改
443
444
                  EvalGroupIndicatorParam param = paramOptional.get();
                  if (DataTypeEnum.RATIO.equals(param.getDataType()) || (! TargetTypeEnum.NO.equals(param.getTargetType()))) {
6329e44a   姜超   feature(*): 考评人员数...
445
446
447
448
                      userValue.setValue(userValue.getValue().multiply(Constant.ONE_HUNDRED));
                  }
              }
          }
b5cb9dec   姜超   feature(*): 考评人员报...
449
450
451
          return userValue;
      }
  
392d707a   姜超   feature(*): 门店考评
452
      public EvalUserValueReport convertParamDB(Long evalUserReportId, EvalGroupIndicatorParam param, BigDecimal value, LocalDate date) {
9ee4f27d   姜超   feature(*): 考评人员报...
453
          EvalUserValueReport userValue = new EvalUserValueReport();
74f1e91d   姜超   feature(*): 考评人员报表修改
454
          userValue.setEvalUserReportId(evalUserReportId);
b5cb9dec   姜超   feature(*): 考评人员报...
455
456
457
458
          userValue.setCode(param.getCode());
          userValue.setCodeType(param.getCodeType());
          userValue.setValue(Optional.ofNullable(value).orElse(BigDecimal.ZERO));
          userValue.setDataDate(date);
b5cb9dec   姜超   feature(*): 考评人员报...
459
          return userValue;
911bd821   姜超   feature(*): 报表相关实体类
460
461
      }
  
74f1e91d   姜超   feature(*): 考评人员报表修改
462
463
      public EvalUserRankCodeReport convertRankCodeDB(EvalGroupIndicator groupIndicator, LocalDate date, Long reportRankId, AtomicInteger order) {
          EvalUserRankCodeReport rankCode = new EvalUserRankCodeReport();
d50d5802   姜超   feature(*): 字段修改
464
          rankCode.setEvalUserRankReportId(reportRankId);
74f1e91d   姜超   feature(*): 考评人员报表修改
465
466
467
          rankCode.setEvalGroupIndicatorId(groupIndicator.getId());
          rankCode.setCode(groupIndicator.getCode());
          rankCode.setCodeType(groupIndicator.getCodeType());
26b0233b   姜超   feature(*): 抽数据名称处理
468
469
470
471
472
473
474
  //        String indicatorName = (ScoreWayEnum.LADDER.equals(groupIndicator.getScoreWay())) ?
  //                groupIndicator.getLadderParamAlias() : groupIndicator.getCommissionParamAlias();
  //        if (PublicUtil.isEmpty(indicatorName)) {
  //            indicatorName = groupIndicator.getName();
  //        }
  //        rankCode.setIndicatorName(indicatorName);
          rankCode.setIndicatorName(groupIndicator.getName());
74f1e91d   姜超   feature(*): 考评人员报表修改
475
          rankCode.setDataDate(date);
6a629d48   姜超   feature(*): 门店考评
476
          rankCode.setOrderNum(order.incrementAndGet());
74f1e91d   姜超   feature(*): 考评人员报表修改
477
478
479
          return rankCode;
      }
  
392d707a   姜超   feature(*): 门店考评
480
481
      public EvalUserRankCodeReport convertParamToRankCodeDB(EvalGroupIndicatorParam indicatorParam, LocalDate date, Long reportRankId,
                                                             AtomicInteger order, EvalGroupIndicator groupIndicator) {
74f1e91d   姜超   feature(*): 考评人员报表修改
482
          EvalUserRankCodeReport rankCode = new EvalUserRankCodeReport();
d50d5802   姜超   feature(*): 字段修改
483
          rankCode.setEvalUserRankReportId(reportRankId);
74f1e91d   姜超   feature(*): 考评人员报表修改
484
485
486
487
          rankCode.setEvalGroupIndicatorId(indicatorParam.getEvalGroupIndicatorId());
          rankCode.setCode(indicatorParam.getCode());
          rankCode.setCodeType(indicatorParam.getCodeType());
          rankCode.setIndicatorName(indicatorParam.getName());
6a629d48   姜超   feature(*): 门店考评
488
489
490
491
          if (IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(groupIndicator.getCodeType())
                  && PublicUtil.isNotEmpty(groupIndicator.getCode())) {
              rankCode.setParentCode(groupIndicator.getCode());
          }
74f1e91d   姜超   feature(*): 考评人员报表修改
492
          rankCode.setDataDate(date);
6a629d48   姜超   feature(*): 门店考评
493
          rankCode.setOrderNum(order.incrementAndGet());
74f1e91d   姜超   feature(*): 考评人员报表修改
494
          return rankCode;
911bd821   姜超   feature(*): 报表相关实体类
495
      }
74f1e91d   姜超   feature(*): 考评人员报表修改
496
497
  
  
911bd821   姜超   feature(*): 报表相关实体类
498
  }