浏览代码

设置数据权限

Karsa 1 年之前
父节点
当前提交
f3eeeecdd5

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

@@ -529,6 +529,63 @@ const operateAuthInterface = {
 	 */
 	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)
 	}
 }
 

+ 173 - 40
src/components/notificationMsg.vue

@@ -1,52 +1,155 @@
 <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')}(${UnreadTotal})`" name="first"></el-tab-pane>
+                    <el-tab-pane :label="`资产数据`" 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">{{item.Remark||''}}&nbsp;</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="UnreadTotal">{{UnreadTotal>99?'99+':UnreadTotal}}</div>
+            </span>
+        </el-popover>
+        
+        <m-dialog
+            :show.sync="isOpenAuthDia"
+            width="650px"
+            title="权限变更详情"
+            @close="isOpenAuthDia = false"
+        >
+            <div class="notice-auth-box">
+                <div class="main">
+
+                    <div class="left">
+                        <ul class="data-types">
+                            <li v-for="item in tabs" :key="item.key">{{item.label}}</li>
+                        </ul>
+                    </div>
+
+                    <div class="right">
+                        <label>ETA指标库</label>
+
+                        <el-table
+                            :data="tableData"
+                            ref="table"
+                            element-loading-text="加载中..."
+                            v-loading="tableLoading"
+                            border
+                            style="margin:20px 0"
+                        >
+                            <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"
+                    style="margin-right: 60px"
+                    @click="confirmTransferHandle"
+                    >{{$t('Dialog.confirm_save_btn')}}</el-button
+                    >
+                    <el-button type="primary" plain @click="isOpenAuthDia"
+                    >{{$t('Dialog.cancel_btn')}}</el-button
+                    >
+                </div>
+            </div>
+        </m-dialog>
+    </div>
 </template>
 
 <script>
 import {approveInterence} from '@/api/modules/approve.js';
+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,
+
+            //详情弹窗
+            isOpenAuthDia: false,
+            detailInfo: {
+                type: 1
+            }
         };
     },
+    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
+        },
+        tableColums() {
+            const clomusMap = {
+                5: [
+                    { label: this.$t('SystemManage.OperateAuth.table_col_name01'),key: 'Name' },
+                    { label: '操作时间',key: 'UpdateTime' },
+                ],
+                6: [
+                    { label: this.$t('SystemManage.OperateAuth.table_col_sheet_name'),key: 'Name' },
+                    { label: '操作时间',key: 'UpdateTime' },
+                ],
+            }
+            return clomusMap[this.detailInfo.type] ? clomusMap[this.detailInfo.type] 
+                : [
+                    { label: this.$t('SystemManage.OperateAuth.table_col_name05'),key: 'Name' },
+                    { label: '操作时间',key: 'UpdateTime' },
+                ]
+        },
+    },
     watch:{
         visible(val){
             if(val){
@@ -72,15 +175,17 @@ export default {
                 }
             })
         },
-        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
-            })
+        async getMsgList(){
+            let res = this.activeName === 'first' 
+                ? await approveInterence.getApproveMsgList({
+                    CurrentIndex:1,
+                    PageSize:1000
+                })
+                :  null
+
+            if(res.Ret!==200) return 
+            this.msgList = res.Data.List||[]
+            this.UnreadTotal = res.Data.UnreadTotal||0
         }
     }
 };
@@ -143,4 +248,32 @@ export default {
         font-size: 12px;
     }
 }
-</style>
+.notice-auth-box {
+    .main {
+        display: flex;
+        .left {
+            flex-shrink: 0;
+            margin-right: 10px;
+            .data-types {
+                li {
+                    padding: 5px 0;
+                    margin-bottom: 10px;
+
+                    border-bottom: 1px solid transparent;
+                    &.act {
+                        border-color: #0052D9;
+                    }
+                }
+            }
+        }
+        .right {
+            flex: 1;
+        }
+    }
+    .dia-bot {
+        display: flex;
+        justify-content: center;
+        margin-top: 30px;
+    }
+}
+</style>

+ 5 - 5
src/lang/modules/systemManage/OperateAuth.js

