Commit af367da50058c39f633904cd16d223bceb831245
1 parent
3d4edc47
feature(*): 申述后的薪资计算
- 申述后的薪资计算和薪酬确认待办推送(50%)
Showing
8 changed files
with
188 additions
and
76 deletions
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
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)) { | ... | ... |