Blame view

fw-morax-service/src/main/java/cn/fw/morax/service/biz/salary/SalaryCalcService.java 18.4 KB
5d98df1c   张志伟   feature(*): 开始计算薪资
1
2
  package cn.fw.morax.service.biz.salary;
  
25a37717   张志伟   feature(*): 完成星级变...
3
  import cn.fw.morax.common.utils.StringUtils;
bb9bf27c   张志伟   feature(*): 修复启动报错
4
  import cn.fw.morax.common.utils.ThreadPoolUtil;
5d98df1c   张志伟   feature(*): 开始计算薪资
5
  import cn.fw.morax.domain.bo.salary.SalaryGroupCalculableBO;
2d8a2633   张志伟   feature(*): 薪酬池查询...
6
  import cn.fw.morax.domain.db.kpi.KpiPool;
d4c9039b   张志伟   feature(*): 薪资计算(...
7
8
9
10
  import cn.fw.morax.domain.db.salary.*;
  import cn.fw.morax.domain.enums.ExtraSalaryTypeEnum;
  import cn.fw.morax.domain.enums.SalaryCalMethodEnum;
  import cn.fw.morax.domain.enums.SalaryTypeEnum;
90662047   张志伟   feature(*): 薪资计算
11
  import cn.fw.morax.rpc.ehr.EhrRpcService;
d4c9039b   张志伟   feature(*): 薪资计算(...
12
  import cn.fw.morax.service.biz.calculator.salary.SalaryBaseCalculator;
742b79d4   姜超   feature(calculato...
13
  import cn.fw.morax.service.biz.kpi.KpiPoolCommonService;
d4c9039b   张志伟   feature(*): 薪资计算(...
14
15
  import cn.fw.morax.service.data.salary.*;
  import cn.hutool.core.collection.ListUtil;
5d98df1c   张志伟   feature(*): 开始计算薪资
16
17
  import com.alibaba.fastjson.JSONObject;
  import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
bb9bf27c   张志伟   feature(*): 修复启动报错
18
  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
5d98df1c   张志伟   feature(*): 开始计算薪资
19
  import lombok.Getter;
5d98df1c   张志伟   feature(*): 开始计算薪资
20
  import lombok.extern.slf4j.Slf4j;
d4c9039b   张志伟   feature(*): 薪资计算(...
21
  import org.springframework.beans.factory.annotation.Autowired;
5d98df1c   张志伟   feature(*): 开始计算薪资
22
  import org.springframework.beans.factory.annotation.Value;
bb9bf27c   张志伟   feature(*): 修复启动报错
23
  import org.springframework.data.redis.core.BoundSetOperations;
5d98df1c   张志伟   feature(*): 开始计算薪资
24
25
  import org.springframework.data.redis.core.StringRedisTemplate;
  import org.springframework.stereotype.Service;
90662047   张志伟   feature(*): 薪资计算
26
  import org.springframework.transaction.annotation.Transactional;
5d98df1c   张志伟   feature(*): 开始计算薪资
27
  
90662047   张志伟   feature(*): 薪资计算
28
29
  import java.math.BigDecimal;
  import java.math.RoundingMode;
5d98df1c   张志伟   feature(*): 开始计算薪资
30
  import java.time.LocalDate;
90662047   张志伟   feature(*): 薪资计算
31
  import java.time.YearMonth;
2806f8ef   姜超   feature(bug): 计算...
32
33
  import java.time.temporal.TemporalAdjuster;
  import java.time.temporal.TemporalAdjusters;
d4c9039b   张志伟   feature(*): 薪资计算(...
34
  import java.util.*;
bb9bf27c   张志伟   feature(*): 修复启动报错
35
36
  import java.util.concurrent.RejectedExecutionException;
  import java.util.concurrent.ThreadPoolExecutor;
d4c9039b   张志伟   feature(*): 薪资计算(...
37
  import java.util.stream.Collectors;
bb9bf27c   张志伟   feature(*): 修复启动报错
38
39
  
  import static cn.fw.common.businessvalidator.Validator.BV;
5d98df1c   张志伟   feature(*): 开始计算薪资
40
41
42
43
44
45
46
47
48
  
  /**
   * @author : kurisu
   * @version : 1.0
   * @className : SalaryCalcService
   * @description : 薪资计算类
   * @date : 2022-04-25 16:24
   */
  
5d98df1c   张志伟   feature(*): 开始计算薪资
49
50
51
  @Slf4j
  @Service
  public class SalaryCalcService {
af367da5   张志伟   :zap:
52
      private final SalaryGeneralSettinService salaryGeneralSettinService;
bb9bf27c   张志伟   feature(*): 修复启动报错
53
54
55
      private final SalaryGroupService salaryGroupService;
      private final SalaryGroupUserService salaryGroupUserService;
      private final SalaryPoolService salaryPoolService;
bb9bf27c   张志伟   feature(*): 修复启动报错
56
      private final SalaryGroupProjectService salaryGroupProjectService;
5d98df1c   张志伟   feature(*): 开始计算薪资
57
      private final StringRedisTemplate stringRedisTemplate;
90662047   张志伟   feature(*): 薪资计算
58
      private final EhrRpcService ehrRpcService;
d4c9039b   张志伟   feature(*): 薪资计算(...
59
      private final SalaryPoolDetailService salaryPoolDetailService;
742b79d4   姜超   feature(calculato...
60
61
      private final SalaryPoolCommonService salaryPoolCommonService;
      private final KpiPoolCommonService kpiPoolCommonService;
af367da5   张志伟   :zap:
62
      private final SalaryConfirmBizService salaryConfirmBizService;
4020c162   张志伟   feature(*): 对接财务 ...
63
      private static final List<ExtraSalaryTypeEnum> EXTRA_SALARY_TYPE_ENUM_LIST = ListUtil.toList(ExtraSalaryTypeEnum.AWARD, ExtraSalaryTypeEnum.PENALTY,
bebd53c0   姜超   feature(*): 动态计算 ...
64
              ExtraSalaryTypeEnum.NECESSARY, ExtraSalaryTypeEnum.SUBSIDY, ExtraSalaryTypeEnum.PERSON_TAX);
5d98df1c   张志伟   feature(*): 开始计算薪资
65
66
67
      @Value("${spring.cache.custom.global-prefix}:calculable:salary-group")
      @Getter
      private String calculableSalaryKey;
25a37717   张志伟   feature(*): 完成星级变...
68
69
70
71
72
73
      /**
       * 绩效变动导致重新计算工资的缓存key
       */
      @Value("${spring.cache.custom.global-prefix}:salary-change:salary-recalculate")
      @Getter
      private String retrySalaryCalcKey;
d4c9039b   张志伟   feature(*): 薪资计算(...
74
75
76
      private final Map<SalaryCalMethodEnum, SalaryBaseCalculator> calculatorMap;
  
      @Autowired
af367da5   张志伟   :zap:
77
78
      public SalaryCalcService(final SalaryGeneralSettinService salaryGeneralSettinService,
                               final SalaryGroupService salaryGroupService,
d4c9039b   张志伟   feature(*): 薪资计算(...
79
80
81
82
                               final SalaryGroupUserService salaryGroupUserService,
                               final SalaryPoolService salaryPoolService,
                               final SalaryPoolDetailService salaryPoolDetailService,
                               final SalaryGroupProjectService salaryGroupProjectService,
742b79d4   姜超   feature(calculato...
83
84
                               final SalaryPoolCommonService salaryPoolCommonService,
                               final KpiPoolCommonService kpiPoolCommonService,
d4c9039b   张志伟   feature(*): 薪资计算(...
85
                               final StringRedisTemplate stringRedisTemplate, EhrRpcService ehrRpcService,
af367da5   张志伟   :zap:
86
                               final SalaryConfirmBizService salaryConfirmBizService,
d4c9039b   张志伟   feature(*): 薪资计算(...
87
                               final List<SalaryBaseCalculator> salaryCalculatorList) {
af367da5   张志伟   :zap:
88
          this.salaryGeneralSettinService = salaryGeneralSettinService;
d4c9039b   张志伟   feature(*): 薪资计算(...
89
90
91
92
93
          this.salaryGroupService = salaryGroupService;
          this.salaryGroupUserService = salaryGroupUserService;
          this.salaryPoolService = salaryPoolService;
          this.salaryPoolDetailService = salaryPoolDetailService;
          this.salaryGroupProjectService = salaryGroupProjectService;
742b79d4   姜超   feature(calculato...
94
95
          this.salaryPoolCommonService = salaryPoolCommonService;
          this.kpiPoolCommonService = kpiPoolCommonService;
d4c9039b   张志伟   feature(*): 薪资计算(...
96
97
          this.stringRedisTemplate = stringRedisTemplate;
          this.ehrRpcService = ehrRpcService;
af367da5   张志伟   :zap:
98
          this.salaryConfirmBizService = salaryConfirmBizService;
d4c9039b   张志伟   feature(*): 薪资计算(...
99
100
          this.calculatorMap = salaryCalculatorList.stream().collect(Collectors.toMap(SalaryBaseCalculator::getCalMethod, v -> v));
      }
5d98df1c   张志伟   feature(*): 开始计算薪资
101
102
103
104
105
106
107
  
      /**
       * 准备计算薪酬
       *
       * @param localDate
       */
      public void prepareCalcSalary(final LocalDate localDate) {
6a050328   张志伟   feature(*): 完善薪酬绩...
108
          Set<Long> ids = salaryGroupService.querySalaryGroupIdByDay(localDate);
5d98df1c   张志伟   feature(*): 开始计算薪资
109
110
111
          if (CollectionUtils.isEmpty(ids)) {
              return;
          }
022c7dcd   张志伟   feature(*): 薪资数据上...
112
          String[] array = ids.stream()
bebd53c0   姜超   feature(*): 动态计算 ...
113
114
115
116
117
118
                  .map(salaryGroupId -> new SalaryGroupCalculableBO(salaryGroupId, localDate, Boolean.TRUE))
                  .map(JSONObject::toJSONString)
                  .toArray(String[]::new);
          stringRedisTemplate.opsForSet().add(getCalculableSalaryKey(), array);
      }
  
022c7dcd   张志伟   feature(*): 薪资数据上...
119
  
bebd53c0   姜超   feature(*): 动态计算 ...
120
      /**
5d98df1c   张志伟   feature(*): 开始计算薪资
121
122
123
       * 计算薪资
       */
      public void calculateSalary() {
bb9bf27c   张志伟   feature(*): 修复启动报错
124
125
126
127
128
129
130
131
132
133
          BoundSetOperations<String, String> setOps = stringRedisTemplate.boundSetOps(getCalculableSalaryKey());
          ThreadPoolExecutor threadPool = ThreadPoolUtil.getInstance().getThreadPool();
          List<String> overflowsList = new ArrayList<>();
          String str;
          while ((str = setOps.pop()) != null) {
              final SalaryGroupCalculableBO bo = JSONObject.parseObject(str, SalaryGroupCalculableBO.class);
              if (Objects.isNull(bo)) {
                  continue;
              }
              try {
a8289dd2   姜超   feature(*): 绩效详情接口修改
134
135
136
137
138
139
140
141
142
                  String finalStr = str;
                  threadPool.execute(() -> {
                      try {
                          calculateSalary(bo);
                      } catch (Exception e) {
                          log.error("计算薪资数据失败:{}", bo, e);
                          setOps.add(finalStr);
                      }
                  });
bb9bf27c   张志伟   feature(*): 修复启动报错
143
144
              } catch (RejectedExecutionException re) {
                  overflowsList.add(str);
bb9bf27c   张志伟   feature(*): 修复启动报错
145
              }
bb9bf27c   张志伟   feature(*): 修复启动报错
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
          }
          if (!CollectionUtils.isEmpty(overflowsList)) {
              for (String s : overflowsList) {
                  setOps.add(s);
              }
          }
      }
  
      /**
       * 计算薪资数据
       *
       * @param bo
       */
      public void calculateSalary(SalaryGroupCalculableBO bo) {
          final Long salaryGroupId = bo.getSalaryGroupId();
          final LocalDate localDate = bo.getLocalDate();
d4c9039b   张志伟   feature(*): 薪资计算(...
162
          final boolean calcTotal = Boolean.TRUE.equals(bo.getCalcTotal());
bb9bf27c   张志伟   feature(*): 修复启动报错
163
          SalaryGroup salaryGroup = salaryGroupService.getById(salaryGroupId);
022c7dcd   张志伟   feature(*): 薪资数据上...
164
165
166
167
          if (Objects.isNull(salaryGroup)) {
              log.error("薪酬组[{}]不存在", salaryGroupId);
              return;
          }
bb9bf27c   张志伟   feature(*): 修复启动报错
168
          if (!Boolean.TRUE.equals(salaryGroup.getYn())) {
022c7dcd   张志伟   feature(*): 薪资数据上...
169
              log.error("无法计算被删除的薪酬组数据: [{}]", salaryGroup.getId());
bb9bf27c   张志伟   feature(*): 修复启动报错
170
171
              return;
          }
022c7dcd   张志伟   feature(*): 薪资数据上...
172
  
bb9bf27c   张志伟   feature(*): 修复启动报错
173
174
175
176
177
178
          List<SalaryGroupUser> userList = salaryGroupUserService.list(Wrappers.<SalaryGroupUser>lambdaQuery()
                  .eq(SalaryGroupUser::getSalaryGroupId, salaryGroupId)
                  .eq(SalaryGroupUser::getDataDate, localDate)
                  .eq(SalaryGroupUser::getYn, Boolean.TRUE)
          );
          if (CollectionUtils.isEmpty(userList)) {
022c7dcd   张志伟   feature(*): 薪资数据上...
179
              log.error("薪酬组[{}]不包含任何员工", salaryGroupId);
bb9bf27c   张志伟   feature(*): 修复启动报错
180
181
182
              return;
          }
          for (SalaryGroupUser salaryUser : userList) {
d4c9039b   张志伟   feature(*): 薪资计算(...
183
              calcUserSalary(salaryUser, calcTotal);
bb9bf27c   张志伟   feature(*): 修复启动报错
184
185
186
187
          }
      }
  
      /**
25a37717   张志伟   feature(*): 完成星级变...
188
189
190
191
192
193
194
195
196
197
       * 绩效变动导致的用户薪酬重新计算准备
       */
      public void retryCalcSalary() {
          final String salaryCalcKey = getRetrySalaryCalcKey();
          BoundSetOperations<String, String> setOps = stringRedisTemplate.boundSetOps(salaryCalcKey);
          List<String> failList = new ArrayList<>();
          String str;
          while ((str = setOps.pop()) != null) {
              try {
                  if (StringUtils.isNumber(str)) {
af367da5   张志伟   :zap:
198
                      retryCalcUserSalary(Long.valueOf(str));
25a37717   张志伟   feature(*): 完成星级变...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
                  }
              } catch (Exception ex) {
                  log.error("重新计算薪资数据失败:[{}]", str, ex);
                  failList.add(str);
              }
          }
          if (!CollectionUtils.isEmpty(failList)) {
              for (String s : failList) {
                  setOps.add(s);
              }
          }
      }
  
      /**
af367da5   张志伟   :zap:
213
       * 手动 计算人员薪资
25a37717   张志伟   feature(*): 完成星级变...
214
215
216
217
218
219
220
221
222
223
224
225
226
       *
       * @param salaryGroupUserId
       * @param calcTotal
       */
      public void calcUserSalary(Long salaryGroupUserId, boolean calcTotal) {
          SalaryGroupUser user = salaryGroupUserService.getById(salaryGroupUserId);
          if (Objects.isNull(user) || !Boolean.TRUE.equals(user.getYn())) {
              return;
          }
          calcUserSalary(user, calcTotal);
      }
  
      /**
af367da5   张志伟   :zap:
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
       * 申述后重新计算人员薪资
       *
       * @param salaryGroupUserId
       */
      public void retryCalcUserSalary(Long salaryGroupUserId) {
          SalaryGroupUser user = salaryGroupUserService.getById(salaryGroupUserId);
          if (Objects.isNull(user) || !Boolean.TRUE.equals(user.getYn())) {
              return;
          }
          final Long groupId = user.getGroupId();
          SalaryGeneralSettin settin = salaryGeneralSettinService.getOne(Wrappers.<SalaryGeneralSettin>lambdaQuery()
                          .eq(SalaryGeneralSettin::getYn, Boolean.TRUE)
                          .eq(SalaryGeneralSettin::getGroupId, groupId)
                  , Boolean.FALSE);
          if (Objects.isNull(settin)) {
              settin = salaryGeneralSettinService.initData(groupId);
          }
          String datesOfAppeal = Optional.ofNullable(settin.getDatesOfAppeal()).orElse("3,5");
          int payoffDay = Optional.ofNullable(settin.getPayoffDate()).orElse(15);
          int dayOfMonth = LocalDate.now().getDayOfMonth();
          if (dayOfMonth >= payoffDay) {
              log.error("绩效组人员[{}]_已经超过工资发放时间,无法重新计算", user.getId());
              return;
          }
          String[] daysArr = datesOfAppeal.split(",");
          int startDay = Integer.parseInt(daysArr[0]);
          int endDay = Integer.parseInt(daysArr[1]);
          if (dayOfMonth < startDay || dayOfMonth > endDay) {
              log.error("绩效组人员[{}]_已经超过申述时间,无法重新计算", user.getId());
              return;
          }
          SalaryPool pool = salaryPoolCommonService.inspectionPool(user);
d6c6c804   张志伟   :zap:
259
260
          if (Boolean.TRUE.equals(pool.getPaid())) {
              log.error("绩效组人员[{}] 工资已经发放,无法计算", user.getId());
af367da5   张志伟   :zap:
261
262
263
              return;
          }
          calcUserSalary(pool, user, true);
d6c6c804   张志伟   :zap:
264
          salaryConfirmBizService.retryCreateSalaryConfirmTodo(pool, user, payoffDay);
af367da5   张志伟   :zap:
265
266
267
      }
  
      /**
bb9bf27c   张志伟   feature(*): 修复启动报错
268
269
270
       * 计算用户薪资
       *
       * @param user
bb9bf27c   张志伟   feature(*): 修复启动报错
271
       */
d4c9039b   张志伟   feature(*): 薪资计算(...
272
      public void calcUserSalary(SalaryGroupUser user, boolean calcTotal) {
742b79d4   姜超   feature(calculato...
273
          SalaryPool pool = salaryPoolCommonService.inspectionPool(user);
25a37717   张志伟   feature(*): 完成星级变...
274
          if (Boolean.TRUE.equals(pool.getRegular()) || Boolean.TRUE.equals(pool.getPaid())) {
af367da5   张志伟   :zap:
275
              log.error("绩效组人员[{}] 已确认工资明细或工资已经发放,无法计算", user.getId());
25a37717   张志伟   feature(*): 完成星级变...
276
277
              return;
          }
af367da5   张志伟   :zap:
278
279
280
281
282
283
284
285
286
287
          calcUserSalary(pool, user, calcTotal);
      }
  
      /**
       * 计算用户薪资
       *
       * @param user
       */
      @Transactional(rollbackFor = Exception.class)
      public void calcUserSalary(SalaryPool pool, SalaryGroupUser user, boolean calcTotal) {
90662047   张志伟   feature(*): 薪资计算
288
          final Long salaryGroupId = user.getSalaryGroupId();
d4c9039b   张志伟   feature(*): 薪资计算(...
289
          final LocalDate dataDate = user.getDataDate();
bb9bf27c   张志伟   feature(*): 修复启动报错
290
          List<SalaryGroupProject> salaryProjectList = salaryGroupProjectService.list(Wrappers.<SalaryGroupProject>lambdaQuery()
90662047   张志伟   feature(*): 薪资计算
291
                  .eq(SalaryGroupProject::getSalaryGroupId, salaryGroupId)
bb9bf27c   张志伟   feature(*): 修复启动报错
292
293
                  .eq(SalaryGroupProject::getYn, Boolean.TRUE)
          );
022c7dcd   张志伟   feature(*): 薪资数据上...
294
295
296
297
          if (CollectionUtils.isEmpty(salaryProjectList)) {
              log.error("薪酬组[{}]薪酬项未配置", salaryGroupId);
              return;
          }
d4c9039b   张志伟   feature(*): 薪资计算(...
298
          List<SalaryPoolDetail> detailList = new ArrayList<>();
2cfad1cf   姜超   fix(*): 试用期员工不参与薪酬计算
299
300
301
302
          if (user.getProbationer()) {
              calcProbationSalary(pool, detailList, user);
          } else {
              calcPushMoney(salaryProjectList, user, pool, detailList);
2cfad1cf   姜超   fix(*): 试用期员工不参与薪酬计算
303
          }
e5013ab1   姜超   fix(*): 保存薪酬扣款修改
304
          calcExtraMoney(pool, dataDate, detailList);
d4c9039b   张志伟   feature(*): 薪资计算(...
305
306
          saveSalaryPoolDetails(detailList, pool.getId(), dataDate);
          if (calcTotal) {
d5758476   姜超   feature(indicator...
307
              calcTotal(pool, detailList, user);
90662047   张志伟   feature(*): 薪资计算
308
          }
90662047   张志伟   feature(*): 薪资计算
309
310
311
      }
  
      /**
d4c9039b   张志伟   feature(*): 薪资计算(...
312
313
314
315
316
       * 计算总金额
       *
       * @param pool
       * @param detailList
       */
d5758476   姜超   feature(indicator...
317
      private void calcTotal(SalaryPool pool, List<SalaryPoolDetail> detailList, SalaryGroupUser user) {
d4c9039b   张志伟   feature(*): 薪资计算(...
318
319
320
          if (CollectionUtils.isEmpty(detailList)) {
              return;
          }
022c7dcd   张志伟   feature(*): 薪资数据上...
321
          if (!user.getProbationer()) {
d518bacc   姜超   fix(salary): 计算薪资修改
322
323
              KpiPool kpiPool = kpiPoolCommonService.queryPool(pool);
              if (Objects.nonNull(kpiPool)) {
022c7dcd   张志伟   feature(*): 薪资数据上...
324
                  pool.setStarLevel(kpiPool.getActualStar());
d518bacc   姜超   fix(salary): 计算薪资修改
325
              }
2d8a2633   张志伟   feature(*): 薪酬池查询...
326
          }
d4c9039b   张志伟   feature(*): 薪资计算(...
327
328
329
          BigDecimal total = BigDecimal.ZERO;
          for (SalaryPoolDetail detail : detailList) {
              BigDecimal actualSalaryAmount = detail.getActualSalaryAmount();
022c7dcd   张志伟   feature(*): 薪资数据上...
330
331
              SalaryTypeEnum salaryType = detail.getType();
              total = salaryType.isPlus() ? total.add(actualSalaryAmount) : total.subtract(actualSalaryAmount);
d4c9039b   张志伟   feature(*): 薪资计算(...
332
333
          }
          pool.setReward(total);
d5758476   姜超   feature(indicator...
334
          pool.setDataDate(user.getDataDate());
d4c9039b   张志伟   feature(*): 薪资计算(...
335
336
337
338
339
340
341
342
          salaryPoolService.updateById(pool);
      }
  
      /**
       * 保存薪资明细
       *
       * @param detailList
       */
25a37717   张志伟   feature(*): 完成星级变...
343
      private void saveSalaryPoolDetails(List<SalaryPoolDetail> detailList, Long poolId, LocalDate date) {
d4c9039b   张志伟   feature(*): 薪资计算(...
344
345
346
347
348
349
350
351
352
          if (CollectionUtils.isEmpty(detailList)) {
              return;
          }
          salaryPoolDetailService.remove(Wrappers.<SalaryPoolDetail>lambdaQuery()
                  .eq(SalaryPoolDetail::getSalaryPoolId, poolId)
                  .eq(SalaryPoolDetail::getSalaryDate, date)
          );
          salaryPoolDetailService.saveBatch(detailList);
      }
90662047   张志伟   feature(*): 薪资计算
353
354
  
      /**
d4c9039b   张志伟   feature(*): 薪资计算(...
355
       * 计算绩效金额
90662047   张志伟   feature(*): 薪资计算
356
       *
d4c9039b   张志伟   feature(*): 薪资计算(...
357
       * @param salaryProjectList
90662047   张志伟   feature(*): 薪资计算
358
       * @param user
d4c9039b   张志伟   feature(*): 薪资计算(...
359
360
       * @param pool
       * @param detailList
90662047   张志伟   feature(*): 薪资计算
361
       */
d4c9039b   张志伟   feature(*): 薪资计算(...
362
      private void calcPushMoney(List<SalaryGroupProject> salaryProjectList, SalaryGroupUser user, SalaryPool pool, List<SalaryPoolDetail> detailList) {
9c8be510   张志伟   :fire:
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
          for (SalaryGroupProject salaryGroupProject : salaryProjectList) {
              final String salaryProjectName = salaryGroupProject.getName();
              SalaryBaseCalculator calculator = calculatorMap.get(salaryGroupProject.getCalMethod());
              if (Objects.isNull(calculator)) {
                  log.error("[{}_{}]计算器不存在", salaryGroupProject.getId(), salaryProjectName);
                  return;
              }
              final BigDecimal salaryMoney = calculator.calculate(salaryGroupProject, user);
              if (Objects.nonNull(salaryMoney)) {
                  SalaryPoolDetail detail = createDetail(pool, user.getDataDate());
                  detail.setSalaryGroupProjectId(salaryGroupProject.getId());
                  detail.setSalaryGroupProjectName(salaryProjectName);
                  detail.setSalaryAmount(salaryMoney);
                  detail.setActualSalaryAmount(salaryMoney);
                  detailList.add(detail);
              }
          }
d4c9039b   张志伟   feature(*): 薪资计算(...
380
      }
19bd7f47   张志伟   feature(*): 薪资计算(...
381
  
d4c9039b   张志伟   feature(*): 薪资计算(...
382
383
384
385
386
387
388
389
390
391
392
393
394
395
      /**
       * 计算额外金额
       *
       * @param pool
       * @param date
       * @param detailList
       */
      private void calcExtraMoney(SalaryPool pool, LocalDate date, List<SalaryPoolDetail> detailList) {
          SalaryBaseCalculator calculator = calculatorMap.get(SalaryCalMethodEnum.DYNAMIC);
          BV.notNull(calculator, () -> "动态金额计算器不存在");
          for (ExtraSalaryTypeEnum extraSalaryTypeEnum : EXTRA_SALARY_TYPE_ENUM_LIST) {
              SalaryPoolDetail salaryPoolDetail = calculator.calcDynamicMoney(pool, date, extraSalaryTypeEnum);
              detailList.add(salaryPoolDetail);
          }
5d98df1c   张志伟   feature(*): 开始计算薪资
396
397
      }
  
90662047   张志伟   feature(*): 薪资计算
398
399
400
      /**
       * 计算试用期工资
       *
d4c9039b   张志伟   feature(*): 薪资计算(...
401
402
       * @param pool
       * @param detailList
90662047   张志伟   feature(*): 薪资计算
403
404
       * @param user
       */
d4c9039b   张志伟   feature(*): 薪资计算(...
405
      private void calcProbationSalary(SalaryPool pool, List<SalaryPoolDetail> detailList, SalaryGroupUser user) {
90662047   张志伟   feature(*): 薪资计算
406
407
          int count = salaryGroupUserService.count(Wrappers.<SalaryGroupUser>lambdaQuery()
                  .eq(SalaryGroupUser::getUserId, user.getUserId())
6a050328   张志伟   feature(*): 完善薪酬绩...
408
409
                  .eq(SalaryGroupUser::getPostId, user.getPostId())
                  .eq(SalaryGroupUser::getShopId, user.getShopId())
90662047   张志伟   feature(*): 薪资计算
410
                  .eq(SalaryGroupUser::getProbationer, Boolean.TRUE)
e5ed7b64   张志伟   feature(*): 薪资计算(...
411
                  .eq(SalaryGroupUser::getFrozen, Boolean.FALSE)
90662047   张志伟   feature(*): 薪资计算
412
                  .eq(SalaryGroupUser::getYn, Boolean.TRUE)
2806f8ef   姜超   feature(bug): 计算...
413
                  .ge(SalaryGroupUser::getDataDate, user.getDataDate().with(TemporalAdjusters.firstDayOfMonth()))
90662047   张志伟   feature(*): 薪资计算
414
415
416
                  .le(SalaryGroupUser::getDataDate, user.getDataDate())
          );
          if (count <= 0) {
d4c9039b   张志伟   feature(*): 薪资计算(...
417
              return;
90662047   张志伟   feature(*): 薪资计算
418
          }
90662047   张志伟   feature(*): 薪资计算
419
          int lengthOfMonth = YearMonth.from(user.getDataDate()).lengthOfMonth();
7a2c020a   姜超   feature(bug): 试用...
420
          BigDecimal dayP = new BigDecimal(count).divide(new BigDecimal(lengthOfMonth), 2, RoundingMode.DOWN);
90662047   张志伟   feature(*): 薪资计算
421
422
          BigDecimal baseValue = ehrRpcService.queryProbationerSalary(user.getUserId(), user.getDataDate());
          BV.notNull(baseValue, () -> "试用期工资查询失败");
7a2c020a   姜超   feature(bug): 试用...
423
          BigDecimal probationSalary = baseValue.multiply(dayP).divide(BigDecimal.ONE, 2, RoundingMode.DOWN);
d4c9039b   张志伟   feature(*): 薪资计算(...
424
425
426
427
428
          SalaryPoolDetail detail = createDetail(pool, user.getDataDate());
          detail.setType(SalaryTypeEnum.PROBATION);
          detail.setSalaryAmount(probationSalary);
          detail.setActualSalaryAmount(probationSalary);
          detailList.add(detail);
90662047   张志伟   feature(*): 薪资计算
429
      }
5d98df1c   张志伟   feature(*): 开始计算薪资
430
  
d4c9039b   张志伟   feature(*): 薪资计算(...
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
      /**
       * 创建实体
       *
       * @param pool
       * @param date
       * @return
       */
      private SalaryPoolDetail createDetail(SalaryPool pool, LocalDate date) {
          SalaryPoolDetail poolDetail = new SalaryPoolDetail();
          poolDetail.setSalaryPoolId(pool.getId());
          poolDetail.setType(SalaryTypeEnum.ROYALTIES);
          poolDetail.setProcessedAmount(BigDecimal.ZERO);
          poolDetail.setSalaryAmount(BigDecimal.ZERO);
          poolDetail.setActualSalaryAmount(BigDecimal.ZERO);
          poolDetail.setSalaryDate(date);
          poolDetail.setGroupId(pool.getGroupId());
          poolDetail.setYn(Boolean.TRUE);
          return poolDetail;
      }
2f26f193   姜超   feature(*): 个税导入、...
450
  
5d98df1c   张志伟   feature(*): 开始计算薪资
451
  }