|
@@ -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("10119")) {
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|