Prechádzať zdrojové kódy

Merge branch 'master' of http://111.75.220.136:10030/13246659623/jxyh

sbtjtserver/zhaoxh 9 mesiacov pred
rodič
commit
c3d1974c2d

+ 104 - 0
src/main/java/fi/em/EditPlugin/CostAllocationEditPlugin.java

@@ -0,0 +1,104 @@
+package fi.em.EditPlugin;
+
+import kd.bos.exception.KDBizException;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.ShowType;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.sdk.plugin.Plugin;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import org.apache.commons.lang3.StringUtils;
+import java.math.BigDecimal;
+import java.util.HashMap;
+
+
+public class CostAllocationEditPlugin extends AbstractListPlugin implements Plugin {
+    public static String btn_NOTICE = "donothing"; //操作
+    public static String nckd_agentparameterf7 = "nckd_agentparameterf7";//动因参数动态列表
+    private static String bos_org = "bos_org"; //组织金额标识
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        if (btn_NOTICE.equals(e.getOperateKey())) {
+            Object value = this.getModel().getValue("costcompany");//获取当前单据费用公司
+            DynamicObject costcompany = (DynamicObject) value;//强转
+            String orgnumber = costcompany.getString("number");//公司编码
+            String orgid = costcompany.getString("id");//公司id
+            if (orgnumber == null){
+                throw new KDBizException("付费承担公司为空!");
+            }
+            showParameter(nckd_agentparameterf7, btn_NOTICE,orgnumber,orgid);//调用弹出页面
+        }
+    }
+
+    @Override
+    public void closedCallBack(ClosedCallBackEvent e) {
+        super.closedCallBack(e);
+        if (StringUtils.equals(btn_NOTICE, e.getActionId()) && null != e.getReturnData()) {
+            //父页面返回参数
+            HashMap<String, String> returnData = (HashMap<String, String>) e.getReturnData();
+            String reJaStr = returnData.get("reJaStr");
+            //判断空
+            if (StringUtils.isNotBlank(reJaStr)) {
+                //删除分录信息
+                this.getModel().deleteEntryData("expenseentryentity_rule");
+                JSONArray reJa = JSONArray.parseArray(reJaStr);//返回信息数组
+                BigDecimal sum = new BigDecimal(0);//动因参数总和
+                //循环计算sum
+                for(int a =0;a<reJa.size();a++){
+                    JSONObject reJo = reJa.getJSONObject(a);
+                    BigDecimal nckdAgentvalue = reJo.getBigDecimal("nckd_agentvalue");
+                    sum=sum.add(nckdAgentvalue);
+                }
+                //循环返回数组插入分录
+                for(int i =0;i<reJa.size();i++){
+                    //当前循环行
+                    JSONObject reJo = reJa.getJSONObject(i);
+                    //获取组织
+                    String nckd_shareorg = reJo.getString("nckd_shareorg");
+                    QFilter nckd_orgamountFilter = new QFilter("number", QCP.equals,nckd_shareorg);
+                        nckd_orgamountFilter.and("enable", QCP.equals,"1");
+                        //组织实体
+                    DynamicObject nckd_orgamountaccount = BusinessDataServiceHelper.loadSingle(bos_org,"id,nckd_orgfield,nckd_combofield",new QFilter[] {nckd_orgamountFilter});
+                    BigDecimal nckdAgentvalue = reJo.getBigDecimal("nckd_agentvalue");
+                    //计算当前动因值比例
+                    nckdAgentvalue = (nckdAgentvalue.divide(sum)).multiply(new BigDecimal(100));
+                    //新增分录行
+                    int rowIndex = this.getModel().createNewEntryRow("expenseentryentity_rule");
+                    //set分录字段
+                    this.getModel().setValue("entrycostcompany_orgrule", nckd_orgamountaccount, rowIndex);
+                    this.getModel().setValue("sharerate_comrule", nckdAgentvalue, rowIndex);
+                }
+                //刷新分录
+                this.getView().updateView("expenseentryentity_rule");
+            }
+        }
+    }
+
+    public void showParameter(String formId, String actionId,String orgnumber,String orgid) {
+        //创建弹出页面对象,FormShowParameter表示弹出页面为动态表单
+        FormShowParameter ShowParameter = new FormShowParameter();
+        //ListShowParameter ShowParameter = new ListShowParameter();
+        ShowParameter.setCustomParam("orgnumber", orgnumber);
+        ShowParameter.setCustomParam("orgid", orgid);
+        //设置弹出页面的编码
+        ShowParameter.setFormId(formId);
+//        ShowParameter.setCaption();
+        //设置弹出页面标题
+        ShowParameter.setCaption("动因参数选择");
+        //设置页面关闭回调方法
+        //CloseCallBack参数:回调插件,回调标识  btnok
+        ShowParameter.setCloseCallBack(new CloseCallBack(this, actionId));
+        //设置弹出页面打开方式,支持模态,新标签等
+        ShowParameter.getOpenStyle().setShowType(ShowType.Modal);
+        //弹出页面对象赋值给父页面
+        this.getView().showForm(ShowParameter);
+    }
+}

