whx 7 months ago
parent
commit
bb77d7b970
100 changed files with 6227 additions and 3544 deletions
  1. BIN
      virgo.wzfrontend/.DS_Store
  2. 580 0
      virgo.wzfrontend/console/src/assets/scss/week.scss
  3. 87 0
      virgo.wzfrontend/console/src/components/document/category.vue
  4. 312 0
      virgo.wzfrontend/console/src/components/flow/flow.vue
  5. 83 0
      virgo.wzfrontend/console/src/components/flow/flowAction.vue
  6. 225 0
      virgo.wzfrontend/console/src/components/flow/flowDetail.vue
  7. 141 0
      virgo.wzfrontend/console/src/components/flow/flowForm.vue
  8. 132 0
      virgo.wzfrontend/console/src/components/system/level/deviceLevel.vue
  9. 109 0
      virgo.wzfrontend/console/src/components/work/device/deviceDetail.vue
  10. 136 0
      virgo.wzfrontend/console/src/components/work/device/deviceEvent.vue
  11. 49 0
      virgo.wzfrontend/console/src/components/work/device/deviceFlowDetail.vue
  12. 128 0
      virgo.wzfrontend/console/src/components/work/device/deviceFlowForm.vue
  13. 178 0
      virgo.wzfrontend/console/src/components/work/device/deviceForm.vue
  14. 147 0
      virgo.wzfrontend/console/src/components/work/device/eventForm.vue
  15. 74 0
      virgo.wzfrontend/console/src/components/work/device/partDetail.vue
  16. 41 0
      virgo.wzfrontend/console/src/components/work/property/changeFlowDetail.vue
  17. 115 0
      virgo.wzfrontend/console/src/components/work/property/changeFlowForm.vue
  18. 66 0
      virgo.wzfrontend/console/src/components/work/property/departForm.vue
  19. 29 0
      virgo.wzfrontend/console/src/components/work/property/depreciationFlowDetail.vue
  20. 112 0
      virgo.wzfrontend/console/src/components/work/property/depreciationFlowForm.vue
  21. 29 0
      virgo.wzfrontend/console/src/components/work/property/inventoryFlowDetail.vue
  22. 112 0
      virgo.wzfrontend/console/src/components/work/property/inventoryFlowForm.vue
  23. 65 0
      virgo.wzfrontend/console/src/components/work/property/propertyFlowDetail.vue
  24. 136 0
      virgo.wzfrontend/console/src/components/work/property/propertyFlowForm.vue
  25. 22 0
      virgo.wzfrontend/console/src/httpApi/operation.js
  26. 198 0
      virgo.wzfrontend/console/src/httpApi/property.js
  27. 57 0
      virgo.wzfrontend/console/src/httpApi/system.js
  28. 9 2
      virgo.wzfrontend/console/src/router/modules/operation.js
  29. 37 0
      virgo.wzfrontend/console/src/router/modules/property.js
  30. 7 0
      virgo.wzfrontend/console/src/router/modules/system.js
  31. 1 1
      virgo.wzfrontend/console/src/store/index.js
  32. 65 1
      virgo.wzfrontend/console/src/uitls/message.js
  33. 14 14
      virgo.wzfrontend/console/src/uitls/permission.js
  34. 37 0
      virgo.wzfrontend/console/src/views/system/level.vue
  35. 1 1
      virgo.wzfrontend/console/src/views/work/crm/agent.vue
  36. 1 1
      virgo.wzfrontend/console/src/views/work/crm/customer.vue
  37. 588 0
      virgo.wzfrontend/console/src/views/work/iot/device/index.vue
  38. 818 0
      virgo.wzfrontend/console/src/views/work/operation/week/detail.vue
  39. 79 1386
      virgo.wzfrontend/console/src/views/work/operation/week/organization.vue
  40. 82 1061
      virgo.wzfrontend/console/src/views/work/operation/week/part.vue
  41. 82 1061
      virgo.wzfrontend/console/src/views/work/operation/week/work.vue
  42. 221 0
      virgo.wzfrontend/console/src/views/work/property/change.vue
  43. 225 0
      virgo.wzfrontend/console/src/views/work/property/depreciation.vue
  44. 220 0
      virgo.wzfrontend/console/src/views/work/property/inventory.vue
  45. 224 0
      virgo.wzfrontend/console/src/views/work/property/register.vue
  46. 125 0
      virgo.wzfrontend/console/src/views/work/property/set.vue
  47. 1 1
      virgo.wzfrontend/src/main/resources/static/console/index.html
  48. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/css/1659.32d3f99b.css
  49. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/css/2094.af7402f5.css
  50. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/css/3678.eb14e2e4.css
  51. 0 1
      virgo.wzfrontend/src/main/resources/static/console/static/css/396.3532808c.css
  52. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/css/5806.eb14e2e4.css
  53. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/css/8250.af7402f5.css
  54. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/css/9404.b6c7aaf0.css
  55. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/css/9464.b6c7aaf0.css
  56. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/css/9494.3532808c.css
  57. 0 1
      virgo.wzfrontend/src/main/resources/static/console/static/css/9896.3532808c.css
  58. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/1157-legacy.3946fa09.js
  59. 0 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/1518-legacy.d25e661b.js
  60. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/1569-legacy.7b49b200.js
  61. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/1569.70e19642.js
  62. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/157-legacy.33dcee67.js
  63. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/157.1175244a.js
  64. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/1620.335ba23e.js
  65. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/6296-legacy.ecbf92ac.js
  66. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/6296.097da16e.js
  67. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/1760-legacy.c33f3715.js
  68. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2094-legacy.58c471aa.js
  69. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2240-legacy.60d4988e.js
  70. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2240.7b725862.js
  71. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/4293.c6a82cf7.js
  72. 0 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/2323-legacy.c828faa0.js
  73. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2323-legacy.cfe20ea4.js
  74. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2347-legacy.f3cb8d92.js
  75. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/2598-legacy.7963e416.js
  76. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/2598.d2b07507.js
  77. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2690-legacy.8344753f.js
  78. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2690.29f83e72.js
  79. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2734-legacy.3d5a62f4.js
  80. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/2813-legacy.32e59007.js
  81. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/3919-legacy.53928557.js
  82. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/3678-legacy.b54b883c.js
  83. 0 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/396-legacy.75783ac7.js
  84. 0 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/396.4b50c936.js
  85. 1 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/4180.0771ff27.js
  86. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4281-legacy.b07f60c6.js
  87. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4281.0fd9a9c1.js
  88. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4290-legacy.f9a4420d.js
  89. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4290.4328edb9.js
  90. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4298.79fb1c3d.js
  91. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4384-legacy.3d1cfdf0.js
  92. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/439-legacy.0f650919.js
  93. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4847-legacy.d1a8a772.js
  94. 0 1
      virgo.wzfrontend/src/main/resources/static/console/static/js/4892-legacy.22edf966.js
  95. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/4912-legacy.21bae2e2.js
  96. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/5270-legacy.ef322de0.js
  97. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/5270.355ade0b.js
  98. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/5629-legacy.deba3805.js
  99. 1 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/5806.d445fc4a.js
  100. 0 0
      virgo.wzfrontend/src/main/resources/static/console/static/js/5911.9d8e5079.js

BIN
virgo.wzfrontend/.DS_Store


+ 580 - 0
virgo.wzfrontend/console/src/assets/scss/week.scss

