whx 1 рік тому
батько
коміт
7da791d527

+ 202 - 0
virgo.wzfrontend/console/src/components/common/tag.vue

@@ -0,0 +1,202 @@
+<template>
+	<div class="tag">
+		<div :class="className(item)" v-for="item in list" :key="item.id" @click="selectTag(item)">
+			<span class="label">{{item.name}}</span>
+			<i class="iconfont huifont-bianji" v-if="type === 'insert'" @click.stop="updateTag(item)"></i>
+			<i class="iconfont huifont-guanbi" v-if="type === 'insert'" @click.stop="deleteTag(item)"></i>
+		</div>
+		<div class="target-item target-item-insert" v-if="type === 'insert'" @click="insertTag">
+			<i class="iconfont huifont-xinzeng"></i>
+			<span class="label">新增标签</span>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getTagList,
+		insertTag,
+		updateTag,
+		deleteTag
+	} from '@/httpApi/work'
+	export default {
+		name: 'tag',
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			tagType: {
+				type: Number,
+				default: 1
+			},
+			tagActive: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			}
+		},
+		data() {
+			return {
+				list: [],
+				tagList: [],
+				dataBox: []
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getTagList(this.tagType).then(res => {
+					if (res.state) {
+						this.dataBox = res.data;
+						this.initTagList();
+					}
+				})
+			},
+			initTagList() {
+				this.tagList = this.dataBox.filter(node => this.tagActive.filter(item => item == node.id)
+					.length > 0);
+				if (this.type === 'insert') {
+					this.list = this.dataBox;
+				} else {
+					this.list = this.tagList;
+				}
+			},
+			insertTag() {
+				this.$prompt('请输入标签名称', '有极', {
+					confirmButtonText: '确 定',
+					cancelButtonClass: 'cancel',
+					confirmButtonClass: 'confirm',
+					cancelButtonText: '取 消',
+					inputPattern: /\S/,
+					inputErrorMessage: '请输入标签名称'
+				}).then(({
+					value
+				}) => {
+					insertTag({
+						type: this.tagType,
+						name: value
+					}).then(res => {
+						if (res.state) {
+							this.init();
+							this.$message.success('操作成功')
+						}
+					})
+				}).catch(() => {});
+			},
+			updateTag(item) {
+				this.$prompt('请输入标签名称', '有极', {
+					confirmButtonText: '确 定',
+					cancelButtonClass: 'cancel',
+					confirmButtonClass: 'confirm',
+					cancelButtonText: '取 消',
+					inputPattern: /\S/,
+					inputErrorMessage: '请输入标签名称',
+					inputValue: item.name
+				}).then(({
+					value
+				}) => {
+					updateTag({
+						type: this.tagType,
+						name: value,
+						id: item.id
+					}).then(res => {
+						if (res.state) {
+							this.init();
+							this.$message.success('操作成功')
+						}
+					})
+				}).catch(() => {});
+			},
+			selectTag(item) {
+				if (this.type === 'look') return;
+				if (this.tagList.filter(node => node.id === item.id).length > 0) {
+					let index = this.tagList.findIndex(node => node.id === item.id);
+					this.tagList.splice(index, 1);
+				} else {
+					this.tagList.push(item);
+				}
+			},
+			className(item) {
+				let str = this.tagList.filter(node => node.id === item.id).length > 0 ? 'target-item active' :
+					'target-item';
+				if (this.type === 'insert') str += ' add'
+				return str;
+			},
+			deleteTag(item) {
+				this.$confirm('确定要删除该标签?', () => {
+					deleteTag(item.id).then(res => {
+						if (res.state) {
+							this.init();
+							this.$message.success('操作成功');
+						}
+					})
+				});
+			},
+			tagIds() {
+				return this.tagList.sort((a, b) => a.id - b.id).map(node => node.id).join(',');
+			}
+		},
+		watch: {
+			tagActive() {
+				this.initTagList();
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+	.tag {
+		display: flex;
+		flex-wrap: wrap;
+
+		.target-item {
+			display: flex;
+			height: 32px;
+			align-items: center;
+			margin: 5px 0;
+			margin-right: 15px;
+			background: #46577a;
+			border-radius: 15px;
+			padding: 0 15px;
+
+			.iconfont {
+				margin-left: 10px;
+				font-size: 12px;
+			}
+
+			.huifont-bianji {
+				font-size: 18px;
+			}
+
+			&.active {
+				background: $--color-primary;
+				color: #fff;
+			}
+
+			&.add {
+				cursor: pointer;
+			}
+		}
+
+		.target-item-insert {
+			cursor: pointer;
+			background: transparent;
+			border: 1px solid #7383ad;
+			color: #7383ad;
+
+			.iconfont {
+				margin-left: 0;
+				margin-right: 10px;
+			}
+		}
+
+		.target-item-insert:hover {
+			border-color: $--color-primary;
+			color: $--color-primary;
+		}
+	}
+</style>

+ 17 - 1
virgo.wzfrontend/console/src/components/work/space/project/detail.vue

@@ -19,6 +19,16 @@
 				<div class="hui-detail-value">{{detail.comment}}</div>
 			</div>
 		</div>
+		<div class="hui-detail-title">项目标签</div>
+		<div class="hui-detail-content hui-detail-image">
+			<tag ref="tag" type="look" :tagType="1" :tagActive="detail.tagIds ? detail.tagIds.split(',') : []">
+			</tag>
+		</div>
+		<div class="hui-detail-title">项目图片</div>
+		<div class="hui-detail-content hui-detail-image">
+			<upload ref="upload" :list="detail.picture ? JSON.parse(detail.picture) : []" type="preview">
+			</upload>
+		</div>
 	</div>
 </template>
 
@@ -26,6 +36,8 @@
 	import {
 		getProjectDetailById
 	} from '@/httpApi/work'
+	import upload from '@/components/common/upload'
+	import tag from '@/components/common/tag'
 	export default {
 		props: ['detailId'],
 		data() {
@@ -37,13 +49,17 @@
 					data: '',
 					organizationId: '',
 					picture: '',
-					tagId: ''
+					tagIds: ''
 				}
 			}
 		},
 		created() {
 			if (this.detailId) this.init();
 		},
+		components: {
+			upload,
+			tag
+		},
 		methods: {
 			init() {
 				getProjectDetailById(this.detailId).then(res => {

+ 10 - 3
virgo.wzfrontend/console/src/components/work/space/project/edit.vue

@@ -19,6 +19,11 @@
 				<el-form-item label="项目配图" class="hui-textarea">
 					<upload ref="upload" :list="responsibility" type="insert"></upload>
 				</el-form-item>
+				<el-form-item label="项目标签" class="hui-textarea">
+					<tag ref="tag" type="insert" :tagType="1"
+						:tagActive="projectForm.tagIds ? projectForm.tagIds.split(',') : []">
+					</tag>
+				</el-form-item>
 			</el-form>
 		</div>
 		<div class="hui-dialog-submit">
@@ -36,6 +41,7 @@
 	} from '@/httpApi/work'
 	import upload from '@/components/common/upload'
 	import city from '@/components/common/city'
+	import tag from '@/components/common/tag'
 	export default {
 		props: ['isUpdate', 'detailId'],
 		data() {
@@ -47,7 +53,7 @@
 					data: '',
 					organizationId: '',
 					picture: '',
-					tagId: ''
+					tagIds: ''
 				},
 				specific: '',
 				responsibility: []
@@ -56,7 +62,6 @@
 		created() {
 			this.projectForm['organizationId'] = this.$store.getters.user.organization.id;
 			if (this.isUpdate) {
-				console.log(this.detailId);
 				getProjectDetailById(this.detailId).then(res => {
 					if (res.state) {
 						this.projectForm = res.data;
@@ -80,6 +85,7 @@
 						});
 						postData['picture'] = JSON.stringify(this.$refs.upload.fileList);
 						postData['address'] = JSON.stringify(this.projectForm.address);
+						postData['tagIds'] = this.$refs.tag.tagIds();
 						if (this.isUpdate) {
 							updateProject(postData).then(this.successFunc);
 						} else {
@@ -99,7 +105,8 @@
 		},
 		components: {
 			city,
-			upload
+			upload,
+			tag
 		},
 	}
 </script>

+ 75 - 0
virgo.wzfrontend/console/src/components/work/space/set/projectItemDetail.vue

@@ -0,0 +1,75 @@
+<template>
+	<div class="hui-detail">
+		<div class="hui-detail-title">基础信息</div>
+		<div class="hui-detail-content">
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">楼宇名称</div>
+				<div class="hui-detail-value">{{detail.name}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">建筑面积</div>
+				<div class="hui-detail-value">{{detail.area}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">具体位置</div>
+				<div class="hui-detail-value">{{detail.address}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">产权证书</div>
+				<div class="hui-detail-value">{{detail.propertyCertificateNumber}}</div>
+			</div>
+		</div>
+		<div class="hui-detail-title">项目标签</div>
+		<div class="hui-detail-content hui-detail-image">
+			<tag ref="tag" type="look" :tagType="2" :tagActive="detail.tagIds ? detail.tagIds.split(',') : []">
+			</tag>
+		</div>
+		<div class="hui-detail-title">项目图片</div>
+		<div class="hui-detail-content hui-detail-image">
+			<upload ref="upload" :list="detail.picture ? JSON.parse(detail.picture) : []" type="preview">
+			</upload>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getProjectItemDetailById
+	} from '@/httpApi/work'
+	import upload from '@/components/common/upload'
+	import tag from '@/components/common/tag'
+	export default {
+		props: ['detailId'],
+		data() {
+			return {
+				detail: {
+					name: '', //楼宇名称
+					area: '',
+					address: '',
+					propertyCertificateNumber: '',
+					picture: '',
+					tagId: ''
+				}
+			}
+		},
+		created() {
+			if (this.detailId) this.init();
+		},
+		components: {
+			upload,
+			tag
+		},
+		methods: {
+			init() {
+				getProjectItemDetailById(this.detailId).then(res => {
+					if (res.state) {
+						this.detail = res.data;
+					}
+				})
+			}
+		},
+	}
+</script>
+<style lang="scss">
+
+</style>

+ 57 - 23
virgo.wzfrontend/console/src/components/work/space/set/projectItemForm.vue

@@ -1,16 +1,29 @@
 <template>
 	<div class="hui-flex hui-dialog">
 		<div class="hui-flex-box hui-dialog-content">
-			<el-form ref="projectItemForm" :model="projectItemForm" label-position="top">
-				<el-form-item label="单位名称">
-					<el-input type="text" v-model="projectItemForm.name" placeholder="请输入单位名称"></el-input>
+			<el-form ref="projectItemForm" label-position="top" :model="projectItemForm">
+				<el-form-item label="楼宇名称" prop="name" :rules="[{required: true, message: '请输入楼宇名称'}]">
+					<el-input type="text" v-model="projectItemForm.name" placeholder="请输入楼宇名称"></el-input>
 				</el-form-item>
-				<el-form-item label="单位编号">
-					<el-input type="text" v-model="projectItemForm.number" placeholder="请输入单位编号" :disabled="isUpdate">
+				<el-form-item label="建筑总面积(m²)" prop="area" :rules="[{required: true, message: '请输入建筑总面积'}]">
+					<el-input type="number" v-model="projectItemForm.area" placeholder="请输入建筑总面积m²"></el-input>
+				</el-form-item>
+				<el-form-item label="具体位置">
+					<el-input type="text" v-model="projectItemForm.address" placeholder="请输入具体位置">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="产权证书/不动产权证号">
+					<el-input type="text" v-model="projectItemForm.propertyCertificateNumber"
+						placeholder="请输入产权证书/不动产权证号">
 					</el-input>
 				</el-form-item>
-				<el-form-item label="单位编码">
-					<el-input type="text" v-model="projectItemForm.code" placeholder="请输入单位编码"></el-input>
+				<el-form-item label="楼宇图片" class="hui-textarea">
+					<upload ref="upload" :list="responsibility" type="insert"></upload>
+				</el-form-item>
+				<el-form-item label="楼宇标签" class="hui-textarea">
+					<tag ref="tag" type="insert" :tagType="2"
+						:tagActive="projectItemForm.tagIds ? projectItemForm.tagIds.split(',') : []">
+					</tag>
 				</el-form-item>
 			</el-form>
 		</div>
@@ -27,46 +40,67 @@
 		getProjectItemDetailById,
 		updateProjectItem
 	} from '@/httpApi/work'
+	import upload from '@/components/common/upload'
+	import tag from '@/components/common/tag'
 	export default {
 		props: ['isUpdate', 'detailId'],
 		data() {
 			return {
 				projectItemForm: {
-					name: '',
-					number: '',
-					type: '',
-					bim: 1,
-					code: ''
+					name: '', //楼宇名称
+					area: '',
+					address: '',
+					propertyCertificateNumber: '',
+					picture: '',
+					tagIds: ''
 				},
-				projectItemRuler: {},
+				specific: '',
+				responsibility: []
 			}
 		},
 		created() {
+			this.projectItemForm['projectId'] = this.$store.getters.project.id;
 			if (this.isUpdate) {
 				getProjectItemDetailById(this.detailId).then(res => {
 					if (res.state) {
-						let data = res.data;
-						this.projectItemForm = data;
+						this.projectItemForm = res.data;
+						if (this.projectItemForm.picture) this.responsibility = JSON.parse(this.projectItemForm
+							.picture);
 					}
 				})
 			}
 		},
 		methods: {
 			submit() {
-				if (this.isUpdate) {
-					delete this.projectItemForm.number;
-					updateProjectItem(this.projectItemForm).then(this.successFunc)
-				} else {
-					insertProjectItem(this.$store.getters.project.id, this.projectItemForm).then(this.successFunc)
-				}
+				this.$refs.projectItemForm.validate((valid) => {
+					if (valid) {
+						let postData = JSON.parse(JSON.stringify(this.projectItemForm));
+						postData.data = JSON.stringify({
+							specific: this.specific
+						});
+						postData['picture'] = JSON.stringify(this.$refs.upload.fileList);
+						postData['tagIds'] = this.$refs.tag.tagIds();
+						if (this.isUpdate) {
+							updateProjectItem(postData).then(this.successFunc);
+						} else {
+							insertProjectItem(postData).then(this.successFunc);
+						}
+					} else {
+						return false;
+					}
+				});
 			},
 			successFunc(res) {
 				if (res.state) {
 					this.$message.success('操作成功');
 					this.$emit('callback', 'init');
 				}
-			},
-		}
+			}
+		},
+		components: {
+			upload,
+			tag
+		},
 	}
 </script>
 

+ 73 - 0
virgo.wzfrontend/console/src/components/work/space/set/projectItemTargetForm.vue

@@ -0,0 +1,73 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form ref="form" :model="form" label-position="top">
+				<el-form-item label="楼层名称">
+					<el-input type="text" v-model="form.name" placeholder="请输入楼层名称"></el-input>
+				</el-form-item>
+				<el-form-item label="房源数量">
+					<el-input type="number" v-model="form.roomNumber" placeholder="请输入房源数量"></el-input>
+				</el-form-item>
+				<el-form-item label="产权证书/不动产权证号">
+					<el-input type="text" v-model="form.propertyCertificateNumber" placeholder="请输入产权证书/不动产权证号">
+					</el-input>
+				</el-form-item>
+				<el-form-item label="排序">
+					<el-input type="number" v-model="form.sequence" placeholder="请输入排序"></el-input>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="hui-dialog-submit">
+			<el-button size="medium" @click="$emit('callback')">取 消</el-button>
+			<el-button size="medium" type="primary" @click="submit">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		insertProjectItemTarget,
+		getProjectItemTargetDetailById,
+		updateProjectItemTarget
+	} from '@/httpApi/work'
+	export default {
+		props: ['isUpdate', 'projectItemId', 'detailId'],
+		data() {
+			return {
+				form: {
+					name: '',
+					sequence: '',
+					roomNumber: '',
+					propertyCertificateNumber: ''
+				}
+			}
+		},
+		created() {
+			this.form['projectId'] = this.$store.getters.project.id;
+			this.form['projectItemId'] = this.projectItemId;
+			if (this.isUpdate) {
+				getProjectItemTargetDetailById(this.detailId).then(res => {
+					if (res.state) this.form = res.data;
+				})
+			}
+		},
+		methods: {
+			submit() {
+				if (this.isUpdate) {
+					updateProjectItemTarget(this.form).then(this.successFunc);
+				} else {
+
+					insertProjectItemTarget(this.form).then(this.successFunc);
+				}
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss"></style>

+ 122 - 93
virgo.wzfrontend/console/src/httpApi/work.js

@@ -57,252 +57,291 @@ export function deleteProjectById(id) {
 		method: 'delete'
 	})
 }
-
-
-
-
-
-
 /* 
- * 获取项目单位工程列表
+ * 获取楼宇列表
  * 
  * 
  */
-export function getProjecItemtList(projectId) {
+export function getProjectItemList(data) {
 	return request({
-		url: `/api/projectItem/${projectId}`,
-		method: 'get',
+		url: `/api/projectItem/${data.currPage}/${data.pageSize}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 新增楼宇
+ * 
+ * 
+ */
+export function insertProjectItem(data) {
+	return request({
+		url: `/api/projectItem`,
+		method: 'post',
+		data: data
 	})
 }
 /* 
- * 获取项目单位工程类型列表
+ * 获取楼宇详情
  * 
  * 
  */
-export function getProjectItemTypeList(typeId) {
+export function getProjectItemDetailById(projectItemId) {
 	return request({
-		url: `/api/part/${typeId}`,
+		url: `/api/projectItem/${projectItemId}`,
 		method: 'get'
 	})
 }
 /* 
- * 新增单位工程
+ * 编辑楼宇
  * 
  * 
  */
-export function insertProjectItem(projectId, data) {
+export function updateProjectItem(data) {
 	return request({
-		url: `/api/projectItem/${projectId}`,
-		method: 'post',
+		url: `/api/projectItem/update`,
+		method: 'put',
 		data: data
 	})
 }
 /* 
- * 获取单位工程详情
+ * 删除楼宇
  * 
  * 
  */
-export function getProjectItemDetailById(projectItemId) {
+export function deleteProjectItemById(id) {
 	return request({
-		url: `/api/projectItem/projectItem/${projectItemId}`,
-		method: 'get'
+		url: `/api/projectItem/delete/${id}`,
+		method: 'delete'
 	})
 }
 /* 
- * 编辑单位工程
+ * 新增楼层
  * 
  * 
  */
-export function updateProjectItem(data) {
+export function insertProjectItemTarget(data) {
 	return request({
-		url: `/api/projectItem/update`,
-		method: 'put',
+		url: `/api/projectItemTarget`,
+		method: 'post',
 		data: data
 	})
 }
 /* 
- * 计算次数
- * @param {data}
+ * 获取楼宇详情
+ * 
  * 
  */
-export function bimIntegrateNumber(projectItemId) {
+export function getProjectItemTargetDetailById(id) {
 	return request({
-		url: `/api/projectItem/update/integrate/${projectItemId}`,
+		url: `/api/projectItemTarget/${id}`,
+		method: 'get'
+	})
+}
+/* 
+ * 编辑楼层
+ * 
+ * 
+ */
+export function updateProjectItemTarget(data) {
+	return request({
+		url: `/api/projectItemTarget`,
 		method: 'put',
+		data: data
 	})
 }
 /* 
- * 删除项目
+ * 删除楼层
  * 
  * 
  */
-export function deleteProjectItemById(id) {
+export function deleteProjectItemTarget(projectItemTargetId) {
 	return request({
-		url: `/api/projectItem/delete/${id}`,
+		url: `/api/projectItemTarget/${projectItemTargetId}`,
 		method: 'delete'
 	})
 }
 /* 
- * 获取组织项目部门列表
+ * 获取空间层级关系
  * 
  * 
  */
-export function getPartList(operateOrganizationId, projectId) {
+export function getProjectTreeList(projectId) {
 	return request({
-		url: `/manager/operateRole/getOperateOrganizationId/${operateOrganizationId}/${projectId}`,
+		url: `/api/project/getProject/${projectId}`,
 		method: 'get'
 	})
 }
 /* 
- * 获取组织项目部门永辉列表
+ * 获取标签列表
  * 
  * 
  */
-export function getUserListByPart(operateOrganizationId, projectId, partId) {
+export function getTagList(type) {
 	return request({
-		url: `/manager/operateRole/${operateOrganizationId}/${projectId}/${partId}`,
-		method: 'get'
+		url: `/api/tag/${type}`,
+		method: 'post'
 	})
 }
 /* 
- * 新增部门
+ * 新增标签
  * 
  * 
  */
-export function insertDepartment(data) {
+export function insertTag(data) {
 	return request({
-		url: `/manager/operateRole`,
+		url: `/api/tag`,
 		method: 'post',
 		data: data
 	})
 }
 /* 
- * 编辑部门
+ * 编辑标签
  * 
  * 
  */
-export function updateDepartment(data) {
+export function updateTag(data) {
 	return request({
-		url: `/manager/operateRole`,
+		url: `/api/tag/update`,
 		method: 'put',
 		data: data
 	})
 }
 /* 
- * 删除部门
+ * 删除标签
  * 
  * 
  */
-export function deleteDepartment(id) {
+export function deleteTag(id) {
 	return request({
-		url: `/manager/operateRole/${id}`,
+		url: `/api/tag/delete/${id}`,
 		method: 'delete'
 	})
 }
+
+
+
+
+
+
+
 /* 
- * 新增用户
+ * 计算次数
+ * @param {data}
+ * 
+ */
+export function bimIntegrateNumber(projectItemId) {
+	return request({
+		url: `/api/projectItem/update/integrate/${projectItemId}`,
+		method: 'put',
+	})
+}
+
+/* 
+ * 获取组织项目部门列表
  * 
  * 
  */
-export function insertUser(operateOrganizationId, projectId, roles, data) {
+export function getPartList(operateOrganizationId, projectId) {
 	return request({
-		url: `/manager/operateUserRole/insertUser/${operateOrganizationId}/${projectId}/${roles}`,
-		method: 'post',
-		data: data
+		url: `/manager/operateRole/getOperateOrganizationId/${operateOrganizationId}/${projectId}`,
+		method: 'get'
 	})
 }
 /* 
- * 删除用户
+ * 获取组织项目部门永辉列表
  * 
  * 
  */
-export function deleteUser(operateOrganizationId, projectId, roles, userId) {
+export function getUserListByPart(operateOrganizationId, projectId, partId) {
 	return request({
-		url: `/manager/operateUserRole/deleteUser/${operateOrganizationId}/${projectId}/${roles}/${userId}`,
-		method: 'delete'
+		url: `/manager/operateRole/${operateOrganizationId}/${projectId}/${partId}`,
+		method: 'get'
 	})
 }
 /* 
- * 更新组织
+ * 新增部门
  * 
  * 
  */
-export function updateOrganization(data) {
+export function insertDepartment(data) {
 	return request({
-		url: `/manager/operateOrganization/update`,
+		url: `/manager/operateRole`,
 		method: 'post',
 		data: data
 	})
 }
 /* 
- * 更新运营用户权限和菜单
+ * 编辑部门
  * 
  * 
  */
-export function updateOperateUserRole(data) {
+export function updateDepartment(data) {
 	return request({
-		url: `/manager/operateUserRole/userRole`,
+		url: `/manager/operateRole`,
 		method: 'put',
 		data: data
 	})
 }
 /* 
- * 获取具体位置列表
+ * 删除部门
  * 
  * 
  */
-export function getProjectItemTargetList(projectItemId) {
+export function deleteDepartment(id) {
 	return request({
-		url: `/api/projectItem/projectItemTarget/${projectItemId}`,
-		method: 'get'
+		url: `/manager/operateRole/${id}`,
+		method: 'delete'
 	})
 }
 /* 
- * 新增具体位置
+ * 新增用户
  * 
  * 
  */
-export function insertProjectItemTarget(data) {
+export function insertUser(operateOrganizationId, projectId, roles, data) {
 	return request({
-		url: `/api/projectItem/projectItemTarget`,
+		url: `/manager/operateUserRole/insertUser/${operateOrganizationId}/${projectId}/${roles}`,
 		method: 'post',
 		data: data
 	})
 }
 /* 
- * 获取具体位置列表
+ * 删除用户
  * 
  * 
  */
-export function getProjectItemTargetDetailById(projectItemTargetId) {
+export function deleteUser(operateOrganizationId, projectId, roles, userId) {
 	return request({
-		url: `/api/projectItem/projectItemTarget/details/${projectItemTargetId}`,
-		method: 'get'
+		url: `/manager/operateUserRole/deleteUser/${operateOrganizationId}/${projectId}/${roles}/${userId}`,
+		method: 'delete'
 	})
 }
 /* 
- * 编辑具体位置
+ * 更新组织
  * 
  * 
  */
-export function updateProjectItemTarget(data) {
+export function updateOrganization(data) {
 	return request({
-		url: `/api/projectItem/projectItemTarget`,
-		method: 'put',
+		url: `/manager/operateOrganization/update`,
+		method: 'post',
 		data: data
 	})
 }
 /* 
- * 删除楼层位置
+ * 更新运营用户权限和菜单
  * 
  * 
  */
-export function deleteProjectItemTarget(projectItemTargetId) {
+export function updateOperateUserRole(data) {
 	return request({
-		url: `/api/projectItem/projectItemTarget/${projectItemTargetId}`,
-		method: 'delete'
+		url: `/manager/operateUserRole/userRole`,
+		method: 'put',
+		data: data
 	})
 }
+
 /* 
  * 获取bim类型
  * 
@@ -589,17 +628,7 @@ export function getDeviceEventList(data) {
 		data: data
 	})
 }
-/* 
- * 获取空间层级关系
- * 
- * 
- */
-export function getProjectTreeList(projectId) {
-	return request({
-		url: `/api/project/getProject/${projectId}`,
-		method: 'get'
-	})
-}
+
 /* 
  * 获取房间列表
  * 

+ 1 - 1
virgo.wzfrontend/console/src/main.js

@@ -18,7 +18,7 @@ import avatar from './components/common/avatar'
 Vue.component('avatar', avatar)
 
 Vue.prototype.$confirm = (title, callback) => {
-	return ElementUI.MessageBox.confirm(title, '红信提示', {
+	return ElementUI.MessageBox.confirm(title, '有极提示', {
 		confirmButtonText: '确 定',
 		cancelButtonClass: 'cancel',
 		confirmButtonClass: 'confirm',

+ 0 - 1
virgo.wzfrontend/console/src/router/work.js

@@ -7,7 +7,6 @@ modulesFiles.keys().reduce((modules, modulePath) => {
 	const value = modulesFiles(modulePath);
 	child = child.concat(value.default);
 }, {})
-console.log(child);
 const workRouter = {
 	path: '/',
 	component: Layout,

+ 0 - 1
virgo.wzfrontend/console/src/views/work/space/project/list.vue

@@ -42,7 +42,6 @@
 		<el-drawer title="项目详情" :visible.sync="drawer" :size="400" :append-to-body="true">
 			<detail v-if="drawer" :detailId="detailId"></detail>
 		</el-drawer>
-
 	</div>
 </template>
 

+ 108 - 107
virgo.wzfrontend/console/src/views/work/space/set/list.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="space-index">
-		<div class="space-null" v-if="list.length ==0">
+		<div class="space-null" v-if="projectItemList.length ==0">
 			<img :src="nullImage" alt="" />
 			<div class="space-null-text">您还未添加楼宇信息,可新增楼宇,开启您的空间设置吧!</div>
 			<div class="flow-button">
@@ -9,7 +9,7 @@
 				</el-button>
 			</div>
 		</div>
-		<div class="space-content">
+		<div class="space-content" v-else>
 			<div class="space-content-item">
 				<div class="space-title">
 					<div class="space-title-label">楼宇</div>
@@ -18,75 +18,26 @@
 					</el-button>
 				</div>
 				<div class="space-content-box">
-					<div class="space-project-item" v-for="(item,index) in list" :key="item.id">
-						<div class="project-item-title">
-							<div class="project-item--label">{{item.name}}</div>
-							<el-dropdown trigger="click" @command="command=>commandFunc(command,item,'projectItem')">
-								<div class="target-item-icon">
-									<i class="iconfont huifont-jinhangzhong"></i>
-								</div>
-								<el-dropdown-menu slot="dropdown">
-									<el-dropdown-item command="update">编辑</el-dropdown-item>
-									<el-dropdown-item command="delete">删除</el-dropdown-item>
-								</el-dropdown-menu>
-							</el-dropdown>
-						</div>
-						<el-row class="project-item-traget" :gutter="10">
-							<el-col :span="8" v-for="(target,index) in item.projectItemTargetList" :key="target.id">
-								<div :class="targetData.id === target.id?'target-item active' : 'target-item'"
-									@click="selectTarget(item,target)">
-									<div class="target-item-num">{{target.elevation}}</div>
-									<div class="target-item-label">{{target.name}}</div>
-									<el-dropdown trigger="click"
-										@command="command=>commandFunc(command,target,'projectItemTarget')">
-										<div class="target-item-icon">
-											<i class="iconfont huifont-jinhangzhong"></i>
-										</div>
-										<el-dropdown-menu slot="dropdown">
-											<el-dropdown-item command="update">编辑</el-dropdown-item>
-											<el-dropdown-item command="delete">删除</el-dropdown-item>
-										</el-dropdown-menu>
-									</el-dropdown>
-								</div>
-							</el-col>
-							<el-col :span="8">
-								<div class="target-item-insert" @click="insert('projectItemTarget',item.id)">
-									<i class="iconfont huifont-xinzeng"></i>新增
-								</div>
-							</el-col>
-						</el-row>
-					</div>
-				</div>
-			</div>
-			<div class="space-line"></div>
-			<div class="space-content-item">
-				<div class="space-title">
-					<div class="space-title-label">{{projectItem.name}} / {{targetData.name}}</div>
-					<el-button size="medium" type="primary" @click="insert('room')">
-						<i class="iconfont huifont-xinzeng"></i>新增
-					</el-button>
-				</div>
-				<div class="space-content-box">
-					<div class="space-undefined" v-if="roomList.length === 0">
-						<img :src="undefinedImage" alt="" />
-						<div class="space-undefined-text">暂无数据</div>
-					</div>
 					<div class="space-room-list">
 						<el-row :gutter="10">
-							<el-col :span="12" v-for="item in roomList" :key="roomList.id">
-								<div class="space-room-item">
-									<div class="space-room-num">{{targetData.elevation}}</div>
+							<el-col :span="12" v-for="item in projectItemList" :key="item.id">
+								<div :class="projectItem.id === item.id?'space-room-item active' : 'space-room-item'"
+									@click="selectTarget(item)">
+									<div class="space-room-image">
+										<img :src="returnImage(item)" alt="" />
+									</div>
 									<div class="space-room-text">
 										<div class="space-room-label">{{item.name}}</div>
 										<div class="space-room-sub">{{item.remark}}</div>
 									</div>
 									<div class="space-room-icon">
 										<el-dropdown trigger="click"
-											@command="command=>commandFunc(command,item,'room')">
+											@command="command=>commandFunc(command,item,'projectItem')">
 											<div class="target-item-icon">
 												<i class="iconfont huifont-jinhangzhong"></i>
 											</div>
 											<el-dropdown-menu slot="dropdown">
+												<el-dropdown-item command="detail">详情</el-dropdown-item>
 												<el-dropdown-item command="update">编辑</el-dropdown-item>
 												<el-dropdown-item command="delete">删除</el-dropdown-item>
 											</el-dropdown-menu>
@@ -98,42 +49,80 @@
 					</div>
 				</div>
 			</div>
+			<div class="space-line"></div>
+			<div class="space-content-item">
+				<div class="space-title">
+					<div class="space-title-label">楼层</div>
+					<el-button size="medium" type="primary" @click="insert('projectItemTarget')">
+						<i class="iconfont huifont-xinzeng"></i>新增
+					</el-button>
+				</div>
+				<div class="space-content-box">
+					<div class="space-undefined" v-if="projectItemTargetList.length === 0">
+						<img :src="undefinedImage" alt="" />
+						<div class="space-undefined-text">暂无数据</div>
+					</div>
+					<el-row class="project-item-traget" :gutter="10" v-else>
+						<el-col :span="8" v-for="(target,index) in projectItemTargetList" :key="target.id">
+							<div class="target-item">
+								<div class="target-item-num">
+									<i class="iconfont huifont-louceng"></i>
+								</div>
+								<div class="target-item-label">{{target.name}}</div>
+								<el-dropdown trigger="click"
+									@command="command=>commandFunc(command,target,'projectItemTarget')">
+									<div class="target-item-icon">
+										<i class="iconfont huifont-jinhangzhong"></i>
+									</div>
+									<el-dropdown-menu slot="dropdown">
+										<el-dropdown-item command="update">编辑</el-dropdown-item>
+										<el-dropdown-item command="delete">删除</el-dropdown-item>
+									</el-dropdown-menu>
+								</el-dropdown>
+							</div>
+						</el-col>
+					</el-row>
+				</div>
+			</div>
 		</div>
 		<el-dialog :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="900px" :append-to-body="true">
 			<project-item-form v-if="visible && type === 'projectItem'" @callback="callback" :isUpdate="isUpdate"
-				:detailId="itemId"></project-item-form>
+				:detailId="itemId">
+			</project-item-form>
 			<project-item-target-form v-if="visible && type === 'projectItemTarget'" @callback="callback"
-				:isUpdate="isUpdate" :detailId="itemId" :projectItemId="projectItemId"></project-item-target-form>
-			<room-form v-if="visible && type === 'room'" @callback="callback" :isUpdate="isUpdate" :roomId="itemId"
-				:projectItemId="projectItem.id" :targetId="targetData.id">
-			</room-form>
+				:isUpdate="isUpdate" :detailId="itemId" :projectItemId="projectItem.id">
+			</project-item-target-form>
 		</el-dialog>
+		<el-drawer title="楼宇详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<project-item-detail v-if="drawer" :detailId="itemId"></project-item-detail>
+		</el-drawer>
 	</div>
 </template>
 
 <script>
 	import {
 		getProjectTreeList,
+		getProjectItemList,
 		deleteProjectItemById,
 		deleteProjectItemTarget,
 		deleteRoom
 	} from '@/httpApi/work';
 	import projectItemForm from '@/components/work/space/set/projectItemForm'
-	// import projectItemTargetForm from '@/components/work/project/projectItemTargetForm'
-	// import roomForm from '@/components/work/space/roomForm'
+	import projectItemDetail from '@/components/work/space/set/projectItemDetail'
+	import projectItemTargetForm from '@/components/work/space/set/projectItemTargetForm'
 	export default {
 		data() {
 			return {
 				nullImage: require('../../../../assets/image/common/dataNull.png'),
 				undefinedImage: require('../../../../assets/image/common/dataUndefined.png'),
-				list: [],
-				roomList: [],
+				projectItemList: [],
+				projectItemTargetList: [],
 				visible: false,
 				itemId: '',
-				projectItemId: '',
 				isUpdate: false,
-				targetData: {},
-				projectItem: {}
+				projectItem: {},
+				projectItemTarget: {},
+				drawer: false
 			}
 		},
 		created() {
@@ -143,21 +132,15 @@
 			getProjectItemList() {
 				getProjectTreeList(this.$store.getters.project.id).then(res => {
 					if (res.state) {
-						this.list = res.data.projectItemList || [];
-						if (this.targetData.id) {
-							let item = this.list.filter(node => node.id === this.projectItem.id);
-							if (item.length > 0) {
-								let traget = item[0].projectItemTargetList.filter(node => node.id === this
-									.targetData.id);
-								if (traget.length > 0) {
-									this.selectTarget(item[0], traget[0]);
-									return;
-								}
-							}
+						this.projectItemList = res.data.projectItemList || [];
+						if (this.projectItemList.length === 0) return;
+						if (this.projectItem.id) {
+							let item = this.projectItemList.filter(node => node.id === this.projectItem.id);
+							if (item.length === 0) return this.selectTarget(this.projectItemList[0]);
+							this.selectTarget(item[0]);
+						} else {
+							this.selectTarget(this.projectItemList[0]);
 						}
-						let data = this.list.filter(node => node.projectItemTargetList && node
-							.projectItemTargetList.length > 0);
-						if (data.length > 0) this.selectTarget(data[0], data[0].projectItemTargetList[0]);
 					}
 				})
 			},
@@ -165,12 +148,10 @@
 				this.type = type;
 				this.isUpdate = false;
 				this.visible = true;
-				if (projectItemId) this.projectItemId = projectItemId;
 			},
-			selectTarget(item, target) {
-				this.targetData = target;
+			selectTarget(item) {
 				this.projectItem = item;
-				this.roomList = target.projectItemTargetRoomList;
+				this.projectItemTargetList = item.projectItemTargetList;
 			},
 			commandFunc(operationType, item, type) {
 				this.type = type;
@@ -181,6 +162,9 @@
 				this.isUpdate = true;
 				this.visible = true;
 			},
+			detail() {
+				this.drawer = true;
+			},
 			delete() {
 				if (this.type === 'projectItem') {
 					this.$confirm('确定要删除该楼宇?', () => {
@@ -192,11 +176,6 @@
 						deleteProjectItemTarget(this.itemId).then(this.successFunc);
 					});
 				}
-				if (this.type === 'room') {
-					this.$confirm('确定要删除该房间?', () => {
-						deleteRoom(this.itemId).then(this.successFunc);
-					});
-				}
 			},
 			successFunc(res) {
 				if (res.state) {
@@ -204,6 +183,14 @@
 					this.$message.success('操作成功');
 				}
 			},
+			returnImage(item) {
+				let imgUrl = 'https://file-node.oss-cn-shanghai.aliyuncs.com/youji/1da893e7d4264dc68ef43e00d5a708e9'
+				if (item.picture) {
+					let picture = JSON.parse(item.picture);
+					if (picture.length > 0) imgUrl = picture[0].url;
+				}
+				return imgUrl;
+			},
 			callback(type) {
 				this.visible = false;
 				if (type === 'init') this.getProjectItemList();
@@ -211,8 +198,8 @@
 		},
 		components: {
 			projectItemForm,
-			// projectItemTargetForm,
-			// roomForm
+			projectItemDetail,
+			projectItemTargetForm,
 		},
 	}
 </script>
@@ -325,17 +312,14 @@
 			}
 
 			.project-item-traget {
-				padding: 15px 20px;
-
 				.target-item {
 					width: 100%;
-					background: #1f242f;
+					background: #232A37;
 					padding: 15px;
 					border-radius: 8px;
 					display: flex;
 					align-items: center;
 					box-sizing: border-box;
-					cursor: pointer;
 					box-sizing: border-box;
 					border: 1px solid #1f242f;
 				}
@@ -364,12 +348,6 @@
 					}
 				}
 
-				.target-item.active,
-				.target-item:hover {
-					border-color: $--color-primary;
-					box-shadow: -1px -1px 10px 1px rgba(51, 133, 255, 0.2) inset;
-				}
-
 				.target-item-num {
 					width: 38px;
 					height: 38px;
@@ -378,6 +356,10 @@
 					background: #31353f;
 					border-radius: 10px;
 					margin-right: 10px;
+
+					.iconfont {
+						font-size: 20px;
+					}
 				}
 
 				.target-item-label {
@@ -403,14 +385,27 @@
 			}
 
 			.space-room-list {
+				.space-room-image {
+					img {
+						width: 80px;
+						height: 80px;
+						object-fit: fill;
+						border-radius: 8px;
+					}
+
+					margin-right: 10px;
+				}
+
 				.space-room-item {
 					display: flex;
 					align-items: center;
-					padding: 0 20px;
+					padding: 0 15px;
 					height: 110px;
 					background: #232A37;
 					border-radius: 8px;
 					position: relative;
+					cursor: pointer;
+					border: 1px solid #1f242f;
 
 					.space-room-icon {
 						position: absolute;
@@ -445,6 +440,12 @@
 						}
 					}
 				}
+
+				.space-room-item.active,
+				.space-room-item:hover {
+					border-color: $--color-primary;
+					box-shadow: -1px -1px 10px 1px rgba(51, 133, 255, 0.2) inset;
+				}
 			}
 		}
 	}