Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

zoufan_kd 8 hónapja
szülő
commit
9cc2bf2fe4

+ 145 - 0
src/main/java/fi/em/formPlugin/AgentpaybillFormPlugin.java

@@ -0,0 +1,145 @@
+package fi.em.formPlugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.botp.BFTrackerServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.util.*;
+
+/**
+ * @author cjz
+ * @date 2024/8/28 15:05
+ * @description:代发处理单支付状态变更后将值反写薪酬计提单
+ */
+public class AgentpaybillFormPlugin extends AbstractListPlugin implements Plugin {
+    private static String nckd_cas_agentpaybill="nckd_cas_agentpaybill";//代发处理单标识
+    private static String nckd_paystate="nckd_paystate";//支付状态标识
+    private static String nckd_salarydistribute="nckd_salarydistribute";//薪酬计提发放单标识
+
+
+    //操作后刷新字段
+    public void afterDoOperation(AfterDoOperationEventArgs arg){
+        super.afterDoOperation(arg);
+        String operateKey = arg.getOperateKey();
+        //关闭付款按钮标识
+        String closepay="closepay";
+        //付款给前置按钮标识
+        String payforfront="payforfront";
+        //实时反写支付状态字段给上游薪酬计提
+        if(closepay.equals(operateKey)||payforfront.equals(operateKey)) {
+            this.getView().updateView();
+            //获取当前单据模型
+            DynamicObject dynamicObject=this.getModel().getDataEntity();
+            //获取代发分录
+            DynamicObjectCollection entryCollection=dynamicObject.getDynamicObjectCollection("entry");
+            //获取源单id
+            Long sourcebillid=entryCollection.get(0).getLong("sourcebillid");
+            //支付状态
+            String nckd_paystate=dynamicObject.getString("nckd_paystate");
+            QFilter filter=new QFilter("id",QCP.equals,sourcebillid);
+            //获取薪酬计提
+            DynamicObject agentpaybill=BusinessDataServiceHelper.loadSingle(nckd_salarydistribute,"id,nckd_paystate",new QFilter[]{filter});
+            agentpaybill.set("nckd_paystate",nckd_paystate);
+            SaveServiceHelper.save(new DynamicObject[] {agentpaybill});
+        }
+
+        //点击关闭付款按钮后,反写分录字段到上游单据
+        if (closepay.equals(operateKey))
+        {
+            //获取当前单据模型
+            DynamicObject dynamicObject=this.getModel().getDataEntity();
+            //获取代发分录
+            DynamicObjectCollection entryCollection=dynamicObject.getDynamicObjectCollection("entry");
+            //获取源单id
+            Long sourcebillid=entryCollection.get(0).getLong("sourcebillid");
+            QFilter filter=new QFilter("id",QCP.equals,sourcebillid);
+            DynamicObject agentpaybill=BusinessDataServiceHelper
+                    .loadSingle(nckd_salarydistribute,
+                            "id,nckd_entrytype,nckd_staffentry,nckd_earlyretiredentry,nckd_retireentry,nckd_salaryentry" +
+                                    ",nckd_salaryentryre,nckd_se_success,nckd_se_sysfeedback,nckd_ee_success,nckd_ee_sysfeedback,nckd_re_success" +
+                                    ",nckd_re_sysfeedback,nckd_sae_success,nckd_sae_sysfeedback,nckd_see_success,nckd_see_sysfeedback"
+                            ,new QFilter[]{filter});
+            //薪酬计提单分录类型
+            String nckd_entrytype=agentpaybill.getString("nckd_entrytype");
+            //薪酬计提单分录
+            if ("A".equals(nckd_entrytype)) {
+                //一般员工分录
+                DynamicObjectCollection nckd_staffentry=agentpaybill.getDynamicObjectCollection("nckd_staffentry");
+                for (int a=0;a<nckd_staffentry.size();a++) {
+                    nckd_staffentry.get(a).set("nckd_se_success",entryCollection.get(a).getBoolean("e_issuccess"));
+                    nckd_staffentry.get(a).set("nckd_se_sysfeedback",entryCollection.get(a).getString("bankreturnmsg"));
+                }
+            }
+            if ("B".equals(nckd_entrytype)) {
+                //内退分录
+                DynamicObjectCollection nckd_earlyretiredentry=agentpaybill.getDynamicObjectCollection("nckd_earlyretiredentry");
+                for (int b=0;b<nckd_earlyretiredentry.size();b++)
+                {
+                    nckd_earlyretiredentry.get(b).set("nckd_ee_success",entryCollection.get(b).getBoolean("e_issuccess"));
+                    nckd_earlyretiredentry.get(b).set("nckd_ee_sysfeedback",entryCollection.get(b).getString("bankreturnmsg"));
+                }
+            }
+            if ("C".equals(nckd_entrytype)) {
+                //退休分录
+                DynamicObjectCollection nckd_retireentry=agentpaybill.getDynamicObjectCollection("nckd_retireentry");
+                for (int c=0;c<nckd_retireentry.size();c++) {
+                    nckd_retireentry.get(c).set("nckd_re_success",entryCollection.get(c).getBoolean("e_issuccess"));
+                    nckd_retireentry.get(c).set("nckd_re_sysfeedback",entryCollection.get(c).getString("bankreturnmsg"));
+                }
+            }
+            if ("D".equals(nckd_entrytype)) {
+                //人力薪酬分录
+                DynamicObjectCollection nckd_salaryentry=agentpaybill.getDynamicObjectCollection("nckd_salaryentry");
+                for (int d=0;d<nckd_salaryentry.size();d++) {
+                    nckd_salaryentry.get(d).set("nckd_sae_success",entryCollection.get(d).getBoolean("e_issuccess"));
+                    nckd_salaryentry.get(d).set("nckd_sae_sysfeedback",entryCollection.get(d).getString("bankreturnmsg"));
+                }
+            }
+            if ("E".equals(nckd_entrytype)) {
+                //人力薪酬内退分录
+                DynamicObjectCollection nckd_salaryentry=agentpaybill.getDynamicObjectCollection("nckd_salaryentryre");
+                for (int d=0;d<nckd_salaryentry.size();d++) {
+                    nckd_salaryentry.get(d).set("nckd_see_success",entryCollection.get(d).getBoolean("e_issuccess"));
+                    nckd_salaryentry.get(d).set("nckd_see_sysfeedback",entryCollection.get(d).getString("bankreturnmsg"));
+                }
+            }
+            //反写后保存
+            SaveServiceHelper.save(new DynamicObject[] {agentpaybill});
+        }
+    }
+
+    public void propertyChanged(PropertyChangedArgs e)
+    {
+        super.beforePropertyChanged(e);
+        String name=e.getProperty().getName();
+        //支付状态发生改变
+        if (nckd_paystate.equals(name))
+        {
+            //获取当前单据模型
+            DynamicObject dynamicObject=this.getModel().getDataEntity(true);
+            //id
+            //获取代发分录
+            DynamicObjectCollection entryCollection=dynamicObject.getDynamicObjectCollection("entry");
+            //获取源单id
+            Long id=entryCollection.get(0).getLong("sourcebillid");
+            //当前支付状态
+            String paystate=dynamicObject.getString(nckd_paystate);
+            QFilter filter=new QFilter("id",QCP.equals,id);
+            DynamicObject agentpaybill=BusinessDataServiceHelper
+                    .loadSingle(nckd_salarydistribute,"id,nckd_paystate",new QFilter[]{filter});
+            //反写薪酬计提支付状态
+            agentpaybill.set("nckd_paystate",paystate);
+            //获取代发单代发分录中字段信息
+            SaveServiceHelper.save(new DynamicObject[] {agentpaybill});
+        }
+    }
+}

+ 117 - 53
src/main/java/fi/em/formPlugin/SalaryDistributeEditPlugin.java

@@ -1,19 +1,24 @@
 package fi.em.formPlugin;
 
 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.ConfirmCallBackListener;
 import kd.bos.form.ConfirmTypes;
 import kd.bos.form.MessageBoxOptions;
 import kd.bos.form.MessageBoxResult;
+import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.events.MessageBoxClosedEvent;
 import kd.bos.form.operate.FormOperate;
 import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.sdk.plugin.Plugin;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.EventObject;
 import java.util.List;
 
@@ -29,6 +34,7 @@ public class SalaryDistributeEditPlugin extends AbstractListPlugin implements Pl
     private static String nckd_earlyretired="nckd_earlyretired";//薪酬明细(内退)分录标识
     private static String nckd_retired="nckd_retired";//薪酬明细(退休)分录标识
     private static String nckd_pay="nckd_pay";//人力薪酬分录标识
+    private static String nckd_payretird="nckd_payretird";//人力薪酬(内退)分录标识
     private static String oldentryNum="oldentryNum";
     private static String newentryNum="newentryNum";
 
@@ -41,73 +47,49 @@ public class SalaryDistributeEditPlugin extends AbstractListPlugin implements Pl
         viewList.add(nckd_earlyretired);
         viewList.add(nckd_retired);
         viewList.add(nckd_pay);
+        viewList.add(nckd_payretird);
 
         if (Viewflag.isEmpty()) {
             for (String item:viewList) {
                 this.getView().setVisible(false,item);
             }
             //清空所有分录
-            //一般员工分录
-            this.getModel().deleteEntryData("nckd_staffentry");
-            //内退分录
-            this.getModel().deleteEntryData("nckd_earlyretiredentry");
-            //退休分录
-            this.getModel().deleteEntryData("nckd_retireentry");
-            //人力薪酬分录
-            this.getModel().deleteEntryData("nckd_salaryentry");
+            clearEntryData("");
         }
         //薪酬明细(一般员工)分录
         if (Viewflag.equals(nckd_generalemployees)) {
             for (String item:viewList) {
                 this.getView().setVisible(false,item);
             }
-            //内退分录
-            this.getModel().deleteEntryData("nckd_earlyretiredentry");
-            //退休分录
-            this.getModel().deleteEntryData("nckd_retireentry");
-            //人力薪酬分录
-            this.getModel().deleteEntryData("nckd_salaryentry");
-            this.getView().setVisible(true,nckd_generalemployees);
+            clearEntryData(nckd_generalemployees);
         }
         //薪酬明细(内退)分录
         if (Viewflag.equals(nckd_earlyretired)) {
             for (String item:viewList) {
                 this.getView().setVisible(false,item);
             }
-            //一般员工分录
-            this.getModel().deleteEntryData("nckd_staffentry");
-            //退休分录
-            this.getModel().deleteEntryData("nckd_retireentry");
-            //人力薪酬分录
-            this.getModel().deleteEntryData("nckd_salaryentry");
-            this.getView().setVisible(true,nckd_earlyretired);
+            clearEntryData(nckd_earlyretired);
         }
         //薪酬明细(退休)分录
         if (Viewflag.equals(nckd_retired)) {
             for (String item:viewList) {
                 this.getView().setVisible(false,item);
             }
-            //一般员工分录
-            this.getModel().deleteEntryData("nckd_staffentry");
-            //内退分录
-            this.getModel().deleteEntryData("nckd_earlyretiredentry");
-            //人力薪酬分录
-            this.getModel().deleteEntryData("nckd_salaryentry");
-            this.getView().setVisible(true,nckd_retired);
+            clearEntryData(nckd_retired);
         }
         //人力薪酬分录
         if (Viewflag.equals(nckd_pay)) {
             for (String item:viewList) {
                 this.getView().setVisible(false,item);
             }
-            //清空其他分录
-            //一般员工分录
-            this.getModel().deleteEntryData("nckd_staffentry");
-            //内退分录
-            this.getModel().deleteEntryData("nckd_earlyretiredentry");
-            //退休分录
-            this.getModel().deleteEntryData("nckd_retireentry");
-            this.getView().setVisible(true,nckd_pay);
+            clearEntryData(nckd_pay);
+        }
+        //人力薪酬内退分录
+        if (Viewflag.equals(nckd_payretird)){
+            for (String item:viewList) {
+                this.getView().setVisible(false,item);
+            }
+            clearEntryData(nckd_payretird);
         }
     }
 
@@ -117,6 +99,29 @@ public class SalaryDistributeEditPlugin extends AbstractListPlugin implements Pl
         this.setVieeVisible("");
     }
 
+    //审核后获取审核人并刷新前端界面
+    public void afterDoOperation(AfterDoOperationEventArgs arg){
+        super.afterDoOperation(arg);
+        String operateKey = arg.getOperateKey();
+        //审核操作代码
+        String audit="audit";
+        if (operateKey.equals(audit)) {
+            //获取单据编号
+            String billno=this.getModel().getDataEntity().getString("billno");
+            QFilter filter=new QFilter("billno", QFilter.equals,billno);
+            DynamicObject[] dynamicObjectList= BusinessDataServiceHelper.load("nckd_salarydistribute","id",new QFilter[]{filter});
+            DynamicObject auditor = null;
+            for (DynamicObject dynamicObject:dynamicObjectList) {
+                DynamicObject info=BusinessDataServiceHelper.
+                        loadSingle(dynamicObject.getPkValue(),dynamicObject.getDynamicObjectType().getName());
+                auditor=info.getDynamicObject("nckd_auditor");
+            }
+            if (null!=auditor) {
+                this.getModel().setValue("nckd_auditor",auditor);
+                this.getView().updateView();
+            }
+        }
+    }
 
     public void propertyChanged(PropertyChangedArgs e)
     {
@@ -124,7 +129,6 @@ public class SalaryDistributeEditPlugin extends AbstractListPlugin implements Pl
         String name=e.getProperty().getName();
         //获取单据模型
         DynamicObject data=this.getModel().getDataEntity();
-
         if (nckd_entrytype.equals(name)) {
             //获取当前分录类型
             ChangeData[] changeSet=e.getChangeSet();
@@ -132,33 +136,59 @@ public class SalaryDistributeEditPlugin extends AbstractListPlugin implements Pl
             oldentryNum=(String)changeData.getOldValue();
             newentryNum=(String)changeData.getNewValue();
             String entrytype=data.getString(nckd_entrytype);
-
             if (entrytype.isEmpty()) {
                 this.setVieeVisible("");
             }
+            //分录有数据则弹窗提示,无数据则直接切换分录
             //分录类型为薪酬明细(一般员工)
             if (entrytype.equals("A")) {
-                ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
-                String confirmTip = "您确定要将分录类型改变为薪酬明细(一般员工)?操作会清空其他分录的数据,是否继续?";
-                this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                if (billIsNotEmpty(data)) {
+                    ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
+                    String confirmTip = "您确定要将分录类型改变为薪酬明细(一般员工)?操作会清空其他分录的数据,是否继续?";
+                    this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                }else {
+                    this.setVieeVisible(nckd_generalemployees);
+                }
             }
             //分录类型为薪酬明细(内退)
             if (entrytype.equals("B")) {
-                ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
-                String confirmTip = "您确定要将分录类型改变为薪酬明细(内退)?操作会清空其他分录的数据,是否继续?";
-                this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                if (billIsNotEmpty(data)) {
+                    ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
+                    String confirmTip = "您确定要将分录类型改变为薪酬明细(内退)?操作会清空其他分录的数据,是否继续?";
+                    this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                }else {
+                    this.setVieeVisible(nckd_earlyretired);
+                }
             }
             //分录类型为薪酬明细退休
             if (entrytype.equals("C")) {
-                ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
-                String confirmTip = "您确定要将分录类型改变为薪酬明细(退休)?操作会清空其他分录的数据,是否继续?";
-                this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                if (billIsNotEmpty(data)) {
+                    ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
+                    String confirmTip = "您确定要将分录类型改变为薪酬明细(退休)?操作会清空其他分录的数据,是否继续?";
+                    this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                }else {
+                    this.setVieeVisible(nckd_retired);
+                }
             }
             //分录类型为人力薪酬
             if (entrytype.equals("D")) {
-                ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
-                String confirmTip = "您确定要将分录类型改变为人力薪酬?操作会清空其他分录的数据,是否继续?";
-                this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                if (billIsNotEmpty(data)) {
+                    ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
+                    String confirmTip = "您确定要将分录类型改变为人力薪酬?操作会清空其他分录的数据,是否继续?";
+                    this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                }else {
+                    this.setVieeVisible(nckd_pay);
+                }
+            }
+            //分录类型为人力薪酬(内退)
+            if (entrytype.equals("E")) {
+                if (billIsNotEmpty(data)) {
+                    ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(String.valueOf(false), this);
+                    String confirmTip = "您确定要将分录类型改变为人力薪酬(内退)?操作会清空其他分录的数据,是否继续?";
+                    this.getView().showConfirm(confirmTip,MessageBoxOptions.YesNo, ConfirmTypes.Default, confirmCallBacks);
+                }else {
+                    this.setVieeVisible(nckd_payretird);
+                }
             }
         }
     }
@@ -187,10 +217,13 @@ public class SalaryDistributeEditPlugin extends AbstractListPlugin implements Pl
             if (entrytype.equals("D")) {
                 this.setVieeVisible(nckd_pay);
             }
+            //分录类型为人力薪酬(内退)
+            if (entrytype.equals("E")) {
+                this.setVieeVisible(nckd_payretird);
+            }
         }
         //如果为取消,则
-        if (messageBoxClosedEvent.getResult()==MessageBoxResult.No)
-        {
+        if (messageBoxClosedEvent.getResult()==MessageBoxResult.No) {
             //设置回原来的值,不触发值改变事件
             this.getModel().beginInit();
             data.set("nckd_entrytype",oldentryNum);
@@ -198,4 +231,35 @@ public class SalaryDistributeEditPlugin extends AbstractListPlugin implements Pl
             this.getView().updateView();
         }
     }
