Browse Source

Merge branch 'tree-level-change'

cxmo 1 year ago
parent
commit
fb90691a94
30 changed files with 551 additions and 169 deletions
  1. 6 0
      src/api/modules/chartApi.js
  2. 15 0
      src/api/modules/predictEdbApi.js
  3. 1 1
      src/views/chartRelevance_manage/components/saveChartTobaseDia.vue
  4. 4 4
      src/views/chartRelevance_manage/components/saveEdbToBaseDia.vue
  5. 2 2
      src/views/dataEntry_manage/adjustdata/adjustData.vue
  6. 64 15
      src/views/dataEntry_manage/chartSetting.vue
  7. 2 2
      src/views/dataEntry_manage/codecount/index.vue
  8. 1 1
      src/views/dataEntry_manage/components/SaveChartOther.vue
  9. 8 4
      src/views/dataEntry_manage/components/chartDialog.vue
  10. 3 3
      src/views/dataEntry_manage/databaseComponents/batchComptedDialog.vue
  11. 2 2
      src/views/dataEntry_manage/databaseComponents/completeTargetDia.vue
  12. 2 2
      src/views/dataEntry_manage/databaseComponents/computedDialog.vue
  13. 5 4
      src/views/dataEntry_manage/databaseComponents/diffusionIndexDia.vue
  14. 4 3
      src/views/dataEntry_manage/databaseComponents/fittingResidueDia.vue
  15. 4 3
      src/views/dataEntry_manage/databaseComponents/jointTargetDia.vue
  16. 26 7
      src/views/dataEntry_manage/databaseComponents/openDialog.vue
  17. 2 2
      src/views/dataEntry_manage/databaseComponents/operationDialog.vue
  18. 84 23
      src/views/dataEntry_manage/databaseList.vue
  19. 1 1
      src/views/dataEntry_manage/editChart.vue
  20. 2 2
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  21. 32 4
      src/views/predictEdb_manage/addPredicEdb.vue
  22. 2 1
      src/views/predictEdb_manage/components/childData.vue
  23. 29 16
      src/views/predictEdb_manage/components/classifyDia.vue
  24. 23 8
      src/views/predictEdb_manage/components/computedDialog.vue
  25. 2 0
      src/views/predictEdb_manage/components/edbDetail.vue
  26. 15 4
      src/views/predictEdb_manage/components/edbDia.vue
  27. 20 5
      src/views/predictEdb_manage/components/operationDialog.vue
  28. 46 26
      src/views/predictEdb_manage/mixins/mixin.js
  29. 142 22
      src/views/predictEdb_manage/predictEdb.vue
  30. 2 2
      src/views/supply_manage/components/createTargetDia.vue

+ 6 - 0
src/api/modules/chartApi.js

