Browse Source

gn_approval

cldu 6 months ago
parent
commit
2d0efe5771

+ 2 - 1
config/index.js

@@ -37,7 +37,8 @@ module.exports = {
     assetsPublicPath: '/',
     proxyTable:{
 		'/adminapi': {
-      target: "http://gneta.hzinsights.com",
+      target: "http://192.168.77.27:8601", //本地
+      // target: "http://gneta.hzinsights.com",
       // target: "http://192.168.77.27:8606",
 			// secure:false,  // 如果是https接口,需要配置这个参数
 			changeOrigin:true, // 如果接口跨域,需要进行这个参数配置

+ 159 - 0
src/api/modules/approve.js

@@ -222,4 +222,163 @@ export const approveInterence = {
         return http.post("/smart_report/approve/cancel",params)
     },
 
+    /*------------bi看板审批接口----------- */
+     /**
+     * 获取审批流列表
+     * @param {Object} params 
+     * @param {Number} params.PageSize
+     * @param {Number} params.CurrentIndex
+     * @param {Number} params.ClassifyId 关联报告二级分类ID
+     * @param {String} params.Keyword
+     * @param {Number} params.SortRule 排序方式: 1-正序; 2-倒序(默认)
+     * @returns 
+     */
+     getBiApproveFlowList(params){
+        return http.get("/bi_approve/flow/list",params)
+    },
+
+    getBiApproveClassifyTree(params){
+        return http.get("/bi_approve/classify/list",params)
+    },
+
+    /**
+     * 删除审批流
+     * @param {Object} params 
+     * @param {Number} params.BiApproveFlowId
+     * @returns 
+     */
+    deleteBiApproveFlow(params){
+        return http.post("/bi_approve/flow/remove",params)
+    },
+
+    /**
+     * 新增审批流
+     * @param {Object} params 
+     * @param {number} params.BiApproveFlowId 0
+     * @param {String} params.FlowName 审批流名称
+     * @param {Number} params.ClassifyId 分类ID
+     * @param {Object[]} params.Nodes 审批节点
+     * @param {Number} params.Nodes[].ApproveType 审批类型:1-依次审批;2-会签;3-或签
+     * @param {Object[]} params.Nodes[].Users 审批人信息
+     * @param {String} params.Nodes[].Users[].UserType 审批人类型: user-用户; role-角色
+     * @param {Number} params.Nodes[].Users[].UserId 用户/角色ID
+     * @param {String} params.Nodes[].Users[].UserName 用户/角色姓名
+     * @returns 
+     */
+    addNewBiApproveFlow(params){
+        return http.post("/bi_approve/flow/add",params)
+    },
+
+    /**
+     * 编辑审批流
+     * @param {Object} params 
+     * @param {number} params.BiApproveFlowId id
+     * @param {String} params.FlowName 审批流名称
+     * @param {Number} params.ClassifyId 分类ID
+     * @param {Object[]} params.Nodes 审批节点
+     * @param {Number} params.Nodes[].ApproveType 审批类型:1-依次审批;2-会签;3-或签
+     * @param {Object[]} params.Nodes[].Users 审批人信息
+     * @param {String} params.Nodes[].Users[].UserType 审批人类型: user-用户; role-角色
+     * @param {Number} params.Nodes[].Users[].UserId 用户/角色ID
+     * @param {String} params.Nodes[].Users[].UserName 用户/角色姓名
+     * @returns 
+     */
+    editBiApproveFlow(params){
+        return http.post("/bi_approve/flow/edit",params)
+    },
+
+    /**
+     * 审批流详情
+     * @param {Object} params 
+     * @param {Number} params.BiApproveFlowId
+     * @returns 
+     */
+    getBiApproveFlowDetail(params){
+        return http.get("/bi_approve/flow/detail",params)
+    },
+
+
+    /**
+     * bi审批消息通知
+     * @param {Object} params 
+     * @param {Number} params.PageSize
+     * @param {Number} params.CurrentIndex
+     * @returns 
+     */
+    getBiApproveMsgList(params){
+        return http.get("/bi_approve/message/list",params)
+    },
+
+    /**
+     * 消息通知已读
+     * @param {Object} params 
+     * @param {Number} params.MessageId
+     * @returns 
+     */
+    readBiApproveMsg(params){
+        return http.post("/bi_approve/message/read",params)
+    },
+    
+
+    /**
+     * 获取bi看板审批列表
+     * @param {Object} params 
+     * @param {Number} params.PageSize
+     * @param {Number} params.CurrentIndex
+     * @param {Number} params.ClassifyId  目录id
+     * @param {String} params.Keyword
+     * @param {Number} params.SortRule 排序方式: 1-正序; 2-倒序(默认)
+     * @param {Number} params.SortField 排序字段:1-提交时间;2-处理时间;3-审批时间
+     * @param {Number} params.ListType 列表类型:1-待处理;2-已处理;3-我发起的
+     * @param {Number} params.ApproveState 审批状态:1-待审批;2-已审批/已通过;3-已驳回;4-已撤回/已撤销
+     * @param {Number} params.TimeType 时间类型:1-提交时间;2-处理时间;3-审批时间
+     * @param {String} params.StartTime 开始时间
+     * @param {String} params.EndTime 结束时间
+     * @returns 
+     */
+    getBiApproveList(params){
+        return http.get("/bi_approve/list",params)
+    },
+
+    /**
+     * bi看板驳回审批
+     * @param {Object} params 
+     * @param {Number} params.BiApproveId
+     * @param {String} params.ApproveRemark
+     * @returns 
+     */
+    rejectBiApprove(params){
+        return http.post("/bi_approve/refuse",params)
+    },
+
+    /**
+     * bi通过审批
+     * @param {Object} params 
+     * @param {Number} params.BiApproveId
+     * @returns 
+     */
+    passBiApprove(params){
+        return http.post("/bi_approve/approve",params)
+    },
+
+    /**
+     * bi撤销审批
+     * @param {Object} params 
+     * @param {Number} params.BiApproveId
+     * @returns 
+     */
+    cancelBiApprove(params){
+        return http.post("/bi_approve/cancel",params)
+    },
+
+    /**
+     * 获取bi审批详情
+     * @param {Object} params
+     * @param {Number} params.BiApproveId
+     * @returns 
+     */
+    getBiApproveDetail(params){
+        return http.get("/bi_approve/detail",params)
+    },
+
 }

+ 48 - 15
src/components/notificationMsg.vue

@@ -8,8 +8,12 @@
             <div class="notifation-wrap">
                 <!-- 防止tabs在popover前渲染,会导致tab选中状态不正确 -->
                 <el-tabs v-model="activeName" v-if="visible" @tab-click="getMsgList">
-                    <el-tab-pane :label="`${$t('AprrovalPage.research_approval_btn')}${activeName==='first'?'('+UnreadTotal+')':''}`" name="first"></el-tab-pane>
-                    <el-tab-pane :label="`${$t('SystemManage.OperateAuth.label_notice_title')}${activeName==='second'?'('+UnreadTotal+')':''}`" name="second"></el-tab-pane>
+                    <!-- 研报审批 -->
+                    <el-tab-pane v-if="tabsShow.first" :label="`${$t('AprrovalPage.research_approval_btn')}${activeName==='first'?'('+UnreadTotal+')':''}`" name="first"></el-tab-pane>
+                    <!-- 看板审批 -->
+                    <el-tab-pane v-if="tabsShow.second" :label="`${$t('SystemManage.BaseConfig.board_approval')}${activeName==='second'?'('+UnreadTotal+')':''}`" name="second"></el-tab-pane>
+                    <!-- 资产数据 -->
+                    <el-tab-pane v-if="tabsShow.third" :label="`${$t('SystemManage.OperateAuth.label_notice_title')}${activeName==='third'?'('+UnreadTotal+')':''}`" name="third"></el-tab-pane>
                 </el-tabs>
                 <div class="massage-list" v-if="visible">
                     <div class="message-item" :class="{'IsRead':item.IsRead}" v-for="item in msgList" :key="item.Id" @click="readMsg(item)">
@@ -23,6 +27,8 @@
                             </div>
                             <!-- 审批内容 -->
                             <div class="content" v-if="activeName==='first'">{{item.Remark||''}}&nbsp;</div>
+                            <!-- 看板审批 内容部分-->
+                            <div class="content" v-else-if="activeName==='second'">{{item.Remark||''}}&nbsp;</div>
                             <!-- 权限内容 -->
                             <div class="content" v-else>
                                 {{item.Remark||''}}
@@ -118,6 +124,7 @@
 <script>
 import {approveInterence} from '@/api/modules/approve.js';
 import { operateAuthInterface } from '@/api/modules/setApi';
+import {etaBaseConfigInterence} from '@/api/modules/etaBaseConfigApi.js';
 import mDialog from './mDialog.vue';
 export default {
     components: { mDialog },
@@ -141,7 +148,12 @@ export default {
                 isAuthSet: false,//true权限设置 false资产转移
                 Source: 1,
                 SubSource: 0,
-            }
+            },
+            tabsShow:{
+              first:false, //研报
+              second:false, //BI
+              third:true, //资产
+            },
         };
     },
     computed: {
@@ -184,8 +196,9 @@ export default {
         },
     },
     watch:{
-        visible(val){
+        async visible(val){
             if(val){
+               await this.handleTabs()
                 this.getMsgList()
             }
         },
@@ -202,29 +215,42 @@ export default {
         }
     },
     methods:{
+        async handleTabs(){
+            return new Promise(async resolve=>{
+                const res = await etaBaseConfigInterence.getBaseConfig()
+                if(res.Ret != 200) return;
+                const {IsReportApprove='',ReportApproveType='',IsBIApprove=''} = res.Data
+                let isETAApprove = (IsReportApprove==='true'?true:false) && ReportApproveType==='eta'
+                let IsBIApprove_v = IsBIApprove==='true'?true:false
+                
+                if(isETAApprove) this.tabsShow.first = true;
+                if(IsBIApprove_v) this.tabsShow.second = true;
+                this.activeName = Object.entries(this.tabsShow).filter(_=>_[1])[0][0] || 'third'; //默认选中第一个显示的tab
+                resolve()
+            })
+        },
         async readMsg(msg){
-            const {ApproveState,ReportApproveId,Id,DataPermissionMessageId} = msg
-            
-            const res = this.activeName === 'first' 
-                ? await approveInterence.readApproveMsg({
-                    MessageId:Id
-                  })
-                : await operateAuthInterface.redMessage({ MessageId: DataPermissionMessageId })
+            const res = this.activeName === 'first'    
+                ? await approveInterence.readApproveMsg({MessageId:msg.Id})
+                : this.activeName === 'second' ? approveInterence.readBiApproveMsg({MessageId:msg.Id})
+                  : await operateAuthInterface.redMessage({ MessageId: msg.DataPermissionMessageId })
 
             if(res.Ret!==200) return 
             this.getMsgList()
             this.getUnreadNum()
 
-            if(this.activeName === 'first' ) {
-                const type = ApproveState===1?'approve':ApproveState===4?'detail':'myself'
+            if(this.activeName === 'first' || this.activeName === 'second'){
+                const type = msg.ApproveState===1?'approve':msg.ApproveState===4?'detail':'myself' 
                 this.$router.push({
                     path:'/approveDetail',
                     query:{
+                        mainType:this.activeName === 'first' ? 'report' :'bi',
                         type,
-                        approveId:ReportApproveId
+                        approveId:this.activeName === 'first' ? msg.ReportApproveId :msg.BiApproveId, 
                     }
                 })
             }
+            
         },
         async getMsgList(){
             const res = this.activeName === 'first' 
@@ -232,10 +258,17 @@ export default {
                     CurrentIndex:1,
                     PageSize:1000
                 })
+                :  (
+                this.activeName === 'second' ?
+                await approveInterence.getBiApproveMsgList({ 
+                    CurrentIndex:1,
+                    PageSize:1000
+                }) 
                 : await operateAuthInterface.getNoticeList({
                     CurrentIndex:1,
                     PageSize:1000
-                })
+                }) 
+                )
 
             if(res.Ret!==200) return 
             this.msgList = res.Data.List||[]

+ 6 - 0
src/lang/modules/Aprroval/En.js

@@ -34,6 +34,12 @@ export default {
     research_approval_btn: "Research report approval",
     close_btn: "close",
     no_news_yet: "No news yet",
+    kanban_name:'Kanban name',
+    associative_classification:'Associative classification',
+    association_kanban:'Association kanban',
+    processing_state:'Processing state',
+    select_associated_Kanban_tip:'Please select associated Kanban',
+    enter_Kanban_name_tip:'Please enter a Kanban name',
   },
   AprrovalDetailPage: {
     report_name_info: "Research Report name",

+ 6 - 0
src/lang/modules/Aprroval/Zh.js

@@ -34,6 +34,12 @@ export default {
     research_approval_btn: "研报审批",
     close_btn: "关闭",
     no_news_yet: "暂无消息",
+    kanban_name:'看板名称',
+    associative_classification:'关联分类',
+    association_kanban:'关联看板',
+    processing_state:'处理状态',
+    select_associated_Kanban_tip:'请选择关联看板',
+    enter_Kanban_name_tip:'请输入看板名称',
   },
   AprrovalDetailPage: {
     report_name_info: "研报名称",

+ 6 - 3
src/lang/modules/systemManage/BaseConfig.js

@@ -102,8 +102,9 @@ export const BaseConfigEn = {
     mobile_website_title_Tip:"Please enter the mobile website name",
     system_logo:"System Logo",
     upload_image_tip:"Click to Upload Image",
-    report_logo:'Report Logo'
-    
+    report_logo:'Report Logo',
+    bIDashboard_approval:'BI Dashboard Approval',
+    board_approval:'Board Approval',
 };
   
 /* 中文 */
@@ -209,7 +210,9 @@ export const BaseConfigZh = {
     system_logo:"系统logo",
     upload_image_tip:"点击上传图片",
 
-    report_logo:'研报Logo'
+    report_logo:'研报Logo',
+    bIDashboard_approval:'BI看板审批',
+    board_approval:'看板审批',
 };
   
 /**

+ 5 - 4
src/mixins/reportApproveConfig.js

@@ -17,6 +17,7 @@ export default{
             pageLoading:false,
             hasApproveFlow:false,
             checkLoading:false,
+            IsBIApprove:false,
         }
     },
     computed:{
@@ -40,11 +41,11 @@ export default{
             const res = await etaBaseConfigInterence.getBaseConfig()
             this.pageLoading = false
             if(res.Ret!==200) return
-            const {IsReportApprove='',ReportApproveType=''} = res.Data
-            this.IsReportApprove = IsReportApprove==='true'?true:false,
+            const {IsReportApprove='',ReportApproveType='',IsBIApprove=''} = res.Data
+            this.IsReportApprove = IsReportApprove==='true'?true:false
             this.ReportApproveType = ReportApproveType
-
-            console.log(this.isApprove)
+            this.IsBIApprove = IsBIApprove==='true'?true:false
+            this.afterGetBaseConfig && this.afterGetBaseConfig();
         },
         //检查是否有审批流
         checkClassifyNameArr(type=1,classify=[]){

+ 1 - 0
src/utils/buttonConfig.js

@@ -814,6 +814,7 @@ export const baseConfigPermission = {
     etaBaseConfig_watermark:'etaBaseConfig:watermark',
     etaBaseConfig_watermark_ybChart:'etaBaseConfig:watermark:ybChart',//如果没权限,表单不显示也不校验
     etaBaseConfig_approve:'etaBaseConfig:approve',//研报审批
+    etaBaseConfig_biApprove:'etaBaseConfig:biApprove',//BI看板审批
     etaBaseConfig_login:'baseSetting:loginSetting',//登录
     etaBaseConfig_watermark_ybShare:'etaBaseConfig:watermark:ybShare',//如果没权限,表单不显示也不校验
     etaBaseConfig_source_see:'baseSetting:sourceSetting:see',//资源库查看

+ 68 - 29
src/views/approve_manage/approveDetail.vue

@@ -1,13 +1,13 @@
 <template>
     <!-- 审批详情:查看、进行审批操作 -->
-    <div class="approve-detail-wrap" v-if="isETAApprove">
+    <div class="approve-detail-wrap" v-if="isETAApprove || IsBIApprove">
         <div class="approve-detail">
             <div class="approve-info">
-                <span>{{$t('AprrovalDetailPage.report_name_info')}}:{{reportInfo.title||''}}</span>
-                <span>{{$t('AprrovalDetailPage.classification_info')}}:{{reportInfo.classify||''}}</span>
-                <span style="min-width: 100px;">{{$t('AprrovalDetailPage.initiator_info')}}:{{reportInfo.approver||''}}</span>
+                <span>{{ mainType == 'report'?$t('AprrovalDetailPage.report_name_info'):$t('AprrovalPage.kanban_name')}}:{{reportInfo.title||''}}</span>
+                <span v-if="mainType == 'report'">{{$t('AprrovalDetailPage.classification_info')}}:{{reportInfo.classify||''}}</span>
+                <span style="min-width: 100px;">{{$t('AprrovalPage.submitter_lable')}}:{{reportInfo.approver||''}}</span>
             </div>
-            <div class="approve-content" 
+            <div v-if="mainType == 'report'" class="approve-content" 
                 v-loading="isLoading"
                 element-loading-text="研报加载中...">
                 <component v-if="reportInfo.reportId&&!isError"
@@ -21,6 +21,11 @@
                 ></component>
                 <tableNoData v-if="isError" text="无法获取到报告内容,该报告可能已被删除!"></tableNoData>
             </div>
+            <div v-else class="approve-content" 
+                v-loading="isLoading"
+                element-loading-text="看板加载中...">
+                看板内容
+            </div>
         </div>
         <div class="approve-tool">
             <div class="tool-btn">
@@ -31,7 +36,7 @@
                     v-if="formType==='approve'&&approveInfo.isCurrentApprover&&permissionBtn.isShowBtn('approvePermission','reportApprove_agree')">{{$t('AprrovalDetailPage.agree_btn')}}</el-button>
                 <el-button type="primary" @click="changeApprove('return')"
                     v-if="formType==='myself'&&approveInfo.state!==4&&permissionBtn.isShowBtn('approvePermission','reportApprove_repeal')">{{$t('AprrovalDetailPage.cancel_btn')}}</el-button>
-                <el-button type="primary" plain @click="$router.replace(`/approveList?formType=${formType}`)">{{$t('AprrovalDetailPage.back_btn')}}</el-button>
+                <el-button type="primary" plain @click="$router.replace(`/approveList?formType=${formType}&mainType=${mainType}`)">{{$t('AprrovalDetailPage.back_btn')}}</el-button>
             </div>
             <div class="approve-timeline-wrap">
                 <p>{{$t('AprrovalDetailPage.approval_process')}}</p>
@@ -78,6 +83,7 @@ export default {
             isDetailDialogShow:false,
             TimeLineData:[],
             formType:'detail',//进入审批详情的方式:approve(待处理)/detail(已处理)/myself(我发起的)
+            mainType:'report', //report(研报) bi(bi看板)
             reportInfo:{ //报告相关信息
                 reportId:0,//研报or智能研报的报告id
                 title:'',
@@ -97,7 +103,7 @@ export default {
     computed:{
         UserId(){
             return Number(localStorage.getItem("AdminId"));
-        }
+        },
     },
     methods: {
         getApproveDetail(){
@@ -124,12 +130,33 @@ export default {
                 this.approveInfo.stateText=['','pending','passed','reject','return'][Approve.State]
             })
         },
+        getBiApproveDetail(){ 
+            const {type,approveId} = this.$route.query
+            if(!approveId) return 
+            approveInterence.getBiApproveDetail({
+                BiApproveId:+approveId
+            }).then(res=>{
+                if(res.Ret!==200) return
+                //格式化时间线数据 
+                this.formatTimeLineData(res.Data) 
+                const {Bi={},Approve={}} = res.Data||{}
+                this.reportInfo = {
+                    BiId:Bi.BiId||0,
+                    title:Bi.BiTitle||'',
+                    classify:Bi.BiClassify||'',
+                    approver:Approve.ApplyUserName||'',
+                }
+                this.formType = type||'detail'
+                this.approveInfo.state=Approve.State
+                this.approveInfo.stateText=['','pending','passed','reject','return'][Approve.State]
+            })
+        },
         //转换接口数据
         formatTimeLineData({Approve={},ApproveFlowNodes=[]}){
             //发起人节点
             const startNode = {
                 nodeType:1,
-                nodeText:`${this.$t('AprrovalDetailPage.initiator_info')}:`,
+                nodeText:`${this.$t('AprrovalPage.submitter_lable')}:`,
                 nodeStatus:'passed',
                 approveList:[{
                     approverName:Approve.ApplyUserName||'',
@@ -140,7 +167,7 @@ export default {
             let currentIndex = 0
             let Nodes = ApproveFlowNodes.map((i,index)=>{
                 //找到当前节点的index
-                if(i.ReportApproveNodeId===Approve.CurrNodeId){
+                if((i.ReportApproveNodeId===Approve.CurrNodeId && this.mainType == 'report') || (i.BiApproveNodeId===Approve.CurrNodeId && this.mainType == 'bi')){
                     currentIndex = index
                 }
                 //审批节点只有一个人时不显示是什么审批流
@@ -148,7 +175,7 @@ export default {
                 const node = {
                     nodeType:2,
                     nodeText:`${this.$t('AprrovalDetailPage.approval_by',{num:i.Users.length}) }`+(i.Users.length>1?strApproveType:''),
-                    nodeStatus:i.ReportApproveNodeId===Approve.CurrNodeId?'process':'future',
+                    nodeStatus:(i.ReportApproveNodeId===Approve.CurrNodeId && this.mainType == 'report') || (i.BiApproveNodeId===Approve.CurrNodeId && this.mainType == 'bi')?'process':'future',
                     approveType:ApproveType[i.ApproveType]
                 }
                 const approveList = i.Users.map(u=>{
@@ -161,7 +188,7 @@ export default {
                     }
                 })
                 //检测当前节点的User与当前用户是否匹配 且审批需要是待审批状态
-                if(i.ReportApproveNodeId===Approve.CurrNodeId&&Approve.State===1){
+                if((i.ReportApproveNodeId===Approve.CurrNodeId&&Approve.State===1&&this.mainType == 'report') || (i.BiApproveNodeId===Approve.CurrNodeId&&this.mainType=='bi'&&Approve.State===1)){
                     //当前节点的User中,有没有当前用户
                     const hasUser = i.Users.findIndex(u=>u.UserId===this.UserId)
                     if(hasUser!==-1){
@@ -229,7 +256,7 @@ export default {
                 //在最后加上撤销节点
                 Nodes.push({
                     nodeType:3,
-                    nodeText:`${this.$t('AprrovalDetailPage.initiator_info')}:`,
+                    nodeText:`${this.$t('AprrovalPage.submitter_lable')}:`,
                     nodeStatus:'return',
                     approveList:[{
                         approverName:(Approve.ApplyUserName||'')+'(已撤销)',
@@ -266,20 +293,22 @@ export default {
                 return 
             }
             let res = null
-            if(type==='return'){
-                res = await approveInterence.cancelApprove({
-                    ReportApproveId:Number(approveId)
-                })
+            if(type==='return'){ 
+                res = this.mainType == 'report' ?  await approveInterence.cancelApprove({ReportApproveId:Number(approveId)})
+                                                :  await approveInterence.cancelBiApprove({BiApproveId:Number(approveId)});
             }
-            if(type==='pass'){
-                res = await approveInterence.passApprove({
-                    ReportApproveId:Number(approveId),
-                    ReportUrl:this.generatePdfLinks(this.reportInfo.reportCode,this.reportInfo.type)
-                })
+            if(type==='pass'){ 
+                res = this.mainType == 'report' ?  await approveInterence.passApprove({
+                                                    ReportApproveId:Number(approveId),
+                                                    ReportUrl:this.generatePdfLinks(this.reportInfo.reportCode,this.reportInfo.type)
+                                                })
+                                                :   await approveInterence.passBiApprove({
+                                                    BiApproveId:Number(approveId),
+                                                })
             }
             if(res.Ret!==200) return 
             this.$message.success( type==='return'?this.$t('AprrovalPage.revoke_success') :this.$t('AprrovalDetailPage.passed_success'));
-            type!=='reject'&&(this.$router.replace("/approveList"))
+            type!=='reject'&&(this.$router.replace(`/approveList?mainType=${this.mainType}`))
         },
         generatePdfLinks(code,type){
             if(type == 1){
@@ -295,14 +324,20 @@ export default {
         },
         rejectApprove(reason){
             this.isDetailDialogShow = false
-            approveInterence.rejectApprove({
-                ReportApproveId:Number(this.$route.query.approveId),
-                ApproveRemark:reason||''
-            }).then(res=>{
+            let req = this.mainType == 'report' ? approveInterence.rejectApprove({
+                                                    ReportApproveId:Number(this.$route.query.approveId),
+                                                    ApproveRemark:reason||''
+                                                })
+                                                : approveInterence.rejectBiApprove({
+                                                    BiApproveId:Number(this.$route.query.approveId),
+                                                    ApproveRemark:reason||''
+                                                });
+            req.then(res=>{
                 if(res.Ret!==200) return 
                 this.$message.success(this.$t('AprrovalDetailPage.rejected_success') )
-                this.$router.replace("/approveList")
+                this.$router.replace(`/approveList?mainType=${this.mainType}`)
             })
+            
         },
         getSystemUserInfo(){
             departInterence.systemUserInfo().then(res=>{
@@ -320,8 +355,12 @@ export default {
         },
     },
     mounted(){
-        this.getApproveDetail()
-        this.getSystemUserInfo()
+        this.mainType = this.$route.query.mainType || 'report';
+        if(this.mainType == 'report') {
+          this.getApproveDetail();
+          this.getSystemUserInfo();
+        }
+        if(this.mainType == 'bi') this.getBiApproveDetail();
     },
     components: { TimeLine, ReportDetail, Reportdtl, RejectDialog }
 };

+ 56 - 19
src/views/approve_manage/approveEdit.vue

@@ -1,23 +1,23 @@
 <template>
     <!-- 添加编辑审批流 -->
-    <div class="approve-edit-wrap approve-page-wrap" v-if="isETAApprove">
+    <div class="approve-edit-wrap approve-page-wrap" v-if="isETAApprove || IsBIApprove">
         <div class="head-box">
             <el-form :inline="true" :model="approveForm" ref="approve-form" :rules="formRules"
                 label-width="180px" label-position="left">
                 <el-form-item :label="$t('SystemManage.ReportApprove.table_col01')" prop="name">
                     <el-input v-model="approveForm.name" :placeholder="$t('ApprovalEdit.name_placeholder')"></el-input>
                 </el-form-item>
-                <el-form-item :label="$t('SystemManage.ReportApprove.table_col02')" prop="classify">
+                <el-form-item :label="mainType == 'report' ?$t('SystemManage.ReportApprove.table_col02') : $t('AprrovalPage.association_kanban')" prop="classify">
                     <el-cascader v-model="approveForm.classify"
-                        :placeholder="$t('ApprovalEdit.report_placeholder')" clearable
+                        :placeholder="mainType == 'report' ? $t('ApprovalEdit.report_placeholder') : $t('AprrovalPage.select_associated_Kanban_tip')" clearable
                         :disabled="this.$route.query.flowId"
-                        :options="classifyTree"
-                        :props="{value:'ClassifyId',label:'ClassifyName',children:'Children'}"
+                        :options="mainType == 'report' ? classifyTree : biClassifyTree"
+                        :props="mainType == 'report' ? {value:'ClassifyId',label:'ClassifyName',children:'Children'} : {value:'BiDashboardClassifyId',label:'BiDashboardClassifyName',children:'Children'}"
                         style="margin-right: auto;margin-left: 15px;"></el-cascader>
                 </el-form-item>
             </el-form>
             <div class="form-btn">
-                <el-button type="primary" plain @click="$router.back()">{{$t('Dialog.cancel_btn')}}</el-button>
+                <el-button type="primary" plain @click="routerBack">{{$t('Dialog.cancel_btn')}}</el-button>
                 <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_save"
                     type="primary" @click="checkFlow">{{$t('Dialog.confirm_save_btn')}}</el-button>
             </div>
@@ -66,6 +66,7 @@ export default {
                 classify:'',
                 /* flowNodes:null */
             },
+            mainType:'report',
         };
     },
     computed:{
@@ -111,29 +112,46 @@ export default {
             }
             this.modifyFlow(Nodes)
         },
