Przeglądaj źródła

页面布局-指标库

shanbinzhang 1 miesiąc temu
rodzic
commit
67da33096d

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


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


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


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


+ 4 - 0
src/styles/element-ui.scss

@@ -74,3 +74,7 @@ $--font-path: '~element-ui/lib/theme-chalk/fonts';
     color: $--color-success;
   }
 }
+
+.el-dialog .el-pagination__editor.el-input {
+  width: 50px;
+}

+ 6 - 3
src/views/approve_manage/approveList.vue

@@ -1,11 +1,11 @@
 <template>
     <!-- 审批管理列表页 -->
     <div class="approve-list-wrap approve-page-wrap" v-if="isETAApprove || IsBIApprove">
-        <!-- <div class="head-tab">
+        <div class="head-tab">
             <el-radio-group v-model="activeMainTab" style="margin-bottom: 10px;" @input="handleMainClick">
                 <el-radio-button v-for="item in mainTabs" :key="item.name" :label="item.name">{{ item.label }}</el-radio-button>
             </el-radio-group>
-        </div> -->
+        </div>
         <div class="head-tab">
             <el-tabs v-model="activeTab" @tab-click="handleClick">
                 <el-tab-pane :label="$t('AprrovalPage.be_processed_tab')" name="pending"></el-tab-pane>
@@ -177,7 +177,10 @@ export default {
             SortField:0,
 
             tableLoading:false,
-            tableData: [],
+            tableData: [
+                { label:'指标审批',name:'edb' },
+                { label:'图表审批',name:'chart' },
+            ],
             tableColumns: approve_pending_columns,
             page: 1,
             pageSize: 10,

+ 185 - 49
src/views/approve_manage/approveSetting.vue

@@ -1,56 +1,120 @@
 <template>
     <!-- 审批流配置列表 -->
     <div class="approve-setting-wrap approve-page-wrap" v-if="isETAApprove || IsBIApprove">
-        <!-- <div style="margin-bottom: 10px;">
+        <div style="margin-bottom: 10px;">
             <el-radio-group v-model="activeMainTab" style="margin-bottom: 10px;" @input="handleTabClick">
                     <el-radio-button v-for="item in mainTabs" :key="item.name" :label="item.name">{{ item.label }}</el-radio-button>
             </el-radio-group>
-        </div> -->
-        <div class="head-box">
-            <el-input v-model="Keyword" @input="handleCurrentChange(1)"
-                :placeholder="$t('SystemManage.ReportApprove.placeholder02')" prefix-icon="el-icon-search" clearable style="width:360px;"></el-input>
-            <el-cascader v-model="classify"
-                :placeholder="activeMainTab == 'report' ? $t('SystemManage.ReportApprove.placeholder01') : $t('AprrovalPage.select_associated_Kanban_tip')" clearable
-                :options="activeMainTab == 'report' ? classifyTree : biClassifyTree"
-                :props="activeMainTab == 'report' ? {value:'ClassifyId',label:'ClassifyName',children:'Children'} : {value:'BiDashboardClassifyId',label:'BiDashboardClassifyName',children:'Children'}"
-                @change="handleSearchChange"
-                style="margin-right: auto;margin-left: 25px;width: 240px;"></el-cascader>
-            <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_add"
-                type="primary" @click="handleAddFlow">{{$t('SystemManage.ReportApprove.add_btn')}}</el-button>
-            
         </div>
-        <div class="list-box" v-loading="dataLoading" element-loading-text="数据加载中...">
-            <el-table :data="tableData" @sort-change="sortChange" border ref="reftable">
-                <el-table-column
-                    v-for="item in tableColumns"
-                    :key="item.key"
-                    :label="item.label"
-                    :prop="item.key"
-                    :sortable="item.sortable"
-                    align="center"
-                ></el-table-column>
-                <el-table-column :label="$t('Table.column_operations')" align="center">
-                    <template slot-scope="{row}">
-                        <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_edit"
-                            type="text" style="padding:0;" @click="handleEditFlow(row)">{{$t('Table.edit_btn')}}</el-button>
-                        <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_remove"
-                            type="text" style="padding:0;color:red;" @click="handleDeleteFlow(row)">{{$t('Table.delete_btn')}}</el-button>
-                    </template>
-                    
-                </el-table-column>
-            </el-table>
-            <div style="text-align:right;margin-top:20px">
-                <el-pagination 
-                        layout="total,prev,pager,next,jumper" 
-                        background 
-                        :current-page="page"
-                        @current-change="handleCurrentChange"
-                        :page-size="pageSize"
-                        :total="total"
-                        style="display: inline-block"
-                    />
+        
+        <!-- 图表指标审批 -->
+        <template v-if="['edb','chart'].includes(activeMainTab)">
+            <div class="edb-approve-wrapper">
+                 <el-form
+                    :model="approveForm"
+                    inline
+                    label-width="120px"
+                    label-position="left"
+                >
+                    <el-form-item :label="`公开${activeMainTab==='edb'?'指标':'图表'}审批人`" style="width:100%">
+                        <el-cascader
+                            v-model="approveForm.approveUsers"
+                            :options="usersOptions"
+                            :props="{
+                                value: 'NodeIdKey',
+                                label: 'NodeName',
+                                children: 'Children',
+                                emitPath: false,
+                                multiple: true,
+                            }"
+                            collapse-tags
+                            :show-all-levels="false"
+                            clearable
+                            filterable
+                            :placeholder="this.$t('SystemManage.OperateAuth.ph_see_user')" 
+                            style="width:300px"
+                        />
+                    </el-form-item>
+                    <el-form-item label="审批方式" style="width:100%">
+                        <el-select v-model="approveForm.approveType" style="width:300px">
+                            <el-option v-for="item in approveOption" :key="item" :label="item"/>
+                        </el-select>
+                    </el-form-item>
+                    <div style="margin-bottom:20px">以下用户设置公开无需审批</div>
+                    <el-form-item style="padding-left:120px">
+                        <el-cascader
+                            v-model="approveForm.noApproveUsers"
+                            :options="usersOptions"
+                            :props="{
+                            value: 'NodeIdKey',
+                            label: 'NodeName',
+                            children: 'Children',
+                            emitPath: false,
+                            multiple: true,
+                            }"
+                            collapse-tags
+                            :show-all-levels="false"
+                            clearable
+                            filterable
+                            :placeholder="this.$t('SystemManage.OperateAuth.ph_see_user')" 
+                            style="width:300px"
+                        />
+                    </el-form-item>
+                </el-form>
+                <div class="bot">
+                    <el-button type="primary" style="width: 120px" @click="handleApproveSetConfirm">保存</el-button>
+                </div>
             </div>
-        </div>
+        </template>
+
+        <!-- bi审批 -->
+        <template v-else-if="activeMainTab==='bi'">
+            <div class="head-box">
+                <el-input v-model="Keyword" @input="handleCurrentChange(1)"
+                    :placeholder="$t('SystemManage.ReportApprove.placeholder02')" prefix-icon="el-icon-search" clearable style="width:360px;"></el-input>
+                <el-cascader v-model="classify"
+                    :placeholder="activeMainTab == 'report' ? $t('SystemManage.ReportApprove.placeholder01') : $t('AprrovalPage.select_associated_Kanban_tip')" clearable
+                    :options="activeMainTab == 'report' ? classifyTree : biClassifyTree"
+                    :props="activeMainTab == 'report' ? {value:'ClassifyId',label:'ClassifyName',children:'Children'} : {value:'BiDashboardClassifyId',label:'BiDashboardClassifyName',children:'Children'}"
+                    @change="handleSearchChange"
+                    style="margin-right: auto;margin-left: 25px;width: 240px;"></el-cascader>
+                <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_add"
+                    type="primary" @click="handleAddFlow">{{$t('SystemManage.ReportApprove.add_btn')}}</el-button>
+                
+            </div>
+            <div class="list-box" v-loading="dataLoading" element-loading-text="数据加载中...">
+                <el-table :data="tableData" @sort-change="sortChange" border ref="reftable">
+                    <el-table-column
+                        v-for="item in tableColumns"
+                        :key="item.key"
+                        :label="item.label"
+                        :prop="item.key"
+                        :sortable="item.sortable"
+                        align="center"
+                    ></el-table-column>
+                    <el-table-column :label="$t('Table.column_operations')" align="center">
+                        <template slot-scope="{row}">
+                            <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_edit"
+                                type="text" style="padding:0;" @click="handleEditFlow(row)">{{$t('Table.edit_btn')}}</el-button>
+                            <el-button v-permission="permissionBtn.approveFlowPermission.reportApprove_remove"
+                                type="text" style="padding:0;color:red;" @click="handleDeleteFlow(row)">{{$t('Table.delete_btn')}}</el-button>
+                        </template>
+                        
+                    </el-table-column>
+                </el-table>
+                <div style="text-align:right;margin-top:20px">
+                    <el-pagination 
+                            layout="total,prev,pager,next,jumper" 
+                            background 
+                            :current-page="page"
+                            @current-change="handleCurrentChange"
+                            :page-size="pageSize"
+                            :total="total"
+                            style="display: inline-block"
+                        />
+                </div>
+            </div>
+        </template>
     </div>
     <div class="approve-page-wrap" v-else>
         <tableNoData :text="pageLoading?'':$t('SystemManage.ReportApprove.tips01')"></tableNoData>
@@ -59,6 +123,8 @@
 
 <script>
 import {approveInterence} from '@/api/modules/approve.js'
