Blame view

fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java 19.7 KB
ea6b2fd6   姜超   feature(*): 门店奖惩分配
1
2
  package cn.fw.morax.service.biz.eval;
  
6216249c   姜超   feature(*): 修改bug
3
  import cn.fw.backlog.sdk.api.result.FailBacklogItem;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
4
  import cn.fw.common.cache.locker.DistributedLocker;
edc57409   姜超   feature(*): 考评奖惩分配
5
  import cn.fw.common.exception.BusinessException;
347b9a76   姜超   feature(*): 考评审批
6
  import cn.fw.common.web.auth.LoginAuthBean;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
7
  import cn.fw.morax.common.config.TodoVal;
2ac0c565   姜超   feature(*): 修改个人考评
8
  import cn.fw.morax.common.constant.Constant;
347b9a76   姜超   feature(*): 考评审批
9
  import cn.fw.morax.common.pojo.event.ApprovalResultEvent;
6216249c   姜超   feature(*): 修改bug
10
  import cn.fw.morax.common.utils.DateUtil;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
11
12
13
  import cn.fw.morax.common.utils.PublicUtil;
  import cn.fw.morax.common.utils.ThreadPoolUtil;
  import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO;
347b9a76   姜超   feature(*): 考评审批
14
  import cn.fw.morax.domain.db.ApprovalRecord;
6216249c   姜超   feature(*): 修改bug
15
  import cn.fw.morax.domain.db.eval.*;
edc57409   姜超   feature(*): 考评奖惩分配
16
17
  import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO;
  import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO;
6216249c   姜超   feature(*): 修改bug
18
  import cn.fw.morax.domain.enums.*;
9ecc8f2d   姜超   feature(*): 数据录入修改
19
  import cn.fw.morax.domain.vo.eval.EvalRewardDistDetailVO;
edc57409   姜超   feature(*): 考评奖惩分配
20
21
  import cn.fw.morax.domain.vo.eval.EvalRewardDistVO;
  import cn.fw.morax.domain.vo.eval.EvalShopPoolVO;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
22
  import cn.fw.morax.rpc.backlog.TodoRpcService;
edc57409   姜超   feature(*): 考评奖惩分配
23
  import cn.fw.morax.rpc.backlog.dto.BackLogItemDTO;
6216249c   姜超   feature(*): 修改bug
24
25
  import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanItemReqDTO;
  import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanReqDTO;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
26
27
  import cn.fw.morax.rpc.erp.ErpRpcService;
  import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO;
6216249c   姜超   feature(*): 修改bug
28
  import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO;
347b9a76   姜超   feature(*): 考评审批
29
  import cn.fw.morax.service.biz.ApprovalBizService;
dc3c54cf   姜超   feature(*): 修改上传
30
  import cn.fw.morax.service.data.ApprovalRecordService;
6216249c   姜超   feature(*): 修改bug
31
  import cn.fw.morax.service.data.eval.*;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
32
33
34
35
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONObject;
  import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
edc57409   姜超   feature(*): 考评奖惩分配
36
  import com.google.common.collect.Lists;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
37
38
39
40
41
42
43
44
45
46
  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.data.redis.core.BoundSetOperations;
  import org.springframework.data.redis.core.StringRedisTemplate;
  import org.springframework.stereotype.Service;
  import org.springframework.transaction.annotation.Transactional;
  
edc57409   姜超   feature(*): 考评奖惩分配
47
  import java.math.BigDecimal;
2ac0c565   姜超   feature(*): 修改个人考评
48
  import java.text.DateFormat;
6216249c   姜超   feature(*): 修改bug
49
  import java.text.DecimalFormat;
eccb0d64   姜超   feature(*): 考评详情查询
50
  import java.time.LocalDate;
6216249c   姜超   feature(*): 修改bug
51
  import java.time.LocalDateTime;
2ac0c565   姜超   feature(*): 修改个人考评
52
  import java.time.format.DateTimeFormatter;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
