Переглянути джерело

Merge branch 'master' of http://git.nzklabs.com:3000/huangyuanhao/jfcloud-coldchain

jackzhou 6 місяців тому
батько
коміт
d5bf4f2a2c
37 змінених файлів з 3058 додано та 636 видалено
  1. 134 28
      snowy-admin-web/index.html
  2. 13 15
      snowy-admin-web/src/components/HomeCard/SysCountCard/index.vue
  3. 1 1
      snowy-admin-web/src/components/HomeCard/SysWarningCard/index.vue
  4. 5 5
      snowy-admin-web/src/config/index.js
  5. 1 1
      snowy-admin-web/src/config/settingConfig.js
  6. 86 2
      snowy-admin-web/src/layout/components/NavMenu.vue
  7. 5 5
      snowy-admin-web/src/layout/components/setting.vue
  8. 2 2
      snowy-admin-web/src/layout/components/userbar.vue
  9. 15 2
      snowy-admin-web/src/layout/menu/classicalMenu.vue
  10. 3 3
      snowy-admin-web/src/style/default.less
  11. 48 1
      snowy-admin-web/src/style/index.less
  12. 0 1
      snowy-admin-web/src/utils/loading.js
  13. 8 5
      snowy-admin-web/src/views/auth/login/login.vue
  14. 21 9
      snowy-admin-web/src/views/basicset/devicetype/category.vue
  15. 60 16
      snowy-admin-web/src/views/basicset/devicetype/model.vue
  16. 146 7
      snowy-admin-web/src/views/basicset/intervals/index.vue
  17. 108 66
      snowy-admin-web/src/views/basicset/mem/collector.vue
  18. 264 1
      snowy-admin-web/src/views/basicset/mem/repeater.vue
  19. 133 7
      snowy-admin-web/src/views/basicset/plan/index.vue
  20. 171 7
      snowy-admin-web/src/views/basicset/ports/index.vue
  21. 310 0
      snowy-admin-web/src/views/motoring/analyse/assess.vue
  22. 148 68
      snowy-admin-web/src/views/motoring/analyse/curve.vue
  23. 56 50
      snowy-admin-web/src/views/motoring/analyse/daily.vue
  24. 36 31
      snowy-admin-web/src/views/motoring/analyse/evaluate.vue
  25. 18 2
      snowy-admin-web/src/views/motoring/analyse/index.vue
  26. 208 0
      snowy-admin-web/src/views/motoring/analyse/signal.vue
  27. 273 0
      snowy-admin-web/src/views/motoring/analyse/statistics.vue
  28. 95 81
      snowy-admin-web/src/views/motoring/bigscreen/index.vue
  29. 125 7
      snowy-admin-web/src/views/motoring/location/index.vue
  30. 109 1
      snowy-admin-web/src/views/motoring/query/history.vue
  31. 0 1
      snowy-admin-web/src/views/motoring/query/index.vue
  32. 81 18
      snowy-admin-web/src/views/motoring/query/realtime.vue
  33. 97 0
      snowy-admin-web/src/views/motoring/report/form.vue
  34. 0 1
      snowy-admin-web/src/views/motoring/report/index.vue
  35. 203 143
      snowy-admin-web/src/views/motoring/report/list.vue
  36. 74 48
      snowy-admin-web/src/views/motoring/report/noticelist.vue
  37. 1 1
      snowy-admin-web/tsconfig.json

+ 134 - 28
snowy-admin-web/index.html

@@ -1,35 +1,141 @@
 <!DOCTYPE html>
 <html lang="zh_cn">
+
 <head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width,initial-scale=1.0">
