瀏覽代碼

1.报销工作台代码插件提交

lisheng 1 天之前
父節點
當前提交
6a0f3cb54e

+ 33 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/common/ReimBillTypeEnum.java

@@ -0,0 +1,33 @@
+package nckd.jimin.jyyy.fi.common;
+
+public enum ReimBillTypeEnum {
+    APPLY(0,"申请类"),
+    PREAPAYLOAN(1,"预付借款类"),
+    REIMPAY(2,"报销付款类"),
+    REPAYRETURN(3,"退款还款类");
+
+    private int type ;
+
+    private String name ;
+
+    ReimBillTypeEnum(int type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 42 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/common/ReimDetailTypeEnum.java

@@ -0,0 +1,42 @@
+package nckd.jimin.jyyy.fi.common;
+
+import java.util.Arrays;
+
+/**
+ * 报表类型
+ */
+public enum ReimDetailTypeEnum {
+    APPLY("apply","申请中"),
+    WAIREIM("waitreim","待报销"),
+    REIMING("reiming","报销中"),
+    COMPLETE("complete","已完成"),
+    REPAY("repay","还款");
+    private String key ;
+
+    private String name ;
+
+    ReimDetailTypeEnum(String key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public static ReimDetailTypeEnum getValueByKey(String key){
+        return Arrays.stream(ReimDetailTypeEnum.values()).filter(r -> r.getKey().equals(key)).findFirst().orElse(null);
+    }
+}

+ 67 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/common/ReimWorkBillEnum.java

@@ -0,0 +1,67 @@
+package nckd.jimin.jyyy.fi.common;
+
+
+/**
+ * 涉及的单据
+ */
+public enum ReimWorkBillEnum {
+    NCKD_ER_DAILYVEHICLEB_EXT("nckd_er_dailyvehicleb_ext","er_dailyvehiclebill","用车申请单",ReimBillTypeEnum.APPLY),
+    NCKD_ER_TRIPREQBILL_EXT("nckd_er_tripreqbill_ext","er_tripreqbill","出差申请单",ReimBillTypeEnum.APPLY),
+    NCKD_ER_DAILYAPPLYBIL_EXT("nckd_er_dailyapplybil_ext","er_dailyapplybill","费用申请单",ReimBillTypeEnum.APPLY),
+    NCKD_ER_DAILYLOANBILL_EXT("nckd_er_dailyloanbill_ext","er_dailyloanbill","借款单",ReimBillTypeEnum.PREAPAYLOAN),
+    NCKD_ER_DAILYLOANBILL("nckd_er_dailyloanbill","er_prepaybill","普通预付单",ReimBillTypeEnum.PREAPAYLOAN),
+    NCKD_ER_SRMPERPAYBILL("nckd_er_srmperpaybill","er_prepaybill","采购预付单",ReimBillTypeEnum.PREAPAYLOAN),
+    nckd_er_tripreimburse_ext("nckd_er_tripreimburse_ext","er_tripreimbursebill","差旅报销单",ReimBillTypeEnum.REIMPAY),
+    NCKD_DAILYREIMBURSEBILL("nckd_dailyreimbursebill","er_publicreimbursebill","费用报销单",ReimBillTypeEnum.REIMPAY),
+    NCKD_ER_PUBLICPAYAPPLY("nckd_er_publicpayapply","er_publicreimbursebill","费用报销单",ReimBillTypeEnum.REIMPAY),
+    NCKD_ER_PUBLICSRMAPPLY("nckd_er_publicsrmapply","er_publicreimbursebill","采购付款申请单",ReimBillTypeEnum.REIMPAY),
+    NCKD_ER_OTHERFEEAPPLY("nckd_er_otherfeeapply","er_publicreimbursebill","其他付款申请单",ReimBillTypeEnum.REIMPAY),
+    NCKD_ER_PUBLICFUNDAPPLY("nckd_er_publicfundapply","er_publicreimbursebill","资金申请单",ReimBillTypeEnum.REIMPAY),
+    NCKD_ER_DAILYREIMBURS_EXT("nckd_er_dailyreimburs_ext","er_dailyreimbursebill","费用报销单",ReimBillTypeEnum.REIMPAY),
+    ER_CHECKINGPAYBILL("nckd_er_checkingpaybi_ext","er_checkingpaybill","商旅付款申请单",ReimBillTypeEnum.REIMPAY),
+    ER_REPAYMENTBILL("nckd_er_repaymentbill_ext","er_repaymentbill","退款单",ReimBillTypeEnum.REPAYRETURN),
+    NCKD_REPAYMENTBILL("nckd_repaymentbill","er_repaymentbill","还款单",ReimBillTypeEnum.REPAYRETURN);
+    private String billtype ;
+    private String entityid;
+    private String name ;
+    private ReimBillTypeEnum reimType;
+
+    ReimWorkBillEnum(String billtype, String entityid, String name, ReimBillTypeEnum reimType) {
+        this.billtype = billtype;
+        this.entityid = entityid;
+        this.name = name;
+        this.reimType = reimType;
+    }
+
+    public String getBilltype() {
+        return billtype;
+    }
+
+    public void setBilltype(String billtype) {
+        this.billtype = billtype;
+    }
+
+    public String getEntityid() {
+        return entityid;
+    }
+
+    public void setEntityid(String entityid) {
+        this.entityid = entityid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ReimBillTypeEnum getReimType() {
+        return reimType;
+    }
+
+    public void setReimType(ReimBillTypeEnum reimType) {
+        this.reimType = reimType;
+    }
+}

+ 595 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/ReimWorkBenchesDetailFormPlugin.java

@@ -0,0 +1,595 @@
+package nckd.jimin.jyyy.fi.plugin.form;
+
+import com.kingdee.bos.util.backport.Collections;
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.bill.BillShowParameter;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.dataentity.serialization.SerializationUtils;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.botp.runtime.ConvertOperationResult;
+import kd.bos.entity.botp.runtime.PushArgs;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.filter.FilterBuilder;
+import kd.bos.entity.filter.FilterCondition;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.exception.KDBizException;
+import kd.bos.form.ClientProperties;
+import kd.bos.form.ShowType;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.Search;
+import kd.bos.form.control.events.BeforeClickEvent;
+import kd.bos.form.control.events.BeforeItemClickEvent;
+import kd.bos.form.control.events.ItemClickEvent;
+import kd.bos.form.events.HyperLinkClickEvent;
+import kd.bos.form.events.HyperLinkClickListener;
+import kd.bos.form.operate.botp.Push;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.image.pojo.ImageSysInfo;
+import kd.bos.image.pojo.ViewImageVo;
+import kd.bos.imageplatform.util.SSCImageUtils;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.metadata.botp.ConvertRuleReader;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.param.ParameterReader;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.botp.ConvertServiceHelper;
+import kd.bos.servicehelper.image.ImageServiceNewHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.org.OrgViewType;
+import kd.bos.servicehelper.permission.PermissionServiceHelper;
+import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import kd.bos.svc.util.print.PrintFileUtil;
+import kd.bos.util.CollectionUtils;
+import kd.bos.util.StringUtils;
+import nckd.jimin.jyyy.fi.common.ReimDetailTypeEnum;
+import nckd.jimin.jyyy.fi.common.util.PrintPdfUtil;
+import nckd.jimin.jyyy.fi.common.util.ReceiveTicketUtils;
+
+import java.io.ByteArrayInputStream;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class ReimWorkBenchesDetailFormPlugin extends AbstractFormPlugin implements HyperLinkClickListener {
+    private static Log logger = LogFactory.getLog(ReimWorkBenchesDetailFormPlugin.class);
+    private static final String ENTITY_ENTRY = "nckd_entryentity";
+    //报销
+    private static final String BTN_REIM = "btn_reim";
+
+    //借款
+    private static final String BTN_LOAN = "btn_loan";
+
+    //还款
+    private static final String BTN_REPAY = "btn_repay";
+
+    // 打印
+    private static final String BTN_PRINT = "btn_print";
+
+    // 查看影像
+    private static final String BTN_VIEWIMAGE = "btn_viewimage";
+
+    // 查看流程图
+    private static final String BTN_VIEWFLOW = "btn_viewflow";
+
+    // 废弃
+    private static final String BTN_CANCEL = "btn_cancel";
+
+    // 刷新
+    private static final String BTN_REFRESH = "btn_refresh";
+
+    // 删除
+    private static final String BTN_DELETE = "btn_delete";
+
+    // 关闭
+    private static final String BTN_CLOSE = "btn_close";
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        this.addItemClickListeners("bar_reim");
+        EntryGrid entryGrid = this.getControl(ENTITY_ENTRY);
+        entryGrid.addHyperClickListener(this);
+    }
+
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+        loadBillData();
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+
+        updateEntryFiledTitle();
+    }
+
+    @Override
+    public void beforeItemClick(BeforeItemClickEvent evt) {
+        super.beforeItemClick(evt);
+        String itemKey = evt.getItemKey();
+        String checkMsg = checkSelectSingle();
+        if(!BTN_REFRESH.equals(itemKey)){
+            if(!com.kingdee.util.StringUtils.isEmpty(checkMsg)) {
+                getView().showTipNotification(checkMsg);
+                evt.setCancel(true);
+                return;
+            }
+        }
+
+        switch (itemKey){
+            case BTN_PRINT:
+                beforePrint(evt);
+                break;
+            case BTN_VIEWIMAGE:
+                //beforeImagePreview(evt);
+                break;
+        }
+    }
+
+    @Override
+    public void itemClick(ItemClickEvent evt) {
+        super.itemClick(evt);
+        String itemKey = evt.getItemKey();
+        List<DynamicObject> selectRowList = getSelectRows();
+        switch (itemKey){
+
+            case BTN_REIM:
+                doReim(evt);
+                break;
+            case BTN_LOAN:
+                doLoan(evt);
+                break;
+            case BTN_REPAY:
+                doRepay(evt);
+                break;
+
+            case BTN_PRINT:
+                doPrint();
+                break;
+            case BTN_VIEWIMAGE:
+                doImagePreview();
+                break;
+            case BTN_VIEWFLOW:
+                if(CollectionUtils.isNotEmpty(selectRowList)){
+                    WorkflowServiceHelper.viewFlowchart(getView().getPageId(), selectRowList.get(0).get("billid"));
+                }
+                break;
+            case BTN_CANCEL:
+                executeOperateBill("invalid","废弃");
+                break;
+            case BTN_REFRESH:
+                loadBillData();
+                getView().showSuccessNotification("刷新成功。");
+                break;
+            case BTN_DELETE:
+                executeOperateBill("delete","删除");
+                break;
+            case BTN_CLOSE:
+                executeOperateBill("closebill","关闭单据");
+                break;
+        }
+    }
+
+    protected void doReim(ItemClickEvent evt){
+        DynamicObject selectRow = getSelectRows().get(0);
+        String billtype = selectRow.getString("billtype");
+        String billid = selectRow.getString("billid");
+
+        // 出差申请单
+        if("er_tripreqbill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_tripreimbursebill");
+            return;
+        }
+
+        // 差旅借款单
+        if("er_dailyloanbill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_publicreimbursebill");
+            return;
+        }
+
+        // 外办申请单
+        if("er_dailyvehiclebill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_publicreimbursebill");
+            return;
+        }
+
+        // 费用申请
+        if("er_dailyapplybill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_publicreimbursebill");
+            return;
+        }
+
+        // 预付单
+        if("er_prepaybill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_publicreimbursebill");
+            return;
+        }
+
+        throw new KDBizException("单据无法进行报销操作。");
+    }
+
+    protected void doLoan(ItemClickEvent evt){
+        DynamicObject selectRow = getSelectRows().get(0);
+        String billtype = selectRow.getString("billtype");
+        String billid = selectRow.getString("billid");
+
+        // 出差申请单
+        if("er_tripreqbill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_dailyloanbill");
+            return;
+        }
+
+        // 差旅借款单
+        if("er_dailyloanbill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_dailyloanbill");
+            return;
+        }
+
+        // 外办申请单
+        if("er_dailyvehiclebill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_prepaybill");
+            return;
+        }
+
+        // 费用申请
+        if("er_dailyapplybill".equals(billtype)){
+            botpCreateBillOpen(billid,billtype, "er_prepaybill");
+            return;
+        }
+
+        throw new KDBizException("单据无法进行借款操作。");
+    }
+
+    protected void doRepay(ItemClickEvent evt){
+
+    }
+
+
+    protected void executeOperateBill(String operate, String operateName){
+        List<DynamicObject> selectRowList = getSelectRows();
+        if(selectRowList.size() <= 0){
+            return;
+        }
+        // 按照单据类型分组来执行
+        Map<String, List<DynamicObject>> formIdMap = selectRowList.stream().collect(Collectors.groupingBy(r -> r.getString("billtype")));
+
+        OperationResult opResult =new OperationResult();
+
+        for(Map.Entry<String, List<DynamicObject>> row : formIdMap.entrySet()){
+            String billFormId = row.getKey();
+            List<DynamicObject> billList = row.getValue();
+            List<Object> selectRowIdList = billList.stream().map(r -> Long.valueOf(r.getString("billid"))).collect(Collectors.toList());
+            // 调用操作
+            OperationResult operationResult = OperationServiceHelper.executeOperate(operate, billFormId, selectRowIdList.toArray(), OperateOption.create());
+
+            opResult.mergeOperateResult(operationResult);
+
+        }
+
+        // 全部成功弹出消息提示,否则弹出操作提示框
+        if(opResult.isSuccess()){
+            getView().showSuccessNotification(String.format("执行【%1$s】操作成功!",operateName));
+            //刷新分录
+            loadBillData();
+        }else{
+            getView().showOperationResult(opResult);
+        }
+    }
+
+
+    protected void doPrint(){
+        // 判断是否有打印条件
+        DynamicObject selectRow = getSelectRows().get(0);
+        String billid = selectRow.getString("billid");
+        String billtype = selectRow.getString("billtype");
+        String billno = selectRow.getString("billno");
+        String printTemplateId = ReceiveTicketUtils.getPrintTemplateId(null, billtype, Long.valueOf(billid));
+        String tplType = ReceiveTicketUtils.getTplTypeById(printTemplateId);
+        int tplParamType = "A".equalsIgnoreCase(tplType)?1:2;
+        byte[] printBuff = PrintPdfUtil.getPrintByte(getView().getPageId(),billtype,printTemplateId, Collections.singletonList(billid),"billForm",tplParamType);
+        String previewUrl = "tempfile/print.do?" + PrintFileUtil.saveInputStream2TempFile(billno + ".pdf", new ByteArrayInputStream(printBuff), 3600 * 2);
+        getView().openUrl(previewUrl);
+
+    }
+    protected void doImagePreview(){
+        String userID = String.valueOf(RequestContext.get().getUserId());
+        String userName = String.valueOf(RequestContext.get().getUserName());
+
+        ImageSysInfo enableImageSysInfo = null;
+        DynamicObject selectRow = getSelectRows().get(0);
+        String billType = selectRow.getString("billtype");
+        try {
+            enableImageSysInfo = SSCImageUtils.getEnableImageSysInfo();
+        } catch (Exception e) {
+            logger.error("获取影像系统异常:" + e.getMessage());
+        }
+        String imageSys;
+        if (enableImageSysInfo == null) {
+            imageSys = ResManager.loadKDString("无启用的影像系统配置,请联系系统管理员。", "ImageReview_0", "bos-image-formplugin", new Object[0]);
+            getView().showTipNotification(imageSys);
+            return;
+        }
+
+        imageSys = enableImageSysInfo.getNumber();
+        logger.info("获取到的imagesys:{}" , imageSys);
+        ViewImageVo viewImageVo = new ViewImageVo();
+        viewImageVo.setBillId(selectRow.getString("billid"));
+        viewImageVo.setUserId(userID);
+        viewImageVo.setUserName(userName);
+        viewImageVo.setMobile(false);
+        viewImageVo.setBilltype(billType);
+        viewImageVo.setImageSys(imageSys);
+        viewImageVo = ImageServiceNewHelper.viewPhoto(viewImageVo);
+        if (viewImageVo.getUrl() == null) {
+            getView().showTipNotification(viewImageVo.getMessage());
+            return;
+        }
+        String url = viewImageVo.getUrl();
+        String message = viewImageVo.getMessage();
+        if (kd.bos.util.StringUtils.isNotEmpty(message)) {
+            getView().showMessage(message);
+            return;
+        }
+        getView().openUrl(url);
+    }
+
+    @Override
+    public void beforeClick(BeforeClickEvent evt) {
+        super.beforeClick(evt);
+    }
+
+    @Override
+    public void click(EventObject evt) {
+        super.click(evt);
+    }
+
+    protected void beforePrint(BeforeItemClickEvent evt){
+        // 校验有没有打印的权限
+        Long currUserId = RequestContext.get().getCurrUserId();
+        DynamicObject selectRow = getSelectRows().get(0);
+        Long orgId = selectRow.getDynamicObject("company").getLong("id");
+        // 判断是否有打印条件
+        String billid = getSelectRows().get(0).getString("billid");
+        String billtype = selectRow.getString("billtype");
+        DynamicObject permitem = QueryServiceHelper.queryOne("perm_permitem", "id,number", new QFilter("number", QCP.equals, "QXX0014").toArray());
+        // 进行权限校验
+        int checkPermission = PermissionServiceHelper.checkPermission(currUserId, orgId, OrgViewType.Admin, "er", billtype, permitem.getString("id"));
+        if(checkPermission == 0){
+            getView().showTipNotification("没有打印单据的权限。");
+            evt.setCancel(true);
+            return;
+        }
+
+        DynamicObject params = ParameterReader.getBillParameter(billtype);
+        if(params == null){
+            return;
+        }
+        String printcondition = params.getString("printconditionvalue");
+        String printconditionname = params.getString("printcondition");
+        if(StringUtils.isEmpty(printcondition)){
+            return;
+        }
+
+        FilterCondition filterCondition = (FilterCondition) SerializationUtils.fromJsonString(printcondition, FilterCondition.class);
+        MainEntityType dt = EntityMetadataCache.getDataEntityType(billtype);
+        FilterBuilder filterBuilder = new FilterBuilder(dt, filterCondition, true);
+        filterBuilder.buildFilter(true);
+        QFilter qfFormBillParameter = filterBuilder.getQFilter();
+        boolean check = ORM.create().exists(billtype, new QFilter[]{
+                qfFormBillParameter,
+                new QFilter("id", QCP.equals, Long.valueOf(billid))
+        });
+
+        if(!check){
+            getView().showTipNotification(String.format("所选数据不符合%s打印条件,不允许打印。",printconditionname));
+            evt.setCancel(true);
+            return;
+        }
+
+    }
+    protected void beforeImagePreview(BeforeItemClickEvent evt){
+        Long currUserId = RequestContext.get().getCurrUserId();
+        DynamicObject selectRow = getSelectRows().get(0);
+        Long orgId = selectRow.getDynamicObject("company").getLong("id");
+        String billtype = selectRow.getString("billtype");
+        DynamicObject permitem = QueryServiceHelper.queryOne("perm_permitem", "id,number", new QFilter("number", QCP.equals, "QXX0097").toArray());
+        // 进行权限校验
+        int checkPermission = PermissionServiceHelper.checkPermission(currUserId, orgId, OrgViewType.Admin, "er", billtype, permitem.getString("id"));
+        if(checkPermission == 0){
+            getView().showTipNotification("没有查看影像的权限。");
+            evt.setCancel(true);
+            return;
+        }
+    }
+
+    protected void updateEntryFiledTitle(){
+
+        String reimtype = (String) getModel().getValue("reimtype");
+        ReimDetailTypeEnum reportType = ReimDetailTypeEnum.getValueByKey(reimtype);
+        if(reportType == null){
+            return;
+        }
+        EntryGrid entryGrid = this.getControl(ENTITY_ENTRY);
+        // 报销中,申请金额改成报销金额
+        if(reportType.equals(ReimDetailTypeEnum.REIMING)){
+            entryGrid.setColumnProperty("applyamount", ClientProperties.Header,new LocaleString("报销金额"));
+        }
+
+        // 已完成,申请金额改成金额
+        if(reportType.equals(ReimDetailTypeEnum.COMPLETE)){
+            entryGrid.setColumnProperty("applyamount", ClientProperties.Header,new LocaleString("金额"));
+        }
+
+        // 还款,申请金额改成还款金额
+        if(reportType.equals(ReimDetailTypeEnum.REPAY)){
+            entryGrid.setColumnProperty("applyamount", ClientProperties.Header,new LocaleString("还款金额"));
+        }
+
+    }
+
+    protected void loadBillData(){
+        String reimtype = getView().getFormShowParameter().getCustomParam("reimtype");
+        if(StringUtils.isEmpty(reimtype)){
+            return;
+        }
+
+        ReimDetailTypeEnum reportType = ReimDetailTypeEnum.getValueByKey(reimtype);
+        if(reportType == null){
+            return;
+        }
+        this.getModel().setValue("reimtype",reportType.getKey());
+        // 取值
+        DataSet billDataSet = queryDataSet(reportType);
+
+        // 更新到单据体
+        String[] fieldNames = billDataSet.getRowMeta().getFieldNames();
+        DynamicObjectCollection entryEntityCol = getModel().getEntryEntity(ENTITY_ENTRY);
+        entryEntityCol.clear();
+
+        DataEntityPropertyCollection properties = entryEntityCol.getDynamicObjectType().getProperties();
+        Iterator<Row> iterator = billDataSet.iterator();
+        while (iterator.hasNext()){
+            DynamicObject entry = entryEntityCol.addNew();
+            Row next = iterator.next();
+            for(String filedName : fieldNames){
+                if(properties.containsKey(filedName)){
+                    if("company".equals(filedName)){
+                        entry.set(filedName,BusinessDataServiceHelper.loadSingleFromCache(next.get(filedName),"bos_org"));
+                        continue;
+                    }
+                    if("applier".equals(filedName)){
+                        entry.set(filedName,BusinessDataServiceHelper.loadSingleFromCache(next.get(filedName),"bos_user"));
+                        continue;
+                    }
+                    entry.set(filedName,next.get(filedName));
+                }
+            }
+        }
+        getView().updateView(ENTITY_ENTRY);
+    }
+
+    protected  DataSet queryDataSet(ReimDetailTypeEnum reportType){
+        String quickFilter = getQuicklyQueryContent();
+        ReimWorkBenchesHelper service = new ReimWorkBenchesHelper();
+        if(reportType.equals(ReimDetailTypeEnum.APPLY)){
+            return service.queryDataApply(null,quickFilter);
+        }
+        if(reportType.equals(ReimDetailTypeEnum.WAIREIM)){
+            return service.queryDataWaitReim(null,quickFilter);
+        }
+        if(reportType.equals(ReimDetailTypeEnum.REIMING)){
+            return service.queryDataReiming(null,quickFilter);
+        }
+        if(reportType.equals(ReimDetailTypeEnum.COMPLETE)){
+            return service.queryDataComplete(null,quickFilter);
+        }
+        if(reportType.equals(ReimDetailTypeEnum.REPAY)){
+            return service.queryDataRepay(null,quickFilter);
+        }
+        return null;
+    }
+
+    protected String getQuicklyQueryContent(){
+        Search search = getView().getParentView().getControl("nckd_searchap");
+        return Optional.ofNullable(search.getSearchKey()).orElse("");
+    }
+
+    protected List<DynamicObject> getSelectRows(){
+        List<DynamicObject> selectRowList = new ArrayList<>();
+        EntryGrid entryGrid = this.getControl(ENTITY_ENTRY);
+        int[] selectRows = entryGrid.getSelectRows();
+        for(int rowIndex : selectRows){
+            selectRowList.add(getModel().getEntryRowEntity(ENTITY_ENTRY,rowIndex));
+        }
+        return selectRowList;
+    }
+
+    protected String checkSelectSingle(){
+        List<DynamicObject> selectRows = getSelectRows();
+        if(selectRows.size() == 0){
+            return "请选择要执行的数据。";
+        }
+        if(selectRows.size() > 1){
+            return "仅允许选择一条数据进行操作。";
+        }
+        return "";
+    }
+
+    @Override
+    public void hyperLinkClick(HyperLinkClickEvent event) {
+        String fieldName = event.getFieldName();
+        int rowIndex = event.getRowIndex();
+        DynamicObject entryRow = this.getModel().getEntryRowEntity(ENTITY_ENTRY, rowIndex);
+        if("billno".equals(fieldName)){
+            // 打开单据
+            BillShowParameter parameter = new BillShowParameter();
+            parameter.setFormId(entryRow.getString("billtype"));
+            parameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
+            parameter.setPkId(entryRow.getString("billid"));
+            getView().showForm(parameter);
+        }
+        if("curapprovenode".equals(fieldName)){
+            // 打开单据
+            WorkflowServiceHelper.viewFlowchart(getView().getPageId(), entryRow.getString("billid"));
+        }
+    }
+
+
+    public void botpCreateBillOpen(String sourceBillId,String sourceBillType,String targetBillType){
+        // 校验单据权限
+
+        //构建选中行数据包
+        List <ListSelectedRow> selectedRows = new ArrayList();
+        ListSelectedRow selectedRow = new ListSelectedRow(Long.valueOf(sourceBillId));
+        selectedRows.add(selectedRow);
+        //获取转换规则id
+        ConvertRuleReader read=new ConvertRuleReader();
+        List<String> loadRuleIds = read.loadRuleIds(sourceBillType, targetBillType, false);
+
+        if(CollectionUtils.isNotEmpty(loadRuleIds) && loadRuleIds.size() > 1){
+            throw new KDBizException("匹配到多条转换规则,请调整转换规则后再试。");
+        }
+        // 创建下推参数
+        PushArgs pushArgs = new PushArgs();
+        // 源单标识,必填
+        pushArgs.setSourceEntityNumber(sourceBillType);
+        // 目标单据标识,必填
+        pushArgs.setTargetEntityNumber(targetBillType);
+        // 生成转换结果报告,必填
+        pushArgs.setBuildConvReport(true);
+        //不检查目标单新增权限,非必填
+        pushArgs.setHasRight(true);
+        //传入下推使用的转换规则id,不填则使用默认规则
+        pushArgs.setRuleId(loadRuleIds.get(0));
+        //下推默认保存,必填
+        pushArgs.setAutoSave(true);
+        // 设置源单选中的数据包,必填
+        pushArgs.setSelectedRows(selectedRows);
+
+        // 执行下推操作
+        ConvertOperationResult convertResult = ConvertServiceHelper.push(pushArgs);
+        //获取下推目标单id
+
+        if (convertResult.isSuccess() && convertResult.getCachePageIds().size() + convertResult.getTargetBillIds().size() != 0) {
+            if (convertResult.getCachePageIds().size() + convertResult.getTargetBillIds().size() == 1) {
+                Push.showTargetBill(this.getView(), pushArgs, convertResult, false);
+            } else {
+                Push.showMultiTargetBills(this.getView(), pushArgs, convertResult, false);
+            }
+        }
+
+    }
+}