53
54
55
56
  import java.util.*;
  import java.util.concurrent.RejectedExecutionException;
  import java.util.concurrent.ThreadPoolExecutor;
  import java.util.concurrent.locks.Lock;
6216249c   姜超   feature(*): 修改bug
57
  import java.util.stream.Collectors;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  
  import static cn.fw.common.businessvalidator.Validator.BV;
  
  /**
   * @author jiangchao
   * @des: 考评计算
   * @date 2023/1/12 17:39
   */
  @Slf4j
  @Service
  @RequiredArgsConstructor
  public class EvalRewardService {
  
      private final TodoVal todoVal;
2188d9d0   姜超   feature(*): 修改代码格式
72
73
      private final ErpRpcService erpRpcService;
      private final TodoRpcService todoRpcService;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
74
      private final EvalGroupService evalGroupService;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
75
      private final DistributedLocker distributedLocker;
2188d9d0   姜超   feature(*): 修改代码格式
76
77
78
      private final ApprovalBizService approvalBizService;
      private final StringRedisTemplate stringRedisTemplate;
      private final EvalShopPoolService evalShopPoolService;
dc3c54cf   姜超   feature(*): 修改上传
79
      private final ApprovalRecordService approvalRecordService;
2188d9d0   姜超   feature(*): 修改代码格式
80
      private final EvalRewardDistService evalRewardDistService;
6216249c   姜超   feature(*): 修改bug
81
82
83
      private final EvalGroupRankService evalGroupRankService;
      private final EvalGroupRankStageService evalGroupRankStageService;
      private final EvalGroupRewardDimService evalGroupRewardDimService;
2188d9d0   姜超   feature(*): 修改代码格式
84
      private final EvalRewardDistDetailService evalRewardDistDetailService;
ea6b2fd6   姜超   feature(*): 门店奖惩分配
85
86
87
88
89
90
91
92
93
94
  
      @Value("${spring.cache.custom.global-prefix}:dist:eval-reward")
      @Getter
      private String distributionKey;
      private final static String REWARD_LOCK_KEY = "eval:group:reward";
  
      /**
       * 缓存分配奖惩的考评池
       *
       */
bdcc7a51   姜超   feature(*): 查询指标排名
95
      public void cacheDistEvalShopPoolIds(LocalDate localDate) {
ea6b2fd6   姜超   feature(*): 门店奖惩分配
96
97
98
99
100
101
102
          Lock lock = distributedLocker.lock(REWARD_LOCK_KEY);
          if (! ((RLock) lock).isLocked()) {
              return;
          }
          try {
              log.info("定时任务【考评奖惩待办】开始执行");
  
bdcc7a51   姜超   feature(*): 查询指标排名
103
              Set<Long> evalGroupIds = evalGroupService.queryDistributionShopReward(localDate);
eccb0d64   姜超   feature(*): 考评详情查询
104
              if (PublicUtil.isEmpty(evalGroupIds)) {
ea6b2fd6   姜超   feature(*): 门店奖惩分配
105
106
                  return;
              }
eccb0d64   姜超   feature(*): 考评详情查询
107
108
              String[] array = evalGroupIds.stream()
                      .map(evalGroupId -> new EvalGroupRewardDistributionBO(evalGroupId))
ea6b2fd6   姜超   feature(*): 门店奖惩分配
109
110
111
112
113
114
115
116
117
118
119
120
                      .map(JSONObject::toJSONString)
                      .toArray(String[]::new);
              stringRedisTemplate.opsForSet().add(getDistributionKey(), array);
  
          } catch (Exception e){
              log.error(e.getMessage(), e);
          } finally {
              lock.unlock();
          }
      }
  
  
edc57409   姜超   feature(*): 考评奖惩分配
121
122
123
      /**
       * 分配奖惩
       */
ea6b2fd6   姜超   feature(*): 门店奖惩分配
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
      public void distributionEvalReward() {
          BoundSetOperations<String, String> setOps = stringRedisTemplate.boundSetOps(getDistributionKey());
          ThreadPoolExecutor threadPool = ThreadPoolUtil.getInstance().getThreadPool();
          List<String> overflowsList = new ArrayList<>();
          String str;
          while ((str = setOps.pop()) != null) {
              final EvalGroupRewardDistributionBO bo = JSONObject.parseObject(str, EvalGroupRewardDistributionBO.class);
              if (Objects.isNull(bo)) {
                  continue;
              }
              try {
                  String finalStr = str;
                  threadPool.execute(() -> {
                      try {
                          distributionEvalGroupReward(bo);
                      } catch (Exception ex) {
e1206478   姜超   feature(*): 修改考评审批
140
                          log.error("计算考评数据失败:{}", bo, ex);
ea6b2fd6   姜超   feature(*): 门店奖惩分配
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
                          setOps.add(finalStr);
                      }
                  });
              } catch (RejectedExecutionException re) {
                  overflowsList.add(str);
              }
          }
          if (!CollectionUtils.isEmpty(overflowsList)) {
              for (String s : overflowsList) {
                  setOps.add(s);
              }
          }
      }
  
  
      private void distributionEvalGroupReward(EvalGroupRewardDistributionBO bo) {
eccb0d64   姜超   feature(*): 考评详情查询
157
158
          final Long evalGroupId = bo.getEvalGroupId();
          log.info("分配奖惩的考评组:{}", evalGroupId);
ea6b2fd6   姜超   feature(*): 门店奖惩分配
159
          EvalGroup evalGroup = evalGroupService.getById(evalGroupId);
eccb0d64   姜超   feature(*): 考评详情查询
160
          BV.notNull(evalGroup, "考评组不存在,终止计算!");
6216249c   姜超   feature(*): 修改bug
161
162
163
164
          EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId());
          BV.notNull(evalGroupRank, "考评排名组不存在,终止计算!");
          EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getById(evalGroup.getEvalGroupRankStageId());
          BV.notNull(evalGroupRankStage, "考评阶段不存在,终止计算!");
eccb0d64   姜超   feature(*): 考评详情查询
165
  
6216249c   姜超   feature(*): 修改bug
166
167
168
169
170
171
172
173
174
          List<EvalGroupRewardDim> shopRewardDims = evalGroupRewardDimService.list(Wrappers.<EvalGroupRewardDim>lambdaQuery()
                  .eq(EvalGroupRewardDim::getEvalGroupId, evalGroup.getId())
                  .eq(EvalGroupRewardDim::getType, EvalScopeEnum.SHOP)
                  .eq(EvalGroupRewardDim::getYn, Boolean.TRUE)
          );
          if (PublicUtil.isEmpty(shopRewardDims)) {
              log.error("考评奖惩没有门店:{}", JSON.toJSONString(evalGroup));
              return;
          }
2ac0c565   姜超   feature(*): 修改个人考评
175
          sendDistRewardTodo(shopRewardDims, evalGroup, evalGroupRank, evalGroupRankStage);
ea6b2fd6   姜超   feature(*): 门店奖惩分配
176
177
178
179
180
181
182
183
      }
  
      /**
       * 发送绩效组变动通知
       *
       * @param
       */
      @Transactional(rollbackFor = Exception.class)
