Browse Source

Merge branch 'debug' of http://8.136.199.33:3000/eta_gn_front/eta_front into debug

Karsa 6 months ago
parent
commit
c1638deb77
52 changed files with 3632 additions and 737 deletions
  1. 1 0
      config/dev.env.js
  2. 1 1
      config/index.js
  3. 2 1
      config/prod.env.js
  4. 1 0
      config/prod.test.env.js
  5. 13 7
      src/api/http.js
  6. 97 0
      src/api/modules/BIBoard.js
  7. 159 0
      src/api/modules/approve.js
  8. BIN
      src/assets/img/icons/home_sjjd.png
  9. 52 16
      src/components/notificationMsg.vue
  10. 6 0
      src/lang/modules/Aprroval/En.js
  11. 6 0
      src/lang/modules/Aprroval/Zh.js
  12. 6 3
      src/lang/modules/systemManage/BaseConfig.js
  13. 2 1
      src/main.js
  14. 5 4
      src/mixins/reportApproveConfig.js
  15. 33 0
      src/routes/modules/BIRoutes.js
  16. 1 1
      src/routes/modules/semanticsRoutes.js
  17. 23 1
      src/utils/buttonConfig.js
  18. 113 0
      src/views/BI_manage/components/BoardContent.vue
  19. 293 0
      src/views/BI_manage/components/ChartBox.vue
  20. 124 0
      src/views/BI_manage/components/CommonClassify.vue
  21. 100 0
      src/views/BI_manage/components/EditCommonClassify.vue
  22. 257 0
      src/views/BI_manage/components/SelectChart.vue
  23. 268 0
      src/views/BI_manage/components/SelectTable.vue
  24. 151 0
      src/views/BI_manage/components/SetCommon.vue
  25. 185 0
      src/views/BI_manage/components/SetShare.vue
  26. 287 0
      src/views/BI_manage/components/TableBox.vue
  27. 150 0
      src/views/BI_manage/editBoard.vue
  28. 415 0
      src/views/BI_manage/index.vue
  29. 10 1
      src/views/Home.vue
  30. 81 31
      src/views/approve_manage/approveDetail.vue
  31. 57 20
      src/views/approve_manage/approveEdit.vue
  32. 121 40
      src/views/approve_manage/approveList.vue
  33. 130 52
      src/views/approve_manage/approveSetting.vue
  34. 68 3
      src/views/approve_manage/config/tableConfig.js
  35. 7 0
      src/views/approve_manage/mixins/approveMixins.js
  36. 12 16
      src/views/classify_manage/chapterSettingV2.vue
  37. 12 14
      src/views/classify_manage/classifylistV2.vue
  38. 0 66
      src/views/home_manage/components/BIWrap.vue
  39. 0 81
      src/views/home_manage/components/PointViewWrap.vue
  40. 0 81
      src/views/home_manage/components/PolicyWrap.vue
  41. 0 82
      src/views/home_manage/components/ReportWrap.vue
  42. 217 0
      src/views/home_manage/components/SelectBoard.vue
  43. 68 12
      src/views/home_manage/index.vue
  44. 15 15
      src/views/report_manage/reportV2/components/chapterEditWrapper.vue
  45. 10 10
      src/views/report_manage/reportV2/components/reportBaseInfoDia.vue
  46. 2 2
      src/views/report_manage/reportV2/list.vue
  47. 3 3
      src/views/report_manage/reportlist.vue
  48. 19 19
      src/views/sandbox_manage/index_new_version.vue
  49. 2 2
      src/views/smartReport/reportList.vue
  50. 16 134
      src/views/system_manage/dataRefreshSetting.vue
  51. 31 11
      src/views/system_manage/etaBaseConfig.vue
  52. 0 7
      src/views/system_manage/outlinkList.vue

+ 1 - 0
config/dev.env.js