@@ -11,6 +11,9 @@ const dataBaseInterface = {
 	nodeAdd: params => {
 		return http.post('/datamanage/classify/add',params)
 	},
+    nodeAddV2: params => {
+		return http.post('/datamanage/classify/addv2',params)
+	},
 	/**
 	 * 删除分类接口
 	 * @param {ClassifyId} params 
@@ -54,6 +57,9 @@ const dataBaseInterface = {
 	menuListV2: params => {
 		return http.get('/datamanage/classify/items/v2',params)
 	},
+	menuListV3: params => {
+		return http.get('/datamanage/classify/items/v3',params)
+	},
 	/**
 	 * 通过分类查找指标列表数据
 	 * @param ClassifyId

+ 15 - 0
src/api/modules/predictEdbApi.js

@@ -7,6 +7,21 @@ import http from "@/api/http.js"
 export const classifyList = params => {
   return http.get('/datamanage/predict_classify/list',params)
 }
+/**
+ * 添加分类V2 懒加载
+ * @returns 
+ */
+export const classifyListV2 = params => {
+    return http.get('/datamanage/predict_classify/list/v2',params)
+}
+/**
+ * 分类的图表列表 IsOnlyMe ClassifyId
+ * @param {*} params 
+ * @returns 
+ */
+export const classifyChartList = params => {
+    return http.get('/datamanage/predict_edb_info/items',params)
+}
 
 /**
  * 新增分类

+ 1 - 1
src/views/chartRelevance_manage/components/saveChartTobaseDia.vue

@@ -114,7 +114,7 @@ export default {
       }
 
       if(res.Ret !== 200) return
-      this.filterNodes(res.Data.AllNodes,this.chartData.Source===1?2:1)
+      this.filterNodes(res.Data.AllNodes,this.chartData.Source===1?3:1)
 
 			this.classifyOptions = res.Data.AllNodes || [];
     

+ 4 - 4
src/views/chartRelevance_manage/components/saveEdbToBaseDia.vue

@@ -136,13 +136,13 @@ export default {
 			let res;
 			//统计特征区分原指标是否预测,保存到预测指标库或/eta指标库
 			if(this.$route.path==='/statisticFeatureChartEditor'&&this.$parent.oldEdbInfoType) {
-        res = await preDictEdbInterface.classifyList()
+        res = await preDictEdbInterface.classifyListV2()
 				if(res.Ret !== 200) return
-				this.filterNodes(res.Data.AllNodes,1);
+				//this.filterNodes(res.Data.AllNodes,1);
       }else {
-				res = await dataBaseInterface.menuList()
+				res = await dataBaseInterface.menuListV3()
 				if(res.Ret !== 200) return
-				this.filterNodes(res.Data.AllNodes,2);
+				//this.filterNodes(res.Data.AllNodes,2);
 			}
 
 			this.options = res.Data.AllNodes || [];

+ 2 - 2
src/views/dataEntry_manage/adjustdata/adjustData.vue

@@ -349,9 +349,9 @@ export default {
 
     /* 获取目录结构 */
 		getMenu() {
-			dataBaseInterface.menuList().then((res) => {
+			dataBaseInterface.menuListV3().then((res) => {
 				if (res.Ret === 200) {
-					this.filterNodes(res.Data.AllNodes)
+					//this.filterNodes(res.Data.AllNodes)
 					this.classifyOptions = res.Data.AllNodes || [];
 				}
 			});

+ 64 - 15
src/views/dataEntry_manage/chartSetting.vue

@@ -74,7 +74,7 @@
               check-strictly
               empty-text="暂无分类"
               lazy
-						  :load="handleTreeLoad"
+						  :load="getLazyTreeData"
               @node-expand="handleNodeExpand"
               @node-collapse="handleNodeCollapse"
               @current-change="nodeChange"
@@ -119,7 +119,7 @@
                     alt=""
                     style="width: 14px; height: 14px; margin-right: 8px"
                     @click.stop="addNode(node, data)"
-                    v-if="node.level === 1 && role === 'admin'"
+                    v-if="(node.level === 1||node.level === 2) && role === 'admin'"
                   />
                   <img
                     src="~@/assets/img/set_m/edit.png"
@@ -867,7 +867,7 @@ export default {
           (item) => item.ChartInfoId === newval
         );
         // 查找图表的父级id
-        let arr = this.findParentNodeForClassifyId(search_obj.ChartClassifyId,search_obj.UniqueCode);
+        let arr = this.findParentNodeHandle(this.treeData,search_obj.ChartClassifyId);
         this.defaultShowNodes = arr;
         this.select_node = search_obj.UniqueCode;
       
@@ -1135,7 +1135,7 @@ export default {
             : node.level === 2
             ? data.ChartClassifyName
             : node.parent.data.ChartClassifyName,
-        // level_3: node.level === 3 ? data.ChartClassifyName : '',
+        level_3: node.level === 3 ? data.ChartClassifyName : '',
         classify_id: data.ChartClassifyId,
         level: node.level,
       };
@@ -1237,7 +1237,7 @@ export default {
           return item === code;
         });
         // console.log(flag)
-        !flag && this.defaultShowNodes.push(code);
+        !flag && code && this.defaultShowNodes.push(code);
         sessionStorage.removeItem('expandCode');
       }
     },
@@ -1254,7 +1254,7 @@ export default {
     canDropHandle(draggingNode, dropNode, type) {
       let canDrop = false;
       // 移动的是一级目录
-			if(draggingNode.level===1&&dropNode.level===1) {
+			if(draggingNode.level===1&&dropNode.level===1&&type!=='inner') {
 				canDrop=true
 			} 
 
@@ -1265,12 +1265,18 @@ export default {
 				}
 			}
 
-			//三级指标层
+			//三级目录
 			if(draggingNode.level===3){
 				if((dropNode.level===2&&type==='inner')||(dropNode.level===3&&type!=='inner')){
 					canDrop=true
 				}
 			}
+			//四级指标层
+			if(draggingNode.level===4){
+				if((dropNode.level===3&&type==='inner')||(dropNode.level===4&&type!=='inner')){
+					canDrop=true
+				}
+			}
 
       return canDrop;
     },
@@ -1279,17 +1285,17 @@ export default {
       // console.log(i, a);
       // 被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置
       // 一/二级目录
-      if (b.level === 1 || b.level === 2) {
+      if (b.level === 1 || b.level === 2||b.level===3) {
         this.handleMoveCatalogue(b, a, i, e)
       }
 
       // 指标层
-      if (b.level === 3) {
+      if (b.level === 4) {
         this.handleMoveChart(b, a, i, e)
       }
     },
 
-    // 移动的为一、二级目录
+    // 移动的为一、二、三级目录
 		handleMoveCatalogue(b,a,i,e){
 			let list=a.parent.childNodes,targetIndex=0,PrevClassifyId=0,NextClassifyId=0,ParentClassifyId=0;
 
@@ -1320,6 +1326,15 @@ export default {
 					ParentClassifyId=a.data.ParentId
 				}
 			}
+			if(b.level===3){
+				if(i==='inner'){
+					ParentClassifyId=a.data.ChartClassifyId
+					PrevClassifyId=0
+					NextClassifyId=a.data.Children.length>1?a.data.Children[1].ChartClassifyId:0
+				}else{
+					ParentClassifyId=a.data.ParentId
+				}
+			}
 
       dataBaseInterface.chartClassifyMove({
         ClassifyId: b.data.ChartClassifyId,
@@ -1334,7 +1349,7 @@ export default {
       });
 		},
 
-		// 移动的为指标层 
+		// 移动的为指标层 
 		handleMoveChart(b,a,i,e){
 			let PrevChartInfoId=0,NextChartInfoId=0,targetIndex=0, list=a.parent.childNodes.map(_ => _.data)
 			if(i==='inner'){
@@ -1423,7 +1438,7 @@ export default {
     },
     // 树节点关闭
     handleNodeCollapse(data) {
-      this.defaultShowNodes.forEach((item, index) => {
+      this.defaultShowNodes.some((item, index) => {
         if (item === data.UniqueCode) {
           // 删除关闭节点
           this.defaultShowNodes.length = index;
@@ -1470,6 +1485,40 @@ export default {
 				resolve([])
 			}
 		},
+		//绑定el-tree的load属性
+		getLazyTreeData (node,resolve,maxLevel=3){
+			if(node.level===0){
+				resolve(this.treeData)
+			}
+			if(node.level>0&&node.level<=maxLevel){
+				//获取对应层级的Child
+				resolve(node.data.Children||[])
+			}
+			if(node.level===maxLevel){
+				//调接口获取该分类下图表的数据
+				dataBaseInterface.getChartListForClassify({
+					ChartClassifyId:node.data.ChartClassifyId,
+					IsShowMe:this.isOnlyMe
+				}).then(res=>{
+					if(res.Ret===200){
+						let arr=res.Data.AllNodes||[]
+						arr=arr.map(item=>{
+							return {
+								...item,
+								isLeaf:true
+							}
+						})
+						resolve(arr)
+					}else{
+						resolve([])
+					}
+					this.changeTreeNode()
+				})
+			}
+			if(node.level>maxLevel){
+				resolve([])
+			}
+		},
 
     /* 获取图表详情信息  type为refresh刷新指标不存储时间 */
     getChartInfo(type) {
@@ -1547,7 +1596,7 @@ export default {
           //将指标添加进标签列表中
             const {ChartNameEn,ChartName,ChartInfoId,UniqueCode,ChartClassifyId}=res.Data.ChartInfo
             this.addLabel({code:UniqueCode,id:ChartInfoId,classifyId:ChartClassifyId,EdbName:ChartName,EdbNameEn:ChartNameEn,chartData:res.Data.ChartInfo})
-            this.defaultShowNodes=this.findParentNodeForClassifyId(ChartClassifyId,UniqueCode)
+            this.defaultShowNodes=this.findParentNodeHandle(this.treeData,ChartClassifyId)
             this.changeTreeNode()
         }
         
@@ -1885,7 +1934,7 @@ export default {
       // 查找选中的节点信息
       let select_obj = chartData?chartData:await this.findNode(deep_arr, id);
       // 查找图表的分类父级id
-      let arr = this.findParentNodeForClassifyId(select_obj.ChartClassifyId, code); // 父的父的父-父的父-父
+      let arr = this.findParentNodeHandle(this.treeData,select_obj.ChartClassifyId); // 父的父的父-父的父-父
       this.defaultShowNodes = arr;
       this.select_node = code;
       
@@ -1971,7 +2020,7 @@ export default {
     findParentNodeHandle(arr, id) {
       // 遍历取父级code push数组
       for (let i of arr) {
-        if (i.UniqueCode === id) {
+        if (i.ChartClassifyId === id) {
           return [i.UniqueCode];
         }
         if (i.Children) {

+ 2 - 2
src/views/dataEntry_manage/codecount/index.vue

@@ -347,9 +347,9 @@ export default {
 
 		/* 获取目录结构 */
 		getMenu() {
-			dataBaseInterface.menuList().then((res) => {
+			dataBaseInterface.menuListV3().then((res) => {
 				if (res.Ret !== 200) return
-					this.filterNodes(res.Data.AllNodes);
+					//this.filterNodes(res.Data.AllNodes);
 					this.menuOptions = res.Data.AllNodes || [];
 			});
 		},

+ 1 - 1
src/views/dataEntry_manage/components/SaveChartOther.vue

@@ -129,7 +129,7 @@ export default {
       }else if([7,8,9,'statistic_feature'].includes(this.source)) { //标准差 百分位 频率图
         this.filterNodes(res.Data.AllNodes,1)
       }else{
-        this.filterNodes(res.Data.AllNodes,2)
+        this.filterNodes(res.Data.AllNodes,3)
       }
 
 			this.classifyOptions = res.Data.AllNodes || [];

+ 8 - 4
src/views/dataEntry_manage/components/chartDialog.vue

@@ -47,7 +47,7 @@
 						</el-form-item>
 					</template>
 					<!-- 添加/编辑三级目录 -->
-				<!-- 	<template v-else-if="(title=='添加'&&formData.level === 2)
+					<template v-else-if="(title=='添加'&&formData.level === 2)
 					|| (title=='编辑'&&formData.level === 3)">
 						<el-form-item label="一级目录" prop="level_1">
 							<span>{{formData.level_1}}</span>
@@ -61,7 +61,7 @@
 							style="width: 80%"
 							placeholder="必填项"></el-input>
 						</el-form-item>
-					</template> -->
+					</template>
 				</el-form>
 			</div>
 			<div class="dia-bot">
@@ -120,6 +120,8 @@ export default {
 							? this.formData.level_1
 							: this.formData.level === 1
 							? this.formData.level_2
+							: this.formData.level === 2
+							? this.formData.level_3
 							:'',
 						ParentId:this.formData.parent_id || 0,
 						Level: this.formData.level
@@ -130,7 +132,7 @@ export default {
 						}
 					})
 					//修改图表
-					if(this.title==='编辑' && this.formData.level===3) {
+					if(this.title==='编辑' && this.formData.level===4) {
 						dataBaseInterface.chartEdit({
 							ChartClassifyId: this.formData.level_menu[this.formData.level_menu.length - 1],
 							ChartInfoId: this.formData.chart_id,
@@ -141,13 +143,15 @@ export default {
 								this.callbackHandle('update');
 							}
 						})
-					}else if(this.title==='编辑' && this.formData.level!==3) {
+					}else if(this.title==='编辑' && this.formData.level!==4) {
 						//修改目录
 						dataBaseInterface.editChartClassify({
 							ChartClassifyName: this.formData.level === 1
 								? this.formData.level_1
 								: this.formData.level === 2
 								? this.formData.level_2
+								:this.formData.level === 3
+								?this.formData.level_3
 								:'',
 							ChartClassifyId:this.formData.classify_id || 0
 						}).then(res => {

+ 3 - 3
src/views/dataEntry_manage/databaseComponents/batchComptedDialog.vue

@@ -370,10 +370,10 @@ export default {
 		/* 获取目录结构 */
 		async getMenu() {
 			const res = this.edbSource === 'predict'
-				? await preDictEdbInterface.classifyOne()
-				: await dataBaseInterface.menuList()
+				? await preDictEdbInterface.classifyListV2()
+				: await dataBaseInterface.menuListV3()
 				if (res.Ret !== 200) return
-				this.edbSource !== 'predict' && this.filterNodes(res.Data.AllNodes);
+				//this.edbSource !== 'predict' && this.filterNodes(res.Data.AllNodes);
 				this.options = res.Data.AllNodes || [];
 		},
 		// 递归改变第三级目录结构

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

@@ -124,9 +124,9 @@ export default {
 	methods: {
 		/* 获取目录结构 */
 		getMenu() {
-			dataBaseInterface.menuList().then(res => {
+			dataBaseInterface.menuListV3().then(res => {
 				if(res.Ret === 200) {
-					this.filterNodes(res.Data.AllNodes);
+					//this.filterNodes(res.Data.AllNodes);
 					this.options = res.Data.AllNodes || [];
 				}
 			})

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

@@ -258,9 +258,9 @@ export default {
 	methods: {
 		/* 获取目录结构 */
 		getMenu() {
-			dataBaseInterface.menuList().then((res) => {
+			dataBaseInterface.menuListV3().then((res) => {
 				if (res.Ret === 200) {
-					this.filterNodes(res.Data.AllNodes);
+					//this.filterNodes(res.Data.AllNodes);
 					this.options = res.Data.AllNodes || [];
 				}
 			});

+ 5 - 4
src/views/dataEntry_manage/databaseComponents/diffusionIndexDia.vue

@@ -325,15 +325,16 @@ export default {
 		/* 获取目录结构 */
 		async getMenu() {
 			const res = this.isPredict
-      ? await preDictEdbInterface.classifyOne()
-      : await dataBaseInterface.menuList()
+      ? await preDictEdbInterface.classifyListV2()
+      : await dataBaseInterface.menuListV3()
 				if (res.Ret === 200) {
-					if(!this.isPredict){
+					/* if(!this.isPredict){
 						this.filterNodes(res.Data.AllNodes);
 						this.options = res.Data.AllNodes || [];
 					}else{
 						this.options = res.Data.AllNodes || [];
-					}
+					} */
+					this.options = res.Data.AllNodes || [];
 				}
 		},
 		// 递归改变第三级目录结构

+ 4 - 3
src/views/dataEntry_manage/databaseComponents/fittingResidueDia.vue

@@ -360,15 +360,16 @@ export default {
 
 		/* 获取目录结构 */
 		async getMenu() {
-			const res=this.isPredict?await preDictEdbInterface.classifyOne():await dataBaseInterface.menuList()
+			const res=this.isPredict?await preDictEdbInterface.classifyListV2():await dataBaseInterface.menuListV3()
 			// dataBaseInterface.menuList().then((res) => {
 				if (res.Ret === 200) {
-					if(!this.isPredict){
+					/* if(!this.isPredict){
 						this.filterNodes(res.Data.AllNodes);
 						this.options = res.Data.AllNodes || [];
 					}else{
 						this.options = res.Data.AllNodes || [];
-					}
+					} */
+					this.options = res.Data.AllNodes || [];
 				}
 			// });
 		},

+ 4 - 3
src/views/dataEntry_manage/databaseComponents/jointTargetDia.vue

@@ -421,15 +421,16 @@ export default {
 
 		/* 获取目录结构 */
 		async getMenu() {
-			const res=this.isPredict?await preDictEdbInterface.classifyOne():await dataBaseInterface.menuList()
+			const res=this.isPredict?await preDictEdbInterface.classifyListV2():await dataBaseInterface.menuListV3()
 			// dataBaseInterface.menuList().then(res => {
 				if(res.Ret === 200) {
-					if(!this.isPredict){
+					/* if(!this.isPredict){
 						this.filterNodes(res.Data.AllNodes);
 						this.menuOptions = res.Data.AllNodes || [];
 					}else{
 						this.menuOptions = res.Data.AllNodes || [];
-					}
+					} */
+					this.menuOptions = res.Data.AllNodes || [];
 				}
 			// })
 		},

+ 26 - 7
src/views/dataEntry_manage/databaseComponents/openDialog.vue

@@ -46,8 +46,25 @@
 							placeholder="必填项"></el-input>
 						</el-form-item>
 					</template>
+					<!-- 添加/编辑3级目录 -->
+					<template 
+					v-else-if="(title=='添加'&&formData.level === 2)
+					|| (title=='编辑'&&formData.level === 3)">
+						<el-form-item label="一级目录" prop="level_1">
+							<span>{{formData.level_1}}</span>
+						</el-form-item>
+						<el-form-item label="二级目录" prop="level_2">
+							<span>{{formData.level_2}}</span>
+						</el-form-item>
+						<el-form-item label="目录名称" prop="level_3">
+							<el-input
+							v-model="formData.level_3"
+							style="width: 80%"
+							placeholder="必填项"></el-input>
+						</el-form-item>
+					</template>
 					<!-- 编辑具体指标 -->
-					<template v-else-if="title=='编辑' && formData.level === 3">
+					<template v-else-if="title=='编辑' && formData.level === 4">
 						<el-form-item label="指标名称" prop="level_4">
 							<el-input
 							v-model="formData.level_4"
@@ -113,7 +130,7 @@ export default {
 	watch: {
 		'isOpenDialog': {
 			handler(newval) {
-				if(newval && this.formData.level === 3) {
+				if(newval && this.formData.level === 4) {
 					this.getMenu();
 				}
 				// console.log(this.formData);
@@ -174,7 +191,7 @@ export default {
 						Level: this.formData.level
 					})
 			}else if(this.title==='编辑') {
-				res = this.formData.level===3
+				res = this.formData.level===4
 					? await dataBaseInterface.targetEdit({
 							ClassifyId: this.formData.level_menu[this.formData.level_menu.length - 1],
 							EdbInfoId: this.formData.edbinfo_id,
@@ -187,6 +204,8 @@ export default {
 								? this.formData.level_1
 								: this.formData.level === 2
 								? this.formData.level_2
+								: this.formData.level === 3
+								?this.formData.level_3
 								:'',
 							ClassifyId:this.formData.classify_id || 0
 						})
@@ -195,8 +214,8 @@ export default {
 			this.$message.success(res.Msg);
 
 		 if(this.title==='添加') this.callbackHandle('add');
-		 else if(this.title==='编辑' && this.formData.level===3) this.callbackHandle('update');
-		 else if(this.title==='编辑' && this.formData.level!==3) this.callbackHandle();
+		 else if(this.title==='编辑' && this.formData.level===4) this.callbackHandle('update');
+		 else if(this.title==='编辑' && this.formData.level!==4) this.callbackHandle();
 
 				
 		},
@@ -213,9 +232,9 @@ export default {
 		
 		/* 获取目录结构 */
 		getMenu() {
-			dataBaseInterface.menuList().then(res => {
+			dataBaseInterface.menuListV3().then(res => {
 				if(res.Ret === 200) {
-					this.filterNodes(res.Data.AllNodes);
+					//this.filterNodes(res.Data.AllNodes);
 					this.options = res.Data.AllNodes || [];
 				}
 			})

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

@@ -486,9 +486,9 @@ export default {
 
 		/* 获取目录结构 */
 		getMenu() {
-			dataBaseInterface.menuList().then((res) => {
+			dataBaseInterface.menuListV3().then((res) => {
 				if (res.Ret === 200) {
-					this.filterNodes(res.Data.AllNodes);
+					//this.filterNodes(res.Data.AllNodes);
 					this.options = res.Data.AllNodes || [];
 				}
 			});

+ 84 - 23
src/views/dataEntry_manage/databaseList.vue

@@ -64,7 +64,7 @@
 						check-strictly
 						empty-text="暂无目录"
 						lazy
-						:load="handleTreeLoad"
+						:load="getLazyTreeData"
 						@node-expand="handleNodeExpand"
 						@node-collapse="handleNodeCollapse"
 						@current-change="nodeChange"
@@ -219,12 +219,15 @@
 								type="text" 
 								:disabled="!scope.row.Button.OpButton"
 								@click="editNode({
-									level: 3,
+									level: 4,
 									parent: {
-										data: { ClassifyId:edb_levels[1].ClassifyId },
+										data: { ClassifyId:edb_levels[2].ClassifyId },
 										parent:{
-											data: { ClassifyId:edb_levels[1].ParentId },
-										}
+											data: { ClassifyId:edb_levels[1].ClassifyId },
+											parent:{
+												data: { ClassifyId:edb_levels[0].ClassifyId },
+											}
+										},
 									}
 								},scope.row)"
 								>编辑</el-button>
@@ -668,12 +671,12 @@ export default {
 				this.page_no = 1;
 				this.$refs.valueUl.scrollTop = 0;
 				// 查找图表的父级code
-				this.defaultShowNodes = this.findParentNodeForClassifyId(search_obj.ClassifyId,search_obj.UniqueCode);
+				//this.defaultShowNodes = this.findParentNodeHandle(this.treeData,search_obj.ClassifyId);
 				this.select_node = search_obj.UniqueCode;
 				this.selected_edbid = newval;
 
 				//滚动到高亮节点位置
-				setTimeout(() => {
+				/* setTimeout(() => {
 					this.$refs.menuTree.setCurrentKey(this.select_node);
 					let node = document.getElementById(`node${this.select_node}`);
 					let parent = document.getElementsByClassName('tree-cont')[0];
@@ -681,7 +684,7 @@ export default {
 					if(node.offsetTop > parent.offsetHeight) {
 						parent.scrollTop =  node.offsetTop - parent.offsetHeight/2
 					}
-				},400)
+				},400) */
 			}
 		},
 	},
@@ -711,7 +714,7 @@ export default {
 		/* 获取树分类数据 */
 		getTreeData(params) {
 			
-			dataBaseInterface.menuListV2().then(res=>{
+			dataBaseInterface.menuListV3().then(res=>{
 				if(res.Ret===200){
 					const arr=res.Data.AllNodes || []
 					this.treeData=arr.map(item=>{
@@ -765,7 +768,7 @@ export default {
 						//将指标添加进标签列表中
 						const {EdbNameEn,EdbName,EdbInfoId,UniqueCode,ClassifyId}=res.Data.Item
 						this.addLabel({code:UniqueCode,id:EdbInfoId,classifyId:ClassifyId,EdbName,EdbNameEn})
-						this.defaultShowNodes=this.findParentNodeForClassifyId(ClassifyId,UniqueCode)
+						this.defaultShowNodes=this.findParentNodeHandle(this.treeData,ClassifyId)
 						//设置tree高亮
 						this.$refs.menuTree.setCurrentKey(UniqueCode);
 
@@ -783,6 +786,14 @@ export default {
 						const _node = this.$refs.menuTree.getNode(this.select_node)
 						this.dynamicNode = _node;
 						this.dynamicNode&&this.resetNodeStyle(this.dynamicNode)
+						//滚动到高亮位置
+						setTimeout(() => {
+							let node = document.getElementById(`node${this.select_node}`)||{}
+							let parent = document.getElementsByClassName('tree-cont')[0];
+							if(node.offsetTop > parent.offsetHeight) {
+								parent.scrollTop =  node.offsetTop - parent.offsetHeight/2
+							}
+						},400)
 					})
 					
 				}
@@ -935,6 +946,7 @@ export default {
 			this.isComplete = false;
 			this.isAddTarget = false;
 			this.getTreeData(params);
+			this.changeTreeNode()
 			// this.getNewTargetList();
 		},
 		/* 取消新增回调 */
@@ -1045,7 +1057,7 @@ export default {
 							level: node.level,
 							level_4: res.Data.EdbName,
 							level_menu:[
-								// node.parent.parent.parent.data.ClassifyId,
+								node.parent.parent.parent.data.ClassifyId,
 								node.parent.parent.data.ClassifyId,
 								node.parent.data.ClassifyId
 							],
@@ -1097,9 +1109,9 @@ export default {
 					:node.level === 2
 					? data.ClassifyName
 					: node.parent.data.ClassifyName,
-					// level_3: node.level === 3
-					// ? data.ClassifyName
-					// : '',
+					level_3: node.level === 3
+					? data.ClassifyName
+					: '',
 					classify_id: data.ClassifyId,
 					level: node.level
 				}
@@ -1118,7 +1130,7 @@ export default {
 					return item === code
 				});
 				// console.log(flag)
-				!flag && this.defaultShowNodes.push(code);
+				!flag &&code&& this.defaultShowNodes.push(code);
 				sessionStorage.removeItem('expandCode');
 			}
 		},
@@ -1229,7 +1241,7 @@ export default {
 		canDropHandle(draggingNode, dropNode, type) {
 			let canDrop=false
 			// 移动的是一级目录
-			if(draggingNode.level===1&&dropNode.level===1) {
+			if(draggingNode.level===1&&dropNode.level===1&&type!=='inner') {
 				canDrop=true
 			} 
 
@@ -1240,29 +1252,35 @@ export default {
 				}
 			}
 
-			//三级指标层
+			//三级目录
 			if(draggingNode.level===3){
 				if((dropNode.level===2&&type==='inner')||(dropNode.level===3&&type!=='inner')){
 					canDrop=true
 				}
 			}
+			//四级指标
+			if(draggingNode.level===4){
+				if((dropNode.level===3&&type==='inner')||(dropNode.level===4&&type!=='inner')){
+					canDrop=true
+				}
+			}
 			
 			return canDrop
 		},
 		/* 拖拽完成 */
 		dropOverHandle(b,a,i,e) {
 			// 被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置
-			if(b.level===1||b.level===2){
+			if(b.level===1||b.level===2||b.level===3){
 				this.handleMoveCatalogue(b,a,i,e)
 			}
 
 			// 指标层
-			if(b.level===3){
+			if(b.level===4){
 				this.handleMoveEdb(b,a,i,e)
 			}
 		},
 
-		// 移动的为一、二级目录
+		// 移动的为一、二、三级目录
 		handleMoveCatalogue(b,a,i,e){
 			let list=a.parent.childNodes,targetIndex=0,PrevClassifyId=0,NextClassifyId=0,ParentClassifyId=0;
 
@@ -1294,6 +1312,16 @@ export default {
 				}
 			}
 
+			if(b.level===3){
+				if(i==='inner'){
+					ParentClassifyId=a.data.ClassifyId
+					PrevClassifyId=0
+					NextClassifyId=a.data.Children.length>1?a.data.Children[1].ClassifyId:0
+				}else{
+					ParentClassifyId=a.data.ParentId
+				}
+			}
+
 			dataBaseInterface.classifyMove({
 				ClassifyId:b.data.ClassifyId,
 				ParentClassifyId:ParentClassifyId,
@@ -1307,7 +1335,7 @@ export default {
 			})
 		},
 
-		// 移动的为指标层 
+		// 移动的为指标层 
 		handleMoveEdb(b,a,i,e){
 			let PrevEdbInfoId=0,NextEdbInfoId=0,targetIndex=0,list=a.parent.childNodes.map(_ => _.data)
 			if(i==='inner'){
@@ -1411,7 +1439,7 @@ export default {
 		findParentNodeHandle(arr, id) {
 			// 遍历取父级code push数组
 			for (let i of arr) {
-				if (i.UniqueCode === id) {
+				if (i.ClassifyId === id) {
 					return [i.UniqueCode];
 				}
 				if (i.Children) {
@@ -1567,6 +1595,7 @@ export default {
 					edb_id:res.EdbInfoDetail.EdbInfoId,
 					formula: res.EdbInfoDetail.CalculateFormula,
 					menu: [
+						node.parent.parent.parent.data.ClassifyId,
 						node.parent.parent.data.ClassifyId,
 						data.ClassifyId
 					],
@@ -1585,6 +1614,7 @@ export default {
 					frequency: dataInfo.Frequency,
 					unit: dataInfo.Unit,
 					menu: [
+						node.parent.parent.parent.data.ClassifyId,
 						node.parent.parent.data.ClassifyId,
 						data.ClassifyId
 					],
@@ -1740,8 +1770,39 @@ export default {
 				this.dynamicNode = _node;
 				this.dynamicNode&&this.resetNodeStyle(this.dynamicNode)
 			})
+		},
+		//绑定el-tree的load属性
+		getLazyTreeData (node,resolve,maxLevel=3){
+			if(node.level===0){
+				resolve(this.treeData)
+			}
+			if(node.level>0&&node.level<=maxLevel){
+				//获取对应层级的Child
+				resolve(node.data.Children||[])
+			}
+			if(node.level===maxLevel){
+				//调接口获取该分类下指标的数据
+				dataBaseInterface.getEdbListForClassify({ClassifyId:node.data.ClassifyId}).then(res=>{
+					if(res.Ret===200){
+						let arr=res.Data.EdbInfoList||[]
+						arr=arr.map(item=>{
+							return {
+								...item,
+								isLeaf:true
+							}
+						})
+						resolve(arr)
+					}else{
+						resolve([])
+					}
+					this.changeTreeNode()
+				})
+			}
+			if(node.level>maxLevel){
+				resolve([])
+			}
 		}
-	},
+		},
 	//离开页面时保存标签
 	beforeRouteLeave(to,from,next){
 		sessionStorage.setItem('database',JSON.stringify(this.labelList))

+ 1 - 1
src/views/dataEntry_manage/editChart.vue

@@ -561,7 +561,7 @@ export default {
           if (res.Ret !== 200) return;
 					const { ChartInfo,EdbInfoList,BarChartInfo } = res.Data;
 
-          this.chartInfo = {...ChartInfo, classify: ChartInfo.ChartClassify.map(item => item.ChartClassifyId)};
+          this.chartInfo = {...ChartInfo, classify: [ChartInfo.ChartClassify[0].ParentId,...ChartInfo.ChartClassify.map(item => item.ChartClassifyId)]};
           this.tableData = EdbInfoList;
           this.setDefaultDateSelect(); //设置默认的日期选中
 					

+ 2 - 2
src/views/dataEntry_manage/mixins/addOreditMixin.js

@@ -400,11 +400,11 @@ export default {
 			})
 		},
 
-		// 递归改变第级目录结构
+		// 递归改变第级目录结构
 		filterNodes(arr) {
 			arr.length && arr.forEach(item => {
 				item.Children.length && this.filterNodes(item.Children)
-				if(item.Level === 2) {
+				if(item.Level === 3) {
 					delete item.Children
 				}
 			})

+ 32 - 4
src/views/predictEdb_manage/addPredicEdb.vue

@@ -15,7 +15,7 @@
           <el-form-item prop="classify">
             <div class="item">
               <span class="label">添加到分类</span>
-              <el-select
+              <!-- <el-select
                 v-model="formData.classify"
                 placeholder="请选择分类"
                 style="width: 100%"
@@ -28,7 +28,18 @@
                   :value="item.ClassifyId"
                 >
                 </el-option>
-              </el-select>
+              </el-select> -->
+              <el-cascader
+                    v-model="formData.classify"
+                    :options="classifyArr"
+                    :props="{
+                        label: 'ClassifyName',
+                        value: 'ClassifyId',
+                        children: 'Children',
+                    }"
+                    style="width: 90%"
+                    placeholder="请选择所属分类"
+                />
             </div>
           </el-form-item>
           <el-form-item prop="oldEdb" v-if="!formData.edb_id">
@@ -614,12 +625,29 @@ export default {
     },
 
     getClassifyOne() {
-      preDictEdbInterface.classifyOne().then((res) => {
+      preDictEdbInterface.classifyListV2().then((res) => {
         if (res.Ret !== 200) return;
 
         this.classifyArr = res.Data.AllNodes || [];
+        //将formData.classify转为数组的格式
+        this.formData.classify = this.findParentNodeHandle(this.classifyArr,this.formData.classify).reverse()
+
       });
     },
+    findParentNodeHandle(arr, id) {
+      // 遍历取父级code push数组
+      for (let i of arr) {
+        if (i.ClassifyId === id) {
+          return [i.ClassifyId];
+        }
+        if (i.Children) {
+          let node = this.findParentNodeHandle(i.Children, id);
+          if (node) {
+            return node.concat(i.ClassifyId);
+          }
+        }
+      }
+    },
 
     searchLoad() {
       if (!this.search_have_more) return;
@@ -830,7 +858,7 @@ export default {
         }
       })
       let params = {
-        ClassifyId: classify,
+        ClassifyId: classify[classify.length-1],
         EdbName: edbName,
         MaxValue: Number(this.$refs.chartInfo.tableData[0].MaxData),
 				MinValue: Number(this.$refs.chartInfo.tableData[0].MinData),

+ 2 - 1
src/views/predictEdb_manage/components/childData.vue

@@ -143,8 +143,9 @@ export default {
         this.$emit('updateTit',{
           edb_name: Item.EdbName,
           edb_nameEn: Item.EdbNameEn,
-          userid: Item.SysUserId
+          userid: Item.SysUserId,
         })
+        this.$emit('setCurrentClassify',Item.ClassifyId)
 
       })
     },

+ 29 - 16
src/views/predictEdb_manage/components/classifyDia.vue

@@ -4,7 +4,7 @@
 		:visible.sync="isOpenDialog"
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
-    :title="title"
+		:title="title"
 		@close="cancelHandle"
 		custom-class="dialog"
 		center
@@ -19,12 +19,25 @@
 				:model="formData"
 				:rules="formRules">
 				
-          <el-form-item label="分类名称" prop="classify_name">
-            <el-input
-            v-model="formData.classify_name"
-            style="width: 80%"
-            placeholder="必填项"></el-input>
-          </el-form-item>
+				<!-- 添加一级目录的子分类/编辑二级目录时显示 -->
+				<template v-if="(title=='添加'&&formData.Level >= 1)||(title=='编辑'&&formData.Level >= 2)">
+					<el-form-item label="一级目录" prop="level_1_Name">
+						<span>{{formData.level_1_Name}}</span>
+					</el-form-item>
+				</template>
+				<!-- 添加二级目录的子分类/编辑三级目录时显示 -->
+				<template v-if="(title=='添加'&&formData.Level === 2)||(title=='编辑'&&formData.Level === 3)">
+					<el-form-item label="二级目录" prop="level_2_Name">
+						<span>{{formData.level_2_Name}}</span>
+					</el-form-item>
+				</template>
+
+				<el-form-item label="分类名称" prop="classify_name">
+					<el-input
+					v-model="formData.classify_name"
+					style="width: 80%"
+					placeholder="必填项"></el-input>
+				</el-form-item>
 				</el-form>
 			</div>
 			<div class="dia-bot">
@@ -74,16 +87,16 @@ export default {
 	methods: {
 		async saveHandle() {
 			await this.$refs.diaForm.validate()
-      const { classify_name,classify_id }  = this.formData;
-      const { Ret,Msg } = this.title==='添加' 
-        ? await preDictEdbInterface.classifyAdd({ ClassifyName:classify_name })
-        : await preDictEdbInterface.classifyEdit({ ClassifyName:classify_name, ClassifyId:classify_id  })
-        
-      if( Ret !== 200) return
-      this.$message.success(Msg);
+			const { classify_name,classify_id,Level,ParentId}  = this.formData;
+			const { Ret,Msg } = this.title==='添加' 
+				? await preDictEdbInterface.classifyAdd({ ClassifyName:classify_name,ParentId,Level})
+				: await preDictEdbInterface.classifyEdit({ ClassifyName:classify_name, ClassifyId:classify_id  })
+				
+			if( Ret !== 200) return
+			this.$message.success(Msg);
 
-      this.cancelHandle();
-      this.$emit('successCallback')
+			this.cancelHandle();
+			this.$emit('successCallback')
 		},
 
 		/* 取消 */

+ 23 - 8
src/views/predictEdb_manage/components/computedDialog.vue

@@ -101,7 +101,7 @@
 					<selectUnit v-model="formData.unit" style="width: 340px" />
 				</el-form-item>
 				<el-form-item label="指标目录" prop="menu">
-					<el-select
+<!-- 					<el-select
             v-model="formData.menu"
             placeholder="请选择分类"
             style="width: 340px"
@@ -113,7 +113,18 @@
               :label="item.ClassifyName"
               :value="item.ClassifyId"
             />
-          </el-select>
+          </el-select> -->
+					<el-cascader
+						v-model="formData.menu"
+						:options="options"
+						:props="{
+							label: 'ClassifyName',
+							value: 'ClassifyId',
+							children: 'Children',
+						}"
+						style="width: 90%"
+						placeholder="请选择所属分类"
+					/>
 				</el-form-item>
 				<el-form-item label="频度" prop="frequency">
 					<el-select
@@ -257,11 +268,11 @@ export default {
 	methods: {
 		/* 获取目录结构 */
 		getMenu() {
-      preDictEdbInterface.classifyOne().then(res => {
-        if(res.Ret !== 200) return
+			preDictEdbInterface.classifyListV2().then(res => {
+				if(res.Ret !== 200) return
 
-        this.options = res.Data.AllNodes || [];
-      }) 
+				this.options = res.Data.AllNodes || [];
+			}) 
 		},
 
 		/* 添加额外的指标列 */
@@ -366,7 +377,7 @@ export default {
 							});
 						let params = {
 							CalculateFormula: this.formula,
-							ClassifyId: this.formData.menu,
+							ClassifyId: this.formData.menu[this.formData.menu.length - 1],
 							EdbName: this.formData.targetName,
 							Frequency: this.formData.frequency,
 							Unit: this.formData.unit,
@@ -381,7 +392,11 @@ export default {
 							if (res.Ret !== 200) return
 
 							this.$message.success(this.calulateForm.edb_id ? '编辑成功' : '新增成功');
-							this.calulateForm.edb_id ? this.$emit('addCallBack','edit') : this.$emit('addCallBack','add',{ code:res.Data.UniqueCode,id:res.Data.EdbInfoId });
+							this.calulateForm.edb_id ? this.$emit('addCallBack','edit') : this.$emit('addCallBack','add',{ 
+								code:res.Data.UniqueCode,
+								id:res.Data.EdbInfoId,
+								classifyId:params.ClassifyId
+							});
 							this.init();
 						});
 					}

+ 2 - 0
src/views/predictEdb_manage/components/edbDetail.vue

@@ -80,6 +80,8 @@ export default {
                     userid: res.Data.EdbInfo.SysUserId
                 })
                 this.$emit('setOpera',res.Data.Button)
+
+                this.$emit('setCurrentClassify',res.Data.EdbInfo.ClassifyId)
                 //更新图片
                 if(type==='updateImg' || !res.Data.EdbInfo.ChartImage) {
                     console.log(type);

+ 15 - 4
src/views/predictEdb_manage/components/edbDia.vue

@@ -21,7 +21,7 @@
 				:rules="formRules"
       >
         <el-form-item label="添加到分类" prop="classify">
-          <el-select
+          <!-- <el-select
             v-model="formData.classify"
             placeholder="请选择分类"
             style="width: 90%"
@@ -34,7 +34,18 @@
               :value="item.ClassifyId"
             >
             </el-option>
-          </el-select>
+          </el-select> -->
+          <el-cascader
+                v-model="formData.classify"
+                :options="classifyArr"
+                :props="{
+                    label: 'ClassifyName',
+                    value: 'ClassifyId',
+                    children: 'Children',
+                }"
+                style="width: 90%"
+                placeholder="请选择所属分类"
+            />
         </el-form-item>
         <el-form-item label="选择指标" prop="oldEdb" v-if="title==='添加指标'">
           <el-select
@@ -207,7 +218,7 @@ export default {
   },
   methods: {
     getClassifyOne() {
-      preDictEdbInterface.classifyOne().then(res => {
+      preDictEdbInterface.classifyListV2().then(res => {
         if(res.Ret !== 200) return
 
         this.classifyArr = res.Data.AllNodes || [];
@@ -281,7 +292,7 @@ export default {
         fixedValue 
       } = this.formData;
       let params = {
-        ClassifyId: classify,
+        ClassifyId: classify[classify.length-1],
         EdbName: edbName,
         EndDate: endDate,
         RuleType: predict_type,

+ 20 - 5
src/views/predictEdb_manage/components/operationDialog.vue

@@ -171,7 +171,7 @@
 							/>
 						</el-form-item>
 						<el-form-item label="指标目录" prop="menu">
-							<el-select
+							<!-- <el-select
 								v-model="formData.menu"
 								placeholder="请选择分类"
 								style="width: 340px"
@@ -183,7 +183,18 @@
 									:label="item.ClassifyName"
 									:value="item.ClassifyId"
 								/>
-							</el-select>
+							</el-select> -->
+							<el-cascader
+								v-model="formData.menu"
+								:options="options"
+								:props="{
+									label: 'ClassifyName',
+									value: 'ClassifyId',
+									children: 'Children',
+								}"
+								style="width: 90%"
+								placeholder="请选择所属分类"
+							/>
 						</el-form-item>
 						<el-form-item label="频度" prop="frequency">
 							<el-select
@@ -481,7 +492,7 @@ export default {
 
 		/* 获取目录结构 */
 		getMenu() {
-      preDictEdbInterface.classifyOne().then(res => {
+      preDictEdbInterface.classifyListV2().then(res => {
         if(res.Ret !== 200) return
 
         this.options = res.Data.AllNodes || [];
@@ -584,7 +595,7 @@ export default {
 					Source: this.type,
 					EdbName: this.formData.targetName,
 					Unit: this.formData.unit,
-					ClassifyId: this.formData.menu,
+					ClassifyId: this.formData.menu[this.formData.menu.length - 1],
 					Frequency: this.formData.frequency,
 					FromEdbInfoId: this.select_target,
 					Formula: valueMap[this.type] ? String(this.formData[valueMap[this.type]]) : String(this.formData.n_num),
@@ -602,7 +613,11 @@ export default {
 					if(res.Ret !== 200) return
 
 					this.$message.success(this.operationForm.edb_id ? '编辑成功' : '新增成功');
-					this.operationForm.edb_id ? this.$emit('addCallBack','edit') : this.$emit('addCallBack','add',{ code:res.Data.UniqueCode,id:res.Data.EdbInfoId });
+					this.operationForm.edb_id ? this.$emit('addCallBack','edit') : this.$emit('addCallBack','add',{ 
+						code:res.Data.UniqueCode,
+						id:res.Data.EdbInfoId,
+						classifyId:params.ClassifyId
+					});
 					this.init();
 				})		
 		},

+ 46 - 26
src/views/predictEdb_manage/mixins/mixin.js

@@ -40,28 +40,26 @@ export default {
 
   methods: {
     /* 根据unicode展开树结构并选中当前图表 重置图表配置 日期区间 */
-    selectCurrentNode({ code, id, type }) {
-      let deep_arr = _.cloneDeep(this.treeData);
-      // 查找图表的分类父级id
-      let arr = this.findParentNodeHandle(deep_arr, code).slice(1).reverse(); // 父的父的父-父的父-父
-      this.defaultShowNodes = arr;
+    selectCurrentNode({ code, id, classifyId }) {
+      console.log('params',code,id,classifyId)
       this.select_node = code;
-      this.$refs.treeRef.setCurrentKey(this.select_node);
-      // // 重置筛选状态
       this.select_id = id;
+      
+      // 查找图表的分类父级id
+      
     },
 
     // 查找树节点所有父节点
-    findParentNodeHandle(arr, id) {
+    findParentNodeHandle(arr, id,paramName='UniqueCode') {
       // 遍历取父级code push数组
       for (let i of arr) {
-        if (i.UniqueCode === id) {
-          return [i.UniqueCode];
+        if (i.ClassifyId === id) {
+          return [i[paramName]];
         }
         if (i.Children) {
-          let node = this.findParentNodeHandle(i.Children, id);
+          let node = this.findParentNodeHandle(i.Children, id,paramName);
           if (node) {
-            return node.concat(i.UniqueCode);
+            return node.concat(i[paramName]);
           }
         }
       }
@@ -112,19 +110,20 @@ export default {
     dropOverHandle(b, a, i, e) {
       // console.log(i, a);
       // 被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置
-      // 一/二级目录
-      if ([1].includes(b.level)) this.handleMoveCatalogue(b, a, i, e);
+      // 一/二/三级目录
+      if ([1,2,3].includes(b.level)) this.handleMoveCatalogue(b, a, i, e);
 
       // 指标层
-      if (b.level === 2) this.handleMoveSheet(b, a, i, e);
+      if (b.level === 4) this.handleMoveSheet(b, a, i, e);
     },
 
-    // 移动的为一级目录
+    // 移动的为一/二/三级目录
     handleMoveCatalogue(b, a, i, e) {
       let list = a.parent.childNodes,
         targetIndex = 0,
         PrevClassifyId = 0,
-        NextClassifyId = 0;
+        NextClassifyId = 0,
+        ParentClassifyId = 0;
 
       list.forEach((item, index) => {
         if (item.data.ClassifyId === b.data.ClassifyId) {
@@ -135,7 +134,7 @@ export default {
 
       if (targetIndex === 0) {
         PrevClassifyId = 0;
-        NextClassifyId = list[targetIndex + 1].data.ClassifyId;
+        NextClassifyId = list.length>1?list[targetIndex + 1].data.ClassifyId:0;
       } else if (targetIndex === list.length - 1) {
         PrevClassifyId = list[targetIndex - 1].data.ClassifyId;
         NextClassifyId = 0;
@@ -143,10 +142,21 @@ export default {
         PrevClassifyId = list[targetIndex - 1].data.ClassifyId;
         NextClassifyId = list[targetIndex + 1].data.ClassifyId;
       }
+      
+      if(b.level===2||b.level===3){
+        if(i==='inner'){
+            ParentClassifyId=a.data.ClassifyId
+            PrevClassifyId=0
+            NextClassifyId=a.data.Children.length>1?a.data.Children[1].ClassifyId:0
+        }else{
+            ParentClassifyId=a.data.ParentId
+        }
+      }
 
       preDictEdbInterface
         .classifyMove({
           ClassifyId: b.data.ClassifyId,
+          ParentClassifyId: ParentClassifyId,
           PrevClassifyId: PrevClassifyId,
           NextClassifyId: NextClassifyId,
         })
@@ -258,15 +268,25 @@ export default {
         canDrop = true;
       }
 
-      // 二级
-      if (draggingNode.level === 2) {
-        if (
-          (dropNode.level === 1 && type === "inner") ||
-          (dropNode.level === 2 && type !== "inner")
-        ) {
-          canDrop = true;
+      // 二级目录
+        if(draggingNode.level===2){
+            if((dropNode.level===1&&type==='inner')||(dropNode.level===2&&type!=='inner')){
+                canDrop=true
+            }
+        }
+
+        //三级目录
+        if(draggingNode.level===3){
+            if((dropNode.level===2&&type==='inner')||(dropNode.level===3&&type!=='inner')){
+                canDrop=true
+            }
+        }
+        //四级指标层
+        if(draggingNode.level===4){
+            if((dropNode.level===3&&type==='inner')||(dropNode.level===4&&type!=='inner')){
+                canDrop=true
+            }
         }
-      }
 
       return canDrop;
     },

+ 142 - 22
src/views/predictEdb_manage/predictEdb.vue

@@ -14,7 +14,7 @@
 						<el-button type="primary" @click="addComputedHandler" style="margin-right:10px;">计算指标</el-button>
 						<change-lang :lang="currentLang" style="height: 32px;" @changeLang="changeLangHandle"/>
 				</div>
-				<div class="search-cont">
+				<div class="search-cont" v-loading="searchLoading">
 					<el-select
 						v-model="search_txt"
 						ref="searchRef"
@@ -56,6 +56,8 @@
 						:expand-on-click-node="false"
 						check-strictly
 						empty-text="暂无分类"
+						lazy
+						:load="getLazyTreeData"
 						@node-expand="handleNodeExpand"
 						@node-collapse="handleNodeCollapse"
 						@current-change="nodeChange"
@@ -94,12 +96,19 @@
 									style="width: 14px; height: 14px; margin-right: 8px"
 									v-if="data.Button.MoveButton"
 								/>
+								<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&&!data.EdbInfoId"
+								/>
 								<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.Button.OpButton"
+									v-if="data.Button.OpButton&&!data.EdbInfoId"
 								/>
 								<img
 									slot="reference"
@@ -107,7 +116,7 @@
 									alt=""
 									style="width: 14px; height: 14px"
 									@click.stop="removeNode(node, data)"
-									v-if="data.Button.DeleteButton"
+									v-if="data.Button.DeleteButton&&!data.EdbInfoId"
 								/>
 								<i class="el-icon-view" v-if="data.EdbInfoId" @click.stop="viewNode(node,data)"></i>
 							</span>
@@ -168,6 +177,7 @@
 							ref="detailComponentRef"
 							
 							@updateTit="setNameBack"
+							@setCurrentClassify="setCurrentClassify"
 							@setOpera="(obj) => { edbButton = obj }"
 							@openEnNameDia="openEnNameDia"
 						/>
@@ -425,11 +435,12 @@ export default {
 			select_classify: '',
 			new_label:'',//双击修改的value
 			treeData: [], //分类数据
-      defaultShowNodes: [], //展开节点
-      defaultProp: {
-        label: 'ClassifyName',
-        children: 'Children',
-      }, //树结构配置项
+			defaultShowNodes: [], //展开节点
+			defaultProp: {
+				label: 'ClassifyName',
+				children: 'Children',
+				isLeaf:'isLeaf'
+			}, //树结构配置项
 			dynamicNode: null,
 			edbName: '',
 			edb_nameEn: '',
@@ -536,6 +547,7 @@ export default {
 			/* 查看历史弹窗 */
 			isLookHistory: false,
 			lookEdbId: 0,
+			searchLoading:false,
 		};
 	},
 	computed: {
@@ -571,7 +583,8 @@ export default {
 			this.detail_show_chart = true;
 			this.$nextTick(()=>{
 				//切换为曲线图
-				this.$refs.detailComponentRef.$refs.chartInfo.chartInfo.ChartType=1
+				this.$refs.detailComponentRef&&
+				(this.$refs.detailComponentRef.$refs.chartInfo.chartInfo.ChartType=1)
 			})
 				
 		},
@@ -590,7 +603,7 @@ export default {
 				let search_obj = this.searchOptions.find(_ => _.EdbInfoId === newval);
 				let deep_arr = _.cloneDeep(this.treeData);
 				// 查找图表的分类父级id
-				let arr = this.findParentNodeHandle(deep_arr, search_obj.UniqueCode).slice(1).reverse(); // 父的父的父-父的父-父
+				let arr = this.findParentNodeHandle(deep_arr, search_obj.ClassifyId).reverse(); // 父的父的父-父的父-父
 				this.defaultShowNodes = arr;
 				this.select_node = search_obj.UniqueCode;
 				this.$refs.treeRef.setCurrentKey(this.select_node);
@@ -600,7 +613,35 @@ export default {
 		}
 	},
 	methods: {
+		setCurrentClassify(classifyId){
+			//获取指标详情后才能拿到准确的classifyId
+			//根据准备的id查找指标的父级目录并展开
+			let deep_arr = _.cloneDeep(this.treeData);
+			let arr = this.findParentNodeHandle(deep_arr, classifyId).reverse();
 
+			this.defaultShowNodes = arr;
+			this.$refs.treeRef.setCurrentKey(this.select_node);
+
+			//滚动到高亮节点位置
+			this.$nextTick(()=>{
+				setTimeout(() => {
+				const dom = document.querySelector(".el-tree-node.is-current");
+				const parentDom = document.querySelector(".tree-cont");
+				if (!dom || !parentDom) {
+					this.searchLoading = false;
+					return;
+				}
+				if (dom.offsetTop > parentDom.offsetHeight) {
+					parentDom.scrollTo({
+						top: dom.offsetTop - parentDom.offsetHeight / 2,
+						left: 0,
+						behavior: "smooth",
+					});
+				}
+				this.searchLoading = false;
+			}, 300);
+			})
+		},
 		setNameBack({edb_name,edb_nameEn,userid}) {
 			this.edbName=edb_name;
 			this.edb_nameEn= edb_nameEn;
@@ -617,7 +658,7 @@ export default {
 
 		/* 获取分类 */
 		getTreeData(params=null) {
-			preDictEdbInterface.classifyList({IsOnlyMe:this.isOnlyMe||false}).then(res => {
+			preDictEdbInterface.classifyListV2({IsOnlyMe:this.isOnlyMe||false}).then(res => {
 				const { Ret,Data } = res;
 				
 				if(Ret !== 200) return
@@ -679,18 +720,51 @@ export default {
 			this.dialog_title = '添加';
 			this.classifyForm = {
 				classify_name: '',
+				Level:0,
+				ParentId:0
+			}
+			this.classifyDia = true;
+		},
+		addNode(node,{ClassifyName,ClassifyId}){
+			this.dialog_title = '添加'
+			/* 添加目录 */
+			this.classifyForm = {
+				classify_name:'',
+				Level:node.level,
+				ParentId:ClassifyId,
+				level_1_Name:node.level === 1
+				? ClassifyName
+				: node.level === 2
+				? node.parent.data.ClassifyName
+				: node.parent.parent.data.ClassifyName,
+				level_2_Name:node.level === 1
+				? ''
+				: node.level === 2
+				? ClassifyName
+				: node.parent.data.ClassifyName,
 			}
 			this.classifyDia = true;
 		},
-
     /* 编辑节点 */
-    editNode(node, { ClassifyName,ClassifyId }) {
+    editNode(node, { ClassifyName,ClassifyId,Level,ParentId}) {
 
       this.dialog_title = '编辑';
       /* 编辑目录 */
       this.classifyForm = {
         classify_name: ClassifyName,
         classify_id: ClassifyId,
+        Level:node.level,
+        ParentId:ParentId,
+        level_1_Name:node.level === 1
+            ? ClassifyName
+            : node.level === 2
+            ? node.parent.data.ClassifyName
+            : node.parent.parent.data.ClassifyName,
+        level_2_Name:node.level === 1
+            ? ''
+            : node.level === 2
+            ? ClassifyName
+            : node.parent.data.ClassifyName,
       };
       this.classifyDia = true;
     },
@@ -735,7 +809,8 @@ export default {
 					type && res.Data.EdbInfoId
 						? this.getTreeData({
 								code: res.Data.UniqueCode,
-								id: res.Data.EdbInfoId
+								id: res.Data.EdbInfoId,
+								classifyId:res.Data.ClassifyId
 							})
 						: this.getTreeData();
         });
@@ -773,10 +848,11 @@ export default {
 		},
 
 		/* 展开对应菜单 显示详情 */
-		detailShowHandle({ UniqueCode, EdbInfoId }) {
+		detailShowHandle({ UniqueCode, EdbInfoId,ClassifyId}) {
 			let params = {
 				code: UniqueCode,
-				id: EdbInfoId
+				id: EdbInfoId,
+				classifyId:ClassifyId
 			};
 			this.selectCurrentNode(params);
 			this.select_classify = 0;
@@ -876,6 +952,9 @@ export default {
 
 		/* 计算指标回显 */
 		setComputedDialogForm({Source,CalculateList,CalculateFormula,EdbInfoId,EdbName,Unit,Frequency,ClassifyId,MoveType,MoveFrequency,Calendar},type='') {
+			//找到指标的父级
+			let deep_arr = _.cloneDeep(this.treeData);
+			const parentNodes = this.findParentNodeHandle(deep_arr,ClassifyId,'ClassifyId')
 			//指标运算 or 其他计算类型指标
 			if( Source === 31 ) {
 				/* 回显指标和表单 */
@@ -892,7 +971,7 @@ export default {
 				this.calulateForm =  {
 					edb_id:EdbInfoId,
 					formula: CalculateFormula,
-					menu: ClassifyId,
+					menu: parentNodes.reverse(),
 					targetName: EdbName,
 					unit: Unit,
 					frequency: Frequency,
@@ -905,9 +984,7 @@ export default {
 						targetName: EdbName,
 						frequency: Frequency,
 						unit: Unit,
-						menu: [
-							ClassifyId
-						],
+						menu: parentNodes.reverse(),
 						view: type === 'view',
 						source: Source,
 						date: CalculateFormula,
@@ -925,7 +1002,7 @@ export default {
 					edb_id: EdbInfoId,
 					targetName: EdbName,
 					unit: Unit,
-					menu: ClassifyId,
+					menu: parentNodes.reverse(),
 					frequency: Frequency,
 					formula: CalculateFormula || '',
 					view: type === 'view',
@@ -1115,13 +1192,56 @@ export default {
 			this.$refs.listRef.scrollTop = 0;
       this.getPublicList();
     },
+		//懒加载el-tree
+		getLazyTreeData(node,resolve,maxLevel=3){
+			if(node.level===0){
+					resolve(this.treeData)
+				}
+				if(node.level>0&&node.level<=maxLevel){
+					//获取对应层级的Child
+					resolve(node.data.Children||[])
+				}
+				if(node.level===maxLevel){
+					//调接口获取该分类下图表的数据
+					preDictEdbInterface.classifyChartList({
+						ClassifyId:node.data.ClassifyId,
+						IsShowMe:this.isOnlyMe
+					}).then(res=>{
+						if(res.Ret===200){
+							let arr=res.Data.EdbInfoList||[]
+							arr=arr.map(item=>{
+								return {
+									...item,
+									isLeaf:true
+								}
+							})
+							resolve(arr)
+						}else{
+							resolve([])
+						}
+						this.changeTreeNode()
+					})
+				}
+				if(node.level>maxLevel){
+					resolve([])
+				}
+		},
+		changeTreeNode(){
+			this.$refs.treeRef.setCurrentKey(this.select_node);
+			this.$nextTick(()=>{
+				const _node = this.$refs.treeRef.getNode(this.select_node)
+				this.dynamicNode = _node;
+				this.dynamicNode&&this.resetNodeStyle(this.dynamicNode)
+			})
+		}
 	},
 	mounted() {
 		const obj=sessionStorage.getItem('predictEdbTreeData')
 		if(obj||this.$route.query.code){
 			let code=obj?JSON.parse(obj).code:this.$route.query.code
 			let id=obj?JSON.parse(obj).id:this.$route.query.id
-			this.getTreeData({code: code,id: id})
+			let classifyId=obj?JSON.parse(obj).classifyId:this.$route.query.classifyId
+			this.getTreeData({code: code,id: Number(id),classifyId:Number(classifyId)})
 		}else{
 			this.getTreeData()
 		}

+ 2 - 2
src/views/supply_manage/components/createTargetDia.vue

@@ -133,9 +133,9 @@ export default {
 	methods: {
 		/* 获取目录结构 */
 		getMenu() {
-			dataBaseInterface.menuList().then(res => {
+			dataBaseInterface.menuListV3().then(res => {
 				if(res.Ret === 200) {
-					this.filterNodes(res.Data.AllNodes);
+					//this.filterNodes(res.Data.AllNodes);
 					this.options = res.Data.AllNodes || [];
 				}
 			})