6216249c   姜超   feature(*): 修改bug
184
185
      public void sendDistRewardTodo(List<EvalGroupRewardDim> shopRewardDims, EvalGroup evalGroup,
                                     EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage) {
2ac0c565   姜超   feature(*): 修改个人考评
186
          List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>();
6216249c   姜超   feature(*): 修改bug
187
          List<Long> distPoolIds = new ArrayList<>();
6216249c   姜超   feature(*): 修改bug
188
189
190
          for (EvalGroupRewardDim rewardDim : shopRewardDims) {
              final String roleCode = rewardDim.getDistRoleCode();
              List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
e376b24c   姜超   feature(*): 修改个人考评
191
                  .ne(EvalShopPool::getReward, BigDecimal.ZERO)
6216249c   姜超   feature(*): 修改bug
192
193
194
195
196
197
198
199
                  .eq(EvalShopPool::getEvalGroupId, evalGroup.getId())
                  .in(EvalShopPool::getShopId, rewardDim.getShopIds())
                  .eq(EvalShopPool::getYn, Boolean.TRUE)
              );
              if (PublicUtil.isEmpty(pools)) {
                  log.error("分配奖惩待办,未找到考评池:{}", JSON.toJSONString(rewardDim));
                  continue;
              }
e376b24c   姜超   feature(*): 修改个人考评
200
              List<Long> distShopIds = pools.stream().map(EvalShopPool::getShopId).collect(Collectors.toList());
6216249c   姜超   feature(*): 修改bug
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
              List<RpcUserRoleInfoDTO> users = this.getUserEnableRoleInfos(roleCode, distShopIds);
              for (RpcUserRoleInfoDTO user : users) {
                  List<Long> manageShopIds = user.getRangeList().stream()
                          .filter(range -> distShopIds.contains(range.getShopId()))
                          .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList());
                  if (PublicUtil.isEmpty(manageShopIds)) {
                      continue;
                  }
                  List<Long> poolIds = new ArrayList<>();
                  BigDecimal reward = BigDecimal.ZERO;
                  for (EvalShopPool pool : pools) {
                      if (manageShopIds.contains(pool.getShopId())) {
                          poolIds.add(pool.getId());
                          distPoolIds.add(pool.getId());
                          reward = reward.add(pool.getReward());
                      }
                  }
                  //奖惩为0不分配
                  if (BigDecimal.ZERO.compareTo(reward) == 0) {
2ac0c565   姜超   feature(*): 修改个人考评
220
                      continue;
6216249c   姜超   feature(*): 修改bug
221
222
                  }
  
2ac0c565   姜超   feature(*): 修改个人考评
223
                  EvalRewardDist rewardDist = this.convertRewardDist(evalGroup, evalGroupRank, evalGroupRankStage, poolIds, manageShopIds);
6216249c   姜超   feature(*): 修改bug
224
                  rewardDist.setUserId(user.getUserId());
6216249c   姜超   feature(*): 修改bug
225
226
                  rewardDist.setReward(reward);
                  evalRewardDistService.save(rewardDist);
2ac0c565   姜超   feature(*): 修改个人考评
227
                  BacklogBatchPlanItemReqDTO planItemReq = this.createBacklog(rewardDist, user.getUserId());
f945186c   姜超   feature(*): 修改个人考评
228
                  planItemReq.setDynamicMap(rewardDistDynamicMap(rewardDist, evalGroupRank, evalGroupRankStage));
6216249c   姜超   feature(*): 修改bug
229
230
                  itemList.add(planItemReq);
              }