-  <link rel="icon" href="/favicon.ico">
-  <title>Snowy</title>
-  <style>
-    .dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:32px;width:32px;height:32px;box-sizing:border-box}.dot i{width:14px;height:14px;position:absolute;display:block;background-color:#1677FF;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.dot i:nth-child(1){top:0;left:0}.dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}
-    .app-loading {position: absolute;top:0;left:0;right:0;bottom:0;display: flex;justify-content: center;align-items: center;flex-direction: column;background: #fff;}
-    .app-loading-logo {margin-bottom: 30px;}
-    .app-loading-logo img {width: 90px;vertical-align: bottom;}
-    .app-loading-title {font-size: 24px;color: #333;margin-top: 30px;}
-	.app-main { height: 100% }
-    @keyframes loader {
-      0% {
-        transform: rotate(0deg);
-      }
-      100% {
-        transform: rotate(360deg);
-      }
-    }
-  </style>
+	<meta charset="utf-8">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge">
+	<meta name="viewport" content="width=device-width,initial-scale=1.0">
+	<link rel="icon" href="/favicon.ico">
+	<title>冷链平台</title>
+	<style>
+		.dot {
+			animation: antRotate 1.2s infinite linear;
+			transform: rotate(45deg);
+			position: relative;
+			display: inline-block;
+			font-size: 32px;
+			width: 32px;
+			height: 32px;
+			box-sizing: border-box
+		}
+
+		.dot i {
+			width: 14px;
+			height: 14px;
+			position: absolute;
+			display: block;
+			background-color: #1677FF;
+			border-radius: 100%;
+			transform: scale(.75);
+			transform-origin: 50% 50%;
+			opacity: .3;
+			animation: antSpinMove 1s infinite linear alternate
+		}
+
+		.dot i:nth-child(1) {
+			top: 0;
+			left: 0
+		}
+
+		.dot i:nth-child(2) {
+			top: 0;
+			right: 0;
+			-webkit-animation-delay: .4s;
+			animation-delay: .4s
+		}
+
+		.dot i:nth-child(3) {
+			right: 0;
+			bottom: 0;
+			-webkit-animation-delay: .8s;
+			animation-delay: .8s
+		}
+
+		.dot i:nth-child(4) {
+			bottom: 0;
+			left: 0;
+			-webkit-animation-delay: 1.2s;
+			animation-delay: 1.2s
+		}
+
+		@keyframes antRotate {
+			to {
+				-webkit-transform: rotate(405deg);
+				transform: rotate(405deg)
+			}
+		}
+
+		@-webkit-keyframes antRotate {
+			to {
+				-webkit-transform: rotate(405deg);
+				transform: rotate(405deg)
+			}
+		}
+
+		@keyframes antSpinMove {
+			to {
+				opacity: 1
+			}
+		}
+
+		@-webkit-keyframes antSpinMove {
+			to {
+				opacity: 1
+			}
+		}
+
+		.app-loading {
+			position: absolute;
+			top: 0;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			flex-direction: column;
+			background: #fff;
+		}
+
+		.app-loading-logo {
+			margin-bottom: 30px;
+		}
+
+		.app-loading-logo img {
+			width: 90px;
+			vertical-align: bottom;
+		}
+
+		.app-loading-title {
+			font-size: 24px;
+			color: #333;
+			margin-top: 30px;
+		}
+
+		.app-main {
+			height: 100%
+		}
+
+		@keyframes loader {
+			0% {
+				transform: rotate(0deg);
+			}
+
+			100% {
+				transform: rotate(360deg);
+			}
+		}
+	</style>
 
 </head>
+
 <body>
-<noscript>
-  <strong>We're sorry but Snowy doesn't work properly without JavaScript
-    enabled. Please enable it to continue.</strong>
-</noscript>
-<div id="app" class="app-main"></div>
-<script type="module" src="/src/main.js"></script>
+	<noscript>
+		<strong>We're sorry but Snowy doesn't work properly without JavaScript
+			enabled. Please enable it to continue.</strong>
+	</noscript>
+	<div id="app" class="app-main"></div>
+	<script type="module" src="/src/main.js"></script>
 </body>
-</html>
+
+</html>

+ 13 - 15
snowy-admin-web/src/components/HomeCard/SysCountCard/index.vue

@@ -18,15 +18,7 @@
 				<img src="/src/assets/images/home/02.png" class="right-img" />
 			</div>
 		</div>
-		<div class="ant-card-body">
-			<div class="card-left">
-				<div class="left-title">超限</div>
-				<div class="left-count">{{ dataSource.cx }}</div>
-			</div>
-			<div class="card-right">
-				<img src="/src/assets/images/home/03.png" class="right-img" />
-			</div>
-		</div>
+
 		<div class="ant-card-body">
 			<div class="card-left">
 				<div class="left-title">断线</div>
@@ -38,7 +30,7 @@
 		</div>
 		<div class="ant-card-body">
 			<div class="card-left">
-				<div class="left-title">闲置维修</div>
+				<div class="left-title">未绑定</div>
 				<div class="left-count">{{ dataSource.xzwx }}</div>
 			</div>
 			<div class="card-right">
@@ -72,13 +64,13 @@
 		justify-content: space-between;
 
 		.ant-card-body {
-			flex: 0 0 calc(20% - 10px);
+			flex: 0 0 calc(25% - 10px);
 			width: 100%;
 			height: 150px;
 			margin-bottom: 10px;
 			box-sizing: border-box;
 			background-color: #ffffff;
-			border-radius: 5px;
+			border-radius: 10px;
 			display: flex;
 			justify-content: center;
 
@@ -86,11 +78,11 @@
 				width: 50%;
 				padding: 30px 10px 20px 30px;
 				.left-title {
-					font-size: 16px;
+					font-size: 18px;
 				}
 				.left-count {
 					padding-top: 10px;
-					font-size: 30px;
+					font-size: 45px;
 					white-space: nowrap;
 					overflow: hidden;
 					text-overflow: ellipsis;
@@ -99,8 +91,14 @@
 
 			.card-right {
 				width: 50%;
-				padding-top: 10px;
+				display: flex;
+				justify-content: center;
+				align-items: center;
 				text-align: center;
+
+				.right-img {
+					width: 60%;
+				}
 			}
 		}
 		.ant-card-body:nth-child(5n) {

+ 1 - 1
snowy-admin-web/src/components/HomeCard/SysWarningCard/index.vue

@@ -8,7 +8,7 @@
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'state'">
 					<span>
-						<a-tag :color="record.state == '1' ? '#cd201f' : record.state == '2' ? '#2db7f5' : '#87d068'">
+						<a-tag :color="record.state == '1' ? '#87d068' : record.state == '2' ? '#cd201f' : '#50cd7c'">
 							{{ record.stateVlaue }}
 						</a-tag>
 					</span>

+ 5 - 5
snowy-admin-web/src/config/index.js

@@ -34,7 +34,7 @@ const DEFAULT_CONFIG = {
 	REQUEST_CACHE: false,
 
 	// 布局 经典:classical,双排菜单:doublerow, 顶栏菜单:top
-	SNOWY_LAYOUT: 'doublerow',
+	SNOWY_LAYOUT: 'classical',
 
 	// 菜单是否折叠
 	SNOWY_MENU_COLLAPSE: false,
@@ -43,7 +43,7 @@ const DEFAULT_CONFIG = {
 	SNOWY_MODULE_UNFOLD_OPEN: true,
 
 	// 是否开启多标签
-	SNOWY_LAYOUT_TAGS_OPEN: true,
+	SNOWY_LAYOUT_TAGS_OPEN: false,
 
 	// 是否开启展示面包屑
 	SNOWY_BREADCRUMB_OPEN: false,
@@ -76,7 +76,7 @@ const DEFAULT_CONFIG = {
 	SNOWY_THEME: 'dark',
 
 	// 整体表单风格
-	SNOWY_FORM_STYLE: 'drawer',
+	SNOWY_FORM_STYLE: 'modal',
 
 	// 系统基础配置,这些是数据库中保存起来的
 	SYS_BASE_CONFIG: {
@@ -85,11 +85,11 @@ const DEFAULT_CONFIG = {
 		// 背景图
 		SNOWY_SYS_BACK_IMAGE: '',
 		// 系统名称
-		SNOWY_SYS_NAME: '冷链监控管理系统',
+		SNOWY_SYS_NAME: '冷链平台',
 		// 版本
 		SNOWY_SYS_VERSION: '2.0',
 		// 版权
-		SNOWY_SYS_COPYRIGHT: 'Snowy ©2022 Created by xiaonuo.vip',
+		SNOWY_SYS_COPYRIGHT: '冷链平台 ©2022 Created by xiaonuo.vip',
 		// 版权跳转URL
 		SNOWY_SYS_COPYRIGHT_URL: 'https://www.xiaonuo.vip',
 		// 默认文件存储

+ 1 - 1
snowy-admin-web/src/config/settingConfig.js

@@ -51,7 +51,7 @@ const colorList = [
 	},
 	{
 		key: '主题黑',
-		color: '#001529'
+		color: '#272a31'
 	}
 ]
 

+ 86 - 2
snowy-admin-web/src/layout/components/NavMenu.vue

@@ -7,6 +7,7 @@
 			<template v-if="navMenu.meta.icon" #icon>
 				<component :is="navMenu.meta.icon" />
 			</template>
+
 			<a
 				v-if="navMenu.meta && navMenu.meta.type === 'link'"
 				:href="navMenu.path"
@@ -14,7 +15,7 @@
 				@click.stop="() => {}"
 				>{{ navMenu.meta.title }}</a
 			>
-			<a v-else>{{ navMenu.meta.title }}</a>
+			<a v-else> {{ navMenu.meta.title }}</a>
 		</a-menu-item>
 		<a-sub-menu v-else-if="!hasHidden(navMenu)" :key="navMenu.path" :title="navMenu.meta.title">
 			<template v-if="navMenu.meta.icon" #icon>
@@ -46,7 +47,7 @@
 		return false
 	}
 </script>
-<style>
+<style lang="less">
 	.ant-menu-light.ant-menu-horizontal > .ant-menu-submenu-selected {
 		background-color: var(--primary-1);
 	}
@@ -62,4 +63,87 @@
 	.xn-pd20 {
 		padding: 20px;
 	}
+
+	/* 经典模式子菜单 */
+	.ant-menu-dark.ant-menu-inline ul {
+		width: 95%;
+
+		margin: 0 0 0 5%;
+		background-color: #1b1c1e !important;
+
+		li {
+			width: 90%;
+			margin: -2px 0 0 20px;
+			position: relative;
+			padding-left: 20px !important;
+			border-left: 1px solid #303135 !important;
+			transition:
+				background-color 0.3s ease,
+				border 0.3s ease;
+
+			span {
+				display: inline-block;
+			}
+			.ant-menu-item-icon {
+				height: 100%;
+				padding: 10% 10px !important;
+			}
+			.ant-menu-title-content {
+				margin: 0 !important;
+			}
+		}
+
+		li::before {
+			content: '';
+			position: absolute;
+			top: -45px;
+			left: 0px;
+			width: 11px;
+			height: 70px;
+			border-bottom: 1px solid #35373b;
+			border-left: 1px solid #35373b;
+			border-bottom-left-radius: 15px;
+		}
+
+		// 最后一个子菜单元素
+		li:last-child {
+			border: none !important;
+		}
+		// 避免边框重叠,除了最后一个元素,其他的左边框都没有
+		li:not(:last-child)::before {
+			border-left: none !important;
+			width: 12px;
+		}
+
+		// 选中时候的样式
+		.ant-menu-item-selected {
+			span {
+				background-color: #272a31;
+
+				display: inline-block;
+			}
+			.ant-menu-item-icon {
+				height: 100%;
+				padding: 8% 10px !important;
+				border-top-left-radius: 10px;
+				border-bottom-left-radius: 10px;
+			}
+			.ant-menu-title-content {
+				margin: 0 !important;
+				border-top-right-radius: 10px;
+				border-bottom-right-radius: 10px;
+			}
+		}
+
+		.ant-menu-submenu-title {
+			padding-left: 0 !important;
+		}
+	}
+
+	// 点击菜单选中时候的背景色为透明色
+	.ant-menu-dark .ant-menu-item-selected,
+	.ant-menu-submenu-title:active,
+	.ant-menu-item:active {
+		background-color: transparent !important;
+	}
 </style>

+ 5 - 5
snowy-admin-web/src/layout/components/setting.vue

@@ -362,7 +362,7 @@
 	}
 	.snowy-setting-checkbox-item-dark::before {
 		z-index: 1;
-		background-color: #001529;
+		background-color: #272a31;
 		content: '';
 	}
 	.snowy-setting-checkbox-item-dark::after {
@@ -389,7 +389,7 @@
 		position: absolute;
 		right: 8px;
 		bottom: 8px;
-		color: #1677FF;
+		color: #1677ff;
 		font-weight: 700;
 		font-size: 14px;
 		pointer-events: none;
@@ -416,7 +416,7 @@
 	.snowy-setting-layout-menu-doublerow::before {
 		z-index: 1;
 		width: 16%;
-		background-color: #001529;
+		background-color: #272a31;
 		content: '';
 	}
 	.snowy-setting-layout-menu-doublerow-inner {
@@ -445,7 +445,7 @@
 	}
 	.snowy-setting-layout-menu-classical::before {
 		z-index: 1;
-		background-color: #001529;
+		background-color: #272a31;
 		content: '';
 	}
 	.snowy-setting-layout-menu-classical::after {
@@ -474,7 +474,7 @@
 		left: 0;
 		width: 100%;
 		height: 25%;
-		background-color: #001529;
+		background-color: #272a31;
 		content: '';
 	}
 	.scrollbar {

+ 2 - 2
snowy-admin-web/src/layout/components/userbar.vue

@@ -29,7 +29,7 @@
 				</a-menu>
 			</template>
 		</a-dropdown>
-		<a-dropdown v-if="!isMobile" class="panel-item">
+		<!-- <a-dropdown v-if="!isMobile" class="panel-item">
 			<global-outlined />
 			<template #overlay>
 				<a-menu :selected-keys="lang">
@@ -41,7 +41,7 @@
 					</a-menu-item>
 				</a-menu>
 			</template>
-		</a-dropdown>
+		</a-dropdown> -->
 		<div v-if="setDrawer === 'true'" class="setting panel-item" @click="openSetting">
 			<layout-outlined />
 		</div>

+ 15 - 2
snowy-admin-web/src/layout/menu/classicalMenu.vue

@@ -6,7 +6,8 @@
 			:trigger="null"
 			collapsible
 			:theme="sideTheme"
-			width="250"
+			width="220"
+			:style="{ backgroundColor: sideTheme && sideTheme == 'dark' ? '#1b1c1e' : '' }"
 		>
 			<header id="snowyHeaderLogo" class="snowy-header-logo">
 				<div class="snowy-header-left">
@@ -21,8 +22,8 @@
 					<a-menu
 						v-bind:openKeys="openKeys"
 						v-bind:selectedKeys="selectedKeys"
-						:theme="sideTheme"
 						mode="inline"
+						:theme="sideTheme"
 						@select="onSelect"
 						@openChange="onOpenChange"
 					>
@@ -112,6 +113,18 @@
 	}
 </script>
 <style lang="less" scoped>
+	// 经典模式
+	.ant-layout-sider-dark {
+		// 菜单栏logo 标题 部分
+		.snowy-header-logo {
+			background-color: #1b1c1e;
+		}
+
+		.ant-menu {
+			background-color: #1b1c1e;
+		}
+	}
+
 	.xn-color-fff {
 		color: #fff;
 	}

+ 3 - 3
snowy-admin-web/src/style/default.less

@@ -192,9 +192,9 @@
 
 	// Layout
 	--layout-body-background: #f0f2f5;
-	--layout-header-background: #001529;
+	--layout-header-background: #272a31;
 	--layout-trigger-background: #002140;
-	//--layout-sider-background-1: coverTintMixin(#001529, 10%);
+	//--layout-sider-background-1: coverTintMixin(#272a31, 10%);
 
 	// Dropdown 有两个
 	--dropdown-menu-bg: @component-background;
@@ -242,7 +242,7 @@
 	// Menu
 	--menu-popup-bg: @component-background;
 	--menu-dark-bg: @layout-header-background;
-	--menu-dark-inline-submenu-bg: #000c17;
+	--menu-dark-inline-submenu-bg: #1b1c1e;
 
 	// Table
 	--table-header-bg: @background-color-light;

+ 48 - 1
snowy-admin-web/src/style/index.less

@@ -192,7 +192,7 @@ a, button, input, textarea {
 }
 
 .top-snowy-header {
-	background: #001529;
+	background: #272a31;
 	color: white;
 }
 .top-snowy-header-light {
@@ -522,3 +522,50 @@ body,
 .batch-box.active:before {
 	background: var(--primary-color) !important;
 }
+
+
+// 搜索区域的表单
+.table-search {
+	width: 100%;
+	display: flex;
+
+	// 搜索表单
+	.table-search-form {
+		width: 100%;
+		overflow: hidden;
+		flex: 1;
+		.ant-form-inline {
+			width: 100%;
+			.ant-form-item {
+				margin-bottom: 18px;
+			}
+		}
+	}
+
+	// 搜索按钮
+	.table-search-buttons {
+		min-width: 100px;
+		margin-left: 20px;
+	}
+}
+// 其他操作区域
+.table-head-btn{
+    height: 50px;
+    position: relative;
+    border-radius: 2px;
+	display: flex;
+    align-items: center;
+	background-color: #e6f7ff;
+    border: 1px solid #91d5ff;
+	.btn-left{
+		position: absolute;
+		left: 10px;
+	}
+
+
+	.btn-right{
+		position: absolute;
+		right: 10px;
+	}
+
+}

+ 0 - 1
snowy-admin-web/src/utils/loading.js

@@ -17,7 +17,6 @@ export const NextLoading = {
 				  <img src="/img/logo.png"/>
 				</div>
 				<div><span class="dot dot-spin"><i></i><i></i><i></i><i></i></span></div>
-				<div class="app-loading-title">Snowy</div>
 			</div>`
 		body.insertBefore(div, body.childNodes[0])
 		window.nextLoading = true

+ 8 - 5
snowy-admin-web/src/views/auth/login/login.vue

@@ -238,19 +238,23 @@
 <style lang="less" scoped>
 	.login-wrapper {
 		width: 100%;
-		min-height: 600px;
+		min-height: 800px;
 		height: 100vh;
 		display: flex;
 		flex-direction: column;
-		padding: 5% 0;
 		align-items: center;
+		justify-content: flex-start;
+		padding-top: 10%;
 		background-image: url('/src/assets/images/login/logo_background.png');
 		background-size: cover;
 		background-position: center;
 		.login-title {
-			font-size: 28px;
+			font-size: 30px;
+			margin-bottom: 30px;
+			letter-spacing: 5px;
 			font-weight: bold;
-			margin-bottom: 20px;
+
+			color: #1f3253;
 		}
 
 		// 登录
@@ -265,7 +269,6 @@
 
 			.form_head {
 				font-size: 20px;
-				font-weight: bold;
 				height: 70px;
 				line-height: 70px;
 			}

+ 21 - 9
snowy-admin-web/src/views/basicset/devicetype/category.vue

@@ -2,16 +2,21 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
 			<template #operator>
-				<div class="table-head">
-					<a-button type="primary">
-						<template #icon><plus-outlined /></template>新增
-					</a-button>
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-left">
+						<a-button type="primary">
+							<template #icon><plus-outlined /></template>新增</a-button
+						>
+					</div>
 				</div>
 			</template>
 			<template #bodyCell="{ column }">
 				<template v-if="column.dataIndex === 'action'">
 					<a-button type="link" size="small">编辑</a-button>
-					<a-button type="link" size="small">删除</a-button>
+					<a-popconfirm title="确定要删除吗?" @confirm="deleteData(record)">
+						<a-button type="link" danger size="small">删除</a-button>
+					</a-popconfirm>
 				</template>
 			</template>
 		</s-table>
@@ -119,16 +124,23 @@
 			return obj
 		})
 	}
+
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+
+	// 删除
+	const deleteData = (record) => {
+		console.log(record, '删除')
+	}
 </script>
 
 <style lang="less" scoped>
 	.table_item {
 		padding: 15px 20px;
 
-		.table-head {
-			text-align: right;
-		}
-
 		:deep(.ant-table-pagination-right) {
 			justify-content: center !important;
 		}

+ 60 - 16
snowy-admin-web/src/views/basicset/devicetype/model.vue

@@ -2,16 +2,46 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
 			<template #operator>
-				<div class="table-head">
-					<a-button type="primary">
-						<template #icon><plus-outlined /></template>新增
-					</a-button>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="型号名称" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入型号名称" /> </a-form-item
+								></a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-left">
+						<a-button type="primary">
+							<template #icon><plus-outlined /></template>新增</a-button
+						>
+					</div>
 				</div>
 			</template>
 			<template #bodyCell="{ column }">
 				<template v-if="column.dataIndex === 'action'">
 					<a-button type="link" size="small">编辑</a-button>
-					<a-button type="link" size="small">删除</a-button>
+					<a-popconfirm title="确定要删除吗?" @confirm="deleteData(record)">
+						<a-button type="link" danger size="small">删除</a-button>
+					</a-popconfirm>
 				</template>
 			</template>
 		</s-table>
@@ -25,35 +55,42 @@
 	const tableRef = ref()
 	const columns = [
 		{
-			title: '型号编号',
+			title: '对象类别',
 			dataIndex: 'code',
 			align: 'center',
 			ellipsis: true
 		},
 		{
-			title: '型号名称',
+			title: '品牌',
+			dataIndex: 'pp',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '对象型号名称',
 			dataIndex: 'name',
 			align: 'center',
 			ellipsis: true
 		},
 		{
-			title: '描述',
-			dataIndex: 'describe',
+			title: '对象型号图片',
+			dataIndex: 'img',
 			align: 'center',
 			ellipsis: true
 		},
 		{
-			title: '创立日期',
-			dataIndex: 'date',
+			title: '描述',
+			dataIndex: 'describe',
 			align: 'center',
 			ellipsis: true
 		},
 		{
-			title: '创建人',
-			dataIndex: 'creator',
+			title: '创立时间',
+			dataIndex: 'date',
 			align: 'center',
 			ellipsis: true
 		},
+
 		{
 			title: '操作',
 			dataIndex: 'action',
@@ -119,14 +156,21 @@
 			return obj
 		})
 	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+
+	// 删除
+	const deleteData = (record) => {
+		console.log(record, '删除')
+	}
 </script>
 
 <style lang="less" scoped>
 	.table_item {
 		padding: 15px 20px;
-		.table-head {
-			text-align: right;
-		}
 	}
 	:deep(.ant-table-pagination-right) {
 		justify-content: center !important;

+ 146 - 7
snowy-admin-web/src/views/basicset/intervals/index.vue

@@ -1,12 +1,151 @@
 <template>
-	<div>采集间隔设置</div>
+	<div class="table_item">
+		<div class="table_left">
+			<a-input-search v-model:value="searchValue" style="margin-bottom: 8px" placeholder="请输入采集名称" />
+			<a-tree
+				:expanded-keys="expandedKeys"
+				:auto-expand-parent="autoExpandParent"
+				:tree-data="gData"
+				@expand="onExpand"
+			>
+				<template #title="{ title }">
+					<span v-if="title.indexOf(searchValue) > -1">
+						{{ title.substring(0, title.indexOf(searchValue)) }}
+						<span style="color: #f50">{{ searchValue }}</span>
+						{{ title.substring(title.indexOf(searchValue) + searchValue.length) }}
+					</span>
+					<span v-else>{{ title }}</span>
+				</template>
+			</a-tree>
+		</div>
+		<div class="table_right">
+			<a-card title="采集器频率" style="width: 100%">
+				<a-form
+					ref="searchFormRef"
+					name="advanced_search"
+					:label-col="{ style: { width: '100px', justifyContent: 'end' } }"
+					:model="searchFormState"
+					class="ant-advanced-search-form"
+				>
+					<a-form-item label="采集频率" name="cjpl">
+						<a-input v-model:value="searchFormState.cjpl" placeholder="请输入采集频率" />
+					</a-form-item>
+					<a-form-item label="报警采集频率" name="bjcjpl">
+						<a-input v-model:value="searchFormState.bjcjpl" placeholder="请输入报警采集频率" />
+					</a-form-item>
+				</a-form>
+				<a-button type="primary">保存</a-button>
+			</a-card>
+		</div>
+	</div>
 </template>
-<script setup>
-	onMounted(() => {})
+<script lang="ts" setup>
+	import type { TreeProps } from 'ant-design-vue'
+	const searchFormState = ref({
+		cjpl: '',
+		bjcjpl: ''
+	})
 
-	onBeforeMount(() => {})
+	const x = 3
+	const y = 2
+	const z = 1
+	const genData: TreeProps['treeData'] = []
 
-	// 监听
-	watch()
+	const generateData = (_level: number, _preKey?: string, _tns?: TreeProps['treeData']) => {
+		const preKey = _preKey || '0'
+		const tns = _tns || genData
+
+		const children = []
+		for (let i = 0; i < x; i++) {
+			const key = `${preKey}-${i}`
+			tns.push({ title: key, key })
+			if (i < y) {
+				children.push(key)
+			}
+		}
+		if (_level < 0) {
+			return tns
+		}
+		const level = _level - 1
+		children.forEach((key, index) => {
+			tns[index].children = []
+			return generateData(level, key, tns[index].children)
+		})
+	}
+	generateData(z)
+
+	const dataList: TreeProps['treeData'] = []
+	const generateList = (data: TreeProps['treeData']) => {
+		for (let i = 0; i < data.length; i++) {
+			const node = data[i]
+			const key = node.key
+			dataList.push({ key, title: key })
+			if (node.children) {
+				generateList(node.children)
+			}
+		}
+	}
+	generateList(genData)
+
+	const getParentKey = (key: string | number, tree: TreeProps['treeData']): string | number | undefined => {
+		let parentKey
+		for (let i = 0; i < tree.length; i++) {
+			const node = tree[i]
+			if (node.children) {
+				if (node.children.some((item) => item.key === key)) {
+					parentKey = node.key
+				} else if (getParentKey(key, node.children)) {
+					parentKey = getParentKey(key, node.children)
+				}
+			}
+		}
+		return parentKey
+	}
+	const expandedKeys = ref<(string | number)[]>([])
+	const searchValue = ref<string>('')
+	const autoExpandParent = ref<boolean>(true)
+	const gData = ref<TreeProps['treeData']>(genData)
+
+	const onExpand = (keys: string[]) => {
+		expandedKeys.value = keys
+		autoExpandParent.value = false
+	}
+
+	watch(searchValue, (value) => {
+		const expanded = dataList
+			.map((item: TreeProps['treeData'][number]) => {
+				if (item.title.indexOf(value) > -1) {
+					return getParentKey(item.key, gData.value)
+				}
+				return null
+			})
+			.filter((item, i, self) => item && self.indexOf(item) === i)
+		expandedKeys.value = expanded
+		searchValue.value = value
+		autoExpandParent.value = true
+	})
 </script>
-<style lang="less" scoped></style>
+
+<style lang="less" scoped>
+	.table_item {
+		width: 100%;
+		display: flex;
+		padding: 15px 20px;
+
+		.table_left {
+			width: 25%;
+			padding: 10px;
+			margin-right: 10px;
+			background-color: #ffffff;
+		}
+		.table_right {
+			width: 70%;
+		}
+	}
+	:deep(.ant-card-body) {
+		text-align: center;
+	}
+	:deep(.ant-card-head) {
+		border-bottom: 1px solid #f0f0f0 !important;
+	}
+</style>

+ 108 - 66
snowy-admin-web/src/views/basicset/mem/collector.vue

@@ -2,47 +2,113 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
 			<template #operator>
-				<div class="table-head">
-					<div class="head-left">
-						<a-button type="primary">显示新设备</a-button>
-						<a-form
-							ref="searchFormRef"
-							name="advanced_search"
-							:model="searchFormState"
-							layout="inline"
-							class="ant-advanced-search-form"
-						>
-							<a-form-item label="冷链编号" name="code">
-								<a-input v-model:value="searchFormState.code" placeholder="请输入冷链编号" />
-							</a-form-item>
-						</a-form>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="冷链编号" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入冷链编号" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="所属中继" name="sszj">
+										<a-select v-model:value="searchFormState.sszj" placeholder="请选择所属中继">
+											<a-select-option value="1">虚拟中继</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="运行状态" name="yxzt">
+										<a-select v-model:value="searchFormState.yxzt" placeholder="请选择运行状态">
+											<a-select-option value="1">正常</a-select-option>
+											<a-select-option value="2">断线</a-select-option>
+											<a-select-option value="3">异常</a-select-option>
+											<a-select-option value="4">闲置维修</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="采集名称" name="name">
+										<a-input v-model:value="searchFormState.name" placeholder="请输入采集名称" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="型号" name="xh">
+										<a-select v-model:value="searchFormState.xh" placeholder="请选择型号">
+											<a-select-option value="1">新四代采集</a-select-option>
+											<a-select-option value="2">四代采集</a-select-option>
+											<a-select-option value="3">六代采集</a-select-option>
+											<a-select-option value="4">wifi采集</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
 						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
 						<a-button class="xn-mg08" @click="reset">重置</a-button>
 					</div>
-					<div class="head-right">
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-left">
+						<a-button type="primary">显示新设备</a-button>
+					</div>
+
+					<div class="btn-right">
 						<a-button>
 							<template #icon><download-outlined /></template>导出
 						</a-button>
-						<a-select ref="select" v-model:value="value1" style="width: 120px" @focus="focus" @change="handleChange">
-							<a-select-option value="1">搜索模式</a-select-option>
-						</a-select>
 					</div>
 				</div>
 			</template>
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'state'">
 					<span>
-						<a-tag :color="record.state == '1' ? '#50cd7c' : record.state == '2' ? '#cd201f' : '#87d068'">
+						<a-tag :color="record.state == '1' ? '#87d068' : record.state == '2' ? '#cd201f' : '#50cd7c'">
 							{{ record.stateValue }}
 						</a-tag>
 					</span>
 				</template>
 				<template v-if="column.dataIndex === 'action'">
 					<a-button type="link" size="small">编辑</a-button>
-					<a-button type="link" size="small">删除</a-button>
+					<a-popconfirm title="确定要删除吗?" @confirm="deleteData(record)">
+						<a-button type="link" danger size="small">删除</a-button>
+					</a-popconfirm>
 					<a-button type="link" size="small">记录</a-button>
 				</template>
 			</template>
+			<template #expandedRowRender="{ record }">
+				<a-tabs v-model:activeKey="record.activeKey" size="small" type="card">
+					<a-tab-pane key="1" tab="基本信息">
+						<div class="list">
+							<a-descriptions bordered size="small">
+								<a-descriptions-item label="采集器名称" :span="2">{{ '90160206' }}</a-descriptions-item>
+								<a-descriptions-item label="采集器编码" :span="2">{{ '90160206' }}</a-descriptions-item>
+								<a-descriptions-item label="采集器设备状态" :span="2">{{ '正常' }}</a-descriptions-item>
+								<a-descriptions-item label="创建时间" :span="2">{{ '2024-10-09 09:36:21' }}</a-descriptions-item>
+							</a-descriptions>
+						</div>
+					</a-tab-pane>
+					<a-tab-pane key="2" tab="1路">
+						<div class="list">
+							<a-descriptions bordered size="small">
+								<a-descriptions-item label="传感器类型" :span="2">{{ '温度' }}</a-descriptions-item>
+								<a-descriptions-item label="传感器路数" :span="2">{{ '1' }}</a-descriptions-item>
+							</a-descriptions>
+						</div>
+					</a-tab-pane>
+				</a-tabs>
+			</template>
 		</s-table>
 	</div>
 </template>
@@ -142,21 +208,7 @@
 						stateValue: '正常',
 						bjsxx: '1',
 						dyjkdx: 'BSL-3超低温冰箱',
-						jkdxwz: 'ABCLSY冰箱三层',
-						children: [
-							{
-								ssbm: '广州海关技术中心',
-								code: 'Y-01-6578945621',
-								name: 'ABSL-3超低温冰箱123456',
-								xh: '三代GPRS采集-VH',
-								date: '2024-09-28 07:03:24',
-								state: '2',
-								stateValue: '异常',
-								bjsxx: '1',
-								dyjkdx: 'BSL-3超低温冰箱',
-								jkdxwz: 'ABCLSY冰箱三层一格'
-							}
-						]
+						jkdxwz: 'ABCLSY冰箱三层'
 					},
 					{
 						ssbm: '广州海关技术中心',
@@ -168,21 +220,7 @@
 						stateValue: '正常',
 						bjsxx: '1',
 						dyjkdx: 'BSL-3超低温冰箱',
-						jkdxwz: 'ABCLSY冰箱三层',
-						children: [
-							{
-								ssbm: '广州海关技术中心',
-								code: 'Y-01-6578945622',
-								name: 'ABSL-3超低温冰箱123456',
-								xh: '三代GPRS采集-VH',
-								date: '2024-09-28 07:03:24',
-								state: '2',
-								stateValue: '异常',
-								bjsxx: '1',
-								dyjkdx: 'BSL-3超低温冰箱',
-								jkdxwz: 'ABCLSY冰箱三层'
-							}
-						]
+						jkdxwz: 'ABCLSY冰箱三层'
 					},
 					{
 						ssbm: '广州海关技术中心',
@@ -244,30 +282,34 @@
 		searchFormRef.value.resetFields()
 		tableRef.value.refresh(true)
 	}
+	// 删除
+	const deleteData = (record) => {
+		console.log(record, '删除')
+	}
 </script>
 
 <style lang="less" scoped>
 	.table_item {
 		padding: 15px 20px;
 
-		.table-head {
-			width: 100%;
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-
-			.head-left {
-				width: 60%;
-				display: flex;
-			}
-
-			.ant-btn {
-				margin-right: 10px;
-			}
-		}
-
 		:deep(.ant-table-pagination-right) {
 			justify-content: center !important;
 		}
 	}
+	.list {
+		width: 60%;
+		padding: 10px 20px;
+		border-radius: 10px;
+		background-color: #ffffff;
+
+		:deep(.ant-descriptions) {
+			margin-bottom: 10px;
+		}
+		:deep(.ant-descriptions-header) {
+			margin: 0;
+			padding: 10px;
+			border: 1px solid #f0f0f0;
+			border-bottom: none;
+		}
+	}
 </style>

+ 264 - 1
snowy-admin-web/src/views/basicset/mem/repeater.vue

@@ -1,14 +1,277 @@
 <template>
-	<div class="table_item">冷链中继器</div>
+	<div class="table_item">
+		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
+			<template #operator>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="中继编号" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入中继编号" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="报警状态" name="bjzt">
+										<a-select v-model:value="searchFormState.yxzt" placeholder="请选择报警状态">
+											<a-select-option value="1">正常</a-select-option>
+											<a-select-option value="2">断线</a-select-option>
+											<a-select-option value="3">异常</a-select-option>
+											<a-select-option value="4">闲置维修</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="中继名称" name="name">
+										<a-input v-model:value="searchFormState.name" placeholder="请输入中继名称" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="型号" name="xh">
+										<a-select v-model:value="searchFormState.xh" placeholder="请选择型号">
+											<a-select-option value="1">新四代采集</a-select-option>
+											<a-select-option value="2">四代采集</a-select-option>
+											<a-select-option value="3">六代采集</a-select-option>
+											<a-select-option value="4">wifi采集</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-left">
+						<a-button type="primary">显示新设备</a-button>
+					</div>
+					<div class="btn-right">
+						<a-button>
+							<template #icon><download-outlined /></template>导出
+						</a-button>
+					</div>
+				</div>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'state'">
+					<span>
+						<a-tag :color="record.state == '1' ? '#87d068' : record.state == '2' ? '#cd201f' : '#50cd7c'">
+							{{ record.stateValue }}
+						</a-tag>
+					</span>
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-button type="link" size="small">编辑</a-button>
+					<a-popconfirm title="确定要删除吗?" @confirm="deleteData(record)">
+						<a-button type="link" danger size="small">删除</a-button>
+					</a-popconfirm>
+					<a-button type="link" size="small">记录</a-button>
+				</template>
+			</template>
+		</s-table>
+	</div>
 </template>
 
 <script setup>
 	import tool from '@/utils/tool'
 	import jobApi from '@/api/dev/jobApi'
+	const searchFormRef = ref()
+	const searchFormState = ref({})
+	const tableRef = ref()
+	const value1 = ref('1')
+	const columns = [
+		{
+			title: '所属部门',
+			dataIndex: 'ssbm',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '485编号',
+			dataIndex: 'code1',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '中继编号',
+			dataIndex: 'code',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '中继名称',
+			dataIndex: 'name',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '型号',
+			dataIndex: 'xh',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '中继IP',
+			dataIndex: 'ip',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '最后心跳时间',
+			dataIndex: 'zhxtsj',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '设备状态',
+			dataIndex: 'state',
+			align: 'center',
+			ellipsis: true
+		},
+
+		{
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		}
+	]
+
+	const loadData = (parameter) => {
+		return jobApi.jobPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			// return res
+			const obj = {
+				current: 1,
+				pages: 1,
+				records: [
+					{
+						ssbm: '广州海关技术中心',
+						code1: '123456',
+						code: 'Y6578945621',
+						name: 'ABSL-3超低温冰箱123456',
+						xh: '三代GPRS采集-VH',
+						ip: '126.145.01.14',
+						zhxtsj: '2024-09-28 07:03:24',
+						state: '1',
+						stateValue: '正常',
+
+						children: [
+							{
+								ssbm: '广州海关技术中心',
+								code1: '123456',
+								code: 'Y-01-6578945621',
+								name: 'ABSL-3超低温冰箱123456',
+								xh: '三代GPRS采集-VH',
+								ip: '126.145.01.14',
+								zhxtsj: '2024-09-28 07:03:24',
+								state: '2',
+								stateValue: '异常'
+							}
+						]
+					},
+					{
+						ssbm: '广州海关技术中心',
+						code1: '123456',
+						code: 'Y6578945622',
+						name: 'ABSL-3超低温冰箱123456',
+						xh: '三代GPRS采集-VH',
+						ip: '126.145.01.14',
+						zhxtsj: '2024-11-05 07:12:42',
+						state: '1',
+						stateValue: '正常',
+						children: [
+							{
+								ssbm: '广州海关技术中心',
+								code1: '123456',
+								code: 'Y-01-6578945622',
+								name: 'ABSL-3超低温冰箱123456',
+								xh: '三代GPRS采集-VH',
+								ip: '126.145.01.14',
+								zhxtsj: '2024-09-28 07:03:24',
+								state: '2',
+								stateValue: '异常'
+							}
+						]
+					},
+					{
+						ssbm: '广州海关技术中心',
+						code1: '123456',
+						code: 'Y6578945623',
+						name: 'ABSL-3超低温冰箱123456',
+						xh: '三代GPRS采集-VH',
+						ip: '126.145.01.14',
+						zhxtsj: '2024-11-05 09:22:45',
+						state: '1',
+						stateValue: '正常'
+					},
+					{
+						ssbm: '广州海关技术中心',
+						code1: '123456',
+						code: 'Y6578945624',
+						name: 'ABSL-3超低温冰箱123456',
+						xh: '三代GPRS采集-VH',
+						ip: '126.145.01.14',
+						zhxtsj: '2024-11-05 09:27:55',
+						state: '1',
+						stateValue: '正常'
+					},
+					{
+						ssbm: '广州海关技术中心',
+						code1: '123456',
+						code: 'Y6578945625',
+						name: 'ABSL-3超低温冰箱123456',
+						xh: '三代GPRS采集-VH',
+						ip: '126.145.01.14',
+						zhxtsj: '2024-11-05 10:16:11',
+						state: '2',
+						stateValue: '异常'
+					},
+					{
+						ssbm: '广州海关技术中心',
+						code1: '123456',
+						code: 'Y6578945626',
+						name: 'ABSL-3超低温冰箱123456',
+						xh: '三代GPRS采集-VH',
+						ip: '126.145.01.14',
+						zhxtsj: '2024-11-05 14:57:31',
+						state: '2',
+						stateValue: '异常'
+					}
+				],
+				size: 10,
+				total: 6
+			}
+			return obj
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteData = (record) => {
+		console.log(record, '删除')
+	}
 </script>
 
 <style lang="less" scoped>
 	.table_item {
 		padding: 15px 20px;
+
+		:deep(.ant-table-pagination-right) {
+			justify-content: center !important;
+		}
 	}
 </style>

+ 133 - 7
snowy-admin-web/src/views/basicset/plan/index.vue

@@ -1,12 +1,138 @@
 <template>
-	<div>平面图展示</div>
+	<div class="table_item">
+		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
+			<template #operator>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '80px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="平面图名称" name="name">
+										<a-input v-model:value="searchFormState.name" placeholder="请输入平面图名称" /> </a-form-item
+								></a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-left">
+						<a-button type="primary">
+							<template #icon><plus-outlined /></template>新增
+						</a-button>
+					</div>
+				</div>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-button type="link" size="small">编辑</a-button>
+					<a-popconfirm title="确定要删除吗?" @confirm="deleteData(record)">
+						<a-button type="link" danger size="small">删除</a-button>
+					</a-popconfirm>
+					<a-button type="link" size="small">记录</a-button>
+				</template>
+			</template>
+		</s-table>
+	</div>
 </template>
-<script setup>
-	onMounted(() => {})
 
-	onBeforeMount(() => {})
+<script setup>
+	import tool from '@/utils/tool'
+	import jobApi from '@/api/dev/jobApi'
+	const searchFormRef = ref()
+	const searchFormState = ref({})
+	const tableRef = ref()
+	const columns = [
+		{
+			title: '名称',
+			dataIndex: 'name',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '图片名称',
+			dataIndex: 'imgname',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '所属部门',
+			dataIndex: 'ssbm',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '上传时间',
+			dataIndex: 'ssbm',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		}
+	]
 
-	// 监听
-	watch()
+	const loadData = (parameter) => {
+		return jobApi.jobPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			// return res
+			const obj = {
+				current: 1,
+				pages: 1,
+				records: [],
+				size: 10,
+				total: 0
+			}
+			return obj
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteData = (record) => {
+		console.log(record, '删除')
+	}
 </script>
-<style lang="less" scoped></style>
+
+<style lang="less" scoped>
+	.table_item {
+		padding: 15px 20px;
+
+		:deep(.ant-table-pagination-right) {
+			justify-content: center !important;
+		}
+	}
+	.list {
+		width: 60%;
+		padding: 10px 20px;
+		border-radius: 10px;
+		background-color: #ffffff;
+
+		:deep(.ant-descriptions) {
+			margin-bottom: 10px;
+		}
+		:deep(.ant-descriptions-header) {
+			margin: 0;
+			padding: 10px;
+			border: 1px solid #f0f0f0;
+			border-bottom: none;
+		}
+	}
+</style>

+ 171 - 7
snowy-admin-web/src/views/basicset/ports/index.vue

@@ -1,12 +1,176 @@
 <template>
-	<div>接口配置</div>
+	<div class="table_item">
+		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
+			<template #operator>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="接口类型" name="type">
+										<a-select v-model:value="searchFormState.type" placeholder="请选择接口类型">
+											<a-select-option value="1">甘肃疾控</a-select-option>
+											<a-select-option value="2">唐山</a-select-option>
+											<a-select-option value="3">世窗</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="设备名称" name="name">
+										<a-input v-model:value="searchFormState.name" placeholder="请输入设备名称" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="所属部门" name="ssbm">
+										<a-input v-model:value="searchFormState.ssbm" placeholder="请输入所属部门" /> </a-form-item
+								></a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-left">
+						<a-button type="primary">
+							<template #icon><plus-outlined /></template>新增
+						</a-button>
+					</div>
+				</div>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-button type="link" size="small">编辑</a-button>
+					<a-popconfirm title="确定要删除吗?" @confirm="deleteData(record)">
+						<a-button type="link" danger size="small">删除</a-button>
+					</a-popconfirm>
+					<a-button type="link" size="small">记录</a-button>
+				</template>
+			</template>
+		</s-table>
+	</div>
 </template>
-<script setup>
-	onMounted(() => {})
 
-	onBeforeMount(() => {})
+<script setup>
+	import tool from '@/utils/tool'
+	import jobApi from '@/api/dev/jobApi'
+	const searchFormRef = ref()
+	const searchFormState = ref({})
+	const tableRef = ref()
+	const columns = [
+		{
+			title: '接口类型',
+			dataIndex: 'type',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '设备名称',
+			dataIndex: 'name',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '所属部门',
+			dataIndex: 'ssbm',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		}
+	]
 
-	// 监听
-	watch()
+	const loadData = (parameter) => {
+		return jobApi.jobPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			// return res
+			const obj = {
+				current: 1,
+				pages: 1,
+				records: [
+					{
+						name: 'ABSL-1设备',
+						type: '唐山',
+						ssbm: '广州海关技术中心'
+					},
+					{
+						name: 'ABSL-2设备',
+						type: '甘肃市疾控',
+						ssbm: '广州海关技术中心'
+					},
+					{
+						name: 'ABSL-3设备',
+						type: '唐山',
+						ssbm: '广州海关技术中心'
+					},
+					{
+						name: 'ABSL-4设备',
+						type: '唐山',
+						ssbm: '广州海关技术中心'
+					},
+					{
+						name: 'ABSL-5设备',
+						type: '唐山',
+						ssbm: '广州海关技术中心'
+					},
+					{
+						name: 'ABSL-6设备',
+						type: '唐山',
+						ssbm: '广州海关技术中心'
+					}
+				],
+				size: 10,
+				total: 6
+			}
+			return obj
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteData = (record) => {
+		console.log(record, '删除')
+	}
 </script>
-<style lang="less" scoped></style>
+
+<style lang="less" scoped>
+	.table_item {
+		padding: 15px 20px;
+
+		:deep(.ant-table-pagination-right) {
+			justify-content: center !important;
+		}
+	}
+	.list {
+		width: 60%;
+		padding: 10px 20px;
+		border-radius: 10px;
+		background-color: #ffffff;
+
+		:deep(.ant-descriptions) {
+			margin-bottom: 10px;
+		}
+		:deep(.ant-descriptions-header) {
+			margin: 0;
+			padding: 10px;
+			border: 1px solid #f0f0f0;
+			border-bottom: none;
+		}
+	}
+</style>

+ 310 - 0
snowy-admin-web/src/views/motoring/analyse/assess.vue

@@ -0,0 +1,310 @@
+<template>
+	<div class="table_item">
+		<s-table ref="tableRef" bordered :columns="columns" :data="loadData" :row-key="(record) => record.code">
+			<template #operator>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="开始时间" name="searchKey">
+										<a-date-picker
+											v-model:value="searchFormState.searchKey"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="结束时间" name="jssj">
+										<a-date-picker
+											v-model:value="searchFormState.jssj"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="searchFormState.type == 'qst'">
+									<a-form-item label="采集类型" name="cjlx">
+										<a-select v-model:value="searchFormState.cjlx" placeholder="请选择采集类型">
+											<a-select-option value="1">温度</a-select-option>
+											<a-select-option value="2">湿度</a-select-option>
+											<a-select-option value="3">氧气浓度</a-select-option>
+										</a-select>
+									</a-form-item>
+								</a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-right">
+						<a-button class="xn-mg08">
+							<template #icon><download-outlined /></template>导出
+						</a-button>
+						<a-button>
+							<template #icon><printer-outlined /></template>打印
+						</a-button>
+					</div>
+				</div>
+			</template>
+		</s-table>
+		<div class="item-right">
+			<!-- 单位 -->
+			<div class="unit">
+				<unitSearch ref="unitSearchRef" />
+			</div>
+			<!-- 监控点 -->
+			<div class="monitor">
+				<monitorSearch ref="monitorSearchRef" />
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup>
+	import jobApi from '@/api/dev/jobApi'
+	import unitSearch from './unitSearch.vue'
+	import monitorSearch from './monitorSearch.vue'
+
+	const unitSearchRef = ref(null)
+	const monitorSearchRef = ref(null)
+	onMounted(() => {
+		unitSearchRef.value.onOpen() //获取单位数据
+		monitorSearchRef.value.onOpen() //获取监控点数据
+	})
+
+	const tableRef = ref()
+	const searchFormState = ref({})
+	const columns = [
+		{
+			title: '部门名称',
+			dataIndex: 'bmmc',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '监控点',
+			dataIndex: 'jkd',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '冷链编号',
+			dataIndex: 'llcode',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '品牌',
+			dataIndex: 'pp',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '温度情况',
+			dataIndex: 'wdqk',
+			align: 'center',
+			ellipsis: true,
+			children: [
+				{
+					title: '平均温度',
+					dataIndex: 'pjwd',
+					align: 'center',
+					ellipsis: true
+				},
+				{
+					title: '最高温度',
+					dataIndex: 'zgwd',
+					align: 'center',
+					ellipsis: true
+				},
+				{
+					title: '最低温度',
+					dataIndex: 'zdwd',
+					align: 'center',
+					ellipsis: true
+				}
+			]
+		},
+
+		{
+			title: '报警情况',
+			dataIndex: 'bjqk',
+			align: 'center',
+			ellipsis: true,
+			children: [
+				{
+					title: '超温报警次数',
+					dataIndex: 'cwbjcs',
+					align: 'center',
+					ellipsis: true
+				},
+				{
+					title: '采集报警次数',
+					dataIndex: 'cjbjcs',
+					align: 'center',
+					ellipsis: true
+				}
+			]
+		},
+
+		{
+			title: '温度评估值',
+			dataIndex: 'wdpgz',
+			align: 'center',
+			ellipsis: true
+		}
+	]
+
+	const loadData = (parameter) => {
+		return jobApi.jobPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			// return res
+			const obj = {
+				current: 1,
+				pages: 1,
+				records: [
+					{
+						bmmc: '上海海关基数中心1',
+						jkd: '监控点',
+						llcode: 'LL-20241112',
+						pp: '海尔',
+						pjwd: 33,
+						zgwd: 1,
+						zdwd: 0,
+						cwbjcs: 0,
+						cjbjcs: 20,
+						wdpgz: 0
+					},
+					{
+						bmmc: '上海海关基数中心2',
+						jkd: '监控点',
+						llcode: 'LL-20241112',
+						pp: '海尔',
+						pjwd: 21,
+						zgwd: 0,
+						zdwd: 2,
+						cwbjcs: 0,
+						cjbjcs: 34,
+						wdpgz: 0
+					},
+					{
+						bmmc: '上海海关基数中心2',
+						jkd: '监控点',
+						llcode: 'LL-20241112',
+						pp: '海尔',
+						pjwd: 4,
+						zgwd: 6,
+						zdwd: 1,
+						cwbjcs: 1,
+						cjbjcs: 10,
+						wdpgz: 0
+					},
+					{
+						bmmc: '上海海关基数中心4',
+						jkd: '监控点',
+						llcode: 'LL-20241112',
+						pp: '海尔',
+						pjwd: 24,
+						zgwd: 3,
+						zdwd: 3,
+						cwbjcs: 0,
+						cjbjcs: 16,
+						wdpgz: 0
+					},
+					{
+						bmmc: '上海海关基数中心5',
+						jkd: '监控点',
+						llcode: 'LL-20241112',
+						pp: '海尔',
+						pjwd: 15,
+						zgwd: 0,
+						zdwd: 0,
+						cwbjcs: 1,
+						cjbjcs: 12,
+						wdpgz: 0
+					},
+					{
+						bmmc: '上海海关基数中心6',
+						jkd: '监控点',
+						llcode: 'LL-20241112',
+						pp: '海尔',
+						pjwd: 2,
+						zgwd: 0,
+						zdwd: 1,
+						cwbjcs: 1,
+						cjbjcs: 31,
+						wdpgz: 0
+					}
+				],
+				size: 10,
+				total: 6
+			}
+			return obj
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+</script>
+
+<style lang="less" scoped>
+	.table_item {
+		width: 100%;
+		display: flex;
+		padding: 15px 20px;
+
+		.table-wrapper {
+			width: 75%;
+		}
+
+		// 右边的搜索区域
+		.item-right {
+			width: 25%;
+			padding: 5px 10px;
+
+			.unit,
+			.monitor {
+				width: 100%;
+				height: 350px;
+				padding: 10px;
+				margin-bottom: 10px;
+				border-radius: 5px;
+				border: 1px solid #eaeaea;
+				overflow-y: auto;
+			}
+		}
+	}
+	// 树形结构的样式
+	:deep(.ant-tree-treenode) {
+		width: 100%;
+		margin-bottom: 5px;
+		border-radius: 5px;
+		padding: 5px 0 !important;
+		border: 1px solid #eaeaea;
+	}
+
+	// 分页居中显示
+	:deep(.ant-table-pagination-right) {
+		justify-content: center !important;
+	}
+</style>

+ 148 - 68
snowy-admin-web/src/views/motoring/analyse/curve.vue

@@ -2,50 +2,79 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
 			<template #operator>
-				<div class="table-head">
-					<div class="head-left">
-						<a-form
-							ref="searchFormRef"
-							name="advanced_search"
-							layout="inline"
-							:model="searchFormState"
-							class="ant-advanced-search-form"
-						>
-							<a-form-item label="" name="searchKey">
-								<a-range-picker v-model:value="searchFormState.searchKey" value-format="YYYY/MM/DD" />
-							</a-form-item>
-
-							<a-form-item label="报警类型" name="type">
-								<a-select v-model:value="searchFormState.type" placeholder="请选择报警类型">
-									<a-select-option value="qst">趋势图</a-select-option>
-								</a-select>
-							</a-form-item>
-
-							<a-form-item label="是否展示全部区间" name="isshow">
-								<a-select v-model:value="searchFormState.isshow" placeholder="请选择是否展示全部区间">
-									<a-select-option value="1">是</a-select-option>
-									<a-select-option value="1">否</a-select-option>
-								</a-select>
-							</a-form-item>
-						</a-form>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="开始时间" name="searchKey">
+										<a-date-picker
+											v-model:value="searchFormState.searchKey"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="结束时间" name="jssj">
+										<a-date-picker
+											v-model:value="searchFormState.jssj"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="报表类型" name="type">
+										<a-select v-model:value="searchFormState.type" placeholder="请选择报警类型">
+											<a-select-option value="qst">趋势图</a-select-option>
+											<a-select-option value="tjlb">统计列表</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item
+										label="展示全部区间"
+										name="isshow"
+										:label-col="{ style: { width: '100px', justifyContent: 'end' } }"
+									>
+										<a-select v-model:value="searchFormState.isshow" placeholder="请选择展示全部区间">
+											<a-select-option value="1">是</a-select-option>
+											<a-select-option value="1">否</a-select-option>
+										</a-select>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="searchFormState.type == 'qst'">
+									<a-form-item label="采集类型" name="cjlx">
+										<a-select v-model:value="searchFormState.cjlx" placeholder="请选择采集类型">
+											<a-select-option value="1">温度</a-select-option>
+											<a-select-option value="2">湿度</a-select-option>
+											<a-select-option value="3">氧气浓度</a-select-option>
+										</a-select>
+									</a-form-item>
+								</a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
 						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
 						<a-button class="xn-mg08" @click="reset">重置</a-button>
 					</div>
-					<div class="head-right">
-						<a-button>
-							<template #icon><setting-outlined /></template>设置
-						</a-button>
-					</div>
 				</div>
 			</template>
-			<template #headerCell="{ title, column }">
-				<template v-if="column.dataIndex === 'type'">
-					<text>{{ title }}</text>
-					<a-select ref="select" v-model:value="value1" style="width: 250px; margin-left: 10px">
-						<a-select-option value="1">二氧化碳浓度</a-select-option>
-					</a-select>
-				</template>
-			</template>
 		</s-table>
 
 		<div class="item-right">
@@ -78,15 +107,41 @@
 
 	// 搜索表单
 	const searchFormState = ref({
-		type: 'qst',
+		type: 'tjlb',
 		isshow: '1'
 	})
 	const tableRef = ref()
 
 	const columns = [
 		{
-			title: '采集类型',
-			dataIndex: 'type'
+			title: '对象名称',
+			dataIndex: 'name',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '监控点名称',
+			dataIndex: 'jkdname',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '采集值1',
+			dataIndex: 'cjz',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '采集值2',
+			dataIndex: 'cjz2',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '采集时间',
+			dataIndex: 'cjsj',
+			align: 'center',
+			ellipsis: true
 		}
 	]
 
@@ -96,9 +151,58 @@
 			const obj = {
 				current: 1,
 				pages: 1,
-				records: [],
+				records: [
+					{
+						cjsj: '2024-08-28 07:03:24',
+						name: '-70度超低温冷冻储存箱',
+						cjz: '/',
+						cjz2: '/',
+
+						jkdname: '监控点1'
+					},
+					{
+						cjsj: '2024-08-28 09:21:51',
+						name: '-71度超低温冷冻储存箱',
+						cjz: '/',
+						cjz2: '/',
+
+						jkdname: '监控点2'
+					},
+					{
+						cjsj: '2024-08-28 11:06:20',
+						name: '-72度超低温冷冻储存箱',
+						cjz: '/',
+						cjz2: '/',
+
+						jkdname: '监控点2'
+					},
+					{
+						cjsj: '2024-08-28 11:54:19',
+						name: '-73度超低温冷冻储存箱',
+						cjz: '/',
+						cjz2: '/',
+
+						jkdname: '监控点4'
+					},
+					{
+						cjsj: '2024-08-28 16:17:36',
+						name: '-74度超低温冷冻储存箱',
+						cjz: '/',
+						cjz2: '/',
+
+						jkdname: '监控点5'
+					},
+					{
+						cjsj: '2024-08-28 19:35:58',
+						name: '-75度超低温冷冻储存箱',
+						cjz: '/',
+						cjz2: '/',
+
+						jkdname: '监控点6'
+					}
+				],
 				size: 10,
-				total: 0
+				total: 6
 			}
 			return obj
 		})
@@ -113,30 +217,6 @@
 
 		.table-wrapper {
 			width: 75%;
-			// 搜索及操作按钮区域
-			.table-head {
-				width: 100%;
-				display: flex;
-				align-items: center;
-				justify-content: space-between;
-
-				.head-left {
-					width: 90%;
-					display: flex;
-
-					.ant-form-inline {
-						width: 100%;
-
-						.ant-form-item {
-							flex: 1;
-						}
-					}
-				}
-
-				.ant-btn {
-					margin-left: 10px;
-				}
-			}
 		}
 
 		// 右边的搜索区域

+ 56 - 50
snowy-admin-web/src/views/motoring/analyse/daily.vue

@@ -2,38 +2,57 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
 			<template #operator>
-				<div class="table-head">
-					<div class="head-left">
-						<a-form
-							ref="searchFormRef"
-							name="advanced_search"
-							layout="inline"
-							:model="searchFormState"
-							class="ant-advanced-search-form"
-						>
-							<a-form-item label="" name="searchKey">
-								<a-range-picker v-model:value="searchFormState.searchKey" value-format="YYYY/MM/DD" />
-							</a-form-item>
-
-							<a-form-item label="采集类型" name="type">
-								<a-select v-model:value="searchFormState.type" placeholder="请选择报警类型">
-									<a-select-option value="wd">温度</a-select-option>
-								</a-select>
-							</a-form-item>
-						</a-form>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+									<a-form-item label="生成时间" name="searchKey">
+										<a-range-picker
+											v-model:value="searchFormState.searchKey"
+											value-format="YYYY/MM/DD"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="12">
+									<a-form-item label="采集类型" name="type">
+										<a-select v-model:value="searchFormState.type" placeholder="请选择采集类型">
+											<a-select-option value="wd">温度</a-select-option>
+											<a-select-option value="2">湿度</a-select-option>
+											<a-select-option value="3">氧气浓度</a-select-option>
+											<a-select-option value="4">二氧化碳浓度</a-select-option>
+											<a-select-option value="5">液味</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
 						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
 						<a-button class="xn-mg08" @click="reset">重置</a-button>
 					</div>
-					<div class="head-right">
-						<a-button>
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-right">
+						<a-button class="xn-mg08">
 							<template #icon><download-outlined /></template>导出
 						</a-button>
 						<a-button>
 							<template #icon><printer-outlined /></template>打印
 						</a-button>
-						<a-button>
-							<template #icon><setting-outlined /></template>设置
-						</a-button>
 					</div>
 				</div>
 			</template>
@@ -41,7 +60,7 @@
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'state'">
 					<span>
-						<a-tag :color="record.state == '1' ? '#2db7f5' : record.state == '2' ? '#cd201f' : '#87d068'">
+						<a-tag :color="record.state == '1' ? '#87d068' : record.state == '2' ? '#cd201f' : '#50cd7c'">
 							{{ record.stateVlaue }}
 						</a-tag>
 					</span>
@@ -98,6 +117,12 @@
 			align: 'center',
 			ellipsis: true
 		},
+		{
+			title: '报警最大值',
+			dataIndex: 'bjzdz',
+			align: 'center',
+			ellipsis: true
+		},
 		{
 			title: '采集状态',
 			dataIndex: 'state',
@@ -124,6 +149,7 @@
 						time: '2024-08-28 07:03:24',
 						dxmc: '-70度超低温冷冻储存箱',
 						bjzxz: '/',
+						bjzdz: '/',
 						state: '2',
 						stateVlaue: '异常',
 						bmmc: '上海海关基数中心1'
@@ -132,6 +158,7 @@
 						time: '2024-08-28 09:21:51',
 						dxmc: '-71度超低温冷冻储存箱',
 						bjzxz: '/',
+						bjzdz: '/',
 						state: '1',
 						stateVlaue: '正常',
 						bmmc: '上海海关基数中心2'
@@ -140,6 +167,7 @@
 						time: '2024-08-28 11:06:20',
 						dxmc: '-72度超低温冷冻储存箱',
 						bjzxz: '/',
+						bjzdz: '/',
 						state: '2',
 						stateVlaue: '异常',
 						bmmc: '上海海关基数中心2'
@@ -148,6 +176,7 @@
 						time: '2024-08-28 11:54:19',
 						dxmc: '-73度超低温冷冻储存箱',
 						bjzxz: '/',
+						bjzdz: '/',
 						state: '2',
 						stateVlaue: '异常',
 						bmmc: '上海海关基数中心4'
@@ -156,6 +185,7 @@
 						time: '2024-08-28 16:17:36',
 						dxmc: '-74度超低温冷冻储存箱',
 						bjzxz: '/',
+						bjzdz: '/',
 						state: '1',
 						stateVlaue: '正常',
 						bmmc: '上海海关基数中心5'
@@ -164,6 +194,7 @@
 						time: '2024-08-28 19:35:58',
 						dxmc: '-75度超低温冷冻储存箱',
 						bjzxz: '/',
+						bjzdz: '/',
 						state: '2',
 						stateVlaue: '异常',
 						bmmc: '上海海关基数中心6'
@@ -186,31 +217,6 @@
 		// 表格区域
 		.table-wrapper {
 			width: 75%;
-
-			// 搜索及操作按钮区域
-			.table-head {
-				width: 100%;
-				display: flex;
-				align-items: center;
-				justify-content: space-between;
-
-				.head-left {
-					width: 70%;
-					display: flex;
-
-					.ant-form-inline {
-						width: 100%;
-
-						.ant-form-item {
-							flex: 1;
-						}
-					}
-				}
-
-				.ant-btn {
-					margin-left: 10px;
-				}
-			}
 		}
 
 		// 右边的搜索区域

+ 36 - 31
snowy-admin-web/src/views/motoring/analyse/evaluate.vue

@@ -2,24 +2,40 @@
 	<div class="table_item">
 		<s-table ref="tableRef" bordered :columns="columns" :data="loadData" :row-key="(record) => record.code">
 			<template #operator>
-				<div class="table-head">
-					<div class="head-left">
-						<a-form
-							ref="searchFormRef"
-							name="advanced_search"
-							layout="inline"
-							:model="searchFormState"
-							class="ant-advanced-search-form"
-						>
-							<a-form-item label="" name="searchKey">
-								<a-range-picker v-model:value="searchFormState.searchKey" value-format="YYYY/MM/DD" />
-							</a-form-item>
-						</a-form>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="报警时间" name="searchKey">
+										<a-range-picker
+											v-model:value="searchFormState.searchKey"
+											value-format="YYYY/MM/DD"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
 						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
 						<a-button class="xn-mg08" @click="reset">重置</a-button>
 					</div>
-					<div class="head-right">
-						<a-button>
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-right">
+						<a-button class="xn-mg08">
 							<template #icon><download-outlined /></template>导出
 						</a-button>
 						<a-button>
@@ -148,6 +164,11 @@
 			return obj
 		})
 	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
 </script>
 
 <style lang="less" scoped>
@@ -159,22 +180,6 @@
 		// 表格区域
 		.table-wrapper {
 			width: 100%;
-
-			// 搜索及操作按钮区域
-			.table-head {
-				width: 100%;
-				display: flex;
-				align-items: center;
-				justify-content: space-between;
-
-				.head-left {
-					display: flex;
-				}
-
-				.ant-btn {
-					margin-left: 10px;
-				}
-			}
 		}
 	}
 

+ 18 - 2
snowy-admin-web/src/views/motoring/analyse/index.vue

@@ -6,25 +6,41 @@
 				<a-divider type="vertical" style="height: 15px; background-color: #f4f5f7; margin: 8px 20px" />
 				<div class="tbas-title" :class="activeKey == '2' ? 'active' : ''" @click="activeclick('2')">数据曲线</div>
 				<a-divider type="vertical" style="height: 15px; background-color: #f4f5f7; margin: 8px 20px" />
-				<div class="tbas-title" :class="activeKey == '3' ? 'active' : ''" @click="activeclick('3')">管理评估</div>
+				<div class="tbas-title" :class="activeKey == '3' ? 'active' : ''" @click="activeclick('3')">日统计</div>
+				<a-divider type="vertical" style="height: 15px; background-color: #f4f5f7; margin: 8px 20px" />
+				<div class="tbas-title" :class="activeKey == '4' ? 'active' : ''" @click="activeclick('4')">信号强度统计</div>
+				<a-divider type="vertical" style="height: 15px; background-color: #f4f5f7; margin: 8px 20px" />
+				<div class="tbas-title" :class="activeKey == '5' ? 'active' : ''" @click="activeclick('5')">温度评估</div>
+				<a-divider type="vertical" style="height: 15px; background-color: #f4f5f7; margin: 8px 20px" />
+				<div class="tbas-title" :class="activeKey == '6' ? 'active' : ''" @click="activeclick('6')">管理评估</div>
 			</div>
 		</div>
 
 		<div class="query-body">
 			<Dailyr ref="dailyrRef" v-if="activeKey == '1'" />
 			<Curve ref="curveRef" v-if="activeKey == '2'" />
-			<Evaluate ref="evaluateRef" v-if="activeKey == '3'" />
+			<Statistics ref="statisticsRef" v-if="activeKey == '3'" />
+			<Signal ref="signalRef" v-if="activeKey == '4'" />
+			<Assess ref="assessRef" v-if="activeKey == '5'" />
+			<Evaluate ref="evaluateRef" v-if="activeKey == '6'" />
 		</div>
 	</div>
 </template>
 <script setup>
 	import Dailyr from './daily.vue'
 	import Curve from './curve.vue'
+	import Statistics from './statistics.vue'
+	import Signal from './signal.vue'
+	import Assess from './assess.vue'
+
 	import Evaluate from './evaluate.vue'
 
 	const activeKey = ref('1')
 	const dailyrRef = ref(null)
 	const curveRef = ref(null)
+	const statisticsRef = ref(null)
+	const signalRef = ref(null)
+	const assessRef = ref(null)
 	const evaluateRef = ref(null)
 
 	onMounted(() => {})

+ 208 - 0
snowy-admin-web/src/views/motoring/analyse/signal.vue

@@ -0,0 +1,208 @@
+<template>
+	<div class="table_item">
+		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
+			<template #operator>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="开始时间" name="searchKey">
+										<a-date-picker
+											v-model:value="searchFormState.searchKey"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="结束时间" name="jssj">
+										<a-date-picker
+											v-model:value="searchFormState.jssj"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="searchFormState.type == 'qst'">
+									<a-form-item label="采集类型" name="cjlx">
+										<a-select v-model:value="searchFormState.cjlx" placeholder="请选择采集类型">
+											<a-select-option value="1">温度</a-select-option>
+											<a-select-option value="2">湿度</a-select-option>
+											<a-select-option value="3">氧气浓度</a-select-option>
+										</a-select>
+									</a-form-item>
+								</a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+			</template>
+		</s-table>
+
+		<div class="item-right">
+			<!-- 单位 -->
+			<div class="unit">
+				<unitSearch ref="unitSearchRef" />
+			</div>
+			<!-- 监控点 -->
+			<div class="monitor">
+				<monitorSearch ref="monitorSearchRef" />
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup>
+	import jobApi from '@/api/dev/jobApi'
+	import unitSearch from './unitSearch.vue'
+	import monitorSearch from './monitorSearch.vue'
+
+	const unitSearchRef = ref(null)
+	const monitorSearchRef = ref(null)
+
+	onMounted(() => {
+		unitSearchRef.value.onOpen() //获取单位数据
+		monitorSearchRef.value.onOpen() //获取监控点数据
+	})
+
+	// 搜索表单
+	const searchFormState = ref({})
+	const tableRef = ref()
+
+	const columns = [
+		{
+			title: '采集器编码',
+			dataIndex: 'code',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '采集器名称',
+			dataIndex: 'name',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '信号强度统计',
+			dataIndex: 'tj',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '采集时间',
+			dataIndex: 'sj',
+			align: 'center',
+			ellipsis: true
+		}
+	]
+
+	const loadData = (parameter) => {
+		return jobApi.jobPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			// return res
+			const obj = {
+				current: 1,
+				pages: 1,
+				records: [
+					{
+						code: 'CJQ-20241112-00',
+						name: '-70度超低温冷冻储存箱',
+						tj: '60',
+						sj: '2024-08-28 07:03:24'
+					},
+					{
+						code: 'CJQ-20241112-01',
+						name: '-71度超低温冷冻储存箱',
+						tj: '61',
+						sj: '2024-08-28 07:03:24'
+					},
+					{
+						code: 'CJQ-20241112-02',
+						name: '-72度超低温冷冻储存箱',
+						tj: '62',
+						sj: '2024-08-28 07:03:24'
+					},
+					{
+						code: 'CJQ-20241112-03',
+						name: '-73度超低温冷冻储存箱',
+						tj: '63',
+						sj: '2024-08-28 07:03:24'
+					},
+					{
+						code: 'CJQ-20241112-04',
+						name: '-74度超低温冷冻储存箱',
+						tj: '64',
+						sj: '2024-08-28 07:03:24'
+					},
+					{
+						code: 'CJQ-20241112-05',
+						name: '-75度超低温冷冻储存箱',
+						tj: '65',
+						sj: '2024-08-28 07:03:24'
+					}
+				],
+				size: 10,
+				total: 6
+			}
+			return obj
+		})
+	}
+</script>
+
+<style lang="less" scoped>
+	.table_item {
+		width: 100%;
+		display: flex;
+		padding: 15px 20px;
+
+		.table-wrapper {
+			width: 75%;
+		}
+
+		// 右边的搜索区域
+		.item-right {
+			width: 25%;
+			padding: 5px 10px;
+
+			.unit,
+			.monitor {
+				width: 100%;
+				height: 350px;
+				padding: 10px;
+				margin-bottom: 10px;
+				border-radius: 5px;
+				border: 1px solid #eaeaea;
+				overflow-y: auto;
+			}
+		}
+	}
+	// 树形结构的样式
+	:deep(.ant-tree-treenode) {
+		width: 100%;
+		margin-bottom: 5px;
+		border-radius: 5px;
+		padding: 5px 0 !important;
+		border: 1px solid #eaeaea;
+	}
+
+	// 分页居中显示
+	:deep(.ant-table-pagination-right) {
+		justify-content: center !important;
+	}
+</style>

+ 273 - 0
snowy-admin-web/src/views/motoring/analyse/statistics.vue

@@ -0,0 +1,273 @@
+<template>
+	<div class="table_item">
+		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
+			<template #operator>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="开始时间" name="searchKey">
+										<a-date-picker
+											v-model:value="searchFormState.searchKey"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="结束时间" name="jssj">
+										<a-date-picker
+											v-model:value="searchFormState.jssj"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="searchFormState.type == 'qst'">
+									<a-form-item label="采集类型" name="cjlx">
+										<a-select v-model:value="searchFormState.cjlx" placeholder="请选择采集类型">
+											<a-select-option value="1">温度</a-select-option>
+											<a-select-option value="2">湿度</a-select-option>
+											<a-select-option value="3">氧气浓度</a-select-option>
+										</a-select>
+									</a-form-item>
+								</a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-right">
+						<a-button class="xn-mg08">
+							<template #icon><download-outlined /></template>导出
+						</a-button>
+						<a-button>
+							<template #icon><printer-outlined /></template>打印
+						</a-button>
+					</div>
+				</div>
+			</template>
+		</s-table>
+
+		<div class="item-right">
+			<!-- 单位 -->
+			<div class="unit">
+				<unitSearch ref="unitSearchRef" />
+			</div>
+			<!-- 监控点 -->
+			<div class="monitor">
+				<monitorSearch ref="monitorSearchRef" />
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup>
+	import jobApi from '@/api/dev/jobApi'
+	import unitSearch from './unitSearch.vue'
+	import monitorSearch from './monitorSearch.vue'
+
+	const unitSearchRef = ref(null)
+	const monitorSearchRef = ref(null)
+
+	onMounted(() => {
+		unitSearchRef.value.onOpen() //获取单位数据
+		monitorSearchRef.value.onOpen() //获取监控点数据
+	})
+
+	// 搜索表单
+	const searchFormState = ref({})
+	const tableRef = ref()
+
+	const columns = [
+		{
+			title: '对象名称',
+			dataIndex: 'name',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '监控点名称',
+			dataIndex: 'jkdname',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '日期',
+			dataIndex: 'rq',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '采集类型',
+			dataIndex: 'type',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '范围',
+			dataIndex: 'fw',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '最大值',
+			dataIndex: 'zdz',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '最小值',
+			dataIndex: 'zxz',
+			align: 'center',
+			ellipsis: true
+		},
+		{
+			title: '平均值',
+			dataIndex: 'pjz',
+			align: 'center',
+			ellipsis: true
+		}
+	]
+
+	const loadData = (parameter) => {
+		return jobApi.jobPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			// return res
+			const obj = {
+				current: 1,
+				pages: 1,
+				records: [
+					{
+						name: '-70度超低温冷冻储存箱',
+						jkdname: '监控点1',
+						rq: '2024-08-28 07:03:24',
+						type: '温度',
+						fw: '/',
+						zdz: '/',
+						zxz: '/',
+						pjz: '/'
+					},
+					{
+						name: '-71度超低温冷冻储存箱',
+						jkdname: '监控点2',
+						rq: '2024-08-28 09:21:51',
+						type: '湿度',
+						fw: '/',
+						zdz: '/',
+						zxz: '/',
+						pjz: '/'
+					},
+					{
+						name: '-72度超低温冷冻储存箱',
+						jkdname: '监控点2',
+						rq: '2024-08-28 11:06:20',
+						type: '温度',
+						fw: '/',
+						zdz: '/',
+						zxz: '/',
+						pjz: '/'
+					},
+					{
+						name: '-73度超低温冷冻储存箱',
+						jkdname: '监控点4',
+						rq: '2024-08-28 11:54:19',
+						type: '湿度',
+						fw: '/',
+						zdz: '/',
+						zxz: '/',
+						pjz: '/'
+					},
+					{
+						name: '-74度超低温冷冻储存箱',
+						jkdname: '监控点5',
+						rq: '2024-08-28 16:17:36',
+						type: '湿度',
+						fw: '/',
+						zdz: '/',
+						zxz: '/',
+						pjz: '/'
+					},
+					{
+						name: '-75度超低温冷冻储存箱',
+						jkdname: '监控点6',
+						rq: '2024-08-28 19:35:58',
+						type: '温度',
+						fw: '/',
+						zdz: '/',
+						zxz: '/',
+						pjz: '/'
+					}
+				],
+				size: 10,
+				total: 6
+			}
+			return obj
+		})
+	}
+
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+</script>
+
+<style lang="less" scoped>
+	.table_item {
+		width: 100%;
+		display: flex;
+		padding: 15px 20px;
+
+		.table-wrapper {
+			width: 75%;
+		}
+
+		// 右边的搜索区域
+		.item-right {
+			width: 25%;
+			padding: 5px 10px;
+
+			.unit,
+			.monitor {
+				width: 100%;
+				height: 350px;
+				padding: 10px;
+				margin-bottom: 10px;
+				border-radius: 5px;
+				border: 1px solid #eaeaea;
+				overflow-y: auto;
+			}
+		}
+	}
+	// 树形结构的样式
+	:deep(.ant-tree-treenode) {
+		width: 100%;
+		margin-bottom: 5px;
+		border-radius: 5px;
+		padding: 5px 0 !important;
+		border: 1px solid #eaeaea;
+	}
+
+	// 分页居中显示
+	:deep(.ant-table-pagination-right) {
+		justify-content: center !important;
+	}
+</style>

+ 95 - 81
snowy-admin-web/src/views/motoring/bigscreen/index.vue

@@ -17,39 +17,39 @@
 
 						<!-- 信息 -->
 						<div class="col-right">
-							<div class="right-info">
-								<div class="info-left">
-									<div class="info-tilte">
-										<div class="name">{{ item.name }}</div>
-										<a-tag :bordered="false" :color="item.state == 1 ? 'success' : 'orange'">{{
-											item.stateValue
-										}}</a-tag>
-									</div>
-									<div class="info-row">
-										<div class="label">部门:</div>
-										<div class="text">{{ item.bm }}</div>
-									</div>
-									<div class="info-row">
-										<div class="label">位置:</div>
-										<div class="text">{{ item.wz }}</div>
-									</div>
-									<div class="info-row">
-										<div class="label">监控点:</div>
-										<div class="text">{{ item.jkd }}</div>
+							<div class="info-tilte">
+								<div class="name">{{ item.name }}</div>
+								<a-tag :bordered="false" :color="item.state == 1 ? 'success' : 'orange'">{{ item.stateValue }}</a-tag>
+							</div>
+							<div class="info">
+								<div class="right-info">
+									<div class="info-left">
+										<div class="info-row">
+											<div class="label">部门:</div>
+											<div class="text">{{ item.bm }}</div>
+										</div>
+										<div class="info-row">
+											<div class="label">位置:</div>
+											<div class="text">{{ item.wz }}</div>
+										</div>
+										<div class="info-row">
+											<div class="label">监控点:</div>
+											<div class="text">{{ item.jkd }}</div>
+										</div>
+										<div class="info-row">
+											<div class="label">温度:</div>
+											<div class="text">{{ item.wd }}</div>
+										</div>
 									</div>
-									<div class="info-row">
-										<div class="label">温度:</div>
-										<div class="text">{{ item.wd }}</div>
+									<div class="info-right">
+										<img src="/src/assets/images/bigscreen/img.png" style="width: 115%; padding-top: 5px" />
 									</div>
 								</div>
-								<div class="info-right">
-									<img src="/src/assets/images/bigscreen/img.png" alt="" srcset="" />
+								<div class="right-foot">
+									<div>记录时间:{{ item.jlsj }}</div>
+									<div class="history">历史记录</div>
 								</div>
 							</div>
-							<div class="right-foot">
-								<div>记录时间:{{ item.jlsj }}</div>
-								<div class="history">历史记录</div>
-							</div>
 						</div>
 					</div>
 				</a-col>
@@ -61,7 +61,7 @@
 	const activeKey = ref('1')
 	const listData = [
 		{
-			name: '医用低温保温箱1',
+			name: '医用低温保温箱医用低温保温箱医用低温保温箱医用低温保温箱1',
 			state: '1',
 			stateValue: '正常',
 			bm: '广州海关技术中心',
@@ -295,70 +295,84 @@
 						width: 90%;
 						height: 100%;
 
-						.right-info {
+						// 整体标题区域
+						.info-tilte {
 							width: 100%;
-							height: 80%;
-							padding: 10px 10px;
-
+							height: 20%;
 							display: flex;
 							align-items: center;
+							letter-spacing: 2px;
+							padding: 0 10px;
 
-							.info-left {
-								width: 80%;
-								height: 100%;
-								overflow-y: auto;
+							.name {
+								font-weight: bold;
+								font-size: 16px;
+								white-space: nowrap;
+								overflow: hidden;
+								text-overflow: ellipsis;
+								margin-right: 10px;
+							}
+						}
 
-								.info-tilte {
-									display: flex;
-									align-items: center;
-									.name {
-										font-weight: bold;
-										font-size: 16px;
-										white-space: nowrap;
-										overflow: hidden;
-										text-overflow: ellipsis;
-										margin-right: 10px;
-									}
-								}
+						.info {
+							height: 80%;
+							.right-info {
+								width: 100%;
+								height: 80%;
+								padding: 0 10px;
 
-								.info-row {
-									padding: 5px 0;
-									display: flex;
-									width: 100%;
+								display: flex;
+								align-items: center;
 
-									.label {
-										width: 60px;
-										text-align-last: justify;
-									}
+								.info-left {
+									width: 80%;
+									height: 100%;
+									overflow-y: auto;
+
+									.info-row {
+										width: 100%;
+										font-size: 12px;
+										color: #909399;
+										display: flex;
+										padding-top: 10px;
+										.label {
+											width: 60px;
+											text-align-last: justify;
+										}
 
-									.text {
-										flex: 1;
-										overflow: hidden;
-										word-break: break-all;
-										text-overflow: ellipsis;
-										display: -webkit-box;
-										-webkit-box-orient: vertical;
-										-webkit-line-clamp: 2;
+										.text {
+											flex: 1;
+											overflow: hidden;
+											word-break: break-all;
+											text-overflow: ellipsis;
+											display: -webkit-box;
+											-webkit-box-orient: vertical;
+											-webkit-line-clamp: 2;
+										}
 									}
 								}
-							}
-							.info-left::-webkit-scrollbar {
-								display: none;
-							}
-						}
+								.info-left::-webkit-scrollbar {
+									display: none;
+								}
 
-						.right-foot {
-							height: 20%;
-							padding: 0 10px;
+								.info-right {
+									padding: 0 40px 0 30px;
+								}
+							}
 
-							color: #afafaf;
-							display: flex;
-							align-items: center;
-							justify-content: space-between;
-							border-top: 1px solid #e7e7e7;
-							.history {
-								cursor: pointer;
-								color: #008dff;
+							.right-foot {
+								height: 20%;
+								padding: 0 10px;
+								font-size: 12px;
+								color: #909399;
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								border-top: 1px solid #e7e7e7;
+								.history {
+									cursor: pointer;
+									color: #008dff;
+								}
 							}
 						}
 					}

+ 125 - 7
snowy-admin-web/src/views/motoring/location/index.vue

@@ -1,12 +1,130 @@
 <template>
-	<div>位置查询</div>
+	<div class="table_item">
+		<div class="table_left">
+			<a-input-search v-model:value="searchValue" style="margin-bottom: 8px" placeholder="请输入采集名称" />
+			<a-tree
+				:expanded-keys="expandedKeys"
+				:auto-expand-parent="autoExpandParent"
+				:tree-data="gData"
+				@expand="onExpand"
+			>
+				<template #title="{ title }">
+					<span v-if="title.indexOf(searchValue) > -1">
+						{{ title.substring(0, title.indexOf(searchValue)) }}
+						<span style="color: #f50">{{ searchValue }}</span>
+						{{ title.substring(title.indexOf(searchValue) + searchValue.length) }}
+					</span>
+					<span v-else>{{ title }}</span>
+				</template>
+			</a-tree>
+		</div>
+		<div class="table_right">地图</div>
+	</div>
 </template>
-<script setup>
-	onMounted(() => {})
+<script lang="ts" setup>
+	import type { TreeProps } from 'ant-design-vue'
 
-	onBeforeMount(() => {})
+	const x = 3
+	const y = 2
+	const z = 1
+	const genData: TreeProps['treeData'] = []
 
-	// 监听
-	watch()
+	const generateData = (_level: number, _preKey?: string, _tns?: TreeProps['treeData']) => {
+		const preKey = _preKey || '0'
+		const tns = _tns || genData
+
+		const children = []
+		for (let i = 0; i < x; i++) {
+			const key = `${preKey}-${i}`
+			tns.push({ title: key, key })
+			if (i < y) {
+				children.push(key)
+			}
+		}
+		if (_level < 0) {
+			return tns
+		}
+		const level = _level - 1
+		children.forEach((key, index) => {
+			tns[index].children = []
+			return generateData(level, key, tns[index].children)
+		})
+	}
+	generateData(z)
+
+	const dataList: TreeProps['treeData'] = []
+	const generateList = (data: TreeProps['treeData']) => {
+		for (let i = 0; i < data.length; i++) {
+			const node = data[i]
+			const key = node.key
+			dataList.push({ key, title: key })
+			if (node.children) {
+				generateList(node.children)
+			}
+		}
+	}
+	generateList(genData)
+
+	const getParentKey = (key: string | number, tree: TreeProps['treeData']): string | number | undefined => {
+		let parentKey
+		for (let i = 0; i < tree.length; i++) {
+			const node = tree[i]
+			if (node.children) {
+				if (node.children.some((item) => item.key === key)) {
+					parentKey = node.key
+				} else if (getParentKey(key, node.children)) {
+					parentKey = getParentKey(key, node.children)
+				}
+			}
+		}
+		return parentKey
+	}
+	const expandedKeys = ref<(string | number)[]>([])
+	const searchValue = ref<string>('')
+	const autoExpandParent = ref<boolean>(true)
+	const gData = ref<TreeProps['treeData']>(genData)
+
+	const onExpand = (keys: string[]) => {
+		expandedKeys.value = keys
+		autoExpandParent.value = false
+	}
+
+	watch(searchValue, (value) => {
+		const expanded = dataList
+			.map((item: TreeProps['treeData'][number]) => {
+				if (item.title.indexOf(value) > -1) {
+					return getParentKey(item.key, gData.value)
+				}
+				return null
+			})
+			.filter((item, i, self) => item && self.indexOf(item) === i)
+		expandedKeys.value = expanded
+
+		searchValue.value = value
+		autoExpandParent.value = true
+	})
 </script>
-<style lang="less" scoped></style>
+
+<style lang="less" scoped>
+	.table_item {
+		width: 100%;
+		display: flex;
+		padding: 15px 20px;
+
+		.table_left {
+			width: 25%;
+			padding: 10px;
+			margin-right: 10px;
+			background-color: #ffffff;
+		}
+		.table_right {
+			width: 70%;
+		}
+	}
+	:deep(.ant-card-body) {
+		text-align: center;
+	}
+	:deep(.ant-card-head) {
+		border-bottom: 1px solid #f0f0f0 !important;
+	}
+</style>

+ 109 - 1
snowy-admin-web/src/views/motoring/query/history.vue

@@ -1,10 +1,113 @@
 <template>
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
+			<template #operator>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="9">
+									<a-form-item label="采集时间" name="searchKey">
+										<a-range-picker
+											v-model:value="searchFormState.searchKey"
+											show-time
+											format="YYYY-MM-DD HH:mm:ss"
+											value-format="YYYY-MM-DD HH:mm:ss"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="7"
+									><a-form-item label="冷链编号" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入冷链编号" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="对象状态" name="syzt">
+										<a-select v-model:value="searchFormState.syzt" placeholder="请选择对象状态">
+											<a-select-option value="1">正常</a-select-option>
+											<a-select-option value="2">闲置</a-select-option>
+											<a-select-option value="3">维修</a-select-option>
+											<a-select-option value="4">报废</a-select-option>
+											<a-select-option value="5">化霜</a-select-option>
+											<a-select-option value="6">关机</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="监控点" name="jkdmc">
+										<a-select v-model:value="searchFormState.jkdmc" placeholder="请选择监控点名称">
+											<a-select-option value="1">监控点1</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="报警状态" name="bjzt">
+										<a-select v-model:value="searchFormState.jkdmc" placeholder="请选择报警状态">
+											<a-select-option value="1">正常</a-select-option>
+											<a-select-option value="2">报警</a-select-option>
+											<a-select-option value="3">预警</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="运行状态" name="yxzt">
+										<a-select v-model:value="searchFormState.yxzt" placeholder="请选择运行状态">
+											<a-select-option value="1">正常</a-select-option>
+											<a-select-option value="2">断线</a-select-option>
+											<a-select-option value="3">超限</a-select-option>
+											<a-select-option value="4">闲置维修</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="对象名称" name="dxmc">
+										<a-select v-model:value="searchFormState.dxmc" placeholder="请选择对象名称">
+											<a-select-option value="1">-20度冰箱</a-select-option>
+											<a-select-option value="2">-86度超低温冷冻储存箱</a-select-option>
+											<a-select-option value="3">90160189</a-select-option>
+											<a-select-option value="4">ABSL-3(II)超低温冰箱</a-select-option>
+											<a-select-option value="5">BSL-3(II)超低温冰箱</a-select-option>
+											<a-select-option value="6">超低温冰箱</a-select-option>
+											<a-select-option value="7">物联网变频超低温冰箱</a-select-option>
+											<a-select-option value="8">医用冰箱</a-select-option>
+											<a-select-option value="9">医用低温保存箱</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-right">
+						<a-button class="xn-mg08">
+							<template #icon><download-outlined /></template>导出
+						</a-button>
+						<a-button>
+							<template #icon><printer-outlined /></template>打印
+						</a-button>
+					</div>
+				</div>
+			</template>
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'state'">
 					<span>
-						<a-tag :color="record.state == '1' ? '#2db7f5' : record.state == '2' ? '#cd201f' : '#87d068'">
+						<a-tag :color="record.state == '1' ? '#87d068' : record.state == '2' ? '#cd201f' : '#50cd7c'">
 							{{ record.stateVlaue }}
 						</a-tag>
 					</span>
@@ -192,6 +295,11 @@
 			return obj
 		})
 	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
 </script>
 
 <style lang="less" scoped>

+ 0 - 1
snowy-admin-web/src/views/motoring/query/index.vue

@@ -6,7 +6,6 @@
 				<a-divider type="vertical" style="height: 15px; background-color: #f4f5f7; margin: 8px 20px" />
 				<div class="tbas-title" :class="activeKey == '2' ? 'active' : ''" @click="activeclick('2')">历史数据</div>
 			</div>
-			<a-button type="link" @click="leaveFor('/motoring/report')">更多</a-button>
 		</div>
 
 		<div class="query-body">

+ 81 - 18
snowy-admin-web/src/views/motoring/query/realtime.vue

@@ -2,15 +2,83 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.code">
 			<template #operator>
-				<div class="table-head">
-					<div class="head-left">
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="冷链编号" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入冷链编号" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="使用状态" name="syzt">
+										<a-select v-model:value="searchFormState.syzt" placeholder="请选择使用状态">
+											<a-select-option value="1">正常</a-select-option>
+											<a-select-option value="2">闲置</a-select-option>
+											<a-select-option value="3">维修</a-select-option>
+											<a-select-option value="4">报废</a-select-option>
+											<a-select-option value="5">化霜</a-select-option>
+											<a-select-option value="6">关机</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="运行状态" name="yxzt">
+										<a-select v-model:value="searchFormState.yxzt" placeholder="请选择运行状态">
+											<a-select-option value="1">正常</a-select-option>
+											<a-select-option value="2">断线</a-select-option>
+											<a-select-option value="3">超限</a-select-option>
+											<a-select-option value="4">闲置维修</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="对象名称" name="dxmc">
+										<a-select v-model:value="searchFormState.dxmc" placeholder="请选择对象名称">
+											<a-select-option value="1">-20度冰箱</a-select-option>
+											<a-select-option value="2">-86度超低温冷冻储存箱</a-select-option>
+											<a-select-option value="3">90160189</a-select-option>
+											<a-select-option value="4">ABSL-3(II)超低温冰箱</a-select-option>
+											<a-select-option value="5">BSL-3(II)超低温冰箱</a-select-option>
+											<a-select-option value="6">超低温冰箱</a-select-option>
+											<a-select-option value="7">物联网变频超低温冰箱</a-select-option>
+											<a-select-option value="8">医用冰箱</a-select-option>
+											<a-select-option value="9">医用低温保存箱</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="监控点" name="jkdmc">
+										<a-select v-model:value="searchFormState.jkdmc" placeholder="请选择监控点名称">
+											<a-select-option value="1">监控点1</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
+						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
+						<a-button class="xn-mg08" @click="reset">重置</a-button>
+					</div>
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-left">
 						剩余刷新时间:<text style="color: #1c8fff">{{ 33 }}</text>
 					</div>
-					<div class="head-right">
-						<a-button>
-							<template #icon><search-outlined /></template>搜索
-						</a-button>
-						<a-button>
+					<div class="btn-right">
+						<a-button class="xn-mg08">
 							<template #icon><download-outlined /></template>导出
 						</a-button>
 						<a-button>
@@ -22,7 +90,7 @@
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'state'">
 					<span>
-						<a-tag :color="record.state == '1' ? '#2db7f5' : record.state == '2' ? '#cd201f' : '#87d068'">
+						<a-tag :color="record.state == '1' ? '#87d068' : record.state == '2' ? '#cd201f' : '#50cd7c'">
 							{{ record.stateVlaue }}
 						</a-tag>
 					</span>
@@ -210,22 +278,17 @@
 			return obj
 		})
 	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
 </script>
 
 <style lang="less" scoped>
 	.table_item {
 		padding: 15px 20px;
 
-		.table-head {
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-
-			.ant-btn {
-				margin-left: 10px;
-			}
-		}
-
 		:deep(.ant-table-pagination-right) {
 			justify-content: center !important;
 		}

+ 97 - 0
snowy-admin-web/src/views/motoring/report/form.vue

@@ -0,0 +1,97 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '报警处理' : '报警确定'"
+		:width="550"
+		:visible="visible"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="Inline" :label-col="labelCol">
+			<a-form-item label="发生时间" name="fssj">
+				<a-date-picker show-time placeholder="请选择发生时间" @change="onChange" style="width: 100%" />
+			</a-form-item>
+
+			<a-form-item label="设备" name="sb">
+				<a-input v-model:value="formData.sb" placeholder="请输入设备" allow-clear />
+			</a-form-item>
+			<a-form-item label="报警原因" name="bjyy">
+				<a-input v-model:value="formData.bjyy" placeholder="请输入报警原因" allow-clear />
+			</a-form-item>
+			<a-form-item label="故障类型:" name="gzlx">
+				<a-select ref="select" v-model:value="formData.gzlx" style="width: 100%">
+					<a-select-option value="1">超限报警</a-select-option>
+				</a-select>
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button class="xn-mr8" @click="onClose">退出</a-button>
+			<a-button type="primary" @click="onSubmit">报警确定</a-button>
+		</template>
+		<Icon-selector ref="iconSelectorRef" @iconCallBack="iconCallBack" />
+	</xn-form-container>
+</template>
+
+<script setup>
+	import ColorPicker from '@/components/ColorPicker/index.vue'
+	import { required } from '@/utils/formRules'
+	import moduleApi from '@/api/sys/resource/moduleApi'
+	import IconSelector from '@/components/Selector/iconSelector.vue'
+	// 默认是关闭状态
+	const visible = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	const labelCol = { style: { width: '80px' } }
+	const treeData = ref([])
+	const iconSelectorRef = ref()
+	// 表单数据
+	const formData = ref({})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		visible.value = true
+
+		if (record) {
+			formData.value = Object.assign({}, record)
+		} else {
+			formData.value = {}
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		visible.value = false
+	}
+	// 报警时间
+	const onChange = (value, dateString) => {
+		formData.value.bjkssj = dateString
+		console.log('报警时间', dateString)
+	}
+
+	// 默认要校验的
+	const formRules = {
+		fssj: [required('请选择发生时间')],
+		sb: [required('请输入设备')],
+		bjyy: [required('请输入报警原因')],
+		gzlx: [required('请选择故障类型')]
+	}
+
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				console.log(formData.value, '提交数据')
+
+				// moduleApi.submitForm(formData.value, formData.value.id).then(() => {
+				// 	onClose()
+				// 	emit('successful')
+				// })
+			})
+			.catch(() => {})
+	}
+
+	// 调用这个函数将子组件的一些数据和方法暴露出去
+	defineExpose({
+		onOpen
+	})
+</script>

+ 0 - 1
snowy-admin-web/src/views/motoring/report/index.vue

@@ -6,7 +6,6 @@
 				<a-divider type="vertical" style="height: 15px; background-color: #f4f5f7; margin: 8px 20px" />
 				<div class="tbas-title" :class="activeKey == '2' ? 'active' : ''" @click="activeclick('2')">报警通知列表</div>
 			</div>
-			<a-button type="link" @click="leaveFor('/motoring/report')">更多</a-button>
 		</div>
 
 		<div class="query-body">

+ 203 - 143
snowy-admin-web/src/views/motoring/report/list.vue

@@ -2,78 +2,189 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.dxbh">
 			<template #operator>
-				<div class="table-head">
-					<div class="head-left">
-						<a-form
-							ref="searchFormRef"
-							name="advanced_search"
-							:model="searchFormState"
-							class="ant-advanced-search-form"
-						>
-							<a-form-item label="报警时间" name="searchKey">
-								<a-range-picker v-model:value="searchFormState.searchKey" value-format="YYYY/MM/DD" />
-							</a-form-item>
-						</a-form>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="报警时间" name="searchKey">
+										<a-range-picker
+											v-model:value="searchFormState.searchKey"
+											value-format="YYYY/MM/DD"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="报警状态" name="jkdmc">
+										<a-select v-model:value="searchFormState.jkdmc" placeholder="请选择报警状态">
+											<a-select-option value="1">已处理</a-select-option>
+											<a-select-option value="2">未处理</a-select-option>
+											<a-select-option value="3">处理中</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="对象编码" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入对象编码" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="对象名称" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入对象名称" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="发生时间" name="syzt">
+										<a-select v-model:value="searchFormState.syzt" placeholder="请选择发生时间">
+											<a-select-option value="1">>10分钟</a-select-option>
+											<a-select-option value="2">>30分钟</a-select-option>
+											<a-select-option value="3">>1小时</a-select-option>
+											<a-select-option value="4">>5小时</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="报警类型" name="jkdmc">
+										<a-select v-model:value="searchFormState.jkdmc" placeholder="请选择报警类型">
+											<a-select-option value="1">超限报警</a-select-option>
+											<a-select-option value="2">传感器故障</a-select-option>
+											<a-select-option value="3">电池报警</a-select-option>
+											<a-select-option value="4">断线报警</a-select-option>
+											<a-select-option value="5">其他报警</a-select-option>
+											<a-select-option value="6">外部电源断开</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="报警原因" name="bjyy">
+										<a-input v-model:value="searchFormState.bjyy" placeholder="请输入报警原因" /> </a-form-item
+								></a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
 						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
 						<a-button class="xn-mg08" @click="reset">重置</a-button>
 					</div>
-					<div class="head-right">
-						<a-button>
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-right">
+						<a-button class="xn-mg08">
 							<template #icon><logout-outlined /></template>处理
 						</a-button>
-						<a-button>
+						<a-button class="xn-mg08">
 							<template #icon><logout-outlined /></template>全部处理
 						</a-button>
 						<a-button>
 							<template #icon><download-outlined /></template>导出
 						</a-button>
-						<a-button>
-							<template #icon><search-outlined /></template>搜索模式
-						</a-button>
 					</div>
 				</div>
 			</template>
+
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'clzt'">
-					<span>
-						<a-tag :color="record.clzt == '1' ? '#cd201f' : record.clzt == '2' ? '#2db7f5' : '#87d068'">
+					<span style="cursor: pointer">
+						<a-tag color="#cd201f" v-if="record.clzt == '1'" @click="formRef.onOpen(record)">
+							<template #icon>
+								<form-outlined />
+							</template>
+							{{ record.clztValue }}
+						</a-tag>
+
+						<a-tag v-else-if="record.clzt == '2'" color="#87d068">
 							{{ record.clztValue }}
 						</a-tag>
 					</span>
 				</template>
 			</template>
+			<template #expandedRowRender="{ record }">
+				<a-tabs v-model:activeKey="record.activeKey" size="small" type="card">
+					<a-tab-pane key="1" tab="处理过程">
+						<div class="list">
+							<a-descriptions title="报警信息" bordered size="small">
+								<a-descriptions-item label="报警时间">{{ record.zjbjsj }}</a-descriptions-item>
+								<a-descriptions-item label="报警类型">{{ record.bjlx }}</a-descriptions-item>
+								<a-descriptions-item label="设备名称">{{ record.sbmc }}</a-descriptions-item>
+							</a-descriptions>
+
+							<a-descriptions title="报警通知" bordered size="small">
+								<a-descriptions-item label="接收人" :span="2">{{ record.jsr }}</a-descriptions-item>
+								<a-descriptions-item label="报警方式" :span="2">{{ record.type }}</a-descriptions-item>
+								<a-descriptions-item label="详情">{{ record.xq }}</a-descriptions-item>
+							</a-descriptions>
+
+							<a-descriptions title="解决过程" bordered size="small">
+								<a-descriptions-item label="响应时间">{{ record.xysj }}</a-descriptions-item>
+								<a-descriptions-item label="处理人">{{ record.clr }}</a-descriptions-item>
+								<a-descriptions-item label="处理时间">{{ record.clsj }}</a-descriptions-item>
+								<a-descriptions-item label="报警原因">{{ record.bjyy }}</a-descriptions-item>
+								<a-descriptions-item label="异常原因">{{ record.ycyy }}</a-descriptions-item>
+								<a-descriptions-item label="处理措施">{{ record.clcs }}</a-descriptions-item>
+							</a-descriptions>
+						</div>
+					</a-tab-pane>
+					<a-tab-pane key="2" tab="监控信息">
+						<div class="list">
+							<a-descriptions title="基本信息" bordered size="small">
+								<a-descriptions-item label="对象名称">{{ record.dxmc }}</a-descriptions-item>
+								<a-descriptions-item label="对象编号">{{ record.dxbh }}</a-descriptions-item>
+								<a-descriptions-item label="购置日期">{{ record.gzrq }}</a-descriptions-item>
+								<a-descriptions-item label="品牌">{{ record.pp }}</a-descriptions-item>
+								<a-descriptions-item label="型号">{{ record.xh }}</a-descriptions-item>
+							</a-descriptions>
+
+							<a-descriptions title="归属信息" bordered size="small">
+								<a-descriptions-item label="所属部门">{{ record.ssbm }}</a-descriptions-item>
+								<a-descriptions-item label="对象编码">{{ record.dxbh }}</a-descriptions-item>
+							</a-descriptions>
+						</div>
+					</a-tab-pane>
+				</a-tabs>
+			</template>
 		</s-table>
+
+		<Form ref="formRef" @successful="tableRef.refresh(true)" />
 	</div>
 </template>
 
 <script setup>
 	import tool from '@/utils/tool'
 	import jobApi from '@/api/dev/jobApi'
+	import Form from './form.vue'
+	const formRef = ref()
 	const searchFormRef = ref()
 	const searchFormState = ref({})
 	const tableRef = ref()
+
 	const columns = [
 		{
 			title: '处理状态',
 			dataIndex: 'clzt',
 			align: 'center',
 			ellipsis: true,
-			sorter: true,
 			width: '10%'
 		},
 		{
 			title: '报警开始时间',
 			dataIndex: 'bjkssj',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '最近报警时间',
 			dataIndex: 'zjbjsj',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '所属部门',
@@ -85,8 +196,7 @@
 			title: '对象编码',
 			dataIndex: 'dxbh',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '对象名称',
@@ -113,39 +223,34 @@
 			ellipsis: true
 		},
 		{
-			title: '应时间',
+			title: '应时间',
 			dataIndex: 'xysj',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '处理时间',
 			dataIndex: 'clsj',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '处理人',
 			dataIndex: 'clr',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '异常原因',
 			dataIndex: 'ycyy',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '处理措施',
 			dataIndex: 'clcs',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		}
 	]
 
@@ -168,127 +273,75 @@
 						bjkssj: '2024-08-28 07:03:24',
 						zjbjsj: '2024-08-28 09:03:42',
 						ssbm: '上海海关技术中心',
-						dxbh: '',
+						dxbh: '1111',
 						dxmc: '-20度冰箱',
 						jsr: '周小杰',
-						bjlx: '超限报警',
+						bjlx: '超限报警1',
 						bjyy: '温度超上限',
 						bjyy: '温度超上限',
 						hfzcsj: '',
 						xysj: '',
-						clsj: '',
+						clsj: '2024-08-30 09:27:56',
 						clr: '',
 						ycyy: '',
 						clcs: '',
 						name: '-21度冰箱',
 						fsnr: '广州海关基数中心-[-20度冰箱]报警;温度超过上限:-7.7℃',
-						type: '短信报警',
+						type: '短信报警1',
 						dx: '13578945780',
 						dh: '/',
 						wx: '/',
 						yj: '/',
 						zt: '发送成功',
-						clcs: ''
-					},
-					{
-						clzt: '2',
-						clztValue: '已处理',
-						bjkssj: '2024-08-28 11:32:12',
-						zjbjsj: '2024-08-28 11:52:42',
-						ssbm: '上海海关技术中心',
-						dxbh: '',
-						dxmc: '-20度冰箱',
-						jsr: '周小杰',
-						bjlx: '超限报警',
-						bjyy: '温度超上限',
-						bjyy: '温度超上限',
-						hfzcsj: '',
-						xysj: '',
-						clsj: '',
-						clr: '',
-						ycyy: '',
-						clcs: ''
-					},
-					{
-						clzt: '1',
-						clztValue: '未处理',
-						bjkssj: '2024-08-28 13:07:34',
-						zjbjsj: '2024-08-28 13:10:12',
-						ssbm: '上海海关技术中心',
-						dxbh: '',
-						dxmc: '-20度冰箱',
-						jsr: '周小杰',
-						bjlx: '超限报警',
-						bjyy: '温度超上限',
-						bjyy: '温度超上限',
-						hfzcsj: '',
-						xysj: '',
-						clsj: '',
-						clr: '',
-						ycyy: '',
 						clcs: '',
-						name: '-23度冰箱'
+						sbmc: '冰箱',
+						xq: '2024-08-28 09:03:42 短信报警',
+						xysj: '2024-08-28 09:03:42',
+						clr: '周小杰',
+						dxlx: '冰箱',
+						gzrq: '2024-05-30 14:27:03',
+						pp: '海尔',
+						xh: '68'
 					},
 					{
 						clzt: '2',
 						clztValue: '已处理',
-						bjkssj: '2024-08-28 15:41:04',
-						zjbjsj: '2024-08-28 15:55:51',
-						ssbm: '上海海关技术中心',
-						dxbh: '',
-						dxmc: '-20度冰箱',
-						jsr: '周小杰',
-						bjlx: '超限报警',
+						bjkssj: '2024-08-31 09:24:56',
+						zjbjsj: '2024-08-31 11:15:10',
+						ssbm: '广州海关技术中心',
+						dxbh: '2222',
+						dxmc: '-56度冰箱',
+						jsr: '欧阳天添',
+						bjlx: '超限报警2',
 						bjyy: '温度超上限',
 						bjyy: '温度超上限',
 						hfzcsj: '',
 						xysj: '',
-						clsj: '',
+						clsj: '2024-09-01 11:56:01',
 						clr: '',
 						ycyy: '',
-						clcs: ''
-					},
-					{
-						clzt: '1',
-						clztValue: '未处理',
-						bjkssj: '2024-08-28 16:43:14',
-						zjbjsj: '2024-08-28 16:57:32',
-						ssbm: '上海海关技术中心',
-						dxbh: '',
-						dxmc: '-20度冰箱',
-						jsr: '周小杰',
-						bjlx: '超限报警',
-						bjyy: '温度超上限',
-						bjyy: '温度超上限',
-						hfzcsj: '',
-						xysj: '',
-						clsj: '',
-						clr: '',
-						ycyy: '',
-						clcs: ''
-					},
-					{
-						clzt: '2',
-						clztValue: '已处理',
-						bjkssj: '2024-08-28 18:21:33',
-						zjbjsj: '2024-08-28 18:33:12',
-						ssbm: '上海海关技术中心',
-						dxbh: '',
-						dxmc: '-20度冰箱',
-						jsr: '周小杰',
-						bjlx: '超限报警',
-						bjyy: '温度超上限',
-						bjyy: '温度超上限',
-						hfzcsj: '',
-						xysj: '',
-						clsj: '',
-						clr: '',
-						ycyy: '',
-						clcs: ''
+						clcs: '',
+						name: '-21度冰箱',
+						fsnr: '广州海关基数中心-[-56度冰箱]报警;温度超过上限:-7.7℃',
+						type: '电话报警',
+						dx: '15464789745',
+						dh: '/',
+						wx: '/',
+						yj: '/',
+						zt: '发送成功',
+						clcs: '',
+						sbmc: '冰箱',
+						xq: '2024-08-31 11:15:10 电话报警',
+						xysj: '2024-08-31 11:15:10',
+						clr: '欧阳天添',
+						dxlx: '冰箱',
+						gzrq: '2024-05-30 14:27:03',
+						pp: '海尔',
+						xh: '68'
 					}
 				],
 				size: 10,
-				total: 6
+				total: 1
 			}
 			return obj
 		})
@@ -303,22 +356,29 @@
 <style lang="less" scoped>
 	.table_item {
 		padding: 15px 20px;
-		.table-head {
-			width: 100%;
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-
-			.head-left {
-				display: flex;
-			}
-
-			.ant-btn {
-				margin-left: 10px;
-			}
-		}
 	}
 	:deep(.ant-table-pagination-right) {
 		justify-content: center !important;
 	}
+
+	:deep(.ant-descriptions-header) {
+		margin: 0;
+		padding: 10px;
+	}
+	.list {
+		width: 60%;
+		padding: 10px 20px;
+		border-radius: 10px;
+		background-color: #ffffff;
+
+		:deep(.ant-descriptions) {
+			margin-bottom: 10px;
+		}
+		:deep(.ant-descriptions-header) {
+			margin: 0;
+			padding: 10px;
+			border: 1px solid #f0f0f0;
+			border-bottom: none;
+		}
+	}
 </style>

+ 74 - 48
snowy-admin-web/src/views/motoring/report/noticelist.vue

@@ -2,28 +2,78 @@
 	<div class="table_item">
 		<s-table ref="tableRef" :columns="columns" :data="loadData" :row-key="(record) => record.sctime">
 			<template #operator>
-				<div class="table-head">
-					<div class="head-left">
-						<a-form
-							ref="searchFormRef"
-							name="advanced_search"
-							:model="searchFormState"
-							class="ant-advanced-search-form"
-						>
-							<a-form-item label="报警时间" name="searchKey">
-								<a-range-picker v-model:value="searchFormState.searchKey" value-format="YYYY/MM/DD" />
-							</a-form-item>
-						</a-form>
+				<!-- 搜索区域 -->
+				<div class="table-search">
+					<div class="table-search-form">
+						<a-row :gutter="10">
+							<a-form
+								ref="searchFormRef"
+								name="advanced_search"
+								layout="inline"
+								:label-col="{ style: { width: '70px', justifyContent: 'end' } }"
+								:model="searchFormState"
+								class="ant-advanced-search-form"
+							>
+								<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+									<a-form-item label="生成时间" name="searchKey">
+										<a-range-picker
+											v-model:value="searchFormState.searchKey"
+											value-format="YYYY/MM/DD"
+											style="width: 100%"
+										/>
+									</a-form-item>
+								</a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="接收人" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入接收人" /> </a-form-item
+								></a-col>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="通知类型" name="jkdmc">
+										<a-select v-model:value="searchFormState.jkdmc" placeholder="请选择通知类型">
+											<a-select-option value="1">短信报警</a-select-option>
+											<a-select-option value="2">电话报警</a-select-option>
+											<a-select-option value="3">微信报警</a-select-option>
+											<a-select-option value="4">邮件报警</a-select-option>
+											<a-select-option value="5">弹出报警</a-select-option>
+											<a-select-option value="6">音乐报警</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+									<a-form-item label="状态" name="jkdmc">
+										<a-select v-model:value="searchFormState.jkdmc" placeholder="请选择状态">
+											<a-select-option value="1">发送成功</a-select-option>
+											<a-select-option value="2">未发送</a-select-option>
+											<a-select-option value="3">发送失败</a-select-option>
+											<a-select-option value="4">非报警时间记录</a-select-option>
+										</a-select>
+									</a-form-item></a-col
+								>
+
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="对象编码" name="code">
+										<a-input v-model:value="searchFormState.code" placeholder="请输入对象编码" /> </a-form-item
+								></a-col>
+
+								<a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
+									><a-form-item label="对象名称" name="bjyy">
+										<a-input v-model:value="searchFormState.bjyy" placeholder="请输入对象名称" /> </a-form-item
+								></a-col>
+							</a-form>
+						</a-row>
+					</div>
+					<div class="table-search-buttons">
 						<a-button type="primary" @click="tableRef.refresh(true)">查询</a-button>
 						<a-button class="xn-mg08" @click="reset">重置</a-button>
 					</div>
-					<div class="head-right">
+				</div>
+
+				<!-- 其他操作区域 -->
+				<div class="table-head-btn">
+					<div class="btn-right">
 						<a-button>
 							<template #icon><download-outlined /></template>导出
 						</a-button>
-						<a-button>
-							<template #icon><search-outlined /></template>搜索模式
-						</a-button>
 					</div>
 				</div>
 			</template>
@@ -42,24 +92,19 @@
 			title: '生成时间',
 			dataIndex: 'sctime',
 			align: 'center',
-			ellipsis: true,
-			sorter: true,
-			width: '10%'
+			ellipsis: true
 		},
 		{
 			title: '发送时间',
 			dataIndex: 'fstime',
 			align: 'center',
-			ellipsis: true,
-			sorter: true,
-			width: '10%'
+			ellipsis: true
 		},
 		{
 			title: '接收人',
 			dataIndex: 'jsr',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '对象编码',
@@ -71,8 +116,7 @@
 			title: '对象名称',
 			dataIndex: 'name',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '发送内容',
@@ -103,29 +147,25 @@
 			title: '微信',
 			dataIndex: 'wx',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '邮件',
 			dataIndex: 'yj',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '状态',
 			dataIndex: 'zt',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		},
 		{
 			title: '故障原因',
 			dataIndex: 'gzyy',
 			align: 'center',
-			ellipsis: true,
-			sorter: true
+			ellipsis: true
 		}
 	]
 
@@ -249,20 +289,6 @@
 <style lang="less" scoped>
 	.table_item {
 		padding: 15px 20px;
-		.table-head {
-			width: 100%;
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-
-			.head-left {
-				display: flex;
-			}
-
-			.ant-btn {
-				margin-left: 10px;
-			}
-		}
 	}
 	:deep(.ant-table-pagination-right) {
 		justify-content: center !important;

+ 1 - 1
snowy-admin-web/tsconfig.json

@@ -8,5 +8,5 @@
 			"@/*": ["./src/*"]
 		}
 	},
-	"include": ["src/**/*"]
+	"include": ["src/**/*", "src/views/motoring/analyse/statistics.vue"]
 }