@@ -0,0 +1,580 @@
+.organization-week {
+	.back {
+		display: flex;
+		align-items: center;
+		cursor: pointer;
+		.el-icon-back {
+			font-size: 18px;
+		}
+
+		span {
+			padding: 0 5px;
+		}
+	}
+
+	.hui-flex-box {
+		position: relative;
+		display: flex;
+		padding: 20px;
+	}
+
+	.chart-box {
+		width: 100%;
+		height: 100%;
+	}
+
+	.week-content {
+		flex: 1;
+		width: 0;
+		margin-right: 12px;
+		background: #232A37;
+		display: flex;
+		flex-direction: column;
+	}
+
+	.content-title {
+		padding: 20px;
+		font-weight: 500;
+		font-size: 16px;
+	}
+
+	.image-list {
+		display: flex;
+		flex-wrap: wrap;
+
+		.image-item {
+			text-align: center;
+		}
+
+		.label {
+			margin-top: 12px;
+		}
+
+		.image-box {
+			width: 267px;
+			height: 200px;
+			border: 1px solid #2E3647;
+			margin-right: 12px;
+			margin-bottom: 12px;
+		}
+
+		img {
+			width: 100%;
+			height: 100%;
+		}
+
+		.image-item:last-child {
+			margin-right: 0;
+		}
+	}
+
+	.content-box {
+		flex: 1;
+		height: 0;
+		overflow-y: auto;
+		padding: 0 20px;
+		margin-bottom: 20px;
+
+		.alarm-table-boxs {
+			width: 100%;
+			height: 100%;
+			display: flex;
+			flex-direction: column;
+
+			.progress-item {
+				display: flex;
+				align-items: center;
+				height: 100%;
+			}
+
+			.alibaba {
+				width: 80px;
+				font-size: 12px;
+			}
+
+			.line {
+				flex: 1;
+				width: 0;
+				height: 8px;
+				background: #374354;
+				position: relative;
+				margin-right: 8px;
+				border-radius: 6px;
+			}
+
+			.progress {
+				position: absolute;
+				height: 8px;
+				background: $--color-primary;
+				border-radius: 6px;
+				top: 0;
+				left: 0;
+			}
+
+			.alarm-title {
+				opacity: 0.6;
+
+				.alarm-tr {
+					margin-bottom: 8px;
+				}
+			}
+
+			.alarm-table {
+				flex: 1;
+				height: 0;
+				overflow-y: auto;
+
+				.alarm-tr {
+					background: #1C222E;
+					border-radius: 2px;
+					margin-bottom: 4px;
+					height: 44px;
+				}
+
+				.alarm-tr:last-child {
+					margin-bottom: 0;
+				}
+			}
+
+			.alarm-tr {
+				display: flex;
+				align-items: center;
+				padding: 0 12px;
+
+				.tr-100 {
+					width: 100px;
+				}
+
+				.tr-flex {
+					flex: 1;
+					width: 0;
+				}
+
+				.tr-130 {
+					width: 130px;
+				}
+
+				.tr-50 {
+					width: 50px;
+				}
+
+				.tr-80 {
+					width: 80px;
+				}
+
+				.tr-center {
+					text-align: center;
+				}
+
+				.tr-150 {
+					width: 150px;
+				}
+			}
+
+			.alarm-tr>span {
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			}
+		}
+	}
+
+	.content-test {
+		color: #ffffff;
+		display: flex;
+
+		.test-item {
+			padding: 19px 20px 12px 30px;
+			flex: 1;
+			width: 0;
+			overflow: hidden;
+			border-radius: 4px;
+			position: relative;
+			margin-right: 12px;
+		}
+
+		.blue {
+			background: linear-gradient(180deg, #679CF6 0%, #3371FF 100%);
+		}
+
+		.green {
+			background: linear-gradient(180deg, #59DD95 0%, #2DB85C 100%);
+		}
+
+		.purple {
+			background: linear-gradient(180deg, #B280FF 0%, #7E3DE1 100%);
+		}
+
+		.red {
+			background: linear-gradient(180deg, #F97778 0%, #F04243 100%);
+		}
+
+		.number {
+			font-size: 32px;
+			line-height: 45px;
+			margin-top: 4px;
+		}
+
+		.icon {
+			position: absolute;
+			width: 56px;
+			height: 56px;
+			text-align: center;
+			line-height: 56px;
+			top: 22px;
+			right: 21px;
+			background: rgba(255, 255, 255, 0.2);
+			border-radius: 10px;
+
+			.iconfont {
+				font-size: 32px;
+			}
+		}
+	}
+
+	.pie-chart {
+		width: 220px;
+		height: 220px;
+		margin-right: 24px;
+	}
+
+	.chart-legend {
+		.legend-item {
+			display: flex;
+			align-items: center;
+			font-size: 12px;
+			margin-bottom: 5px;
+		}
+
+		.legend-bage {
+			width: 8px;
+			height: 8px;
+			background: #73DEB3;
+			margin-right: 9px;
+		}
+
+		.legend-label {
+			margin-right: 10px;
+			display: flex;
+			align-items: center;
+		}
+
+		.unit {
+			opacity: 0.6;
+			margin-left: 4px;
+		}
+
+		.green {
+			background: #73DEB3;
+		}
+
+		.yellow {
+			background: #F7C739;
+		}
+
+		.blue {
+			background: #73A0FA;
+		}
+
+		.orange {
+			background: #EB7E65;
+		}
+	}
+
+	.project-list {
+		.project-item {
+			background: #1C222E;
+			padding: 20px;
+		}
+
+		.project-flow {
+			padding: 30px 0;
+			border: 1px solid #2E3647;
+			display: flex;
+		}
+
+		.project-chart {
+			height: 300px;
+			width: 440px;
+			border-right: 1px solid rgba(46, 54, 71, 0.7);
+			display: flex;
+			align-items: center;
+			padding-left: 30px;
+		}
+
+		.flow-view {
+			flex: 1;
+			width: 0;
+			height: 300px;
+			overflow: hidden;
+			display: flex;
+			flex-direction: column;
+		}
+
+		.flow-title {
+			padding: 0 0 16px 30px;
+			font-weight: 600;
+		}
+
+		.flow-box {
+			padding: 0 30px;
+			flex: 1;
+			height: 0;
+			overflow-y: auto;
+		}
+
+		.flow-test {
+			background: rgba(158, 184, 243, 0.05);
+			border-radius: 2px;
+			padding: 16px 0;
+			display: flex;
+		}
+
+		.flow-test-item {
+			flex: 1;
+			width: 0;
+			overflow: hidden;
+			text-align: center;
+
+			.number {
+				font-size: 20px;
+				line-height: 28px;
+				margin-top: 6px;
+			}
+		}
+
+		.flow-test-item:first-child {
+			border-right: 1px solid rgba(55, 65, 86, 0.7);
+		}
+
+		.flow-item {
+			display: flex;
+			height: 72px;
+			align-items: center;
+			background: rgba(158, 184, 243, 0.05);
+			border-radius: 2px;
+			overflow: hidden;
+			margin-top: 12px;
+
+			.color-primary {
+				padding: 0 20px;
+			}
+		}
+
+		.flow-content {
+			padding-left: 16px;
+			flex: 1;
+			overflow: hidden;
+			width: 0;
+
+			.date {
+				font-size: 12px;
+				opacity: 0.6;
+				margin-top: 8px;
+			}
+		}
+
+		.flow-name {
+			display: flex;
+			align-items: center;
+
+			.name {
+				font-weight: 600;
+				font-size: 16px;
+				margin-right: 8px;
+			}
+		}
+
+		.flow-icon {
+			width: 72px;
+			height: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			background: #2E3848;
+			flex-direction: column;
+			color: #FFFFFF;
+
+			div {
+				font-weight: 600;
+				line-height: 20px;
+			}
+
+		}
+
+		.project-item-title {
+			padding-bottom: 20px;
+			border-bottom: 1px solid rgba(55, 65, 86, 0.7);
+			font-weight: 600;
+			font-size: 16px;
+		}
+
+		.project-test {
+			display: flex;
+			margin: 26px 0;
+		}
+
+		.test-item {
+			flex: 1;
+			width: 0;
+			overflow: hidden;
+			background: rgba(158, 184, 243, 0.05);
+			border-radius: 4px;
+			height: 78px;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			margin-right: 10px;
+			padding: 0 30px;
+
+			.number {
+				font-weight: 600;
+				font-size: 24px;
+			}
+		}
+
+		.test-item:last-child {
+			margin-right: 0px;
+		}
+
+		.blue {
+			border-left: 4px solid #3A96FD;
+		}
+
+		.green {
+			border-left: 4px solid #2DB85C;
+		}
+
+		.purple {
+			border-left: 4px solid #9D60FB;
+		}
+
+		.red {
+			border-left: 4px solid #F04243;
+		}
+	}
+
+	.color-blue {
+		color: #3A96FD;
+	}
+
+	.color-green {
+		color: #2DB85C;
+	}
+
+	.color-purple {
+		color: #9D60FB;
+	}
+
+	.color-red {
+		color: #F04243;
+	}
+
+	.content-chart {
+		height: 200px;
+		margin-top: 25px;
+		position: relative;
+	}
+
+	.legend-box {
+		top: 0;
+		width: 100%;
+		left: 0;
+	}
+
+	.legend-item {
+		margin-right: 50px;
+	}
+
+	.week-common {
+		width: 450px;
+	}
+
+	.week-detail {
+		background: #232A37;
+		margin-bottom: 12px;
+		padding: 24px 20px;
+
+		.icon {
+			width: 58px;
+			height: 22px;
+			background: url(../../../../assets/img/work/common/week.png) no-repeat;
+			background-size: 100% 100%;
+			text-align: center;
+			line-height: 20px;
+			font-size: 12px;
+			color: #FFFFFF;
+		}
+
+		.detail-title {
+			border-bottom: 1px solid #374156;
+
+			.title {
+				display: flex;
+				align-items: center;
+			}
+
+			.name {
+				font-weight: 600;
+				font-size: 20px;
+				margin-left: 8px;
+			}
+
+			.detail-date {
+				margin-top: 8px;
+				margin-bottom: 17px;
+			}
+		}
+
+		.detail-list {
+			padding-top: 16px;
+		}
+
+		.detail-item {
+			height: 36px;
+			display: flex;
+			align-items: center;
+			padding-left: 6px;
+
+			.key {
+				opacity: 0.5;
+				width: 56px;
+				margin-right: 14px;
+			}
+
+			.value {
+				flex: 1;
+				width: 0;
+				overflow: hidden;
+			}
+		}
+	}
+
+	.week-wather {
+		height: 200px;
+		background: #232A37;
+		margin-bottom: 18px;
+		padding: 23px 17px;
+		display: flex;
+		font-size: 12px;
+
+		.wather-item {
+			flex: 1;
+
+			.label {
+				text-align: center;
+				margin-bottom: 12px;
+			}
+
+			.label:last-child {
+				margin-bottom: 0px;
+			}
+
+			.wather-icon {
+				text-align: center;
+				margin-bottom: 20px;
+				padding-top: 5px;
+			}
+		}
+	}
+}

+ 87 - 0
virgo.wzfrontend/console/src/components/document/category.vue

@@ -0,0 +1,87 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box">
+			<empty description="暂无数据" width="80" v-if="treeData.length == 0" style="margin-top: 20px;"></empty>
+			<el-tree :data="treeData" :props="defaultProps" v-else>
+				<div class="tree-node" slot-scope="{ node, data }">
+					<div class="tree-node-label">
+						<span>{{ node.label }}</span>
+					</div>
+					<div class="btn" v-if="data.fileId">
+						<el-button type="primary" size="small" :disabled="data.state === 0"
+							@click.stop="operation(data,'preview')">
+							预览
+						</el-button>
+						<el-button type="primary" size="small" :disabled="data.state === 0"
+							@click.stop="operation(data,'create')">
+							创建
+						</el-button>
+					</div>
+				</div>
+			</el-tree>
+		</div>
+		<el-dialog :title="file.name" :visible.sync="documentShow" class="document-dialog" width="80%"
+			:append-to-body="true">
+			<preview :templateId="file.useFileId" v-if="documentShow && type ==='preview'"
+				@close="documentShow = false">
+			</preview>
+			<editor :templateId="file.useFileId" v-if="documentShow && type ==='create'" @close="documentShow = false"
+				@submit="submit">
+			</editor>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		getDocumentTemplateList
+	} from '@/httpApi/property'
+	import preview from '@/components/document/preview'
+	import editor from '@/components/document/editor'
+	export default {
+		data() {
+			return {
+				treeData: [],
+				defaultProps: {
+					label: 'name'
+				},
+				documentShow: false,
+				type: '',
+				file: {}
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getDocumentTemplateList({
+					parentId: -2,
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id
+				}).then(res => {
+					if (res.state) {
+						this.treeData = res.data;
+					}
+				})
+			},
+			operation(data, type) {
+				this.file = data;
+				this.type = type;
+				this.documentShow = true;
+			},
+			submit(data) {
+				this.documentShow = false;
+				this.$emit('addDocument', data);
+			}
+		},
+		components: {
+			preview,
+			editor
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 312 - 0
virgo.wzfrontend/console/src/components/flow/flow.vue

@@ -0,0 +1,312 @@
+<template>
+	<div class="flow-index">
+		<div class="flow" v-if="type === 'insert'">
+			<div class="flow-button">
+				<el-button size="medium" type="primary" @click="visible = true">
+					<i class="iconfont huifont-xinzeng"></i>添加审核人员
+				</el-button>
+			</div>
+			<div class="flow-box">
+				<div class="flow-item" v-for="(item,index) in list" :key="index">
+					<div class="user-avatar">
+						<avatar :user="item" :size="12"></avatar>
+					</div>
+					<div class="user-name">
+						<div>{{item.name}}</div>
+						<p>{{item.partName}}</p>
+					</div>
+					<div class="user-line" v-if="index < list.length-1"></div>
+				</div>
+			</div>
+			<el-dialog title="审核人选择" :visible.sync="visible" width="880px" :append-to-body="true">
+				<select-user @callback="callBack" v-if="visible" :list="list"></select-user>
+			</el-dialog>
+		</div>
+		<div class="flow-list" v-else>
+			<div class="flow-box">
+				<div class="flow-item" v-for="(item,index) in flowlist" :key="index">
+					<div class="user-avatar-box">
+						<div class="user-avatar">
+							<avatar :user="item" :size="12"></avatar>
+						</div>
+						<div :class="'user-avatar-status '+ returnStatus(item.status).className">
+							<i :class="'iconfont '+returnStatus(item.status).icon"></i>
+						</div>
+					</div>
+					<div class="flow-content">
+						<div class="user-name">
+							<div>{{item.name}}</div>
+							<p><span>{{item.partName}}</span><span>{{item.date}}</span></p>
+						</div>
+						<div class="user-content" v-if="item.remark">
+							<div class="remark">
+								{{item.remark}}
+							</div>
+							<div class="remark-file" v-if="item.file && item.file.length > 0">
+								<upload :list="item.file" type="preview"></upload>
+							</div>
+						</div>
+					</div>
+					<div class="user-line" v-if="index < flowlist.length-1"></div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import selectUser from '@/components/common/selectUser'
+	import avatar from '@/components/common/avatar'
+	import upload from '@/components/common/upload'
+	export default {
+		props: ['type', 'flowlist'],
+		data() {
+			return {
+				list: [],
+				visible: false
+			}
+		},
+		created() {
+			if (!!this.flowlist && this.type == 'insert') this.list = this.flowlist;
+		},
+		methods: {
+			callBack(data) {
+				this.visible = false;
+				if (data) this.list = data;
+			},
+			returnStatus(state) {
+				let className = '',
+					icon = '';
+				switch (state) {
+					case 0:
+						className = 'info';
+						icon = 'huifont-jinhangzhong';
+						break;
+					case 1:
+						className = 'success'
+						icon = 'huifont-tongguo';
+						break;
+					case 2:
+						className = 'failed'
+						icon = 'huifont-a-butongguojujue';
+						break;
+					case 3:
+						className = 'waiting'
+						icon = 'huifont-jinhangzhong';
+						break;
+					default:
+						className = 'info'
+						icon = 'huifont-jinhangzhong';
+						break;
+				}
+				return {
+					className: className,
+					icon: icon
+				};
+			}
+		},
+		watch: {
+			flowlist() {
+				if (!!this.flowlist && this.type == 'insert') this.list = this.flowlist;
+			}
+		},
+		components: {
+			selectUser,
+			avatar,
+			upload
+		},
+	}
+</script>
+
+<style lang="scss">
+	.flow-index {
+		width: 100%;
+		height: 100%;
+
+		.flow-list {
+			padding: 10px 20px;
+
+			.flow-item {
+				position: relative;
+				display: flex;
+
+				.user-avatar-box {
+					position: relative;
+
+					.user-avatar {
+						width: 32px;
+						height: 32px;
+						background: #4958de;
+						border-radius: 50%;
+						margin-right: 10px;
+						margin-top: 8px;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						overflow: hidden;
+
+						i {
+							font-size: 20px;
+						}
+					}
+
+					.user-avatar-status {
+						width: 12px;
+						height: 12px;
+						border-radius: 50%;
+						border: 1px solid #fff;
+						position: absolute;
+						top: 30px;
+						right: 10px;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+
+						i {
+							font-size: 8px;
+							color: #fff;
+						}
+					}
+
+					.user-avatar-status.success {
+						background: $--color-green;
+					}
+
+					.user-avatar-status.failed {
+						background: $--color-red;
+					}
+
+					.user-avatar-status.waiting {
+						background: $--color-orange;
+					}
+
+					.user-avatar-status.info {
+						background: #4C4F59;
+					}
+				}
+
+
+				.flow-content {
+					flex: 1;
+					width: 0;
+
+
+					.user-name {
+						height: 48px;
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+
+						p {
+							font-size: 12px;
+							opacity: 0.6;
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+						}
+					}
+
+					.user-content {
+						background: rgba(50, 56, 68, 0.2);
+						border-radius: 8px;
+						padding: 13px;
+
+						.remark {
+							font-size: 12px;
+							line-height: 17px;
+
+						}
+
+						.remark-file {
+							margin-top: 12px;
+						}
+					}
+				}
+
+				.user-line {
+					width: 1px;
+					border-left: 1px dashed #374156;
+					position: absolute;
+					top: 40px;
+					bottom: -8px;
+					left: 15px;
+				}
+			}
+		}
+
+		.flow {
+			width: 100%;
+			height: 100%;
+			display: flex;
+			flex-direction: column;
+
+
+			.flow-button {
+				padding: 0 20px 10px 20px;
+
+				.el-button {
+					padding-left: 12px;
+
+					span {
+						display: flex;
+						align-items: center;
+					}
+
+					.huifont-xinzeng {
+						padding-right: 10px;
+					}
+				}
+			}
+
+			.flow-box {
+				flex: 1;
+				height: 0;
+				padding: 10px 20px 0px 20px;
+				overflow-y: auto;
+			}
+
+			.flow-item {
+				height: 48px;
+				display: flex;
+				align-items: center;
+				position: relative;
+
+				.user-avatar {
+					width: 32px;
+					height: 32px;
+					background: #4958de;
+					border-radius: 50%;
+					margin-right: 10px;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					overflow: hidden;
+
+					i {
+						font-size: 20px;
+					}
+				}
+
+
+				.user-name {
+					flex: 1;
+					width: 0;
+
+					p {
+						font-size: 12px;
+						opacity: 0.6;
+					}
+				}
+
+				.user-line {
+					width: 2px;
+					background-color: #374156;
+					position: absolute;
+					top: 40px;
+					bottom: -8px;
+					left: 15px;
+				}
+			}
+		}
+	}
+</style>

+ 83 - 0
virgo.wzfrontend/console/src/components/flow/flowAction.vue

@@ -0,0 +1,83 @@
+<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="审核意见" class="hui-textarea">
+					<el-input type="textarea" v-model="form.content" placeholder="请输入审核意见" maxlength="120" :rows="4"
+						show-word-limit resize="none"></el-input>
+				</el-form-item>
+				<el-form-item label="审核附件" class="hui-textarea">
+					<upload ref="upload" :list="responsibility" type="insert"></upload>
+				</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 upload from '@/components/common/upload'
+	import {
+		userFlowAction
+	} from '@/httpApi/property'
+	export default {
+		props: ['action', 'projectFlowId'],
+		data() {
+			return {
+				form: {
+					content: ''
+				},
+				responsibility: []
+			}
+		},
+		created() {},
+		methods: {
+			submit() {
+				this.$loading();
+				userFlowAction(this.projectFlowId, this.action.id, {
+					comment: JSON.stringify({
+						text: this.form.content,
+						enclosure: this.$refs.upload.fileList
+					})
+				}).then(res => {
+					if (res.state) {
+						this.$emit('updateFlowState', this.returnState(res.data.context.projectFlow.statusStr),
+							this.action.viewName);
+						this.$message.success('操作成功');
+						this.$emit('callback', 'init');
+					}
+					this.$loading.close();
+				});
+			},
+			returnState(name) {
+				let state = '';
+				switch (name) {
+					case '待提交':
+						state = 1;
+						break;
+					case '审核中':
+						state = 2;
+						break;
+					case '通过':
+						state = 3;
+						break;
+					case '未通过':
+						state = 4;
+						break;
+					default:
+						state = 1;
+						break;
+				}
+				return state;
+			}
+		},
+		components: {
+			upload
+		}
+	}
+</script>
+
+<style lang="scss"></style>

+ 225 - 0
virgo.wzfrontend/console/src/components/flow/flowDetail.vue

@@ -0,0 +1,225 @@
+<template>
+	<div class="hui-flex">
+		<div class="hui-flex-box">
+			<div class="hui-detail">
+				<div class="hui-detail-title">基本信息</div>
+				<property-flow-detail v-if="detail.flowType === 1" :formData="detail"></property-flow-detail>
+				<change-flow-detail v-if="detail.flowType === 2" :formData="detail"></change-flow-detail>
+				<depreciation-flow-detail v-if="detail.flowType === 3" :formData="detail"></depreciation-flow-detail>
+				<inventory-flow-detail v-if="detail.flowType === 4" :formData="detail"></inventory-flow-detail>
+				<device-flow-detail v-if="detail.flowType === 5" :formData="detail"></device-flow-detail>
+				<div class="hui-detail-title">流程附件</div>
+				<div class="hui-detail-content hui-detail-image">
+					<upload ref="upload" :list="detail.attachment ? JSON.parse(detail.attachment) : []" type="preview">
+					</upload>
+				</div>
+				<div class="hui-detail-title">流程抄送</div>
+				<div class="hui-detail-content hui-detail-cc">
+					<div class="hui-detail-item">
+						<div class="hui-detail-label">抄送人</div>
+						<div class="hui-detail-value">
+							<cc :ccList="detail.receiver ? JSON.parse(detail.receiver) : []"></cc>
+						</div>
+					</div>
+				</div>
+				<div class="hui-detail-title">审核流程</div>
+				<div class="hui-detail-content" style="margin-bottom: 10px;">
+					<flow :flowlist="flowUserList"></flow>
+				</div>
+			</div>
+		</div>
+		<div class="hui-drawer-submit" v-if="activeList.length>0">
+			<el-button size="medium" type="primary" v-for="item in activeList" :key="item.id" @click="action(item)">
+				{{item.viewName}}
+			</el-button>
+		</div>
+		<el-dialog :visible.sync="dialogVisible" width="60%" :append-to-body="true">
+			<flow-action :title="actionData.viewName" v-if="dialogVisible" :action="actionData"
+				:projectFlowId="detail.projectFlowId" @callback="callback" @updateFlowState="updateFlowState">
+			</flow-action>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import upload from '@/components/common/upload'
+	import flow from '@/components/flow/flow'
+	import flowAction from '@/components/flow/flowAction'
+	import cc from '@/components/common/cc'
+	import propertyFlowDetail from '@/components/work/property/propertyFlowDetail'
+	import changeFlowDetail from '@/components/work/property/changeFlowDetail'
+	import depreciationFlowDetail from '@/components/work/property/depreciationFlowDetail'
+	import inventoryFlowDetail from '@/components/work/property/inventoryFlowDetail'
+
+	import {
+		getFlowById,
+		generationFlow,
+		updateFlow,
+		getFlowApprove,
+		getUserFlowAction,
+		insertDevice,
+		updateDevice
+	} from '@/httpApi/property'
+	export default {
+		props: ['detailId'],
+		data() {
+			return {
+				detail: {},
+				activeList: [],
+				dialogVisible: false,
+				actionData: {},
+				flowUserList: [],
+				receiver: ''
+			}
+		},
+		created() {
+			if (this.detailId) this.init();
+		},
+		methods: {
+			init() {
+				getFlowById(this.detailId).then(res => {
+					if (res.state) {
+						let flowData = JSON.parse(res.data.flowData);
+						this.detail = Object.assign(flowData, res.data);
+						let flowUserList = this.detail.flowUserList ? JSON.parse(this.detail.flowUserList) : [];
+						if (this.detail.projectFlowId) {
+							this.initFlow(flowUserList);
+						} else {
+							this.flowUserList = flowUserList;
+						}
+						if (!this.detail.projectFlowId) this.activeList = [{
+							id: -1,
+							viewName: '生成流程'
+						}]
+					}
+				})
+			},
+			initFlow(flowUserList) {
+				getUserFlowAction(this.detail.projectFlowId).then(res => {
+					if (res.state) {
+						this.activeList = res.data.filter(node => node.viewName != '查看');
+					}
+				});
+				getFlowApprove(this.detail.projectFlowId).then(res => {
+					if (res.state) {
+						let approverList = res.data.approverList;
+						this.flowUserList = flowUserList.map((node, index) => {
+							let item = approverList[index];
+							let comment = JSON.parse(item.comment) || {};
+							node['status'] = item.status;
+							node['remark'] = comment.text;
+							node['file'] = comment.enclosure;
+							if (comment.text) node['date'] = this.$dayjs(item.statusDate).format(
+								'YYYY-MM-DD');
+							return node;
+						})
+						let noList = this.flowUserList.filter(node => !node.status);
+						if (noList.length === 0) return;
+						this.receiver = noList[0].id;
+					}
+				});
+			},
+			action(item) {
+				if (item.id === -1) return this.flowOperation();
+				this.actionData = item;
+				this.dialogVisible = true;
+			},
+			callback(type) {
+				this.dialogVisible = false;
+				if (type === 'init') this.init();
+			},
+			flowOperation() {
+				this.$confirm('生成流程后不允许再修改数据,确定生成?', () => {
+					this.$loading();
+					generationFlow(this.returnSubmitData()).then(res => {
+						if (res.state) {
+							updateFlow({
+								id: this.detail.id,
+								projectFlowId: res.data.id
+							}).then(node => {
+								this.updateFlowState(1);
+								this.$message.success('操作成功');
+								this.init();
+							});
+						}
+						this.$loading.close();
+					});
+				});
+			},
+			updateFlowState(state, operation) {
+				updateFlow({
+					id: this.detail.id,
+					state: state
+				}).then(node => {
+					if (node.state) {
+						if (state === 3) this.passFlow();
+						if (this.receiver && operation != '退回') this.$msg.send(this.detail, {
+							operation: operation + '了',
+							receiver: this.receiver,
+							messageType: 2, //流程类型-2
+							dataType: this.detail.flowType, //1.资产登记/设备流程
+							dataId: this.detail.id
+						})
+						this.$emit('callback', 'init');
+					}
+				});
+			},
+			passFlow() {
+				let flowData = JSON.parse(this.detail.flowData);
+				if (this.detail.flowType === 1) {
+					flowData['attachment'] = JSON.stringify(this.detail.attachment);
+					flowData['document'] = JSON.stringify(this.detail.document);
+					insertDevice(flowData)
+				}
+				if (this.detail.flowType === 2) {
+					flowData['id'] = this.detail.deviceId;
+					delete flowData.remark;
+					updateDevice(flowData)
+				}
+			},
+			returnSubmitData() {
+				let organization = this.$store.getters.organization;
+				let userList = JSON.parse(this.detail.flowUserList).map((item, index) => {
+					let obj = {
+						organizedName: organization.name,
+						organizationId: organization.id,
+						userId: item.id,
+						userName: item.name,
+						partName: item.partName,
+						portrait: item.portrait
+					}
+					return {
+						flowUsers: [obj],
+						sequence: (index + 1),
+						status: 0
+					}
+				})
+				let flowName = this.$msg.messageType[0].dataType.filter(node => node.id === this.detail.flowType)[0].title;
+				return {
+					flowUserList: JSON.stringify([{
+						name: organization.name,
+						organizationId: organization.id,
+						flowUserList: JSON.stringify(userList)
+					}]),
+					coment: '{}',
+					submiter: this.$store.getters.user.id,
+					subscribers: [],
+					flowName: flowName + '流程'
+				}
+			}
+		},
+		components: {
+			upload,
+			flow,
+			flowAction,
+			cc,
+			propertyFlowDetail,
+			changeFlowDetail,
+			depreciationFlowDetail,
+			inventoryFlowDetail
+		},
+	}
+</script>
+<style lang="scss">
+
+</style>

+ 141 - 0
virgo.wzfrontend/console/src/components/flow/flowForm.vue

@@ -0,0 +1,141 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<div class="flow-form-box">
+				<div class="flow-form-list">
+					<property-flow-form ref="flowData" v-if="flowType === 1" :flowForm="flowForm"></property-flow-form>
+					<change-flow-form ref="flowData" v-if="flowType === 2" :flowForm="flowForm"></change-flow-form>
+					<depreciation-flow-form ref="flowData" v-if="flowType === 3" :flowForm="flowForm">
+					</depreciation-flow-form>
+					<inventory-flow-form ref="flowData" v-if="flowType === 4" :flowForm="flowForm">
+					</inventory-flow-form>
+					<device-flow-form ref="flowData" v-if="flowType === 5" :flowForm="flowForm"></device-flow-form>
+					<el-form :model="flowForm" label-position="top">
+						<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">
+							<cc ref="cc" type="insert" :ccList="ccList"></cc>
+						</el-form-item>
+					</el-form>
+				</div>
+				<div class="flow-approve-list">
+					<flow ref="flow" type="insert" :flowlist="flowlist"></flow>
+				</div>
+			</div>
+		</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 flow from '@/components/flow/flow'
+	import cc from '@/components/common/cc'
+	import upload from '@/components/common/upload'
+	import propertyFlowForm from '@/components/work/property/propertyFlowForm'
+	import changeFlowForm from '@/components/work/property/changeFlowForm'
+	import depreciationFlowForm from '@/components/work/property/depreciationFlowForm'
+	import inventoryFlowForm from '@/components/work/property/inventoryFlowForm'
+	import deviceFlowForm from '@/components/work/device/deviceFlowForm'
+
+	import {
+		getDevicePartList,
+		updateFlow,
+		insertFlow,
+		getFlowById
+	} from '@/httpApi/property'
+	export default {
+		props: ['isUpdate', 'detailId', 'flowType'],
+		data() {
+			return {
+				responsibility: [],
+				documentList: [],
+				flowlist: [],
+				ccList: [],
+				project: {},
+				flowForm: {},
+				flowData: {}
+			}
+		},
+		created() {
+			this.project = this.$store.getters.project;
+			if (this.isUpdate) {
+				getFlowById(this.detailId).then(res => {
+					if (res.state) {
+						this.flowForm = JSON.parse(res.data.flowData);
+						this.flowData = res.data;
+						if (this.flowData.attachment) this.responsibility = JSON.parse(this.flowData.attachment);
+						if (this.flowData.flowUserList) this.flowlist = JSON.parse(this.flowData.flowUserList);
+						if (this.flowData.receiver) this.ccList = JSON.parse(this.flowData.receiver);
+					}
+				})
+			}
+		},
+		methods: {
+			submit() {
+				let data = this.$refs.flowData.returnForm();
+				let formData = data.formData;
+				let commonForm = data.commonForm;
+				let commonData = {
+					flowUserList: JSON.stringify(this.$refs.flow.list),
+					receiver: JSON.stringify(this.$refs.cc.list),
+					attachment: JSON.stringify(this.$refs.upload.fileList),
+					flowType: this.flowType
+				}
+				let postData = Object.assign(commonForm, commonData, {
+					flowData: JSON.stringify(formData)
+				})
+				if (this.isUpdate) {
+					postData['id'] = this.flowData.id;
+					updateFlow(postData).then(this.successFunc)
+				} else {
+					insertFlow(postData).then(this.successFunc)
+				}
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		},
+		components: {
+			flow,
+			upload,
+			cc,
+			propertyFlowForm,
+			changeFlowForm,
+			depreciationFlowForm,
+			inventoryFlowForm,
+			deviceFlowForm
+		},
+	}
+</script>
+
+<style lang="scss">
+	.flow-form-box {
+		display: flex;
+		width: 100%;
+		height: 100%;
+
+		.el-cascader {
+			width: 100%;
+		}
+
+		.flow-form-list {
+			flex: 1;
+			height: 100%;
+			overflow-x: hidden;
+			overflow-y: auto;
+			padding-right: 10px;
+		}
+
+		.flow-approve-list {
+			width: 300px;
+			border-left: 1px solid $--color-border;
+		}
+	}
+</style>

+ 132 - 0
virgo.wzfrontend/console/src/components/system/level/deviceLevel.vue

@@ -0,0 +1,132 @@
+<template>
+	<div class="device-level hui-flex">
+		<div class="hui-chart-title">
+			设备类型 <i class="iconfont huifont-xinzeng" @click="insert(-1)"></i>
+		</div>
+		<div class="hui-flex-box">
+			<el-tree :data="list" :props="defaultProps" default-expand-all>
+				<div class="tree-node" slot-scope="{ node, data }">
+					<span class="tree-node-label">{{ data.name }}-{{ data.sign }}</span>
+					<div class="tree-node-operation">
+						<i class="iconfont huifont-xinzeng" @click.stop="insert(data.id)"></i>
+						<i class="iconfont huifont-bianji" @click.stop="update(data)"></i>
+						<i class="iconfont huifont-shanchu" @click.stop="deleteModel(data.id)"></i>
+					</div>
+				</div>
+			</el-tree>
+			<el-dialog :title="form.id?'编辑':'新增'" :visible.sync="dialogVisible" width="900px" :append-to-body="true">
+				<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 v-model="form.name"></el-input>
+							</el-form-item>
+							<el-form-item label="层级标识">
+								<el-input v-model="form.sign"></el-input>
+							</el-form-item>
+							<el-form-item label="层级描述" class="hui-textarea">
+								<el-input type="textarea" v-model="form.remark" placeholder="请输入层级描述" resize="none">
+								</el-input>
+							</el-form-item>
+						</el-form>
+					</div>
+					<div class="hui-dialog-submit">
+						<el-button size="medium" @click="dialogVisible = false">取 消</el-button>
+						<el-button size="medium" type="primary" @click="submit">保 存</el-button>
+					</div>
+				</div>
+			</el-dialog>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getDeviceModel,
+		getDeviceModelById,
+		insertDeviceModel,
+		updateDeviceModel,
+		deleteDeviceModel
+	} from '@/httpApi/system'
+	export default {
+		data() {
+			return {
+				list: [],
+				defaultProps: {
+					label: 'name'
+				},
+				dialogVisible: false,
+				form: {
+					parentId: '',
+					name: '',
+					sign: '',
+					remark: '',
+					isp: 1
+				}
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getDeviceModel().then(res => {
+					if (res.state) {
+						this.list = res.data;
+					}
+				})
+			},
+			insert(id) {
+				this.form = {
+					name: '',
+					sign: '',
+					remark: '',
+					parentId: id,
+					isp: 1
+				}
+				this.dialogVisible = true;
+			},
+			update(data) {
+				this.form = JSON.parse(JSON.stringify(data));
+				this.dialogVisible = true;
+			},
+			submit() {
+				this.form.id ? updateDeviceModel(this.form).then(this.successFunc) : insertDeviceModel(this.form).then(this
+					.successFunc);
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.init();
+					this.dialogVisible = false;
+				}
+			},
+			deleteModel(id) {
+				this.$confirm('确定要删除该层级?', () => {
+					deleteDeviceModel(id).then(res => {
+						if (res.state) {
+							this.init();
+							this.$message.success('操作成功');
+						}
+					})
+				});
+			},
+		},
+	}
+</script>
+
+<style lang="scss">
+	.device-level {
+		padding: 10px;
+		background: rgba(0, 4, 10, 0.3);
+
+		.tree-node-operation {
+			display: flex;
+			align-items: center;
+		}
+
+		.huifont-xinzeng {
+			font-size: 14px;
+		}
+	}
+</style>

+ 109 - 0
virgo.wzfrontend/console/src/components/work/device/deviceDetail.vue

@@ -0,0 +1,109 @@
+<template>
+	<div class="hui-detail hui-bg-detail">
+		<div class="hui-detail-subtitle">
+			<div class="hui-subtitle-icon"><i class="iconfont icon-basic-information_line"></i></div>
+			<div class="hui-subtitle-text">基本信息</div>
+		</div>
+		<div class="hui-detail-content">
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">设备名称</div>
+				<div class="hui-detail-value">{{device.name}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">设备类型</div>
+				<div class="hui-detail-value">{{device.type === 0?'普通设备':'物联网设备' }}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">设计编码</div>
+				<div class="hui-detail-value">{{device.designNumber}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">资产编码</div>
+				<div class="hui-detail-value">{{device.assetNumber}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">设备编码</div>
+				<div class="hui-detail-value">{{device.deviceNumber}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">设备品牌</div>
+				<div class="hui-detail-value">{{device.deviceBrand}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">设备型号</div>
+				<div class="hui-detail-value">{{device.deviceModel}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">设备序列号</div>
+				<div class="hui-detail-value">{{device.deviceSerialNumber}}</div>
+			</div>
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">备注</div>
+				<div class="hui-detail-value">{{device.remark}}</div>
+			</div>
+		</div>
+		<div class="hui-detail-subtitle">
+			<div class="hui-subtitle-icon"><i class="iconfont icon-fujian"></i></div>
+			<div class="hui-subtitle-text">设备附件</div>
+		</div>
+		<div class="hui-detail-content">
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">附件</div>
+				<div class="hui-detail-value">
+					<upload ref="upload" :list="responsibility" :disabled="true" offset="right"></upload>
+				</div>
+			</div>
+		</div>
+		<div class="hui-detail-subtitle">
+			<div class="hui-subtitle-icon"><i class="iconfont icon-fujian"></i></div>
+			<div class="hui-subtitle-text">设备文档</div>
+		</div>
+		<div class="hui-detail-content">
+			<div class="hui-detail-item">
+				<div class="hui-detail-label">文档</div>
+				<div class="hui-detail-value">
+					<document ref="document" :list="documentList"></document>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getDeviceById
+	} from '@/httpApi/work'
+	import upload from '@/components/common/upload'
+	import document from '@/components/common/document'
+	export default {
+		props: ['deviceId'],
+		data() {
+			return {
+				device: {},
+				responsibility: [],
+				documentList: []
+			}
+		},
+		created() {
+			if (this.deviceId) this.init();
+		},
+		methods: {
+			init() {
+				getDeviceById(this.deviceId).then(res => {
+					if (res.state) {
+						this.device = res.data;
+						if (res.data.attachment) this.responsibility = JSON.parse(res.data.attachment);
+						if (res.data.document) this.documentList = JSON.parse(res.data.document);
+					}
+				})
+			},
+		},
+		components: {
+			upload,
+			document
+		},
+	}
+</script>
+
+<style>
+</style>

+ 136 - 0
virgo.wzfrontend/console/src/components/work/device/deviceEvent.vue

@@ -0,0 +1,136 @@
+<template>
+	<div class="device-event hui-table-box">
+		<div class="hui-title">
+			<div class="hui-title-label">设备{{typeName}}</div>
+			<div class="hui-title-right">
+				<authority auth="/work/device/insertDevice" @click="insertEvent">
+					<i class="el-icon-plus" title="新增事件"></i>
+				</authority>
+				<i class="el-icon-circle-close" title="关闭" @click="$emit('close','cancel')"></i>
+			</div>
+		</div>
+		<div class="hui-table-box-content">
+			<el-empty description="暂无数据" :image-size="80" v-if="list.length === 0"></el-empty>
+			<div class="hui-timeline" v-else>
+				<div class="hui-timeline-item" v-for="(item,index) in list" :key="item.id">
+					<div class="hui-timeline-icon">
+						<i class="el-icon-date"></i>
+					</div>
+					<div class="hui-timeline-content">
+						<div class="hui-timeline-text">
+							<div class="hui-timeline-label">{{typeName}}名称</div>
+							<div class="hui-timeline-value">{{item.title}}</div>
+						</div>
+						<div class="hui-timeline-text" v-if="type ===1">
+							<div class="hui-timeline-label">变更目录</div>
+							<div class="hui-timeline-value">{{item.content}}</div>
+						</div>
+						<div class="hui-timeline-text">
+							<div class="hui-timeline-label">{{typeName}}描述</div>
+							<div class="hui-timeline-value">{{item.remark}}</div>
+						</div>
+						<div class="hui-timeline-text file-value">
+							<div class="hui-timeline-label">{{typeName}}附件</div>
+							<div class="hui-timeline-value">
+								<upload :list="item.attachment?JSON.parse(item.attachment):[]" :disabled="true" offset="left">
+								</upload>
+							</div>
+						</div>
+					</div>
+					<div class="hui-timeline-time">{{item.date}}</div>
+					<div class="hui-timeline-line" v-if="index < (list.length - 1)"></div>
+				</div>
+			</div>
+		</div>
+		<el-drawer :visible.sync="drawer" :with-header="false" :size="360" :append-to-body="true">
+			<event-form @callback="callBack" v-if="drawer" :type="type" :deviceId="deviceId">
+			</event-form>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import eventForm from '@/components/work/device/eventForm'
+	import {
+		getDeviceEventList
+	} from '@/httpApi/work'
+	import upload from '@/components/common/upload'
+	export default {
+		props: ['type', 'deviceId'],
+		data() {
+			return {
+				drawer: false,
+				list: [],
+				typeName: ''
+			}
+		},
+		created() {
+			this.typeName = this.returnName();
+			this.init();
+		},
+		methods: {
+			init() {
+				getDeviceEventList({
+					deviceId: this.deviceId,
+					type: this.type
+				}).then(res => {
+					if (res.state) {
+						this.list = res.data;
+					}
+				})
+			},
+			insertEvent() {
+				this.drawer = true;
+			},
+			callBack(type) {
+				this.drawer = false;
+				if (type != 'cancel') {
+					this.init();
+					this.$emit('close', 'init');
+				}
+			},
+			returnName() {
+				let str = '';
+				switch (this.type) {
+					case 1:
+						str = '变更'
+						break;
+					case 2:
+						str = '折旧'
+						break;
+					case 3:
+						str = '盘点'
+						break;
+					default:
+						break;
+				}
+				return str;
+			},
+		},
+		components: {
+			eventForm,
+			upload
+		}
+	}
+</script>
+
+<style lang="scss">
+	.device-event {
+		.hui-title {
+			.el-icon-plus {
+				font-size: 18px;
+				cursor: pointer;
+				color: $--color-primary;
+				padding: 0 4px 0 8px;
+			}
+
+			.el-icon-circle-close {
+				padding: 0 8px 0 4px;
+			}
+		}
+
+		.hui-table-box-content {
+			padding: 10px;
+		}
+	}
+</style>

+ 49 - 0
virgo.wzfrontend/console/src/components/work/device/deviceFlowDetail.vue

@@ -0,0 +1,49 @@
+<template>
+	<div class="hui-detail-content">
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">流程日期</div>
+			<div class="hui-detail-value">{{formData.date}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">项目名称</div>
+			<div class="hui-detail-value">{{formData.projectName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">单位工程</div>
+			<div class="hui-detail-value">{{formData.projectItemName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">具体位置</div>
+			<div class="hui-detail-value">{{formData.projectItemTargetName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">空间位置</div>
+			<div class="hui-detail-value">{{formData.projectItemTargetRoomName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">设备名称</div>
+			<div class="hui-detail-value">{{formData.name}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">流程类型</div>
+			<div class="hui-detail-value">{{$device.getTypeObj(formData.type).name}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">申请时间</div>
+			<div class="hui-detail-value">{{formData.date}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">流程备注</div>
+			<div class="hui-detail-value">{{formData.remark}}</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: ['formData'],
+	}
+</script>
+
+<style>
+</style>

+ 128 - 0
virgo.wzfrontend/console/src/components/work/device/deviceFlowForm.vue

@@ -0,0 +1,128 @@
+<template>
+	<div class="property-flow-form">
+		<project-item ref="projectItem" :form="propertyForm">
+			<el-form-item label="设备名称">
+				<el-cascader v-model="departId" :options="departList" :props="defaultProps" @change="changePart"
+					placeholder="请选择设备名称">
+				</el-cascader>
+			</el-form-item>
+		</project-item>
+		<el-form :model="propertyForm" label-position="top">
+			<el-form-item label="流程类型" required>
+				<el-select v-model="propertyForm.type" placeholder="请选择流程类型">
+					<el-option :label="item.name" :value="item.id" v-for="(item,index) in $device.type" :key="item.id">
+					</el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item label="申请时间">
+				<el-date-picker v-model="propertyForm.date" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+					placeholder="选择时间"></el-date-picker>
+			</el-form-item>
+			<el-form-item label="流程描述" class="hui-textarea">
+				<el-input type="textarea" v-model="propertyForm.remark" placeholder="请输入变更描述" resize="none">
+				</el-input>
+			</el-form-item>
+		</el-form>
+	</div>
+</template>
+
+<script>
+	import {
+		getDevicePartList
+	} from '@/httpApi/property'
+	import projectItem from '@/components/common/projectItem'
+	import {
+		findParentIds
+	} from '@/uitls'
+	export default {
+		props: ['flowForm'],
+		data() {
+			return {
+				propertyForm: {
+					type: 1,
+					date: '',
+					remark: ''
+				},
+				departList: [],
+				departId: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name',
+					value: 'id'
+				},
+				deviceList: []
+			}
+		},
+		created() {
+			if (JSON.stringify(this.flowForm) === "{}") return this.getPartList();
+			this.propertyForm = this.flowForm;
+			this.getPartList();
+		},
+		methods: {
+			getPartList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.departList = res.data;
+						this.returnChildren(this.departList);
+						if (this.propertyForm.deviceId) this.departId = findParentIds(this.departList,
+							-this.propertyForm.deviceId);
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+						this.deviceList = this.deviceList.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			changePart() {
+				this.propertyForm['deviceId'] = -this.departId[this.departId.length - 1];
+				this.propertyForm['name'] = this.deviceList.filter(node => node.id === this.departId[this.departId
+					.length - 1])[0].name;
+			},
+			returnForm() {
+				let obj = this.$refs.projectItem.returnItem();
+				this.propertyForm['projectId'] = this.$store.getters.project.id;
+				this.propertyForm['projectItemId'] = obj.projectItem.id;
+				this.propertyForm['projectItemTargetId'] = obj.projectItemTarget.id;
+				this.propertyForm['projectItemTargetRoomId'] = obj.projectItemTargetRoom.id;
+				return {
+					formData: this.propertyForm,
+					commonForm: {
+						projectId: this.$store.getters.project.id,
+						projectName: this.$store.getters.project.projectName,
+						projectItemId: obj.projectItem.id,
+						projectItemName: obj.projectItem.name,
+						projectItemTargetId: obj.projectItemTarget.id,
+						projectItemTargetName: obj.projectItemTarget.name,
+						projectItemTargetRoomId: obj.projectItemTargetRoom.id,
+						projectItemTargetRoomName: obj.projectItemTargetRoom.name,
+						deviceId: this.propertyForm.deviceId,
+						type: this.propertyForm.type
+					}
+				}
+			}
+		},
+		watch: {
+			flowForm() {
+				if (JSON.stringify(this.flowForm) === "{}") return;
+				this.propertyForm = this.flowForm;
+				this.getPartList();
+			}
+		},
+		components: {
+			projectItem
+		},
+	}
+</script>
+
+<style>
+</style>

+ 178 - 0
virgo.wzfrontend/console/src/components/work/device/deviceForm.vue

@@ -0,0 +1,178 @@
+<template>
+	<div class="hui-drawer hui-table-box">
+		<div class="hui-title">
+			<div class="hui-title-label">{{isUpdate?'编辑设备':'新增设备'}}</div>
+			<div class="hui-title-right">
+				<i class="el-icon-close" title="关闭" @click="close"></i>
+			</div>
+		</div>
+		<div class="hui-table-box-content">
+			<div class="device-form">
+				<el-form :model="deviceForm" :rules="deviceRuler" tatus-icon label-width="100px" size="medium">
+					<el-form-item label="设备目录">
+						<el-cascader v-model="departId" :options="departList" :props="defaultProps"
+							@change="changePart"></el-cascader>
+					</el-form-item>
+					<el-form-item label="设备类型">
+						<el-radio v-model="deviceForm.type" :label="0">普通设备</el-radio>
+						<el-radio v-model="deviceForm.type" :label="1">物联网设备</el-radio>
+					</el-form-item>
+					<el-form-item label="设备名称">
+						<el-input type="text" v-model="deviceForm.name"></el-input>
+					</el-form-item>
+					<project-item ref="projectItem" :form="deviceForm"></project-item>
+					<el-form-item label="设计编码">
+						<el-input type="text" v-model="deviceForm.designNumber"></el-input>
+					</el-form-item>
+					<el-form-item label="资产编码">
+						<el-input type="text" v-model="deviceForm.assetNumber"></el-input>
+					</el-form-item>
+					<el-form-item label="设备编码">
+						<el-input type="text" v-model="deviceForm.deviceNumber"></el-input>
+					</el-form-item>
+					<el-form-item label="设备品牌">
+						<el-input type="text" v-model="deviceForm.deviceBrand"></el-input>
+					</el-form-item>
+					<el-form-item label="设备型号">
+						<el-input type="text" v-model="deviceForm.deviceModel"></el-input>
+					</el-form-item>
+					<el-form-item label="设备序列号">
+						<el-input type="text" v-model="deviceForm.deviceSerialNumber"></el-input>
+					</el-form-item>
+					<el-form-item label="附件" class="upload-item">
+						<upload ref="upload" :list="responsibility" offset="left"></upload>
+					</el-form-item>
+					<el-form-item label="文档" class="upload-item">
+						<document ref="document" :list="documentList" type="isEdit"></document>
+					</el-form-item>
+					<el-form-item label="备注">
+						<el-input type="text" v-model="deviceForm.remark"></el-input>
+					</el-form-item>
+				</el-form>
+			</div>
+		</div>
+		<div class="hui-drawer-submit">
+			<el-button size="mini" @click="close">取 消</el-button>
+			<el-button size="mini" type="primary" @click="submit">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		insertDevice,
+		updateDevice,
+		getDeviceById,
+		getDevicePartList
+	} from '@/httpApi/property'
+	import upload from '@/components/common/upload'
+	import document from '@/components/common/document'
+	import projectItem from '@/components/common/projectItem'
+	import {
+		findParentIds
+	} from '@/uitls'
+	export default {
+		props: ['isUpdate', 'deviceId', 'part'],
+		data() {
+			return {
+				deviceForm: {
+					assetNumber: '',
+					attachment: '',
+					designNumber: '',
+					deviceBrand: '',
+					deviceModel: '',
+					deviceNumber: '',
+					deviceSerialNumber: '',
+					name: '',
+					operateDeviceLevelId: 0,
+					projectId: '',
+					projectItemId: '',
+					projectItemTargetId: '',
+					remark: '',
+					type: 0
+				},
+				deviceRuler: {},
+				typeList: [],
+				responsibility: [],
+				documentList: [],
+				departList: [],
+				departId: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name',
+					value: 'id'
+				},
+			}
+		},
+		created() {
+			if (this.isUpdate) {
+				getDeviceById(this.deviceId).then(res => {
+					if (res.state) {
+						let data = res.data;
+						this.deviceForm = data;
+						if (res.data.attachment) this.responsibility = JSON.parse(res.data.attachment);
+						if (res.data.document) this.documentList = JSON.parse(res.data.document);
+						this.setPartId();
+					}
+				})
+			} else {
+				this.deviceForm['projectId'] = this.$store.getters.project.id;
+				if (this.part) this.deviceForm['operateDeviceLevelId'] = this.part.id;
+				this.setPartId();
+			}
+		},
+		methods: {
+			setPartId() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.departList = res.data;
+						this.returnChildren(this.departList);
+						if (this.deviceForm.operateDeviceLevelId) this.departId = findParentIds(this.departList,
+							this.deviceForm.operateDeviceLevelId);
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.children.length == 0) item.children = null;
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			changePart() {
+				this.deviceForm['operateDeviceLevelId'] = this.departId[this.departId.length - 1];
+			},
+			submit() {
+				this.deviceForm['attachment'] = JSON.stringify(this.$refs.upload.fileList);
+				this.deviceForm['document'] = JSON.stringify(this.$refs.document.fileList);
+				this.deviceForm['projectItemId'] = this.$refs.projectItem.formBox.projectItemId;
+				this.deviceForm['projectItemTargetId'] = this.$refs.projectItem.formBox.projectItemTargetId;
+				this.deviceForm['projectItemTargetRoomId'] = this.$refs.projectItem.formBox.projectItemTargetRoomId;
+				if (this.isUpdate) {
+					updateDevice(this.deviceForm).then(this.successFunc)
+				} else {
+					insertDevice(this.deviceForm).then(this.successFunc)
+				}
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback');
+				}
+			},
+			close() {
+				this.$emit('callback', 'cancel')
+			}
+		},
+		components: {
+			projectItem,
+			upload,
+			document
+		},
+	}
+</script>
+
+<style lang="scss">
+	.device-form {
+		padding: 10px;
+	}
+</style>

+ 147 - 0
virgo.wzfrontend/console/src/components/work/device/eventForm.vue

@@ -0,0 +1,147 @@
+<template>
+	<div class="hui-drawer hui-table-box">
+		<div class="hui-title">
+			<div class="hui-title-label">新增{{typeName}}</div>
+			<div class="hui-title-right">
+				<i class="el-icon-close" title="关闭" @click="close"></i>
+			</div>
+		</div>
+		<div class="hui-table-box-content">
+			<div class="event-form">
+				<el-form :model="eventForm" :rules="eventRuler" tatus-icon label-width="100px" size="medium">
+					<el-form-item label="变更目录" v-if="type ===1">
+						<el-cascader ref="partChange" v-model="departId" :options="departList" :props="defaultProps"
+							@change="changePart"></el-cascader>
+					</el-form-item>
+					<el-form-item :label="typeName + '名称'">
+						<el-input type="text" v-model="eventForm.title"></el-input>
+					</el-form-item>
+					<el-form-item :label="typeName + '描述'">
+						<el-input type="text" v-model="eventForm.remark"></el-input>
+					</el-form-item>
+					<el-form-item label="附件">
+						<upload ref="upload" :list="responsibility" offset="left"></upload>
+					</el-form-item>
+				</el-form>
+			</div>
+		</div>
+		<div class="hui-drawer-submit">
+			<el-button size="mini" @click="close">取 消</el-button>
+			<el-button size="mini" type="primary" @click="submit">保 存</el-button>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getDevicePartList,
+		insertDeviceEvent,
+		updateDevice
+	} from '@/httpApi/work'
+	import upload from '@/components/common/upload'
+	import {
+		findParent
+	} from '@/uitls'
+	export default {
+		props: ['type', 'deviceId'],
+		data() {
+			return {
+				eventForm: {
+					title: '',
+					content: '',
+					remark: '',
+					attachment: '',
+					type: '',
+					deviceId: ''
+				},
+				eventRuler: {},
+				responsibility: [],
+				departList: [],
+				departId: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name',
+					value: 'id'
+				},
+				typeName: ''
+			}
+		},
+		created() {
+			this.typeName = this.returnName();
+			this.eventForm['type'] = this.type;
+			this.eventForm['deviceId'] = this.deviceId;
+			if (this.type === 1) this.getPartList();
+		},
+		methods: {
+			returnName() {
+				let str = '';
+				switch (this.type) {
+					case 1:
+						str = '变更'
+						break;
+					case 2:
+						str = '折旧'
+						break;
+					case 3:
+						str = '盘点'
+						break;
+					default:
+						break;
+				}
+				return str;
+			},
+			getPartList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.departList = res.data;
+						this.returnChildren(this.departList);
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.children.length == 0) item.children = null;
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			changePart() {
+				this.eventForm['content'] = findParent(this.departList, this.$refs.partChange.getCheckedNodes()[0].data)
+					.map(node => node.name).join('/');
+			},
+			submit() {
+				this.eventForm['attachment'] = JSON.stringify(this.$refs.upload.fileList);
+				insertDeviceEvent(this.eventForm).then(this.successFunc)
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					if (this.type === 1) {
+						let operateDeviceLevelId = this.departId[this.departId.length - 1];
+						updateDevice({
+							id: this.deviceId,
+							operateDeviceLevelId: operateDeviceLevelId
+						}).then(res => {
+							if (res.state) {
+								this.$emit('callback');
+							}
+						})
+					} else {
+						this.$emit('callback');
+					}
+				}
+			},
+			close() {
+				this.$emit('callback', 'cancel')
+			}
+		},
+		components: {
+			upload
+		},
+	}
+</script>
+
+<style lang="scss">
+	.event-form {
+		padding: 10px;
+	}
+</style>

+ 74 - 0
virgo.wzfrontend/console/src/components/work/device/partDetail.vue

@@ -0,0 +1,74 @@
+<template>
+	<div class="work-device-detail-box hui-table-box">
+		<div class="hui-title">
+			<div class="hui-title-label">{{isPart?'目录':''}}详情</div>
+			<div class="hui-title-right">
+				<i class="el-icon-circle-close" title="关闭" @click="clickItem('close')"></i>
+			</div>
+		</div>
+		<div class="hui-table-box-content">
+			<div class="hui-detail" v-if="isPart">
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">目录名称</div>
+					<div class="hui-detail-value">{{part.name}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">目录描述</div>
+					<div class="hui-detail-value">{{part.remark}}</div>
+				</div>
+				<div class="hui-detail-item">
+					<div class="hui-detail-label">目录操作</div>
+					<div class="hui-detail-value">
+						<authority className="detail-iconfont" auth="/work/device/insertDepartment"
+							@click="clickItem('insertDepartment')" v-if="part.deviceList.length === 0">
+							<i class="iconfont icon-xinzengcaidan" title="新增资产目录">
+							</i>
+						</authority>
+						<authority className="detail-iconfont" auth="/work/device/updateDepartment"
+							@click="clickItem('updateDepartment')">
+							<i class="iconfont el-icon-edit-outline" title="编辑资产目录"></i>
+						</authority>
+						<authority className="detail-iconfont delete-detail-iconfont"
+							auth="/work/device/deleteDepartment" v-if="!part.children && part.deviceList.length == 0"
+							@click="clickItem('deleteDepartment')">
+							<i title="删除资产目录" class="iconfont icon-shanchu"></i>
+						</authority>
+					</div>
+				</div>
+			</div>
+			<device-detail v-else :deviceId="deviceId"></device-detail>
+		</div>
+	</div>
+</template>
+
+<script>
+	import deviceDetail from '@/components/work/device/deviceDetail'
+	export default {
+		props: ['isPart', 'part', 'deviceId'],
+		data() {
+			return {}
+		},
+		created() {
+
+		},
+		methods: {
+			clickItem(type) {
+				this.$emit('parentClick', type);
+			}
+		},
+		components: {
+			deviceDetail
+		},
+	}
+</script>
+
+<style lang="scss">
+	.work-device-detail-box {
+		display: flex;
+		flex-direction: column;
+		height: 100%;
+		width: 290px;
+		margin-left: 10px;
+		border-radius: 8px;
+	}
+</style>

+ 41 - 0
virgo.wzfrontend/console/src/components/work/property/changeFlowDetail.vue

@@ -0,0 +1,41 @@
+<template>
+	<div class="hui-detail-content">
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">流程日期</div>
+			<div class="hui-detail-value">{{formData.date}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">项目名称</div>
+			<div class="hui-detail-value">{{formData.projectName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">单位工程</div>
+			<div class="hui-detail-value">{{formData.projectItemName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">具体位置</div>
+			<div class="hui-detail-value">{{formData.projectItemTargetName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">空间位置</div>
+			<div class="hui-detail-value">{{formData.projectItemTargetRoomName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">资产名称</div>
+			<div class="hui-detail-value">{{formData.name}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">变更备注</div>
+			<div class="hui-detail-value">{{formData.remark}}</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: ['formData'],
+	}
+</script>
+
+<style>
+</style>

+ 115 - 0
virgo.wzfrontend/console/src/components/work/property/changeFlowForm.vue

@@ -0,0 +1,115 @@
+<template>
+	<div class="property-flow-form">
+		<project-item ref="projectItem" :form="propertyForm">
+			<el-form-item label="资产名称">
+				<el-cascader v-model="departId" :options="departList" :props="defaultProps" @change="changePart"
+					placeholder="请选择资产名称">
+				</el-cascader>
+			</el-form-item>
+		</project-item>
+		<el-form :model="propertyForm" label-position="top">
+			<el-form-item label="变更描述" class="hui-textarea">
+				<el-input type="textarea" v-model="propertyForm.remark" placeholder="请输入变更描述" resize="none">
+				</el-input>
+			</el-form-item>
+		</el-form>
+	</div>
+</template>
+
+<script>
+	import {
+		getDevicePartList
+	} from '@/httpApi/property'
+	import projectItem from '@/components/common/projectItem'
+	import {
+		findParentIds
+	} from '@/uitls'
+	export default {
+		props: ['flowForm'],
+		data() {
+			return {
+				propertyForm: {
+					remark: ''
+				},
+				departList: [],
+				departId: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name',
+					value: 'id'
+				},
+				deviceList: []
+			}
+		},
+		created() {
+			if (JSON.stringify(this.flowForm) === "{}") return this.getPartList();
+			this.propertyForm = this.flowForm;
+			this.getPartList();
+		},
+		methods: {
+			getPartList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.departList = res.data;
+						this.returnChildren(this.departList);
+						if (this.propertyForm.deviceId) this.departId = findParentIds(this.departList,
+							-this.propertyForm.deviceId);
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+						this.deviceList = this.deviceList.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			changePart() {
+				this.propertyForm['deviceId'] = -this.departId[this.departId.length - 1];
+				this.propertyForm['name'] = this.deviceList.filter(node => node.id === this.departId[this.departId
+					.length - 1])[0].name;
+			},
+			returnForm() {
+				let obj = this.$refs.projectItem.returnItem();
+				this.propertyForm['projectId'] = this.$store.getters.project.id;
+				this.propertyForm['projectItemId'] = obj.projectItem.id;
+				this.propertyForm['projectItemTargetId'] = obj.projectItemTarget.id;
+				this.propertyForm['projectItemTargetRoomId'] = obj.projectItemTargetRoom.id;
+				return {
+					formData: this.propertyForm,
+					commonForm: {
+						projectId: this.$store.getters.project.id,
+						projectName: this.$store.getters.project.projectName,
+						projectItemId: obj.projectItem.id,
+						projectItemName: obj.projectItem.name,
+						projectItemTargetId: obj.projectItemTarget.id,
+						projectItemTargetName: obj.projectItemTarget.name,
+						projectItemTargetRoomId: obj.projectItemTargetRoom.id,
+						projectItemTargetRoomName: obj.projectItemTargetRoom.name,
+						deviceId: this.propertyForm.deviceId
+					}
+				}
+			}
+		},
+		watch: {
+			flowForm() {
+				if (JSON.stringify(this.flowForm) === "{}") return;
+				this.propertyForm = this.flowForm;
+				this.getPartList();
+			}
+		},
+		components: {
+			projectItem
+		},
+	}
+</script>
+
+<style>
+</style>

+ 66 - 0
virgo.wzfrontend/console/src/components/work/property/departForm.vue

@@ -0,0 +1,66 @@
+<template>
+	<div class="hui-flex hui-dialog">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-form :model="departmentForm" label-position="top">
+				<el-form-item label="资产名称">
+					<el-input type="text" v-model="departmentForm.name"></el-input>
+				</el-form-item>
+				<el-form-item label="资产描述">
+					<el-input type="text" v-model="departmentForm.remark"></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 {
+		insertDeviceDepartment,
+		updateDeviceDepartment
+	} from '@/httpApi/property'
+	export default {
+		props: ['isUpdate', 'part'],
+		data() {
+			return {
+				departmentForm: {
+					name: '',
+					remark: '',
+					operateOrganizationId: '',
+					parentId: -1,
+					isp: 0
+				},
+				departmentRuler: {}
+			}
+		},
+		created() {
+			if (this.isUpdate) {
+				this.departmentForm = JSON.parse(JSON.stringify(this.part));
+			} else {
+				this.departmentForm['operateOrganizationId'] = this.$store.getters.organization.id;
+				this.departmentForm['parentId'] = this.part.id || -1;
+				this.departmentForm['projectId'] = this.$store.getters.project.id;
+			}
+		},
+		methods: {
+			submit() {
+				if (this.isUpdate) {
+					updateDeviceDepartment(this.departmentForm).then(this.successFunc)
+				} else {
+					insertDeviceDepartment(this.departmentForm).then(this.successFunc)
+				}
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.$emit('callback', 'init');
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss"></style>

+ 29 - 0
virgo.wzfrontend/console/src/components/work/property/depreciationFlowDetail.vue

@@ -0,0 +1,29 @@
+<template>
+	<div class="hui-detail-content">
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">流程日期</div>
+			<div class="hui-detail-value">{{formData.date}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">资产名称</div>
+			<div class="hui-detail-value">{{formData.name}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">折旧内容</div>
+			<div class="hui-detail-value">{{formData.depreciationContent}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">折旧备注</div>
+			<div class="hui-detail-value">{{formData.remark}}</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: ['formData'],
+	}
+</script>
+
+<style>
+</style>

+ 112 - 0
virgo.wzfrontend/console/src/components/work/property/depreciationFlowForm.vue

@@ -0,0 +1,112 @@
+<template>
+	<div class="property-flow-form">
+		<el-form :model="propertyForm" label-position="top">
+			<el-form-item label="资产名称">
+				<el-cascader v-model="departId" :options="departList" :props="defaultProps" @change="changePart"
+					placeholder="请选择资产名称">
+				</el-cascader>
+			</el-form-item>
+			<el-form-item label="折旧内容">
+				<el-input type="text" v-model="propertyForm.depreciationContent" placeholder="请输入折旧内容"></el-input>
+			</el-form-item>
+			<el-form-item label="折旧描述" class="hui-textarea">
+				<el-input type="textarea" v-model="propertyForm.remark" placeholder="请输入折旧描述" resize="none">
+				</el-input>
+			</el-form-item>
+		</el-form>
+	</div>
+</template>
+
+<script>
+	import {
+		getDevicePartList
+	} from '@/httpApi/property'
+	import projectItem from '@/components/common/projectItem'
+	import {
+		findParentIds
+	} from '@/uitls'
+	export default {
+		props: ['flowForm'],
+		data() {
+			return {
+				propertyForm: {
+					depreciationContent,
+					remark: ''
+				},
+				departList: [],
+				departId: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name',
+					value: 'id'
+				},
+				deviceList: []
+			}
+		},
+		created() {
+			if (JSON.stringify(this.flowForm) === "{}") return this.getPartList();
+			this.propertyForm = this.flowForm;
+			this.getPartList();
+		},
+		methods: {
+			getPartList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.departList = res.data;
+						this.returnChildren(this.departList);
+						if (this.propertyForm.deviceId) this.departId = findParentIds(this.departList,
+							-this.propertyForm.deviceId);
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+						this.deviceList = this.deviceList.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			changePart() {
+				this.propertyForm['deviceId'] = -this.departId[this.departId.length - 1];
+				this.propertyForm['name'] = this.deviceList.filter(node => node.id === this.departId[this.departId
+					.length - 1])[0].name;
+			},
+			returnForm() {
+				return {
+					formData: this.propertyForm,
+					commonForm: {
+						projectId: this.$store.getters.project.id,
+						projectName: this.$store.getters.project.projectName,
+						projectItemId: '',
+						projectItemName: '',
+						projectItemTargetId: '',
+						projectItemTargetName: '',
+						projectItemTargetRoomId: '',
+						projectItemTargetRoomName: '',
+						deviceId: this.propertyForm.deviceId
+					}
+				}
+			}
+		},
+		watch: {
+			flowForm() {
+				if (JSON.stringify(this.flowForm) === "{}") return;
+				this.propertyForm = this.flowForm;
+				this.getPartList();
+			}
+		},
+		components: {
+			projectItem
+		},
+	}
+</script>
+
+<style>
+</style>

+ 29 - 0
virgo.wzfrontend/console/src/components/work/property/inventoryFlowDetail.vue

@@ -0,0 +1,29 @@
+<template>
+	<div class="hui-detail-content">
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">流程日期</div>
+			<div class="hui-detail-value">{{formData.date}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">资产名称</div>
+			<div class="hui-detail-value">{{formData.name}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">盘点内容</div>
+			<div class="hui-detail-value">{{formData.inventoryContent}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">盘点备注</div>
+			<div class="hui-detail-value">{{formData.remark}}</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: ['formData'],
+	}
+</script>
+
+<style>
+</style>

+ 112 - 0
virgo.wzfrontend/console/src/components/work/property/inventoryFlowForm.vue

@@ -0,0 +1,112 @@
+<template>
+	<div class="property-flow-form">
+		<el-form :model="propertyForm" label-position="top">
+			<el-form-item label="资产名称">
+				<el-cascader v-model="departId" :options="departList" :props="defaultProps" @change="changePart"
+					placeholder="请选择资产名称">
+				</el-cascader>
+			</el-form-item>
+			<el-form-item label="盘点内容">
+				<el-input type="text" v-model="propertyForm.inventoryContent" placeholder="请输入盘点内容"></el-input>
+			</el-form-item>
+			<el-form-item label="盘点描述" class="hui-textarea">
+				<el-input type="textarea" v-model="propertyForm.remark" placeholder="请输入盘点描述" resize="none">
+				</el-input>
+			</el-form-item>
+		</el-form>
+	</div>
+</template>
+
+<script>
+	import {
+		getDevicePartList
+	} from '@/httpApi/property'
+	import projectItem from '@/components/common/projectItem'
+	import {
+		findParentIds
+	} from '@/uitls'
+	export default {
+		props: ['flowForm'],
+		data() {
+			return {
+				propertyForm: {
+					inventoryContent: '',
+					remark: ''
+				},
+				departList: [],
+				departId: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name',
+					value: 'id'
+				},
+				deviceList: []
+			}
+		},
+		created() {
+			if (JSON.stringify(this.flowForm) === "{}") return this.getPartList();
+			this.propertyForm = this.flowForm;
+			this.getPartList();
+		},
+		methods: {
+			getPartList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.departList = res.data;
+						this.returnChildren(this.departList);
+						if (this.propertyForm.deviceId) this.departId = findParentIds(this.departList,
+							-this.propertyForm.deviceId);
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+						this.deviceList = this.deviceList.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			changePart() {
+				this.propertyForm['deviceId'] = -this.departId[this.departId.length - 1];
+				this.propertyForm['name'] = this.deviceList.filter(node => node.id === this.departId[this.departId
+					.length - 1])[0].name;
+			},
+			returnForm() {
+				return {
+					formData: this.propertyForm,
+					commonForm: {
+						projectId: this.$store.getters.project.id,
+						projectName: this.$store.getters.project.projectName,
+						projectItemId: '',
+						projectItemName: '',
+						projectItemTargetId: '',
+						projectItemTargetName: '',
+						projectItemTargetRoomId: '',
+						projectItemTargetRoomName: '',
+						deviceId: this.propertyForm.deviceId
+					}
+				}
+			}
+		},
+		watch: {
+			flowForm() {
+				if (JSON.stringify(this.flowForm) === "{}") return;
+				this.propertyForm = this.flowForm;
+				this.getPartList();
+			}
+		},
+		components: {
+			projectItem
+		},
+	}
+</script>
+
+<style>
+</style>

+ 65 - 0
virgo.wzfrontend/console/src/components/work/property/propertyFlowDetail.vue

@@ -0,0 +1,65 @@
+<template>
+	<div class="hui-detail-content">
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">流程日期</div>
+			<div class="hui-detail-value">{{formData.date}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">项目名称</div>
+			<div class="hui-detail-value">{{formData.projectName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">单位工程</div>
+			<div class="hui-detail-value">{{formData.projectItemName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">具体位置</div>
+			<div class="hui-detail-value">{{formData.projectItemTargetName}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">资产名称</div>
+			<div class="hui-detail-value">{{formData.name}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">资产类型</div>
+			<div class="hui-detail-value">{{formData.type === 0?'普通设备':'物联网设备' }}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">设计编码</div>
+			<div class="hui-detail-value">{{formData.designNumber}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">资产编码</div>
+			<div class="hui-detail-value">{{formData.assetNumber}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">设备编码</div>
+			<div class="hui-detail-value">{{formData.deviceNumber}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">品牌</div>
+			<div class="hui-detail-value">{{formData.deviceBrand}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">型号</div>
+			<div class="hui-detail-value">{{formData.deviceModel}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">序列号</div>
+			<div class="hui-detail-value">{{formData.deviceSerialNumber}}</div>
+		</div>
+		<div class="hui-detail-item">
+			<div class="hui-detail-label">备注</div>
+			<div class="hui-detail-value">{{formData.remark}}</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	export default {
+		props: ['formData'],
+	}
+</script>
+
+<style>
+</style>

+ 136 - 0
virgo.wzfrontend/console/src/components/work/property/propertyFlowForm.vue

@@ -0,0 +1,136 @@
+<template>
+	<div class="property-flow-form">
+		<project-item ref="projectItem" :form="propertyForm"></project-item>
+		<el-form :model="propertyForm" label-position="top">
+			<el-form-item label="资产名称">
+				<el-input type="text" v-model="propertyForm.name" placeholder="请输入资产名称"></el-input>
+			</el-form-item>
+			<el-form-item label="资产类别">
+				<el-cascader v-model="departId" :options="departList" :props="defaultProps" @change="changePart"
+					placeholder="请选择资产类别">
+				</el-cascader>
+			</el-form-item>
+			<el-form-item label="设备类型" required>
+				<el-select v-model="propertyForm.type" placeholder="请选择设备类型">
+					<el-option label="普通设备" :value="0"></el-option>
+					<el-option label="物联网设备" :value="1"></el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item label="设计编码">
+				<el-input type="text" v-model="propertyForm.designNumber" placeholder="请输入设计编码"></el-input>
+			</el-form-item>
+			<el-form-item label="资产编码">
+				<el-input type="text" v-model="propertyForm.assetNumber" placeholder="请输入资产编码"></el-input>
+			</el-form-item>
+			<el-form-item label="设备编码">
+				<el-input type="text" v-model="propertyForm.deviceNumber" placeholder="请输入设备编码"></el-input>
+			</el-form-item>
+			<el-form-item label="品牌">
+				<el-input type="text" v-model="propertyForm.deviceBrand" placeholder="请输入品牌"></el-input>
+			</el-form-item>
+			<el-form-item label="型号">
+				<el-input type="text" v-model="propertyForm.deviceModel" placeholder="请输入型号"></el-input>
+			</el-form-item>
+			<el-form-item label="序列号">
+				<el-input type="text" v-model="propertyForm.deviceSerialNumber" placeholder="请输入序列号"></el-input>
+			</el-form-item>
+			<el-form-item label="资产备注" class="hui-textarea">
+				<el-input type="textarea" v-model="propertyForm.remark" placeholder="请输入资产备注" resize="none">
+				</el-input>
+			</el-form-item>
+		</el-form>
+	</div>
+</template>
+
+<script>
+	import {
+		getDevicePartList
+	} from '@/httpApi/property'
+	import projectItem from '@/components/common/projectItem'
+	import {
+		findParentIds
+	} from '@/uitls'
+	export default {
+		props: ['flowForm'],
+		data() {
+			return {
+				propertyForm: {
+					assetNumber: '',
+					attachment: '',
+					designNumber: '',
+					deviceBrand: '',
+					deviceModel: '',
+					deviceNumber: '',
+					deviceSerialNumber: '',
+					name: '',
+					operateDeviceLevelId: 0,
+					remark: '',
+					type: 0
+				},
+				departList: [],
+				departId: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name',
+					value: 'id'
+				},
+			}
+		},
+		created() {
+			if (JSON.stringify(this.flowForm) === "{}") return this.getPartList();
+			this.propertyForm = this.flowForm;
+			this.getPartList();
+		},
+		methods: {
+			getPartList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.departList = res.data;
+						this.returnChildren(this.departList);
+						if (this.propertyForm.operateDeviceLevelId) this.departId = findParentIds(this.departList,
+							this.propertyForm.operateDeviceLevelId);
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.children.length == 0) item.children = null;
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			changePart() {
+				this.propertyForm['operateDeviceLevelId'] = this.departId[this.departId.length - 1];
+			},
+			returnForm() {
+				let obj = this.$refs.projectItem.returnItem();
+				this.propertyForm['projectId'] = this.$store.getters.project.id;
+				this.propertyForm['projectItemId'] = obj.projectItem.id;
+				this.propertyForm['projectItemTargetId'] = obj.projectItemTarget.id;
+				return {
+					formData: this.propertyForm,
+					commonForm: {
+						projectId: this.$store.getters.project.id,
+						projectName: this.$store.getters.project.projectName,
+						projectItemId: obj.projectItem.id,
+						projectItemName: obj.projectItem.name,
+						projectItemTargetId: obj.projectItemTarget.id,
+						projectItemTargetName: obj.projectItemTarget.name
+					}
+				}
+			}
+		},
+		watch: {
+			flowForm() {
+				if (JSON.stringify(this.flowForm) === "{}") return;
+				this.propertyForm = this.flowForm;
+				this.getPartList();
+			}
+		},
+		components: {
+			projectItem
+		},
+	}
+</script>
+
+<style>
+</style>

+ 22 - 0
virgo.wzfrontend/console/src/httpApi/operation.js

@@ -185,4 +185,26 @@ export function getLogDetailById(id) {
 		url: `/api/operationLog/${id}`,
 		method: 'get'
 	})
+}
+/* 
+ * 获取周报列表
+ * 
+ * 
+ */
+export function getWeekList(projectId) {
+	return request({
+		url: `/api/weekly/${projectId}`,
+		method: 'get'
+	})
+}
+/* 
+ * 获取周报详情
+ * 
+ * 
+ */
+export function getWeekDetailById(id) {
+	return request({
+		url: `/api/weekly/type/${id}`,
+		method: 'get'
+	})
 }

+ 198 - 0
virgo.wzfrontend/console/src/httpApi/property.js

@@ -0,0 +1,198 @@
+import request from '@/axios'
+/* 
+ * 初始化组织项目资产列表
+ * 
+ * 
+ */
+export function initDevicePartList(operateOrganizationId, projectId) {
+	return request({
+		url: `/api/operateDeviceLevel/init/${operateOrganizationId}/${projectId}`,
+		method: 'get'
+	})
+}
+/* 
+ * 获取资产列表
+ * 
+ * 
+ */
+export function getDevicePartList(operateOrganizationId, projectId) {
+	return request({
+		url: `/api/operateDeviceLevel/getOperateOrganizationId/${operateOrganizationId}/${projectId}`,
+		method: 'get'
+	})
+}
+/* 
+ * 删除设资产列表
+ * 
+ * 
+ */
+export function deleteDeviceDepartment(id) {
+	return request({
+		url: `/api/operateDeviceLevel/${id}`,
+		method: 'delete'
+	})
+}
+/* 
+ * 新增资产目录
+ * 
+ * 
+ */
+export function insertDeviceDepartment(data) {
+	return request({
+		url: `/api/operateDeviceLevel`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 编辑资产目录
+ * 
+ * 
+ */
+export function updateDeviceDepartment(data) {
+	return request({
+		url: `/api/operateDeviceLevel`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 获取审核
+ * 
+ * 
+ */
+export function getFlowList(currPage, pageSize, data) {
+	return request({
+		url: `/api/operateFlowData/${currPage}/${pageSize}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 根据id获取审核
+ * 
+ * 
+ */
+export function getFlowById(id) {
+	return request({
+		url: `/api/operateFlowData/${id}`,
+		method: 'get'
+	})
+}
+/* 
+ * 新增审核
+ * 
+ * 
+ */
+export function insertFlow(data) {
+	return request({
+		url: `/api/operateFlowData`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 更新审核
+ * 
+ * 
+ */
+export function updateFlow(data) {
+	return request({
+		url: `/api/operateFlowData`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 删除审核
+ * 
+ * 
+ */
+export function deleteFlow(id) {
+	return request({
+		url: `/api/operateFlowData/${id}`,
+		method: 'delete'
+	})
+}
+/* 
+ * 获取文档目录层级
+ * 
+ */
+export function getDocumentTemplateList(data) {
+	return request({
+		url: `/file/category/directory`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 生成流程
+ * @param {Object} data = {coment内容|flowType|flowUserList|submiter发起人ID|subscribers订阅人|id流程ID}
+ * 
+ */
+export function generationFlow(data) {
+	data['flowType'] = 5;
+	return request({
+		url: `/flow/projectFlow`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取某一进行中流程详情
+ * @param {String} projectFlowId = {projectFlowId项目流程ID}
+ * 
+ */
+export function getFlowApprove(projectFlowId) {
+	return request({
+		url: `/flow/projectFlow/${projectFlowId}`,
+		method: 'get'
+	})
+}
+/* 
+ * 获取用户操作
+ * @param {String} id = {id项目流程ID}
+ * 
+ */
+export function getUserFlowAction(projectFlowId) {
+	return request({
+		url: `/flow/projectFlow/${projectFlowId}/actions`,
+		method: 'get'
+	})
+}
+/* 
+ * 用户操作
+ * @param {String} id = {id项目流程ID} actionId = {actionId操作ID} {Object} data = {comment内容}
+ * 
+ */
+export function userFlowAction(projectFlowId, actionId, data) {
+	return request({
+		url: `/flow/projectFlow/${projectFlowId}/actions/${actionId}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 新增设备
+ * 
+ * 
+ */
+export function insertDevice(data) {
+	return request({
+		url: `/api/operateDevice`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 编辑设备
+ * 
+ * 
+ */
+export function updateDevice(data) {
+	return request({
+		url: `/api/operateDevice`,
+		method: 'put',
+		data: data
+	})
+}

+ 57 - 0
virgo.wzfrontend/console/src/httpApi/system.js

@@ -96,4 +96,61 @@ export function updateIdentityResource(data) {
 		method: 'put',
 		data: data
 	})
+}
+/* 
+ * 获取设备层级
+ * 
+ * 
+ */
+export function getDeviceModel() {
+	return request({
+		url: `/api/operateDeviceLevelModel`,
+		method: 'get'
+	})
+}
+/* 
+ * 获取通过id设备层级
+ * 
+ * 
+ */
+export function getDeviceModelById(id) {
+	return request({
+		url: `/api/operateDeviceLevelModel/get/${id}`,
+		method: 'get'
+	})
+}
+/* 
+ * 新增设备层级
+ * 
+ * 
+ */
+export function insertDeviceModel(data) {
+	return request({
+		url: `/api/operateDeviceLevelModel`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 编辑设备层级
+ * 
+ * 
+ */
+export function updateDeviceModel(data) {
+	return request({
+		url: `/api/operateDeviceLevelModel`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 删除设备层级
+ * 
+ * 
+ */
+export function deleteDeviceModel(id) {
+	return request({
+		url: `/api/operateDeviceLevelModel/${id}`,
+		method: 'delete'
+	})
 }

+ 9 - 2
virgo.wzfrontend/console/src/router/modules/operation.js

@@ -40,12 +40,19 @@ const operation = [{
 	meta: {
 		title: '工作周报'
 	}
+}, {
+	path: 'operation/week/detail',
+	component: () => import('@/views/work/operation/week/detail'),
+	name: '周报详情',
+	meta: {
+		title: '周报详情'
+	}
 }, {
 	path: 'operation/log/project',
 	component: () => import('@/views/work/operation/log/project'),
-	name: '项目日志',
+	name: '操作日志',
 	meta: {
-		title: '项目日志'
+		title: '操作日志'
 	}
 }]
 export default operation;

+ 37 - 0
virgo.wzfrontend/console/src/router/modules/property.js

@@ -0,0 +1,37 @@
+const property = [{
+	path: 'property/register',
+	component: () => import('@/views/work/property/register'),
+	name: '资产登记',
+	meta: {
+		title: '资产登记'
+	}
+}, {
+	path: 'property/change',
+	component: () => import('@/views/work/property/change'),
+	name: '资产变更',
+	meta: {
+		title: '资产变更'
+	}
+}, {
+	path: 'property/depreciation',
+	component: () => import('@/views/work/property/depreciation'),
+	name: '资产折旧',
+	meta: {
+		title: '资产折旧'
+	}
+}, {
+	path: 'property/inventory',
+	component: () => import('@/views/work/property/inventory'),
+	name: '资产盘点',
+	meta: {
+		title: '资产盘点'
+	}
+}, {
+	path: 'property/set',
+	component: () => import('@/views/work/property/set'),
+	name: '资产设置',
+	meta: {
+		title: '资产设置'
+	}
+}]
+export default property;

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

@@ -29,6 +29,13 @@ const system = [{
 		meta: {
 			title: '标签设置'
 		}
+	}, {
+		path: 'level',
+		component: () => import('@/views/system/level'),
+		name: '层级设置',
+		meta: {
+			title: '层级设置'
+		}
 	}]
 }]
 export default system;

+ 1 - 1
virgo.wzfrontend/console/src/store/index.js

@@ -18,4 +18,4 @@ const store = new Vuex.Store({
 	getters
 })
 
-export default store
+export default store

+ 65 - 1
virgo.wzfrontend/console/src/uitls/message.js

@@ -4,6 +4,70 @@ import dayjs from 'dayjs';
 import md5 from '@/js_sdk/js-md5/build/md5.min.js';
 const messageType = [{
 	id: 2,
+	name: '审核消息',
+	dataType: [{
+		id: 1,
+		title: '资产登记',
+		content: '的资产登记流程'
+	}, {
+		id: 2,
+		title: '资产变更',
+		content: '的资产变更流程'
+	}, {
+		id: 3,
+		title: '资产折旧',
+		content: '的资产折旧流程'
+	}, {
+		id: 4,
+		title: '资产盘点',
+		content: '的资产盘点流程'
+	}, {
+		id: 5,
+		title: '设备管理',
+		content: '的设备管理流程'
+	}]
+}, {
+	id: 3,
+	name: '巡查消息',
+	dataType: [{
+		id: 1,
+		title: '巡查记录',
+		content: '的巡查记录'
+	}]
+}, {
+	id: 4,
+	name: '工单消息',
+	dataType: [{
+		id: 1,
+		title: '工单记录',
+		content: '的工单记录'
+	}]
+}, {
+	id: 5,
+	name: '数据中心',
+	dataType: [{
+		id: 1,
+		title: '项目中心',
+		content: '目录',
+		type: 'access'
+	}, {
+		id: 2,
+		title: '项目中心',
+		content: '文件',
+		type: 'fileDownload'
+	}, {
+		id: 3,
+		title: '企业中心',
+		content: '目录',
+		type: 'access'
+	}, {
+		id: 4,
+		title: '企业中心',
+		content: '文件',
+		type: 'fileDownload'
+	}]
+}, {
+	id: 6,
 	name: '项目邀请'
 }];
 /* 
@@ -99,7 +163,7 @@ export default {
 	},
 	messageContent(params) {
 		let message = '';
-		if (params.messageType === 2) {
+		if (params.messageType === 6) {
 			message = `邀请你加入<${store.getters.project.name}>项目,请及时处理。`
 		}
 		return message;

+ 14 - 14
virgo.wzfrontend/console/src/uitls/permission.js

@@ -14,7 +14,7 @@ NProgress.configure({
 	showSpinner: false
 })
 const baseUrl = ['/', '/401', '/404', '/loginRegister/login', '/work', '/message', '/work/space/project',
-	'/iot/device/detail', '/work/staging/project'
+	'/iot/device/detail', '/work/staging/project', '/work/operation/week/detail'
 ];
 
 const testBaseUrl = (path) => { //判断公共路由
@@ -44,19 +44,19 @@ const testComment = (path) => { //判断权限路由
 router.beforeEach((to, from, next) => {
 	if (getToken() && !(store.getters && store.getters.user && store.getters.user.userId) && !sessionStorage
 		.getItem('store')) removeToken();
-	// if (to.path.indexOf('website') === -1) {
-	// 	/* 判断是否登录 */
-	// 	if (!getToken() && testBaseUrl(to.path)) return next('/loginRegister/login');
-	// 	/* 判断路由是否存在 */
-	// 	if (to.matched.length === 0) return next('/404');
-	// 	/* 判断是否有权限 */
-	// 	if (testComment(to.path)) return next('/401');
-	// 	/* 无项目时跳转项目列表页面 */
-	// 	if (getToken() && localStorage.getItem('projectId') == 0 && to.path !== '/work/space/project') {
-	// 		tip('暂无项目,请先添加项目');
-	// 		return next('/work/space/project');
-	// 	}
-	// }
+	if (to.path.indexOf('website') === -1) {
+		/* 判断是否登录 */
+		if (!getToken() && testBaseUrl(to.path)) return next('/loginRegister/login');
+		/* 判断路由是否存在 */
+		if (to.matched.length === 0) return next('/404');
+		/* 判断是否有权限 */
+		if (testComment(to.path)) return next('/401');
+		/* 无项目时跳转项目列表页面 */
+		if (getToken() && localStorage.getItem('projectId') == 0 && to.path !== '/work/space/project') {
+			tip('暂无项目,请先添加项目');
+			return next('/work/space/project');
+		}
+	}
 	NProgress.start();
 	next();
 });

+ 37 - 0
virgo.wzfrontend/console/src/views/system/level.vue

@@ -0,0 +1,37 @@
+<template>
+	<div class="level-system">
+		<div class="level-item">
+			<device-level></device-level>
+		</div>
+	</div>
+</template>
+
+<script>
+	import deviceLevel from '@/components/system/level/deviceLevel'
+	export default {
+		data() {
+			return {}
+		},
+		created() {},
+		methods: {},
+		components: {
+			deviceLevel
+		},
+	}
+</script>
+
+<style lang="scss">
+	.level-system {
+		width: 100%;
+		height: 100%;
+		overflow-y: auto;
+		display: flex;
+		flex-wrap: wrap;
+
+		.level-item {
+			width: 25%;
+			height: 100%;
+			padding: 10px;
+		}
+	}
+</style>

+ 1 - 1
virgo.wzfrontend/console/src/views/work/crm/agent.vue

@@ -151,7 +151,7 @@
 								dataId: user.id,
 								identityId: 2
 							}, {
-								messageType: 2,
+								messageType: 6,
 								userIds: res.data.id
 							}).then(node => {
 								if (node.state) {

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

@@ -221,7 +221,7 @@
 								dataId: user.id,
 								identityId: 1
 							}, {
-								messageType: 2,
+								messageType: 6,
 								userIds: res.data.id
 							}).then(node => {
 								if (node.state) {

+ 588 - 0
virgo.wzfrontend/console/src/views/work/iot/device/index.vue

@@ -0,0 +1,588 @@
+<template>
+	<div class="hui-flex hui-content device-index">
+		<div class="hui-flex-box yui-tree-box">
+			<div class="hui-left-tree">
+				<div class="hui-left-tree-title">
+					<svg-icon name="zhuangshi" width="16" height="20"></svg-icon>
+					<span class="hui-left-tree-sub">设备列表</span>
+				</div>
+				<div class="hui-left-tree-content">
+					<el-collapse>
+						<el-collapse-item v-for="item in treedData" :key="item.id">
+							<template slot="title">
+								<i class="iconfont huifont-shuzhuangcaidantubiao"></i>
+								<span class="el-collapse-name">{{item.name}}</span>
+							</template>
+							<div>
+								<el-tree :data="item.children" :props="defaultProps" :expand-on-click-node="false">
+								</el-tree>
+							</div>
+						</el-collapse-item>
+					</el-collapse>
+				</div>
+			</div>
+			<div class="hui-tree-content">
+				<div class="work-device-echart">
+					<div class="work-device-echart-item hui-flex box-background">
+						<div class="work-device-echart-title">实时流程走势图</div>
+						<div ref="chart1" class="hui-flex-box"></div>
+					</div>
+					<div class="work-device-echart-item hui-flex box-background">
+						<div class="work-device-echart-title">实时流程分析图</div>
+						<div ref="chart2" class="hui-flex-box"></div>
+					</div>
+					<div class="work-device-echart-item hui-flex box-background">
+						<div class="work-device-echart-title">历史流程走势图</div>
+						<div ref="chart3" class="hui-flex-box"></div>
+					</div>
+					<div class="work-device-echart-item hui-flex box-background">
+						<div class="work-device-echart-title">历史流程分析图</div>
+						<div ref="chart4" class="hui-flex-box"></div>
+					</div>
+				</div>
+				<div class="hui-flex hui-content box-background work-device">
+					<div class="hui-flex-box hui-flex hui-table">
+						<div class="hui-content-insert">
+							<el-button type="primary" size="medium" @click="insert">新增流程</el-button>
+						</div>
+						<div class="hui-flex-box">
+							<el-table :data="tableData" row-key="id" border height="100%">
+								<el-table-column label="序号" width="50">
+									<template slot-scope="scope">
+										<div style="text-align: center;">{{scope.$index + 1}}</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="资产名称" prop="name"></el-table-column>
+								<el-table-column label="单位工程" prop="projectItemName"></el-table-column>
+								<el-table-column label="具体位置" prop="projectItemTargetName"></el-table-column>
+								<el-table-column label="空间位置" prop="projectItemTargetRoomName"></el-table-column>
+								<el-table-column label="流程类型">
+									<template slot-scope="scope">
+										<div>{{$device.getTypeObj(scope.row.type).name}}</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="创建者" prop="createdByUserName"></el-table-column>
+								<el-table-column label="状态">
+									<template slot-scope="scope">
+										<div v-if="scope.row.state == -1 || scope.row.state == 1" class="hui-state">
+											<span class="hui-state-bage hui-state-primary"></span>
+											<span class="hui-state-label">待审核</span>
+										</div>
+										<div v-if="scope.row.state == 2" class="hui-state">
+											<span class="hui-state-bage hui-state-info"></span>
+											<span class="hui-state-label">审核中</span>
+										</div>
+										<div v-if="scope.row.state == 3" class="hui-state">
+											<span class="hui-state-bage hui-state-success"></span>
+											<span class="hui-state-label">通过</span>
+										</div>
+										<div v-if="scope.row.state == 4" class="hui-state">
+											<span class="hui-state-bage hui-state-error"></span>
+											<span class="hui-state-label">未通过</span>
+										</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="操作" width="150">
+									<template slot-scope="scope">
+										<div class="hui-table-operation">
+											<span class="table-operation" @click="lookFlow(scope.row)">
+												详情
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="updateFlow(scope.row)">
+												编辑
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="deleteFlow(scope.row)">
+												删除
+											</span>
+										</div>
+									</template>
+								</el-table-column>
+								<template slot="empty">
+									<empty description="暂无数据" width="120"></empty>
+								</template>
+							</el-table>
+						</div>
+						<div class="hui-content-pagination">
+							<el-pagination :pager-count="9" layout="prev, pager, next" :total="totalCount"
+								@current-change="currentChange">
+							</el-pagination>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<el-dialog :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="1200px" :append-to-body="true">
+			<flow-form v-if="visible" :isUpdate="isUpdate" @callback="callback" :detailId="detailId"
+				:flowType="flowType">
+			</flow-form>
+		</el-dialog>
+		<el-drawer title="流程详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<flow-detail v-if="drawer" @callback="callback" :detailId="detailId"></flow-detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		getDevicePartListByQUery,
+		getFlowList,
+		deleteFlow
+	} from '@/httpApi/work'
+	import flowForm from '@/components/flow/flowForm'
+	import flowDetail from '@/components/flow/flowDetail'
+	export default {
+		data() {
+			return {
+				flowType: 5,
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				treedData: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name'
+				},
+				visible: false,
+				isUpdate: false,
+				detailId: '',
+				drawer: false
+			}
+		},
+		created() {
+			getDevicePartListByQUery({
+				operateOrganizationId: this.$store.getters.organization.id,
+				projectId: this.$store.getters.project.id,
+				sign: 'device'
+			}).then(res => {
+				if (res.state) {
+					this.treedData = res.data.children;
+					this.returnChildren(this.treedData);
+				}
+			})
+			this.init();
+			this.$nextTick(() => {
+				this.initChart();
+			})
+		},
+		methods: {
+			init() {
+				getFlowList(this.currPage, this.pageSize, {
+					projectId: this.$store.getters.project.id,
+					flowType: this.flowType
+				}).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList.map(node => {
+							node = Object.assign(node, JSON.parse(node.flowData));
+							return node;
+						});;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insert() {
+				this.visible = true;
+				this.isUpdate = false;
+			},
+			lookFlow(val) {
+				this.detailId = val.id;
+				this.drawer = true;
+			},
+			updateFlow(val) {
+				this.detailId = val.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			deleteFlow(val) {
+				this.$confirm('确定要删除该流程?', () => {
+					deleteFlow(val.id).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				this.visible = false;
+				if (type === 'init') this.init();
+			},
+			initChart() {
+				let chart1 = echarts.init(this.$refs.chart1);
+				let option1 = {
+					tooltip: {
+						show: true,
+						trigger: 'axis',
+						formatter: function() {
+							return ''
+						},
+						backgroundColor: 'rgba(255,255,255,0)',
+						borderWidth: 0,
+						padding: 0,
+						axisPointer: {
+							lineStyle: {
+								type: 'solid',
+								color: '#4E5561',
+							}
+						}
+					},
+					grid: {
+						left: '15',
+						top: '25',
+						right: '15',
+						bottom: '5',
+						containLabel: true
+					},
+					color: ['#00D5FF'],
+					xAxis: {
+						type: 'category',
+						data: ['9点', '12点', '15点', '16点', '21点'],
+						axisLabel: {
+							margin: 4,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						boundaryGap: false,
+						axisLine: {
+							lineStyle: {
+								color: '#6C8097'
+							}
+						},
+						axisTick: {
+							show: false
+						}
+					},
+					yAxis: {
+						type: 'value',
+						axisLabel: {
+							margin: 10,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						splitLine: {
+							show: true,
+							lineStyle: {
+								color: 'rgba(108,128,151,0.3)',
+								type: 'dashed'
+							}
+						}
+					},
+					series: [{
+						data: [3, 2, 5, 3, 1],
+						type: 'line',
+						showSymbol: false,
+						label: {
+							show: true,
+							color: '#D0DEEE'
+						},
+						areaStyle: {
+							color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+									offset: 0,
+									color: 'rgba(0,213,255,0.15)'
+								},
+								{
+									offset: 1,
+									color: 'rgba(0,213,255,0)'
+								}
+							])
+						},
+						z: 99
+					}]
+				};
+				chart1.setOption(option1);
+				let chart2 = echarts.init(this.$refs.chart2);
+				let option2 = {
+					tooltip: {
+						show: true,
+						trigger: 'axis',
+						formatter: function() {
+							return ''
+						},
+						backgroundColor: 'rgba(255,255,255,0)',
+						borderWidth: 0,
+						padding: 0,
+						axisPointer: {
+							lineStyle: {
+								type: 'solid',
+								color: '#4E5561',
+							}
+						}
+					},
+					grid: {
+						left: '15',
+						top: '25',
+						right: '15',
+						bottom: '5',
+						containLabel: true
+					},
+					color: ['#1978E5'],
+					xAxis: {
+						type: 'category',
+						data: ['安装', '保养', '维修', '巡检', '拆除'],
+						axisLabel: {
+							margin: 4,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						boundaryGap: false,
+						axisLine: {
+							lineStyle: {
+								color: '#6C8097'
+							}
+						},
+						axisTick: {
+							show: false
+						}
+					},
+					yAxis: {
+						type: 'value',
+						axisLabel: {
+							margin: 10,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						splitLine: {
+							show: true,
+							lineStyle: {
+								color: 'rgba(108,128,151,0.3)',
+								type: 'dashed'
+							}
+						}
+					},
+					series: [{
+						data: [1, 3, 2, 6, 1],
+						type: 'line',
+						showSymbol: false,
+						label: {
+							show: true,
+							color: '#D0DEEE'
+						},
+						areaStyle: {
+							color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+									offset: 0,
+									color: 'rgba(0,150,255,0.15)'
+								},
+								{
+									offset: 1,
+									color: 'rgba(0,150,255,0)'
+								}
+							])
+						},
+						z: 99
+					}]
+				};
+				chart2.setOption(option2);
+				let chart3 = echarts.init(this.$refs.chart3);
+				let option3 = {
+					tooltip: {
+						show: true,
+						trigger: 'axis',
+						formatter: function() {
+							return ''
+						},
+						backgroundColor: 'rgba(255,255,255,0)',
+						borderWidth: 0,
+						padding: 0,
+						axisPointer: {
+							type: 'shadow',
+							shadowStyle: {
+								color: 'rgba(150,150,150,0.3)'
+							}
+						}
+					},
+					grid: {
+						left: '15',
+						top: '25',
+						right: '15',
+						bottom: '5',
+						containLabel: true
+					},
+					color: ['#66E1DF'],
+					xAxis: {
+						type: 'category',
+						data: ['1月', '2月', '3月', '4月', '5月', '6月'],
+						axisLabel: {
+							margin: 4,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						axisLine: {
+							lineStyle: {
+								color: '#6C8097'
+							}
+						},
+						axisTick: {
+							show: false
+						}
+					},
+					yAxis: {
+						type: 'value',
+						axisLabel: {
+							margin: 10,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						splitLine: {
+							show: true,
+							lineStyle: {
+								color: 'rgba(108,128,151,0.3)',
+								type: 'dashed'
+							}
+						}
+					},
+					series: [{
+						data: [1, 4, 2, 1, 1, 5],
+						type: 'bar',
+						barWidth: 10
+					}, {
+						data: [1, 4, 2, 1, 1, 5],
+						type: 'line',
+						showSymbol: false,
+						symbol: 'none',
+						color: ['rgba(255,255,255,0)'],
+						label: {
+							show: true,
+							color: '#D0DEEE'
+						},
+					}]
+				};
+				chart3.setOption(option3);
+				let chart4 = echarts.init(this.$refs.chart4);
+				let option4 = {
+					tooltip: {
+						show: true,
+						trigger: 'axis',
+						formatter: function() {
+							return ''
+						},
+						backgroundColor: 'rgba(255,255,255,0)',
+						borderWidth: 0,
+						padding: 0,
+						axisPointer: {
+							type: 'shadow',
+							shadowStyle: {
+								color: 'rgba(150,150,150,0.3)'
+							}
+						}
+					},
+					grid: {
+						left: '15',
+						top: '25',
+						right: '15',
+						bottom: '5',
+						containLabel: true
+					},
+					color: ['#3371FF'],
+					xAxis: {
+						type: 'category',
+						data: ['安装', '保养', '维修', '巡检', '拆除'],
+						axisLabel: {
+							margin: 4,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						axisLine: {
+							lineStyle: {
+								color: '#6C8097'
+							}
+						},
+						axisTick: {
+							show: false
+						}
+					},
+					yAxis: {
+						type: 'value',
+						axisLabel: {
+							margin: 10,
+							color: '#D0DEEE',
+							fontSize: 10
+						},
+						splitLine: {
+							show: true,
+							lineStyle: {
+								color: 'rgba(108,128,151,0.3)',
+								type: 'dashed'
+							}
+						}
+					},
+					series: [{
+						data: [1, 4, 2, 1, 1],
+						type: 'bar',
+						barWidth: 10,
+					}, {
+						data: [1, 4, 2, 1, 1],
+						type: 'line',
+						showSymbol: false,
+						symbol: 'none',
+						color: ['rgba(255,255,255,0)'],
+						label: {
+							show: true,
+							color: '#D0DEEE'
+						},
+					}]
+				};
+				chart4.setOption(option4);
+			}
+		},
+		components: {
+			flowForm,
+			flowDetail
+		},
+	}
+</script>
+
+<style lang="scss">
+	.device-index {
+		.hui-tree-content {
+			display: flex;
+			flex-direction: column;
+
+			.work-device {
+				flex: 1;
+				height: 0;
+			}
+		}
+
+		.work-device-echart {
+			display: flex;
+			margin-bottom: 10px;
+
+			.work-device-echart-item {
+				flex: 1;
+				height: 170px;
+				margin-right: 10px;
+			}
+
+			.work-device-echart-item:last-child {
+				margin-right: 0px;
+			}
+
+			.work-device-echart-title {
+				position: relative;
+				padding-left: 16px;
+				height: 30px;
+				line-height: 30px;
+				font-weight: 500;
+			}
+		}
+	}
+</style>

+ 818 - 0
virgo.wzfrontend/console/src/views/work/operation/week/detail.vue

@@ -0,0 +1,818 @@
+<template>
+	<div class="hui-flex hui-content organization-week">
+		<div class="hui-content-title">
+			<div class="back" @click="$router.back()">
+				<i class="el-icon-back"></i>
+				<span>返回</span>
+			</div>
+			<div :class="'hui-title-item' + (item.type === nowTitle.type?' active':'') " v-for="item in titleList"
+				:key="item.id" @click="nowTitle = item">
+				{{item.name}}
+			</div>
+		</div>
+		<div class="hui-flex-box">
+			<div class="week-content">
+				<div class="content-title">
+					{{nowTitle.name}}
+				</div>
+				<div class="content-box" v-show="nowTitle.type === 6">
+					<div class="alarm-table-boxs">
+						<div class="alarm-title">
+							<div class="alarm-tr">
+								<span class="tr-100">序号</span>
+								<span class="tr-flex">单位工程</span>
+								<span class="tr-flex">进度计划</span>
+								<span class="tr-flex">计划完成情况</span>
+							</div>
+						</div>
+						<div class="alarm-table">
+							<div class="alarm-tr">
+								<span class="tr-100">01</span>
+								<span class="tr-flex">1号楼</span>
+								<span class="tr-flex">进度计划进度计划进度计划</span>
+								<span class="tr-flex">
+									<div class="progress-item">
+										<div class="line">
+											<div class="progress" style="width: 56.32%;"></div>
+										</div>
+										<div class="alibaba hui-ellipsis">56.32%</div>
+									</div>
+								</span>
+							</div>
+							<div class="alarm-tr">
+								<span class="tr-100">02</span>
+								<span class="tr-flex">2号楼</span>
+								<span class="tr-flex">进度计划进度计划进度计划</span>
+								<span class="tr-flex">
+									<div class="progress-item">
+										<div class="line">
+											<div class="progress" style="width: 76.32%;"></div>
+										</div>
+										<div class="alibaba hui-ellipsis">76.32%</div>
+									</div>
+								</span>
+							</div>
+							<div class="alarm-tr">
+								<span class="tr-100">03</span>
+								<span class="tr-flex">3号楼</span>
+								<span class="tr-flex">进度计划进度计划进度计划</span>
+								<span class="tr-flex">
+									<div class="progress-item">
+										<div class="line">
+											<div class="progress" style="width: 44%;"></div>
+										</div>
+										<div class="alibaba hui-ellipsis">44%</div>
+									</div>
+								</span>
+							</div>
+							<div class="alarm-tr">
+								<span class="tr-100">04</span>
+								<span class="tr-flex">4号楼</span>
+								<span class="tr-flex">进度计划进度计划进度计划</span>
+								<span class="tr-flex">
+									<div class="progress-item">
+										<div class="line">
+											<div class="progress" style="width: 66%;"></div>
+										</div>
+										<div class="alibaba hui-ellipsis">66%</div>
+									</div>
+								</span>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="content-box" v-show="nowTitle.type === 7">
+					<div class="alarm-table-boxs">
+						<div class="alarm-title">
+							<div class="alarm-tr">
+								<span class="tr-100">序号</span>
+								<span class="tr-flex">单位工程</span>
+								<span class="tr-flex">本周协调的问题</span>
+								<span class="tr-80">级别</span>
+							</div>
+						</div>
+						<div class="alarm-table">
+							<div class="alarm-tr">
+								<span class="tr-100">01</span>
+								<span class="tr-flex">1号楼</span>
+								<span class="tr-flex">本周协调的问题本周协调的问题</span>
+								<span class="tr-80 color-red">重要</span>
+							</div>
+							<div class="alarm-tr">
+								<span class="tr-100">02</span>
+								<span class="tr-flex">2号楼</span>
+								<span class="tr-flex">本周协调的问题本周协调的问题</span>
+								<span class="tr-80 color-red">重要</span>
+							</div>
+							<div class="alarm-tr">
+								<span class="tr-100">03</span>
+								<span class="tr-flex">3号楼</span>
+								<span class="tr-flex">本周协调的问题本周协调的问题</span>
+								<span class="tr-80 color-red">重要</span>
+							</div>
+							<div class="alarm-tr">
+								<span class="tr-100">04</span>
+								<span class="tr-flex">4号楼</span>
+								<span class="tr-flex">本周协调的问题本周协调的问题</span>
+								<span class="tr-80 color-red">重要</span>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="content-box" v-show="nowTitle.type === 8">
+					<div class="image-list">
+						<div class="image-item">
+							<div class="image-box">
+								<img src="https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPng2ea93eeee135418ce92f968219509b6526e5c572c690e63b8f57430c7e9f4290"
+									alt="" />
+							</div>
+							<div class="label">运营图片</div>
+						</div>
+						<div class="image-item">
+							<div class="image-box">
+								<img src="https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPng2ea93eeee135418ce92f968219509b6526e5c572c690e63b8f57430c7e9f4290"
+									alt="" />
+							</div>
+							<div class="label">运营图片</div>
+						</div>
+						<div class="image-item">
+							<div class="image-box">
+								<img src="https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPng2ea93eeee135418ce92f968219509b6526e5c572c690e63b8f57430c7e9f4290"
+									alt="" />
+							</div>
+							<div class="label">运营图片</div>
+						</div>
+					</div>
+				</div>
+				<div class="content-box" v-show="nowTitle.type !== 6 && nowTitle.type !== 7 && nowTitle.type !== 8">
+					<div class="content-test">
+						<div class="test-item blue">
+							<div class="label">报警总数</div>
+							<div class="number alibaba">48</div>
+							<div class="icon">
+								<i class="iconfont huifont-zongshuliang"></i>
+							</div>
+						</div>
+						<div class="test-item green">
+							<div class="label">已处理</div>
+							<div class="number alibaba">44</div>
+							<div class="icon">
+								<i class="iconfont huifont-hege"></i>
+							</div>
+						</div>
+						<div class="test-item purple">
+							<div class="label">处理中</div>
+							<div class="number alibaba">4</div>
+							<div class="icon">
+								<i class="iconfont huifont-zhenggaizhong"></i>
+							</div>
+						</div>
+						<div class="test-item red">
+							<div class="label">未处理</div>
+							<div class="number alibaba">0</div>
+							<div class="icon">
+								<i class="iconfont huifont-buhege"></i>
+							</div>
+						</div>
+					</div>
+					<div class="content-chart">
+						<div class="legend-box">
+							<div class="legend-item">
+								<span class="legend-page" style="background:#2DB85C;"></span>
+								<span class="legend-name">已处理</span>
+							</div>
+							<div class="legend-item">
+								<span class="legend-page" style="background:#9D60FB;"></span>
+								<span class="legend-name">处理中</span>
+							</div>
+							<div class="legend-item">
+								<span class="legend-page" style="background:#F04243;"></span>
+								<span class="legend-name">未处理</span>
+							</div>
+						</div>
+						<div ref="chart1" class="chart-box"></div>
+					</div>
+					<div class="project-list">
+						<div class="project-item">
+							<div class="project-item-title">创业园区-1号楼</div>
+							<div class="project-test">
+								<div class="test-item blue">
+									<span>总数量</span>
+									<span class="alibaba number color-blue">28</span>
+								</div>
+								<div class="test-item green">
+									<span>已处理</span>
+									<span class="alibaba number color-green">22</span>
+								</div>
+								<div class="test-item purple">
+									<span>处理中</span>
+									<span class="alibaba number color-purple">6</span>
+								</div>
+								<div class="test-item red">
+									<span>未处理</span>
+									<span class="alibaba number color-red">0</span>
+								</div>
+							</div>
+							<div class="project-flow">
+								<div class="project-chart">
+									<div ref="chart2" class="pie-chart"></div>
+									<div class="chart-legend">
+										<div class="legend-item">
+											<span class="legend-bage"></span>
+											<span class="legend-label">周界报警</span>
+											<span class="legend-label">
+												<span class="alibaba">3</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+										<div class="legend-item">
+											<span class="legend-bage blue"></span>
+											<span class="legend-label">电子巡更</span>
+											<span class="legend-label">
+												<span class="alibaba">2</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+										<div class="legend-item">
+											<span class="legend-bage yellow"></span>
+											<span class="legend-label">消防设施</span>
+											<span class="legend-label">
+												<span class="alibaba">1</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+										<div class="legend-item">
+											<span class="legend-bage orange"></span>
+											<span class="legend-label">危险品</span>
+											<span class="legend-label">
+												<span class="alibaba">1</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+									</div>
+								</div>
+								<div class="flow-view">
+									<div class="flow-title"> {{nowTitle.name}}(4)</div>
+									<div class="flow-box">
+										<div class="flow-test">
+											<div class="flow-test-item">
+												<div class="label">总数量</div>
+												<div class="alibaba number color-blue">7</div>
+											</div>
+											<div class="flow-test-item">
+												<div class="label">已处理</div>
+												<div class="alibaba number color-green">7</div>
+											</div>
+											<div class="flow-test-item">
+												<div class="label">处理中</div>
+												<div class="alibaba number color-purple">0</div>
+											</div>
+											<div class="flow-test-item">
+												<div class="label">为处理</div>
+												<div class="alibaba number color-red">0</div>
+											</div>
+										</div>
+										<div class="flow-list">
+											<div class="flow-item">
+												<div class="flow-icon">
+													<div>1号楼</div>
+													<div>1F</div>
+												</div>
+												<div class="flow-content">
+													<div class="flow-name">
+														<span class="name">周界报警</span>
+														<div class="hui-tag hui-tag-success">合格</div>
+													</div>
+													<div class="date">2020-01-01</div>
+												</div>
+												<span class="color-primary">查看详情</span>
+											</div>
+											<div class="flow-item">
+												<div class="flow-icon">
+													<div>1号楼</div>
+													<div>2F</div>
+												</div>
+												<div class="flow-content">
+													<div class="flow-name">
+														<span class="name">周界报警</span>
+														<div class="hui-tag hui-tag-success">合格</div>
+													</div>
+													<div class="date">2020-01-01</div>
+												</div>
+												<span class="color-primary">查看详情</span>
+											</div>
+											<div class="flow-item">
+												<div class="flow-icon">
+													<div>1号楼</div>
+													<div>3F</div>
+												</div>
+												<div class="flow-content">
+													<div class="flow-name">
+														<span class="name">周界报警</span>
+														<div class="hui-tag hui-tag-success">合格</div>
+													</div>
+													<div class="date">2020-01-01</div>
+												</div>
+												<span class="color-primary">查看详情</span>
+											</div>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="project-item">
+							<div class="project-item-title">创业园区-2号楼</div>
+							<div class="project-test">
+								<div class="test-item blue">
+									<span>总数量</span>
+									<span class="alibaba number color-blue">28</span>
+								</div>
+								<div class="test-item green">
+									<span>已处理</span>
+									<span class="alibaba number color-green">22</span>
+								</div>
+								<div class="test-item purple">
+									<span>处理中</span>
+									<span class="alibaba number color-purple">6</span>
+								</div>
+								<div class="test-item red">
+									<span>未处理</span>
+									<span class="alibaba number color-red">0</span>
+								</div>
+							</div>
+							<div class="project-flow">
+								<div class="project-chart">
+									<div ref="chart3" class="pie-chart"></div>
+									<div class="chart-legend">
+										<div class="legend-item">
+											<span class="legend-bage"></span>
+											<span class="legend-label">周界报警</span>
+											<span class="legend-label">
+												<span class="alibaba">3</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+										<div class="legend-item">
+											<span class="legend-bage blue"></span>
+											<span class="legend-label">电子巡更</span>
+											<span class="legend-label">
+												<span class="alibaba">2</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+										<div class="legend-item">
+											<span class="legend-bage yellow"></span>
+											<span class="legend-label">消防设施</span>
+											<span class="legend-label">
+												<span class="alibaba">1</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+										<div class="legend-item">
+											<span class="legend-bage orange"></span>
+											<span class="legend-label">危险品</span>
+											<span class="legend-label">
+												<span class="alibaba">1</span>
+												<span class="unit">条</span>
+											</span>
+										</div>
+									</div>
+								</div>
+								<div class="flow-view">
+									<div class="flow-title"> {{nowTitle.name}}(4)</div>
+									<div class="flow-box">
+										<div class="flow-test">
+											<div class="flow-test-item">
+												<div class="label">总数量</div>
+												<div class="alibaba number color-blue">7</div>
+											</div>
+											<div class="flow-test-item">
+												<div class="label">已处理</div>
+												<div class="alibaba number color-green">7</div>
+											</div>
+											<div class="flow-test-item">
+												<div class="label">处理中</div>
+												<div class="alibaba number color-purple">0</div>
+											</div>
+											<div class="flow-test-item">
+												<div class="label">为处理</div>
+												<div class="alibaba number color-red">0</div>
+											</div>
+										</div>
+										<div class="flow-list">
+											<div class="flow-item">
+												<div class="flow-icon">
+													<div>2号楼</div>
+													<div>1F</div>
+												</div>
+												<div class="flow-content">
+													<div class="flow-name">
+														<span class="name">周界报警</span>
+														<div class="hui-tag hui-tag-success">合格</div>
+													</div>
+													<div class="date">2020-01-01</div>
+												</div>
+												<span class="color-primary">查看详情</span>
+											</div>
+											<div class="flow-item">
+												<div class="flow-icon">
+													<div>2号楼</div>
+													<div>2F</div>
+												</div>
+												<div class="flow-content">
+													<div class="flow-name">
+														<span class="name">周界报警</span>
+														<div class="hui-tag hui-tag-success">合格</div>
+													</div>
+													<div class="date">2020-01-01</div>
+												</div>
+												<span class="color-primary">查看详情</span>
+											</div>
+											<div class="flow-item">
+												<div class="flow-icon">
+													<div>2号楼</div>
+													<div>3F</div>
+												</div>
+												<div class="flow-content">
+													<div class="flow-name">
+														<span class="name">周界报警</span>
+														<div class="hui-tag hui-tag-success">合格</div>
+													</div>
+													<div class="date">2020-01-01</div>
+												</div>
+												<span class="color-primary">查看详情</span>
+											</div>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="week-common">
+				<div class="week-detail">
+					<div class="detail-title">
+						<div class="title">
+							<div class="icon">
+								第一周
+							</div>
+							<div class="name">项目工程周报</div>
+						</div>
+						<div class="detail-date">
+							2023-10-31至2023-11-07
+						</div>
+					</div>
+					<div class="detail-list">
+						<div class="detail-item">
+							<div class="key">项目编号</div>
+							<div class="value">001</div>
+						</div>
+						<div class="detail-item">
+							<div class="key">编制单位</div>
+							<div class="value">温州新能源制造有限公司</div>
+						</div>
+						<div class="detail-item">
+							<div class="key">项目经理</div>
+							<div class="value">周大生</div>
+						</div>
+						<div class="detail-item">
+							<div class="key">生成日期</div>
+							<div class="value">2023年11月07日</div>
+						</div>
+					</div>
+				</div>
+				<div class="week-wather">
+					<div class="wather-item" v-for="(item,index) in weekWeatherList" :key="index">
+						<div class="label">{{returnWeekDate(item.week)}}</div>
+						<div class="label">{{$dayjs(item.date).format('MM/DD')}}</div>
+						<div class="wather-icon">
+							<weather-icon :name="item.dayweatherIcon" width="20" height="20"></weather-icon>
+						</div>
+						<div class="label">{{item.dayweather}}</div>
+						<div class="label">{{item.nighttemp}}~{{item.daytemp}}°C</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import weatherIcon from '@/components/common/weatherIcon'
+	import Crypto from '@/uitls/crypto'
+	import {
+		getWeekDetailById
+	} from '@/httpApi/operation'
+	import {
+		pinyin
+	} from 'pinyin-pro';
+	export default {
+		data() {
+			return {
+				titleList: [],
+				nowTitle: {},
+				detailId: '',
+				weekWeatherList: []
+			}
+		},
+		components: {
+			weatherIcon
+		},
+		created() {
+			this.detailId = Crypto.AES.decrypt(decodeURIComponent(this.$route.query.id), 'bosshand');
+			if (!this.detailId) return;
+			this.init();
+		},
+		methods: {
+			init() {
+				getWeekDetailById(this.detailId).then(res => {
+					if (res.state) {
+						let list = res.data.filter(node => node.name != '天气情况' && node.name != '周报文档')
+						this.nowTitle = list[0];
+						this.titleList = list;
+						if (res.data[0].data) {
+							let weatherList = [];
+							for (let i = 0; i < JSON.parse(res.data[0].data).length; i++) {
+								let casts = JSON.parse(JSON.parse(res.data[0].data)[i].weather).forecasts[0].casts;
+								let nowDateWearther = casts.filter(node => node.date === JSON.parse(res.data[0]
+									.data)[i].date)[0];
+								nowDateWearther['dayweatherIcon'] = pinyin(nowDateWearther.dayweather, {
+									toneType: 'none',
+								}).replaceAll(' ', '');
+								weatherList.push(nowDateWearther);
+							}
+							this.weekWeatherList = weatherList.splice(0, 7);
+						}
+						this.initChart();
+					}
+				})
+			},
+			initChart() {
+				this.$nextTick(() => {
+					this.chart(this.$refs.chart1, [
+						[1, 3, 2, 6, 1, 1, 3],
+						[2, 3, 1, 4, 4, 2, 3],
+						[3, 4, 3, 4, 5, 3, 2]
+					], ['#2DB85C', '#9D60FB', '#F04243'], ['2023-12-1', '2023-12-2', '2023-12-3',
+						'2023-12-4',
+						'2023-12-5', '2023-12-6', '2023-12-7'
+					])
+					this.charts(this.$refs.chart2);
+					this.charts(this.$refs.chart3);
+				})
+			},
+			returnWeekDate(week) {
+				let str = '-';
+				switch (week) {
+					case '1':
+						str = '周一'
+						break;
+					case '2':
+						str = '周二'
+						break;
+					case '3':
+						str = '周三'
+						break;
+					case '4':
+						str = '周四'
+						break;
+					case '5':
+						str = '周五'
+						break;
+					case '6':
+						str = '周六'
+						break;
+					case '7':
+						str = '周日'
+						break;
+					default:
+						break;
+				}
+				return str;
+			},
+			charts(elem) {
+				let chart = echarts.init(elem);
+				let title = '周界报警',
+					len = "42.86"
+				let option = {
+					title: {
+						text: ("{name|" + title + "}" + "\n{percent|" + len + "}{name|%}"),
+						left: 'center',
+						top: 'center',
+						textStyle: {
+							rich: {
+								name: {
+									color: "rgba(255,255,255,0.6)",
+									fontSize: 12,
+									lineHeight: 16
+								},
+								percent: {
+									color: "#fff",
+									fontSize: 28,
+									lineHeight: 34,
+									fontFamily: 'alibabaMedium'
+								},
+							}
+						}
+					},
+					color: ['#73DEB3', '#73A0FA', '#F7C739', '#EB7E65'],
+					series: [{
+						type: 'pie',
+						center: ['50%', '50%'],
+						radius: ['60%', '90%'],
+						avoidLabelOverlap: false,
+						itemStyle: {
+							borderColor: '#0E131C',
+							borderWidth: 5
+						},
+						label: {
+							show: false,
+							position: 'center'
+						},
+						emphasis: {
+							label: {
+								show: true,
+								formatter: (params) => {
+									return ("{name|" + params.name + "}" + "\n{percent|" +
+										params.percent.toFixed(2) + "}{name|%}");
+								},
+								rich: {
+									name: {
+										color: "rgba(255,255,255,0.6)",
+										fontSize: 12,
+										lineHeight: 16
+									},
+									percent: {
+										color: "#fff",
+										fontSize: 28,
+										lineHeight: 34,
+										fontFamily: 'alibabaMedium'
+									},
+								}
+							},
+						},
+						labelLine: {
+							show: false
+						},
+						data: [{
+								value: 3,
+								name: "周界报警"
+							},
+							{
+								value: 2,
+								name: "电子巡更"
+							},
+							{
+								value: 1,
+								name: "消防设施"
+							},
+							{
+								value: 1,
+								name: "危险品"
+							}
+						]
+					}]
+				};
+				chart.setOption(option);
+				// 高亮时
+				chart.on('highlight', (e) => {
+					chart.setOption({
+						title: {
+							show: false
+						}
+					});
+				});
+				// 取消高亮时
+				chart.on('downplay', (e) => {
+					chart.setOption({
+						title: {
+							show: true
+						}
+					});
+				});
+				// 鼠标移入数据时
+				chart.on('mouseover', {
+					componentType: 'series',
+					seriesType: 'pie'
+				}, (params) => {
+					chart.setOption({
+						title: {
+							show: false
+						}
+					});
+				});
+				// 鼠标移出数据时
+				chart.on('mouseout', {
+					componentType: 'series',
+					seriesType: 'pie'
+				}, (params) => {
+					chart.setOption({
+						title: {
+							show: true
+						}
+					});
+				});
+			},
+			chart(elem, data, color, x) {
+				let chart = echarts.init(elem);
+				let series = [];
+				for (var i = 0; i < data.length; i++) {
+					series = series.concat([{
+						data: data[i],
+						type: 'line',
+						symbolSize: 6,
+						color: color[i],
+						lineStyle: {
+							width: 1
+						},
+						z: 99
+					}, {
+						data: data[i],
+						type: 'line',
+						showSymbol: false,
+						label: {
+							show: true,
+							color: '#D0DEEE'
+						},
+						lineStyle: {
+							width: 1
+						},
+						color: color[i],
+						z: 99
+					}]);
+				}
+				let option = {
+					tooltip: {
+						show: true,
+						trigger: 'axis',
+						formatter: function() {
+							return ''
+						},
+						backgroundColor: 'rgba(255,255,255,0)',
+						borderWidth: 0,
+						padding: 0,
+						axisPointer: {
+							lineStyle: {
+								type: 'solid',
+								color: '#4E5561',
+							}
+						}
+					},
+					grid: {
+						left: '15',
+						top: '30',
+						right: '15',
+						bottom: '25',
+						containLabel: true
+					},
+					xAxis: {
+						type: 'category',
+						data: x,
+						axisLabel: {
+							margin: 4,
+							color: '#D0DEEE',
+							fontSize: 12
+						},
+						boundaryGap: true,
+						axisLine: {
+							lineStyle: {
+								color: '#6C8097'
+							}
+						},
+						axisTick: {
+							show: false
+						}
+					},
+					yAxis: {
+						name: '数量',
+						type: 'value',
+						nameTextStyle: {
+							color: '#D0DEEE',
+							fontSize: 12,
+							align: 'right',
+						},
+						axisLabel: {
+							margin: 10,
+							color: '#D0DEEE',
+							fontSize: 12
+						},
+						splitLine: {
+							show: true,
+							lineStyle: {
+								color: 'rgba(108,128,151,0.3)',
+								type: 'dashed'
+							}
+						}
+					},
+					series: series
+				};
+				chart.setOption(option);
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import '@/assets/scss/week.scss'
+</style>

File diff suppressed because it is too large
+ 79 - 1386
virgo.wzfrontend/console/src/views/work/operation/week/organization.vue


File diff suppressed because it is too large
+ 82 - 1061
virgo.wzfrontend/console/src/views/work/operation/week/part.vue


File diff suppressed because it is too large
+ 82 - 1061
virgo.wzfrontend/console/src/views/work/operation/week/work.vue


+ 221 - 0
virgo.wzfrontend/console/src/views/work/property/change.vue

@@ -0,0 +1,221 @@
+<template>
+	<div class="hui-flex">
+		<div class="hui-flex-box yui-tree-box">
+			<div class="hui-left-tree">
+				<div class="hui-left-tree-title">
+					<svg-icon name="zhuangshi" width="16" height="20"></svg-icon>
+					<span class="hui-left-tree-sub">资产列表</span>
+				</div>
+				<div class="hui-left-tree-content">
+					<el-collapse>
+						<el-collapse-item v-for="item in treeData" :key="item.id">
+							<template slot="title">
+								<i class="iconfont huifont-shuzhuangcaidantubiao"></i>
+								<span class="el-collapse-name">{{item.name}}</span>
+							</template>
+							<div>
+								<el-tree :data="item.children" :props="defaultProps" :expand-on-click-node="false">
+								</el-tree>
+							</div>
+						</el-collapse-item>
+					</el-collapse>
+				</div>
+			</div>
+			<div class="hui-tree-content">
+				<div class="hui-flex hui-content box-background">
+					<div class="hui-content-title">
+						<div class="hui-title-item active">资产变更</div>
+					</div>
+					<div class="hui-flex-box hui-flex hui-table">
+						<div class="hui-content-insert">
+							<el-button type="primary" size="medium" @click="insert">新增变更</el-button>
+						</div>
+						<div class="hui-flex-box">
+							<el-table :data="tableData" row-key="id" border height="100%">
+								<el-table-column label="序号" width="50">
+									<template slot-scope="scope">
+										<div style="text-align: center;">{{scope.$index + 1}}</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="资产名称" prop="name"></el-table-column>
+								<el-table-column label="单位工程" prop="projectItemName"></el-table-column>
+								<el-table-column label="具体位置" prop="projectItemTargetName"></el-table-column>
+								<el-table-column label="空间位置" prop="projectItemTargetRoomName"></el-table-column>
+								<el-table-column label="创建者" prop="createdByUserName"></el-table-column>
+								<el-table-column label="状态">
+									<template slot-scope="scope">
+										<div v-if="scope.row.state == -1 || scope.row.state == 1" class="hui-state">
+											<span class="hui-state-bage hui-state-primary"></span>
+											<span class="hui-state-label">待审核</span>
+										</div>
+										<div v-if="scope.row.state == 2" class="hui-state">
+											<span class="hui-state-bage hui-state-info"></span>
+											<span class="hui-state-label">审核中</span>
+										</div>
+										<div v-if="scope.row.state == 3" class="hui-state">
+											<span class="hui-state-bage hui-state-success"></span>
+											<span class="hui-state-label">通过</span>
+										</div>
+										<div v-if="scope.row.state == 4" class="hui-state">
+											<span class="hui-state-bage hui-state-error"></span>
+											<span class="hui-state-label">未通过</span>
+										</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="操作" width="150">
+									<template slot-scope="scope">
+										<div class="hui-table-operation">
+											<span class="table-operation" @click="lookFlow(scope.row)">
+												详情
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="updateFlow(scope.row)">
+												编辑
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="deleteFlow(scope.row)">
+												删除
+											</span>
+										</div>
+									</template>
+								</el-table-column>
+								<template slot="empty">
+									<empty description="暂无数据"></empty>
+								</template>
+							</el-table>
+						</div>
+						<div class="hui-content-pagination">
+							<el-pagination :pager-count="9" layout="prev, pager, next" :total="totalCount"
+								@current-change="currentChange">
+							</el-pagination>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<el-dialog :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="1200px" :append-to-body="true">
+			<flow-form v-if="visible" :isUpdate="isUpdate" @callback="callback" :detailId="detailId"
+				:flowType="flowType">
+			</flow-form>
+		</el-dialog>
+		<el-drawer title="流程详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<flow-detail v-if="drawer" @callback="callback" :detailId="detailId"></flow-detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		initDevicePartList,
+		getDevicePartList,
+		getFlowList,
+		deleteFlow
+	} from '@/httpApi/property'
+	import flowForm from '@/components/flow/flowForm'
+	import flowDetail from '@/components/flow/flowDetail'
+	export default {
+		data() {
+			return {
+				flowType: 2,
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				treeData: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name'
+				},
+				visible: false,
+				isUpdate: false,
+				detailId: '',
+				drawer: false
+			}
+		},
+		created() {
+			this.initDeviceList();
+			this.init();
+		},
+		methods: {
+			init() {
+				getFlowList(this.currPage, this.pageSize, {
+					projectId: this.$store.getters.project.id,
+					flowType: this.flowType
+				}).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList.map(node => {
+							node = Object.assign(node, JSON.parse(node.flowData));
+							return node;
+						});;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			initDeviceList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						if (res.data.length === 0) {
+							initDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id)
+								.then(res => {
+									if (res.state) this.initDevicePartList();
+								})
+						} else {
+							this.treeData = res.data;
+							this.returnChildren(this.treeData);
+						}
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insert() {
+				this.visible = true;
+				this.isUpdate = false;
+			},
+			lookFlow(val) {
+				this.detailId = val.id;
+				this.drawer = true;
+			},
+			updateFlow(val) {
+				this.detailId = val.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			deleteFlow(val) {
+				this.$confirm('确定要删除该流程?', () => {
+					deleteFlow(val.id).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				this.visible = false;
+				if (type === 'init') this.init();
+			}
+		},
+		components: {
+			flowForm,
+			flowDetail
+		},
+	}
+</script>
+
+<style lang="scss"></style>

+ 225 - 0
virgo.wzfrontend/console/src/views/work/property/depreciation.vue

@@ -0,0 +1,225 @@
+<template>
+	<div class="hui-flex">
+		<div class="hui-flex-box yui-tree-box">
+			<div class="hui-left-tree">
+				<div class="hui-left-tree-title">
+					<svg-icon name="zhuangshi" width="16" height="20"></svg-icon>
+					<span class="hui-left-tree-sub">资产列表</span>
+				</div>
+				<div class="hui-left-tree-content">
+					<el-collapse>
+						<el-collapse-item v-for="item in treeData" :key="item.id">
+							<template slot="title">
+								<i class="iconfont huifont-shuzhuangcaidantubiao"></i>
+								<span class="el-collapse-name">{{item.name}}</span>
+							</template>
+							<div>
+								<el-tree :data="item.children" :props="defaultProps" :expand-on-click-node="false">
+								</el-tree>
+							</div>
+						</el-collapse-item>
+					</el-collapse>
+				</div>
+			</div>
+			<div class="hui-tree-content">
+				<div class="hui-flex hui-content box-background">
+					<div class="hui-content-title">
+						<div class="hui-title-item active">资产折旧</div>
+					</div>
+					<div class="hui-flex-box hui-flex hui-table">
+						<div class="hui-content-insert">
+							<el-button type="primary" size="medium" @click="insert">新增折旧</el-button>
+						</div>
+						<div class="hui-flex-box">
+							<el-table :data="tableData" row-key="id" border height="100%">
+								<el-table-column label="序号" width="50">
+									<template slot-scope="scope">
+										<div style="text-align: center;">{{scope.$index + 1}}</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="资产名称" prop="name"></el-table-column>
+								<el-table-column label="折旧内容" prop="depreciationContent"></el-table-column>
+								<el-table-column label="折旧描述" prop="remark"></el-table-column>
+								<el-table-column label="创建者" prop="createdByUserName"></el-table-column>
+								<el-table-column label="状态">
+									<template slot-scope="scope">
+										<div v-if="scope.row.state == -1 || scope.row.state == 1" class="hui-state">
+											<span class="hui-state-bage hui-state-primary"></span>
+											<span class="hui-state-label">待审核</span>
+										</div>
+										<div v-if="scope.row.state == 2" class="hui-state">
+											<span class="hui-state-bage hui-state-info"></span>
+											<span class="hui-state-label">审核中</span>
+										</div>
+										<div v-if="scope.row.state == 3" class="hui-state">
+											<span class="hui-state-bage hui-state-success"></span>
+											<span class="hui-state-label">通过</span>
+										</div>
+										<div v-if="scope.row.state == 4" class="hui-state">
+											<span class="hui-state-bage hui-state-error"></span>
+											<span class="hui-state-label">未通过</span>
+										</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="操作" width="150">
+									<template slot-scope="scope">
+										<div class="hui-table-operation">
+											<span class="table-operation" @click="lookFlow(scope.row)">
+												详情
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="updateFlow(scope.row)">
+												编辑
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="deleteFlow(scope.row)">
+												删除
+											</span>
+										</div>
+									</template>
+								</el-table-column>
+								<template slot="empty">
+									<empty description="暂无数据"></empty>
+								</template>
+							</el-table>
+						</div>
+						<div class="hui-content-pagination">
+							<el-pagination :pager-count="9" layout="prev, pager, next" :total="totalCount"
+								@current-change="currentChange">
+							</el-pagination>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<el-dialog :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="1200px" :append-to-body="true">
+			<flow-form v-if="visible" :isUpdate="isUpdate" @callback="callback" :detailId="detailId"
+				:flowType="flowType">
+			</flow-form>
+		</el-dialog>
+		<el-drawer title="流程详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<flow-detail v-if="drawer" @callback="callback" :detailId="detailId"></flow-detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		initDevicePartList,
+		getDevicePartList,
+		getFlowList,
+		deleteFlow
+	} from '@/httpApi/property'
+	import flowForm from '@/components/flow/flowForm'
+	import flowDetail from '@/components/flow/flowDetail'
+	export default {
+		data() {
+			return {
+				flowType: 3,
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				treeData: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name'
+				},
+				visible: false,
+				isUpdate: false,
+				detailId: '',
+				drawer: false
+			}
+		},
+		created() {
+			getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+				if (res.state) {
+					if (res.data.length === 0) {
+						initDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id)
+							.then(res => {
+								if (res.state) {
+									getDevicePartList(this.$store.getters.organization.id, this.$store.getters
+										.project.id).then(res => {
+										if (res.state) {
+											this.treeData = res.data;
+											this.returnChildren(this.treeData);
+										}
+									})
+								}
+							})
+					} else {
+						this.treeData = res.data;
+						this.returnChildren(this.treeData);
+					}
+				}
+			})
+			this.init();
+		},
+		methods: {
+			init() {
+				getFlowList(this.currPage, this.pageSize, {
+					projectId: this.$store.getters.project.id,
+					flowType: this.flowType
+				}).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList.map(node => {
+							node = Object.assign(node, JSON.parse(node.flowData));
+							return node;
+						});;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insert() {
+				this.visible = true;
+				this.isUpdate = false;
+			},
+			lookFlow(val) {
+				this.detailId = val.id;
+				this.drawer = true;
+			},
+			updateFlow(val) {
+				this.detailId = val.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			deleteFlow(val) {
+				this.$confirm('确定要删除该流程?', () => {
+					deleteFlow(val.id).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				this.visible = false;
+				if (type === 'init') this.init();
+			}
+		},
+		components: {
+			flowForm,
+			flowDetail
+		},
+	}
+</script>
+
+<style lang="scss"></style>

+ 220 - 0
virgo.wzfrontend/console/src/views/work/property/inventory.vue

@@ -0,0 +1,220 @@
+<template>
+	<div class="hui-flex">
+		<div class="hui-flex-box yui-tree-box">
+			<div class="hui-left-tree">
+				<div class="hui-left-tree-title">
+					<svg-icon name="zhuangshi" width="16" height="20"></svg-icon>
+					<span class="hui-left-tree-sub">资产列表</span>
+				</div>
+				<div class="hui-left-tree-content">
+					<el-collapse>
+						<el-collapse-item v-for="item in treeData" :key="item.id">
+							<template slot="title">
+								<i class="iconfont huifont-shuzhuangcaidantubiao"></i>
+								<span class="el-collapse-name">{{item.name}}</span>
+							</template>
+							<div>
+								<el-tree :data="item.children" :props="defaultProps" :expand-on-click-node="false">
+								</el-tree>
+							</div>
+						</el-collapse-item>
+					</el-collapse>
+				</div>
+			</div>
+			<div class="hui-tree-content">
+				<div class="hui-flex hui-content box-background">
+					<div class="hui-content-title">
+						<div class="hui-title-item active">资产盘点</div>
+					</div>
+					<div class="hui-flex-box hui-flex hui-table">
+						<div class="hui-content-insert">
+							<el-button type="primary" size="medium" @click="insert">新增盘点</el-button>
+						</div>
+						<div class="hui-flex-box">
+							<el-table :data="tableData" row-key="id" border height="100%">
+								<el-table-column label="序号" width="50">
+									<template slot-scope="scope">
+										<div style="text-align: center;">{{scope.$index + 1}}</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="资产名称" prop="name"></el-table-column>
+								<el-table-column label="盘点内容" prop="depreciationContent"></el-table-column>
+								<el-table-column label="盘点描述" prop="remark"></el-table-column>
+								<el-table-column label="创建者" prop="createdByUserName"></el-table-column>
+								<el-table-column label="状态">
+									<template slot-scope="scope">
+										<div v-if="scope.row.state == -1 || scope.row.state == 1" class="hui-state">
+											<span class="hui-state-bage hui-state-primary"></span>
+											<span class="hui-state-label">待审核</span>
+										</div>
+										<div v-if="scope.row.state == 2" class="hui-state">
+											<span class="hui-state-bage hui-state-info"></span>
+											<span class="hui-state-label">审核中</span>
+										</div>
+										<div v-if="scope.row.state == 3" class="hui-state">
+											<span class="hui-state-bage hui-state-success"></span>
+											<span class="hui-state-label">通过</span>
+										</div>
+										<div v-if="scope.row.state == 4" class="hui-state">
+											<span class="hui-state-bage hui-state-error"></span>
+											<span class="hui-state-label">未通过</span>
+										</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="操作" width="150">
+									<template slot-scope="scope">
+										<div class="hui-table-operation">
+											<span class="table-operation" @click="lookFlow(scope.row)">
+												详情
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="updateFlow(scope.row)">
+												编辑
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="deleteFlow(scope.row)">
+												删除
+											</span>
+										</div>
+									</template>
+								</el-table-column>
+								<template slot="empty">
+									<empty description="暂无数据"></empty>
+								</template>
+							</el-table>
+						</div>
+						<div class="hui-content-pagination">
+							<el-pagination :pager-count="9" layout="prev, pager, next" :total="totalCount"
+								@current-change="currentChange">
+							</el-pagination>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<el-dialog :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="1200px" :append-to-body="true">
+			<flow-form v-if="visible" :isUpdate="isUpdate" @callback="callback" :detailId="detailId"
+				:flowType="flowType">
+			</flow-form>
+		</el-dialog>
+		<el-drawer title="流程详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<flow-detail v-if="drawer" @callback="callback" :detailId="detailId"></flow-detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		initDevicePartList,
+		getDevicePartList,
+		getFlowList,
+		deleteFlow
+	} from '@/httpApi/property'
+	import flowForm from '@/components/flow/flowForm'
+	import flowDetail from '@/components/flow/flowDetail'
+	export default {
+		data() {
+			return {
+				flowType: 4,
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				treeData: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name'
+				},
+				visible: false,
+				isUpdate: false,
+				detailId: '',
+				drawer: false
+			}
+		},
+		created() {
+			this.initDeviceList();
+			this.init();
+		},
+		methods: {
+			init() {
+				getFlowList(this.currPage, this.pageSize, {
+					projectId: this.$store.getters.project.id,
+					flowType: this.flowType
+				}).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList.map(node => {
+							node = Object.assign(node, JSON.parse(node.flowData));
+							return node;
+						});;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			initDeviceList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						if (res.data.length === 0) {
+							initDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id)
+								.then(res => {
+									if (res.state) this.initDevicePartList();
+								})
+						} else {
+							this.treeData = res.data;
+							this.returnChildren(this.treeData);
+						}
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insert() {
+				this.visible = true;
+				this.isUpdate = false;
+			},
+			lookFlow(val) {
+				this.detailId = val.id;
+				this.drawer = true;
+			},
+			updateFlow(val) {
+				this.detailId = val.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			deleteFlow(val) {
+				this.$confirm('确定要删除该流程?', () => {
+					deleteFlow(val.id).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				this.visible = false;
+				if (type === 'init') this.init();
+			}
+		},
+		components: {
+			flowForm,
+			flowDetail
+		},
+	}
+</script>
+
+<style lang="scss"></style>

+ 224 - 0
virgo.wzfrontend/console/src/views/work/property/register.vue

@@ -0,0 +1,224 @@
+<template>
+	<div class="hui-flex">
+		<div class="hui-flex-box yui-tree-box">
+			<div class="hui-left-tree">
+				<div class="hui-left-tree-title">
+					<svg-icon name="zhuangshi" width="16" height="20"></svg-icon>
+					<span class="hui-left-tree-sub">资产列表</span>
+				</div>
+				<div class="hui-left-tree-content">
+					<el-collapse>
+						<el-collapse-item v-for="item in treeData" :key="item.id">
+							<template slot="title">
+								<i class="iconfont huifont-shuzhuangcaidantubiao"></i>
+								<span class="el-collapse-name">{{item.name}}</span>
+							</template>
+							<div>
+								<el-tree :data="item.children" :props="defaultProps" :expand-on-click-node="false">
+								</el-tree>
+							</div>
+						</el-collapse-item>
+					</el-collapse>
+				</div>
+			</div>
+			<div class="hui-tree-content">
+				<div class="hui-flex hui-content box-background">
+					<div class="hui-content-title">
+						<div class="hui-title-item active">资产登记</div>
+					</div>
+					<div class="hui-flex-box hui-flex hui-table">
+						<div class="hui-content-insert">
+							<el-button type="primary" size="medium" @click="insert">新增登记</el-button>
+						</div>
+						<div class="hui-flex-box">
+							<el-table :data="tableData" row-key="id" border height="100%">
+								<el-table-column label="序号" width="50">
+									<template slot-scope="scope">
+										<div style="text-align: center;">{{scope.$index + 1}}</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="资产名称" prop="name"></el-table-column>
+								<el-table-column label="单位工程" prop="projectItemName"></el-table-column>
+								<el-table-column label="具体位置" prop="projectItemTargetName"></el-table-column>
+								<el-table-column label="创建者" prop="createdByUserName"></el-table-column>
+								<el-table-column label="状态">
+									<template slot-scope="scope">
+										<div v-if="!scope.row.state" class="hui-state">
+											<span class="hui-state-bage hui-state-primary"></span>
+											<span class="hui-state-label">待生成</span>
+										</div>
+										<div v-if="scope.row.state == -1 || scope.row.state == 1" class="hui-state">
+											<span class="hui-state-bage hui-state-primary"></span>
+											<span class="hui-state-label">待审核</span>
+										</div>
+										<div v-if="scope.row.state == 2" class="hui-state">
+											<span class="hui-state-bage hui-state-info"></span>
+											<span class="hui-state-label">审核中</span>
+										</div>
+										<div v-if="scope.row.state == 3" class="hui-state">
+											<span class="hui-state-bage hui-state-success"></span>
+											<span class="hui-state-label">通过</span>
+										</div>
+										<div v-if="scope.row.state == 4" class="hui-state">
+											<span class="hui-state-bage hui-state-error"></span>
+											<span class="hui-state-label">未通过</span>
+										</div>
+									</template>
+								</el-table-column>
+								<el-table-column label="操作" width="150">
+									<template slot-scope="scope">
+										<div class="hui-table-operation">
+											<span class="table-operation" @click="lookFlow(scope.row)">
+												详情
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="updateFlow(scope.row)">
+												编辑
+											</span>
+											<span class="table-operation" v-if="!scope.row.projectFlowId"
+												@click="deleteFlow(scope.row)">
+												删除
+											</span>
+										</div>
+									</template>
+								</el-table-column>
+								<template slot="empty">
+									<empty description="暂无数据"></empty>
+								</template>
+							</el-table>
+						</div>
+						<div class="hui-content-pagination">
+							<el-pagination :pager-count="9" layout="prev, pager, next" :total="totalCount"
+								@current-change="currentChange">
+							</el-pagination>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<el-dialog :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="1200px" :append-to-body="true">
+			<flow-form v-if="visible" :isUpdate="isUpdate" @callback="callback" :detailId="detailId"
+				:flowType="flowType">
+			</flow-form>
+		</el-dialog>
+		<el-drawer title="流程详情" :visible.sync="drawer" :size="400" :append-to-body="true">
+			<flow-detail v-if="drawer" @callback="callback" :detailId="detailId"></flow-detail>
+		</el-drawer>
+	</div>
+</template>
+
+<script>
+	import {
+		initDevicePartList,
+		getDevicePartList,
+		getFlowList,
+		deleteFlow
+	} from '@/httpApi/property'
+	import flowForm from '@/components/flow/flowForm'
+	import flowDetail from '@/components/flow/flowDetail'
+	export default {
+		data() {
+			return {
+				flowType: 1,
+				tableData: [],
+				currPage: 1,
+				pageSize: 10,
+				totalCount: 0,
+				treeData: [],
+				defaultProps: {
+					children: 'children',
+					label: 'name'
+				},
+				visible: false,
+				isUpdate: false,
+				detailId: '',
+				drawer: false
+			}
+		},
+		created() {
+			this.initDeviceList();
+			this.init();
+		},
+		methods: {
+			init() {
+				getFlowList(this.currPage, this.pageSize, {
+					projectId: this.$store.getters.project.id,
+					flowType: this.flowType
+				}).then(res => {
+					if (res.state) {
+						this.tableData = res.data.dataList.map(node => {
+							node = Object.assign(node, JSON.parse(node.flowData));
+							return node;
+						});;
+						this.totalCount = res.data.totalCount;
+					}
+				})
+			},
+			initDeviceList() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						if (res.data.length === 0) {
+							initDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id)
+								.then(res => {
+									if (res.state) this.init();
+								})
+						} else {
+							this.treeData = res.data;
+							this.returnChildren(this.treeData);
+						}
+					}
+				})
+			},
+			returnChildren(data) {
+				data.forEach(item => {
+					if (item.children && item.deviceList) {
+						let obj = item.deviceList.map(res => {
+							res['deviceId'] = res.id;
+							res['id'] = -res.id;
+							return res;
+						})
+						item.children = item.children.concat(obj);
+					}
+					if (item.children && item.children.length > 0) this.returnChildren(item.children);
+				});
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insert() {
+				this.visible = true;
+				this.isUpdate = false;
+			},
+			lookFlow(val) {
+				this.detailId = val.id;
+				this.drawer = true;
+			},
+			updateFlow(val) {
+				this.detailId = val.id;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			deleteFlow(val) {
+				this.$confirm('确定要删除该流程?', () => {
+					deleteFlow(val.id).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				this.visible = false;
+				if (type === 'init') this.init();
+			}
+		},
+		components: {
+			flowForm,
+			flowDetail
+		},
+	}
+</script>
+
+<style lang="scss"></style>

+ 125 - 0
virgo.wzfrontend/console/src/views/work/property/set.vue

@@ -0,0 +1,125 @@
+<template>
+	<div class="hui-flex hui-content">
+		<div class="hui-content-title">
+			<div class="hui-title-item active">资产设置</div>
+		</div>
+		<div class="hui-flex-box hui-flex hui-table">
+			<div class="hui-content-insert">
+				<el-button type="primary" size="medium" @click="insertDepartment({})">新建资产</el-button>
+			</div>
+			<div class="hui-flex-box">
+				<el-table :data="treeData" row-key="id" border height="100%">
+					<el-table-column label="资产名称" prop="name"></el-table-column>
+					<el-table-column label="操作" width="240">
+						<template slot-scope="scope">
+							<div class="hui-table-operation">
+								<span class="table-operation" @click="insertDepartment(scope.row)">
+									添加子资产
+								</span>
+								<span class="table-operation" v-if="!scope.row.isp"
+									@click="updateDepartment(scope.row)">
+									编辑
+								</span>
+								<span class="table-operation" v-if="!scope.row.isp"
+									@click="deleteDepartment(scope.row)">
+									删除
+								</span>
+							</div>
+						</template>
+					</el-table-column>
+					<template slot="empty">
+						<empty description="暂无数据"></empty>
+					</template>
+				</el-table>
+			</div>
+		</div>
+		<el-dialog :title="isUpdate?'编辑':'新增'" :visible.sync="visible" width="900px" :append-to-body="true">
+			<depart-form v-if="visible" @callback="callback" :isUpdate="isUpdate" :part="part">
+			</depart-form>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		initDevicePartList,
+		getDevicePartList,
+		deleteDeviceDepartment
+	} from '@/httpApi/property'
+	import departForm from '@/components/work/property/departForm'
+	export default {
+		data() {
+			return {
+				treeData: [],
+				visible: false,
+				isUpdate: false,
+				part: {},
+				drawer: false
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						if (res.data.length === 0) {
+							initDevicePartList(this.$store.getters.organization.id, this.$store.getters.project.id)
+								.then(res => {
+									if (res.state) {
+										getDevicePartList(this.$store.getters.organization.id, this.$store
+											.getters.project.id).then(res => {
+											if (res.state) {
+												this.treeData = res.data;
+											}
+										})
+									}
+								})
+						} else {
+							this.treeData = res.data;
+						}
+					}
+				})
+			},
+			currentChange(currPage) {
+				this.currPage = currPage;
+				this.init();
+			},
+			insertDepartment(val) {
+				this.part = val;
+				this.visible = true;
+				this.isUpdate = false;
+			},
+			lookFlow(val) {
+				this.detailId = val.id;
+				this.drawer = true;
+			},
+			updateDepartment(val) {
+				this.part = val;
+				this.isUpdate = true;
+				this.visible = true;
+			},
+			deleteDepartment(val) {
+				this.$confirm('确定要删除该资产层级?', () => {
+					deleteDeviceDepartment(val.id).then(res => {
+						if (res.state) {
+							this.$message.success('操作成功');
+							this.init();
+						}
+					})
+				});
+			},
+			callback(type) {
+				this.visible = false;
+				if (type === 'init') this.init();
+			}
+		},
+		components: {
+			departForm
+		},
+	}
+</script>
+
+<style lang="scss">
+</style>

File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/index.html


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


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/css/2094.af7402f5.css


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/css/3678.eb14e2e4.css


File diff suppressed because it is too large
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/console/static/css/396.3532808c.css


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/css/5806.eb14e2e4.css


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/css/8250.af7402f5.css


virgo.wzfrontend/src/main/resources/static/console/static/css/1518.b6c7aaf0.css → virgo.wzfrontend/src/main/resources/static/console/static/css/9404.b6c7aaf0.css


virgo.wzfrontend/src/main/resources/static/console/static/css/6892.b6c7aaf0.css → virgo.wzfrontend/src/main/resources/static/console/static/css/9464.b6c7aaf0.css


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/css/9494.3532808c.css


File diff suppressed because it is too large
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/console/static/css/9896.3532808c.css


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/1157-legacy.3946fa09.js


File diff suppressed because it is too large
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/1518-legacy.d25e661b.js


virgo.wzfrontend/src/main/resources/static/console/static/js/1569-legacy.2ca1a9a0.js → virgo.wzfrontend/src/main/resources/static/console/static/js/1569-legacy.7b49b200.js


virgo.wzfrontend/src/main/resources/static/console/static/js/1569.7f9cab69.js → virgo.wzfrontend/src/main/resources/static/console/static/js/1569.70e19642.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/157-legacy.33dcee67.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/157.1175244a.js


virgo.wzfrontend/src/main/resources/static/console/static/js/1620.9bbdf943.js → virgo.wzfrontend/src/main/resources/static/console/static/js/1620.335ba23e.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/6296-legacy.ecbf92ac.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/6296.097da16e.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/1760-legacy.c33f3715.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/2094-legacy.58c471aa.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/2240-legacy.60d4988e.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/2240.7b725862.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/4293.c6a82cf7.js


File diff suppressed because it is too large
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/2323-legacy.c828faa0.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/2323-legacy.cfe20ea4.js


virgo.wzfrontend/src/main/resources/static/console/static/js/2347-legacy.684cbcab.js → virgo.wzfrontend/src/main/resources/static/console/static/js/2347-legacy.f3cb8d92.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/2598-legacy.7963e416.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/2598.d2b07507.js


virgo.wzfrontend/src/main/resources/static/console/static/js/2690-legacy.6478aca2.js → virgo.wzfrontend/src/main/resources/static/console/static/js/2690-legacy.8344753f.js


virgo.wzfrontend/src/main/resources/static/console/static/js/2690.4fcd0647.js → virgo.wzfrontend/src/main/resources/static/console/static/js/2690.29f83e72.js


virgo.wzfrontend/src/main/resources/static/console/static/js/2734-legacy.3026ed26.js → virgo.wzfrontend/src/main/resources/static/console/static/js/2734-legacy.3d5a62f4.js


virgo.wzfrontend/src/main/resources/static/console/static/js/2813-legacy.14c4be9e.js → virgo.wzfrontend/src/main/resources/static/console/static/js/2813-legacy.32e59007.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/3919-legacy.53928557.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/3678-legacy.b54b883c.js


File diff suppressed because it is too large
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/396-legacy.75783ac7.js


File diff suppressed because it is too large
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/396.4b50c936.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/4180.0771ff27.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/4281-legacy.b07f60c6.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/4281.0fd9a9c1.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/4290-legacy.f9a4420d.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/4290.4328edb9.js


virgo.wzfrontend/src/main/resources/static/console/static/js/4298.b9e13a08.js → virgo.wzfrontend/src/main/resources/static/console/static/js/4298.79fb1c3d.js


virgo.wzfrontend/src/main/resources/static/console/static/js/4384-legacy.b13d044d.js → virgo.wzfrontend/src/main/resources/static/console/static/js/4384-legacy.3d1cfdf0.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/439-legacy.0f650919.js


virgo.wzfrontend/src/main/resources/static/console/static/js/4847-legacy.757b4d9e.js → virgo.wzfrontend/src/main/resources/static/console/static/js/4847-legacy.d1a8a772.js


File diff suppressed because it is too large
+ 0 - 1
virgo.wzfrontend/src/main/resources/static/console/static/js/4892-legacy.22edf966.js


virgo.wzfrontend/src/main/resources/static/console/static/js/4912-legacy.7b3803c8.js → virgo.wzfrontend/src/main/resources/static/console/static/js/4912-legacy.21bae2e2.js


virgo.wzfrontend/src/main/resources/static/console/static/js/5270-legacy.30b601fe.js → virgo.wzfrontend/src/main/resources/static/console/static/js/5270-legacy.ef322de0.js


virgo.wzfrontend/src/main/resources/static/console/static/js/5270.de2c4461.js → virgo.wzfrontend/src/main/resources/static/console/static/js/5270.355ade0b.js


virgo.wzfrontend/src/main/resources/static/console/static/js/5629-legacy.121355bd.js → virgo.wzfrontend/src/main/resources/static/console/static/js/5629-legacy.deba3805.js


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/5806.d445fc4a.js


+ 0 - 0
virgo.wzfrontend/src/main/resources/static/console/static/js/5911.9d8e5079.js


Some files were not shown because too many files changed in this diff