From 785132b4399fd142c60554f90a5bc3354b0c77e4 Mon Sep 17 00:00:00 2001
From: zhangzhiguo <zhangzhiguo@123>
Date: Mon, 10 Mar 2025 18:05:42 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=98=E6=AC=BE=E6=94=B6=E6=AC=BE=E4=BC=9A?=
 =?UTF-8?q?=E8=AE=A1=E7=A7=91=E7=9B=AE=E8=BF=87=E6=BB=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../plugin/operate/PaymentApplyFundExtOp.java |  9 ++-
 .../operate/PaymentMaxAmountExtValidator.java | 59 +++++++++++++------
 2 files changed, 50 insertions(+), 18 deletions(-)

diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentApplyFundExtOp.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentApplyFundExtOp.java
index 68197b4..877ce5d 100644
--- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentApplyFundExtOp.java
+++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentApplyFundExtOp.java
@@ -1,6 +1,7 @@
 package zcgj.zcdev.zcdev.pr.plugin.operate;
 
 import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
 import kd.bos.entity.validate.AbstractValidator;
 import kd.ec.contract.opplugin.fund.PaymentApplyFundOp;
 import kd.ec.contract.opplugin.fund.validator.PaymentMaxAmountValidator;
@@ -11,12 +12,18 @@ import java.util.List;
 
 public class PaymentApplyFundExtOp extends PaymentApplyFundOp {
 
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+       // e.getFieldKeys().add("zcgj_pricetype");
+    }
+
     @Override
     public void onAddValidators(AddValidatorsEventArgs e) {
         super.onAddValidators(e);
         List<AbstractValidator> validators = e.getValidators();
         // 删除标品校验器
-//        validators.removeIf(validator -> validator instanceof PaymentMaxAmountValidator);
+        validators.removeIf(validator -> validator instanceof PaymentMaxAmountValidator);
         validators.removeIf(validator -> validator instanceof PaymentTypeValidator);
         // 添加定制二开的校验器(位置放第一位,优先执行)
         validators.add(0, new PaymentMaxAmountExtValidator());
diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentMaxAmountExtValidator.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentMaxAmountExtValidator.java
index 53fb419..d0d3f3c 100644
--- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentMaxAmountExtValidator.java
+++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/operate/PaymentMaxAmountExtValidator.java
@@ -4,10 +4,15 @@ import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.resource.ResManager;
 import kd.bos.dataentity.utils.StringUtils;
 import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.ec.basedata.common.utils.CurrencyFormatUtil;
 import kd.ec.contract.opplugin.fund.validator.PaymentMaxAmountValidator;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -15,28 +20,48 @@ public class PaymentMaxAmountExtValidator extends PaymentMaxAmountValidator {
 
     @Override
     protected void maxShouldPayAmountValidate(Map<Long, BigDecimal> contractTypeShouldPayAmountMap, Map<Long, BigDecimal> shouldPayAmountMap, Map<Long, Set<String>> appliedBillMap, ExtendedDataEntity dataEntity, int i, DynamicObject entry, DynamicObject contract) {
-
         long contractId = contract.getLong("id");
-        BigDecimal maxShouldPayAmount = this.calculateMaxShouldPayAmount(contract);
-        DynamicObject contCurrency = contract.getDynamicObject("currency");
-        if (contCurrency != null) {
-            maxShouldPayAmount = maxShouldPayAmount.setScale(contCurrency.getInt("amtprecision"), 4);
-        }
 
-        BigDecimal curMaxShouldPayAmount = entry.getBigDecimal("maxshouldpayamt");
-        BigDecimal curShouldPayAmount = entry.getBigDecimal("applyoftaxamount");
-        BigDecimal submitShouldPayAmount = (BigDecimal)shouldPayAmountMap.getOrDefault(contractId, BigDecimal.ZERO);
-        BigDecimal totalShouldPayAmount = (BigDecimal)contractTypeShouldPayAmountMap.getOrDefault(contractId, BigDecimal.ZERO);
-        if (totalShouldPayAmount.add(submitShouldPayAmount).compareTo(maxShouldPayAmount) > 0) {
-            if (appliedBillMap.containsKey(contractId)) {
+        QFilter contractIdFilter = new QFilter("id", QCP.equals,contractId);
+        DynamicObject contractObj = BusinessDataServiceHelper.loadSingle("ec_out_contract", "id,zcgj_pricetype", new QFilter[]{contractIdFilter});
+        if(contractObj!=null)
+        {
+            String zcgjPricetype = contractObj.getString("zcgj_pricetype");
+            if(!"bdlbdj".equals(zcgjPricetype)){ //如果支出合同计价方式为不定量不定价时,则移除校验
+                BigDecimal maxShouldPayAmount = this.calculateMaxShouldPayAmount(contract);
+                DynamicObject contCurrency = contract.getDynamicObject("currency");
+                if (contCurrency != null) {
+                    maxShouldPayAmount = maxShouldPayAmount.setScale(contCurrency.getInt("amtprecision"), 4);
+                }
+                BigDecimal curMaxShouldPayAmount = entry.getBigDecimal("maxshouldpayamt");
+                BigDecimal curShouldPayAmount = entry.getBigDecimal("applyoftaxamount");
+                BigDecimal submitShouldPayAmount = (BigDecimal)shouldPayAmountMap.getOrDefault(contractId, BigDecimal.ZERO);
+                BigDecimal totalShouldPayAmount = (BigDecimal)contractTypeShouldPayAmountMap.getOrDefault(contractId, BigDecimal.ZERO);
+                if (totalShouldPayAmount.add(submitShouldPayAmount).compareTo(maxShouldPayAmount) > 0) {
+                    if (appliedBillMap.containsKey(contractId)) {
 //                Set<String> billNumbers = (Set)appliedBillMap.get(contractId);
 //                this.addErrorMessage(dataEntity, String.format(ResManager.loadKDString("合同付款信息:第%1$s行因受流程中单据(单据号:%2$s)影响,继续提交将超过应付金额上限。在途金额:%3$s。", "PaymentMaxAmountValidator_6", "ec-contract-opplugin", new Object[0]), i + 1, StringUtils.join(billNumbers.toArray(new String[0]), ","), CurrencyFormatUtil.getAfterFormatString(contCurrency, submitShouldPayAmount.add(totalShouldPayAmount.subtract(curShouldPayAmount)))));
-            } else if (maxShouldPayAmount.compareTo(curMaxShouldPayAmount) != 0) {
-                this.addErrorMessage(dataEntity, String.format(ResManager.loadKDString("合同付款信息:第%s行因暂存期间存在其他单据提交审核,导致应付金额上限发生变化,本单数据未刷新,继续提交将超过应付金额上限。", "PaymentMaxAmountValidator_1", "ec-contract-opplugin", new Object[0]), i + 1));
-            } else {
-                this.addErrorMessage(dataEntity, String.format(ResManager.loadKDString("合同付款信息:第%s行本次应付金额不允许超应付金额上限,请确认。", "PaymentMaxAmountValidator_2", "ec-contract-opplugin", new Object[0]), i + 1));
+                    } else if (maxShouldPayAmount.compareTo(curMaxShouldPayAmount) != 0) {
+                        this.addErrorMessage(dataEntity, String.format(ResManager.loadKDString("合同付款信息:第%s行因暂存期间存在其他单据提交审核,导致应付金额上限发生变化,本单数据未刷新,继续提交将超过应付金额上限。", "PaymentMaxAmountValidator_1", "ec-contract-opplugin", new Object[0]), i + 1));
+                    } else {
+                        this.addErrorMessage(dataEntity, String.format(ResManager.loadKDString("合同付款信息:第%s行本次应付金额不允许超应付金额上限,请确认。", "PaymentMaxAmountValidator_2", "ec-contract-opplugin", new Object[0]), i + 1));
+                    }
+                }
             }
-
         }
     }
+
+    protected void maxApplyAmountValidate(Map<Long, BigDecimal> shouldPayAmountMap, Map<Long, BigDecimal> deductionAmountMap, Map<String, BigDecimal> contractTypeApplyAmountMap, Map<String, BigDecimal> appliedAmountMap, Map<String, Set<String>> appliedBillMap, ExtendedDataEntity dataEntity, int i, DynamicObject entry, DynamicObject contract, String type, String key) {
+        long contractId = contract.getLong("id");
+
+        QFilter contractIdFilter = new QFilter("id", QCP.equals,contractId);
+        DynamicObject contractObj = BusinessDataServiceHelper.loadSingle("ec_out_contract", "id,zcgj_pricetype", new QFilter[]{contractIdFilter});
+        if(contractObj!=null){
+            String zcgjPricetype = contractObj.getString("zcgj_pricetype");
+            if(!"bdlbdj".equals(zcgjPricetype)){ //如果支出合同计价方式为不定量不定价时,则移除校验
+                super.maxApplyAmountValidate( shouldPayAmountMap,  deductionAmountMap,  contractTypeApplyAmountMap,  appliedAmountMap,  appliedBillMap,  dataEntity,  i,  entry,  contract,  type,  key);
+            }
+        }
+
+    }
 }