+
+    //判断单据内四个分录是否为空,分录有数据则返回true
+    public boolean billIsNotEmpty(DynamicObject data) {
+        //四个分录标识
+        List<String> nckd_entryList = Arrays.asList("nckd_staffentry","nckd_earlyretiredentry","nckd_retireentry","nckd_salaryentry","nckd_salaryentryre");
+        for (String item:nckd_entryList) {
+            DynamicObjectCollection dynamicObjectCollection=data.getDynamicObjectCollection(item);
+            if (!dynamicObjectCollection.isEmpty()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //清空除传入以外的其他分录
+    public void clearEntryData(String nckd_entry)
+    {
+        //分录标识
+        List<String> nckd_generalemployees =Arrays.asList("nckd_staffentry","nckd_earlyretiredentry","nckd_retireentry","nckd_salaryentry","nckd_salaryentryre");
+        for (String item:nckd_generalemployees) {
+            //不传入参数默认全部分录清除
+            if ("".equals(nckd_entry)){
+                this.getModel().deleteEntryData(item);
+            }
+            if (!item.equals(nckd_entry)) {
+                this.getModel().deleteEntryData(item);
+                this.getView().setVisible(true,nckd_entry);
+            }
+        }
+    }
+
 }

+ 269 - 131
src/main/java/fi/em/formPlugin/SalaryFileUploadEditPlugin.java

@@ -6,9 +6,7 @@ import kd.bos.bill.AbstractBillPlugIn;
 import kd.bos.cache.CacheFactory;
 import kd.bos.cache.TempFileCache;
 import kd.bos.dataentity.entity.DynamicObject;
-import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.exception.KDBizException;
-import kd.bos.exception.KDException;
 import kd.bos.form.control.AttachmentPanel;
 import kd.bos.form.control.Toolbar;
 import kd.bos.form.control.events.UploadEvent;
@@ -16,7 +14,6 @@ import kd.bos.form.control.events.UploadListener;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import org.apache.poi.ss.usermodel.*;
-
 import java.io.*;
 import java.math.BigDecimal;
 import java.util.*;
@@ -30,10 +27,10 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
     private static String bos_org = "bos_org"; //业务单元组织标识
     private static String bos_adminorg="bos_adminorg";//行政组织标识
 
-
+    //给附件面板添加监听
     @Override
     public void registerListener(EventObject e) {
-        //给附件面板添加监听
+
         super.registerListener(e);
         //按钮面板
         Toolbar toolbar = this.getControl("tbmain");
@@ -65,13 +62,16 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
             readExcelByRowOrCell(4,44,inputStream,billtype);
         }else if ("B".equals(nckd_entrytype)) {
             billtype="nckd_earlyretiredentry";
-            readExcelByRowOrCell(4,31,inputStream,billtype);
+            readExcelByRowOrCell(4,34,inputStream,billtype);
         } else if ("C".equals(nckd_entrytype)) {
             billtype="nckd_retireentry";
             readExcelByRowOrCell(4,15,inputStream,billtype);
         } else if ("D".equals(nckd_entrytype)) {
             billtype="nckd_salaryentry";
             readExcelByRowOrCell(4,78,inputStream,billtype);
+        } else if ("E".equals(nckd_entrytype)) {
+            billtype="nckd_salaryentryre";
+            readExcelByRowOrCell(4,34,inputStream,billtype);
         } else if (null==nckd_entrytype) {
             throw new KDBizException("请选择分录类型");
         }
@@ -79,7 +79,7 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
 
 
     /**
-     * @line execel行数
+     * @line execel行数
      * @column excel列数
      * @inputStream 文件流
      * @nckd_entrytype 分录类型
@@ -94,19 +94,20 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
             List<Row> rowList=new ArrayList<>();
             //表头字段
             List<Row> headList=new ArrayList<>();
+            //人力薪酬和薪酬明细等excel分开处理
             if (billtype.equals("nckd_salaryentry")) {
                 headList.add(filesheet.getRow(line-3));
             }else {
                 headList.add(filesheet.getRow(line-2));
             }
-
+            //读取每行的数据存入list中
             for (int i=line;i<=filesheet.getLastRowNum();i++) {
                 //获取每一行
                 Row row = filesheet.getRow(i);
                 if (null==row.getCell(1)) {
                     break;
                 }
-                //根据字段行循环,没有值的单元格则赋值
+                //根据字段行循环,没有值的单元格则赋值,防止空指针
                 for(int j=1;j<column;j++){
                     Cell cell=row.getCell(j);
                     if (null==cell) {
@@ -123,45 +124,18 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
             throw new RuntimeException(e);
         }
     }
-    /**
-     * 对Excel的各个单元格的格式进行判断并转换
-     */
-    public  String getCellValue(Cell cell) {
-        String cellValue = "";
-        if (cell == null) {
-            return cellValue;
-        }
-        // 判断数据的类型
-        switch (cell.getCellType()) {
-            case NUMERIC:
-                cellValue=String.valueOf(cell.getNumericCellValue());;
-                break;
-            case STRING: // 字符串
-                cellValue = String.valueOf(cell.getStringCellValue()).trim();
-                break;
-            case BLANK: // 空值
-                cellValue = "";
-                break;
-            case ERROR: // 故障
-                cellValue = "未知类型";
-                break;
-            default:
-                cellValue = "未知类型";
-                break;
-        }
-        return cellValue;
-    }
+
 
 
     /**
      * @rowList 读取的excel数据
      * @nckd_entrytype 分录标识
-     * @description:根据分录类型不同,赋值分录封装
+     * @description:根据分录类型不同,赋值分录
      */
     public void createNewRow(List<Row> rowList,String nckd_entry){
         //薪酬明细(一般员工)分录字段标识
-        List<String> nckd_generalemployees =Arrays.asList("nckd_se_institution","nckd_se_emptype","nckd_se_empnumber"
-                ,"nckd_se_empname","nckd_se_org","nckd_se_department","nckd_se_idnumber","nckd_se_cost","nckd_se_allbasicsry"
+        List<String> nckd_generalemployees =Arrays.asList("nckd_se_institution","nckd_se_empname","nckd_se_empnumber"
+                ,"nckd_se_idnumber","nckd_se_banknumber","nckd_se_unit","nckd_se_org","nckd_se_department","nckd_se_allbasicsry"
                 ,"nckd_se_basicsry","nckd_se_acmsry","nckd_se_reacmsry","nckd_se_bsnrwd","nckd_se_otreward","nckd_se_cmcsbd"
                 ,"nckd_se_otherpysry","nckd_se_clearrwd","nckd_se_awareward","nckd_se_otherdevreward","nckd_se_coldsbad"
                 ,"nckd_se_warmsbad","nckd_se_nursabd","nckd_se_otherallowance","nckd_se_salarypayable","nckd_se_per_endins"
@@ -169,23 +143,19 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                 ,"nckd_se_unionmey","nckd_se_tax","nckd_se_otherreduce","nckd_se_desalary","nckd_se_netsalary","nckd_se_cpy_endins"
                 ,"nckd_se_cpy_hopins","nckd_se_cpy_bhopins","nckd_se_cpy_ljins","nckd_se_cpy_birthins","nckd_se_cpy_dmgins","nckd_se_cpy_hosins"
                 ,"nckd_se_cpy_cmymey");
-
-
         //薪酬明细(内退)分录字段标识
-        List<String> nckd_earlyretired=Arrays.asList("nckd_ee_institution","nckd_ee_emptype","nckd_ee_empnumber","nckd_ee_empname"
-                ,"nckd_ee_org","nckd_ee_department","nckd_ee_idnumber","nckd_ee_cost","nckd_ee_allbasicsry","nckd_ee_allowance"
-                ,"nckd_ee_otherallowance","nckd_ee_per_endins","nckd_ee_per_ljins","nckd_ee_per_hopins","nckd_ee_per_bhopins"
-                ,"nckd_ee_per_hosins","nckd_ee_per_cmymey","nckd_ee_unionmey","nckd_ee_tax","nckd_ee_otherreduce","nckd_ee_desalary"
-                ,"nckd_ee_netsalary","nckd_ee_cpy_endins","nckd_ee_cpy_hopins","nckd_ee_cpy_bhopins","nckd_ee_cpy_ljins","nckd_ee_cpy_birthins"
-                ,"nckd_ee_cpy_dmgins","nckd_ee_cpy_hosins","nckd_ee_cpy_cmymey");
-
+        List<String> nckd_earlyretired=Arrays.asList("nckd_ee_institution","nckd_ee_empname","nckd_ee_empnumber","nckd_ee_idnumber","nckd_ee_banknumber"
+                ,"nckd_ee_unit","nckd_ee_org","nckd_ee_department","nckd_ee_allbasicsry","nckd_ee_allowance","nckd_ee_otherallowance","nckd_ee_per_endins"
+                ,"nckd_ee_per_ljins","nckd_ee_per_hopins","nckd_ee_per_bhopins","nckd_ee_per_hosins","nckd_ee_per_cmymey","nckd_ee_unionmey"
+                ,"nckd_ee_tax","nckd_ee_desalary","nckd_ee_netsalary","nckd_ee_otherreduce","nckd_ee_cpy_endins","nckd_ee_cpy_bhopins"
+                ,"nckd_ee_cpy_ljins","nckd_ee_cpy_birthins","nckd_ee_cpy_dmgins","nckd_ee_cpy_cmymey","nckd_ee_cpy_hosins","nckd_ee_taxt"
+                ,"nckd_ee_alltaxt","nckd_ee_charge","nckd_ee_finallsys");
         //薪酬明细(退休)分录字段标识
-        List<String> nckd_retired=Arrays.asList("nckd_re_institution","nckd_re_emptype","nckd_re_empnumber","nckd_re_empname","nckd_re_org"
-                ,"nckd_re_department","nckd_re_idnumber","nckd_re_cost","nckd_re_livallowance","nckd_re_otherallowance","nckd_re_reward"
+        List<String> nckd_retired=Arrays.asList("nckd_re_institution","nckd_re_empname","nckd_re_empnumber","nckd_re_idnumber","nckd_re_banknumber"
+                ,"nckd_re_unit","nckd_re_org","nckd_re_department","nckd_re_livallowance","nckd_re_otherallowance","nckd_re_reward"
                 ,"nckd_re_salarypayable","nckd_re_desalary","nckd_re_netsalary");
-
         //人力薪酬分录标识
-        List<String> nckd_pay=Arrays.asList("nckd_sae_institution","nckd_sae_empname","nckd_sae_jobid","nckd_sae_idnumber","nckd_sae_company"
+        List<String> nckd_pay=Arrays.asList("nckd_sae_institution","nckd_sae_empname","nckd_sae_jobid","nckd_sae_idnumber","nckd_sae_banknumber","nckd_sae_company"
                 ,"nckd_sae_institutions","nckd_sae_department","nckd_sae_levelsry","nckd_sae_dutiessry","nckd_sae_updutiessry","nckd_sae_workyearsry"
                 ,"nckd_sae_depyear","nckd_sae_eduasry","nckd_sae_transry","nckd_sae_jobsry","nckd_sae_basicsry","nckd_sae_allbasicsry","nckd_sae_acmsry"
                 ,"nckd_sae_mountsry","nckd_sae_reacmsry","nckd_sae_balyearsry","nckd_sae_blastyearsry","nckd_sae_allsry","nckd_sae_bsnrwd","nckd_sae_cpmrwd"
@@ -199,6 +169,15 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                 ,"nckd_sae_cpy_hopins","nckd_sae_cpy_bhopins","nckd_sae_cpy_birthins","nckd_sae_cpy_ljins","nckd_sae_cpy_dmgins","nckd_sae_cpy_hosins"
                 ,"nckd_sae_cpy_cmymey");
 
+        //人力薪酬内退分录标识
+        List<String> nckd_payretird=Arrays.asList("nckd_see_institution","nckd_see_empname","nckd_see_jobid","nckd_see_idnumber"
+                ,"nckd_see_banknumber","nckd_see_company","nckd_see_institutions","nckd_see_department","nckd_see_allbasicsry"
+                ,"nckd_see_allowance","nckd_see_otherallowanc","nckd_see_per_endins","nckd_see_per_ljins","nckd_see_per_hopins"
+                ,"nckd_see_per_bhopins","nckd_see_per_hosins","nckd_see_per_cmymey","nckd_see_unionmey","nckd_see_tax"
+                ,"nckd_see_desalary","nckd_see_netsalary","nckd_see_otherreduce","nckd_see_cpy_endins","nckd_see_cpy_bhopins"
+                ,"nckd_see_cpy_ljins","nckd_see_cpy_birthins","nckd_see_cpy_dmgins","nckd_see_cpy_cmymey","nckd_see_cpy_hosins"
+                ,"nckd_see_taxt","nckd_see_alltaxt","nckd_see_charge","nckd_see_finallsys");
+
 
         //将excel数据存入薪酬明细(一般员工)分录
         if(nckd_entry.equals("nckd_staffentry")) {
@@ -208,57 +187,53 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                 //新增动态单据分录
                 int rowIndex = this.getModel().createNewEntryRow(nckd_entry);
                 //发薪机构
-                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty())
-                {
+                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty()) {
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(1)));
                     //获取发薪机构
                     DynamicObject entrycostdept= BusinessDataServiceHelper
                             .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
                     this.getModel().setValue(nckd_generalemployees.get(0),entrycostdept,rowIndex);
                 }
-                //员工类别
+                //员工名称
                 if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
                     this.getModel().setValue(nckd_generalemployees.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
                 }
-                //员工
+                //员工
                 if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
                     this.getModel().setValue(nckd_generalemployees.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
                 }
-                //姓名
+                //证件号
                 if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
                     this.getModel().setValue(nckd_generalemployees.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
                 }
-                //所在机构
+                //银行账号
                 if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
-                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(5)));
-                    //获取部门
-                    DynamicObject entrycostdept= BusinessDataServiceHelper
-                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
-                    this.getModel().setValue(nckd_generalemployees.get(4),entrycostdept,rowIndex);
+                    this.getModel().setValue(nckd_generalemployees.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
                 }
-                //所在部门
-                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty())
-                {
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()){
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
-                    //获取部门
+                    //获取所在单位
                     DynamicObject entrycostdept= BusinessDataServiceHelper
                             .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
                     this.getModel().setValue(nckd_generalemployees.get(5),entrycostdept,rowIndex);
                 }
-                //身份证号
-                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()){
-                    this.getModel().setValue(nckd_generalemployees.get(6),getCellValue(rowList.get(i).getCell(6)),rowIndex);
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    //获取部门
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_generalemployees.get(6),entrycostdept,rowIndex);
                 }
-                //成本归结单元
-                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty())
-                {
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty()) {
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
                     //获取部门
                     DynamicObject entrycostdept= BusinessDataServiceHelper
-                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
                     this.getModel().setValue(nckd_generalemployees.get(7),entrycostdept,rowIndex);
                 }
-
                 //金额类型字段赋值
                 for (int j=8;j<nckd_generalemployees.size();j++) {
                     Cell cell=rowList.get(i).getCell(j+1);
@@ -272,7 +247,6 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                 }
                 //刷新分录
                 this.getView().updateView("nckd_staffentry");
-
             }
         }
         //薪酬明细(内退)分录
@@ -289,43 +263,44 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                             .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
                     this.getModel().setValue(nckd_earlyretired.get(0),entrycostdept,rowIndex);
                 }
-                //员工类别
+                //员工姓名
                 if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
                     this.getModel().setValue(nckd_earlyretired.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
                 }
-                //员工
+                //员工
                 if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
                     this.getModel().setValue(nckd_earlyretired.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
                 }
-                //姓名
+                //证件号
                 if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
                     this.getModel().setValue(nckd_earlyretired.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
                 }
-                //所在机构
+
+                //银行账号
                 if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
-                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(5)));
-                    DynamicObject entrycostdept= BusinessDataServiceHelper
-                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
-                    this.getModel().setValue(nckd_earlyretired.get(4),entrycostdept,rowIndex);
+                    this.getModel().setValue(nckd_earlyretired.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
                 }
-                //所在部门
-                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty())
-                {
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()){
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
                     DynamicObject entrycostdept= BusinessDataServiceHelper
                             .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
                     this.getModel().setValue(nckd_earlyretired.get(5),entrycostdept,rowIndex);
                 }
-                //身份证号
-                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()){
-                    this.getModel().setValue(nckd_earlyretired.get(6),getCellValue(rowList.get(i).getCell(6)),rowIndex);
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty())
+                {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_earlyretired.get(6),entrycostdept,rowIndex);
                 }
-                //成本归结单元
+                //所在部门
                 if (!getCellValue(rowList.get(i).getCell(8)).isEmpty())
                 {
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
                     DynamicObject entrycostdept= BusinessDataServiceHelper
-                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
                     this.getModel().setValue(nckd_earlyretired.get(7),entrycostdept,rowIndex);
                 }
                 //金额类型字段赋值
@@ -340,7 +315,6 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                     }
                 }
             }
-
         }
 
         //薪酬明细(退休)分录
@@ -357,38 +331,37 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                             .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
                     this.getModel().setValue(nckd_retired.get(0),entrycostdept,rowIndex);
                 }
-                //员工类别
+                //员工姓名
                 if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
                     this.getModel().setValue(nckd_retired.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
                 }
-                //员工
+                //员工
                 if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
                     this.getModel().setValue(nckd_retired.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
                 }
-                //姓名
+                //证件号
                 if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
                     this.getModel().setValue(nckd_retired.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
                 }
-                //所在机构
+                //银行账号
                 if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
-                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(5)));
-                    //获取部门
-                    DynamicObject entrycostdept= BusinessDataServiceHelper
-                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
-                    this.getModel().setValue(nckd_retired.get(4),entrycostdept,rowIndex);
+                    this.getModel().setValue(nckd_retired.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
                 }
-                //所在部门
+                //所在单位
                 if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()) {
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
                     DynamicObject entrycostdept= BusinessDataServiceHelper
                             .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
                     this.getModel().setValue(nckd_retired.get(5),entrycostdept,rowIndex);
                 }
-                //身份证号
-                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()){
-                    this.getModel().setValue(nckd_retired.get(6),getCellValue(rowList.get(i).getCell(6)),rowIndex);
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_retired.get(6),entrycostdept,rowIndex);
                 }
-                //成本归结单元
+                //所在部门
                 if (!getCellValue(rowList.get(i).getCell(8)).isEmpty()) {
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
                     DynamicObject entrycostdept= BusinessDataServiceHelper
@@ -434,29 +407,33 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
                 if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
                     this.getModel().setValue(nckd_pay.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
                 }
-                //所在单位
-                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()) {
-                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(5)));
-                    DynamicObject entrycostdept= BusinessDataServiceHelper
-                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
-                    this.getModel().setValue(nckd_pay.get(4),entrycostdept,rowIndex);
+                //银行账号
+                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
+                    this.getModel().setValue(nckd_pay.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
                 }
-                //一级机构
+                //所在单位
                 if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()) {
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
                     DynamicObject entrycostdept= BusinessDataServiceHelper
                             .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
                     this.getModel().setValue(nckd_pay.get(5),entrycostdept,rowIndex);
                 }
-                //所在部门
+                //一级机构
                 if (!getCellValue(rowList.get(i).getCell(7)).isEmpty()) {
                     QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
                     DynamicObject entrycostdept= BusinessDataServiceHelper
                             .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
                     this.getModel().setValue(nckd_pay.get(6),entrycostdept,rowIndex);
                 }
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_pay.get(7),entrycostdept,rowIndex);
+                }
                 //金额类型字段赋值
-                for (int j=7;j<nckd_pay.size();j++) {
+                for (int j=9;j<nckd_pay.size();j++) {
                     Cell cell=rowList.get(i).getCell(j+1);
                     //空值则跳过
                     if (!Objects.equals(getCellValue(cell), "")) {
@@ -470,19 +447,85 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
 
         }
 
+        //人力薪酬内退分录
+        if (nckd_entry.equals("nckd_salaryentryre")){
+            this.getModel().deleteEntryData("nckd_salaryentryre");
+            for (int i=0;i<rowList.size();i++) {
+                //新增动态单据分录
+                int rowIndex = this.getModel().createNewEntryRow(nckd_entry);
+                //发薪机构
+                if (!getCellValue(rowList.get(i).getCell(1)).isEmpty()) {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(1)));
+                    //获取发薪机构
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_org,"id,entrycostdept",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(0),entrycostdept,rowIndex);
+                }
+                //员工姓名
+                if (!getCellValue(rowList.get(i).getCell(2)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(1),getCellValue(rowList.get(i).getCell(2)),rowIndex);
+                }
+                //员工工号
+                if (!getCellValue(rowList.get(i).getCell(3)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(2),getCellValue(rowList.get(i).getCell(3)),rowIndex);
+                }
+                //证件号
+                if (!getCellValue(rowList.get(i).getCell(4)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(3),getCellValue(rowList.get(i).getCell(4)),rowIndex);
+                }
+                //银行账号
+                if (!getCellValue(rowList.get(i).getCell(5)).isEmpty()){
+                    this.getModel().setValue(nckd_payretird.get(4),getCellValue(rowList.get(i).getCell(5)),rowIndex);
+                }
+                //所在单位
+                if (!getCellValue(rowList.get(i).getCell(6)).isEmpty()){
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(6)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(5),entrycostdept,rowIndex);
+                }
+                //一级机构
+                if (!getCellValue(rowList.get(i).getCell(7)).isEmpty())
+                {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(7)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(6),entrycostdept,rowIndex);
+                }
+                //所在部门
+                if (!getCellValue(rowList.get(i).getCell(8)).isEmpty())
+                {
+                    QFilter filter=new QFilter("number", QFilter.equals,getCellValue(rowList.get(i).getCell(8)));
+                    DynamicObject entrycostdept= BusinessDataServiceHelper
+                            .loadSingle(bos_adminorg,"id",new QFilter[]{filter});
+                    this.getModel().setValue(nckd_payretird.get(7),entrycostdept,rowIndex);
+                }
+                //金额类型字段赋值
+                for (int j=8;j<nckd_payretird.size();j++) {
+                    Cell cell=rowList.get(i).getCell(j+1);
+                    //空值则跳过
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        //金额字段转化为BigDecimal赋值进分录中
+                        String string=getCellValue(cell);
+                        BigDecimal bigDecimal= BigDecimal.valueOf(Double.parseDouble(string));
+                        this.getModel().setValue(nckd_payretird.get(j),bigDecimal,rowIndex);
+                    }
+                }
+            }
+        }
     }
 
 
 
+
     /**
      * @headList 读取的excel表头数据
      * @rowList 读取excel的表数据
      * @billtype 分录标识
-     * @description:校验excel数据是否合法
+     * @description:校验excel数据是否合法,传入的excel是否为正确的格式
      */
-    public void dataVerify(List<Row> headList,List<Row> rowList,String billtype)
-    {
-        //获取单据的字段名
+    public void dataVerify(List<Row> headList,List<Row> rowList,String billtype) {
+        //获取对应单据的字段名
         String flag;
         //薪酬明细(一般员工)
         if (billtype.equals("nckd_staffentry")) {
@@ -491,37 +534,132 @@ public class SalaryFileUploadEditPlugin extends AbstractBillPlugIn implements Up
             if (!flag.equals("基本工资")) {
                 throw new KDBizException("上传的文件格式有误,请检查!");
             }
-
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
         }
-
         //薪酬明细(内退)
         if (billtype.equals("nckd_earlyretiredentry")) {
-
             flag=headList.get(0).getCell(9).getStringCellValue();
-            if (!flag.equals("内退员工基本工资")) {
+            if (!flag.equals("内退生活费")) {
                 throw new KDBizException("上传的文件格式有误,请检查!");
             }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
         }
-
         //薪酬明细(退休)
         if (billtype.equals("nckd_retireentry")) {
             flag=headList.get(0).getCell(9).getStringCellValue();
             if (!flag.equals("退休员工生活补贴")) {
                 throw new KDBizException("上传的文件格式有误,请检查!");
             }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
         }
-
         //人力薪酬
         if (billtype.equals("nckd_salaryentry")) {
             flag=headList.get(0).getCell(9).getStringCellValue();
-            if (!flag.equals("职务工资")) {
+            if (!flag.equals("级别工资")) {
                 throw new KDBizException("上传的文件格式有误,请检查!");
             }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+(j+1)+"列的数据:"+headList.get(i).getCell(j+1).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
+        }
+        //人力薪酬(内退)
+        if (billtype.equals("nckd_salaryentryre"))
+        {
+            flag=headList.get(0).getCell(9).getStringCellValue();
+            if (!flag.equals("内退生活费")) {
+                throw new KDBizException("上传的文件格式有误,请检查!");
+            }
+            for (int i=0;i<rowList.size();i++) {
+                //校验金额字段
+                for (int j=9;j<rowList.get(i).getLastCellNum();j++) {
+                    Cell cell=rowList.get(i).getCell(j);
+                    //单元格不为空
+                    if (!Objects.equals(getCellValue(cell), "")) {
+                        if (cell.getCellType()!=CellType.NUMERIC){
+                            //输入金额字段的类型不为数字则提示
+                            throw new KDBizException("第"+(i+1)+"行第"+j+"列的数据:"+headList.get(i).getCell(j).getStringCellValue()+"字段有误,请检查!");
+                        }
+                    }
+                }
+            }
         }
-
-
     }
 
 
-
+    /**
+     * 对Excel的各个单元格的格式进行判断并转换
+     */
+    public  String getCellValue(Cell cell) {
+        String cellValue = "";
+        if (cell == null) {
+            return cellValue;
+        }
+        // 判断数据的类型
+        switch (cell.getCellType()) {
+            case NUMERIC:
+                //读取数字将不必要的小数点去掉
+                BigDecimal bigDecimal=new BigDecimal(Double.toString(cell.getNumericCellValue()));
+                cellValue=bigDecimal.stripTrailingZeros().toPlainString();
+                break;
+            case STRING: // 字符串
+                cellValue = String.valueOf(cell.getStringCellValue()).trim();
+                break;
+            case BLANK: // 空值
+                cellValue = "";
+                break;
+            case ERROR: // 故障
+                cellValue = "未知类型";
+                break;
+            default:
+                cellValue = "未知类型";
+                break;
+        }
+        return cellValue;
+    }
 }

+ 91 - 0
src/main/java/fi/em/opplugin/AgentpayPushOpPlugin.java

@@ -0,0 +1,91 @@
+package fi.em.opplugin;
+
+import com.alibaba.druid.util.StringUtils;
+import fi.fa.opplugin.utils.ChangeDataUtils;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+
+import kd.bos.entity.api.ApiResult;
+import kd.bos.entity.botp.runtime.ConvertOperationResult;
+import kd.bos.entity.botp.runtime.PushArgs;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.exception.KDBizException;
+import kd.bos.metadata.botp.ConvertRuleReader;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.botp.ConvertServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author cjz
+ * @date 2024/8/30 10:37
+ * @description:薪酬计提单手动下推代发处理
+ */
+public class AgentpayPushOpPlugin extends AbstractOperationServicePlugIn {
+
+    private static String nckd_salarydistribute="nckd_salarydistribute";//薪酬计提发放单标识
+    private static String cas_agentpaybill="cas_agentpaybill";//代发处理单标识
+
+
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+        if ("push".equals(e.getOperationKey())){
+            DynamicObject[] dynamicObjects = e.getDataEntities();
+            for (int i=0;i< dynamicObjects.length;i++)
+            {
+                //获取当前薪酬计提单
+                DynamicObject info=BusinessDataServiceHelper
+                        .loadSingle(dynamicObjects[i].getPkValue(),dynamicObjects[i].getDynamicObjectType().getName());
+                //源单id
+                Long pkid=info.getLong("id");
+                // 下推参数,设置所选数据项
+                List <ListSelectedRow> selectedRows=new ArrayList<>();
+                ListSelectedRow selectedRow=new ListSelectedRow(pkid);
+                //设置需要下推的单据名
+//                selectedRow.setEntryEntityKey("nckd_salarydistribute");
+                // 设置需要下推的单据体行内码:按分录下推时必须设置
+                selectedRow.setEntryPrimaryKeyValue(pkid);
+                selectedRows.add(selectedRow);
+                // 创建下推参数
+                PushArgs pushArgs = new PushArgs();
+                // 源单标识
+                pushArgs.setSourceEntityNumber(nckd_salarydistribute);
+                // 目标单据标识
+                pushArgs.setTargetEntityNumber(cas_agentpaybill);
+                // 生成转换结果报告
+                pushArgs.setBuildConvReport(true);
+                //传入下推使用的转换规则id,不填则使用默认规则
+//            pushArgs.setRuleId("");
+                //下推默认保存
+                pushArgs.setAutoSave(true);
+                // 设置源单选中的数据包
+                pushArgs.setSelectedRows(selectedRows);
+                // 执行下推操作
+                ConvertOperationResult result = ConvertServiceHelper.push(pushArgs);
+                //获取下推目标单id
+                Set<Object> targetBillIds = result.getTargetBillIds();
+                if(!targetBillIds.isEmpty()) {
+                    this.operationResult.setShowMessage(true);
+                    this.operationResult.setSuccess(true);
+                    this.operationResult.setMessage("下推代发处理单成功");
+                }else {
+                    this.operationResult.setShowMessage(true);
+                    this.operationResult.setSuccess(false);
+                    this.operationResult.setMessage("下推代发处理单失败");
+                }
+            }
+        }
+    }
+}

+ 55 - 0
src/main/java/fi/em/opplugin/AgentpaybillOpPlugin.java

@@ -0,0 +1,55 @@
+package fi.em.opplugin;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author cjz
+ * @date 2024/8/28 16:22
+ * @description:代发处理单,点击关闭付款,付款给前置,修改支付状态
+ */
+public class AgentpaybillOpPlugin extends AbstractOperationServicePlugIn {
+
+    //关闭付款按钮标识
+    private static String closepay="closepay";
+    //付款给前置按钮标识
+    private static String payforfront="payforfront";
+
+
+
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs args){
+        DynamicObject[] dynamicObjects = args.getDataEntities();
+        String operationKey = args.getOperationKey();
+        //关闭付款则将支付状态更改为支付关闭状态
+        if (closepay.equals(operationKey)){
+            for (int i=0;i< dynamicObjects.length;i++)
+            {
+                //设置支付状态为
+                dynamicObjects[i].set("nckd_paystate","D");
+            }
+            SaveServiceHelper.save(dynamicObjects);
+        }
+        if (payforfront.equals(operationKey))
+        {
+            for (int i=0;i< dynamicObjects.length;i++)
+            {
+                //设置支付状态为支付中
+                dynamicObjects[i].set("nckd_paystate","B");
+            }
+            SaveServiceHelper.save(dynamicObjects);
+        }
+    }
+
+}

+ 162 - 84
src/main/java/fi/er/opplugin/FinapbillBeforeF7SelectSample.java

@@ -1,10 +1,8 @@
 package fi.er.opplugin;
 
 import com.alibaba.druid.util.StringUtils;
-import com.alibaba.fastjson.JSONObject;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
-import kd.bos.dataentity.serialization.SerializationUtils;
 import kd.bos.entity.datamodel.events.ChangeData;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 import kd.bos.form.field.RefBillEdit;
@@ -15,12 +13,10 @@ import kd.bos.list.ListShowParameter;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
-
 import java.math.BigDecimal;
-import java.util.ArrayList;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.EventObject;
-import java.util.List;
 
 public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements BeforeF7SelectListener {
     private static String nckd_apfinapbill = "nckd_apfinapbill"; //应付挂账单字段
@@ -61,8 +57,6 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
                 ListShowParameter showParameter = (ListShowParameter)arg0.getFormShowParameter();
                 showParameter.getListFilterParameter().setFilter(qFilter);
             }
-        } else if (StringUtils.equals(fieldKey, nckd_real_card)) {
-
         }
     }
 
@@ -72,73 +66,41 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
         if (StringUtils.equals("nckd_real_card", fieldKey)){
             ChangeData changeData = e.getChangeSet()[0];
             DynamicObjectCollection dynamicObjectCollection = (DynamicObjectCollection) changeData.getNewValue();
-            List<Long> ids = new ArrayList<>();
-            Integer index = 0;
-            for(DynamicObject  object : dynamicObjectCollection) {
-                Long id = (Long) object.get(2);
-                ids.add(id);
+            int parentIndex = changeData.getRowIndex();
+            this.getModel().deleteEntryData("nckd_realcard_list2");
+            for (int i = 0; i < dynamicObjectCollection.size(); i++) {
+                DynamicObject object = dynamicObjectCollection.get(i);
                 this.getModel().setValue("nckd_card_list_str","1");
-            }
-           //查询实物卡片清单
-            QFilter filter = new QFilter("id", QCP.in,ids);
-            DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
-            if (dynamicObjects.length > 0) {
-                this.getModel().deleteEntryData("nckd_realcard_list");
-                for (int i = 0; i < dynamicObjects.length; i++) {
-                    DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
-                    String number = info.getString("number");//资产编码
-                    String name = info.getString("name");//资产名称
-                    String nckd_card_type = info.getString("nckd_card_type");//资产类别
-                    String nckd_card_status = info.getString("nckd_card_status");//资产状态
-                    DynamicObject nckd_orgfield = info.getDynamicObject("nckd_orgfield");//归属机构
-                    DynamicObject nckd_dept = info.getDynamicObject("nckd_dept");//归属部门
-                    String nckd_use_name = info.getString("nckd_use_name");//使用人
-                    Date nckd_start_date = info.getDate("nckd_start_date");//开始使用日期
-                    String nckd_local = info.getString("nckd_local");//存放地点
-                    String nckd_card_brand = info.getString("nckd_card_brand");//品牌
-                    String nckd_card_model = info.getString("nckd_card_model");//型号
-                    String nckd_serial_number = info.getString("nckd_serial_number");//序列号
-
-                    //实物卡片清单分录赋值
-                    int rowIndex = this.getModel().createNewEntryRow("nckd_realcard_list");
-
-                    this.getModel().setValue("nckd_card_code",number,rowIndex);
-                    this.getModel().setValue("nckd_card_name",name,rowIndex);
-                    this.getModel().setValue("nckd_card_type",nckd_card_type,rowIndex);
-                    this.getModel().setValue("nckd_card_status",nckd_card_status,rowIndex);
-                    this.getModel().setValue("nckd_orgfield",nckd_orgfield,rowIndex);
-                    this.getModel().setValue("nckd_dept",nckd_dept,rowIndex);
-                    this.getModel().setValue("nckd_use_name",nckd_use_name,rowIndex);
-                    this.getModel().setValue("nckd_start_date",nckd_start_date,rowIndex);
-                    this.getModel().setValue("nckd_local",nckd_local,rowIndex);
-                    this.getModel().setValue("nckd_card_brand",nckd_card_brand,rowIndex);
-                    this.getModel().setValue("nckd_card_model",nckd_card_model,rowIndex);
-                    this.getModel().setValue("nckd_serial_number",nckd_serial_number,rowIndex);
-
-                    if (index.equals(0)) {
-                        //资产信息分录赋值
-                        this.getModel().setValue("asset_name",name);
-                        //资产类别赋值
-                        //规格型号
-                        this.getModel().setValue("asset_model",nckd_card_model);
-                        //使用部门
-                        this.getModel().setValue("asset_costdept",nckd_dept);
-                        //使用人
-                        //根据姓名name查询用户,工号是number
-                        QFilter userFilter = new QFilter("name", QCP.equals,nckd_use_name);
-                        DynamicObject[] userDynamicObjects = BusinessDataServiceHelper.load("bos_user","id",new QFilter[] {userFilter});
-                        for (int d=0;d<userDynamicObjects.length;d++) {
-                            DynamicObject userInfo = BusinessDataServiceHelper.loadSingle(userDynamicObjects[i].getPkValue(), userDynamicObjects[i].getDynamicObjectType().getName());
-                            this.getModel().setValue("asset_user",userInfo);
-                        }
-                        //存放地点
+                //实物卡片清单分录赋值
+                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(object.get(2), "nckd_fa_card_real_list");
+                int rowIndex = this.getModel().createNewEntryRow("nckd_realcard_list2");
+                this.getModel().setValue("nckd_card_code2",cardInfo,rowIndex,parentIndex);
+                if (i == 0) {
+                    String name = cardInfo.getString("name");//资产名称
+                    DynamicObject nckd_dept = cardInfo.getDynamicObject("nckd_dept");//归属部门
+                    String nckd_use_name = cardInfo.getString("nckd_use_name");//使用人
+                    String nckd_local = cardInfo.getString("nckd_local");//存放地点
+                    String nckd_card_model = cardInfo.getString("nckd_card_model");//型号
+                    //资产信息分录赋值
+                    this.getModel().setValue("asset_name", name, parentIndex);
+                    //资产类别赋值
+                    //规格型号
+                    this.getModel().setValue("asset_model",nckd_card_model, parentIndex);
+                    //使用部门
+                    this.getModel().setValue("asset_costdept",nckd_dept, parentIndex);
+                    //使用人
+                    QFilter userFilter = new QFilter("number", QCP.equals,nckd_use_name);
+                    DynamicObject[] userDynamicObjects = BusinessDataServiceHelper.load("bos_user","id",new QFilter[] {userFilter});
+                    for (int d=0;d<userDynamicObjects.length;d++) {
+                        DynamicObject userInfo = BusinessDataServiceHelper.loadSingle(userDynamicObjects[i].getPkValue(), userDynamicObjects[i].getDynamicObjectType().getName());
+                        this.getModel().setValue("asset_user",userInfo, parentIndex);
                     }
-                    index++;
+                    //存放地点
+                    this.getModel().setValue("nckd_storeplace",nckd_local, parentIndex);
                 }
-                //刷新实物卡片清单分录
-                this.getView().updateView("nckd_realcard_list");
-                this.getView().updateView("assetentry");
             }
+            //刷新实物卡片清单分录
+            this.getView().updateView("assetentry");
         } else if (StringUtils.equals("nckd_apfinapbill", fieldKey)) {
             ChangeData changeData = e.getChangeSet()[0];
             DynamicObject dynamicObject = (DynamicObject) changeData.getNewValue();
@@ -156,22 +118,37 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
                 Date bookdate = gzInfo.getDate("bookdate");
                 String remark = gzInfo.getString("remark");
                 BigDecimal pricetaxtotal = gzInfo.getBigDecimal("pricetaxtotal");
+                BigDecimal expenseamount = BigDecimal.ZERO;//报销金额
+
+
+                //费用明细分录
+                DynamicObjectCollection expenseentryentity = this.getModel().getEntryEntity("expenseentryentity");
+                for (DynamicObject object : expenseentryentity) {
+                    expenseamount = expenseamount.add(object.getBigDecimal("expenseamount"));
+                }
+
+                //冲销金额
+                BigDecimal nckd_accloanamount = expenseamount;
+                //差额
+                BigDecimal nckd_sub_amount = pricetaxtotal.subtract(nckd_accloanamount);
                 //给冲预付借款赋值
-                int rowIndex = this.getModel().createNewEntryRow("writeoffmoney");
-
-                this.getModel().setValue("loanbillnov1",billno,rowIndex);
-                this.getModel().setValue("sourceentrycostdept",org,rowIndex);
-                this.getModel().setValue("sourceentrycostcompany",org,rowIndex);
-                this.getModel().setValue("sourceexpenseitem",expenseitem,rowIndex);
-                this.getModel().setValue("srcentrywlunit",receivingsupplierid,rowIndex);
-                this.getModel().setValue("loanapplydatev1",bookdate,rowIndex);
-                this.getModel().setValue("loandescriptionv1",remark,rowIndex);
-                this.getModel().setValue("loanamount",pricetaxtotal,rowIndex);
-                this.getModel().setValue("accloanamount",pricetaxtotal,rowIndex);
-                this.getModel().setValue("currloanamount",pricetaxtotal,rowIndex);
-                this.getModel().setValue("curraccloanamount",pricetaxtotal,rowIndex);
+                this.getModel().deleteEntryData("nckd_ap_finapbill_detail");
+                int rowIndex = this.getModel().createNewEntryRow("nckd_ap_finapbill_detail");
+
+                this.getModel().setValue("nckd_loanbillnov1",billno,rowIndex);
+                this.getModel().setValue("nckd_sourceentrycostdept",org,rowIndex);
+                this.getModel().setValue("nckd_sourceentrycostcompa",org,rowIndex);
+                this.getModel().setValue("nckd_sourceexpenseitem",expenseitem,rowIndex);
+//                this.getModel().setValue("nckd_srcentrywlunit",receivingsupplierid,rowIndex);
+                this.getModel().setValue("nckd_loanapplydatev1",bookdate,rowIndex);
+                this.getModel().setValue("nckd_loandescriptionv1",remark,rowIndex);
+                this.getModel().setValue("nckd_loanamount",pricetaxtotal,rowIndex);
+                this.getModel().setValue("nckd_currloanamount",pricetaxtotal,rowIndex);
+                this.getModel().setValue("nckd_accloanamount",nckd_accloanamount,rowIndex);
+                this.getModel().setValue("nckd_curraccloanamount",nckd_accloanamount,rowIndex);
+                this.getModel().setValue("nckd_sub_amount",nckd_sub_amount,rowIndex);
                 //刷新冲预付借款分录
-                this.getView().updateView("writeoffmoney");
+                this.getView().updateView("nckd_ap_finapbill_detail");
             }
         }//资产组织变更
         else if (StringUtils.equals("assetorg", fieldKey)) {
@@ -207,6 +184,107 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
             this.getModel().setValue("asset_costdept", orgInfo, e.getChangeSet()[0].getRowIndex());
             //刷新资产信息分录
             this.getView().updateView("assetentry");
+        } else if (StringUtils.equals("expenseamount", fieldKey) || StringUtils.equals("nckd_amountfield3", fieldKey)) {
+            String reimbursetype = (String) this.getModel().getValue("reimbursetype");
+            if("asset".equals(reimbursetype)) {
+                if (this.getModel().getEntryEntity("assetentry").size() == 0) {
+                    int rowIndex = this.getModel().createNewEntryRow("assetentry");
+                }
+                ChangeData changeData = e.getChangeSet()[0];
+                BigDecimal expenseamount = (BigDecimal) changeData.getNewValue();
+                this.getModel().setValue("nckd_amountfield3", expenseamount, 0);//含税单价
+
+                //含税金额 = 含税单价*数量
+                BigDecimal asset_quantity = (BigDecimal) this.getModel().getValue("asset_quantity");
+                BigDecimal assetexpenseamount = expenseamount.multiply(asset_quantity);
+                this.getModel().setValue("assetexpenseamount", assetexpenseamount, 0);
+
+                //不含税单价 = 含税单价/(1+税率)
+                BigDecimal assettaxrate = (BigDecimal) this.getModel().getValue("assettaxrate");
+                assettaxrate = assettaxrate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+                BigDecimal rate = assettaxrate.add(BigDecimal.ONE);
+                BigDecimal assetpricewithouttax = expenseamount.divide(rate, 2 , RoundingMode.HALF_UP);
+                this.getModel().setValue("assetpricewithouttax", assetpricewithouttax, 0);
+
+                //不含税金额 = 不含税单价*数量
+                BigDecimal assetorientryamount = assetpricewithouttax.multiply(asset_quantity);
+                this.getModel().setValue("assetorientryamount", assetorientryamount, 0);
+
+                //税额 = 含税金额-不含税金额
+                BigDecimal assettaxamount = assetexpenseamount.subtract(assetorientryamount);
+                this.getModel().setValue("assettaxamount", assettaxamount, 0);
+            }
+
+            DynamicObjectCollection nckd_ap_finapbill_detail = this.getModel().getEntryEntity("nckd_ap_finapbill_detail");
+            if (nckd_ap_finapbill_detail.size() > 0) {
+                BigDecimal expenseamount = BigDecimal.ZERO;//核定金额
+                //费用明细分录
+                DynamicObjectCollection expenseentryentity = this.getModel().getEntryEntity("expenseentryentity");
+                for (DynamicObject object : expenseentryentity) {
+                    expenseamount = expenseamount.add(object.getBigDecimal("expenseamount"));
+                }
+
+                //冲销金额
+                BigDecimal nckd_accloanamount = expenseamount;
+                //借款余额
+                BigDecimal nckd_loanamount = nckd_ap_finapbill_detail.get(0).getBigDecimal("nckd_loanamount");
+                //差额
+                BigDecimal nckd_sub_amount = nckd_loanamount.subtract(nckd_accloanamount);
+
+                this.getModel().setValue("nckd_loanamount",nckd_loanamount,0);
+                this.getModel().setValue("nckd_currloanamount",nckd_loanamount,0);
+                this.getModel().setValue("nckd_accloanamount",nckd_accloanamount,0);
+                this.getModel().setValue("nckd_curraccloanamount",nckd_accloanamount,0);
+                this.getModel().setValue("nckd_sub_amount",nckd_sub_amount,0);
+                //刷新冲预付借款分录
+                this.getView().updateView("nckd_ap_finapbill_detail");
+            }
+        } else if (StringUtils.equals("taxrate", fieldKey) || StringUtils.equals("assettaxrate", fieldKey)) {
+            String reimbursetype = (String) this.getModel().getValue("reimbursetype");
+            if("asset".equals(reimbursetype)) {
+                if (this.getModel().getEntryEntity("assetentry").size() == 0) {
+                    int rowIndex = this.getModel().createNewEntryRow("assetentry");
+                }
+                ChangeData changeData = e.getChangeSet()[0];
+                BigDecimal assettaxrate = (BigDecimal) changeData.getNewValue();
+                this.getModel().setValue("assettaxrate", assettaxrate,0);//税率
+
+                //含税金额 = 含税单价 * 数量
+                BigDecimal nckd_amountfield3 = (BigDecimal) this.getModel().getValue("nckd_amountfield3");
+                BigDecimal asset_quantity = (BigDecimal) this.getModel().getValue("asset_quantity");
+                BigDecimal assetexpenseamount = nckd_amountfield3.multiply(asset_quantity);
+                this.getModel().setValue("assetexpenseamount", assetexpenseamount,0);
+
+                //不含税单价 = 含税单价/(1+税率)
+                assettaxrate = assettaxrate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+                BigDecimal rate = assettaxrate.add(BigDecimal.ONE);
+                BigDecimal assetpricewithouttax = nckd_amountfield3.divide(rate, 2 , RoundingMode.HALF_UP);
+                this.getModel().setValue("assetpricewithouttax", assetpricewithouttax,0);
+
+                //不含税金额 = 不含税单价*数量
+                BigDecimal assetorientryamount = assetpricewithouttax.multiply(asset_quantity);
+                this.getModel().setValue("assetorientryamount", assetorientryamount,0);
+
+                //税额 = 含税金额-不含税金额
+                BigDecimal assettaxamount = assetexpenseamount.subtract(assetorientryamount);
+                this.getModel().setValue("assettaxamount", assettaxamount, 0);
+            }
+        }
+    }
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        //报账类型
+        String reimbursetype = (String) this.getModel().getValue("reimbursetype");
+        int rowIndex = this.getModel().createNewEntryRow("assetentry");
+        if("asset".equals(reimbursetype)){
+            //获取费用明细分录
+            DynamicObjectCollection assetentry = this.getModel().getEntryEntity("expenseentryentity");
+            //查询费用明细
+            QFilter filter = new QFilter("name", QCP.equals,"资产报账");
+            DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("er_expenseitemedit","id",new QFilter[] {filter});
+            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[0].getPkValue(), dynamicObjects[0].getDynamicObjectType().getName());
+            this.getModel().setValue("expenseitem", info, 0);
         }
     }
 

+ 11 - 12
src/main/java/fi/er/opplugin/PublicreimburOpPlugin.java

@@ -44,13 +44,12 @@ public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn {
                 info.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue());
 
                 //反写实物卡片清单
