浏览代码

Merge branch 'master' of http://git.mydig.net/Sagoo-Cloud/sagoo-admin-ui

yanglzh 3 年之前
父节点
当前提交
6b23249f1b

文件差异内容过多而无法显示
+ 125 - 125
package-lock.json


+ 1 - 0
src/api/system/index.ts

@@ -74,6 +74,7 @@ export default {
   },
   },
   user: {
   user: {
     getList: (params: object) => get('/system/user/list', params),
     getList: (params: object) => get('/system/user/list', params),
+    getAllList: (params: object) => get('/system/user/getAll', params),
     params: () => get('/system/user/params'),
     params: () => get('/system/user/params'),
     detail: (id: number) => get('/system/user/getInfoById', { id }),
     detail: (id: number) => get('/system/user/getInfoById', { id }),
     add: (data: object) => post('/system/user/add', data),
     add: (data: object) => post('/system/user/add', data),

+ 90 - 0
src/components/jsontree/index.vue

@@ -0,0 +1,90 @@
+<template>
+	<div class="json-tree">
+		<div v-for="(item, index) in data" :key="`${item.key}-${index}`" class="json-tree-item">
+			<p class="json-tree-line">
+				{{ item.key }}
+				<span v-if="item.type === 'object'">
+					<span v-text="': \{'"></span>
+				</span>
+				<span v-else-if="item.type === 'array'">
+					<span v-text="': \['"></span>
+				</span>
+				<span v-else>
+					<span v-pre>:</span>
+					<span style="margin-left: 15px">
+						{{ item.type === 'string' ? `"${item.value}"` : `${item.value}` }}
+					</span>
+					<span v-if="index < data.length - 1">,</span>
+				</span>
+				<el-tooltip class="item" effect="dark" :content="item.path" placement="top-start">
+					<span class="path-btn" @click="getPath(item.path)">选择</span>
+				</el-tooltip>
+			</p>
+			<div v-if="item.leaf" class="children-tree">
+				<json-tree :data="item.children" @handlePath="handlePath"></json-tree>
+			</div>
+			<span v-if="item.type === 'object'">
+				<span v-text="'\}'"></span>
+				<span v-if="index < data.length - 1">,</span>
+			</span>
+			<span v-else-if="item.type === 'array'">
+				<span v-text="'\]'"></span>
+				<span v-if="index < data.length - 1">,</span>
+			</span>
+		</div>
+	</div>
+</template>
+  
+<script lang="ts">
+import {  defineComponent } from 'vue';
+const props = {
+	data: {
+		type: Array,
+		default: [],
+	},
+};
+export default defineComponent({
+	name: 'jsonTree',
+	props: props,
+	emits: ['handlePath'],
+	setup(props, { emit }) {
+		const getPath = (path) => {
+			emit('handlePath', path);
+		};
+
+		const handlePath=(path)=>{
+			getPath(path);
+		}
+
+		return {
+			handlePath,
+			getPath,
+		};
+	},
+});
+</script>
+
+  
+  <style lang="scss" scoped>
+.json-tree {
+	.json-tree-item {
+		margin: 20px 0px;
+
+		.json-tree-line {
+			.path-btn {
+				background: #37f;
+				color: #fff;
+				padding: 2px 6px;
+				font-size: 12px;
+				cursor: pointer;
+				border-radius: 3px;
+				margin-left: 20px;
+			}
+		}
+
+		.children-tree {
+			margin-left: 20px;
+		}
+	}
+}
+</style>

+ 157 - 97
src/views/datahub/source/component/editNode.vue

@@ -3,7 +3,7 @@
 		<el-dialog :title="(ruleForm.nodeId !== 0 ? '修改' : '添加') + '数据节点'" v-model="isShowDialog" width="769px">
 		<el-dialog :title="(ruleForm.nodeId !== 0 ? '修改' : '添加') + '数据节点'" v-model="isShowDialog" width="769px">
 			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
 			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
 				<el-form-item label="数据节点标识" prop="key">
 				<el-form-item label="数据节点标识" prop="key">
-					<el-input v-model="ruleForm.key" placeholder="请输入数据节点名称"  :disabled="ruleForm.nodeId"/>
+					<el-input v-model="ruleForm.key" placeholder="请输入数据节点名称" :disabled="ruleForm.nodeId" />
 				</el-form-item>
 				</el-form-item>
 				<el-form-item label="数据节点名称" prop="name">
 				<el-form-item label="数据节点名称" prop="name">
 					<el-input v-model="ruleForm.name" placeholder="请输入数据节点名称" />
 					<el-input v-model="ruleForm.name" placeholder="请输入数据节点名称" />
@@ -16,23 +16,22 @@
 					</el-radio-group>
 					</el-radio-group>
 				</el-form-item>
 				</el-form-item>
 
 
-				<el-form-item label="数据类型" prop="dataType" v-if="detail.from==1">
+				<el-form-item label="数据类型" prop="dataType" v-if="detail.from == 1">
 					<el-select v-model="ruleForm.dataType" filterable placeholder="请选择数据类型">
 					<el-select v-model="ruleForm.dataType" filterable placeholder="请选择数据类型">
 						<el-option v-for="item in tabData" :key="item.value" :label="item.label" :value="item.value" />
 						<el-option v-for="item in tabData" :key="item.value" :label="item.label" :value="item.value" />
 					</el-select>
 					</el-select>
 				</el-form-item>
 				</el-form-item>
 
 
-				<el-form-item label="取值项" prop="value" v-if="detail.from==1">
+				<el-form-item label="取值项" prop="value" v-if="detail.from == 1">
 					<el-input v-model="ruleForm.value" placeholder="请输入取值项" class="w-35" /><el-button type="success" @click="onTest">选择值</el-button>
 					<el-input v-model="ruleForm.value" placeholder="请输入取值项" class="w-35" /><el-button type="success" @click="onTest">选择值</el-button>
-
 				</el-form-item>
 				</el-form-item>
-				<el-form-item label="取值项" prop="value" v-if="detail.from==4">
+				<el-form-item label="取值项" prop="value" v-if="detail.from == 4">
 					<el-select v-model="ruleForm.value" filterable placeholder="请选择数取值项" @change="getNodeList">
 					<el-select v-model="ruleForm.value" filterable placeholder="请选择数取值项" @change="getNodeList">
-							<el-option v-for="item in propertyData" :key="item.key" :label="item.name" :value="item.key">
-								<span style="float: left">{{ item.key }}</span>
-								<span style="float: right; font-size: 13px">{{ item.name }}</span>
-							</el-option>
-						</el-select>
+						<el-option v-for="item in propertyData" :key="item.key" :label="item.name" :value="item.key">
+							<span style="float: left">{{ item.key }}</span>
+							<span style="float: right; font-size: 13px">{{ item.name }}</span>
+						</el-option>
+					</el-select>
 				</el-form-item>
 				</el-form-item>
 
 
 				<el-divider content-position="left">规则表达式</el-divider>
 				<el-divider content-position="left">规则表达式</el-divider>
@@ -63,27 +62,22 @@
 			</template>
 			</template>
 		</el-dialog>
 		</el-dialog>
 
 
-		<el-dialog
-				v-model="dialogVisible"
-				title="点击蓝色key值进行选择"
-				width="30%"
-			>
-					<JsonViewer :value="jsonData" :show-double-quotes="true"	  boxed sort theme="jv-dark" @click="onKeyclick" />
-
-				<template #footer>
+		<el-dialog v-model="dialogVisible" title="点击蓝色key值进行选择" width="40%">
+			<jsontree :data="jsonPathData" @handlePath="handlePath"></jsontree>
+			<template #footer>
 				<span class="dialog-footer">
 				<span class="dialog-footer">
 					<el-button @click="dialogVisible = false">关闭</el-button>
 					<el-button @click="dialogVisible = false">关闭</el-button>
-				
 				</span>
 				</span>
-				</template>
-			</el-dialog>
+			</template>
+		</el-dialog>
 	</div>
 	</div>
 </template>
 </template>
 
 
 <script lang="ts">
 <script lang="ts">
 import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 import api from '/@/api/datahub';
 import api from '/@/api/datahub';
-import "vue3-json-viewer/dist/index.css";
+import 'vue3-json-viewer/dist/index.css';
+import jsontree from '/@/components/jsontree/index.vue';
 
 
 import { ElMessage } from 'element-plus';
 import { ElMessage } from 'element-plus';
 import { Delete, Minus, Right } from '@element-plus/icons-vue';
 import { Delete, Minus, Right } from '@element-plus/icons-vue';
@@ -107,20 +101,21 @@ interface DicState {
 
 
 export default defineComponent({
 export default defineComponent({
 	name: 'Edit',
 	name: 'Edit',
-	components: { Delete, Minus, Right },
+	components: { Delete, Minus, Right, jsontree },
 
 
 	setup(prop, { emit }) {
 	setup(prop, { emit }) {
 		const editDicRef = ref();
 		const editDicRef = ref();
 		const formRef = ref<HTMLElement | null>(null);
 		const formRef = ref<HTMLElement | null>(null);
 		const state = reactive<DicState>({
 		const state = reactive<DicState>({
 			isShowDialog: false,
 			isShowDialog: false,
-			dialogVisible:false,
-			jsonData:'',
-			propertyData:[],
+			dialogVisible: false,
+			jsonPathData: [],
+			jsonData: '',
+			propertyData: [],
 			config: {},
 			config: {},
-			detail:{},
+			detail: {},
 			tabData: [
 			tabData: [
-			{
+				{
 					label: 'int',
 					label: 'int',
 					value: 'int',
 					value: 'int',
 				},
 				},
@@ -190,21 +185,31 @@ export default defineComponent({
 			},
 			},
 		});
 		});
 
 
-		const onTest=()=>{
-			if(state.detail.from==1){
+		const onTest = () => {
+			if (state.detail.from == 1) {
 				api.common.api(state.detail.sourceId).then((res: any) => {
 				api.common.api(state.detail.sourceId).then((res: any) => {
-					state.jsonData=JSON.parse(res.data);
-					state.dialogVisible=true
-						console.log(res);
-				})
-			}else if(state.detail.from==4){
+					state.jsonData = JSON.parse(res.data);
+
+					var jsonstr = jsonPath([], state.jsonData, '');
+					state.jsonPathData = jsonstr;
+					state.dialogVisible = true;
+				});
+			} else if (state.detail.from == 4) {
 				api.common.devapi(state.detail.sourceId).then((res: any) => {
 				api.common.devapi(state.detail.sourceId).then((res: any) => {
-					state.jsonData=JSON.parse(res.data);
-					state.dialogVisible=true
-						console.log(res);
-				})
+					state.jsonData = JSON.parse(res.data);
+
+					var jsonstr = jsonPath([], state.jsonData, '');
+					state.jsonPathData = jsonstr;
+					state.dialogVisible = true;
+				});
 			}
 			}
-			
+		};
+
+		const handlePath = (path) => {
+			let data = path.slice(1);
+
+			state.ruleForm.value = data;
+			state.dialogVisible = false;
 		};
 		};
 
 
 		const delRule = (index) => {
 		const delRule = (index) => {
@@ -230,26 +235,23 @@ export default defineComponent({
 
 
 				var data = JSON.parse(row.rule);
 				var data = JSON.parse(row.rule);
 				console.log(data);
 				console.log(data);
-
 				data.forEach((item, index) => {
 				data.forEach((item, index) => {
 					state.rule[index].expression = item.expression;
 					state.rule[index].expression = item.expression;
 					state.rule[index].replace = item.replace;
 					state.rule[index].replace = item.replace;
 					// state.rule[index].params.name = Object.keys(item.params);
 					// state.rule[index].params.name = Object.keys(item.params);
 					// state.rule[index].params.value = item.params[Object.keys(item.params)];
 					// state.rule[index].params.value = item.params[Object.keys(item.params)];
 				});
 				});
-
-			
 			}
 			}
 
 
-				api.common.detail(row.sourceId).then((res: any) => {
-					state.detail = res.data;
-					if(res.data.from==4){
-						//propertyData
-						api.node.getpropertyList({key:res.data.deviceConfig.productKey}).then((re: any) => {
-							state.propertyData=re
-						});
-					}
-				});
+			api.common.detail(row.sourceId).then((res: any) => {
+				state.detail = res.data;
+				if (res.data.from == 4) {
+					//propertyData
+					api.node.getpropertyList({ key: res.data.deviceConfig.productKey }).then((re: any) => {
+						state.propertyData = re;
+					});
+				}
+			});
 
 
 			state.ruleForm = row;
 			state.ruleForm = row;
 			state.isShowDialog = true;
 			state.isShowDialog = true;
@@ -309,64 +311,123 @@ export default defineComponent({
 			});
 			});
 		};
 		};
 
 
-		const getNodeList=(e)=>{
+		const getNodeList = (e) => {
 			state.propertyData.forEach((item, index) => {
 			state.propertyData.forEach((item, index) => {
-				if(item.key===e){
-					state.ruleForm.dataType=item.valueType.type;
+				if (item.key === e) {
+					state.ruleForm.dataType = item.valueType.type;
 				}
 				}
 			});
 			});
-		}
+		};
 
 
-		const onKeyclick=(e)=>{
+		const onKeyclick = (e) => {
 			//console.log(e);
 			//console.log(e);
-			if(e.target.innerText && e.target.className=='jv-key'){
-				let str = e.target.innerText;  
-				str = str.substr(0, str.length - 1);
-				state.ruleForm.value=str;
-				state.dialogVisible = false;
-				var con={
-					...
-					state.jsonData
+			// if (e.target.innerText && e.target.className == 'jv-key') {
+			// 	let str = e.target.innerText;
+			// 	str = str.substr(0, str.length - 1);
+			// 	state.ruleForm.value = str;
+			// 	state.dialogVisible = false;
+			// 	var con = {
+			// 		...state.jsonData,
+			// 	};
+			// 	// var jsonstr = getOrgIdArr([], str, con);
+			// 	// state.ruleForm.value = jsonstr.join('.');
+			// }
+		};
+
+		const jsonPath = (arr, json, basePath) => {
+			// 生成jsonpath
+			const type = validateType(json);
+
+			if (type === 'object') {
+				for (let key in json) {
+					const item = {
+						key,
+						path: `${basePath}.${key}`,
+					};
+					const childType = validateType(json[key]);
+					item.type = childType;
+					if (childType === 'object' || childType === 'array') {
+						item.leaf = true;
+						item.children = [];
+						jsonPath(item.children, json[key], item.path);
+					} else {
+						item.leaf = false;
+						item.value = json[key];
+					}
+					arr.push(item);
 				}
 				}
-				var jsonstr=getOrgIdArr([],str,con);
-				state.ruleForm.value=jsonstr.join('.');
-			
+			} else if (type === 'array') {
+				json.forEach((item, index) => {
+					const childType = validateType(item);
+					const obj = {
+						key: index,
+					};
+					obj.type = childType;
+					obj.path = `${basePath}.${index}`;
+					if (childType === 'object' || childType === 'array') {
+						(obj.leaf = true), (obj.children = []);
+						jsonPath(obj.children, item, obj.path);
+					} else {
+						obj.value = item;
+						obj.leaf = false;
+					}
+					arr.push(obj);
+				});
 			}
 			}
-			
+
+			return arr;
 		};
 		};
 
 
-		const getOrgIdArr=(parents, childNode, treeData)=>{
-			
-			if (treeData instanceof Object) {
-			
-				for (var key in treeData) {
-					
-						// 父节点查询条件
-						if (key === childNode) {
-							// 如果找到结果,保存当前节点
-							parents.push(key)
-							// 用当前节点再去原数据查找当前节点的父节点
-							//getOrgIdArr(parents, childNode,treeData[key])
-							break
-						} else {
-							
-							if (treeData[key] instanceof Object) {
-							//	没找到,遍历该节点的子节点
-								parents.push(key)	
-							
-								getOrgIdArr(parents, childNode, treeData[key])
-								
-								break
-							}
-						}
+		// 校验JSON数据类型
+		const validateType = (val) => {
+			let type = typeof val;
+			if (type === 'object') {
+				if (Array.isArray(val)) {
+					return 'array';
+				} else if (val === null) {
+					return 'null';
+				} else {
+					return 'object';
+				}
+			} else {
+				switch (type) {
+					case 'boolean':
+						return 'boolean';
+					case 'string':
+						return 'string';
+					case 'number':
+						return 'number';
+					default:
+						return 'error';
+				}
+			}
+		};
+
+		const getOrgIdArr = (parents, childNode, treeData) => {
+			for (var key in treeData) {
+				// 父节点查询条件
+				if (key === childNode) {
+					// 如果找到结果,保存当前节点
+					parents.push(key);
+					break;
+				} else {
+					if (treeData[key] instanceof Object) {
+						// console.log(treeData[key]);
+						parents.push(key);
+
+						//没找到,遍历该节点的子节点
+						getOrgIdArr(parents, childNode, treeData[key]);
 					}
 					}
+				}
 			}
 			}
-				return parents
 
 
+			return parents;
 		};
 		};
 
 
-
 		return {
 		return {
+			jsonPath,
+			handlePath,
+			validateType,
 			getNodeList,
 			getNodeList,
 			onKeyclick,
 			onKeyclick,
 			getOrgIdArr,
 			getOrgIdArr,
@@ -413,9 +474,8 @@ export default defineComponent({
 	line-height: 28px;
 	line-height: 28px;
 	cursor: pointer;
 	cursor: pointer;
 }
 }
-.jv-key{
+.jv-key {
 	cursor: pointer;
 	cursor: pointer;
 	color: #0034f1;
 	color: #0034f1;
-
 }
 }
 </style>
 </style>

+ 18 - 1
src/views/heatStation/heatStation/component/edit.vue

@@ -24,7 +24,15 @@
 					<el-input v-model="ruleForm.position" placeholder="请输入换热站位置" />
 					<el-input v-model="ruleForm.position" placeholder="请输入换热站位置" />
 				</el-form-item>
 				</el-form-item>
 				<el-form-item label="负责人" prop="principal">
 				<el-form-item label="负责人" prop="principal">
-					<el-input v-model="ruleForm.principal" placeholder="请输入负责人" />
+					<!-- <el-input v-model="ruleForm.principal" placeholder="请输入负责人" /> -->
+					<el-select v-model="ruleForm.principal" clearable style="width: 100%;" placeholder="请选择">
+						<el-option
+							v-for="item in userList"
+							:key="item.id"
+							:label="item.userNickname"
+							:value="item.id">
+						</el-option>
+					</el-select>
 				</el-form-item>
 				</el-form-item>
 				<el-form-item label="状态" prop="status">
 				<el-form-item label="状态" prop="status">
 					<el-radio v-model="ruleForm.status" :label="1">在线</el-radio>
 					<el-radio v-model="ruleForm.status" :label="1">在线</el-radio>
@@ -64,6 +72,7 @@
 <script lang="ts">
 <script lang="ts">
 import { reactive, toRefs, defineComponent, ref, unref, nextTick, onMounted } from 'vue';
 import { reactive, toRefs, defineComponent, ref, unref, nextTick, onMounted } from 'vue';
 import api from '/@/api/heatStation';
 import api from '/@/api/heatStation';
+import userApi from '/@/api/system';
 import datahubApi from '/@/api/datahub';
 import datahubApi from '/@/api/datahub';
 import { ElMessage } from 'element-plus';
 import { ElMessage } from 'element-plus';
 import { useStore } from '/@/store/index';
 import { useStore } from '/@/store/index';
@@ -106,6 +115,7 @@ export default defineComponent({
 			},
 			},
 			treeData: [],
 			treeData: [],
 			dataHubList: [],
 			dataHubList: [],
+			userList: [],
 			mapLocal: null as any
 			mapLocal: null as any
 		})
 		})
 		const store = useStore();
 		const store = useStore();
@@ -113,6 +123,7 @@ export default defineComponent({
 		const openDialog = (row: any, tree: any) => {
 		const openDialog = (row: any, tree: any) => {
 			resetForm()
 			resetForm()
 			queryDataHubList()
 			queryDataHubList()
+			queryUserList()
 			state.treeData = tree
 			state.treeData = tree
 
 
 			if (row) {
 			if (row) {
@@ -131,6 +142,12 @@ export default defineComponent({
 					state.dataHubList = res.list || [];
 					state.dataHubList = res.list || [];
 				});
 				});
 		};
 		};
+		const queryUserList = () => {
+			userApi.user.getAllList({})
+				.then((res: any) => {
+					state.userList = res || [];
+				});
+		};
 		const resetForm = () => {
 		const resetForm = () => {
 			state.ruleForm = {
 			state.ruleForm = {
 				id: 0,
 				id: 0,

+ 2 - 1
src/views/heatingDistrict/residentManage/component/edit.vue

@@ -201,7 +201,8 @@ export default defineComponent({
 			api.resident.detail(state.ruleForm.id)
 			api.resident.detail(state.ruleForm.id)
 				.then((res: any) => {
 				.then((res: any) => {
 					state.ruleForm = {
 					state.ruleForm = {
-						...res
+						...res,
+						heatStaId: res.heatStaId || ''
 					}
 					}
 				})
 				})
 		}
 		}

+ 2 - 1
src/views/heatingDistrict/unitManage/component/edit.vue

@@ -161,7 +161,8 @@ export default defineComponent({
 			api.unit.detail(state.ruleForm.id)
 			api.unit.detail(state.ruleForm.id)
 				.then((res: any) => {
 				.then((res: any) => {
 					state.ruleForm = {
 					state.ruleForm = {
-						...res
+						...res,
+						heatStaId: res.heatStaId || ''
 					}
 					}
 				})
 				})
 		}
 		}

+ 1 - 0
src/views/heatingDistrict/unitManage/index.vue

@@ -77,6 +77,7 @@
         <el-table-column label="组织名称" prop="organizationInfo.name" min-width="100" />
         <el-table-column label="组织名称" prop="organizationInfo.name" min-width="100" />
         <el-table-column label="小区名称" prop="plotInfo.name" min-width="100" />
         <el-table-column label="小区名称" prop="plotInfo.name" min-width="100" />
         <el-table-column label="楼宇名称" prop="floorInfo.name" min-width="100" />
         <el-table-column label="楼宇名称" prop="floorInfo.name" min-width="100" />
+        <el-table-column label="楼号" prop="floorInfo.number" min-width="100" />
 	    	<el-table-column label="单元名称" prop="name" min-width="100" />
 	    	<el-table-column label="单元名称" prop="name" min-width="100" />
 	    	<el-table-column label="单元号" prop="number" min-width="100" />
 	    	<el-table-column label="单元号" prop="number" min-width="100" />
 	    	<el-table-column label="更新时间" prop="updatedAt" width="180" />
 	    	<el-table-column label="更新时间" prop="updatedAt" width="180" />

部分文件因为文件数量过多而无法显示