付款排程优化

This commit is contained in:
李贵强 2025-08-25 17:18:36 +08:00
parent 8d29359138
commit 2ea3dd5831
1 changed files with 110 additions and 60 deletions

View File

@ -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);
}
}