Ver código fonte

Merge remote-tracking branch 'origin/master'

xuhao 5 meses atrás
pai
commit
3c0b4ea7ef

+ 48 - 0
src/main/java/fi/ap/formplugin/ApEarlyWarnHandlerCusPlugin.java

@@ -0,0 +1,48 @@
+package fi.ap.formplugin;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.earlywarn.EarlyWarnContext;
+import kd.bos.entity.earlywarn.warn.EarlyWarnMessageInfo;
+import kd.bos.entity.earlywarn.warn.YzjPublicNumberInfo;
+import kd.bos.entity.earlywarn.warn.plugin.IEarlyWarnMessageHandler;
+import kd.bos.service.earlywarn.impl.DefaultWarnMessageHandler;
+import kd.bos.url.UrlService;
+
+import java.util.List;
+
+/**
+ * @author cjz
+ * @date 2024/11/5 16:24
+ * @description:预警自定义消息插件,设置跳转的报表url,往来类型为客户
+ */
+public class ApEarlyWarnHandlerCusPlugin implements IEarlyWarnMessageHandler {
+
+    private final Log logger= LogFactory.getLog(DefaultWarnMessageHandler.class);
+    private String clientPath="";//客户端地址
+    private String formId = "";//pc端表单标识
+
+
+    @Override
+    public EarlyWarnMessageInfo singleMessageBuilder(DynamicObject dynamicObject, EarlyWarnContext earlyWarnContext) {
+        return null;
+    }
+
+    @Override
+    public EarlyWarnMessageInfo mergeMessageBuilder(EarlyWarnContext earlyWarnContext) {
+        RequestContext ctx = RequestContext.get();
+        this.clientPath = UrlService.getDomainContextUrlByTenantCode(ctx.getTenantCode());//拿到完整的客户端网址
+        this.formId = earlyWarnContext.getEarlyWarn().getDataSourceId();//表单标识
+        EarlyWarnMessageInfo info = new EarlyWarnMessageInfo();
+        String contentUrl = clientPath+"?formId="+formId+"&flag=1"+"&asstacttype=bd_customer";//pc端跳转单据路径
+        info.setContentUrl(contentUrl);
+        return info;
+    }
+
+    @Override
+    public YzjPublicNumberInfo getYZJMessagePublicNumber(List<YzjPublicNumberInfo> publicNumberInfos) {
+        return IEarlyWarnMessageHandler.super.getYZJMessagePublicNumber(publicNumberInfos);
+    }
+}

+ 48 - 0
src/main/java/fi/ap/formplugin/ApEarlyWarnHandlerPlugin.java

@@ -0,0 +1,48 @@
+package fi.ap.formplugin;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.earlywarn.EarlyWarnContext;
+import kd.bos.entity.earlywarn.warn.EarlyWarnMessageInfo;
+import kd.bos.entity.earlywarn.warn.YzjPublicNumberInfo;
+import kd.bos.entity.earlywarn.warn.plugin.IEarlyWarnMessageHandler;
+import kd.bos.service.earlywarn.impl.DefaultWarnMessageHandler;
+import kd.bos.url.UrlService;
+
+import java.util.List;
+
+/**
+ * @author cjz
+ * @date 2024/11/5 11:33
+ * @description:预警自定义消息插件,设置跳转的报表url,往来类型为供应商
+ */
+public class ApEarlyWarnHandlerPlugin implements IEarlyWarnMessageHandler {
+    private final Log logger= LogFactory.getLog(DefaultWarnMessageHandler.class);
+    private String clientPath="";//客户端地址
+    private String formId = "";//pc端表单标识
+
+    @Override
+    public EarlyWarnMessageInfo singleMessageBuilder(DynamicObject dynamicObject, EarlyWarnContext earlyWarnContext) {
+        return null;
+    }
+
+
+    //合并消息跳转链接
+    @Override
+    public EarlyWarnMessageInfo mergeMessageBuilder(EarlyWarnContext earlyWarnContext) {
+        RequestContext ctx = RequestContext.get();
+        this.clientPath = UrlService.getDomainContextUrlByTenantCode(ctx.getTenantCode());//拿到完整的客户端网址
+        this.formId = earlyWarnContext.getEarlyWarn().getDataSourceId();//表单标识
+        EarlyWarnMessageInfo info = new EarlyWarnMessageInfo();
+        String contentUrl = clientPath+"?formId="+formId+"&flag=1"+"&asstacttype=bd_supplier";//pc端跳转单据路径
+        info.setContentUrl(contentUrl);
+        return info;
+    }
+
+    @Override
+    public YzjPublicNumberInfo getYZJMessagePublicNumber(List<YzjPublicNumberInfo> publicNumberInfos) {
+        return IEarlyWarnMessageHandler.super.getYZJMessagePublicNumber(publicNumberInfos);
+    }
+}

