Commit d638525561bef17e0cab981c62bf31b596eb3464
Merge remote-tracking branch 'origin/fix-main-ch' into profit-analysis
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 +6,7 @@ import com.order.erp.common.constant.Constant; | ||
6 | import com.order.erp.common.utils.EmailSendUtils; | 6 | import com.order.erp.common.utils.EmailSendUtils; |
7 | import com.order.erp.common.utils.RedisUtils; | 7 | import com.order.erp.common.utils.RedisUtils; |
8 | import com.order.erp.domain.ApplyStatusEnum; | 8 | import com.order.erp.domain.ApplyStatusEnum; |
9 | +import com.order.erp.domain.FinanceEnum; | ||
9 | import com.order.erp.domain.FinanceOverEnum; | 10 | import com.order.erp.domain.FinanceOverEnum; |
10 | import com.order.erp.domain.dto.BaseDO; | 11 | import com.order.erp.domain.dto.BaseDO; |
11 | import com.order.erp.domain.dto.admin.AdminUserDO; | 12 | import com.order.erp.domain.dto.admin.AdminUserDO; |
@@ -65,6 +66,7 @@ public class FinanceJob { | @@ -65,6 +66,7 @@ public class FinanceJob { | ||
65 | List<AdminUserRoleDO> list = adminUserRoleService.list(new LambdaQueryWrapper<AdminUserRoleDO>() | 66 | List<AdminUserRoleDO> list = adminUserRoleService.list(new LambdaQueryWrapper<AdminUserRoleDO>() |
66 | .eq(AdminUserRoleDO::getRoleId, Constant.SEVEN)); | 67 | .eq(AdminUserRoleDO::getRoleId, Constant.SEVEN)); |
67 | Set<Long> userIds= list.stream().map(AdminUserRoleDO::getUserId).collect(Collectors.toSet()); | 68 | Set<Long> userIds= list.stream().map(AdminUserRoleDO::getUserId).collect(Collectors.toSet()); |
69 | + //获取所有财务角色的邮箱。 | ||
68 | List<String> financeEmailList = userIds.stream() | 70 | List<String> financeEmailList = userIds.stream() |
69 | .map(userId -> Optional.ofNullable(adminUserDOMap.get(userId)) | 71 | .map(userId -> Optional.ofNullable(adminUserDOMap.get(userId)) |
70 | .map(AdminUserDO::getEmail) | 72 | .map(AdminUserDO::getEmail) |
@@ -98,7 +100,7 @@ public class FinanceJob { | @@ -98,7 +100,7 @@ public class FinanceJob { | ||
98 | FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); | 100 | FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); |
99 | eventJobVO.setInvoiceBillOrderDO(invoiceBillOrderDO); | 101 | eventJobVO.setInvoiceBillOrderDO(invoiceBillOrderDO); |
100 | emailSendUtils.sendEmail(FinanceOverEnum.INVOICE_OVERTIME, new ArrayList<>(emailList), eventJobVO); | 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 | if(set){ | 104 | if(set){ |
103 | redisService.saddWithExpiry(Constant.REDISKEY,redisKey, Constant.HUNDREDANDFIVE, TimeUnit.DAYS); | 105 | redisService.saddWithExpiry(Constant.REDISKEY,redisKey, Constant.HUNDREDANDFIVE, TimeUnit.DAYS); |
104 | } | 106 | } |
@@ -148,56 +150,79 @@ public class FinanceJob { | @@ -148,56 +150,79 @@ public class FinanceJob { | ||
148 | if (stringListMap != null) { | 150 | if (stringListMap != null) { |
149 | // 获取 InvoiceBillOrderDO 类型的 ID 列表 | 151 | // 获取 InvoiceBillOrderDO 类型的 ID 列表 |
150 | List<Long> invoiceBillOrderIds = stringListMap.get("InvoiceBillOrderDO"); | 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 | if (invoiceBillOrderIds != null && !invoiceBillOrderIds.isEmpty()) { | 157 | if (invoiceBillOrderIds != null && !invoiceBillOrderIds.isEmpty()) { |
152 | List<InvoiceBillOrderDO> invoiceBillOrderDOS = invoiceBillOrderService.listByIds(invoiceBillOrderIds); | 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 | // 获取 ProducePaymentCheckBillOrderDO 类型的 ID 列表 | 192 | // 获取 ProducePaymentCheckBillOrderDO 类型的 ID 列表 |
177 | List<Long> producePaymentCheckBillIds = stringListMap.get("ProducePaymentCheckBillOrderDO"); | 193 | List<Long> producePaymentCheckBillIds = stringListMap.get("ProducePaymentCheckBillOrderDO"); |
178 | if (producePaymentCheckBillIds != null && !producePaymentCheckBillIds.isEmpty()) { | 194 | if (producePaymentCheckBillIds != null && !producePaymentCheckBillIds.isEmpty()) { |
179 | List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOS = producePaymentCheckBillOrderService.listByIds(producePaymentCheckBillIds); | 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
@@ -459,14 +459,14 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl<OrderFieldLockAp | @@ -459,14 +459,14 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl<OrderFieldLockAp | ||
459 | 459 | ||
460 | //只针对于应付款的过滤信息。 前端要设置搜索框的变量为checkNo。 | 460 | //只针对于应付款的过滤信息。 前端要设置搜索框的变量为checkNo。 |
461 | if (StringUtils.isNotBlank(queryVO.getCheckNo())) { | 461 | if (StringUtils.isNotBlank(queryVO.getCheckNo())) { |
462 | - // 获取并修整 checkNo字符串 | 462 | + //获取 checkNo 字符串 |
463 | String checkNos = queryVO.getCheckNo().trim(); | 463 | String checkNos = queryVO.getCheckNo().trim(); |
464 | - // 检查处理后的字符串是否仍然有效 | 464 | + // 检查字符串是否有效 |
465 | if (!checkNos.isEmpty()) { | 465 | if (!checkNos.isEmpty()) { |
466 | - // 使用参数化查询避免 SQL 拼接问题 | 466 | + // 使用括号分组确保逻辑优先级正确 |
467 | queryWrapper.apply( | 467 | queryWrapper.apply( |
468 | - "JSON_UNQUOTE(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.checkNo')) = {0}"+ | ||
469 | - "OR JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillOrderDO.checkNo')) = {0}", | 468 | + "((JSON_UNQUOTE(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.checkNo')) = {0}) " + |
469 | + "OR (JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillOrderDO.checkNo')) = {0}))", | ||
470 | checkNos | 470 | checkNos |
471 | ); | 471 | ); |
472 | } | 472 | } |
src/main/resources/application-test.yml
@@ -59,7 +59,7 @@ spring: | @@ -59,7 +59,7 @@ spring: | ||
59 | testOnReturn: true | 59 | testOnReturn: true |
60 | password: eJ8(bD6]wN6=gI5= | 60 | password: eJ8(bD6]wN6=gI5= |
61 | time-between-eviction-runs-millis: 1000 | 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 | username: root | 63 | username: root |
64 | redis: | 64 | redis: |
65 | database: 0 | 65 | database: 0 |