diff --git a/src/main/java/com/order/erp/job/FinanceJob.java b/src/main/java/com/order/erp/job/FinanceJob.java index af4135f..261562f 100644 --- a/src/main/java/com/order/erp/job/FinanceJob.java +++ b/src/main/java/com/order/erp/job/FinanceJob.java @@ -6,6 +6,7 @@ import com.order.erp.common.constant.Constant; import com.order.erp.common.utils.EmailSendUtils; import com.order.erp.common.utils.RedisUtils; import com.order.erp.domain.ApplyStatusEnum; +import com.order.erp.domain.FinanceEnum; import com.order.erp.domain.FinanceOverEnum; import com.order.erp.domain.dto.BaseDO; import com.order.erp.domain.dto.admin.AdminUserDO; @@ -65,6 +66,7 @@ public class FinanceJob { List<AdminUserRoleDO> list = adminUserRoleService.list(new LambdaQueryWrapper<AdminUserRoleDO>() .eq(AdminUserRoleDO::getRoleId, Constant.SEVEN)); Set<Long> userIds= list.stream().map(AdminUserRoleDO::getUserId).collect(Collectors.toSet()); + //获取所有财务角色的邮箱。 List<String> financeEmailList = userIds.stream() .map(userId -> Optional.ofNullable(adminUserDOMap.get(userId)) .map(AdminUserDO::getEmail) @@ -98,7 +100,7 @@ public class FinanceJob { FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); eventJobVO.setInvoiceBillOrderDO(invoiceBillOrderDO); emailSendUtils.sendEmail(FinanceOverEnum.INVOICE_OVERTIME, new ArrayList<>(emailList), eventJobVO); - boolean set = redisService.set(redisKey, invoiceBillOrderDO, Constant.HUNDREDANDFIVE, TimeUnit.DAYS);// 设置为21天后过期 + boolean set = redisService.set(redisKey, invoiceBillOrderDO, Constant.HUNDREDANDFIVE, TimeUnit.DAYS);// 设置为105天后过期 if(set){ redisService.saddWithExpiry(Constant.REDISKEY,redisKey, Constant.HUNDREDANDFIVE, TimeUnit.DAYS); } @@ -148,56 +150,79 @@ public class FinanceJob { if (stringListMap != null) { // 获取 InvoiceBillOrderDO 类型的 ID 列表 List<Long> invoiceBillOrderIds = stringListMap.get("InvoiceBillOrderDO"); + List<InvoiceBillOrderDO> filteredInvoiceList = new ArrayList<>(); + Set<String> seenInvoices=new HashSet<>(); + List<ProducePaymentCheckBillOrderDO> filteredCheckList = new ArrayList<>(); + Set<String> seenChecks=new HashSet<>(); if (invoiceBillOrderIds != null && !invoiceBillOrderIds.isEmpty()) { List<InvoiceBillOrderDO> invoiceBillOrderDOS = invoiceBillOrderService.listByIds(invoiceBillOrderIds); - invoiceBillOrderDOS.forEach(x->{ - if(ApplyStatusEnum.NO_COMMIT.getStatus()==x.getStatus() || ApplyStatusEnum.AUDIT_REFUSE.getStatus()==x.getStatus()){ - twoEmail.clear(); - twoEmail.addAll(financeEmailList); - Set<String> userSet = new HashSet<>(); - userSet.add(x.getCreateBy()); - userSet.add(x.getBusinesPerson()); - List<String> emails = userSet.stream() - .map(userName::get) - .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null - .map(AdminUserDO::getEmail) // 获取邮箱 - .filter(Strings::isNotEmpty) // 确保邮箱不为空 - .collect(Collectors.toList()); - - if (CollectionUtils.isNotEmpty(emails)) { - twoEmail.addAll(emails); - } - FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); - eventJobVO.setInvoiceBillOrderDO(x); - emailSendUtils.sendEmail(FinanceOverEnum.INVOICE_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); + if (CollectionUtils.isNotEmpty(invoiceBillOrderDOS)) { + for(InvoiceBillOrderDO order : invoiceBillOrderDOS){ + if (order != null && order.getInvoiceNo() != null && seenInvoices.add(order.getInvoiceNo())) { + // 确保 order 和 order.getInvoice() 非空后再处理 + filteredInvoiceList.add(order); + } } - }); + } + if(CollectionUtils.isNotEmpty(filteredInvoiceList)) { + filteredInvoiceList.forEach(x -> { + if (FinanceEnum.UNPAID_PAYMENTS.getStatus() == x.getStatus()) { + twoEmail.clear(); + twoEmail.addAll(financeEmailList); + Set<String> userSet = new HashSet<>(); + userSet.add(x.getCreateBy()); + userSet.add(x.getBusinesPerson()); + List<String> emails = userSet.stream() + .map(userName::get) + .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null + .map(AdminUserDO::getEmail) // 获取邮箱 + .filter(Strings::isNotEmpty) // 确保邮箱不为空 + .collect(Collectors.toList()); + + if (CollectionUtils.isNotEmpty(emails)) { + twoEmail.addAll(emails); + } + FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); + eventJobVO.setInvoiceBillOrderDO(x); + emailSendUtils.sendEmail(FinanceOverEnum.INVOICE_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); + } + }); + } } // 获取 ProducePaymentCheckBillOrderDO 类型的 ID 列表 List<Long> producePaymentCheckBillIds = stringListMap.get("ProducePaymentCheckBillOrderDO"); if (producePaymentCheckBillIds != null && !producePaymentCheckBillIds.isEmpty()) { List<ProducePaymentCheckBillOrderDO> producePaymentCheckBillOrderDOS = producePaymentCheckBillOrderService.listByIds(producePaymentCheckBillIds); - producePaymentCheckBillOrderDOS.forEach(x->{ - if(ApplyStatusEnum.NO_COMMIT.getStatus()==x.getStatus() || ApplyStatusEnum.AUDIT_REFUSE.getStatus()==x.getStatus()){ - twoEmail.clear(); - twoEmail.addAll(financeEmailList); - Set<String> userSet = new HashSet<>(); - userSet.add(x.getCreateBy()); - userSet.add(x.getBusinesPerson()); - List<String> emails = userSet.stream() - .map(userName::get) - .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null - .map(AdminUserDO::getEmail) // 获取邮箱 - .filter(Strings::isNotEmpty) // 确保邮箱不为空 - .collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(emails)) { - twoEmail.addAll(emails); - } - FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); - eventJobVO.setProducePaymentCheckBillOrderDO(x); - emailSendUtils.sendEmail(FinanceOverEnum.PRODUCE_PAYMENT_CHECK_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); + if (CollectionUtils.isNotEmpty(producePaymentCheckBillOrderDOS)) { + for (ProducePaymentCheckBillOrderDO order : producePaymentCheckBillOrderDOS) { + if (order != null && order.getCheckNo() != null && seenChecks.add(order.getCheckNo())) { + filteredCheckList.add(order); + } } - }); + } + if (CollectionUtils.isNotEmpty(filteredCheckList)) { + filteredCheckList.forEach(x -> { + if (FinanceEnum.UNPAID_PAYMENTS.getStatus() == x.getStatus()) { + twoEmail.clear(); + twoEmail.addAll(financeEmailList); + Set<String> userSet = new HashSet<>(); + userSet.add(x.getCreateBy()); + userSet.add(x.getBusinesPerson()); + List<String> emails = userSet.stream() + .map(userName::get) + .filter(Objects::nonNull) // 确保 AdminUserDO 不为 null + .map(AdminUserDO::getEmail) // 获取邮箱 + .filter(Strings::isNotEmpty) // 确保邮箱不为空 + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(emails)) { + twoEmail.addAll(emails); + } + FinanceEventJobVO eventJobVO = new FinanceEventJobVO(); + eventJobVO.setProducePaymentCheckBillOrderDO(x); + emailSendUtils.sendEmail(FinanceOverEnum.PRODUCE_PAYMENT_CHECK_OVERTIME, new ArrayList<>(twoEmail), eventJobVO); + } + }); + } } } } diff --git a/src/main/java/com/order/erp/service/order/impl/OrderFieldLockApplyServiceImpl.java b/src/main/java/com/order/erp/service/order/impl/OrderFieldLockApplyServiceImpl.java index ed2e988..ee52f9d 100644 --- a/src/main/java/com/order/erp/service/order/impl/OrderFieldLockApplyServiceImpl.java +++ b/src/main/java/com/order/erp/service/order/impl/OrderFieldLockApplyServiceImpl.java @@ -459,14 +459,14 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl<OrderFieldLockAp //只针对于应付款的过滤信息。 前端要设置搜索框的变量为checkNo。 if (StringUtils.isNotBlank(queryVO.getCheckNo())) { - // 获取并修整 checkNo字符串 + //获取 checkNo 字符串 String checkNos = queryVO.getCheckNo().trim(); - // 检查处理后的字符串是否仍然有效 + // 检查字符串是否有效 if (!checkNos.isEmpty()) { - // 使用参数化查询避免 SQL 拼接问题 + // 使用括号分组确保逻辑优先级正确 queryWrapper.apply( - "JSON_UNQUOTE(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.checkNo')) = {0}"+ - "OR JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillOrderDO.checkNo')) = {0}", + "((JSON_UNQUOTE(JSON_EXTRACT(fields, '$.producePaymentCheckBillFieldVO.checkNo')) = {0}) " + + "OR (JSON_UNQUOTE(JSON_EXTRACT(fields, '$.checkBillOrderDO.checkNo')) = {0}))", checkNos ); } diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 1a67833..cfacfbf 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -59,7 +59,7 @@ spring: testOnReturn: true password: eJ8(bD6]wN6=gI5= time-between-eviction-runs-millis: 1000 - 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 + 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 username: root redis: database: 0