package shkd.repc.recon.formplugin; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.form.field.BasedataEdit; import kd.bos.form.field.RefBillEdit; import kd.bos.form.field.events.BeforeF7SelectEvent; import kd.bos.form.field.events.BeforeF7SelectListener; import kd.bos.form.plugin.AbstractFormPlugin; import kd.bos.list.ListShowParameter; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.sdk.plugin.Plugin; import java.math.BigDecimal; import java.util.*; /** * 动态表单插件 * 【费用登记】-采购计划F7过滤 */ public class ConNoTextBillFromPlugin extends AbstractFormPlugin implements Plugin, BeforeF7SelectListener { @Override public void registerListener(EventObject e) { super.registerListener(e); RefBillEdit bEdit = this.getView().getControl("qeug_refbillfield"); bEdit.addBeforeF7SelectListener(this); } @Override public void beforeF7Select(BeforeF7SelectEvent evt) { ListShowParameter formShowParameter = (ListShowParameter) evt.getFormShowParameter(); List canSeeDataId = new ArrayList<>(); // 获取当前组织 DynamicObject org = (DynamicObject) this.getModel().getValue("org"); String orgName = org.getString("name"); // 查找所有已审核的采购需求数据(单据状态 = "C") QFilter statusFilter = new QFilter("billstatus", QCP.equals, "C"); QFilter orgFilter = new QFilter("org.name", QCP.equals, orgName); DynamicObject[] settlePlanBills = BusinessDataServiceHelper.load("recon_settleplanbill", "id,bill,qeug_applyamount", statusFilter.and(orgFilter).toArray()); // 若无数据,直接返回 if (settlePlanBills == null || settlePlanBills.length == 0) { return; } // 遍历所有采购需求数据 for (DynamicObject settlePlanBill : settlePlanBills) { long id = settlePlanBill.getLong("id"); BigDecimal applyAmount = settlePlanBill.getBigDecimal("qeug_applyamount"); // 查询当前采购需求的所有相关费用登记 QFilter refFilter = new QFilter("qeug_refbillfield.id", QCP.equals, id); DynamicObject[] conNoTextBills = BusinessDataServiceHelper.load("recon_connotextbill", "id,oriamt", refFilter.toArray()); // 计算所有已使用金额 BigDecimal totalUsedAmount = Arrays.stream(conNoTextBills) .map(bill -> bill.getBigDecimal("oriamt")) .reduce(BigDecimal.ZERO, BigDecimal::add); // 若申请金额大于已使用金额,则允许选择 if (applyAmount.compareTo(totalUsedAmount) > 0) { canSeeDataId.add(id); } } // 仅当有可用数据时,才设置过滤条件 if (!canSeeDataId.isEmpty()) { List qFilters = Collections.singletonList(new QFilter("id", QCP.in, canSeeDataId)); formShowParameter.getListFilterParameter().setQFilters(qFilters); } } }