@@ -4,6 +4,7 @@ var prodEnv = require('./prod.env');
 module.exports = merge(prodEnv, {
   NODE_ENV:'"development"',
   VUE_APP_API_ROOT:'"/adminapi"',  //
+  VUE_APP_BASE_URL:'"/"',
   Domain:'"brilliantstart.cn"',
   // Login:'"http://localhost:3030/login"',
   // CHART_LINK:'"https://charttest.hzinsights.com/chartshow"',

+ 1 - 1
config/index.js

@@ -13,7 +13,7 @@ module.exports = {
     assetsRoot: path.resolve(__dirname, '../eta_front'),
     assetsSubDirectory: 'static',
 //  assetsPublicPath: '/vue-admin/',
-		assetsPublicPath: './',
+		assetsPublicPath: process.env.VUE_APP_BASE_URL,
     productionSourceMap: false,
     // Gzip off by default as many popular static hosts such as
     // Surge or Netlify already gzip all static assets for you.

+ 2 - 1
config/prod.env.js

@@ -1,6 +1,7 @@
 module.exports = {
 	NODE_ENV:'"production"',
-	VUE_APP_API_ROOT:'"/adminapi"',  //生产环境
+	VUE_APP_API_ROOT:'"/ybeta/adminapi"',  //生产环境
+	VUE_APP_BASE_URL:'"/ybeta/"',
 	Domain:'"hzinsights.com"',
 	// Login:'"https://eta.hzinsights.com/login"',
 	// CHART_LINK:'"https://chartlib.hzinsights.com/chartshow"',

+ 1 - 0
config/prod.test.env.js

@@ -1,6 +1,7 @@
 module.exports = {
 	NODE_ENV:'"test"',
 	VUE_APP_API_ROOT:'"/adminapi"',  //测试环境
+	VUE_APP_BASE_URL:'"/"',
 	Domain:'"brilliantstart.cn"',
 	// Login:'"http://8.136.199.33:7778/login"',
 	// CHART_LINK:'"https://charttest.hzinsights.com/chartshow"',

+ 13 - 7
src/api/http.js

@@ -1,6 +1,7 @@
 "use strict";
 import axios from "axios";
 import bus from "./bus.js";
+import {router} from '../main'
 let store=null
 // 异步加载store模块 不异步加载的话,@/api/modules/oldApi.js的导入导出写法会有问题
 import('@/vuex/index.js')
@@ -66,6 +67,7 @@ function errorMsgShow(closableErrMsg,msg){
   }
 }
 
+let loginOutCount=0
 function checkStatus(response,closableErrMsg) {
   //处理响应数据
   if (response && response.status === 200) {
@@ -77,15 +79,19 @@ function checkStatus(response,closableErrMsg) {
     } else if (res.Ret == 403) {
       errorMsgShow(closableErrMsg,res.Msg)
     } else if (res.Ret === 408) {
-      localStorage.setItem("auth", "")
-      localStorage.setItem("loginTime", "")
-      bus
-        .$alert(res.Msg, "提示", {
+      if(loginOutCount===0){
+        localStorage.setItem("loginTime", "")
+        bus.$alert(res.Msg, "提示", {
           showClose: false,
-        })
-        .then(() => {
-          window.location.href = window.location.origin + '/login';
+        }).then(() => {
+          loginOutCount=0
+          router.replace('/login')
+          // window.location.href = window.location.origin + '/login';
         });
+      }
+      loginOutCount++
+      // localStorage.setItem("auth", "")
+      
     }
     return res;
   } else {

+ 97 - 0
src/api/modules/BIBoard.js

@@ -0,0 +1,97 @@
+import http from "@/api/http.js"
+
+//区间分析
+export default{
+  //我i的看板列表
+  myBoardList:params=>{
+    return http.get('/bi_dashborad/my_list',{})
+  },
+  //共享看板列表
+  shareBoardList:params=>{
+    return http.get('/bi_dashborad/share_list',{})
+  },
+  //公共看板列表
+  commonBoardList:params=>{
+    return http.get('/bi_dashborad/public_list',{})
+  },
+  //看板详情
+  boardDetail:params=>{
+    return http.get('/bi_dashborad/detail',params)
+  },
+
+  // 新增看板
+  addBoard:params=>{
+    return http.post('/bi_dashborad/add',params)
+  },
+  // 编辑看板
+  editBoard:params=>{
+    return http.post('/bi_dashborad/edit',params)
+  },
+  // 看板编辑状态
+  editBoardLock:params=>{
+    return http.post('/bi_dashborad/editing',params)
+  },
+  // 删除看板
+  deleteBoard:params=>{
+    return http.post('/bi_dashborad/delete',params)
+  },
+  // 看板元素拖动
+  moveBoardElement:params=>{
+    return http.post('/bi_dashborad/detail/move',params)
+  },
+
+  // 表格详情
+  tableDetail:params=>{
+    return http.get('/datamanage/excel_info/table_data',params)
+  },
+
+  // 新增看板公共分类
+  addCommonClassify:params=>{
+    return http.post('/bi_dashborad/classify/add',params)
+  },
+  // 公共看板分类数据
+  commonClassifyList:params=>{
+    return http.get('/bi_dashborad/classify/list',{})
+  },
+   // 编辑看板公共分类
+  editCommonClassify:params=>{
+    return http.post('/bi_dashborad/classify/edit',params)
+  },
+  // 删除看板公共分类
+  deleteCommonClassify:params=>{
+    return http.post('/bi_dashborad/classify/del',params)
+  },
+  // 将看板设置为公共看板
+  setBoardCommon:params=>{
+    return http.post('/bi_dashborad/public',params)
+  },
+  // 将看板取消设置为公共看板
+  cancelBoardCommon:params=>{
+    return http.post('/bi_dashborad/public/cancel',params)
+  },
+
+  // 将看板设置为共享看板
+  setBoardShare:params=>{
+    return http.post('/bi_dashborad/grant',params)
+  },
+  // 将看板取消设置为共享看板
+  cancelBoardShare:params=>{
+    return http.post('/bi_dashborad/grant/cancel',params)
+  },
+  //获取看板共享用户
+  getBoardShareUsers:params=>{
+    return http.get('/bi_dashborad/grant/info',params)
+  },
+
+  // 获取首页看板
+  getHomePageBoard:params=>{
+    return http.get('/bi_dashborad/home_page',{})
+  },
+  //设置首页看板
+  setHomePageBoard:params=>{
+    return http.post('/bi_dashborad/home_page/save',params)
+  },
+
+
+  
+}

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

BIN
src/assets/img/icons/home_sjjd.png


+ 52 - 16
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>
+                    <!-- bi看板审批 -->
+                    <el-tab-pane v-if="tabsShow.second" :label="`${$t('SystemManage.BaseConfig.bIDashboard_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,13 +124,15 @@
 <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';
+const tabNames = ['first','second','third'];
 export default {
     components: { mDialog },
     data() {
         this.approveState=['','process','passed','reject','return',]
         return {
-            activeName:'first',
+            activeName:'',
             visible:false,
             msgList:[],
             UnreadTotal:0,
@@ -141,7 +149,12 @@ export default {
                 isAuthSet: false,//true权限设置 false资产转移
                 Source: 1,
                 SubSource: 0,
-            }
+            },
+            tabsShow:{
+              first:false, //研报
+              second:false, //BI
+              third:true, //资产
+            },
         };
     },
     computed: {
@@ -184,8 +197,9 @@ export default {
         },
     },
     watch:{
-        visible(val){
+        async visible(val){
             if(val){
+               await this.handleTabs()
                 this.getMsgList()
             }
         },
@@ -202,29 +216,44 @@ 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;
+                if(!tabNames.includes(this.activeName)){//默认选中第一个显示的tab   
+                    this.activeName = Object.entries(this.tabsShow).filter(_=>_[1])[0][0] || 'third'; 
+                }
+                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' ? await 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 +261,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:'BI 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 BI 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:'BI看板名称',
+    associative_classification:'关联分类',
+    association_kanban:'关联看板',
+    processing_state:'处理状态',
+    select_associated_Kanban_tip:'请选择关联看板',
+    enter_Kanban_name_tip:'请输入BI看板名称',
   },
   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:'看板审批',
 };
   
 /**

+ 2 - 1
src/main.js

@@ -180,6 +180,7 @@ Array.prototype.flat = function (count) {
 };
 export const router = new VueRouter({
   mode: "history",
+  base:process.env.VUE_APP_BASE_URL,
   routes,
 });
 
@@ -201,7 +202,7 @@ router.beforeEach(async(to, from, next) => {
 
   let auth = localStorage.getItem("auth") || false;
   if (to.path != "/login" && to.path!='/temppage' &&to.path!='/fogetpassword' && !auth) {
-    window.location.href =  window.location.origin + '/login';
+    next('/login')
     return false;
   }
 

+ 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=[]){

+ 33 - 0
src/routes/modules/BIRoutes.js

@@ -0,0 +1,33 @@
+const home = (r) => require.ensure([], () => r(require("@/views/Home.vue")), "Home"); //主页
+export default [
+  {
+    path: "/",
+    component: home,
+    name: "BI看板",
+    hidden: false,
+    icon_path: require("@/assets/img/home/data_ic.png"),
+    meta: {
+      name_en: "",
+    },
+    children: [
+      {
+        path: "BIBoard",
+        name: "BI看板",
+        component: () => import("@/views/BI_manage/index.vue"),
+        hidden: false,
+        meta: {
+          name_en: "",
+        },
+      },
+      {
+        path: "editBIBoard",
+        name: "添加看板",
+        component: () => import("@/views/BI_manage/editBoard.vue"),
+        hidden: false,
+        meta: {
+          name_en: "",
+        },
+      },
+    ],
+  },
+];

+ 1 - 1
src/routes/modules/semanticsRoutes.js

@@ -90,7 +90,7 @@ export default [{
     },
     {
       path: "aISummeryPage",
-      name: "AI纪要",
+      name: "智能分析",
       component: () => import('@/views/semantics_manage/summery/index.vue'),
       meta:{
         name_en:"AI Summery"

+ 23 - 1
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',//资源库查看
@@ -900,6 +901,25 @@ export const knowledgePermission = {
 }
 
 
+/* BI看板配置 */
+export const BIBoardPermission = {
+    BIBoard_add:'BI:addBoard',//添加
+    BIBoard_setshare:'BI:setShare',//设置共享
+    BIBoard_setcommon:'BI:setCommon',//
+    BIBoard_addclassify:'BI:setCommonClassify',//
+    BIBoard_edit:'BI:edit',//
+    BIBoard_delete:'BI:delete',//
+    BIBoard_refresh:'BI:refresh',//
+    BIBoard_sort:'BI:sort',//
+}
+
+/* 首页配置 */
+export const homePagePermission = {
+    home_boarddetail:'home:boardDetail',
+    home_setbiboard:'home:setBiBoard',//
+}
+
+
 //创建了新的ManageBtn记得添加到这里
 const btnMap  = {
     reportManageBtn,enReportManageBtn,smartReportManageBtn,
@@ -918,7 +938,9 @@ const btnMap  = {
     outlinkConfigPermission,
     chartThemePermission,
     toolBoxPermission,
-    knowledgePermission
+    knowledgePermission,
+    BIBoardPermission,
+    homePagePermission
 }
 
 /**

+ 113 - 0
src/views/BI_manage/components/BoardContent.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="BI-board-content">
+    <div class="BI-board-list" :style="{height:renderHeight}">
+      <table-no-data v-if="value.length===0" style="flex:1"/>
+      <div
+        class="BI-board-item-box"
+        v-for="(item, index) in value"
+        :key="item.BiDashboardDetailId"
+        @dragover.prevent
+        @drop="drop(index)"
+      >
+        <component :is="getCompType(item.Type)" :compData="item">
+          <template v-slot:drag>
+            <!-- Draggable icon -->
+            <img
+              v-if="canDrag"
+              class="icon"
+              src="~@/assets/img/data_m/move_ico.png"
+              alt=""
+              @mousedown="setDraggable(true, index)"
+              @dragstart="dragStart(index)"
+              @dragend="setDraggable(false, index)"
+              style="cursor: move"
+            />
+          </template>
+          <template v-slot:delete>
+            <img class="icon" v-if="canDelete" src="~@/assets/img/icons/delete-red.png" alt="" @click="handleDel(index)"/>
+          </template>
+        </component>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+import TableNoData from '../../../components/tableNoData.vue';
+import ChartBox from './ChartBox.vue';
+import TableBox from './TableBox.vue';
+
+export default {
+  components: { ChartBox, TableBox, TableNoData },
+  props: {
+    value: {
+      type: Array,
+      default: () => []
+    },
+    boardInfo:{},//看板详情数据
+    canDrag: {//能否拖动
+      type: Boolean,
+      default: false
+    },
+    canDelete:{//能否删除
+      type: Boolean,
+      default: false
+    },
+    renderHeight:{
+      type:String,
+      default:"calc(100vh - 300px)"
+    }
+  },
+  data() {
+    return {
+      draggedIndex: null,
+    };
+  },
+  methods: {
+    getCompType(type) {
+      return type === 1 ? ChartBox : TableBox;
+    },
+    handleDel(index){
+      this.value.splice(index,1)
+      this.$emit('delete',this.value)
+    },
+    setDraggable(draggable, index) {
+      const box = this.$el.querySelectorAll('.BI-board-item-box')[index];
+      box.draggable = draggable;
+    },
+    dragStart(index) {
+      this.draggedIndex = index;
+    },
+    async drop(index) {
+      if (this.draggedIndex === null) return
+      // Swap the two items
+      const temp=this.value[this.draggedIndex]
+      this.$set(this.value, this.draggedIndex, this.value[index]);
+      this.$set(this.value, index, temp);
+      this.draggedIndex = null;
+      this.$emit('input',this.value)
+      this.$emit('change',this.value)
+    },
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.BI-board-content {
+  padding: 20px;
+  .BI-board-list {
+    height: calc(100vh - 300px);
+    overflow-y: auto;
+    display: flex;
+    flex-wrap: wrap;
+    gap: 20px;
+    .BI-board-item-box {
+      width: calc(50% - 14px);
+      height: 560px;
+      border: 1px solid #dcdfe6;
+      box-shadow: 0px 2px 8px 0px #00000014;
+    }
+  }
+}
+</style>

+ 293 - 0
src/views/BI_manage/components/ChartBox.vue

@@ -0,0 +1,293 @@
+<template>
+  <div class="chart-box" v-if="compData" ref="compRef" v-loading="loading" element-loading-text="拼命加载中">
+    <div class="top-title-box">
+      <div class="title" @click="goDetail">{{ chartInfo.ChartName }}</div>
+      <div class="opt-box">
+        <img
+          class="icon"
+          src="~@/assets/img/icons/refresh_blue_new.png"
+          alt=""
+          v-permission="permissionBtn.BIBoardPermission.BIBoard_refresh"
+          @click="refreshHandle"
+        />
+        <slot name="drag"></slot>
+        <slot name="delete"></slot>
+      </div>
+    </div>
+    <!-- 无权限 -->
+    <div class="nodata" v-if="chartInfo.HaveOperaAuth === false">
+      <noDataAuth :text="$t('MsgPrompt.no_chart_auth')" />
+    </div>
+    <div class="chart-render-wrap" v-else>
+      <Chart
+        minHeight="480px"
+        height="480px"
+        :options="options"
+        :chartInfo="chartInfo"
+        :index="compData.BiDashboardDetailId"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import Chart from '@/views/dataEntry_manage/components/chart';
+import { chartSetMixin } from '@/views/dataEntry_manage/mixins/chartPublic'
+import { dataBaseInterface } from '@/api/api.js';
+import chartRelevanceApi from '@/api/modules/chartRelevanceApi';
+import apiIntervalAnalysis from '@/api/modules/intervalAnalysis'
+import { fittingEquationInterface,statisticFeatureInterface,crossVarietyInterface } from '@/api/modules/chartRelevanceApi';
+export default {
+  components: { Chart },
+  mixins: [chartSetMixin],
+  props: {
+    compData: null
+  },
+  watch: {
+    tableData: {
+      handler(newval) {
+        newval.length && !this.chartInfo.WarnMsg && [1, 11].includes(this.chartInfo.Source) && this.setChartOptionHandle(newval);
+      },
+      deep: true,
+    },
+  },
+  data() {
+    return {
+      loading: true,
+      observer: null,
+      isVisible: false, // 是否可见
+
+      chartInfo: {},
+    }
+  },
+  mounted() {
+    console.log('图表组件挂载');
+    this.createObserver();
+  },
+  beforeUnmount() {
+    if (this.observer) {
+      this.observer.disconnect();
+    }
+  },
+  methods: {
+    /* 一键刷新 超长等待..*/
+    async refreshHandle() {
+      // 清除缓存配置项
+      this.loading = true;
+      const { Source, ChartInfoId, } = this.chartInfo;
+
+      let res = null
+      if (Source === 1) {
+        res = await dataBaseInterface.chartRefresh({ ChartInfoId })
+      } else if ([3].includes(Source)) {
+        res = await chartRelevanceApi.refreshChart({ ChartInfoId })
+      } else if (Source === 6) {
+        res = await fittingEquationInterface.refreshChart({ ChartInfoId })
+      } else if ([7].includes(Source)) {
+        res = await statisticFeatureInterface.refreshChart({ ChartInfoId })
+      } else if (Source === 10) {
+        res = await crossVarietyInterface.refreshChart({ ChartInfoId })
+      }  else if (Source === 12) {
+        res = await apiIntervalAnalysis.chartRefresh({ ChartInfoId })
+      }
+
+      this.loading = false;
+      if (res.Ret !== 200) return
+      this.$message.success(res.Msg);
+
+      this.handleGetChartData()
+    },
+
+    goDetail() {
+      const pathMap = new Map([
+        [1, '/chartsetting'],
+        [3, '/chartrelevance'],
+        [6, '/fittingEquationList'],
+        [7, '/statisticFeatureList'],
+        [10, '/crossVarietyChartList'],
+        [12, '/rangeAnalysis']
+      ])
+      const href = this.$router.resolve({
+        path: pathMap.get(this.chartInfo.Source),
+        query: {
+          code: this.chartInfo.UniqueCode,
+          id: this.chartInfo.ChartInfoId
+        }
+      }).href
+      window.open(href, "_blank")
+    },
+
+    // 获取图表数据
+    async handleGetChartData() {
+      const res = await dataBaseInterface.getChartByCode({ UniqueCode: this.compData.UniqueCode })
+      this.loading = false
+      if (res.Ret !== 200) return;
+      this.chartInfo = res.Data.ChartInfo;
+
+      this.chartInfo.SeasonExtraConfig && (this.SeasonExtraConfig = JSON.parse(this.chartInfo.SeasonExtraConfig))
+
+      if (!this.chartInfo.HaveOperaAuth) return
+
+      if ([1, 11, 12].includes(this.chartInfo.Source)) {
+        //季节性图处理SeasonAverageConfig,SeasonRightEdbConfig
+        if (this.chartInfo.ChartType === 2) {
+          const { MaxMinLimits, SamePeriodAverage, SamePeriodStandardDeviation, RightAxis } = res.Data.DataResp
+          this.chartInfo.SeasonAverageConfig = { MaxMinLimits, SamePeriodAverage, SamePeriodStandardDeviation }
+          this.chartInfo.SeasonRightConfig = RightAxis
+        }
+        this.tableData = res.Data.EdbInfoList;
+        //初始化上下限
+        this.setLimitData(this.tableData)
+
+        this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
+
+        //截面散点图
+        this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
+
+        //雷达图
+        this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
+
+        // 截面组合图
+        this.chartInfo.ChartType === 14 && this.initSectionalCombinationChart(res.Data);
+
+        // 区间分析
+        this.chartInfo.Source === 12 && this.initIntervalAnalysisChartData(res.Data)
+
+      } else if ([2, 5].includes(this.chartInfo.Source)) {
+        // this.tableData = [res.Data.EdbInfoList[0]];
+        this.tableData = res.Data.EdbInfoList.filter(_e => _e.Source)
+        this.chartInfo = res.Data.ChartInfo.Source === 5 ? {
+          ...res.Data.ChartInfo,
+          ProfitNameEn: res.Data.DataResp.ProfitNameEn,
+          ProfitName: res.Data.DataResp.ProfitName,
+        } : res.Data.ChartInfo;
+        //商品价格图
+        this.initCommodityData(res.Data);
+      } else if ([3].includes(this.chartInfo.Source)) {//相关性 滚动相关性
+
+        this.relevanceChartData = {
+          ChartInfo: res.Data.ChartInfo,
+          EdbInfoList: res.Data.EdbInfoList,
+          XEdbIdValue: res.Data.XEdbIdValue,
+          CorrelationChartInfo: res.Data.CorrelationChartInfo,
+          YDataList: [
+            {
+              Value: res.Data.YDataList[0].Value,
+              Color: '#00f',
+              Name: res.Data.YDataList[0].Name || res.Data.ChartInfo.ChartName,
+              NameEn: res.Data.YDataList[0].NameEn || res.Data.ChartInfo.ChartNameEn
+            }
+          ]
+        }
+        //多因子
+        if (res.Data.CorrelationChartInfo.AnalysisMode === 1) {
+          this.relevanceChartData.YDataList = res.Data.YDataList
+        }
+
+        this.initRelevanceChartData()
+        this.tableData = res.Data.EdbInfoList
+      } else if (this.chartInfo.Source === 4) {//滚动相关性换成曲线图绘图
+        this.tableData = res.Data.EdbInfoList
+        this.relevanceChartData = {
+          CorrelationChartInfo: res.Data.CorrelationChartInfo
+        }
+        this.setDefaultChart([res.Data.DataResp]);
+
+      } else if ([6, 7, 8].includes(this.chartInfo.Source)) {//拟合方程 标准差 百分比
+        this.tableData = res.Data.EdbInfoList;
+
+        this.setDefaultChart([res.Data.DataResp]);
+      } else if (this.chartInfo.Source === 9) { //统计频率
+        this.tableData = res.Data.EdbInfoList;
+        this.statisticFrequencyData = res.Data.DataResp;
+        this.setStatisticFrequency();
+      } else if (this.chartInfo.Source === 10) { //跨品种分析
+        this.tableData = res.Data.EdbInfoList;
+        this.crossVarietyChartData = res.Data.DataResp;
+
+        /* 历史数据chartInfo里全是空 兼容下历史数据不崩 */
+        this.chartLimit = {
+          min: res.Data.ChartInfo.LeftMin ? Number(res.Data.ChartInfo.LeftMin) : Number(res.Data.DataResp.YMinValue),
+          max: res.Data.ChartInfo.LeftMax ? Number(res.Data.ChartInfo.LeftMax) : Number(res.Data.DataResp.YMaxValue),
+          x_min: res.Data.ChartInfo.XMin ? Number(res.Data.ChartInfo.XMin) : Number(res.Data.DataResp.XMinValue),
+          x_max: res.Data.ChartInfo.XMax ? Number(res.Data.ChartInfo.XMax) : Number(res.Data.DataResp.XMaxValue),
+        }
+        this.setCrossVarietyChart();
+      }
+    },
+
+    // 利用判断是否进入可视区域 来加载数据 
+    // 如果加载过了就不用再加载了
+    createObserver() {
+      const options = {
+        root: null, // 使用浏览器可视区域为根
+        threshold: 0.1, // 当至少10%的内容进入可视区时触发回调
+      };
+
+      this.observer = new IntersectionObserver(this.handleIntersect, options);
+      this.observer.observe(this.$refs.compRef); // 监听组件
+    },
+    handleIntersect(entries) {
+      if (this.isVisible) return
+      entries.forEach(entry => {
+        // 判断是否在可视范围内
+        if (entry.isIntersecting) {
+          this.isVisible = true;
+          console.log('Component is visible');
+          // 在这里你可以执行其他操作,比如懒加载数据或图片等
+          this.handleGetChartData()
+        }
+      });
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.chart-box {
+  width: 100%;
+  height: 100%;
+  padding: 20px;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  .top-title-box {
+    display: flex;
+    margin-bottom: 10px;
+    .title {
+      font-size: 20px;
+      font-weight: bold;
+      flex: 1;
+      display: -webkit-box;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 1;
+      line-break: anywhere;
+      -webkit-box-orient: vertical;
+      &::before {
+        content: "";
+        display: inline-block;
+        width: 4px;
+        height: 20px;
+        background-color: #0052d9;
+        position: relative;
+        top: 2px;
+        margin-right: 5px;
+      }
+    }
+    .opt-box {
+      flex-shrink: 0;
+      margin-left: 10px;
+      .icon {
+        width: 24px;
+        height: 24px;
+        margin-left: 5px;
+      }
+    }
+  }
+  .chart-render-wrap {
+    width: 100%;
+    flex: 1;
+  }
+}
+</style>

+ 124 - 0
src/views/BI_manage/components/CommonClassify.vue

@@ -0,0 +1,124 @@
+<template>
+  <el-dialog
+    title="设置公共看板分类"
+    :visible.sync="show"
+    :center="true"
+    v-dialogDrag
+    custom-class="dialogclass"
+    width="680px"
+    @close="handleClose"
+    append-to-body
+  >
+    <div class="common-classify-wrap">
+      <el-button type="text" icon="el-icon-plus" @click="showEdit=true;editData=null">添加分类</el-button>
+      <table-no-data v-if="list.length===0"/>
+      <div class="classify-list-box">
+        <div class="item-box" v-for="item in list" :key="item.BiDashboardClassifyId">
+          <el-input disabled style="flex:1" :value="item.BiDashboardClassifyName"></el-input>
+          <img class="icon" src="~@/assets/img/icons/edit-blue.png" alt="" @click="handleShowEdit(item)">
+          <img class="icon" src="~@/assets/img/icons/delete-red.png" alt="" @click="handleDelete(item)">
+        </div>
+      </div>
+    </div>
+    <EditCommonClassify v-model="showEdit" :editData="editData" @change="handleEditSuccessBack"/>
+  </el-dialog>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+import EditCommonClassify from './EditCommonClassify.vue'
+export default {
+  name: "CommonClassify",
+  components:{EditCommonClassify},
+  model: {
+    prop: 'show',
+    event: 'showChange'
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    }
+  },
+  watch: {
+    show(n){
+      if(n){
+        this.getList()
+      }
+    }
+  },
+  data() {
+    return {
+      showEdit:false,
+      editData:null,
+      list:[]
+    }
+  },
+  methods: {
+    handleClose() {
+      this.$emit('showChange', false)
+    },
+
+    handleShowEdit(e){
+      this.editData=e
+      this.showEdit=true
+    },
+
+    async handleDelete(e){
+      const res=await apiBiBoard.deleteCommonClassify({
+        BiDashboardClassifyId:e.BiDashboardClassifyId
+      })
+      if(res.Ret!==200) return
+      this.$message.success('删除成功')
+      this.handleEditSuccessBack()
+    },
+
+    handleEditSuccessBack(){
+      this.$emit('change')
+      this.getList()
+    },
+
+    async getList(){
+      const res=await apiBiBoard.commonClassifyList()
+      if(res.Ret===200){
+        this.list=res.Data||[]
+      }
+    }
+  },
+}
+</script>
+<style lang="scss">
+.classify-list-box{
+  .el-input.is-disabled .el-input__inner{
+  color: #333;
+}
+}
+
+</style>
+<style lang="scss" scoped>
+
+.common-classify-wrap{
+  .classify-list-box{
+    margin: 20px 0;
+    height: 300px;
+    overflow-y: auto;
+    .item-box{
+      margin-bottom: 10px;
+      display: flex;
+      align-items: center;
+      gap: 0 5px;
+      .icon{
+        width: 24px;
+        height: 24px;
+        cursor: pointer;
+        margin-left: 10px;
+      }
+    }
+  }
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 40px 0;
+}
+</style>

+ 100 - 0
src/views/BI_manage/components/EditCommonClassify.vue

@@ -0,0 +1,100 @@
+<template>
+  <el-dialog
+    title="设置公共看板分类"
+    :visible.sync="show"
+    :center="true"
+    v-dialogDrag
+    custom-class="dialogclass"
+    width="680px"
+    @close="handleClose"
+    append-to-body
+  >
+    <div class="edit-common-classify-wrap" style="padding-top: 40px">
+      <el-form
+        :model="formData"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="100px"
+      >
+        <el-form-item label="分类名称" prop="name">
+          <el-input
+            v-model="formData.name"
+            placeholder="请输入分类名称"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div class="dia-bot">
+        <el-button
+          type="primary"
+          plain
+          @click="handleClose"
+          style="margin-right: 20px"
+          >{{ $t("Dialog.cancel_btn") }}</el-button
+        >
+        <el-button type="primary" @click="saveHandle">{{
+          $t("Dialog.confirm_save_btn")
+        }}</el-button>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+export default {
+  name: "EditCommonClassify",
+  model: {
+    prop: 'show',
+    event: 'showChange'
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    editData:null
+  },
+  watch: {
+    show(n){
+      if(n&&this.editData){
+        this.formData.name=this.editData.BiDashboardClassifyName
+      }
+    }
+  },
+  data() {
+    return {
+      rules: { name: [{ required: true, message: '请输入分类名称', trigger: 'blur' },] },
+      formData: { name: "" },
+
+    }
+  },
+  methods: {
+    handleClose() {
+      this.$emit('showChange', false)
+    },
+    saveHandle() {
+      this.$refs.ruleForm.validate(async(valid) => {
+        if (!valid) return
+        const res=this.editData?await apiBiBoard.editCommonClassify({
+          ClassifyName:this.formData.name,
+          BiDashboardClassifyId:this.editData.BiDashboardClassifyId
+        }) :await apiBiBoard.addCommonClassify({
+          ClassifyName:this.formData.name
+        })
+        if(res.Ret!==200) return
+        this.$message.success('保存成功')
+        this.formData.name=''
+        this.$emit('change')
+        this.handleClose()
+      })
+    }
+  },
+}
+</script>
+<style lang="scss" scoped>
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 60px 0 40px 0;
+}
+</style>

+ 257 - 0
src/views/BI_manage/components/SelectChart.vue

@@ -0,0 +1,257 @@
+<template>
+  <div class="choose-chart-container">
+    <el-dialog
+      :visible.sync="show"
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      @close="cancelHandle"
+      custom-class="dialog"
+      title="添加图表"
+      top="3vh"
+      center
+      width="86%"
+			style="min-width:1200px;"
+      v-dialogDrag
+    >
+      <div class="dialog-top">
+        <el-input
+          :placeholder="$t('Chart.Detail.chart_name')"
+          v-model="search_txt"
+          style="width: 100%"
+          @input="searchHandle"
+          clearable
+        >
+          <i slot="prefix" class="el-input__icon el-icon-search"></i>
+        </el-input>
+        <div style="margin-top: 10px">
+          <el-radio-group v-model="chart_source" @change="searchHandle" style="margin-right:15px;">
+						<el-radio :label="1"><!-- ETA图库 -->{{$t('Chart.AllChartSource.eta_chart')}}</el-radio>
+						<el-radio :label="3"><!-- 相关性图表 -->{{$t('Chart.AllChartSource.correla_chart')}}</el-radio>
+						<el-radio :label="6"><!-- 拟合方程曲线 -->{{$t('Chart.AllChartSource.equation_chart')}}</el-radio>
+						<el-radio :label="7"><!-- 统计特征 -->{{$t('Chart.AllChartSource.statis_chart')}}</el-radio>
+						<el-radio :label="10"><!-- 跨品种分析 -->{{$t('Chart.AllChartSource.cross_chart')}}</el-radio>
+            <el-radio :label="12">区间分析</el-radio>
+					</el-radio-group>
+          <el-checkbox v-model="isShowMe"  @change="searchHandle"><!-- 只看我的 -->{{$t('MyEtaPage.label_see_mine')}}</el-checkbox>
+        </div>
+      </div>
+      <div class="choose-dialog-min">
+        <el-checkbox-group v-model="checkList" v-if="haveData">
+        <div
+          class="chart-public-list"
+          style="margin-bottom: 20px;padding-right: 20px;"
+          :infinite-scroll-disabled="!haveMove"
+          v-infinite-scroll="loadMove"
+          ref="scrollCont"
+        >
+          <el-col
+            :span="5"
+            v-for="chart in chartPublicList"
+            :key="chart.ChartInfoId"
+            style="padding-right: 20px;margin-bottom:20px;min-width: 260px;"
+          >
+            <el-card shadow class="public-chart-item">
+              <div slot="header" class="item-top">
+                <span class="text_oneLine">{{chart.ChartName}}</span>
+                <el-checkbox :disabled="chart_source===1&&!chart.HaveOperaAuth" :label="chart.ChartInfoId"
+                    ><span>&nbsp;</span></el-checkbox
+                  >
+              </div>
+              <img :src="(chart_source===1&&!chart.HaveOperaAuth) ? $icons.lock_big : chart.ChartImage" alt="" class="chart-img" />
+              <div class="item-bottom">
+                <span class="last-time">创建时间:{{ chart.CreateTime.substr(0,10) }}</span>
+              </div>
+            </el-card>
+          </el-col>
+        </div>
+        </el-checkbox-group>
+        <div v-else class="nodata">
+          <tableNoData :text="$t('Common.no_chart_msg')"/>
+        </div>
+      </div>
+      <div class="dia-bot">
+        <el-button
+          type="primary"
+          plain
+          @click="cancelHandle"
+          style="margin-right: 20px"
+          >{{ $t("Dialog.cancel_btn") }}</el-button
+        >
+        <el-button type="primary" @click="saveHandle">{{
+          $t("Dialog.confirm_save_btn")
+        }}</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mychartInterface } from '@/api/api.js';
+import chartRelevanceApi from '@/api/modules/chartRelevanceApi';
+import { fittingEquationInterface,statisticFeatureInterface,crossVarietyInterface } from '@/api/modules/chartRelevanceApi';
+import futuresInterface from '@/api/modules/futuresBaseApi';
+import apiIntervalAnalysis from '@/api/modules/intervalAnalysis'
+export default {
+  model: {
+    prop: 'show',
+    event: 'showChange'
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    }
+  },
+  watch: {
+    show(newval) {
+      newval && this.getPublicChartList();
+    },
+  },
+  data() {
+    return {
+      haveData: false,
+      search_txt: '',
+      page_no: 1,
+      page_size: 15,
+      haveMove: true,
+      chartPublicList: [],
+
+      chart_source:1,
+      isShowMe: false,
+      checkList:[]
+    };
+  },
+  methods: {
+    saveHandle(){
+      const arr=this.chartPublicList.filter(item=>this.checkList.includes(item.ChartInfoId))
+      this.$emit('addChart', arr)
+    },
+
+    /* 获取图库列表 */
+    async getPublicChartList() {
+      let params = {
+        PageSize: this.page_size,
+        CurrentIndex: this.page_no,
+        ChartClassifyId: 0,
+        KeyWord: this.search_txt,
+        IsShowMe: this.isShowMe
+      };
+
+       const apiMap = {
+        1: mychartInterface.publicList,
+        3: chartRelevanceApi.getChartList,
+        6: fittingEquationInterface.getChartList,
+        7: statisticFeatureInterface.getChartList,
+        10: crossVarietyInterface.searchChart,
+        12: apiIntervalAnalysis.chartSearch
+      }
+      let res = await apiMap[this.chart_source](params)
+
+
+      if (res.Ret !== 200) return;
+      this.haveMove = res.Data ? this.page_no < res.Data.Paging.Pages : false;
+      this.chartPublicList = res.Data
+        ? this.page_no === 1
+          ? res.Data.List
+          : [...this.chartPublicList, ...res.Data.List]
+        : [];
+      this.haveData = this.chartPublicList.length ? true : false;
+      
+    },
+
+    loadMove() {
+      this.page_no++;
+      this.getPublicChartList();
+    },
+
+    searchHandle() {
+      this.page_no = 1;
+      if(this.$refs.scrollCont) this.$refs.scrollCont.scrollTop = 0;
+      this.getPublicChartList();
+    },
+
+    init() {
+      this.page_no = 1;
+      this.checkList=[]
+      if(this.$refs.scrollCont) this.$refs.scrollCont.scrollTop = 0;
+      this.search_txt = '';
+    },
+    cancelHandle() {
+      this.init();
+      this.$emit('showChange', false)
+    },
+  },
+  created() {},
+  mounted() {},
+};
+</script>
+<style lang="scss">
+.choose-chart-container {
+  .el-col-5 {
+    width: 20%;
+  }
+  .el-card .el-card__header,
+  .el-card__body {
+    padding: 10px;
+  }
+  .el-dialog--center .el-dialog__body {
+    padding: 25px 0 10px;
+  }
+  .dialog-top {
+    padding: 0 25px;
+  }
+  .choose-dialog-min {
+    margin-top: 20px;
+    .chart-public-list {
+      display: flex;
+      flex-wrap: wrap;
+      /* height: 650px; */
+      max-height: 650px;
+      height: 65vh;
+      padding: 0 0 0 20px;
+      overflow: hidden;
+      overflow-y: auto;
+      .dragShdow {
+        box-shadow: 0 1px 8px rgba(64, 158, 255, 0.8);
+        opacity: 0.5;
+      }
+      .public-chart-item {
+        .item-top {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          font-size: 15px;
+          font-weight: 600;
+        }
+        .chart-img {
+          width: 100%;
+          height: 180px;
+          object-fit: fill !important;
+        }
+        .item-bottom {
+          margin-top: 10px;
+          font-size: 12px;
+          display: flex;
+          justify-content: space-between;
+          color: #666;
+          .join_txt {
+            color: #409eff;
+            cursor: pointer;
+          }
+        }
+      }
+    }
+    .nodata {
+      height: 500px;
+      text-align: center;
+      font-size: 14px;
+      color: #666;
+    }
+  }
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 40px 0;
+}
+</style>

+ 268 - 0
src/views/BI_manage/components/SelectTable.vue

@@ -0,0 +1,268 @@
+<template>
+  <div class="choose-chart-container">
+    <el-dialog
+      :visible.sync="show"
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      @close="cancelHandle"
+      custom-class="dialog"
+      title="添加表格"
+      top="3vh"
+      center
+      width="86%"
+      style="min-width: 1200px"
+      v-dialogDrag
+    >
+      <div class="dialog-top">
+        <el-input
+          :placeholder="$t('Chart.Detail.chart_name')"
+          v-model="search_txt"
+          style="width: 100%"
+          @input="searchHandle"
+          clearable
+        >
+          <i slot="prefix" class="el-input__icon el-icon-search"></i>
+        </el-input>
+        <div style="margin-top: 10px">
+          <el-radio-group
+            v-model="table_source"
+            @change="searchHandle"
+            style="margin-right: 15px"
+          >
+            <el-radio :label="1">共享表格</el-radio>
+            <el-radio :label="2">时间序列表格</el-radio>
+            <el-radio :label="3">混合表格</el-radio>
+          </el-radio-group>
+          <el-checkbox style="float:right" v-model="isShowMe" @change="searchHandle"
+            ><!-- 只看我的 -->{{ $t("MyEtaPage.label_see_mine") }}</el-checkbox
+          >
+        </div>
+      </div>
+      <div class="choose-dialog-min">
+        <el-checkbox-group v-model="checkList" v-if="haveData">
+          <div
+            class="chart-public-list"
+            style="margin-bottom: 20px; padding-right: 20px"
+            :infinite-scroll-disabled="!haveMove"
+            v-infinite-scroll="loadMove"
+            ref="scrollCont"
+          >
+            <el-col
+              :span="5"
+              v-for="table in tablePublicList"
+              :key="table.ExcelInfoId"
+              style="padding-right: 20px; margin-bottom: 20px; min-width: 260px"
+            >
+              <el-card
+                shadow
+                :class="[
+                  'public-chart-item',
+                  checkList.includes(table.ExcelInfoId) ? 'select_box' : '',
+                ]"
+              >
+                <div slot="header" class="item-top">
+                  <span class="text_oneLine">{{ table.ExcelName }}</span>
+                  <el-checkbox :disabled="!table.HaveOperaAuth" :label="table.ExcelInfoId"
+                    ><span>&nbsp;</span></el-checkbox
+                  >
+                </div>
+                <img
+                  :src="
+                    !table.HaveOperaAuth ? $icons.lock_big : table.ExcelImage
+                  "
+                  alt=""
+                  class="chart-img"
+                />
+                <div class="item-bottom">
+                  <span class="last-time"
+                    >创建时间:{{ table.CreateTime.substr(0, 10) }}</span
+                  >
+                </div>
+              </el-card>
+            </el-col>
+          </div>
+        </el-checkbox-group>
+        <div v-else class="nodata">
+          <tableNoData text="暂无表格" />
+        </div>
+      </div>
+      <div class="dia-bot">
+        <el-button
+          type="primary"
+          plain
+          @click="cancelHandle"
+          style="margin-right: 20px"
+          >{{ $t("Dialog.cancel_btn") }}</el-button
+        >
+        <el-button type="primary" @click="saveHandle">{{
+          $t("Dialog.confirm_save_btn")
+        }}</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import * as sheetInterface from "@/api/modules/sheetApi.js";
+export default {
+  model: {
+    prop: 'show',
+    event: 'showChange'
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    }
+  },
+  watch: {
+    show(newval) {
+      newval && this.getPublicTableList();
+    },
+  },
+  data() {
+    return {
+      haveData: false,
+      search_txt: '',
+      page_no: 1,
+      page_size: 15,
+      haveMove: true,
+      tablePublicList: [],
+
+      checkList: [],
+
+      table_source: 1,
+      isShowMe: false
+    };
+  },
+  methods: {
+    saveHandle(){
+      const arr=this.tablePublicList.filter(item=>this.checkList.includes(item.ExcelInfoId))
+      this.$emit('addTable', arr)
+    },
+
+    /* 获取图库列表 */
+    async getPublicTableList() {
+      let params = {
+        PageSize: this.page_size,
+        CurrentIndex: this.page_no,
+        Source: this.table_source,
+        KeyWord: this.search_txt,
+        IsShowMe: this.isShowMe
+      };
+
+      let res = await sheetInterface.sheetList(params)
+
+      if (res.Ret !== 200) return;
+      this.haveMove = res.Data ? this.page_no < res.Data.Paging.Pages : false;
+      this.tablePublicList = res.Data
+        ? this.page_no === 1
+          ? res.Data.List
+          : [...this.tablePublicList, ...res.Data.List]
+        : [];
+      this.haveData = this.tablePublicList.length ? true : false;
+
+    },
+
+    loadMove() {
+      this.page_no++;
+      this.getPublicTableList();
+    },
+
+    searchHandle() {
+      this.page_no = 1;
+      if (this.$refs.scrollCont) this.$refs.scrollCont.scrollTop = 0;
+      this.getPublicTableList();
+    },
+
+    init() {
+      this.checkList=[]
+      this.page_no = 1;
+      if (this.$refs.scrollCont) this.$refs.scrollCont.scrollTop = 0;
+      this.search_txt = '';
+    },
+    cancelHandle() {
+      this.init();
+      this.$emit('showChange', false)
+    },
+  },
+  created() { },
+  mounted() { },
+};
+</script>
+<style lang="scss">
+.choose-chart-container {
+  .el-col-5 {
+    width: 20%;
+  }
+  .el-card .el-card__header,
+  .el-card__body {
+    padding: 10px;
+  }
+  .el-dialog--center .el-dialog__body {
+    padding: 25px 0 10px;
+  }
+  .dialog-top {
+    padding: 0 25px;
+  }
+  .choose-dialog-min {
+    margin-top: 20px;
+    .chart-public-list {
+      display: flex;
+      flex-wrap: wrap;
+      /* height: 650px; */
+      max-height: 650px;
+      height: 65vh;
+      padding: 0 0 0 20px;
+      overflow: hidden;
+      overflow-y: auto;
+      .el-card__header {
+        box-shadow: none !important;
+      }
+      .dragShdow {
+        box-shadow: 0 1px 8px rgba(64, 158, 255, 0.8);
+        opacity: 0.5;
+      }
+      .public-chart-item {
+        .item-top {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          font-size: 15px;
+          font-weight: 600;
+        }
+        .chart-img {
+          width: 100%;
+          height: 180px;
+          object-fit: fill !important;
+        }
+        .item-bottom {
+          margin-top: 10px;
+          font-size: 12px;
+          display: flex;
+          justify-content: space-between;
+          color: #666;
+          .join_txt {
+            color: #409eff;
+            cursor: pointer;
+          }
+        }
+      }
+      .select_box {
+        border-color: #409eff !important;
+      }
+    }
+    .nodata {
+      height: 500px;
+      text-align: center;
+      font-size: 14px;
+      color: #666;
+    }
+  }
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 40px 0;
+}
+</style>

+ 151 - 0
src/views/BI_manage/components/SetCommon.vue

@@ -0,0 +1,151 @@
+<template>
+  <el-dialog
+    title="设置公共看板"
+    :visible.sync="show"
+    :modal-append-to-body="false"
+    :close-on-click-modal="false"
+    :center="true"
+    v-dialogDrag
+    custom-class="dialogclass"
+    width="680px"
+    @close="handleClose"
+  >
+    <div class="BI-share-wrap" v-if="boardInfo">
+      <div class="board-title">
+        <div style="flex: 1">{{boardInfo.BiDashboardName}}</div>
+        <el-tag size="mini" type="warning" v-if="boardInfo.State === 4">待审批</el-tag>
+        <el-tag size="mini" type="danger" v-if="boardInfo.State === 5">已驳回</el-tag>
+        <el-tag size="mini" type="success" v-if="boardInfo.State === 6">已通过</el-tag>
+      </div>
+      <el-select
+        v-model="classify"
+        placeholder="请选择分类"
+        style="width: 100%; margin: 20px 0"
+        :disabled="boardInfo.State !== 1"
+      >
+        <el-option v-for="item in list" :key="item.BiDashboardClassifyId" :value="item.BiDashboardClassifyId" :label="item.BiDashboardClassifyName"></el-option>
+      </el-select>
+      <div class="tips" v-if="boardInfo.State === 1">
+        提示:个人看板设为公共看板,请先选择公共看板分类,提交审批,审批通过后可设置公开!
+      </div>
+      <div class="tips" v-if="boardInfo.State === 5">
+        提示:设置公开看板失败,若要编辑,请先执行撤销操作!
+        <el-button type="text" @click="handleBackCommon">撤销</el-button>
+      </div>
+      <div class="tips" v-if="boardInfo.State === 4">
+        提示:审批通过后,个人看板则设置公开成功!
+      </div>
+      <div class="tips" v-if="boardInfo.State === 6">
+        提示:设置公开看板成功,若要编辑,请先撤销操作(即取消公开)!
+        <el-button type="text" @click="handleBackCommon">撤销</el-button>
+      </div>
+
+      <div class="dia-bot">
+        <template v-if="boardInfo.State === 1">
+          <el-button
+            type="primary"
+            plain
+            @click="handleClose"
+            style="margin-right: 20px"
+            >{{ $t("Dialog.cancel_btn") }}</el-button
+          >
+          <el-button type="primary" @click="saveHandle">提交审批</el-button>
+        </template>
+        <el-button v-else type="primary" @click="handleClose">知道了</el-button>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+export default {
+  name: "setCommon",
+  model: {
+    prop: 'show',
+    event: 'showChange'
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    boardInfo: {},//state 1:未公开; 4-待审批;5-已驳回;6-已通过
+  },
+  watch: {
+    show(n){
+      if(n){
+        this.classify=this.boardInfo.BiDashboardClassifyId||''
+        this.getClassifyList()
+      }
+    }
+  },
+  data() {
+    return {
+      list:[],
+      classify:''
+    }
+  },
+  created() {
+  },
+  methods: {
+    handleClose() {
+      this.classify=''
+      this.$emit('showChange', false)
+    },
+
+    handleBackCommon(){
+      apiBiBoard.cancelBoardCommon({
+        BiDashboardId:this.boardInfo.BiDashboardId,
+      }).then(res=>{
+        if(res.Ret===200){
+          this.$message.success('撤销成功')
+          this.handleClose()
+          this.$emit('change')
+        }
+      })
+    },
+
+    saveHandle(){
+      if(!this.classify){
+        this.$message.warning('请选择分类')
+        return
+      }
+      apiBiBoard.setBoardCommon({
+        BiDashboardId:this.boardInfo.BiDashboardId,
+        ClassifyId:this.classify
+      }).then(res=>{
+        if(res.Ret===200){
+          this.$message.success('提交成功')
+          this.handleClose()
+          this.$emit('change')
+        }
+      })
+    },
+
+    async getClassifyList(){
+      const res=await apiBiBoard.commonClassifyList()
+      if(res.Ret===200){
+        this.list=res.Data||[]
+      }
+    }
+
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.select-user-box {
+  margin-top: 20px;
+  padding: 20px;
+  border: 1px dashed #c8cdd9;
+}
+.board-title {
+  display: flex;
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 40px 0;
+}
+</style>

+ 185 - 0
src/views/BI_manage/components/SetShare.vue

@@ -0,0 +1,185 @@
+<template>
+  <el-dialog
+    title="共享当前看板"
+    :visible.sync="show"
+    :modal-append-to-body="false"
+    :close-on-click-modal="false"
+    :center="true"
+    v-dialogDrag
+    custom-class="dialogclass"
+    width="680px"
+    @close="handleClose"
+  >
+    <div class="BI-share-wrap">
+      <div>
+        <span style="color: #0052d9">共享看板</span>
+        <el-switch v-model="open"> </el-switch>
+        <el-cascader
+          style="width:450px"
+          v-show="open"
+          v-model="select_users"
+          :options="researcherList"
+          :show-all-levels="false"
+          filterable
+          collapse-tags
+          :props="{
+            value: 'ItemId',
+            label: 'ItemName',
+            children: 'Children',
+            expandTrigger: 'hover',
+            emitPath: false,
+            multiple: true,
+          }"
+          clearable
+          placeholder="选择共享人"
+          ref="selectUserEl"
+        />
+      </div>
+      <div class="select-user-box" v-if="open">
+        <el-tag
+          v-for="tag in select_user_names"
+          :key="tag.ItemId"
+          closable
+          @close="handleDeleteUser(tag.ItemId)"
+        >
+          {{ tag.ItemName }}
+        </el-tag>
+      </div>
+
+      <div class="dia-bot">
+        <el-button
+          type="primary"
+          plain
+          @click="handleClose"
+          style="margin-right: 20px"
+          >{{ $t("Dialog.cancel_btn") }}</el-button
+        >
+        <el-button type="primary" @click="saveHandle">{{
+          $t("Dialog.confirm_save_btn")
+        }}</el-button>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { dataAuthInterface } from '@/api/api.js';
+import apiBiBoard from '@/api/modules/BIBoard.js'
+export default {
+  name: "setShare",
+  model: {
+    prop: 'show',
+    event: 'showChange'
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    boardInfo:{}
+  },
+  watch: {
+    select_users(n){
+      if(this.open&&n){
+        this.getSelectUserNames()
+      }
+    },
+    show(n){
+      if(n){
+        this.open=this.boardInfo.IsGrant?true:false
+        this.getSelectUser()
+      }
+    }
+  },
+  data() {
+    return {
+      open: false,
+      select_users: '',
+      researcherList: [],
+      select_user_names:[],
+    }
+  },
+  created() {
+    this.getSystemUserList()
+  },
+  methods: {
+    async saveHandle(){
+      if(!this.open){
+        const res=await apiBiBoard.cancelBoardShare({
+          BiDashboardId:this.boardInfo.BiDashboardId
+        })
+        if(res.Ret!==200)return
+        this.$message.success('保存成功')
+        this.handleClose()
+        this.$emit('change')
+        return
+      }
+
+      if(!this.select_users){
+        this.$message.warning('请选择共享人')
+        return
+      }
+      const res=await apiBiBoard.setBoardShare({
+        BiDashboardId:this.boardInfo.BiDashboardId,
+        AdminIdStr:this.select_users.join(',')
+      })
+      if(res.Ret===200){
+        this.$message.success('保存成功')
+        this.handleClose()
+        this.$emit('change')
+      }
+    },
+
+    getSelectUserNames(){
+      this.$nextTick(()=>{
+          const data=this.$refs.selectUserEl.getCheckedNodes()
+          this.select_user_names=data.map(item=>{
+            return item.data
+          })
+        })
+    },
+
+    getSelectUser(){
+      apiBiBoard.getBoardShareUsers({
+        BiDashboardId:this.boardInfo.BiDashboardId
+      }).then(res=>{
+        if(res.Ret===200&&res.Data){
+          this.select_users=res.Data.split(',')
+          this.getSelectUserNames()
+        }
+      })
+    },
+
+    handleClose() {
+      this.open=false
+      this.select_users=''
+      this.select_user_names=[]
+      this.$emit('showChange', false)
+    },
+    async getSystemUserList() {
+      const res = await dataAuthInterface.userSearch();
+      if (res.Ret !== 200) return
+      this.researcherList = res.Data || []
+    },
+    handleDeleteUser(val){
+      this.select_users = this.select_users.filter(item => item !== val)
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.select-user-box {
+  margin-top: 20px;
+  padding: 20px;
+  border: 1px dashed #c8cdd9;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 5px;
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 40px 0;
+}
+</style>

+ 287 - 0
src/views/BI_manage/components/TableBox.vue

@@ -0,0 +1,287 @@
+<template>
+  <div
+    class="table-box"
+    v-if="compData"
+    ref="compRef"
+    v-loading="loading"
+    element-loading-text="拼命加载中"
+  >
+    <div class="top-title-box">
+      <div class="title" @click="goDetail">{{ info&&info.ExcelName }}</div>
+      <div class="opt-box">
+        <img
+          class="icon"
+          src="~@/assets/img/icons/refresh_blue_new.png"
+          alt=""
+          v-permission="permissionBtn.BIBoardPermission.BIBoard_refresh"
+          @click="handleRefresh"
+        />
+        <slot name="drag"></slot>
+        <slot name="delete"></slot>
+      </div>
+    </div>
+    <!-- 无权限 -->
+    <div class="nodata" v-if="!info">
+      <noDataAuth text="暂无数据" />
+    </div>
+    <div class="table-render-wrap" v-else>
+    <div class="table-wrapper pc-sty" >
+      <table
+        cellpadding="0"
+        cellspacing="0"
+        :style="`font-size: ${info.Config.FontSize || 12}px`"
+      >
+        <tbody>
+          <tr v-for="(item, index) in info.TableInfo.TableDataList" :key="index">
+            <td
+              :class="[
+                'data-cell',
+                {
+                  'one-bg': (index + 1) % 2 && index > 0,
+                  'tow-bg': (index + 1) % 2 !== 0 && index > 0,
+                  'head-column': index === 0,
+                },
+              ]"
+              v-for="(cell, cell_index) in item"
+              :key="cell_index"
+              :colspan="cell.mc.cs || 1"
+              :rowspan="cell.mc.rs || 1"
+              :style="`
+            color: ${cell.fc};
+            font-weight: ${cell.bl ? 'bold' : 'normal'};
+            font-style: ${cell.it ? 'italic' : 'normal'};
+            background: ${cell.bg};
+          `"
+            >
+              <!-- 单元格拆分 -->
+              <div class="split-word" v-if="cell.ct.s">
+                <span
+                  v-for="(word, word_index) in cell.ct.s"
+                  :key="`${index}_${cell_index}_${word_index}`"
+                  :style="`
+                color: ${word.fc};
+                font-weight: ${word.bl ? 'bold' : 'normal'};
+                font-style: ${word.it ? 'italic' : 'normal'};
+              `"
+                  >{{ word.v }}</span
+                >
+              </div>
+              <div v-else>{{ cell.m }}</div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+import * as sheetInterface from "@/api/modules/sheetApi.js";
+export default {
+  props: {
+    compData: null
+  },
+  data() {
+    return {
+      loading: true,
+      observer: null,
+      isVisible: false, // 是否可见
+      info:null,
+    }
+  },
+  mounted() {
+    console.log('表格组件挂载',);
+    this.createObserver();
+  },
+  beforeUnmount() {
+    if (this.observer) {
+      this.observer.disconnect();
+    }
+  },
+  methods: {
+    goDetail() {
+      const pathMap = new Map([
+        [1, '/sheetList'],
+        [2, '/sheetTimeList'],
+        [3, '/sheetMixedList'],
+      ])
+      const href = this.$router.resolve({
+        path: pathMap.get(this.info.Source),
+        query: {
+          code: this.info.UniqueCode,
+          id: this.info.ExcelInfoId
+        }
+      }).href
+      window.open(href, "_blank")
+    },
+
+    handleRefresh: _.debounce(async function () {
+      if(this.loading) return
+      this.loading = true
+      const res = await sheetInterface.refreshCustomSheet({
+        ExcelInfoId: this.info.ExcelInfoId,
+      });
+      this.loading=false
+
+      if (res.Ret !== 200) return;
+      this.$message.success(this.$t('ETable.Msg.refresh_success_msg') );
+      this.handleGetTableData()
+    }, 300),
+
+    // 获取表格数据
+    async handleGetTableData() {
+      const res = await apiBiBoard.tableDetail({ UniqueCode: this.compData.UniqueCode })
+      this.loading = false
+      if (res.Ret !== 200) return;
+      this.info=res.Data
+    },
+
+    // 利用判断是否进入可视区域 来加载数据 
+    // 如果加载过了就不用再加载了
+    createObserver() {
+      const options = {
+        root: null, // 使用浏览器可视区域为根
+        threshold: 0.1, // 当至少10%的内容进入可视区时触发回调
+      };
+
+      this.observer = new IntersectionObserver(this.handleIntersect, options);
+      this.observer.observe(this.$refs.compRef); // 监听组件
+    },
+    handleIntersect(entries) {
+      if (this.isVisible) return
+      entries.forEach(entry => {
+        // 判断是否在可视范围内
+        if (entry.isIntersecting) {
+          this.isVisible = true;
+          console.log('Component is visible');
+          // 在这里你可以执行其他操作,比如懒加载数据或图片等
+          this.handleGetTableData()
+        }
+      });
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.table-box {
+  width: 100%;
+  height: 100%;
+  padding: 20px;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  .top-title-box {
+    display: flex;
+    margin-bottom: 10px;
+    .title {
+      font-size: 20px;
+      font-weight: bold;
+      flex: 1;
+      &::before {
+        content: "";
+        display: inline-block;
+        width: 4px;
+        height: 20px;
+        background-color: #0052d9;
+        position: relative;
+        top: 2px;
+        margin-right: 5px;
+      }
+    }
+    .opt-box {
+      flex-shrink: 0;
+      margin-left: 10px;
+      .icon {
+        width: 24px;
+        height: 24px;
+        margin-left: 5px;
+      }
+    }
+  }
+  ::-webkit-scrollbar {
+  width: 6px;
+  height: 6px;
+}
+::-webkit-scrollbar-track {
+  background: rgb(239, 239, 239);
+  border-radius: 2px;
+}
+::-webkit-scrollbar-thumb {
+  background: #ccc;
+  border-radius: 10px;
+}
+::-webkit-scrollbar-thumb:hover {
+  background: #888;
+}
+::-webkit-scrollbar-corner {
+  background: #666;
+}
+.table-render-wrap{
+  width: 100%;
+  flex: 1;
+  height: 100%;
+  overflow-y: auto;
+}
+.table-wrapper {
+  max-width: calc(100vw - 20px);
+  margin: 0 auto;
+  overflow: auto;
+}
+table {
+  width: 100%;
+  font-size: 14px;
+  color: #333;
+  td,
+  th {
+    // min-width: 120px;
+    word-break: break-all;
+    word-wrap: break-word;
+    line-height: 1.2em;
+    border: 1px solid #dcdfe6;
+    // height: 40px;
+    text-align: center;
+    background-color: #fff;
+    border-left: none;
+    border-top: none;
+    &:first-child {
+			border-left: 1px solid #dcdfe6;
+		}
+  }
+
+  .data-cell{
+    color: #333;
+    &.one-bg {
+      background-color: #EFEEF1;
+    }
+    &.two-bg {
+      background-color: #fff;
+    }
+  }
+
+  .thead-sticky {
+    position: sticky;
+    top: 0;
+  }
+
+  .head-column {
+    background-color: #505B78;
+    color: #fff;
+  }
+  .split-word {
+    span { display: inline; }
+  }
+}
+
+.pc-sty table {
+  table-layout: auto;
+  td,th {
+    width: auto;
+    height: auto;
+    padding: 0.4em 0;
+  }
+}
+}
+</style>

+ 150 - 0
src/views/BI_manage/editBoard.vue

@@ -0,0 +1,150 @@
+<template>
+  <div class="edit-BI-board-page">
+    <div class="top-box">
+      <el-input
+        placeholder="请输入看板名称"
+        v-model="name"
+        style="width: 300px; margin-right: 20px"
+      ></el-input>
+      <el-button type="primary" plain @click="showSelectTable = true"
+        >添加表格</el-button
+      >
+      <el-button type="primary" plain @click="showSelectChart = true"
+        >添加图表</el-button
+      >
+      <div class="right-btns">
+        <el-button type="primary" plain @click="$router.back()">取消</el-button>
+        <el-button type="primary" @click="handleSave">保存</el-button>
+      </div>
+    </div>
+    <!-- 看板内容模块 -->
+    <BIBoardContent v-model="boardDataList" :canDelete="true" :canDrag="true" />
+
+    <!-- 选择图表 -->
+    <SelectChart
+      v-model="showSelectChart"
+      @addChart="handleAddComp('chart', $event)"
+    />
+    <!-- 选择表格 -->
+    <SelectTable
+      v-model="showSelectTable"
+      @addTable="handleAddComp('table', $event)"
+    />
+  </div>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+import BIBoardContent from './components/BoardContent.vue'
+import SelectChart from './components/SelectChart.vue'
+import SelectTable from './components/SelectTable.vue'
+const MAX_COUNT = 50
+// 生成唯一ID 
+function createUniqueIdGenerator() {
+  let id = 0;
+  return function generateUniqueId() {
+    id += 1;
+    return `selfId_${id}`;
+  };
+}
+const getUniqueId = createUniqueIdGenerator();
+
+export default {
+  components: {
+    BIBoardContent,
+    SelectChart,
+    SelectTable
+  },
+  data() {
+    return {
+      name: '',
+      boardDataList: [],
+
+      showSelectChart: false,
+      showSelectTable: false
+    }
+  },
+  created() {
+    if(this.$route.query.id){
+      this.getBoardDetail()
+    }
+  },
+  methods: {
+    // 获取看板详情
+    async getBoardDetail(){
+      const res=await apiBiBoard.boardDetail({DashboardId:Number(this.$route.query.id)})
+      if(res.Ret===200){
+        this.name=res.Data.BiDashboardName
+        this.boardDataList=res.Data.List||[]
+      }
+    },
+
+    async handleSave() {
+      if (!this.name) {
+        this.$message.warning('请填写看板名称')
+        return
+      }
+      if (this.boardDataList.length === 0) {
+        this.$message.warning('请至少选择一个图表或表格!')
+        return
+      }
+
+      const arr=this.boardDataList.map(item=>{
+        return {
+          Type:item.Type,
+          UniqueCode:item.UniqueCode
+        }
+      })
+      const params={
+        BiDashboardName:this.name,
+        List:arr||[]
+      }
+      const res=this.$route.query.id?await apiBiBoard.editBoard({
+        BiDashboardId:Number(this.$route.query.id),
+        ...params
+      }) :await apiBiBoard.addBoard(params)
+      if(res.Ret===200){
+        this.$message.success(this.$route.query.id?'编辑成功':'新增成功')
+        setTimeout(() => {
+          this.$router.back()
+        }, 1000);
+      }
+
+    },
+
+    handleAddComp(type, data) {
+      const arr = data || []
+      if (this.boardDataList.length + arr.length > MAX_COUNT) {
+        this.$message.warning('添加已达上限(上限50)!')
+        return
+      }
+      arr.forEach(item => {
+        const obj = {
+          Type: type === 'chart' ? 1 : 2,
+          UniqueCode:item.UniqueCode,
+          BiDashboardDetailId:getUniqueId()
+        }
+        this.boardDataList.push(obj)
+      });
+
+      this.showSelectChart = false
+      this.showSelectTable = false
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.edit-BI-board-page {
+  $border-color: #c8cdd9;
+  background-color: #fff;
+  border: 1px solid $border-color;
+  .top-box {
+    padding: 14px 20px;
+    border-bottom: 1px solid $border-color;
+    .right-btns {
+      float: right;
+    }
+  }
+}
+</style>

+ 415 - 0
src/views/BI_manage/index.vue

@@ -0,0 +1,415 @@
+<template>
+  <div class="BI-page">
+    <div class="top-nav-box">
+      <div class="nav-btns">
+        <el-button
+          class="nav-btn"
+          type="primary"
+          :plain="navType !== 1"
+          @click="handleNavTypeChange(1)"
+          >我的看板</el-button
+        >
+        <el-button
+          class="nav-btn"
+          type="primary"
+          :plain="navType !== 2"
+          @click="handleNavTypeChange(2)"
+          >共享看板</el-button
+        >
+        <el-button
+          class="nav-btn"
+          type="primary"
+          :plain="navType !== 3"
+          @click="handleNavTypeChange(3)"
+          >公共看板</el-button
+        >
+      </div>
+      <!-- 添加看板 -->
+      <div class="right-btn-box" v-if="navType === 1">
+        <el-button
+          type="primary"
+          @click="$router.push('/editBIBoard')"
+          v-permission="permissionBtn.BIBoardPermission.BIBoard_add"
+          >添加看板</el-button
+        >
+      </div>
+      <!-- 设置公共看板分类 -->
+      <div class="right-btn-box" v-if="navType === 3">
+        <el-button
+          type="primary"
+          @click="showCommonClassify = true"
+          v-permission="permissionBtn.BIBoardPermission.BIBoard_addclassify"
+          >设置公共看板分类</el-button
+        >
+      </div>
+    </div>
+    <div class="opt-box" >
+      <!-- 我的看板  -->
+      <el-select
+        v-model="selectBoardId"
+        placeholder="请选择看板"
+        v-if="navType === 1"
+      >
+        <el-option
+          v-for="item in myBoardList"
+          :key="item.BiDashboardId"
+          :value="item.BiDashboardId"
+          :label="item.BiDashboardName"
+        ></el-option>
+      </el-select>
+      <!-- 共享看板 -->
+      <el-cascader
+        v-model="selectBoardId"
+        :props="{ emitPath: false }"
+        :options="shareBoardList"
+        v-if="navType === 2"
+        key="2"
+      ></el-cascader>
+      <!-- 公共看板 -->
+      <el-cascader
+        v-model="selectBoardId"
+        :props="{ emitPath: false,value:'GroupId',label:'GroupName',children:'Children'  }"
+        :options="commonBoardList"
+        v-if="navType === 3"
+        key="3"
+      ></el-cascader>
+
+      <div class="right-opt-box" v-if="boardInfo">
+        <el-button
+          v-if="navType === 1&&permissionBtn.isShowBtn('BIBoardPermission','BIBoard_setcommon')"
+          type="text"
+          @click="showSetCommon = true"
+          >设置公共</el-button
+        >
+        <el-button 
+          type="text" 
+          @click="showSetShare = true" 
+          v-if="navType !== 3&&permissionBtn.isShowBtn('BIBoardPermission','BIBoard_setshare')&&currentBoardIsSelf"
+        >设置共享</el-button>
+        <el-button 
+          type="text" 
+          @click="handleGoEdit" 
+          v-if="canEdit"
+        >{{boardInfo.IsEditing?boardInfo.Editor.Editor+'编辑中...':'编辑'}}</el-button>
+        <el-button type="text" style="color: #f00" v-if="canDelete" @click="handleDeleteBoard">删除</el-button>
+        <el-button type="text" v-if="navType === 1&&[4,5,6].includes(boardInfo.State)" @click="handleBackSetCommon">撤销</el-button>
+      </div>
+    </div>
+    <!-- 看板内容模块 -->
+    <BIBoardContent v-model="boardDataList" :boardInfo="boardInfo"/>
+
+    <!-- 设置共享 -->
+    <set-share v-model="showSetShare" :boardInfo="boardInfo" @change="handleSetShareBack"/>
+    <!-- 设置公共 -->
+    <SetCommon v-model="showSetCommon" :boardInfo="boardInfo" @change="handleSetCommonBack"/>
+    <!-- 公共看板分类 -->
+    <CommonClassify v-model="showCommonClassify" @change="getCommonBoardList('update')"/>
+  </div>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+import BIBoardContent from './components/BoardContent.vue'
+import CommonClassify from './components/CommonClassify.vue'
+import SetCommon from './components/SetCommon.vue'
+import SetShare from './components/SetShare.vue'
+
+export default {
+  components: { BIBoardContent, SetShare, SetCommon, CommonClassify },
+  computed: {
+    currentBoardIsSelf(){//判断当前看板是否为当前用户创建的
+      if(!this.boardInfo) return false
+      const localAdminId=localStorage.getItem('AdminId')
+      return localAdminId==this.boardInfo.SysAdminId
+    },
+    canEdit(){
+      if(!this.boardInfo) return false
+      return this.navType !== 3&&this.permissionBtn.isShowBtn('BIBoardPermission','BIBoard_edit')&&this.boardInfo.State===1
+    },
+    canDelete(){
+      if(!this.boardInfo) return false
+      return this.navType !== 3&&this.permissionBtn.isShowBtn('BIBoardPermission','BIBoard_delete')&&this.currentBoardIsSelf&&this.boardInfo.State===1
+    }
+  },
+  data() {
+    return {
+      navType: 1,// 
+
+      boardInfo: null,//看板详情数据
+      boardDataList: [],//看板数据
+
+      selectBoardId: '',//当前选择的看板id
+      myBoardList: [],
+      shareBoardList: [],
+      commonBoardList: [],
+
+      showSetShare: false,
+      showSetCommon: false,
+      showCommonClassify: false,
+    }
+  },
+  watch: {
+    selectBoardId(n) {
+      n && this.getBoardDetail()
+    }
+  },
+  created() {
+    if(this.$route.query.id){
+      
+      this.selectBoardId=Number(this.$route.query.id)
+      this.navType=Number(this.$route.query.type)
+      if(this.$route.query.type==1){
+        this.getMyBoardList('init')
+      }else if(this.$route.query.type==2){
+        this.getShareBoardList('init')
+      }else if(this.$route.query.type==3){
+        this.getCommonBoardList('init')
+      }
+
+    }else{
+      this.getMyBoardList()
+    }
+    
+  },
+  methods: {
+    // 撤回设置公共
+    handleBackSetCommon(){
+      apiBiBoard.cancelBoardCommon({
+        BiDashboardId:this.boardInfo.BiDashboardId,
+      }).then(res=>{
+        if(res.Ret===200){
+          this.$message.success('撤销成功')
+          this.getBoardDetail()
+        }
+      })
+    },
+
+    async handleGoEdit() {
+      if(this.boardInfo.IsEditing&&this.boardInfo.Editor.AdminId!==Number(localStorage.getItem('AdminId'))){
+        this.$message.warning(`${this.boardInfo.Editor.Editor}${this.$t('Slides.editing_progress_msg') }...`)
+        return
+      }
+      const res=await apiBiBoard.editBoardLock({BiDashboardId:this.selectBoardId,Status:0})
+      if(res.Ret!==200) return
+      if(res.Data&&res.Data.IsEditing&&res.Data.AdminId!==Number(localStorage.getItem('AdminId'))){
+        this.boardInfo.Editor=res.Data
+        this.boardInfo.IsEditing=true
+        this.$message.warning(`${res.Data.Editor}${this.$t('Slides.editing_progress_msg') }...`)
+        return
+      }
+      //调接口加锁然后跳转
+      const resLock = await apiBiBoard.editBoardLock({BiDashboardId:this.selectBoardId,Status:1})
+      if(resLock.Ret!==200) return
+
+      this.$router.push({
+        path: "/editBIBoard",
+        query: {
+          id: this.selectBoardId
+        }
+      })
+    },
+
+    // 删除看板
+    async handleDeleteBoard(){
+      await this.$confirm('删除后不可恢复,是否确认删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+      const res=await apiBiBoard.deleteBoard({
+        BiDashboardId:this.boardInfo.BiDashboardId
+      })
+      if(res.Ret!==200) return
+      this.$message.success('删除成功')
+      this.selectBoardId =''
+      this.boardDataList = []
+      this.boardInfo = null
+      if (this.navType === 1) {
+        this.getMyBoardList()
+        return
+      }
+      if (this.navType === 2) {
+        this.getShareBoardList()
+        return
+      }
+    },
+
+    // 获取看板详情
+    async getBoardDetail() {
+      const res = await apiBiBoard.boardDetail({ DashboardId: this.selectBoardId })
+      if (res.Ret === 200) {
+        this.boardInfo = res.Data
+        this.boardDataList = res.Data.List || []
+      }
+    },
+
+    // 设置公共回调
+    handleSetCommonBack(){
+      this.getBoardDetail()
+    },
+
+    // 设置共享回调
+    handleSetShareBack(){
+      if(this.navType===1){
+        this.getBoardDetail()
+        return
+      }
+      if(this.navType===2){
+        this.getShareBoardList()
+        return
+      }
+      
+    },
+
+    // 我的看板列表
+    async getMyBoardList(type) {
+      const res = await apiBiBoard.myBoardList()
+      if (res.Ret === 200) {
+        this.myBoardList = res.Data || []
+        // 编辑了分类回调 不更新选择的看板仅仅更新公共看板列表数据
+        if(['update','init'].includes(type)) return
+        if (this.myBoardList.length > 0) {
+          this.selectBoardId = this.myBoardList[0].BiDashboardId
+        }
+      }
+    },
+
+    // 共享看板列表
+    async getShareBoardList(type) {
+      const res = await apiBiBoard.shareBoardList()
+      if (res.Ret === 200) {
+        const myArr = res.Data.MyList || []
+        const otherArr = res.Data.OtherList || []
+        const boardIds = []
+        this.shareBoardList = [
+          {
+            label: '我共享的',
+            value: 'my_share',
+            children: myArr.map(item => {
+              boardIds.push(item.BiDashboardId)
+              return {
+                label: item.BiDashboardName,
+                value: item.BiDashboardId
+              }
+            })
+          },
+          {
+            label: '共享给我的',
+            value: 'other_share',
+            children: otherArr.map(item => {
+              const cArr=item.DashboardList.map(_i=>{
+                boardIds.push(_i.BiDashboardId)
+                return{
+                  label: _i.BiDashboardName,
+                  value: _i.BiDashboardId,
+                }
+              })
+              return {
+                label: item.GroupName,
+                value: item.GroupId,
+                children:cArr
+              }
+            })
+          }
+        ]
+        // 编辑了分类回调 不更新选择的看板仅仅更新公共看板列表数据
+        if(['update','init'].includes(type)) return
+        if (boardIds.length > 0) {
+          this.selectBoardId = boardIds[0]
+        }
+      }
+    },
+
+    // 公共看板列表
+    async getCommonBoardList(type) {
+      const res = await apiBiBoard.commonBoardList()
+      if (res.Ret === 200) {
+        const arr = res.Data || []
+        let boardIdArr=[]
+
+        arr.forEach(item1 => {
+          item1.GroupId=item1.GroupId+item1.GroupName
+          if(item1.Children){
+            item1.Children.forEach(item2=>{
+              const dArr=item2.DashboardList||[]
+              item2.GroupId=item2.GroupId+item2.GroupName
+              item2.Children=dArr.map(item3=>{
+                boardIdArr.push(item3.BiDashboardId)
+                return {
+                  GroupId:item3.BiDashboardId,
+                  GroupName:item3.BiDashboardName
+                }
+              })
+            })
+          }
+        });
+
+        this.commonBoardList=arr
+        // 编辑了分类回调 不更新选择的看板仅仅更新公共看板列表数据
+        if(['update','init'].includes(type)) return
+        // 选择第一个看板
+        if(boardIdArr.length>0){
+          this.selectBoardId = boardIdArr[0]
+        }
+      }
+    },
+
+    handleNavTypeChange(e) {
+      if (this.navType === e) return
+      this.navType = e
+
+      this.selectBoardId = ''
+      this.boardDataList = []
+      this.boardInfo = null
+      if (this.navType === 1) {
+        this.getMyBoardList()
+        return
+      }
+      if (this.navType === 2) {
+        this.getShareBoardList()
+        return
+      }
+      if (this.navType === 3) {
+        this.getCommonBoardList()
+        return
+      }
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.BI-page {
+  $border-color: #c8cdd9;
+  background-color: #fff;
+  border: 1px solid $border-color;
+  .top-nav-box {
+    padding: 14px 20px;
+    border-bottom: 1px solid $border-color;
+    position: relative;
+    .nav-btns {
+      position: relative;
+      bottom: -15px;
+      .nav-btn {
+        border-bottom: none;
+        border-bottom-left-radius: 0;
+        border-bottom-right-radius: 0;
+      }
+    }
+    .right-btn-box {
+      position: absolute;
+      right: 20px;
+      top: 14px;
+      border-left: 1px solid $border-color;
+      padding-left: 10px;
+    }
+  }
+  .opt-box {
+    padding: 14px 20px;
+    border-bottom: 1px solid $border-color;
+    .right-opt-box {
+      float: right;
+    }
+  }
+}
+</style>

+ 10 - 1
src/views/Home.vue

@@ -42,7 +42,7 @@
                         ? $setting.theme_color
                         : '#666'
                     }`"
-                    @click="(e) => e.preventDefault()"
+                    @click="handleClickSubMenuItem(item, $event)"
                   >
                     <img
                       :src="getMenuIcon(item)"
@@ -284,6 +284,10 @@
           </div>
 
           <div class="right_section">
+            <div style="display:flex;align-items:center;gap:0 5px" @click="handleGoSJJD">
+              <img style="width:24px" src="~@/assets/img/icons/home_sjjd.png" alt="">
+              <span>数据节点</span>
+            </div>
             <div class="userinfo">
               <div class="userinfo-fingerpost">
                 <!-- <el-button
@@ -625,6 +629,11 @@ export default {
       ])
       return iconMap.get(item.name) || require('@/assets/icons/menu/icon01.png')
     },
+    
+    // 跳转数据节点
+    handleGoSJJD(){
+      window.open('https://www.baidu.com', '_blank')
+    },
 
     handleClickSubMenuItem(item, e) {
       e.preventDefault();

+ 81 - 31
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="看板加载中...">
+                <BIBoardContent :value="boardDataList" renderHeight="calc(100vh - 250px)" />
+            </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>
@@ -65,12 +70,13 @@ import RejectDialog from './components/rejectDialog.vue';
 import {approveInterence} from '@/api/modules/approve.js';
 import {departInterence} from '@/api/api.js'
 import reportApproveConfig from "@/mixins/reportApproveConfig.js"
+import apiBiBoard from '@/api/modules/BIBoard.js'
+import BIBoardContent from '@/views/BI_manage/components/BoardContent.vue';
 
 const ApproveType = ['','依次审批','会签','或签']
 const ApproveState = ['','待审批','已同意','已驳回']
 export default {
     mixins:[reportApproveConfig],
-    components: { RejectDialog },
     data() {
         return {
             isError:false,
@@ -78,6 +84,7 @@ export default {
             isDetailDialogShow:false,
             TimeLineData:[],
             formType:'detail',//进入审批详情的方式:approve(待处理)/detail(已处理)/myself(我发起的)
+            mainType:'report', //report(研报) bi(bi看板)
             reportInfo:{ //报告相关信息
                 reportId:0,//研报or智能研报的报告id
                 title:'',
@@ -92,12 +99,13 @@ export default {
                 isCurrentApprover:false,//审批进行中的节点审批人是否是当前用户,控制通过&驳回按钮显示
             },
             waterMarkStr:'',//水印
+            boardDataList:[],
         };
     },
     computed:{
         UserId(){
             return Number(localStorage.getItem("AdminId"));
-        }
+        },
     },
     methods: {
         getApproveDetail(){
@@ -124,12 +132,42 @@ 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]
+                this.getBoardDetail();
+            })
+        },
+        async getBoardDetail() {
+            this.isLoading = true;
+            const res = await apiBiBoard.boardDetail({ DashboardId: +this.reportInfo.BiId })
+            this.isLoading = false;
+            if (res.Ret === 200) {
+                this.boardDataList = res.Data.List || []
+            }
+        },
         //转换接口数据
         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 +178,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 +186,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 +199,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 +267,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 +304,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 +335,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,10 +366,14 @@ 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 }
+    components: { TimeLine, ReportDetail, Reportdtl, RejectDialog, BIBoardContent }
 };
 </script>
 

+ 57 - 20
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,31 +112,48 @@ 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 || ''
+                }
+            })
         },