+ 47 - 0
src/main/java/fi/ap/formplugin/ApEarlyWarnHandlerUserPlugin.java

@@ -0,0 +1,47 @@
+package fi.ap.formplugin;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.earlywarn.EarlyWarnContext;
+import kd.bos.entity.earlywarn.warn.EarlyWarnMessageInfo;
+import kd.bos.entity.earlywarn.warn.YzjPublicNumberInfo;
+import kd.bos.entity.earlywarn.warn.plugin.IEarlyWarnMessageHandler;
+import kd.bos.service.earlywarn.impl.DefaultWarnMessageHandler;
+import kd.bos.url.UrlService;
+
+import java.util.List;
+
+/**
+ * @author cjz
+ * @date 2024/11/5 16:28
+ * @description:预警自定义消息插件,设置跳转的报表url,往来类型为人员
+ */
+public class ApEarlyWarnHandlerUserPlugin implements IEarlyWarnMessageHandler {
+
+    private final Log logger= LogFactory.getLog(DefaultWarnMessageHandler.class);
+    private String clientPath="";//客户端地址
+    private String formId = "";//pc端表单标识
+
+    @Override
+    public EarlyWarnMessageInfo singleMessageBuilder(DynamicObject dynamicObject, EarlyWarnContext earlyWarnContext) {
+        return null;
+    }
+
+    @Override
+    public EarlyWarnMessageInfo mergeMessageBuilder(EarlyWarnContext earlyWarnContext) {
+        RequestContext ctx = RequestContext.get();
+        this.clientPath = UrlService.getDomainContextUrlByTenantCode(ctx.getTenantCode());//拿到完整的客户端网址
+        this.formId = earlyWarnContext.getEarlyWarn().getDataSourceId();//表单标识
+        EarlyWarnMessageInfo info = new EarlyWarnMessageInfo();
+        String contentUrl = clientPath+"?formId="+formId+"&flag=1"+"&asstacttype=bos_user";//pc端跳转单据路径
+        info.setContentUrl(contentUrl);
+        return info;
+    }
+
+    @Override
+    public YzjPublicNumberInfo getYZJMessagePublicNumber(List<YzjPublicNumberInfo> publicNumberInfos) {
+        return IEarlyWarnMessageHandler.super.getYZJMessagePublicNumber(publicNumberInfos);
+    }
+}

+ 62 - 0
src/main/java/fi/ap/formplugin/FinapbillFormPlugin.java

