From 5407792a4a197a437ce787187d2e62a40cc24120 Mon Sep 17 00:00:00 2001 From: xuhaihui <2098865055@qq.com> Date: Thu, 25 Sep 2025 16:17:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E5=85=AC=E6=8A=A5=E9=94=80=E5=8D=95?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=A0=A1=E9=AA=8C=E6=8F=92=E4=BB=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=A0=A1=E9=AA=8C=E5=BE=80=E6=9D=A5=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=E6=9C=89=E9=A2=84=E4=BB=98=E4=BD=86=E6=9C=AA=E5=86=B2=E9=94=80?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E9=9C=80=E5=A1=AB=E5=86=99=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/PublicReimburPayerSubOp.java | 79 +++++++++++++++---- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/PublicReimburPayerSubOp.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/PublicReimburPayerSubOp.java index 4ca1a79..4f46f42 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/PublicReimburPayerSubOp.java +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/PublicReimburPayerSubOp.java @@ -2,6 +2,9 @@ package zcgj.zcdev.zcdev.fs.plugin.operate; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.db.DB; +import kd.bos.db.DBRoute; +import kd.bos.db.ResultSetHandler; import kd.bos.entity.ExtendedDataEntity; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.AddValidatorsEventArgs; @@ -9,8 +12,13 @@ import kd.bos.entity.plugin.PreparePropertysEventArgs; import kd.bos.entity.validate.AbstractValidator; import zcgj.zcdev.zcdev.fs.utils.OrgCheckUtils; +import java.math.BigDecimal; +import java.sql.ResultSet; + /* - 对公报销单提交校验插件:校验往来单位与开票公司是否一致,不一致需填写特殊说明 + 对公报销单提交校验插件 + 说明:1:校验往来单位与开票公司是否一致,不一致需填写特殊说明 + 2:校验往来单位有预付但未冲销时,需填写特殊说明 */ public class PublicReimburPayerSubOp extends AbstractOperationServicePlugIn { @@ -22,6 +30,8 @@ public class PublicReimburPayerSubOp extends AbstractOperationServicePlugIn { e.getFieldKeys().add("zcgj_invoiceremark"); e.getFieldKeys().add("makeoutcompname"); e.getFieldKeys().add("costcompany"); + e.getFieldKeys().add("writeoffmoney"); + e.getFieldKeys().add("srcbilltype"); //无合同付款相关 e.getFieldKeys().add("zcgj_isec");//工程单据 //e.getFieldKeys().add("zcgj_ecpaytype");//付款方式 @@ -40,26 +50,63 @@ public class PublicReimburPayerSubOp extends AbstractOperationServicePlugIn { for (ExtendedDataEntity extendedDataEntity : extendedDataEntities) { DynamicObject dataEntity = extendedDataEntity.getDataEntity(); DynamicObject costCompany = dataEntity.getDynamicObject("costcompany");//费用承担公司 - boolean isec = dataEntity.getBoolean("zcgj_isec"); - if (costCompany != null && !isec) { + if (costCompany != null) { Long companyId = costCompany.getLong("id"); if (OrgCheckUtils.isKS(companyId)) { //仅针对矿山下组织下的逻辑 - DynamicObjectCollection invoiceEntryCollection = dataEntity.getDynamicObjectCollection("invoiceentry");//发票信息 - if (invoiceEntryCollection.size() > 0) { - DynamicObject billPayerId = dataEntity.getDynamicObject("billpayerid");//往来单位 - String zcgj_invoiceremark = dataEntity.getString("zcgj_invoiceremark");//特殊说明 - if (billPayerId != null) { - String billPayerIdName = billPayerId.getString("name"); - for (DynamicObject invoiceEntry : invoiceEntryCollection) { - String makeOutCompName = invoiceEntry.getString("makeoutcompname");//开票公司 - if (!makeOutCompName.equals(billPayerIdName) && "".equals(zcgj_invoiceremark)) { - //开票公司与往来单位名称不一致,且特殊说明为空 - this.addFatalErrorMessage(extendedDataEntity, "开票公司与往来单位存在不一致!请填写特殊说明!"); + boolean isec = dataEntity.getBoolean("zcgj_isec");//是否工程单据 + String zcgj_invoiceremark = dataEntity.getString("zcgj_invoiceremark");//特殊说明 + DynamicObject billPayerId = dataEntity.getDynamicObject("billpayerid");//往来单位 + //1:校验往来单位与开票公司是否一致,不一致需填写特殊说明 + if (!isec) { + DynamicObjectCollection invoiceEntryCollection = dataEntity.getDynamicObjectCollection("invoiceentry");//发票信息 + if (invoiceEntryCollection.size() > 0) { + if (billPayerId != null) { + String billPayerIdName = billPayerId.getString("name"); + for (DynamicObject invoiceEntry : invoiceEntryCollection) { + String makeOutCompName = invoiceEntry.getString("makeoutcompname");//开票公司 + if (!makeOutCompName.equals(billPayerIdName) && "".equals(zcgj_invoiceremark)) { + //开票公司与往来单位名称不一致,且特殊说明为空 + this.addFatalErrorMessage(extendedDataEntity, "开票公司与往来单位存在不一致!请填写特殊说明!"); + } } + } else { + this.addFatalErrorMessage(extendedDataEntity, "往来单位为空"); + } + } + } + //2:校验往来单位有预付但未冲销时,需填写特殊说明;系统代码类ChangedAccountByPayer + if (billPayerId != null && "".equals(zcgj_invoiceremark)) { + DynamicObjectCollection writeOffMoneyCollection = dataEntity.getDynamicObjectCollection("writeoffmoney");//冲借款 + boolean hasPrepayWriteOff = false; + + // 检查是否有预付款冲销记录 + for (DynamicObject writeOffMoney : writeOffMoneyCollection) { + String srcBillType = writeOffMoney.getString("srcbilltype");//源单类型 + if ("er_prepaybill".equals(srcBillType)) { + hasPrepayWriteOff = true; + break; + } + } + + // 如果没有预付款冲销记录,则检查是否存在未冲销的预付款 + if (!hasPrepayWriteOff) { + String sql = "select sum(t.fBalanceAmount) BalanceAmount from t_er_prepaybill t where fbillpayerid = " + (Long) billPayerId.getPkValue() + " and FCostCompanyID=" + companyId; + BigDecimal totalBalanceAmount = (BigDecimal) DB.query(DBRoute.of("er"), sql, (ResultSetHandler) resultSet -> { + BigDecimal balanceamount = BigDecimal.ZERO; + + while (resultSet.next()) { + if (resultSet.getBigDecimal("BalanceAmount") != null) { + balanceamount = balanceamount.add(resultSet.getBigDecimal("BalanceAmount")); + } + } + + return balanceamount; + }); + + if (totalBalanceAmount.compareTo(BigDecimal.ZERO) > 0) { + this.addFatalErrorMessage(extendedDataEntity, "往来单位有预付未冲销,不能再提交发起对公付款,请尽快提交冲销发票,才能再次付款,否则需要填写特殊说明!"); } - } else { - this.addFatalErrorMessage(extendedDataEntity, "往来单位为空"); } } }