+import { traverseTree } from "@/utils/commonOptions"
+import { departInterence } from '@/api/modules/setApi';
 import approveMixins from './mixins/approveMixins';
 import reportApproveConfig from "@/mixins/reportApproveConfig.js"
 export default {
@@ -104,9 +170,20 @@ export default {
             page:1,
             pageSize:10,
             total:0,
-            mainTabs:[],
+            mainTabs:[
+                { label:'指标审批',name:'edb' },
+                { label:'图表审批',name:'chart' },
+            ],
             activeMainTab:'', //report-研报审批  bi-bi看板审批
             dataLoading:false,
+
+            usersOptions: [],
+            approveOption: ['或签','会签'],
+            approveForm: {
+                approveUsers:[],
+                approveType:'或签',
+                noApproveUsers:[]
+            }
         };
     },
     methods: {
@@ -123,8 +200,14 @@ export default {
           this.ClassifyThirdld = 0;
           this.ClassifyId = 0;
           this.$refs.reftable&&this.$refs.reftable.clearSort();
-          tabName == 'report' ? this.getClassifyTree() : this.getBIClassifyTree();
-          this.getTableData();
+          tabName == 'bi' && this.getBIClassifyTree();
+          tabName == 'bi' && this.getTableData();
+          
+          this.approveForm = {
+            approveUsers:[],
+            approveType:'或签',
+            noApproveUsers:[]
+          }
         },
         handleCurrentChange(page){
             this.page = page
@@ -246,10 +329,53 @@ export default {
 
            this.getTableData();
         },
+
+        /* 获取用户列表 */
+        async getUserList() {
+        
+        const res = await departInterence.getSystemUser();
+        if (res.Ret !== 200) return
+        
+        this.usersOptions = res.Data || []
+        //遍历加上唯一的key
+        traverseTree(
+            {Children:this.usersOptions},
+            {
+                childKey:'Children',
+                nodeKey:'NodeIdKey',
+                cb:(node)=>node.NodeType===3,
+                cb2:(node)=>node.NodeId+''
+            }
+        )
+        
+        this.filterTreeEmpty({Children:this.usersOptions})
+        },
+
+        // 递归处理数组
+        filterTreeEmpty(arr) {
+        function dfs(node) {
+            if (Array.isArray(node.Children)) {
+                for (let child of node.Children) {
+                    dfs(child);
+                }
+                if(node.Children.length===0) delete node.Children
+            }
+            //若为叶子节点,且不为用户,禁止选中
+            if(!node.Children||!Array.isArray(node.Children)){
+                if(node.NodeType!==3) node.disabled = true
+            }
+        }
+        dfs(arr); 
+        },
+
+        /* 审批设置 */
+        async handleApproveSetConfirm() {
+            this.activeMainTab === 'edb'
+        }
     },
     mounted(){
-        // this.getClassifyTree();
         this.getBIClassifyTree();
+        this.getUserList()
     },
 };
 </script>
@@ -264,5 +390,15 @@ export default {
     .list-box{
         margin-top:30px;
     }
+
+    .edb-approve-wrapper {
+        width: 50%;
+        padding: 30px 0;
+        .bot {
+            display: flex;
+            justify-content: center;
+            margin: 40px 0;
+        }
+    }
 }
 </style>

Plik diff jest za duży
+ 545 - 710
src/views/dataEntry_manage/chartSetting.vue


+ 1 - 1
src/views/dataEntry_manage/css/chartfit.scss

@@ -72,7 +72,7 @@ $font-normal:14px;
 					justify-content: space-between;
 					align-items: center;
 					display: block;
-					flex: 1;
+					width: 90%;
 					.node_label {
 						margin-right: 2px;
 					}

+ 254 - 49
src/views/dataEntry_manage/databaseComponents/edbTableList.vue

@@ -1,112 +1,317 @@
 <template>
-  <div>
+  <div class="edb-table-wrapper">
+    <div class="table-top">
+		  <p>{{$t('EtaBasePage.total_show',{limit: total||0})}}</p>
+
+      <div class="right" v-if="isBasicBase">
+          <el-checkbox 
+            v-model="filterObj.checkAll"
+            :indeterminate="filterObj.checkSome"
+            :disabled="list.length===0"
+            style="margin-right:20px" 
+            @change="listCheckAllChange"
+          >列表全选</el-checkbox>
+          <el-button type="primary" size="medium" @click="handleBatchCollect">批量收藏</el-button>
+      </div>
+    </div>
     <el-table
-      :data="tableData"
+      :data="list"
       ref="tableRef"
+      v-loading="tableLoading"
+      element-loading-text="加载中..."
       highlight-current-row
       border
+      :height="tableH"
+      @selection-change="selectionChange"
+      @select="selectHandle" 
+      @select-all="selectAllPageHandle"
     >
-        <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>{{ scope.row[item.key] }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" key="Opera" align="center" width="140">
-          <template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
-            <span class="editsty" @click="copyCode(scope.row)" v-if="showCopyDataBtn">
-            <i class="el-icon-document-copy" />&nbsp;{{$t('Edb.detail_copydata_btn')}}</span
-          ><br v-if="showCopyDataBtn"/>
-          <span class="editsty" @click="viewTarget(scope.row)">{{$t('Edb.detail_lookdata_btn')/* 查看数据 */}}</span>
+      <el-table-column
+        v-if="isBasicBase"
+        type="selection"
+      />
+      <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="{row}">
+          <span v-if="item.key==='EdbName'" class="editsty" @click="$emit('click-detail',row)">
+            {{ row.EdbName }}
+          </span>
+          <span v-else-if="item.key==='CreateTime'">{{ $moment(row.CreateTime).format('YYYY-MM-DD') }}</span>
+          <span v-else>{{ row[item.key] }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="收藏状态" key="CollectStatu" align="center">
-        
+
+      <el-table-column label="操作" key="Opera" align="center" min-width="150" v-if="!isBasicBase">
+        <template slot-scope="{row}">
+          <el-button 
+            v-if="$parent.isEdbBtnShow('update')"
+            type="text" 
+            @click="$emit('refresh','')" 
+          >刷新</el-button>
+          <el-button 
+            v-if="$parent.isEdbBtnShow('edit')"
+            type="text"
+            @click="editNode({},row)"
+          >编辑</el-button>
+          <el-button 
+            v-if="$parent.isEdbBtnShow('edbData_edbCollect_collect')"
+            type="text"
+            :style="classifyShowType==='own'?'color:#D54941':''"
+            @click="handleCollectEdb() "
+          >收藏</el-button>
+
+          <el-button 
+            v-if="$parent.isEdbBtnShow('deleteEdb')"
+            type="text" 
+            @click="removeNode(_,row)"
+            style="color:#C54322;"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="收藏状态" key="CollectStatu" align="center" v-else min-width="150">
+        <template slot-scope="{row}">
+          <span>已收藏至{{'宏观'}},继续</span>
+          <span class="editsty" @click="$emit('collect',row)">收藏</span>
+        </template>
       </el-table-column>
       <div slot="empty">
-        <tableNoData :text="$t('Table.no_edb_msg')" size="mini"/>
+        <tableNoData :text="$t('Table.no_edb_msg')" />
       </div>
     </el-table>
+    
+    <div style="height:35px;margin-top:15px">
+      <m-page
+        :page_no="pageNo"
+        :pageSize="pageSize"
+        :total="total"
+        @handleCurrentChange="pageChange"
+      />
+    </div>
   </div>
 </template>
 <script>
 import { dataBaseInterface } from '@/api/api.js';
+import mPage from '@/components/mPage.vue';
 export default {
+  components: { mPage },
+  props: {
+    isBasicBase: {
+      type: Boolean
+    },
+    list: {
+      type: Array
+    },
+    tableLoading: {
+      type: Boolean
+    },
+    total: {
+      type:Number
+    },
+    pageNo: {
+      type: Number
+    },
+    pageSize: {
+      type: Number
+    }
+  },
   computed: {
     tableColums() {
-      return [
+      const columns = [
 				{
 					label: '指标名称',
 					key: 'EdbName',
-					minwidthsty: '200px'
+					minwidthsty: '200px',
+          isShow: true
 				},
 				{
 					label: '最新日期',
 					key: 'EndDate',
-					widthsty: '100px'
+					widthsty: '100px',
+          isShow: true
 				},
 				{
 					label: '最新值',
 					key: 'EndValue',
-					widthsty: '100px'
+          isShow: true
 				},
 				{
 					label: '频度',
 					key: 'Frequency',
-					widthsty: '160px'
+          isShow: true
 				},
 				{
 					label: '单位',
 					key: 'Unit',
-					widthsty: '160px'
+          isShow: true
 				},
-				{
-					label: '计算方式',
-					key: 'Unit',
-					widthsty: '160px'
+        {
+					label: this.isBasicBase ? '数据来源' : '计算方式',
+					key: 'SourceName',
+          isShow: true
 				},
 				{
 					label: '创建人',
 					key: 'SysUserRealName',
-					widthsty: '160px'
-				},
-				{
-					label: '数据来源',
-					key: 'SourceName',
-					widthsty: '160px'
+          isShow: !this.isBasicBase
 				},
 				{
 					label: '创建日期',
-					key: 'CreateDate',
-					widthsty: '160px'
+					key: 'CreateTime',
+					widthsty: '100px',
+          isShow: this.isBasicBase
 				},
       ]
+      
+      let currentColumns = columns.filter(_ => _.isShow);
+      return currentColumns
+    },
+
+    tableH() {
+      return this.isBasicBase ? 'calc(100vh - 250px)' : 'calc(100vh - 360px)';
     }
   },
   data() {
     return {
-      pageNo:1,
-      pageSize:15,
-      total: 0,
-      list:[]
+      filterObj: {
+        checkAll: false, //控制全选显示状态
+        checkSome: false
+      },
+
+      isSelectAll: false, //真正意义上的全选或不全选
+      checkedList: [], //不全选勾选中的 或 全选取消勾的
+      selectionReactCancel:false,//手动设置选中中
     }
   },
   mounted(){
     
   },
   methods:{
-    getTableData() {
-      
-    }
+
+    pageChange(page) {
+      this.$emit('page-change',page)
+    },
+
+    /* 设置当页数据勾选状态 */
+    checkedSomeSelection() {
+      this.selectionReactCancel=true
+
+      if(!this.isSelectAll){
+          this.checkedList.map(_ =>{
+              let row = this.list.find(item => item.EdbInfoId==_.EdbInfoId)
+              if(row){ //设置部分选中
+                  setTimeout(()=>{
+                      this.$refs.tableRef.toggleRowSelection(row,true)
+                  },20)
+              }
+          })
+      }else{
+          this.$refs.tableRef &&this.$refs.tableRef.toggleAllSelection()
+          this.checkedList.map(_ =>{
+              let row = this.list.find(item => item.EdbInfoId==_.EdbInfoId)
+              if(row){ //设置部分不勾选
+                  setTimeout(()=>{
+                      this.$refs.tableRef.toggleRowSelection(row,false)
+                  },20)
+              }
+          })
+      }
+      setTimeout(()=>{
+          this.selectionReactCancel=false
+      },30)
+    },
+
+    //列表全选或全不选
+    listCheckAllChange(value){
+      this.checkedList = []
+      this.isSelectAll = value
+      this.$refs.tableRef && this.$refs.tableRef.clearSelection()
+
+      value && this.$refs.tableRef && this.$refs.tableRef.toggleAllSelection()
+    },
+
+    selectionChange() {
+      if(this.selectionReactCancel) return
+
+        //设置全选框状态 选中 半选 不选
+        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.filterObj.checkAll = true
+                this.filterObj.checkSome = false
+            //不选
+            }else if(
+              (filterChecked.length === 0 && (!this.isSelectAll))
+              || (filterChecked.length === this.total && this.isSelectAll)
+            ){
+                this.filterObj.checkAll = false
+                this.filterObj.checkSome = false
+            //半选
+            }else{
+                this.filterObj.checkAll = false
+                this.filterObj.checkSome=true
+            }
+        },1)
+    },
+
+    //单选
+    selectHandle(selection,row){ //当前选中的项是进选中还是取消选中中
+        if(this.selectionReactCancel) return 
+
+        //当前项是选中还是取消选
+        let haveChecked = selection.some(_ => _.EdbInfoId === row.EdbInfoId);
+
+        //全选取消选和不全选选中才有意义
+        if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+          this.checkedList.push(row)
+        }else {
+          this.checkedList=this.checkedList.filter(_ => _.EdbInfoId!==row.EdbInfoId)
+        }
+    },
+
+    //整列选
+    selectAllPageHandle(selection){
+        if(this.selectionReactCancel) return 
+        
+        //当前页是选中还是取消
+        let haveChecked = selection && selection.length>0;
+
+        //全选取消选和不全选选中才有意义
+        if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+          this.checkedList = [...this.checkedList,...this.list]
+        }else {
+
+          let pageIds = this.list.map(_ => _.EdbInfoId);
+          this.checkedList = this.checkedList.filter(_ => !pageIds.includes(_.EdbInfoId))
+        }
+    },
   },
 }
 </script>
 <style scoped lang='scss'>
