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 +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
@@ -449,14 +449,14 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp @@ -449,14 +449,14 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
449 449
450 //只针对于应付款的过滤信息。 前端要设置搜索框的变量为checkNo。 450 //只针对于应付款的过滤信息。 前端要设置搜索框的变量为checkNo。
451 if (StringUtils.isNotBlank(queryVO.getCheckNo())) { 451 if (StringUtils.isNotBlank(queryVO.getCheckNo())) {
452 - // 获取并修整 checkNo字符串 452 + //获取 checkNo 字符串
453 String checkNos = queryVO.getCheckNo().trim(); 453 String checkNos = queryVO.getCheckNo().trim();
454 - // 检查处理后的字符串是否仍然有效 454 + // 检查字符串是否有效
455 if (!checkNos.isEmpty()) { 455 if (!checkNos.isEmpty()) {
456 - // 使用参数化查询避免 SQL 拼接问题 456 + // 使用括号分组确保逻辑优先级正确
457 queryWrapper.apply( 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 checkNos 460 checkNos
461 ); 461 );
462 } 462 }
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