Przeglądaj źródła

报销单总行计划财务部费用分摊不校验费用部门

wanwei 5 miesięcy temu
rodzic
commit
e93d3b061c

+ 366 - 0
src/main/java/fi/er/opplugin/ErVerifyShareRuleHelperNew.java

@@ -0,0 +1,366 @@
+package fi.er.opplugin;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.fi.er.business.utils.CollectorsUtil;
+import kd.fi.er.business.utils.ErCommonUtils;
+import kd.fi.er.business.utils.ErEntityTypeUtils;
+import kd.fi.er.business.utils.SystemParamterUtil;
+import org.apache.commons.lang3.StringUtils;
+
+public class ErVerifyShareRuleHelperNew {
+    public ErVerifyShareRuleHelperNew() {
+    }
+
+    public static String getVerifyShareRuleMsg(DynamicObject bill) {
+        String msg = verifyCommonRule(bill);
+        if (StringUtils.isNotBlank(msg)) {
+            return msg;
+        } else {
+            msg = verifyOrgRule(bill);
+            if (StringUtils.isNotBlank(msg)) {
+                return msg;
+            } else {
+                msg = verifyMonthRule(bill);
+                return StringUtils.isNotBlank(msg) ? msg : msg;
+            }
+        }
+    }
+
+    private static String verifyCommonRule(DynamicObject bill) {
+        String msg = "";
+        Object shareRule = bill.get("sharerule");
+        if (shareRule == null) {
+            msg = ResManager.loadKDString("请填写分摊规则。", "ErVerifyShareRuleHelper_1", "fi-er-business", new Object[0]);
+            return msg;
+        } else {
+            DynamicObjectCollection entrys = bill.getDynamicObjectCollection("expenseentryentity_rule");
+            if (entrys != null && !entrys.isEmpty()) {
+                if ("avg".equalsIgnoreCase(bill.getString("sharemethod")) && !StringUtils.equals("expenseitemrule", String.valueOf(shareRule))) {
+                    return msg;
+                } else {
+                    int index;
+                    Iterator var6;
+                    DynamicObject obj;
+                    BigDecimal shareRate;
+                    BigDecimal totalshareAmountComRule;
+                    if ("rate".equalsIgnoreCase(bill.getString("sharemethod")) && !StringUtils.equals("expenseitemrule", String.valueOf(shareRule))) {
+                        BigDecimal sumShareRate = BigDecimal.ZERO;
+                        index = 1;
+                        var6 = entrys.iterator();
+
+                        while(true) {
+                            if (!var6.hasNext()) {
+                                totalshareAmountComRule = new BigDecimal(100);
+                                if (isAllShare(bill) && sumShareRate.compareTo(totalshareAmountComRule) != 0) {
+                                    msg = ResManager.loadKDString("分摊比例合计不等于100%,请先修改分摊比例。", "ErVerifyShareRuleHelper_20", "fi-er-business", new Object[0]);
+                                    return msg;
+                                }
+
+                                if (!isAllShare(bill) && sumShareRate.compareTo(totalshareAmountComRule) > 0) {
+                                    msg = ResManager.loadKDString("分摊比例合计超过100%,请先修改分摊比例。", "ErVerifyShareRuleHelper_21", "fi-er-business", new Object[0]);
+                                    return msg;
+                                }
+                                break;
+                            }
+
+                            obj = (DynamicObject)var6.next();
+                            shareRate = obj.getBigDecimal("sharerate_comrule");
+                            if (null == shareRate || shareRate.compareTo(BigDecimal.ZERO) == 0) {
+                                msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“分摊比例”字段。", "ErVerifyShareRuleHelper_31", "fi-er-business", new Object[0]), index);
+                                return msg;
+                            }
+
+                            sumShareRate = sumShareRate.add(shareRate);
+                            ++index;
+                        }
+                    }
+
+                    DynamicObject entrycostcompany;
+                    DynamicObject expenEntry;
+                    DynamicObject entryExpenseItem;
+                    if ("amount".equalsIgnoreCase(bill.getString("sharemethod"))) {
+                        String entityTeye = bill.getDataEntityType().getName();
+                        BigDecimal shareAppamountComrule;
+                        DynamicObjectCollection ruleEntrys;
+                        DynamicObjectCollection expenEntrys;
+                        if (!ErEntityTypeUtils.isTripReimburseBill(entityTeye)) {
+                            ruleEntrys = bill.getDynamicObjectCollection("expenseentryentity_rule");
+                            index = 1;
+                            Iterator var23 = ruleEntrys.iterator();
+
+                            label202:
+                            while(true) {
+                                if (!var23.hasNext()) {
+                                    Map<Long, BigDecimal> ruleEntryAmountMap = (Map)ruleEntrys.stream().collect(Collectors.groupingBy((ruleEntry) -> {
+                                        return ruleEntry.getLong("sharewaitid_comrule");
+                                    }, CollectorsUtil.summingBigDecimal((ruleEntry) -> {
+                                        return ruleEntry.getBigDecimal("shareamount_comrule");
+                                    })));
+                                    Map<Long, BigDecimal> ruleEntryApproveAmountMap = (Map)ruleEntrys.stream().collect(Collectors.groupingBy((ruleEntry) -> {
+                                        return ruleEntry.getLong("sharewaitid_comrule");
+                                    }, CollectorsUtil.summingBigDecimal((ruleEntry) -> {
+                                        return ruleEntry.getBigDecimal("shareappamount_comrule");
+                                    })));
+                                    new DynamicObjectCollection();
+                                    String amountProp = "";
+                                    String approveAmountProp = "";
+                                    if (ErEntityTypeUtils.isShareBill(entityTeye)) {
+                                        expenEntrys = bill.getDynamicObjectCollection("expenseentryentity_wait");
+                                        amountProp = "expenseamount_wait";
+                                        approveAmountProp = "expeapproveamount_wait";
+                                    } else {
+                                        expenEntrys = bill.getDynamicObjectCollection("expenseentryentity");
+                                        amountProp = "expenseamount";
+                                        approveAmountProp = "expeapproveamount";
+                                    }
+
+                                    int i = 0;
+
+                                    while(true) {
+                                        if (i >= expenEntrys.size()) {
+                                            break label202;
+                                        }
+
+                                        expenEntry = (DynamicObject) expenEntrys.get(i);
+                                        Long expenEntryId = ErCommonUtils.getPk(expenEntry.getPkValue());
+                                        BigDecimal amount = expenEntry.getBigDecimal(amountProp);
+                                        if (ruleEntryAmountMap.get(expenEntryId) != null && ((BigDecimal)ruleEntryAmountMap.get(expenEntryId)).compareTo(amount) != 0) {
+                                            msg = String.format(ResManager.loadKDString("第%d行费用金额不等于分摊信息分摊金额合计,请修改。", "ErVerifyShareRuleHelper_9", "fi-er-business", new Object[0]), i + 1);
+                                            return msg;
+                                        }
+
+                                        BigDecimal appAmount = expenEntry.getBigDecimal(approveAmountProp);
+                                        if (ruleEntryApproveAmountMap.get(expenEntryId) != null && ((BigDecimal)ruleEntryApproveAmountMap.get(expenEntryId)).compareTo(appAmount) != 0) {
+                                            msg = String.format(ResManager.loadKDString("第%d行费用金额不等于分摊信息核定金额合计,请修改。", "ErVerifyShareRuleHelper_10", "fi-er-business", new Object[0]), i + 1);
+                                            return msg;
+                                        }
+
+                                        ++i;
+                                    }
+                                }
+
+                                entryExpenseItem = (DynamicObject)var23.next();
+                                BigDecimal shareAmountComRule = entryExpenseItem.getBigDecimal("shareamount_comrule");
+                                shareAppamountComrule = entryExpenseItem.getBigDecimal("shareappamount_comrule");
+                                if (null == shareAmountComRule || shareAmountComRule.compareTo(BigDecimal.ZERO) == 0) {
+                                    msg = String.format(ResManager.loadKDString("第%s行分摊金额为空,请录入分摊金额。", "ErVerifyShareRuleHelper_32", "fi-er-business", new Object[0]), index);
+                                    return msg;
+                                }
+
+                                if (null == shareAppamountComrule || shareAppamountComrule.compareTo(BigDecimal.ZERO) == 0) {
+                                    msg = String.format(ResManager.loadKDString("第%s行核定金额为空,请录入核定金额。", "ErVerifyShareRuleHelper_33", "fi-er-business", new Object[0]), index);
+                                    return msg;
+                                }
+
+                                ++index;
+                            }
+                        } else {
+                            ruleEntrys = bill.getDynamicObjectCollection("expenseentryentity_rule");
+                            totalshareAmountComRule = BigDecimal.ZERO;
+                            index = 1;
+
+                            for(Iterator var24 = ruleEntrys.iterator(); var24.hasNext(); ++index) {
+                                entrycostcompany = (DynamicObject)var24.next();
+                                shareAppamountComrule = entrycostcompany.getBigDecimal("shareamount_comrule");
+                                if (null == shareAppamountComrule || shareAppamountComrule.compareTo(BigDecimal.ZERO) == 0) {
+                                    msg = String.format(ResManager.loadKDString("第%s行分摊金额为空,请录入分摊金额。", "ErVerifyShareRuleHelper_32", "fi-er-business", new Object[0]), index);
+                                    return msg;
+                                }
+
+                                totalshareAmountComRule = totalshareAmountComRule.add(shareAppamountComrule);
+                            }
+
+                            shareRate = BigDecimal.ZERO;
+                            expenEntrys = bill.getDynamicObjectCollection("tripentry");
+                            if (!expenEntrys.isEmpty()) {
+                                Iterator var32 = expenEntrys.iterator();
+
+                                label173:
+                                while(true) {
+                                    DynamicObjectCollection tripDetailEntrys;
+                                    do {
+                                        if (!var32.hasNext()) {
+                                            break label173;
+                                        }
+
+                                        expenEntry = (DynamicObject)var32.next();
+                                        tripDetailEntrys = expenEntry.getDynamicObjectCollection("entryentity");
+                                    } while(tripDetailEntrys.isEmpty());
+
+                                    DynamicObject tripDetailEntry;
+                                    for(Iterator var13 = tripDetailEntrys.iterator(); var13.hasNext(); shareRate = shareRate.add(tripDetailEntry.getBigDecimal("entryappamount"))) {
+                                        tripDetailEntry = (DynamicObject)var13.next();
+                                    }
+                                }
+                            }
+
+                            if (totalshareAmountComRule.compareTo(shareRate) != 0) {
+                                msg = ResManager.loadKDString("费用核定总金额不等于分摊信息分摊金额合计,请修改。", "ErVerifyShareRuleHelper_25", "fi-er-business", new Object[0]);
+                                return msg;
+                            }
+                        }
+                    }
+
+                    if ("expenseitemrule".equalsIgnoreCase(shareRule.toString())) {
+                        DynamicObjectCollection ruleEntrys = bill.getDynamicObjectCollection("expenseentryentity_rule");
+                        index = 1;
+
+                        for(var6 = ruleEntrys.iterator(); var6.hasNext(); ++index) {
+                            obj = (DynamicObject)var6.next();
+                            shareRate = null;
+                            if (ErEntityTypeUtils.isTripReimburseBill(bill.getDataEntityType().getName())) {
+                                entryExpenseItem = obj.getDynamicObject("entrytravelexpenseitem");
+                            } else {
+                                entryExpenseItem = obj.getDynamicObject("entryexpenseitem");
+                            }
+
+                            entrycostcompany = obj.getDynamicObject("entrycostcompany_orgrule");
+                            DynamicObject entrycostdept = obj.getDynamicObject("entrycostdept_orgrule");
+                            BigDecimal doing_shareRate = obj.getBigDecimal("sharerate_comrule");
+                            if (null == entrycostcompany) {
+                                msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“费用承担公司”。", "ErVerifyShareRuleHelper_34", "fi-er-business", new Object[0]), index);
+                                return msg;
+                            }
+
+                            if (null == entrycostdept) {
+                                msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“费用承担部门”。", "ErVerifyShareRuleHelper_35", "fi-er-business", new Object[0]), index);
+                                return msg;
+                            }
+
+                            if (null == entryExpenseItem) {
+                                msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“费用项目”。", "ErVerifyShareRuleHelper_36", "fi-er-business", new Object[0]), index);
+                                return msg;
+                            }
+
+                            if ("rate".equalsIgnoreCase(bill.getString("sharemethod")) && (null == doing_shareRate || doing_shareRate.compareTo(BigDecimal.ZERO) == 0)) {
+                                msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“分摊比例”。", "ErVerifyShareRuleHelper_37", "fi-er-business", new Object[0]), index);
+                                return msg;
+                            }
+                        }
+
+                        Map<Long, BigDecimal> ruleEntryRateMap = (Map)ruleEntrys.stream().collect(Collectors.groupingBy((ruleEntry) -> {
+                            return ruleEntry.getLong("sharewaitid_comrule");
+                        }, CollectorsUtil.summingBigDecimal((ruleEntry) -> {
+                            return ruleEntry.getBigDecimal("sharerate_comrule");
+                        })));
+                        new DynamicObjectCollection();
+                        shareRate = new BigDecimal(100);
+                        String entityTeye = bill.getDataEntityType().getName();
+                        DynamicObjectCollection expenEntrys;
+                        if (ErEntityTypeUtils.isShareBill(entityTeye)) {
+                            expenEntrys = bill.getDynamicObjectCollection("expenseentryentity_wait");
+                        } else {
+                            expenEntrys = bill.getDynamicObjectCollection("expenseentryentity");
+                        }
+
+                        for(int i = 0; i < expenEntrys.size(); ++i) {
+                            expenEntry = (DynamicObject)expenEntrys.get(i);
+                            Long expenEntryId = ErCommonUtils.getPk(expenEntry.getPkValue());
+                            if ("rate".equalsIgnoreCase(bill.getString("sharemethod"))) {
+                                if (ruleEntryRateMap.get(expenEntryId) != null && isAllShare(bill) && ((BigDecimal)ruleEntryRateMap.get(expenEntryId)).compareTo(shareRate) != 0) {
+                                    msg = String.format(ResManager.loadKDString("“待摊行号”%s分摊比例合计不等于100%%,请先修改分摊比例。", "ErVerifyShareRuleHelper_38", "fi-er-business", new Object[0]), i + 1);
+                                    return msg;
+                                }
+
+                                if (ruleEntryRateMap.get(expenEntryId) != null && !isAllShare(bill) && ((BigDecimal)ruleEntryRateMap.get(expenEntryId)).compareTo(shareRate) > 0) {
+                                    msg = String.format(ResManager.loadKDString("“待摊行号”%s分摊比例合计超过100%%,请先修改分摊比例。", "ErVerifyShareRuleHelper_39", "fi-er-business", new Object[0]), i + 1);
+                                    return msg;
+                                }
+                            }
+                        }
+
+                        return msg;
+                    } else {
+                        return msg;
+                    }
+                }
+            } else {
+                msg = ResManager.loadKDString("分摊明细为空,请填写分摊明细。", "ErVerifyShareRuleHelper_16", "fi-er-business", new Object[0]);
+                return msg;
+            }
+        }
+    }
+
+    private static boolean isAllShare(DynamicObject bill) {
+        String entityTeye = bill.getDataEntityType().getName();
+        if (!ErEntityTypeUtils.isShareBill(entityTeye)) {
+            return true;
+        } else {
+            DynamicObject company = (DynamicObject)bill.get("company");
+            if (company == null) {
+                return false;
+            } else {
+                Long companyId = (Long)company.getPkValue();
+                return SystemParamterUtil.isAllShare(companyId);
+            }
+        }
+    }
+
+    private static String verifyOrgRule(DynamicObject bill) {
+        String msg = "";
+        Object shareRule = bill.get("sharerule");
+        if (!StringUtils.equals("orgrule", String.valueOf(shareRule))) {
+            return msg;
+        } else {
+            DynamicObjectCollection entrys = bill.getDynamicObjectCollection("expenseentryentity_rule");
+            int index = 1;
+            DynamicObject costcompany = bill.getDynamicObject("costcompany");
+            String number = costcompany.getString("number");
+            for(Iterator var5 = entrys.iterator(); var5.hasNext(); ++index) {
+                DynamicObject obj = (DynamicObject)var5.next();
+                DynamicObject entryCostCompany = obj.getDynamicObject("entrycostcompany_orgrule");
+                DynamicObject entryCostDept = obj.getDynamicObject("entrycostdept_orgrule");
+                if (null == entryCostDept && !number.equals("A001001019")) {
+                    msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“费用承担部门”。", "ErVerifyShareRuleHelper_35", "fi-er-business", new Object[0]), index);
+                    return msg;
+                }
+
+                if (null == entryCostCompany) {
+                    msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“费用承担公司”。", "ErVerifyShareRuleHelper_34", "fi-er-business", new Object[0]), index);
+                    return msg;
+                }
+            }
+
+            return msg;
+        }
+    }
+
+    private static String verifyMonthRule(DynamicObject bill) {
+        String msg = "";
+        Object shareRule = bill.get("sharerule");
+        if (!StringUtils.equals("monthrule", String.valueOf(shareRule))) {
+            return msg;
+        } else {
+            DynamicObjectCollection entrys = bill.getDynamicObjectCollection("expenseentryentity_rule");
+            Set<Date> allMonth = new HashSet(4);
+            int index = 1;
+
+            for(Iterator var6 = entrys.iterator(); var6.hasNext(); ++index) {
+                DynamicObject obj = (DynamicObject)var6.next();
+                Date entryMonth = obj.getDate("entrymonth_monthrule");
+                if (null == entryMonth) {
+                    msg = String.format(ResManager.loadKDString("请填写“分摊明细”第%s行“月份”字段。", "ErVerifyShareRuleHelper_40", "fi-er-business", new Object[0]), index);
+                    return msg;
+                }
+
+                allMonth.add(entryMonth);
+            }
+
+            if (allMonth.size() != entrys.size() && !"amount".equalsIgnoreCase(bill.getString("sharemethod"))) {
+                msg = ResManager.loadKDString("分摊明细月份重复,请修改。", "ErVerifyShareRuleHelper_14", "fi-er-business", new Object[0]);
+                return msg;
+            } else {
+                return msg;
+            }
+        }
+    }
+}

+ 76 - 0
src/main/java/fi/er/opplugin/ExspenseBeforeShareEXOpPlugin.java

@@ -0,0 +1,76 @@
+package fi.er.opplugin;
+
+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.plugin.args.BeforeOperationArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.fi.er.business.share.ERHandleBeforeShareService;
+import fi.er.opplugin.ErVerifyShareRuleHelperNew;
+import kd.fi.er.business.utils.OperateUtils;
+import org.apache.commons.lang3.StringUtils;
+
+public class ExspenseBeforeShareEXOpPlugin extends AbstractOperationServicePlugIn {
+    public ExspenseBeforeShareEXOpPlugin() {
+    }
+
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        OperateUtils.addAllFields(e, this.billEntityType, this.operateMeta);
+    }
+
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new AbstractValidator() {
+            public void validate() {
+                ExtendedDataEntity[] billEntitys = this.getDataEntities();
+                ExtendedDataEntity[] var2 = billEntitys;
+                int var3 = billEntitys.length;
+
+                for(int var4 = 0; var4 < var3; ++var4) {
+                    ExtendedDataEntity billEntity = var2[var4];
+                    DynamicObject bill = billEntity.getDataEntity();
+                    Boolean isShare = bill.getBoolean("isbeforeshare");
+                    if (!isShare) {
+                        bill.set("sharerule_startdate", (Object)null);
+                        bill.set("sharerule_enddate", (Object)null);
+                        bill.set("isshared", false);
+                        DynamicObjectCollection shareEntrys = bill.getDynamicObjectCollection("expenseentryentity_rule");
+                        if (shareEntrys != null && shareEntrys.size() > 0) {
+                            shareEntrys.clear();
+                        }
+
+                        DynamicObjectCollection shareDetailEntrys = bill.getDynamicObjectCollection("sharedetailentry");
+                        if (shareDetailEntrys != null && shareDetailEntrys.size() > 0) {
+                            shareDetailEntrys.clear();
+                        }
+
+                        return;
+                    }
+
+                    String msg = ErVerifyShareRuleHelperNew.getVerifyShareRuleMsg(bill);
+                    if (StringUtils.isNotBlank(msg)) {
+                        this.addErrorMessage(billEntity, msg);
+                        return;
+                    }
+                }
+
+            }
+        });
+    }
+
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
+        super.beforeExecuteOperationTransaction(e);
+        DynamicObject[] var2 = e.getDataEntities();
+        int var3 = var2.length;
+
+        for(int var4 = 0; var4 < var3; ++var4) {
+            DynamicObject bill = var2[var4];
+            ERHandleBeforeShareService.buildAndGetDoneEntrys(bill, false);
+        }
+
+    }
+}