-
+.edb-table-wrapper {
+  .table-top {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 10px;
+  }
+}
 </style>
+<style lang="scss">
+.edb-table-wrapper {
+  .el-table td{
+    padding: 6px 0;
+  }
+}
+</style>

+ 308 - 354
src/views/dataEntry_manage/databaseList.vue

@@ -14,7 +14,7 @@
 						type="primary" @click="$router.push({path: '/adjustdata'})"><!-- 数据调整 -->{{$t('EtaBasePage.adjustment_btn')}}</el-button>
 			</div>
 			<div class="top-right">
-
+				
 				<el-select
 					v-model="search_txt"
 					v-loadMore="searchLoad"
@@ -66,13 +66,10 @@
 					<el-radio-group 
 						v-model="classifyShowType" 
 						@input="handleChangeClassifyType" 
-						v-if="isBasicBase"
+						v-if="!isBasicBase"
 					>
-						<el-radio-button label="public">
-							公共指标库
-						</el-radio-button>
-						<el-radio-button label="own">
-							个人收藏
+						<el-radio-button :label="item.key" v-for="item in classifyTabs" :key="item.key">
+							{{item.label}}
 						</el-radio-button>
 					</el-radio-group>
 
@@ -85,10 +82,10 @@
 						remote
 						clearable
 						:placeholder="$t('Edb.InputHolderAll.input_name_orid')"
-						style="width: 260px;"
 						:remote-method="searchHandle"
 						@click.native="inputFocusHandle"
 						@keyup.enter.native="getEdbChartList"
+						style="width: 100%"
 					>
 						<i slot="prefix" class="el-input__icon el-icon-search"></i>
 						<el-option
@@ -109,134 +106,174 @@
 							</div>
 						</el-option>
 					</el-select>
-
-					<div style="padding:20px 0;padding-right:20px;display:flex;justify-content:space-between">
-						<span><!-- 目录 -->{{$t('EtaBasePage.tab_menu')}}</span>
-					</div>
-					<div class="target_tree">
-						<!-- 指标目录 -->
-						<el-tree
-							v-if="classifyShowType==='public'"
-							ref="menuTree"
-							:data="treeData"
-							node-key="UniqueCode"
-							:props="defaultProp"
-							:allow-drag="canDragHandle"
-							:allow-drop="canDropHandle"
-							:current-node-key="select_node"
-							:default-expanded-keys="defaultShowNodes"
-							:draggable="isEdbBtnShow('moveCatalog')"
-							:expand-on-click-node="false"
-							check-strictly
-							empty-text="暂无目录"
-							lazy
-							:load="getLazyTreeData"
-							@node-expand="handleNodeExpand"
-							@node-collapse="handleNodeCollapse"
-							@current-change="nodeChange"
-							@node-drop="dropOverHandle"
-							@node-drag-end="dropMouseLeave"
-							@node-drag-leave="dropMouseLeave"
-							@node-drag-enter="dropMouseOver"
+					
+					<!-- 我的 公共指标目录 -->
+					<div 
+						class="target_tree" 
+						v-if="['public','own'].includes(classifyShowType)"
+						:style="`${isBasicBase?'height:calc(100vh - 200px)':'height: calc(100vh - 300px)'}`"
+					>
+						<div class="own-tree" 
+							:style="`height:${(classifyShowType==='own'&&!isBasicBase )?'60%':'100%'}`"
 						>
-							<span
-								class="custom-tree-node"
-								slot-scope="{ node, data }"
-							>
-								<el-input
-									ref="editVal"
-									style="width: 90px"
-									placeholder="请输入值"
-									class="label-input"
-									v-model="new_label"
-									v-if="data.isEdit&&isEdbBtnShow('editCatalog')"
-									@blur="changeValue(node, data)"
-								/>
-								<span 
-									@dblclick.stop="editNodeLabel(node, data)" 
-									v-else 
-									class="text_oneLine node_label" 
-									:style="`width:${(select_node === data.UniqueCode ? '40%' :'90%') || ''}`"
-									: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&&data.HaveOperaAuth"
+							<div class="tree-title">目录</div>
+							<div class="tree-wrapper">
+								<el-tree	
+									ref="menuTree"
+									:data="treeData"
+									node-key="UniqueCode"
+									:props="defaultProp"
+									:allow-drag="canDragHandle"
+									:allow-drop="canDropHandle"
+									:current-node-key="select_node"
+									:default-expanded-keys="defaultShowNodes"
+									:draggable="isEdbBtnShow('moveCatalog')"
+									:expand-on-click-node="false"
+									check-strictly
+									empty-text="暂无目录"
+									lazy
+									:load="getLazyTreeData"
+									@node-expand="handleNodeExpand"
+									@node-collapse="handleNodeCollapse"
+									@current-change="nodeChange"
+									@node-drop="dropOverHandle"
+									@node-drag-end="dropMouseLeave"
+									@node-drag-leave="dropMouseLeave"
+									@node-drag-enter="dropMouseOver"
 								>
-									<!-- <img
-										src="~@/assets/img/data_m/move_ico.png"
-										alt=""
-										style="width: 14px; height: 14px; margin-right: 8px"
-										v-if="data.Button.MoveButton&&isEdbBtnShow('moveCatalog')"
-									/> -->
-									<!-- 添加子项 -->
-									<img
-										src="~@/assets/img/set_m/add.png"
-										alt=""
-										style="width: 14px; height: 14px; margin-right: 8px"
-										@click.stop="addNode(node,data)"
-										v-if="data.Button.AddButton&&isEdbBtnShow('editCatalog')&&node.level<9"
-									/>
-									<!-- 编辑节点 如果是分类,判断data.Button.OpButton不变;如果是指标,不显示(ETA1.0.3) -->
-									<img
-										src="~@/assets/img/set_m/edit.png"
-										alt=""
-										style="width: 15px; height: 14px; margin-right: 8px"
-										@click.stop="editNode(node,data)"
-										v-if="!data.EdbCode&&(data.Button.OpButton)&&isEdbBtnShow('editCatalog')"
-									/>
-									<!-- 删除节点 如果是分类,判断data.Button.DeleteButton不变;如果是指标,不显示(ETA1.0.3) -->
-									<img
-										slot="reference"
-										src="~@/assets/img/set_m/del_icon.png"
-										alt=""
-										style="width: 14px; height: 14px;"
-										@click.stop="removeNode(node,data)"
-										v-if="!data.EdbCode&&(data.Button.DeleteButton)&&isEdbBtnShow('deleteCatalog')"
+									<div
+										class="custom-tree-node"
+										slot-scope="{ node, data }"
+									>
+										<span
+											class="text_oneLine node_label" 
+											:style="`width:${(select_node === data.UniqueCode ? '40%' :'90%') || ''}`"
+											: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&&data.HaveOperaAuth"
+										>
+											<!-- <img
+												src="~@/assets/img/data_m/move_ico.png"
+												alt=""
+												style="width: 14px; height: 14px; margin-right: 8px"
+												v-if="data.Button.MoveButton&&isEdbBtnShow('moveCatalog')"
+											/> -->
+											<!-- 添加子项 -->
+											<img
+												src="~@/assets/img/set_m/add.png"
+												alt=""
+												style="width: 14px; height: 14px; margin-right: 8px"
+												@click.stop="addNode(node,data)"
+												v-if="data.Button.AddButton&&isEdbBtnShow('editCatalog')&&node.level<9"
+											/>
+											<!-- 编辑节点 如果是分类,判断data.Button.OpButton不变;如果是指标,不显示(ETA1.0.3) -->
+											<img
+												src="~@/assets/img/set_m/edit.png"
+												alt=""
+												style="width: 15px; height: 14px; margin-right: 8px"
+												@click.stop="editNode(node,data)"
+												v-if="!data.EdbCode&&(data.Button.OpButton)&&isEdbBtnShow('editCatalog')"
+											/>
+											<!-- 删除节点 如果是分类,判断data.Button.DeleteButton不变;如果是指标,不显示(ETA1.0.3) -->
+											<img
+												slot="reference"
+												src="~@/assets/img/set_m/del_icon.png"
+												alt=""
+												style="width: 14px; height: 14px;"
+												@click.stop="removeNode(node,data)"
+												v-if="!data.EdbCode&&(data.Button.DeleteButton)&&isEdbBtnShow('deleteCatalog')"
+											/>
+										
+										</span>
+									</div>
+								</el-tree>
+							</div>
+							<div class="opt-wrapper">
+									<!-- 新增分类 -->
+									<div class="opt-item" @click="addLevelOneHandle" v-if="CanOpClassify&&isEdbBtnShow('editCatalog')">
+										<img
+											src="~@/assets/img/set_m/add_ico.png"
+											alt=""
+											style="width: 16px; height: 16px; margin-right: 5px"
+										/>
+										<span>{{$t('EtaBasePage.add_first_menu_btn')}}</span>
+									</div>
+									<!-- 移动指标 -->
+									<div class="opt-item">
+										<img
+											src="~@/assets/img/set_m/move_batch_ico.png"
+											alt=""
+											style="width: 16px; height: 16px; margin-right: 5px"
+										/>
+										<span>批量移动指标</span>
+									</div>
+									<template v-if="classifyShowType==='own'">
+										<!-- 共享指标 -->
+										<div class="opt-item" @click="handleOpenSetShared('shared')">
+											<img
+												src="~@/assets/img/set_m/shared_ico.png"
+												alt=""
+												style="width: 16px; height: 16px; margin-right: 5px"
+											/>
+											<span>设置指标共享</span>
+										</div>
+										<!-- 公开指标 -->
+										<div class="opt-item" @click="handleOpenSetShared('public')">
+											<img
+												src="~@/assets/img/set_m/public_ico.png"
+												alt=""
+												style="width: 16px; height: 16px; margin-right: 5px"
+											/>
+											<span>设置指标公开</span>
+										</div>
+									</template>
+							</div>
+						</div>
+						
+
+						<!-- 收藏目录 拼接我的指标tab-->
+						<div class="collect-tree" v-if="classifyShowType==='own'&&!isBasicBase">
+								<div class="tree-title">收藏指标</div>
+								<div class="tree-wrapper">
+									<collectEdbMenu
+										:data="collectClassifys"
+										@change="getCollectClassifys"
+										ref="collectEdbMenuRef"
 									/>
-								
-								</span>
-							</span>
-						</el-tree>
-
-						<!-- 收藏目录 -->
-						<collectEdbMenu
-							v-else
-							:data="treeData"
-							@change="getTreeData"
-							ref="collectEdbMenuRef"
-						/>
-					</div>
+								</div>
 
-					<template>
-						<!-- 新增分类 -->
-						<div class="noDepart" @click="addLevelOneHandle" v-if="classifyShowType==='public'&&CanOpClassify&&isEdbBtnShow('editCatalog')">
-							<img
-								src="~@/assets/img/set_m/add_ico.png"
-								alt=""
-								style="width: 16px; height: 16px; margin-right: 10px"
-							/>
-							<span>{{$t('EtaBasePage.add_first_menu_btn')}}</span>
-						</div>
-						<!-- 新增收藏分类 -->
-						<div class="noDepart" @click="handleOpenCollectClassify" v-if="classifyShowType==='own'&&isEdbBtnShow('edbData_edbCollectClassify_save')">
-							<img
-								src="~@/assets/img/set_m/add_ico.png"
-								alt=""
-								style="width: 16px; height: 16px; margin-right: 10px"
-							/>
-							<span>{{$t('EtaBasePage.add_first_menu_btn')}}</span>
+								<div class="opt-wrapper">
+										<div class="opt-item" @click="handleOpenCollectClassify" v-if="isEdbBtnShow('edbData_edbCollectClassify_save')">
+											<img
+												src="~@/assets/img/set_m/add_ico.png"
+												alt=""
+												style="width: 16px; height: 16px; margin-right: 5px"
+											/>
+											<span>新增收藏分类</span>
+										</div>
+								</div>
 						</div>
-					</template>
+					</div>
+
+
+					<!-- 共享指标目录 -->
+					<div class="target_tree" 
+						:style="`${isBasicBase?'height:calc(100vh - 200px)':'height: calc(100vh - 300px)'}`"
+						v-if="classifyShowType==='shared'"
+					>
+							<sharedMenu/>
+					</div>
 				</div>
 				<span class="move-btn resize" v-drag id="resize" >
 				</span>
@@ -255,53 +292,19 @@
 			<div class="main-right right" id="right" style="background:transparent;border:none;box-shadow:none;padding-top: 30px;box-sizing: border-box;" v-if="showAssociateComputeData">
 				<dataAssociateComputeData :edbInfoId="selected_edbid" @returnHandle="showAssociateChart=false,showAssociateComputeData=false"></dataAssociateComputeData>
 			</div>
+			
 			<!-- 指标图表列表 -->
 			<div class="main-right right list" id="right" v-show="isShowList">
-				<p>{{$t('EtaBasePage.total_show',{limit: Total||0})}}</p>
-				<div class="list-wrap" ref="listRef" @scroll="loadMoreHandle" v-if="Total">
-					<!-- <div class="chart-list-item-wrap"> -->
-					<draggable
-							v-model="chartList"
-							class="chart-list-item-wrap"
-							animation="300"
-							tag="div"
-							:disabled="classifyShowType!=='own'"
-							@start="menuDragStart"
-							@update="menuDragenter"
-							@end="collectDragOver"
-					>
-						<div class="list-item" v-for="item in chartList" :key="item.EdbInfoId">
-							<div class="header">
-								<span class="text_oneLine">{{ item.EdbName }}</span>
-
-								<img 
-									v-if="classifyShowType==='own'"
-									src="~@/assets/img/data_m/move_ico.png"
-									class="move"
-									style="width: 14px; height: 14px;"
-								/>
-							</div>
-							<div class="image" @click="detailShowHandle(item)"
-								:style="{background: `no-repeat top/cover url('${ item.ChartImage}')`}">
-							</div>
-							<div class="info">
-								{{$t('EtaBasePage.time_show')}}:{{item.CreateTime?item.CreateTime.substring(0,10):''}}
-								<!-- wind和钢联化工的指标、计算指标显示 启用/停用-->
-								<span v-if="([2,34].includes(item.Source) || item.EdbType==2) && isEdbBtnShow('enableOrDisable')&&item.IsSupplierStop!=1" 
-								class="enable-toggle-btn" :style="{'color': item.NoUpdate==1?'#0052D9':'#D54941'}"
-								@click="toggleEdbRefreshStatus(item)">{{item.NoUpdate==1?$t('SystemManage.DataRefresh.enable'):$t('SystemManage.DataRefresh.disable') }}</span>
-
-								<span class="deletesty" v-if="classifyShowType==='own'&&isEdbBtnShow('edbData_edbCollect_collect')" @click="handleRemoveCollect(item)">移出</span>
-							</div>
-							<img src="~@/assets/img/icons/edb-stopping.png" class="stop-mark" v-if="([2,34].includes(item.Source) || item.EdbType==2) && ( item.IsSupplierStop==1 || (item.IsSupplierStop==0&&item.NoUpdate==1))" />
-						</div>
-					</draggable>	
-					<!-- </div> -->
-				</div>
-				<div v-if="!Total" class="nodata">
-					<tableNoData :text="$t('Table.no_edb_msg')"/>
-				</div>
-				<edbTableList :list="list"/>
+				<edbTableList 
+					:isBasicBase="isBasicBase"
+					:tableLoading="tableLoading"
+					:list="chartList"
+					:total="Total"
+					:pageSize="PageSize"
+					:pageNo="CurrentIndex"
+					@click-detail="detailShowHandle"
+					@page-change="handleListPageChange"
+				/>
 			</div>
 
 			<!-- 指标详情 -->
@@ -323,10 +326,10 @@
 							>{{EdbData.NoUpdate==1?$t('SystemManage.DataRefresh.enable'):$t('SystemManage.DataRefresh.disable') }}<!-- 启用/停用 --></el-button>
 
 							<el-button 
-								v-if="isBasicBase&&isEdbBtnShow('edbData_edbCollect_collect')"
+								v-if="isEdbBtnShow('edbData_edbCollect_collect')"
 								type="text"
 								:style="classifyShowType==='own'?'color:#D54941':''"
-								@click="classifyShowType==='own'?handleRemoveCollect():handleCollectEdb()" 
+								@click="classifyShowType==='own'?handleRemoveCollect():handleCollectEdb(EdbData)" 
 							>{{classifyShowType==='own'?'移出':'收藏'}}</el-button>
 							<el-button 
 								v-if="isEdbBtnShow('update')"
@@ -650,8 +653,8 @@
 		<edbCollectDia
 			ref="edbCollectRef"
 			:show.sync="isOpenEdbCollectDia"
-			:edbId="selected_edbid"
-			:add_ids="EdbData?EdbData.CollectClassifyIdList:[]"
+			:edbId="collectEdbForm.edbId"
+			:add_ids="collectEdbForm.collectClassifyIdList"
 			@success="arr=>{tableData[0].CollectClassifyIdList = arr}"
 		/>
 
@@ -661,6 +664,13 @@
 			:form="collectClassifyForm"
 			@confirm="getTreeData();isOpenEdbCollectDia&&$refs.edbCollectRef.getClassify()"
 		/>
+
+		<!-- 设置公开共享列表弹窗 -->
+		<setSharedDialog
+			:show.sync="isOpenSetSharedDia"
+			:type="sharedType"
+			@change="getTreeData"
+		/>
 	</div>
 </template>
 
@@ -695,6 +705,8 @@ import collectEdbMenu from './databaseComponents/collectEdbMenu.vue';
 import edbCollectDia from './databaseComponents/edbCollectDia.vue';
 import addCollectClassifyDia from './databaseComponents/addCollectClassifyDia.vue';
 import edbTableList from './databaseComponents/edbTableList.vue';
+import sharedMenu from './sharedComponents/sharedMenu.vue';
+import setSharedDialog from './sharedComponents/setSharedListDialog.vue';
 export default {
 	name: '',
 	components: {
@@ -723,7 +735,9 @@ export default {
 		collectEdbMenu,
 		edbCollectDia,
 		addCollectClassifyDia,
-		edbTableList
+		edbTableList,
+		sharedMenu,
+		setSharedDialog
 	},
 	directives: {
 		drag(el, bindings,vnode) {
@@ -800,7 +814,6 @@ export default {
 			calulateList:[],
 			computed_type:0,//打开弹窗的类型
 			operationForm:{},
-			dynamicNode:null,
 		
 			edb_source:0,//指标来源 显示计算按钮
 			calculateLoading: false,//计算指标刷新loading
@@ -847,6 +860,7 @@ export default {
 			Total:0,
 			IsListEnd:false,//是不是到底了
 			chartList:[],
+			tableLoading:false,
 
 			activeTab:'',
 			activeName:'second',
@@ -862,13 +876,24 @@ export default {
 			hasUsedList:[],
 
 			/* 目录分类 */
-			classifyShowType:'public',
-			searchCollectWord:'',
+			classifyTabs: [
+				{ label: '我的指标',key: 'own' },
+				{ label: '共享指标',key: 'shared' },
+				{ label: '公共指标',key: 'public' },
+			],
+			classifyShowType:'own',
+			
+			collectClassifys:[],//收藏目录
 			//指标收藏弹窗
 			isOpenEdbCollectDia: false,
+			collectEdbForm: {},
 			//收藏分类弹窗
 			isOpenCollectClassifyDia: false,
-			collectClassifyForm: {}
+			collectClassifyForm: {},
+
+			/* 设置共享弹窗 */
+			isOpenSetSharedDia: false,
+			sharedType:'',//shared/public
 		};
 	},
 	watch: {
@@ -899,7 +924,6 @@ export default {
 			}
 		},
 		select_classifyId(newval){
-			if(this.$refs.listRef) this.$refs.listRef.scrollTop = 0;
 			if(newval){
 				this.CurrentIndex = 1
 				this.getEdbChartList()
@@ -1060,40 +1084,28 @@ export default {
 		},
 		/* 获取树分类数据 */
 		async getTreeData(params) {
-			const res = this.classifyShowType==='own'
-				? await edbCollectInterface.getEdbCollectClassify({ParentId:0})
-				: await dataBaseInterface.targetCatalog({
-						IsOnlyMe:this.IsOnlyMe,
-						ParentId:0,
-						ClassifyType: this.isBasicBase ? 0 : 2
-					})
+			const res = await dataBaseInterface.targetCatalog({
+				IsOnlyMe:this.IsOnlyMe,
+				ParentId:0,
+				ClassifyType: this.isBasicBase ? 0 : 2
+			})
 
-	
-					if(res.Ret!==200) return 
-					this.showData = true;
-
-					if(this.classifyShowType==='public') {
-						const arr=res.Data.AllNodes || []
-						this.treeData=arr.map(item=>{
-							return {
-								...item,
-								// isLeaf:item.Children.length?false:true
-							}
-						})
-						
-						this.CanOpClassify = res.Data.CanOpClassify;
 
-						/* 处理树展开和选中图表 */
-						params && this.selectCurrentNode(params);
-						!params && this.select_node && this.$refs.menuTree.setCurrentKey(this.select_node);
-					}else {
-						this.treeData = res.Data||[]
-						this.select_classifyId =
-							this.select_classifyId ||
-							(this.treeData.length ? this.treeData[0].ClassifyId:0);
+			if(res.Ret!==200) return 
+			this.showData = true;
 
-						this.$refs.collectEdbMenuRef&&this.$refs.collectEdbMenuRef.initSelect(this.select_classifyId)
-					}
+			const arr=res.Data.AllNodes || []
+			this.treeData=arr.map(item=>{
+				return {
+					...item,
+				}
+			})
+			
+			this.CanOpClassify = res.Data.CanOpClassify;
+
+			/* 处理树展开和选中图表 */
+			params && this.selectCurrentNode(params);
+			!params && this.select_node && this.$refs.menuTree.setCurrentKey(this.select_node);
 		},
 		/* 获取最新的指标 默认展示 */
 		getNewTargetList: _.throttle(function() {
@@ -1161,7 +1173,6 @@ export default {
 					}
 					this.$refs.menuTree&&this.$nextTick(()=>{
 						const _node = this.$refs.menuTree.getNode(this.select_node)
-						// this.dynamicNode = _node;
 						//滚动到高亮位置
 						setTimeout(() => {
 							let node = document.getElementById(`node${this.select_node}`)||{}
@@ -1184,12 +1195,13 @@ export default {
 		}),
 		//获取指标图表列表
 		async getEdbChartList(){
-			const res = this.classifyShowType === 'own' 
+			this.tableLoading = true;
+			const res = this.classifyShowType === 'collect' 
 				? await edbCollectInterface.getCollectEdb({
 						PageSize:this.PageSize,
 						CurrentIndex:this.CurrentIndex,
 						ClassifyId:this.select_classifyId,
-						Keyword: this.searchCollectWord
+						Keyword: ''
 					})
  				:	await dataBaseInterface.getEdbChartList({
 						PageSize:this.PageSize,
@@ -1198,9 +1210,11 @@ export default {
 						IsOnlyMe:this.IsOnlyMe,
 						EdbType: this.isBasicBase?1:2
 					})
+
+				this.tableLoading = false;
 				if(res.Ret!==200) return
 				if(res.Data){
-					this.chartList = this.CurrentIndex===1?res.Data.List:[...this.chartList,...res.Data.List]
+					this.chartList = res.Data.List || [];
 					this.Total = res.Data.Paging.Totals||0
 					this.IsListEnd = res.Data.Paging.IsEnd
 				}
@@ -1228,16 +1242,12 @@ export default {
 				}
 			})
 		},
+
 		//指标图表列表-加载更多
-		loadMoreHandle: _.throttle(function() {
-			let scrollTop = this.$refs.listRef.scrollTop;
-			let clientHeight = this.$refs.listRef.clientHeight;
-			let scrollHeight = this.$refs.listRef.scrollHeight;
-			if(scrollTop + clientHeight >= scrollHeight-210 && !this.IsListEnd){
-				this.CurrentIndex++;
-				this.getEdbChartList();
-			}
-			},300),
+		handleListPageChange(page) {
+			this.CurrentIndex = page;
+			this.getEdbChartList();
+		},
 		/* 搜索 */
 		searchHandle(query) {
 			this.search_page = 1;
@@ -1355,38 +1365,10 @@ export default {
 			this.select_classifyId = !data.EdbInfoId?data.ClassifyId:0;
 			this.select_node = data.UniqueCode;
 			this.selected_edbid = data.EdbInfoId;
-			// this.dynamicNode = node;
 			this.showAssociateChart=false
 			this.showAssociateComputeData=false
 		},
 
-		/* 双击label出现input修改框 */
-		editNodeLabel(node, data) {
-			//目录名称可以双击修改 指标不能
-			if(!data.EdbCode && this.role === 'admin'&&this.isEdbBtnShow('editCatalog')) {
-				this.$set(data,'isEdit',true)
-				this.new_label = this.currentLang==='en' ? data.ClassifyNameEn : data.ClassifyName;
-				this.$nextTick(() => {
-					this.$refs.editVal.focus();
-				});
-			}
-		},
-		/* input失去焦点恢复node 修改最新的值*/
-		changeValue(node, data) {
-			if(this.new_label) {
-				this.$set(data,'isEdit',false)
-				dataBaseInterface.nodeEdit({
-						ClassifyId: data.ClassifyId,
-						ClassifyName: this.new_label
-					}).then(res => {
-						if(res.Ret === 200) {
-							this.getTreeData();
-						}
-					})
-			}else {
-				this.$message.warning('名称不能为空')
-			}
-		},
 		/* 添加一级目录 */
 		addLevelOneHandle() {
 			this.dialog_title = '添加';
@@ -2109,14 +2091,7 @@ export default {
 		changeTreeNode(){
 			this.$refs.menuTree.setCurrentKey(this.select_node);
 		},
-		//只看我的
-		onlyMeHandler(){
-			this.getTreeData()
 
-			this.CurrentIndex = 1;
-			this.$refs.listRef.scrollTop = 0;
-			this.getEdbChartList();
-		},
 		//绑定el-tree的load属性
 		async getLazyTreeData (node,resolve){
 			if(node.level===0){
@@ -2195,13 +2170,25 @@ export default {
 			this.selected_edbid = 0;
 			this.select_classifyId = 0;
 			this.search_txt = '';
-			this.searchCollectWord = '';
-			this.getTreeData()
-			this.classifyShowType==='public'&&this.getEdbChartList()
+			
+			['own','public'].includes(this.classifyShowType) && this.getTreeData()
+			// this.classifyShowType==='public'&&this.getEdbChartList()
+			this.classifyShowType==='own' && this.getCollectClassifys();
+		},
+
+		//获取收藏指标分类
+		async getCollectClassifys() {
+			const res = await edbCollectInterface.getEdbCollectClassify({ParentId:0})
+
+			this.collectClassifys = res.Data||[]
 		},
 
 		/* 收藏指标 */
-		handleCollectEdb() {
+		handleCollectEdb(info) {
+			this.collectEdbForm = {
+				edbId: info.EdbInfoId,
+				collectClassifyIdList: info.CollectClassifyIdList||[]
+			},
 			this.isOpenEdbCollectDia = true
 		},
 
@@ -2254,9 +2241,16 @@ export default {
 			if(res.Ret !== 200) return 
 			this.$message.success('移动成功')
 		},
+
+		/* 设置指标共享弹窗 */
+		handleOpenSetShared(type) {
+			this.sharedType = type;
+			this.isOpenSetSharedDia = true;
+		}
 	},
 	mounted() {
-		this.getEdbChartList()
+		this.getEdbChartList();
+		this.getCollectClassifys();
 		this.$route.query.code 
 		? this.getTreeData({code: this.$route.query.code,id: this.$route.query.id,classifyId:this.$route.query.classifyId})
 		: this.getTreeData();
@@ -2313,6 +2307,7 @@ export default {
 		border: 1px solid #ececec;
 		border-radius: 4px;
 		box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+		margin-bottom: 20px;
 		.top-right,.top-left{
 			display: flex;
 			align-items: center;
@@ -2329,7 +2324,6 @@ export default {
 	}
 	.database_main {
 		display: flex;
-		margin-top: 20px;
 		position:relative;
 		width:100%;
 		overflow-x: auto;
@@ -2341,17 +2335,16 @@ export default {
 			border: 1px solid #ececec;
 			border-radius: 4px;
 			box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
-			height: calc(100vh - 225px);
+			// height: calc(100vh - 225px);
 			overflow: hidden;
 			position: relative;
 			box-sizing: border-box;
 			.tree-cont {
-				padding: 30px;
+				padding: 20px 30px;
 			}
 			.target_tree {
 				color: #333;
-				height: calc(100vh - 420px); 
-				overflow: auto;
+				height: calc(100vh - 300px);
 				.label-input .el-input__inner {
 					height: 25px;
 					line-height: 25px;
@@ -2381,7 +2374,7 @@ export default {
 					background-color:$theme-color;
 				}
 				.el-tree-node__content {
-					margin-bottom: 14px !important;
+					margin-bottom: 5px !important;
 				}
 				.el-tree-node__children {
 					.el-tree-node {
@@ -2414,15 +2407,7 @@ export default {
 					padding-right: 10px !important;
 				}
 			}
-			.noDepart {
-				margin: 30px 0;
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				color: $theme-color;
-				font-size: 16px;
-				cursor: pointer;
-			}
+			
 			.move-btn {
 				height: 100%;
 				width: 4px;
@@ -2435,11 +2420,45 @@ export default {
 					/* background-color: orange */
 				}
 			}
+
+			.own-tree,.collect-tree {
+				display: flex;
+				flex-direction: column;
+			}
+			.own-tree {
+				height: 60%;
+			}
+			.collect-tree {
+				height: 40%;
+				border-top: 1px solid #C8CDD9;
+			}
+			.tree-title {
+				font-size: 15px;
+				margin: 15px 0;
+			}
+			.tree-wrapper {
+				flex: 1;
+				overflow: auto;
+			}
+			.opt-wrapper {
+				margin: 15px 0;
+				display: flex;
+				justify-content: space-between;
+				flex-wrap: wrap;
+				color: #0052D9;
+				gap: 10px;
+				.opt-item {
+					display: flex;
+					align-items: center;
+					font-size: 16px;
+					cursor: pointer;
+				}
+			}
 		}
 		.main-right {
 			flex: 1;
 			/* width:70%; */
-			height: calc(100vh - 225px);
+			// height: calc(100vh - 225px);
 			background: #fff;
 			border: 1px solid #ececec;
 			border-radius: 4px;
@@ -2507,76 +2526,11 @@ export default {
 				}
 			}
 			&.list{
-				background-color: transparent;
+				background-color: #fff;
+				height: auto;
 				box-shadow: none;
 				border:none;
-				padding-left:30px;
-				display: flex;
-				flex-direction: column;
-				.list-wrap{
-					flex: 1;
-					margin-top: 20px;
-					overflow-y: auto;
-					.dragShdow {
-						box-shadow: 0 1px 8px rgba(64, 158, 255, 0.8);
-						opacity: 0.5;
-					}
-					.list-item{
-						width:23%;
-						min-width: 210px;
-						background-color: #fff;
-						display: flex;
-						flex-direction: column;
-						box-sizing: border-box;
-						border-radius: 4px;
-						border:1px solid #DCDFE6;
-						box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-						position: relative;
-						.header{
-							display: flex;
-							justify-content: space-between;
-							align-items: center;
-							padding:10px;
-							box-sizing: border-box;
-							/* text-align: left; */
-						}
-						.info{
-							padding:10px;
-							box-sizing: border-box;
-							display: flex;
-							align-items: center;
-							justify-content: space-between;
-							.enable-toggle-btn{
-								cursor: pointer;
-								color: #0052D9;
-								font-size: 14px;
-							}
-						}
-						.header{
-							white-space: nowrap;
-							overflow: hidden;
-							text-overflow: ellipsis;
-							font-size: 16px;
-							font-weight: 600;
-							box-shadow: 0 3px 6px rgba(37, 37, 239, 0.1);
-						}
-						.image{
-							margin:10px;
-							margin-bottom: 0;
-							height: 0;
-							padding-bottom: 67%;
-							cursor: pointer;
-						}
-						.stop-mark{
-							height: 48px;
-							width: 48px;
-							position: absolute;
-							right: -1px;
-							top: 0;
-							pointer-events: none;
-						}
-					}
-				}
+				padding:20px;
 			}
 			&.detail-wrap{
 				overflow-x:auto;

+ 164 - 0
src/views/dataEntry_manage/sharedComponents/batchSetPublicDia.vue

@@ -0,0 +1,164 @@
+<template>
+<div>
+  <el-dialog
+		:visible.sync="show"
+		:close-on-click-modal="false"
+		:modal-append-to-body="false"
+		@close="handleClose"
+		custom-class="set-shared-dialog"
+		center
+		top="2vh"
+    width="1200px"
+		v-dialogDrag
+    title="批量设置公开"
+	>
+    <div class="wrap">
+      <el-table 
+        :data="tableData" 
+        border
+        height="40vh"
+        ref="addTableRef"
+      >
+
+        <el-table-column :label="$t('Edb.Detail.e_name')" align="center">
+            <template slot-scope="{row}">{{row.IndexName}}</template>
+        </el-table-column>
+        <el-table-column align="center" width="350px">
+            <template slot="header" slot-scope="scope">
+                <el-radio-group 
+                  v-model="classifyType"
+                >
+                    <el-radio :label="0">{{ $t('EtaBasePage.subdirectory_radio') }}</el-radio>
+                    <el-radio :label="1">{{ $t('EtaBasePage.directory_radio') }}</el-radio>
+                </el-radio-group>
+                <el-cascader
+                  v-model="selectClassify"
+                  :options="classifyOption"
+                  :props="{	
+                    label: 'ClassifyName',
+                    value: 'ClassifyId',
+                    children: 'Children',
+                    checkStrictly: true,
+                    emitPath:false
+                  }"
+                  :placeholder="$t('Edb.InputHolderAll.input_menu')"
+                  v-if="classifyType === 1"
+                  @change="handleClassifyAllChange(row)"
+                  class="header-cascader"
+                />
+            </template>
+            <template slot-scope="{row}">
+                  <el-cascader
+                    v-model="row.EtaClassifyId"
+                    :options="classifyOption"
+                    :props="{	
+                      label: 'ClassifyName',
+                      value: 'ClassifyId',
+                      children: 'Children',
+                      checkStrictly: true,
+                      emitPath:false
+                    }"
+                    :placeholder="$t('Edb.InputHolderAll.input_menu')"
+                    :disabled="(classifyType===1)"
+                  />
+            </template>
+        </el-table-column>
+      </el-table>
+      <div class="reason-wrapper">
+        <label class="el-form-item__label">公开理由</label>
+         <el-input
+            type="textarea"
+            :rows="5"
+            placeholder="请输入公开理由"
+            v-model="reason"
+            style="width:500px"
+          />
+      </div>
+    </div>
+    <div class="dia-bot">
+      <el-button type="primary" plain @click="handleClose">取消</el-button>
+      <el-button type="primary" @click="handleConfirm">确定</el-button>
+    </div>
+  </el-dialog>
+
+</div>
+</template>
+<script>
+import { dataBaseInterface } from '@/api/api.js';
+import { operateAuthInterface,departInterence } from '@/api/modules/setApi';
+export default {
+  props: {
+    show: {
+      type: Boolean
+    },
+    list: {
+      type: Array
+    }
+  },
+  watch: {
+    show(nval) {
+      if(!nval) return
+      this.getClassifyOpts()
+    }
+  },
+  data() {
+    return {
+      reason:'',
+      tableData:[],
+      classifyOption: [],
+      classifyType:0,//目录方式
+      selectClassify: 0,//选择的分类
+    }
+  },
+  methods:{
+    handleClose() {
+      this.formData = {
+        classifyId: '',
+        reason: ''
+      };
+      this.$emit('update:show',false);
+    },
+
+    handleConfirm() {
+      this.handleClose()
+      this.$emit('confirm')
+    },
+
+
+    handleClassifyAllChange(e){
+      this.tableData.forEach(item=>{
+        item.ClassifyId = this.selectClassify
+      })
+    },
+
+    //公开目录
+    async getClassifyOpts() {
+      const res = await dataBaseInterface.targetCatalog({
+        IsOnlyMe:true,
+        ParentId:0,
+        ClassifyType:  2
+      })
+
+      if(res.Ret!==200) return 
+
+      this.classifyOption = res.Data.AllNodes || [];
+    },
+
+  },
+}
+</script>
+<style scoped lang='scss'>
+.reason-wrapper {
+  display: flex;
+  margin: 20px 0;
+}
+.dia-bot {
+  margin: 30px 0;
+  display: flex;
+  justify-content: center;
+  gap: 20px;
+  .el-button {
+    width: 120px;
+  }
+}
+</style>

+ 122 - 0
src/views/dataEntry_manage/sharedComponents/setPublicDia.vue

@@ -0,0 +1,122 @@
+<template>
+<div>
+  <el-dialog
+		:visible.sync="show"
+		:close-on-click-modal="false"
+		:modal-append-to-body="false"
+		@close="handleClose"
+		custom-class="set-shared-dialog"
+		center
+		top="2vh"
+    width="650px"
+		v-dialogDrag
+    title="设置指标公开"
+	>
+    <div class="wrap">
+      <el-form
+        :model="formData"
+        inline
+      >
+        <el-form-item label="公共目录">
+          <cascader
+            v-model="formData.classifyId"
+            :options="classifyOption"
+            clearable
+            :placeholder="$t('Edb.InputHolderAll.input_menu')"
+            :config="{ checkStrictly: true }"
+            cascaderWidth="width: 400px"
+          />
+        </el-form-item>
+        <el-form-item label="共享权限">
+          <el-input
+            type="textarea"
+            :rows="5"
+            placeholder="请输入公开理由"
+            v-model="formData.reason"
+            style="width:400px"
+          />
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="dia-bot">
+      <el-button type="primary" plain @click="handleClose">取消</el-button>
+      <el-button type="primary" @click="handleConfirm">确定</el-button>
+    </div>
+  </el-dialog>
+
+</div>
+</template>
+<script>
+import { dataBaseInterface } from '@/api/api.js';
+import { operateAuthInterface,departInterence } from '@/api/modules/setApi';
+export default {
+  props: {
+    show: {
+      type: Boolean
+    },
+    list: {
+      type: Array
+    }
+  },
+  watch: {
+    show(nval) {
+      if(!nval) return
+      this.getClassifyOpts()
+    }
+  },
+  data() {
+    return {
+      formData: {
+        classifyId: '',
+        reason: ''
+      },
+      classifyOption: [],
+    }
+  },
+  methods:{
+    handleClose() {
+      this.formData = {
+        classifyId: '',
+        reason: ''
+      };
+      this.$emit('update:show',false);
+    },
+
+    handleConfirm() {
+      this.handleClose()
+      this.$emit('confirm')
+    },
+
+    //公开目录
+    async getClassifyOpts() {
+      const res = await dataBaseInterface.targetCatalog({
+        IsOnlyMe:true,
+        ParentId:0,
+        ClassifyType:  2
+      })
+
+      if(res.Ret!==200) return 
+
+      this.classifyOption = res.Data.AllNodes || [];
+    },
+
+  },
+}
+</script>
+<style scoped lang='scss'>
+.wrap {
+  .el-form {
+    padding: 0 50px;
+  }
+}
+
+.dia-bot {
+  margin: 30px 0;
+  display: flex;
+  justify-content: center;
+  gap: 20px;
+  .el-button {
+    width: 120px;
+  }
+}
+</style>

+ 239 - 0
src/views/dataEntry_manage/sharedComponents/setSharedDia.vue

@@ -0,0 +1,239 @@
+<template>
+<div>
+  <el-dialog
+		:visible.sync="show"
+		:close-on-click-modal="false"
+		:modal-append-to-body="false"
+		@close="handleClose"
+		custom-class="set-shared-dialog"
+		center
+		top="2vh"
+    width="650px"
+		v-dialogDrag
+    title="设置指标共享"
+	>
+    <div class="wrap">
+      <el-form
+        :model="formData"
+        inline
+      >
+        <el-form-item label="共享权限">
+          <el-radio-group v-model="formData.type">
+            <el-radio :label="1">仅查看</el-radio>
+            <el-radio :label="2">仅编辑</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="共享用户">
+          <el-cascader
+            v-model="formData.users"
+            ref="userRef"
+            :options="usersOptions"
+            :props="{
+              value: 'NodeIdKey',
+              label: 'NodeName',
+              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"
+          />
+        </el-form-item>
+
+      </el-form>
+
+      <div class="checked-user" v-if="selectUserList.length">
+        <el-tag
+          v-for="tag in selectUserList"
+          :key="tag.label"
+          closable
+          @close="removeUser(tag.value)"
+        >
+          {{tag.label}}
+        </el-tag>
+      </div>
+    </div>
+    <div class="dia-bot">
+      <el-button type="primary" plain @click="handleClose">取消</el-button>
+      <el-button type="primary" @click="handleConfirm">保存</el-button>
+    </div>
+  </el-dialog>
+
+  <!-- 提示 -->
+  <el-dialog 
+      :visible.sync="isOpenHintDia"
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      center
+      width="650px"
+      v-dialogDrag
+      top="8vh"
+      title="共享提示"
+      @close="isOpenHintDia=false"
+  >
+      <div class="explain-text" v-html="hintText"></div>
+      <div class="dia-bot">
+        <el-button type="primary" plain @click="isOpenHintDia=false">取消</el-button>
+        <el-button type="primary" @click="handleSetApi">保存</el-button>
+      </div>
+      
+  </el-dialog>
+</div>
+</template>
+<script>
+import { traverseTree } from "@/utils/commonOptions"
+import { operateAuthInterface,departInterence } from '@/api/modules/setApi';
+export default {
+  props: {
+    show: {
+      type: Boolean
+    },
+    list: {
+      type: Array
+    }
+  },
+  watch: {
+    show(nval) {
+      if(!nval) return
+      this.getUserList()
+    }
+  },
+  computed: {
+    hintText() {
+      let str = `
+         <p>未选择任何用户,意味着该指标不进行共享,是否确认?</p>
+      `;
+      let batchStr = `
+        <p style='margin-bottom:15px'>未选择任何用户,意味着该指标不进行共享。</p>
+        <p style='margin-bottom:15px'>注意:<span style='color:#f00'>若选中指标中存在已共享指标,则此操作(不选任何用户)会取消共享!</span></p>
+        <p>是否确认?</p>
+      `
+     return this.list.length>1 ? batchStr : str;
+    }
+  },
+  data() {
+    return {
+      formData: {
+        type: 1,
+        users: []
+      },
+      selectUserList: [],
+      usersOptions: [],
+
+      isOpenHintDia: false,
+    }
+  },
+  methods:{
+    handleClose() {
+      this.formData = {
+        type: 1,
+        users: []
+      };
+      this.selectUserList = [];
+      this.$emit('update:show',false);
+    },
+
+    handleConfirm() {
+      if(!this.selectUserList.length) return (this.isOpenHintDia = true);
+      this.handleSetApi()
+    },
+
+    async handleSetApi() {
+      this.handleClose()
+      this.$emit('confirm')
+    },
+
+      /* 获取用户列表 */
+    async getUserList() {
+      
+      const res = await departInterence.getSystemUser();
+      if (res.Ret !== 200) return
+    
+      this.usersOptions = res.Data || []
+      //遍历加上唯一的key
+      traverseTree(
+          {Children:this.usersOptions},
+          {
+              childKey:'Children',
+              nodeKey:'NodeIdKey',
+              cb:(node)=>node.NodeType===3,
+              cb2:(node)=>node.NodeId+''
+          }
+      )
+      
+      this.filterTreeEmpty({Children:this.usersOptions})
+    },
+
+     // 递归处理数组
+    filterTreeEmpty(arr) {
+      function dfs(node) {
+          if (Array.isArray(node.Children)) {
+              for (let child of node.Children) {
+                  dfs(child);
+              }
+              if(node.Children.length===0) delete node.Children
+          }
+          //若为叶子节点,且不为用户,禁止选中
+          if(!node.Children||!Array.isArray(node.Children)){
+              if(node.NodeType!==3) node.disabled = true
+          }
+      }
+      dfs(arr); 
+    },
+    
+    /* 选择用户 */
+    checkUser() {
+      let selectUser = this.$refs.userRef.getCheckedNodes(true);
+      let arr = []
+      arr = selectUser.length?selectUser.map(_ => ({
+        label: _.label,
+        value: _.value
+      })):[]
+      this.selectUserList = arr.filter(_ => this.formData.users.includes(_.value))
+    },
+
+    removeUser(val) {
+      let index = this.selectUserList.findIndex(_ => _.value===val)
+      this.selectUserList.splice(index,1)
+
+      this.formData.users = this.formData.users.filter(_ => _!==val)
+    },
+  },
+}
+</script>
+<style scoped lang='scss'>
+.wrap {
+  .el-form {
+    padding: 0 50px;
+  }
+  .checked-user {
+    display: flex;
+    gap: 10px;
+    align-content: flex-start;
+    flex-wrap: wrap;
+    margin-top: 15px;
+    padding: 15px;
+    border: 1px solid #ddd;
+    border-radius: 4px;
+    overflow-y: auto;
+    max-height: 300px;
+  }
+}
+.explain-text {
+  padding: 50px 30px;
+}
+.dia-bot {
+  margin: 30px 0;
+  display: flex;
+  justify-content: center;
+  gap: 20px;
+  .el-button {
+    width: 120px;
+  }
+}
+</style>

+ 449 - 0
src/views/dataEntry_manage/sharedComponents/setSharedListDialog.vue

@@ -0,0 +1,449 @@
+<template>
+<div>
+  <el-dialog
+		:visible.sync="show"
+		:close-on-click-modal="false"
+		:modal-append-to-body="false"
+		@close="handleClose"
+		custom-class="set-shared-dialog fit-screen-dialog"
+		center
+		top="2vh"
+		v-dialogDrag
+    :title="type==='shared'?'设置共享指标':'设置指标公开'"
+	>
+      <div class="list-wrap">
+          <p>
+              选择指标(一次选择数量不超过{{MAXAddNUM}})
+          </p>
+          <div class="filter-wrap">
+            <div>
+                <cascader
+                    style="display:inline-block"
+                    v-model="filterObj.classify"
+                    :options="classifyOption"
+                    clearable
+                    collapse-tags
+                    placeholder="选择分类"
+                    cascaderWidth="width: 240px"
+                    @changeVal="handleFilter"
+                    :config="{ multiple: true, emitPath: false }"
+                />
+
+                <div>
+                  关联子分类
+                  <el-switch
+                    v-model="filterObj.relevanceChild"
+                    :active-value="1"
+                    :inactive-value="2"
+                    style="margin-left: 5px;"
+                  />
+                </div>
+                
+                <el-select
+                  v-model="filterObj.source"
+                  style="width: 140px"
+                  clearable
+                  multiple
+                  collapse-tags
+                  @change="handleFilter"
+                >
+                  <el-option
+                    v-for="item in sourceOption"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+
+                <el-select
+                  v-model="filterObj.sharedStatus"
+                  style="width: 140px"
+                  clearable
+                  @change="handleFilter"
+                >
+                  <el-option label="未共享" :value="1"/>
+                  <el-option label="已共享" :value="2"/>
+                </el-select>
+
+                <el-input 
+                  v-model="filterObj.keyWord" 
+                  placeholder="指标名称"
+                  style="width: 200px;"
+                  @change="handleFilter"
+                  clearable
+                >
+                  <i slot="prefix" class="el-input__icon el-icon-search"/>
+                </el-input>
+                
+                <el-checkbox 
+                    label="列表全选" 
+                    v-model="filterObj.checkAll" 
+                    :indeterminate="filterObj.checkSome" 
+                    style="margin-left:10px"
+                    @change="listCheckAllChange"
+                />
+            </div>
+            
+            <el-button type="primary" style="width:120px" @click="type==='shared'? handleSetShare():handleSetPublic(null,'batch')">批量设置</el-button>
+          </div>
+          <div class="table-wrap">
+              <el-table 
+                  :data="list" 
+                  border
+                  ref="table"
+                  height="550px"
+                  v-loading="listLoading"
+                  @selection-change="selectionChange"
+                  @select="selectHandle" 
+                  @select-all="selectAllPageHandle"
+              >
+                <el-table-column type="selection" min-width="50" align="center" :selectable="filterEdbAuth"/>
+
+                <el-table-column 
+                  :label="item.label" 
+                  align="center" 
+                  v-for="item in tableColumns" 
+                  :key="item.key" 
+                  :width="item.widthsty"
+                  :min-width="item.minwidthsty"
+                >
+                  <template slot-scope="{row}">
+                      <span >{{ row[item.key] }}</span>
+                  </template>
+                </el-table-column>
+
+                <el-table-column label="操作" align="center">
+                  <template slot-scope="{row}">
+                    <el-button type="text" @click="handleSetShare(row)" v-if="type==='shared'">设置共享</el-button>
+                    <el-button type="text" @click="handleSetPublic(row)" v-else-if="type==='public'">设置公开</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+
+              <div style="height:40px;margin:20px 0;">
+                <m-page
+                    class="table-page"
+                    :total="total" 
+                    :pageSize="pageSize"
+                    :page_no="page"
+                    @handleCurrentChange="pageNumberChange"
+                />
+              </div>
+          </div>
+      </div>
+  </el-dialog>
+
+  <!-- 设置共享 -->
+  <setSharedDia
+    :show.sync="isSetSharedDia"
+    :list="chooseSetList"
+    @confirm="handleSetConfirm"
+  />
+
+  <!-- 设置公开 -->
+  <setPublicDia
+    :show.sync="isSetPublicDia"
+    :list="chooseSetList"
+    @confirm="handleSetConfirm"
+  />
+
+  <!-- 批量设置公开 -->
+  <batchSetPublicDia
+    :show.sync="isBatchSetPublicDia"
+    :list="chooseSetList"
+    @confirm="handleSetConfirm"
+  />
+</div>
+</template>
+
+<script>
+import mPage from '@/components/mPage.vue'
+import { dataBaseInterface } from '@/api/api.js';
+import { edbCollectInterface } from '@/api/modules/chartApi';
+import setSharedDia from './setSharedDia.vue';
+import setPublicDia from './setPublicDia.vue';
+import batchSetPublicDia from './batchSetPublicDia.vue';
+export default {
+    components:{ mPage,setSharedDia,setPublicDia,batchSetPublicDia },
+    props:{
+      show:{
+          type: Boolean
+      },
+      source: { //指标或图库
+        type: String,
+        default: 'edb'
+      },
+      type: { //设置共享shared 设置公开public
+			  type: Number
+		  },
+    },
+    computed:{
+      // 最大添加指标的上限
+      MAXAddNUM(){
+          let num=100
+          return num
+      },
+
+      tableColumns() {
+        let columns = [
+          {
+            label: '指标名称',
+            key: 'EdbName',
+            minwidthsty: '250px'
+          },
+          {
+            label: '计算方式',
+            key: 'SourceName',
+            widthsty:'100px'
+          },
+          {
+            label: '最新值',
+            key: 'EndValue',
+            widthsty:'100px'
+          },
+          {
+            label: '频度',
+            key: 'Frequency',
+            widthsty:'100px'
+          },
+          {
+            label: '共享用户',
+            key: 'Shareduser',
+            minwidthsty: '200px'
+          },
+        ]
+
+        return columns;
+      }
+    },
+    watch: {
+      show(n){
+        if(!n) return
+        
+        this.getSourceOpts();
+        this.getClassifyOpts();
+        this.getList();
+      }
+    },
+    data() {
+      return {
+        filterObj: {
+          classify: '',
+          relevanceChild:1,
+          pageNo: 1,
+          pageSize: 10,
+          source: '',
+          sharedStatus:'未共享',
+          keyWord: '',
+          checkAll: false, //控制全选显示状态
+          checkSome: false
+        },
+        sourceOption: [],
+        classifyOption: [],
+
+        list: [],
+        isSelectAll: false, //真正意义上的全选或不全选
+        checkedList: [], //不全选勾选中的 或 全选取消勾的
+        selectionReactCancel:false,//手动设置选中中
+
+        chooseSetList:[],
+        /* 设置共享弹窗 */
+        isSetSharedDia: false,
+        /* 设置公开弹窗 */
+        isSetPublicDia: false,
+        /* 批量设置公开 */
+        isBatchSetPublicDia: false
+      }
+    },
+    
+    methods: {
+      async getSourceOpts() {
+        const res = await dataBaseInterface.getDataSource({IsBase:2})
+        if(res.Ret !== 200) return
+
+        this.sourceOption = res.Data.map(_ => ({
+          label: _.SourceName,
+          value: _.EdbSourceId
+        })) || []
+      },
+
+      //个人目录
+      async getClassifyOpts() {
+        const res = await dataBaseInterface.targetCatalog({
+          IsOnlyMe:true,
+          ParentId:0,
+          ClassifyType:  2
+        })
+
+        if(res.Ret!==200) return 
+
+        this.classifyOption = res.Data.AllNodes || [];
+      },
+
+      async getList() {
+        
+      },
+
+      handleFilter() {
+        this.filterObj.pageNo = 1;
+        this.getList()
+      },
+      //设置共享
+      handleSetShare(item=null) {
+        this.isSetSharedDia = true;
+      },
+
+      //设置公开
+      handleSetPublic(item=null,type="single") {
+        if(type==='single') {
+          this.isSetPublicDia = true;
+        }else { //批量
+          this.isBatchSetPublicDia = true;
+        }
+      },
+
+      handleSetConfirm() {
+        this.handleClose();
+        this.$emit('change')
+      },
+
+      /* 设置当页数据勾选状态 */
+      checkedSomeSelection() {
+        this.selectionReactCancel=true
+
+        if(!this.isSelectAll){
+            this.checkedList.map(_ =>{
+                let row = this.list.find(item => item.IndexCode==_.IndexCode)
+                if(row){ //设置部分选中
+                    setTimeout(()=>{
+                        this.$refs.table.toggleRowSelection(row,true)
+                    },20)
+                }
+            })
+        }else{
+            this.$refs.table &&this.$refs.table.toggleAllSelection()
+            this.checkedList.map(_ =>{
+                let row = this.list.find(item => item.IndexCode==_.IndexCode)
+                if(row){ //设置部分不勾选
+                    setTimeout(()=>{
+                        this.$refs.table.toggleRowSelection(row,false)
+                    },20)
+                }
+            })
+        }
+        setTimeout(()=>{
+            this.selectionReactCancel=false
+        },30)
+      },
+
+      //列表全选或全不选
+      listCheckAllChange(value){
+        this.checkedList = []
+        this.isSelectAll = value
+        this.$refs.table && this.$refs.table.clearSelection()
+
+        value && this.$refs.table && this.$refs.table.toggleAllSelection()
+      },
+
+      selectionChange() {
+        if(this.selectionReactCancel) return
+
+          //设置全选框状态 选中 半选 不选
+          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.filterObj.checkAll = true
+                  this.filterObj.checkSome = false
+              //不选
+              }else if(
+                (filterChecked.length === 0 && (!this.isSelectAll))
+                || (filterChecked.length === this.total && this.isSelectAll)
+              ){
+                  this.filterObj.checkAll = false
+                  this.filterObj.checkSome = false
+              //半选
+              }else{
+                  this.filterObj.checkAll = false
+                  this.filterObj.checkSome=true
+              }
+          },1)
+      },
+
+      //单选
+      selectHandle(selection,row){ //当前选中的项是进选中还是取消选中中
+          if(this.selectionReactCancel) return 
+
+          //当前项是选中还是取消选
+          let haveChecked = selection.some(_ => _[Idkey] === row[Idkey]);
+
+          //全选取消选和不全选选中才有意义
+          if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+            this.checkedList.push(row)
+          }else {
+            this.checkedList=this.checkedList.filter(_ => _[Idkey]!==row[Idkey])
+          }
+      },
+
+      //整列选
+      selectAllPageHandle(selection){
+          if(this.selectionReactCancel) return 
+          
+          //当前页是选中还是取消
+          let haveChecked = selection && selection.length>0;
+
+          //全选取消选和不全选选中才有意义
+          if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+            this.checkedList = [...this.checkedList,...this.list]
+          }else {
+
+            let pageIds = this.list.map(_ => _[Idkey]);
+            this.checkedList = this.checkedList.filter(_ => !pageIds.includes(_[Idkey]))
+          }
+      },
+
+      // 页码改变
+      pageChange(page) {
+        this.filterObj.page_no = page;
+        this.getlist('pageChange')
+      },
+
+      handleClose() {
+        this.$emit('update:show',false)
+      }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.set-shared-dialog{
+    max-width: 1200px;
+    width:90vw;
+	  overflow: hidden;
+}
+.list-wrap{
+    .type-wrap{
+        display: flex;
+    }
+    .table-wrap{
+        margin-top: 20px;
+    }
+    .filter-wrap {
+      margin-top: 20px;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      flex-wrap: wrap;
+      gap: 10px;
+      >div {
+        display: flex;
+        align-items: center;
+        gap: 10px;
+      }
+    }
+}
+</style>

+ 95 - 0
src/views/dataEntry_manage/sharedComponents/sharedMenu.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="shared-classify">
+    <div class="section-item">
+      <div class="tree-title">我共享的</div>
+      <div class="shared-tree">
+        <el-tree
+          ref="sharedTree"
+          class="catalog-tree other-tree"
+          empty-text="暂无数据"
+          :data="sharedClassifys"
+          node-key="UniqueCode"
+          :expand-on-click-node="false"
+          @current-change="(data,node)=>{$parent.nodeChange(data,node)}"
+        >
+            <div class="custom-tree-node" slot-scope="{ data }">
+                <span class="tree-label">{{ data.ClassifyName }}</span>
+            </div>
+        </el-tree>
+      </div>
+    </div>
+
+    <div class="section-item receive-item">
+      <div class="tree-title">收到共享</div>
+      <div class="shared-tree">
+        <el-tree
+          ref="receiveTree"
+          class="catalog-tree other-tree"
+          empty-text="暂无数据"
+          :data="receiveSharedClassifys"
+          node-key="UniqueCode"
+          :expand-on-click-node="false"
+          @current-change="(data,node)=>{$parent.nodeChange(data,node)}"
+        >
+            <div class="custom-tree-node" slot-scope="{ data }">
+                <span class="tree-label">{{ data.ClassifyName }}</span>
+            </div>
+        </el-tree>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { dataBaseInterface } from '@/api/api.js';
+export default {
+  props: {
+    source: { //指标或图库
+      type: String,
+      default: 'edb'
+    }
+  },
+  data() {
+    return {
+      sharedClassifys: [],
+      receiveSharedClassifys: []
+    }
+  },
+  mounted(){
+    this.getSharedClassify()
+  },
+  methods:{
+    async getSharedClassify() {
+        const res = await dataBaseInterface.targetCatalog({
+				IsOnlyMe:this.IsOnlyMe,
+				ParentId:0,
+				ClassifyType:  2
+			})
+
+      this.sharedClassifys = res.Data.AllNodes || [];
+      this.receiveSharedClassifys = res.Data.AllNodes || [];
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.shared-classify {
+  height: 100%;
+  .section-item {
+    height: 50%;
+    display: flex;
+    flex-direction: column;
+    padding-bottom: 15px;
+    &.receive-item {
+      border-top: 1px solid #C8CDD9;
+    }
+    .tree-title {
+      font-size: 15px;
+      margin: 15px 0;
+    }
+    .shared-tree {
+      flex: 1;
+      overflow: auto;
+    }
+  }
+}
+</style>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików