Commit af367da50058c39f633904cd16d223bceb831245

Authored by 张志伟
1 parent 3d4edc47

:zap: feature(*): 申述后的薪资计算

- 申述后的薪资计算和薪酬确认待办推送(50%)
fw-morax-common/src/main/java/cn/fw/morax/common/pojo/event/KpiStarAdjustmentEvent.java
... ... @@ -12,16 +12,12 @@ import java.time.YearMonth;
12 12 @AllArgsConstructor
13 13 @NoArgsConstructor
14 14 public class KpiStarAdjustmentEvent {
15   -
16 15 /**
17 16 * 用户id
18 17 */
19 18 private Long userId;
20   -
21   -
22 19 /**
23 20 * 调整月份
24 21 */
25 22 private YearMonth yearMonth;
26   -
27 23 }
... ...
fw-morax-common/src/main/java/cn/fw/morax/common/pojo/event/PaySalaryEvent.java
... ... @@ -5,7 +5,6 @@ import lombok.Builder;
5 5 import lombok.Data;
6 6 import lombok.NoArgsConstructor;
7 7  
8   -import java.math.BigDecimal;
9 8 import java.time.YearMonth;
10 9  
11 10 @Data
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/task/GenericTask.java
... ... @@ -2,6 +2,7 @@ package cn.fw.morax.server.task;
2 2  
3 3 import lombok.extern.slf4j.Slf4j;
4 4 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  5 +import org.springframework.scheduling.annotation.Scheduled;
5 6 import org.springframework.stereotype.Component;
6 7  
7 8 /**
... ... @@ -17,4 +18,11 @@ import org.springframework.stereotype.Component;
17 18 @Slf4j
18 19 @ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
19 20 public class GenericTask {
  21 + /**
  22 + * 固定绩效数据
  23 + */
  24 + @Scheduled(cron = "0 0 5 * * ?")
  25 + public void persistence() {
  26 +
  27 + }
20 28 }
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/task/PayoffTask.java
... ... @@ -57,16 +57,16 @@ public class PayoffTask {
57 57 }
58 58  
59 59 /**
60   - * 发放工资
  60 + * 发放工资 [工资单数据推送财务系统]
61 61 * [暂时不对接财务]
62 62 */
63 63 // @Scheduled(initialDelay = 1000L * 20, fixedRate = 1000L * 20)
64 64 public void go2pay() {
65   - // payoffBizService.go2payoff();
  65 + // payoffBizService.go2payoff();
66 66 }
67 67  
68 68 /**
69   - * 生成工资单
  69 + * 生成工资单[工资发放记录]
70 70 * 每两个小时执行
71 71 */
72 72 @Scheduled(cron = "0 0 0/2 * * ?")
... ... @@ -96,9 +96,9 @@ public class PayoffTask {
96 96 }
97 97  
98 98 /**
99   - * 每隔两小时检查待办推送
  99 + * 每5分钟检查待办推送
100 100 */
101   - @Scheduled(cron = "0 0/10 * * * ?")
  101 + @Scheduled(cron = "0 0/5 * * * ?")
102 102 public void pushTodo() {
103 103 salaryConfirmBizService.pushConfirm();
104 104 }
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryCalcTask.java
... ... @@ -62,9 +62,9 @@ public class SalaryCalcTask {
62 62 }
63 63  
64 64 /**
65   - * 星级申请变更后重新计算用户工资 每180秒执行一次
  65 + * 星级申请变更后重新计算用户工资 每300秒执行一次
66 66 */
67   - @Scheduled(initialDelay = 1000L * 5, fixedRate = 1000L * 180)
  67 + @Scheduled(initialDelay = 1000L * 5, fixedRate = 1000L * 300)