@@ -0,0 +1,62 @@
+package fi.ap.formplugin;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.ShowType;
+import kd.bos.form.StyleCss;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.report.ReportShowParameter;
+import kd.sdk.plugin.Plugin;
+
+import java.util.EventObject;
+
+/**
+ * @author cjz
+ * @date 2024/11/5 15:47
+ * @description:应付挂账跳转到报表
+ */
+public class FinapbillFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    //初始化自动点击跳转按钮
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        Object flag = this.getView().getFormShowParameter().getCustomParam("flag");
+        Object asstacttype=this.getView().getFormShowParameter().getCustomParam("asstacttype");
+        //如果为预警跳转的页面则自动点击跳转按钮到报表
+        if (("1").equals(flag)) {
+            //获取当前单据
+            DynamicObject dynamicObject=this.getModel().getDataEntity(true);
+            Long id=dynamicObject.getLong("id");
+            ReportShowParameter showParameter = new ReportShowParameter();
+            //设置参数传给子界面
+            showParameter.setCustomParam("parentid",id);
+            showParameter.setCustomParam("flag",flag);
+            //设置初始化往来类型
+            showParameter.setCustomParam("q_asstacttype",asstacttype);
+            showParameter.setFormId("ap_acctagerpt_n");
+            showParameter.setCaption("账龄分析表");
+            showParameter.getOpenStyle().setShowType(ShowType.Modal);
+            StyleCss inlineStyleCss = new StyleCss();
+            inlineStyleCss.setHeight("1800");
+            inlineStyleCss.setWidth("1500");
+            showParameter.getOpenStyle().setInlineStyleCss(inlineStyleCss);
+            showParameter.setCloseCallBack(new CloseCallBack(this,"ap_acctagerpt_n"));
+            this.getView().showForm(showParameter);
+        }
+    }
+
+
+    //账龄分析表关闭后,同时关闭应收挂账单
+    @Override
+    public void closedCallBack(ClosedCallBackEvent e) {
+        super.closedCallBack(e);
+        if (StringUtils.equals("ap_acctagerpt_n",e.getActionId())) {
+            this.getModel().setDataChanged(false);
+            this.getView().close();
+        }
+    }
+
+}

+ 1 - 1
src/main/java/fi/ar/formplugin/AcctagerptPlugin.java

@@ -21,7 +21,7 @@ import java.util.EventObject;
 /**
  * @author cjz
  * @date 2024/10/11 17:26
- * @description:跳转后报表初始化参数
+ * @description:跳转后账龄分析报表初始化参数
  */
 public class AcctagerptPlugin extends AbstractReportFormPlugin implements Plugin {
 

+ 59 - 0
src/main/java/fi/cas/formplugin/AgpaybillButPlugin.java

@@ -0,0 +1,59 @@
+package fi.cas.formplugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.sdk.plugin.Plugin;
+
+import java.util.EventObject;
+
+/**
+ * @author cjz
+ * @date 2024/11/6 14:52
+ * @description:代发处理单,控制按钮显隐
+ */
+public class AgpaybillButPlugin extends AbstractFormPlugin implements Plugin {
+
+
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        //设置付款给前置按钮不可见
+        this.getView().setVisible(false,"nckd_payforfront");
+        //设置付款执行按钮不可见
+        this.getView().setVisible(false,"nckd_payzx");
+        //设置重新支付按钮不可见
+        this.getView().setVisible(false,"nckd_cxzf");
+        //设置支付关闭按钮不可见
+        this.getView().setVisible(false,"nckd_payclose");
+
+
+        //获取当前单据
+        DynamicObject dynamicObject=this.getModel().getDataEntity(true);
+        //单据状态
+        String billstatus = dynamicObject.getString("billstatus");
+        //支付状态
+        String paystatus=dynamicObject.getString("nckd_paystatus");
+        //核心状态
+        String nckdHxzt = dynamicObject.getString("nckd_hxzt");
+        //已审核,支付状态未支付,或者支付状态为空,或者支付失败才可看到付款给前置按钮,核心状态未登记
+        if ("C".equals(billstatus)&&"E".equals(nckdHxzt)&&(paystatus.isEmpty()|| "A".equals(paystatus)|| "D".equals(paystatus))) {
+            this.getView().setVisible(true,"nckd_payforfront");
+        }
+        //核心状态为已登记执行失败,已审批,才能看到付款执行按钮
+        if ( "A".equals(nckdHxzt)&&"C".equals(billstatus)) {
+            this.getView().setVisible(true,"nckd_payzx");
+        }
+        //支付状态--支付中,已审批,核心状态--支付处理部分成功才能看到重新支付按钮
+        if ("B".equals(paystatus)&&"C".equals(billstatus)&&"B".equals(nckdHxzt)) {
+            this.getView().setVisible(true,"nckd_cxzf");
+        }
+        //支付状态--支付中,核心状态--支付处理部分成功或执行失败才能看到支付关闭按钮
+        if ("B".equals(paystatus)&&"B".equals(nckdHxzt)||"A".equals(nckdHxzt)) {
+            this.getView().setVisible(true,"nckd_payclose");
+        }
+
+
+    }
+
+}