-        async modifyFlow(Nodes){
+        async modifyFlow(Nodes){ 
             const {name,classify} = this.approveForm
-            const params = {
+            const id = this.$route.query.flowId||0;
+
+            const params = this.mainType == 'report' ? {
                 FlowName:name,
                 ReportType:classify[0],
                 ClassifyFirstId:classify[1]||0,
                 ClassifySecondId:classify[2]||0,
                 ClassifyThirdId:classify[3]||0,
                 Nodes
-            }
+            } : {
+                BiApproveFlowId:+id,
+                FlowName:name,
+                ClassifyId:classify[0],
+                Nodes
+            };
             let res
-            const id = this.$route.query.flowId||0
             if(id){
-                res = await approveInterence.editApproveFlow({
-                    ...params,
-                    ReportApproveFlowId:Number(id)
-                })
+                res = this.mainType == 'report' ? await approveInterence.editApproveFlow({...params,ReportApproveFlowId:Number(id)})
+                                                : await approveInterence.editBiApproveFlow(params);
             }else{
-                res = await approveInterence.addNewApproveFlow(params)
+                res = this.mainType == 'report' ? await approveInterence.addNewApproveFlow(params) : await approveInterence.addNewBiApproveFlow(params) ;
             }
             if(res.Ret!==200) return
             this.$message.success(/* `${id?'编辑':'新增'}成功` */ id?this.$t('ApprovalEdit.edit_success_text'):this.$t('ApprovalEdit.add_success_text'))
-            this.$router.push('/approveSetting')
+            this.$router.push({
+                path:'/approveSetting',
+                query:{
+                    mainType: this.mainType || ''
+                }
+            })
+        },
+        routerBack(){
+            this.$router.replace({
+                path:'/approveSetting',
+                query:{
+                    mainType: this.mainType || ''
+                }
+            })
         },
         getFlowDetail(){
             const id = this.$route.query.flowId||0
@@ -157,10 +175,29 @@ export default {
                     this.approveForm.flowNodes = Nodes||[]
                 })
             }