6216249c   姜超   feature(*): 修改bug
231
          }
e376b24c   姜超   feature(*): 修改个人考评
232
233
234
235
236
237
238
          if (PublicUtil.isNotEmpty(itemList)) {
              //推送待办
              BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList);
              List<FailBacklogItem> failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>());
              if (PublicUtil.isNotEmpty(failItems)) {
                  log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems));
              }
6216249c   姜超   feature(*): 修改bug
239
  
e376b24c   姜超   feature(*): 修改个人考评
240
241
242
243
244
245
246
247
              if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) {
                  if (PublicUtil.isNotEmpty(distPoolIds)) {
                      evalShopPoolService.update(Wrappers.<EvalShopPool>lambdaUpdate()
                              .in(EvalShopPool::getId, distPoolIds)
                              .set(EvalShopPool::getStatus, EvalShopPoolStatusEnum.WAIT_DIST_REWARD)
                              .set(EvalShopPool::getUpdateTime, new Date())
                      );
                  }
6216249c   姜超   feature(*): 修改bug
248
249
              }
          }
ea6b2fd6   姜超   feature(*): 门店奖惩分配
250
251
      }
  
2ac0c565   姜超   feature(*): 修改个人考评
252
253
254
255
256
257
258
259
260
261
262
263
  
      public BacklogBatchPlanItemReqDTO createBacklog(EvalRewardDist rewardDist, Long userId) {
          Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L));
          BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO();
          planItemReq.setDataId(rewardDist.getId().toString());
          planItemReq.setUserId(userId);
          planItemReq.setPlanTime(new Date());
          planItemReq.setExpireTime(expireTime);
          planItemReq.setExtraData(new HashMap<>());
          return planItemReq;
      }
  