@@ -57,8 +57,8 @@ export const OperateAuthEn = {
 
     /* 转移弹窗 */
     transfer_title1:'Full Asset Transfer',
-    transfer_title1:'Bulk Asset Transfer Setup',
-    transfer_title1:'Set Asset Transfer',
+    transfer_title2:'Bulk Asset Transfer Setup',
+    transfer_title3:'Set Asset Transfer',
 
     /* 分类加密弹窗 */
     label_open:'Public',
@@ -106,7 +106,7 @@ export const OperateAuthZh = {
     permission_title02:'批量权限设置',
     invisible_users:'不可见用户',
     permission_confirm_msg:'是否确认删除该用户的不可见权限?',
-    set_success:'置成功',
+    set_success:'置成功',
     placeholder05:'新创建人不能为空',
 
     
@@ -125,8 +125,8 @@ export const OperateAuthZh = {
 
     /* 转移弹窗 */
     transfer_title1:'全量资产转移',
-    transfer_title1:'批量设置资产转移',
-    transfer_title1:'设置资产转移',
+    transfer_title2:'批量设置资产转移',
+    transfer_title3:'设置资产转移',
 
     /* 分类加密弹窗 */
     label_open:'公开',

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

@@ -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) {

+ 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" :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=''){

+ 87 - 87
src/views/predictEdb_manage/predictEdb.vue

@@ -199,97 +199,93 @@
 				<!-- 详情 -->
 				<div class="edb-detail-wrapper main-min-width" v-if="select_id&&!showAssociateChart&&!showAssociateComputeData">
 
-					<!-- 有指标权限 -->
-					<template>
-						<div class="detail-header">
-							<el-tabs v-model="activeTab" @tab-click="changeShowType">
-								<el-tab-pane :label="$t('Edb.trend_chart_tab')" name="Chart">
-								</el-tab-pane>
-								<el-tab-pane :label="$t('Edb.data_detail_tab')" name="Data">
-								</el-tab-pane>
-							</el-tabs>
-							<div class="edb-tool-icon edb-tool" style="align-items: center;">
-								<el-button 
-									v-permission="permissionBtn.predictEdbPermission.edbPreData_update"
-									type="text" 
-									@click="updateEdbPartHandle"
-								><!-- 刷新 -->{{$t('Edb.detail_refresh_btn')}}</el-button>
-								<el-button 
-									type="text" 
-									@click="editEdbHandle('')" 
-									v-if="edbButton.OpButton&&isEdbBtnShow('edbPreData_edit')"
-								><!-- 编辑 -->{{$t('Edb.detail_edit_btn')}}</el-button>
-								<el-button 
-									type="text" 
-									@click="saveEdbHandle" 
-									v-if="detail_show_chart&&isEdbBtnShow('edbPreData_save')"
-								><!-- 保存 -->{{$t('Edb.detail_save_btn')}}</el-button>
-								<el-button 
-									v-permission="permissionBtn.predictEdbPermission.edbPreData_edbSource"
-									type="text" 
-									@click="toHistoryPage(select_id,$route.matched);lookEdbId=select_id"
-								><!-- 指标溯源 -->{{$t('Edb.detail_trace_btn')}}</el-button>
-
-								<el-popover 
-									v-if="showPopover"
-									placement="bottom-end" 
-									trigger="hover"
-									popper-class="edb-tool-popover"
-									width="300" style="display: inline-block;"
-								>
-									<div class="edb-tool-wrap">
-										<el-button 
-											v-permission="permissionBtn.predictEdbPermission.edbPreData_enNameSetting"
-											type="text" 
-											@click="clickEdbNameHandle" 
-											v-if="currentLang==='ch'||!edb_nameEn"
-										>
-											{{$t('Edb.detail_en_btn')}}<!-- 设置英文名称 -->
-										</el-button>
-										<el-button 
-											v-permission="permissionBtn.predictEdbPermission.edbPreData_recalcu"
-											type="text" 
-											@click="updateEdbHandle"
-										>{{$t('Edb.detail_recalculate_btn')}}<!-- 重新计算 --></el-button>
-										<el-button 
-											class="deletesty" 
-											@click="delEdbHandle" 
-											type="text"
-											v-if="edbButton.DeleteButton&&isEdbBtnShow('edbPreData_del')"
-										>{{$t('Edb.detail_del_btn')}}<!-- 删除 --></el-button>
-										<el-button 
-											v-permission="permissionBtn.predictEdbPermission.edbPreData_copyData"
-											type="text" 
-											@click="copyData"
-										>{{$t('Edb.detail_copydata_btn')}}<!-- 复制数据 --></el-button>
-									</div>
-									<div class="edb-btn" slot="reference">
-										<el-button type="text">{{$t('Edb.detail_more_btn')}}<!-- 更多操作 --></el-button>
-										<i class="el-icon-more" style="font-size: 14px;transform: rotate(90deg);cursor: pointer;color: #3375e1;"/>
-									</div>
-								</el-popover>
-							</div>
+					<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>
+							<el-tab-pane :label="$t('Edb.data_detail_tab')" name="Data">
+							</el-tab-pane>
+						</el-tabs>
+						<div class="edb-tool-icon edb-tool" style="align-items: center;">
+							<el-button 
+								v-permission="permissionBtn.predictEdbPermission.edbPreData_update"
+								type="text" 
+								@click="updateEdbPartHandle"
+							><!-- 刷新 -->{{$t('Edb.detail_refresh_btn')}}</el-button>
+							<el-button 
+								type="text" 
+								@click="editEdbHandle('')" 
+								v-if="edbButton.OpButton&&isEdbBtnShow('edbPreData_edit')"
+							><!-- 编辑 -->{{$t('Edb.detail_edit_btn')}}</el-button>
+							<el-button 
+								type="text" 
+								@click="saveEdbHandle" 
+								v-if="detail_show_chart&&isEdbBtnShow('edbPreData_save')"
+							><!-- 保存 -->{{$t('Edb.detail_save_btn')}}</el-button>
+							<el-button 
+								v-permission="permissionBtn.predictEdbPermission.edbPreData_edbSource"
+								type="text" 
+								@click="toHistoryPage(select_id,$route.matched);lookEdbId=select_id"
+							><!-- 指标溯源 -->{{$t('Edb.detail_trace_btn')}}</el-button>
+
+							<el-popover 
+								v-if="showPopover"
+								placement="bottom-end" 
+								trigger="hover"
+								popper-class="edb-tool-popover"
+								width="300" style="display: inline-block;"
+							>
+								<div class="edb-tool-wrap">
+									<el-button 
+										v-permission="permissionBtn.predictEdbPermission.edbPreData_enNameSetting"
+										type="text" 
+										@click="clickEdbNameHandle" 
+										v-if="currentLang==='ch'||!edb_nameEn"
+									>
+										{{$t('Edb.detail_en_btn')}}<!-- 设置英文名称 -->
+									</el-button>
+									<el-button 
+										v-permission="permissionBtn.predictEdbPermission.edbPreData_recalcu"
+										type="text" 
+										@click="updateEdbHandle"
+									>{{$t('Edb.detail_recalculate_btn')}}<!-- 重新计算 --></el-button>
+									<el-button 
+										class="deletesty" 
+										@click="delEdbHandle" 
+										type="text"
+										v-if="edbButton.DeleteButton&&isEdbBtnShow('edbPreData_del')"
+									>{{$t('Edb.detail_del_btn')}}<!-- 删除 --></el-button>
+									<el-button 
+										v-permission="permissionBtn.predictEdbPermission.edbPreData_copyData"
+										type="text" 
+										@click="copyData"
+									>{{$t('Edb.detail_copydata_btn')}}<!-- 复制数据 --></el-button>
+								</div>
+								<div class="edb-btn" slot="reference">
+									<el-button type="text">{{$t('Edb.detail_more_btn')}}<!-- 更多操作 --></el-button>
+									<i class="el-icon-more" style="font-size: 14px;transform: rotate(90deg);cursor: pointer;color: #3375e1;"/>
+								</div>
+							</el-popover>
 						</div>
+					</div>
 
-						<!--  -->
-						<div class="detail-wrap">
+					<!--  -->
+					<div class="detail-wrap">
+						
+						<component 
+							:is="detail_show_chart?'edbDetail':'childData'"
+							:id="select_id"
+							:lang="currentLang" 
+							:isAllowEditLimit="isEdbBtnShow('edbPreData_editLimit')"
+							ref="detailComponentRef"
 							
-							<component 
-								:is="detail_show_chart?'edbDetail':'childData'"
-								:id="select_id"
-								:lang="currentLang" 
-								:isAllowEditLimit="isEdbBtnShow('edbPreData_editLimit')"
-								ref="detailComponentRef"
-								
-								@updateTit="setNameBack"
-								@setCurrentClassify="setCurrentClassify"
-								@setOpera="(obj) => { edbButton = obj }"
-								@openEnNameDia="openEnNameDia"
-							/>
-						</div>
-					</template>
+							@updateTit="setNameBack"
+							@setCurrentClassify="setCurrentClassify"
+							@setOpera="({button,detail}) => { edbButton = button;predictEdbInfo=detail }"
+							@openEnNameDia="openEnNameDia"
+						/>
+					</div>
 
-					<!-- <noDataAuth v-else :text="$t('MsgPrompt.no_edb_auth')"/> -->
 				</div>
 
 				<!-- 列表 -->
@@ -680,6 +676,8 @@ export default {
 			showAssociateComputeData:false,//显示指标关联的引用计算指标
 
 			activeTab:'',
+
+			predictEdbInfo: {},
 		};
 	},
 	computed: {
@@ -720,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){

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

@@ -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=[]

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

@@ -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=[]

+ 93 - 21
src/views/system_manage/components/opearAuthSetDia.vue

@@ -12,16 +12,20 @@
   >
     <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: 'AdminId',
-            label: 'RealName',
-            children: 'ChildrenList',
+            value: 'ItemId',
+            label: 'ItemName',
+            children: 'Children',
+            emitPath: false,
             multiple: true,
-            emitPath: false
           }"
           collapse-tags
           :show-all-levels="false"
@@ -32,7 +36,7 @@
           style="width:300px"
         />
 
-        <div class="checked-user scroll-cont" :style="`height:${form.type==='classify'?100:240}px`">
+        <div class="checked-user scroll-cont" :style="`height:${form.type==='classify'?100:210}px`">
           <el-tag
             v-for="tag in selectUserList"
             :key="tag.label"
@@ -65,12 +69,17 @@
         <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>
@@ -106,8 +115,9 @@ export default {
   watch: {
     isShow(nval) {
       if(!nval) return
-        
+      
       this.form.type==='classify'&&this.getClassifyList()
+      this.form.type==='single'&& this.getDataAuthUser()
     }
   },
   data() {
@@ -117,8 +127,8 @@ export default {
 
       titleMap: {
         'classify': /* '按分类设置权限' */this.$t('SystemManage.OperateAuth.classify_set_btn'),
-        'multiple': /* '批量设置数据权限' */this.$t('SystemManage.OperateAuth.classify_set_btn'),
-        'single': /* '设置数据权限' */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,
@@ -140,7 +150,7 @@ export default {
 
       operateAuthInterface.getClassificationBySource({
         Source: Number(this.currentTab),
-         SubSource: Number(this.currentTab) === 6 ? Number(this.currentSubTab) : 0
+        SubSource: Number(this.currentTab) === 6 ? Number(this.currentSubTab) : 0
       }).then(res => {
         if(res.Ret == 200){
           this.classifyList = res.Data.List || []
@@ -158,24 +168,50 @@ export default {
         })
     },
 
-    /* 选中分类 */
-    checkClassify(a,b,c) {
-
-      console.log(a,b,c)
-      console.log(this.$refs.clssifyTreeRef.getCheckedNodes(false,true))
-    },
-
     /* 选择用户 */
     checkUser() {
       let selectUser = this.$refs.userRef.getCheckedNodes(true);
-
       let arr = []
-      arr = selectUser.length&&selectUser.map(_ => ({
+      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
+
+      res.Data && this.$nextTick(() => {
+        this.$refs.clssifyTreeRef.setCheckedKeys(res.Data)
+      })
+    },
+
+    /* 获取数据的权限用户 */
+    async getDataAuthUser() {
+      const res = await operateAuthInterface.getAuthUserByData({
+        Source: Number(this.currentTab),
+        SubSource: Number(this.currentTab) === 6 ? Number(this.currentSubTab) : 0,
+        DataId: Number(this.form.params.DataIdList[0])
+      })
+
+      if(res.Ret !== 200) return
+
+      if(res.Data && res.Data.length){
+        this.selectUserIds = res.Data
+        this.$nextTick(() => {
+          this.checkUser()
+        })
+      }
     },
 
     removeUser(val) {
@@ -185,14 +221,50 @@ export default {
       this.selectUserIds = this.selectUserIds.filter(_ => _!==val)
     },
 
-    saveHandle() {
+    async saveHandle() {
       if(!this.selectUserIds.length) return this.$message.warning(/* '请选择用户' */this.$t('SystemManage.OperateAuth.placeholder04'))
+
+      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)
+
+      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)
+
+      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)
     }

+ 51 - 9
src/views/system_manage/components/setClassifySecretDia.vue

@@ -36,25 +36,27 @@
             }"
             :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="handleCommand" trigger="click">
+              <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="item.IsPublic === 0"> -->
-                    <img src="~@/assets/img/chart_m/User.png">
+                    <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:'own',data}" 
-                    :class="data.IsPublic === 0 ? 'el-dropdown-menu-item-chat-act' : ''"
+                    :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 
-                    class="el-dropdown-menu-item-chat"
+                  <el-dropdown-item
+                    :command="{key:'private',data}" 
+                    :style="data.IsJoinPermission === 1 ? 'color:#0052D9' : ''"
                   >
                     <!-- 私密 -->{{$t('SystemManage.OperateAuth.label_secret')}}
                   </el-dropdown-item>
@@ -66,7 +68,7 @@
     </div>
 
     <div class="dia-bot">
-      <el-button type="primary" style="margin-right:20px" @click="cancelHandle">{{$t('Dialog.confirm_btn')}}</el-button>
+      <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>
 
@@ -127,6 +129,46 @@ export default {
         })
     },
 
+    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)
@@ -143,7 +185,7 @@ export default {
   }
 
 .classify-section{
-  max-height: 200px;
+  max-height: 250px;
 }
 
 .classify-item {

+ 36 - 20
src/views/system_manage/dataOperaAuth.vue

@@ -13,9 +13,9 @@
           v-model="searchForm.user"
           :options="userList"
           :props="{
-            value: 'AdminId',
-            label: 'RealName',
-            children: 'ChildrenList',
+            value: 'ItemId',
+            label: 'ItemName',
+            children: 'Children',
             emitPath: false
           }"
           collapse-tags
@@ -210,9 +210,9 @@
               v-model="transferForm.creatorIds"
               :options="userList"
               :props="{
-                value: 'AdminId',
-                label: 'RealName',
-                children: 'ChildrenList',
+                value: 'ItemId',
+                label: 'ItemName',
+                children: 'Children',
                 emitPath: false,
                 multiple:true
               }"
@@ -233,10 +233,10 @@
               v-model="transferForm.newUser"
               :options="userList"
               :props="{
-                value: 'AdminId',
-                label: 'RealName',
-                children: 'ChildrenList',
-                emitPath: false
+                value: 'ItemId',
+                label: 'ItemName',
+                children: 'Children',
+                emitPath: false,
               }"
               collapse-tags
               :show-all-levels="false"
@@ -286,7 +286,7 @@
 </template>
 <script>
 import { operateAuthInterface,departInterence } from '@/api/modules/setApi';
-import {dataBaseInterface} from '@/api/modules/chartApi'
+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';
@@ -409,6 +409,7 @@ export default {
       isSetAuthDia: false,
       authForm: {
         type:'',//分类设置 批量设置 单设置
+        ids:[],
       },
 
       /* 设置加密分类弹窗 */
@@ -449,12 +450,12 @@ export default {
     },
 
      /* 获取用户列表 */
-    getUserList() {
-      dataBaseInterface.getEdbChartAdminList({Source: 3}).then(res=>{
-        if(res.Ret !== 200) return
-
-        this.userList = res.Data || []
-      })
+    async getUserList() {
+      
+      const res = await dataAuthInterface.userSearch();
+      if (res.Ret !== 200) return
+      
+      this.userList = res.Data || []
     },
 
     /* 获取用户的资产数量 */
@@ -712,10 +713,25 @@ export default {
     },
 
     /* 设置可见权限 分类设置 单设置 批量设置*/
-    setAuthHandle({},type='single') {
-      if(type === 'multiple' && !this.checkedList.length) return this.$message.warning(this.$t('SystemManage.OperateAuth.msg01'))
+    setAuthHandle({ DataId,Name },type='single') {
+      if(type === 'multiple' && !this.checkedList.length&&!this.isSelectAll) return this.$message.warning(this.$t('SystemManage.OperateAuth.msg01'))
       
-      this.authForm.type = type;
+      let checked = type === 'single' ? [ DataId ] : this.checkedList.map(_ => _.DataId)
+
+      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:this.searchForm.classifys.join(','),
+          IsSelectAll:(this.isSelectAll&&type==='multiple') ? true : false
+        } : null
+      }
       this.isSetAuthDia = true
     },