-        }
+        },
+        getBiFlowDetail(){
+            const id = this.$route.query.flowId||0;
+            approveInterence.getBiApproveFlowDetail({
+                BiApproveFlowId:Number(id)
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                const {FlowName,Nodes,ClassifyId} = res.Data||{};
+                this.approveForm.name = FlowName||'';
+                this.approveForm.classify = [ClassifyId];
+                this.approveForm.flowNodes = Nodes||[];
+            })
+        },
+        afterGetBaseConfig(){ //渲染之后执行否则组件会监听不到
+            if(this.$route.query.flowId){
+                this.$route.query.mainType == 'report' ? this.getFlowDetail() : this.getBiFlowDetail();
+            }
+        },
+
     },
-    async mounted(){
-        this.getClassifyTree()
+    created(){
+        this.mainType = this.$route.query.mainType;
+        this.$route.query.mainType == 'report' ? this.getClassifyTree() : this.getBIClassifyTree() ;
     },
     components: { FlowEdiotr }
 };

+ 120 - 40
src/views/approve_manage/approveList.vue

@@ -1,6 +1,11 @@
 <template>
     <!-- 审批管理列表页 -->
-    <div class="approve-list-wrap approve-page-wrap" v-if="isETAApprove">
+    <div class="approve-list-wrap approve-page-wrap" v-if="isETAApprove || IsBIApprove">
+        <div class="head-tab">
+            <el-radio-group v-model="activeMainTab" style="margin-bottom: 10px;" @input="handleMainClick">
+                <el-radio-button v-for="item in mainTabs" :key="item.name" :label="item.name">{{ item.label }}</el-radio-button>
+            </el-radio-group>
+        </div>
         <div class="head-tab">
             <el-tabs v-model="activeTab" @tab-click="handleClick">
                 <el-tab-pane :label="$t('AprrovalPage.be_processed_tab')" name="pending"></el-tab-pane>