68 68 @Async
69 69 public void kpiChangeRetryCalcSalary() {
70 70 salaryCalcService.retryCalcSalary();
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/salary/PayoffBizService.java
... ... @@ -120,29 +120,30 @@ public class PayoffBizService {
120 120 .eq(SalaryGeneralSettin::getYn, Boolean.TRUE)
121 121 .eq(SalaryGeneralSettin::getGroupId, groupId)
122 122 , Boolean.FALSE);
123   - int payoffDate = Optional.ofNullable(settin.getPayoffDate()).orElse(10);
  123 + int payoffDate = Optional.ofNullable(settin.getPayoffDate()).orElse(15);
124 124 int dayOfMonth = LocalDate.now().getDayOfMonth();
125   - if (dayOfMonth >= payoffDate) {
126   - List<SalaryPool> salaryPoolList = salaryPoolService.list(Wrappers.<SalaryPool>lambdaQuery()
127   - .eq(SalaryPool::getMonthly, YearMonth.now().minusMonths(1))
128   - .eq(SalaryPool::getPaid, Boolean.FALSE)
129   - .eq(SalaryPool::getRegular, Boolean.TRUE)
130   - .eq(SalaryPool::getYn, Boolean.TRUE)
131   - );
132   - if (CollectionUtils.isEmpty(salaryPoolList)) {
133   - return;
134   - }
135   - for (SalaryPool salaryPool : salaryPoolList) {
136   - try {
137   - autoConfirmTodoNotice(salaryPool.getId());
138   - createSalarySheet(salaryPool, BigDecimal.valueOf(settin.getPayoffLimit()));
139   - salaryPool.setPaid(Boolean.TRUE);
140   - } catch (Exception e) {
141   - log.error("生产工资发放记录失败 -> pooId: [{}]", salaryPool.getId(), e);
142   - }
  125 + if (dayOfMonth != payoffDate) {
  126 + return;
  127 + }
  128 + List<SalaryPool> salaryPoolList = salaryPoolService.list(Wrappers.<SalaryPool>lambdaQuery()
  129 + .eq(SalaryPool::getMonthly, YearMonth.now().minusMonths(1))
  130 + .eq(SalaryPool::getPaid, Boolean.FALSE)
  131 + .eq(SalaryPool::getYn, Boolean.TRUE)
  132 + );
  133 + if (CollectionUtils.isEmpty(salaryPoolList)) {
  134 + return;
  135 + }
  136 + for (SalaryPool salaryPool : salaryPoolList) {
  137 + try {
  138 + autoConfirmTodoNotice(salaryPool.getId());
  139 + createSalarySheet(salaryPool, BigDecimal.valueOf(settin.getPayoffLimit()));
  140 + salaryPool.setRegular(Boolean.TRUE);
  141 + salaryPool.setPaid(Boolean.TRUE);
  142 + } catch (Exception e) {
  143 + log.error("生产工资发放记录失败 -> pooId: [{}]", salaryPool.getId(), e);
143 144 }
144   - salaryPoolService.updateBatchById(salaryPoolList);
145 145 }
  146 + salaryPoolService.updateBatchById(salaryPoolList);
146 147 }
147 148  
148 149  
... ... @@ -164,7 +165,6 @@ public class PayoffBizService {
164 165 if (maxAmount.compareTo(BigDecimal.ZERO) > 0 && reward.compareTo(maxAmount) > 0) {
165 166 corporateRecord.setAmount(maxAmount);
166 167 list.add(corporateRecord);
167   -
168 168 PayrollRecord record = new PayrollRecord();
169 169 BeanUtils.copyProperties(corporateRecord, record);
170 170 record.setCorporate(Boolean.FALSE);
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/salary/SalaryCalcService.java
... ... @@ -47,6 +47,7 @@ import static cn.fw.common.businessvalidator.Validator.BV;
47 47 @Slf4j
48 48 @Service
49 49 public class SalaryCalcService {
  50 + private final SalaryGeneralSettinService salaryGeneralSettinService;
50 51 private final SalaryGroupService salaryGroupService;
51 52 private final SalaryGroupUserService salaryGroupUserService;
52 53 private final SalaryPoolService salaryPoolService;
... ... @@ -56,6 +57,7 @@ public class SalaryCalcService {
56 57 private final SalaryPoolDetailService salaryPoolDetailService;
57 58 private final SalaryPoolCommonService salaryPoolCommonService;
58 59 private final KpiPoolCommonService kpiPoolCommonService;
  60 + private final SalaryConfirmBizService salaryConfirmBizService;
59 61 private static final List<ExtraSalaryTypeEnum> EXTRA_SALARY_TYPE_ENUM_LIST = ListUtil.toList(ExtraSalaryTypeEnum.AWARD, ExtraSalaryTypeEnum.PENALTY,
60 62 ExtraSalaryTypeEnum.NECESSARY, ExtraSalaryTypeEnum.SUBSIDY, ExtraSalaryTypeEnum.PERSON_TAX);
61 63 @Value("${spring.cache.custom.global-prefix}:calculable:salary-group")
... ... @@ -70,7 +72,8 @@ public class SalaryCalcService {
70 72 private final Map<SalaryCalMethodEnum, SalaryBaseCalculator> calculatorMap;
71 73  
72 74 @Autowired
73   - public SalaryCalcService(final SalaryGroupService salaryGroupService,
  75 + public SalaryCalcService(final SalaryGeneralSettinService salaryGeneralSettinService,
  76 + final SalaryGroupService salaryGroupService,
74 77 final SalaryGroupUserService salaryGroupUserService,
75 78 final SalaryPoolService salaryPoolService,
76 79 final SalaryPoolDetailService salaryPoolDetailService,
... ... @@ -78,7 +81,9 @@ public class SalaryCalcService {
78 81 final SalaryPoolCommonService salaryPoolCommonService,
79 82 final KpiPoolCommonService kpiPoolCommonService,
80 83 final StringRedisTemplate stringRedisTemplate, EhrRpcService ehrRpcService,
  84 + final SalaryConfirmBizService salaryConfirmBizService,
81 85 final List<SalaryBaseCalculator> salaryCalculatorList) {
  86 + this.salaryGeneralSettinService = salaryGeneralSettinService;
82 87 this.salaryGroupService = salaryGroupService;
83 88 this.salaryGroupUserService = salaryGroupUserService;
84 89 this.salaryPoolService = salaryPoolService;
... ... @@ -88,6 +93,7 @@ public class SalaryCalcService {
88 93 this.kpiPoolCommonService = kpiPoolCommonService;
89 94 this.stringRedisTemplate = stringRedisTemplate;
90 95 this.ehrRpcService = ehrRpcService;
  96 + this.salaryConfirmBizService = salaryConfirmBizService;
91 97 this.calculatorMap = salaryCalculatorList.stream().collect(Collectors.toMap(SalaryBaseCalculator::getCalMethod, v -> v));
92 98 }
93 99  
... ... @@ -187,7 +193,7 @@ public class SalaryCalcService {
187 193 while ((str = setOps.pop()) != null) {
188 194 try {
189 195 if (StringUtils.isNumber(str)) {
190   - calcUserSalary(Long.valueOf(str), true);
  196 + retryCalcUserSalary(Long.valueOf(str));
191 197 }
192 198 } catch (Exception ex) {
193 199 log.error("重新计算薪资数据失败:[{}]", str, ex);
... ... @@ -202,7 +208,7 @@ public class SalaryCalcService {
202 208 }
203 209  
204 210 /**
205   - * 计算人员薪资
  211 + * 手动 计算人员薪资
206 212 *
207 213 * @param salaryGroupUserId
208 214 * @param calcTotal
... ... @@ -216,16 +222,67 @@ public class SalaryCalcService {
216 222 }
217 223  
218 224 /**
  225 + * 申述后重新计算人员薪资
  226 + *
  227 + * @param salaryGroupUserId
  228 + */
  229 + public void retryCalcUserSalary(Long salaryGroupUserId) {
  230 + SalaryGroupUser user = salaryGroupUserService.getById(salaryGroupUserId);
  231 + if (Objects.isNull(user) || !Boolean.TRUE.equals(user.getYn())) {
  232 + return;
  233 + }
  234 + final Long groupId = user.getGroupId();
  235 + SalaryGeneralSettin settin = salaryGeneralSettinService.getOne(Wrappers.<SalaryGeneralSettin>lambdaQuery()
  236 + .eq(SalaryGeneralSettin::getYn, Boolean.TRUE)
  237 + .eq(SalaryGeneralSettin::getGroupId, groupId)
  238 + , Boolean.FALSE);
  239 + if (Objects.isNull(settin)) {
  240 + settin = salaryGeneralSettinService.initData(groupId);
  241 + }
  242 + String datesOfAppeal = Optional.ofNullable(settin.getDatesOfAppeal()).orElse("3,5");
  243 + int payoffDay = Optional.ofNullable(settin.getPayoffDate()).orElse(15);
  244 + int dayOfMonth = LocalDate.now().getDayOfMonth();
  245 + if (dayOfMonth >= payoffDay) {
  246 + log.error("绩效组人员[{}]_已经超过工资发放时间,无法重新计算", user.getId());
  247 + return;
  248 + }
  249 + String[] daysArr = datesOfAppeal.split(",");
  250 + int startDay = Integer.parseInt(daysArr[0]);
  251 + int endDay = Integer.parseInt(daysArr[1]);
  252 + if (dayOfMonth < startDay || dayOfMonth > endDay) {
  253 + log.error("绩效组人员[{}]_已经超过申述时间,无法重新计算", user.getId());
  254 + return;
  255 + }
  256 + SalaryPool pool = salaryPoolCommonService.inspectionPool(user);
  257 + if (Boolean.TRUE.equals(pool.getRegular()) || Boolean.TRUE.equals(pool.getPaid())) {
  258 + log.error("绩效组人员[{}] 已确认工资明细或工资已经发放,无法计算", user.getId());
  259 + return;
  260 + }
  261 + calcUserSalary(pool, user, true);
  262 + salaryConfirmBizService.retryCreateSalaryConfirmTodo(user);
  263 + }
  264 +
  265 + /**
219 266 * 计算用户薪资
220 267 *
221 268 * @param user
222 269 */
223   - @Transactional(rollbackFor = Exception.class)
224 270 public void calcUserSalary(SalaryGroupUser user, boolean calcTotal) {
225 271 SalaryPool pool = salaryPoolCommonService.inspectionPool(user);
226 272 if (Boolean.TRUE.equals(pool.getRegular()) || Boolean.TRUE.equals(pool.getPaid())) {
  273 + log.error("绩效组人员[{}] 已确认工资明细或工资已经发放,无法计算", user.getId());
227 274 return;
228 275 }
  276 + calcUserSalary(pool, user, calcTotal);
  277 + }
  278 +
  279 + /**
  280 + * 计算用户薪资
  281 + *
  282 + * @param user
  283 + */
  284 + @Transactional(rollbackFor = Exception.class)
  285 + public void calcUserSalary(SalaryPool pool, SalaryGroupUser user, boolean calcTotal) {
229 286 final Long salaryGroupId = user.getSalaryGroupId();
230 287 final LocalDate dataDate = user.getDataDate();
231 288 List<SalaryGroupProject> salaryProjectList = salaryGroupProjectService.list(Wrappers.<SalaryGroupProject>lambdaQuery()
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/salary/SalaryConfirmBizService.java
... ... @@ -8,6 +8,7 @@ import cn.fw.morax.common.utils.EventBusUtil;
8 8 import cn.fw.morax.common.utils.PublicUtil;
9 9 import cn.fw.morax.domain.db.salary.SalaryConfirm;
10 10 import cn.fw.morax.domain.db.salary.SalaryGeneralSettin;
  11 +import cn.fw.morax.domain.db.salary.SalaryGroupUser;
11 12 import cn.fw.morax.domain.db.salary.SalaryPool;
12 13 import cn.fw.morax.domain.enums.SalaryConfirmStatusEnum;
13 14 import cn.fw.morax.rpc.backlog.TodoRpcService;
... ... @@ -19,16 +20,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
19 20 import lombok.Getter;
20 21 import lombok.RequiredArgsConstructor;
21 22 import lombok.extern.slf4j.Slf4j;
22   -import org.redisson.api.RLock;
23 23 import org.springframework.beans.factory.annotation.Value;
24 24 import org.springframework.stereotype.Service;
25 25 import org.springframework.transaction.annotation.Transactional;
26 26 import org.springframework.util.CollectionUtils;
27 27  
  28 +import java.time.LocalDate;
28 29 import java.time.LocalDateTime;
29 30 import java.time.YearMonth;
30 31 import java.util.*;
31   -import java.util.concurrent.locks.Lock;
32 32  
33 33 import static cn.fw.common.businessvalidator.Validator.BV;
34 34  
... ... @@ -80,6 +80,7 @@ public class SalaryConfirmBizService {
80 80 confirm.setConfirmTime(LocalDateTime.now());
81 81 confirm.setConfirmedStatus(SalaryConfirmStatusEnum.CONFIRMED);
82 82 confirm.setSelfConfirm(Boolean.TRUE);
  83 + pool.setRegular(Boolean.TRUE);
83 84 pool.setSignatureFile(fid);
84 85 BackLogItemDTO dto = new BackLogItemDTO(pool.getUserId(), confirm.getTodoCode(), String.valueOf(confirm.getId()), new Date(), pool.getShopId());
85 86 boolean complete = todoRpcService.complete(dto);
... ... @@ -87,6 +88,7 @@ public class SalaryConfirmBizService {
87 88 salaryConfirmService.updateById(confirm);
88 89 salaryPoolService.updateById(pool);
89 90  
  91 + // fixme 这下面的逻辑不太对
90 92 EventBusUtil.asyncPost(PaySalaryEvent.builder()
91 93 .monthly(pool.getMonthly())
92 94 .groupId(pool.getGroupId())
... ... @@ -101,30 +103,63 @@ public class SalaryConfirmBizService {
101 103 *
102 104 * @param groupId
103 105 */
  106 + @Transactional(rollbackFor = Exception.class)
104 107 public void createSalaryConfirmTodo(Long groupId) {
105   - String key = String.format("%s:%s", ":create-salary-confirm-todo", groupId);
106   - Lock lock = distributedLocker.lock(key);
107   - if (!((RLock) lock).isLocked()) {
  108 +// cancelSalaryConfirmTodo();
  109 +// SalaryGeneralSettin settin = salaryGeneralSettinService.getOne(Wrappers.<SalaryGeneralSettin>lambdaQuery()
  110 +// .eq(SalaryGeneralSettin::getYn, Boolean.TRUE)
  111 +// .eq(SalaryGeneralSettin::getGroupId, groupId)
  112 +// , Boolean.FALSE);
  113 +// if (Objects.isNull(settin)) {
  114 +// settin = salaryGeneralSettinService.initData(groupId);
  115 +// }
  116 +// String datesOfAppeal = Optional.ofNullable(settin.getDatesOfAppeal()).orElse("3,5");
  117 +// int payoffDay = Optional.ofNullable(settin.getPayoffDate()).orElse(15);
  118 +// int dayOfMonth = LocalDate.now().getDayOfMonth();
  119 +// if (dayOfMonth >= payoffDay) {
  120 +// return;
  121 +// }
  122 +// String[] daysArr = datesOfAppeal.split(",");
  123 +// int startDay = Integer.parseInt(daysArr[0]);
  124 +// if (dayOfMonth < startDay) {
  125 +// return;
  126 +// }
  127 +// final LocalDateTime planTime = YearMonth.now().atDay(startDay).atTime(9, 0, 0);
  128 +// final LocalDateTime deadline = YearMonth.now().atDay(payoffDay).minusDays(1L).atTime(23, 59, 59);
  129 +// createConfirms(planTime, deadline, groupId);
  130 + }
  131 +
  132 + /**
  133 + * 申述后重新生成薪资确认待办(申述成功后)
  134 + *
  135 + * @param user 薪酬组用户信息
  136 + */
  137 + @Transactional(rollbackFor = Exception.class)
  138 + public void retryCreateSalaryConfirmTodo(SalaryGroupUser user) {
  139 + final Long groupId = user.getGroupId();
  140 + SalaryGeneralSettin settin = salaryGeneralSettinService.getOne(Wrappers.<SalaryGeneralSettin>lambdaQuery()
  141 + .eq(SalaryGeneralSettin::getYn, Boolean.TRUE)
  142 + .eq(SalaryGeneralSettin::getGroupId, groupId)
  143 + , Boolean.FALSE);
  144 + if (Objects.isNull(settin)) {
  145 + settin = salaryGeneralSettinService.initData(groupId);
  146 + }
  147 + String datesOfAppeal = Optional.ofNullable(settin.getDatesOfAppeal()).orElse("3,5");
  148 + int payoffDay = Optional.ofNullable(settin.getPayoffDate()).orElse(15);
  149 + int dayOfMonth = LocalDate.now().getDayOfMonth();
  150 + if (dayOfMonth >= payoffDay) {
108 151 return;
109 152 }
110   - try {
111   - SalaryGeneralSettin settin = salaryGeneralSettinService.getOne(Wrappers.<SalaryGeneralSettin>lambdaQuery()
112   - .eq(SalaryGeneralSettin::getYn, Boolean.TRUE)
113   - .eq(SalaryGeneralSettin::getGroupId, groupId)
114   - , Boolean.FALSE);
115   - if (Objects.isNull(settin)) {
116   - settin = salaryGeneralSettinService.initData(groupId);
117   - }
118   - String datesOfAppeal = Optional.ofNullable(settin.getDatesOfAppeal()).orElse("3,5");
119   - String[] daysArr = datesOfAppeal.split(",");
120   - int day = Integer.parseInt(daysArr[0]);
121   - final LocalDateTime planTime = YearMonth.now().atDay(day).atTime(9, 0,0);
122   - int endDay = Integer.parseInt(daysArr[1]);
123   - final LocalDateTime deadline = YearMonth.now().atDay(endDay).atTime(23, 59, 59);
124   - createConfirms(planTime, deadline, groupId);
125   - } finally {
126   - lock.unlock();
  153 + String[] daysArr = datesOfAppeal.split(",");
  154 + int startDay = Integer.parseInt(daysArr[0]);
  155 + int endDay = Integer.parseInt(daysArr[1]);
  156 + if (dayOfMonth < startDay || dayOfMonth > endDay) {
  157 + log.error("超过申述时间");
  158 + return;
127 159 }
  160 + final LocalDateTime planTime = YearMonth.now().atDay(startDay).atTime(9, 0, 0);
  161 + final LocalDateTime deadline = YearMonth.now().atDay(payoffDay).minusDays(1L).atTime(23, 59, 59);
  162 + createConfirms(planTime, deadline, groupId);
128 163 }
129 164  
130 165 /**
... ... @@ -136,7 +171,7 @@ public class SalaryConfirmBizService {
136 171 .gt(SalaryConfirm::getDeadline, LocalDateTime.now().plusHours(2L))
137 172 .eq(SalaryConfirm::getPushedTodo, Boolean.FALSE)
138 173 .eq(SalaryConfirm::getYn, Boolean.TRUE)
139   - .last(" limit 500 ")
  174 + .last(" limit 1500 ")
140 175 );
141 176 if (CollectionUtils.isEmpty(list)) {
142 177 return;
... ... @@ -147,12 +182,20 @@ public class SalaryConfirmBizService {
147 182 salaryConfirmService.updateBatchById(list);
148 183 }
149 184  
  185 + /**
  186 + * 取消存在的待办 todo
  187 + *
  188 + * @param user
  189 + */
  190 + private void cancelSalaryConfirmTodo(SalaryGroupUser user) {
  191 +
  192 + }
  193 +
150 194 private void createConfirms(final LocalDateTime planTime, final LocalDateTime deadline, final Long groupId) {
151 195 List<SalaryPool> list = salaryPoolService.list(Wrappers.<SalaryPool>lambdaQuery()
152 196 .eq(SalaryPool::getMonthly, YearMonth.now().minusMonths(1L))
153 197 .eq(SalaryPool::getGroupId, groupId)
154 198 .eq(SalaryPool::getPaid, Boolean.FALSE)
155   - .eq(SalaryPool::getRegular, Boolean.TRUE)
156 199 .eq(SalaryPool::getYn, Boolean.TRUE)
157 200 );
158 201 if (CollectionUtils.isEmpty(list)) {
... ... @@ -160,23 +203,10 @@ public class SalaryConfirmBizService {
160 203 }
161 204 List<SalaryConfirm> confirmList = new ArrayList<>();
162 205 for (SalaryPool pool : list) {
163   - int count = salaryConfirmService.count(Wrappers.<SalaryConfirm>lambdaQuery()
164   - .eq(SalaryConfirm::getSalaryPoolId, pool.getId())
165   - .eq(SalaryConfirm::getYn, Boolean.TRUE)
166   - );
167   - if (count > 0) {
  206 + SalaryConfirm confirm = createConfirm(pool, planTime, deadline);
  207 + if (Objects.isNull(confirm)) {
168 208 continue;
169 209 }
170   - SalaryConfirm confirm = new SalaryConfirm();
171   - confirm.setSalaryPoolId(pool.getId());
172   - confirm.setPlanTime(planTime);
173   - confirm.setPushedTodo(Boolean.FALSE);
174   - confirm.setDeadline(deadline);
175   - confirm.setConfirmedStatus(SalaryConfirmStatusEnum.NEED_CONFIRM);
176   - confirm.setSelfConfirm(Boolean.FALSE);
177   - confirm.setGroupId(groupId);
178   - confirm.setYn(Boolean.TRUE);
179   - confirm.setTodoCode(getTodoCode());
180 210 confirmList.add(confirm);
181 211 }
182 212 if (PublicUtil.isNotEmpty(confirmList)) {
... ... @@ -184,6 +214,28 @@ public class SalaryConfirmBizService {
184 214 }
185 215 }
186 216  
  217 + private SalaryConfirm createConfirm(SalaryPool pool, final LocalDateTime planTime, final LocalDateTime deadline) {
  218 + int count = salaryConfirmService.count(Wrappers.<SalaryConfirm>lambdaQuery()
  219 + .eq(SalaryConfirm::getSalaryPoolId, pool.getId())
  220 + .eq(SalaryConfirm::getConfirmedStatus, SalaryConfirmStatusEnum.NEED_CONFIRM)
  221 + .eq(SalaryConfirm::getYn, Boolean.TRUE)
  222 + );
  223 + if (count > 0) {
  224 + return null;
  225 + }
  226 + SalaryConfirm confirm = new SalaryConfirm();
  227 + confirm.setSalaryPoolId(pool.getId());
  228 + confirm.setPlanTime(planTime);
  229 + confirm.setPushedTodo(Boolean.FALSE);
  230 + confirm.setDeadline(deadline);
  231 + confirm.setConfirmedStatus(SalaryConfirmStatusEnum.NEED_CONFIRM);
  232 + confirm.setSelfConfirm(Boolean.FALSE);
  233 + confirm.setGroupId(pool.getGroupId());
  234 + confirm.setYn(Boolean.TRUE);
  235 + confirm.setTodoCode(getTodoCode());
  236 + return confirm;
  237 + }
  238 +
187 239 private void executeSendTodo(SalaryConfirm confirm) {
188 240 SalaryPool salaryPool = salaryPoolService.getById(confirm.getSalaryPoolId());
189 241 if (Objects.isNull(salaryPool)) {
... ...