Blame view

fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java 19.8 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
186
      public void sendDistRewardTodo(List<EvalGroupRewardDim> shopRewardDims, EvalGroup evalGroup,
                                     EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage) {
          String evalGroupRankName = evalGroupRank.getName();
2ac0c565   姜超   feature(*): 修改个人考评
187
188
189
190
191
          DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
          String beginTimeStr = dtf.format(evalGroupRankStage.getBeginTime());
          String endTimeStr = dtf.format(evalGroupRankStage.getOverTime());
          String timeStr = beginTimeStr + Constant.TIME_SEPARATOR + endTimeStr;
          String evalGroupRankStageName = (evalGroupRank.getMultiStage()) ? evalGroupRankStage.getName() : "---";
edc57409   姜超   feature(*): 考评奖惩分配
192
  
2ac0c565   姜超   feature(*): 修改个人考评
193
          List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>();
6216249c   姜超   feature(*): 修改bug
194
          List<Long> distPoolIds = new ArrayList<>();
6216249c   姜超   feature(*): 修改bug
195
196
197
          for (EvalGroupRewardDim rewardDim : shopRewardDims) {
              final String roleCode = rewardDim.getDistRoleCode();
              List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
e376b24c   姜超   feature(*): 修改个人考评
198
                  .ne(EvalShopPool::getReward, BigDecimal.ZERO)
6216249c   姜超   feature(*): 修改bug
199
200
201
202
203
204
205
206
                  .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(*): 修改个人考评
207
              List<Long> distShopIds = pools.stream().map(EvalShopPool::getShopId).collect(Collectors.toList());
6216249c   姜超   feature(*): 修改bug
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
              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(*): 修改个人考评
227
                      continue;
6216249c   姜超   feature(*): 修改bug
228
229
                  }
  
2ac0c565   姜超   feature(*): 修改个人考评
230
                  EvalRewardDist rewardDist = this.convertRewardDist(evalGroup, evalGroupRank, evalGroupRankStage, poolIds, manageShopIds);
6216249c   姜超   feature(*): 修改bug
231
                  rewardDist.setUserId(user.getUserId());
6216249c   姜超   feature(*): 修改bug
232
233
                  rewardDist.setReward(reward);
                  evalRewardDistService.save(rewardDist);
2ac0c565   姜超   feature(*): 修改个人考评
234
235
                  BacklogBatchPlanItemReqDTO planItemReq = this.createBacklog(rewardDist, user.getUserId());
                  planItemReq.setDynamicMap(rewardDistDynamicMap(rewardDist, evalGroupRankName, evalGroupRankStageName, timeStr));
6216249c   姜超   feature(*): 修改bug
236
237
                  itemList.add(planItemReq);
              }
6216249c   姜超   feature(*): 修改bug
238
          }
e376b24c   姜超   feature(*): 修改个人考评
239
240
241
242
243
244
245
          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
246
  
e376b24c   姜超   feature(*): 修改个人考评
247
248
249
250
251
252
253
254
              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
255
256
              }
          }
ea6b2fd6   姜超   feature(*): 门店奖惩分配
257
258
      }
  
2ac0c565   姜超   feature(*): 修改个人考评
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
  
      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;
      }
  
      public Map<String, String> rewardDistDynamicMap(EvalRewardDist rewardDist, String evalGroupRankName, String evalGroupRankStageName, String timeStr) {
          DecimalFormat decimalFormat = new DecimalFormat("##########.##");
          Map<String, String> dynamicMap = new HashMap<>(8);
          dynamicMap.put("evalGroupRankName", evalGroupRankName);
          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(*): 百分率处理
283
          EvalRewardDist rewardDist = new EvalRewardDist();
f53a1f59   姜超   feature(*): 百分率处理
284
          rewardDist.setEvalGroupId(evalGroup.getId());
2ac0c565   姜超   feature(*): 修改个人考评
285
286
287
288
289
290
291
292
293
294
295
          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(*): 百分率处理
296
297
298
299
300
301
          rewardDist.setStatus(EvalRewardDistStatusEnum.NO_DIST);
          rewardDist.setGroupId(evalGroup.getGroupId());
          rewardDist.setYn(Boolean.TRUE);
          return rewardDist;
      }
  