@@ -11,9 +16,9 @@
         <div class="approve-list">
             <div class="select-box">
                 <el-cascader v-model="classify"
-                    :placeholder="$t('AprrovalPage.associated_report_ipt')" clearable
-                    :options="classifyTree"
-                    :props="{value:'ClassifyId',label:'ClassifyName',children:'Children'}"
+                    :placeholder="activeMainTab == 'report' ? $t('AprrovalPage.associated_report_ipt') : $t('AprrovalPage.select_associated_Kanban_tip')" clearable
+                    :options="activeMainTab == 'report' ? classifyTree : biClassifyTree"
+                    :props="activeMainTab == 'report' ? {value:'ClassifyId',label:'ClassifyName',children:'Children'} : {value:'BiDashboardClassifyId',label:'BiDashboardClassifyName',children:'Children'}"
                     @change="handleCurrentChange(1)">
                 </el-cascader>
                 <div class="select-time-box">
@@ -51,7 +56,7 @@
                 </el-select>
 
                 <el-input v-model="keyword" prefix-icon="el-icon-search" clearable @input="handleCurrentChange(1)"
-                    :placeholder="$t('AprrovalPage.report_title_ipt')" style="width:260px;margin-left: auto;"></el-input>
+                    :placeholder="activeMainTab == 'report'?$t('AprrovalPage.report_title_ipt'):$t('AprrovalPage.enter_Kanban_name_tip')" style="width:260px;margin-left: auto;"></el-input>
             </div>
             <div class="list-box">
                 <el-table 