f945186c   姜超   feature(*): 修改个人考评
264
265
266
267
268
269
270
      public Map<String, String> rewardDistDynamicMap(EvalRewardDist rewardDist, EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage) {
          DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
          String beginTimeStr = dtf.format(rewardDist.getBeginTime());
          String endTimeStr = dtf.format(rewardDist.getOverTime());
          String timeStr = beginTimeStr + Constant.TIME_SEPARATOR + endTimeStr;
          String evalGroupRankStageName = (evalGroupRank.getMultiStage()) ? evalGroupRankStage.getName() : "---";
  
2ac0c565   姜超   feature(*): 修改个人考评
271
272
          DecimalFormat decimalFormat = new DecimalFormat("##########.##");
          Map<String, String> dynamicMap = new HashMap<>(8);
f945186c   姜超   feature(*): 修改个人考评
273
          dynamicMap.put("evalGroupRankName", evalGroupRank.getName());
2ac0c565   姜超   feature(*): 修改个人考评
274
275
276
277
278
279
280
281
          dynamicMap.put("evalGroupRankStageName", evalGroupRankStageName);
          dynamicMap.put("evalGroupRankStageTime", timeStr);
          dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward()));
          return dynamicMap;
      }
  
      public EvalRewardDist convertRewardDist(EvalGroup evalGroup, EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage,
                                           List<Long> poolIds, List<Long> manageShopIds) {
f53a1f59   姜超   feature(*): 百分率处理
282
          EvalRewardDist rewardDist = new EvalRewardDist();
f53a1f59   姜超   feature(*): 百分率处理
283
          rewardDist.setEvalGroupId(evalGroup.getId());
2ac0c565   姜超   feature(*): 修改个人考评
284
285
286
287
288
289
290
291
292
293
294
          rewardDist.setEvalGroupRankId(evalGroupRank.getId());
          rewardDist.setEvalGroupRankStageId(evalGroupRankStage.getId());
          rewardDist.setEvalGroupRankName(evalGroupRank.getName());
          String evalGroupRankStageName = (PublicUtil.isNotEmpty(evalGroupRankStage.getName()) ? evalGroupRankStage.getName() : "---");
          rewardDist.setEvalGroupRankStageName(evalGroupRankStageName);
          rewardDist.setBeginTime(evalGroupRankStage.getBeginTime());
          rewardDist.setOverTime(evalGroupRankStage.getOverTime());
          rewardDist.setEvalShopPoolIds(poolIds);
          rewardDist.setShopIds(manageShopIds);
  
          rewardDist.setEvalGroupId(evalGroup.getId());
f53a1f59   姜超   feature(*): 百分率处理
295
296
297
298
299
300
          rewardDist.setStatus(EvalRewardDistStatusEnum.NO_DIST);
          rewardDist.setGroupId(evalGroup.getGroupId());
          rewardDist.setYn(Boolean.TRUE);
          return rewardDist;
      }
  
edc57409   姜超   feature(*): 考评奖惩分配
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
      /**
       * 对查询的人员去重
       *
       * @param roleCode
       * @param shopIds
       * @return
       */
      public List<RpcUserRoleInfoDTO> getUserEnableRoleInfos(String roleCode, List<Long> shopIds) {
          List<RpcUserRoleInfoDTO> userRoleInfos = erpRpcService.getUserEnableRoleInfos(roleCode, shopIds);
          if (PublicUtil.isEmpty(userRoleInfos)) {
              return new ArrayList<>();
          }
          Set<Long> staffIds = new HashSet<>();
          List<RpcUserRoleInfoDTO> repeatUserRoleInfos = Lists.newArrayListWithCapacity(userRoleInfos.size());
          for (RpcUserRoleInfoDTO rpcUserRoleInfoDTO : userRoleInfos) {
              if (staffIds.add(rpcUserRoleInfoDTO.getUserId())) {
                  repeatUserRoleInfos.add(rpcUserRoleInfoDTO);
              }
          }
          return repeatUserRoleInfos;
      }