+ 150 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/ReimWorkBenchesFormPlugin.java

@@ -0,0 +1,150 @@
+package nckd.jimin.jyyy.fi.plugin.form;
+
+import kd.bos.algo.DataSet;
+import kd.bos.bill.OperationStatus;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.IClientViewProxy;
+import kd.bos.form.ShowType;
+import kd.bos.form.container.Tab;
+import kd.bos.form.control.Control;
+import kd.bos.form.control.Search;
+import kd.bos.form.control.events.SearchEnterEvent;
+import kd.bos.form.control.events.SearchEnterListener;
+import kd.bos.form.control.events.TabSelectEvent;
+import kd.bos.form.control.events.TabSelectListener;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import nckd.jimin.jyyy.fi.common.ReimDetailTypeEnum;
+
+import java.util.EventObject;
+
+public class ReimWorkBenchesFormPlugin extends AbstractFormPlugin implements TabSelectListener, SearchEnterListener {
+
+    // 切换报销台
+    private static final String BTN_QUICKSEARCH = "btn_quicksearch";
+
+    // 快速搜索控件
+    private static final String NCKD_SEARCHAP = "nckd_searchap";
+
+    // 页签
+    private static final String NCKD_TABAP = "nckd_tabap";
+
+    private static final String NCKD_TAB_FLAG = "nckd_tab_";
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        Tab tab = this.getControl(NCKD_TABAP);
+        tab.addTabSelectListener(this);
+
+        this.addClickListeners(BTN_QUICKSEARCH);
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+        Tab tab = this.getControl(NCKD_TABAP);
+        tab.activeTab(NCKD_TAB_FLAG + ReimDetailTypeEnum.APPLY.getKey());
+    }
+
+    @Override
+    public void click(EventObject evt) {
+        super.click(evt);
+        Control control = (Control)evt.getSource();
+        switch (control.getKey()){
+            case BTN_QUICKSEARCH:
+                quicklySearch();
+                break;
+        }
+    }
+
+    protected  void quicklySearch(){
+        // 查询数据,哪个有值就激活哪个面板
+        Tab tab = this.getControl(NCKD_TABAP);
+
+        ReimDetailTypeEnum detailType = getQucickFilterData();
+        if(detailType == null){
+            getView().showTipNotification("没有匹配的数据。");
+            return;
+        }
+        tab.activeTab(NCKD_TAB_FLAG + detailType.getKey());
+
+//        Search search = this.getControl(NCKD_SEARCHAP);
+//        search.setSearchKey(null);
+//       getView().updateView(NCKD_SEARCHAP);
+    }
+
+    /**
+     * 通过快速查询查询第一条匹配的数据
+     * @return
+     */
+    protected ReimDetailTypeEnum getQucickFilterData(){
+        ReimWorkBenchesHelper service = new ReimWorkBenchesHelper();
+        ReimDetailTypeEnum[] detailTypeArray = ReimDetailTypeEnum.values();
+        Search search = this.getControl(NCKD_SEARCHAP);
+        String quickFilter = search.getSearchKey();
+        for(ReimDetailTypeEnum detailType : detailTypeArray){
+
+            if(detailType.equals(ReimDetailTypeEnum.APPLY)){
+                DataSet rows = service.queryDataApply(null, quickFilter);
+                if(rows.hasNext()){
+                    return detailType;
+                }
+            }
+
+            if(detailType.equals(ReimDetailTypeEnum.WAIREIM)){
+                DataSet rows = service.queryDataWaitReim(null, quickFilter);
+                if(rows.hasNext()){
+                    return detailType;
+                }
+            }
+
+            if(detailType.equals(ReimDetailTypeEnum.REIMING)){
+                DataSet rows = service.queryDataReiming(null, quickFilter);
+                if(rows.hasNext()){
+                    return detailType;
+                }
+            }
+
+
+            if(detailType.equals(ReimDetailTypeEnum.COMPLETE)){
+                DataSet rows = service.queryDataComplete(null, quickFilter);
+                if(rows.hasNext()){
+                    return detailType;
+                }
+            }
+
+            if(detailType.equals(ReimDetailTypeEnum.REPAY)){
+                DataSet rows = service.queryDataRepay(null, quickFilter);
+                if(rows.hasNext()){
+                    return detailType;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void tabSelected(TabSelectEvent event) {
+        String tabKey = event.getTabKey();
+        // 搜索控件搜索的关键字
+        FormShowParameter params = new FormShowParameter();
+        params.setFormId("nckd_reimbenchesdetail");
+        params.getOpenStyle().setShowType(ShowType.InContainer);
+        params.getOpenStyle().setTargetKey(tabKey);
+        params.setCustomParam("reimtype",tabKey.replace(NCKD_TAB_FLAG,""));
+        params.setStatus(OperationStatus.VIEW);
+        getView().showForm(params);
+
+    }
+
+    @Override
+    public void search(SearchEnterEvent event) {
+//        Search search = (Search)event.getSource();
+//        String key = search.getKey();
+//        String text = event.getText();
+//        // 查询单据,判断单据属于哪个页签,然后打开响应页签
+//        if(NCKD_TABAP.equals(key)){
+//            quicklySearch();
+//        }
+    }
+}

+ 413 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/ReimWorkBenchesHelper.java

@@ -0,0 +1,413 @@
+package nckd.jimin.jyyy.fi.plugin.form;
+
+import com.grapecity.documents.excel.Q;
+import kd.bos.algo.Algo;
+import kd.bos.algo.DataSet;
+import kd.bos.algo.DataType;
+import kd.bos.algo.RowMeta;
+import kd.bos.context.RequestContext;
+import kd.bos.entity.report.FilterInfo;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import kd.bos.util.CollectionUtils;
+import kd.bos.util.StringUtils;
+import kd.bos.workflow.api.BizProcessStatus;
+import nckd.jimin.jyyy.fi.common.util.CommonUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class ReimWorkBenchesHelper {
+
+    private static final Log logger = LogFactory.getLog(ReimWorkBenchesHelper.class);
+
+    /**
+     * 用车申请单、费用申请单、出差申请单、差旅借款单、借款单、预付单
+     * @param filterList
+     * @param quickFilter
+     * @return
+     */
+    public DataSet queryDataApply(List<QFilter> filterList , String quickFilter){
+        List<DataSet> dataSetList = new ArrayList<>();
+        List<QFilter> commonFilterList = new ArrayList<>();
+        commonFilterList.add(getProjectPersonFilter());
+        if(CollectionUtils.isNotEmpty(filterList)){
+            commonFilterList.addAll(filterList);
+        }
+        if(StringUtils.isNotEmpty(quickFilter)){
+            commonFilterList.add(new QFilter("billno", QCP.like,"%"+ quickFilter +"%")
+                    .or(new QFilter("description",QCP.like,"%"+ quickFilter +"%")));
+        }
+
+        // 显示暂存、已提交、审核中、审核未通过的申请类单据
+        List<QFilter> applierFilter = new ArrayList<>();
+        applierFilter.add(new QFilter("billstatus",QCP.in,new String[]{"A","B","C","D"}));
+        applierFilter.addAll(commonFilterList);
+
+
+        DataSet dailyVehHeadDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyvehiclebill",
+                "id billid,bizdate applydate,'er_dailyvehiclebill' billtype,'er_dailyvehiclebill' pageid,billno billno,description description,null expenseamount," +
+                        "null approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                applierFilter.toArray(new QFilter[0]), "");
+
+        DataSet tripReqDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_tripreqbill",
+                "id billid,bizdate applydate,'er_tripreqbill' billtype,'er_tripreqbill' pageid,billno billno,description description,null applyamount," +
+                        "null approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                applierFilter.toArray(new QFilter[0]), "");
+
+        DataSet dailyApplyDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyapplybill",
+                "id billid,bizdate applydate,'er_dailyapplybill' billtype,'er_dailyapplybill' pageid,billno billno,description description,applyamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,company.id company,applier.id applier",
+                applierFilter.toArray(new QFilter[0]), "");
+
+        dataSetList.add(getTaskApproveData(dailyVehHeadDataSet));
+        dataSetList.add(getTaskApproveData(tripReqDataSet));
+        dataSetList.add(getTaskApproveData(dailyApplyDataSet));
+
+        // 显示暂存、已提交、审核中、审核未通过、等待付款,或者审核通过(未付金额>0、借款余额=0)的借款预付类单据。
+        List<QFilter> loanPayFilter = new ArrayList<>();
+        QFilter auditStatusFilter = new QFilter("billstatus", QCP.equals, "E")
+                .and(new QFilter("notpayamount", QCP.large_than, BigDecimal.ZERO))
+                .and(new QFilter("balanceamount", QCP.equals, BigDecimal.ZERO));
+        loanPayFilter.add(new QFilter("billstatus",QCP.in,new String[]{"A","B","C","D","F"}).or(auditStatusFilter));
+        loanPayFilter.addAll(commonFilterList);
+
+        DataSet dailyloanDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyloanbill",
+                "id billid,bizdate applydate,'er_dailyloanbill' billtype,'er_dailyloanbill' pageid,billno billno,description description,loanamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                loanPayFilter.toArray(new QFilter[0]), "");
+
+        DataSet prepayBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_prepaybill",
+                "id billid,bizdate applydate,'er_prepaybill' billtype,case when nckd_pageid = 'nckd_er_srmperpaybill' then 'nckd_er_srmperpaybill' else 'nckd_er_dailyloanbill' end pageid," +
+                        "billno billno,description description,loanamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,company.id company,applier.id applier",
+                loanPayFilter.toArray(new QFilter[0]), "");
+
+
+        dataSetList.add(getTaskApproveData(dailyloanDataSet));
+        dataSetList.add(getTaskApproveData(prepayBillDataSet));
+
+        return CommonUtils.joinDataSetList(dataSetList);
+    }
+
+
+    /**
+     * 用车申请单、费用申请单、出差申请单、差旅借款单、借款单、预付单。
+     * @param filterList
+     * @param quickFilterStr
+     * @return
+     */
+    public DataSet queryDataWaitReim(List<QFilter> filterList  , String quickFilterStr){
+
+        List<DataSet> dataSetList = new ArrayList<>();
+
+        QFilter projectPersonFilter = getProjectPersonFilter();
+
+        QFilter quickFilter = null;
+        if(StringUtils.isNotEmpty(quickFilterStr)){
+            quickFilter = new QFilter("billno",QCP.like,"%"+ quickFilterStr +"%")
+                    .or(new QFilter("description",QCP.like,"%"+ quickFilterStr +"%"));
+        }
+
+        // 显示审核通过(可用余额>0)的申请类单据
+        QFilter applyStatusFilter = new QFilter("billstatus", QCP.equals, "E");
+        // 确认可用余额的取值逻辑
+        DataSet dailyVehDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyvehiclebill",
+                "id billid,bizdate applydate,'er_dailyvehiclebill' billtype,'er_dailyvehiclebill' pageid,billno billno,description description,null applyamount," +
+                        "null approveamount,null balanceamount,billstatus billstatus,company.id costcompany,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,applyStatusFilter), "");
+
+        DataSet tripReqDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_tripreqbill",
+                "id billid,bizdate applydate,'er_tripreqbill' billtype,'er_tripreqbill' pageid,billno billno,description description,null applyamount," +
+                        "null approveamount,null balanceamount,billstatus billstatus,company.id costcompany,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,applyStatusFilter), "");
+
+        DataSet dailyApplyDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyapplybill",
+                "id billid,bizdate applydate,'er_dailyapplybill' billtype,'er_dailyapplybill' pageid,billno billno,description description,applyamount applyamount," +
+                        "approveamount approveamount,null balanceamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,applyStatusFilter), "");
+        dataSetList.add(dailyVehDataSet);
+        dataSetList.add(tripReqDataSet);
+        dataSetList.add(dailyApplyDataSet);
+
+        // 显示审核通过(借款余额>0)、已付款(借款余额>0)的借款预付类单据
+        QFilter loanPayFilter = new QFilter("billstatus",QCP.in,new String[]{"E","G"})
+                .and(new QFilter("balanceamount", QCP.large_than, BigDecimal.ZERO));
+
+        DataSet dailyloanDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyloanbill",
+                "id billid,bizdate applydate,'er_dailyloanbill' billtype,'er_dailyloanbill' pageid,billno billno,description description,loanamount applyamount," +
+                        "approveamount approveamount,balanceamount balanceamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,loanPayFilter), "");
+
+        DataSet prepayBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_prepaybill",
+                "id billid,bizdate applydate,'er_prepaybill' billtype,case when nckd_pageid = 'nckd_er_srmperpaybill' then 'nckd_er_srmperpaybill' else 'nckd_er_dailyloanbill' end pageid,billno billno,description description,loanamount applyamount," +
+                        "approveamount approveamount,balanceamount balanceamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,loanPayFilter), "");
+
+        dataSetList.add(dailyloanDataSet);
+        dataSetList.add(prepayBillDataSet);
+
+        return CommonUtils.joinDataSetList(dataSetList);
+    }
+
+    /**
+     * 费用报销单、差旅费报销单、对公费用报销单、商旅付款申请单
+     * @param filterList
+     * @param quickFilterStr
+     * @return
+     */
+    public DataSet queryDataReiming(List<QFilter> filterList , String quickFilterStr){
+        long currUserId = RequestContext.get().getCurrUserId();
+        List<DataSet> dataSetList = new ArrayList<>();
+        QFilter projectPersonFilter = getProjectPersonFilter();
+        QFilter quickFilter = null;
+        if(StringUtils.isNotEmpty(quickFilterStr)){
+            quickFilter = new QFilter("billno",QCP.like,"%"+ quickFilterStr +"%")
+                    .or(new QFilter("description",QCP.like,"%"+ quickFilterStr +"%"));
+        }
+
+        QFilter statusFilter = new QFilter("billstatus",QCP.in,new String[]{"A","B","C","D","E","F"});
+
+        DataSet dailyReimBurseDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyreimbursebill",
+                "id billid,bizdate applydate,'er_dailyreimbursebill' billtype,'er_dailyreimbursebill' pageid,billno billno,description description,reimburseamount applyamount," +
+                        "approveamount approveamount,payamount payamount,notpayamount notpayamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,statusFilter), "");
+
+        //显示暂存、已提交、审核中、审核未通过、审核通过、等待付款的报销类单据。
+        DataSet tripReimBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_tripreimbursebill",
+                "id billid,bizdate applydate,'er_tripreimbursebill' billtype,'er_tripreimbursebill' pageid,billno billno,description description,amount applyamount," +
+                        "approveamount approveamount,encashamount payamount,notpayamount notpayamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,statusFilter), "");
+
+        // 付现金额、未付金额逻辑待确认
+        DataSet publicReimBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_publicreimbursebill",
+                "id billid,bizdate applydate,'er_publicreimbursebill' billtype,case when trim(nckd_pageid) != '' then nckd_pageid else 'nckd_dailyreimbursebill' end pageid," +
+                        "billno billno,description description,reimburseamount applyamount," +
+                        "approveamount approveamount,reimburseamount payamount,notpayamount notpayamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,statusFilter), "");
+
+        QFilter checkFilter = null;
+        if(StringUtils.isNotEmpty(quickFilterStr)){
+            checkFilter = new QFilter("billno",QCP.like,"%"+ quickFilterStr +"%").or(new QFilter("applyexplain",QCP.like,"%"+ quickFilterStr +"%"));
+        }
+        DataSet checkingPayBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_checkingpaybill",
+                "id billid,bizdate applydate,'er_checkingpaybill' billtype,'er_checkingpaybill' pageid,billno billno,applyexplain description,totalamount_head applyamount," +
+                        "totalamount_head approveamount,payamount payamount,totalamount_head-payamount notpayamount,billstatus billstatus,company.id company,applier.id applier",
+                getFilterArr(new QFilter("applier", QCP.equals,currUserId), checkFilter, statusFilter), "");
+
+        dataSetList.add(getTaskApproveData(tripReimBillDataSet));
+        dataSetList.add(getTaskApproveData(publicReimBillDataSet));
+        dataSetList.add(getTaskApproveData(dailyReimBurseDataSet));
+        dataSetList.add(getTaskApproveData(checkingPayBillDataSet));
+        return CommonUtils.joinDataSetList(dataSetList);
+    }
+
+    /**
+     * 用车申请单、费用申请单、出差申请单、差旅借款单、借款单、预付单、费用报销单、差旅费报销单、对公费用报销单、商旅付款申请单
+     * @param filterList
+     * @param quickFilterStr
+     * @return
+     */
+    public DataSet queryDataComplete(List<QFilter> filterList , String quickFilterStr){
+        long currUserId = RequestContext.get().getCurrUserId();
+        List<DataSet> dataSetList = new ArrayList<>();
+
+        QFilter projectPersonFilter = getProjectPersonFilter();
+        QFilter quickFilter = null;
+        if(StringUtils.isNotEmpty(quickFilterStr)){
+            quickFilter = new QFilter("billno",QCP.like,"%"+ quickFilterStr +"%")
+                    .or(new QFilter("description",QCP.like,"%"+ quickFilterStr +"%"));
+        }
+
+        // 显示已废弃、已关闭、审核未通过、审核通过(可用余额=0)的申请类单据。
+        QFilter applyBillStatusFilter = new QFilter("billstatus", QCP.in, new String[]{"H", "I", "D","E"});
+
+        DataSet dailyVehDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyvehiclebill",
+                "id billid,bizdate applydate,'er_dailyvehiclebill' billtype,'er_dailyvehiclebill' pageid,billno billno,description description,null applyamount," +
+                        "null approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,applyBillStatusFilter), "");
+
+        DataSet tripReqDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_tripreqbill",
+                "id billid,bizdate applydate,'er_tripreqbill' billtype,'er_tripreqbill' pageid,billno billno,description description,null applyamount," +
+                        "null approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,applyBillStatusFilter), "");
+
+        DataSet dailyApplyDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyapplybill",
+                "id billid,bizdate applydate,'er_dailyapplybill' billtype,'er_dailyapplybill' pageid,billno billno,description description,applyamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,applyBillStatusFilter), "");
+        dataSetList.add(dailyVehDataSet);
+        dataSetList.add(tripReqDataSet);
+        dataSetList.add(dailyApplyDataSet);
+
+        //已废弃、已关闭、审核未通过、审核通过(借款余额=0)、已付款(借款余额=0)的借款预付类单据。
+        QFilter prepayBillStatusFilter = new QFilter("billstatus", QCP.in, new String[]{"H", "I", "D"})
+                .or(new QFilter("billstatus", QCP.in, new String[]{"E","G"}).and(new QFilter("balanceamount", QCP.equals, BigDecimal.ZERO)));
+
+        DataSet dailyloanDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyloanbill",
+                "id billid,bizdate applydate,'er_dailyloanbill' billtype,'er_dailyloanbill' pageid, billno billno,description description,loanamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,prepayBillStatusFilter), "");
+
+        DataSet prepayBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_prepaybill",
+                "id billid,bizdate applydate,'er_prepaybill' billtype,case when nckd_pageid = 'nckd_er_srmperpaybill' then 'nckd_er_srmperpaybill' else 'nckd_er_dailyloanbill' end pageid," +
+                        "billno billno,description description,loanamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,prepayBillStatusFilter), "");
+        dataSetList.add(dailyloanDataSet);
+        dataSetList.add(prepayBillDataSet);
+        // 显示已废弃、已关闭、审核未通过、已付款的报销类单据。
+        QFilter reimBillStatusFilter = new QFilter("billstatus", QCP.in, new String[]{"H", "I", "D","G"});
+        DataSet tripReimBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_tripreimbursebill",
+                "id billid,bizdate applydate,'er_tripreimbursebill' billtype,'er_tripreimbursebill' pageid,billno billno,description description,amount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,reimBillStatusFilter), "");
+
+        DataSet publicReimBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_publicreimbursebill",
+                "id billid,bizdate applydate,'er_publicreimbursebill' billtype,case when trim(nckd_pageid) != '' then nckd_pageid else 'nckd_dailyreimbursebill' end pageid," +
+                        "billno billno,description description,reimburseamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,reimBillStatusFilter), "");
+
+        DataSet dailyReimBurseDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_dailyreimbursebill",
+                "id billid,bizdate applydate,'er_dailyreimbursebill' billtype,'er_dailyreimbursebill' pageid,billno billno,description description,reimburseamount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,costcompany.id company,applier.id applier",
+                getFilterArr(projectPersonFilter,quickFilter,reimBillStatusFilter), "");
+
+
+        QFilter checkFilter = null;
+        if(StringUtils.isNotEmpty(quickFilterStr)){
+            checkFilter = new QFilter("billno",QCP.like,"%"+ quickFilterStr +"%").or(new QFilter("applyexplain",QCP.like,"%"+ quickFilterStr +"%"));
+        }
+        DataSet checkingPayBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_checkingpaybill",
+                "id billid,bizdate applydate,'er_checkingpaybill' billtype,'er_checkingpaybill' pageid,billno billno,applyexplain description,payamount applyamount," +
+                        "payamount approveamount,billstatus billstatus,company.id company,applier.id applier",
+                getFilterArr(new QFilter("applier", QCP.equals,currUserId), checkFilter, reimBillStatusFilter), "");
+
+        dataSetList.add(tripReimBillDataSet);
+        dataSetList.add(publicReimBillDataSet);
+        dataSetList.add(dailyReimBurseDataSet);
+        dataSetList.add(checkingPayBillDataSet);
+
+        return CommonUtils.joinDataSetList(dataSetList);
+    }
+
+    public DataSet queryDataRepay(List<QFilter> filterList , String quickFilter){
+        List<QFilter> commonFilterList = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(filterList)){
+            commonFilterList.addAll(filterList);
+        }
+        if(StringUtils.isNotEmpty(quickFilter)){
+            commonFilterList.add(new QFilter("billno",QCP.like,"%"+ quickFilter +"%")
+                    .or(new QFilter("description",QCP.like,"%"+ quickFilter +"%")));
+        }
+
+        List<QFilter> repayFilter = new ArrayList<>();
+        repayFilter.add(new QFilter("billstatus",QCP.in,new String[]{"A","B","C","D","E","G"}));
+        repayFilter.addAll(commonFilterList);
+
+        DataSet repaymentBillDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "er_repaymentbill",
+                "id billid,repaymentdate applydate,'er_repaymentbill' billtype,case when trim(nckd_pageid) != '' then nckd_pageid else 'nckd_repaymentbill' end pageid," +
+                        "billno billno,description description,amount applyamount," +
+                        "approveamount approveamount,billstatus billstatus,company.id company,applier.id applier",
+                repayFilter.toArray(new QFilter[0]), "");
+        return getTaskApproveData(repaymentBillDataSet);
+    }
+    protected DataSet getPrePayBillLoanData(DataSet dt , String entity){
+        Set billIdSet = CommonUtils.getFiledFromDataSet(dt, "billid");
+
+        DataSet sumAmountDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), entity,
+                        "id billid,accountentry.accbalamount accbalamount",
+                        new QFilter("id",QCP.in,billIdSet).toArray(), "")
+                .groupBy(new String[]{"billid"})
+                .sum("accbalamount").finish();
+        return dt.leftJoin(sumAmountDataSet).on("billid","billid")
+                .select(dt.getRowMeta().getFieldNames() , new String[]{"accbalamount"}).finish();
+    }
+
+
+
+
+    protected DataSet getTaskApproveData(DataSet dt){
+        Set<Object> billIdSet = CommonUtils.getFiledFromDataSet(dt, "billid");
+
+        Map<String,String> approveStep = getApproveStep(billIdSet.stream().map(r -> r.toString()).collect(Collectors.toSet()));
+        Map<String, DataType> fieldMap = new LinkedHashMap<>();
+        fieldMap.put("billid",DataType.LongType);
+        fieldMap.put("curapprovenode",DataType.StringType);
+        //值域行,字段标识和类型与fieldMap一一对应
+        List<Object[]> rowData = new ArrayList<>();
+        approveStep.forEach((key,value) ->{
+            rowData.add(new Object[]{Long.valueOf(key), value});
+        });
+
+        // 构建dataSet
+        DataSet dataSet= Algo.create(this.getClass().getName())
+                .createDataSet(rowData, new RowMeta(fieldMap.keySet().toArray(new String[0]), fieldMap.values().toArray(new DataType[0])));
+
+
+        return dt.leftJoin(dataSet).on("billid","billid")
+                .select(dt.getRowMeta().getFieldNames(),new String[]{"curapprovenode"}).finish();
+    }
+
+    public Map<String , String> getApproveStep(Set<String> billIdSet){
+        Map<String , String> approveStepMap = new HashMap<>();
+
+        Map<String, List<BizProcessStatus>> allProcessMap = WorkflowServiceHelper.getBizProcessStatus(billIdSet.toArray(new String[0]));
+        for(Map.Entry<String, List<BizProcessStatus>> dataRow : allProcessMap.entrySet()){
+            List<BizProcessStatus> node = dataRow.getValue();
+            int count = 0;
+            String nodeName = "";
+            StringBuilder participantName = new StringBuilder();
+            StringBuilder msg = new StringBuilder();
+            try {
+                for (BizProcessStatus e : node) {
+                    nodeName = e.getCurrentNodeName();
+                    String auditor = e.getParticipantName();
+                    e.getProcessStatus();
+                    if (auditor != null && !"".equals(auditor.trim())) {
+                        participantName.append(",");
+                        participantName.append(auditor);
+                        if (++count == 3) {
+                            participantName.append("...");
+                            break;
+                        }
+                        continue;
+                    }
+                }
+                if (!org.apache.commons.lang3.StringUtils.isBlank(nodeName)) {
+                    msg.append(nodeName);
+                    if (!org.apache.commons.lang3.StringUtils.isBlank(participantName)) {
+                        msg.append('/');
+                        msg.append(participantName.toString().replaceFirst(",", ""));
+                    }
+                }
+                approveStepMap.put(dataRow.getKey(),msg.toString());
+            }
+            catch (Exception e2) {
+                logger.info("ErWorkFlowFlexListForOtherPlugin>>>获取审批人出现异常: " + e2.getMessage());
+            }
+        }
+        return approveStepMap;
+    }
+
+    public QFilter getProjectPersonFilter(){
+        long currUserId = RequestContext.get().getCurrUserId();
+        return new QFilter("projectower.fbasedataid", QCP.equals,currUserId);
+    }
+
+    public QFilter[] getFilterArr(QFilter... filters){
+        List<QFilter> filterList = new ArrayList<>(filters.length);
+        for(QFilter filter : filters){
+            if(filter != null){
+                filterList.add(filter);
+            }
+        }
+        return filterList.toArray(new QFilter[0]);
+    }
+}