From adb793af063443a52d44bd7a9f3cd44cc2f9dff7 Mon Sep 17 00:00:00 2001 From: xuhaihui <2098865055@qq.com> Date: Mon, 24 Nov 2025 16:46:51 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BA=8C=E5=BC=80=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=8F=92=E4=BB=B6-=E4=BC=81=E4=B8=9A=E6=88=90=E6=9C=AC?= =?UTF-8?q?=E6=A0=B8=E7=AE=97=E6=8F=90=E4=BA=A4=E6=93=8D=E4=BD=9C=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/ContractCostMustInputOPExt.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/ContractCostMustInputOPExt.java diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/ContractCostMustInputOPExt.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/ContractCostMustInputOPExt.java new file mode 100644 index 0000000..66f85c8 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/ContractCostMustInputOPExt.java @@ -0,0 +1,102 @@ +package zcgj.zcdev.zcdev.pr.plugin.operate; + +import ec.ecco.opplugin.ContractCostMustInputOP; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.resource.ResManager; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.ExtendedDataEntity; +import kd.bos.entity.plugin.AbstractOperationServicePlugIn; +import kd.bos.entity.plugin.AddValidatorsEventArgs; +import kd.bos.entity.plugin.PreparePropertysEventArgs; +import kd.bos.entity.validate.AbstractValidator; +import kd.ec.basedata.common.enums.CostControlModelEnum; +import kd.ec.basedata.common.utils.EcProjectHelper; + +import java.util.Iterator; +import java.util.List; + +/** + * 二开系统插件-企业成本核算提交操作插件 + */ +public class ContractCostMustInputOPExt extends AbstractOperationServicePlugIn { + + public void onPreparePropertys(PreparePropertysEventArgs e) { + super.onPreparePropertys(e); + e.getFieldKeys().add("costaccount"); + e.getFieldKeys().add("cbs"); + e.getFieldKeys().add("boq"); + e.getFieldKeys().add("resource"); + e.getFieldKeys().add("unitproject"); + } + + public void onAddValidators(AddValidatorsEventArgs e) { + super.onAddValidators(e); + e.getValidators().add(new OtestValidator()); + } + + private class OtestValidator extends AbstractValidator { + private OtestValidator() { + } + + public void validate() { + String key = this.getOperateKey(); + if (StringUtils.equals(key, "submit")) { + ExtendedDataEntity[] dataEntities = this.getDataEntities(); + ExtendedDataEntity[] var3 = dataEntities; + int var4 = dataEntities.length; + + for (int var5 = 0; var5 < var4; ++var5) { + ExtendedDataEntity extendedDataEntity = var3[var5]; + DynamicObject dynamicObject = extendedDataEntity.getDataEntity(); + DynamicObjectCollection collection = dynamicObject.getDynamicObjectCollection("entryentity"); + if (collection != null) { + for (int i = 0; i < collection.size(); ++i) { + DynamicObject entry = (DynamicObject) collection.get(i); + DynamicObject project = entry.getDynamicObject("project"); + if (project != null) { + Long projectId = project.getLong("id"); + List modelList = EcProjectHelper.getCostControlModelList(projectId); + Iterator var14 = modelList.iterator(); + + while (var14.hasNext()) { + String string = (String) var14.next(); + DynamicObject rs; + if (StringUtils.equals(string, CostControlModelEnum.CBS.getValue())) { +/* rs = entry.getDynamicObject("cbs"); + if (rs == null) { + this.addErrorMessage(extendedDataEntity, String.format(ResManager.loadKDString("分录第[%1$s]行的项目勾选了%2$s核算维度,请填写%3$s字段!", "ContractCostMustInputOP_0", "ec-ecco-opplugin", new Object[0]), i + 1, "CBS", "“CBS”")); + }*/ + } else if (StringUtils.equals(string, CostControlModelEnum.CA.getValue())) { + rs = entry.getDynamicObject("costaccount"); + if (rs == null) { + this.addErrorMessage(extendedDataEntity, String.format(ResManager.loadKDString("分录第[%1$s]行的项目勾选了%2$s核算维度,请填写%3$s字段!", "ContractCostMustInputOP_0", "ec-ecco-opplugin", new Object[0]), i + 1, "CA", "“CA”")); + } + } else if (StringUtils.equals(string, CostControlModelEnum.BOQ.getValue())) { + rs = entry.getDynamicObject("boq"); + if (rs == null) { + this.addErrorMessage(extendedDataEntity, String.format(ResManager.loadKDString("分录第[%1$s]行的项目勾选了%2$s核算维度,请填写%3$s字段!", "ContractCostMustInputOP_0", "ec-ecco-opplugin", new Object[0]), i + 1, "BOQ", "“BOQ”")); + } + } else if (StringUtils.equals(string, CostControlModelEnum.RS.getValue())) { + rs = entry.getDynamicObject("resource"); + if (rs == null) { + this.addErrorMessage(extendedDataEntity, String.format(ResManager.loadKDString("分录第[%1$s]行的项目勾选了%2$s核算维度,请填写%3$s字段!", "ContractCostMustInputOP_0", "ec-ecco-opplugin", new Object[0]), i + 1, "RS", ResManager.loadKDString("“资源名称”", "ContractCostMustInputOP_1", "ec-ecco-opplugin", new Object[0]))); + } + } + } + + String boqMode = project.getString("boqmode"); + if (boqMode != null && "unitproject".equals(boqMode)) { + DynamicObject unitProject = entry.getDynamicObject("unitproject"); + if (unitProject == null) { + this.addErrorMessage(extendedDataEntity, String.format(ResManager.loadKDString("分录第[%1$s]行的项目的业务核算模式为按单位工程/标段核算,请填写%2$s字段!", "ContractCostMustInputOP_2", "ec-ecco-opplugin", new Object[0]), i + 1, ResManager.loadKDString("“单位工程/标段”", "ContractCostMustInputOP_3", "ec-ecco-opplugin", new Object[0]))); + } + } + } + } + } + } + } + } + } +} From a8d526bea850acdb0d9d2cf819622fc1b4f3b268 Mon Sep 17 00:00:00 2001 From: xuhaihui <2098865055@qq.com> Date: Mon, 24 Nov 2025 17:17:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E6=88=90=E6=9C=AC?= =?UTF-8?q?=E6=A0=B8=E7=AE=97=E8=A1=A8=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/form/EntCostSplitBillPlugin.java | 65 ++++++++++++++++--- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/EntCostSplitBillPlugin.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/EntCostSplitBillPlugin.java index 77358e0..d64416e 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/EntCostSplitBillPlugin.java +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/EntCostSplitBillPlugin.java @@ -5,6 +5,8 @@ import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType; import kd.bos.dataentity.resource.ResManager; +import kd.bos.entity.datamodel.events.ChangeData; +import kd.bos.entity.datamodel.events.PropertyChangedArgs; import kd.bos.form.events.BeforeDoOperationEventArgs; import kd.bos.form.operate.FormOperate; import kd.bos.orm.query.QCP; @@ -18,6 +20,8 @@ import java.util.*; /** * 企业成本核算表单插件 * 说明:1:点击自动取数按钮获取核算余额表 + * 2:子分录成本分解结构跟随父分录成本分解结构赋值 + * 工序即为成本分解结构 */ public class EntCostSplitBillPlugin extends AbstractBillPlugIn { @Override @@ -25,6 +29,24 @@ public class EntCostSplitBillPlugin extends AbstractBillPlugIn { super.registerListener(e); } + @Override + public void propertyChanged(PropertyChangedArgs e) { + super.propertyChanged(e); + String key = e.getProperty().getName(); + if ("cbs".equals(key)) { + //企业费用成本分摊明细分录-成本分解结构 + //子分录跟随父分录字段赋值逻辑 + ChangeData changeData = e.getChangeSet()[0]; + DynamicObject dataEntity = changeData.getDataEntity(); + DynamicObject cbs = (DynamicObject) changeData.getNewValue();//成本分解结构新值 + DynamicObjectCollection subEntryEntityCollection = dataEntity.getDynamicObjectCollection("zcgj_subentryentity");//成本核算维度明细 + for (DynamicObject subEntryEntity : subEntryEntityCollection) { + subEntryEntity.set("zcgj_cbs", cbs);//成本核算维度明细-成本分解结构 + } + this.getView().updateView("zcgj_subentryentity");//刷新成本核算维度明细 + } + } + public void beforeDoOperation(BeforeDoOperationEventArgs args) { super.beforeDoOperation(args); FormOperate formOperate = (FormOperate) args.getSource(); @@ -105,10 +127,8 @@ public class EntCostSplitBillPlugin extends AbstractBillPlugIn { Object costType = zcgj_accountcost != null ? zcgj_accountcost.get("zcgj_acccostentry.zcgj_costtype") : null; // 成本项 Object secType = zcgj_accountcost != null ? zcgj_accountcost.get("zcgj_acccostentry.zcgj_sectype") : null; // 二级分类 -/* // 替换原有的单一条件检查代码,使用以下代码块: String secTypeName = ""; String costTypeName = ""; - if (secType != null) { if (secType instanceof DynamicObject) { DynamicObject secTypeObj = (DynamicObject) secType; @@ -117,7 +137,6 @@ public class EntCostSplitBillPlugin extends AbstractBillPlugIn { secTypeName = secType.toString(); } } - if (costType != null) { if (costType instanceof DynamicObject) { DynamicObject costTypeObj = (DynamicObject) costType; @@ -127,19 +146,45 @@ public class EntCostSplitBillPlugin extends AbstractBillPlugIn { } } - // 如果二级分类为"70.55"且成本项为"70",则跳过该条记录 + // 如果二级分类为"70.55"且成本项为"70",则对该行的成本金额进行扣减 if ("70.55".equals(secTypeName) && "70.".equals(costTypeName)) { + QFilter filter5 = new QFilter("billstatus", QCP.equals, "C");//单据状态 + filter5.and(new QFilter("zcgj_entryentity.zcgj_assperiod", QCP.equals, period1.getPkValue()));//折旧期间 + filter5.and(new QFilter("zcgj_entryentity.zcgj_headusedept", QCP.equals, org1.getPkValue()));//使用部门 + DynamicObject eceq_equipinfo = QueryServiceHelper.queryOne("eceq_equipinfo", + "id,zcgj_entryentity.zcgj_shareamount", + new QFilter[]{filter5});//"设备详情" + if (eceq_equipinfo != null) { + BigDecimal zcgj_shareamount = eceq_equipinfo.getBigDecimal("zcgj_entryentity.zcgj_shareamount");//设备详情的成本金额 + + // 扣减成本金额 + Object currentAmount = rptAssistBalanceGx.get("zcgj_debitlocal"); + BigDecimal newAmount = new BigDecimal(currentAmount != null ? currentAmount.toString() : "0") + .subtract(zcgj_shareamount != null ? zcgj_shareamount : BigDecimal.ZERO); + + // 确保不会出现负数 + if (newAmount.compareTo(BigDecimal.ZERO) < 0) { + newAmount = BigDecimal.ZERO; + } + + // 更新rptAssistBalanceGx中的金额 + rptAssistBalanceGx.set("zcgj_debitlocal", newAmount); + } + } + + // 如果成本项为null,则跳过该行 + if (costType == null) { continue; - }*/ + } String uniqueKey = ""; if (processName != null && !processName.isEmpty()) { // 存在工序时,按照工序+成本项+二级分类去重 - uniqueKey = "PROCESS_" + processName + "_" + (costType != null ? costType.toString() : "") + "_" + (secType != null ? secType.toString() : ""); + uniqueKey = "PROCESS_" + processName + "_" + costType.toString() + "_" + (secType != null ? secType.toString() : ""); } else { // 如果没有工序,则按照成本项+二级分类去重 - uniqueKey = "NONE_" + (costType != null ? costType.toString() : "") + "_" + (secType != null ? secType.toString() : ""); + uniqueKey = "NONE_" + costType.toString() + "_" + (secType != null ? secType.toString() : ""); } DynamicObject existingEntry = summaryMap.get(uniqueKey); @@ -214,10 +259,10 @@ public class EntCostSplitBillPlugin extends AbstractBillPlugIn { Object costType1 = entry1.get("costtype"); Object costType2 = entry2.get("costtype"); - // 处理null值情况 - 将null值放在最后 + // 处理null值情况 - 将null值放在前面 if (costType1 == null && costType2 == null) return 0; - if (costType1 == null) return 1; // null值排在后面 - if (costType2 == null) return -1; // null值排在后面 + if (costType1 == null) return -1; // null值排在前面 + if (costType2 == null) return 1; // null值排在前面 // 提取数值部分进行比较 String value1 = costType1.toString().replaceAll("[^0-9]", "");