Blame view

fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupUserTask.java 4.9 KB
ac84063e   姜超   feature(*): 考评人员
1
2
3
4
5
6
7
  package cn.fw.morax.server.task;
  
  import cn.fw.common.cache.locker.DistributedLocker;
  import cn.fw.morax.common.constant.TimeTaskConstant;
  import cn.fw.morax.common.utils.PublicUtil;
  import cn.fw.morax.domain.db.eval.EvalGroup;
  import cn.fw.morax.domain.db.eval.EvalGroupUser;
ac84063e   姜超   feature(*): 考评人员
8
9
10
11
12
13
  import cn.fw.morax.service.biz.eval.EvalGroupBizService;
  import cn.fw.morax.service.biz.eval.EvalGroupUserBizService;
  import cn.fw.morax.service.data.eval.EvalGroupUserService;
  import cn.hutool.core.date.StopWatch;
  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  import com.google.common.collect.Lists;
7d59a85e   姜超   feature(*): redis...
14
  import lombok.Getter;
ac84063e   姜超   feature(*): 考评人员
15
16
17
  import lombok.RequiredArgsConstructor;
  import lombok.extern.slf4j.Slf4j;
  import org.redisson.api.RLock;
7d59a85e   姜超   feature(*): redis...
18
  import org.springframework.beans.factory.annotation.Value;
ac84063e   姜超   feature(*): 考评人员
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  import org.springframework.scheduling.annotation.Scheduled;
  import org.springframework.stereotype.Component;
  import org.springframework.transaction.annotation.Transactional;
  
  import java.time.LocalDate;
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
  import java.util.concurrent.TimeUnit;
  import java.util.concurrent.locks.Lock;
  import java.util.stream.Collectors;
  
  /**
   * @author : jiangchao
   * @className : KpiGroupStatusTask
   * @description : 考评组人员定时器
   * @date : 2022-04-07 15:29
   */
  @Component
  @Slf4j
  @RequiredArgsConstructor
  @ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
  public class EvalGroupUserTask {
  
      private final EvalGroupUserBizService evalGroupUserBizService;
      private final EvalGroupUserService evalGroupUserService;
ac84063e   姜超   feature(*): 考评人员
46
47
      private final DistributedLocker distributedLocker;
  
7d59a85e   姜超   feature(*): redis...
48
49
50
      @Value("${spring.cache.custom.global-prefix}:eval:group:user")
      @Getter
      private String evalGroupUserDistKey;
ac84063e   姜超   feature(*): 考评人员
51
52
53
54
55
56
57
58
59
  
      /**
       * 每天凌晨30分执行(人事角色、岗位调整在5点执行)
       * 1. 将待生效数据改为生效中
       * 2. 将之前的配置设置为失效
       * 3. 处理重复数据,合并、拆分门店的考评组配置需要把其他的重复配置失效
       */
      @Scheduled(cron = TimeTaskConstant.EVAL_GROUP_USER)
      @Transactional(rollbackFor = Exception.class)
936e630c   姜超   feature(*): 门店奖惩分配
60
      public void processEvalUser() {
7d59a85e   姜超   feature(*): redis...
61
          Lock lock = distributedLocker.lock(getEvalGroupUserDistKey());
ac84063e   姜超   feature(*): 考评人员
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
          if (((RLock) lock).isLocked()) {
              try {
                  log.info("定时任务【考评组人员更新】开始执行");
                  StopWatch stopWatch = new StopWatch();
                  stopWatch.start("考评组人员更新,查询人事系统人员状态");
                  //查询员工
                  LocalDate yesterday = LocalDate.now().minusDays(1);
                  List<EvalGroupUser> evalGroupUsersForSave = this.queryKpiStaff(yesterday);
                  stopWatch.stop();
                  if (PublicUtil.isEmpty(evalGroupUsersForSave)) {
                      log.info(stopWatch.prettyPrint());
                      return;
                  }
                  stopWatch.start("考评组人员保存,保存条数:"+ evalGroupUsersForSave.size());
                  //逻辑删除今天已保存人员,保存人员
                  Set<Long> kpiGroupIds = evalGroupUsersForSave.stream().map(EvalGroupUser::getEvalGroupId).collect(Collectors.toSet());
                  evalGroupUserService.update(Wrappers.<EvalGroupUser>lambdaUpdate()
                          .in(EvalGroupUser::getEvalGroupId, kpiGroupIds)
                          .eq(EvalGroupUser::getDataDate, yesterday)
                          .eq(EvalGroupUser::getYn, Boolean.TRUE)
                          .set(EvalGroupUser::getYn, Boolean.FALSE)
                  );
                  evalGroupUserService.saveBatch(evalGroupUsersForSave);
                  stopWatch.stop();
                  log.info(stopWatch.prettyPrint(TimeUnit.SECONDS));
              } catch (Exception e){
                  log.error(e.getMessage(), e);
              } finally {
                  lock.unlock();
              }
          }
      }
  
      /**
       * 查询考评员工
       * @return
       */
      private List<EvalGroupUser> queryKpiStaff(LocalDate yesterday) {
936e630c   姜超   feature(*): 门店奖惩分配
100
          Map<Long, List<EvalGroup>> postKpis = evalGroupUserBizService.postEffectEvalGroups();
ac84063e   姜超   feature(*): 考评人员
101
102
103
104
105
106
107
108
109
110
111
112
113
          if (! postKpis.isEmpty()) {
              log.info("需要生成考评组人员的考评组:{}", postKpis);
          }
          Long postId = null;
          List<EvalGroup> evalGroups = null;
          List<EvalGroupUser> evalGroupUsers = null;
          List<EvalGroupUser> evalGroupUsersForSave = Lists.newArrayListWithCapacity(300);
          for (Map.Entry<Long, List<EvalGroup>> entry : postKpis.entrySet()) {
              postId = entry.getKey();
              evalGroups = entry.getValue();
              evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroups, yesterday).stream()
                      .collect(Collectors.toList());
              evalGroupUsersForSave.addAll(evalGroupUsers);
ac84063e   姜超   feature(*): 考评人员
114
115
116
117
118
          }
          return evalGroupUsersForSave;
      }
  
  }