Переглянути джерело

1、费用申请单,增加字段显示余额

wanghaiwu 1 тиждень тому
батько
коміт
2fc73dd536

+ 226 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/DailyApplyBillAmountEditPlugin.java

@@ -0,0 +1,226 @@
+package nckd.jimin.jyyy.fi.plugin.form;
+
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.Label;
+import kd.bos.form.control.events.RowClickEvent;
+import kd.bos.form.control.events.RowClickEventListener;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.fi.er.business.daily.service.model.CurrencyBO;
+import kd.fi.er.business.reimamountctl.mode.QuotaCtrlMode;
+import kd.fi.er.business.reimamountctl.mode.QuotaCtrlModeFactory;
+import kd.fi.er.business.reimamountctl.model.QuotaAmountBO;
+import kd.fi.er.business.reimamountctl.utils.QuotaCtrlUtil;
+import kd.fi.er.business.utils.ErCommonUtils;
+import kd.fi.er.business.utils.ErEntityTypeUtils;
+import kd.fi.er.business.utils.ErStdConfig;
+import kd.fi.er.business.utils.ReimburseControlUtils;
+import kd.fi.er.formplugin.daily.web.ReimburseAmountControlFormPlugin;
+import org.apache.commons.lang3.StringUtils;
+import java.math.BigDecimal;
+import java.time.YearMonth;
+import java.util.*;
+
+/**
+ * 单据标识:费用申请单(nckd_er_dailyapplybil_ext)
+ * @author wanghaiwu_kd
+ * @date 2025/09/03
+ */
+public class DailyApplyBillAmountEditPlugin extends AbstractBillPlugIn {
+    private static final Log log = LogFactory.getLog(DailyApplyBillAmountEditPlugin.class);
+    private String quotaDateField = ErStdConfig.get("quotaDateField");
+
+    public DailyApplyBillAmountEditPlugin() {
+    }
+
+    public void registerListener(EventObject e) {
+        this.addEntryRowClick();
+    }
+
+    private void addEntryRowClick() {
+        EntryGrid expenseEntry = (EntryGrid)this.getControl("expenseentryentity");
+        expenseEntry.addRowClickListener(new RowClickEventListener() {
+            public void entryRowClick(RowClickEvent evt) {
+                int row = evt.getRow();
+                DailyApplyBillAmountEditPlugin.this.getPageCache().put("currentExpenseEntryIndex", String.valueOf(row));
+                showHeadBalanceAmount();
+            }
+        });
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+
+        String fieldKey = e.getProperty().getName();
+
+        //费用类型
+        if("nckd_expenseitem".equals(fieldKey) || "happendate".equals(fieldKey)){
+            showHeadBalanceAmount();
+        }
+    }
+
+    private void showHeadBalanceAmount(){
+        ((Label)this.getControl("nckd_reimbursecontrolinfo")).setText("");
+        DynamicObject dataEntity = this.getModel().getDataEntity(true);
+        DynamicObjectCollection expenseEntries = dataEntity.getDynamicObjectCollection("expenseentryentity");
+        String rowIndexStr = this.getPageCache().get("currentExpenseEntryIndex");
+        int currentRowIndex;
+        if (StringUtils.isNotBlank(rowIndexStr)) {
+            currentRowIndex = Integer.parseInt(rowIndexStr);
+        } else {
+            currentRowIndex = this.getModel().getEntryCurrentRowIndex("expenseentryentity");
+        }
+
+        if (currentRowIndex >= 0 && expenseEntries.size() > 0) {
+            if (currentRowIndex >= expenseEntries.size()) {
+                currentRowIndex = 0;
+            }
+
+            DynamicObject expenseEntry = (DynamicObject)expenseEntries.get(currentRowIndex);
+            if (!this.validRow(expenseEntry)) {
+                ((Label)this.getControl("nckd_reimbursecontrolinfo")).setText("");
+            } else {
+                IDataModel model = this.getModel();
+                Long companyId = ErCommonUtils.getPk((DynamicObject)model.getValue("company"));
+                String personCtrlCurrency = (String)ErCommonUtils.getEMParameter(companyId, "personctlcurrency");
+                String deptCtrlCurrency = (String)ErCommonUtils.getEMParameter(companyId, "deptctlcurrency");
+                List<String> empCltList = this.getEmpCltBill();
+                List<String> deptCltList = this.getDeptCltBill();
+                DynamicObject currency = (DynamicObject)model.getValue("currency");
+                Long currencyId = currency == null ? 0L : (Long)currency.getPkValue();
+                DynamicObject amountControlCompanyDO = ReimburseControlUtils.getReimburseControlCompany(model.getDataEntity());
+
+                QuotaAmountBO reimAmountBO = new QuotaAmountBO();
+                reimAmountBO.setCompanyId((Long)amountControlCompanyDO.getPkValue());
+                reimAmountBO.setEmpCtlBill(empCltList);
+                reimAmountBO.setDeptCtlBill(deptCltList);
+                DynamicObject expenseitem = expenseEntry.getDynamicObject("expenseitem");
+
+                expenseitem = BusinessDataServiceHelper.loadSingle(expenseitem.getPkValue(), expenseitem.getDynamicObjectType().getName());
+
+                if(expenseitem == null){
+                    return;
+                }
+                String isreimburseamountctl = expenseitem.getString("isreimburseamountctl");
+
+                if (!"1".equals(isreimburseamountctl)) {
+                    return;
+                }
+                reimAmountBO.setExpenseItemId((Long)expenseitem.getPkValue());
+                reimAmountBO.setCtrlCount(expenseitem.getInt("reimburseamountctlcount"));
+                reimAmountBO.setCtrlMethod(expenseitem.getString("reimburseamountctlmethod"));
+                reimAmountBO.setCtrlType(expenseitem.getString("reimctltype"));
+
+
+                reimAmountBO.setCtrlMode(isreimburseamountctl);
+
+                Long oriCurrencyId = (Long)expenseEntry.getDynamicObject("entrycurrency").getPkValue();
+                reimAmountBO.setUserOrDeptId((Long)dataEntity.getDynamicObject("applier").getPkValue());
+                QuotaCtrlUtil.genQuotaCurrency(reimAmountBO, personCtrlCurrency, oriCurrencyId, currencyId);
+                String showName = dataEntity.getDynamicObject("applier").getLocaleString("name").getLocaleValue();
+
+                Date date = expenseEntry.getDate("happendate");
+                if ("2".equals(this.quotaDateField)) {
+                    date = (Date)model.getValue("bizdate");
+                }
+
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(date);
+                reimAmountBO.setHappenDate(YearMonth.of(calendar.get(1), calendar.get(2) + 1));
+
+//                boolean isAduit = false;
+//                if (Arrays.asList("B", "C").contains((String)model.getValue("billstatus"))) {
+//                    isAduit = true;
+//                }
+
+                List<Long> excludeReimbureBillIds = new ArrayList();
+//                if (isAduit) {
+//                    excludeReimbureBillIds.add((Long)model.getDataEntity().getPkValue());
+//                    log.info("是审核状态, 排除的单据为: " + excludeReimbureBillIds);
+//                }
+
+                reimAmountBO.setNotInIds(excludeReimbureBillIds);
+                QuotaCtrlMode quotaCtrlMode = QuotaCtrlModeFactory.getQuotaCtrlMode(reimAmountBO);
+                BigDecimal balanceAmount = quotaCtrlMode.getBalanceAmount(reimAmountBO);
+                if ("2".equals(reimAmountBO.getCtrlType()) && balanceAmount == null) {
+                    ((Label)this.getControl("nckd_reimbursecontrolinfo")).setText("");
+                } else {
+                    if (balanceAmount == null) {
+                        balanceAmount = BigDecimal.ZERO;
+                    }
+
+                    String balanceAmountStr = ErCommonUtils.getMoneyStringWithSymbol(balanceAmount, new CurrencyBO(reimAmountBO.getCurrencyId()));
+                    String expenseItemName = expenseitem.getLocaleString("name").getLocaleValue();
+                    String template = ResManager.loadKDString("可用额度: %1$s|%2$s|%3$s", "ReimburseAmountControlFormPlugin_0", "fi-er-formplugin", new Object[0]);
+                    String reimburseControlInfo = String.format(template, showName, expenseItemName, balanceAmountStr);
+                    ((Label)this.getControl("nckd_reimbursecontrolinfo")).setText(reimburseControlInfo);
+                }
+            }
+        } else {
+            ((Label)this.getControl("nckd_reimbursecontrolinfo")).setText("");
+        }
+    }
+
+    private boolean validRow(DynamicObject entry) {
+        DynamicObject expenseitem = entry.getDynamicObject("expenseitem");
+        boolean on = expenseitem != null && entry.getDynamicObject("entrycurrency") != null && entry.getDate("happendate") != null;
+        if (!on) {
+            return false;
+        } else {
+            String isreimburseamountctl = expenseitem.getString("isreimburseamountctl");
+            DynamicObject reimburser;
+
+            if ("1".equals(isreimburseamountctl)) {
+                reimburser = this.getModel().getDataEntity().getDynamicObject("applier");
+
+                if (reimburser == null) {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+    }
+
+    private List<String> getEmpCltBill() {
+        String pageEmpCltBill = this.getPageCache().get("empCltBill");
+        if (StringUtils.isNotBlank(pageEmpCltBill)) {
+            List<String> empCltList = Arrays.asList(pageEmpCltBill.split(","));
+            return empCltList;
+        } else {
+            DynamicObject company = (DynamicObject)this.getModel().getValue("company");
+            if (company == null) {
+                return new ArrayList();
+            } else {
+                String empCltBill = (String)ErCommonUtils.getEMParameter((Long)company.getPkValue(), "empquotaapplicablebill");
+                this.getPageCache().put("empCltBill", empCltBill);
+                return Arrays.asList(empCltBill.split(","));
+            }
+        }
+    }
+
+    private List<String> getDeptCltBill() {
+        String pageDeptCltBill = this.getPageCache().get("deptCltBill");
+        if (StringUtils.isNotBlank(pageDeptCltBill)) {
+            List<String> deptCltList = Arrays.asList(pageDeptCltBill.split(","));
+            return deptCltList;
+        } else {
+            DynamicObject company = (DynamicObject)this.getModel().getValue("company");
+            if (company == null) {
+                return new ArrayList();
+            } else {
+                String deptCltBill = (String)ErCommonUtils.getEMParameter((Long)company.getPkValue(), "deptquotaapplicablebill");
+                this.getPageCache().put("deptCltBill", deptCltBill);
+                return Arrays.asList(deptCltBill.split(","));
+            }
+        }
+    }
+}