whx 11 ヶ月 前
コミット
8b785c2309
56 ファイル変更3841 行追加33 行削除
  1. 3 1
      virgo.wzfrontend/console/public/index.html
  2. 2 1
      virgo.wzfrontend/console/src/App.vue
  3. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/chart-box.png
  4. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/chart-image1.png
  5. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/chart-image2.png
  6. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/chart-image3.png
  7. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/chart-line.png
  8. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/time1.png
  9. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/time2.png
  10. BIN
      virgo.wzfrontend/console/src/assets/image/coldsource/time3.png
  11. 672 0
      virgo.wzfrontend/console/src/assets/scss/tips.scss
  12. 1373 0
      virgo.wzfrontend/console/src/components/common/model.vue
  13. 1 1
      virgo.wzfrontend/console/src/components/work/space/house/edit.vue
  14. 11 0
      virgo.wzfrontend/console/src/httpApi/space.js
  15. 7 0
      virgo.wzfrontend/console/src/router/modules/operation.js
  16. 608 0
      virgo.wzfrontend/console/src/uitls/controls.js
  17. 33 5
      virgo.wzfrontend/console/src/views/system/log.vue
  18. 8 8
      virgo.wzfrontend/console/src/views/work/crm/customer.vue
  19. 1102 0
      virgo.wzfrontend/console/src/views/work/operation/bim.vue
  20. 1 1
      virgo.wzfrontend/src/main/resources/static/index.html
  21. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/2412.b6c7aaf0.css
  22. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/2702.678f8715.css
  23. 1 1
      virgo.wzfrontend/src/main/resources/static/static/css/6061.4b860cdb.css
  24. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/6267.b6c7aaf0.css
  25. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/6296.32d3f99b.css
  26. 0 0
      virgo.wzfrontend/src/main/resources/static/static/css/7049.3f9acf7e.css
  27. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/8332.678f8715.css
  28. 0 1
      virgo.wzfrontend/src/main/resources/static/static/css/app.144f7bce.css
  29. 1 0
      virgo.wzfrontend/src/main/resources/static/static/css/app.a19ecf23.css
  30. BIN
      virgo.wzfrontend/src/main/resources/static/static/img/time2.b2368060.png
  31. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/1357-legacy.e3e1f631.js
  32. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/1620.2f57ff74.js
  33. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/4198-legacy.135fd77a.js
  34. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/2529-legacy.c3ae9adc.js
  35. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/2635.35795af7.js
  36. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/2702.32216d68.js
  37. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/2907-legacy.633fd2da.js
  38. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/2907.c9fa4683.js
  39. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/3782.13aee776.js
  40. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/4976-legacy.befbc509.js
  41. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/5400-legacy.7f0c7834.js
  42. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/5400.eff6fa99.js
  43. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/5412.d7659be0.js
  44. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/5629-legacy.d97f98a8.js
  45. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/6061-legacy.50760ca2.js
  46. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/6061.4c294ac8.js
  47. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/4889.28c9be2f.js
  48. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/5850-legacy.2ff3d398.js
  49. 1 1
      virgo.wzfrontend/src/main/resources/static/static/js/5850.49b35668.js
  50. 2 2
      virgo.wzfrontend/src/main/resources/static/static/js/6723-legacy.5d5c672c.js
  51. 0 0
      virgo.wzfrontend/src/main/resources/static/static/js/7719-legacy.769a9b3d.js
  52. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/8332-legacy.14f07773.js
  53. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.2de5f6a5.js
  54. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.830ae6be.js
  55. 0 1
      virgo.wzfrontend/src/main/resources/static/static/js/app.31b116cc.js
  56. 1 0
      virgo.wzfrontend/src/main/resources/static/static/js/app.eea3ea58.js

+ 3 - 1
virgo.wzfrontend/console/public/index.html

@@ -7,7 +7,9 @@
 		<link rel="stylesheet" type="text/css" href="<%= BASE_URL %>reset.css" />
 		<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4358860_7ta6ukcxj3a.css">
 		<title>有极</title>
-		<script src="<%= BASE_URL %>jquery.js"></script>
+		<script src="<%= BASE_URL %>jquery.js"></script>
+		<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
+		<script src="https://static.bimface.com/api/BimfaceSDKLoader/BimfaceSDKLoader@latest-release.js"></script>
 	</head>
 	<body id="body">
 		<noscript>

+ 2 - 1
virgo.wzfrontend/console/src/App.vue

@@ -26,5 +26,6 @@
 	};
 </script>
 <style lang="scss">
-	@import './assets/scss/index.scss';
+	@import './assets/scss/index.scss';
+	@import './assets/scss/tips.scss';
 </style>

BIN
virgo.wzfrontend/console/src/assets/image/coldsource/chart-box.png


BIN
virgo.wzfrontend/console/src/assets/image/coldsource/chart-image1.png


BIN
virgo.wzfrontend/console/src/assets/image/coldsource/chart-image2.png


BIN
virgo.wzfrontend/console/src/assets/image/coldsource/chart-image3.png


BIN
virgo.wzfrontend/console/src/assets/image/coldsource/chart-line.png


BIN
virgo.wzfrontend/console/src/assets/image/coldsource/time1.png


BIN
virgo.wzfrontend/console/src/assets/image/coldsource/time2.png


BIN
virgo.wzfrontend/console/src/assets/image/coldsource/time3.png


+ 672 - 0
virgo.wzfrontend/console/src/assets/scss/tips.scss