@@ -80,7 +85,7 @@
                     <el-table-column :label="$t('Table.column_operations')" align="center">
                         <template slot-scope="{row}">
                             <template v-if="activeTab==='pending'">
-                                <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'approve')"
+                                <el-button type="text" style="padding:0;" @click="toApproveDetail(row,'approve')"    
                                     v-if="permissionBtn.isShowBtn('approvePermission','reportApprove_approve')">{{$t('AprrovalPage.approve_table')}}</el-button>
                             </template>
                             <template v-if="activeTab==='processed'">
@@ -136,11 +141,18 @@ import {
         approve_pending_columns,
         approve_processed_columns,
         approve_originate_columns,
+        biapprove_pending_columns,
+        biapprove_processed_columns,
+        biapprove_originate_columns,
+
     } from './config/tableConfig'
 const columnsMap = {
-    'pending':approve_pending_columns,
-    'processed':approve_processed_columns,
-    'originate':approve_originate_columns
+    'pending_report':approve_pending_columns,
+    'processed_report':approve_processed_columns,
+    'originate_report':approve_originate_columns,
+    'pending_bi':biapprove_pending_columns,
+    'processed_bi':biapprove_processed_columns,
+    'originate_bi':biapprove_originate_columns,
 }
 const tabMap = {
     'pending':1,
@@ -151,6 +163,8 @@ export default {
     mixins:[approveMixins,reportApproveConfig],
     data() {
         return {
+            mainTabs:[],
+            activeMainTab:'',
             activeTab: 'pending',
             /* 筛选项 */
             timeType:1,
@@ -170,11 +184,11 @@ export default {
             total: 0,
 
             currentData: {},
-            isDetailDialogShow: false
+            isDetailDialogShow: false,
         };
     },
     methods: {
-        getTableData(){
+        getTableData(){  
             this.tableLoading = true
             this.tableData=[]
             const baseParams = {
@@ -198,53 +212,92 @@ export default {
                 //处理状态
                 ApproveState:this.ApproveState,
             }
-            approveInterence.getApproveList({
-                ...baseParams,
-                ...selectParams
-            }).then(res=>{
-                this.tableLoading=false
-                if(res.Ret!==200) return 
-                const {List=[],Paging={}} = res.Data||{}
-                this.tableData = List||[]
-                this.total = Paging.Totals||0
-            })
+            const biApproveParams = {
+                ClassifyId:this.classify[0] || 0,
+                TimeType:this.timeType,
+                StartTime:this.timeDate?this.timeDate[0]||'':'',
+                EndTime:this.timeDate?this.timeDate[1]||'':'',
+                SortRule:this.SortRule,
+                SortField:this.SortField,
+                ApproveState:this.ApproveState,
+            }
+
+            if(this.activeMainTab == 'report'){
+                approveInterence.getApproveList({
+                    ...baseParams,
+                    ...selectParams
+                }).then(res=>{
+                    this.tableLoading=false
+                    if(res.Ret!==200) return 
+                    const {List=[],Paging={}} = res.Data||{}
+                    this.tableData = List||[]
+                    this.total = Paging.Totals||0
+                }).catch(err=>{this.tableLoading=false})
+            } else {
+                approveInterence.getBiApproveList({
+                    ...baseParams,
+                    ...biApproveParams,
+                }).then(res=>{
+                    this.tableLoading=false
+                    if(res.Ret!==200) return 
+                    const {List=[],Paging={}} = res.Data||{}
+                    this.tableData = List||[]
+                    this.total = Paging.Totals||0
+                }).catch(err=>{this.tableLoading=false})
+            }
+            
         },
         handleCurrentChange(page) {
             this.page = page;
             this.getTableData()
         },
         sortChange({ prop, order }) {
+            if(!order){
+                this.SortRule = 0;
+                this.SortField = 0;
+                this.handleCurrentChange(1)
+                return
+            }
             this.SortRule = order==='ascending'?1:2
             this.SortField= prop==='CreateTime'?1
                             :prop==='HandleTime'?2:3
             this.handleCurrentChange(1)
         },
+        handleMainClick(tabName){
+          this.activeMainTab = tabName;
+          this.classify = '';
+          this.keyword = '';
+          this.activeTab = 'pending';
+          this.handleClick()
+        },
         handleClick() {
             this.timeType = 1
             this.timeDate=''
+            this.SortRule=0
             this.SortField=0
-            this.SortField=0
-            this.tableColumns = columnsMap[this.activeTab];
+            this.ApproveState = '';
+            this.tableColumns = columnsMap[`${this.activeTab}_${this.activeMainTab}`];
             this.$refs.reftable&&this.$refs.reftable.clearSort()
             this.handleCurrentChange(1)
         },
-        handleShowDetail(data) {
+        handleShowDetail(data) { 
             this.currentData = data;
             this.isDetailDialogShow = true;
         },
-        toApproveDetail(data,type){
+        toApproveDetail(data,type){ 
             this.$router.push({
                 path:'/approveDetail',
                 query:{
+                    mainType:this.activeMainTab,
                     type,
-                    approveId:data.ReportApproveId
+                    approveId:this.activeMainTab == 'report' ? data.ReportApproveId : data.BiApproveId,
                 }
             })
         },
-        cancelApprove(item){
-            approveInterence.cancelApprove({
-                ReportApproveId:Number(item.ReportApproveId)
-            }).then(res=>{
+        cancelApprove(item){ 
+            let req = this.activeMainTab == 'report' ? approveInterence.cancelApprove({ReportApproveId:Number(item.ReportApproveId)})
+                      : approveInterence.cancelBiApprove({BiApproveId:Number(item.BiApproveId)});
+            req.then(res=>{
                 if(res.Ret!==200) return 
                 this.$message.success(this.$t('AprrovalPage.revoke_success') )
                 this.handleCurrentChange(1)
@@ -260,6 +313,10 @@ export default {
             if(e==='处理时间') return this.$t('AprrovalPage.processing_time_lable') 
             if(e==='处理结果') return this.$t('AprrovalPage.processing_result_lable') 
             if(e==='审批时间') return this.$t('AprrovalPage.approval_time') 
+            if(e==='看板名称') return this.$t('AprrovalPage.kanban_name') 
+            if(e==='关联分类') return this.$t('AprrovalPage.associative_classification') 
+            if(e==='关联看板') return this.$t('AprrovalPage.association_kanban') 
+            if(e==='处理状态') return this.$t('AprrovalPage.processing_state') 
             if(e==='已通过') return this.$t('AprrovalPage.approved_option') 
             if(e==='已驳回') return this.$t('AprrovalPage.rejected_option') 
             if(e==='已撤销') return this.$t('AprrovalPage.revoked_option') 
@@ -273,18 +330,41 @@ export default {
             }else{
                 row.DetailImgUrl&&this.handleDownloadResource(row.DetailImgUrl,`${row.ReportTitle}`)
             }
-        }
+        },
+        afterGetBaseConfig(){  //执行完reportApproveConfig中getBaseConfig之后执行  mounted之后执行
+           if(this.isETAApprove) 
+            this.mainTabs.push({
+                    label:this.$t('AprrovalPage.research_approval_btn'),
+                    name:'report' 
+            });
+           if(this.IsBIApprove)
+           this.mainTabs.push({
+                label:this.$t('SystemManage.BaseConfig.board_approval'),
+                name:'bi'  
+            });
+           this.activeMainTab = this.mainTabs.length > 0 ? this.mainTabs[0].name : '';
+           if(!this.mainTabs.length) return;
+           const {formType='approve',mainType='report'} = this.$route.query
+
+           if(mainType) {
+                let valid = this.mainTabs.find(_ => mainType == _.name);
+                this.activeMainTab = valid ? valid.name : this.mainTabs[0].name;
+           }
+           
+
+           const formTypeMap = {
+                'approve':'pending',
+                'detail':'processed',
+                'myself':'originate'
+           }
+           this.activeTab = formTypeMap[formType]||'pending'
+           this.tableColumns = columnsMap[`${this.activeTab}_${this.activeMainTab}`] || approve_pending_columns;
+           this.getTableData()
+        },
     },
     mounted(){
-        this.getClassifyTree()
-        const {formType='approve'} = this.$route.query
-        const formTypeMap = {
-            'approve':'pending',
-            'detail':'processed',
-            'myself':'originate'
-        }
-        this.activeTab = formTypeMap[formType]||'pending'
-        this.getTableData()
+        this.getClassifyTree();
+        this.getBIClassifyTree();
     },
     components: { RejectDialog }
 };

+ 129 - 52
src/views/approve_manage/approveSetting.vue

@@ -1,20 +1,26 @@
 <template>
     <!-- 审批流配置列表 -->
-    <div class="approve-setting-wrap approve-page-wrap" v-if="isETAApprove">
+    <div class="approve-setting-wrap approve-page-wrap" v-if="isETAApprove || IsBIApprove">
+        <div style="margin-bottom: 10px;">
+            <el-radio-group v-model="activeMainTab" style="margin-bottom: 10px;" @input="handleTabClick">
+                    <el-radio-button v-for="item in mainTabs" :key="item.name" :label="item.name">{{ item.label }}</el-radio-button>
+            </el-radio-group>
+        </div>
         <div class="head-box">
-            <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_add"
-                type="primary" @click="$router.push('/approveEdit')">{{$t('SystemManage.ReportApprove.add_btn')}}</el-button>
+            <el-input v-model="Keyword" @input="handleCurrentChange(1)"
+                :placeholder="$t('SystemManage.ReportApprove.placeholder02')" prefix-icon="el-icon-search" clearable style="width:360px;"></el-input>
             <el-cascader v-model="classify"
-                :placeholder="$t('SystemManage.ReportApprove.placeholder01')" clearable
-                :options="classifyTree"
-                :props="{value:'ClassifyId',label:'ClassifyName',children:'Children'}"
+                :placeholder="activeMainTab == 'report' ? $t('SystemManage.ReportApprove.placeholder01') : $t('AprrovalPage.select_associated_Kanban_tip')" clearable
+                :options="activeMainTab == 'report' ? classifyTree : biClassifyTree"
+                :props="activeMainTab == 'report' ? {value:'ClassifyId',label:'ClassifyName',children:'Children'} : {value:'BiDashboardClassifyId',label:'BiDashboardClassifyName',children:'Children'}"
                 @change="handleSearchChange"
-                style="margin-right: auto;margin-left: 15px;"></el-cascader>
-            <el-input v-model="Keyword" @input="handleCurrentChange(1)"
-                :placeholder="$t('SystemManage.ReportApprove.placeholder02')" prefix-icon="el-icon-search" clearable style="width:260px;"></el-input>
+                style="margin-right: auto;margin-left: 25px;width: 240px;"></el-cascader>
+            <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_add"
+                type="primary" @click="handleAddFlow">{{$t('SystemManage.ReportApprove.add_btn')}}</el-button>
+            
         </div>
-        <div class="list-box">
-            <el-table :data="tableData" @sort-change="sortChange" border>
+        <div class="list-box" v-loading="dataLoading" element-loading-text="数据加载中...">
+            <el-table :data="tableData" @sort-change="sortChange" border ref="reftable">
                 <el-table-column
                     v-for="item in tableColumns"
                     :key="item.key"
@@ -59,7 +65,7 @@ export default {
     mixins:[approveMixins,reportApproveConfig],
     computed:{
         tableColumns(){
-            return [{
+            return this.activeMainTab == 'report' ? [{
                 label:this.$t('SystemManage.ReportApprove.table_col01'),
                 key:'FlowName'
             },{
@@ -69,8 +75,18 @@ export default {
                 label:this.$t('SystemManage.ReportApprove.table_col03'),
                 key:'CreateTime',
                 sortable:'custom'
+            }] : [{
+                label:this.$t('SystemManage.ReportApprove.table_col01'),
+                key:'FlowName'
+            },{
+                label:this.$t('AprrovalPage.association_kanban'),
+                key:'ClassifyName'
+            },{
+                label:this.$t('SystemManage.ReportApprove.table_col03'),
+                key:'CreateTime',
+                sortable:'custom'
             }]
-        }
+        },
     },
     data() {
         return {
@@ -79,86 +95,147 @@ export default {
             ClassifySecondId:0,//研报最后一级分类id
             ReportType:0,//研报类型 1-中文研报;2-英文研报;3-智能研报
             SortRule:0,//排序规则:1-正序; 2-倒序(默认)
+            ClassifyId:0,//bi审批看板选中分类id
             Keyword:'',
             classify:'',
 
             tableData:[],
-            // tableColumns:[{
-            //     label:'审批流名称',
-            //     key:'FlowName'
-            // },{
-            //     label:'关联报告',
-            //     key:'ReportClassify'
-            // },{
-            //     label:'创建时间',
-            //     key:'CreateTime',
-            //     sortable:'custom'
-            // }],
             page:1,
             pageSize:10,
             total:0,
+            mainTabs:[],
+            activeMainTab:'', //report-研报审批  bi-bi看板审批
+            dataLoading:false,
         };
     },
     methods: {
+        handleTabClick(tabName){
+          this.activeMainTab = tabName;
+          this.Keyword = '';
+          this.classify = '';
+          this.SortRule = 0;
+          this.page = 1;
+          this.total = 0;
+          this.ReportType = 0;
+          this.ClassifyFirstId = 0;
+          this.ClassifySecondId = 0;
+          this.ClassifyId = 0;
+          this.$refs.reftable&&this.$refs.reftable.clearSort();
+          this.getTableData();
+        },
         handleCurrentChange(page){
             this.page = page
             this.getTableData()
         },
         handleSearchChange(){
-            this.ReportType = this.classify[0]||0
-            this.ClassifySecondId = this.classify[this.classify.length-1]||0
-            if(this.classify.length>=3){
-                this.ClassifyFirstId = this.classify[this.classify.length-2]||0
-            }else{
-                this.ClassifyFirstId = 0
+            if(this.activeMainTab == 'report'){
+                this.ReportType = this.classify[0]||0
+                this.ClassifySecondId = this.classify[this.classify.length-1]||0
+                if(this.classify.length>=3){
+                    this.ClassifyFirstId = this.classify[this.classify.length-2]||0
+                }else{
+                    this.ClassifyFirstId = 0
+                }
+            } else {
+                this.ClassifyId = this.classify[0] || 0;
             }
             this.handleCurrentChange(1)
         },
         sortChange({prop,order}){
             this.SortRule = order==='ascending'?1:2
+            if(!order) this.SortRule = 0;
             this.handleCurrentChange(1)
         },
         getTableData(){
-            approveInterence.getApproveFlowList({
+            let params = {
                 PageSize:this.pageSize,
                 CurrentIndex:this.page,
-                ReportType:this.ReportType,
-                ClassifyFirstId:this.ClassifyFirstId,
-                ClassifySecondId:this.ClassifySecondId,
                 Keyword:this.Keyword,
-                SortRule:this.SortRule
-            }).then(res=>{
-                if(res.Ret!==200) return 
-                const {List=[],Paging={}} = res.Data||{}
-                this.tableData = List||[]
-                this.total = Paging.Totals||0
+                SortRule:this.SortRule,
+            }
+            this.dataLoading = true;
+            if(this.activeMainTab == 'report'){
+                approveInterence.getApproveFlowList({
+                    ...params,
+                    ReportType:this.ReportType,
+                    ClassifyFirstId:this.ClassifyFirstId,
+                    ClassifySecondId:this.ClassifySecondId,
+                }).then(res=>{
+                    if(res.Ret!==200) return 
+                    const {List=[],Paging={}} = res.Data||{}
+                    this.tableData = List||[]
+                    this.total = Paging.Totals||0;
+                    this.dataLoading = false;
+                }).catch(err=>{this.dataLoading = false;})
+            }
+            if(this.activeMainTab == 'bi'){
+                approveInterence.getBiApproveFlowList({
+                    ...params,
+                    ClassifyId:this.ClassifyId
+                }).then(res=>{
+                    if(res.Ret != 200) return;
+                    const {List=[],Paging={}} = res.Data||{}
+                    this.tableData = List||[]
+                    this.total = Paging.Totals||0;
+                    this.dataLoading = false;
+                }).catch(err=>{this.dataLoading = false;})
+            } 
+            
+        },
+        handleAddFlow(){
+            this.$router.push({
+                path:'/approveEdit',
+                query:{
+                    mainType:this.activeMainTab,
+                }
             })
         },
         handleEditFlow(item){
             this.$router.push({
                 path:'/approveEdit',
                 query:{
-                    flowId:item.ReportApproveFlowId
+                    mainType:this.activeMainTab,
+                    flowId:this.activeMainTab == 'report' ? item.ReportApproveFlowId :  item.BiApproveFlowId,
                 }
             })
         },
         handleDeleteFlow(item){
             this.$confirm(this.$t('MsgPrompt.delete_info_msg'),this.$t('Confirm.prompt'),{
                 type:"warning"
-            }).then(()=>{
-                approveInterence.deleteApproveFlow({
-                    ReportApproveFlowId:item.ReportApproveFlowId
-                }).then(res=>{
-                    if(res.Ret!==200) return 
-                    this.$message.success(this.$t('MsgPrompt.delete_msg'))
-                    this.handleCurrentChange(1)
-                })
+            }).then(async ()=>{
+                let res = this.activeMainTab == 'report' 
+                          ? await approveInterence.deleteApproveFlow({ReportApproveFlowId:item.ReportApproveFlowId})
+                          : await approveInterence.deleteBiApproveFlow({BiApproveFlowId:item.BiApproveFlowId});
+                if(res.Ret!==200) return 
+                this.$message.success(this.$t('MsgPrompt.delete_msg'))
+                this.handleCurrentChange(1)
             }).catch(()=>{})
-        }
+        },
+        afterGetBaseConfig(){ //执行完reportApproveConfig中getBaseConfig之后执行  mounted之后执行
+            if(this.isETAApprove) 
+                this.mainTabs.push({
+                        label:this.$t('AprrovalPage.research_approval_btn'),
+                        name:'report' 
+                });
+           if(this.IsBIApprove)
+                this.mainTabs.push({
+                    label:this.$t('SystemManage.BaseConfig.board_approval'),
+                    name:'bi'  
+                });
+           this.activeMainTab = this.mainTabs.length > 0 ? this.mainTabs[0].name : '';
+           if(!this.mainTabs.length) return;
+           
+           if(this.$route.query.mainType) {
+                let valid = this.mainTabs.find(_ => this.$route.query.mainType == _.name);
+                this.activeMainTab = valid ? valid.name : this.mainTabs[0].name;
+           }
+
+           this.getTableData();
+        },
     },
     mounted(){
-        this.getClassifyTree()
-        this.getTableData()
+        this.getClassifyTree();
+        this.getBIClassifyTree();
     },
 };
 </script>

+ 68 - 3
src/views/approve_manage/config/tableConfig.js

@@ -1,4 +1,4 @@
-//审批管理-待处理
+//审批管理-待处理_研报审批
 export const approve_pending_columns = [
     {
         key:'ReportTitle',
@@ -18,13 +18,33 @@ export const approve_pending_columns = [
         label:'审批状态',
     }
 ]
+//审批管理-待处理_BI看板审批
+export const biapprove_pending_columns = [
+    {
+        key:'BiTitle',
+        label:'看板名称'
+    },{
+        key:'ClassifyName',
+        label:'关联分类'
+    },{
+        key:'ApplyUserName',
+        label:'提交人'
+    },{
+        key:'CreateTime',
+        label:'提交时间',
+        sortable:'custom'
+    },{
+        key:'RecordState',
+        label:'审批状态',
+    }
+]
 export const appreve_pending_status = [
     {
         type:1,
         label:'待审批'
     }
 ]
-//审批管理-已处理
+//审批管理-已处理-研报审批
 export const approve_processed_columns=[
     {
         key:'ReportTitle',
@@ -48,6 +68,30 @@ export const approve_processed_columns=[
         label:'处理结果',
     }
 ]
+//审批管理-已处理-bi看板审批
+export const biapprove_processed_columns=[
+    {
+        key:'BiTitle',
+        label:'看板名称'
+    },{
+        key:'ClassifyName',
+        label:'关联看板'
+    },{
+        key:'ApplyUserName',
+        label:'提交人'
+    },{
+        key:'CreateTime',
+        label:'提交时间',
+        sortable:'custom'
+    },{
+        key:'HandleTime',
+        label:'处理时间',
+        sortable:'custom'
+    },{
+        key:'RecordState',
+        label:'处理状态',
+    }
+]
 export const approve_processed_status = [
     {
         type:1,
@@ -57,7 +101,7 @@ export const approve_processed_status = [
         label:'已驳回'
     }
 ]
-//审批管理-我发起的
+//审批管理-我发起的-研报审批
 export const approve_originate_columns=[
     {
         key:'ReportTitle',
@@ -78,6 +122,27 @@ export const approve_originate_columns=[
         label:'审批状态',
     }
 ]
+//审批管理-我发起的-bi看板审批
+export const biapprove_originate_columns=[
+    {
+        key:'BiTitle',
+        label:'看板名称'
+    },{
+        key:'ClassifyName',
+        label:'关联看板'
+    },{
+        key:'CreateTime',
+        label:'提交时间',
+        sortable:'custom'
+    },{
+        key:'ApproveTime',
+        label:'审批时间',
+        sortable:'custom'
+    },{
+        key:'State',
+        label:'审批状态',
+    }
+]
 export const approve_originate_status=[
     {
         type:1,

+ 7 - 0
src/views/approve_manage/mixins/approveMixins.js

@@ -13,6 +13,7 @@ export default{
     data(){
         return {
             classifyTree:[],
+            biClassifyTree:[],
         }
     },
     methods:{
@@ -27,5 +28,11 @@ export default{
                 }
             })
         },
+        getBIClassifyTree(){
+            approveInterence.getBiApproveClassifyTree().then(res=>{
+                if(res.Ret != 200) return;
+                this.biClassifyTree = res.Data
+            })
+        },
     }
 }

+ 22 - 3
src/views/system_manage/etaBaseConfig.vue

@@ -298,13 +298,21 @@
                             </div>
                             <div class="side">
                                 <span>
-                                    {{reportFromType[0].label}}<el-switch v-model="formData.ReportCenterLogoShow" style="margin-right:20px"/>
+                                    <span>{{reportFromType[0].label}}</span>
+                                    <el-switch v-model="formData.ReportCenterLogoShow" style="margin-right:20px"/>
                                 </span>
                                 <span v-if="isHaveEnReport">
-                                    {{reportFromType[1].label}}<el-switch v-model="formData.ReportEnLogoShow"/>
+                                    <span>{{reportFromType[1].label}}</span>
+                                    <el-switch v-model="formData.ReportEnLogoShow"/>
                                 </span>
                             </div>
                         </div>
+
+                        <!-- BI看板审批 -->
+                        <div v-if="isShowBIApprove" style="margin-top: 20px;">
+                            <span>{{$t('SystemManage.BaseConfig.bIDashboard_approval')}}</span> 
+                            <el-switch v-model="BIApprove"></el-switch>
+                        </div>
                     </div>
                     <div class="side">
                     
@@ -548,6 +556,7 @@ export default {
             checkList:[],//水印应用
             Iflytek:false,//是否启用科大讯飞服务
             approve:false,//是否开启研报审批
+            BIApprove:false,//是否开启BI看板审批
             formData: {
                 Disclaimer: '',//免责声明
                 DisclaimerEn: '',//英文免责声明
@@ -588,6 +597,7 @@ export default {
                 WatermarkReport:false,//研报分享水印
 
                 IsReportApprove:false,//是否开启研报审批
+                IsBIApprove:false,//是否开启bi看板审批
                 ReportApproveType:'eta',//研报审批选项
                 ICPLicense:'', //备案信息
                 ETATitle:'', //登录页标题
@@ -744,6 +754,12 @@ export default {
                 this.permissionBtn.baseConfigPermission.etaBaseConfig_approve
             )
         },
+        //是否展示BI看板审批
+        isShowBIApprove(){
+            return this.permissionBtn.checkPermissionBtn(
+                this.permissionBtn.baseConfigPermission.etaBaseConfig_biApprove
+            )
+        },
         //是否显示中文PPT相关的表单项
         isShowPPT(){
             return this.permissionBtn.checkPermissionBtn(
@@ -868,12 +884,14 @@ export default {
             //获取WatermarkChart的值,赋值checkList
             //获取UseXf的值,赋值Iflytek
             //获取IsReportApprove的值,赋值approve
+            //获取IsBIApprove的值,赋值BIApprove
             etaBaseConfigInterence.getBaseConfig().then(res=>{
                 if(res.Ret!==200) return 
-                const {WatermarkChart='',UseXf='',IsReportApprove='',CnPptCoverImgs='',EnPptCoverImgs=''} = res.Data
+                const {WatermarkChart='',UseXf='',IsReportApprove='',CnPptCoverImgs='',EnPptCoverImgs='',IsBIApprove=''} = res.Data
                 this.checkList = WatermarkChart==='true'?['研报图表']:[]
                 this.Iflytek = UseXf==='true'?true:false
                 this.approve = IsReportApprove==='true'?true:false
+                this.BIApprove = IsBIApprove==='true'?true:false
                 if(res.Data){
                     // this.$set(this,'formData',res.Data)
                     this.formData = {...this.formData,...res.Data}
@@ -928,6 +946,7 @@ export default {
                     this.formData.WatermarkChart = ''+(this.checkList.includes('研报图表')?true:false)
                     this.formData.UseXf = ''+(this.Iflytek?true:false)
                     this.formData.IsReportApprove = ''+(this.approve?true:false)
+                    this.formData.IsBIApprove = ''+(this.BIApprove?true:false)
                     const CnPptCoverImgs = this.formData.CnPptCoverImgs.join(',')
                     const EnPptCoverImgs = this.formData.EnPptCoverImgs.join(',')
                     //通过验证后,提交数据前