Browse Source

Merge branch 'master' of http://8.136.199.33:3000/eta_front/eta_front into ppt-zip

cxmo 7 months ago
parent
commit
b8c354a980
84 changed files with 4072 additions and 1925 deletions
  1. 3 0
      src/api/http.js
  2. 7 1
      src/api/modules/oldApi.js
  3. 120 0
      src/api/modules/setApi.js
  4. BIN
      src/assets/img/icons/lock_big.png
  5. BIN
      src/assets/img/icons/lock_black.png
  6. BIN
      src/assets/img/set_m/no_auth.png
  7. 23 0
      src/components/edb/noAuth.vue
  8. 40 0
      src/components/noDataAuth.vue
  9. 301 56
      src/components/notificationMsg.vue
  10. 12 0
      src/lang/commonLang.js
  11. 75 8
      src/lang/modules/systemManage/OperateAuth.js
  12. 5 0
      src/main.js
  13. 42 0
      src/mixins/index.js
  14. 1 1
      src/routes/modules/oldRoutes.js
  15. 14 0
      src/utils/buttonConfig.js
  16. 5 1
      src/utils/icon.js
  17. 5 1
      src/utils/registryComponents.js
  18. 22 2
      src/views/chartRelevance_manage/components/selectTarget.vue
  19. 1 1
      src/views/chartRelevance_manage/crossVarietyAnalysis/components/edbTableSection.vue
  20. 1 1
      src/views/chartRelevance_manage/relevance/list.vue
  21. 12 2
      src/views/dataEntry_manage/addChart.vue
  22. 11 0
      src/views/dataEntry_manage/adjustdata/adjustData.vue
  23. 428 402
      src/views/dataEntry_manage/chartSetting.vue
  24. 11 0
      src/views/dataEntry_manage/codecount/index.vue
  25. 33 0
      src/views/dataEntry_manage/components/satterSeriesDia.vue
  26. 11 0
      src/views/dataEntry_manage/databaseComponents/batchComptedDialog.vue
  27. 19 3
      src/views/dataEntry_manage/databaseComponents/batchComputedV2.vue
  28. 11 1
      src/views/dataEntry_manage/databaseComponents/computedDialog.vue
  29. 2 2
      src/views/dataEntry_manage/databaseComponents/dataAssociateChart.vue
  30. 1 1
      src/views/dataEntry_manage/databaseComponents/dataAssociateComputeData.vue
  31. 11 0
      src/views/dataEntry_manage/databaseComponents/diffusionIndexDia.vue
  32. 22 0
      src/views/dataEntry_manage/databaseComponents/fittingResidueDia.vue
  33. 44 0
      src/views/dataEntry_manage/databaseComponents/jointTargetDia.vue
  34. 33 16
      src/views/dataEntry_manage/databaseComponents/operationDialog.vue
  35. 22 2
      src/views/dataEntry_manage/databaseComponents/replaceDialog.vue
  36. 40 6
      src/views/dataEntry_manage/databaseComponents/smoothEdbDialog.vue
  37. 22 4
      src/views/dataEntry_manage/databaseList.vue
  38. 12 2
      src/views/dataEntry_manage/editChart.vue
  39. 2 0
      src/views/datasheet_manage/components/CustomTable.vue
  40. 12 2
      src/views/datasheet_manage/components/calculateEdbDia.vue
  41. 1 1
      src/views/datasheet_manage/components/edbDetailSection.vue
  42. 2 2
      src/views/datasheet_manage/components/sheetListWrap.vue
  43. 103 81
      src/views/datasheet_manage/customAnalysis/list.vue
  44. 2 0
      src/views/datasheet_manage/mixins/classifyMixin.js
  45. 131 107
      src/views/datasheet_manage/sheetList.vue
  46. 3 1
      src/views/edbHistoryPage.vue
  47. 11 0
      src/views/futures_manage/chartEditor.vue
  48. 496 491
      src/views/mychart_manage/components/chartDetailDia.vue
  49. 4 2
      src/views/mychart_manage/components/chooseChart.vue
  50. 1 1
      src/views/mychart_manage/index.vue
  51. 103 13
      src/views/ppt_manage/mixins/pptMixins.js
  52. 2 1
      src/views/ppt_manage/newVersion/components/catalog/pptContent.vue
  53. 2 1
      src/views/ppt_manage/newVersion/components/catalog/pptContentEn.vue
  54. 4 3
      src/views/ppt_manage/newVersion/components/editor/InsertCharts.vue
  55. 5 4
      src/views/ppt_manage/newVersion/pptCatalog.vue
  56. 13 4
      src/views/ppt_manage/newVersion/pptEditor.vue
  57. 3 2
      src/views/ppt_manage/newVersion/pptEnCatalog.vue
  58. 15 5
      src/views/ppt_manage/newVersion/pptEnEditor.vue
  59. 1 0
      src/views/ppt_manage/newVersion/pptEnPublish.vue
  60. 1 0
      src/views/ppt_manage/newVersion/pptPublish.vue
  61. 23 1
      src/views/predictEdb_manage/addPredicEdb.vue
  62. 0 539
      src/views/predictEdb_manage/components/computedDialog.vue
  63. 11 1
      src/views/predictEdb_manage/components/dynamicRingdiffer.vue
  64. 46 41
      src/views/predictEdb_manage/components/edbDetail.vue
  65. 11 0
      src/views/predictEdb_manage/components/edbDia.vue
  66. 11 0
      src/views/predictEdb_manage/components/operationDialog.vue
  67. 27 5
      src/views/predictEdb_manage/predictEdb.vue
  68. 2 2
      src/views/report_manage/addreportNew.vue
  69. 39 4
      src/views/report_manage/cloudDisk.vue
  70. 4 3
      src/views/report_manage/components/importMyChart.vue
  71. 2 2
      src/views/report_manage/editChapterReport.vue
  72. 2 2
      src/views/report_manage/editreportNew.vue
  73. 20 1
      src/views/report_manage/mixins/reportMixin.js
  74. 20 4
      src/views/report_manage/reportEn/reportEditor.vue
  75. 81 51
      src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue
  76. 17 2
      src/views/smartReport/components/ETASheet.vue
  77. 17 2
      src/views/smartReport/components/ImportETAChart.vue
  78. 4 3
      src/views/smartReport/components/ImportMyETAChart.vue
  79. 14 1
      src/views/smartReport/components/TextEdit.vue
  80. 29 27
      src/views/smartReport/reportList.vue
  81. 322 0
      src/views/system_manage/components/opearAuthSetDia.vue
  82. 201 0
      src/views/system_manage/components/setClassifySecretDia.vue
  83. 825 0
      src/views/system_manage/dataOperaAuth.vue
  84. 5 0
      src/vuex/modules/permissionButton.js

+ 3 - 0
src/api/http.js

@@ -117,6 +117,9 @@ export default {
       ],
     })
       .then((response) => {
+        if(responseType==='blob'){
+          return response
+        }
         return checkStatus(response);
       })
       .catch((res) => {

+ 7 - 1
src/api/modules/oldApi.js

@@ -336,6 +336,11 @@ const getRealPublicSettings = params => {
 	return http.get('/sysuser/public_config')
 }
 
+// 下载文件公共接口
+const apiDownloadResource=params=>{
+	return http.get('/resource/file/download',params,'blob')
+}
+
 export {
 	userLogin,
 	modifyPwd,
@@ -414,5 +419,6 @@ export {
 	setChapterEnable,
 	setChapterSort,
 	getRealPublicSettings,
-	userLogOut
+	userLogOut,
+	apiDownloadResource
 }

+ 120 - 0
src/api/modules/setApi.js

@@ -512,6 +512,126 @@ const operateAuthInterface = {
 	 */
 	edbNoAuthBatchSet: params => {
 		return http.post('/datamanage/edb_no_permission/batch_add',params)
+	},
+
+	/**
+	 * 全量资产转移
+	 * @param {*} params Source NewUserId OldUserId
+	 */
+	transferAllData: params => {
+		return http.post('/datamanage/edb_chart/all/change_user',params)
+	},
+
+	/**
+	 * 获取用户的资产数量统计
+	 * @param {*} params UserId
+	 * @returns 
+	 */
+	getUserStatistic: params => {
+		return http.get('/datamanage/edb_chart/count',params)
+	},
+
+	/**
+	 * 设置涉密分类
+	 * @param {*} params 
+	 * "Source": 3,
+		"SubSource": 0,
+		"ClassifyIdList": []
+	 * @returns 
+	 */
+	setPermissionClassify: params => {
+		return http.post('/datamanage/edb_chart/classify/permission/is_permission/set',params)
+	},
+
+	/**
+	 * 设置分类权限
+	 * @param {*} params 
+	 * Source SubSource UserList[] ClassifyIdList[]
+	 * @returns 
+	 */
+	setClassifyAuth: params => {
+		return http.post('/datamanage/edb_chart/classify/permission/set',params)
+	},
+
+	/**
+	 * 设置数据权限
+	 * @param {*} params  
+	 * Source 
+	 * SubSource 
+	 * UserId 
+	 * DataIdList 
+	 * NoDataIdList 
+	 * UserList 
+	 * IsSelectAll 
+	 * ClassifyId 
+	 * Keyword
+	 */
+	setDataAuth: params => {
+		return http.post('/datamanage/edb_chart/permission/set',params)
+	},
+
+	/**
+	 * 根据用户获取权限分类
+	 * @param {*} params Source SubSource UserId
+	 * @returns 
+	 */
+	getSecretClassifyByUser: params => {
+		return http.get('/datamanage/edb_chart/classify/permission/show_by_user',params)
+	},
+	
+	/**
+	 * 根据数据获取权限用户
+	 * @param {*} params  Source SubSource DataId
+	 * @returns 
+	 */
+	getAuthUserByData: params => {
+		return http.get('/datamanage/edb_chart/permission/show_by_data',params)
+	},
+
+	/**
+	 * 获取消息列表
+	 * @param {*} params 
+	 * @returns 
+	 */
+	getNoticeList: params => {
+		return http.get('/datamanage/message/list',params)
+	},
+
+	/**
+	 * 标记已读
+	 * @param {*} params MessageId
+	 * @returns 
+	 */
+	redMessage: params => {
+		return http.post('/datamanage/message/read',params)
+	},
+
+	/**
+	 * 消息详情
+	 * @param {*} params 
+	 * MessageId Source SubSource PageSize CurrentIndex
+	 * @returns 
+	 */
+	getNoticeDetail: params => {
+		return http.get('/datamanage/message/detail',params)
+	},
+
+	/**
+	 * 获取所有私密分类
+	 * @param {*} params Source SubSource
+	 * @returns 
+	 */
+	getSecretClassify: params => {
+		return http.get('/datamanage/edb_chart/classify/secret',params)
+	},
+
+	/**
+	 * 消息通知 所有未读
+	 * @param {*} params 
+	 * @returns 
+	 */
+	getAllUnread: params => {
+		return http.get('/message/unread/num')
 	}
 }
 

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


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


BIN
src/assets/img/set_m/no_auth.png


+ 23 - 0
src/components/edb/noAuth.vue

@@ -0,0 +1,23 @@
+<template>
+  <div>
+
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+
+  },
+}
+</script>
+<style scoped lang='scss'>
+
+</style>

+ 40 - 0
src/components/noDataAuth.vue

@@ -0,0 +1,40 @@
+<template>
+  <div class="no-auth-wapper">
+    <img
+      src="~@/assets/img/set_m/no_auth.png"
+      alt=""
+    />
+    <span>{{text}}</span>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    text: {
+      type:String
+    }
+  },
+  data() {
+    return {
+
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+
+  },
+}
+</script>
+<style scoped lang='scss'>
+.no-auth-wapper {
+  padding: 100px 0;
+  text-align: center;
+  color: #666;
+  img {
+    margin: 20px auto 10px;
+    display: block
+  }
+}
+</style>

+ 301 - 56
src/components/notificationMsg.vue

@@ -1,87 +1,304 @@
 <template>
     <!-- 消息通知 -->
-    <el-popover
-        placement="bottom"
-        width="443"
-        trigger="click" v-model="visible">
-        <div class="notifation-wrap">
-            <!-- 防止tabs在popover前渲染,会导致tab选中状态不正确 -->
-            <el-tabs v-model="activeName" v-if="visible">
-                <el-tab-pane :label="`${$t('AprrovalPage.research_approval_btn')}(${UnreadTotal})`" name="first"></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)">
-                    <span class="icon">
-                        <img :src="require(`@/assets/img/approve_m/${approveState[item.ApproveState]||'process'}-msg.svg`)" alt="">
-                    </span>
-                    <div class="info">
-                        <div class="head">
-                            <span class="title">{{item.Content}}</span>
-                            <span class="time">{{item.CreateTime}}</span>
+    <div>
+        <el-popover
+            placement="bottom"
+            width="443"
+            trigger="click" v-model="visible">
+            <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-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)">
+                        <span class="icon">
+                            <img :src="require(`@/assets/img/approve_m/${approveState[item.ApproveState]||'process'}-msg.svg`)" alt="">
+                        </span>
+                        <div class="info">
+                            <div class="head">
+                                <span class="title">{{item.Content}}</span>
+                                <span class="time">{{item.CreateTime}}</span>
+                            </div>
+                            <!-- 审批内容 -->
+                            <div class="content" v-if="activeName==='first'">{{item.Remark||''}}&nbsp;</div>
+                            <!-- 权限内容 -->
+                            <div class="content" v-else>
+                                {{item.Remark||''}}
+                                <span>,点击<el-button type="text" @click="openAuthDetail(item)">查看详情</el-button>!</span>
+                            </div>
                         </div>
-                        <div class="content">{{item.Remark||''}}&nbsp;</div>
                     </div>
+                    <tableNoData v-if="!msgList.length" :text="$t('AprrovalPage.no_news_yet')"></tableNoData>
                 </div>
-                <tableNoData v-if="!msgList.length" :text="$t('AprrovalPage.no_news_yet')"></tableNoData>
+                <el-button type="text" class="close-btn" @click="visible=false">{{$t('AprrovalPage.close_btn')}}</el-button>
             </div>
-            <el-button type="text" class="close-btn" @click="visible=false">{{$t('AprrovalPage.close_btn')}}</el-button>
-        </div>
-        <span slot="reference" @click="visible = !visible" class="msg-btn">
-            <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
-                <path d="M16.7344 15.4904L15.2941 12.9564V7.84847C15.2941 5.89142 13.8231 3.77337 11.6786 2.99732C11.5741 1.96012 10.8811 1.20374 9.97287 1.20374C9.06595 1.20374 8.37036 1.96014 8.26717 2.99732C6.12392 3.77337 4.65292 5.8914 4.65292 7.84847V12.9564L3.14258 15.6146C3.04183 15.7903 3.04429 16.0054 3.14504 16.1799C3.24581 16.3544 3.43263 16.4601 3.63415 16.4601H7.22871C7.49293 17.7357 8.62233 18.6967 9.97289 18.6967C11.3247 18.6967 12.4541 17.7357 12.7171 16.4601H16.3116C16.3215 16.4601 16.3288 16.4601 16.3374 16.4601C16.6508 16.4601 16.904 16.2082 16.904 15.8948C16.904 15.7362 16.8401 15.5925 16.7344 15.4904ZM9.97287 2.33803C10.1769 2.33803 10.3415 2.49286 10.4472 2.7239C10.2899 2.70792 10.1375 2.67106 9.97287 2.67106C9.8082 2.67106 9.65583 2.70792 9.49851 2.7239C9.60422 2.49284 9.76889 2.33803 9.97287 2.33803ZM9.97287 17.5636C9.25396 17.5636 8.65303 17.1016 8.41951 16.4601H11.5262C11.2927 17.1015 10.693 17.5636 9.97287 17.5636ZM4.60745 15.3282L5.71102 13.3853C5.76015 13.3017 5.78719 13.2034 5.78719 13.1051V7.84847C5.78719 5.93934 7.57648 3.80413 9.97287 3.80413C12.3692 3.80413 14.161 5.93934 14.161 7.84847V13.1051C14.161 13.2034 14.1868 13.3017 14.2347 13.3853L15.3395 15.3282H4.60745Z" fill="currentColor"/>
-            </svg>
-            <div class="unread" v-if="UnreadTotal">{{UnreadTotal>99?'99+':UnreadTotal}}</div>
-        </span>
-    </el-popover>
+            <span slot="reference" @click="visible = !visible" class="msg-btn">
+                <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+                    <path d="M16.7344 15.4904L15.2941 12.9564V7.84847C15.2941 5.89142 13.8231 3.77337 11.6786 2.99732C11.5741 1.96012 10.8811 1.20374 9.97287 1.20374C9.06595 1.20374 8.37036 1.96014 8.26717 2.99732C6.12392 3.77337 4.65292 5.8914 4.65292 7.84847V12.9564L3.14258 15.6146C3.04183 15.7903 3.04429 16.0054 3.14504 16.1799C3.24581 16.3544 3.43263 16.4601 3.63415 16.4601H7.22871C7.49293 17.7357 8.62233 18.6967 9.97289 18.6967C11.3247 18.6967 12.4541 17.7357 12.7171 16.4601H16.3116C16.3215 16.4601 16.3288 16.4601 16.3374 16.4601C16.6508 16.4601 16.904 16.2082 16.904 15.8948C16.904 15.7362 16.8401 15.5925 16.7344 15.4904ZM9.97287 2.33803C10.1769 2.33803 10.3415 2.49286 10.4472 2.7239C10.2899 2.70792 10.1375 2.67106 9.97287 2.67106C9.8082 2.67106 9.65583 2.70792 9.49851 2.7239C9.60422 2.49284 9.76889 2.33803 9.97287 2.33803ZM9.97287 17.5636C9.25396 17.5636 8.65303 17.1016 8.41951 16.4601H11.5262C11.2927 17.1015 10.693 17.5636 9.97287 17.5636ZM4.60745 15.3282L5.71102 13.3853C5.76015 13.3017 5.78719 13.2034 5.78719 13.1051V7.84847C5.78719 5.93934 7.57648 3.80413 9.97287 3.80413C12.3692 3.80413 14.161 5.93934 14.161 7.84847V13.1051C14.161 13.2034 14.1868 13.3017 14.2347 13.3853L15.3395 15.3282H4.60745Z" fill="currentColor"/>
+                </svg>
+                <div class="unread" v-if="allUnreadTotal">{{allUnreadTotal>99?'99+':allUnreadTotal}}</div>
+            </span>
+        </el-popover>
+        
+        <m-dialog
+            :show.sync="isOpenAuthDia"
+            width="800px"
+            title="权限变更详情"
+            @close="isOpenAuthDia = false"
+        >
+            <div class="notice-auth-box">
+                <div class="main">
+
+                    <div class="left" v-if="!detailInfo.isAuthSet">
+
+                        <el-radio-group v-model="detailInfo.Source" @input="changeSource" style="margin-bottom:10px;">
+                            <el-radio-button
+                                v-for="item in tabs" 
+                                :key="item.key"
+                                :label="item.key"
+                            >{{item.label}}</el-radio-button>
+                        </el-radio-group>
+
+                        <ul class="data-types" v-if="detailInfo.Source===6">
+                            <li 
+                                v-for="item in subTabs" 
+                                :key="item.key" 
+                                :class="item.key===detailInfo.SubSource&&'act'"
+                                @click="changeSubSource(item)"
+                            >{{item.label}}</li>
+                        </ul>
+                    </div>
+
+                    <div class="right">
+                        <label v-if="detailInfo.isAuthSet">{{tabs.find(_ => _.key===detailInfo.Source).label}}</label>
+
+                        <el-table
+                            :data="tableData"
+                            ref="table"
+                            element-loading-text="加载中..."
+                            v-loading="tableLoading"
+                            border
+                            style="margin:20px 0"
+                            max-height="400"
+                        >
+                            <el-table-column
+                                v-for="item in tableColums"
+                                :key="item.label"
+                                :label="item.label"
+                                :prop="item.key"
+                                :width="item.widthsty"
+                                :min-width="item.minwidthsty"
+                                align="center"
+                            >
+                                <template slot-scope="{row}">
+
+                                    <span>{{ row[item.key] }}</span>
+                                </template>
+                            </el-table-column>
+                            
+                            <div slot="empty" style="padding: 20px 0">
+                                <tableNoData :text="$t('Table.prompt_slogan')" size="mini"/>
+                            </div>
+                        </el-table>
+                    </div>
+                </div>
+                
+                <div class="dia-bot">
+                    <el-button type="primary" plain @click="isOpenAuthDia = false"
+                    >{{$t('Dialog.known')}}</el-button
+                    >
+                </div>
+            </div>
+        </m-dialog>
+    </div>
 </template>
 
 <script>
 import {approveInterence} from '@/api/modules/approve.js';
+import { operateAuthInterface } from '@/api/modules/setApi';
+import mDialog from './mDialog.vue';
 export default {
+    components: { mDialog },
     data() {
         this.approveState=['','process','passed','reject','return',]
         return {
             activeName:'first',
             visible:false,
             msgList:[],
-            UnreadTotal:0
+            UnreadTotal:0,
+
+            allUnreadTotal: 0,
+
+            //详情弹窗
+            isOpenAuthDia: false,
+            tableData: [],
+            page_no: 1,
+            haveMore: false,
+            detailInfo: {
+                MessageId: 0,
+                isAuthSet: false,//true权限设置 false资产转移
+                Source: 1,
+                SubSource: 0,
+            }
         };
     },
+    computed: {
+        tabs(){
+            const tabs = [
+                { label: this.$t('SystemManage.OperateAuth.tab01'), key: 1 },
+                { label: this.$t('SystemManage.OperateAuth.tab02'), key: 2 },
+                { label: this.$t('SystemManage.OperateAuth.tab03'), key: 3 },
+                { label: this.$t('SystemManage.OperateAuth.tab04'), key: 4 },
+                { label: this.$t('SystemManage.OperateAuth.tab05'), key: 5 },
+                { label: this.$t('SystemManage.OperateAuth.tab06'), key: 6 },
+            ]
+            return tabs
+        },
+        subTabs() {
+            const subTabs = [
+                { label: /* '自定义分析' */this.$t('SystemManage.OperateAuth.tab_sub_sheet1'), key: 4 },
+                { label:/*  '时间序列表格' */this.$t('SystemManage.OperateAuth.tab_sub_sheet2'), key: 2 },
+                { label: /* '混合表格' */this.$t('SystemManage.OperateAuth.tab_sub_sheet3'), key: 3 },
+            ]
+
+            return subTabs
+        },
+        tableColums() {
+            const clomusMap = {
+                5: [
+                    { label: this.$t('SystemManage.OperateAuth.table_col_name01'),key: 'DataName' },
+                    { label: '操作时间',key: 'CreateTime' },
+                ],
+                6: [
+                    { label: this.$t('SystemManage.OperateAuth.table_col_sheet_name'),key: 'DataName' },
+                    { label: '操作时间',key: 'CreateTime' },
+                ],
+            }
+            return clomusMap[this.detailInfo.Source] ? clomusMap[this.detailInfo.Source] 
+                : [
+                    { label: this.$t('SystemManage.OperateAuth.table_col_name05'),key: 'DataName' },
+                    { label: '操作时间',key: 'CreateTime' },
+                ]
+        },
+    },
     watch:{
         visible(val){
             if(val){
                 this.getMsgList()
             }
+        },
+        isOpenAuthDia(nval) {
+            if(!nval){
+                this.$refs.table.bodyWrapper.removeEventListener('scroll',this.handleScroll)
+                return
+            } 
+
+            this.getAuthMsgDetail()
+            this.$nextTick(() => {
+                this.$refs.table.bodyWrapper.addEventListener('scroll',this.handleScroll)
+            })
         }
     },
     methods:{
-        readMsg(msg){
-            const {ApproveState,ReportApproveId,Id} = msg
-            approveInterence.readApproveMsg({
-                MessageId:Id
-            }).then(res=>{
-                if(res.Ret!==200) return 
-                this.getMsgList()
-            })
-            const type = ApproveState===1?'approve':ApproveState===4?'detail':'myself'
-            this.$router.push({
-                path:'/approveDetail',
-                query:{
-                    type,
-                    approveId:ReportApproveId
-                }
-            })
+        async readMsg(msg){
+            const {ApproveState,ReportApproveId,Id,DataPermissionMessageId} = msg
+            
+            const res = this.activeName === 'first' 
+                ? await approveInterence.readApproveMsg({
+                    MessageId:Id
+                  })
+                : await operateAuthInterface.redMessage({ MessageId: DataPermissionMessageId })
+
+            if(res.Ret!==200) return 
+            this.getMsgList()
+            this.getUnreadNum()
+
+            if(this.activeName === 'first' ) {
+                const type = ApproveState===1?'approve':ApproveState===4?'detail':'myself'
+                this.$router.push({
+                    path:'/approveDetail',
+                    query:{
+                        type,
+                        approveId:ReportApproveId
+                    }
+                })
+            }
+        },
+        async getMsgList(){
+            const res = this.activeName === 'first' 
+                ? await approveInterence.getApproveMsgList({
+                    CurrentIndex:1,
+                    PageSize:1000
+                })
+                : await operateAuthInterface.getNoticeList({
+                    CurrentIndex:1,
+                    PageSize:1000
+                })
+
+            if(res.Ret!==200) return 
+            this.msgList = res.Data.List||[]
+            this.UnreadTotal = res.Data.UnreadTotal||0
+        },
+
+        async getUnreadNum() {
+            const res = await operateAuthInterface.getAllUnread()
+
+            if(res.Ret !== 200) return
+            
+            this.allUnreadTotal = res.Data
+        },
+
+        openAuthDetail(item) {
+            this.detailInfo.MessageId = item.DataPermissionMessageId;
+            this.detailInfo.isAuthSet = [3,4].includes(item.OpType);
+            this.detailInfo.Source = item.Source;
+            this.detailInfo.SubSource = item.SubSource;
+            this.isOpenAuthDia = true
         },
-        getMsgList(){
-            approveInterence.getApproveMsgList({
-                CurrentIndex:1,
-                PageSize:1000
-            }).then(res=>{
-                if(res.Ret!==200) return 
-                this.msgList = res.Data.List||[]
-                this.UnreadTotal = res.Data.UnreadTotal||0
+
+        changeSource() {
+            this.page_no = 1;
+            this.detailInfo.SubSource = this.detailInfo.Source===6?4:0;
+            this.getAuthMsgDetail()
+        },
+
+        changeSubSource({key}) {
+            this.page_no = 1;
+            this.detailInfo.SubSource = key;
+            this.getAuthMsgDetail()
+        },
+
+        async getAuthMsgDetail() {
+            const { MessageId,Source,SubSource } = this.detailInfo;
+            const res = await operateAuthInterface.getNoticeDetail({
+                MessageId,
+                Source,
+                SubSource,
+                CurrentIndex: this.page_no
             })
-        }
+
+            if(res.Ret !== 200) return 
+
+            let arr = res.Data.List||[]
+            
+            this.haveMore = res.Data.Paging.Pages > this.page_no
+            this.tableData = this.page_no ===1 ? arr : [...this.tableData,...arr];
+        },
+
+        /* 滚动事件 */
+        handleScroll:_.throttle(function(){
+            const {scrollTop,clientHeight,scrollHeight} = this.$refs.table.bodyWrapper
+            if(scrollTop + clientHeight >= scrollHeight-10 && this.haveMore){
+                this.page_no++;
+                this.getAuthMsgDetail();
+            }
+        },300),
+    },
+
+    mounted() {
+        this.getUnreadNum()
     }
 };
 </script>
@@ -143,4 +360,32 @@ export default {
         font-size: 12px;
     }
 }
-</style>
+.notice-auth-box {
+    .main {
+        //display: flex;
+        .left {
+            flex-shrink: 0;
+            margin-right: 15px;
+            .data-types {
+                display: flex;
+                gap: 15px;
+                li {
+                    padding: 5px 0;
+                    border-bottom: 2px solid transparent;
+                    &.act {
+                        border-color: #0052D9;
+                    }
+                }
+            }
+        }
+        .right {
+            flex: 1;
+        }
+    }
+    .dia-bot {
+        display: flex;
+        justify-content: center;
+        margin-top: 30px;
+    }
+}
+</style>

+ 12 - 0
src/lang/commonLang.js

@@ -288,6 +288,18 @@ export default {
       en: 'Upload failed!',
       zh: '上传失败!'
     },
+    no_edb_auth: {
+      zh:'暂无指标权限,如有问题请联系管理员!',
+      en:'You currently have no metric permissions. If there is an issue, please contact the administrator!'
+    },
+    no_chart_auth: {
+      zh:'暂无图表权限,如有问题请联系管理员!',
+      en:'You currently have no chart permissions. If there is an issue, please contact the administrator!'
+    },
+    no_sheet_auth: {
+      zh:'暂无表格权限,如有问题请联系管理员!',
+      en:'You currently have no table permissions. If there is an issue, please contact the administrator!'
+    },
   },
   Common: {
     category: {

+ 75 - 8
src/lang/modules/systemManage/OperateAuth.js

@@ -8,14 +8,16 @@ export const OperateAuthEn = {
     tab02:'My Steel Chemical Database',
     tab03:'ETA Indicator Library',
     tab04:'ETA Predictive Indicators',
-    tab05:'Image Library',
+    tab05:'ETA Gallery',
+    tab06:'ETA Tables',
 
     placeholder01:'Please Enter Chart Name',
-    placeholder02:'Enter Indicator ID/Indicator Name',
-    placeholder03:'Select Category',
-    placeholder04:'Select User',
+    placeholder02:'Please Enter Indicator ID/Indicator Name',
+    placeholder03:'Please Select Category',
+    placeholder04:'Please Select User',
+    placeholder_sheet:'Please Enter Table Name',
 
-    btn_text01:'Batch Edit',
+    btn_text01:'Batch Settings',
     btn_text02:'Permission Settings',
 
     table_col_name01:'Chart Name',
@@ -23,11 +25,14 @@ export const OperateAuthEn = {
     table_col_name03:'Creator',
     table_col_name04:'Indicator ID',
     table_col_name05:'Indicator Name',
+    table_col_sheet_name:'Table Name',
+    table_col_sheet_menu:'Table Category',
 
     edit_title01:'Edit Permissions',
     edit_title02:'Batch Edit Permissions',
     original_creator:'Original Creator',
     new_creator:'New Creator',
+    label_assets: 'Asset Module',
 
     msg01:'Please select at least one',
 
@@ -37,6 +42,34 @@ export const OperateAuthEn = {
     permission_confirm_msg:"Are you sure you want to delete the user's invisible permission?",
     set_success:'Setting Successful',
     placeholder05:'New creator cannot be empty',
+
+    set_assets_tab:'Set Asset Permissions',
+    set_data_tab:'Set Data Permissions',
+    transfer_all_btn:'Full Asset Transfer',
+    classify_secret_btn: 'Classified Encryption Settings',
+    classify_set_btn: 'Set Permissions by Category',
+    all_select:' Select All in List',
+    old_creator_msg:'Please select the original creator',
+    tab_sub_sheet1:'Custom analysis',
+    tab_sub_sheet2:'Time Series Table',
+    tab_sub_sheet3:'Mixed Table ',
+    label_count: 'Quantity',
+    label_checked:'Selected',
+    ph_see_user:'Please select visible users',
+    label_notice_title: 'Asset Data',
+
+    /* 转移弹窗 */
+    transfer_title1:'Full Asset Transfer',
+    transfer_title2:'Bulk Asset Transfer Setup',
+    transfer_title3:'Set Asset Transfer',
+    ph_assets:'Please select the asset module you wish to transfer',
+
+    /* 分类加密弹窗 */
+    label_open:'Public',
+    label_secret:'Private',
+
+    title_batch_set_auth:'Batch Set Data Permissions',
+    title_single_set_auth:'Set Data Permissions',
 };
   
 /* 中文 */
@@ -45,14 +78,16 @@ export const OperateAuthZh = {
     tab02:'钢联化工数据库',
     tab03:'ETA指标库',
     tab04:'ETA预测指标',
-    tab05:'图库',
+    tab05:'ETA图库',
+    tab06:'ETA表格',
 
     placeholder01:'请输入图表名称',
     placeholder02:'请输入指标Id/指标名称',
     placeholder03:'请选择分类',
     placeholder04:'请选择用户',
+    placeholder_sheet:'请输入表格名称',
 
-    btn_text01:'批量编辑',
+    btn_text01:'批量设置',
     btn_text02:'权限设置',
 
     table_col_name01:'图表名称',
@@ -60,11 +95,14 @@ export const OperateAuthZh = {
     table_col_name03:'创建人',
     table_col_name04:'指标ID',
     table_col_name05:'指标名称',
+    table_col_sheet_name:'表格名称',
+    table_col_sheet_menu:'表格分类',
 
     edit_title01:'编辑权限',
     edit_title02:'批量编辑权限',
     original_creator:'原创建人',
     new_creator:'新创建人',
+    label_assets: '资产模块',
 
     msg01:'请至少勾选一个',
 
@@ -72,9 +110,38 @@ export const OperateAuthZh = {
     permission_title02:'批量权限设置',
     invisible_users:'不可见用户',
     permission_confirm_msg:'是否确认删除该用户的不可见权限?',
-    set_success:'置成功',
+    set_success:'置成功',
     placeholder05:'新创建人不能为空',
 
+    
+    set_assets_tab:'设置资产权限',
+    set_data_tab:'设置数据权限',
+    transfer_all_btn:'全量资产转移',
+    classify_secret_btn: '分类加密设置',
+    classify_set_btn: '按分类设置权限',
+    all_select:'列表全选',
+    old_creator_msg:'请选择原创建人',
+    tab_sub_sheet1:'自定义分析',
+    tab_sub_sheet2:'时间序列表格',
+    tab_sub_sheet3:'混合表格',
+    label_count: '数量',
+    label_checked:'已选',
+    ph_see_user:'请选择可见用户',
+    label_notice_title: '资产数据',
+
+    /* 转移弹窗 */
+    transfer_title1:'全量资产转移',
+    transfer_title2:'批量设置资产转移',
+    transfer_title3:'设置资产转移',
+    ph_assets:'请选择要转移资产模块',
+
+    /* 分类加密弹窗 */
+    label_open:'公开',
+    label_secret:'私密',
+
+    title_batch_set_auth:'批量设置数据权限',
+    title_single_set_auth:'设置数据权限',
+
 };
   
 /**

+ 5 - 0
src/main.js

@@ -219,6 +219,8 @@ router.beforeEach(async(to, from, next) => {
     if (window._hmt) {
       window._hmt.push(["_trackPageview", "/#" + to.fullPath]);
     }
+/*     //store没做持久化存储,在请求前先获取旧的
+    store.dispatch('getPermissionButtonsOld') */
     //获取权限按钮
     to.path != "/login"&&to.path!='/temppage'&&await store.dispatch('getPermissionButtons')
     next();
@@ -295,3 +297,6 @@ if (
     false
   );
 }
+/* window.addEventListener('beforeunload',()=>{
+    sessionStorage.setItem('permissionBtn',JSON.stringify(store.state.permissionButton.permissionButtons))
+}) */

+ 42 - 0
src/mixins/index.js

@@ -2,6 +2,8 @@
  * Created by xieli on 2018/7/12 0012.
  */
 import http from "api/http.js";
+import {apiDownloadResource} from '@/api/modules/oldApi'
+import {Message} from "element-ui"
 const mixins = {
 	filters: {
 		// 显示时间为 2021.07.22 
@@ -133,6 +135,46 @@ const mixins = {
 					// });       
 				});
 			})
+		},
+		// 下载文件
+		handleDownloadResource(url,fileName,successCb,faileCb){
+			const b=new http.Base64() 
+			const arr=url.split('/')
+			const _fileName=arr[arr.length-1]
+			const fileNameTypeArr = fileName.split('.')
+			const _fileNameTypeArr = _fileName.split('.')
+			const fileNameType = fileNameTypeArr.length>1?fileNameTypeArr[fileNameTypeArr.length-1]:''
+			const _fileNameType = _fileNameTypeArr.length>1?_fileNameTypeArr[_fileNameTypeArr.length-1]:''
+			apiDownloadResource({
+				FileName:/* fileName||_fileName */'',
+				FileUrl:b.encode(url) 
+			}).then(res=>{
+				console.log(res);
+				const {status,data}=res
+				if(status!=200){
+					Message.warning('下载失败')
+					return
+				}
+				//bus.$parseData(response);
+				const content = data
+				const blob = new Blob([content])
+				if ('download' in document.createElement('a')) {
+					const elink = document.createElement('a')
+					elink.download = fileNameType?fileName:(fileName+'.'+_fileNameType)
+					elink.style.display = 'none'
+					elink.href = window.URL.createObjectURL(blob)
+					document.body.appendChild(elink)
+					elink.click()
+					window.URL.revokeObjectURL(elink.href)
+					document.body.removeChild(elink)
+				} else {
+					navigator.msSaveBlob(blob, fileNameType?fileName:(fileName+'.'+_fileNameType))
+				}
+				successCb&&successCb()
+			}).catch(()=>{
+				Message.warning('下载失败')
+				faileCb&&faileCb()
+			})
 		}
 		
 	}

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

@@ -310,7 +310,7 @@ export default [
       },
       {
         path: "operateAuth",
-        component: () => import("@/views/system_manage/operateAuthManage.vue"),
+        component: () => import("@/views/system_manage/dataOperaAuth.vue"),
         name: "数据操作权限",
         hidden: false,
       },

+ 14 - 0
src/utils/buttonConfig.js

@@ -666,6 +666,20 @@ export const operateAuthPermission = {
     operateAuth_manual_edit:'operateAuth:manual:edit',
     /*---------手工数据权限-------- */
     sysdataAuth_classify:'sysdataAuth:classify',//手工指标分类
+
+
+    /* new */
+    operateAuth_look:'operateAuth:look',//查看
+    /* 资产转移 */
+    operateAuth_transfer_all:'operateAuth:transfer:all',//全量资产转移
+    operateAuth_transfer_batch:'operateAuth:transfer:batch',//批量设置
+    operateAuth_transfer_one:'operateAuth:transfer:one',//编辑
+
+    /* 数据权限 */
+    operateAuth_set_classifySercet:'operateAuth:set:classifySercet',//分类加密
+    operateAuth_set_classifySet:'operateAuth:set:classifySet',//分类设置
+    operateAuth_set_batch:'operateAuth:set:batch',//指标批量设置
+    operateAuth_set_one:'operateAuth:set:one',//指标单个编辑
 }
 /*-----------基本配置-------- */
 export const baseConfigPermission = {

+ 5 - 1
src/utils/icon.js

@@ -66,5 +66,9 @@ export default {
 	/* 中英文切换 */
 	to_en: require('@/assets/img/icons/toEn.png'),
 	/* 跳转icon */
-	jupm_icon: require('@/assets/img/icons/jump_ico.png')
+	jupm_icon: require('@/assets/img/icons/jump_ico.png'),
+	/* 数据无权限icon */
+	lock_ico2: require('@/assets/img/icons/lock_black.png'),
+	/* 无权限缺省大icon */
+	lock_big: require('@/assets/img/icons/lock_big.png')
 }

+ 5 - 1
src/utils/registryComponents.js

@@ -37,4 +37,8 @@ Vue.component('chartHandlesWrap',chartDetailHandlesWrap)
 
 //长loading统一
 import dataLoading from '@/components/loading.vue';
-Vue.component('dataLoading',dataLoading)
+Vue.component('dataLoading',dataLoading)
+
+//无指标/图表/表格权限缺省
+import noDataAuth from '@/components/noDataAuth.vue';
+Vue.component('noDataAuth',noDataAuth)

+ 22 - 2
src/views/chartRelevance_manage/components/selectTarget.vue

@@ -58,9 +58,19 @@
           :key="item.EdbInfoId"
           :label="item.EdbName"
           :value="item.EdbInfoId"
+          :disabled="!item.HaveOperaAuth"
         >
           <edbDetailPopover :info="item">
-            <div slot="reference">{{item.EdbName}}</div>
+            <div slot="reference">
+              <img 
+                :src="$icons.lock_ico2" 
+                width="18" 
+                height="18" 
+                style="vertical-align:middle" 
+                v-if="!item.HaveOperaAuth"
+              />
+              {{item.EdbName}}
+            </div>
           </edbDetailPopover>
         </el-option>
       </el-select>
@@ -84,9 +94,19 @@
         :key="item.EdbInfoId"
         :label="item.EdbName"
         :value="item.EdbInfoId"
+        :disabled="!item.HaveOperaAuth"
       >
         <edbDetailPopover :info="item">
-          <div slot="reference">{{item.EdbName}}</div>
+          <div slot="reference">
+            <img 
+              :src="$icons.lock_ico2" 
+              width="18" 
+              height="18" 
+              style="vertical-align:middle" 
+              v-if="!item.HaveOperaAuth"
+            />
+            {{item.EdbName}}
+          </div>
         </edbDetailPopover>
       </el-option>
     </el-select>

+ 1 - 1
src/views/chartRelevance_manage/crossVarietyAnalysis/components/edbTableSection.vue

@@ -27,7 +27,7 @@
         </template>
       </el-table-column>
       <el-table-column :label="$t('Table.column_operations')" key="Copy" align="center" width="140">
-        <template slot-scope="scope">
+        <template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
           <span class="editsty" @click="copyCode(scope.row)">
           <i class="el-icon-document-copy" />&nbsp;{{$t('Edb.detail_copydata_btn')}}</span
         ><br />

+ 1 - 1
src/views/chartRelevance_manage/relevance/list.vue

@@ -243,7 +243,7 @@
               </template>
             </el-table-column>
             <el-table-column :label="$t('Edb.Detail.e_opera')" key="Copy" align="center" width="140">
-              <template slot-scope="scope">
+              <template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
                 <!-- <span @click="delTarget(scope.row)" class="deletesty">删除&nbsp;</span> -->
                 <span v-permission="permissionBtn.statisticPermission.corrAnalysis_copyData"
                     class="editsty" @click="copyCode(scope.row)">

+ 12 - 2
src/views/dataEntry_manage/addChart.vue

@@ -86,9 +86,19 @@
 									:key="item.EdbInfoId"
 									:label="chart_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 									:value="item.EdbInfoId"
+									:disabled="!item.HaveOperaAuth"
 								>
 									<edbDetailPopover :info="item">
-										<div slot="reference">{{chart_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName }}</div>
+										<div slot="reference">
+											<img 
+												:src="$icons.lock_ico2" 
+												width="18" 
+												height="18" 
+												style="vertical-align:middle" 
+												v-if="!item.HaveOperaAuth"
+											/>
+											{{chart_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName }}
+										</div>
 									</edbDetailPopover>
 								</el-option>
 							</el-select>
@@ -673,7 +683,7 @@
 							align="center"
 							width="140"
 						>
-							<template slot-scope="scope">
+							<template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
 								<span @click="delTarget(scope.row)" class="deletesty"><!-- 删除 -->{{$t('Table.delete_btn')}}&nbsp;</span>
 								<span v-permission="permissionBtn.chartLibPermission.chartLib_copyData"
 									class="editsty" @click="copyCode(scope.row)">

+ 11 - 0
src/views/dataEntry_manage/adjustdata/adjustData.vue

@@ -24,7 +24,18 @@
                 :key="item.EdbInfoId"
                 :label="eta_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
                 :value="item.EdbInfoId"
+                :disabled="!item.HaveOperaAuth"
               >
+                <div>
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{eta_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+								</div>
               </el-option>
             </el-select>
             <i class="el-icon-tickets" style="color:#409EFF;font-size:18px" @click="toHistoryPage(select_target,$route.matched);lookEdbId=select_target" v-if="select_target"/>

+ 428 - 402
src/views/dataEntry_manage/chartSetting.vue

@@ -67,6 +67,16 @@
                 :label="currentLang==='en'?(item.ChartNameEn||item.ChartName):item.ChartName"
                 :value="item.ChartInfoId"
               >
+                <div>
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{currentLang==='en'?(item.ChartNameEn||item.ChartName):item.ChartName}}
+								</div>
               </el-option>
             </el-select>
           </div>
@@ -114,6 +124,13 @@
                   }`"
                   :id="`node${data.UniqueCode}`"
                 >
+                  <img 
+                    :src="$icons.lock_ico2" 
+                    width="18" 
+                    height="18" 
+                    style="vertical-align:middle" 
+                    v-if="!data.HaveOperaAuth&&data.ChartInfoId"
+                  />
                   <span>{{ currentLang==='en' ? (data.ChartClassifyNameEn||data.ChartClassifyName) : data.ChartClassifyName }}</span>
                 </span>
                 <span
@@ -332,196 +349,72 @@
       >
         <!-- =============具体图表区域============== -->
         <div class="chart-min-cont" v-if="tableData.length">
-          <div class="cont-top">
-            <div class="top-left">
-              <!-- 默认曲线图 -->
-              <template v-if="sameOptionType.includes(chartInfo.ChartType)">
-                <el-button
-                  type="primary"
-                  v-for="item in yearSelector"
-                  :key="item.value"
-                  size="medium"
-                  :plain="item.value !== year_select"
-                  class="year-btn"
-                  @click.native="changeYear(item)"
-                  >{{ item.name }}</el-button
-                >
-                <el-button type="text" class="btn-sty" @click="openDateDia">{{
-                  dateTip
-                }}</el-button>
-              </template>
-              <!-- 季节性图选择年份区间 -->
-              <!-- <date-picker
-                v-else-if="chartInfo.ChartType === 2"
-                v-model="season_year"
-                type="month"
-                value-type="format"
-                range
-                placeholder="年份日期选择"
-                @change="seasonYearChange"
-              /> -->
-              <div v-else-if="chartInfo.ChartType === 2" @click="openDateDia" class="date-setting">
-                {{ season_year && season_year.length>0 ? season_year[0]+'~'+season_year[1]:"年份日期选择" }}
+
+          <template v-if="chartInfo.HaveOperaAuth">
+            <div class="cont-top">
+              <div class="top-left">
+                <!-- 默认曲线图 -->
+                <template v-if="sameOptionType.includes(chartInfo.ChartType)">
+                  <el-button
+                    type="primary"
+                    v-for="item in yearSelector"
+                    :key="item.value"
+                    size="medium"
+                    :plain="item.value !== year_select"
+                    class="year-btn"
+                    @click.native="changeYear(item)"
+                    >{{ item.name }}</el-button
+                  >
+                  <el-button type="text" class="btn-sty" @click="openDateDia">{{
+                    dateTip
+                  }}</el-button>
+                </template>
+                <!-- 季节性图选择年份区间 -->
+                <!-- <date-picker
+                  v-else-if="chartInfo.ChartType === 2"
+                  v-model="season_year"
+                  type="month"
+                  value-type="format"
+                  range
+                  placeholder="年份日期选择"
+                  @change="seasonYearChange"
+                /> -->
+                <div v-else-if="chartInfo.ChartType === 2" @click="openDateDia" class="date-setting">
+                  {{ season_year && season_year.length>0 ? season_year[0]+'~'+season_year[1]:"年份日期选择" }}
+                </div>
               </div>
             </div>
-          </div>
-          <div class="cont-bottom">
-            <el-row class="bottom-min">
-              <el-col
-                :span="21"
-                style="padding-bottom: 30px;"
-              >
-               
-                <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: 0;left: 0;">En</div>
-                <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
-                  <div class="chartWrapper" id="chartWrapper">
-                    <h2 
-                      class="chart-title"
-                      :style="`
-                        textAlign:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.align};
-                        fontSize:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.fontSize}px;
-                        color:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.color}
-                      `"
-                    >
-                      {{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}
-                    </h2>
-
-                    <Chart :options="options" :chartInfo="chartInfo" ref="chartRef"/>
+            <div class="cont-bottom">
+              <el-row class="bottom-min">
+                <el-col
+                  :span="21"
+                  style="padding-bottom: 30px;"
+                >
+                
+                  <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: 0;left: 0;">En</div>
+                  <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
+                    <div class="chartWrapper" id="chartWrapper">
+                      <h2 
+                        class="chart-title"
+                        :style="`
+                          textAlign:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.align};
+                          fontSize:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.fontSize}px;
+                          color:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.color}
+                        `"
+                      >
+                        {{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}
+                      </h2>
 
-                   <!--  <div class="range-cont left" v-if="leftIndex != -1">
-                      <el-input
-                        style="width: 60px; display: block"
-                        size="mini"
-                        type="number"
-                        :placeholder="$t('Chart.up_limit')"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="tableData[leftIndex].MaxData"
-                      />
-                      <el-input
-                        class="min-data-input"
-                        size="mini"
-                        type="number"
-                        :placeholder="$t('Chart.low_limit')"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="tableData[leftIndex].MinData"
-                      />
-                    </div>
-                    <div 
-                      class="range-cont right" 
-                      v-if="rightIndex != -1"
-                    >
-                      <el-input
-                        style="width: 60px; display: block"
-                        size="mini"
-                        type="number"
-                        :placeholder="$t('Chart.up_limit')"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="tableData[rightIndex].MaxData"
-                      />
-                      <el-input
-                        class="min-data-input"
-                        size="mini"
-                        type="number"
-                        :placeholder="$t('Chart.low_limit')"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="tableData[rightIndex].MinData"
-                      />
-                    </div>
-                    <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
-                      <el-input
-                        style="width: 60px; display: block"
-                        size="mini"
-                        type="number"
-                        :placeholder="$t('Chart.up_limit')"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="tableData[rightTwoIndex].MaxData"
-                      />
-                      <el-input
-                        class="min-data-input"
-                        size="mini"
-                        type="number"
-                        :placeholder="$t('Chart.low_limit')"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="tableData[rightTwoIndex].MinData"
-                      />
-                    </div> -->
-                    <template v-if="![7,10,11].includes(chartInfo.ChartType)">
-                        <div class="range-cont left" v-if="leftIndex != -1">
-                            <el-input
-                                style="width: 60px; display: block"
-                                size="mini"
-                                type="number"
-                                placeholder="上限"
-                                :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                                v-model="chartLimit.max"
-                                @change="changeLimit"
-                            />
-                            <el-input
-                                class="min-data-input"
-                                size="mini"
-                                type="number"
-                                placeholder="下限"
-                                :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                                v-model="chartLimit.min"
-                                @change="changeLimit"
-                            />
-                        </div>
-                    <div 
-                      class="range-cont right" 
-                      v-if="rightIndex != -1"
-                    >
-                      <el-input
-                        style="width: 60px; display: block"
-                        size="mini"
-                        type="number"
-                        placeholder="上限"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="chartLimit.rightMax"
-                        @change="changeLimit"
-                      />
-                      <el-input
-                        class="min-data-input"
-                        size="mini"
-                        type="number"
-                        placeholder="下限"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="chartLimit.rightMin"
-                        @change="changeLimit"
-                      />
-                    </div>
-                    <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
-                      <el-input
-                        style="width: 60px; display: block"
-                        size="mini"
-                        type="number"
-                        placeholder="上限"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="chartLimit.rightTwoMax"
-                        @change="changeLimit"
-                      />
-                      <el-input
-                        class="min-data-input"
-                        size="mini"
-                        type="number"
-                        placeholder="下限"
-                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                        v-model="chartLimit.rightTwoMin"
-                        @change="changeLimit"
-                      />
-                    </div>
-                    </template>
+                      <Chart :options="options" :chartInfo="chartInfo" ref="chartRef"/>
 
-                    <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-                    <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
-                      <div class="range-cont left">
+                    <!--  <div class="range-cont left" v-if="leftIndex != -1">
                         <el-input
                           style="width: 60px; display: block"
                           size="mini"
                           type="number"
                           :placeholder="$t('Chart.up_limit')"
                           :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                          v-model="chartLimit.max"
-                          @change="changeLimit"
+                          v-model="tableData[leftIndex].MaxData"
                         />
                         <el-input
                           class="min-data-input"
@@ -529,227 +422,356 @@
                           type="number"
                           :placeholder="$t('Chart.low_limit')"
                           :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                          v-model="chartLimit.min"
-                          @change="changeLimit"
+                          v-model="tableData[leftIndex].MinData"
                         />
                       </div>
-                      <!-- x轴上下限 -->
-                      <div class="range-cont bottom" v-if="chartLimit.x_min||chartLimit.x_max">
+                      <div 
+                        class="range-cont right" 
+                        v-if="rightIndex != -1"
+                      >
                         <el-input
-                          class="left"
+                          style="width: 60px; display: block"
+                          size="mini"
+                          type="number"
+                          :placeholder="$t('Chart.up_limit')"
+                          :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                          v-model="tableData[rightIndex].MaxData"
+                        />
+                        <el-input
+                          class="min-data-input"
                           size="mini"
                           type="number"
                           :placeholder="$t('Chart.low_limit')"
                           :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                          v-model="chartLimit.x_min"
-                          @change="changeLimit"
+                          v-model="tableData[rightIndex].MinData"
                         />
+                      </div>
+                      <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
                         <el-input
-                          class="left"
+                          style="width: 60px; display: block"
                           size="mini"
                           type="number"
                           :placeholder="$t('Chart.up_limit')"
                           :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
-                          v-model="chartLimit.x_max"
+                          v-model="tableData[rightTwoIndex].MaxData"
+                        />
+                        <el-input
+                          class="min-data-input"
+                          size="mini"
+                          type="number"
+                          :placeholder="$t('Chart.low_limit')"
+                          :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                          v-model="tableData[rightTwoIndex].MinData"
+                        />
+                      </div> -->
+                      <template v-if="![7,10,11].includes(chartInfo.ChartType)">
+                          <div class="range-cont left" v-if="leftIndex != -1">
+                              <el-input
+                                  style="width: 60px; display: block"
+                                  size="mini"
+                                  type="number"
+                                  placeholder="上限"
+                                  :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                                  v-model="chartLimit.max"
+                                  @change="changeLimit"
+                              />
+                              <el-input
+                                  class="min-data-input"
+                                  size="mini"
+                                  type="number"
+                                  placeholder="下限"
+                                  :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                                  v-model="chartLimit.min"
+                                  @change="changeLimit"
+                              />
+                          </div>
+                      <div 
+                        class="range-cont right" 
+                        v-if="rightIndex != -1"
+                      >
+                        <el-input
+                          style="width: 60px; display: block"
+                          size="mini"
+                          type="number"
+                          placeholder="上限"
+                          :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                          v-model="chartLimit.rightMax"
+                          @change="changeLimit"
+                        />
+                        <el-input
+                          class="min-data-input"
+                          size="mini"
+                          type="number"
+                          placeholder="下限"
+                          :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                          v-model="chartLimit.rightMin"
                           @change="changeLimit"
                         />
                       </div>
-                    </template>
-                  </div>
-                  <span class="chart-author"
-                    ><!-- 作者 -->{{$t('Chart.Detail.author')}}:{{ chartInfo.SysUserRealName || '' }}</span
-                  >
+                      <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
+                        <el-input
+                          style="width: 60px; display: block"
+                          size="mini"
+                          type="number"
+                          placeholder="上限"
+                          :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                          v-model="chartLimit.rightTwoMax"
+                          @change="changeLimit"
+                        />
+                        <el-input
+                          class="min-data-input"
+                          size="mini"
+                          type="number"
+                          placeholder="下限"
+                          :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                          v-model="chartLimit.rightTwoMin"
+                          @change="changeLimit"
+                        />
+                      </div>
+                      </template>
+
+                      <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
+                      <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
+                        <div class="range-cont left">
+                          <el-input
+                            style="width: 60px; display: block"
+                            size="mini"
+                            type="number"
+                            :placeholder="$t('Chart.up_limit')"
+                            :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                            v-model="chartLimit.max"
+                            @change="changeLimit"
+                          />
+                          <el-input
+                            class="min-data-input"
+                            size="mini"
+                            type="number"
+                            :placeholder="$t('Chart.low_limit')"
+                            :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                            v-model="chartLimit.min"
+                            @change="changeLimit"
+                          />
+                        </div>
+                        <!-- x轴上下限 -->
+                        <div class="range-cont bottom" v-if="chartLimit.x_min||chartLimit.x_max">
+                          <el-input
+                            class="left"
+                            size="mini"
+                            type="number"
+                            :placeholder="$t('Chart.low_limit')"
+                            :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                            v-model="chartLimit.x_min"
+                            @change="changeLimit"
+                          />
+                          <el-input
+                            class="left"
+                            size="mini"
+                            type="number"
+                            :placeholder="$t('Chart.up_limit')"
+                            :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                            v-model="chartLimit.x_max"
+                            @change="changeLimit"
+                          />
+                        </div>
+                      </template>
+                    </div>
+                    <span class="chart-author"
+                      ><!-- 作者 -->{{$t('Chart.Detail.author')}}:{{ chartInfo.SysUserRealName || '' }}</span
+                    >
 
-                  <div class="chart-bottom-insruction-info">
+                    <div class="chart-bottom-insruction-info">
 
-                    <div class="chart-source" >
-                        <span
-                          v-if="chartInfo.SourcesFrom&&JSON.parse(chartInfo.SourcesFrom).isShow"
-                          :style="`
-                          color: ${JSON.parse(chartInfo.SourcesFrom).color};
-                          fontSize: ${ JSON.parse(chartInfo.SourcesFrom).fontSize }px;
+                      <div class="chart-source" >
+                          <span
+                            v-if="chartInfo.SourcesFrom&&JSON.parse(chartInfo.SourcesFrom).isShow"
+                            :style="`
+                            color: ${JSON.parse(chartInfo.SourcesFrom).color};
+                            fontSize: ${ JSON.parse(chartInfo.SourcesFrom).fontSize }px;
+                          `"
+                          ><!-- 来源 -->{{$t('Chart.Detail.source')}}:{{ JSON.parse(chartInfo.SourcesFrom).text}}</span>
+                      </div>
+
+                      <!-- 公历农历切换 只用于季节性图 -->
+                      <el-radio-group
+                        v-model="calendar_type"
+                        class="calendar-cont"
+                        v-if="chartInfo.ChartType === 2"
+                        @change="getPreviewChartInfo"
+                      >
+                        <el-radio-button label="公历">{{$t('Chart.calendar_gre')}}</el-radio-button>
+                        <el-radio-button label="农历">{{$t('Chart.calendar_lunar')}}</el-radio-button>
+                      </el-radio-group>
+
+                      <!-- 图表说明 -->
+                      <div 
+                        class="chart-instruction" 
+                        v-if="chartInfo.Instructions&&JSON.parse(chartInfo.Instructions).isShow"
+                        v-text="JSON.parse(chartInfo.Instructions).text"
+                        :style="`
+                          color: ${JSON.parse(chartInfo.Instructions).color};
+                          fontSize: ${ JSON.parse(chartInfo.Instructions).fontSize }px
                         `"
-                        ><!-- 来源 -->{{$t('Chart.Detail.source')}}:{{ JSON.parse(chartInfo.SourcesFrom).text}}</span>
+                      ></div>
                     </div>
-
-                    <!-- 公历农历切换 只用于季节性图 -->
-                    <el-radio-group
-                      v-model="calendar_type"
-                      class="calendar-cont"
-                      v-if="chartInfo.ChartType === 2"
-                      @change="getPreviewChartInfo"
-                    >
-                      <el-radio-button label="公历">{{$t('Chart.calendar_gre')}}</el-radio-button>
-							        <el-radio-button label="农历">{{$t('Chart.calendar_lunar')}}</el-radio-button>
-                    </el-radio-group>
-
-                    <!-- 图表说明 -->
-                    <div 
-                      class="chart-instruction" 
-                      v-if="chartInfo.Instructions&&JSON.parse(chartInfo.Instructions).isShow"
-                      v-text="JSON.parse(chartInfo.Instructions).text"
-                      :style="`
-                        color: ${JSON.parse(chartInfo.Instructions).color};
-                        fontSize: ${ JSON.parse(chartInfo.Instructions).fontSize }px
-                      `"
-                    ></div>
+                    
                   </div>
-                  
-                </div>
 
-                <!-- 异常显示 -->
-                <p class="error-tip" style="min-height: 400px;" v-if="chartInfo.WarnMsg">{{chartInfo.WarnMsg}}</p>
-              </el-col>
-              <el-col :span="3" style="position: absolute;height: 100%;right: 0;min-width: 115px;">
-                <ul class="right-actions">
-                    <li><!-- 操作 -->{{$t('Table.column_operations')}}</li>
-                    <li
-                      v-permission="permissionBtn.chartLibPermission.chartLib_share"
-                      class="span-item shareLink"
-                      @click="copyChartConfirm('url')"
-                      :data-clipboard-text="linkUrl"
-                      v-if="!chartInfo.Disabled"
-                    >
-                      <i class="el-icon-share"/>&nbsp;<!-- 分享 -->
-                      {{$t('Chart.chart_share_btn')}}
-                    </li>
-                    <li
-                      v-permission="permissionBtn.chartLibPermission.chartLib_addMy"
-                      class="span-item"
-                      @click="addMychartHandle(chartInfo)"
-                    >
-                      <img
-                        :src="$icons.chart_join_ico"
-                        alt=""
-                        style="width: 13px; height: 12px; vertical-align: middle"
-                      /><!-- 加入我的图库 -->{{$t('Chart.chart_addmy_btn')}}
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_refresh"
-                      class="span-item" 
-                      @click="refreshHandle"
-                    >
-                      <span>
-                        <i class="el-icon-refresh" style="margin-left:0"/>&nbsp;<!-- 刷新 -->{{$t('Edb.detail_refresh_btn')}} 
-                      </span>
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_save"
-                      class="span-item"
-                    >
-                      <span @click="saveChartHandle('')">
-                        <i class="el-icon-collection" />&nbsp;<!-- 保存 -->{{$t('Chart.chart_save_btn')}}
-                      </span>
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_otherSave"
-                      class="span-item"
-                    >
-                      <span @click="saveChartOtherHandle">
-                        <i class="el-icon-document-add" />&nbsp;<!-- 另存为 -->{{$t('Chart.chart_copy_btn')}}
-                      </span>
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_edit"
-                      class="span-item"
-                      v-if="chartInfo.IsEdit"
-                      @click="editChartHandle"
-                    >
-                      <img
-                        src="~@/assets/img/set_m/edit.png"
-                        alt=""
-                        style="width: 13px; height: 12px;"
-                      />&nbsp;<!-- 编辑 -->{{$t('Chart.chart_edit_btn')}}
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_copyOffice"
-                      class="span-item copy"
-                      @click="copyChartConfirm('office')"
-                      v-if="!chartInfo.Disabled"
-                    >
-                      <i class="el-icon-document-copy" />&nbsp;<!-- 复制至office -->{{$t('Chart.chart_copyoffice')}}
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_copyWechat"
-                      class="span-item copy"
-                      @click="copyChartConfirm('微信')"
-                      v-if="!chartInfo.Disabled"
-                    >
-                      <img style="width: 13px; height: 12px;vertical-align: middle" src="~@/assets/img/chart_m/WeChat.jpg" />&nbsp;<!-- 复制至微信 -->{{$t('Chart.chart_copywx')}}
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_enNameSetting"
-                      class="span-item copy"
-                      @click="openEnNameDia"
+                  <!-- 异常显示 -->
+                  <p class="error-tip" style="min-height: 400px;" v-if="chartInfo.WarnMsg">{{chartInfo.WarnMsg}}</p>
+                </el-col>
+                <el-col :span="3" style="position: absolute;height: 100%;right: 0;min-width: 115px;">
+                  <ul class="right-actions">
+                      <li><!-- 操作 -->{{$t('Table.column_operations')}}</li>
+                      <li
+                        v-permission="permissionBtn.chartLibPermission.chartLib_share"
+                        class="span-item shareLink"
+                        @click="copyChartConfirm('url')"
+                        :data-clipboard-text="linkUrl"
+                        v-if="!chartInfo.Disabled"
+                      >
+                        <i class="el-icon-share"/>&nbsp;<!-- 分享 -->
+                        {{$t('Chart.chart_share_btn')}}
+                      </li>
+                      <li
+                        v-permission="permissionBtn.chartLibPermission.chartLib_addMy"
+                        class="span-item"
+                        @click="addMychartHandle(chartInfo)"
+                      >
+                        <img
+                          :src="$icons.chart_join_ico"
+                          alt=""
+                          style="width: 13px; height: 12px; vertical-align: middle"
+                        /><!-- 加入我的图库 -->{{$t('Chart.chart_addmy_btn')}}
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_refresh"
+                        class="span-item" 
+                        @click="refreshHandle"
+                      >
+                        <span>
+                          <i class="el-icon-refresh" style="margin-left:0"/>&nbsp;<!-- 刷新 -->{{$t('Edb.detail_refresh_btn')}} 
+                        </span>
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_save"
+                        class="span-item"
+                      >
+                        <span @click="saveChartHandle('')">
+                          <i class="el-icon-collection" />&nbsp;<!-- 保存 -->{{$t('Chart.chart_save_btn')}}
+                        </span>
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_otherSave"
+                        class="span-item"
+                      >
+                        <span @click="saveChartOtherHandle">
+                          <i class="el-icon-document-add" />&nbsp;<!-- 另存为 -->{{$t('Chart.chart_copy_btn')}}
+                        </span>
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_edit"
+                        class="span-item"
+                        v-if="chartInfo.IsEdit"
+                        @click="editChartHandle"
+                      >
+                        <img
+                          src="~@/assets/img/set_m/edit.png"
+                          alt=""
+                          style="width: 13px; height: 12px;"
+                        />&nbsp;<!-- 编辑 -->{{$t('Chart.chart_edit_btn')}}
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_copyOffice"
+                        class="span-item copy"
+                        @click="copyChartConfirm('office')"
+                        v-if="!chartInfo.Disabled"
+                      >
+                        <i class="el-icon-document-copy" />&nbsp;<!-- 复制至office -->{{$t('Chart.chart_copyoffice')}}
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_copyWechat"
+                        class="span-item copy"
+                        @click="copyChartConfirm('微信')"
+                        v-if="!chartInfo.Disabled"
+                      >
+                        <img style="width: 13px; height: 12px;vertical-align: middle" src="~@/assets/img/chart_m/WeChat.jpg" />&nbsp;<!-- 复制至微信 -->{{$t('Chart.chart_copywx')}}
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_enNameSetting"
+                        class="span-item copy"
+                        @click="openEnNameDia"
+                      >
+                        <img style="width: 16px;vertical-align: middle" :src="$icons.to_en" />&nbsp;<!-- 设置英文名称 -->{{$t('Edb.detail_en_btn')}}
+                      </li>
+                      <li 
+                        v-permission="permissionBtn.chartLibPermission.chartLib_del"
+                        class="span-item"
+                        style="color: #ff4040"
+                        @click="delChartHandle"
+                        v-if="chartInfo.IsEdit"
+                      >
+                        <i class="el-icon-delete" style="color: #ff4040" />&nbsp;<!-- 删除 -->{{$t('Chart.chart_del_btn')}}
+                      </li>
+                  </ul>
+                </el-col>
+              </el-row>
+              <el-table
+                :data="tableData"
+                ref="tableRef"
+                highlight-current-row
+                border
+              >
+                <el-table-column
+                  v-for="item in tableColums"
+                  :key="item.label"
+                  :label="item.label"
+                  :width="item.widthsty"
+                  :min-width="item.minwidthsty"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <span v-if="item.key==='SourceName'">
+                      {{scope.row[item.key]}}
+                      <i 
+                        class="el-icon-tickets" 
+                        style="color:#409EFF;font-size:18px" 
+                        @click="toHistoryPage(scope.row.EdbInfoId,$route.matched)"
+                        v-if="scope.row.EdbType===2"
+                      />
+                    </span>
+                    <span v-else>{{ currentLang==='en' ? (scope.row[item.enKey]||scope.row[item.key]) : scope.row[item.key] }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  :label="$t('Table.column_operations')"
+                  key="Copy"
+                  align="center"
+                  width="110"
+                >
+                  <template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
+                    <span 
+                      v-permission="permissionBtn.chartLibPermission.chartLib_copyData"
+                      class="editsty" @click="copyCode(scope.row)"
                     >
-                      <img style="width: 16px;vertical-align: middle" :src="$icons.to_en" />&nbsp;<!-- 设置英文名称 -->{{$t('Edb.detail_en_btn')}}
-                    </li>
-                    <li 
-                      v-permission="permissionBtn.chartLibPermission.chartLib_del"
-                      class="span-item"
-                      style="color: #ff4040"
-                      @click="delChartHandle"
-                      v-if="chartInfo.IsEdit"
+                      <i class="el-icon-document-copy" />&nbsp;<!-- 复制数据 -->{{$t('Edb.detail_copydata_btn')}}
+                    </span>
+                    <span 
+                      v-permission="permissionBtn.chartLibPermission.chartLib_viewData"
+                      class="editsty"
+                      @click="viewTarget(scope.row)"
                     >
-                      <i class="el-icon-delete" style="color: #ff4040" />&nbsp;<!-- 删除 -->{{$t('Chart.chart_del_btn')}}
-                    </li>
-                </ul>
-              </el-col>
-            </el-row>
-            <el-table
-              :data="tableData"
-              ref="tableRef"
-              highlight-current-row
-              border
-            >
-              <el-table-column
-                v-for="item in tableColums"
-                :key="item.label"
-                :label="item.label"
-                :width="item.widthsty"
-                :min-width="item.minwidthsty"
-                align="center"
-              >
-                <template slot-scope="scope">
-                  <span v-if="item.key==='SourceName'">
-                    {{scope.row[item.key]}}
-                    <i 
-                      class="el-icon-tickets" 
-                      style="color:#409EFF;font-size:18px" 
-                      @click="toHistoryPage(scope.row.EdbInfoId,$route.matched)"
-                      v-if="scope.row.EdbType===2"
-                    />
-                  </span>
-                  <span v-else>{{ currentLang==='en' ? (scope.row[item.enKey]||scope.row[item.key]) : scope.row[item.key] }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column
-                :label="$t('Table.column_operations')"
-                key="Copy"
-                align="center"
-                width="110"
-              >
-                <template slot-scope="scope">
-                  <span 
-                    v-permission="permissionBtn.chartLibPermission.chartLib_copyData"
-                    class="editsty" @click="copyCode(scope.row)"
-                  >
-                    <i class="el-icon-document-copy" />&nbsp;<!-- 复制数据 -->{{$t('Edb.detail_copydata_btn')}}
-                  </span>
-                  <span 
-                    v-permission="permissionBtn.chartLibPermission.chartLib_viewData"
-                    class="editsty"
-                    @click="viewTarget(scope.row)"
-                  >
-                    <!-- 查看数据 -->{{$t('Edb.detail_lookdata_btn')}}
-                  </span>
-                </template>
-              </el-table-column>
-              <div slot="empty">
-                <tableNoData :text="$t('Table.no_edb_msg')" size="mini"/>
-              </div>
-            </el-table>
-          </div>
+                      <!-- 查看数据 -->{{$t('Edb.detail_lookdata_btn')}}
+                    </span>
+                  </template>
+                </el-table-column>
+                <div slot="empty">
+                  <tableNoData :text="$t('Table.no_edb_msg')" size="mini"/>
+                </div>
+              </el-table>
+            </div>
+          </template>
+
+          <noDataAuth v-if="chartInfo.HaveOperaAuth===false" :text="$t('MsgPrompt.no_chart_auth')"/>
         </div>
         <!-- ==============图表列表展示============= -->
         <div class="chart-public-cont" v-else>
@@ -766,12 +788,13 @@
                         <span class="text_oneLine" :style="{'padding-left':chart.IsEnChart?'24px':''}">{{ currentLang === 'en' ? (chart.ChartNameEn||chart.ChartName) : chart.ChartName }}</span>
                     </div>
                     <div class="chart-item-img" @click="detailShowHandle(chart)"
-                    :style="chart.ChartImage?{background: `no-repeat top/cover url('${chart.ChartImage}')`}:{}"></div>
+                    :style="{background: `no-repeat top/cover url('${!chart.HaveOperaAuth ? $icons.lock_big : chart.ChartImage}')`}"></div>
                     <div class="chart-item-bottom">
                         <span><!-- 创建时间 -->{{$t('Chart.list_chart_time')}}: {{ chart.CreateTime.slice(0,10) }}</span>
                         <span v-permission="permissionBtn.chartLibPermission.chartLib_addMy"
                             class="join_txt"
                             @click="addMychartHandle(chart)"
+                            v-if="chart.HaveOperaAuth"
                         >
                             <img
                             :src="$icons.chart_join_ico"
@@ -1651,37 +1674,15 @@ export default {
       }
       if (res.Ret !== 200) return;
       this.chartInfo = res.Data.ChartInfo;
-
-      //处理下历史默认来源
-			this.setDefaultSourceFrom();
-  
       this.tableData = res.Data.EdbInfoList;
-      //初始化上下限
-      this.setLimitData(this.tableData)
-        
-      // 设置起始日期和最新日期
-      this.setExtremumDate()
-
-      this.setDefaultDateSelect(); //设置默认的日期选中
-      this.setDefaultPreviewOption(); //设置默认预览配置项
-
-      sessionStorage.setItem('defaultArr',JSON.stringify(res.Data.EdbInfoList));
 
-      const chartTypeMap = {
-        7: this.initBarData, //柱形图
-        10: this.initSectionScatterData, //截面散点
-        11: this.initRadarData //雷达图
-      }
-      chartTypeMap[this.chartInfo.ChartType] && chartTypeMap[this.chartInfo.ChartType](res.Data);
-
-      //将指标添加进标签列表中
+      // //将指标添加进标签列表中
       const {ChartNameEn,ChartName,ChartInfoId,UniqueCode,ChartClassifyId}=res.Data.ChartInfo
       this.addLabel({code:UniqueCode,id:ChartInfoId,classifyId:ChartClassifyId,EdbName:ChartName,EdbNameEn:ChartNameEn,chartData:res.Data.ChartInfo})
       this.defaultShowNodes=this.findParentNodeHandle(this.treeData,ChartClassifyId).reverse();
       this.changeTreeNode()
 
-
-      //滚动到高亮节点位置
+       //滚动到高亮节点位置
       this.$refs.treeRef.setCurrentKey(this.select_node);
       setTimeout(() => {
         let node = document.getElementById(`node${this.select_node}`);
@@ -1699,6 +1700,31 @@ export default {
           parent.scrollTop =  node.offsetTop - parent.offsetHeight/2
         }
       },400)
+
+
+      if(!this.chartInfo.HaveOperaAuth) return
+
+      //处理下历史默认来源
+			this.setDefaultSourceFrom();
+  
+      //初始化上下限
+      this.setLimitData(this.tableData)
+        
+      // 设置起始日期和最新日期
+      this.setExtremumDate()
+
+      this.setDefaultDateSelect(); //设置默认的日期选中
+      this.setDefaultPreviewOption(); //设置默认预览配置项
+
+      sessionStorage.setItem('defaultArr',JSON.stringify(res.Data.EdbInfoList));
+
+      const chartTypeMap = {
+        7: this.initBarData, //柱形图
+        10: this.initSectionScatterData, //截面散点
+        11: this.initRadarData //雷达图
+      }
+      chartTypeMap[this.chartInfo.ChartType] && chartTypeMap[this.chartInfo.ChartType](res.Data);
+
     },
 
     /* 设置默认时间选中项 */

+ 11 - 0
src/views/dataEntry_manage/codecount/index.vue

@@ -127,7 +127,18 @@
 										:key="item.EdbInfoId"
 										:label="eta_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 										:value="item.EdbInfoId"
+										:disabled="!item.HaveOperaAuth"
 									>
+										<div>
+											<img 
+												:src="$icons.lock_ico2" 
+												width="18" 
+												height="18" 
+												style="vertical-align:middle" 
+												v-if="!item.HaveOperaAuth"
+											/>
+											{{eta_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+										</div>
 									</el-option>
 								</el-select>
 

+ 33 - 0
src/views/dataEntry_manage/components/satterSeriesDia.vue

@@ -65,7 +65,18 @@
               :key="item.EdbInfoId"
               :label="item.EdbName"
               :value="item.EdbInfoId"
+              :disabled="!item.HaveOperaAuth"
             >
+              <div>
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!item.HaveOperaAuth"
+                />
+                {{item.EdbName}}
+              </div>
             </el-option>
           </el-select>
           <ul class="targets-ul">
@@ -124,7 +135,18 @@
               :key="item.EdbInfoId"
               :label="item.EdbName"
               :value="item.EdbInfoId"
+              :disabled="!item.HaveOperaAuth"
             >
+              <div>
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!item.HaveOperaAuth"
+                />
+                {{item.EdbName}}
+              </div>
             </el-option>
           </el-select>
           <ul class="targets-ul">
@@ -308,7 +330,18 @@
                 :key="item.EdbInfoId"
                 :label="item.EdbName"
                 :value="item.EdbInfoId"
+                :disabled="!item.HaveOperaAuth"
               >
+                <div>
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{item.EdbName}}
+								</div>
               </el-option>
             </el-select>
           </el-form-item>

+ 11 - 0
src/views/dataEntry_manage/databaseComponents/batchComptedDialog.vue

@@ -45,7 +45,18 @@
 							:key="item.EdbInfoId"
 							:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 							:value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
 						>
+							<div>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!item.HaveOperaAuth"
+								/>
+								{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+							</div>
 						</el-option>
 					</el-select>
 

+ 19 - 3
src/views/dataEntry_manage/databaseComponents/batchComputedV2.vue

@@ -124,7 +124,19 @@
                                 :key="item.EdbInfoId"
                                 :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
                                 :value="item.EdbInfoId"
-                            />
+                                :disabled="!item.HaveOperaAuth"
+                            >
+                                <div>
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+								</div>
+                            </el-option>
                         </el-select>
                     </el-form-item>
                     <el-form-item required label="公式">
@@ -280,7 +292,7 @@
                         height="500px"
                         v-loading="listLoading"
                     >
-                        <el-table-column type="selection" min-width="50" align="center"/>
+                        <el-table-column type="selection" min-width="50" align="center" :selectable="filterEdbAuth"/>
                         <el-table-column label="指标全称" show-overflow-tooltip align="center" prop="EdbName"/>
                         <el-table-column label="最新日期" align="center" prop="EndDate" width="120px" />
                         <el-table-column label="最新值" align="center" show-overflow-tooltip prop="EndValue" width="80px"/>
@@ -646,7 +658,7 @@ export default {
             const arr=res.Data.SearchItem||[]
             const temArr=this.mergeAndDistinct(this.selectList,arr)
             // 截取数组 防止数量溢出
-            this.selectList=temArr.slice(0,this.MAXAddNUM)
+            this.selectList=temArr.filter(_ =>_.HaveOperaAuth).slice(0,this.MAXAddNUM)
         },
         mergeAndDistinct(arr1, arr2) {
             // 合并两个数组
@@ -950,6 +962,10 @@ export default {
             },50)
         },
 
+        filterEdbAuth(row) {
+            return row.HaveOperaAuth
+        }
+
 
 
     },

+ 11 - 1
src/views/dataEntry_manage/databaseComponents/computedDialog.vue

@@ -40,9 +40,19 @@
 							:key="item.EdbInfoId"
 							:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 							:value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
 						>
 							<edbDetailPopover :info="item">
-								<div slot="reference">{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}</div>
+								<div slot="reference">
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+								</div>
 							</edbDetailPopover>
 						</el-option>
 					</el-select>

+ 2 - 2
src/views/dataEntry_manage/databaseComponents/dataAssociateChart.vue

@@ -15,10 +15,10 @@
                 <div class="chart-list-item" v-for="chart in list" :key="chart.ChartInfoId">
                     <div class="chart-item-top text_oneLine"><span class="text_oneLine">{{ chart.ChartName }}</span></div>
                     <div class="chart-item-img" @click="detailShowHandle(chart)"
-                        :style="chart.ChartImage?{background: `no-repeat top/cover url('${chart.ChartImage}')`}:{}"></div>
+                        :style="{background: `no-repeat top/cover url('${!chart.HaveOperaAuth ? $icons.lock_big : chart.ChartImage}')`}"></div>
                     <div class="chart-item-bottom">
                         <span>{{$t('Chart.list_chart_time')}}: {{ chart.CreateTime.slice(0,10) }}</span>
-                        <span class="join_txt" @click="addMychartHandle(chart)">
+                        <span class="join_txt" @click="addMychartHandle(chart)" v-if="chart.HaveOperaAuth">
                             <img :src="$icons.chart_join_ico"
                                 style="width: 13px; height: 12px; vertical-align: middle"/>
                             <!-- 加入我的图库 -->

+ 1 - 1
src/views/dataEntry_manage/databaseComponents/dataAssociateComputeData.vue

@@ -47,7 +47,7 @@
                 </template>
             </el-table-column>
             <el-table-column :label="$t('Edb.Detail.e_opera')" key="Copy" align="center" width="110">
-                <template slot-scope="scope">
+                <template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
                 <span v-permission="permissionBtn.edbDataPermission.edbData_copyData"
                 class="editsty" @click="copyCode(scope.row)">
                     <i class="el-icon-document-copy" />&nbsp;{{$t('Edb.detail_copydata_btn')}}</span

+ 11 - 0
src/views/dataEntry_manage/databaseComponents/diffusionIndexDia.vue

@@ -41,7 +41,18 @@
                 :key="item.EdbInfoId"
                 :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
                 :value="item.EdbInfoId"
+								:disabled="!item.HaveOperaAuth"
               >
+									<div>
+										<img 
+											:src="$icons.lock_ico2" 
+											width="18" 
+											height="18" 
+											style="vertical-align:middle" 
+											v-if="!item.HaveOperaAuth"
+										/>
+										{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+									</div>
               </el-option>
             </el-select>
             <i

+ 22 - 0
src/views/dataEntry_manage/databaseComponents/fittingResidueDia.vue

@@ -49,7 +49,18 @@
               :key="item.EdbInfoId"
               :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
               :value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
             >
+							<div>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!item.HaveOperaAuth"
+								/>
+								{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+							</div>
             </el-option>
           </el-select>
           <span v-if="formData.self_variate" style="color: #409EFF;margin-left: 20px;">{{formData.self_edb_date[0]+'至'+ formData.self_edb_date[1]}}</span>
@@ -93,7 +104,18 @@
               :key="item.EdbInfoId"
               :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
               :value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
             >
+							<div>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!item.HaveOperaAuth"
+								/>
+								{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+							</div>
             </el-option>
           </el-select>
           <span v-if="formData.depend_variate" style="color: #409EFF;margin-left: 20px;">{{formData.depend_edb_date[0]+'至'+ formData.depend_edb_date[1]}}</span>

+ 44 - 0
src/views/dataEntry_manage/databaseComponents/jointTargetDia.vue

@@ -61,7 +61,18 @@
 							:key="item.EdbInfoId"
 							:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 							:value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
 						>
+							<div>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!item.HaveOperaAuth"
+								/>
+								{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+							</div>
 						</el-option>
 					</el-select>
 					<span v-if="formData.pre_edb">({{$t('Edb.Detail.e_start_time')}}:{{ searchOptions.find(item => item.EdbInfoId === formData.pre_edb) ? searchOptions.find(item => item.EdbInfoId === formData.pre_edb).StartDate : ''}})</span>
@@ -87,7 +98,18 @@
 								:key="item.EdbInfoId"
 								:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 								:value="item.EdbInfoId"
+								:disabled="!item.HaveOperaAuth"
 							>
+								<div>
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+								</div>
 							</el-option>
 						</el-select>
 						<span v-if="formData.after_edb">({{$t('Edb.Detail.e_latest_date')}}:{{ searchOptions.find(item => item.EdbInfoId === formData.after_edb) ? searchOptions.find(item => item.EdbInfoId === formData.after_edb).EndDate : ''}})</span>
@@ -115,7 +137,18 @@
 								:key="item.EdbInfoId"
 								:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 								:value="item.EdbInfoId"
+								:disabled="!item.HaveOperaAuth"
 							>
+								<div>
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+								</div>
 							</el-option>
 						</el-select>
 					<span v-if="formData.old_stay_edb">({{$t('EtaBasePage.label_end_date')}}:{{searchMonthOptions.find(item => item.EdbInfoId === formData.old_stay_edb) ? searchMonthOptions.find(item => item.EdbInfoId === formData.old_stay_edb).EndDate : ''}})</span>
@@ -139,7 +172,18 @@
 							:key="item.EdbInfoId"
 							:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 							:value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
 						>
+							<div>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!item.HaveOperaAuth"
+								/>
+								{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+							</div>
 						</el-option>
 					</el-select>
 				</el-form-item>

+ 33 - 16
src/views/dataEntry_manage/databaseComponents/operationDialog.vue

@@ -46,7 +46,18 @@
 						:key="item.EdbInfoId"
 						:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 						:value="item.EdbInfoId"
+						:disabled="!item.HaveOperaAuth"
 					>
+						<div>
+							<img 
+								:src="$icons.lock_ico2" 
+								width="18" 
+								height="18" 
+								style="vertical-align:middle" 
+								v-if="!item.HaveOperaAuth"
+							/>
+							{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+						</div>
 					</el-option>
 				</el-select>
 				<i class="el-icon-tickets" style="color:#409EFF;font-size:18px" @click="handleSelectBtnClick" v-if="select_target"/>
@@ -85,21 +96,21 @@
 					</div>
 				</el-table>
 				<ul 
-				class="data-ul" 
-				ref="dataUl" 
-				@scroll="scrollHandle"
-				v-if="dataList.length">
-					<li
-						class="value-item"
-						v-for="(item, index) in dataList"
-						:key="item.EdbDataId"
-					>
-						<span class="value-label">
-							<i class="new-tag" v-if="index === 0"></i>
-							{{item.DataTime}}
-						</span>
-						<span class="value-label" style="min-width:200px;text-align:center;">{{item.Value}}</span>
-					</li>
+					class="data-ul" 
+					ref="dataUl" 
+					@scroll="scrollHandle"
+					v-if="dataList.length">
+						<li
+							class="value-item"
+							v-for="(item, index) in dataList"
+							:key="item.EdbDataId"
+						>
+							<span class="value-label">
+								<i class="new-tag" v-if="index === 0"></i>
+								{{item.DataTime}}
+							</span>
+							<span class="value-label" style="min-width:200px;text-align:center;">{{item.Value}}</span>
+						</li>
 				</ul>
 				<div class="form-cont">
 					<el-form
@@ -557,7 +568,13 @@ export default {
 						res.Data.Item.ModifyTime = res.Data.Item.ModifyTime.substr(0,10);
 						this.tableData = [res.Data.Item] || [];
 						this.haveMore =  this.page_no < res.Data.Paging.Pages ? true : false;
-						this.dataList = this.page_no === 1 ? (res.Data.Item.DataList || []) : this.dataList.concat(res.Data.Item.DataList);
+
+						//原指标有权限
+						if(res.Data.Item.HaveOperaAuth) {
+							this.dataList = this.page_no === 1 ? (res.Data.Item.DataList || []) : this.dataList.concat(res.Data.Item.DataList);
+						}else {
+							this.dataList = []
+						}
 					}else {
 						this.tableData = [];
 						this.dataList = [];

+ 22 - 2
src/views/dataEntry_manage/databaseComponents/replaceDialog.vue

@@ -44,9 +44,19 @@
 						:key="item.EdbInfoId"
 						:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 						:value="item.EdbInfoId"
+						:disabled="!item.HaveOperaAuth"
 					>
 						<edbDetailPopover :info="item">
-							<div slot="reference">{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}</div>
+							<div slot="reference">
+								<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+								{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+							</div>
 						</edbDetailPopover>
 					</el-option>
 				</el-select>
@@ -70,9 +80,19 @@
 						:key="item.EdbInfoId"
 						:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 						:value="item.EdbInfoId"
+						:disabled="!item.HaveOperaAuth"
 					>
 						<edbDetailPopover :info="item">
-							<div slot="reference">{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}</div>
+							<div slot="reference">
+								<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+								{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+							</div>
 						</edbDetailPopover>
 					</el-option>
 				</el-select>

+ 40 - 6
src/views/dataEntry_manage/databaseComponents/smoothEdbDialog.vue

@@ -43,7 +43,18 @@
                             :key="item.EdbInfoId"
                             :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
                             :value="item.EdbInfoId"
+                            :disabled="!item.HaveOperaAuth"
                         >
+                            <div>
+                                <img 
+                                    :src="$icons.lock_ico2" 
+                                    width="18" 
+                                    height="18" 
+                                    style="vertical-align:middle" 
+                                    v-if="!item.HaveOperaAuth"
+                                />
+                                {{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+                            </div>
                         </el-option>
                     </el-select>
                     <i class="el-icon-tickets" style="color:#409EFF;font-size:18px" @click="handleSelectBtnClick" v-if="select_target"/>
@@ -162,14 +173,37 @@
                 <ul class="target-ul">
                     <li class="target-li" v-for="(list, index) in targetList" :key="index">
                         <span class="li-tag">{{ list.tag }}</span>
-                        <el-select v-model="list.target" v-loadMore="searchLoad" :filterable="!list.target" clearable
-                            placeholder="请输入指标名称" style="width: 400px" @change="(val)=>{chooseTargetList(val,index)}"
-                            @clear="clearHandle(index)" remote :remote-method="getTarget"
-                            @click.native="inputFocusHandle">
+                        <el-select 
+                            v-model="list.target" 
+                            v-loadMore="searchLoad" 
+                            :filterable="!list.target" 
+                            clearable
+                            placeholder="请输入指标名称" 
+                            style="width: 400px" 
+                            @change="(val)=>{chooseTargetList(val,index)}"
+                            @clear="clearHandle(index)" 
+                            remote 
+                            :remote-method="getTarget"
+                            @click.native="inputFocusHandle"
+                        >
                             <i slot="prefix" class="el-input__icon el-icon-search"></i>
-                            <el-option v-for="item in searchOptions" :key="item.EdbInfoId"
+                            <el-option 
+                                v-for="item in searchOptions" 
+                                :key="item.EdbInfoId"
                                 :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
-                                :value="item.EdbInfoId">
+                                :disabled="!item.HaveOperaAuth"
+                                :value="item.EdbInfoId"
+                            >
+                                <div>
+                                    <img 
+                                        :src="$icons.lock_ico2" 
+                                        width="18" 
+                                        height="18" 
+                                        style="vertical-align:middle" 
+                                        v-if="!item.HaveOperaAuth"
+                                    />
+                                    {{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+                                </div>
                             </el-option>
                         </el-select>
                         <i class="el-icon-tickets" style="color:#409EFF;font-size:18px"

+ 22 - 4
src/views/dataEntry_manage/databaseList.vue

@@ -43,6 +43,16 @@
 						:label="currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 						:value="item.EdbInfoId"
 					>
+						<div>
+							<img 
+								:src="$icons.lock_ico2" 
+								width="18" 
+								height="18" 
+								style="vertical-align:middle" 
+								v-if="!item.HaveOperaAuth"
+							/>
+							{{currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+						</div>
 					</el-option>
 				</el-select>
 			</div>
@@ -120,11 +130,18 @@
 								:style="`width:${(select_node === data.UniqueCode && node.Nodewidth) || ''}`"
 								:id="`node${data.UniqueCode}`"
 							>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!data.HaveOperaAuth&&data.EdbInfoId"
+								/>
 								<span>{{ currentLang==='en' ? (data.ClassifyNameEn||data.ClassifyName) : data.ClassifyName }}</span>
 							</span>
 							<span
 								style="display: flex; align-items: center"
-								v-if="select_node === data.UniqueCode"
+								v-if="select_node===data.UniqueCode&&data.HaveOperaAuth"
 							>
 								<img
 									src="~@/assets/img/data_m/move_ico.png"
@@ -218,8 +235,7 @@
 								<span v-show="currentLang=='en'">{{ item.EdbNameEn || item.EdbName }}</span>
 							</div>
 							<div class="image" @click="detailShowHandle(item)"
-								:style="item.ChartImage?{background: `no-repeat top/cover url('${item.ChartImage}')`}:{}">
-								<!-- <img :src="item.ChartImage"/> -->
+								:style="{background: `no-repeat top/cover url('${!item.HaveOperaAuth ? $icons.lock_big : item.ChartImage}')`}">
 							</div>
 							<div class="info">
 								{{$t('EtaBasePage.time_show')}}:{{item.CreateTime.substring(0,10)}}
@@ -234,7 +250,7 @@
 			</div>
 			<!-- 指标详情 -->
 			<div class="main-right right detail-wrap" id="right" v-show="isShowDetail">
-				<div class="detail">
+				<div class="detail" v-if="EdbData.HaveOperaAuth">
 					<div class="header">
 						<el-tabs v-model="activeTab" @tab-click="rePainChart">
 							<el-tab-pane :label="$t('Edb.trend_chart_tab')" name="Chart">
@@ -364,6 +380,8 @@
 						</div>
 					</div>
 				</div>
+
+				<noDataAuth v-if="EdbData.HaveOperaAuth===false" :text="$t('MsgPrompt.no_edb_auth')"/>
 				
 			</div>
 		</div>

+ 12 - 2
src/views/dataEntry_manage/editChart.vue

@@ -94,9 +94,19 @@
 									:key="item.EdbInfoId"
 									:label="chart_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 									:value="item.EdbInfoId"
+									:disabled="!item.HaveOperaAuth"
 								>
 									<edbDetailPopover :info="item">
-										<div slot="reference">{{chart_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName }}</div>
+										<div slot="reference">
+											<img 
+												:src="$icons.lock_ico2" 
+												width="18" 
+												height="18" 
+												style="vertical-align:middle" 
+												v-if="!item.HaveOperaAuth"
+											/>
+											{{chart_lang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName }}
+										</div>
 									</edbDetailPopover>
 								</el-option>
 							</el-select>
@@ -677,7 +687,7 @@
 							align="center"
 							width="140"
 						>
-							<template slot-scope="scope">
+							<template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
 								<span @click="delTarget(scope.row)" class="deletesty"><!-- 删除 -->{{$t('Table.delete_btn')}}&nbsp;</span>
 								<span v-permission="permissionBtn.chartLibPermission.chartLib_copyData"
 									class="editsty" @click="copyCode(scope.row)">

+ 2 - 0
src/views/datasheet_manage/components/CustomTable.vue

@@ -816,6 +816,8 @@ export default {
     async edbJumpToBase(edb) {
       //非详情页不跳转
       if(!this.disabled) return
+      
+      if(!edb.HaveOperaAuth) return this.$message.warning(this.$t('MsgPrompt.no_edb_auth'))
 
       const res = await dataBaseInterface.targetDetail({EdbInfoId:edb.EdbInfoId})
       if(res.Ret !== 200) return

+ 12 - 2
src/views/datasheet_manage/components/calculateEdbDia.vue

@@ -479,15 +479,25 @@ export default {
 
       if(res.Ret !== 200) return
 
-      const { EdbInfoId,EdbCode,EdbName,Frequency,Unit,StartDate,ModifyTime,SourceName,PredictDataList,DataList } = res.Data.Item;
+      const { EdbInfoId,EdbCode,EdbName,Frequency,Unit,StartDate,ModifyTime,SourceName,PredictDataList,DataList,HaveOperaAuth } = res.Data.Item;
       this.selectEdbInfo = {
-        EdbCode,EdbName,Frequency,Unit,StartDate,ModifyTime,SourceName,EdbInfoId,
+        EdbCode,
+        EdbName,
+        Frequency,
+        Unit,
+        StartDate,
+        ModifyTime,
+        SourceName,
+        EdbInfoId,
+        HaveOperaAuth,
         DataList: PredictDataList ? [...PredictDataList,...DataList].slice(0,5) : DataList.slice(0,5)
       };
     },
 
     /* 选择表格指标 */
     async selectTableEdbHandle(item) {
+      if(!item.HaveOperaAuth) return this.$message.warning(this.$t('MsgPrompt.no_edb_auth'))
+      
       const res = await dataBaseInterface.targetDetail({EdbInfoId:item.EdbInfoId})
       if(res.Ret !== 200) return
 

+ 1 - 1
src/views/datasheet_manage/components/edbDetailSection.vue

@@ -25,7 +25,7 @@
     <ul
       class="data-ul"
       ref="dataUl"
-      v-if="tableData[0]&&tableData[0].DataList.length"
+      v-if="tableData[0]&&tableData[0].DataList.length&&tableData[0].HaveOperaAuth"
     >
       <li
         class="value-item"

+ 2 - 2
src/views/datasheet_manage/components/sheetListWrap.vue

@@ -13,7 +13,7 @@
             <span class="text_oneLine">{{ cell.ExcelName }}</span>
           </div>
           <img
-            :src="cell.ExcelImage"
+            :src="([2,3].includes(cell.Source)&&!cell.HaveOperaAuth)?$icons.lock_big:cell.ExcelImage"
             alt=""
             class="chart-img"
             :height="imgHeight"
@@ -23,7 +23,7 @@
             <span>{{$t('OnlineExcelPage.creation_time_tle')}}: {{ cell.CreateTime.slice(0, 10) }}</span>
             <div>
               <span
-                v-if="$parent.isSheetBtnShow('download')"
+                v-if="$parent.isSheetBtnShow('download')&&cell.HaveOperaAuth"
                 class="editsty"
                 style="margin-right: 10px"
                 @click="$emit('downloadExcel',cell)"

+ 103 - 81
src/views/datasheet_manage/customAnalysis/list.vue

@@ -20,7 +20,7 @@
           >{{$t('CustomAnalysisPage.up_file_btn')}}</el-button>
           <input type="file" @change="fileSelected" id="file"  style="display: none;">
           
-          <el-checkbox v-model="isShowMe"  @change="() => { getTreeData();getPublicList() }">{{$t('Chart.only_see_mine')}}</el-checkbox>
+          <!-- <el-checkbox v-model="isShowMe"  @change="() => { getTreeData();getPublicList() }">{{$t('Chart.only_see_mine')}}</el-checkbox> -->
         </div>
         <div class="search-cont">
           <el-select
@@ -41,6 +41,16 @@
               :label="item.ExcelName"
               :value="item.ExcelInfoId"
             >
+              <div>
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!item.HaveOperaAuth"
+                />
+                {{item.ExcelName}}
+              </div>
             </el-option>
           </el-select>
         </div>
@@ -85,6 +95,13 @@
                   (select_node === data.UniqueCode && node.Nodewidth) || ''
                 }`"
               >
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!data.HaveOperaAuth&&data.ExcelInfoId"
+                />
                 <span>{{ data.ExcelClassifyName }}</span>
               </span>
               <span
@@ -149,86 +166,90 @@
       >
         <!-- 表格详情 -->
         <div class="sheet-detail-wrapper" v-if="select_id" >
-          <div class="detail-top">
-            <el-input
-              ref="sheetEditTitRef"
-              style="width: 400px"
-              :placeholder="$t('OnlineExcelPage.please_table_name_ipt')"
-              class="label-input"
-              v-model="sheet_title"
-              v-if="sheetDetailInfo.isEditTit"
-              @blur="changeValue(sheetDetailInfo, 'edit-tit')"
-            />
-            <div class="sheet-name"
-              @click="editNodeLabel(sheetDetailInfo, 'edit-tit')"
-              v-else>
-              {{ sheetDetailInfo.ExcelName }}
-              <i class="el-icon-edit"/>
-            </div>
-            <div class="sheet-anothor-info">
-              <span class="author">{{$t('OnlineExcelPage.author_info')}}{{ sheetDetailInfo.SysUserRealName }}</span>
-              <ul class="action-ul" v-if="sheetDetailInfo.Button">
-                <li style="color:#999999 ;">{{$t('OnlineExcelPage.recent_save_time_info')}}{{ saveTime }}</li>
-                <el-tooltip effect="dark" :content="$t('CustomAnalysisPage.up_save_tooltip')" placement="top-start">
-                    <li class="editsty" @click="HandleToPath" v-if="isSheetBtnShow('createedb')&&sheetDetailInfo.Button.OpEdbButton">
-                      <img src="~@/assets/img/icons/choose_bluebg_new.png"/>
-                      <span>{{$t('CustomAnalysisPage.generate_indicators_btn')}}</span>
-                    </li>
-                </el-tooltip>
-
-                <el-tooltip effect="dark" :content="$t('CustomAnalysisPage.up_save_tooltip')" placement="top-start">
-                    <li class="editsty" @click="refreshSheet" v-if="isSheetBtnShow('refresh')&&sheetDetailInfo.Button.RefreshEdbButton">
-                      <img src="~@/assets/img/icons/refresh_blue_new.png"/>
-                      <span>{{ isEdbReFreshLoading? $t('CustomAnalysisPage.refreshing_loading'):$t('CustomAnalysisPage.refresh_loading')}}</span>
-                    </li>
-                </el-tooltip>
-                <li class="editsty" @click="saveHandle" v-if="isSheetBtnShow('save')&&sheetDetailInfo.Button.OpButton">
-                  <img src="~@/assets/img/icons/save_blue_new.png"/>
-                  <span>{{$t('ETable.Btn.save_btn')}}</span>
-                </li>
-                <!-- <li
-                  class="editsty"
-                  @click="goEdit"
-                  v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('edit'))"
-                >
-                  <img src="~@/assets/img/icons/edit_blue_new.png" v-if="!editButtonText"/>
-                  <span>{{ editButtonText?editButtonText:'编辑' }}</span> 
-                </li> -->
-                <li
-                  class="editsty"
-                  @click="saveOtherHandle"
-                  v-if="isSheetBtnShow('otherSave')&&sheetDetailInfo.Button.CopyButton"
-                >
-                  <img src="~@/assets/img/icons/save_as_blue_new.png"/>
-                  <span>{{$t('ETable.Btn.save_as')}}</span>
-                </li>
-                <li class="editsty" @click="downloadExcel
-                (sheetDetailInfo)" v-if="isSheetBtnShow('download')&&sheetDetailInfo.Button.DownloadButton">
-                  <img src="~@/assets/img/icons/download_blue.png"/>
-                  <span>{{$t('ETable.Btn.download_btn')}}</span>
-                </li>
-                <li
-                  class="deletesty"
-                  v-if="(isSheetBtnShow('del')&&sheetDetailInfo.Button&&sheetDetailInfo.Button.DeleteButton)"
-                  @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
-                >
-                  <img src="~@/assets/img/icons/delete-red.png"/>
-                  <span>{{$t('ETable.Btn.delete_btn')}}</span>
-                </li>
-              </ul>
+          
+          <!-- 有权限 -->
+          <template v-if="sheetDetailInfo.HaveOperaAuth">
+            <div class="detail-top">
+              <el-input
+                ref="sheetEditTitRef"
+                style="width: 400px"
+                :placeholder="$t('OnlineExcelPage.please_table_name_ipt')"
+                class="label-input"
+                v-model="sheet_title"
+                v-if="sheetDetailInfo.isEditTit"
+                @blur="changeValue(sheetDetailInfo, 'edit-tit')"
+              />
+              <div class="sheet-name"
+                @click="editNodeLabel(sheetDetailInfo, 'edit-tit')"
+                v-else>
+                {{ sheetDetailInfo.ExcelName }}
+                <i class="el-icon-edit"/>
+              </div>
+              <div class="sheet-anothor-info">
+                <span class="author">{{$t('OnlineExcelPage.author_info')}}{{ sheetDetailInfo.SysUserRealName }}</span>
+                <ul class="action-ul" v-if="sheetDetailInfo.Button">
+                  <li style="color:#999999 ;">{{$t('OnlineExcelPage.recent_save_time_info')}}{{ saveTime }}</li>
+                  <el-tooltip effect="dark" :content="$t('CustomAnalysisPage.up_save_tooltip')" placement="top-start">
+                      <li class="editsty" @click="HandleToPath" v-if="isSheetBtnShow('createedb')&&sheetDetailInfo.Button.OpEdbButton">
+                        <img src="~@/assets/img/icons/choose_bluebg_new.png"/>
+                        <span>{{$t('CustomAnalysisPage.generate_indicators_btn')}}</span>
+                      </li>
+                  </el-tooltip>
+
+                  <el-tooltip effect="dark" :content="$t('CustomAnalysisPage.up_save_tooltip')" placement="top-start">
+                      <li class="editsty" @click="refreshSheet" v-if="isSheetBtnShow('refresh')&&sheetDetailInfo.Button.RefreshEdbButton">
+                        <img src="~@/assets/img/icons/refresh_blue_new.png"/>
+                        <span>{{ isEdbReFreshLoading? $t('CustomAnalysisPage.refreshing_loading'):$t('CustomAnalysisPage.refresh_loading')}}</span>
+                      </li>
+                  </el-tooltip>
+                  <li class="editsty" @click="saveHandle" v-if="isSheetBtnShow('save')&&sheetDetailInfo.Button.OpButton">
+                    <img src="~@/assets/img/icons/save_blue_new.png"/>
+                    <span>{{$t('ETable.Btn.save_btn')}}</span>
+                  </li>
+                  <!-- <li
+                    class="editsty"
+                    @click="goEdit"
+                    v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('edit'))"
+                  >
+                    <img src="~@/assets/img/icons/edit_blue_new.png" v-if="!editButtonText"/>
+                    <span>{{ editButtonText?editButtonText:'编辑' }}</span> 
+                  </li> -->
+                  <li
+                    class="editsty"
+                    @click="saveOtherHandle"
+                    v-if="isSheetBtnShow('otherSave')&&sheetDetailInfo.Button.CopyButton"
+                  >
+                    <img src="~@/assets/img/icons/save_as_blue_new.png"/>
+                    <span>{{$t('ETable.Btn.save_as')}}</span>
+                  </li>
+                  <li class="editsty" @click="downloadExcel
+                  (sheetDetailInfo)" v-if="isSheetBtnShow('download')&&sheetDetailInfo.Button.DownloadButton">
+                    <img src="~@/assets/img/icons/download_blue.png"/>
+                    <span>{{$t('ETable.Btn.download_btn')}}</span>
+                  </li>
+                  <li
+                    class="deletesty"
+                    v-if="(isSheetBtnShow('del')&&sheetDetailInfo.Button&&sheetDetailInfo.Button.DeleteButton)"
+                    @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
+                  >
+                    <img src="~@/assets/img/icons/delete-red.png"/>
+                    <span>{{$t('ETable.Btn.delete_btn')}}</span>
+                  </li>
+                </ul>
+              </div>
             </div>