-        getFlowDetail(){
+        routerBack(){
+            this.$router.replace({
+                path:'/approveSetting',
+                query:{
+                    mainType: this.mainType || ''
+                }
+            })
+        },
+        getReportFlowDetail(){
             const id = this.$route.query.flowId||0
             if(id){
                 approveInterence.getApproveFlowDetail({
@@ -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.getReportFlowDetail() : this.getBiFlowDetail();
+            }
+        },
+
     },
-    async mounted(){
-        this.getClassifyTree()
+    created(){
+        this.mainType = this.$route.query.mainType;
+        this.$route.query.mainType == 'report' ? this.getClassifyTree() : this.getBIClassifyTree() ;
     },
     components: { FlowEdiotr }
 };

+ 121 - 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,93 @@ 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';
+          tabName == 'report' ? this.getClassifyTree() : this.getBIClassifyTree();
+          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 +314,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==='BI看板名称') 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 +331,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.bIDashboard_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 }
 };

+ 130 - 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,148 @@ 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();
+          tabName == 'report' ? this.getClassifyTree() : this.getBIClassifyTree();
+          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.bIDashboard_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:'BI看板名称'
+    },{
+        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:'BI看板名称'
+    },{
+        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:'BI看板名称'
+    },{
+        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
+            })
+        },
     }
 }