@@ -0,0 +1,672 @@
+.tips-14 {
+	width: 122px;
+	height: 33px;
+	background: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/eb08c436e39a41218c38bffa5f066936) no-repeat;
+	background-size: 100% 100%;
+	padding-top: 7px;
+	padding-left: 45px;
+	font-size: 12px;
+	color: #FFFFFF;
+
+	&.error {
+		background-image: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/e84a8319fb31420aa80e9eb6180d234e);
+	}
+
+	&.success {
+		background-image: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/a4e554e324ad410aaf1dab9dbe863da5);
+	}
+}
+
+.tips-13 {
+	width: 150px;
+	height: 84px;
+	background: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/277e9c68f3074892965263cd3cf05307) -1px -1px no-repeat;
+	background-size: 152px 86px;
+	color: #fff;
+	font-size: 12px;
+	padding: 10px 8px;
+
+	.title {
+		margin-bottom: 5px;
+	}
+
+	.item {
+		height: 17px;
+		background: rgba(101, 112, 137, 0.5);
+		margin-bottom: 2px;
+		color: #D3DEF6;
+		display: flex;
+		align-items: center;
+		padding: 0 3px;
+	}
+
+	.label {
+		flex: 1;
+		width: 0;
+		color: #D3DEF6;
+	}
+
+	.unit {
+		color: #BDC7DB;
+	}
+}
+
+.tips-12 {
+	width: 50px;
+	padding: 10px;
+	border-radius: 5px;
+	background: $--color-primary;
+	text-align: center;
+	color: #fff;
+	opacity: 0.7;
+	
+	.huifont-dianti1 {
+		font-size: 26px;
+	}
+}
+
+.tips-11 {
+	color: #fff;
+	width: 220px;
+
+	.title {
+		height: 33px;
+		display: flex;
+		align-items: center;
+		background: linear-gradient(270deg, rgba(0, 22, 50, 0) 1%, rgba(37, 97, 176, 0.84) 65%, rgba(41, 105, 191, 0.9) 100%);
+		border: 1px solid;
+		border-image: linear-gradient(270deg, rgba(62, 201, 255, 0), rgba(29, 153, 255, 1)) 1 1;
+		border-right: none;
+
+		img {
+			width: 33px;
+			height: 33px;
+		}
+
+		.name {
+			padding-left: 9px;
+			font-weight: 500;
+		}
+	}
+
+	.content {
+		background: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/6d622a2d48244bd49964cee555f44610) no-repeat;
+		background-size: 100% 100%;
+		padding: 9px 7px;
+		position: relative;
+
+		.item {
+			display: flex;
+			align-items: center;
+			line-height: 19px;
+			font-size: 12px;
+		}
+
+		.item:last-child {
+			margin-top: 9px;
+		}
+
+		.label {
+			width: 38px;
+		}
+
+		.value {
+			flex: 1;
+			width: 0;
+			background: linear-gradient(270deg, rgba(0, 151, 225, 0) 0%, rgba(0, 151, 225, 0.8) 100%);
+			padding-left: 5px;
+		}
+
+		&:before {
+			content: '';
+			position: absolute;
+			width: 100%;
+			background: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/dd857ae85d8a47bdbc91a59c6ac70483) 100% no-repeat;
+			background-size: 100% 100%;
+			height: 9px;
+			left: 0;
+			bottom: 0;
+		}
+	}
+}
+
+.tips-10 {
+	color: #fff;
+
+	.tips-top {
+		width: 139px;
+		height: 51px;
+		border: 1px solid rgba(6, 224, 233, 0.4);
+		background: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/68a6c73b116a4f76b6fb166d1ba91bfd) no-repeat;
+		background-size: 100% 100%;
+		margin-left: 12px;
+		padding: 7px;
+	}
+
+	.item {
+		display: flex;
+		align-items: center;
+		font-size: 12px;
+	}
+
+	.item :last-child {
+		margin-bottom: 0px;
+	}
+
+	.label {
+		font-weight: 500;
+	}
+
+	.value {
+		font-size: 14px;
+		margin-right: 2px;
+	}
+
+	.tips-bottom {
+		background: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/756652f93bbd407e9642fe3950e63434) no-repeat;
+		background-size: 100% 100%;
+		width: 151px;
+		height: 63px;
+		margin-top: 3px;
+		position: relative;
+	}
+
+	.tips-bottom::before {
+		content: '';
+		position: absolute;
+		width: 6px;
+		height: 6px;
+		background: #06E0E9;
+		bottom: -3px;
+		left: -2px;
+		border-radius: 50%;
+	}
+
+	.tips-bottom::after {
+		content: '';
+		position: absolute;
+		width: 36px;
+		height: 1px;
+		background: #06E0E9;
+		top: 0;
+		right: 0;
+	}
+}
+
+.tips-9 {
+	width: 310px;
+	position: relative;
+	display: flex;
+
+	.line {
+		width: 137px;
+		height: 162px;
+
+		.top {
+			width: 100%;
+			height: 88px;
+			position: relative;
+		}
+
+		.top::before {
+			content: '';
+			position: absolute;
+			width: 70px;
+			height: 1px;
+			background: #fff;
+			top: 0;
+			right: 0;
+		}
+
+		.top::after {
+			content: '';
+			position: absolute;
+			width: 1px;
+			height: 93px;
+			background: #fff;
+			top: -2px;
+			left: 51px;
+			transform: rotate(20deg);
+		}
+
+		.cricle {
+			width: 74px;
+			height: 74px;
+			border: 2px solid #FFFFFF;
+			border-radius: 50%;
+			position: relative;
+		}
+
+		.cricle::before {
+			content: '';
+			position: absolute;
+			width: 62px;
+			height: 62px;
+			border: 1px solid #FFFFFF;
+			left: 3px;
+			top: 3px;
+			border-radius: 50%;
+		}
+	}
+
+	.article {
+		background: rgba(24, 31, 45, 0.7);
+		box-shadow: inset 0px 0px 8px 0px rgba(227, 235, 255, 0.49);
+		border: 1px solid #A7C3DF;
+		width: 170px;
+	}
+
+	.title {
+		color: #D2E4FF;
+		height: 25px;
+		background: rgba(76, 84, 103, 0.5);
+		border-radius: 2px 2px 0px 0px;
+		display: flex;
+		align-items: center;
+
+		.iconfont {
+			font-size: 10px;
+			color: #D2E4FF;
+			margin: 0 9px;
+			box-shadow: 0px 0px 6px 0px rgba(5, 36, 255, 0.7);
+		}
+	}
+
+	.content {
+		padding: 7px 15px;
+	}
+
+	.item {
+		display: flex;
+		line-height: 24px;
+		font-size: 12px;
+	}
+
+	.label {
+		color: #AAD1FF;
+		margin-right: 5px;
+		min-width: 48px;
+	}
+
+	.value {
+		color: #FFFFFF;
+	}
+}
+
+.tips-8 {
+	color: #fff;
+
+	.title {
+		width: 268px;
+		height: 32px;
+		background: rgba(210, 228, 255, 0.05);
+		border: 1px solid #96C6FF;
+		line-height: 30px;
+		font-weight: 500;
+		padding-left: 12px;
+		position: relative;
+		box-sizing: initial;
+	}
+
+	.title::before,
+	.title::after {
+		content: '';
+		width: 3px;
+		height: 32px;
+		background: #96C6FF;
+		position: absolute;
+		left: -6px;
+		top: 0;
+	}
+
+	.title::after {
+		left: auto;
+		right: -6px;
+	}
+
+	.content {
+		margin-top: 4px;
+		padding: 7px 9px;
+		background: linear-gradient(270deg, rgba(108, 152, 246, 0) 0%, rgba(108, 152, 246, 0.3) 99%);
+	}
+
+	.item {
+		display: flex;
+		line-height: 25px;
+		font-size: 12px;
+		margin-bottom: 2px;
+	}
+
+	.item:last-child {
+		margin-bottom: 0px;
+	}
+
+	.label {
+		width: 97px;
+		text-align: center;
+		background: rgba(38, 57, 105, 0.7);
+		border: 1px solid #96C6FF;
+	}
+
+	.value {
+		padding-left: 11px;
+		flex: 1;
+		width: 0;
+		background: rgba(63, 72, 95, 0.7);
+		border: 1px solid rgba(150, 198, 255, 0.66);
+		border-left: none;
+	}
+}
+
+.tips-7 {
+	width: 185px;
+	background: rgba(0, 0, 0, 0.7);
+	color: #FFFFFF;
+
+	.title {
+		background: #D5B54C;
+		border-radius: 2px 2px 0px 0px;
+		padding: 4px 7px;
+	}
+
+	.content {
+		padding: 12px;
+	}
+
+	.item {
+		font-size: 12px;
+		height: 24px;
+		line-height: 24px;
+		display: flex;
+	}
+
+	.label {
+		margin-right: 14px;
+	}
+
+	.value {
+		color: #E6BA6F;
+	}
+}
+
+.tips-6 {
+	padding: 8px;
+
+	.item {
+		display: flex;
+		margin-bottom: 2px;
+	}
+
+	.item:last-child {
+		margin-bottom: 0px;
+	}
+
+	.label,
+	.value {
+		width: 80px;
+		height: 28px;
+		line-height: 28px;
+		background: rgba(79, 108, 152, 0.3);
+		padding-left: 10px;
+		font-size: 12px;
+		color: #D2E4FF;
+		overflow: hidden;
+	}
+
+	.label {
+		margin-right: 2px;
+	}
+}
+
+.tips-5 {
+	background: rgba(24, 31, 45, 0.9);
+	border-radius: 2px;
+	border: 1px solid rgba(154, 168, 199, 0.2);
+
+	.title {
+		height: 32px;
+		background: rgba(76, 84, 103, 0.5);
+		border-radius: 2px 2px 0px 0px;
+		display: flex;
+		align-items: center;
+		font-weight: 600;
+		font-size: 13px;
+		color: #D2E4FF;
+		border-bottom: 1px solid rgba(154, 168, 199, 0.5);
+
+		.iconfont {
+			font-size: 10px;
+			color: #D2E4FF;
+			margin: 0 9px;
+		}
+	}
+}
+
+.tips-4 {
+	width: 150px;
+	height: 24px;
+	background: linear-gradient(90deg, rgba(211, 179, 20, 0) 0%, rgba(161, 140, 35, 0.8) 53%, rgba(211, 179, 20, 0) 100%);
+	border: 1px solid;
+	border-image: linear-gradient(270deg, rgba(255, 219, 42, 0), rgba(255, 219, 42, 1), rgba(255, 219, 42, 0)) 1 1;
+	font-weight: 600;
+	font-size: 12px;
+	color: #FFFFFF;
+	text-align: center;
+	line-height: 22px;
+	position: relative;
+
+	.iconfont {
+		position: absolute;
+		color: #FFDB2A;
+		bottom: -23px;
+		left: 50%;
+		margin-left: -8px;
+	}
+}
+
+.tips-3 {
+	width: 130px;
+	height: 26px;
+	display: flex;
+	color: #fff;
+	position: relative;
+
+	.label {
+		width: 68px;
+		height: 26px;
+		background: #3371FF;
+		border-radius: 63px 0px 0px 63px;
+		opacity: 0.94;
+		text-align: center;
+		line-height: 26px;
+		font-size: 12px;
+		font-weight: 500;
+	}
+
+	.value {
+		flex: 1;
+		width: 0;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: #000000;
+		opacity: 0.8;
+		height: 26px;
+	}
+
+	.unit {
+		font-size: 12px;
+		opacity: 0.5;
+		margin-left: 2px;
+	}
+
+	&::before {
+		content: '';
+		position: absolute;
+		width: 0;
+		height: 0;
+		border-top: 12px solid transparent;
+		border-right: 12px solid transparent;
+		border-left: 12px solid transparent;
+		border-bottom: 12px solid #2E333D;
+		bottom: -12px;
+		right: 5px;
+		transform: rotate(-45deg);
+	}
+
+	&.primary {
+		.label {
+			color: #3371FF;
+			background: #FFF;
+			opacity: 1;
+		}
+
+		.value {
+			background: #3371FF;
+			opacity: 1;
+		}
+
+		.unit {
+			opacity: 1;
+		}
+
+		&::before {
+			border-bottom: 12px solid #3371FF;
+		}
+	}
+}
+
+.tips-2 {
+	width: 127px;
+	height: 22px;
+	color: #fff;
+	background: #000000;
+	border-radius: 3px;
+	opacity: 0.8;
+	display: flex;
+	align-items: center;
+
+	.label {
+		width: 60px;
+		height: 18px;
+		background: linear-gradient(270deg, rgba(205, 115, 50, 0) 0%, #3371FF 100%);
+		border-radius: 3px 0px 0px 3px;
+		font-size: 12px;
+		color: #FFFFFF;
+		text-align: center;
+	}
+
+	.value {
+		flex: 1;
+		width: 0;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.unit {
+		font-size: 12px;
+		opacity: 0.5;
+		margin-left: 2px;
+	}
+
+	&.warning {
+		.label {
+			background: linear-gradient(270deg, rgba(205, 115, 50, 0) 0%, #F37F2C 100%);
+		}
+	}
+
+	&.error {
+		.label {
+			background: linear-gradient(270deg, rgba(205, 115, 50, 0) 0%, #F04243 100%);
+		}
+	}
+}
+
+.tips-1 {
+	width: 205px;
+	height: 56px;
+	background: rgba(8, 49, 51, 0.8);
+	box-shadow: inset 0px 0px 16px 0px #06E0E9;
+	border-radius: 30px;
+	border: 1px solid rgba(255, 255, 255, 0.5);
+	display: flex;
+	align-items: center;
+	color: #fff;
+	position: relative;
+
+	.cricle {
+		width: 48px;
+		height: 48px;
+		background: rgba(8, 49, 51, 0.8);
+		box-shadow: inset 0px 0px 16px 0px #06E0E9;
+		border: 1px solid rgba(255, 255, 255, 0.5);
+		border-radius: 50%;
+		margin-left: 7px;
+		margin-right: 25px;
+		text-align: center;
+		line-height: 46px;
+	}
+
+	.iconfont {
+		font-size: 24px;
+	}
+
+	.label {
+		font-size: 12px;
+		line-height: 17px;
+	}
+
+	.value {
+		display: flex;
+		align-items: center;
+	}
+
+	.number {
+		font-size: 22px;
+		line-height: 24px;
+		margin-right: 6px;
+	}
+
+	.line {
+		content: '';
+		position: absolute;
+		width: 54px;
+		height: 3px;
+		background: #FFFFFF;
+		bottom: 0;
+		left: 50%;
+		margin-left: -27px;
+	}
+
+	.line::after {
+		content: '';
+		position: absolute;
+		height: 240px;
+		width: 3px;
+		background: linear-gradient(313deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
+		bottom: -240px;
+		left: 50%;
+		margin-left: -1px;
+	}
+
+	&.error {
+		background: rgba(61, 5, 0, 0.7);
+		box-shadow: inset 0px 0px 16px 0px rgba(240, 66, 67, 0.72);
+
+		.cricle {
+			background: rgba(61, 5, 0, 0.7);
+			box-shadow: inset 0px 0px 16px 0px rgba(240, 66, 67, 0.72);
+		}
+	}
+
+	&.warning {
+		background: rgba(57, 54, 3, 0.68);
+		box-shadow: inset 0px 0px 16px 0px rgba(255, 221, 97, 0.72);
+
+		.cricle {
+			background: rgba(57, 54, 3, 0.68);
+			box-shadow: inset 0px 0px 16px 0px rgba(255, 221, 97, 0.72);
+		}
+	}
+}

ファイルの差分が大きいため隠しています
+ 1373 - 0
virgo.wzfrontend/console/src/components/common/model.vue


+ 1 - 1
virgo.wzfrontend/console/src/components/work/space/house/edit.vue

@@ -110,7 +110,7 @@
 					roomTypeId: '', //房源类型
 					area: '',
 					price: '',
-					payType: '月',
+					payType: 0,
 					payWay: '',
 					decoration: 0,
 					investmentState: 0,

+ 11 - 0
virgo.wzfrontend/console/src/httpApi/space.js

@@ -320,4 +320,15 @@ export function deleteLookRecordById(id) {
 		url: `/api/lookRecord/delete/${id}`,
 		method: 'delete'
 	})
+}
+/* 
+ * 获取模型viewToken
+ * 
+ * 
+ */
+export function getBimViewToken(fileId) {
+	return request({
+		url: `/api/bim/viewToken/${fileId}`,
+		method: 'get',
+	});
 }

+ 7 - 0
virgo.wzfrontend/console/src/router/modules/operation.js

@@ -19,5 +19,12 @@ const operation = [{
 	meta: {
 		title: '会议设置'
 	}
+}, {
+	path: 'operation/bim',
+	component: () => import('@/views/work/operation/bim'),
+	name: '模型设备',
+	meta: {
+		title: '模型设备'
+	}
 }]
 export default operation;

+ 608 - 0
virgo.wzfrontend/console/src/uitls/controls.js

@@ -0,0 +1,608 @@
+import {
+	Message
+} from 'element-ui'
+class bimView {
+	constructor(arg) {
+		let viewToken, dom, app, viewer3D, model3D, viewerGIS, renderSuccess, index = 0,
+			click, hover, roomSaved, change, marker3D, roomManager, layerMng, layerId, walk, elementColor, type,
+			map, background, extObjIds = [],
+			elementObject = {
+				fileId: '',
+				objectId: ''
+			},
+			extObjMng, roomEditorToolbar, bimIntegrateId, roamAngle, wallEffect;
+		dom = arg.dom
+		viewToken = arg.viewToken;
+		renderSuccess = arg.renderSuccess;
+		click = arg.click;
+		change = arg.change;
+		hover = arg.hover;
+		roomSaved = arg.roomSaved;
+		bimIntegrateId = arg.bimIntegrateId;
+		roamAngle = arg.roamAngle;
+		type = arg.type;
+		background = arg.background;
+		this.init = () => {
+			//初始化
+			let options = new BimfaceSDKLoaderConfig();
+			options.viewToken = viewToken;
+			BimfaceSDKLoader.load(options, (viewMetaData) => {
+				this.succrssCallback(viewMetaData)
+			}, () => {
+				this.failureCallback()
+			});
+		}
+		this.succrssCallback = (viewMetaData) => {
+			if (viewMetaData.viewType == "3DView") this.View3DRender();
+			if (viewMetaData.viewType == "gisView") this.gisRender();
+		}
+		this.failureCallback = () => {
+			console.error('加载失败');
+		}
+		this.getCamera = () => {
+			return viewer3D.getCamera();
+		}
+		this.View3DRender = () => {
+			let webAppConfig = new Glodon.Bimface.Application.WebApplication3DConfig();
+			webAppConfig.domElement = dom;
+			webAppConfig.effectMode = 'fluency';
+			let bgcolor = !background ? new Glodon.Web.Graphics.Color(30, 36, 48, 1) : new Glodon.Web.Graphics
+				.Color(20, 26, 36, 1);
+			webAppConfig.backgroundColor = [{
+				color: bgcolor,
+				stop: "100%"
+			}]
+			// 设置全局单位
+			webAppConfig.globalUnit = Glodon.Bimface.Common.Units.LengthUnits.Millimeter;
+			// 创建WebApplication
+			app = new Glodon.Bimface.Application.WebApplication3D(webAppConfig);
+			// 添加待显示的模型
+			app.addView(viewToken);
+
+			// 从WebApplication获取viewer3D对象
+			viewer3D = app.getViewer();
+			viewer3D.addEventListener(Glodon.Bimface.Viewer.Viewer3DEvent.MouseClicked, data => {
+				console.log(data);
+				if (data.eventType == 'Click') { //左击
+					if (click) click(data);
+				} else {
+					if (!elementObject.objectId) return;
+					setTimeout(() => {
+						if ($('.bf-menu.bf-menu-right .bf-menu-item')[0]) $(
+								'.bf-menu.bf-menu-right .bf-menu-item')[0].onclick = this
+							.bimAttribute;
+						if ($('.bf-menu.bf-menu-left .bf-menu-item')[0]) $(
+								'.bf-menu.bf-menu-left .bf-menu-item')[0].onclick = this
+							.bimAttribute;
+					}, 0)
+				}
+			})
+			viewer3D.addEventListener(Glodon.Bimface.Viewer.Viewer3DEvent.Hover, data => {
+				if (hover) hover(data);
+			})
+			viewer3D.addEventListener(Glodon.Bimface.Viewer.Viewer3DEvent.ViewAdded, () => {
+				model3D = viewer3D.getModel();
+				this.setCamera({
+					isPan: true,
+					isRotate: true,
+					isZoom: true
+				})
+				app.getToolbar('MainToolbar').hide();
+				window.CLOUD.MaterialUtil.getDefaultSelectedMaterial = function() {
+					if (!elementColor) elementColor = new window.CLOUD
+						.MeshBasicClipMaterial({
+							color: '#3669b8',
+							opacity: 0.7,
+						})
+					return elementColor;
+				}
+				// if ($('.gld-bf-properties')[0]) $('.gld-bf-properties')[0].onclick = this.bimAttribute;
+				// if ($('.gld-bf-firstperson')[0]) $('.gld-bf-firstperson')[0].onclick = this.walkStatus;
+				if (renderSuccess) renderSuccess();
+			})
+			viewer3D.addEventListener(Glodon.Bimface.Viewer.Viewer3DEvent.SelectionChanged, data => {
+				if (data.length == 1) {
+					let elementData = data[0].split('.');
+					elementObject.fileId = elementData.length == 2 ? elementData[0] : '';
+					elementObject.objectId = elementData.length == 2 ? elementData[1] : elementData[0];
+				} else {
+					elementObject = {
+						fileId: '',
+						objectId: ''
+					}
+				}
+				if (change) change(elementObject);
+			});
+		}
+		this.walkStatus = () => {
+			if (roamAngle) this.setStatus(roamAngle)
+		}
+		this.bimAttribute = () => {
+			if (type === 'model') return;
+			$('.bf-close').click();
+			if (!elementObject.objectId) return Message({
+				message: '请选择一个构件',
+				type: 'warning',
+				duration: 2000
+			});
+			model.show({
+				bimIntegrateId: bimIntegrateId,
+				fileId: elementObject.fileId,
+				objectId: elementObject.objectId
+			});
+		}
+		this.setToolbars = (isShow) => {
+			isShow ? app.getToolbar('MainToolbar').show() : app.getToolbar('MainToolbar').hide();
+		}
+		this.gisRender = () => {
+			// 创建WebApplicationGISConfig
+			let webAppConfig = new Glodon.Bimface.Application.WebApplicationGISConfig();
+			// 设置创建WebApplicationGIS的dom对象
+			webAppConfig.domElement = dom;
+			// 创建WebApplicationGIS
+			app = new Glodon.Bimface.Application.WebApplicationGIS(webAppConfig);
+			// 加载待显示的场景
+			app.addScene(viewToken);
+			// 获取ViewerGIS对象
+			viewerGIS = app.getViewer();
+			viewerGIS.addEventListener(Glodon.Bimface.Viewer.ViewerGISEvent.SceneAdded, data => {
+				layerMng = viewerGIS.getLayerManager();
+				if (renderSuccess) renderSuccess();
+			});
+			viewerGIS.addEventListener(Glodon.Bimface.Viewer.ViewerGISEvent.LayerAdded, function(data) {
+				layerId = data.layerId;
+			});
+			viewerGIS.addEventListener(Glodon.Bimface.Viewer.ViewerGISEvent.SelectedObjectsChanged, data => {});
+		}
+		this.getComponentProperty = (objectId, callback) => {
+			viewer3D.getModel().getComponentProperty(objectId, callback)
+		}
+		this.returnCamera = () => {
+			return viewer3D.getCamera()._cloudCamera;
+		}
+		this.addDrawable = (option, successCallback) => {
+			// 初始化DrawableContainer
+			let drawableConfig = new Glodon.Bimface.Plugins.Drawable.DrawableContainerConfig();
+			drawableConfig.viewer = viewer3D;
+			let drawableContainer = new Glodon.Bimface.Plugins.Drawable.DrawableContainer(drawableConfig);
+			// 创建自定义元素,可以是一个dom element,也可以是个字符串
+			let config = new Glodon.Bimface.Plugins.Drawable.CustomItemConfig();
+			config.content = option.html;
+			config.viewer = viewer3D;
+			config.worldPosition = option.position;
+			config.opacity = 1;
+			if (option.offsetY) config.offsetY = option.offsetY;
+			if (option.offsetX) config.offsetX = option.offsetX;
+			if (option.visibleDistance) config.visibleDistance = option.visibleDistance;
+			//生成customItem实例
+			let customItem = new Glodon.Bimface.Plugins.Drawable.CustomItem(config);
+			// customItem.hide();
+			// 添加自定义标签
+			drawableContainer.addItem(customItem);
+			// 开启标签的深度检测
+			// customItem.enableDepthTest(true);
+
+			// // 设置标签遮挡状态变化事件
+			// customItem.onObstructionChanged(function(data) {
+			// 	if (data) {
+			// 		// 被遮挡时隐藏标签
+			// 		customItem.hide();
+			// 	} else {
+			// 		// 未遮挡时显示标签
+			// 		customItem.show();
+			// 	}
+			// });
+			customItem.onClick(successCallback);
+		}
+		this.setNavigationMode = () => {
+			viewer3D.setNavigationMode(Glodon.Bimface.Viewer.NavigationMode3D.Walk);
+		}
+		this.getWalkthroughData = () => {
+			let config = new Glodon.Bimface.Plugins.Walkthrough.WalkthroughConfig();
+			config.viewer = viewer3D;
+			let wt = new Glodon.Bimface.Plugins.Walkthrough.Walkthrough(config);
+			wt.addKeyFrame();
+			return wt.getKeyFrames()[0];
+		}
+		this.getBoundingBox = (fileId, callback) => {
+			model3D.getBoundingBox(fileId, callback)
+		}
+		this.isolateComponentsByObjectData = fileList => {
+			model3D.clearIsolation();
+			model3D.isolateComponentsByObjectData(fileList, Glodon.Bimface.Viewer.IsolateOption
+				.MakeOthersTranslucent);
+			viewer3D.render();
+		}
+		this.clearIsolation = () => {
+			model3D.clearIsolation();
+			viewer3D.render();
+		}
+		this.isolateComponentsById = ids => {
+			model3D.clearIsolation();
+			model3D.isolateComponentsById(ids, Glodon.Bimface.Viewer.IsolateOption
+				.MakeOthersTranslucent);
+			viewer3D.render();
+		}
+		this.setMap = (elem, fn) => {
+			if (map) return;
+			let mapConfig = Glodon.Bimface.Plugins.Map.MapConfig();
+			mapConfig.domElement = elem; //页面的dom元素
+			mapConfig.viewer = viewer3D; //三维模型
+			map = new Glodon.Bimface.Plugins.Map.Map(mapConfig);
+			let list = map.getFloorList(); //获取楼层的小地图列表
+			if (fn) fn(list);
+		}
+		this.showMap = (id) => {
+			map.showFloorById(id);
+		}
+		this.addRecPlane = (data) => { //创建二维平面并贴图
+			//data = {type|image、canvas,obj|图片地址或者canvas,position|位置}
+			//pt1是位置 pt2是大小
+			let pt1 = {
+					x: 0,
+					y: 0,
+					z: 0
+				},
+				pt2 = {
+					x: data.offset.width,
+					y: data.offset.height,
+					z: 200
+				};
+			let extObjId1 = this.createExternalObject(pt1, pt2, data); //正
+			let extObjId2 = this.createExternalObject(pt1, pt2, data); //反
+			let extObjId3 = this.createExternalObject(pt1, pt2, data); //正
+			let extObjId4 = this.createExternalObject(pt1, pt2, data); //反
+			return [extObjId1, extObjId3, extObjId2, extObjId4]
+		}
+		this.createExternalObject = (pt1, pt2, data) => { //创建外部构件
+			//添加外部构件
+			if (!extObjMng) extObjMng = new Glodon.Bimface.Plugins.ExternalObject.ExternalObjectManager(
+				viewer3D);
+			let recPlane = this.createPlane(pt1, pt2);
+			index++;
+			// 将平面对象添加为外部构件,并获取其ID
+			extObjMng.loadObject({
+				name: 'recPlane' + index,
+				object: recPlane
+			});
+			let extObjId = extObjMng.getObjectIdByName("recPlane" + index);
+			extObjIds.push(extObjId);
+			let position = {
+				"x": index % 2 == 0 ? (data.position.x - 200) : data.position.x,
+				"y": index % 2 == 0 ? (data.position.y - data.offset.width) : data.position.y,
+				"z": data.position.z
+			}
+			let rotateY = data.rotateY || Math.PI / 2;
+			extObjMng.offset(extObjId, position);
+			extObjMng.rotateX(extObjId, Math.PI / 2);
+			index % 2 == 0 ? extObjMng.rotateY(extObjId, rotateY) : extObjMng.rotateY(extObjId, -rotateY);
+			return extObjId;
+		}
+		this.createPlane = (pt1, pt2) => { // 构造矩形平面
+			//pt1是位置 pt2是大小
+			let rectanglePlane = new Glodon.Bimface.Plugins.Geometry.Plane({
+				type: 'rectangle',
+				points: [pt1, pt2]
+			});
+			return rectanglePlane;
+		}
+		this.clearALlPlane = () => {
+			if (extObjMng) extObjMng.clear();
+		}
+		this.setCanvasMaterial = (ids, data) => {
+			// 构造材质配置 materialConfig
+			let showIds = ids.filter((item, index) => data.updateColor ? index % 2 == 0 : index % 2 != 0);
+			let hideIds = ids.filter((item, index) => data.updateColor ? index % 2 != 0 : index % 2 == 0);
+			let materialConfig = new Glodon.Bimface.Plugins.Material.MaterialConfig();
+			materialConfig.transparent = true;
+			materialConfig.viewer = viewer3D;
+			if (data.type == 'canvas') {
+				materialConfig.canvas = data.obj;
+			} else {
+				materialConfig.src = data.obj;
+			}
+			materialConfig.callback = function() {
+				extObjMng.show({
+					ids: showIds
+				})
+				extObjMng.hide({
+					ids: hideIds
+				})
+				viewer3D.render();
+			};
+			materialConfig.transparent = true;
+			// 构造材质对象 material
+			let material = new Glodon.Bimface.Plugins.Material.Material(materialConfig);
+			// 将外部构件赋予材质
+			material.overrideComponentsMaterialById(showIds, viewer3D.getModel().id);
+
+		}
+		this.zoomToBoundingBox = (extObjId) => {
+			let boundingBox = viewer3D.getModel().getBoundingBoxById(extObjId);
+			viewer3D.zoomToBoundingBox(boundingBox);
+		}
+		this.zoomToSelectedComponents = (ids) => {
+			viewer3D.getModel().clearSelectedComponents();
+			viewer3D.getModel().setSelectedComponentsById(ids);
+			viewer3D.getModel().zoomToSelectedComponents();
+		}
+		this.walkthrough = () => { //固定路径漫游
+			let config = new Glodon.Bimface.Plugins.Walkthrough.WalkthroughConfig();
+			config.viewer = viewer3D;
+			let wt = new Glodon.Bimface.Plugins.Walkthrough.Walkthrough(config);
+			return wt;
+		}
+		this.insertRooms = (option) => {
+			if (!roomManager) roomManager = viewer3D.getRoomManager();
+			let roomConfig = new Glodon.Bimface.Plugins.Rooms.RoomConfig();
+			roomConfig.viewer = viewer3D;
+			roomConfig.roomId = option.id;
+			roomConfig.geometry = {
+				"type": "extrusion",
+				"boundary": option.boundary,
+				"height": option.height
+			};
+			if (typeof option.roomColor == 'object') {
+				roomConfig.roomColor = new Glodon.Web.Graphics.Color(option.roomColor.r, option.roomColor.g,
+					option.roomColor.b, option.roomColor.a);
+			} else {
+				roomConfig.roomColor = new Glodon.Web.Graphics.Color("#EE799F", 0.8);
+			}
+			if (typeof option.frameColor == 'object') {
+				roomConfig.frameColor = new Glodon.Web.Graphics.Color(option.frameColor.r, option.frameColor.g,
+					option.frameColor.b, option.frameColor.a);
+			} else {
+				roomConfig.frameColor = new Glodon.Web.Graphics.Color("#90EE90", 0.8);
+			}
+			roomManager.addRoom(new Glodon.Bimface.Plugins.Rooms.Room(roomConfig));
+			viewer3D.render();
+		}
+		this.colorRoomById = (option) => {
+			if (!roomManager) return;
+			let room = roomManager.getRoomById(option.id);
+			if (typeof option.roomColor == 'object') {
+				room.setRoomColor(new Glodon.Web.Graphics.Color(option.roomColor.r, option.roomColor.g,
+					option.roomColor.b, option.roomColor.a));
+				room.setRoomFrameColor(new Glodon.Web.Graphics.Color("#90EE90", 0.8));
+			} else {
+				room.setRoomColor(new Glodon.Web.Graphics.Color("#EE799F", 0.8));
+				room.setRoomFrameColor(new Glodon.Web.Graphics.Color("#90EE90", 0.8));
+			}
+		}
+		this.clearAllRooms = () => {
+			if (roomManager) roomManager.clearAllRooms();
+		}
+		this.add3DMaker = (markerType, position, imageSrc, clickFn) => {
+			if (!marker3D) {
+				let markerConfig = new Glodon.Bimface.Plugins.Marker3D.Marker3DContainerConfig();
+				markerConfig.viewer = viewer3D;
+				marker3D = new Glodon.Bimface.Plugins.Marker3D.Marker3DContainer(markerConfig);
+			}
+			let marker3dConfig = new Glodon.Bimface.Plugins.Marker3D.Marker3DConfig();
+			if (markerType == 'image') {
+				marker3dConfig.src = imageSrc ||
+					"http://static.bimface.com/resources/3DMarker/warner/warner_red.png";
+			} else if (markerType == 'canvas') {};
+			marker3dConfig.worldPosition = position;
+			marker3dConfig.size = 60;
+			let marker3d = new Glodon.Bimface.Plugins.Marker3D.Marker3D(marker3dConfig);
+			if (clickFn) marker3d.onClick(clickFn)
+			marker3D.addItem(marker3d);
+			viewer3D.render();
+		}
+		this.clear3DMaker = () => {
+			if (marker3D) marker3D.clear();
+		}
+		this.set3DMaker = (imageSrc, position) => {
+			if (!marker3D) return this.add3DMaker('image', position, imageSrc);
+			let mark = marker3D.getAllItems()[0];
+			mark.setSrc(imageSrc || 'http://static.bimface.com/resources/3DMarker/warner/warner_red.png')
+			viewer3D.render();
+		}
+		this.setCamera = option => {
+			console.log('setCamera');
+			viewer3D.enableTranslate(option.isPan)
+			viewer3D.enableOrbit(option.isRotate)
+			viewer3D.enableScale(option.isZoom)
+		}
+		this.colorElementById = (elementIds, option) => {
+			let color;
+			if (option) {
+				color = new Glodon.Web.Graphics.Color(option.r, option.g, option.b, option.a);
+			} else {
+				color = new Glodon.Web.Graphics.Color("#EE799F", 1);
+			}
+			viewer3D.getModel().overrideComponentsColorById(elementIds, color);
+			viewer3D.render();
+		}
+		this.overrideComponentsColorByObjectData = () => {
+			let color = new Glodon.Web.Graphics.Color("#9598a9", 0.5);
+			model3D.overrideAllComponentsColor(color);
+			viewer3D.render();
+		}
+		this.clearColorElementById = (elementIds) => {
+			viewer3D.getModel().restoreComponentsColorById(elementIds);
+			viewer3D.render();
+		}
+		this.clearOverrideColorComponents = () => {
+			viewer3D.getModel().clearOverrideColorComponents();
+			viewer3D.render();
+		}
+		this.getAreas = (callback) => {
+			viewer3D.getAreas(callback)
+		}
+		this.setNavigationMode = () => {
+			viewer3D.setNavigationMode(Glodon.Bimface.Viewer.NavigationMode3D.ThirdPerson);
+			viewer3D.setFlySpeedRate(3);
+		}
+		this.setBlueSky = () => {
+			let skyBoxManagerConfig = new Glodon.Bimface.Plugins.SkyBox.SkyBoxManagerConfig();
+			skyBoxManagerConfig.viewer = viewer3D;
+			skyBoxManagerConfig.style = Glodon.Bimface.Plugins.SkyBox.SkyBoxStyle.CloudySky;
+			let skyBoxManager = new Glodon.Bimface.Plugins.SkyBox.SkyBoxManager(skyBoxManagerConfig);
+			skyBoxManager.setStyle(Glodon.Bimface.Plugins.SkyBox.SkyBoxStyle.CloudySky);
+			skyBoxManager.enableSkyBox(true);
+		}
+		this.setGalaxySky = () => {
+			let skyBoxManagerConfig = new Glodon.Bimface.Plugins.SkyBox.SkyBoxManagerConfig();
+			skyBoxManagerConfig.viewer = viewer3D;
+			skyBoxManagerConfig.style = Glodon.Bimface.Plugins.SkyBox.SkyBoxStyle.DarkNight;
+			let skyBoxManager = new Glodon.Bimface.Plugins.SkyBox.SkyBoxManager(skyBoxManagerConfig);
+			skyBoxManager.enableSkyBox(true);
+			viewer3D.render();
+		}
+		this.getCameraState = () => {
+			return viewer3D.getCamera().getStatus();
+		}
+		this.setStatus = (value) => {
+			viewer3D.getCamera().setStatus(value);
+		}
+		this.setStatusValue = (val) => {
+			roamAngle = val;
+		}
+		this.setCameraAnimation = (val) => {
+			viewer3D.setCameraAnimation(val);
+		}
+		this.setCameraState = (state) => {
+			viewer3D.setCameraStatus(state);
+		}
+		this.enableHover = (isHover) => {
+			viewer3D.enableHover(isHover);
+		}
+		this.setGlowEffectById = (ids) => {
+			viewer3D.enableGlowEffect(true);
+			model3D.setGlowEffectById(ids, {
+				type: "body",
+				color: new Glodon.Web.Graphics.Color(255, 229, 89, 1),
+				intensity: 1,
+				spread: 3
+			})
+			viewer3D.render();
+		}
+		this.setGlowEffectByQuery = query => {
+			//query array
+			model3D.getComponentsByConditions(query, data => {
+				this.setGlowEffectById(data);
+			})
+		}
+		this.clearGlowEffect = () => {
+			model3D.clearGlowEffect();
+			viewer3D.render();
+		}
+		this.showExclusiveComponentsByObjectData = conditions => {
+			//根据筛选条件显示构件,其余全部隐藏
+			model3D.showExclusiveComponentsByObjectData(conditions);
+			viewer3D.render();
+		}
+		this.getObjectDataById = objectId => {
+			return model3D.getObjectDataById(objectId);
+		}
+		this.lockAxis = () => {
+			viewer3D.lockAxis(Glodon.Bimface.Viewer.AxisOption.Z, [Math.PI / 12, Math.PI / 2])
+		}
+		this.setRotationCenter = point => {
+			viewer3D.setRotationCenter(new Glodon.Web.Geometry.Point3d(point.x, point.y, point.z))
+		}
+		this.getTreeList = callback => {
+			model3D.getModelTree(callback);
+		}
+		this.editRoom = option => {
+			// 创建房间编辑器工具条的配置
+			if (roomEditorToolbar) return;
+			let roomEditorToolbarConfig = new Glodon.Bimface.Plugins.Rooms.RoomEditorToolbarConfig();
+			roomEditorToolbarConfig.viewer = viewer3D;
+			roomEditorToolbarConfig.roomId = option.roomId;
+			// 创建房间编辑器工具条
+			roomEditorToolbar = new Glodon.Bimface.Plugins.Rooms.RoomEditorToolbar(roomEditorToolbarConfig);
+			// 注册房间编辑器工具条的监听事件
+			roomEditorToolbar.addEventListener(Glodon.Bimface.Plugins.Rooms.RoomEditorToolbarEvent.Saved,
+				data => {
+					if (roomSaved) {
+						roomSaved(data)
+						this.exitRoom();
+					}
+				});
+			roomEditorToolbar.addEventListener(Glodon.Bimface.Plugins.Rooms.RoomEditorToolbarEvent.Cancelled,
+				data => {
+					this.exitRoom();
+				});
+		}
+		this.exitRoom = () => {
+			if (roomEditorToolbar) {
+				roomEditorToolbar.exit();
+				roomEditorToolbar = null;
+			}
+		}
+		this.setGlowEffect = option => { //gis发光
+			if (!layerId || !layerMng) return;
+			viewerGIS.enableGlowEffect(true);
+			layerMng.getLayer(layerId).getComponentManager().setGlowEffectById(option.ids, option.type);
+		}
+		this.convertObject = (name, id) => {
+			//添加外部构件
+			if (!extObjMng) extObjMng = new Glodon.Bimface.Plugins.ExternalObject.ExternalObjectManager(
+				viewer3D);
+			if (extObjMng.getObjectIdByName(name)) return extObjMng.getObjectIdByName(name);
+			let obj = extObjMng.convert(id);
+			extObjMng.loadObject({
+				name: name,
+				object: obj
+			})
+			viewer3D.render();
+			return extObjMng.getObjectIdByName(name);
+		}
+		this.rotateObject = (extObjId, angle) => {
+			let animationId;
+			animate()
+
+			function animate() {
+				animationId = requestAnimationFrame(animate)
+				extObjMng.rotateOnBasePoint(extObjId, {
+					x: 46290.56403256581,
+					y: 35755.300171217226,
+					z: -7232.165669450452,
+				}, {
+					x: 0,
+					y: 0,
+					z: 1
+				}, Math.PI / angle);
+				viewer3D.render();
+			}
+			setTimeout(() => {
+				if (animationId) cancelAnimationFrame(animationId);
+			}, 3000)
+		}
+		this.hideComponentsById = (ids) => {
+			model3D.hideComponentsById(ids);
+			viewer3D.render();
+		}
+		this.setRotationCenter = (point) => {
+			viewer3D.setRotationCenter(point)
+		}
+		this.createWallEffect = (option) => {
+			//创建电子围栏
+			// 构造电子围墙效果配置项
+			let wallEffectConfig = new Glodon.Bimface.Plugins.Animation.WallEffectConfig();
+			// 配置Viewer对象、方向、持续时间、路径、高度
+			wallEffectConfig.viewer = viewer3D;
+			wallEffectConfig.direction = {
+				type: "Tangent", // 运动方式为沿着路径的切线方向
+				reverse: false // 运动方向默认为逆时针
+			}
+			wallEffectConfig.duration = option.duration;
+			wallEffectConfig.height = option.height;
+			wallEffectConfig.stretch = true;
+			wallEffectConfig.path = option.path;
+			// 电子围墙颜色
+			wallEffectConfig.color = new Glodon.Web.Graphics.Color(50, 211, 166, 0.8);
+			// 构造电子围墙扫描效果对象
+			wallEffect = new Glodon.Bimface.Plugins.Animation.WallEffect(wallEffectConfig);
+		}
+		this.destroy = () => {
+			console.log('销毁场景');
+			viewer3D.destroy();
+		}
+		this.init();
+	}
+}
+export default bimView;

+ 33 - 5
virgo.wzfrontend/console/src/views/system/log.vue

@@ -122,15 +122,30 @@
 			</el-timeline-item>
 			<el-timeline-item timestamp="2024-06-28" placement="top">
 				<div class="log-box">
-					<div class="log-item">1、完成会议场所、会议类型的功能。</div>
+					<div class="log-item">1、完成会议场所、会议类型的功能。</div>
 					<div class="log-item">2、完成项目会议、公司会议的功能。</div>
 				</div>
+			</el-timeline-item>
+			<el-timeline-item timestamp="2024-06-29" placement="top">
+				<div class="log-box">
+					<div class="log-item">1、新增角色设置的功能以及根据不同项目进行设置菜单。</div>
+					<div class="log-item">2、修复未注册登录不上去的bug。</div>
+					<div class="log-item">3、新增标签组织隔离。</div>
+				</div>
+			</el-timeline-item>
+			<el-timeline-item timestamp="2024-07-01" placement="top">
+				<div class="log-box">
+					<div class="log-item">1、修改用户登录不同类型项目和身份显示不同菜单。</div>
+					<div class="log-item">2、切换项目身份显示不同菜单。</div>
+					<div class="log-item">3、编写用户手册的部分功能(<span class="download-item" @click="download(13808)">点击下载</span>)。
+					</div>
+				</div>
 			</el-timeline-item>
-			<el-timeline-item timestamp="2024-06-29" placement="top">
+			<el-timeline-item timestamp="2024-07-01" placement="top">
 				<div class="log-box">
-					<div class="log-item">1、新增角色设置的功能以及根据不同项目进行设置菜单。</div>
-					<div class="log-item">2、修复未注册登录不上去的bug。</div>
-					<div class="log-item">3、新增标签组织隔离。</div>
+					<div class="log-item">1、新增运维管理-模型设备,展示BIM模型。</div>
+					<div class="log-item">2、实现部分小程序页面(<span class="download-item" @click="download(13809)">点击下载</span>)。
+					</div>
 				</div>
 			</el-timeline-item>
 		</el-timeline>
@@ -138,6 +153,14 @@
 </template>
 
 <script>
+	import config from '@/config'
+	export default {
+		methods: {
+			download(id) {
+				window.location.href = config.baseURL + '/file/filenode/' + id;
+			}
+		},
+	}
 </script>
 
 <style lang="scss">
@@ -168,5 +191,10 @@
 				padding-left: 24px;
 			}
 		}
+
+		.download-item {
+			color: #93b8ff;
+			cursor: pointer;
+		}
 	}
 </style>

