package tqq9.lc123.cloud.app.plugin.operate.pm; 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.PreparePropertysEventArgs; import kd.bos.entity.validate.AbstractValidator; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.util.StringUtils; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import java.util.Set; //提交校验付款单可结算金额 public class PurOrderSubmitValidOp extends AbstractOperationServicePlugIn { @Override public void onPreparePropertys(PreparePropertysEventArgs e) { super.onPreparePropertys(e); e.getFieldKeys().add("billno"); e.getFieldKeys().add("purbillentry_pay.isprepay"); e.getFieldKeys().add("purbillentry_pay.tqq9_paybillno"); e.getFieldKeys().add("purbillentry_pay.tqq9_settleamount"); } @Override public void onAddValidators(AddValidatorsEventArgs e) { super.onAddValidators(e); e.addValidator(new AbstractValidator() { @Override public void validate() { ExtendedDataEntity[] dataEntities1 = this.getDataEntities(); for (ExtendedDataEntity extendedDataEntity : dataEntities1) { DynamicObject dataEntity = extendedDataEntity.getDataEntity(); DynamicObjectCollection purbillentry_pay = dataEntity.getDynamicObjectCollection("purbillentry_pay"); //本采购订单的付款单map Map map = new HashMap<>(); for (DynamicObject dynamicObject : purbillentry_pay) { boolean isprepay = dynamicObject.getBoolean("isprepay");//是否预付 if (isprepay) { String tqq9_paybillno = dynamicObject.getString("tqq9_paybillno");//付款处理单 if (StringUtils.isNotEmpty(tqq9_paybillno)) { BigDecimal tqq9_settleamount = dynamicObject.getBigDecimal("tqq9_settleamount") == null ? BigDecimal.ZERO : dynamicObject.getBigDecimal("tqq9_settleamount");//本次结算金额 map.put(tqq9_paybillno, tqq9_settleamount); } } } Set set = map.keySet(); if (set.size() > 0) { //查询非当前订单,已提交已审核的订单 DynamicObject[] pm_purorderbills = BusinessDataServiceHelper.load("pm_purorderbill", "id,billno,purbillentry_pay.tqq9_paybillno,purbillentry_pay.isprepay,purbillentry_pay.tqq9_settleamount" , new QFilter[]{new QFilter("purbillentry_pay.tqq9_paybillno", QCP.in, set) , new QFilter("billno", QCP.not_equals, dataEntity.getString("billno")) , new QFilter("billstatus", QCP.in, new String[]{"B","C"})}); //历史采购订单的付款单map Map settleMap = new HashMap<>(); if (null != pm_purorderbills && pm_purorderbills.length > 0) { for (DynamicObject pm_purorderbill : pm_purorderbills) { DynamicObjectCollection purbillentry_pay1 = pm_purorderbill.getDynamicObjectCollection("purbillentry_pay"); for (DynamicObject dynamicObject : purbillentry_pay1) { boolean isprepay = dynamicObject.getBoolean("isprepay");//是否预付 if (isprepay) { String tqq9_paybillno = dynamicObject.getString("tqq9_paybillno");//付款处理单 if (StringUtils.isNotEmpty(tqq9_paybillno) && set.contains(tqq9_paybillno)) { BigDecimal tqq9_settleamount = dynamicObject.getBigDecimal("tqq9_settleamount") == null ? BigDecimal.ZERO : dynamicObject.getBigDecimal("tqq9_settleamount");//本次结算金额 if (!settleMap.containsKey(tqq9_paybillno)) { settleMap.put(tqq9_paybillno, tqq9_settleamount); } else { BigDecimal bigDecimal = settleMap.get(tqq9_paybillno); settleMap.put(tqq9_paybillno, tqq9_settleamount.add(bigDecimal)); } } } } } } //每个付款单的未结算金额 DynamicObject[] cas_paybills = BusinessDataServiceHelper.load("cas_paybill", "id,billno,actpayamt" , new QFilter[]{new QFilter("billno", QCP.in, set)}); Map unSettleMap = new HashMap<>(); for (DynamicObject cas_paybill : cas_paybills) { String casPayBillNo = cas_paybill.getString("billno"); BigDecimal actpayamt = cas_paybill.getBigDecimal("actpayamt") == null ? BigDecimal.ZERO : cas_paybill.getBigDecimal("actpayamt");//付款金额 unSettleMap.put(casPayBillNo, actpayamt); } for (String casPayBillNo : set) { BigDecimal amount = map.get(casPayBillNo) == null ? BigDecimal.ZERO : map.get(casPayBillNo);//此次结算金额 BigDecimal actpayamt = unSettleMap.get(casPayBillNo) == null ? BigDecimal.ZERO : unSettleMap.get(casPayBillNo);//付款单付款金额 BigDecimal settleamount = settleMap.get(casPayBillNo) == null ? BigDecimal.ZERO : settleMap.get(casPayBillNo);//历史已结算金额 BigDecimal leftAmount = actpayamt.subtract(settleamount);//剩余结算金额 //此次结算金额>剩余可结算金额提示 if (amount.compareTo(leftAmount) > 0) { this.addErrorMessage(extendedDataEntity, "付款单:" + casPayBillNo + "可结算金额不足"); } } } } } }); } }