From 3e84d58207856fc7b0a39e0eaf8f93a939d93ee4 Mon Sep 17 00:00:00 2001 From: weiyunlong Date: Tue, 1 Apr 2025 17:53:11 +0800 Subject: [PATCH] =?UTF-8?q?=20=201.=E7=A5=A8=E6=8D=AE=E4=BB=98=E6=AC=BE?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=A0=B9=E6=8D=AE=E7=A5=A8=E6=8D=AE=E5=8F=B7?= =?UTF-8?q?=E5=9C=A8=E9=87=91=E8=9D=B6=E4=B8=AD=E6=9F=A5=E6=89=BE=E6=94=B6?= =?UTF-8?q?=E7=A5=A8=E5=87=AD=E8=AF=81=E5=8F=B7=EF=BC=8C=E5=B0=86=E5=BA=94?= =?UTF-8?q?=E6=94=B6=E7=A5=A8=E6=8D=AE=E7=9A=84=E6=94=B6=E7=A5=A8=E5=87=AD?= =?UTF-8?q?=E8=AF=81=E5=92=8C=E5=AF=B9=E5=BA=94=E7=9A=84=E8=83=8C=E4=B9=A6?= =?UTF-8?q?=E5=87=AD=E8=AF=81=E8=BF=9B=E8=A1=8C=E6=B8=85=E8=B4=A6=EF=BC=8C?= =?UTF-8?q?=E6=8E=A8=E9=80=81SAP=20=20=202.=E6=8E=92=E7=A8=8B=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=B1=A0=E5=88=97=E8=A1=A8=E7=95=8C=E9=9D=A2=E4=B8=8A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E9=94=AE=E5=90=88=E5=B9=B6=E6=8C=89?= =?UTF-8?q?=E9=92=AE=EF=BC=8C=E7=82=B9=E5=87=BB=E5=90=8E=EF=BC=8C=E5=B0=86?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E7=B3=BB=E7=BB=9F=E4=B8=BAsap=E7=9A=84?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E5=90=88=E5=B9=B6=E8=A7=84=E5=88=99=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=90=88=E5=B9=B6=20--s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/PaybillPushSapOperation.java | 6 + .../operate/SchedulebillMergeOperation.java | 178 ++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/operate/SchedulebillMergeOperation.java diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java index e822aca..bade62f 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java @@ -73,6 +73,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), "cas_paybill"); String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统 //主动:{1.fk:不清帐,直传付款凭证给sap;2.SAP:要清账,都传} 被动:{不用传清账} FKZJ2025030040 + //todo:付款单是由票据直接生成,凭证如何推送 JSONObject data = new JSONObject(); //抬头 data.put("IS_HEADER", getIS_HEADER(bill)); @@ -80,6 +81,11 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl data.put("IT_ITEM", getIT_ITEM(bill)); //来源系统SAP时,清账(SAP凭证数据) if ("A".equals(shjhSourcesystem)) { + // 票据信息 + DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo"); + if (!casDraftinfos.isEmpty()) { + data.put("IT_ITEM", null); + } //清账数据,参考《IT_CLEAR》,仅清账需要输入 data.put("IT_CLEAR", getIT_CLEAR(bill)); } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/SchedulebillMergeOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/SchedulebillMergeOperation.java new file mode 100644 index 0000000..f31eb6a --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/SchedulebillMergeOperation.java @@ -0,0 +1,178 @@ +package shjh.jhzj7.fi.fi.plugin.operate; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.ExtendedDataEntity; +import kd.bos.entity.plugin.AbstractOperationServicePlugIn; +import kd.bos.entity.plugin.AddValidatorsEventArgs; +import kd.bos.entity.plugin.args.AfterOperationArgs; +import kd.bos.entity.validate.AbstractValidator; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.sdk.plugin.Plugin; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 排程单据合并 + * 元:shjh_psd_schedulebill_ext + * 操作标识:shjh_pcbillhb + */ +public class SchedulebillMergeOperation extends AbstractOperationServicePlugIn implements Plugin { + + private static final Log log = LogFactory.getLog(SchedulebillMergeOperation.class); + + @Override + public void onAddValidators(AddValidatorsEventArgs e) { + //限制条件:]付款排程单【排程状态】=已排程 and 【单据来源】=SAP and 【排程余额】=0 and 【合并批次号】=空 and【排票金额】=0,才允许点击此按钮。 + super.onAddValidators(e); + e.addValidator(new AbstractValidator() { + @Override + public void validate() { + String operateKey = this.getOperateKey(); + if ("shjh_pcbillhb".equals(operateKey)) { + +// DynamicObject single = BusinessDataServiceHelper.loadSingle("psd_schedulebill", new QFilter[]{new QFilter("billno", "=", "FKPC250401000002")}); +// DynamicObject single1 = BusinessDataServiceHelper.loadSingle("psd_schedulebill", new QFilter[]{new QFilter("billno", "=", "FKPC250401000001")}); +// DynamicObject single2 = BusinessDataServiceHelper.loadSingle("psd_schedulebill", new QFilter[]{new QFilter("billno", "=", "PSD-202503-000058")}); +// DynamicObject single3 = BusinessDataServiceHelper.loadSingle("psd_schedulebill", new QFilter[]{new QFilter("billno", "=", "PSD-202502-000034")}); +// single.set("batchnum","");single1.set("batchnum","");single2.set("batchnum","");single3.set("batchnum","");single3.set("shjh_sourcesystem","A"); +// SaveServiceHelper.save(new DynamicObject[]{single});SaveServiceHelper.save(new DynamicObject[]{single1});SaveServiceHelper.save(new DynamicObject[]{single2});SaveServiceHelper.save(new DynamicObject[]{single3}); + + ExtendedDataEntity[] entities = this.getDataEntities(); + for (ExtendedDataEntity entity : entities) { + DynamicObject bill = entity.getDataEntity(); + bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), "psd_schedulebill"); + String schedulstatus = bill.getString("schedulstatus");//排程状态 + if (!"yetschedule".equals(schedulstatus)) { + this.addErrorMessage(entity,"状态不是已排程"); + } + String shjh_sourcesystem = bill.getString("shjh_sourcesystem");// 来源系统 SAP:A + if (!"A".equals(shjh_sourcesystem)) { + this.addErrorMessage(entity,"来源系统不是SAP"); + } + BigDecimal balanceamt = bill.getBigDecimal("balanceamt");//排程余额 + if (balanceamt.compareTo(BigDecimal.ZERO) != 0) { + this.addErrorMessage(entity,"排程余额不为0"); + } + String batchnum = bill.getString("batchnum");//合并批次号 + if (!batchnum.isEmpty()) { + this.addErrorMessage(entity,"合并批次号不为空"); + } + BigDecimal draftamt = bill.getBigDecimal("draftamt");//排票金额 + if (draftamt.compareTo(BigDecimal.ZERO) != 0) { + this.addErrorMessage(entity,"排票金额不为0"); + } + } + } + } + }); + } + + @Override + public void afterExecuteOperationTransaction(AfterOperationArgs e) { + super.afterExecuteOperationTransaction(e); + //排程任务池列表界面上增加一键合并按钮,点击后,将来源系统为sap的按照合并规则进行合并 + String operationKey = e.getOperationKey(); + if ("shjh_pcbillhb".equals(operationKey)) { + DynamicObject[] dataEntities = e.getDataEntities(); + // 提前加载所有 bill 对象 + DynamicObject[] loadedBills = loadAllBills(dataEntities); + Map> 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); + } + } + assignBatchNumbersAndSave(map); + } + } + } + + + /** + * 加载所有bill对象 + */ + private static DynamicObject[] loadAllBills(DynamicObject[] dataEntities) { + DynamicObject[] loadedBills = new DynamicObject[dataEntities.length]; + for (int i = 0; i < dataEntities.length; i++) { + loadedBills[i] = BusinessDataServiceHelper.loadSingle(dataEntities[i].getPkValue(), "psd_schedulebill"); + } + return loadedBills; + } + + /** + * 按规则字段 构建合并规则key + */ + private static StringBuilder buildRule(DynamicObject bill, DynamicObjectCollection entryentity) { + StringBuilder rule = new StringBuilder(); + for (DynamicObject entry : entryentity) { + String feildvalue = entry.getString("feildvalue");// 合并字段_标识 + feildvalue = feildvalue.contains("e_") ? feildvalue.replaceFirst("e_", "") : feildvalue; + Object o = bill.get(feildvalue);// 根据标识获取值,并判断值类型,如果是动态对象,取number值,如果是字符串,直接取值 + checkType(o, rule); + } + return rule; + } + + /** + * 合并并赋值批次号保存 + */ + private static void assignBatchNumbersAndSave(Map> map) { + map.forEach((k, v) -> { + long l = System.currentTimeMillis(); + for (DynamicObject bill : v) { + bill.set("batchnum", "" + l); + } + SaveServiceHelper.save(v.toArray(new DynamicObject[0])); + }); + } + + /** + * 判断对象类型,并添加到rule中 + */ + private static void checkType(Object o, StringBuilder rule) { + if (o instanceof DynamicObject) { + DynamicObject dy = (DynamicObject) o; + dy.getString("number"); + rule.append(dy.getString("number")); + } else if (o instanceof String) { + String str = (String) o; + rule.append(str); + } else if (o instanceof BigDecimal) { + BigDecimal bigDecimal = (BigDecimal) o; + rule.append(bigDecimal); + } else if (o instanceof Date) { + long time = ((Date) o).getTime(); + rule.append(time); + } else if (o instanceof Boolean) { + boolean bool = (Boolean) o; + rule.append(bool); + } else if (o instanceof Long) { + long longValue = (Long) o; + rule.append(longValue); + } else { + log.error("对象类型是其他类型"); + } + } +}