edc57409   姜超   feature(*): 考评奖惩分配
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
      /**
       * 对查询的人员去重
       *
       * @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(*): 门店奖惩分配
323
324
  
  
edc57409   姜超   feature(*): 考评奖惩分配
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
      /**
       * 奖惩分配详情
       * @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(*): 数据录入修改
342
  
beac6c98   姜超   feature(*): 分配查询
343
344
          if (EvalRewardDistStatusEnum.APPROVAL.equals(rewardDist.getStatus()) ||
                  EvalRewardDistStatusEnum.APPROVAL_REJECT.equals(rewardDist.getStatus())) {
9ecc8f2d   姜超   feature(*): 数据录入修改
345
              List<EvalRewardDistDetail> details = evalRewardDistDetailService.list(Wrappers.<EvalRewardDistDetail>lambdaQuery()
beac6c98   姜超   feature(*): 分配查询
346
                      .eq(EvalRewardDistDetail::getDistId, rewardDistVO.getId())
9ecc8f2d   姜超   feature(*): 数据录入修改
347
348
349
350
                      .eq(EvalRewardDistDetail::getYn, Boolean.TRUE)
              );
              List<EvalRewardDistDetailVO> detailVOS = PublicUtil.copyList(details, EvalRewardDistDetailVO.class);
              rewardDistVO.setRewardDetails(detailVOS);
dc3c54cf   姜超   feature(*): 修改上传
351
352
353
354
355
356
357
358
  
              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(*): 数据录入修改
359
360
          }
  
edc57409   姜超   feature(*): 考评奖惩分配
361
362
363
          return rewardDistVO;
      }
  
347b9a76   姜超   feature(*): 考评审批
364
365
      @Transactional(rollbackFor = Exception.class)
      public void rewardDist(EvalRewardDistDTO rewardDistDTO, LoginAuthBean currentUser) {
edc57409   姜超   feature(*): 考评奖惩分配
366
367
368
369
370
371
372
373
374
375
376
377
          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(*): 数据录入修改
378
379
          //删除之前的分配
          evalRewardDistDetailService.update(Wrappers.<EvalRewardDistDetail>lambdaUpdate()
beac6c98   姜超   feature(*): 分配查询
380
                  .eq(EvalRewardDistDetail::getDistId, rewardDistId)
9ecc8f2d   姜超   feature(*): 数据录入修改
381
382
383
                  .set(EvalRewardDistDetail::getYn, Boolean.FALSE)
          );
  
edc57409   姜超   feature(*): 考评奖惩分配
384
385
          List<EvalRewardDistDetail> distDetails = Lists.newArrayListWithCapacity(rewardDistDTO.getUsers().size());
          for (EvalRewardDistDetailDTO distDetailDTO : rewardDistDTO.getUsers()) {
9ecc8f2d   姜超   feature(*): 数据录入修改
386
387
              EvalRewardDistDetail evalRewardDistDetail = distDetailDTO.convertPo(rewardDistId);
              distDetails.add(evalRewardDistDetail);
edc57409   姜超   feature(*): 考评奖惩分配
388
389
          }
  
347b9a76   姜超   feature(*): 考评审批
390
391
392
393
394
          approvalBizService.applyApproveDistReward(rewardDist, currentUser);
          evalRewardDistDetailService.saveBatch(distDetails);
          rewardDist.setStatus(EvalRewardDistStatusEnum.APPROVAL);
          evalRewardDistService.saveOrUpdate(rewardDist);
      }
edc57409   姜超   feature(*): 考评奖惩分配
395
  
347b9a76   姜超   feature(*): 考评审批
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
      @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(*): 奖惩分配状态设置
414
415
416
417
418
419
              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(*): 考评审批
420
421
          }
          evalRewardDistService.saveOrUpdate(rewardDist);
edc57409   姜超   feature(*): 考评奖惩分配
422
      }
347b9a76   姜超   feature(*): 考评审批
423
  
ea6b2fd6   姜超   feature(*): 门店奖惩分配
424
  }