ea6b2fd6   姜超   feature(*): 门店奖惩分配
322
323
  
  
edc57409   姜超   feature(*): 考评奖惩分配
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
      /**
       * 奖惩分配详情
       * @param id
       * @return
       */
      public EvalRewardDistVO rewardDistDetail(Long id) {
          EvalRewardDist rewardDist = evalRewardDistService.getById(id);
          BV.notNull(rewardDist, "奖惩分配不存在,请重试");
          EvalRewardDistVO rewardDistVO = PublicUtil.copy(rewardDist, EvalRewardDistVO.class);
  
          List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
                  .in(EvalShopPool::getId, rewardDistVO.getEvalShopPoolIds())
                  .eq(EvalShopPool::getYn, Boolean.TRUE)
          );
          BV.isNotEmpty(pools, "奖惩分配不存在,请重试");
          List<EvalShopPoolVO> shopPools = PublicUtil.copyList(pools, EvalShopPoolVO.class);
          rewardDistVO.setShopPools(shopPools);
9ecc8f2d   姜超   feature(*): 数据录入修改
341
  
beac6c98   姜超   feature(*): 分配查询
342
343
          if (EvalRewardDistStatusEnum.APPROVAL.equals(rewardDist.getStatus()) ||
                  EvalRewardDistStatusEnum.APPROVAL_REJECT.equals(rewardDist.getStatus())) {
9ecc8f2d   姜超   feature(*): 数据录入修改
344
              List<EvalRewardDistDetail> details = evalRewardDistDetailService.list(Wrappers.<EvalRewardDistDetail>lambdaQuery()
beac6c98   姜超   feature(*): 分配查询
345
                      .eq(EvalRewardDistDetail::getDistId, rewardDistVO.getId())
9ecc8f2d   姜超   feature(*): 数据录入修改
346
347
348
349
                      .eq(EvalRewardDistDetail::getYn, Boolean.TRUE)
              );
              List<EvalRewardDistDetailVO> detailVOS = PublicUtil.copyList(details, EvalRewardDistDetailVO.class);
              rewardDistVO.setRewardDetails(detailVOS);
dc3c54cf   姜超   feature(*): 修改上传
350
351
352
353
354
355
356
357
  
              ApprovalRecord approvalRecord = approvalRecordService.getOne(Wrappers.<ApprovalRecord>lambdaQuery()
                      .eq(ApprovalRecord::getDataId, id)
                      .eq(ApprovalRecord::getApprovalType, ApprovalTypeEnum.EVAL_REWARD_DIST)
                      .eq(ApprovalRecord::getYn, Boolean.TRUE)
                      .last("ORDER BY id DESC LIMIT 1")
              );
              rewardDistVO.setApprovalNo(Optional.ofNullable(approvalRecord).map(ApprovalRecord::getApprovalNo).orElse(""));
9ecc8f2d   姜超   feature(*): 数据录入修改
358
359
          }
  
edc57409   姜超   feature(*): 考评奖惩分配
360
361
362
          return rewardDistVO;
      }
  
