付款排程优化
This commit is contained in:
		
							parent
							
								
									8d29359138
								
							
						
					
					
						commit
						2ea3dd5831
					
				|  | @ -115,68 +115,41 @@ public class SchedulebillMergeOperation extends AbstractOperationServicePlugIn i | ||||||
|             DynamicObject[] dataEntities = e.getDataEntities(); |             DynamicObject[] dataEntities = e.getDataEntities(); | ||||||
|             // 提前加载所有 bill 对象 |             // 提前加载所有 bill 对象 | ||||||
|             DynamicObject[] loadedBills = loadAllBills(dataEntities); |             DynamicObject[] loadedBills = loadAllBills(dataEntities); | ||||||
|             Map<StringBuilder, List<DynamicObject>> map = new HashMap<>(); |  | ||||||
|             // 合并规则 |  | ||||||
|             DynamicObject sourcesystem = BusinessDataServiceHelper.loadSingle("psd_autocombinerule", |  | ||||||
|                     new QFilter[]{new QFilter("enable", "=", "1")}); |  | ||||||
|             if (sourcesystem != null) { |  | ||||||
|                 DynamicObjectCollection entryentity = sourcesystem.getDynamicObjectCollection("entryentity"); |  | ||||||
|                 for (DynamicObject bill : loadedBills) { |  | ||||||
|                     // 合并,赋值排程批次号(batchnum) |  | ||||||
|                     StringBuilder rule = buildRule(bill, entryentity); |  | ||||||
|                     // 避免重复 key |  | ||||||
|                     boolean keyExists = false; |  | ||||||
|                     for (StringBuilder existingKey : map.keySet()) { |  | ||||||
|                         if (existingKey.toString().contentEquals(rule)) { |  | ||||||
|                             keyExists = true; |  | ||||||
|                             map.get(existingKey).add(bill); |  | ||||||
|                             break; |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     if (!keyExists) { |  | ||||||
|                         map.computeIfAbsent(rule, k -> new ArrayList<>()).add(bill); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 int a = 0; |  | ||||||
|                 Map<Long, List<DynamicObject>> hashMap = new HashMap<>(); |  | ||||||
|                 Map<Long, StringBuilder> billNoMap = new HashMap<>(); // 用于记录每个批次的单据编号 |  | ||||||
|                 // 遍历原始Map处理数据 |  | ||||||
|                 for (Map.Entry<StringBuilder, List<DynamicObject>> entry : map.entrySet()) { |  | ||||||
|                     long l = System.currentTimeMillis(); |  | ||||||
|                     List<DynamicObject> v = entry.getValue(); |  | ||||||
|                     // 初始化当前批次的单据编号收集器 |  | ||||||
|                     StringBuilder billno = new StringBuilder(); |  | ||||||
|                     for (DynamicObject bill : v) { |  | ||||||
|                         bill.set("batchnum", "" + l); |  | ||||||
|                         bill.set("shjh_ishb", true); |  | ||||||
|                         a++; |  | ||||||
|                         // 收集单据编号(提前处理,避免后续重复遍历) |  | ||||||
|                         billno.append(bill.getString("billno")).append(","); |  | ||||||
|                     } |  | ||||||
|                     // 保存单据编号收集结果 |  | ||||||
|                     billNoMap.put(l, billno); |  | ||||||
|                     // 保存处理后的单据列表到结果Map |  | ||||||
|                     hashMap.put(l, v); |  | ||||||
|                     SaveServiceHelper.save(v.toArray(new DynamicObject[0])); |  | ||||||
|                 } |  | ||||||
| 
 | 
 | ||||||
|                 int size = hashMap.size(); // 合并的数 |             // 新增逻辑:对loadedBills分类 | ||||||
|                 StringBuilder sb = new StringBuilder("合并操作结果为:成功" + a + "条,生成合并单共" + size + "张。\n "); |             List<DynamicObject> aCategoryBills = new ArrayList<>(); // A类单据 | ||||||
|                 for (Map.Entry<Long, StringBuilder> entry : billNoMap.entrySet()) { |             List<DynamicObject> bCategoryBills = new ArrayList<>(); // B类单据(原有逻辑) | ||||||
|                     Long key = entry.getKey(); | 
 | ||||||
|                     StringBuilder billno = entry.getValue(); |             for (DynamicObject bill : loadedBills) { | ||||||
|                     // 移除最后多余的逗号 |                 String externalSystem = bill.getString("shjh_externalsystemdocume"); | ||||||
|                     if (billno.length() > 0) { |                 String sourceSystem = bill.getString("shjh_sourcesystem"); | ||||||
|                         billno.deleteCharAt(billno.length() - 1); | 
 | ||||||
|                     } |                 if ("E".equals(externalSystem) && "A".equals(sourceSystem)) { | ||||||
|                     sb.append("单据编号为").append(billno).append("的单据:生成合并单").append(key).append("成功\n "); |                     aCategoryBills.add(bill); | ||||||
|  |                 } else { | ||||||
|  |                     bCategoryBills.add(bill); | ||||||
|                 } |                 } | ||||||
|                 log.info(sb.toString());//将最终结果log输出 |             } | ||||||
|                 OperateErrorInfo operateErrorInfo = new OperateErrorInfo(); | 
 | ||||||
|                 operateErrorInfo.setMessage(sb.toString()); |             // 加载A类合并规则 | ||||||
|                 operateErrorInfo.setErrorLevel(ErrorLevel.Error.name()); |             DynamicObject aCategoryRule = BusinessDataServiceHelper.loadSingle("psd_autocombinerule", | ||||||
|                 this.operationResult.addErrorInfo(operateErrorInfo); |                     new QFilter[]{new QFilter("name", "=", "预付款合并规则"),new QFilter("enable", "=", "1")}); | ||||||
|                 return; | 
 | ||||||
|  |             // 加载B类合并规则(原有逻辑) | ||||||
|  |             DynamicObject bCategoryRule = BusinessDataServiceHelper.loadSingle("psd_autocombinerule", | ||||||
|  |                     new QFilter[]{new QFilter("name", "=", "默认合并规则"),new QFilter("enable", "=", "1")}); | ||||||
|  | 
 | ||||||
|  |             // 处理A类单据 | ||||||
|  |             if (aCategoryRule != null && !aCategoryBills.isEmpty()) { | ||||||
|  |                 processBills(aCategoryBills, aCategoryRule); | ||||||
|  |             }else { | ||||||
|  |                 //保底逻辑 | ||||||
|  |                 bCategoryBills.addAll(aCategoryBills); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // 处理B类单据(原有逻辑) | ||||||
|  |             if (bCategoryRule != null) { | ||||||
|  |                 processBills(bCategoryBills, bCategoryRule); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // 合并解除:若合并批次号不为空,且为二开干预的合并排程单,则将合并批次号置空,并将合并状态置为false |         // 合并解除:若合并批次号不为空,且为二开干预的合并排程单,则将合并批次号置空,并将合并状态置为false | ||||||
|  | @ -272,4 +245,81 @@ public class SchedulebillMergeOperation extends AbstractOperationServicePlugIn i | ||||||
|             log.error("对象类型是其他类型"); |             log.error("对象类型是其他类型"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     // 提取的公共处理方法 | ||||||
|  |     private void processBills(List<DynamicObject> bills, DynamicObject rule) { | ||||||
|  |         if (bills.isEmpty()) return; | ||||||
|  | 
 | ||||||
|  |         Map<StringBuilder, List<DynamicObject>> map = new HashMap<>(); | ||||||
|  |         DynamicObjectCollection entryentity = rule.getDynamicObjectCollection("entryentity"); | ||||||
|  | 
 | ||||||
|  | //        for (DynamicObject bill : bills) { | ||||||
|  | //            StringBuilder ruleKey = buildRule(bill, entryentity); | ||||||
|  | //            map.computeIfAbsent(ruleKey, k -> new ArrayList<>()).add(bill); | ||||||
|  | //        } | ||||||
|  |         for (DynamicObject bill : bills) { | ||||||
|  |             // 合并,赋值排程批次号(batchnum) | ||||||
|  |             StringBuilder ruleKey = buildRule(bill, entryentity); | ||||||
|  |             // 避免重复 key | ||||||
|  |             boolean keyExists = false; | ||||||
|  |             for (StringBuilder existingKey : map.keySet()) { | ||||||
|  |                 if (existingKey.toString().contentEquals(ruleKey)) { | ||||||
|  |                     keyExists = true; | ||||||
|  |                     map.get(existingKey).add(bill); | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (!keyExists) { | ||||||
|  |                 map.computeIfAbsent(ruleKey, k -> new ArrayList<>()).add(bill); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         int processedCount = 0; | ||||||
|  |         Map<Long, List<DynamicObject>> hashMap = new HashMap<>(); | ||||||
|  |         Map<Long, StringBuilder> billNoMap = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  |         for (Map.Entry<StringBuilder, List<DynamicObject>> entry : map.entrySet()) { | ||||||
|  |             long batchNum = System.currentTimeMillis(); | ||||||
|  |             List<DynamicObject> batchBills = entry.getValue(); | ||||||
|  |             StringBuilder billNos = new StringBuilder(); | ||||||
|  | 
 | ||||||
|  |             for (DynamicObject bill : batchBills) { | ||||||
|  |                 bill.set("batchnum", String.valueOf(batchNum)); | ||||||
|  |                 bill.set("shjh_ishb", true); | ||||||
|  |                 processedCount++; | ||||||
|  |                 billNos.append(bill.getString("billno")).append(","); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (billNos.length() > 0) { | ||||||
|  |                 billNos.deleteCharAt(billNos.length() - 1); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             billNoMap.put(batchNum, billNos); | ||||||
|  |             hashMap.put(batchNum, batchBills); | ||||||
|  |             SaveServiceHelper.save(batchBills.toArray(new DynamicObject[0])); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // 记录处理结果 | ||||||
|  |         StringBuilder resultMsg = new StringBuilder() | ||||||
|  |                 .append("合并操作结果为:成功") | ||||||
|  |                 .append(processedCount) | ||||||
|  |                 .append("条,生成合并单共") | ||||||
|  |                 .append(hashMap.size()) | ||||||
|  |                 .append("张。\n"); | ||||||
|  | 
 | ||||||
|  |         for (Map.Entry<Long, StringBuilder> entry : billNoMap.entrySet()) { | ||||||
|  |             resultMsg.append("单据编号为") | ||||||
|  |                     .append(entry.getValue()) | ||||||
|  |                     .append("的单据:生成合并单") | ||||||
|  |                     .append(entry.getKey()) | ||||||
|  |                     .append("成功\n"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         log.info(resultMsg.toString()); | ||||||
|  |         OperateErrorInfo errorInfo = new OperateErrorInfo(); | ||||||
|  |         errorInfo.setMessage(resultMsg.toString()); | ||||||
|  |         errorInfo.setErrorLevel(ErrorLevel.Error.name()); | ||||||
|  |         this.operationResult.addErrorInfo(errorInfo); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue