Commit 370426394ef06258a298d5791076129257771029
1 parent
32270f03
fix:第二版财务,新增定时任务(应收款订单和应付款订单没有在HOD时间内进行审核,就会发送邮件提醒,提醒业务员和跟单员和财务人员,每隔七天提醒一次)
Showing
3 changed files
with
73 additions
and
48 deletions
src/main/java/com/order/erp/job/FinanceJob.java
... | ... | @@ -6,6 +6,7 @@ import com.order.erp.common.constant.Constant; |
6 | 6 | import com.order.erp.common.utils.EmailSendUtils; |
7 | 7 | import com.order.erp.common.utils.RedisUtils; |
8 | 8 | import com.order.erp.domain.ApplyStatusEnum; |
9 | +import com.order.erp.domain.FinanceEnum; | |
9 | 10 | import com.order.erp.domain.FinanceOverEnum; |
10 | 11 | import com.order.erp.domain.dto.BaseDO; |
11 | 12 | import com.order.erp.domain.dto.admin.AdminUserDO; |
... | ... | @@ -65,6 +66,7 @@ public class FinanceJob { |
65 | 66 | List<AdminUserRoleDO> list = adminUserRoleService.list(new LambdaQueryWrapper<AdminUserRoleDO>() |
66 | 67 | .eq(AdminUserRoleDO::getRoleId, Constant.SEVEN)); |
67 | 68 | Set<Long> userIds= list.stream().map(AdminUserRoleDO::getUserId).collect(Collectors.toSet()); |
69 | + //获取所有财务角色的邮箱。 | |
68 | 70 | List<String> financeEmailList = userIds.stream() |
69 | 71 | .map(userId -> Optional.ofNullable(adminUserDOMap.get(userId)) |
70 | 72 | .map(AdminUserDO::getEmail) |
... | ... | @@ -98,7 +100,7 @@ public class FinanceJob { |
98 | 100 | FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); |
99 | 101 | eventJobVO.setInvoiceBillOrderDO(invoiceBillOrderDO); |
100 | 102 | emailSendUtils.sendEmail(FinanceOverEnum.INVOICE_OVERTIME, new ArrayList<>(emailList), eventJobVO); |
101 | - boolean set = redisService.set(redisKey, invoiceBillOrderDO, Constant.HUNDREDANDFIVE, TimeUnit.DAYS);// 设置为21天后过期 | |
103 | + boolean set = redisService.set(redisKey, invoiceBillOrderDO, Constant.HUNDREDANDFIVE, TimeUnit.DAYS);// 设置为105天后过期 | |
102 | 104 | if(set){ |
103 | 105 | redisService.saddWithExpiry(Constant.REDISKEY,redisKey, Constant.HUNDREDANDFIVE, TimeUnit.DAYS); |
104 | 106 | } |
... | ... | @@ -148,56 +150,79 @@ public class FinanceJob { |
148 | 150 | if (stringListMap != null) { |
149 | 151 | // 获取 InvoiceBillOrderDO 类型的 ID 列表 |
150 | 152 | List<Long> invoiceBillOrderIds = stringListMap.get("InvoiceBillOrderDO"); |
153 | + List<InvoiceBillOrderDO> filteredInvoiceList = new ArrayList<>(); | |
154 | + Set<String> seenInvoices=new HashSet<>(); | |
155 | + List<ProducePaymentCheckBillOrderDO> filteredCheckList = new ArrayList<>(); | |
156 | + Set<String> seenChecks=new HashSet<>(); | |
151 | 157 | if (invoiceBillOrderIds != null && !invoiceBillOrderIds.isEmpty()) { |
152 | 158 | List<InvoiceBillOrderDO> invoiceBillOrderDOS = invoiceBillOrderService.listByIds(invoiceBillOrderIds); |
153 | - invoiceBillOrderDOS.forEach(x->{ | |
154 | - if(ApplyStatusEnum.NO_COMMIT.getStatus()==x.getStatus() || ApplyStatusEnum.AUDIT_REFUSE.getStatus()==x.getStatus()){ | |
155 | - twoEmail.clear(); | |
156 | - twoEmail.addAll(financeEmailList); | |
157 | - Set<String> userSet = new HashSet<>(); | |
158 | - userSet.add(x.getCreateBy()); | |
159 | - userSet.add(x.getBusinesPerson()); | |
160 | - List<String> emails = userSet.stream() | |
161 | - .map(userName::get) | |
162 | - .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null | |
163 | - .map(AdminUserDO::getEmail) // 获取邮箱 | |
164 | - .filter(Strings::isNotEmpty) // 确保邮箱不为空 | |
165 | - .collect(Collectors.toList()); | |
166 | - | |
167 | - if (CollectionUtils.isNotEmpty(emails)) { | |
168 | - twoEmail.addAll(emails); | |
169 | - } | |
170 | - FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); | |
171 | - eventJobVO.setInvoiceBillOrderDO(x); | |
172 | - emailSendUtils.sendEmail(FinanceOverEnum.INVOICE_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); | |
159 | + if (CollectionUtils.isNotEmpty(invoiceBillOrderDOS)) { | |
160 | + for(InvoiceBillOrderDO order : invoiceBillOrderDOS){ | |
161 | + if (order != null && order.getInvoiceNo() != null && seenInvoices.add(order.getInvoiceNo())) { | |
162 | + // 确保 order 和 order.getInvoice() 非空后再处理 | |
163 | + filteredInvoiceList.add(order); | |
164 | + } | |
173 | 165 | } |
174 | - }); | |
166 | + } | |
167 | + if(CollectionUtils.isNotEmpty(filteredInvoiceList)) { | |
168 | + filteredInvoiceList.forEach(x -> { | |
169 | + if (FinanceEnum.UNPAID_PAYMENTS.getStatus() == x.getStatus()) { | |
170 | + twoEmail.clear(); | |
171 | + twoEmail.addAll(financeEmailList); | |
172 | + Set<String> userSet = new HashSet<>(); | |
173 | + userSet.add(x.getCreateBy()); | |
174 | + userSet.add(x.getBusinesPerson()); | |
175 | + List<String> emails = userSet.stream() | |
176 | + .map(userName::get) | |
177 | + .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null | |
178 | + .map(AdminUserDO::getEmail) // 获取邮箱 | |
179 | + .filter(Strings::isNotEmpty) // 确保邮箱不为空 | |
180 | + .collect(Collectors.toList()); | |
181 | + | |
182 | + if (CollectionUtils.isNotEmpty(emails)) { | |
183 | + twoEmail.addAll(emails); | |
184 | + } | |
185 | + FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); | |
186 | + eventJobVO.setInvoiceBillOrderDO(x); | |
187 | + emailSendUtils.sendEmail(FinanceOverEnum.INVOICE_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); | |
188 | + } | |
189 | + }); | |
190 | + } | |
175 | 191 | } |
176 | 192 | // 获取 ProducePaymentCheckBillOrderDO 类型的 ID 列表 |
177 | 193 | List<Long> producePaymentCheckBillIds = stringListMap.get("ProducePaymentCheckBillOrderDO"); |
178 | 194 | if (producePaymentCheckBillIds != null && !producePaymentCheckBillIds.isEmpty()) { |
179 | 195 | List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOS = producePaymentCheckBillOrderService.listByIds(producePaymentCheckBillIds); |
180 | - producePaymentCheckBillOrderDOS.forEach(x->{ | |
181 | - if(ApplyStatusEnum.NO_COMMIT.getStatus()==x.getStatus() || ApplyStatusEnum.AUDIT_REFUSE.getStatus()==x.getStatus()){ | |
182 | - twoEmail.clear(); | |
183 | - twoEmail.addAll(financeEmailList); | |
184 | - Set<String> userSet = new HashSet<>(); | |
185 | - userSet.add(x.getCreateBy()); | |
186 | - userSet.add(x.getBusinesPerson()); | |
187 | - List<String> emails = userSet.stream() | |
188 | - .map(userName::get) | |
189 | - .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null | |
190 | - .map(AdminUserDO::getEmail) // 获取邮箱 | |
191 | - .filter(Strings::isNotEmpty) // 确保邮箱不为空 | |
192 | - .collect(Collectors.toList()); | |
193 | - if (CollectionUtils.isNotEmpty(emails)) { | |
194 | - twoEmail.addAll(emails); | |
195 | - } | |
196 | - FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); | |
197 | - eventJobVO.setProducePaymentCheckBillOrderDO(x); | |
198 | - emailSendUtils.sendEmail(FinanceOverEnum.PRODUCE_PAYMENT_CHECK_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); | |
196 | + if (CollectionUtils.isNotEmpty(producePaymentCheckBillOrderDOS)) { | |
197 | + for (ProducePaymentCheckBillOrderDO order : producePaymentCheckBillOrderDOS) { | |
198 | + if (order != null && order.getCheckNo() != null && seenChecks.add(order.getCheckNo())) { | |
199 | + filteredCheckList.add(order); | |
200 | + } | |
199 | 201 | } |
200 | - }); | |
202 | + } | |
203 | + if (CollectionUtils.isNotEmpty(filteredCheckList)) { | |
204 | + filteredCheckList.forEach(x -> { | |
205 | + if (FinanceEnum.UNPAID_PAYMENTS.getStatus() == x.getStatus()) { | |
206 | + twoEmail.clear(); | |
207 | + twoEmail.addAll(financeEmailList); | |
208 | + Set<String> userSet = new HashSet<>(); | |
209 | + userSet.add(x.getCreateBy()); | |
210 | + userSet.add(x.getBusinesPerson()); | |
211 | + List<String> emails = userSet.stream() | |
212 | + .map(userName::get) | |
213 | + .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null | |
214 | + .map(AdminUserDO::getEmail) // 获取邮箱 | |
215 | + .filter(Strings::isNotEmpty) // 确保邮箱不为空 | |
216 | + .collect(Collectors.toList()); | |
217 | + if (CollectionUtils.isNotEmpty(emails)) { | |
218 | + twoEmail.addAll(emails); | |
219 | + } | |
220 | + FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); | |
221 | + eventJobVO.setProducePaymentCheckBillOrderDO(x); | |
222 | + emailSendUtils.sendEmail(FinanceOverEnum.PRODUCE_PAYMENT_CHECK_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); | |
223 | + } | |
224 | + }); | |
225 | + } | |
201 | 226 | } |
202 | 227 | } |
203 | 228 | } | ... | ... |
src/main/java/com/order/erp/service/order/impl/OrderFieldLockApplyServiceImpl.java
... | ... | @@ -449,14 +449,14 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl<OrderFieldLockAp |
449 | 449 | |
450 | 450 | //只针对于应付款的过滤信息。 前端要设置搜索框的变量为checkNo。 |
451 | 451 | if (StringUtils.isNotBlank(queryVO.getCheckNo())) { |
452 | - // 获取并修整 checkNo字符串 | |
452 | + //获取 checkNo 字符串 | |
453 | 453 | String checkNos = queryVO.getCheckNo().trim(); |
454 | - // 检查处理后的字符串是否仍然有效 | |
454 | + // 检查字符串是否有效 | |
455 | 455 | if (!checkNos.isEmpty()) { |
456 | - // 使用参数化查询避免 SQL 拼接问题 | |
456 | + // 使用括号分组确保逻辑优先级正确 | |
457 | 457 | queryWrapper.apply( |
458 | - "JSON_UNQUOTE(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.checkNo')) = {0}"+ | |
459 | - "OR JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillOrderDO.checkNo')) = {0}", | |
458 | + "((JSON_UNQUOTE(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.checkNo')) = {0}) " + | |
459 | + "OR (JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillOrderDO.checkNo')) = {0}))", | |
460 | 460 | checkNos |
461 | 461 | ); |
462 | 462 | } | ... | ... |
src/main/resources/application-test.yml
... | ... | @@ -59,7 +59,7 @@ spring: |
59 | 59 | testOnReturn: true |
60 | 60 | password: eJ8(bD6]wN6=gI5= |
61 | 61 | time-between-eviction-runs-millis: 1000 |
62 | - url: jdbc:mysql://47.104.8.35:3307/order-erp?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true | |
62 | + url: jdbc:mysql://47.104.8.35:3307/order-erp-test-real?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true | |
63 | 63 | username: root |
64 | 64 | redis: |
65 | 65 | database: 0 | ... | ... |