+ 185 - 0
src/main/java/fi/em/FormPlugin/AgentFormPlugin.java

@@ -0,0 +1,185 @@
+package fi.em.FormPlugin;
+
+import kd.bos.exception.KDBizException;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.sdk.plugin.Plugin;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.serialization.SerializationUtils;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+public class AgentFormPlugin extends AbstractFormPlugin implements Plugin {
+    private final static String KEY_OK = "btnok";//页面取消按钮标识
+    private final static String KEY_CANCEL = "btncancel";//页面取消按钮标识
+    private final static String KEY_SEARCH = "search";//动态表单查询按钮操作
+    private final static String FORMID_ENTRY = "nckd_entryentity";//动态表单单据体标识
+    private static String nckd_agentparameter = "nckd_agentparameter";//动因参数基础资料
+
+    /**
+     * 页面点击事件
+     *
+     * @param evt
+     */
+    @Override
+    public void click(EventObject evt) {
+        super.click(evt);
+        //获取被点击的控件对象
+        Control source = (Control) evt.getSource();
+        String pageId = this.getView().getPageId();
+        if (StringUtils.equals(source.getKey(), KEY_OK)) {
+            String listStr = this.getPageCache().get(pageId);
+            if (StringUtils.isNotBlank(listStr)){
+                JSONArray reJa = new JSONArray();
+                EntryGrid entryGrid = this.getView().getControl(FORMID_ENTRY);
+                int[] selectRows = entryGrid.getSelectRows();
+                if (selectRows.length<=0){
+                    this.getView().showMessage("请先选择一条数据!");
+                    return;
+                }
+
+                JSONArray infoJa = SerializationUtils.fromJsonString(listStr, JSONArray.class);
+                for(int i=0;i<selectRows.length;i++){
+                    JSONObject reJo = infoJa.getJSONObject(selectRows[i]);
+                    reJa.add(reJo);
+                }
+                HashMap<String, String> map = new HashMap<>();
+                map.put("reJaStr", reJa.toJSONString());
+
+                this.getView().returnDataToParent(map);
+            }
+
+            this.getView().close();
+        } else if (StringUtils.equals(source.getKey(), KEY_CANCEL)) {
+            //被点击控件为取消则设置返回值为空并关闭页面(在页面关闭回调方法中必须验证返回值不为空,否则会报空指针)
+            this.getView().returnDataToParent(null);
+            this.getView().close();
+        } else {
+            this.getView().returnDataToParent(null);
+            this.getView().close();
+        }
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        //页面确认按钮和取消按钮添加监听
+        this.addClickListeners(KEY_OK, KEY_CANCEL);
+    }
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterBindData(e);
+        DynamicObject period = (DynamicObject) this.getModel().getValue("nckd_typeagent");
+        //获取父页面传入数据
+        Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
+        String orgnumber = (String) customParams.get("orgnumber");
+        String orgid = (String) customParams.get("orgid");
+        if (orgnumber == null){
+            throw new KDBizException("付费承担公司为空!");
+        }
+        List<JSONObject> resdate = new ArrayList<>();
+        //历史数据清除
+        this.getModel().deleteEntryData(FORMID_ENTRY);
+        //构建查费用分摊动因参数基础资料参数
+        QFilter nckd_orgamountFilter = new QFilter("nckd_unappliedorg.number", QCP.equals,orgnumber);
+        nckd_orgamountFilter.and("status", QCP.equals,"C");
+        DynamicObject[] nckd_orgamountaccount = BusinessDataServiceHelper.load(nckd_agentparameter,"id,number",new QFilter[] {nckd_orgamountFilter});
+            for (int c=0;c<nckd_orgamountaccount.length;c++){
+                //当前循环动因基础资料单头
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_orgamountaccount[c].getPkValue(), nckd_orgamountaccount[c].getDynamicObjectType().getName());
+                //获取动因类型
+            DynamicObject nckdTypeagent = dynamicObject.getDynamicObject("nckd_typeagent");
+            //循环分录
+            for (DynamicObject entryentity : dynamicObject.getDynamicObjectCollection("nckd_entryentity")) {
+                //获取分摊组织
+                DynamicObject nckdShareorg = entryentity.getDynamicObject("nckd_shareorg");
+                //获取动因值
+                BigDecimal nckdAgentvalue = entryentity.getBigDecimal("nckd_agentvalue");
+                //新增动态单据分录
+                int rowIndex = this.getModel().createNewEntryRow(FORMID_ENTRY);
+                //赋值给新增分录
+                this.getModel().setValue("nckd_shareorg", nckdShareorg, rowIndex);
+                this.getModel().setValue("nckd_agentvalue", nckdAgentvalue, rowIndex);
+                this.getModel().setValue("nckd_agenttype", nckdTypeagent, rowIndex);
+                //将选中的数据放到缓存中
+                JSONObject obj = new JSONObject();
+                obj.put("nckd_shareorg",nckdShareorg.getString("number"));
+                obj.put("nckd_agentvalue",nckdAgentvalue);
+                resdate.add(obj);
+            }
+        }
+        String pageId = this.getView().getPageId();
+        String listStr = SerializationUtils.toJsonString(resdate);
+        this.getPageCache().put(pageId, listStr);
+//        initTable(isInform,isForce,startDate,endDate,null);
+    }
+
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        if (KEY_SEARCH.equals(e.getOperateKey())) {
+            DynamicObject period = (DynamicObject) this.getModel().getValue("nckd_typeagent");
+            //获取父页面传入数据
+            Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
+            String orgnumber = (String) customParams.get("orgnumber");
+            String orgid = (String) customParams.get("orgid");
+            if (orgnumber == null){
+                throw new KDBizException("付费承担公司为空!");
+            }
+            List<JSONObject> resdate = new ArrayList<>();
+            //历史数据清除
+            this.getModel().deleteEntryData(FORMID_ENTRY);
+            //查询动因参数基础资料
+            QFilter nckd_orgamountFilter = new QFilter("nckd_unappliedorg.number", QCP.equals,orgnumber);
+            if(period !=null){
+                period = BusinessDataServiceHelper.loadSingle(period.getPkValue(),period.getDynamicObjectType().getName());
+                String name = period.getString("name");
+                if(name!=null && !name.isEmpty()){
+                    nckd_orgamountFilter.and("nckd_typeagent.name", QCP.equals,name);
+                }
+            }
+            nckd_orgamountFilter.and("status", QCP.equals,"C");
+            DynamicObject[] nckd_orgamountaccount = BusinessDataServiceHelper.load(nckd_agentparameter,"id,number",new QFilter[] {nckd_orgamountFilter});
+            //循环动因参数基础资料
+            for (int c=0;c<nckd_orgamountaccount.length;c++){
+                //当前行
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_orgamountaccount[c].getPkValue(), nckd_orgamountaccount[c].getDynamicObjectType().getName());
+                //动因类型
+                DynamicObject nckdTypeagent = dynamicObject.getDynamicObject("nckd_typeagent");
+                //循环分录
+                for (DynamicObject entryentity : dynamicObject.getDynamicObjectCollection("nckd_entryentity")) {
+                    //当前分录行分摊组织
+                    DynamicObject nckdShareorg = entryentity.getDynamicObject("nckd_shareorg");
+                    //当前分录行动因值
+                    BigDecimal nckdAgentvalue = entryentity.getBigDecimal("nckd_agentvalue");
+                    //新增动态单据分录行
+                    int rowIndex = this.getModel().createNewEntryRow(FORMID_ENTRY);
+                    //赋值给分录
+                    this.getModel().setValue("nckd_shareorg", nckdShareorg, rowIndex);
+                    this.getModel().setValue("nckd_agentvalue", nckdAgentvalue, rowIndex);
+                    this.getModel().setValue("nckd_agenttype", nckdTypeagent, rowIndex);
+                    //存放缓存
+                    JSONObject obj = new JSONObject();
+                    obj.put("nckd_shareorg",nckdShareorg.getString("number"));
+                    obj.put("nckd_agentvalue",nckdAgentvalue);
+                    resdate.add(obj);
+                }
+            }
+            String pageId = this.getView().getPageId();
+            String listStr = SerializationUtils.toJsonString(resdate);
+            this.getPageCache().put(pageId, listStr);
+//        initTable(isInform,isForce,startDate,endDate,null);
+            
+
+        }
+    }
+}