-          </div>
 
-          <!-- <dataLoading :loading="isSheetLoading"/> -->
+            <!-- 表格 -->
+            <div class="sheet-wrap">
+              <Sheet
+                ref="sheetRef"
+                v-if="sheetConfigOpt.data"
+                :option="sheetConfigOpt"
+              />
+            </div>
+          </template>
 
-          <!-- 表格 -->
-          <div class="sheet-wrap">
-            <Sheet
-              ref="sheetRef"
-              v-if="sheetConfigOpt.data"
-              :option="sheetConfigOpt"
-            />
-          </div>
+          <noDataAuth v-if="sheetDetailInfo.HaveOperaAuth===false" :text="$t('MsgPrompt.no_sheet_auth')"/>
         </div>
 
          <!-- 列表 -->
@@ -398,7 +419,7 @@ export default {
       },
       
 
-      isShowMe: false,
+      isShowMe: true,
 
       sourceMap: {
         '/sheetAnalysisList': 4,
@@ -639,7 +660,7 @@ export default {
     },
 
     downLoad(url, filename) {
-      const request = new window.XMLHttpRequest();
+      /* const request = new window.XMLHttpRequest();
       request.open("GET", url, true);
       request.responseType = "blob";
       request.onload = () => {
@@ -652,7 +673,8 @@ export default {
         document.body.append(a);
         a.click();
       };
-      request.send();
+      request.send(); */
+      this.handleDownloadResource(url,filename)
     },
     /* 保存表格 */
     saveHandle: _.debounce(async function () {

+ 2 - 0
src/views/datasheet_manage/mixins/classifyMixin.js

@@ -323,6 +323,8 @@ export default {
 
     /* 判断节点是否能被拖拽 */
     canDragHandle(node) {
+      if(!node.data.HaveOperaAuth) return
+
       let canMove = true;
       return canMove;
     },

+ 131 - 107
src/views/datasheet_manage/sheetList.vue

@@ -43,6 +43,16 @@
               :label="item.ExcelName"
               :value="item.ExcelInfoId"
             >
+              <div>
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!item.HaveOperaAuth"
+                />
+                {{item.ExcelName}}
+              </div>
             </el-option>
           </el-select>
         </div>
@@ -87,11 +97,18 @@
                   (select_node === data.UniqueCode && node.Nodewidth) || ''
                 }`"
               >
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!data.HaveOperaAuth&&data.ExcelInfoId"
+                />
                 <span>{{ data.ExcelClassifyName }}</span>
               </span>
               <span
                 style="display: flex; align-items: center"
-                v-if="select_node === data.UniqueCode"
+                v-if="select_node === data.UniqueCode && data.HaveOperaAuth"
               >
                 <img
                   src="~@/assets/img/data_m/move_ico.png"
@@ -151,121 +168,127 @@
       >
         <!-- 表格详情 -->
         <div class="sheet-detail-wrapper" v-if="select_id">
-          <div class="detail-top">
-            <el-input
-              ref="sheetEditTitRef"
-              style="width: 400px"
-              :placeholder="$t('OnlineExcelPage.please_table_name_ipt')"
-              class="label-input"
-              v-model="sheet_title"
-              v-if="sheetDetailInfo.isEditTit"
-              @blur="changeValue(sheetDetailInfo, 'edit-tit')"
-            />
-            <span
-              class="sheet-name"
-              @click="editExcelName(sheetDetailInfo, 'edit-tit')"
-              v-else
-            >
-              {{ sheetDetailInfo.ExcelName }}
-              <i class="el-icon-edit" v-if="sheetDetailInfo.Source === 1 && onlineExcelEditing" />
-            </span>
-            <!-- <div class="sheet-name">
-              {{ sheetDetailInfo.ExcelName }}
-            </div> -->
-            <div class="sheet-anothor-info">
-              <span class="author">{{$t('OnlineExcelPage.author_info')}}{{ sheetDetailInfo.SysUserRealName }}</span>
-              <ul class="action-ul">
-                <li style="color:#999999 ;">{{$t('OnlineExcelPage.recent_save_time_info')}}{{ saveTime }}</li>
-                <li
-                  class="editsty"
-                  @click="goEditHandle"
-                  v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('edit') && (!onlineExcelEditing))"
-                >
-                  <img src="~@/assets/img/icons/edit_blue_new.png" v-if="!editButtonText"/>
-                  <span>{{ editButtonText?editButtonText:$t('ETable.Btn.edit_btn') }}</span> 
-                </li>
-                <li
-                  class="editsty"
-                  @click="saveHandle"
-                  v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('save') && onlineExcelEditing)"
-                >
-                  <img src="~@/assets/img/icons/save_blue_new.png"/>
-                  <span>{{$t('ETable.Btn.save_btn')}}</span> 
-                </li>
-                <template v-if="[2, 3].includes(sheetDetailInfo.Source)">
+
+          <!-- 有权限 -->
+          <template v-if="sheetDetailInfo.HaveOperaAuth">
+            <div class="detail-top">
+              <el-input
+                ref="sheetEditTitRef"
+                style="width: 400px"
+                :placeholder="$t('OnlineExcelPage.please_table_name_ipt')"
+                class="label-input"
+                v-model="sheet_title"
+                v-if="sheetDetailInfo.isEditTit"
+                @blur="changeValue(sheetDetailInfo, 'edit-tit')"
+              />
+              <span
+                class="sheet-name"
+                @click="editExcelName(sheetDetailInfo, 'edit-tit')"
+                v-else
+              >
+                {{ sheetDetailInfo.ExcelName }}
+                <i class="el-icon-edit" v-if="sheetDetailInfo.Source === 1 && onlineExcelEditing" />
+              </span>
+              <!-- <div class="sheet-name">
+                {{ sheetDetailInfo.ExcelName }}
+              </div> -->
+              <div class="sheet-anothor-info">
+                <span class="author">{{$t('OnlineExcelPage.author_info')}}{{ sheetDetailInfo.SysUserRealName }}</span>
+                <ul class="action-ul">
+                  <li style="color:#999999 ;">{{$t('OnlineExcelPage.recent_save_time_info')}}{{ saveTime }}</li>
                   <li
                     class="editsty"
-                    @click="refreshSheetEdb"
-                    v-if="sheetDetailInfo.Button.RefreshButton&&isSheetBtnShow('refresh')"
+                    @click="goEditHandle"
+                    v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('edit') && (!onlineExcelEditing))"
                   >
-                  <img src="~@/assets/img/icons/refresh_blue_new.png"/>
-                    <span>{{sheetRefreshing?$t('ETable.Btn.refreshing_btn'):$t('ETable.Btn.refresh_btn')}}</span>
+                    <img src="~@/assets/img/icons/edit_blue_new.png" v-if="!editButtonText"/>
+                    <span>{{ editButtonText?editButtonText:$t('ETable.Btn.edit_btn') }}</span> 
                   </li>
                   <li
                     class="editsty"
-                    @click="saveOtherHandle"
-                    v-if="sheetDetailInfo.Button.CopyButton&&isSheetBtnShow('otherSave')"
+                    @click="saveHandle"
+                    v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('save') && onlineExcelEditing)"
                   >
-                    <img src="~@/assets/img/icons/save_as_blue_new.png"/>
-                    <span>{{$t('ETable.Btn.save_as')}}</span>
+                    <img src="~@/assets/img/icons/save_blue_new.png"/>
+                    <span>{{$t('ETable.Btn.save_btn')}}</span> 
+                  </li>
+                  <template v-if="[2, 3].includes(sheetDetailInfo.Source)">
+                    <li
+                      class="editsty"
+                      @click="refreshSheetEdb"
+                      v-if="sheetDetailInfo.Button.RefreshButton&&isSheetBtnShow('refresh')"
+                    >
+                    <img src="~@/assets/img/icons/refresh_blue_new.png"/>
+                      <span>{{sheetRefreshing?$t('ETable.Btn.refreshing_btn'):$t('ETable.Btn.refresh_btn')}}</span>
+                    </li>
+                    <li
+                      class="editsty"
+                      @click="saveOtherHandle"
+                      v-if="sheetDetailInfo.Button.CopyButton&&isSheetBtnShow('otherSave')"
+                    >
+                      <img src="~@/assets/img/icons/save_as_blue_new.png"/>
+                      <span>{{$t('ETable.Btn.save_as')}}</span>
+                    </li>
+                  </template>
+                  <li v-if="isSheetBtnShow('download')"
+                    class="editsty" @click="downloadExcel(sheetDetailInfo)">
+                    <img src="~@/assets/img/icons/download_blue.png"/>
+                    <span>{{$t('ETable.Btn.download_btn')}}</span>
                   </li>
-                </template>
-                <li v-if="isSheetBtnShow('download')"
-                  class="editsty" @click="downloadExcel(sheetDetailInfo)">
-                  <img src="~@/assets/img/icons/download_blue.png"/>
-                  <span>{{$t('ETable.Btn.download_btn')}}</span>
-                </li>
-                <li
-                  class="deletesty"
-                  v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.DeleteButton
-                    &&isSheetBtnShow('del'))
-                  "
-                  @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
-                >
-                  <img src="~@/assets/img/icons/delete-red.png"/>
-                  <span>{{$t('ETable.Btn.delete_btn')}}</span>
-                </li>
-              </ul>
+                  <li
+                    class="deletesty"
+                    v-if="(sheetDetailInfo.Button && sheetDetailInfo.Button.DeleteButton
+                      &&isSheetBtnShow('del'))
+                    "
+                    @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
+                  >
+                    <img src="~@/assets/img/icons/delete-red.png"/>
+                    <span>{{$t('ETable.Btn.delete_btn')}}</span>
+                  </li>
+                </ul>
+              </div>
+
             </div>
 
-          </div>
+            <!-- 表格 -->
+            <div class="sheet-wrap">
+              <Sheet
+                ref="sheetRef"
+                v-if="sheetDetailInfo.Source === 1&&sheetDetailInfo.ExcelInfoId"
+                :option="{
+                  data: [{
+                    ...JSON.parse(sheetDetailInfo.Content),
+                    scrollTop: 0,
+                    scrollLeft: 0
+                  }]
+                }"
+                :sheetInfo="{
+                  ExcelInfoId: sheetDetailInfo.ExcelInfoId,
+                  ExcelName: sheetDetailInfo.ExcelName,
+                  ExcelClassifyId: sheetDetailInfo.ExcelClassifyId,
+                  Source: sheetDetailInfo.Source
+                }"
+                :limit="limit"
+                @updated="autoSaveFun"
+              />
 
-          <!-- 表格 -->
-          <div class="sheet-wrap">
-            <Sheet
-              ref="sheetRef"
-              v-if="sheetDetailInfo.Source === 1&&sheetDetailInfo.ExcelInfoId"
-              :option="{
-                data: [{
-                  ...JSON.parse(sheetDetailInfo.Content),
-                  scrollTop: 0,
-                  scrollLeft: 0
-                }]
-              }"
-              :sheetInfo="{
-                ExcelInfoId: sheetDetailInfo.ExcelInfoId,
-                ExcelName: sheetDetailInfo.ExcelName,
-                ExcelClassifyId: sheetDetailInfo.ExcelClassifyId,
-                Source: sheetDetailInfo.Source
-              }"
-              :limit="limit"
-              @updated="autoSaveFun"
-            />
+              <!-- 自定义表格  -->
+              <CustomTable
+                v-else-if="sheetDetailInfo.Source === 2"
+                :sheetType="sheetDetailInfo.ExcelType"
+                :disabled="true"
+                ref="customTableRef"
+              />
 
-            <!-- 自定义表格  -->
-            <CustomTable
-              v-else-if="sheetDetailInfo.Source === 2"
-              :sheetType="sheetDetailInfo.ExcelType"
-              :disabled="true"
-              ref="customTableRef"
-            />
+              <MixedTable
+                v-else-if="sheetDetailInfo.Source === 3"
+                :disabled="true"
+                ref="mixedTableRef"
+              />
+            </div>
+          </template>
 
-            <MixedTable
-              v-else-if="sheetDetailInfo.Source === 3"
-              :disabled="true"
-              ref="mixedTableRef"
-            />
-          </div>
+          <noDataAuth v-if="sheetDetailInfo.HaveOperaAuth===false" :text="$t('MsgPrompt.no_sheet_auth')"/>
         </div>
 
          <!-- 列表 -->
@@ -724,7 +747,7 @@ export default {
     },
 
     downLoad(url, filename) {
-      const request = new window.XMLHttpRequest();
+      /* const request = new window.XMLHttpRequest();
       request.open("GET", url, true);
       request.responseType = "blob";
       request.onload = () => {
@@ -737,7 +760,8 @@ export default {
         document.body.append(a);
         a.click();
       };
-      request.send();
+      request.send(); */
+      this.handleDownloadResource(url,filename)
     },
 
     /* 保存表格 */
@@ -879,10 +903,10 @@ export default {
             //sheet组件Mounted已经init一次,再次调用会导致工具栏样式错乱
             //this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef.init();
 
-            this.sheetDetailInfo.Source === 2 &&
+            this.sheetDetailInfo.Source === 2 && this.$refs.customTableRef &&
               this.$refs.customTableRef.initSheetData(res.Data.TableData);
 
-            this.sheetDetailInfo.Source === 3 &&
+            this.sheetDetailInfo.Source === 3 && this.$refs.mixedTableRef &&
               this.$refs.mixedTableRef.initData(res.Data.TableData);
           });
         });

+ 3 - 1
src/views/edbHistoryPage.vue

@@ -38,7 +38,9 @@ export default {
         },
         handleClickNode(e, data) {
             //EdbInfoType=1 跳预测指标详情,=0跳指标库详情
-            const { ClassifyId, UniqueCode, EdbInfoId, EdbInfoType } = data
+            const { ClassifyId, UniqueCode, EdbInfoId, EdbInfoType,HaveOperaAuth } = data
+            if(!HaveOperaAuth) return this.$message.warning(this.$t('MsgPrompt.no_edb_auth'))
+            
             let { href } =
             this.$router.resolve({ path: EdbInfoType === 1 ? '/predictEdb' : '/database', query: { code: UniqueCode, id:
             EdbInfoId, classifyId: ClassifyId } });

+ 11 - 0
src/views/futures_manage/chartEditor.vue

@@ -38,7 +38,18 @@
 							:key="item.EdbInfoId"
 							:label="item.EdbName"
 							:value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
 						>
+							<div>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!item.HaveOperaAuth"
+								/>
+								{{item.EdbName}}
+							</div>
 						</el-option>
 					</el-select>
 				</div>

File diff suppressed because it is too large
+ 496 - 491
src/views/mychart_manage/components/chartDetailDia.vue


+ 4 - 2
src/views/mychart_manage/components/chooseChart.vue

@@ -60,10 +60,11 @@
               <div slot="header" class="item-top">
                 <span class="text_oneLine">{{ $parent.chart_lang==='en' ? (chart.ChartNameEn||chart.ChartName) : chart.ChartName }}</span>
               </div>
-              <img :src="chart.ChartImage" alt="" class="chart-img" />
+              <img :src="(chart_source===1&&!chart.HaveOperaAuth) ? $icons.lock_big : chart.ChartImage" alt="" class="chart-img" />
               <div class="item-bottom">
                 <span class="last-time"><!-- 最近更新 -->{{$t('MyEtaPage.label_update_time')}}:{{ chart.ModifyTime.substr(0,10) }}</span>
-                <span class="join_txt" @click="addMychartHandle(chart)">
+                <span class="join_txt" @click="addMychartHandle(chart)" 
+                v-if="(chart.HaveOperaAuth&&chart_source===1)||chart_source!==1">
                   <img
                     :src="$icons.chart_join_ico"
                     alt=""
@@ -166,6 +167,7 @@ export default {
 
     /* 加入我的图库 */
     addMychartHandle(item) {
+
       this.add_chart_id = item.ChartInfoId;
       //已有的分类ids
       this.add_ids = item.MyChartClassifyId ? item.MyChartClassifyId.split(',').map(item => Number(item)) : [];

+ 1 - 1
src/views/mychart_manage/index.vue

@@ -209,7 +209,7 @@
                   />
                 </div>
                 <img
-                  :src="chart.ChartImage"
+                  :src="(chart.Source===1&&!chart.HaveOperaAuth) ? $icons.lock_big : chart.ChartImage"
                   alt=""
                   class="chart-img"
                   @click="viewChartDetail(chart)"

+ 103 - 13
src/views/ppt_manage/mixins/pptMixins.js

@@ -25,6 +25,13 @@ import FormatNine from '../newVersion/components/formatPage/FormatNine.vue';
 import FormatTen from '../newVersion/components/formatPage/FormatTen.vue';
 import FormatEle from '../newVersion/components/formatPage/FormatEle.vue';
 import FormatTwelve from '../newVersion/components/formatPage/FormatTwelve.vue';
+const chunkArray = (array, chunkSize)=>{
+    let result = [];
+    for (let i = 0; i < array.length; i += chunkSize) {
+        result.push(array.slice(i, i + chunkSize));
+    }
+    return result;
+}
 export default {
   components:{ FormatOne,FormatTwo,FormatThree,
     FormatFour,FormatFive,FormatSix,FormatSeven,FormatEight,FormatNine,FormatTen,FormatEle,FormatTwelve},
@@ -200,6 +207,7 @@ export default {
     */
     //获取图表数据
     async getchartData(id,lang='ch') {
+        console.log('getChartData')
       const currentLang = this.currentLang || lang
       const res = await dataBaseInterface.getChartByCode({
         UniqueCode: id,
@@ -453,7 +461,7 @@ export default {
       this.$store.commit('SET_CHART_INFO_MAP',chartInfoMap)
       this.addMyChartShow = false
     },
-    //编辑ppt时,初始化相关
+    //编辑ppt时,按页初始化相关
     async initPageElements(page,type="edit",only=false) {
       this.pptInitType = type
       const chartElements = page.elements.filter((item) => {
@@ -477,22 +485,93 @@ export default {
       await this.listHandle(chartElements);
       this.initCharts(chartElements, page);
     },
+    //图表,表格数据统一加载,不按照页
+    async initPPTAllPage(pageList){
+        let chartElements = []
+        let sheetElements = []
+        pageList.forEach(page=>{
+            const pageChartElements = page.elements.filter((item) => {
+                return item.type === "chart";
+            });
+            const pageSheetElements = page.elements.filter((item)=>{
+                return item.type === 'sheet'
+            })
+            chartElements.push(...pageChartElements)
+            sheetElements.push(...pageSheetElements)
+        })
+        
+        await this.sheetListHandle(sheetElements);
+        await this.listHandle(chartElements);
+    },
     async listHandle(chartElements,fromType='') {
+        let needGetDataArr = []
         for(let i=0;i<chartElements.length;i++) {
-            if(!this.optionMap[chartElements[i].chartId])
-                await this.getchartData(chartElements[i].chartId);
-                //由于演示页的图表没有await加载,在这里更新每一张图表的信息
-                if(fromType==='present'){
+            if(!this.optionMap[chartElements[i].chartId]&&!needGetDataArr.includes(chartElements[i].chartId)){
+                /* needGetDataArr.push(new Promise((res,rej)=>{
+                    res(this.getchartData(chartElements[i].chartId))
+                })) */
+                needGetDataArr.push(chartElements[i].chartId)
+            }
+        }
+        if(needGetDataArr.length){
+            //由于存在加载过程中会切换PPT/页面的情况,不能一股脑加载
+            //将需要加载的数据分组
+            const chunkedArray = chunkArray(needGetDataArr, 6);
+
+            for(let i=0;i<chunkedArray.length;i++){
+                if(!chunkedArray[i].length) continue //如果组内无数据,跳过
+                if(this.interruptLoad) return //若需要中断加载,返回
+
+                const promisesList = chunkedArray[i].map(chartId=>{
+                    return new Promise((res,rej)=>{
+                        res(this.getchartData(chartId))
+                    })
+                })
+
+                await Promise.all(promisesList).then(()=>{}).catch((e)=>{
+                    console.log('catch',e)
+                })
+                console.log(`第${i}组chart加载完成`)
+            }
+            console.log('全部chart加载完成')
+
+            if(fromType==='present'){
+                for(let i=0;i<chartElements.length;i++) {
                     let temp = getChartInfo(this.optionMap[chartElements[i].chartId])
                     this.$store.commit('SET_CHART_INFO',{chartId:chartElements[i].chartId,chartInfo:temp})
                 }
             }
-        },
+        }
+    },
     async sheetListHandle(sheetElements){
+      let needGetDataArr = []
       for(let i=0;i<sheetElements.length;i++){
-        if(!this.sheetDataMap[sheetElements[i].sheetId])
-        await this.getsheetData(sheetElements[i].sheetId)
+        if(!this.sheetDataMap[sheetElements[i].sheetId]&&!needGetDataArr.includes(sheetElements[i].sheetId)){
+            needGetDataArr.push(sheetElements[i].sheetId)
+        }
       }
+      if(needGetDataArr.length){
+        //由于存在加载过程中会切换PPT/页面的情况,不能一股脑加载
+        //将需要加载的数据分组
+            const chunkedArray = chunkArray(needGetDataArr, 6);
+            for(let i=0;i<chunkedArray.length;i++){
+                if(!chunkedArray[i].length) continue //如果组内无数据,跳过
+                if(this.interruptLoad) return //若需要中断加载,返回
+
+                const promisesList = chunkedArray[i].map(sheetId=>{
+                    return new Promise((res,rej)=>{
+                        res(this.getsheetData(sheetId))
+                    })
+                })
+
+                await Promise.all(promisesList).then(()=>{}).catch((e)=>{
+                    console.log('catch',e)
+                })
+                console.log(`第${i}组sheet加载完成`)
+            }
+            console.log('全部sheet加载完成')
+      }
+      
     },
     async getsheetData(id){
       const res = await sheetInterface.getSheetData({
@@ -500,11 +579,12 @@ export default {
 			})
       if(res.Ret !== 200) return 0
       const {TableInfo} = res.Data
-      console.log('get')
+      //console.log('get')
       this.sheetDataMap[id] = _.cloneDeep(TableInfo.TableDataList)
       return 1
     },
     initCharts(elements, page) {
+        console.log('initCharts')
       const index = this.pageList.findIndex((i) => i.id === page.id)
       if(index===-1) return
       elements.forEach((item) => {
@@ -547,7 +627,7 @@ export default {
     /* 主题样式*/
     const chartTheme =  ChartThemeStyle ? JSON.parse(ChartThemeStyle) : null;
 
-      console.log(options)
+      //console.log(options)
       this.$nextTick(() => {
         let is_linear = options.series 
           ? options.series.some(_ => _.chartType === 'linear')
@@ -989,19 +1069,29 @@ export default {
 
       if(chartData.SourcesFrom&&JSON.parse(chartData.SourcesFrom).isShow) {
         let sourceObj = JSON.parse(chartData.SourcesFrom);
+        //pptx 只接受6bit的颜色格式,用333警告太多了 优化下
+        const color = sourceObj.color.includes('rgb') ? rgbaToHex(sourceObj.color).color.substring(1) 
+                    : sourceObj.color.indexOf('#')===0 
+                    ? sourceObj.color.substring(1).length<6 
+                    ? '000000':sourceObj.color.substring(1)
+                    : '666666'
         slide.addText(`来源:${sourceObj.text}`,{
           x:x,
           y: yPercent,
           w: width,
           margin:10,
           fontSize: sourceObj.fontSize*0.75,
-          color: sourceObj.color.includes('rgb') ? rgbaToHex(sourceObj.color).color.substring(1) : sourceObj.color.indexOf('#')===0 ? sourceObj.color.substring(1): '666',
+          color,
         })
       }
 
       if(chartData.Instructions&&JSON.parse(chartData.Instructions).isShow) {
         let instructObj = JSON.parse(chartData.Instructions);
-
+        const color = instructObj.color.includes('rgb') ? rgbaToHex(instructObj.color).color.substring(1) 
+                    : instructObj.color.indexOf('#')===0 
+                    ? instructObj.color.substring(1).length<6 
+                    ? '000000':instructObj.color.substring(1)
+                    : '666666'
         slide.addText(instructObj.text,{
           x:x,
           y: yPercent,
@@ -1009,7 +1099,7 @@ export default {
           align:'right',
           margin:10,
           fontSize: instructObj.fontSize*0.75,
-          color: instructObj.color.includes('rgb') ? rgbaToHex(instructObj.color).color.substring(1) : instructObj.color.indexOf('#')===0 ? instructObj.color.substring(1): '666',
+          color,
         })
       }
     }

+ 2 - 1
src/views/ppt_manage/newVersion/components/catalog/pptContent.vue

@@ -128,7 +128,7 @@ export default {
         text: `${this.$t('Slides.retrieving_ppt_data')}...`,
         spinner: 'el-icon-loading',
         customClass:'loading',
-        target:document.querySelector('.ppt-content-wrap'),
+        target:document.querySelector('.catalog-wrap'),
         background: 'rgba(255, 255, 255, 0.8)'
       });
       await this.getpptData()
@@ -140,6 +140,7 @@ export default {
       await this.initPageElements(this.pageList[0],'show')
       this.loadedPage++ */
       //全部加载
+      await this.initPPTAllPage(this.pageList)
       for(let i=0;i<this.pageList.length;i++){
         if(this.interruptLoad) return
         this.loadArr.push(this.pageList[i])

+ 2 - 1
src/views/ppt_manage/newVersion/components/catalog/pptContentEn.vue

@@ -128,7 +128,7 @@ export default {
         text: `${this.$t('Slides.retrieving_ppt_data')}...`,
         spinner: 'el-icon-loading',
         customClass:'loading',
-        target:document.querySelector('.ppt-content-wrap'),
+        target:document.querySelector('.catalog-wrap'),
         background: 'rgba(255, 255, 255, 0.8)'
       });
       await this.getpptData()
@@ -136,6 +136,7 @@ export default {
       this.checkLimit()
       this.loadArr.push(this.firstPage)
       //全部加载
+      await this.initPPTAllPage(this.pageList)
       for(let i=0;i<this.pageList.length;i++){
         if(this.interruptLoad) return
         this.loadArr.push(this.pageList[i])

+ 4 - 3
src/views/ppt_manage/newVersion/components/editor/InsertCharts.vue

@@ -40,7 +40,7 @@
           En
         </div>
         <p>{{ item.ChartName }}</p>
-        <img :src="item.ChartImage" alt="" style="-webkit-user-drag:none;"/>
+        <img :src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage" alt="" style="-webkit-user-drag:none;"/>
       </div>
     </div>
     <div v-if="list.length == 0" class="empty-box"> {{$t('Slides.no_data_empty')}}</div>
@@ -115,11 +115,12 @@ export default {
         this.$message.warning(this.$t('MsgPrompt.select_category'));
         return;
       }
-      if (this.list.length == 0) {
+      let filterList = this.list.filter(_ =>_.HaveOperaAuth)
+      if (filterList.length == 0) {
         this.$message.warning(this.$t('Slides.no_charts_category_msg') );
         return;
       }
-      this.$emit("handleImportMyChart", this.list);
+      this.$emit("handleImportMyChart", filterList);
     }, 1000),
 
     handleClickItem(item) {

+ 5 - 4
src/views/ppt_manage/newVersion/pptCatalog.vue

@@ -208,7 +208,7 @@
             @start="dragStartHandler"
             @update="dragenter"
             @end="moveListPPT"
-            :disabled="treeName!=='private'"
+            :disabled="(treeName==='private'&&!selectNode)||treeName!=='private'"
             >
             <div class="list-item" 
               v-for="item in catalogPPTList" :key="item.PptId"
@@ -217,7 +217,7 @@
               <div class="item-title">
                 <span>{{item.Title}}</span>
                 <img
-                  v-if="treeName==='private'"
+                  v-if="treeName==='private'&&selectNode"
                   src="~@/assets/img/data_m/move_ico.png"
                   style="width: 14px; height: 14px; margin-right: 8px"
                 />
@@ -832,7 +832,7 @@ export default {
           a.href = PptxUrl 
           a.download=`${Title}aaa.pptx`
           a.click(); */
-          const x = new XMLHttpRequest()
+          /* const x = new XMLHttpRequest()
           x.open('GET', PptxUrl, true)
           x.responseType = 'blob'
           x.onload = () => {
@@ -843,7 +843,8 @@ export default {
             a.click();
             window.URL.revokeObjectURL(url)
           }
-          x.send()
+          x.send() */
+          this.handleDownloadResource(PptxUrl,`${Title}.pptx`)
         }
       }else{
         this.$message.warning(this.$t('Slides.please_preview_info'))

+ 13 - 4
src/views/ppt_manage/newVersion/pptEditor.vue

@@ -143,7 +143,7 @@
                     <template v-if="chartList.length">
                     <div v-for="(item, index) in chartList" :key="index" @click="chooseChart(item,'chart')" class="chart-item" :style="item.Disabled && 'cursor: not-allowed;'">
                         <p class="chart_tit" style="word-break: break-all;">{{ item.ChartName }}</p>
-                        <img :src="item.ChartImage" ref="insert_img" style="-webkit-user-drag:none;"/>
+                        <img :src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage" ref="insert_img" style="-webkit-user-drag:none;"/>
                     </div>
                     </template>
                     <tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-else/>
@@ -172,7 +172,7 @@
                   <template v-if="sheetSearchList.length">
                     <div v-for="(item,index) in sheetSearchList" :key="index" class="sandTable-item" >
                       <p class="chart_tit">{{item.ExcelName}}</p>
-                      <img :src="item.ExcelImage" style="width:100%;object-fit: contain;height: 250px;-webkit-user-drag:none;"  @click="chooseChart(item,'sheet')"/>
+                      <img :src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage" style="width:100%;object-fit: contain;height: 250px;-webkit-user-drag:none;"  @click="chooseChart(item,'sheet')"/>
                     </div>
                   </template>
                   <tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-else/>
@@ -434,6 +434,7 @@ export default {
 				});
       await this.getpptData()
       //遍历pageList,初始化图表,文字
+      await this.initPPTAllPage(this.pageList)
       for(let i=0;i<this.pageList.length;i++){
         //计算图表总数
         const chartElements = this.pageList[i].elements.filter((item) => {
@@ -464,6 +465,8 @@ export default {
       })     
       this.dataLoading.close();
       $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
+      //开启自动保存
+      this.autoSave()
     },
     async getpptData(){
       const {id} = this.$route.query
@@ -478,8 +481,8 @@ export default {
           this.currentItem = this.pageList[0]
           this.ReportId=ReportId
           this.CoverContent = this.result.CoverContent
-          //开启自动保存
-          this.autoSave()
+          /* //开启自动保存
+          this.autoSave() */
         }else{
           this.$message.error(this.$t('Slides.error_ppt_data_msg') )
           this.dataLoading.close();
@@ -835,6 +838,12 @@ export default {
 		},200),
     //点击右侧图表/沙盘图/表格
     chooseChart:_.throttle(async function(item,type){
+      const noAuthMsg = {
+        'chart': this.$t('MsgPrompt.no_chart_auth'),
+        'sheet': this.$t('MsgPrompt.no_sheet_auth')
+      }
+      if(!item.HaveOperaAuth&&noAuthMsg[type]) return this.$message.warning(noAuthMsg[type])
+
         if(this.pageList.length===0||!this.currentItem){
           this.$message.warning(this.$t('Slides.please_add_page_msg') );
           return;

+ 3 - 2
src/views/ppt_manage/newVersion/pptEnCatalog.vue

@@ -774,7 +774,7 @@ export default {
         if(isIE){
           window.open(PptxUrl, '_blank')
         }else{
-          const x = new XMLHttpRequest()
+          /* const x = new XMLHttpRequest()
           x.open('GET', PptxUrl, true)
           x.responseType = 'blob'
           x.onload = () => {
@@ -784,7 +784,8 @@ export default {
             a.download=`${Title}.pptx`
             a.click();
           }
-          x.send()
+          x.send() */
+          this.handleDownloadResource(PptxUrl,`${Title}.pptx`)
         }
       }else{
         this.$message.warning(this.$t('Slides.please_preview_info'))

+ 15 - 5
src/views/ppt_manage/newVersion/pptEnEditor.vue

@@ -139,12 +139,12 @@
                 <div class="chart-list" v-infinite-scroll="loadReportHandle" :infinite-scroll-immediate="false" ref="chartListRef">
                     <template v-if="chartList.length">
                     <div v-for="(item, index) in chartList" :key="index" @click="chooseChart(item,'chart')" class="chart-item" :style="item.Disabled && 'cursor: not-allowed;'">
-                        <div class="chartEn-mark" style="top: 0;left:0;" @click.stop="setEnHandle(item)">
+                        <div class="chartEn-mark" style="top: 0;left:0;" @click.stop="setEnHandle(item)" v-if="item.HaveOperaAuth">
                           <span v-if="item.IsEnChart">En</span>
                           <i class="el-icon-edit" v-else style="font-size:15px"/>
                         </div>
                         <p class="chart_tit" style="word-break: break-all;">{{ chart_source===1 ? (item.ChartNameEn||item.ChartName) : item.ChartName }}</p>
-                        <img :src="item.ChartImage" ref="insert_img" />
+                        <img :src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage" ref="insert_img" />
                     </div>
                     </template>
                     <tableNoData  :text="$t('Table.prompt_slogan')" size="mini" v-else/>
@@ -174,7 +174,7 @@
                   <template v-if="sheetSearchList.length">
                     <div v-for="(item,index) in sheetSearchList" :key="index" class="sandTable-item" >
                       <p class="chart_tit">{{item.ExcelName}}</p>
-                      <img :src="item.ExcelImage" style="width:100%;object-fit: contain;height: 250px"  @click="chooseChart(item,'sheet')"/>
+                      <img :src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage" style="width:100%;object-fit: contain;height: 250px"  @click="chooseChart(item,'sheet')"/>
                     </div>
                   </template>
                   <tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-else/>
@@ -456,6 +456,7 @@ export default {
 				});
       await this.getpptData()
       //遍历pageList,初始化图表,文字
+      await this.initPPTAllPage(this.pageList)
       for(let i=0;i<this.pageList.length;i++){
         //计算图表总数
         const chartElements = this.pageList[i].elements.filter((item) => {
@@ -485,6 +486,8 @@ export default {
       })
       this.dataLoading.close();
       $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
+      //开启自动保存
+      this.autoSave()
     },
     async getpptData(){
       const {id} = this.$route.query
@@ -499,8 +502,8 @@ export default {
           this.currentItem = this.pageList[0]
           this.ReportId=ReportId
           this.CoverContent = this.result.CoverContent
-          //开启自动保存
-          this.autoSave()
+          /* //开启自动保存
+          this.autoSave() */
         }else{
           this.$message.error(this.$t('Slides.error_ppt_data_msg') )
           this.dataLoading.close();
@@ -851,6 +854,12 @@ export default {
 		},200),
     //点击右侧图表或者沙盘图
     chooseChart:_.throttle(async function(item,type){
+        const noAuthMsg = {
+          'chart': this.$t('MsgPrompt.no_chart_auth'),
+          'sheet': this.$t('MsgPrompt.no_sheet_auth')
+        }
+        if(!item.HaveOperaAuth&&noAuthMsg[type]) return this.$message.warning(noAuthMsg[type])
+
         if(this.pageList.length===0||!this.currentItem){
           this.$message.warning(this.$t('Slides.please_add_page_msg') );
           return;
@@ -1068,6 +1077,7 @@ export default {
     //自动保存PPT
     autoSave(){
       if(this.loopTimer) return 
+      if(!this.$route.query.id&&!this.pptId) return
       this.loopTimer = setInterval(()=>{
         const ppt_id = this.$route.query.id||this.pptId
         const {Title,ReportType,PptDate,BackgroundImg,BackIndex} = this.firstPage

+ 1 - 0
src/views/ppt_manage/newVersion/pptEnPublish.vue

@@ -157,6 +157,7 @@ export default {
         });
         await this.getpptData()
         //加载每一页
+        await this.initPPTAllPage(this.pageList)
         for(let i=0;i<this.pageList.length;i++){
           await this.initPageElements(this.pageList[i],'show')
         }

+ 1 - 0
src/views/ppt_manage/newVersion/pptPublish.vue

@@ -188,6 +188,7 @@ export default {
         });
         await this.getpptData()
         //加载每一页
+        await this.initPPTAllPage(this.pageList)
         for(let i=0;i<this.pageList.length;i++){
           await this.initPageElements(this.pageList[i],'show')
         }

+ 23 - 1
src/views/predictEdb_manage/addPredicEdb.vue

@@ -50,9 +50,20 @@
                   :key="item.EdbInfoId"
                   :label="item.EdbName"
                   :value="item.EdbInfoId"
+                  :disabled="!item.HaveOperaAuth"
                 >
                   <edbDetailPopover :info="item">
-                    <div slot="reference">{{item.EdbName}}</div>
+                    <div slot="reference">
+                      <img 
+                        :src="$icons.lock_ico2" 
+                        width="18" 
+                        height="18" 
+                        style="vertical-align:middle" 
+                        v-if="!item.HaveOperaAuth"
+                      />
+
+                      {{item.EdbName}}
+                    </div>
                   </edbDetailPopover>
                 </el-option>
               </el-select>
@@ -273,7 +284,18 @@
                       :key="item.EdbInfoId"
                       :label="item.EdbName"
                       :value="item.EdbInfoId"
+                      :disabled="!item.HaveOperaAuth"
                     >
+                      <div>
+                        <img 
+                          :src="$icons.lock_ico2" 
+                          width="18" 
+                          height="18" 
+                          style="vertical-align:middle" 
+                          v-if="!item.HaveOperaAuth"
+                        />
+                        {{item.EdbName}}
+                      </div>
                     </el-option>
                   </el-select>
                   <i class="el-icon-tickets" style="color:#409EFF;font-size:18px" @click="toHistoryPage(item.self_target,$route.matched);lookEdbId=item.self_target;" v-if="item.self_target"/>

+ 0 - 539
src/views/predictEdb_manage/components/computedDialog.vue

@@ -1,539 +0,0 @@
-<template>
-	<el-dialog
-		:visible.sync="isOpenComputed"
-		:close-on-click-modal="false"
-		:modal-append-to-body="false"
-		@close="cancelHandle"
-		custom-class="computed-dialog"
-		center
-		width="1090px"
-		top="8vh"
-		v-dialogDrag
-	>
-		<div slot="title" style="display: flex; align-items: center">
-			<img
-				:src="$icons.computed"
-				style="color: #fff; width: 16px; height: 16px; margin-right: 5px"
-			/>
-			<span style="font-size: 16px">{{ title }}</span>
-		</div>
-		<div class="dialog-main">
-			<ul class="add-cont">
-				<li class="add-li" v-for="(list, index) in addList" :key="index">
-					<span class="li-tag">{{ list.tag }}</span>
-					<el-select
-						v-model="list.target"
-						v-loadMore="searchLoad"
-						:filterable="!list.target"
-						clearable
-						placeholder="请输入指标名称"
-						style="width: 400px"
-						@change="chooseTarget"
-						@clear="clearHandle(index)"
-						:disabled="calulateForm.view"
-						remote
-						:remote-method="searchTarget"
-						@click.native="inputFocusHandle"
-					>
-						<i slot="prefix" class="el-input__icon el-icon-search"></i>
-						<el-option
-							v-for="item in searchOptions"
-							:key="item.EdbInfoId"
-							:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
-							:value="item.EdbInfoId"
-						>
-							<edbDetailPopover :info="item">
-								<div slot="reference">{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}</div>
-							</edbDetailPopover>
-						</el-option>
-					</el-select>
-
-					<i class="el-icon-tickets" style="color:#409EFF;font-size:18px" @click="$emit('lookHistory',list.target)" v-if="list.target"/>
-
-					<i
-						class="el-icon-error del-tag"
-						v-if="index > 3 && !calulateForm.view"
-						@click="delTarget(index)"
-					/>
-					<span :class="{
-						'target-date': true,
-						'newest': list.end_date===newestDate
-					}" v-if="list.start_date">{{
-						`${list.start_date}至${list.end_date}`
-					}}</span>
-				</li>
-			</ul>
-			<span class="add-icon" @click="addTargetHandle" v-if="!calulateForm.view">
-				<i
-					class="el-icon-circle-plus-outline"
-					style="color: #5882ef; font-size: 16px"
-				/>
-				添加更多参数
-			</span>
-			<div class="computed-min">
-				<div class="computed-top">
-					<span style="margin-right: 8px">计算公式</span>
-					<el-input placeholder="请输入公式" v-model="formula" clearable :disabled="calulateForm.view">
-					</el-input>
-				</div>
-				<span class="example-txt"
-					>公式示例:A*0.5+B*C*1.2+120-MAX(A,B,C)</span
-				>
-				<span class="example-txt">函数支持:MAX(),MIN()</span>
-			</div>
-			<el-form
-				ref="diaForm"
-				label-position="right"
-				inline
-				label-width="80px"
-				:model="formData"
-				:rules="formRules"
-				:disabled="calulateForm.view"
-			>
-				<el-form-item label="指标名称" prop="targetName">
-					<el-input
-						v-model="formData.targetName"
-						style="width: 340px"
-						placeholder="请输入指标名称"
-					/>
-				</el-form-item>
-				<el-form-item label="单位" prop="unit">
-					<selectUnit v-model="formData.unit" style="width: 340px" />
-				</el-form-item>
-				<el-form-item label="指标目录" prop="menu">
-<!-- 					<el-select
-            v-model="formData.menu"
-            placeholder="请选择分类"
-            style="width: 340px"
-            clearable
-          >
-            <el-option
-              v-for="item in options"
-              :key="item.ClassifyId"
-              :label="item.ClassifyName"
-              :value="item.ClassifyId"
-            />
-          </el-select> -->
-					<el-cascader
-						v-model="formData.menu"
-						:options="options"
-						:props="{
-							label: 'ClassifyName',
-							value: 'ClassifyId',
-							children: 'Children',
-							checkStrictly: true
-						}"
-						style="width: 90%"
-						placeholder="请选择所属分类"
-					/>
-				</el-form-item>
-				<el-form-item label="频度" prop="frequency">
-					<el-select
-						v-model="formData.frequency"
-						placeholder="请选择频率"
-						style="width: 340px"
-						clearable
-					>
-						<el-option
-							v-for="item in frequencyArr"
-							:key="item"
-							:label="item"
-							:value="item"
-						>
-						</el-option>
-					</el-select>
-				</el-form-item>
-			</el-form>
-		</div>
-		<div class="dia-bot" v-if="!calulateForm.view">
-			<el-button
-				type="primary"
-				style="margin-right: 20px"
-				@click="saveHandle"
-				:loading="dataloading"
-				v-if="title==='计算指标'"
-				>生成计算指标</el-button
-			>
-			<el-button
-				type="primary"
-				style="margin-right: 20px"
-				@click="saveHandle"
-				v-else
-				>保存</el-button
-			>
-			<el-button type="primary" plain @click="cancelHandle('cancel')">取消</el-button>
-		</div>
-		<el-popover
-			placement="top-start"
-			width="360"
-			trigger="click">
-			<p style="padding:30px;line-height:25px;" v-html="$parent.tips.get(31)"/>
-			<span slot="reference" class="tip-label">公式说明</span>
-		</el-popover>
-	</el-dialog>
-</template>
-
-<script>
-import * as preDictEdbInterface from '@/api/modules/predictEdbApi.js';
-import { formRules } from '@/views/dataEntry_manage/databaseComponents/util';
-import { unitArr } from '@/utils/defaultOptions';
-const tag_arr = [];
-for(let i=0;i<26;i++) tag_arr.push(String.fromCharCode(65+i));
-export default {
-	name: '',
-	props: {
-		isOpenComputed: {
-			type: Boolean,
-		},
-		title: {
-			type: String,
-			default: '计算指标',
-		},
-		calulateForm: {
-			type: Object,
-		},
-		calulateList: {
-			type: Array,
-		},
-	},
-	watch: {
-		isOpenComputed(newval) {
-			newval && this.getMenu();
-			/* 回显 */
-			if (this.calulateList.length && newval) {
-				this.addList = _.cloneDeep(this.calulateList);
-				this.formula = this.calulateForm.formula;
-				this.formData = {
-					targetName: this.calulateForm.targetName,
-					unit: this.calulateForm.unit,
-					menu: this.calulateForm.menu,
-					frequency: this.calulateForm.frequency,
-				};
-
-				this.searchOptions = this.calulateList.map(item => ({
-					EdbInfoId: item.target,
-					EdbName: item.edb_name,
-				}))
-				this.getNewestDate();
-			}
-		},
-	},
-	data() {
-		return {
-			options: [],
-			frequencyArr: ['日度', '周度','旬度','月度', '季度', '年度'],
-			formRules,
-			unitArr,
-			addList: [
-				{
-					tag: tag_arr[0],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-				{
-					tag: tag_arr[1],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-				{
-					tag: tag_arr[2],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-				{
-					tag: tag_arr[3],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-			],
-			searchOptions: [],
-			formula: '', //计算公式
-			dataloading: false,
-			formData: {
-				targetName: '',
-				unit: '',
-				menu: '',
-				frequency: '',
-			},
-			search_have_more: false,
-			search_page: 1,
-			current_search:'',
-
-			newestDate: '',
-		};
-	},
-	methods: {
-		// 递归改变目录结构
-		filterNodes(arr) {
-			arr.length &&
-				arr.forEach((item) => {
-					item.Children.length && this.filterNodes(item.Children);
-					if (!item.Children.length) {
-						delete item.Children;
-					}
-				});
-		},
-
-		/* 获取目录结构 */
-		getMenu() {
-			preDictEdbInterface.classifyListV2().then(res => {
-				if(res.Ret !== 200) return
-
-				this.filterNodes(res.Data.AllNodes||[]);
-				this.options = res.Data.AllNodes || [];
-			}) 
-		},
-
-		/* 添加额外的指标列 */
-		addTargetHandle() {
-			if(this.addList.length >= 26) return this.$message.warning('添加指标个数已达上限')
-			let tag = this.addList[this.addList.length-1].tag;
-			let index = tag_arr.findIndex(item => item === tag);
-			const item = {
-				tag: tag_arr[index+1],
-				target: '',
-				start_date: '',
-				end_date: ''
-			};
-			this.addList.push(item);
-		},
-
-		/* 搜索指标 */
-		searchTarget(query) {
-			this.search_page = 1;
-			this.current_search = query;
-			this.searchApi(this.current_search);
-		},
-
-		/* 聚焦获取当前检索 */
-		inputFocusHandle(e) {
-			this.search_page = 1;
-			this.current_search = e.target.value;
-			this.searchApi(this.current_search);
-		},
-
-		searchApi(query,page=1) {
-			preDictEdbInterface
-          .edbSearch({
-            Keyword: query,
-            CurrentIndex: page
-          })
-          .then((res) => {
-            if (res.Ret !== 200) return
-
-						const { List,Paging } = res.Data;
-						this.search_have_more = page < Paging.Pages;
-						this.searchOptions = page === 1 ? List : this.searchOptions.concat(List);
-          });
-		},
-
-		searchLoad() {
-			if(!this.search_have_more) return;
-			this.searchApi(this.current_search,++this.search_page)
-		},
-
-		/* 选中指标 显示开始日期结束日期 */
-		chooseTarget(val) {
-			if (val) {
-				const choose_obj = this.searchOptions.find(
-					(item) => item.EdbInfoId === val
-				);
-				this.addList.forEach((list) => {
-					if (list.target === val) {
-						list.start_date = choose_obj.StartDate;
-						list.end_date = choose_obj.EndDate;
-						this.getNewestDate();
-					}
-				});
-			}
-		},
-
-		/* 获取所选日期最早日期 */
-		getNewestDate() {
-			let dateArr = this.addList.filter(_ => _.end_date).map(_ => new Date(_.end_date).getTime())
-			let earliestDate = Math.min(...dateArr);
-			let sameDateArr = dateArr.filter(_ => _===earliestDate)
-			if(dateArr.length === 1 || sameDateArr.length===dateArr.length) {
-				this.newestDate = '';
-				return
-			}
-			this.newestDate = this.$moment(Math.min(...dateArr)).format('YYYY-MM-DD');
-		},	
-
-		/* 清空指标和关联日期 */
-		clearHandle(index) {
-			this.addList[index].start_date = '';
-			this.addList[index].end_date = '';
-			this.getNewestDate();
-		},
-		// 删除指标
-		delTarget(index) {
-			this.addList.splice(index, 1);
-			this.getNewestDate();
-		},
-		saveHandle() {
-			if (!this.formula) return this.$message.warning('计算公式不能为空');
-				this.$refs.diaForm.validate((valid) => {
-					if (valid) {
-						// 指标id数组
-						let target_arr = this.addList
-							.filter((item) => item.target)
-							.map((item) => {
-								return {
-									EdbInfoId: item.target,
-									FromTag: item.tag,
-								};
-							});
-						let params = {
-							CalculateFormula: this.formula,
-							ClassifyId: this.formData.menu[this.formData.menu.length - 1],
-							EdbName: this.formData.targetName,
-							Frequency: this.formData.frequency,
-							Unit: this.formData.unit,
-							EdbInfoIdArr: target_arr,
-						};
-						this.dataloading = true;
-
-						const params2 = { ... params,EdbInfoId: this.calulateForm.edb_id };
-
-						preDictEdbInterface.calculateEdbSave(this.calulateForm.edb_id ? params2 : params).then((res) => {
-							this.dataloading = false;
-							if (res.Ret !== 200) return
-
-							this.$message.success(this.calulateForm.edb_id ? '编辑成功' : '新增成功');
-							this.calulateForm.edb_id ? this.$emit('addCallBack','edit') : this.$emit('addCallBack','add',{ 
-								code:res.Data.UniqueCode,
-								id:res.Data.EdbInfoId,
-								classifyId:params.ClassifyId
-							});
-							this.init();
-						});
-					}
-				});
-		},
-		
-		init() {
-			this.$refs.diaForm.resetFields();
-			this.addList = [
-				{
-					tag: tag_arr[0],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-				{
-					tag: tag_arr[1],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-				{
-					tag: tag_arr[2],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-				{
-					tag: tag_arr[3],
-					target: '',
-					start_date: '',
-					end_date: '',
-				},
-			];
-			this.searchOptions = [];
-			this.formula = '';
-			this.formData = {
-				targetName: '',
-				unit: '',
-				menu: '',
-				frequency: '',
-			};
-		},
-		cancelHandle(type) {
-			this.init();
-			this.$emit('cancel');
-			type==='cancel' && !this.calulateForm.edb_id && this.$emit('openPrev');
-		},
-	},
-	created() {},
-	mounted() {},
-};
-</script>
-<style lang="scss">
-.computed-dialog {
-	overflow: hidden;
-	div::-webkit-scrollbar {
-		width: 6px !important;
-	}
-	.el-dialog__body {
-		max-height: 700px;
-		overflow: auto;
-	}
-	.dialog-main {
-		padding: 25px 42px 25px 25px;
-		.el-cascader .el-input {
-			width: 340px;
-		}
-		.add-cont {
-			display: flex;
-			flex-wrap: wrap;
-			justify-content: space-between;
-			.add-li {
-				position: relative;
-				margin-bottom: 48px;
-				.li-tag {
-					font-size: 16px;
-					margin-right: 8px;
-				}
-				.del-tag {
-					position: absolute;
-					right: -30px;
-					top: 12px;
-					font-size: 16px;
-					cursor: pointer;
-				}
-				.target-date {
-					color: #5882ef;
-					position: absolute;
-					bottom: -25px;
-					left: 24px;
-					&.newest {
-						color: #f00;
-					}
-				}
-			}
-		}
-		.add-icon {
-			font-size: 16px;
-			color: #5882ef;
-			cursor: pointer;
-		}
-		.computed-min {
-			margin: 50px 0;
-			padding-bottom: 40px;
-			border-bottom: 1px dashed #aab4cc;
-			.example-txt {
-				display: block;
-				margin-left: 70px;
-				margin-top: 15px;
-			}
-		}
-	}
-	.dia-bot {
-		padding-bottom: 40px;
-		display: flex;
-		justify-content: center;
-	}
-	.tip-label {
-		position: absolute;
-		bottom: 30px;
-		right: 30px;
-		color: #409EFF;
-		cursor: pointer;
-	}
-}
-</style>

+ 11 - 1
src/views/predictEdb_manage/components/dynamicRingdiffer.vue

@@ -36,9 +36,19 @@
 							:key="item.EdbInfoId"
 							:label="item.EdbName"
 							:value="item.EdbInfoId"
+							:disabled="!item.HaveOperaAuth"
 						>
 							<edbDetailPopover :info="item">
-								<div slot="reference">{{item.EdbName}}</div>
+								<div slot="reference">
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{item.EdbName}}
+								</div>
 							</edbDetailPopover>
 						</el-option>
 					</el-select>

+ 46 - 41
src/views/predictEdb_manage/components/edbDetail.vue

@@ -1,46 +1,51 @@
 <template>
-    <div class="edb-detail-wrap" v-show="edbData.DataList">
-        <chartInfo
-            :edbData="edbData"
-            :lang="lang"
-            :isAllowEditLimit="isAllowEditLimit"
-            @refreshData="refreshData"
-            ref="chartInfo"
-        />
-        <div class="info" style="display: flex;justify-content: flex-end;">
-          <!--   <span>数据来源:{{edbData.EdbInfo.SourceName}}</span> -->
-            <span><!-- 添加人 -->{{$t('Edb.creater')}}:{{edbData.EdbInfo.SysUserRealName}}</span>
-        </div>
-        <ul
-            class="value-ul"
-            v-show="showData&&dataList.length"
-            >
-            <li class="value-item" style="background-color: #EBEFF6;">
-                <span style="width:240px">{{$t('Edb.Detail.e_date')}}({{$t('Edb.Detail.e_fre')}}:{{EdbData.Frequency}})</span>
-                <span style="flex:1;">{{$t('Edb.Detail.e_value')}}<!-- 值 --></span>
-            </li>
-            <li
-                class="value-item"
-                v-for="item in dataList.slice(0,3)"
-                :key="item.EdbDataId"
-            >
-                <span class="value-label date" style="width:240px">
-                    <span style="position: relative;">
-                        <i class="new-tag" v-if="EdbData.LatestDate===item.DataTime"></i>
-                        {{ item.DataTime }}
-                    </span>
-                </span>
-                <span
-                    :class="['value-label',{'predict-act': item.isPredic}]"
-                    style="flex:1;"
+    <div>
+        <div class="edb-detail-wrap" v-show="edbData.DataList&&edbData.EdbInfo.HaveOperaAuth">
+            <chartInfo
+                :edbData="edbData"
+                :lang="lang"
+                :isAllowEditLimit="isAllowEditLimit"
+                @refreshData="refreshData"
+                ref="chartInfo"
+            />
+            <div class="info" style="display: flex;justify-content: flex-end;">
+            <!--   <span>数据来源:{{edbData.EdbInfo.SourceName}}</span> -->
+                <span><!-- 添加人 -->{{$t('Edb.creater')}}:{{edbData.EdbInfo.SysUserRealName}}</span>
+            </div>
+            <ul
+                class="value-ul"
+                v-show="showData&&dataList.length"
                 >
-                    <span :class="['value-style',{'predict-act': item.isPredic}]">{{item.Value}}</span>
-                </span
+                <li class="value-item" style="background-color: #EBEFF6;">
+                    <span style="width:240px">{{$t('Edb.Detail.e_date')}}({{$t('Edb.Detail.e_fre')}}:{{EdbData.Frequency}})</span>
+                    <span style="flex:1;">{{$t('Edb.Detail.e_value')}}<!-- 值 --></span>
+                </li>
+                <li
+                    class="value-item"
+                    v-for="item in dataList.slice(0,3)"
+                    :key="item.EdbDataId"
                 >
-            </li>
-            <li class="nodata value-item" v-if="!dataList.length"><!-- 暂无数据 -->{{$t('Table.prompt_slogan')}}</li>
-        </ul>
+                    <span class="value-label date" style="width:240px">
+                        <span style="position: relative;">
+                            <i class="new-tag" v-if="EdbData.LatestDate===item.DataTime"></i>
+                            {{ item.DataTime }}
+                        </span>
+                    </span>
+                    <span
+                        :class="['value-label',{'predict-act': item.isPredic}]"
+                        style="flex:1;"
+                    >
+                        <span :class="['value-style',{'predict-act': item.isPredic}]">{{item.Value}}</span>
+                    </span
+                    >
+                </li>
+                <li class="nodata value-item" v-if="!dataList.length"><!-- 暂无数据 -->{{$t('Table.prompt_slogan')}}</li>
+            </ul>
+
+
+        </div>
 
+        <noDataAuth v-if="edbData.EdbInfo.HaveOperaAuth===false" :text="$t('MsgPrompt.no_edb_auth')"/>
     </div>
 </template>
 
@@ -137,7 +142,7 @@ export default {
                     edb_nameEn: res.Data.EdbInfo.EdbNameEn,
                     userid: res.Data.EdbInfo.SysUserId
                 })
-                this.$emit('setOpera',res.Data.Button)
+                this.$emit('setOpera',{button:res.Data.Button,detail:res.Data.EdbInfo})
 
                 this.$emit('setCurrentClassify',res.Data.ClassifyList||[])
                 //更新图片
@@ -148,7 +153,7 @@ export default {
                         this.setChartImage()
                     })
                 }
-                this.getData()
+                this.edbData.EdbInfo.HaveOperaAuth && this.getData()
             })
         },
         refreshData(type=''){

+ 11 - 0
src/views/predictEdb_manage/components/edbDia.vue

@@ -66,7 +66,18 @@
               :key="item.EdbInfoId"
               :label="item.EdbName"
               :value="item.EdbInfoId"
+              :disabled="!item.HaveOperaAuth"
             >
+              <div>
+									<img 
+										:src="$icons.lock_ico2" 
+										width="18" 
+										height="18" 
+										style="vertical-align:middle" 
+										v-if="!item.HaveOperaAuth"
+									/>
+									{{item.EdbName}}
+								</div>
             </el-option>
           </el-select>
         </el-form-item>

+ 11 - 0
src/views/predictEdb_manage/components/operationDialog.vue

@@ -47,7 +47,18 @@
 						:key="item.EdbInfoId"
 						:label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 						:value="item.EdbInfoId"
+						:disabled="!item.HaveOperaAuth"
 					>
+						<div>
+							<img 
+								:src="$icons.lock_ico2" 
+								width="18" 
+								height="18" 
+								style="vertical-align:middle" 
+								v-if="!item.HaveOperaAuth"
+							/>
+							{{$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}
+						</div>
 					</el-option>
 				</el-select>
 				<i class="el-icon-tickets" style="color:#409EFF;font-size:18px" @click="$emit('lookHistory',select_target)" v-if="select_target"/>

+ 27 - 5
src/views/predictEdb_manage/predictEdb.vue

@@ -40,7 +40,16 @@
 							:label="currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
 							:value="item.EdbInfoId"
 						>
-							<span>{{ currentLang==='en' ? (item.EdbNameEn||item.EdbName) : item.EdbName }}</span>
+							<div>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!item.HaveOperaAuth"
+								/>
+								<span>{{ currentLang==='en' ? (item.EdbNameEn||item.EdbName) : item.EdbName }}</span>
+							</div>
 						</el-option>
 					</el-select>
 				</div>
@@ -93,11 +102,18 @@
 								}`"
 								:id="`node${data.UniqueCode}`"
 							>
+								<img 
+									:src="$icons.lock_ico2" 
+									width="18" 
+									height="18" 
+									style="vertical-align:middle" 
+									v-if="!data.HaveOperaAuth&&data.EdbInfoId"
+								/>
 								<span>{{ currentLang==='en' ? (data.ClassifyNameEn||data.ClassifyName) : data.ClassifyName }}</span>
 							</span>
 							<span
 								style="display: flex; align-items: center"
-								v-if="select_node === data.UniqueCode"
+								v-if="select_node===data.UniqueCode&&data.HaveOperaAuth"
 							>
 								<img
 									src="~@/assets/img/data_m/move_ico.png"
@@ -182,7 +198,8 @@
 
 				<!-- 详情 -->
 				<div class="edb-detail-wrapper main-min-width" v-if="select_id&&!showAssociateChart&&!showAssociateComputeData">
-					<div class="detail-header">
+
+					<div class="detail-header" v-if="predictEdbInfo.HaveOperaAuth">
 						<el-tabs v-model="activeTab" @tab-click="changeShowType">
 							<el-tab-pane :label="$t('Edb.trend_chart_tab')" name="Chart">
 							</el-tab-pane>
@@ -264,10 +281,11 @@
 							
 							@updateTit="setNameBack"
 							@setCurrentClassify="setCurrentClassify"
-							@setOpera="(obj) => { edbButton = obj }"
+							@setOpera="({button,detail}) => { edbButton = button;predictEdbInfo=detail }"
 							@openEnNameDia="openEnNameDia"
 						/>
 					</div>
+
 				</div>
 
 				<!-- 列表 -->
@@ -286,7 +304,7 @@
 									<span class="text_oneLine">{{ currentLang === 'en' ? (item.EdbNameEn||item.EdbName) : item.EdbName }}</span>
 								</div>
 								<div class="chart-img" @click="detailShowHandle(item)"
-								:style="item.ChartImage?{background: `no-repeat top/cover url('${item.ChartImage}')`}:{}"></div>
+								:style="{background: `no-repeat top/cover url('${!item.HaveOperaAuth ? $icons.lock_big : item.ChartImage}')`}"></div>
 								<div class="item-bottom">
 									<span>{{$t('Common.create_time')}}: {{ item.CreateTime.slice(0,10) }}</span>
 								</div>
@@ -658,6 +676,8 @@ export default {
 			showAssociateComputeData:false,//显示指标关联的引用计算指标
 
 			activeTab:'',
+
+			predictEdbInfo: {},
 		};
 	},
 	computed: {
@@ -698,6 +718,8 @@ export default {
 		select_id(newval) {
 			this.detail_show_chart = true;
 			this.activeTab='Chart'
+
+			if(this.predictEdbInfo.HaveOperaAuth) return
 			this.$nextTick(()=>{
 				//切换为曲线图 重置选择状态
 				if(this.$refs.detailComponentRef){

+ 2 - 2
src/views/report_manage/addreportNew.vue

@@ -227,7 +227,7 @@
 							>
 								<p class="color_primary">{{ item.ChartName }}</p>
 								<img
-									:src="item.ChartImage"
+									:src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage"
 									:id="'listnode' + index"
 									@click="insertHtml(item)"
 								/>
@@ -298,7 +298,7 @@
 							>
 								<p class="color_primary">{{ item.ExcelName }}</p>
 								<img
-									:src="item.ExcelImage"
+									:src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage"
 									:id="'sheet' + item.ExcelInfoId"
 									style="object-fit: contain;height: 250px;"
 									@click="insertHtml(item,'sheet')"

+ 39 - 4
src/views/report_manage/cloudDisk.vue

@@ -458,7 +458,7 @@ import 'streamsaver/examples/zip-stream'
       },
       // 下载文件
       downloadFile(row){
-        if(row.Size === 0) return this.$message.warning('文件夹为空')
+        if(row.Size === 0) return this.$message.warning('文件夹为空,暂不支持下载')
         let downloadHint = this.$message({
           type:"info",
           message:row.ItemName+'开始下载,请勿重复下载',
@@ -479,7 +479,7 @@ import 'streamsaver/examples/zip-stream'
             downloadHint.close()
           })
         }else if(row.ItemType==2){
-          downloadFileByUrl(row.ResourceUrl).then(res=>{
+          /* downloadFileByUrl(row.ResourceUrl).then(res=>{
             // console.log(res);
             downloadByFlow(res,null,row.ItemName)
             this.$message.success(row.ItemName + this.$t('ReportManage.CloudPage.download_success_msg'))
@@ -487,6 +487,13 @@ import 'streamsaver/examples/zip-stream'
             this.$message.error(row.ItemName + '下载失败')
           }).finally(()=>{
             downloadHint.close()
+          }) */
+          this.handleDownloadResource(row.ResourceUrl,row.ItemName,()=>{
+            this.$message.success(row.ItemName + this.$t('ReportManage.CloudPage.download_success_msg'))
+            downloadHint.close()
+          },()=>{
+            this.$message.error(row.ItemName + '下载失败')
+            downloadHint.close()
           })
         }
       },
@@ -495,15 +502,25 @@ import 'streamsaver/examples/zip-stream'
           this.$message.warning('请至少选择一个文件/文件夹')
           return
         }
+        let emptyFolders=this.tableSelection.filter(it => it.Size==0)
         let downloadHint = this.$message({
           type:"info",
           message:this.$t('ReportManage.CloudPage.download_info_msg'),
           duration:0,
           iconClass:'el-icon-loading'
         })
+        setTimeout(()=>{
+          if(emptyFolders.length==0) return 
+          if(emptyFolders.length == this.tableSelection.length){
+            downloadHint.close()
+            this.$refs.tableRef.clearSelection()
+          }
+          this.$message.warning(`【${emptyFolders.map(it => it.ItemName).join('、')}】文件夹为空,暂不支持下载`)
+        },0)
         let downNumber = 0
-        let selectLength = this.tableSelection.length
+        let selectLength = this.tableSelection.length-emptyFolders.length
         this.tableSelection.map(item=>{
+          if(item.Size == 0) return 
           if(item.ItemType==1){
             // 下载压缩包
             cloudDiskInterface.getFilesByMenuId({MenuId:item.ItemId}).then(res=>{
@@ -531,7 +548,7 @@ import 'streamsaver/examples/zip-stream'
             })
           }else if(item.ItemType==2){
             // 下载文件
-            downloadFileByUrl(item.ResourceUrl).then(res=>{
+            /* downloadFileByUrl(item.ResourceUrl).then(res=>{
               // console.log(res);
               downloadByFlow(res,null,item.ItemName)
               this.$message.success(item.ItemName + this.$t('ReportManage.CloudPage.download_success_msg'))
@@ -543,6 +560,24 @@ import 'streamsaver/examples/zip-stream'
                 downloadHint.close()
                 this.$refs.tableRef.clearSelection()
               }
+            }) */
+            const that = this
+            this.handleDownloadResource(item.ResourceUrl,item.ItemName,()=>{
+                this.$message.success(item.ItemName + this.$t('ReportManage.CloudPage.download_success_msg'))
+                downloadHint.close()
+                downNumber++
+                if(downNumber == selectLength){
+                    downloadHint.close()
+                    that.$refs.tableRef.clearSelection()
+                }
+            },()=>{
+                this.$message.error(item.ItemName + '下载失败')
+                downloadHint.close()
+                downNumber++
+                if(downNumber == selectLength){
+                    downloadHint.close()
+                    that.$refs.tableRef.clearSelection()
+                }
             })
           }
         })

+ 4 - 3
src/views/report_manage/components/importMyChart.vue

@@ -25,7 +25,7 @@
             <div class="item" v-for="item in list" :key="item.UniqueCode" @click="handleClickItem">
                 <div class="chartEn-mark" v-show="item.IsEnChart && showEnMark" style="top: 0;left: 0;">En</div>
                 <p class="color_primary">{{ item.ChartName }}</p>
-                <img :src="item.ChartImage" alt="">
+                <img :src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage" alt="">
             </div>
 		</div>
         <div v-if="list.length==0" class="empty-box">
@@ -103,11 +103,12 @@ export default {
                 this.$message.warning(this.$t('ReportManage.ReportList.please_select_category'))
                 return
             }
-            if(this.list.length==0){
+            let filterList = this.list.filter(_ =>_.HaveOperaAuth)
+            if(filterList.length==0){
                 this.$message.warning(this.$t('ReportManage.ReportList.no_chart_msg'))
                 return
             }
-            this.$emit('handleImportMyChart',this.list)
+            this.$emit('handleImportMyChart',filterList)
             setTimeout(() => {
                 this.CurrentIndex=1
                 this.list=[]

+ 2 - 2
src/views/report_manage/editChapterReport.vue

@@ -203,7 +203,7 @@
             >
               <p class="color_primary">{{ item.ChartName }}</p>
               <img
-                :src="item.ChartImage"
+                :src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage"
                 :id="'listnode' + index"
                 @click="insertHtml(item)"
               />
@@ -272,7 +272,7 @@
 							>
 								<p class="color_primary">{{ item.ExcelName }}</p>
 								<img
-									:src="item.ExcelImage"
+									:src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage"
 									:id="'sheet' + item.ExcelInfoId"
 									style="object-fit: contain;height: 250px;"
 									@click="insertHtml(item,'sheet')"

+ 2 - 2
src/views/report_manage/editreportNew.vue

@@ -225,7 +225,7 @@
 							>
 								<p class="color_primary">{{ item.ChartName }}</p>
 								<img
-									:src="item.ChartImage"
+									:src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage"
 									:id="'listnode' + index"
 									@click="insertHtml(item)"
 								/>
@@ -295,7 +295,7 @@
 							>
 								<p class="color_primary">{{ item.ExcelName }}</p>
 								<img
-									:src="item.ExcelImage"
+									:src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage"
 									:id="'sheet' + item.ExcelInfoId"
 									style="object-fit: contain;height: 250px;"
 									@click="insertHtml(item,'sheet')"

+ 20 - 1
src/views/report_manage/mixins/reportMixin.js

@@ -87,7 +87,7 @@ export default {
           "insertHR",
           "selectAll",
           "clearFormatting",
-          "html",
+          /* "html", */
           "undo",
           "redo",
         ],
@@ -165,6 +165,19 @@ export default {
           "image.error": function (error, response) {
             that.autoSaveFlag = true;
           },
+          "paste.before":function(e,editor){
+            let content = e.clipboardData.getData('text/html');
+           // console.log(content)
+            var tempDiv = document.createElement('div');
+            tempDiv.innerHTML = content;
+            var iframes = tempDiv.querySelectorAll('iframe');
+            const srcArr = Array.from(iframes).map(i=>i.src)
+            //console.log(srcArr);
+            if(srcArr.filter(i=>!i.includes(that.$setting.dynamicOutLinks.ChartViewUrl)).length){
+                that.$message.warning("粘贴内容含有外链,请核对内容或粘贴纯文本")
+                return false
+            }
+          },
         },
         charCounterCount: false,
         reportloadding: false,
@@ -211,6 +224,12 @@ export default {
 
   methods: {
     insertHtml(item, type = "chart") {
+      const noAuthMsg = {
+        'chart': this.$t('MsgPrompt.no_chart_auth'),
+        'sheet': this.$t('MsgPrompt.no_sheet_auth')
+      }
+      if(!item.HaveOperaAuth&&noAuthMsg[type]) return this.$message.warning(noAuthMsg[type])
+
       //设置编辑器获取焦点
       this.editor.events.focus();
       // 获取选定对象

+ 20 - 4
src/views/report_manage/reportEn/reportEditor.vue

@@ -230,13 +230,13 @@
 								:style="item.Disabled && 'cursor: not-allowed;'"
 								class="liststy"
 							>
-								<div class="chartEn-mark" style="top: 0;left:0;" @click="setEnHandle(item)">
+								<div class="chartEn-mark" style="top: 0;left:0;" @click="setEnHandle(item)" v-if="item.HaveOperaAuth">
 									<span v-if="item.IsEnChart">En</span>
 									<i class="el-icon-edit" v-else style="font-size:18px"/>
 								</div>
 								<p class="color_primary">{{ chart_source===1 ? (item.ChartNameEn||item.ChartName) : item.ChartName }}</p>
 								<img
-									:src="item.ChartImage"
+									:src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage"
 									:id="'listnode' + index"
 									@click="insertHtml(item)"
 								/>
@@ -305,7 +305,7 @@
 							>
 								<p class="color_primary">{{ item.ExcelName }}</p>
 								<img
-									:src="item.ExcelImage"
+									:src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage"
 									:id="'sheet' + item.ExcelInfoId"
 									style="object-fit: contain;height: 250px;"
 									@click="insertHtml(item,'sheet')"
@@ -391,6 +391,7 @@ import importSemantics from '../components/importSemantics.vue';
 export default {
 	mixins:[mixinMsg,reportMixin,reportApproveConfig],
 	data() {
+        let that = this;
 		return {
 			//批量导入图表
 			importChartNum:0,//批量导入图表的数量 如果大于0则说明在加载
@@ -497,7 +498,22 @@ export default {
         placeholderText:localStorage.getItem('i18n') == 'en' ? 'Please Overview' : '请输入overview',
         language: localStorage.getItem('i18n') == 'en' ? 'en' : "zh_cn",
         //允许粘贴的样式
-        pasteAllowedStyleProps: ['font-family', 'font-size', 'color']
+        pasteAllowedStyleProps: ['font-family', 'font-size', 'color'],
+        events:{
+            "paste.before":function(e,editor){
+                let content = e.clipboardData.getData('text/html');
+                // console.log(content)
+                var tempDiv = document.createElement('div');
+                tempDiv.innerHTML = content;
+                var iframes = tempDiv.querySelectorAll('iframe');
+                const srcArr = Array.from(iframes).map(i=>i.src)
+                //console.log(srcArr);
+                if(srcArr.filter(i=>!i.includes(that.$setting.dynamicOutLinks.ChartViewUrl)).length){
+                    that.$message.warning("粘贴内容含有外链,请核对内容或粘贴纯文本")
+                    return false
+                }
+            },
+        }
       },
 
 			showDSFB:false,//显示定时发布弹窗

+ 81 - 51
src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue

@@ -24,7 +24,18 @@
               :key="item.EdbInfoId"
               :label="item.EdbName"
               :value="item.EdbInfoId"
+              :disabled="!item.HaveOperaAuth"
             >
+              <div>
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!item.HaveOperaAuth"
+                />
+                {{item.EdbName}}
+              </div>
             </el-option>
           </el-select>
           <el-select v-else-if="addLinkSearchParams.linkType==2"
@@ -45,7 +56,18 @@
               :key="item.ChartInfoId"
               :label="item.ChartName"
               :value="item.ChartInfoId"
+              :disabled="!item.HaveOperaAuth"
             >
+              <div>
+                <img 
+                  :src="$icons.lock_ico2" 
+                  width="18" 
+                  height="18" 
+                  style="vertical-align:middle" 
+                  v-if="!item.HaveOperaAuth"
+                />
+                {{item.ChartName}}
+              </div>
             </el-option>
           </el-select>
           <el-input v-else v-model="reportKeyWord" @input="searchReport"
@@ -56,60 +78,68 @@
         <div class="link-box-content">
           <!-- 指标 -->
           <div class="link-content-dataIndex" v-if="addLinkSearchParams.linkType==1 && databaseTableData && databaseTableData.length>0">
-            <el-table :data="databaseTableData" border style="box-shadow: rgba(155, 170, 219, 0.2) 0px 3px 6px;">
-              <el-table-column :label="$t('Table.edb_id')" align="center">
-                <template slot-scope="scope">{{ scope.row.EdbCode }}</template>
-              </el-table-column>
-              <el-table-column :label="$t('Table.edb_name')" align="center" width="200">
-                <template slot-scope="scope">{{ scope.row.EdbName }}</template>
-              </el-table-column>
-              <el-table-column :label="$t('Table.frequency')" align="center" width="50">
-                <template slot-scope="scope">{{ scope.row.Frequency }}</template>
-              </el-table-column>
-              <el-table-column :label="$t('Table.unit')" align="center">
-                <template slot-scope="scope">{{ scope.row.Unit }}</template>
-              </el-table-column>
-              <el-table-column :label="$t('Table.start_time')" align="center" width="100">
-                <template slot-scope="scope">{{ scope.row.StartDate }}</template>
-              </el-table-column>
-              <el-table-column :label="$t('Table.update_time')" align="center" width="160">
-                <template slot-scope="scope">{{ scope.row.ModifyTime }}</template>
-              </el-table-column>
-              <el-table-column :label="$t('Table.source')" align="center">
-                <template slot-scope="scope">{{ scope.row.SourceName }}</template>
-              </el-table-column>
-              <el-table-column :label="$t('Table.column_operations')" align="center" width="50">
-                <template slot-scope="scope">
-                  <span class="delete-button">{{$t('Table.delete_btn')}}</span>
-                </template>
-              </el-table-column>
-            </el-table>
-            <ul 
-              class="value-ul" 
-              ref="valueUl" 
-              @scroll="databaseScrollHandle" 
-              v-show="databaseList.length">
-              <li
-                class="value-item"
-                v-for="item in databaseList"
-                :key="item.EdbDataId"
-              >
-                <span class="value-label">
-                  <span style="position: relative;">
-                    <i class="new-tag" v-if="databaseTableData[0].LatestDate===item.DataTime"></i>
-                    {{item.DataTime}}
+            <template v-if="databaseTableData[0].HaveOperaAuth">
+              <el-table :data="databaseTableData" border style="box-shadow: rgba(155, 170, 219, 0.2) 0px 3px 6px;">
+                <el-table-column :label="$t('Table.edb_id')" align="center">
+                  <template slot-scope="scope">{{ scope.row.EdbCode }}</template>
+                </el-table-column>
+                <el-table-column :label="$t('Table.edb_name')" align="center" width="200">
+                  <template slot-scope="scope">{{ scope.row.EdbName }}</template>
+                </el-table-column>
+                <el-table-column :label="$t('Table.frequency')" align="center" width="50">
+                  <template slot-scope="scope">{{ scope.row.Frequency }}</template>
+                </el-table-column>
+                <el-table-column :label="$t('Table.unit')" align="center">
+                  <template slot-scope="scope">{{ scope.row.Unit }}</template>
+                </el-table-column>
+                <el-table-column :label="$t('Table.start_time')" align="center" width="100">
+                  <template slot-scope="scope">{{ scope.row.StartDate }}</template>
+                </el-table-column>
+                <el-table-column :label="$t('Table.update_time')" align="center" width="160">
+                  <template slot-scope="scope">{{ scope.row.ModifyTime }}</template>
+                </el-table-column>
+                <el-table-column :label="$t('Table.source')" align="center">
+                  <template slot-scope="scope">{{ scope.row.SourceName }}</template>
+                </el-table-column>
+                <el-table-column :label="$t('Table.column_operations')" align="center" width="50">
+                  <template slot-scope="scope">
+                    <span class="delete-button">{{$t('Table.delete_btn')}}</span>
+                  </template>
+                </el-table-column>
+              </el-table>
+              <ul 
+                class="value-ul" 
+                ref="valueUl" 
+                @scroll="databaseScrollHandle" 
+                v-show="databaseList.length">
+                <li
+                  class="value-item"
+                  v-for="item in databaseList"
+                  :key="item.EdbDataId"
+                >
+                  <span class="value-label">
+                    <span style="position: relative;">
+                      <i class="new-tag" v-if="databaseTableData[0].LatestDate===item.DataTime"></i>
+                      {{item.DataTime}}
+                    </span>
                   </span>
-                </span>
-                <span :class="['value-label',{'predict-act': databaseTableData[0].DataInsertConfig.Date===item.DataTime}]" style="min-width:200px;text-align:center;">
-                  <span :class="['value-style',{'predict-act': databaseTableData[0].DataInsertConfig.Date===item.DataTime}]">{{item.Value}}</span>
-                </span>
-              </li>
-              <li class="nodata value-item" v-if="!databaseList.length">{{$t('Table.prompt_slogan')}}</li>
-            </ul>
+                  <span :class="['value-label',{'predict-act': databaseTableData[0].DataInsertConfig.Date===item.DataTime}]" style="min-width:200px;text-align:center;">
+                    <span :class="['value-style',{'predict-act': databaseTableData[0].DataInsertConfig.Date===item.DataTime}]">{{item.Value}}</span>
+                  </span>
+                </li>
+                <li class="nodata value-item" v-if="!databaseList.length">{{$t('Table.prompt_slogan')}}</li>
+              </ul>
+            </template>
+
+            <noDataAuth v-if="databaseTableData[0].HaveOperaAuth===false" :text="$t('MsgPrompt.no_edb_auth')"/>
           </div>
           <div class="link-content-chartIndex" v-else-if="addLinkSearchParams.linkType==2 && this.chartInfo && this.chartInfo.ChartInfoId">
-            <div class="chart-name">{{ this.chartInfo.ChartName }}</div>
-            <Chart :options="options" :chartInfo="chartInfo" ref="chartRef" />
+            <template v-if="chartInfo.HaveOperaAuth">
+              <div class="chart-name">{{ this.chartInfo.ChartName }}</div>
+              <Chart :options="options" :chartInfo="chartInfo" ref="chartRef" />
+            </template>
+
+            <noDataAuth v-if="chartInfo.HaveOperaAuth===false" :text="$t('MsgPrompt.no_chart_auth')"/>
           </div>
           <div class="link-content-dataIndex" v-else-if="addLinkSearchParams.linkType==3 && this.reportList.length>0">
             <el-table :data="this.reportList" border style="margin-bottom: 10px;" ref="reportTable"

+ 17 - 2
src/views/smartReport/components/ETASheet.vue

@@ -20,10 +20,11 @@
                 animation="300"
                 :sort="false"
                 tag="div"
+                :move="onMoveItemHandle"
             >
                 <div class="sheet-item" :comp-data="getCompData(item)" v-for="item in list" :key="item.ExcelInfoId">
                     <div class="title">{{item.ExcelName}}</div>
-                    <div class="img" :style="'backgroundImage:url('+item.ExcelImage+')'"></div>
+                    <div class="img" :style="`backgroundImage:url(${ !item.HaveOperaAuth?$icons.lock_big:item.ExcelImage })`"></div>
                 </div>
             </draggable>
             <tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-if="list.length===0"/>
@@ -93,7 +94,21 @@ export default {
             if(this.finished||this.loading) return
             this.page++
             this.getSheetList()
-        }
+        },
+
+        onMoveItemHandle(e) {
+            /* 无权限 */
+            if (!e.draggedContext.element.HaveOperaAuth) {
+                this.messageTip()
+                return false;
+            }
+
+            return true
+        },
+        
+        messageTip: _.debounce(function() {
+            this.$message.warning(this.$t('MsgPrompt.no_sheet_auth'))
+        },200)
     },
 }
 </script>

+ 17 - 2
src/views/smartReport/components/ImportETAChart.vue

@@ -12,10 +12,11 @@
                 animation="300"
                 :sort="false"
                 tag="div"
+                :move="onMoveItemHandle"
             >
                 <div class="chart-item" :comp-data="getCompData(item)" v-for="item in list" :key="item.UniqueCode">
                     <div class="title">{{item.ChartName}}</div>
-                    <div class="img" :style="'backgroundImage:url('+item.ChartImage+')'"></div>
+                    <div class="img" :style="`backgroundImage:url(${ !item.HaveOperaAuth?$icons.lock_big:item.ChartImage })`"></div>
                 </div>
             </draggable>
             <tableNoData :text="$t('ReportManage.ReportList.no_chart_table_available')" size="mini" v-if="list.length===0"/>
@@ -90,7 +91,21 @@ export default {
             this.list=[]
             this.keyword=key
             this.getETAChartList()
-        }
+        },
+
+        onMoveItemHandle(e) {
+            /* 无权限 */
+            if (!e.draggedContext.element.HaveOperaAuth) {
+                this.messageTip()
+                return false;
+            }
+
+            return true
+        },
+        
+        messageTip: _.debounce(function() {
+            this.$message.warning(this.$t('MsgPrompt.no_chart_auth'))
+        },200)
     },
 }
 </script>

+ 4 - 3
src/views/smartReport/components/ImportMyETAChart.vue

@@ -24,7 +24,7 @@
 		<div class="list" v-infinite-scroll="load" v-if="list.length>0">
             <div class="chart-item" v-for="item in list" :key="item.UniqueCode" @click="handleClickItem">
                 <div class="title">{{item.ChartName}}</div>
-                <div class="img" :style="'backgroundImage:url('+item.ChartImage+')'"></div>
+                <div class="img" :style="`backgroundImage:url(${ !item.HaveOperaAuth?$icons.lock_big:item.ChartImage })`"></div>
             </div>
 		</div>
         <tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-if="list.length===0"/>
@@ -100,11 +100,12 @@ export default {
                 this.$message.warning(this.$t('ReportManage.ReportList.please_select_category'))
                 return
             }
-            if(this.list.length==0){
+             let filterList = this.list.filter(_ =>_.HaveOperaAuth)
+            if(filterList.length==0){
                 this.$message.warning(this.$t('ReportManage.ReportList.no_chart_msg'))
                 return
             }
-            this.$emit('handleImportMyChart',this.list)
+            this.$emit('handleImportMyChart',filterList)
             setTimeout(() => {
                 this.CurrentIndex=1
                 this.list=[]

+ 14 - 1
src/views/smartReport/components/TextEdit.vue

@@ -54,7 +54,7 @@ export default {
                     "insertHR",
                     "selectAll",
                     "clearFormatting",
-                    "html",
+                    /* "html", */
                     "undo",
                     "redo",
                 ],
@@ -106,6 +106,19 @@ export default {
                         // that.$emit('textChange', that.html)
                         that.sendHtml()
                     },
+                    "paste.before":function(e,editor){
+                        let content = e.clipboardData.getData('text/html');
+                        // console.log(content)
+                        var tempDiv = document.createElement('div');
+                        tempDiv.innerHTML = content;
+                        var iframes = tempDiv.querySelectorAll('iframe');
+                        const srcArr = Array.from(iframes).map(i=>i.src)
+                        //console.log(srcArr);
+                        if(srcArr.filter(i=>!i.includes(that.$setting.dynamicOutLinks.ChartViewUrl)).length){
+                            that.$message.warning("粘贴内容含有外链,请核对内容或粘贴纯文本")
+                            return false
+                        }
+                    },
                 },
             }
         }

+ 29 - 27
src/views/smartReport/reportList.vue

@@ -506,31 +506,32 @@ export default {
     methods:{
         // 下载报告图片
         handleDownReportImg(imgUrl,title){
-            let img=new Image()
-            img.setAttribute('crossOrigin', 'anonymous');
-            img.src=imgUrl
-            img.onload=()=>{
-                let canvas = document.createElement("canvas");
-                canvas.width = img.width;
-                canvas.height = img.height;
-                let context = canvas.getContext('2d');
-                context.drawImage(img, 0, 0, img.width, img.height);
-                let dataURL = canvas.toDataURL("image/png", 1);
-                const a=document.createElement('a')
-                a.setAttribute("download",title)
-                a.style.display = "none"
-                a.href=dataURL
-                document.body.appendChild(a);
-                a.click()
-            }
-            img.onerror=(e)=>{
-                console.log(e);
-                this.$message.warning(this.$t('ReportManage.smart_msg.please_manually_save'))
-                if(imgUrl){
-                    this.reportImgUrl=imgUrl
-                    this.showReportImg=true
-                }
-            }
+            this.handleDownloadResource(imgUrl,title)
+            // let img=new Image()
+            // img.setAttribute('crossOrigin', 'anonymous');
+            // img.src=imgUrl
+            // img.onload=()=>{
+            //     let canvas = document.createElement("canvas");
+            //     canvas.width = img.width;
+            //     canvas.height = img.height;
+            //     let context = canvas.getContext('2d');
+            //     context.drawImage(img, 0, 0, img.width, img.height);
+            //     let dataURL = canvas.toDataURL("image/png", 1);
+            //     const a=document.createElement('a')
+            //     a.setAttribute("download",title)
+            //     a.style.display = "none"
+            //     a.href=dataURL
+            //     document.body.appendChild(a);
+            //     a.click()
+            // }
+            // img.onerror=(e)=>{
+            //     console.log(e);
+            //     this.$message.warning(this.$t('ReportManage.smart_msg.please_manually_save'))
+            //     if(imgUrl){
+            //         this.reportImgUrl=imgUrl
+            //         this.showReportImg=true
+            //     }
+            // }
         },
 
         // 删除某个报告
@@ -864,7 +865,7 @@ export default {
         },
         // 下载音频
         handleDownloadVoice(e){
-            const x = new window.XMLHttpRequest();
+            /* const x = new window.XMLHttpRequest();
             x.open('GET', e.VideoUrl, true);
             x.responseType = 'blob';
             x.onload = () => {
@@ -879,7 +880,8 @@ export default {
                 document.body.append(a)
                 a.click();
             };
-            x.send();
+            x.send(); */
+            this.handleDownloadResource(e.VideoUrl,e.VideoName+'.mp3')
         }
     },
 

+ 322 - 0
src/views/system_manage/components/opearAuthSetDia.vue

@@ -0,0 +1,322 @@
+<template>
+   <el-dialog
+		:visible.sync="isShow"
+		:close-on-click-modal="false"
+		:modal-append-to-body='false'
+    :title="titleMap[form.type]"
+		@close="cancelHandle"
+		custom-class="dialog"
+		center
+		width="750px"
+		v-dialogDrag
+  >
+    <div class="main">
+      <div class="header">
+        <div v-if="form.type==='single'" style="margin-bottom:15px;">
+          {{form.dataName}}
+        </div>
+
+        <el-cascader
+          v-model="selectUserIds"
+          ref="userRef"
+          :options="userList"
+          :props="{
+            value: 'ItemId',
+            label: 'ItemName',
+            children: 'Children',
+            emitPath: false,
+            multiple: true,
+          }"
+          collapse-tags
+          :show-all-levels="false"
+          clearable
+          @change="checkUser"
+          filterable
+          :placeholder="this.$t('SystemManage.OperateAuth.ph_see_user')" 
+          style="width:300px"
+        />
+
+        <div class="checked-user scroll-cont" :style="`height:${form.type==='classify'?100:210}px`">
+          <el-tag
+            v-for="tag in selectUserList"
+            :key="tag.label"
+            closable
+            @close="removeUser(tag.value)"
+          >
+            {{tag.label}}
+          </el-tag>
+        </div>
+      </div>
+
+      <div class="classify-cont" v-if="form.type==='classify'">
+        <el-radio-group v-model="currentTab" @input="()=>{ currentSubTab='2';getClassifyList()}" style="margin-bottom:10px;">
+          <el-radio-button
+            v-for="item in tabs" 
+            :key="item.key"
+            :label="item.key"
+          >{{item.label}}</el-radio-button>
+        </el-radio-group>
+
+        <el-tabs v-model="currentSubTab" @tab-click="getClassifyList" v-if="currentTab===6">
+          <el-tab-pane 
+            :label="item.label" 
+            v-for="item in subTabs.filter(_ => _.key!==4)" 
+            :key="item.key" 
+            :name="String(item.key)"
+          ></el-tab-pane>
+        </el-tabs>
+
+        <div class="scroll-cont classify-section">
+          <el-tree
+            :data="classifyList"
+            ref="clssifyTreeRef"
+            :props="{
+              label: 'ClassifyName',
+              children: 'Child',
+              disabled: function(data) {
+                return data.IsJoinPermission===0
+              }
+            }"
+            show-checkbox
+            node-key="ClassifyId"
+            :empty-text="$t('Table.prompt_slogan')"
+          />
+        </div>
+        <p v-html="$i18n.locale==='en'?classifyTipsEn:classifyTips"></p>
+      </div>
+    </div>
+
+    <div class="dia-bot">
+      <el-button type="primary" style="margin-right:20px" @click="saveHandle">{{$t('Dialog.confirm_btn')}}</el-button>
+      <el-button type="primary" plain @click="cancelHandle">{{$t('Dialog.cancel_btn')}}</el-button>
+    </div>
+  </el-dialog>
+</template>
+<script>
+import { operateAuthInterface } from '@/api/modules/setApi';
+export default {
+  props: {
+    isShow: {
+      type: Object
+    },
+    userList: {
+      type: Array
+    },
+    tabs: {
+      type: Array
+    },
+    subTabs: {
+      type: Array
+    },
+    form: {
+      type: Object
+    }
+  },
+  watch: {
+    isShow(nval) {
+      if(!nval) return
+      
+      this.form.type==='classify'&&this.getClassifyList()
+      this.form.type==='single'&& this.getDataAuthUser()
+    }
+  },
+  data() {
+    return {
+      loading: null,
+      selectUserIds: [],
+      selectUserList: [],
+
+      titleMap: {
+        'classify': /* '按分类设置权限' */this.$t('SystemManage.OperateAuth.classify_set_btn'),
+        'multiple': /* '批量设置数据权限' */this.$t('SystemManage.OperateAuth.title_batch_set_auth'),
+        'single': /* '设置数据权限' */this.$t('SystemManage.OperateAuth.title_single_set_auth'),
+      },
+
+      currentTab: 3,
+      currentSubTab: '2',
+      classifyList: [],
+      classifyTips: `注:1、最新设置的用户分类权限保存后,则会替换用户之前的分类权限设置;<br>
+       2、若模块分类中,子分类加密父分类不加密,则父分类展示但禁选。`,
+      classifyTipsEn: `
+        Note:1. After saving the latest user category permissions settings, they will replace the user's previous category permissions settings;<br>
+        2. If in the module categorization, a subcategory is encrypted but its parent category is not, the parent category will be displayed but cannot be selected.`
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+    /* 获取分类列表 */
+    getClassifyList() {
+
+      operateAuthInterface.getSecretClassify({
+        Source: Number(this.currentTab),
+        SubSource: Number(this.currentTab) === 6 ? Number(this.currentSubTab) : 0
+      }).then(res => {
+        if(res.Ret == 200){
+          this.classifyList = res.Data.List || []
+          //如果是三级分类,去掉最后一级分类的child
+          this.filterNodes(this.classifyList)
+        }
+      })
+    },
+    filterNodes(arr) {
+        arr.length && arr.forEach(item => {
+            item.Child && item.Child.length && this.filterNodes(item.Child)
+            if(item.Child && !item.Child.length) {
+                delete item.Child
+            }
+        })
+    },
+
+    /* 选择用户 */
+    checkUser() {
+      let selectUser = this.$refs.userRef.getCheckedNodes(true);
+      let arr = []
+      arr = selectUser.length?selectUser.map(_ => ({
+        label: _.label,
+        value: _.value
+      })):[]
+      this.selectUserList = arr.filter(_ => this.selectUserIds.includes(_.value))
+      
+      //一个人时默认选中有权限分类
+      if(this.selectUserIds.length===1&&this.$refs.clssifyTreeRef) this.getOwnAuthClassify()
+    },
+
+    /* 获取用户的权限分类 */
+    async getOwnAuthClassify() {
+      const res = await operateAuthInterface.getSecretClassifyByUser({
+        Source: Number(this.currentTab),
+        SubSource: Number(this.currentTab) === 6 ? Number(this.currentSubTab) : 0,
+        UserId: Number(this.selectUserIds[0])
+      })
+      if(res.Ret !== 200) return
+
+      this.$nextTick(() => {
+        res.Data ? this.$refs.clssifyTreeRef.setCheckedKeys(res.Data) : this.$refs.clssifyTreeRef.setCheckedKeys([])
+      })
+    },
+
+    /* 获取数据的权限用户 */
+    async getDataAuthUser() {
+      const { Source,SubSource,DataIdList } = this.form.params
+      const res = await operateAuthInterface.getAuthUserByData({
+        Source,
+        SubSource,
+        DataId: Number(DataIdList[0])
+      })
+
+      if(res.Ret !== 200) return
+
+      if(res.Data && res.Data.length){
+        this.selectUserIds = res.Data
+        this.$nextTick(() => {
+          this.checkUser()
+        })
+      }
+    },
+
+    removeUser(val) {
+      let index = this.selectUserList.findIndex(_ => _.value===val)
+      this.selectUserList.splice(index,1)
+
+      this.selectUserIds = this.selectUserIds.filter(_ => _!==val)
+    },
+
+    async saveHandle() {
+      if(!this.selectUserIds.length&&this.form.type==='classify') return this.$message.warning(/* '请选择用户' */this.$t('SystemManage.OperateAuth.placeholder04'))
+
+      this.loading = this.$loading({
+          lock: true,
+          text: ``,
+          target: '.el-dialog__body',
+          background: 'rgba(255, 255, 255, 0.8)'
+      });
+
+      this.form.type==='classify' 
+        ? this.setClassifyAuthHandle()
+        : this.setDataAuthHandle()
+        
+    },
+
+    //设置分类权限
+    async setClassifyAuthHandle() {
+      let checkedArr = this.$refs.clssifyTreeRef.getCheckedNodes()
+        .filter(_ =>_.IsJoinPermission===1).map(_=>_.ClassifyId);
+
+      let params = {
+        Source: Number(this.currentTab),
+        SubSource: Number(this.currentTab) === 6 ? Number(this.currentSubTab) : 0,
+        UserList: this.selectUserIds.map(_=>Number(_)),
+        ClassifyIdList: checkedArr
+      }
+
+      const res = await operateAuthInterface.setClassifyAuth(params)
+
+      this.loading.close()
+
+      if(res.Ret !==200 ) return
+      this.$message.success(/* '设置成功' */this.$t('SystemManage.OperateAuth.set_success'))
+    },
+
+    //设置指标权限
+    async setDataAuthHandle() {
+      let params = {
+        UserList: this.selectUserIds.map(_=>Number(_)),
+        ...this.form.params
+      }
+      const res = await operateAuthInterface.setDataAuth(params)
+
+      this.loading.close()
+
+      if(res.Ret !==200 ) return
+
+      this.$message.success(/* '设置成功' */this.$t('SystemManage.OperateAuth.set_success'))
+      this.cancelHandle()
+    },
+
+    cancelHandle() {
+      this.selectUserIds = []
+      this.selectUserList = []
+      this.$refs.clssifyTreeRef&&this.$refs.clssifyTreeRef.setCheckedKeys([])
+      this.currentTab = 3
+      this.$emit('update:isShow',false)
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.main {
+  .checked-user {
+    display: flex;
+    gap: 10px;
+    align-content: flex-start;
+    flex-wrap: wrap;
+    margin-top: 15px;
+  }
+  .scroll-cont {
+    padding: 15px;
+    border: 1px solid #ddd;
+    border-radius: 4px;
+    overflow-y: auto;
+  }
+
+  .classify-cont {
+    margin-top: 15px;
+    .classify-section{
+      max-height: 200px;
+    }
+  }
+
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 30px 0;
+}
+</style>
+<style lang="scss">
+  .el-dialog .el-input {
+    width: 100%;
+  }
+</style>

+ 201 - 0
src/views/system_manage/components/setClassifySecretDia.vue

@@ -0,0 +1,201 @@
+<template>
+  <el-dialog
+		:visible.sync="isShow"
+		:close-on-click-modal="false"
+		:modal-append-to-body='false'
+    :title="$t('SystemManage.OperateAuth.classify_secret_btn')"
+		@close="cancelHandle"
+		custom-class="dialog"
+		center
+		width="750px"
+		v-dialogDrag
+  >
+    <div class="main">
+        <el-radio-group v-model="currentTab" @input="()=>{ currentSubTab='2';getClassifyList()}" style="margin-bottom:10px;">
+          <el-radio-button
+            v-for="item in tabs" 
+            :key="item.key"
+            :label="item.key"
+          >{{item.label}}</el-radio-button>
+        </el-radio-group>
+
+        <el-tabs v-model="currentSubTab" @tab-click="getClassifyList" v-if="currentTab===6">
+          <el-tab-pane 
+            :label="item.label" 
+            v-for="item in subTabs.filter(_ => _.key!==4)" 
+            :key="item.key" 
+            :name="String(item.key)"
+          ></el-tab-pane>
+        </el-tabs>
+        <div class="scroll-cont classify-section">
+          <el-tree
+            :data="classifyList"
+            :props="{
+              label: 'ClassifyName',
+              children: 'Child',
+            }"
+            :expand-on-click-node="false"
+            node-key="ClassifyId"
+            :empty-text="$t('Table.prompt_slogan')"
+          >
+            <div class="classify-item" slot-scope="{ data }">
+              <span>{{data.ClassifyName}}</span>
+
+              <el-dropdown style="margin-right: 10px" @command="handleOperate" trigger="click">
+                <span class="el-dropdown-link  el-dropdown-link-img">
+                    <img src="~@/assets/img/chart_m/Group.png" v-if="data.IsJoinPermission">
+                    <img src="~@/assets/img/chart_m/User.png" v-else>
+                </span>
+                <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item 
+                    :command="{key:'public',data}" 
+                    :style="data.IsJoinPermission === 0 ? 'color:#0052D9' : ''"
+                    class="el-dropdown-menu-item-chat"
+                  >
+                    <!-- 公开 -->{{$t('SystemManage.OperateAuth.label_open')}}
+                  </el-dropdown-item>
+                  <el-dropdown-item
+                    :command="{key:'private',data}" 
+                    :style="data.IsJoinPermission === 1 ? 'color:#0052D9' : ''"
+                  >
+                    <!-- 私密 -->{{$t('SystemManage.OperateAuth.label_secret')}}
+                  </el-dropdown-item>
+                </el-dropdown-menu>
+              </el-dropdown>
+            </div>
+          </el-tree>
+        </div>
+    </div>
+
+    <div class="dia-bot">
+      <el-button type="primary" style="margin-right:20px" @click="setSecretHandle">{{$t('Dialog.confirm_btn')}}</el-button>
+      <el-button type="primary" plain @click="cancelHandle">{{$t('Dialog.cancel_btn')}}</el-button>
+    </div>
+
+  </el-dialog>
+</template>
+<script>
+import { operateAuthInterface } from '@/api/modules/setApi';
+export default {
+  props: {
+    isShow: {
+      type: Boolean
+    },
+    tabs: {
+      type: Array
+    },
+    subTabs: {
+      type: Array
+    },
+  },
+  watch: {
+    isShow(nval) {
+      if(!nval) return
+
+      this.getClassifyList()
+    }
+  },
+  data() {
+    return {
+      currentTab: 3,
+      currentSubTab: '2',
+      classifyList: []
+    }
+  },
+  mounted(){
+  },
+  methods:{
+    
+    /* 获取分类列表 */
+    getClassifyList() {
+
+      operateAuthInterface.getClassificationBySource({
+        Source: Number(this.currentTab),
+        SubSource: Number(this.currentTab) === 6 ? Number(this.currentSubTab) : 0
+      }).then(res => {
+        if(res.Ret == 200){
+          this.classifyList = res.Data.List || []
+          //如果是三级分类,去掉最后一级分类的child
+          this.filterNodes(this.classifyList)
+        }
+      })
+    },
+    filterNodes(arr) {
+        arr.length && arr.forEach(item => {
+            item.Child && item.Child.length && this.filterNodes(item.Child)
+            if(item.Child && !item.Child.length) {
+                delete item.Child
+            }
+        })
+    },
+
+    handleOperate({key,data}) {
+      data.IsJoinPermission = key==='private' ? 1 : 0;
+    },
+
+    async setSecretHandle() {
+      let ClassifyIdList = this.findSecretArr()
+      const res = await operateAuthInterface.setPermissionClassify({
+        Source: Number(this.currentTab),
+        SubSource: Number(this.currentTab)===6?Number(this.currentSubTab):0,
+        ClassifyIdList
+      })
+
+      if(res.Ret !== 200) return 
+      this.$message.success(/* '设置成功' */this.$t('SystemManage.OperateAuth.set_success'))
+    },
+
+    //找出设置私密的所有分类
+    findSecretArr() {
+      let arr = []
+
+      function traverse(node) {
+        if (node.IsJoinPermission === 1) {
+          arr.push(node);
+        }
+
+        if (node.Child && node.Child.length) {
+          node.Child.forEach(child => {
+            traverse(child);
+          });
+        }
+      }
+
+      this.classifyList.forEach(item => {
+        traverse(item);
+      });
+      // console.log(arr)
+
+      return arr.map(_ => _.ClassifyId)
+    },
+
+    cancelHandle() {
+      this.currentTab = 3
+      this.$emit('update:isShow',false)
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.scroll-cont {
+    padding: 15px;
+    border: 1px solid #ddd;
+    border-radius: 4px;
+    overflow-y: auto;
+  }
+
+.classify-section{
+  max-height: 250px;
+}
+
+.classify-item {
+  flex: 1;
+  display: flex;
+  justify-content: space-between;
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin: 30px 0;
+}
+</style>

+ 825 - 0
src/views/system_manage/dataOperaAuth.vue

@@ -0,0 +1,825 @@
+<template>
+  <div class="operate-auth-box">
+    <div class="header">
+      <div>
+        <el-select
+          v-model="currAuthSet"
+          @change="changeSet"
+        >
+          <el-option :label="$t('SystemManage.OperateAuth.set_assets_tab')" :value="1"/>
+          <el-option :label="$t('SystemManage.OperateAuth.set_data_tab')" :value="2"/>
+        </el-select>
+        <el-cascader
+          v-model="searchForm.user"
+          :options="userList"
+          :props="{
+            value: 'ItemId',
+            label: 'ItemName',
+            children: 'Children',
+            emitPath: false
+          }"
+          collapse-tags
+          :show-all-levels="false"
+          clearable
+          @change="()=>{ filterChange();getUserDataCount();}"
+          filterable
+          :placeholder="this.$t('SystemManage.OperateAuth.placeholder04')" 
+          style="margin: 0 20px"
+        />
+      </div>
+
+      <div>
+        <el-button 
+          type="primary" 
+          @click="transferAuthHandle({},'all')" 
+          v-if="currAuthSet===1&&authBtn('operateAuth_transfer_all')"
+        ><!-- 全量资产转移 -->{{$t('SystemManage.OperateAuth.transfer_all_btn')}}</el-button>
+        <template v-if="currAuthSet===2">
+
+          <el-tooltip effect="dark" placement="right" v-if="authBtn('operateAuth_set_classifySercet')">
+            <div
+              slot="content"
+              v-html="$i18n.locale==='en'?ruleTips.classifySetEn:ruleTips.classifySet "
+              style="line-height: 20px;width:300px"
+            ></div>
+            <i class="el-icon-warning" style="color: #666" />
+          </el-tooltip>
+          
+          <el-button 
+            type="primary" 
+            @click="setMenuSecretHandle"
+            v-if="authBtn('operateAuth_set_classifySercet')"
+          >
+            <!-- 分类加密设置 -->{{$t('SystemManage.OperateAuth.classify_secret_btn')}}
+          </el-button>
+
+          <el-button 
+            type="primary" 
+            @click="setAuthHandle({},'classify')"
+            v-if="authBtn('operateAuth_set_classifySet')"
+          >
+            <!-- 按分类设置权限 -->{{$t('SystemManage.OperateAuth.classify_set_btn')}}
+          </el-button>
+        </template>
+        <el-button 
+          type="primary"
+          v-if="authBtn(currAuthSet===1?'operateAuth_transfer_batch':'operateAuth_set_batch')"
+          @click="()=>{ currAuthSet===1 ? transferAuthHandle({},'multiple') : setAuthHandle({},'multiple') }"
+        >
+          <!-- 批量设置 -->{{$t('SystemManage.OperateAuth.btn_text01')}}
+        </el-button>
+      </div>
+    </div>
+
+    <div class="main">
+
+      <ul class="tab-wrapper">
+        <li :class="['tab-li',{act: default_tab===item.key}]" v-for="item in tabs" :key="item.key" @click="changeTab(item)">
+          {{item.label}}
+
+          <div style="margin-top:20px;color: #666;" v-if="statisticCountMap[item.key]"><!-- 数量: -->{{$t('SystemManage.OperateAuth.label_count')}}:{{statisticCountMap[item.key]}}</div>
+        </li>
+      </ul>
+
+      <el-tabs v-model="default_sub_tab" @tab-click="changeSubTab" v-if="default_tab===6">
+        <el-tab-pane :label="item.label" v-for="item in subTabs" :key="item.key" :name="String(item.key)"></el-tab-pane>
+      </el-tabs>
+
+      <div class="filter-wrapper">
+        <div>
+          <el-input 
+            v-model="searchForm.key_word" 
+            :placeholder="phText" 
+            style="width: 250px;margin-right:20px;"
+            @change="filterChange"
+            clearable
+            >
+            <i slot="prefix" class="el-input__icon el-icon-search"/>
+          </el-input>
+
+          <el-cascader
+            v-model="searchForm.classifys"
+            :options="classifyOption"
+            :props="{
+              value: 'ClassifyId',
+              label: 'ClassifyName',
+              children: 'Child',
+              emitPath: true,
+              multiple:true
+            }"
+            collapse-tags
+            :show-all-levels="false"
+            :key="classifysOptKey"
+            clearable
+            filterable
+            @change="filterChange"
+            :placeholder="this.$t('SystemManage.OperateAuth.placeholder03')" 
+            style="width: 250px;"
+          />
+          
+        </div>
+
+        <div>
+          <span>{{$t('SystemManage.OperateAuth.label_checked')}}:{{ isSelectAll ? (total-filterDuplicateChecked.length) : filterDuplicateChecked.length }}</span>
+          <el-checkbox 
+            v-model="searchForm.checkAll"
+            :indeterminate="searchForm.checkSome"
+            :disabled="tableData.length===0"
+            style="margin-left:20px" 
+            @change="listCheckAllChange"
+          ><!-- 列表全选 -->{{$t('SystemManage.OperateAuth.all_select')}}</el-checkbox>
+        </div>
+      </div>
+
+      <el-table
+        :data="tableData"
+        ref="table"
+        element-loading-text="加载中..."
+        v-loading="tableLoading"
+        border
+        style="margin:20px 0"
+        @selection-change="selectionChange"
+        @select="selectHandle" 
+        @select-all="selectAllPageHandle"
+      >
+          <el-table-column
+            type="selection"
+            width="55"
+          />
+          <el-table-column
+            v-for="item in tableColums"
+            :key="item.label"
+            :label="item.label"
+            :prop="item.key"
+            :width="item.widthsty"
+            :min-width="item.minwidthsty"
+            align="center"
+          >
+            <template slot-scope="{row}">
+              <template v-if="item.key==='handle'">
+                <span 
+                  class="editsty" 
+                  @click="() => {currAuthSet===1 ? transferAuthHandle(row) : setAuthHandle(row)}"
+                  v-if="authBtn(currAuthSet===1?'operateAuth_transfer_one':'operateAuth_set_one')"
+                >
+                  <!-- 编辑 -->{{$t('Dialog.title_prefix_edit')}}
+                </span>
+              </template>
+
+              <span v-else>{{ row[item.key] }}</span>
+            </template>
+          </el-table-column>
+          
+          <div slot="empty" style="padding: 100px 0">
+            <tableNoData :text="$t('Table.prompt_slogan')" size="mini"/>
+          </div>
+      </el-table>
+      <div style="height:35px;margin: 20px 0;">
+        <m-page
+          :page_no="page_no"
+          :pageSize="pageSize"
+          :total="total"
+          @handleCurrentChange="pageChange"
+        />
+      </div>
+
+    </div>
+
+    <!-- 资产转移弹窗 -->
+    <m-dialog
+      :show.sync="isTransferDia"
+      width="650px"
+      :title="transferTitMap[transferForm.type]"
+      @close="isTransferDia = false"
+    >
+      <div class="dialog-main operateauth-dialog-cont">
+        <el-form
+          ref="formRef"
+          label-position="left"
+          hide-required-asterisk
+          label-width="110px"
+          :model="transferForm"
+          @close="cancelTransfer"
+        >
+          <!-- 原创建人 -->
+          <el-form-item :label="$t('SystemManage.OperateAuth.original_creator')" v-if="transferForm.type!=='multiple'">
+            <span v-if="transferForm.type==='single'">{{ transferForm.creatorName }}</span>
+            
+            <el-cascader
+              v-else-if="transferForm.type==='all'"
+              v-model="transferForm.creatorIds"
+              :options="userList"
+              :props="{
+                value: 'ItemId',
+                label: 'ItemName',
+                children: 'Children',
+                emitPath: false,
+                multiple:true
+              }"
+              collapse-tags
+              :show-all-levels="false"
+              clearable
+              filterable
+              :placeholder="this.$t('SystemManage.OperateAuth.placeholder04')"
+              style="width: 250px"
+            />
+          </el-form-item>
+
+          <el-form-item :label="$t('SystemManage.OperateAuth.new_creator')" prop="newUser" :rules="[
+              { required: true, message: this.$t('SystemManage.OperateAuth.placeholder05'), trigger: 'change' }
+            ]"
+          >
+            <el-cascader
+              v-model="transferForm.newUser"
+              :options="userList"
+              :props="{
+                value: 'ItemId',
+                label: 'ItemName',
+                children: 'Children',
+                emitPath: false,
+              }"
+              collapse-tags
+              :show-all-levels="false"
+              clearable
+              filterable
+              :placeholder="$t('SystemManage.OperateAuth.placeholder04')" 
+              style="width: 250px"
+            />
+          </el-form-item>
+
+          <el-form-item :label="$t('SystemManage.OperateAuth.label_assets')" prop="assetTypes" v-if="transferForm.type==='all'">
+            <el-select v-model="transferForm.assetTypes" multiple style="width: 250px">
+              <el-option v-for="item in tabs" :key="item.key" :value="item.key" :label="item.label"/>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="dia-bot">
+        <el-button
+          type="primary"
+          style="margin-right: 60px"
+          @click="confirmTransferHandle"
+          >{{$t('Dialog.confirm_save_btn')}}</el-button
+        >
+        <el-button type="primary" plain @click="cancelTransfer"
+          >{{$t('Dialog.cancel_btn')}}</el-button
+        >
+      </div>
+    </m-dialog>
+
+    <!-- 权限设置弹窗 -->
+    <opearAuthSetDia
+      :isShow.sync="isSetAuthDia"
+      :userList="userList"
+      :tabs="tabs"
+      :subTabs="subTabs"
+      :form="authForm"
+    />
+
+    <!-- 分类私密设置 -->
+    <setClassifySecretDia
+      :isShow.sync="isSetClassifySecret"
+      :tabs="tabs"
+      :subTabs="subTabs"
+    />
+  </div>
+</template>
+<script>
+import { operateAuthInterface,departInterence } from '@/api/modules/setApi';
+import {dataAuthInterface} from '@/api/modules/dataApi.js'
+import mPage from '@/components/mPage.vue';
+import mDialog from '@/components/mDialog.vue'
+import opearAuthSetDia from './components/opearAuthSetDia.vue';
+import setClassifySecretDia from './components/setClassifySecretDia.vue';
+export default {
+  components: { mPage,mDialog,opearAuthSetDia,setClassifySecretDia },
+  computed: {
+    tabs(){
+      const tabs = [
+        { label: this.$t('SystemManage.OperateAuth.tab01'), key: 1 },
+        { label: this.$t('SystemManage.OperateAuth.tab02'), key: 2 },
+        { label: this.$t('SystemManage.OperateAuth.tab03'), key: 3 },
+        { label: this.$t('SystemManage.OperateAuth.tab04'), key: 4 },
+        { label: this.$t('SystemManage.OperateAuth.tab05'), key: 5 },
+        { label: this.$t('SystemManage.OperateAuth.tab06'), key: 6 },
+      ]
+      return this.currAuthSet===1 ? tabs : tabs.filter(item => [3,4,5,6].includes(item.key))
+    },
+    subTabs() {
+      const subTabs = [
+        { label: /* '自定义分析' */this.$t('SystemManage.OperateAuth.tab_sub_sheet1'), key: 4 },
+        { label:/*  '时间序列表格' */this.$t('SystemManage.OperateAuth.tab_sub_sheet2'), key: 2 },
+        { label: /* '混合表格' */this.$t('SystemManage.OperateAuth.tab_sub_sheet3'), key: 3 },
+      ]
+
+      return this.currAuthSet===1 ? subTabs : subTabs.filter(_ => _.key!==4)
+    },
+    tableColums() {
+      const clomusMap = {
+        5: [
+            { label: this.$t('SystemManage.OperateAuth.table_col_name01'),key: 'Name' },
+            { label: this.$t('SystemManage.OperateAuth.table_col_name02'),key: 'ClassifyName' },
+            { label: this.$t('SystemManage.OperateAuth.table_col_name03'),key: 'CreateUserName' },
+            { label: this.$t('Table.column_operations'),key: 'handle' },
+          ],
+        6: [
+            { label: this.$t('SystemManage.OperateAuth.table_col_sheet_name'),key: 'Name' },
+            { label: this.$t('SystemManage.OperateAuth.table_col_sheet_menu'),key: 'ClassifyName' },
+            { label: this.$t('SystemManage.OperateAuth.table_col_name03'),key: 'CreateUserName' },
+            { label: this.$t('Table.column_operations'),key: 'handle' },
+          ],
+      }
+      return clomusMap[this.default_tab] ? clomusMap[this.default_tab] 
+        : [
+          { label: this.$t('SystemManage.OperateAuth.table_col_name04'),key: 'Code' },
+          { label: this.$t('SystemManage.OperateAuth.table_col_name05'),key: 'Name' },
+          { label: this.$t('SystemManage.OperateAuth.table_col_name03'),key: 'CreateUserName' },
+          { label: this.$t('Table.column_operations'),key: 'handle' },
+        ]
+    },
+
+    phText() {
+      const textMap = {
+        5: this.$t('SystemManage.OperateAuth.placeholder01'),
+        6: this.$t('SystemManage.OperateAuth.placeholder_sheet')
+      }
+      return textMap[this.default_tab] ? textMap[this.default_tab] : this.$t('SystemManage.OperateAuth.placeholder02')
+    },
+
+    filterDuplicateChecked() {
+      return Array.from(new Set(this.checkedList))
+    }
+  },
+
+  data() {
+    return {
+      currAuthSet: 1,//设置资产
+
+      default_tab: 1,
+      default_sub_tab: '4',
+      searchForm: {
+        user: '',
+        key_word: '',
+        classifys:[],
+        checkAll: false, //控制全选显示状态
+        checkSome: false
+      },
+      isSelectAll: false, //真正意义上的全选或不全选
+
+      classifyOption: [],
+      classifysOptKey: 0,
+      userList: [],
+
+      checkedList: [], //不全选勾选中的 或 全选取消勾的
+      selectionReactCancel:false,//手动设置选中中
+
+      tableLoading: false,
+      tableData:[],
+      page_no: 1,
+      total: 0,
+      pageSize: 10,
+      statisticCountMap: {},
+
+      ruleTips: {
+        'classifySet': `
+          1、”分类加密设置“:分类默认公开,分类设置加密后,新增用户默认无加密分类的数据权限。<br>
+          2、按分类设置权限:加密的分类支持开放权限给用户。<br>
+          3、批量设置:同时设置单个或多个数据的权限。
+        `,
+        'classifySetEn': `
+          1. "Classified Encryption Settings": By default, categories are public. Once a category is set to encrypted, new users will not have data permissions for the encrypted category by default.<br>
+          2. "Set Permissions by Category": Encrypted categories support granting access permissions to users.<br>
+          3. "Batch Settings": Set permissions for single or multiple data entries at the same time.
+        `
+      },
+
+      /* 转移弹窗 */
+      isTransferDia: false,
+      transferForm: {
+        type:'',
+        creatorName: '',//创建人姓名
+        creatorIds: [],//创建人id
+        ids:'',
+        newUser: '',
+        assetTypes: []
+      },
+      transferTitMap: {
+        'all': /* '全量资产转移' */ this.$t('SystemManage.OperateAuth.transfer_title1'),
+        'multiple': /* '批量设置资产转移' */this.$t('SystemManage.OperateAuth.transfer_title2'),
+        'single':/*  '设置资产转移' */this.$t('SystemManage.OperateAuth.transfer_title3'),
+      },
+
+      /* 设置权限弹窗 */
+      isSetAuthDia: false,
+      authForm: {
+        type:'',//分类设置 批量设置 单设置
+        ids:[],
+      },
+
+      /* 设置加密分类弹窗 */
+      isSetClassifySecret: false,
+    }
+  },
+  mounted(){
+    this.getClassifyList()
+    this.getUserList();
+    this.getTableData()
+  },
+  methods:{
+
+    /* 获取分类列表 */
+    getClassifyList() {
+      if(!this.default_tab) return
+
+      operateAuthInterface.getClassificationBySource({
+        Source: this.default_tab,
+        SubSource: this.default_tab === 6 ? Number(this.default_sub_tab) : 0
+      }).then(res => {
+        if(res.Ret == 200){
+          this.classifyOption = res.Data.List || []
+          //如果是三级分类,去掉最后一级分类的child
+          if([3,4,5,6].includes(this.default_tab)){
+            this.filterNodes(this.classifyOption)
+          }
+          ++this.classifysOptKey;
+        }
+      })
+    },
+    filterNodes(arr) {
+        arr.length && arr.forEach(item => {
+            item.Child && item.Child.length && this.filterNodes(item.Child)
+            if(item.Child && !item.Child.length) {
+                delete item.Child
+            }
+        })
+    },
+
+     /* 获取用户列表 */
+    async getUserList() {
+      
+      const res = await dataAuthInterface.userSearch();
+      if (res.Ret !== 200) return
+      
+      this.userList = res.Data || []
+    },
+
+    /* 获取用户的资产数量 */
+    async getUserDataCount() {
+      if(!this.searchForm.user){
+        this.statisticCountMap = {}
+        return
+      }
+
+      const res = await operateAuthInterface.getUserStatistic({ UserId: this.searchForm.user,CountType: this.currAuthSet})
+      
+      if(res.Ret !== 200) return
+      this.statisticCountMap = res.Data;
+    },
+    
+    getTableData(type) {
+      if(!this.default_tab) return
+
+      let Classify = Array.from(new Set(this.searchForm.classifys.flat())).join(',')
+
+      this.tableLoading = true;
+      let params = {
+        Source: this.default_tab,
+        UserId: this.searchForm.user || 0,
+        CurrentIndex: this.page_no,
+        PageSize: this.pageSize,
+        Keyword: this.searchForm.key_word,
+        Classify,
+        SubSource: this.default_tab === 6 ? Number(this.default_sub_tab) : 0
+      }
+			operateAuthInterface.list(params).then(res => {
+        this.tableLoading = false;
+        if( res.Ret!==200 )return
+
+        const { Data } = res;
+
+        this.tableData = Data.List || [];
+        this.total = Data.Paging.Totals;
+        
+        if(type==='pageChange'){
+          //页码变化 选中项不做清空
+          this.checkedSomeSelection()
+        }else {
+          this.listCheckAllChange(false)
+
+        }
+			});
+    },
+
+    /* 设置当页数据勾选状态 */
+    checkedSomeSelection() {
+      this.selectionReactCancel=true
+      console.log(this.checkedList,this.isSelectAll)
+      if(!this.isSelectAll){
+          this.checkedList.map(_ =>{
+              let row = this.tableData.find(item => item.DataId==_.DataId)
+              if(row){ //设置部分选中
+                  setTimeout(()=>{
+                      this.$refs.table.toggleRowSelection(row,true)
+                  },20)
+              }
+          })
+      }else{
+          // this.$refs.table && this.$refs.table.clearSelection()
+          this.$refs.table &&this.$refs.table.toggleAllSelection()
+          this.checkedList.map(_ =>{
+              let row = this.tableData.find(item => item.DataId==_.DataId)
+              if(row){ //设置部分不勾选
+                  setTimeout(()=>{
+                      this.$refs.table.toggleRowSelection(row,false)
+                  },20)
+              }
+          })
+      }
+      setTimeout(()=>{
+          this.selectionReactCancel=false
+      },30)
+    },
+
+    /* 切换模块 */
+    changeTab({key}) {
+      this.default_tab = key;
+      this.default_sub_tab = String(this.subTabs[0].key);
+      this.searchForm.classifys=[]
+      this.searchForm.key_word=''
+      this.searchForm.checkAll = false
+
+      this.page_no = 1;
+      this.getClassifyList()
+
+      this.getTableData();
+    },
+
+    changeSubTab() {
+      this.searchForm.classifys=[]
+      this.searchForm.key_word=''
+      this.searchForm.checkAll = false
+
+      this.page_no = 1;
+      this.getClassifyList()
+
+      this.getTableData();
+    },
+
+    changeSet() {
+      this.changeTab({key: this.currAuthSet===1?1:3})
+      this.getUserDataCount()
+    },
+
+    //列表全选或全不选
+    listCheckAllChange(value){
+      this.checkedList = []
+      this.isSelectAll = value
+    
+      value ? this.$refs.table && this.$refs.table.toggleAllSelection() : this.$refs.table && this.$refs.table.clearSelection()
+    },
+
+    //筛选改变
+    filterChange() {
+      this.page_no = 1;
+      this.getTableData()
+    },
+
+    // 页码改变
+    pageChange(page) {
+       this.page_no = page;
+       this.getTableData('pageChange')
+    },
+
+    selectionChange(val) {
+      if(this.selectionReactCancel) return
+        // selectAllHandle的触发在selectionChange后面,将selectionChange的逻辑延迟一下
+        //设置全选框状态 选中 半选 不选
+        setTimeout(()=>{
+            let filterChecked = Array.from(new Set(this.checkedList))
+            //全选
+            if(
+              (filterChecked.length===this.total&&this.total>0 && (!this.isSelectAll))
+                || (filterChecked.length === 0 && this.isSelectAll)
+            ){
+                this.searchForm.checkAll = true
+                this.searchForm.checkSome = false
+            //不选
+            }else if(
+              (filterChecked.length === 0 && (!this.isSelectAll))
+              || (filterChecked.length === this.total && this.isSelectAll)
+            ){
+                this.searchForm.checkAll = false
+                this.searchForm.checkSome = false
+            //半选
+            }else{
+                this.searchForm.checkAll = false
+                this.searchForm.checkSome=true
+            }
+        },1)
+    },
+
+    //单选
+    selectHandle(selection,row){ //当前选中的项是进选中还是取消选中中
+      console.log(selection,row)
+        if(this.selectionReactCancel) return 
+
+        //当前项是选中还是取消选
+        let haveChecked = selection.some(_ => _.DataId === row.DataId);
+
+        //全选取消选和不全选选中才有意义
+        if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+          this.checkedList.push(row)
+        }else {
+          this.checkedList=this.checkedList.filter(_ => _.DataId!==row.DataId)
+        }
+    },
+
+    //整列选
+    selectAllPageHandle(selection){
+        if(this.selectionReactCancel) return 
+        
+        //当前页是选中还是取消
+        let haveChecked = selection && selection.length>0;
+
+        //全选取消选和不全选选中才有意义
+        if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+          this.checkedList = [...this.checkedList,...this.tableData]
+        }else {
+
+          let pageIds = this.tableData.map(_ => _.DataId);
+          this.checkedList = this.checkedList.filter(_ => !pageIds.includes(_.DataId))
+        }
+    },
+
+    /* 转移所属权限 单转 批量转 全量转*/
+    transferAuthHandle({ CreateUserName,DataId },type='single') {
+      if(type === 'multiple' && !this.checkedList.length &&!this.isSelectAll) return this.$message.warning(this.$t('SystemManage.OperateAuth.msg01'))
+
+      this.transferForm = {
+        type,
+        creatorName: type==='single' ?  CreateUserName : '',
+        creatorIds: [],
+        ids:type === 'single' ? [DataId] : this.checkedList.map(_ => _.DataId),
+        newUser: '',
+        assetTypes: this.tabs.map(_=>_.key)
+      }
+      this.isTransferDia = true
+    },
+
+    /* 转移权限 */
+    async confirmTransferHandle() {
+      await this.$refs.formRef.validate()
+
+      //全量转
+      if(this.transferForm.type==='all') return this.transferAllHandle()
+
+      let Classify = Array.from(new Set(this.searchForm.classifys.flat())).join(',')
+
+      //单模块转
+      const res = await operateAuthInterface.authEdit({
+        Source: this.default_tab,
+        SubSource: this.default_tab === 6 ? Number(this.default_sub_tab) : 0,
+        DataIdList: this.isSelectAll ? [] : this.transferForm.ids,
+        NoDataIdList: this.isSelectAll ? this.transferForm.ids : [],
+        NewUserId: Number(this.transferForm.newUser),
+        Keyword:this.searchForm.key_word,
+        UserId:this.searchForm.user||0,
+        Classify,
+        IsSelectAll:this.isSelectAll
+      })
+
+      if(res.Ret !== 200) return
+      this.$message.success(res.Msg);
+
+      this.cancelTransfer();
+      this.getTableData();
+    },
+
+    /* 全量转移 */
+    async transferAllHandle() {
+      if(!this.transferForm.creatorIds.length) return this.$message.warning(/* '请选择原创建人' */this.$t('SystemManage.OperateAuth.old_creator_msg'))
+      
+      if(!this.transferForm.assetTypes.length) return this.$message.warning(/* '请选择要转移资产模块' */)
+
+      const res = await operateAuthInterface.transferAllData({
+        Source: this.transferForm.assetTypes,
+        OldUserId: this.transferForm.creatorIds.map(_ => Number(_)),
+        NewUserId: Number(this.transferForm.newUser)
+      })
+
+      if(res.Ret !== 200) return 
+      this.$message.success(res.Msg);
+
+      this.cancelTransfer();
+      this.getTableData();
+    },
+
+    cancelTransfer() {
+      this.$refs.formRef.resetFields();
+      this.isTransferDia = false
+    },
+
+    /* 设置加密分类 */
+    setMenuSecretHandle() {
+      this.isSetClassifySecret = true
+    },
+
+    /* 设置可见权限 分类设置 单设置 批量设置*/
+    setAuthHandle({ DataId,Name },type='single') {
+      if(type === 'multiple' && !this.checkedList.length&&!this.isSelectAll) return this.$message.warning(this.$t('SystemManage.OperateAuth.msg01'))
+      
+      let checked = type === 'single' ? [ DataId ] : this.checkedList.map(_ => _.DataId)
+
+      let Classify = Array.from(new Set(this.searchForm.classifys.flat())).join(',')
+
+      this.authForm = {
+        type,
+        dataName: Name,
+        params: type!=='classify' ? {
+          Source: this.default_tab,
+          SubSource: this.default_tab === 6 ? Number(this.default_sub_tab) : 0,
+          DataIdList: (this.isSelectAll&&type==='multiple') ? [] : checked,
+          NoDataIdList: (this.isSelectAll&&type==='multiple') ? checked : [],
+          Keyword:this.searchForm.key_word,
+          UserId:this.searchForm.user||0,
+          Classify,
+          IsSelectAll:(this.isSelectAll&&type==='multiple') ? true : false
+        } : null
+      }
+      this.isSetAuthDia = true
+    },
+
+    authBtn(key){
+      const {operateAuthPermission,checkPermissionBtn} = this.permissionBtn
+       
+      return checkPermissionBtn(operateAuthPermission[key])
+    }
+
+  },
+}
+</script>
+<style scoped lang='scss'>
+@import "~@/styles/theme-vars.scss";
+.operate-auth-box {
+  * {
+    box-sizing: border-box;
+  }
+  .header,.main {
+    padding: 20px 30px;
+    background: #fff;
+    position: relative;
+    border: 1px solid #ececec;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+  }
+  .header {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 30px;
+    gap: 10px;
+  }
+  .main {
+    min-height: calc(100vh - 240px);
+    .tab-wrapper {
+      display: flex;
+      gap: 20px;
+      margin-bottom: 20px;
+      .tab-li {
+        width: 16%;
+        height: 90px;
+        background: #ececec;
+        padding: 15px 20px;
+        border-radius: 8px;
+        border: 1px solid transparent;
+        cursor: pointer;
+        &.act {
+          border-color: $theme-color;
+          background: #e6eefb;
+        }
+      }
+    }
+
+    .filter-wrapper {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+    }
+  }
+}
+.dialog-main {
+  padding-left: 110px;
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+  margin-top: 50px;
+}
+</style>
+<style lang="scss">
+.operateauth-dialog-cont .el-input {
+  width: 100%;
+}
+.operate-auth-box .el-tabs__nav-wrap::after {
+  background: transparent;
+}
+</style>

+ 5 - 0
src/vuex/modules/permissionButton.js

@@ -34,6 +34,11 @@ const permissionButtons = {
                 commit('SET_PERMISSION_BUTTONS',buttons)
                 resolve('获取权限按钮成功') */
             })
+        },
+        getPermissionButtonsOld({commit}){
+            const permissionList = JSON.parse(sessionStorage.getItem('permissionBtn'))||[]
+            commit('SET_PERMISSION_BUTTONS',permissionList)
+            sessionStorage.removeItem('permissionBtn')
         }
     },
     getters:{}

Some files were not shown because too many files changed in this diff