Blame view

fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/salary/DynamicSalaryCalculator.java 6.24 KB
90662047   张志伟   feature(*): 薪资计算
1
2
  package cn.fw.morax.service.biz.calculator.salary;
  
ac814d59   姜超   feature(bug): 搜索...
3
  import cn.fw.morax.common.utils.DateUtil;
19bd7f47   张志伟   feature(*): 薪资计算(...
4
5
  import cn.fw.morax.domain.db.salary.*;
  import cn.fw.morax.domain.enums.ExtraSalaryTypeEnum;
90662047   张志伟   feature(*): 薪资计算
6
  import cn.fw.morax.domain.enums.SalaryCalMethodEnum;
19bd7f47   张志伟   feature(*): 薪资计算(...
7
  import cn.fw.morax.domain.enums.SalaryTypeEnum;
e5ed7b64   张志伟   feature(*): 薪资计算(...
8
  import cn.fw.morax.service.data.salary.SalaryExtraProjectService;
19bd7f47   张志伟   feature(*): 薪资计算(...
9
  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
90662047   张志伟   feature(*): 薪资计算
10
  import lombok.extern.slf4j.Slf4j;
e5ed7b64   张志伟   feature(*): 薪资计算(...
11
  import org.springframework.beans.factory.annotation.Autowired;
19bd7f47   张志伟   feature(*): 薪资计算(...
12
  import org.springframework.lang.NonNull;
90662047   张志伟   feature(*): 薪资计算
13
14
15
  import org.springframework.stereotype.Component;
  
  import java.math.BigDecimal;
19bd7f47   张志伟   feature(*): 薪资计算(...
16
17
18
19
  import java.time.LocalDate;
  import java.time.LocalDateTime;
  import java.time.YearMonth;
  import java.util.ArrayList;
ac814d59   姜超   feature(bug): 搜索...
20
  import java.util.HashSet;
19bd7f47   张志伟   feature(*): 薪资计算(...
21
22
  import java.util.List;
  import java.util.Optional;
ac814d59   姜超   feature(bug): 搜索...
23
  import java.util.stream.Collectors;
90662047   张志伟   feature(*): 薪资计算
24
25
26
27
28
29
30
31
32
33
34
  
  /**
   * @author : kurisu
   * @version : 1.0
   * @className : DynamicSalaryCalculator
   * @description : 动态薪资计算器
   * @date : 2022-04-27 10:37
   */
  @Component
  @Slf4j
  public class DynamicSalaryCalculator extends SalaryBaseCalculator {
e5ed7b64   张志伟   feature(*): 薪资计算(...
35
36
37
38
39
40
41
42
  
      private final SalaryExtraProjectService salaryExtraProjectService;
  
      @Autowired
      public DynamicSalaryCalculator(final SalaryExtraProjectService salaryExtraProjectService) {
          this.salaryExtraProjectService = salaryExtraProjectService;
      }
  
90662047   张志伟   feature(*): 薪资计算
43
44
      @Override
      public BigDecimal calculate(SalaryGroupProject param1, SalaryGroupUser param2) {
19bd7f47   张志伟   feature(*): 薪资计算(...
45
46
          // 用不到这个计算器
          // 动态金额类不在此计算
90662047   张志伟   feature(*): 薪资计算
47
48
49
          return null;
      }
  
19bd7f47   张志伟   feature(*): 薪资计算(...
50
51
52
53
  
      @Override
      public SalaryPoolDetail calcDynamicMoney(@NonNull SalaryPool pool, @NonNull LocalDate date, @NonNull ExtraSalaryTypeEnum extraSalaryTypeEnum) {
          SalaryPoolDetail poolDetail = createDetail(pool, date, extraSalaryTypeEnum);
6a050328   张志伟   feature(*): 完善薪酬绩...
54
          List<SalaryExtraProject> projectList = queryProjectList(pool, date, extraSalaryTypeEnum);
19bd7f47   张志伟   feature(*): 薪资计算(...
55
56
57
58
          calculate(poolDetail, projectList);
          return poolDetail;
      }
  
90662047   张志伟   feature(*): 薪资计算
59
60
61
62
      @Override
      public SalaryCalMethodEnum getCalMethod() {
          return SalaryCalMethodEnum.DYNAMIC;
      }
19bd7f47   张志伟   feature(*): 薪资计算(...
63
64
  
      private void calculate(SalaryPoolDetail poolDetail, List<SalaryExtraProject> projectList) {
2a2c111e   张志伟   :lipstick:
65
          BigDecimal actualSalaryAmount = projectList.stream()
19bd7f47   张志伟   feature(*): 薪资计算(...
66
67
68
                  .filter(r -> !Boolean.TRUE.equals(r.getTimely()))
                  .map(SalaryExtraProject::getMoney)
                  .reduce(BigDecimal.ZERO, BigDecimal::add);
2a2c111e   张志伟   :lipstick:
69
          BigDecimal processedAmount = projectList.stream()
19bd7f47   张志伟   feature(*): 薪资计算(...
70
71
72
73
74
75
76
77
78
79
80
81
82
                  .filter(r -> Boolean.TRUE.equals(r.getTimely()))
                  .map(SalaryExtraProject::getMoney)
                  .reduce(BigDecimal.ZERO, BigDecimal::add);
          BigDecimal expectedAmount = actualSalaryAmount.add(processedAmount);
  
          poolDetail.setSalaryAmount(expectedAmount);
          poolDetail.setProcessedAmount(processedAmount);
          poolDetail.setActualSalaryAmount(actualSalaryAmount);
      }
  
      /**
       * 查询额外薪资记录
       *
6a050328   张志伟   feature(*): 完善薪酬绩...
83
       * @param pool
19bd7f47   张志伟   feature(*): 薪资计算(...
84
85
86
87
       * @param date
       * @param extraSalaryTypeEnum
       * @return
       */
6a050328   张志伟   feature(*): 完善薪酬绩...
88
      private List<SalaryExtraProject> queryProjectList(SalaryPool pool, LocalDate date, ExtraSalaryTypeEnum extraSalaryTypeEnum) {
19bd7f47   张志伟   feature(*): 薪资计算(...
89
90
          LocalDate startTime = YearMonth.from(date).minusMonths(1L).atEndOfMonth();
          LocalDateTime endTime = date.plusDays(1L).atStartOfDay();
ac814d59   姜超   feature(bug): 搜索...
91
92
93
94
95
96
97
98
  
          //调岗前后还是同一个薪酬组,不算调岗。搜索调岗之前的门店,获取薪酬额外数据
          List<SalaryGroupUser> groupUsers = salaryGroupUserService.list(Wrappers.<SalaryGroupUser>lambdaQuery()
                  .eq(SalaryGroupUser::getSalaryGroupId, pool.getSalaryGroupId())
                  .eq(SalaryGroupUser::getPostId, pool.getPostId())
                  .eq(SalaryGroupUser::getUserId, pool.getUserId())
                  .ge(SalaryGroupUser::getDataDate, startTime)
                  .le(SalaryGroupUser::getDataDate, date)
9018197b   姜超   feature(bug): 搜索...
99
                  .eq(SalaryGroupUser::getYn, Boolean.TRUE)
ac814d59   姜超   feature(bug): 搜索...
100
101
102
          );
          List<Long> shopIds = groupUsers.stream().map(SalaryGroupUser::getShopId).distinct().collect(Collectors.toList());
  
19bd7f47   张志伟   feature(*): 薪资计算(...
103
          List<SalaryExtraProject> list = salaryExtraProjectService.list(Wrappers.<SalaryExtraProject>lambdaQuery()
6a050328   张志伟   feature(*): 完善薪酬绩...
104
                  .eq(SalaryExtraProject::getPostId, pool.getPostId())
ac814d59   姜超   feature(bug): 搜索...
105
                  .in(SalaryExtraProject::getShopId, shopIds)
8515e19e   姜超   feature(salary): ...
106
                  .eq(SalaryExtraProject::getUserId, pool.getUserId())
19bd7f47   张志伟   feature(*): 薪资计算(...
107
108
109
                  .eq(SalaryExtraProject::getSalaryType, extraSalaryTypeEnum)
                  .gt(SalaryExtraProject::getDataDate, startTime)
                  .lt(SalaryExtraProject::getDataDate, endTime)
a44a8569   姜超   feature(morax): 薪...
110
                  .eq(SalaryExtraProject::getYn, Boolean.TRUE)
19bd7f47   张志伟   feature(*): 薪资计算(...
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
          );
          return Optional.ofNullable(list).orElse(new ArrayList<>());
      }
  
      /**
       * 创建实体
       *
       * @param pool
       * @param date
       * @param extraSalaryTypeEnum
       * @return
       */
      private SalaryPoolDetail createDetail(SalaryPool pool, LocalDate date, ExtraSalaryTypeEnum extraSalaryTypeEnum) {
          SalaryPoolDetail poolDetail = new SalaryPoolDetail();
          SalaryTypeEnum salaryTypeEnum = extraSalaryTypeTransform(extraSalaryTypeEnum);
          poolDetail.setSalaryPoolId(pool.getId());
          poolDetail.setType(salaryTypeEnum);
          poolDetail.setSalaryAmount(BigDecimal.ZERO);
          poolDetail.setProcessedAmount(BigDecimal.ZERO);
          poolDetail.setActualSalaryAmount(BigDecimal.ZERO);
          poolDetail.setSalaryDate(date);
          poolDetail.setGroupId(pool.getGroupId());
          poolDetail.setYn(Boolean.TRUE);
          return poolDetail;
      }
  
      /**
       * 枚举类型转换
       *
       * @param extraSalaryTypeEnum
       * @return
       */
      private SalaryTypeEnum extraSalaryTypeTransform(ExtraSalaryTypeEnum extraSalaryTypeEnum) {
          SalaryTypeEnum salaryTypeEnum = SalaryTypeEnum.AWARD;
          switch (extraSalaryTypeEnum) {
              case PENALTY:
                  salaryTypeEnum = SalaryTypeEnum.PENALTY;
                  break;
              case NECESSARY:
                  salaryTypeEnum = SalaryTypeEnum.NECESSARY;
                  break;
              case SUBSIDY:
                  salaryTypeEnum = SalaryTypeEnum.SUBSIDY;
                  break;
bebd53c0   姜超   feature(*): 动态计算 ...
155
156
157
              case PERSON_TAX:
                  salaryTypeEnum = SalaryTypeEnum.PERSON_TAX;
                  break;
19bd7f47   张志伟   feature(*): 薪资计算(...
158
159
160
161
162
              default:
                  break;
          }
          return salaryTypeEnum;
      }
90662047   张志伟   feature(*): 薪资计算
163
  }