Commit 370426394ef06258a298d5791076129257771029

Authored by chenhang4442024
1 parent 32270f03

fix:第二版财务,新增定时任务(应收款订单和应付款订单没有在HOD时间内进行审核,就会发送邮件提醒,提醒业务员和跟单员和财务人员,每隔七天提醒一次)

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&lt;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
... ...