+ 29 - 8
src/main/java/fi/em/opplugin/PublicExpenseOpPlugin.java

@@ -2,18 +2,25 @@ package fi.em.opplugin;
 
 import com.alibaba.fastjson.JSONObject;
 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.exception.KDBizException;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 
 import java.math.BigDecimal;
-
+import java.util.List;
+import java.util.Map;
+//对公费用报销单
 public class PublicExpenseOpPlugin extends AbstractOperationServicePlugIn {
-    private static String nckd_orgamount = "nckd_orgamount";
+    private static String nckd_orgamount = "nckd_orgamount"; //组织金额标识
+    private static String attachmentpanel = "attachmentpanel";//附件标识
+    private static String er_publicreimbursebill = "er_publicreimbursebill";//对公报销单标识
+
 
-    //对公费用报销单
     @Override
     public void beginOperationTransaction(BeginOperationTransactionArgs e) {
         //获取当前操作单据数组
@@ -22,41 +29,55 @@ public class PublicExpenseOpPlugin extends AbstractOperationServicePlugIn {
             JSONObject object = new JSONObject();
             //当前单头数据包
             DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+            String billno = info.getString("billno");//报销单编号
             //获取费用承担公司
             DynamicObject costcompany = info.getDynamicObject("costcompany");
             //公司编码
             String number = costcompany.getString("number");
             //公司id
             long id = costcompany.getLong("id");
+            BigDecimal Amount = new BigDecimal(0);
             //循环费用明细分录
             for (DynamicObject entryentity : info.getDynamicObjectCollection("expenseentryentity")) {
                 //取当前循环费用明细分录的报销金额
                 BigDecimal expenseamount = entryentity.getBigDecimal("expenseamount");
+                Amount=Amount.add(expenseamount);
+            }
                 //金额标准查询条件
                 QFilter nckd_orgamountFilter = new QFilter("nckd_orgfield.number", QCP.equals,number);
                 nckd_orgamountFilter.and("nckd_combofield", QCP.equals,"A");
+                nckd_orgamountFilter.and("enable", QCP.equals,"1");
                 DynamicObject[] nckd_orgamountaccount = BusinessDataServiceHelper.load(nckd_orgamount,"id,nckd_orgfield,nckd_combofield",new QFilter[] {nckd_orgamountFilter});
                 //判断组织是否维护金额,没有则查询集团金额
                 if(nckd_orgamountaccount.length == 0){
                     nckd_orgamountFilter = new QFilter("nckd_orgfield.number", QCP.equals,"jxyh");
                     nckd_orgamountFilter.and("nckd_combofield", QCP.equals,"A");
+                    nckd_orgamountFilter.and("enable", QCP.equals,"1");
                     nckd_orgamountaccount = BusinessDataServiceHelper.load(nckd_orgamount,"id,nckd_orgfield,nckd_combofield",new QFilter[] {nckd_orgamountFilter});
                 }
                 //循环数组获取组织金额标准数据包  默认取组织,没有取集团
                 for (int c=0;c<nckd_orgamountaccount.length;c++){
                     //组织金额标准数据包
-                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_orgamountaccount[i].getPkValue(), nckd_orgamountaccount[i].getDynamicObjectType().getName());
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_orgamountaccount[c].getPkValue(), nckd_orgamountaccount[c].getDynamicObjectType().getName());
                    //获取标准金额
                     BigDecimal nckdAmountfield = dynamicObject.getBigDecimal("nckd_amountfield");
+                    String enable = dynamicObject.getString("enable");
                     //判断报销金额大于标准金额
-                    if(expenseamount.compareTo(nckdAmountfield) == 1){
-                        System.out.println("报销金额大于标准金额");
-
+                    if(Amount.compareTo(nckdAmountfield) == 1){
+                        //获取单据信息,并查询单据中的附件字段
+                        DynamicObject file =BusinessDataServiceHelper.loadSingle(er_publicreimbursebill,attachmentpanel,new QFilter[]{new QFilter("billno", QFilter.equals, billno)});
+                        //获取单据中附件面板信息
+                        List<Map<String,Object>> atts= AttachmentServiceHelper.getAttachments(er_publicreimbursebill,file.getPkValue().toString(),attachmentpanel);
+                        //如关联申请页签为空或关联合同页签为空或者附件为空,则在提交时进行提醒:“请关联申请,或者关联合同,或者上传附件进行报销”。
+                        DynamicObjectCollection contractentry = info.getDynamicObjectCollection("contractentry");
+                        DynamicObjectCollection writeoffapply = info.getDynamicObjectCollection("writeoffapply");
+                        if(atts.isEmpty() && contractentry.isEmpty() && writeoffapply.isEmpty()){
+                            throw new KDBizException("请关联申请,或者关联合同,或者上传附件进行报销!");
+                        }
                     }
 
                 }
 
-            }
         }
     }
 }