347b9a76   姜超   feature(*): 考评审批
363
364
      @Transactional(rollbackFor = Exception.class)
      public void rewardDist(EvalRewardDistDTO rewardDistDTO, LoginAuthBean currentUser) {
edc57409   姜超   feature(*): 考评奖惩分配
365
366
367
368
369
370
371
372
373
374
375
376
          Long rewardDistId = rewardDistDTO.getEvalShopDistId();
          EvalRewardDist rewardDist = evalRewardDistService.getById(rewardDistId);
          BV.notNull(rewardDist, "奖惩分配不存在,请重试");
          BV.isNotEmpty(rewardDistDTO.getUsers(), "奖惩分配为空,请重试");
  
          BigDecimal totalReward = rewardDistDTO.getUsers().stream()
                                  .map(EvalRewardDistDetailDTO::getReward)
                                  .reduce(BigDecimal.ZERO, BigDecimal::add);
          if (totalReward.compareTo(totalReward) != 0) {
              throw new BusinessException("分配金额不等于总金额,请重试");
          }
  
9ecc8f2d   姜超   feature(*): 数据录入修改
377
378
          //删除之前的分配
          evalRewardDistDetailService.update(Wrappers.<EvalRewardDistDetail>lambdaUpdate()
beac6c98   姜超   feature(*): 分配查询
379
                  .eq(EvalRewardDistDetail::getDistId, rewardDistId)
9ecc8f2d   姜超   feature(*): 数据录入修改
380
381
382
                  .set(EvalRewardDistDetail::getYn, Boolean.FALSE)
          );
  
edc57409   姜超   feature(*): 考评奖惩分配
383
384
          List<EvalRewardDistDetail> distDetails = Lists.newArrayListWithCapacity(rewardDistDTO.getUsers().size());
          for (EvalRewardDistDetailDTO distDetailDTO : rewardDistDTO.getUsers()) {
9ecc8f2d   姜超   feature(*): 数据录入修改
385
386
              EvalRewardDistDetail evalRewardDistDetail = distDetailDTO.convertPo(rewardDistId);
              distDetails.add(evalRewardDistDetail);
edc57409   姜超   feature(*): 考评奖惩分配
387
388
          }
  
347b9a76   姜超   feature(*): 考评审批
389
390
391
392
393
          approvalBizService.applyApproveDistReward(rewardDist, currentUser);
          evalRewardDistDetailService.saveBatch(distDetails);
          rewardDist.setStatus(EvalRewardDistStatusEnum.APPROVAL);
          evalRewardDistService.saveOrUpdate(rewardDist);
      }
edc57409   姜超   feature(*): 考评奖惩分配
394
  
347b9a76   姜超   feature(*): 考评审批
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
      @Transactional(rollbackFor = Exception.class)
      public void approvalEvalRewardDist(ApprovalRecord approvalRecord, ApprovalResultEvent result) {
          log.info("收到考评门店奖惩分配审批信息:{}", JSON.toJSONString(result));
          Boolean agree = result.getAgree();
          Long rewardDistId = approvalRecord.getDataId();
          EvalRewardDist rewardDist = evalRewardDistService.getById(rewardDistId);
          BV.notNull(rewardDist, "奖惩分配不存在,请重试");
          rewardDist.setStatus(EvalRewardDistStatusEnum.APPROVAL_REJECT);
          if (agree) {
              BackLogItemDTO dto = new BackLogItemDTO(rewardDist.getUserId(), todoVal.getDistEvalReward(),
                      String.valueOf(rewardDist.getId()), new Date(), null);
              if (todoRpcService.cancel(dto)) {
  
              } else {
                  log.error("奖惩分配待办取消失败:{}", JSON.toJSONString(rewardDist));
                  throw new BusinessException("奖惩分配失败,请重试");
              }
              rewardDist.setStatus(EvalRewardDistStatusEnum.APPROVAL_AGREE);
2b241dae   姜超   feature(*): 奖惩分配状态设置
413
414
415
416
417
418
              evalRewardDistDetailService.update(Wrappers.<EvalRewardDistDetail>lambdaUpdate()
                      .eq(EvalRewardDistDetail::getDistId, rewardDistId)
                      .eq(EvalRewardDistDetail::getYn, Boolean.TRUE)
                      .set(EvalRewardDistDetail::getStatus, EvalRewardPushStatusEnum.WAIT_PUSH)
                      .set(EvalRewardDistDetail::getUpdateTime, new Date())
              );
347b9a76   姜超   feature(*): 考评审批
419
420
          }
          evalRewardDistService.saveOrUpdate(rewardDist);
edc57409   姜超   feature(*): 考评奖惩分配
421
      }
347b9a76   姜超   feature(*): 考评审批
422
  
ea6b2fd6   姜超   feature(*): 门店奖惩分配
423
  }