+ 12 - 16
src/views/classify_manage/chapterSettingV2.vue

@@ -69,7 +69,7 @@
                     :placeholder="$t('ReportManage.CategoryList.related_variety_inputhint')"></el-input>
                 </el-form-item>
                 <!-- 关联品种 -->
-                <el-form-item prop="variety" :label="$t('ReportManage.CategoryList.related_variety')" v-if="reportVarietyList.length">
+                <!-- <el-form-item prop="variety" :label="$t('ReportManage.CategoryList.related_variety')" v-if="reportVarietyList.length">
                     <template slot="label">
                         <el-tooltip class="item" effect="dark" :content="$t('ReportManage.CategoryList.related_variety_hint')">
                             <div>
@@ -86,7 +86,7 @@
                         :props="{value:'PermissionId',label:'PermissionName',children:'Child',multiple: true,emitPath:false}" 
                         style="width:317px;"
                     ></el-cascader>
-                </el-form-item>
+                </el-form-item> -->
             </el-form>
         </div>
         <div solt="footer" style="padding: 20px 0;text-align: center;">
@@ -121,18 +121,17 @@ export default {
             addForm:{
                 ReportChapterTypeName:"",
                 // ResearchType:"",.
-                ChartPermissionIdList:''
             },
             researchType:'',// day-晨报;week-周报
             parentClassifyName: '',
 
-            reportVarietyList:[],//中文品种列表
+            // reportVarietyList:[],//中文品种列表
         }
     },
     mounted(){
         this.parentClassifyName = this.$route.query.classifyName || ''
         this.getList()
-        this.getReportVarietyList()
+        // this.getReportVarietyList()
     },
     methods: {
         getList(type){
@@ -147,7 +146,6 @@ export default {
             this.dialogTitle=this.$t('ReportManage.CategoryList.add_section')
             this.addDialogShow=true
             this.addForm.ReportChapterTypeName=''
-            this.addForm.ChartPermissionIdList=''
             this.addForm.ReportChapterTypeId=0
             console.log(this.addForm);
         },
@@ -158,7 +156,6 @@ export default {
                 ...this.addForm,
                 ReportChapterTypeName:row.ReportChapterTypeName,
                 ReportChapterTypeId:row.ReportChapterTypeId,
-                ChartPermissionIdList:row.ChartPermissionIdList||''
             }
             this.dialogTitle=this.$t('ReportManage.CategoryList.edit_section')
             this.addDialogShow=true
@@ -172,7 +169,6 @@ export default {
             let params={
                 ...this.addForm,
                 ClassifyId: Number(this.$route.query.id),
-                ChartPermissionIdList:this.addForm.ChartPermissionIdList||[]
             }
             // 请求方法
             let requestMethod;
@@ -211,14 +207,14 @@ export default {
         
 
         // 获取品种数据
-        getReportVarietyList(){
-            reportV2Interface.getClassifyPermissionList({
-                ClassifyId: Number(this.$route.query.id),
-            }).then(res=>{
-                this.reportVarietyList=res.Data||[]
-                this.filterNodes(this.reportVarietyList)
-            })
-        },
+        // getReportVarietyList(){
+        //     reportV2Interface.getClassifyPermissionList({
+        //         ClassifyId: Number(this.$route.query.id),
+        //     }).then(res=>{
+        //         this.reportVarietyList=res.Data||[]
+        //         this.filterNodes(this.reportVarietyList)
+        //     })
+        // },
 
         //启用\禁用设置
         handleEnableSet(item){

+ 12 - 14
src/views/classify_manage/classifylistV2.vue

@@ -120,7 +120,7 @@
                         </el-cascader>
                     </el-form-item>
                     <!-- 关联品种 -->
-                    <el-form-item prop="variety" :label="$t('ReportManage.CategoryList.related_variety')" v-if="canSetPermission">
+                    <!-- <el-form-item prop="variety" :label="$t('ReportManage.CategoryList.related_variety')" v-if="canSetPermission">
                         <template slot="label">
                             <el-tooltip class="item" effect="dark" :content="$t('ReportManage.CategoryList.related_variety_hint')">
                                 <div>
@@ -137,7 +137,7 @@
                             :props="{value:'PermissionId',label:'PermissionName',children:'Child',multiple: true,emitPath:false}" 
                             style="min-width:400px;"
                         ></el-cascader>
-                    </el-form-item>
+                    </el-form-item> -->
                 </el-form>
                 <div v-html="tips" style="color:#999;"></div>
             </div>
@@ -253,13 +253,12 @@ export default {
             isTransferReport: false,
             transferForm: {},
 
-            tips: `注:若上级分类已关联报告,则新建的第一个子分类默认继承上级分类(父分类)关联的品种、报告、审批流,且关联品种支持编辑。  `
-
+            tips: `注:若上级分类已关联报告,则新建的第一个子分类默认继承上级分类(父分类)关联的品种、报告、审批流。`
         }
     },
     mounted(){
         this.getList()
-        this.getReportVarietyList()
+        // this.getReportVarietyList()
     },
     methods: {
         /* 报告转移 */
@@ -294,7 +293,7 @@ export default {
                 let item = this.$refs.classifyRef.getCheckedNodes(true)
                 console.log(item)
                 if(item&&item.length) {
-                    this.classifyForm.variety = item[0].data.ChartPermissionIdList
+                    // this.classifyForm.variety = item[0].data.ChartPermissionIdList
                 }
             }
         },
@@ -330,7 +329,6 @@ export default {
                 classify_id:item.Id,
                 classify_name:item.ClassifyName,
                 parent_id: item.ParentId,
-                variety:item.ChartPermissionIdList||'',//关联的品种
                 isLastLevel: !item.Child
             }
         },
@@ -340,7 +338,7 @@ export default {
             let params = {
                 ClassifyName: classify_name,
                 ParentId: parent_id,
-                ChartPermissionIdList:this.classifyForm.variety||[]
+                // ChartPermissionIdList:this.classifyForm.variety||[]
             }
 
             const { Ret,Msg } = classify_id 
@@ -364,12 +362,12 @@ export default {
         },
 
         // 获取品种数据
-        getReportVarietyList(){
-            reportVarietyInterence.filterVarietyOpts().then(res=>{
-                console.log(res);
-                this.reportVarietyList=res.Data||[]
-            })
-        },
+        // getReportVarietyList(){
+        //     reportVarietyInterence.filterVarietyOpts().then(res=>{
+        //         console.log(res);
+        //         this.reportVarietyList=res.Data||[]
+        //     })
+        // },
 
         //启用\禁用设置
         handleEnableSet(item){

+ 0 - 66
src/views/home_manage/components/BIWrap.vue

@@ -1,66 +0,0 @@
-<template>
-  <div class="item-wrap">
-    <div class="lable-text">BI看板</div>
-    <div class="list-box">
-      <div class="list-item" v-for="item in 7" :key="item">
-        <div class="title">煤炭市场价格走势及影响因素(0921)</div>
-        <div class="author">创建人</div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-
-}
-</script>
-
-<style lang="scss" scoped>
-.item-wrap {
-  box-shadow: 0px 2px 12px 0px #0000001a;
-  border: 1px solid #c8cdd9;
-  background-color: #fff;
-  padding: 11px 16px;
-  border-radius: 8px;
-  width: calc(50% - 50px);
-  .lable-text {
-    padding-bottom: 13px;
-    border-bottom: 1px solid #c8cdd9;
-    &::before {
-      content: "";
-      display: inline-block;
-      width: 4px;
-      height: 12px;
-      background-color: #10CFDB;
-      margin-right: 12px;
-      position: relative;
-      top: 1px;
-    }
-  }
-  .list-box{
-    padding-top: 10px;
-    .list-item{
-      margin-top: 10px;
-      padding: 10px 20px;
-      background: #FFFFFF;
-      border: 1px solid #EBEFF6;
-      box-shadow: 0px 2px 4px 0px #00000005;
-      display: flex;
-      align-items: center;
-      border-radius: 8px;
-      &::before{
-        content: '';
-        display: inline-block;
-        width: 8px;
-        height: 8px;
-        margin-right: 10px;
-        background: #94E1EC;
-      }
-      .title{
-        flex: 1;
-      }
-    }
-  }
-}
-</style>

+ 0 - 81
src/views/home_manage/components/PointViewWrap.vue

@@ -1,81 +0,0 @@
-<template>
-  <div class="item-wrap">
-    <div class="lable-text">观点库</div>
-    <div class="content-box">
-      <div class="content-lable">已关注观点</div>
-      <div class="info-list">
-        <div class="info-item" v-for="item in 10" :key="item">
-          <div class="time">2018.3.20 12:00:00</div>
-          <div class="text">稳地价、稳房价、稳预期”成为楼市调控主基调</div>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-
-}
-</script>
-
-<style lang="scss" scoped>
-.item-wrap {
-  box-shadow: 0px 2px 12px 0px #0000001a;
-  border: 1px solid #c8cdd9;
-  background-color: #fff;
-  padding: 11px 16px;
-  border-radius: 8px;
-  width: calc(50% - 50px);
-  .lable-text {
-    padding-bottom: 13px;
-    border-bottom: 1px solid #c8cdd9;
-    &::before {
-      content: "";
-      display: inline-block;
-      width: 4px;
-      height: 12px;
-      background-color: #0052D9;
-      margin-right: 12px;
-      position: relative;
-      top: 1px;
-    }
-  }
-  .content-box {
-    margin-top: 13px;
-    padding: 15px;
-    background: #ECF2FE;
-    border: 1px solid #DAE8FF;
-    border-radius: 4px;
-    .content-lable {
-      color: #0052D9;
-      font-size: 16px;
-      font-weight: bold;
-    }
-    .info-list {
-      margin-top: 30px;
-      .info-item {
-        display: flex;
-        align-items: center;
-        margin-bottom: 10px;
-        color: #666;
-        &::before {
-          content: "";
-          display: inline-block;
-          width: 8px;
-          height: 8px;
-          background-color: #0052D9;
-          margin-right: 10px;
-        }
-        .time {
-          flex: 1;
-          text-align: center;
-        }
-        .text {
-          flex: 2;
-        }
-      }
-    }
-  }
-}
-</style>

+ 0 - 81
src/views/home_manage/components/PolicyWrap.vue

@@ -1,81 +0,0 @@
-<template>
-  <div class="item-wrap">
-    <div class="lable-text">政策库</div>
-    <div class="content-box">
-      <div class="content-lable">已关注政策</div>
-      <div class="info-list">
-        <div class="info-item" v-for="item in 10" :key="item">
-          <div class="time">2018.3.20 12:00:00</div>
-          <div class="text">稳地价、稳房价、稳预期”成为楼市调控主基调</div>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-
-}
-</script>
-
-<style lang="scss" scoped>
-.item-wrap{
-  box-shadow: 0px 2px 12px 0px #0000001A;
-  border: 1px solid #C8CDD9;
-  background-color: #fff ;
-  padding: 11px 16px;
-  border-radius: 8px;
-  width: calc(50% - 50px);
-  .lable-text{
-    padding-bottom: 13px;
-    border-bottom: 1px solid #C8CDD9;
-     &::before{
-       content: '';
-       display: inline-block;
-       width: 4px;
-       height: 12px;
-       background-color: #E37318;
-       margin-right: 12px;
-       position: relative;
-       top: 1px;
-     }
-  }
-  .content-box{
-    margin-top: 13px;
-    padding: 15px;
-    background: #FFF1E9;
-    border: 1px solid #FFD9C2;
-    border-radius: 4px;
-    .content-lable{
-      color: #E37318;
-      font-size: 16px;
-      font-weight: bold;
-    }
-    .info-list{
-      margin-top: 30px;
-      .info-item{
-        display: flex;
-        align-items: center;
-        margin-bottom: 10px;
-        color: #666;
-        .time{
-          flex: 1;
-          text-align: center;
-        }
-        .text{
-          flex: 2;
-          &::before{
-            content: '';
-            display: inline-block;
-            width: 8px;
-            height: 8px;
-            background-color: #F7BA1E;
-            margin-right: 10px;
-          }
-        }
-      }
-    }
-  }
-}
-</style>

+ 0 - 82
src/views/home_manage/components/ReportWrap.vue

@@ -1,82 +0,0 @@
-<template>
-  <div class="item-wrap">
-    <div class="lable-text">报告列表</div>
-    <div class="list-box">
-      <div class="list-item" v-for="item in 3" :key="item">
-        <div class="title">煤炭市场价格走势及影响因素(0921)</div>
-        <div class="des-text">
-          摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容摘要内容
-        </div>
-        <div class="time-text">2024.09.20</div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-
-}
-</script>
-
-<style lang="scss" scoped>
-.item-wrap {
-  box-shadow: 0px 2px 12px 0px #0000001a;
-  border: 1px solid #c8cdd9;
-  background-color: #fff;
-  padding: 11px 16px;
-  border-radius: 8px;
-  width: calc(50% - 50px);
-  .lable-text {
-    padding-bottom: 13px;
-    border-bottom: 1px solid #c8cdd9;
-    &::before {
-      content: "";
-      display: inline-block;
-      width: 4px;
-      height: 12px;
-      background-color: #8a18e3;
-      margin-right: 12px;
-      position: relative;
-      top: 1px;
-    }
-  }
-  .list-box {
-    padding-top: 10px;
-    .list-item {
-      margin-top: 10px;
-      padding: 10px 20px;
-      background: #ffffff;
-      border: 1px solid #ebeff6;
-      box-shadow: 0px 2px 4px 0px #00000005;
-      border-radius: 8px;
-      color: #666;
-      .title {
-        color: #333;
-        &::before {
-          content: "";
-          display: inline-block;
-          width: 8px;
-          height: 8px;
-          margin-right: 10px;
-          background: #e6c6ff;
-        }
-      }
-      .des-text{
-        margin: 5px 0;
-        line-height: 1.7;
-        padding-left: 18px;
-        display: -webkit-box;
-        overflow: hidden;
-        text-overflow: ellipsis;
-        -webkit-line-clamp: 2;
-        line-break: anywhere;
-        -webkit-box-orient: vertical;
-      }
-      .time-text{
-        padding-left: 18px;
-      }
-    }
-  }
-}
-</style>

+ 217 - 0
src/views/home_manage/components/SelectBoard.vue

@@ -0,0 +1,217 @@
+<template>
+  <el-dialog
+    title="设置首页内容"
+    :visible.sync="show"
+    :modal-append-to-body="false"
+    :close-on-click-modal="false"
+    :center="true"
+    v-dialogDrag
+    custom-class="dialogclass"
+    width="680px"
+    @close="handleClose"
+  >
+    <div class="set-board-wrap">
+      <div>BI看板</div>
+      <el-cascader
+        style="width:500px"
+        v-model="selectBoardId"
+        :props="{ emitPath: false }"
+        :options="list"
+        ref="selectBoardEl"
+      ></el-cascader>
+    </div>
+    <div class="dia-bot">
+        <el-button
+          type="primary"
+          plain
+          @click="handleClose"
+          style="margin-right: 20px"
+          >{{ $t("Dialog.cancel_btn") }}</el-button
+        >
+        <el-button type="primary" @click="saveHandle">{{
+          $t("Dialog.confirm_save_btn")
+        }}</el-button>
+      </div>
+  </el-dialog>
+</template>
+
+<script>
+import apiBiBoard from '@/api/modules/BIBoard.js'
+export default {
+  name: "selectBoard",
+  model: {
+    prop: 'show',
+    event: 'showChange'
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    boardId:'',
+    homeBoardInfo:null
+  },
+  watch: {
+    show(n) {
+      if (n) {
+        if(this.boardId&&this.homeBoardInfo){
+          if(this.homeBoardInfo.FromType===1){
+            this.selectBoardId='我的看板_'+this.boardId
+          }else if(this.homeBoardInfo.FromType===2){
+            this.selectBoardId='共享看板_'+this.boardId
+          }else{
+            this.selectBoardId='公共看板_'+this.boardId
+          }
+        }
+        
+        this.getList()
+      }
+    }
+  },
+  data() {
+    return {
+      list: [
+        {
+          label: '我的看板',
+          value: '我的看板',
+          children: []
+        },
+        {
+          label: '共享看板',
+          value: '共享看板',
+          children: []
+        },
+        {
+          label: '公共看板',
+          value: '公共看板',
+          children: []
+        }
+      ],
+      selectBoardId: ''
+    }
+  },
+  methods: {
+    async saveHandle(){
+      if(!this.selectBoardId){
+        this.$message.warning('请选择BI看板')
+        return
+      }
+      let FromType=3
+      const elData=this.$refs.selectBoardEl.getCheckedNodes()
+      if(elData[0].path[0]==='我的看板'){
+        FromType=1
+      }else if(elData[0].path[0]==='共享看板'){
+        FromType=2
+      }else{
+        FromType=3
+      }
+
+      const res=await apiBiBoard.setHomePageBoard({
+        BiDashboardId:Number(this.selectBoardId.split('_')[1]),
+        FromType:FromType
+      })
+      if(res.Ret===200){
+        this.$message.success('保存成功')
+        this.handleClose()
+        this.$emit('change')
+      }
+    },
+
+    // 看板列表
+    // 由于一个看板既可以在我的也可以在共享也可以在公共 所以id加个前缀
+    async getList(type) {
+      const resMy = await apiBiBoard.myBoardList()
+      if (resMy.Ret === 200) {
+        const arr = resMy.Data || []
+        this.list[0].children = arr.map(item => {
+          return {
+            label: item.BiDashboardName,
+            value: '我的看板_'+item.BiDashboardId
+          }
+        })
+      }
+
+      const resShare = await apiBiBoard.shareBoardList()
+      if (resShare.Ret === 200) {
+        const myArr = resShare.Data.MyList || []
+        const otherArr = resShare.Data.OtherList || []
+        this.list[1].children = [
+          {
+            label: '我共享的',
+            value: 'my_share',
+            children: myArr.map(item => {
+              return {
+                label: item.BiDashboardName,
+                value: '共享看板_'+item.BiDashboardId
+              }
+            })
+          },
+          {
+            label: '共享给我的',
+            value: 'other_share',
+            children: otherArr.map(item => {
+              const cArr=item.DashboardList.map(_i=>{
+                return{
+                  label: _i.BiDashboardName,
+                  value: '共享看板_'+_i.BiDashboardId,
+                }
+              })
+              return {
+                label: item.GroupName,
+                value: item.GroupId,
+                children:cArr
+              }
+            })
+          }
+        ]
+      }
+
+      const resCommon = await apiBiBoard.commonBoardList()
+      if(resCommon.Ret===200){
+        const arr=resCommon.Data||[]
+        this.list[2].children=arr.map(item1=>{
+          let obj1={
+            label:item1.GroupName,
+            value:item1.GroupId+item1.GroupName,
+            children:[]
+          }
+          obj1.children=item1.Children?item1.Children.map(item2=>{
+            let obj2={
+              label:item2.GroupName,
+              value:item2.GroupId+item2.GroupName,
+              children:[]
+            }
+            obj2.children=item2.DashboardList?item2.DashboardList.map(item3=>{
+              return {
+                label:item3.BiDashboardName,
+                value:'公共看板_'+item3.BiDashboardId,
+              }
+            }):[]
+            return obj2
+          }):[]
+
+          return obj1
+        })
+      }
+    },
+
+    handleClose() {
+      this.boardId = ''
+      this.$emit('showChange', false)
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.set-board-wrap{
+  display: flex;
+  align-items: center;
+  gap: 0 10px;
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 60px 0 40px 0;
+}
+</style>

+ 68 - 12
src/views/home_manage/index.vue

@@ -1,26 +1,82 @@
 <template>
   <div class="home-page">
-    <policy-wrap/>
-    <Point-view-wrap/>
-    <BIWrap/>
-    <ReportWrap/>
+    <div class="top-nav-box">
+      <div class="name">{{boardInfo&&boardInfo.BiDashboardName}}</div>
+      <div class="btns">
+        <el-button type="text" v-if="boardInfo&&permissionBtn.isShowBtn('homePagePermission','home_boarddetail')" @click="handleGoDetail">看板详情</el-button>
+        <el-button type="text" @click="showSet=true" v-permission="permissionBtn.homePagePermission.home_setbiboard">设置看板</el-button>
+      </div>
+    </div>
+    <!-- 看板内容模块 -->
+    <BIBoardContent v-model="boardDataList"/>
+
+    <!-- 设置看板 -->
+    <SelectBoard v-model="showSet" :boardId="boardId" :homeBoardInfo="homeBoardInfo" @change="getBoardData"/>
   </div>
 </template>
 
 <script>
-import BIWrap from './components/BIWrap.vue'
-import PointViewWrap from './components/PointViewWrap.vue'
-import PolicyWrap from './components/PolicyWrap.vue'
-import ReportWrap from './components/ReportWrap.vue'
+import BIBoardContent from '@/views/BI_manage/components/BoardContent.vue'
+import SelectBoard from './components/SelectBoard.vue'
+import apiBiBoard from '@/api/modules/BIBoard.js'
 export default {
-  components:{PolicyWrap,PointViewWrap,BIWrap,ReportWrap}
+  components:{BIBoardContent,SelectBoard},
+  data() {
+    return {
+      homeBoardInfo:null,
+      boardId:'',
+      boardInfo:null,
+      boardDataList:[],
+      showSet:false
+    }
+  },
+  created() {
+    this.getBoardData()
+  },
+  methods: {
+    handleGoDetail(){
+      this.$router.push({
+        path:'/BIBoard',
+        query:{
+          id:this.boardId,
+          type:this.homeBoardInfo.FromType
+        }
+      })
+    },
+
+    async getBoardInfo(){
+      const res=await apiBiBoard.boardDetail({ DashboardId: this.boardId })
+      if(res.Ret===200){
+        this.boardInfo = res.Data
+        this.boardDataList = res.Data.List || []
+      }
+    },
+
+    async getBoardData(){
+      const res=await apiBiBoard.getHomePageBoard()
+      if(res.Ret===200&&res.Data){
+        this.homeBoardInfo=res.Data
+        this.boardId=res.Data.BiDashboardId
+        this.getBoardInfo()
+      }
+    }
+  },
 }
 </script>
 
 <style lang="scss" scoped>
 .home-page{
-  display: flex;
-  flex-wrap: wrap;
-  gap: 20px;
+  $border-color: #c8cdd9;
+  background-color: #fff;
+  border: 1px solid $border-color;
+  .top-nav-box {
+    padding: 14px 20px;
+    border-bottom: 1px solid $border-color;
+    display: flex;
+    justify-content: space-between;
+    .name{
+      flex: 1;
+    }
+  }
 }
 </style>

+ 15 - 15
src/views/report_manage/reportV2/components/chapterEditWrapper.vue

@@ -169,7 +169,7 @@
                     <el-dropdown-item 
                       :command="{type:'adTag',item}" 
                       v-if="permissionBtn.checkPermissionBtn(permissionBtn.reportManageBtn.reportMange_chapter_editTag)"><!-- 添加标签 -->{{$t('ReportManage.ReportList.add_labels_section')}}</el-dropdown-item>
-                    <el-dropdown-item :command="{type:'upAudio',item}"><!-- 上传录音 -->{{$t('ReportManage.ReportList.up_recording_lable')}}</el-dropdown-item>
+                    <!-- <el-dropdown-item :command="{type:'upAudio',item}">上传录音{{$t('ReportManage.ReportList.up_recording_lable')}}</el-dropdown-item> -->
                   </el-dropdown-menu>
                 </el-dropdown>
               </div>
@@ -207,7 +207,7 @@
                 placeholder="请输入章节名称"
               />
           </el-form-item>
-          <el-form-item prop="varietys">
+          <!-- <el-form-item prop="varietys">
               <template slot="label">
                   <el-tooltip class="item" effect="dark">
                       <div slot="content" v-html="varietyTip"></div>
@@ -234,7 +234,7 @@
                   style="width:350px;"
                   clearable
               ></el-cascader>
-          </el-form-item>
+          </el-form-item> -->
           <el-form-item prop="editors" :label="$t('ReportManage.ReportList.label_chap_editor')">
             <el-cascader
               v-model="chapterInfo.editors"
@@ -301,7 +301,7 @@
 
 
     <!-- 上传音频弹窗 -->
-    <m-dialog
+    <!-- <m-dialog
       :show.sync="isOpenUploadAudio"
       :title="$t('ReportManage.smart_audio_upload_btn')"
       width="450px"
@@ -338,7 +338,7 @@
                 <el-button type="primary" @click="handleSaveAudio" :loading="uploadAudioLoading">{{uploadAudioLoading ? $t('ReportManage.smart_btn.uploading') :$t('Dialog.confirm_btn')}}</el-button>
             </div>
         </div>
-    </m-dialog>
+    </m-dialog> -->
 
     <!-- 版图设置弹窗 -->
     <smartTerritorSet 
@@ -394,11 +394,11 @@ export default {
 
       /* 章节弹窗 */
       isOpenChapterDia: false,
-      reportVarietyOpts: [],
+      // reportVarietyOpts: [],
       userOpts: [],
       chapterInfo: {
         id: 0,
-        varietys:[],
+        // varietys:[],
         editors:[],
         chapterName:'',
         tags: '',
@@ -528,7 +528,7 @@ export default {
       if(item.ReportChapterId) {
         this.chapterInfo = {
           id: item.ReportChapterId,
-          varietys:item.PermissionIdList,
+          // varietys:item.PermissionIdList,
           editors:item.GrandAdminIdList,
           chapterName:item.Title,
           tags: ''
@@ -536,7 +536,7 @@ export default {
       }else {
         this.chapterInfo = {
           id: 0,
-          varietys:this.reportVarietyOpts.map(_ =>_.PermissionId)||[],
+          // varietys:this.reportVarietyOpts.map(_ =>_.PermissionId)||[],
           editors:[],
           chapterName:'',
           tags: ''
@@ -552,7 +552,7 @@ export default {
 
       let params = {
         Title: this.chapterInfo.chapterName,
-        PermissionIdList: this.chapterInfo.varietys,
+        // PermissionIdList: this.chapterInfo.varietys,
         AdminIdList: this.chapterInfo.editors
       }
 
@@ -611,7 +611,7 @@ export default {
     openAddChapterTag(item) {
       this.chapterInfo = {
         id: item.ReportChapterId,
-        varietys:[],
+        // varietys:[],
         editors:[],
         chapterName: item.Title,
         tags: item.Trend
@@ -690,9 +690,9 @@ export default {
         case 'adTag': 
           this.openAddChapterTag(item)
           break
-        case 'upAudio': 
-          this.openUploadAudio(item)
-          break
+        // case 'upAudio': 
+        //   this.openUploadAudio(item)
+        //   break
         case 'wxShare':
           this.handleGetWechatImg(item)
           break
@@ -740,7 +740,7 @@ export default {
         this.$emit('checkClassifyNameArr',classify)
       }
 
-      this.reportVarietyOpts = res.Data.PermissionList||[];
+      // this.reportVarietyOpts = res.Data.PermissionList||[];
       this.userOpts = res.Data.GrandAdminList||[];
 
     },

+ 10 - 10
src/views/report_manage/reportV2/components/reportBaseInfoDia.vue

@@ -52,11 +52,11 @@
           />
         </el-form-item>
 
-        <el-form-item prop="relationVariety" :label="$t('ReportManage.ReportList.label_relation_variety')" v-if="formData.relationVariety.length">
+        <!-- <el-form-item prop="relationVariety" :label="$t('ReportManage.ReportList.label_relation_variety')" v-if="formData.relationVariety.length">
           <div class="permission-wrap">
             <el-tag v-for="item in formData.relationVariety" :key="item.ChartPermissionId">{{item.PermissionName}}</el-tag>
           </div>
-        </el-form-item>
+        </el-form-item> -->
 
         <el-form-item prop="title" :label="$t('ReportManage.ReportList.label_report_tit')">
           <el-input
@@ -252,7 +252,7 @@ export default {
             isPublcPublish: this.reportInfo.IsPublicPublish
           }
 
-          this.getRelationPermission()
+          // this.getRelationPermission()
       }
     },
   },
@@ -408,7 +408,7 @@ export default {
 
     //分类变化 获取关联品种 
     handleChangeClassify(val) {
-      this.getRelationPermission()
+      // this.getRelationPermission()
       this.handleUpdateBaseInfo()
     },
 
@@ -502,14 +502,14 @@ export default {
     },
 
     //获取关联品种
-    async getRelationPermission() {
-      if(!this.formData.classify.length) return
+    // async getRelationPermission() {
+    //   if(!this.formData.classify.length) return
 
-      const res = await classifyPermissionInterface.classifyPermissionList({ClassifyId:this.formData.classify[this.formData.classify.length-1]})
+    //   const res = await classifyPermissionInterface.classifyPermissionList({ClassifyId:this.formData.classify[this.formData.classify.length-1]})
 
-        if(res.Ret!==200) return
-        this.formData.relationVariety = res.Data || []
-    },
+    //     if(res.Ret!==200) return
+    //     this.formData.relationVariety = res.Data || []
+    // },
 
     // 获取选择的分类名称
     getSelectClassifyName() {

+ 2 - 2
src/views/report_manage/reportV2/list.vue

@@ -626,8 +626,8 @@ export default {
         {label:"下载长图",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_exportImg'),States:[2,6],text:'ReportManage.smart_btn.download_long_image'},
         {label:"推送消息",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_sendMsg'),States:[2,6],text:'ReportManage.smart_push_notification_btn'},
         {label:"已推送消息",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_sendMsg'),States:[2,6],text:'ReportManage.smart_notification_pushed'},
-        {label:"音频上传",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioUpload'),States:true,text:'ReportManage.smart_audio_upload_btn'},
-        {label:"音频下载A",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
+        // {label:"音频上传",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioUpload'),States:true,text:'ReportManage.smart_audio_upload_btn'},
+        // {label:"音频下载A",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
         // {label:"音频下载",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
       ],
 

+ 3 - 3
src/views/report_manage/reportlist.vue

@@ -744,9 +744,9 @@ export default {
         {label:"下载长图",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_exportImg'),States:[2,6],text:'ReportManage.smart_btn.download_long_image'},
         {label:"推送消息",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_sendMsg'),States:[2,6],text:'ReportManage.smart_push_notification_btn'},
         {label:"已推送消息",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_sendMsg'),States:[2,6],text:'ReportManage.smart_notification_pushed'},
-        {label:"音频上传",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioUpload'),States:true,text:'ReportManage.smart_audio_upload_btn'},
-        {label:"音频下载A",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
-        {label:"音频下载",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
+        // {label:"音频上传",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioUpload'),States:true,text:'ReportManage.smart_audio_upload_btn'},
+        // {label:"音频下载A",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
+        // {label:"音频下载",permission:this.permissionBtn.isShowBtn('reportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
       ],
       waterMarkStr:"",
       publishReportCode:''

+ 19 - 19
src/views/sandbox_manage/index_new_version.vue

@@ -132,7 +132,7 @@
           <el-form-item :label="$t('SandboxManage.SandList.catalog_name')" prop="SandboxClassifyName">
             <el-input v-model.trim="classifyForm.SandboxClassifyName" style="width: 317px;" :placeholder="$t('SandboxManage.SandList.catalog_name_placeholder')"></el-input>
           </el-form-item>
-          <el-form-item :label="$t('SandboxManage.SandList.associated_variety')" prop="ChartPermissionId" v-if="hasVariety">
+          <!-- <el-form-item :label="$t('SandboxManage.SandList.associated_variety')" prop="ChartPermissionId" v-if="hasVariety">
             <el-cascader 
               @change="chartPermissionIdChange"
 							:options="classifyArr"
@@ -143,7 +143,7 @@
               ref="chartPermissionCascader"
               :disabled="(classifyForm.SandboxClassifyId && classifyForm.Level!=1) || (!classifyForm.SandboxClassifyId && classifyForm.Level!=0)"
 						/>
-          </el-form-item>
+          </el-form-item> -->
         </el-form>
         <div style="text-align: center;padding:40px 0 ;">
           <el-button @click="classifyAddSubmit" type="primary" style="width: 120px;" size="large">{{$t('Dialog.confirm_save_btn')}}</el-button>
@@ -205,7 +205,7 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
       classifyFormRules(){
         return {
           SandboxClassifyName:{required: true, message:this.$t('SandboxManage.SandList.catalog_name_placeholder')||'请输入目录名称', trigger: 'blur'},
-          ChartPermissionId:{required: true, message:this.$t('SandboxManage.SandList.catalog_variety_placeholder')||'请选择对应品种', trigger: 'change'}
+          // ChartPermissionId:{required: true, message:this.$t('SandboxManage.SandList.catalog_variety_placeholder')||'请选择对应品种', trigger: 'change'}
         }
       }
     },
@@ -302,8 +302,8 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
         classifyForm:{
           SandboxClassifyId:0,
           SandboxClassifyName:'',
-          ChartPermissionId:'',
-          ChartPermissionName:'',
+          // ChartPermissionId:'',
+          // ChartPermissionName:'',
           ParentId:0,
           Level:0
         },
@@ -313,7 +313,7 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
           value: 'PermissionId',
           emitPath:false
 			  },
-        classifyArr:[],
+        // classifyArr:[],
         // 另存为弹窗
         saveOtherShow:false,
         saveOtherForm:{
@@ -365,9 +365,9 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
         //   if(res.Ret !== 200)  return
         //     this.classifyArr = res.Data.List||[ ]
         // })
-        reportVarietyInterence.filterVarietyOpts().then(res=>{
-          this.classifyArr=res.Data||[]
-        })
+        // reportVarietyInterence.filterVarietyOpts().then(res=>{
+        //   this.classifyArr=res.Data||[]
+        // })
       },
       // 获取沙盘图分类
       getSandboxClassify(parentNode,locationNode) {
@@ -611,8 +611,8 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
         this.classifyAddTitle=this.$t('SandboxManage.SandList.categories_add_btn')
         this.classifyForm.Level = node.Level
         this.classifyForm.ParentId = node.SandboxClassifyId
-        this.classifyForm.ChartPermissionId = node.ChartPermissionId
-        this.classifyForm.ChartPermissionName = node.ChartPermissionName
+        // this.classifyForm.ChartPermissionId = node.ChartPermissionId
+        // this.classifyForm.ChartPermissionName = node.ChartPermissionName
         this.classifyAddShow=true
       },
       getParentNodeName(node){
@@ -631,8 +631,8 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
         this.classifyForm.SandboxClassifyId = node.SandboxClassifyId
         this.classifyForm.Level = node.Level
         this.classifyForm.SandboxClassifyName = node.SandboxClassifyName
-        this.classifyForm.ChartPermissionId = node.ChartPermissionId
-        this.classifyForm.ChartPermissionName = node.ChartPermissionName
+        // this.classifyForm.ChartPermissionId = node.ChartPermissionId
+        // this.classifyForm.ChartPermissionName = node.ChartPermissionName
         this.classifyAddTitle=this.$t('SandboxManage.SandList.categories_edit_btn')
         this.classifyAddShow=true
       },
@@ -704,8 +704,8 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
               let params={
                 SandboxClassifyId:this.classifyForm.SandboxClassifyId,
                 SandboxClassifyName:this.classifyForm.SandboxClassifyName,
-                ChartPermissionId:this.classifyForm.ChartPermissionId || 0,
-                ChartPermissionName:this.classifyForm.ChartPermissionName,
+                // ChartPermissionId:this.classifyForm.ChartPermissionId || 0,
+                // ChartPermissionName:this.classifyForm.ChartPermissionName,
               }
               sandInterface.editSandboxClassify(params).then(res=>{
                 if(res.Ret == 200){
@@ -728,8 +728,8 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
                 SandboxClassifyName:this.classifyForm.SandboxClassifyName,
                 ParentId:this.classifyForm.ParentId,
                 Level:this.classifyForm.Level,
-                ChartPermissionId:this.classifyForm.ChartPermissionId || 0,
-                ChartPermissionName:this.classifyForm.ChartPermissionName,
+                // ChartPermissionId:this.classifyForm.ChartPermissionId || 0,
+                // ChartPermissionName:this.classifyForm.ChartPermissionName,
               }
               sandInterface.addSandboxClassify(params).then(res=>{
                 if(res.Ret == 200){
@@ -753,8 +753,8 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
         this.classifyForm={
           SandboxClassifyId:0,
           SandboxClassifyName:'',
-          ChartPermissionId:'',
-          ChartPermissionName:'',
+          // ChartPermissionId:'',
+          // ChartPermissionName:'',
           ParentId:0,
           Level:0
         }

+ 2 - 2
src/views/smartReport/reportList.vue

@@ -550,8 +550,8 @@ export default {
                 {label:"撤销",permission:this.permissionBtn.isShowBtn('smartReportManageBtn','reportManage_cancelPublish'),States:[4,5,6],text:'ReportManage.smart_btn.withdraw'},
                 {label:"下载Pdf",permission:this.permissionBtn.isShowBtn('smartReportManageBtn','reportManage_exportPdf'),States:[2,6],text:'ReportManage.smart_btn.download_pdf'},
                 {label:"下载长图",permission:this.permissionBtn.isShowBtn('smartReportManageBtn','reportManage_exportImg'),States:[2,6],text:'ReportManage.smart_btn.download_long_image'},
-                {label:"音频上传",permission:this.permissionBtn.isShowBtn('smartReportManageBtn','reportManage_audioUpload'),States:true,text:'ReportManage.smart_audio_upload_btn'},
-                {label:"音频下载",permission:this.permissionBtn.isShowBtn('smartReportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
+                // {label:"音频上传",permission:this.permissionBtn.isShowBtn('smartReportManageBtn','reportManage_audioUpload'),States:true,text:'ReportManage.smart_audio_upload_btn'},
+                // {label:"音频下载",permission:this.permissionBtn.isShowBtn('smartReportManageBtn','reportManage_audioDownload'),States:true,text:'ReportManage.smart_audio_download_btn'},
             ],
         }
     },

+ 16 - 134
src/views/system_manage/dataRefreshSetting.vue

@@ -7,17 +7,17 @@
                     {{ item.label }}
                 </div>
             </div>
-            <div class="refresh-rule-setting" v-if="settingTab=='status'">
+            <!-- <div class="refresh-rule-setting" v-if="settingTab=='status'">
                 <el-button type="danger" plain @click="setEdbsRefreshStatus('暂停')" :disabled="!hasStatusSelection">{{$t('SystemManage.DataRefresh.disabled')}}</el-button>
                 <el-button type="primary" plain @click="setEdbsRefreshStatus('启用')" :disabled="!hasStatusSelection">{{$t('SystemManage.DataRefresh.enabled')}}</el-button>
                 <el-button type="primary" @click="openDefaultRefreshStatusDia">{{$t('SystemManage.DataRefresh.default_refresh_rule')}}</el-button>
-            </div>
+            </div> -->
         </div>
         <!-- 刷新时间 -->
         <template v-if="settingTab=='time'">
             <div class="top-box">
                 <div class="select-box">
-                    <span>{{$t('SystemManage.DataRefresh.select_source')}}</span>
+                    <!-- <span>{{$t('SystemManage.DataRefresh.select_source')}}</span>
                     <el-select :placeholder="$t('SystemManage.DataRefresh.select_source_pld')" v-model="Source" @change="handleSourceChange">
                         <el-option v-for="item in SourceList" :key="item.Source" 
                         :label="item.SourceName" :value="item.Source"/>
@@ -25,7 +25,7 @@
                     <el-select :placeholder="$t('SystemManage.DataRefresh.select_source_pld')" v-model="SubSource" v-if="SubSourceList.length" @change="handleSubSourceChange">
                         <el-option v-for="item in SubSourceList" :key="item.Source" 
                         :label="$i18nt.locale==='zh'?item.SubSourceName:item.SubSourceNameEn||item.SubSourceName" :value="item.SubSource"/>
-                    </el-select>
+                    </el-select> -->
                     <el-button type="primary" @click="showDialog(true)"
                         v-permission="permissionBtn.sysDepartPermission.refresh_default"
                     >{{$t('SystemManage.DataRefresh.default_time')}}</el-button>
@@ -39,11 +39,11 @@
             <div class="table-box" v-if="hasSelectOption">
                 <div class="table-select" v-loading="selectOptionLoading">
                     <div class="select-list">
-                        <el-select :placeholder="$t('SystemManage.DataRefresh.terminal_code_select')" :no-match-text="$t('SystemManage.DataRefresh.complete_data_source')" clearable
+                        <!-- <el-select :placeholder="$t('SystemManage.DataRefresh.terminal_code_select')" :no-match-text="$t('SystemManage.DataRefresh.complete_data_source')" clearable
                             v-model="selectOption.terminalCode" @change="selectOptionChange('terminalCode')">
                             <el-option v-for="i in terminalCodeList" :key="i.TerminalCode"
                                 :label="i.Name" :value="i.TerminalCode"/>
-                        </el-select>
+                        </el-select> -->
                         <el-cascader :placeholder="$t('SystemManage.DataRefresh.eta_class_select')" :no-match-text="$t('SystemManage.DataRefresh.complete_data_source')" clearable
                             v-model="selectOption.classify" @change="selectOptionChange('classify')"
                             :options="edbClassifyList" 
@@ -56,7 +56,7 @@
                                 children:'Children',
                                 multiple:true
                             }" />
-                        <el-cascader
+                        <!-- <el-cascader
                             :placeholder="$t('SystemManage.DataRefresh.table_creator')" :no-match-text="$t('SystemManage.DataRefresh.complete_data_source')" style="height: 40px;"
                             v-model="selectOption.user" @change="selectOptionChange('user')"
                             :options="userList"
@@ -71,16 +71,16 @@
                             :show-all-levels="false"
                             clearable
                             filterable 
-                        />
+                        /> -->
                         <el-select :placeholder="table_frequency" v-model="selectOption.frequency" @change="selectOptionChange('frequency')" multiple collapse-tags clearable>
                             <el-option v-for="i in frequencyList" :key="i.value"
                                 :label="i.label" :value="i.value"
                             />
                         </el-select>
-                        <el-select :placeholder="$t('SystemManage.DataRefresh.table_status')" v-model="selectOption.state" @change="selectOptionChange('state')" clearable>
+                        <!-- <el-select :placeholder="$t('SystemManage.DataRefresh.table_status')" v-model="selectOption.state" @change="selectOptionChange('state')" clearable>
                             <el-option :label="$t('SystemManage.DataRefresh.enable_op')" value="启用"/>
                             <el-option :label="$t('SystemManage.DataRefresh.pause_op')" value="暂停"/>
-                        </el-select>
+                        </el-select> -->
                     </div>
                     <div class="select-other">
                         <el-checkbox :indeterminate="isIndeterminate" v-model="isCheckAll" @change="listCheckAllChange">{{$t('SystemManage.DataRefresh.all_list')}}</el-checkbox>
@@ -88,11 +88,11 @@
                             v-permission="permissionBtn.sysDepartPermission.refresh_time"
                             :disabled="!tableData.length"
                         >{{$t('SystemManage.DataRefresh.set_time')}}</el-button>
-                        <el-button type="primary" @click="isSetStateDialogShow=true"
+                        <!-- <el-button type="primary" @click="isSetStateDialogShow=true"
                             v-permission="permissionBtn.sysDepartPermission.refresh_state"
                             v-if="Source!=2"
                             :disabled="!tableData.length"
-                        >{{$t('SystemManage.DataRefresh.set_status')}}</el-button>
+                        >{{$t('SystemManage.DataRefresh.set_status')}}</el-button> -->
                     </div>
                 </div>
                 <el-table :data="tableData" border
@@ -134,125 +134,7 @@
             </div>
         </template>
         <!-- 刷新状态 - 全拆开吧 -->
-        <template v-if="settingTab=='status'">
-            <div class="refresh-status-container">
-                <div class="refresh-status-search">
-                    <div class="refresh-status-search-left">
-                        <div class="select-source-box">
-                            <span>{{$t('SystemManage.DataRefresh.select_source')}}</span>
-                            <el-select :placeholder="$t('SystemManage.DataRefresh.select_source_pld')" v-model="searchParams.Source">
-                                <el-option v-for="item in statusSourceList" :key="item.Source" 
-                                :label="item.SourceName" :value="item.Source"/>
-                            </el-select>
-                        </div>
-                        <el-select :placeholder="$t('SystemManage.DataRefresh.table_status')" v-model="searchParams.Status" @change="searchList"
-                        class="select-item-small" clearable>
-                            <el-option :label="$t('SystemManage.DataRefresh.enable')" value="启用"/>
-                            <el-option :label="$t('SystemManage.DataRefresh.disable')" value="暂停"/>
-                            <el-option v-if="searchParams.Source===34" :label="$t('SystemManage.DataRefresh.supplier_disabled')" value="供应商停用"/>
-                        </el-select>
-                        <!-- 频度 -->
-                        <el-select :placeholder="$t('SystemManage.DataRefresh.table_frequency')" class="select-item-small"
-                            v-model="FrequencyArr" multiple collapse-tags clearable>
-                            <el-option v-for="i in frequencyList" :key="i.value"
-                                :label="i.label" :value="i.value"
-                            />
-                        </el-select>
-                        <!-- 指标库分类 -->
-                        <el-cascader :placeholder="$t('SystemManage.DataRefresh.edb_classify')" 
-                        :no-match-text="$t('SystemManage.DataRefresh.complete_data_source')" clearable
-                        v-model="ClassifyIdArr" class="select-item-small" 
-                        :options="statusEdbClassifyList" :show-all-levels="false" collapse-tags
-                        :props="{
-                            emitPath:true,
-                            value:'ClassifyId',
-                            label:'ClassifyName',
-                            children:'Children',
-                            multiple:true
-                        }" />
-                        <!-- 创建人 -->
-                        <el-cascader
-                            :placeholder="$t('SystemManage.DataRefresh.table_creator')" 
-                            :no-match-text="$t('SystemManage.DataRefresh.complete_data_source')" style="height: 40px;"
-                            v-model="SysUserIdArr" class="select-item-small" 
-                            :options="userList" collapse-tags :show-all-levels="false" clearable filterable
-                            :props="{
-                                value: 'ItemId',
-                                label: 'ItemName',
-                                children: 'Children',
-                                emitPath: false,
-                                multiple:true,
-                            }"
-                        />
-                        <div class="selection-box">
-                            <el-checkbox :indeterminate="statusDataSelectionItem.isIndeterminate" v-model="statusDataSelectionItem.isCheckAll" 
-                            @change="statusListCheckAllChange">{{$t('SystemManage.DataRefresh.all_list')}}</el-checkbox>
-                            <span>{{$t('SystemManage.DataRefresh.selected')}}: {{ hasStatusSelection }}</span>
-                        </div>
-
-                    </div>
-
-                    <el-input :placeholder="$t('SystemManage.DataRefresh.indicator_name')" prefix-icon="el-icon-search" clearable
-                        v-model="searchParams.Keyword" @input="searchList" style="width: 360px;margin-left: 15px;"></el-input>
-                </div>
-                <el-table :data="statusTableData" border
-                    ref="statusTableRef"
-                    @selection-change="statusSelectionChange"
-                    @select="statusSelectHandle" 
-                    @select-all="statusSelectAllHandle"
-                    @sort-change="handleStatusTableSortChange"
-                    >
-                    <!-- 多选 -->
-                    <el-table-column
-                        align="center"
-                        type="selection"
-                        width="55">
-                    </el-table-column>
-                    <el-table-column align="center" prop="EdbCode" :label="$t('SystemManage.DataRefresh.table_Id')" show-overflow-tooltip>
-                        <template slot-scope="scope">
-                          {{scope.row.EdbCode}}
-                        </template>
-                    </el-table-column>
-                    <el-table-column align="center" prop="EdbName" :label="$t('SystemManage.DataRefresh.table_name')" show-overflow-tooltip>
-                        <template slot-scope="scope">
-                          {{scope.row.EdbName}}
-                        </template>
-                    </el-table-column>
-                    <el-table-column align="center" prop="RelationTime" :label="$t('SystemManage.DataRefresh.table_recent_reference_time')"
-                    sortable="custom">
-                        <template slot-scope="scope">
-                          {{scope.row.RelationTime}}
-                        </template>
-                    </el-table-column>
-                    <el-table-column align="center" prop="RelationNum" :label="$t('SystemManage.DataRefresh.table_reference_count')"
-                    sortable="custom">
-                        <template slot-scope="scope">
-                          <span :class="scope.row.RelationNum>0?'table-text-button':''" @click="openReferenceCountDia(scope.row)">{{scope.row.RelationNum}}</span>
-                        </template>
-                    </el-table-column>
-                    <el-table-column align="center" prop="IsStop" :label="$t('SystemManage.DataRefresh.table_refresh_status')">
-                        <template slot-scope="scope">
-                            {{scope.row.IsSupplierStop==1?$t('SystemManage.DataRefresh.supplier_disabled'):scope.row.IsStop?  $t('SystemManage.DataRefresh.disabled'):$t('SystemManage.DataRefresh.enabled') }}
-                        </template>
-                    </el-table-column>
-                    <el-table-column align="center" prop="Operation" :label="$t('Table.column_operations')">
-                        <template slot-scope="scope">
-                            <template v-if="scope.row.IsSupplierStop!=1">
-                                <span class="table-text-button" v-if="scope.row.IsStop" @click="enableToggle(scope.row)">{{$t('SystemManage.DataRefresh.enable')}}</span>
-                                <!-- v-permission="permissionBtn.outlinkConfigPermission.outlinkListConfig_del" -->
-                                <span class="table-text-button" style="color: #C54322;" @click="enableToggle(scope.row)" v-else>{{$t('SystemManage.DataRefresh.disable')}}</span>
-                            </template>
-                        </template>
-                    </el-table-column>
-                </el-table>
-                <el-pagination 
-                    :current-page="searchParams.CurrentIndex"
-                    :page-size="searchParams.PageSize"
-                    :total="statusDataTotal"
-                    @current-change="handleStatusListPageNoChange"
-                />
-            </div>
-        </template>
+         <!-- 刷新规则不要了 -->
         <!-- 默认刷新时间,设置刷新时间 -->
         <el-dialog custom-class="refresh-setting-dialog"
             :title="dlgTextLangShow((isDefault?'默认':'设置')+'刷新时间')"
@@ -367,16 +249,16 @@ export default {
                 { key: "IndexName", label:/* '指标全称' */ this.$t('SystemManage.DataRefresh.table_name'), minWidth: 150 },
                 { key: "EndDate", label:/* '最新日期' */ this.$t('SystemManage.DataRefresh.table_date'), sortable: "custom" },
                 { key: "EndValue", label:/* '最新值' */ this.$t('SystemManage.DataRefresh.table_value')},
-                { key: "SysUserRealName", label:/* '创建人' */ this.$t('SystemManage.DataRefresh.table_creator') },
+                // { key: "SysUserRealName", label:/* '创建人' */ this.$t('SystemManage.DataRefresh.table_creator') },
                 { key: "Frequency", label:/* '频度' */ this.$t('SystemManage.DataRefresh.table_frequency') },
                 { key: "RefreshTime", label:/* '刷新时间' */ this.$t('SystemManage.DataRefresh.table_time'), minWidth: 150 },
-                { key: "IsStop", label:/* '刷新状态' */ this.$t('SystemManage.DataRefresh.table_status')},
+                // { key: "IsStop", label:/* '刷新状态' */ this.$t('SystemManage.DataRefresh.table_status')},
             ];
         },
         tabList(){
             return [
                 { value: "time", label:/* '刷新时间设置' */ this.$t('SystemManage.DataRefresh.time_setting_tab')},
-                { value: "status", label:/* '刷新状态设置' */ this.$t('SystemManage.DataRefresh.status_setting_tab')}
+                // { value: "status", label:/* '刷新状态设置' */ this.$t('SystemManage.DataRefresh.status_setting_tab')}
             ];  
         },
         hasStatusSelection(){

+ 31 - 11
src/views/system_manage/etaBaseConfig.vue

@@ -126,7 +126,7 @@
                                     />
                                     <ConfigAnnotation picHintText="" picName="LogoCN" @showImage="previewImage" :buttonText="$t('SystemManage.BaseConfig.view_example_text')"/>
                                 </el-form-item>
-                                <el-form-item :label="`${$t('SystemManage.BaseConfig.english_version')}(${$t('SystemManage.BaseConfig.recommended_ratio')})`" prop="LogoEN">
+                                <!-- <el-form-item :label="`${$t('SystemManage.BaseConfig.english_version')}(${$t('SystemManage.BaseConfig.recommended_ratio')})`" prop="LogoEN">
                                     <ImgUpload 
                                         id="logo-image"
                                         :imgUrl="formData.LogoEN"
@@ -136,7 +136,7 @@
                                         @remove="deleteFormImg('LogoEN')"
                                     />
                                     <ConfigAnnotation picHintText="" picName="LogoEN" @showImage="previewImage" :buttonText="$t('SystemManage.BaseConfig.view_example_text')"/>
-                                </el-form-item>
+                                </el-form-item> -->
                             </div>
                             <div class="line-form-item" v-permission="permissionBtn.baseConfigPermission.etaBaseConfig_login_systemLogo_mobile">
                                 <el-form-item :label="$t('SystemManage.BaseConfig.mobile')" prop="LogoMobile" style="width: 50%;">
@@ -232,7 +232,7 @@
 
                         <div v-if="isShowXunFei">
                             <!-- 科大讯飞 -->
-                            <div style="width:100%;">
+                            <!-- <div style="width:100%;">
                                 <span style="color:#606266;">{{$t('SystemManage.BaseConfig.iFLYTEK_service')}}</span> 
                                 <el-switch v-model="Iflytek"></el-switch>
                             </div>
@@ -249,7 +249,7 @@
                                 <el-form-item label="vcn(voice_name)" prop="XfVcn">
                                     <el-input type="text" v-model="formData.XfVcn" :placeholder="$t('SystemManage.BaseConfig.please_enter')+'voice_name'" />
                                 </el-form-item>
-                            </template>
+                            </template> -->
                         </div>
                         <!-- 研报审批 -->
                         <div v-if="isShowApprove">
@@ -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">
                     
@@ -345,7 +353,7 @@
                         <el-form-item :label="$t('SystemManage.BaseConfig.report_share_title_en')" prop="H5ShareEnName" v-if="isShowReportEnShare">
                             <el-input type="text" v-model="formData.H5ShareEnName" :placeholder="$t('SystemManage.BaseConfig.report_share_title_en_placeholder')" />
                         </el-form-item>
-                        <el-form-item :label="$t('SystemManage.BaseConfig.connect_wx')" prop="WxAppId">
+                        <!-- <el-form-item :label="$t('SystemManage.BaseConfig.connect_wx')" prop="WxAppId">
                             <el-input type="text" v-model.trim="formData.WxAppId" :placeholder="$t('SystemManage.BaseConfig.please_enter')+'AppID'" />
                         </el-form-item>
                         <el-form-item prop="WxAppSecret">
@@ -362,9 +370,9 @@
                                 @upload="(file)=>handleUploadImage(file,'H5ReportShareImg')"
                                 @remove="deleteFormImg('H5ReportShareImg')"
                                 />
-                            <!-- <ConfigAnnotation picName="OfficialAccountsLogoPic" @showImage="previewImage"
+                        </el-form-item> -->
+                                                    <!-- <ConfigAnnotation picName="OfficialAccountsLogoPic" @showImage="previewImage"
                                 picHintText=""/> -->
-                        </el-form-item>
                     </div>
                 </div>
 
@@ -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:'', //登录页标题
@@ -705,7 +715,7 @@ export default {
             reportFromType: [
                 // { type:'smartReport',label: /* '智能研报' */ this.$t('SystemManage.BaseConfig.report_type1') },
                 { type:'report',label: /* '研报列表' */this.$t('SystemManage.BaseConfig.report_type2') },
-                { type:'enReport',label: /* '英文研报' */this.$t('SystemManage.BaseConfig.report_type3') },
+                // { type:'enReport',label: /* '英文研报' */this.$t('SystemManage.BaseConfig.report_type3') },
             ],
             pptSheetTip: /* `设置共享表格、时间序列表格、混合表格插入PPT的表格字号` */this.$t('SystemManage.BaseConfig.ppt_sheet_tip'),
             ReportSheetTip: /* `设置共享表格、时间序列表格、混合表格插入研报的表格字号` */this.$t('SystemManage.BaseConfig.report_sheet_tip'),
@@ -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(',')
                     //通过验证后,提交数据前
@@ -1078,6 +1097,7 @@ export default {
                         line-height: 40px;
                     }
                     .line-form-item{
+                        width: 50%;
                         display: flex;
                         gap: 40px;
                     }

+ 0 - 7
src/views/system_manage/outlinkList.vue

@@ -38,13 +38,6 @@ import {outlinkConfigInterence} from "@/api/modules/etaBaseConfigApi.js"
           if(res.Ret == 200){
             this.outlinkData = res.Data.List || []
             this.authCode=res.Data.UserCode
-            // console.log(this.outlinkData);
-            //ETA1.0.8 在数组开头增加一项培训视频链接
-            this.outlinkData.unshift({
-                Id:9999,
-                Title:'培训视频课堂',
-                Url:`${process.env.VUE_APP_ETA_VIDEO}?bus_code=${this.$setting.bus_code}`
-            })
           }
         })
       },