+ 78 - 1
src/main/java/fi/em/opplugin/TravelExpensesOpPlugin.java

@@ -1,4 +1,81 @@
 package fi.em.opplugin;
+
+import com.alibaba.fastjson.JSONObject;
+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.exception.KDBizException;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
 //差旅费用报销单
-public class TravelExpensesOpPlugin {
+public class TravelExpensesOpPlugin extends AbstractOperationServicePlugIn {
+    private static String nckd_orgamount = "nckd_orgamount"; //组织金额标识
+    private static String attachmentpanel = "attachmentpanel";//附件标识
+    private static String er_tripreimbursebill = "er_tripreimbursebill";//差旅报销单标识
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        //获取当前操作单据数组
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            JSONObject object = new JSONObject();
+            //当前单头数据包
+            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+            String billno = info.getString("billno");//报销单编号
+            //获取费用承担公司
+            DynamicObject costcompany = info.getDynamicObject("costcompany");
+            //公司编码
+            String number = costcompany.getString("number");
+            //公司id
+            BigDecimal Amount = new BigDecimal(0);
+            DynamicObjectCollection tripentry = info.getDynamicObjectCollection("tripentry");
+            //循环差旅明细分录获取报信金额
+            for (DynamicObject entryentity : tripentry) {
+
+                BigDecimal FOriAmount = entryentity.getBigDecimal("tripapporiamount");
+                Amount=Amount.add(FOriAmount);
+            }
+                //取当前循环费用明细分录的报销金额
+                //金额标准查询条件
+                QFilter nckd_orgamountFilter = new QFilter("nckd_orgfield.number", QCP.equals,number);
+                nckd_orgamountFilter.and("nckd_combofield", QCP.equals,"B");
+                nckd_orgamountFilter.and("enable", QCP.equals,"1");
+                DynamicObject[] nckd_orgamountaccount = BusinessDataServiceHelper.load(nckd_orgamount,"id,nckd_orgfield,nckd_combofield",new QFilter[] {nckd_orgamountFilter});
+                //判断组织是否维护金额,没有则查询集团金额
+                if(nckd_orgamountaccount.length == 0){
+                    nckd_orgamountFilter = new QFilter("nckd_orgfield.number", QCP.equals,"jxyh");
+                    nckd_orgamountFilter.and("nckd_combofield", QCP.equals,"B");
+                    nckd_orgamountFilter.and("enable", QCP.equals,"1");
+                    nckd_orgamountaccount = BusinessDataServiceHelper.load(nckd_orgamount,"id,nckd_orgfield,nckd_combofield",new QFilter[] {nckd_orgamountFilter});
+                }
+                //循环数组获取组织金额标准数据包  默认取组织,没有取集团
+                for (int c=0;c<nckd_orgamountaccount.length;c++){
+                    //组织金额标准数据包
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(nckd_orgamountaccount[i].getPkValue(), nckd_orgamountaccount[i].getDynamicObjectType().getName());
+                    //获取标准金额
+                    BigDecimal nckdAmountfield = dynamicObject.getBigDecimal("nckd_amountfield");
+                    //判断报销金额大于标准金额
+                    if(Amount.compareTo(nckdAmountfield) == 1){
+                        //获取单据信息,并查询单据中的附件字段
+                        DynamicObject file =BusinessDataServiceHelper.loadSingle(er_tripreimbursebill,attachmentpanel,new QFilter[]{new QFilter("billno", QFilter.equals, billno)});
+                        //获取单据中附件面板信息
+                        List<Map<String,Object>> atts= AttachmentServiceHelper.getAttachments(er_tripreimbursebill,file.getPkValue().toString(),attachmentpanel);
+                        //如关联申请页签为空或关联合同页签为空或者附件为空,则在提交时进行提醒:“请关联申请,或者关联合同,或者上传附件进行报销”。
+                        //DynamicObjectCollection contractentry = info.getDynamicObjectCollection("contractentry");
+                        DynamicObjectCollection writeoffapply = info.getDynamicObjectCollection("writeoffapply");
+                        if(atts.isEmpty() && writeoffapply.isEmpty()){
+                            throw new KDBizException("请关联申请,或者关联合同,或者上传附件进行报销!");
+                        }
+                    }
+
+                }
+        }
+    }
 }