-                if (info.getDynamicObjectCollection("nckd_realcard_list") != null ) {
-                    List<String > codeList = new ArrayList<>();
-                    for (DynamicObject entryentity : info.getDynamicObjectCollection("nckd_realcard_list")) {
-                        //取当前循环付款明细分录的源单分录id
-                        String cardCode = entryentity.getString("nckd_card_code");
+                for (DynamicObject entryentity : info.getDynamicObjectCollection("assetentry")) {
+                    DynamicObjectCollection nckd_real_card = entryentity.getDynamicObjectCollection("nckd_real_card");
+                    for (DynamicObject object : nckd_real_card) {
+                        Long id = (Long) object.get(2);
                         //查询实物卡片分录数据,如果查询到数据则不能保存该报销单
-                        QFilter filter = new QFilter("number", QCP.equals,cardCode);
+                        QFilter filter = new QFilter("id", QCP.equals,id);
                         DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
                         for (int j = 0; j < cardObjects.length; j++) {
                             DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardObjects[i].getPkValue(), cardObjects[i].getDynamicObjectType().getName());
@@ -72,17 +71,17 @@ public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn {
                 info.set("nckd_settlestatus", null);
 
                 //反审核反写实物卡片清单
-                if (info.getDynamicObjectCollection("nckd_realcard_list") != null ) {
-                    List<String > codeList = new ArrayList<>();
-                    for (DynamicObject entryentity : info.getDynamicObjectCollection("nckd_realcard_list")) {
-                        //取当前循环付款明细分录的源单分录id
-                        String cardCode = entryentity.getString("nckd_card_code");
+                for (DynamicObject entryentity : info.getDynamicObjectCollection("assetentry")) {
+                    DynamicObjectCollection nckd_real_card = entryentity.getDynamicObjectCollection("nckd_real_card");
+                    for (DynamicObject object : nckd_real_card) {
+                        Long id = (Long) object.get(2);
                         //查询实物卡片分录数据,如果查询到数据则不能保存该报销单
-                        QFilter filter = new QFilter("number", QCP.equals,cardCode);
+                        QFilter filter = new QFilter("id", QCP.equals,id);
                         DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
                         for (int j = 0; j < cardObjects.length; j++) {
                             DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardObjects[i].getPkValue(), cardObjects[i].getDynamicObjectType().getName());
                             //资产报账单审核通过后,实物卡片清单标记为1
+                            //资产报账单审核通过后,实物卡片清单标记为1
                             cardInfo.set("nckd_flag", "0");
                             //星瀚实物卡片三个字段回写为空
                             cardInfo.set("nckd_card_real_org", null);

+ 35 - 272
src/main/java/fi/fa/opplugin/AssetMidBillOpPlugin.java

@@ -1,6 +1,7 @@
 package fi.fa.opplugin;
 
 import com.alibaba.druid.util.StringUtils;
+import fi.fa.opplugin.utils.ChangeDataUtils;
 import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
@@ -13,10 +14,9 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.operation.OperationServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
-import org.apache.commons.lang3.ObjectUtils;
-import java.util.ArrayList;
 import java.util.List;
 
+//资产调出单中间表下推资产调出单
 public class AssetMidBillOpPlugin extends AbstractOperationServicePlugIn {
     @Override
     public void beginOperationTransaction(BeginOperationTransactionArgs e) {
@@ -31,40 +31,24 @@ public class AssetMidBillOpPlugin extends AbstractOperationServicePlugIn {
                 }else {
                     String dispatchType = info.getString("nckd_dispatch_type");
                     String direction = info.getString("nckd_direction");
-                    String nckd_card_real_code = info.getString("nckd_card_number_tag");
-                    String[] asset = nckd_card_real_code.split(",");
-                    // 存储键的数组
-                    String[] keys = new String[asset.length];
-                    List<String> number = new ArrayList<>();
-                    List<String> cardNumber = new ArrayList<>();
-                    // 遍历每个键值对并获取键
-                    for (int j = 0; j < asset.length; j++) {
-                        String[] keyValue = asset[j].split(":");
-                        if (keyValue.length > 0) {
-                            number.add(keyValue[0]);
-                        }
-                    }
-                    //查询e管家实物卡片清单
-                    QFilter cardFilter = new QFilter("number", QCP.in,number);
-                    DynamicObject[] eCard = BusinessDataServiceHelper.load("nckd_fa_card_real_list","nckd_card_real_code",new QFilter[] {cardFilter});
-                    for (DynamicObject object : eCard) {
-                        cardNumber.add(object.getString("nckd_card_real_code"));
-                    }
-                    if ("0".equals(dispatchType)) {
-                        List<String> list = new ArrayList<>();
-                        list.add("A00100101900240600002");
-                        list.add("A00100101900240600008");
-                        QFilter filter = new QFilter("number", QCP.in,"A00100101900240600002");
-                        filter.and("isbak",  QCP.equals, "0");
-                        DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
-//                        if (asset.length == card.length) {
+                    String error = ChangeDataUtils.check(info);
+                    if (!StringUtils.isEmpty(error)) {
+                        this.operationResult.setShowMessage(true);
+                        this.operationResult.setSuccess(false);
+                        this.operationResult.setMessage(error);
+                    }else {
+                        List<String> codeList = ChangeDataUtils.getCardNumber(info);
+                        if ("0".equals(dispatchType)) {
+                            QFilter filter = new QFilter("number", QCP.in,codeList);
+                            filter.and("isbak",  QCP.equals, "0");
+                            DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
                             DynamicObject dispatch = BusinessDataServiceHelper.newDynamicObject("fa_dispatch");
                             //单据头
                             dispatch.set("dispatchdate", info.getDate("nckd_date_out"));//调出日期
-                            dispatch.set("assetunit", getOrg(info.getString("nckd_org_out")));//调出组织
-                            dispatch.set("inassetunit", getOrg(info.getString("nckd_org_in")));//调入组织
-                            dispatch.set("org", getOrg(info.getString("nckd_org_out")));//调出核算组织
-                            dispatch.set("inorg", getOrg(info.getString("nckd_org_in")));//调入核算组织
+                            dispatch.set("assetunit", ChangeDataUtils.getOrg(info.getString("nckd_org_out")));//调出组织
+                            dispatch.set("inassetunit", ChangeDataUtils.getOrg(info.getString("nckd_org_in")));//调入组织
+                            dispatch.set("org", ChangeDataUtils.getOrg(info.getString("nckd_org_out")));//调出核算组织
+                            dispatch.set("inorg", ChangeDataUtils.getOrg(info.getString("nckd_org_in")));//调入核算组织
                             dispatch.set("reason", info.getString("nckd_reason"));//调出原因
                             dispatch.set("dispatchtype", "A");//调拨类型 A="平价调拨",B="非平价调拨"
                             dispatch.set("changemode", 14);//减少方式默认"调出"
@@ -72,23 +56,23 @@ public class AssetMidBillOpPlugin extends AbstractOperationServicePlugIn {
                             dispatch.set("currencyrate", 1);//结算汇率
                             //制单信息
                             dispatch.set("billstatus", "A");//暂存
-                        //调出方向
-                        if("0".equals(direction)){
-                            dispatch.set("outuser", getUser(info.getString("nckd_user_out")));//调出申请人
-                            dispatch.set("inuser", getUser(info.getString("nckd_user_in")));//调入负责人
-                            dispatch.set("creator", getUser(info.getString("nckd_user_out")));//创建人
-                            dispatch.set("modifier", getUser(info.getString("nckd_user_out")));//修改人
-                            dispatch.set("auditor", getUser(info.getString("nckd_user_out")));//审核人
-                            dispatch.set("appliant", getUser(info.getString("nckd_user_out")));//调拨申请人
-                        }//调入方向
-                        else if ("1".equals(direction)) {
-                            dispatch.set("outuser", getUser(info.getString("nckd_user_in")));//调出申请人
-                            dispatch.set("inuser", getUser(info.getString("nckd_user_out")));//调入负责人
-                            dispatch.set("creator", getUser(info.getString("nckd_user_in")));//创建人
-                            dispatch.set("modifier", getUser(info.getString("nckd_user_in")));//修改人
-                            dispatch.set("auditor", getUser(info.getString("nckd_user_in")));//审核人
-                            dispatch.set("appliant", getUser(info.getString("nckd_user_in")));//调拨申请人
-                        }
+                            //调出方向
+                            if("0".equals(direction)){
+                                dispatch.set("outuser", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//调出申请人
+                                dispatch.set("inuser", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//调入负责人
+                                dispatch.set("creator", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//创建人
+                                dispatch.set("modifier", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//修改人
+                                dispatch.set("auditor", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//审核人
+                                dispatch.set("appliant", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//调拨申请人
+                            }//调入方向
+                            else if ("1".equals(direction)) {
+                                dispatch.set("outuser", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//调出申请人
+                                dispatch.set("inuser", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//调入负责人
+                                dispatch.set("creator", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//创建人
+                                dispatch.set("modifier", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//修改人
+                                dispatch.set("auditor", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//审核人
+                                dispatch.set("appliant", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//调拨申请人
+                            }
                             for (int c = 0; c < card.length; c++) {
                                 DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
                                 //创建调出单分录
@@ -97,7 +81,7 @@ public class AssetMidBillOpPlugin extends AbstractOperationServicePlugIn {
                                 entry1.set("realcard", cardInfo);//资产编码
                                 entry1.set("measurement", cardInfo.getDynamicObject("unit").getLong("id"));//计量单位
                                 entry1.set("dispatchqty", cardInfo.getInt("assetamount"));//数量
-                                entry1.set("inusedept", getOrg(info.getString("nckd_dept_in")));//调入使用部门
+                                entry1.set("inusedept", ChangeDataUtils.getOrg(info.getString("nckd_dept_in")));//调入使用部门
                             }
                             //执行保存-提交-审核
                             OperationResult saveResult = SaveServiceHelper.saveOperate("fa_dispatch", new DynamicObject[]{dispatch}, OperateOption.create());
@@ -114,231 +98,10 @@ public class AssetMidBillOpPlugin extends AbstractOperationServicePlugIn {
                                 this.operationResult.setSuccess(false);
                                 this.operationResult.setMessage("下推资产调出单单失败");
                             }
-
-//                        }else {
-//                            throw new KDBizException("请先拆分实物卡片再下推生单!");
-//                        }
-
-                    }else if ("1".equals(dispatchType)) {
-                        DynamicObject changeDept = BusinessDataServiceHelper.newDynamicObject("fa_change_dept");
-                        //单据头
-                        DynamicObject orgInfo = queryOrg(getOrg(info.getString("nckd_org_in")));
-                        changeDept.set("org", orgInfo);//核算组织
-                        changeDept.set("changedate", info.getDate("nckd_date_out"));//记账日期
-                        changeDept.set("appliantid", getUser(info.getString("nckd_user_out")));//变更申请人
-                        changeDept.set("remark", info.getString("nckd_reason"));//调出原因
-                        changeDept.set("sourcetype", 2);//来源方式(5:API生成)
-                        changeDept.set("changetype", queryChangeType(Long.parseLong("733953285719123968")));//变更类型,默认部门变更
-                        changeDept.set("chtypedetail", "1");//变更类型明细默认实物变更1
-                        changeDept.set("voucherflag", "A");//记账标识默认无需记账A
-                        changeDept.set("billstatus", "A");//暂存
-                        QFilter filter = new QFilter("number", QCP.in,"A00100101900240600007");
-                        filter.and("isbak",  QCP.equals, "0");
-                        DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
-                        for (int c = 0; c < card.length; c++) {
-                            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
-                            //查询财务卡片
-                            DynamicObject fin = queryFinCard(cardInfo.getLong("id"));//财务卡片id
-                            //创建变更字段分录
-                            DynamicObjectCollection fieldentry = changeDept.getDynamicObjectCollection("fieldentry");
-                            if (!getOrg(info.getString("nckd_org_in")).equals(cardInfo.getDynamicObject("headusedept").getLong("id"))){
-                                DynamicObject entry1 = fieldentry.addNew();
-                                entry1.set("realcard1", cardInfo);//资产编码
-                                entry1.set("depreuse1", queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
-                                entry1.set("currency1", 1);//币别
-                                entry1.set("basecurrency1", 1);//本币位
-                                entry1.set("assetnumber",cardInfo.getString("number"));//资产编码
-                                entry1.set("bizdate1", info.getDate("nckd_date_out"));//业务日期
-                                entry1.set("field", "fa_card_real.headusedept");//变更字段-部门
-                                entry1.set("beforevalue", String.valueOf(cardInfo.getDynamicObject("headusedept").getLong("id")));//变更前值
-                                entry1.set("aftervalue", getOrg(info.getString("nckd_dept_in")).toString());//变更后值
-                                entry1.set("realcardmasterid", cardInfo);//实物卡片id
-                                entry1.set("fincard1", fin);//财务卡片
-                            }
-                            if (ObjectUtils.isEmpty(cardInfo.getDynamicObject("headuseperson")) ||
-                                    ObjectUtils.isNotEmpty(cardInfo.getDynamicObject("headuseperson")) && !getUser(info.getString("nckd_used_user")).equals(cardInfo.getDynamicObject("headuseperson").getLong("id"))) {
-                                String beforevalue = cardInfo.getDynamicObject("headuseperson") == null ? "" : String.valueOf(cardInfo.getDynamicObject("headuseperson").getLong("id"));
-                                DynamicObject entry2 = fieldentry.addNew();
-                                entry2.set("realcard1", cardInfo);//资产编码
-                                entry2.set("depreuse1", queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
-                                entry2.set("currency1", 1);//币别
-                                entry2.set("basecurrency1", 1);//本币位
-                                entry2.set("assetnumber",cardInfo.getString("number"));//资产编码
-                                entry2.set("bizdate1", info.getDate("nckd_date_out"));//业务日期
-                                entry2.set("field", "fa_card_real.headuseperson");//变更字段-使用人
-                                entry2.set("beforevalue", beforevalue);//变更前值
-                                entry2.set("aftervalue", String.valueOf(getUser(info.getString("nckd_used_user")).getLong("id")));//变更后值
-                                entry2.set("realcardmasterid", cardInfo);//实物卡片id
-                                entry2.set("fincard1", fin);//财务卡片
-                            }
-
-                            //创建实物变更分录
-                            DynamicObjectCollection realentry = changeDept.getDynamicObjectCollection("realentry");
-                            DynamicObject realentry1 = realentry.addNew();
-                            realentry1.set("realcard", cardInfo.getLong("id"));//资产编码
-
-                            //创建财务变更分录
-                            DynamicObjectCollection finentry = realentry1.getDynamicObjectCollection("finentry");
-                            DynamicObject finentry1 = finentry.addNew();
-                            finentry1.set("depreuse", queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
-                            finentry1.set("fincard", fin);
-                            finentry1.set("bizdate", info.getDate("nckd_date_out"));
-
-                        }
-                        //执行保存-提交-审核
-                        OperationResult saveResult = SaveServiceHelper.saveOperate("fa_change_dept", new DynamicObject[]{changeDept}, OperateOption.create());
-                        if (saveResult.isSuccess()) {
-                            info.set("nckd_flag", "1");
-                            SaveServiceHelper.save(new DynamicObject[]{info});
-                            this.operationResult.setShowMessage(true);
-                            this.operationResult.setSuccess(true);
-                            this.operationResult.setMessage("下推资产变更单成功");
-                            OperationResult submitResult = OperationServiceHelper.executeOperate("submit", "fa_change_dept",saveResult.getSuccessPkIds().toArray(),OperateOption.create());
-                            OperationResult auditResult = OperationServiceHelper.executeOperate("audit", "fa_change_dept",submitResult.getSuccessPkIds().toArray(),OperateOption.create());
-                        }else {
-                            this.operationResult.setShowMessage(true);
-                            this.operationResult.setSuccess(false);
-                            this.operationResult.setMessage("下推资产变更单失败");
-                        }
-                    }
-                    else if ("2".equals(dispatchType)) {
-                        DynamicObject busProcess = BusinessDataServiceHelper.newDynamicObject("nckd_ywcld");
-                        busProcess.set("nckd_bizdate", info.getDate("nckd_date_out"));//业务日期
-                        busProcess.set("nckd_detailtype", "D");//业务类型 D:报废
-                        busProcess.set("nckd_costcompany", getOrg(info.getString("nckd_org_in")));//资产组织
-                        busProcess.set("nckd_textfield1", info.getString("nckd_reason"));//摘要事由
-                        busProcess.set("nckd_applierv", getUser(info.getString("nckd_user_out")));//制单人
-
-                        //制单信息
-                        busProcess.set("creator", getUser(info.getString("nckd_user_out")));//创建人
-                        busProcess.set("createtime", info.getDate("nckd_date_out"));//创建时间
-                        busProcess.set("modifier", getUser(info.getString("nckd_user_out")));//修改人
-                        busProcess.set("modifytime", info.getDate("nckd_date_out"));//修改时间
-                        busProcess.set("auditor", getUser(info.getString("nckd_user_out")));//审核人
-                        busProcess.set("auditdate", info.getDate("nckd_date_out"));//审核时间
-                        busProcess.set("billstatus", "A");//状态
-                        QFilter filter = new QFilter("number", QCP.equals,"A00100101900240700007");
-                        cardFilter.and("isbak",  QCP.equals, "0");
-                        DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
-                        for (int c = 0; c < card.length; c++) {
-                            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
-                            //创建报废明细分录
-                            DynamicObjectCollection entryEntity = busProcess.getDynamicObjectCollection("nckd_entryentity6");
-                            DynamicObject entry1 = entryEntity.addNew();
-                            entry1.set("nckd_basedatafield", cardInfo);//资产编码
-                            Integer count = Integer.valueOf(info.getString("nckd_count"));
-                            entry1.set("nckd_integerfield", count);//报废数量
-                        }
-                        //执行保存-提交-审核
-                        OperationResult saveResult = SaveServiceHelper.saveOperate("nckd_ywcld", new DynamicObject[]{busProcess}, OperateOption.create());
-                        if (saveResult.isSuccess()){
-                            info.set("nckd_flag", "1");
-                            SaveServiceHelper.save(new DynamicObject[]{info});
-                            this.operationResult.setShowMessage(true);
-                            this.operationResult.setSuccess(true);
-                            this.operationResult.setMessage("下推业务处理单成功");
-                            OperationResult submitResult = OperationServiceHelper.executeOperate("submit", "nckd_ywcld",saveResult.getSuccessPkIds().toArray(),OperateOption.create());
-                            OperationResult auditResult = OperationServiceHelper.executeOperate("audit", "nckd_ywcld",submitResult.getSuccessPkIds().toArray(),OperateOption.create());
-                        }else {
-                            this.operationResult.setShowMessage(true);
-                            this.operationResult.setSuccess(false);
-                            this.operationResult.setMessage("下推业务处理单失败");
                         }
                     }
                 }
             }
         }
     }
-
-    /**
-     * @description 查询用户表获取用户
-     * @param eUser
-     * @return Long
-     */
-    private DynamicObject getUser(String eUser) {
-        QFilter filter = new QFilter("number", QCP.in, eUser);
-        DynamicObject[] user = BusinessDataServiceHelper.load("bos_user","id",new QFilter[] {filter});
-        if (user.length > 0) {
-            DynamicObject userInfo = BusinessDataServiceHelper.loadSingle(user[0].getPkValue(), user[0].getDynamicObjectType().getName());
-            return userInfo;
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询组织对照表获取组织id
-     * @param eOrgId
-     * @return Long
-     */
-    private Long getOrg(String eOrgId) {
-        QFilter orgFilter = new QFilter("nckd_e_org", QCP.equals,eOrgId);
-        DynamicObject[] orgControl = BusinessDataServiceHelper.load("nckd_base_org_ext","id",new QFilter[] {orgFilter});
-        if (orgControl.length > 0) {
-            DynamicObject orgControlInfo = BusinessDataServiceHelper.loadSingle(orgControl[0].getPkValue(), orgControl[0].getDynamicObjectType().getName());
-            String number = orgControlInfo.getString("nckd_org_number");
-            QFilter filter = new QFilter("number", QCP.equals,number);
-            DynamicObject[] org = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {filter});
-            if (org.length > 0) {
-                DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(org[0].getPkValue(), org[0].getDynamicObjectType().getName());
-                return orgInfo.getLong("id");
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询财务卡片
-     * @param realCardId
-     */
-    private DynamicObject queryFinCard(Long realCardId) {
-        QFilter cardFilter = new QFilter("realcardmasterid", QCP.equals,realCardId);
-        DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_fin","id",new QFilter[] {cardFilter});
-        for (int c = 0; c < card.length; c++) {
-            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
-            return cardInfo;
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询折旧用途
-     * @param id
-     */
-    private DynamicObject queryDepreuse(Long id) {
-        QFilter orgQFilter= new QFilter("id", QCP.equals,id);
-        DynamicObject[] depreuse = BusinessDataServiceHelper.load("fa_depreuse","id",new QFilter[] {orgQFilter});
-        for (int c = 0; c < depreuse.length; c++) {
-            DynamicObject depreuseInfo = BusinessDataServiceHelper.loadSingle(depreuse[c].getPkValue(), depreuse[c].getDynamicObjectType().getName());
-            return depreuseInfo;
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询变更类型
-     * @param id
-     */
-    private DynamicObject queryChangeType(Long id) {
-        QFilter orgQFilter= new QFilter("id", QCP.equals,id);
-        DynamicObject[] changeType = BusinessDataServiceHelper.load("fa_change_type","id",new QFilter[] {orgQFilter});
-        for (int c = 0; c < changeType.length; c++) {
-            DynamicObject changeInfo = BusinessDataServiceHelper.loadSingle(changeType[c].getPkValue(), changeType[c].getDynamicObjectType().getName());
-            return changeInfo;
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询组织
-     * @param orgId
-     */
-    private DynamicObject queryOrg(Long orgId) {
-        QFilter orgQFilter= new QFilter("id", QCP.equals,orgId);
-        DynamicObject[] org = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {orgQFilter});
-        for (int c = 0; c < org.length; c++) {
-            DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(org[c].getPkValue(), org[c].getDynamicObjectType().getName());
-            return orgInfo;
-        }
-        return null;
-    }
 }

+ 61 - 16
src/main/java/fi/fa/opplugin/AssetSplitBillOpPlugin.java

@@ -2,8 +2,9 @@ package fi.fa.opplugin;
 
 import com.alibaba.druid.util.StringUtils;
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
-import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
@@ -12,26 +13,70 @@ import kd.bos.servicehelper.operation.SaveServiceHelper;
 //资产拆分单
 public class AssetSplitBillOpPlugin extends AbstractOperationServicePlugIn {
     @Override
-    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
         DynamicObject[] dynamicObjects = e.getDataEntities();
         for (int i = 0; i < dynamicObjects.length; i++) {
-            if (StringUtils.equals(e.getOperationKey(), "audit")) {
-                //审核通过后反写e管家实物卡片清单
-                DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
-                for (DynamicObject dynamicObject : info.getDynamicObjectCollection("subassetsplitentry")) {
-                    String number = dynamicObject.getString("aft_cardnumber");//资产编码
-                    DynamicObject card = dynamicObject.getDynamicObject("nckd_real_card_list");//e管家实物卡片清单字段
-                    Long id = card.getLong("id");
-                    //查询e管家实物卡片清单
-                    QFilter filter = new QFilter("id", QCP.equals,id);
-                    DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
-                    for (int j = 0; j < cardObjects.length; j++) {
-                        DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardObjects[j].getPkValue(), cardObjects[j].getDynamicObjectType().getName());
-                        //更新星瀚实物编码字段
-                        cardInfo.set("nckd_card_real_code", number);
+            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+            DynamicObject assetsplitentry = info.getDynamicObjectCollection("assetsplitentry").get(0);
+            //获取拆分后分录
+            DynamicObjectCollection subassetsplitentry = assetsplitentry.getDynamicObjectCollection("subassetsplitentry");
+            if (StringUtils.equals(e.getOperationKey(),"audit")) {
+                for (DynamicObject object : subassetsplitentry) {
+                    //拆分后分录实物卡片清单字段
+                    DynamicObject nckd_real_card_list = object.getDynamicObject("nckd_real_card_list");
+                    if (nckd_real_card_list != null) {
+                        //查询实物卡片
+                        String aft_cardnumber = object.getString("aft_cardnumber");
+                        QFilter filter = new QFilter("number", QCP.equals,aft_cardnumber);
+                        filter.and("isbak", QCP.equals, "0");
+                        DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
+                        DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[0].getPkValue(), card[0].getDynamicObjectType().getName());
+
+                        //实物卡片表头多选基础资料赋值
+                        cardInfo.getDynamicObjectCollection("nckd_real_card").clear();
+                        cardInfo.getDynamicObjectCollection("nckd_real_card").addNew().set("fbasedataid",nckd_real_card_list);
+
+                        //实物卡片分录明细赋值
+                        DynamicObjectCollection nckd_realcard_list = cardInfo.getDynamicObjectCollection("nckd_realcard_list");
+                        nckd_realcard_list.clear();
+                        nckd_realcard_list.addNew().set("nckd_card_code21", nckd_real_card_list);
                         SaveServiceHelper.save(new DynamicObject[]{cardInfo});
+
+                        //e管家实物卡片
+                        QFilter efilter = new QFilter("id", QCP.equals,nckd_real_card_list.getLong("id"));
+                        DynamicObject[] cardList = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {efilter});
+                        DynamicObject eCard = BusinessDataServiceHelper.loadSingle(cardList[0].getPkValue(), cardList[0].getDynamicObjectType().getName());
+                        eCard.set("nckd_card_real_code", aft_cardnumber);
+                        SaveServiceHelper.save(new DynamicObject[]{eCard});
+                    }
+                }
+            } else if (StringUtils.equals(e.getOperationKey(),"unaudit")) {
+                DynamicObject realcard = assetsplitentry.getDynamicObject("realcard");
+                //查询实物卡片
+                QFilter filter = new QFilter("number", QCP.equals,realcard.getString("number"));
+                filter.and("isbak", QCP.equals, "0");
+                DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
+                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[0].getPkValue(), card[0].getDynamicObjectType().getName());
+                cardInfo.getDynamicObjectCollection("nckd_real_card").clear();
+                cardInfo.getDynamicObjectCollection("nckd_realcard_list").clear();
+                for (DynamicObject object : subassetsplitentry) {
+                    //拆分后分录实物卡片清单字段
+                    DynamicObject nckd_real_card_list = object.getDynamicObject("nckd_real_card_list");
+                    if (nckd_real_card_list != null) {
+
+                        cardInfo.getDynamicObjectCollection("nckd_real_card").addNew().set("fbasedataid",nckd_real_card_list);
+
+                        cardInfo.getDynamicObjectCollection("nckd_realcard_list").addNew().set("nckd_card_code21", nckd_real_card_list);
+
+                        //e管家实物卡片
+                        QFilter efilter = new QFilter("id", QCP.equals,nckd_real_card_list.getLong("id"));
+                        DynamicObject[] cardList = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {efilter});
+                        DynamicObject eCard = BusinessDataServiceHelper.loadSingle(cardList[0].getPkValue(), cardList[0].getDynamicObjectType().getName());
+                        eCard.set("nckd_card_real_code", realcard.getString("number"));
+                        SaveServiceHelper.save(new DynamicObject[]{eCard});
                     }
                 }
+                SaveServiceHelper.save(new DynamicObject[]{cardInfo});
             }
         }
     }

+ 1 - 1
src/main/java/fi/fa/opplugin/FaChangeDeptBillOpPlugin.java

@@ -64,7 +64,7 @@ public class FaChangeDeptBillOpPlugin extends AbstractOperationServicePlugIn {
                             deptId = Long.parseLong(fieldentry.getString("beforevalue"));
                         }
                         if ("fa_card_real.headuseperson".equals(fieldentry.getString("field")) && !StringUtils.isEmpty(fieldentry.getString("aftervalue"))) {
-                            user = Long.parseLong(fieldentry.getString("beforevalue"));
+                            user = fieldentry.getString("beforevalue").isEmpty() ? null : Long.parseLong(fieldentry.getString("beforevalue"));
                             userInfo = getUser(user);
                         }
                         number = fieldentry.getString("assetnumber");

+ 143 - 0
src/main/java/fi/fa/opplugin/FaChangeMidOpPlugin.java

@@ -0,0 +1,143 @@
+package fi.fa.opplugin;
+
+import com.alibaba.druid.util.StringUtils;
+import fi.fa.opplugin.utils.ChangeDataUtils;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.exception.KDBizException;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import java.util.List;
+
+//资产变更单中间表下推资产变更单
+public class FaChangeMidOpPlugin extends AbstractOperationServicePlugIn {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            if (StringUtils.equals(e.getOperationKey(), "push")) {
+                DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+                String nckd_flag = info.getString("nckd_flag");
+                if ("1".equals(nckd_flag)) {
+                    throw new KDBizException("单据" + info.getString("number") + "已经下推生成了资产调拨单,不允许重复下推!");
+                }else {
+                    String dispatchType = info.getString("nckd_dispatch_type");
+                    String direction = info.getString("nckd_direction");
+                    String error = ChangeDataUtils.check(info);
+                    if (!StringUtils.isEmpty(error)) {
+                        this.operationResult.setShowMessage(true);
+                        this.operationResult.setSuccess(false);
+                        this.operationResult.setMessage(error);
+                    }else {
+
+                        if ("1".equals(dispatchType)) {
+                            DynamicObject changeDept = BusinessDataServiceHelper.newDynamicObject("fa_change_dept");
+                            //单据头
+                            DynamicObject orgInfo = ChangeDataUtils.queryOrg(ChangeDataUtils.getOrg(info.getString("nckd_org_in")));
+                            changeDept.set("org", orgInfo);//核算组织
+                            changeDept.set("changedate", info.getDate("nckd_date_out"));//记账日期
+                            changeDept.set("appliantid", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//变更申请人
+                            changeDept.set("remark", info.getString("nckd_reason"));//调出原因
+                            changeDept.set("sourcetype", 2);//来源方式(5:API生成)
+                            changeDept.set("changetype", ChangeDataUtils.queryChangeType(Long.parseLong("733953285719123968")));//变更类型,默认部门变更
+                            changeDept.set("chtypedetail", "1");//变更类型明细默认实物变更1
+                            changeDept.set("voucherflag", "A");//记账标识默认无需记账A
+                            changeDept.set("billstatus", "A");//暂存
+                            //调出方向
+                            if("0".equals(direction)){
+                                changeDept.set("creator", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//创建人
+                                changeDept.set("appliantid", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//调拨申请人
+                            }//调入方向
+                            else if ("1".equals(direction)) {
+                                changeDept.set("creator", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//创建人
+                                changeDept.set("appliantid", ChangeDataUtils.getUser(info.getString("nckd_user_in")));//调拨申请人
+                            }
+                            List<String> codeList =ChangeDataUtils.getCardNumber(info);
+                            QFilter filter = new QFilter("number", QCP.in,codeList);
+                            filter.and("isbak",  QCP.equals, "0");
+                            DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
+                            for (int c = 0; c < card.length; c++) {
+                                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
+                                //查询财务卡片
+                                DynamicObject fin = ChangeDataUtils.queryFinCard(cardInfo.getLong("id"));//财务卡片id
+                                //创建变更字段分录
+                                DynamicObjectCollection fieldentry = changeDept.getDynamicObjectCollection("fieldentry");
+
+                                String deptAftervalue = ChangeDataUtils.getOrg(info.getString("nckd_dept_in")) == null ? null : ChangeDataUtils.getOrg(info.getString("nckd_dept_in")).toString();
+                                String deptBeforevalue =  cardInfo.getDynamicObject("headusedept") == null ? null : String.valueOf(cardInfo.getDynamicObject("headusedept").getLong("id"));
+                                if (!StringUtils.equals(deptBeforevalue, deptAftervalue)) {
+                                    DynamicObject entry1 = fieldentry.addNew();
+                                    entry1.set("realcard1", cardInfo);//资产编码
+                                    entry1.set("depreuse1", ChangeDataUtils.queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
+                                    entry1.set("currency1", 1);//币别
+                                    entry1.set("basecurrency1", 1);//本币位
+                                    entry1.set("assetnumber",cardInfo.getString("number"));//资产编码
+                                    entry1.set("bizdate1", info.getDate("nckd_date_out"));//业务日期
+                                    entry1.set("field", "fa_card_real.headusedept");//变更字段-部门
+                                    entry1.set("beforevalue", deptBeforevalue);//变更前值
+                                    entry1.set("aftervalue", deptAftervalue);//变更后值
+                                    entry1.set("realcardmasterid", cardInfo);//实物卡片id
+                                    entry1.set("fincard1", fin);//财务卡片
+                                }
+
+                                String userAftervalue = info.getString("nckd_used_user") == null ? null : String.valueOf(ChangeDataUtils.getUser(info.getString("nckd_used_user")).getLong("id"));
+                                String userBeforevalue  = cardInfo.getDynamicObject("headuseperson") == null ? null : String.valueOf(ChangeDataUtils.getUser(info.getString("nckd_used_user")).getLong("id"));
+                                if (!StringUtils.equals(userBeforevalue, userAftervalue)) {
+                                    DynamicObject entry2 = fieldentry.addNew();
+                                    entry2.set("realcard1", cardInfo);//资产编码
+                                    entry2.set("depreuse1", ChangeDataUtils.queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
+                                    entry2.set("currency1", 1);//币别
+                                    entry2.set("basecurrency1", 1);//本币位
+                                    entry2.set("assetnumber",cardInfo.getString("number"));//资产编码
+                                    entry2.set("bizdate1", info.getDate("nckd_date_out"));//业务日期
+                                    entry2.set("field", "fa_card_real.headuseperson");//变更字段-使用人
+                                    entry2.set("beforevalue", userBeforevalue);//变更前值
+                                    entry2.set("aftervalue", userAftervalue);//变更后值
+                                    entry2.set("realcardmasterid", cardInfo);//实物卡片id
+                                    entry2.set("fincard1", fin);//财务卡片
+                                }
+
+
+                                //创建实物变更分录
+                                DynamicObjectCollection realentry = changeDept.getDynamicObjectCollection("realentry");
+                                DynamicObject realentry1 = realentry.addNew();
+                                realentry1.set("realcard", cardInfo.getLong("id"));//资产编码
+
+                                //创建财务变更分录
+                                DynamicObjectCollection finentry = realentry1.getDynamicObjectCollection("finentry");
+                                DynamicObject finentry1 = finentry.addNew();
+                                finentry1.set("depreuse", ChangeDataUtils.queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
+                                finentry1.set("fincard", fin);
+                                finentry1.set("bizdate", info.getDate("nckd_date_out"));
+
+                            }
+                            //执行保存-提交-审核
+                            OperationResult saveResult = SaveServiceHelper.saveOperate("fa_change_dept", new DynamicObject[]{changeDept}, OperateOption.create());
+                            if (saveResult.isSuccess()) {
+                                info.set("nckd_flag", "1");
+                                SaveServiceHelper.save(new DynamicObject[]{info});
+                                this.operationResult.setShowMessage(true);
+                                this.operationResult.setSuccess(true);
+                                this.operationResult.setMessage("下推资产变更单成功");
+                                OperationResult submitResult = OperationServiceHelper.executeOperate("submit", "fa_change_dept",saveResult.getSuccessPkIds().toArray(),OperateOption.create());
+                                OperationResult auditResult = OperationServiceHelper.executeOperate("audit", "fa_change_dept",submitResult.getSuccessPkIds().toArray(),OperateOption.create());
+                            }else {
+                                this.operationResult.setShowMessage(true);
+                                this.operationResult.setSuccess(false);
+                                this.operationResult.setMessage("下推资产变更单失败");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 86 - 0
src/main/java/fi/fa/opplugin/FaDisCardMidOpPlugin.java

@@ -0,0 +1,86 @@
+package fi.fa.opplugin;
+
+import com.alibaba.druid.util.StringUtils;
+import fi.fa.opplugin.utils.ChangeDataUtils;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.exception.KDBizException;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import java.util.List;
+
+//资产报废单中间表下推业务处理单
+public class FaDisCardMidOpPlugin extends AbstractOperationServicePlugIn {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            if (StringUtils.equals(e.getOperationKey(), "push")) {
+                DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+                String nckd_flag = info.getString("nckd_flag");
+                if ("1".equals(nckd_flag)) {
+                    throw new KDBizException("单据" + info.getString("number") + "已经下推生成了资产调拨单,不允许重复下推!");
+                }else {
+                    String dispatchType = info.getString("nckd_dispatch_type");
+                    String error = ChangeDataUtils.check(info);
+                    if (!StringUtils.isEmpty(error)) {
+                        this.operationResult.setShowMessage(true);
+                        this.operationResult.setSuccess(false);
+                        this.operationResult.setMessage(error);
+                    }else {
+                        List<String> codeList = ChangeDataUtils.getCardNumber(info);
+                        if ("2".equals(dispatchType)) {
+                            DynamicObject busProcess = BusinessDataServiceHelper.newDynamicObject("nckd_ywcld");
+                            busProcess.set("nckd_bizdate", info.getDate("nckd_date_out"));//业务日期
+                            busProcess.set("nckd_detailtype", "D");//业务类型 D:报废
+                            busProcess.set("nckd_costcompany", ChangeDataUtils.getOrg(info.getString("nckd_org_in")));//资产组织
+                            busProcess.set("nckd_textfield1", info.getString("nckd_reason"));//摘要事由
+                            busProcess.set("nckd_applierv", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//制单人
+
+                            //制单信息
+                            busProcess.set("creator", ChangeDataUtils.getUser(info.getString("nckd_user_out")));//创建人
+                            busProcess.set("createtime", info.getDate("nckd_date_out"));//创建时间
+                            busProcess.set("billstatus", "A");//状态
+                            QFilter filter = new QFilter("number", QCP.in,codeList);
+                            filter.and("isbak",  QCP.equals, "0");
+                            DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {filter});
+                            for (int c = 0; c < card.length; c++) {
+                                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
+                                //创建报废明细分录
+                                DynamicObjectCollection entryEntity = busProcess.getDynamicObjectCollection("nckd_entryentity6");
+                                DynamicObject entry1 = entryEntity.addNew();
+                                entry1.set("nckd_basedatafield", cardInfo);//资产编码
+                                String nckd_count = info.getString("nckd_count").isEmpty() ? "1" : info.getString("nckd_count");
+                                Integer count = Integer.valueOf(nckd_count);
+                                entry1.set("nckd_integerfield", count);//报废数量
+                            }
+                            //执行保存-提交-审核
+                            OperationResult saveResult = SaveServiceHelper.saveOperate("nckd_ywcld", new DynamicObject[]{busProcess}, OperateOption.create());
+                            if (saveResult.isSuccess()){
+                                info.set("nckd_flag", "1");
+                                SaveServiceHelper.save(new DynamicObject[]{info});
+                                this.operationResult.setShowMessage(true);
+                                this.operationResult.setSuccess(true);
+                                this.operationResult.setMessage("下推业务处理单成功");
+                                OperationResult submitResult = OperationServiceHelper.executeOperate("submit", "nckd_ywcld",saveResult.getSuccessPkIds().toArray(),OperateOption.create());
+                                OperationResult auditResult = OperationServiceHelper.executeOperate("audit", "nckd_ywcld",submitResult.getSuccessPkIds().toArray(),OperateOption.create());
+                            }else {
+                                this.operationResult.setShowMessage(true);
+                                this.operationResult.setSuccess(false);
+                                this.operationResult.setMessage("下推业务处理单失败");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 34 - 70
src/main/java/fi/fa/opplugin/RealCardBillOpPlugin.java

@@ -9,7 +9,6 @@ import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
-
 import java.util.ArrayList;
 import java.util.List;
 //实物卡片
@@ -18,83 +17,48 @@ public class RealCardBillOpPlugin extends AbstractOperationServicePlugIn {
     public void beginOperationTransaction(BeginOperationTransactionArgs e) {
         DynamicObject[] dynamicObjects = e.getDataEntities();
         for (int i = 0; i < dynamicObjects.length; i++) {
-                if (StringUtils.equals(e.getOperationKey(),"audit")) {
-                    List<Long> ids = new ArrayList<>();
-                    //审批通过后,如果是报销单下推的单据,则回写e卡片清单
-                    DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
-                    String srcbillentityname = info.getString("srcbillentityname");
-                    Long bxId = info.getLong("nckd_bz_id");
-                    String number = info.getString("number");//资产编码
-                    String name = info.getString("assetname");//资产名称
-                    DynamicObject org = info.getDynamicObject("assetunit");//资产组织
-                    String orgName = org.getString("name");
-                    //报销单下推生成的实物卡片审核后回写e管家实物卡片清单
-                    if (bxId != 0) {
-                        //查询报销单
-                        QFilter bxFilter = new QFilter("id", QCP.equals,bxId);
-                        DynamicObject[] bxDynamicObjects = BusinessDataServiceHelper.load("er_publicreimbursebill","id",new QFilter[] {bxFilter});
-                        for (int c=0;c<bxDynamicObjects.length;c++) {
-                            //报销单头数据包
-                            DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[c].getPkValue(), bxDynamicObjects[c].getDynamicObjectType().getName());
-                            //循环资产信息分录
-                            for(DynamicObject object : bxInfo.getDynamicObjectCollection("assetentry")){
-                                //获取e管家实物卡片清单基础资料
-                                DynamicObjectCollection cardList = object.getDynamicObjectCollection("nckd_real_card");
-                                for (DynamicObject card : cardList) {
-                                    Long id = (Long) card.get(2);
-                                    //查询e卡片实物清单
-                                    QFilter filter = new QFilter("id", QCP.equals,id);
-                                    DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
-                                    for (int j = 0; j < cardObjects.length; j++) {
-                                        DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardObjects[j].getPkValue(), cardObjects[j].getDynamicObjectType().getName());
-                                        //回写e卡片实物清单字段
-                                        cardInfo.set("nckd_card_real_org", orgName);
-                                        cardInfo.set("nckd_card_real_code", number);
-                                        cardInfo.set("nckd_card_real_name", name);
-                                        SaveServiceHelper.save(new DynamicObject[]{cardInfo});
-                                    }
-                                }
-                            }
-                        }
-                    } else if ("fa_assetsplitbill".equals(srcbillentityname)) {
-                        Long cfId = info.getLong("srcbillid");
-                        //查询资产拆分单
-                        QFilter cfFilter = new QFilter("id", QCP.equals,cfId);
-                        DynamicObject[] dispatchObjects = BusinessDataServiceHelper.load("fa_assetsplitbill","id",new QFilter[] {cfFilter});
-                        DynamicObject dispatchInfo = BusinessDataServiceHelper.loadSingle(dispatchObjects[0].getPkValue(), dispatchObjects[0].getDynamicObjectType().getName());
-                        //获取拆分后分录
-                        DynamicObjectCollection collection = dispatchInfo.getDynamicObjectCollection("assetsplitentry").get(0).getDynamicObjectCollection("subassetsplitentry");
-                        //从拆分分录第二行开始回写
-                        //获取拆分后卡片分录e管家实物卡片
-                        DynamicObject card_list = collection.get(i+1).getDynamicObject("nckd_real_card_list");
-                        if (card_list != null) {
-                            Long id = card_list.getLong("id");
-                            //查询实物卡片清单
-                            QFilter filter = new QFilter("id", QCP.equals,id);
-                            DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
-                            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardObjects[0].getPkValue(), cardObjects[0].getDynamicObjectType().getName());
-                            //回写实物卡片字段到e管家实物卡片清单
+            if (StringUtils.equals(e.getOperationKey(),"audit")) {
+                List<Long> ids = new ArrayList<>();
+                //审批通过后,如果是报销单下推的单据,则回写e卡片清单
+                DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+                String srcbillentityname = info.getString("srcbillentityname");
+                Long bxId = info.getLong("nckd_bz_id");
+                String number = info.getString("number");//资产编码
+                String name = info.getString("assetname");//资产名称
+                DynamicObject org = info.getDynamicObject("assetunit");//资产组织
+                String orgName = org.getString("name");
+                if (!"fa_assetsplitbill".equals(srcbillentityname)) {
+                    DynamicObjectCollection nckd_real_card = info.getDynamicObjectCollection("nckd_real_card");
+                    if( nckd_real_card != null) {
+                        for (DynamicObject object : nckd_real_card) {
+                            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(object.get(2), "nckd_fa_card_real_list");
                             //回写e卡片实物清单字段
+                            cardInfo.set("nckd_flag", "1");
                             cardInfo.set("nckd_card_real_org", orgName);
                             cardInfo.set("nckd_card_real_code", number);
                             cardInfo.set("nckd_card_real_name", name);
                             SaveServiceHelper.save(new DynamicObject[]{cardInfo});
                         }
                     }
-                }else if(StringUtils.equals(e.getOperationKey(),"unaudit")) {
-                //反审核,e管家实物卡片清单三个字段置为空
+                }
+            }else if(StringUtils.equals(e.getOperationKey(),"unaudit")) {
                 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
-                String number = info.getString("number");//资产编码
-                //查询e管家实物清单
-                QFilter filter = new QFilter("nckd_card_real_code", QCP.equals,number);
-                DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
-                for (int j = 0; j < cardObjects.length; j++) {
-                    DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardObjects[j].getPkValue(), cardObjects[j].getDynamicObjectType().getName());
-                    //回写e卡片实物清单字段
-                    cardInfo.set("nckd_card_real_org", null);
-                    cardInfo.set("nckd_card_real_code", null);
-                    cardInfo.set("nckd_card_real_name", null);
-                    SaveServiceHelper.save(new DynamicObject[]{cardInfo});
+                String srcbillentityname = info.getString("srcbillentityname");
+                if (!"fa_assetsplitbill".equals(srcbillentityname)) {
+                    //反审核,e管家实物卡片清单三个字段置为空
+                    String number = info.getString("number");//资产编码
+                    //查询e管家实物清单
+                    QFilter filter = new QFilter("nckd_card_real_code", QCP.equals,number);
+                    DynamicObject[] cardObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
+                    for (int j = 0; j < cardObjects.length; j++) {
+                        DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardObjects[j].getPkValue(), cardObjects[j].getDynamicObjectType().getName());
+                        //回写e卡片实物清单字段
+                        cardInfo.set("nckd_flag", "0");
+                        cardInfo.set("nckd_card_real_org", null);
+                        cardInfo.set("nckd_card_real_code", null);
+                        cardInfo.set("nckd_card_real_name", null);
+                        SaveServiceHelper.save(new DynamicObject[]{cardInfo});
+                    }
                 }
             }
         }

+ 28 - 0
src/main/java/fi/fa/opplugin/RealCardF7OpPlugin.java

@@ -0,0 +1,28 @@
+package fi.fa.opplugin;
+
+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.plugin.AbstractFormPlugin;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+
+//实物卡片关联e管家实物卡片清单插件
+public class RealCardF7OpPlugin extends AbstractFormPlugin {
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        if (StringUtils.equals("nckd_real_card", fieldKey)) {
+            ChangeData changeData = e.getChangeSet()[0];
+            DynamicObjectCollection dynamicObjectCollection = (DynamicObjectCollection) changeData.getNewValue();
+            this.getModel().deleteEntryData("nckd_realcard_list");
+            for (DynamicObject object : dynamicObjectCollection) {
+                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(object.get(2), "nckd_fa_card_real_list");
+                int rowIndex = this.getModel().createNewEntryRow("nckd_realcard_list");
+                this.getModel().setValue("nckd_card_code21", cardInfo, rowIndex);
+            }
+            this.getView().updateView("nckd_realcard_list");
+        }
+    }
+}

+ 206 - 0
src/main/java/fi/fa/opplugin/utils/ChangeDataUtils.java

@@ -0,0 +1,206 @@
+package fi.fa.opplugin.utils;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ChangeDataUtils {
+    /**
+     * @description 查询财务卡片
+     * @param realCardId
+     */
+    public static DynamicObject queryFinCard(Long realCardId) {
+        QFilter cardFilter = new QFilter("realcardmasterid", QCP.equals,realCardId);
+        DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_fin","id",new QFilter[] {cardFilter});
+        for (int c = 0; c < card.length; c++) {
+            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
+            return cardInfo;
+        }
+        return null;
+    }
+
+    /**
+     * @description 查询折旧用途
+     * @param id
+     */
+    public static DynamicObject queryDepreuse(Long id) {
+        QFilter orgQFilter= new QFilter("id", QCP.equals,id);
+        DynamicObject[] depreuse = BusinessDataServiceHelper.load("fa_depreuse","id",new QFilter[] {orgQFilter});
+        for (int c = 0; c < depreuse.length; c++) {
+            DynamicObject depreuseInfo = BusinessDataServiceHelper.loadSingle(depreuse[c].getPkValue(), depreuse[c].getDynamicObjectType().getName());
+            return depreuseInfo;
+        }
+        return null;
+    }
+
+    /**
+     * @description 查询变更类型
+     * @param id
+     */
+    public static DynamicObject queryChangeType(Long id) {
+        QFilter orgQFilter= new QFilter("id", QCP.equals,id);
+        DynamicObject[] changeType = BusinessDataServiceHelper.load("fa_change_type","id",new QFilter[] {orgQFilter});
+        for (int c = 0; c < changeType.length; c++) {
+            DynamicObject changeInfo = BusinessDataServiceHelper.loadSingle(changeType[c].getPkValue(), changeType[c].getDynamicObjectType().getName());
+            return changeInfo;
+        }
+        return null;
+    }
+
+    /**
+     * @description 查询组织
+     * @param orgId
+     */
+    public static DynamicObject queryOrg(Long orgId) {
+        QFilter orgQFilter= new QFilter("id", QCP.equals,orgId);
+        DynamicObject[] org = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {orgQFilter});
+        for (int c = 0; c < org.length; c++) {
+            DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(org[c].getPkValue(), org[c].getDynamicObjectType().getName());
+            return orgInfo;
+        }
+        return null;
+    }
+
+    /**
+     * @description 查询组织对照表获取组织id
+     * @param eOrgId
+     * @return Long
+     */
+    public static Long getOrg(String eOrgId) {
+        QFilter orgFilter = new QFilter("nckd_e_org", QCP.equals,eOrgId);
+        DynamicObject[] orgControl = BusinessDataServiceHelper.load("nckd_base_org_ext","id",new QFilter[] {orgFilter});
+        if (orgControl.length > 0) {
+            DynamicObject orgControlInfo = BusinessDataServiceHelper.loadSingle(orgControl[0].getPkValue(), orgControl[0].getDynamicObjectType().getName());
+            String number = orgControlInfo.getString("nckd_org_number");
+            QFilter filter = new QFilter("number", QCP.equals,number);
+            DynamicObject[] org = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {filter});
+            if (org.length > 0) {
+                DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(org[0].getPkValue(), org[0].getDynamicObjectType().getName());
+                return orgInfo.getLong("id");
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @description 查询用户表获取用户
+     * @param eUser
+     * @return Long
+     */
+    public static DynamicObject getUser(String eUser) {
+        QFilter filter = new QFilter("number", QCP.in, eUser);
+        DynamicObject[] user = BusinessDataServiceHelper.load("bos_user","id",new QFilter[] {filter});
+        if (user.length > 0) {
+            DynamicObject userInfo = BusinessDataServiceHelper.loadSingle(user[0].getPkValue(), user[0].getDynamicObjectType().getName());
+            return userInfo;
+        }
+        return null;
+    }
+
+    /**
+     * @description e管家推送数据校验
+     * @param info
+     * @return String
+     */
+    public static String check(DynamicObject info) {
+        String billno = info.getString("number");//源单编号
+        String dispatchType = info.getString("nckd_dispatch_type");//调拨类型
+        String nckd_card_real_code = info.getString("nckd_card_number");
+        String[] asset = nckd_card_real_code.split(",");
+        if (nckd_card_real_code.isEmpty()) {
+            return "单据" + billno + "未绑定资产信息,生成调拨单失败";
+        }
+        // 使用 Stream 判断 : 后的数据是否相同
+        boolean isSame = Arrays.stream(asset)
+                .map(item -> item.split(":")[1]) // 提取组织部分
+                .distinct()                       // 去重
+                .count() <= 1;                   // 如果去重后的数量小于等于 1,则表示相同
+        // 使用 Stream 获取所有的 ID(前面的数据)
+        List<String> numberList = Arrays.stream(asset)
+                .map(item -> item.split(":")[0])  // 分割并提取 ID
+                .collect(Collectors.toList());      // 收集到列表中
+
+        //组织相同则处理
+        if (isSame) {
+            String e_orgId = Arrays.stream(asset).map(item -> item.split(":")[1]).collect(Collectors.toList()).get(0);
+            //查询e管家实物卡片清单
+            QFilter filter = new QFilter("number", QCP.in,numberList);
+            DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
+            if (dynamicObjects.length == 0 || dynamicObjects.length != numberList.size()) {
+                return "单据"+billno+"绑定的资产有未同步至星瀚的数据,生成调拨单失败";
+            }else {
+                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(dynamicObjects[0].getPkValue(), dynamicObjects[0].getDynamicObjectType().getName());
+                //获取星瀚资产编码,查询关联的e管家实物卡片清单数量
+                String code  = cardInfo.getString("nckd_card_real_code");
+                if (StringUtils.isEmpty(code)) {
+                    //星瀚未生成实物卡片,更新实物卡片清单数据-查询组织对照表
+                    Long orgId = getOrg(e_orgId);
+                    if (ObjectUtils.isNotEmpty(orgId) && ("0".equals(dispatchType))) {
+                        //更新归属机构,归属部门,使用人
+                        for (int a = 0; a < dynamicObjects.length ; a++) {
+                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
+                            ecardInfoList.set("nckd_orgfield", orgId);
+                            ecardInfoList.set("nckd_dept", getOrg(info.getString("nckd_dept_in")));
+                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
+                        }
+                    }else if (ObjectUtils.isNotEmpty(orgId) && "1".equals(dispatchType)) {
+                        //更新是否报废为是
+                        for (int a = 0; a < dynamicObjects.length ; a++) {
+                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
+                            ecardInfoList.set("nckd_dept", getOrg(info.getString("nckd_dept_in")));
+                            ecardInfoList.set("nckd_use_name", info.getString("user"));
+                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
+                        }
+                    }
+                    else if (ObjectUtils.isNotEmpty(orgId) && "2".equals(dispatchType)) {
+                        //更新是否报废为是
+                        for (int a = 0; a < dynamicObjects.length ; a++) {
+                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
+                            ecardInfoList.set("nckd_discard",1);
+                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
+                        }
+                    } else {
+                        return "资产信息的组织在组织对照表中未查询到数据,生成调拨单失败";
+                    }
+                    return "星瀚系统未生成实物卡片,已更新e管家实物卡片清单";
+                }else {
+                    //查询e管家实物卡片清单
+                    QFilter qfilter = new QFilter("nckd_card_real_code", QCP.equals,code);
+                    DynamicObject[] cardObject = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {qfilter});
+                    //e管家推送的清单和星瀚系统保存的清单数量不一致,返回错误信息并且不能生成调拨单
+                    if (cardObject.length > 0 && asset.length != cardObject.length) {
+                        return "单据"+billno+"绑定的资产信息与星瀚实物卡片数量不一致,生成调拨单失败";
+                    }
+                }
+            }
+        }else {
+            //资产信息组织不同
+            return "单据"+billno+"绑定的资产信息组织不相同,生成调拨单失败";
+        }
+        return null;
+    }
+
+    public static List<String> getCardNumber(DynamicObject info) {
+        String nckd_card_real_code = info.getString("nckd_card_number");
+        String[] asset = nckd_card_real_code.split(",");
+        List<String> codeList = new ArrayList<>();
+        List<String> numberList = Arrays.stream(asset).map(item -> item.split(":")[0]).collect(Collectors.toList());
+        QFilter listFilter = new QFilter("number", QCP.in,numberList);
+        DynamicObject[] cardList = BusinessDataServiceHelper.load("nckd_fa_card_real_list","nckd_card_real_code",new QFilter[] {listFilter});
+        for (int i = 0; i < cardList.length; i++) {
+            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(cardList[i].getPkValue(), cardList[i].getDynamicObjectType().getName());
+            String code = cardInfo.getString("nckd_card_real_code");
+            codeList.add(code);
+        }
+        return codeList;
+    }
+}

+ 59 - 552
src/main/java/fi/fa/webService/DispatchMidController.java

@@ -1,12 +1,8 @@
 package fi.fa.webService;
 
-
-import com.alibaba.druid.util.StringUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import kd.bos.dataentity.entity.DynamicObject;
-import kd.bos.dataentity.entity.DynamicObjectCollection;
-import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.openapi.common.custom.annotation.ApiController;
 import kd.bos.openapi.common.custom.annotation.ApiMapping;
 import kd.bos.openapi.common.custom.annotation.ApiParam;
@@ -15,14 +11,8 @@ import kd.bos.openapi.common.result.CustomApiResult;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
-import kd.bos.servicehelper.operation.OperationServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
-import kd.bos.dataentity.OperateOption;
-import org.apache.commons.lang3.ObjectUtils;
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
 
 /**
  * 接收e管家资产调拨单接口
@@ -43,27 +33,14 @@ public class DispatchMidController implements Serializable {
         for (int i = 0; i < data.size(); i++) {
             try{
                 JSONObject eobject = data.getJSONObject(i);
-                //用来储存转换好的用户和组织id
-                HashMap<String , Long> map = new HashMap<>();
                 //第一步:保存进中间表
                 SaveMidDispatch(eobject);
-                //组织,人员信息转换
-                String errorChange = Control(eobject, map);
-                //第二步:校验传入信息是否可以下推调拨单
-                String errorCode = Check(eobject, map);
-                //第三步:下推生成调拨单
-                if (StringUtils.isEmpty(errorCode) && StringUtils.isEmpty(errorChange)) {
-                    //下推生成单
-                    Push(eobject, map);
-                }
-                // 错误拼接
-                appendErrorMessages(resultString, errorChange, errorCode);
             } catch (Exception e){
                 resultString.append("保存过程中发生异常:").append(e.getMessage()).append("\n");
             }
         }
         return resultString.length() == 0
-                ? CustomApiResult.success("推送调拨单成功!")
+                ? CustomApiResult.success("推送中间表成功成功!")
                 : CustomApiResult.fail("404", resultString.toString());
     }
 
@@ -72,29 +49,61 @@ public class DispatchMidController implements Serializable {
      * @param jsonObject
      */
     private void SaveMidDispatch(JSONObject jsonObject) {
-        DynamicObject midDispatch;
-        //查询中间表,如果有则修改,没有则新增
-        QFilter filter = new QFilter("number", QCP.equals, jsonObject.getString("billno"));
-        DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_dispatch_mid","id",new QFilter[] {filter});
-        if (mid.length > 0) {
-            midDispatch = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
-        }else {
-            midDispatch = BusinessDataServiceHelper.newDynamicObject("nckd_e_dispatch_mid");
-        }
+        String dispatchType = jsonObject.getString("dispatchType");
+        DynamicObject minInfo = null;
+        if ("0".equals(dispatchType)) {
+            //查询调出中间表,如果有则修改,没有则新增
+            QFilter filter = new QFilter("number", QCP.equals, jsonObject.getString("billno"));
+            DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_dispatch_mid","id",new QFilter[] {filter});
+            if (mid.length > 0) {
+                minInfo = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
+            }else {
+                minInfo = BusinessDataServiceHelper.newDynamicObject("nckd_e_dispatch_mid");
+            }
+
+            minInfo.set("nckd_changemode", "调出");//减少方式默认调出
+            minInfo.set("nckd_user_out", jsonObject.getString("sendUser"));//调出类型对应人员
+            minInfo.set("nckd_user_in", jsonObject.getString("recieveUser"));//调入负责人
+            minInfo.set("nckd_org_out", jsonObject.getString("outOrgId"));//调出组织
+            minInfo.set("nckd_org_in", jsonObject.getString("orgId"));//调入组织
+            minInfo.set("nckd_used_user", jsonObject.getString("user"));//调入使用人
+            minInfo.set("nckd_direction", jsonObject.getString("direction"));//调入调出类型
+            minInfo.set("nckd_storeplace", jsonObject.getString("storeplace"));//调入存放地点
+        } else if ("1".equals(dispatchType)) {
+            //查询变更中间表,如果有则修改,没有则新增
+            QFilter filter = new QFilter("number", QCP.equals, jsonObject.getString("billno"));
+            DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_change_mid","id",new QFilter[] {filter});
+            if (mid.length > 0) {
+                minInfo = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
+            }else {
+                minInfo = BusinessDataServiceHelper.newDynamicObject("nckd_e_change_mid");
+            }
+            minInfo.set("nckd_user_out", jsonObject.getString("sendUser"));//调出类型对应人员
+            minInfo.set("nckd_user_in", jsonObject.getString("recieveUser"));//调入负责人
+            minInfo.set("nckd_org_in", jsonObject.getString("orgId"));//归属机构
+            minInfo.set("nckd_used_user", jsonObject.getString("user"));//调入使用人
+            minInfo.set("nckd_direction", jsonObject.getString("direction"));//调入调出类型
+            minInfo.set("nckd_storeplace", jsonObject.getString("storeplace"));//调入存放地点
+        } else if ("2".equals(dispatchType)) {
+            //查询报废单中间表,如果有则修改,没有则新增
+            QFilter filter = new QFilter("number", QCP.equals, jsonObject.getString("billno"));
+            DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_discard_mid","id",new QFilter[] {filter});
+            if (mid.length > 0) {
+                minInfo = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
+            }else {
+                minInfo = BusinessDataServiceHelper.newDynamicObject("nckd_e_discard_mid");
+            }
+            minInfo.set("nckd_org_in", jsonObject.getString("orgId"));//归属机构
+            minInfo.set("nckd_user_out", jsonObject.getString("sendUser"));//报废申请人
 
-        midDispatch.set("number", jsonObject.getString("billno"));//来源单据号
-        midDispatch.set("nckd_user_out", jsonObject.getString("sendUser"));//调出类型对应人员
-        midDispatch.set("nckd_user_in", jsonObject.getString("recieveUser"));//调入负责人
-        midDispatch.set("nckd_date_out", jsonObject.getDate("sendDate"));//调出日期
-        midDispatch.set("nckd_org_out", jsonObject.getString("outOrgId"));//调出组织
-        midDispatch.set("nckd_org_in", jsonObject.getString("orgId"));//调入组织
-        midDispatch.set("nckd_reason", jsonObject.getString("reason"));//调拨原因
-        midDispatch.set("nckd_changemode", "调出");//减少方式默认调出
-        midDispatch.set("nckd_dispatch_type", jsonObject.getString("dispatchType"));//调拨类型 枚举 组织间,组织内
-        midDispatch.set("nckd_dept_in", jsonObject.getString("inDeptId"));//调入部门
-        midDispatch.set("nckd_used_user", jsonObject.getString("user"));//调入使用人
-        midDispatch.set("nckd_storeplace", jsonObject.getString("storeplace"));//调入存放地点
-        midDispatch.set("nckd_direction", jsonObject.getString("direction"));//调入存放地点
+        }
+        minInfo.set("number", jsonObject.getString("billno"));//来源单据号
+        minInfo.set("nckd_date_out", jsonObject.getDate("sendDate"));//调出日期
+        minInfo.set("nckd_reason", jsonObject.getString("reason"));//调拨原因
+        minInfo.set("nckd_dispatch_type", jsonObject.getString("dispatchType"));//调拨类型 枚举 组织间,组织内
+        minInfo.set("nckd_dept_in", jsonObject.getString("inDeptId"));//调入部门
+        minInfo.set("createtime", jsonObject.getDate("sendDate"));//创建时间
+        minInfo.set("status", "A");//暂存
         //拼接资产信息的组织和编码
         String cardNumber = "";
         JSONArray assetArray = jsonObject.getJSONArray("asset");
@@ -103,514 +112,12 @@ public class DispatchMidController implements Serializable {
             JSONObject asset = assetArray.getJSONObject(j);
             String number = asset.getString("number");
             String orgId = asset.getString("orgId");
-            cardNumber = number+ ":" + orgId + ",";
+            cardNumber = cardNumber + number+ ":" + orgId + ",";
             if ("2".equals(jsonObject.getString("dispatchType"))) {
-                midDispatch.set("nckd_count", asset.getString("count"));//资产数量
-            }
-        }
-        midDispatch.set("nckd_card_number_tag", cardNumber);
-        SaveServiceHelper.save(new DynamicObject[]{midDispatch});
-    }
-
-    /**
-     * @description e管家推送数据校验
-     * @param jsonObject,map
-     * @return String
-     */
-    private  String Check(JSONObject jsonObject, HashMap<String , Long> map) {
-        String billno = jsonObject.getString("billno");//源单编号
-        String user = jsonObject.getString("user");//使用人
-        String dispatchType = jsonObject.getString("dispatchType");//调拨类型
-        List<String> numberList = new ArrayList<>();
-        // 校验该单据是否已经下推生成调拨单
-        if (isAlreadyDispatched(billno)) {
-            return "单据" + billno + "已经生成调拨单,请勿重复推送!";
-        }
-        // 获取资产编号数组
-        JSONArray assetArray = jsonObject.getJSONArray("asset");
-        if (assetArray.isEmpty()) {
-            return "单据" + billno + "未绑定资产信息,生成调拨单失败";
-        }
-        Boolean isSame = true;
-        //校验资产信息的组织是否相同,不相同则不进行处理
-        for (int j = 0; j < assetArray.size(); j++) {
-            //判断资产的组织是否相同
-            JSONObject asset = assetArray.getJSONObject(j);
-            if (!asset.getString("orgId").equals(assetArray.getJSONObject(0).getString("orgId"))) {
-                isSame = false;
-            }
-            numberList.add(asset.getString("number"));
-        }
-        //组织相同则处理
-        if (isSame) {
-            String  e_orgId = assetArray.getJSONObject(0).getString("orgId");
-            //查询e管家实物卡片清单
-            QFilter filter = new QFilter("number", QCP.in,numberList);
-            DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {filter});
-            if (dynamicObjects.length == 0 || dynamicObjects.length != numberList.size()) {
-                return "单据"+billno+"绑定的资产有未同步至星瀚的数据,生成调拨单失败";
-            }else {
-                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(dynamicObjects[0].getPkValue(), dynamicObjects[0].getDynamicObjectType().getName());
-                //获取星瀚资产编码,查询关联的e管家实物卡片清单数量
-                String code  = cardInfo.getString("nckd_card_real_code");
-                if (StringUtils.isEmpty(code)) {
-                    //星瀚未生成实物卡片,更新实物卡片清单数据-查询组织对照表
-                    Long orgId = getOrg(e_orgId);
-                    if (ObjectUtils.isNotEmpty(orgId) && ("0".equals(dispatchType))) {
-                        //更新归属机构,归属部门,使用人
-                        for (int a = 0; a < dynamicObjects.length ; a++) {
-                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
-                            ecardInfoList.set("nckd_orgfield",orgId);
-                            ecardInfoList.set("nckd_dept",map.get("inDeptId"));
-                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
-                        }
-                    }else if (ObjectUtils.isNotEmpty(orgId) && "1".equals(dispatchType)) {
-                        //更新是否报废为是
-                        for (int a = 0; a < dynamicObjects.length ; a++) {
-                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
-                            ecardInfoList.set("nckd_dept",map.get("inDeptId"));
-                            ecardInfoList.set("nckd_use_name",user);
-                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
-                        }
-                    }
-                    else if (ObjectUtils.isNotEmpty(orgId) && "2".equals(dispatchType)) {
-                        //更新是否报废为是
-                        for (int a = 0; a < dynamicObjects.length ; a++) {
-                            DynamicObject ecardInfoList = BusinessDataServiceHelper.loadSingle(dynamicObjects[a].getPkValue(), dynamicObjects[a].getDynamicObjectType().getName());
-                            ecardInfoList.set("nckd_discard",1);
-                            SaveServiceHelper.save(new DynamicObject[]{ecardInfoList});
-                        }
-                    } else {
-                        return "资产信息的组织在组织对照表中未查询到数据,生成调拨单失败";
-                    }
-                    return "星瀚系统未生成实物卡片,已更新e管家实物卡片清单";
-                }else {
-                    //查询e管家实物卡片清单
-                    QFilter qfilter = new QFilter("nckd_card_real_code", QCP.equals,code);
-                    DynamicObject[] cardObject = BusinessDataServiceHelper.load("nckd_fa_card_real_list","id",new QFilter[] {qfilter});
-                    //e管家推送的清单和星瀚系统保存的清单数量不一致,返回错误信息并且不能生成调拨单
-                    if (cardObject.length > 0 && assetArray.size() != cardObject.length) {
-                        return "单据"+billno+"绑定的资产信息与星瀚实物卡片数量不一致,生成调拨单失败";
-                    }
-                    jsonObject.put("nckd_card_real_code", code);
-                }
-            }
-        }else {
-            //资产信息组织不同
-            return "单据"+billno+"绑定的资产信息组织不相同,生成调拨单失败";
-        }
-        return null;
-    }
-
-    /**
-     * @description 下推生成资产调拨单
-     * @param jsonObject,map
-     */
-    private void Push(JSONObject jsonObject, HashMap<String , Long> map) {
-        String dispatchType = jsonObject.getString("dispatchType");
-        String direction = jsonObject.getString("direction");
-        //组织间,生成资产调出单
-        if ("0".equals(dispatchType)) {
-            DynamicObject dispatch = BusinessDataServiceHelper.newDynamicObject("fa_dispatch");
-            String nckd_card_real_code = jsonObject.getString("nckd_card_real_code");
-//            nckd_card_real_code = "A00100101900240600008";
-            //单据头
-            dispatch.set("dispatchdate", jsonObject.getDate("sendDate"));//调出日期
-            dispatch.set("assetunit", map.get("outOrgId"));//调出组织
-            dispatch.set("inassetunit", map.get("orgId"));//调入组织
-            dispatch.set("org", map.get("outOrgId"));//调出核算组织
-            dispatch.set("inorg", map.get("orgId"));//调入核算组织
-            dispatch.set("reason", jsonObject.getString("reason"));//调出原因
-            dispatch.set("dispatchtype", "A");//调拨类型 A="平价调拨",B="非平价调拨"
-            dispatch.set("changemode", 14);//减少方式默认"调出"
-            dispatch.set("currency", 1);//币种
-            dispatch.set("currencyrate", 1);//结算汇率
-            //制单信息
-            dispatch.set("createtime", jsonObject.getDate("sendDate"));//创建时间
-            dispatch.set("modifytime", jsonObject.getDate("sendDate"));//修改时间
-            dispatch.set("auditdate", jsonObject.getDate("sendDate"));//审核时间
-            dispatch.set("billstatus", "A");//暂存
-            //调出方向
-            if("0".equals(direction)){
-                dispatch.set("outuser", map.get("sendUser"));//调出申请人
-                dispatch.set("inuser", map.get("recieveUser"));//调入负责人
-                dispatch.set("creator", map.get("sendUser"));//创建人
-                dispatch.set("modifier", map.get("sendUser"));//修改人
-                dispatch.set("auditor", map.get("sendUser"));//审核人
-                dispatch.set("appliant", map.get("sendUser"));//调拨申请人
-            }//调入方向
-            else if ("1".equals(direction)) {
-                dispatch.set("outuser", map.get("recieveUser"));//调出申请人
-                dispatch.set("inuser", map.get("sendUser"));//调入负责人
-                dispatch.set("creator", map.get("recieveUser"));//创建人
-                dispatch.set("modifier", map.get("recieveUser"));//修改人
-                dispatch.set("auditor", map.get("recieveUser"));//审核人
-                dispatch.set("appliant", map.get("recieveUser"));//调拨申请人
-            }
-            //单据体
-            //根据资产编号查询实物卡片
-            QFilter cardFilter = new QFilter("number", QCP.equals,nckd_card_real_code);
-            cardFilter.and("isbak",  QCP.equals, "0");
-            DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {cardFilter});
-            for (int c = 0; c < card.length; c++) {
-                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
-                //创建调出单分录
-                DynamicObjectCollection entryEntity = dispatch.getDynamicObjectCollection("dispatchentry");
-                DynamicObject entry1 = entryEntity.addNew();
-                entry1.set("realcard", cardInfo);//资产编码
-                entry1.set("measurement", cardInfo.getDynamicObject("unit").getLong("id"));//计量单位
-                entry1.set("dispatchqty", cardInfo.getInt("assetamount"));//数量
-                entry1.set("inusedept", map.get("inDeptId"));//调入使用部门
-            }
-            //执行保存-提交-审核
-            OperationResult saveResult = SaveServiceHelper.saveOperate("fa_dispatch", new DynamicObject[]{dispatch}, OperateOption.create());
-            if (saveResult.isSuccess()){
-                //生单后反写中间表,防止反复生单
-                OncePush(jsonObject.getString("billno"));
-                OperationResult submitResult = OperationServiceHelper.executeOperate("submit", "fa_dispatch",saveResult.getSuccessPkIds().toArray(),OperateOption.create());
-                OperationResult auditResult = OperationServiceHelper.executeOperate("audit", "fa_dispatch",submitResult.getSuccessPkIds().toArray(),OperateOption.create());
-            }
-
-
-        }//组织内,生成资产变更单
-        else if ("1".equals(dispatchType)) {
-            DynamicObject changeDept = BusinessDataServiceHelper.newDynamicObject("fa_change_dept");
-            String nckd_card_real_code = jsonObject.getString("nckd_card_real_code");
-//            nckd_card_real_code = "A00100101900240600007";
-            DynamicObject orgInfo = queryOrg(map.get("orgId"));
-            //单据头
-            changeDept.set("org", orgInfo);//核算组织
-            changeDept.set("changedate", jsonObject.getDate("sendDate"));//记账日期
-            changeDept.set("remark", jsonObject.getString("reason"));//调出原因
-            changeDept.set("sourcetype", 2);//来源方式(5:API生成)
-            changeDept.set("changetype", queryChangeType(Long.parseLong("733953285719123968")));//变更类型,默认部门变更
-            changeDept.set("chtypedetail", "1");//变更类型明细默认实物变更1
-            changeDept.set("voucherflag", "A");//记账标识默认无需记账A
-            //制单信息
-            changeDept.set("createtime", jsonObject.getDate("sendDate"));//创建时间
-            changeDept.set("modifytime", jsonObject.getDate("sendDate"));//修改时间
-            changeDept.set("auditdate", jsonObject.getDate("sendDate"));//审核时间
-            changeDept.set("billstatus", "A");//默认审核
-            //调出方向
-            if("0".equals(direction)){
-                changeDept.set("creator", getUser(jsonObject.getString("sendUser")));//创建人
-                changeDept.set("modifier", getUser(jsonObject.getString("sendUser")));//修改人
-                changeDept.set("auditor", getUser(jsonObject.getString("sendUser")));//审核人
-                changeDept.set("appliantid", getUser(jsonObject.getString("sendUser")));//变更申请人
-            }//调入方向
-            else if ("1".equals(direction)) {
-                changeDept.set("creator", getUser(jsonObject.getString("recieveUser")));//创建人
-                changeDept.set("modifier", getUser(jsonObject.getString("recieveUser")));//修改人
-                changeDept.set("auditor", getUser(jsonObject.getString("recieveUser")));//审核人
-                changeDept.set("appliantid", getUser(jsonObject.getString("recieveUser")));//变更申请人
-            }
-            //单据体
-            //根据资产编号查询实物卡片
-            QFilter cardFilter = new QFilter("number", QCP.equals,nckd_card_real_code);
-            cardFilter.and("isbak",  QCP.equals, "0");
-            DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {cardFilter});
-            for (int c = 0; c < card.length; c++) {
-                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
-                //查询财务卡片
-                DynamicObject fin = queryFinCard(cardInfo.getLong("id"));//财务卡片id
-                //创建变更字段分录
-                DynamicObjectCollection fieldentry = changeDept.getDynamicObjectCollection("fieldentry");
-                if (!map.get("inDeptId").equals(cardInfo.getDynamicObject("headusedept").getLong("id"))){
-                    DynamicObject entry1 = fieldentry.addNew();
-                    entry1.set("realcard1", cardInfo);//资产编码
-                    entry1.set("depreuse1", queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
-                    entry1.set("currency1", 1);//币别
-                    entry1.set("basecurrency1", 1);//本币位
-                    entry1.set("assetnumber",cardInfo.getString("number"));//资产编码
-                    entry1.set("bizdate1", jsonObject.getDate("sendDate"));//业务日期
-                    entry1.set("field", "fa_card_real.headusedept");//变更字段-部门
-                    entry1.set("beforevalue", String.valueOf(cardInfo.getDynamicObject("headusedept").getLong("id")));//变更前值
-                    entry1.set("aftervalue", map.get("inDeptId").toString());//变更后值
-                    entry1.set("realcardmasterid", cardInfo);//实物卡片id
-                    entry1.set("fincard1", fin);//财务卡片
-                }
-                if (ObjectUtils.isEmpty(cardInfo.getDynamicObject("headuseperson")) ||
-                    ObjectUtils.isNotEmpty(cardInfo.getDynamicObject("headuseperson")) && !map.get("user").equals(cardInfo.getDynamicObject("headuseperson").getLong("id"))) {
-                    String beforevalue = cardInfo.getDynamicObject("headuseperson") == null ? "" : String.valueOf(cardInfo.getDynamicObject("headuseperson").getLong("id"));
-                    DynamicObject entry2 = fieldentry.addNew();
-                    entry2.set("realcard1", cardInfo);//资产编码
-                    entry2.set("depreuse1", queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
-                    entry2.set("currency1", 1);//币别
-                    entry2.set("basecurrency1", 1);//本币位
-                    entry2.set("assetnumber",cardInfo.getString("number"));//资产编码
-                    entry2.set("bizdate1", jsonObject.getDate("sendDate"));//业务日期
-                    entry2.set("field", "fa_card_real.headuseperson");//变更字段-使用人
-                    entry2.set("beforevalue", beforevalue);//变更前值
-                    entry2.set("aftervalue", map.get("user").toString());//变更后值
-                    entry2.set("realcardmasterid", cardInfo);//实物卡片id
-                    entry2.set("fincard1", fin);//财务卡片
-                }
-
-                //创建实物变更分录
-                DynamicObjectCollection realentry = changeDept.getDynamicObjectCollection("realentry");
-                DynamicObject realentry1 = realentry.addNew();
-                realentry1.set("realcard", cardInfo.getLong("id"));//资产编码
-
-                //创建财务变更分录
-                DynamicObjectCollection finentry = realentry1.getDynamicObjectCollection("finentry");
-                DynamicObject finentry1 = finentry.addNew();
-                finentry1.set("depreuse", queryDepreuse(Long.parseLong("418714318096331776")));//折旧用途默认
-                finentry1.set("fincard", fin);
-                finentry1.set("bizdate", jsonObject.getDate("sendDate"));
-
-            }
-            //执行保存-提交-审核
-            OperationResult saveResult = SaveServiceHelper.saveOperate("fa_change_dept", new DynamicObject[]{changeDept}, OperateOption.create());
-            if (saveResult.isSuccess()) {
-                //生单后反写中间表,防止反复生单
-                OncePush(jsonObject.getString("billno"));
-                OperationResult submitResult = OperationServiceHelper.executeOperate("submit", "fa_change_dept",saveResult.getSuccessPkIds().toArray(),OperateOption.create());
-                OperationResult auditResult = OperationServiceHelper.executeOperate("audit", "fa_change_dept",submitResult.getSuccessPkIds().toArray(),OperateOption.create());
-            }
-        } //生成业务处理单
-        else if ("2".equals(dispatchType)) {
-            DynamicObject busProcess = BusinessDataServiceHelper.newDynamicObject("nckd_ywcld");
-            String nckd_card_real_code = jsonObject.getString("nckd_card_real_code");
-//            nckd_card_real_code = "A00100101900240700007";
-            DynamicObject orgInfo = queryOrg(map.get("orgId"));
-            busProcess.set("nckd_bizdate", jsonObject.getDate("sendDate"));//业务日期
-            busProcess.set("nckd_detailtype", "D");//业务类型 D:报废
-            busProcess.set("nckd_costcompany", map.get("orgId"));//资产组织
-            busProcess.set("nckd_textfield1", jsonObject.getString("reason"));//摘要事由
-            busProcess.set("nckd_applierv", getUser(jsonObject.getString("sendUser")));//制单人
-
-            //制单信息
-            busProcess.set("creator", getUser(jsonObject.getString("sendUser")));//创建人
-            busProcess.set("createtime", jsonObject.getDate("sendDate"));//创建时间
-            busProcess.set("modifier", getUser(jsonObject.getString("sendUser")));//修改人
-            busProcess.set("modifytime", jsonObject.getDate("sendDate"));//修改时间
-            busProcess.set("auditor", getUser(jsonObject.getString("sendUser")));//审核人
-            busProcess.set("auditdate", jsonObject.getDate("sendDate"));//审核时间
-            busProcess.set("billstatus", "A");//状态
-            //单据体
-            //根据资产编号查询实物卡片
-            QFilter cardFilter = new QFilter("number", QCP.equals,nckd_card_real_code);
-            cardFilter.and("isbak",  QCP.equals, "0");
-            DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_real","id",new QFilter[] {cardFilter});
-            for (int c = 0; c < card.length; c++) {
-                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
-                //创建报废明细分录
-                DynamicObjectCollection entryEntity = busProcess.getDynamicObjectCollection("nckd_entryentity6");
-                DynamicObject entry1 = entryEntity.addNew();
-                entry1.set("nckd_basedatafield", cardInfo);//资产编码
-                Integer count = Integer.valueOf(jsonObject.getJSONArray("asset").getJSONObject(0).getString("count"));
-                entry1.set("nckd_integerfield", count);//报废数量
-            }
-            //执行保存-提交-审核
-            OperationResult saveResult = SaveServiceHelper.saveOperate("nckd_ywcld", new DynamicObject[]{busProcess}, OperateOption.create());
-            if (saveResult.isSuccess()){
-                //生单后反写中间表,防止反复生单
-                OncePush(jsonObject.getString("billno"));
-                OperationResult submitResult = OperationServiceHelper.executeOperate("submit", "nckd_ywcld",saveResult.getSuccessPkIds().toArray(),OperateOption.create());
-                OperationResult auditResult = OperationServiceHelper.executeOperate("audit", "nckd_ywcld",submitResult.getSuccessPkIds().toArray(),OperateOption.create());
-            }
-        }
-
-    }
-
-    /**
-     * @description 查询组织对照表获取组织id
-     * @param eOrgId
-     * @return Long
-     */
-    private Long getOrg(String eOrgId) {
-        QFilter orgFilter = new QFilter("nckd_e_org", QCP.equals,eOrgId);
-        DynamicObject[] orgControl = BusinessDataServiceHelper.load("nckd_base_org_ext","id",new QFilter[] {orgFilter});
-        if (orgControl.length > 0) {
-            DynamicObject orgControlInfo = BusinessDataServiceHelper.loadSingle(orgControl[0].getPkValue(), orgControl[0].getDynamicObjectType().getName());
-            String number = orgControlInfo.getString("nckd_org_number");
-            QFilter filter = new QFilter("number", QCP.equals,number);
-            DynamicObject[] org = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {filter});
-            if (org.length > 0) {
-                DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(org[0].getPkValue(), org[0].getDynamicObjectType().getName());
-                return orgInfo.getLong("id");
+                minInfo.set("nckd_count", asset.getString("count"));//资产数量
             }
         }
-        return null;
-    }
-
-    /**
-     * @description 查询用户表获取用户
-     * @param eUser
-     * @return Long
-     */
-    private DynamicObject getUser(String eUser) {
-        QFilter filter = new QFilter("number", QCP.in, eUser);
-        DynamicObject[] user = BusinessDataServiceHelper.load("bos_user","id",new QFilter[] {filter});
-        if (user.length > 0) {
-            DynamicObject userInfo = BusinessDataServiceHelper.loadSingle(user[0].getPkValue(), user[0].getDynamicObjectType().getName());
-            return userInfo;
-        }
-        return null;
-    }
-
-
-    /**
-     * @description e管家数据转换为星瀚数据
-     * @param jsonObject,map
-     * @return String
-     */
-    private String Control(JSONObject jsonObject, HashMap<String , Long> map) {
-        String dispatchType = jsonObject.getString("dispatchType");
-        if ("0".equals(dispatchType)) {
-            //查询人员
-            DynamicObject sendUser = getUser(jsonObject.getString("sendUser"));//调出申请人
-            DynamicObject recieveUser = getUser(jsonObject.getString("recieveUser"));//调入负责人
-            if (ObjectUtils.isEmpty(sendUser) || ObjectUtils.isEmpty(recieveUser)) {
-                return "人员信息转换失败";
-            }
-            map.put("sendUser", sendUser.getLong("id"));
-            map.put("recieveUser", recieveUser.getLong("id"));
-            //查询组织
-            Long outOrgId = getOrg(jsonObject.getString("outOrgId"));//调出组织
-            Long orgId = getOrg(jsonObject.getString("orgId"));//调入组织
-            Long inDeptId = getOrg(jsonObject.getString("inDeptId"));//调入部门
-            if (ObjectUtils.isEmpty(outOrgId) || ObjectUtils.isEmpty(orgId) || ObjectUtils.isEmpty(inDeptId)) {
-                return "组织信息转换失败";
-            }
-            map.put("outOrgId", outOrgId);
-            map.put("orgId", orgId);
-            map.put("inDeptId", inDeptId);
-            return null;
-        } else if ("1".equals(dispatchType)) {
-            //查询人员
-            DynamicObject sendUser = getUser(jsonObject.getString("sendUser"));//调出申请人
-            DynamicObject recieveUser = getUser(jsonObject.getString("recieveUser"));//调入负责人
-            DynamicObject user = getUser(jsonObject.getString("user"));//调入使用人
-            if (ObjectUtils.isEmpty(sendUser) || ObjectUtils.isEmpty(recieveUser) || ObjectUtils.isEmpty(user)) {
-                return "人员信息转换失败";
-            }
-            map.put("sendUser", sendUser.getLong("id"));
-            map.put("recieveUser", recieveUser.getLong("id"));
-            map.put("user", user.getLong("id"));
-            //查询组织
-            Long orgId = getOrg(jsonObject.getString("orgId"));//调入组织
-            Long inDeptId = getOrg(jsonObject.getString("inDeptId"));//调入部门
-            if (ObjectUtils.isEmpty(orgId) || ObjectUtils.isEmpty(inDeptId)) {
-                return "组织信息转换失败";
-            }
-            map.put("orgId", orgId);
-            map.put("inDeptId", inDeptId);
-            return null;
-        }else if ("2".equals(dispatchType)) {
-            //查询人员
-            DynamicObject sendUser = getUser(jsonObject.getString("sendUser"));//调出申请人
-            if (ObjectUtils.isEmpty(sendUser)) {
-                return "人员信息转换失败";
-            }
-            map.put("sendUser", sendUser.getLong("id"));
-            //查询组织
-            Long orgId = getOrg(jsonObject.getString("orgId"));//资产组织
-            if (ObjectUtils.isEmpty(orgId)) {
-                return "组织信息转换失败";
-            }
-            map.put("orgId", orgId);
-            return null;
-        }
-        return null;
-    }
-
-
-    /**
-     * @description 生单后反写中间表,防止反复生单
-     * @param billno
-     * @return String
-     */
-    private void OncePush(String billno) {
-        QFilter filter = new QFilter("number", QCP.equals, billno);
-        DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_dispatch_mid","id",new QFilter[] {filter});
-        DynamicObject midDispatch = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
-        midDispatch.set("nckd_flag", "1");
-        SaveServiceHelper.save(new DynamicObject[]{midDispatch});
-    }
-
-    /**
-     * @description 判断是否已经下推生成调拨单
-     * @param billno
-     * @return boolean
-     */
-    private boolean isAlreadyDispatched(String billno) {
-        QFilter flagFilter = new QFilter("number", QCP.equals, billno);
-        DynamicObject[] mid = BusinessDataServiceHelper.load("nckd_e_dispatch_mid", "id", new QFilter[]{flagFilter});
-        if (mid.length > 0) {
-            DynamicObject midDispatch = BusinessDataServiceHelper.loadSingle(mid[0].getPkValue(), mid[0].getDynamicObjectType().getName());
-            String flag = midDispatch.getString("nckd_flag");
-            return "1".equals(flag);
-        }
-        return false;
-    }
-
-    /**
-     * @description 拼接错误信息
-     * @param resultString,errorChange,errorCode
-     */
-    private void appendErrorMessages(StringBuilder resultString, String errorChange, String errorCode) {
-        if (!StringUtils.isEmpty(errorChange)) {
-            resultString.append(errorChange).append("\n");
-        }
-        if (!StringUtils.isEmpty(errorCode)) {
-            resultString.append(errorCode).append("\n");
-        }
-    }
-
-    /**
-     * @description 查询财务卡片
-     * @param realCardId
-     */
-    private DynamicObject queryFinCard(Long realCardId) {
-        QFilter cardFilter = new QFilter("realcardmasterid", QCP.equals,realCardId);
-        DynamicObject[] card = BusinessDataServiceHelper.load("fa_card_fin","id",new QFilter[] {cardFilter});
-        for (int c = 0; c < card.length; c++) {
-            DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(card[c].getPkValue(), card[c].getDynamicObjectType().getName());
-            return cardInfo;
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询组织
-     * @param orgId
-     */
-    private DynamicObject queryOrg(Long orgId) {
-        QFilter orgQFilter= new QFilter("id", QCP.equals,orgId);
-        DynamicObject[] org = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {orgQFilter});
-        for (int c = 0; c < org.length; c++) {
-            DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(org[c].getPkValue(), org[c].getDynamicObjectType().getName());
-            return orgInfo;
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询变更类型
-     * @param id
-     */
-    private DynamicObject queryChangeType(Long id) {
-        QFilter orgQFilter= new QFilter("id", QCP.equals,id);
-        DynamicObject[] changeType = BusinessDataServiceHelper.load("fa_change_type","id",new QFilter[] {orgQFilter});
-        for (int c = 0; c < changeType.length; c++) {
-            DynamicObject changeInfo = BusinessDataServiceHelper.loadSingle(changeType[c].getPkValue(), changeType[c].getDynamicObjectType().getName());
-            return changeInfo;
-        }
-        return null;
-    }
-
-    /**
-     * @description 查询折旧用途
-     * @param id
-     */
-    private DynamicObject queryDepreuse(Long id) {
-        QFilter orgQFilter= new QFilter("id", QCP.equals,id);
-        DynamicObject[] depreuse = BusinessDataServiceHelper.load("fa_depreuse","id",new QFilter[] {orgQFilter});
-        for (int c = 0; c < depreuse.length; c++) {
-            DynamicObject depreuseInfo = BusinessDataServiceHelper.loadSingle(depreuse[c].getPkValue(), depreuse[c].getDynamicObjectType().getName());
-            return depreuseInfo;
-        }
-        return null;
+        minInfo.set("nckd_card_number", cardNumber);
+        SaveServiceHelper.save(new DynamicObject[]{minInfo});
     }
 }

+ 43 - 1
src/main/java/fi/gl/formplugin/DailyexcuteFormPlugin.java

@@ -5,6 +5,9 @@ import kd.bos.bill.BillShowParameter;
 import kd.bos.context.RequestContext;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.AppInfo;
+import kd.bos.entity.AppMetadataCache;
+import kd.bos.entity.param.AppParam;
 import kd.bos.form.CloseCallBack;
 import kd.bos.form.FormShowParameter;
 import kd.bos.form.ShowType;
@@ -22,11 +25,13 @@ import kd.bos.permission.api.HasPermOrgResult;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.operation.DeleteServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.parameter.SystemParamServiceHelper;
 import kd.bos.servicehelper.permission.PermissionServiceHelper;
 import kd.bos.servicehelper.user.UserServiceHelper;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 日结执行界面插件
@@ -39,6 +44,11 @@ public class DailyexcuteFormPlugin extends AbstractBillPlugIn implements CellCli
     private final static String KEY_DAILY = "nckd_daily";
     //页面取消按钮标识
     private final static String KEY_UNDAILY = "nckd_undaily";
+    //开启了日结参数的组织ID集
+    @Override
+    public void initialize() {
+        super.initialize();
+    }
 
     @Override
     public void registerListener(EventObject e) {
@@ -217,13 +227,45 @@ public class DailyexcuteFormPlugin extends AbstractBillPlugIn implements CellCli
         if("nckd_org".equals(propertyName)) {
             ListShowParameter formShowParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
             List<QFilter> qFilters = new ArrayList<>();
+            //判断用户组织范围
             HasPermOrgResult userHasPermOrgs = PermissionServiceHelper.getUserHasPermOrgs(Long.parseLong(RequestContext.get().getUserId()));
             boolean hasallOrg = userHasPermOrgs.hasAllOrgPerm();
             if(hasallOrg==false){
                 List<Long> hasPermOrgs = userHasPermOrgs.getHasPermOrgs();
                 qFilters.add(new QFilter("id", QCP.in, hasPermOrgs));
-                formShowParameter.getListFilterParameter().setQFilters(qFilters);
             }
+
+            //判断组织是否开启了日结参数
+            List<Long> orgIds = new ArrayList<Long>();
+            List<Long> orgQueryIds = new ArrayList<Long>();
+            QFilter qFilter_enable = new QFilter("enable", QCP.equals,"1");
+            QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
+            QFilter qFilter_fisaccounting = new QFilter("fisaccounting", QCP.equals, "1");
+            DynamicObject[] orgCol = BusinessDataServiceHelper.load("bos_org","id",
+                    new QFilter[]{qFilter_enable,qFilter_status,qFilter_fisaccounting});
+            for(DynamicObject orgObj : orgCol){
+                orgQueryIds.add(orgObj.getLong("id"));
+            }
+            //根据应用编码从缓存中获取应用信息
+            AppInfo cgfwAppInfo = AppMetadataCache.getAppInfo("gl");
+            //获取应用的主键
+            String appId = cgfwAppInfo.getId();
+            AppParam apm = new AppParam();
+            apm.setAppId(appId);
+            apm.setOrgIds(orgQueryIds);
+            Map<String,Map<String, Object>> paramWhole = SystemParamServiceHelper.loadBatchAppParameterByOrg(apm,orgQueryIds);
+
+            Set<String> keysWithNullValues = paramWhole.entrySet().stream().filter(entry -> entry.getValue().size()>0).map(Map.Entry::getKey)
+                    .collect(Collectors.toSet());
+            for(String key :keysWithNullValues){
+                Map valueObj = paramWhole.get(key);
+                Object nckd_isopendaily = valueObj.get("nckd_isopendaily");
+                if("true".equals(nckd_isopendaily.toString())){
+                    orgIds.add(Long.valueOf(key));
+                }
+            }
+            qFilters.add(new QFilter("id", QCP.in, orgIds));
+            formShowParameter.getListFilterParameter().setQFilters(qFilters);
         }
 
 

+ 2 - 2
src/main/java/fi/gl/task/AutoDailTask.java

@@ -46,9 +46,9 @@ public class AutoDailTask extends AbstractTask {
         QFilter qFilter_enable = new QFilter("enable", QCP.equals,"1");
         QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
         QFilter qFilter_fisaccounting = new QFilter("fisaccounting", QCP.equals, "1");
-        QFilter qFilter_number = new QFilter("number", QCP.equals, "A002");
+//        QFilter qFilter_number = new QFilter("number", QCP.equals, "A002");
         DynamicObject[] orgCol = BusinessDataServiceHelper.load("bos_org","id",
-                new QFilter[]{qFilter_enable,qFilter_status,qFilter_fisaccounting,qFilter_number});
+                new QFilter[]{qFilter_enable,qFilter_status,qFilter_fisaccounting});
         for(DynamicObject orgObj : orgCol){
             //根据应用编码从缓存中获取应用信息
             AppInfo cgfwAppInfo = AppMetadataCache.getAppInfo("gl");

+ 1 - 1
src/main/java/kd/imc/rim/AwsRecognitionServiceEx.java

@@ -63,7 +63,7 @@ public class AwsRecognitionServiceEx implements RecognitionService {
             boolean overseaFlag = false;
             if (!"".equals(imgStrToBase64)) {
                 long start = System.currentTimeMillis();
-                String url = "http://10.3.2.70:8115";
+                String url = "http://10.3.2.70:8115/cci_ai/service/v1/receipt_crop_and_recog";
                 String valueFileName;
                 ByteArrayInputStream valueInputStream = recognitionParam.getFileByteArrayInputStream();
                 valueFileName = recognitionParam.getFileName();

+ 72 - 90
src/main/java/kd/imc/rim/utils/ApiHttpUtils.java

@@ -5,7 +5,11 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import javassist.Loader;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
 import kd.bos.script.annotations.KSObject;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpPost;
@@ -15,6 +19,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.util.EntityUtils;
 
+import java.io.IOException;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
@@ -29,7 +34,7 @@ import java.util.Iterator;
 @KSObject
 public class ApiHttpUtils {
 
-    public static String Posthttp(String url, String Params) throws Exception {
+    public static String Posthttp(String url, String Params){
         // 获得Http客户端
         CloseableHttpClient httpClient = HttpClientBuilder.create().build();
         // 创建Post请求
@@ -65,20 +70,38 @@ public class ApiHttpUtils {
         StringEntity entity = new StringEntity(object.toString(), ContentType.APPLICATION_JSON);
         httpPost.setEntity(entity);
         // 响应模型(发送post请求)
-        CloseableHttpResponse response = httpClient.execute(httpPost);
+        CloseableHttpResponse response = null;
+        try {
+            response = httpClient.execute(httpPost);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
         // 从响应模型中获取响应实体
         HttpEntity responseEntity = response.getEntity();
-        com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
+        JSONObject jsonObject = new JSONObject();
         if (responseEntity != null) {
-            jsonObject = JSON.parseObject(EntityUtils.toString(response.getEntity()));
-            return jsonObject.toJSONString();
+            try {
+                jsonObject = JSON.parseObject(EntityUtils.toString(response.getEntity()));
+                JSONArray jsonArray = jsonObject.getJSONObject("boby").getJSONArray("object_list");
+                return jsonArray.toJSONString();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
         }
         // 释放资源
         if (httpClient != null) {
-            httpClient.close();
+            try {
+                httpClient.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
         }
         if (response != null) {
-            response.close();
+            try {
+                response.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
         }
         return "";
     }
@@ -111,6 +134,14 @@ public class ApiHttpUtils {
         return null;
     }
     public static String toFiledata(String Params) throws Exception {
+        //组装发票数据结构 !
+        JSONObject json = new JSONObject();//返回最外层json
+        json.put("errcode","0000");
+        json.put("traceId","");
+        json.put("description","操作成功");
+        JSONObject data = new JSONObject();//数据层json
+        json.put("batchNo","");
+        JSONArray recoginitionData = new JSONArray();//数据层数组
         if("".equals(Params)){return null;};
         JSONArray objects = JSONArray.parseArray(Params);
         for(int a=0;a<objects.size();a++){
@@ -127,95 +158,46 @@ public class ApiHttpUtils {
                 String value = respenjsons.get("value").toString();// 获得value
                 item_list.put(key,value);
             }
-            if("增值税电子普通发票".equals(type_description)){
-                String zzsdzptfp = zzsdzptfp(item_list);
-                return zzsdzptfp;
-            }else if("行程单".equals(type_description)){
-                String jpxcd = jpxcd(item_list);
-                return jpxcd;
-            } else if ("火车票".equals(type_description)) {
-                String hcp = hcp(item_list);
-                return hcp;
-            } else if ("通用定额发票".equals(type_description)) {
-                String tydefp = tydefp(item_list);
-                return tydefp;
+            if("行程单".equals(type_description)){
+                JSONArray flight_data_list = respenjson.getJSONArray("flight_data_list");
+                for (int i=0;i<flight_data_list.size();i++){
+                    Object obj = flight_data_list.get(i);
+                    JSONArray xcobj = JSONArray.parseArray(obj.toString());
+                    for(int c=0;c<xcobj.size();c++){
+                        Object objc = flight_data_list.get(c);
+                        JSONObject respenjsons = (JSONObject) JSONObject.toJSON(objc);
+                        String key = respenjsons.get("key").toString();// 获得key
+                        String value = respenjsons.get("value").toString();// 获得value
+                        item_list.put(key,value);
+                    }
+                }
             }
+                QFilter nckd_File = new QFilter("nckd_filetype", QCP.equals, type_description);
+                DynamicObject nckd_FileData = BusinessDataServiceHelper.loadSingle("nckd_filedataconvert", "id,nckd_filetype", new QFilter[]{nckd_File});
+                JSONObject Filedata = FileData(nckd_FileData,item_list);
+                recoginitionData.add(Filedata);
         }
-
-        return null;
+        data.put("recoginitionData",recoginitionData);
+        json.put("data",data);
+        return json.toString();
     }
 
     //增值税电子普通发票
-    public static String zzsdzptfp(JSONObject item_list) throws Exception {
-        //组装发票数据结构 !
-        JSONObject json = new JSONObject();//返回最外层json
-        json.put("errcode","0000");
-        json.put("traceId","");
-        json.put("description","操作成功");
-        JSONObject data = new JSONObject();//数据层json
-        json.put("batchNo","");
-        JSONArray recoginitionData = new JSONArray();//数据层数组
+    public static JSONObject FileData(DynamicObject nckd_FileData,JSONObject item_list) throws Exception {
         JSONObject fileObj = new JSONObject();//实际数据json
-        fileObj.put("canBeDeduction","");//0
-        fileObj.put("salerName",item_list.getString("vat_invoice_seller_name"));//销售方名称  ocr字段:vat_invoice_seller_name
-        fileObj.put("invoiceMoney",item_list.getString("vat_invoice_price_list"));//金额明细 ocr字段:vat_invoice_price_list
-        fileObj.put("signStatus","");//0
-        fileObj.put("downloadUrl","");//下载地址链接
-        fileObj.put("fileHash","");//文件哈希值
-        fileObj.put("invoiceAmount",item_list.getString("vat_invoice_total"));//合计金额 ocr字段:vat_invoice_total
-        fileObj.put("localUrl","");//预览链接
-        fileObj.put("deductionStatus",1);//扣除
-        fileObj.put("salerTaxNo",item_list.getString("vat_invoice_seller_id_seal"));//纳税人识别号 ocr字段:vat_invoice_seller_id_seal
-
-        fileObj.put("invoiceType",1);//发票类型 ocr字段:type  1="增值税发票"
-
-        fileObj.put("invoiceNo",item_list.getString("vat_invoice_haoma_large_size"));//发票号码 ocr字段:vat_invoice_haoma_large_size
-        fileObj.put("isRepeat",false);//是否重复
-        fileObj.put("pixel","");//3962978 未知字段
-        fileObj.put("oriImageSize","");//base64编码长度
-        fileObj.put("pdfToImgSnapshotUrl","");//空
-        fileObj.put("orientation","0");//0
-        fileObj.put("batchNo",null);//null
-        fileObj.put("clientId","Vfz636yVhmk9HEu1QTAp");//客户端id
-        fileObj.put("buyerTaxNo",item_list.getString("vat_invoice_rate_payer_id"));//购买方纳税人识别号 ocr字段:vat_invoice_rate_payer_id
-        fileObj.put("warningCode","");//警告数量
-        fileObj.put("originalState",0);//原始状态0
-        fileObj.put("companySeal","1");//未知字段
-        fileObj.put("originalUrl","");//地址链接
-        fileObj.put("invoiceDate",item_list.getString("vat_invoice_issue_date"));//开票日期 ocr字段:vat_invoice_issue_date
-        fileObj.put("buyerName",item_list.getString("vat_invoice_payer_name"));//购买方名称  ocr字段:vat_invoice_payer_name
-        fileObj.put("invoiceCode",item_list.getString("vat_invoice_daima"));//发票代码 ocr字段: vat_invoice_daima
-        fileObj.put("serialNo","");//未知字段
-        fileObj.put("totalAmount",item_list.getString("vat_invoice_total_cover_tax_digits"));//价税合计 ocr字段: vat_invoice_total_cover_tax_digits
-        fileObj.put("taxRate",item_list.getString("vat_invoice_tax_rate"));//税率 ocr字段 vat_invoice_tax_rate
-        fileObj.put("oriOrientation","0");//未知字段
-        fileObj.put("oriRegion","");//什么地区....
-        fileObj.put("rotationAngle","0");//未知字段
-        fileObj.put("snapshotUrl","");//图片地址
-        fileObj.put("imageSerialNo","");//图片编码?
-        fileObj.put("recognitionSerialNo","");//未知字段
-        fileObj.put("totalTaxAmount",item_list.getString("vat_invoice_tax_total"));//税额合计 ocr字段 vat_invoice_tax_total
-        fileObj.put("taxAmount",item_list.getString("vat_invoice_tax_list"));//税额 ocr字段 vat_invoice_tax_list
-        fileObj.put("region","");//未知字段
-        fileObj.put("isExpend","");//""
-        fileObj.put("expendStatus",null);//null
-        fileObj.put("fileType",1);//附件类型
-        JSONArray items = new JSONArray();//数据明细层数组
-        JSONObject mxFileObj = new JSONObject();//明细数据json
-        mxFileObj.put("unitPrice",item_list.getString("vat_invoice_total"));//合计金额 oct字段: vat_invoice_total
-        mxFileObj.put("taxRate",item_list.getString("vat_invoice_tax_rate_list"));//税率明细 vat_invoice_tax_rate_list
-        mxFileObj.put("unit","");
-        mxFileObj.put("num","1");
-        mxFileObj.put("detailAmount",item_list.getString("vat_invoice_price_list"));//金额明细 ocr字段:vat_invoice_price_list
-        mxFileObj.put("taxAmount",item_list.getString("vat_invoice_tax_list"));//税额明细 ocr字段 vat_invoice_tax_list
-        mxFileObj.put("goodsName",item_list.getString("vat_invoice_goods_list"));//服务名称/项目名称 ocr字段 vat_invoice_goods_list
-        //值拼接完成后开始set数据结构
-        items.add(mxFileObj);
-        fileObj.put("items",items);
-        recoginitionData.add(fileObj);
-        data.put("recoginitionData",recoginitionData);
-        json.put("data",data);
-        return json.toJSONString();
+        for (DynamicObject entryentity : nckd_FileData.getDynamicObjectCollection("nckd_treeentryentity")) {
+            String nckd_keingde = entryentity.getString("nckd_keingde");
+            String nckd_ocr = entryentity.getString("nckd_ocr");
+            String nckd_acquiesce = entryentity.getString("nckd_acquiesce");
+            if(!"".equals(nckd_ocr) && nckd_ocr!=null){
+                fileObj.put(nckd_keingde,item_list.getString(nckd_ocr));
+            }else if(!"".equals(nckd_acquiesce) && nckd_ocr!=null){
+                fileObj.put(nckd_keingde,nckd_acquiesce);
+            }else {
+                fileObj.put(nckd_keingde,"");
+            }
+        }
+        return fileObj;
     }
     //机票行程单
     public static String jpxcd(JSONObject item_list) throws Exception {

+ 43 - 4
src/main/java/kd/imc/rim/utils/FileOutputStreamExample.java

@@ -1,9 +1,8 @@
 package kd.imc.rim.utils;
 
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import kd.bos.url.UrlService;
+
+import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.util.Base64;
@@ -76,4 +75,44 @@ public class FileOutputStreamExample {
         // 对字节数组Base64编码
         return Base64.getEncoder().encodeToString(buffer);
     }
+
+    public static File getNetUrlHttp(String netUrl) {
+       // UrlService.getAttachmentFullUrl(netUrl);
+        //对本地文件命名
+        File file = null;
+        URL urlfile;
+        InputStream inStream = null;
+        OutputStream os = null;
+        try {
+            file = File.createTempFile("net_url", netUrl);
+            //下载
+            urlfile = new URL(netUrl);
+            inStream = urlfile.openStream();
+            os = new FileOutputStream(file);
+
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+        } catch (Exception e) {
+            log.error("远程图片获取错误:"+netUrl);
+            e.printStackTrace();
+        } finally {
+            try {
+                if (null != os) {
+                    os.close();
+                }
+                if (null != inStream) {
+                    inStream.close();
+                }
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        return file;
+    }
+
 }