付款排程优化
This commit is contained in:
		
							parent
							
								
									8d29359138
								
							
						
					
					
						commit
						2ea3dd5831
					
				|  | @ -115,68 +115,41 @@ public class SchedulebillMergeOperation extends AbstractOperationServicePlugIn i | |||
|             DynamicObject[] dataEntities = e.getDataEntities(); | ||||
|             // 提前加载所有 bill 对象 | ||||
|             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(); // 合并的数 | ||||
|                 StringBuilder sb = new StringBuilder("合并操作结果为:成功" + a + "条,生成合并单共" + size + "张。\n "); | ||||
|                 for (Map.Entry<Long, StringBuilder> entry : billNoMap.entrySet()) { | ||||
|                     Long key = entry.getKey(); | ||||
|                     StringBuilder billno = entry.getValue(); | ||||
|                     // 移除最后多余的逗号 | ||||
|                     if (billno.length() > 0) { | ||||
|                         billno.deleteCharAt(billno.length() - 1); | ||||
|                     } | ||||
|                     sb.append("单据编号为").append(billno).append("的单据:生成合并单").append(key).append("成功\n "); | ||||
|             // 新增逻辑:对loadedBills分类 | ||||
|             List<DynamicObject> aCategoryBills = new ArrayList<>(); // A类单据 | ||||
|             List<DynamicObject> bCategoryBills = new ArrayList<>(); // B类单据(原有逻辑) | ||||
| 
 | ||||
|             for (DynamicObject bill : loadedBills) { | ||||
|                 String externalSystem = bill.getString("shjh_externalsystemdocume"); | ||||
|                 String sourceSystem = bill.getString("shjh_sourcesystem"); | ||||
| 
 | ||||
|                 if ("E".equals(externalSystem) && "A".equals(sourceSystem)) { | ||||
|                     aCategoryBills.add(bill); | ||||
|                 } else { | ||||
|                     bCategoryBills.add(bill); | ||||
|                 } | ||||
|                 log.info(sb.toString());//将最终结果log输出 | ||||
|                 OperateErrorInfo operateErrorInfo = new OperateErrorInfo(); | ||||
|                 operateErrorInfo.setMessage(sb.toString()); | ||||
|                 operateErrorInfo.setErrorLevel(ErrorLevel.Error.name()); | ||||
|                 this.operationResult.addErrorInfo(operateErrorInfo); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             // 加载A类合并规则 | ||||
|             DynamicObject aCategoryRule = BusinessDataServiceHelper.loadSingle("psd_autocombinerule", | ||||
|                     new QFilter[]{new QFilter("name", "=", "预付款合并规则"),new QFilter("enable", "=", "1")}); | ||||
| 
 | ||||
|             // 加载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 | ||||
|  | @ -272,4 +245,81 @@ public class SchedulebillMergeOperation extends AbstractOperationServicePlugIn i | |||
|             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