+ 8 - 8
virgo.wzfrontend/console/src/views/work/crm/customer.vue

@@ -146,14 +146,6 @@
 		},
 		created() {
 			this.init();
-			getCustomerCount({
-				organizationId: this.$store.getters.organization.id,
-				userId: this.$store.getters.user.id
-			}).then(res => {
-				if (res.state) {
-					this.countBox = res.data;
-				}
-			})
 		},
 		methods: {
 			init() {
@@ -169,6 +161,14 @@
 						this.tableData = res.data.dataList;
 						this.totalCount = res.data.totalCount;
 					}
+				})
+				getCustomerCount({
+					organizationId: this.$store.getters.organization.id,
+					userId: this.$store.getters.user.id
+				}).then(res => {
+					if (res.state) {
+						this.countBox = res.data;
+					}
 				})
 			},
 			downloadFile() {

ファイルの差分が大きいため隠しています
+ 1102 - 0
virgo.wzfrontend/console/src/views/work/operation/bim.vue


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/index.html


virgo.wzfrontend/src/main/resources/static/static/css/4198.b6c7aaf0.css → virgo.wzfrontend/src/main/resources/static/static/css/2412.b6c7aaf0.css


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/2702.678f8715.css


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/css/6061.4b860cdb.css


virgo.wzfrontend/src/main/resources/static/static/css/4889.b6c7aaf0.css → virgo.wzfrontend/src/main/resources/static/static/css/6267.b6c7aaf0.css


virgo.wzfrontend/src/main/resources/static/static/css/5850.32d3f99b.css → virgo.wzfrontend/src/main/resources/static/static/css/6296.32d3f99b.css


virgo.wzfrontend/src/main/resources/static/static/css/6723.3f9acf7e.css → virgo.wzfrontend/src/main/resources/static/static/css/7049.3f9acf7e.css


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/8332.678f8715.css


ファイルの差分が大きいため隠しています
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/css/app.144f7bce.css


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/css/app.a19ecf23.css


BIN
virgo.wzfrontend/src/main/resources/static/static/img/time2.b2368060.png


virgo.wzfrontend/src/main/resources/static/static/js/1357-legacy.c2e4eada.js → virgo.wzfrontend/src/main/resources/static/static/js/1357-legacy.e3e1f631.js


virgo.wzfrontend/src/main/resources/static/static/js/1620.5b4862ac.js → virgo.wzfrontend/src/main/resources/static/static/js/1620.2f57ff74.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/4198-legacy.135fd77a.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/2529-legacy.c3ae9adc.js


virgo.wzfrontend/src/main/resources/static/static/js/2635.dd9eb213.js → virgo.wzfrontend/src/main/resources/static/static/js/2635.35795af7.js


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/2702.32216d68.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/2907-legacy.633fd2da.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/2907.c9fa4683.js


virgo.wzfrontend/src/main/resources/static/static/js/3782.9dc1b823.js → virgo.wzfrontend/src/main/resources/static/static/js/3782.13aee776.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/4976-legacy.befbc509.js


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/5400-legacy.7f0c7834.js


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/5400.eff6fa99.js


virgo.wzfrontend/src/main/resources/static/static/js/5412.b8c962eb.js → virgo.wzfrontend/src/main/resources/static/static/js/5412.d7659be0.js


virgo.wzfrontend/src/main/resources/static/static/js/5629-legacy.c4e9b16c.js → virgo.wzfrontend/src/main/resources/static/static/js/5629-legacy.d97f98a8.js


ファイルの差分が大きいため隠しています
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/6061-legacy.50760ca2.js


ファイルの差分が大きいため隠しています
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/6061.4c294ac8.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/4889.28c9be2f.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/5850-legacy.2ff3d398.js


ファイルの差分が大きいため隠しています
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/static/js/5850.49b35668.js


ファイルの差分が大きいため隠しています
+ 2 - 2
virgo.wzfrontend/src/main/resources/static/static/js/6723-legacy.5d5c672c.js


virgo.wzfrontend/src/main/resources/static/static/js/7719-legacy.58c6e0f0.js → virgo.wzfrontend/src/main/resources/static/static/js/7719-legacy.769a9b3d.js


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/8332-legacy.14f07773.js


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.2de5f6a5.js


ファイルの差分が大きいため隠しています
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/app-legacy.830ae6be.js


ファイルの差分が大きいため隠しています
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/static/js/app.31b116cc.js


ファイルの差分が大きいため隠しています
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/static/js/app.eea3ea58.js