+ 1 - 1
src/main/java/fi/em/formPlugin/AgentpaybillFormPlugin.java

@@ -31,7 +31,7 @@ public class AgentpaybillFormPlugin extends AbstractListPlugin implements Plugin
         super.afterDoOperation(arg);
         String operateKey = arg.getOperateKey();
         //关闭付款按钮标识
-        String closepay="closepay";
+        String closepay="payclose";
         //付款给前置按钮标识
         String payforfront="payforfront";
         //实时反写支付状态字段给上游薪酬计提

+ 1 - 1
src/main/java/fi/em/opplugin/AgentpaybillOpPlugin.java

@@ -14,7 +14,7 @@ import kd.bos.servicehelper.operation.SaveServiceHelper;
 public class AgentpaybillOpPlugin extends AbstractOperationServicePlugIn {
 
     //关闭付款按钮标识
-    private static String closepay="closepay";
+    private static String closepay="payclose";
     //付款给前置按钮标识
     private static String payforfront="payforfront";
 

+ 30 - 1
src/main/java/fi/er/formPlugin/TripreimbursePlugin.java

@@ -1,16 +1,21 @@
 package fi.er.formPlugin;
 
 import com.alibaba.druid.util.StringUtils;
+import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.datamodel.events.ChangeData;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.sdk.plugin.Plugin;
+
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.concurrent.TimeUnit;
 
-public class TripreimbursePlugin extends AbstractFormPlugin {
+public class TripreimbursePlugin extends AbstractFormPlugin implements Plugin {
     @Override
     public void propertyChanged(PropertyChangedArgs e) {
         String fieldKey = e.getProperty().getName();
@@ -87,4 +92,28 @@ public class TripreimbursePlugin extends AbstractFormPlugin {
             }
         }
     }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        String operateKey = e.getOperateKey();
+        if ("nckd_copy".equals(e.getOperateKey())) {
+            EntryGrid entryGrid = this.getControl("nckd_invoiceandexpense");
+            int[] selectRows = entryGrid.getSelectRows();
+            if (selectRows.length > 0) {
+                int index = selectRows[0];
+                DynamicObjectCollection nckd_invoiceandexpense = this.getModel().getEntryEntity("nckd_invoiceandexpense");
+                DynamicObject entry = nckd_invoiceandexpense.get(index);
+                DynamicObject nckd_basedatafield = entry.getDynamicObject("nckd_basedatafield");
+                DynamicObject nckd_basedatafield1 = entry.getDynamicObject("nckd_basedatafield1");
+                BigDecimal nckd_decimalfield = entry.getBigDecimal("nckd_decimalfield");
+                BigDecimal nckd_amountfield3 = entry.getBigDecimal("nckd_amountfield3");
+                int rowIndex = this.getModel().createNewEntryRow("nckd_invoiceandexpense");
+                this.getModel().setValue("nckd_basedatafield", nckd_basedatafield, rowIndex);
+                this.getModel().setValue("nckd_basedatafield1", nckd_basedatafield1, rowIndex);
+                this.getModel().setValue("nckd_decimalfield", nckd_decimalfield, rowIndex);
+                this.getModel().setValue("nckd_amountfield3", nckd_amountfield3, rowIndex);
+                this.getView().updateView("nckd_invoiceandexpense");
+            }
+        }
+    }
 }

+ 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("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;
+            }
+        }
+    }
+}

+ 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);
+        }
+
+    }
+}