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

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	sa-frame/menu-list.js
lzm 2 роки тому
батько
коміт
4b6992b212

+ 127 - 54
sa-frame/menu-list-sp.js

@@ -371,9 +371,7 @@ window.menuList.unshift({
 		icon: 'el-icon-folder-opened',
 		info: '设备管理表数据的维护',
 		parent: true,
-		childList: [
-			
-			{
+		childList: [{
 				id: 'tb-venues-list',
 				name: '场所管理',
 				url: 'sa-view/tb-venues/tb-venues-list.html',
@@ -386,75 +384,150 @@ window.menuList.unshift({
 						id: 'tb-venues-del',
 						name: '删除',
 						isShow: false,
-			
+
 					},
 					{
 						id: 'tb-venues-edit',
 						name: '编辑',
 						isShow: false,
-			
+
 					},
 				]
 			},
 			{
-				id: 'tb-terminal-list',
-				name: '设备管理',
-				url: 'sa-view/tb-terminal/tb-terminal-list.html',
-				childList: [
-					{
-						id: 'tb-terminal-clear',
-						name: '清除数据',
-						isShow: false,
-							
-					},
-					{
-						id: 'tb-terminal-reboot',
-						name: '重启',
-						isShow: false,
-							
-					},
-					{
-						id: 'tb-terminal-open',
-						name: '远程开门',
-						isShow: false,
-							
-					},
-					{
-						id: 'tb-terminal-unbind',
-						name: '解绑',
-						isShow: false,
-							
-					},
-					{
-						id: 'tb-terminal-edit',
-						name: '编辑',
-						isShow: false,
-							
-					},
-					{
-						id: 'tb-terminal-del',
-						name: '删除',
-						isShow: false,
-							
+				id: 'tb-terminal',
+				name: '人脸设备管理',
+				icon: 'el-icon-folder-opened',
+				parent: true,
+				childList: [{
+						id: 'tb-terminal-list',
+						name: '人脸设备',
+						url: 'sa-view/tb-terminal/tb-terminal-list.html',
+						childList: [{
+								id: 'tb-terminal-clear',
+								name: '清除数据',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-terminal-reboot',
+								name: '重启',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-terminal-open',
+								name: '远程开门',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-terminal-sync-time',
+								name: '时钟同步',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-terminal-unbind',
+								name: '解绑',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-terminal-edit',
+								name: '编辑',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-terminal-del',
+								name: '删除',
+								isShow: false,
+
+							},
+						]
+					}, {
+						id: 'tb-command-log-list',
+						name: '命令日志',
+						url: 'sa-view/tb-command-log/tb-command-log-list.html',
+						childList: [{
+							id: 'tb-command-log-del',
+							name: '删除',
+							isShow: false,
+
+						}, ]
 					},
+
 				]
 			},
 			{
-				id: 'tb-command-log-list',
-				name: '命令日志',
-				url: 'sa-view/tb-command-log/tb-command-log-list.html',
-				childList: [
-					{
-						id: 'tb-command-log-del',
-						name: '删除',
-						isShow: false,
-							
+				id: 'tb-gate-terminal',
+				name: '车辆道闸',
+				parent: true,
+				icon: 'el-icon-folder-opened',
+				childList: [{
+						id: 'tb-gate-terminal-list',
+						name: '道闸设备',
+						url: 'sa-view/tb-gate-terminal/tb-gate-terminal-list.html',
+						childList: [{
+								id: 'tb-gate-terminal-open',
+								name: '远程开闸',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-gate-terminal-add',
+								name: '添加',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-gate-terminal-del',
+								name: '删除',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-gate-terminal-edit',
+								name: '修改',
+								isShow: false,
+
+							},
+						]
 					},
+					{
+						id: 'tb-gate-command-log-list',
+						name: '命令日志',
+						url: 'sa-view/tb-gate-command-log/tb-gate-command-log-list.html',
+						childList: [{
+							id: 'tb-gate-command-log-del',
+							name: '删除',
+							isShow: false,
+
+						}]
+					}
 				]
 			},
-			
+
+
 		]
 
+	}, {
+		id: 'tb-manager',
+		name: '防疫人员',
+		icon: 'el-icon-folder-opened',
+		info: '防疫人员表数据的维护',
+		childList: [{
+				id: 'tb-manager-list',
+				name: '防疫人员-列表',
+				url: 'sa-view/tb-manager/tb-manager-list.html'
+			},
+			{
+				id: 'tb-manager-add',
+				name: '防疫人员-添加',
+				url: 'sa-view/tb-manager/tb-manager-add.html'
+			},
+		]
 	},
 	{
 		id: 'ep-monitor-system',

+ 10 - 0
sa-frame/menu-list.js

@@ -16,5 +16,15 @@
 
 // 定义菜单列表 
 var menuList =	[
+	{
+		id: 'tb-gate-command-log',
+		name: '车辆道闸命令日志',
+		icon: 'el-icon-folder-opened',
+		info: '车辆道闸命令日志表数据的维护',
+		childList: [
+			{id: 'tb-gate-command-log-list', name: '车辆道闸命令日志-列表', url: 'sa-view/tb-gate-command-log/tb-gate-command-log-list.html'},
+			{id: 'tb-gate-command-log-add', name: '车辆道闸命令日志-添加', url: 'sa-view/tb-gate-command-log/tb-gate-command-log-add.html'},
+		]
+	},
 
 ]

+ 0 - 1
sa-view/tb-command-log/tb-command-log-list.html

@@ -32,7 +32,6 @@
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList">
 					<sa-td name="序号" type="index"></sa-td>
-					
 					<sa-td name="设备名" prop="terminalName"></sa-td>
 					<sa-td name="通道" prop="channelName"></sa-td>
 					<sa-td name="下发时间" prop="createTime"></sa-td>

+ 127 - 0
sa-view/tb-gate-command-log/tb-gate-command-log-add.html

@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>车辆道闸命令日志-添加/修改</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<sa-item type="text" name="部门ID" v-model="m.deptId" br></sa-item>
+						<sa-item type="text" name="命令" v-model="m.command" br></sa-item>
+						<sa-item type="text" name="设备SN" v-model="m.sn" br></sa-item>
+						<sa-item type="text" name="设备名" v-model="m.terminalName" br></sa-item>
+						<sa-item type="text" name="通道" v-model="m.venuesName" br></sa-item>
+						<sa-item type="text" name="下发时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="回复内容" v-model="m.responseContent" br></sa-item>
+						<sa-item type="text" name="创建人" v-model="m.createBy" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							deptId: '',		// 部门ID 
+							command: '',		// 命令 
+							sn: '',		// 设备SN 
+							terminalName: '',		// 设备名 
+							venuesName: '',		// 通道 
+							createTime: '',		// 下发时间 
+							responseContent: '',		// 回复内容 
+							createBy: '',		// 创建人 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.deptId, '请输入 [部门ID]');
+						sa.checkNull(m.command, '请输入 [命令]');
+						sa.checkNull(m.sn, '请输入 [设备SN]');
+						sa.checkNull(m.terminalName, '请输入 [设备名]');
+						sa.checkNull(m.venuesName, '请输入 [通道]');
+						sa.checkNull(m.createTime, '请输入 [下发时间]');
+						sa.checkNull(m.responseContent, '请输入 [回复内容]');
+						sa.checkNull(m.createBy, '请输入 [创建人]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbGateCommandLog/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbGateCommandLog/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/TbGateCommandLog/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 68 - 0
sa-view/tb-gate-command-log/tb-gate-command-log-info.html

@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>车辆道闸命令日志-详情</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="部门ID" br>{{m.deptId}}</sa-info>
+						<sa-info name="命令" br>{{m.command}}</sa-info>
+						<sa-info name="设备SN" br>{{m.sn}}</sa-info>
+						<sa-info name="设备名" br>{{m.terminalName}}</sa-info>
+						<sa-info name="通道" br>{{m.venuesName}}</sa-info>
+						<sa-info name="下发时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="回复内容" br>{{m.responseContent}}</sa-info>
+						<sa-info name="创建人" br>{{m.createBy}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/TbGateCommandLog/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 165 - 0
sa-view/tb-gate-command-log/tb-gate-command-log-list.html

@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>车辆道闸命令日志-列表</title>
+		<meta charset="utf-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="设备名" v-model="p.terminalName"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<!-- ------------- 快捷按钮 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList">
+					<sa-td name="序号" type="index"></sa-td>
+				
+					<sa-td name="设备名" prop="terminalName"></sa-td>
+					<sa-td name="设备SN" prop="sn"></sa-td>
+					<sa-td name="通道" prop="venuesName"></sa-td>
+					<sa-td name="下发时间" prop="createTime"></sa-td>
+					<el-table-column label="下发命令">
+						<template slot-scope="s">
+							<el-button class="c-btn" @click="showCommand(s.row.command)">查看
+							</el-button>
+						</template>
+					</el-table-column>
+					<el-table-column label="回复内容">
+						<template slot-scope="s">
+							<el-button class="c-btn" @click="showCommand(s.row.responseContent)">查看
+							</el-button>
+						</template>
+					</el-table-column>
+					<sa-td name="下发人员" prop="createBy"></sa-td>
+					<el-table-column label="操作" fixed="right" width="240px">
+						<template slot-scope="s">
+							<el-button v-if="sa.isAuth('tb-gate-command-log-del')" class="c-btn" type="danger"
+								icon="el-icon-delete" @click="del(s.row)">删除
+							</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()">
+				</sa-item>
+			</div>
+			<el-dialog title="查看" :visible.sync="commandVisible" width="500px">
+				<span>{{commandContent}}</span>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="commandVisible = false">关 闭</el-button>
+				</span>
+			</el-dialog>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+				},
+				el: '.vue-box',
+				data: {
+					title:'',
+					commandVisible:false,
+					commandContent:'',
+					p: { // 查询参数  
+						id: '', // 主键 
+						deptId: '', // 部门ID 
+						command: '', // 命令 
+						sn: '', // 设备SN 
+						terminalName: '', // 设备名 
+						venuesName: '', // 通道 
+						createTime: '', // 下发时间 
+						responseContent: '', // 回复内容 
+						createBy: '', // 创建人 
+						pageNo: 1, // 当前页 
+						pageSize: 10, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					showCommand(content) {
+						this.commandVisible = true;
+						this.commandContent = content
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbGateCommandLog/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight(); // 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-gate-command-log-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if (selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-gate-command-log-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-gate-command-log-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbGateCommandLog/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if (selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/TbGateCommandLog/deleteByIds', {
+								ids: ids.join(',')
+							}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 137 - 0
sa-view/tb-gate-terminal/tb-gate-terminal-add.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>车辆道闸-添加/修改</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<style type="text/css">
+			.c-panel .el-form .c-label {
+				width: 7em !important;
+			}
+
+			.c-panel .el-form .el-input,
+			.c-panel .el-form .el-textarea__inner {
+				width: 250px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<sa-item type="text" name="名称" v-model="m.name" br need></sa-item>
+						<div class="c-item">
+							<label class="c-label"><span style="color: red;">*</span>入场通道:</label>
+							<el-select v-model="m.venuesId" placeholder="请选择">
+								<el-option-group v-for="(area,index) in areaList" :key="index" :label="area.name">
+									<el-option v-for="item in area.children" :key="item.id" :label="item.name"
+										:value="item.id">
+									</el-option>
+								</el-option-group>
+							</el-select>
+						</div>
+						<sa-item type="enum" name="方向" v-model="m.direction" :jv="{1: '入场', 2: '离场'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="IP地址" v-model="m.ip" br need></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					areaList: [],
+					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null, // 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '', // 主键 
+							name: '', // 名称 
+							deptId: '', // 部门id 
+							direction: 1, // 序列号 
+							ip: '', // IP地址 
+							state: '', // 状态 
+							createTime: '', // 创建时间 
+							updateTime: '', // 更新时间 
+						}
+					},
+					getVenuesList() {
+						sa.ajax('/TbVenues/getTree', function(res) {
+							this.areaList = res.data; // 数据
+						}.bind(this));
+					},
+					// 提交数据 
+					ok: function() {
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.venuesId, '请选择道闸通道');
+						sa.checkNull(m.ip, '请填写IP地址');
+						// 开始增加或修改
+						if (this.id <= 0) { // 添加
+							sa.ajax('/TbGateTerminal/add', m, function(res) {
+								sa.alert('增加成功', this.clean);
+							}.bind(this));
+						} else { // 修改
+							sa.ajax('/TbGateTerminal/update', m, function(res) {
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if (this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5(); // 刷新父页面列表
+							sa.closeCurrIframe(); // 关闭本页 
+						}
+					}
+				},
+				mounted: function() {
+					this.getVenuesList();
+					// 初始化数据 
+					if (this.id <= 0) {
+						this.m = this.createModel();
+					} else {
+						sa.ajax('/TbGateTerminal/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if (res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+		</script>
+	</body>
+</html>

+ 67 - 0
sa-view/tb-gate-terminal/tb-gate-terminal-info.html

@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>车辆道闸-详情</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info name="部门id" br>{{m.deptId}}</sa-info>
+						<sa-info name="序列号" br>{{m.sn}}</sa-info>
+						<sa-info name="IP地址" br>{{m.ip}}</sa-info>
+						<sa-info name="状态" br>{{m.state}}</sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/TbGateTerminal/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 156 - 0
sa-view/tb-gate-terminal/tb-gate-terminal-list.html

@@ -0,0 +1,156 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>车辆道闸-列表</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="名称" v-model="p.name"></sa-item>
+					<sa-item type="text" name="IP地址" v-model="p.ip"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button type="primary" icon="el-icon-plus" @click="add" v-if="sa.isAuth('tb-gate-terminal-add')">新增</el-button>
+					<el-button type="info"  icon="el-icon-refresh"  @click="p.name='',p.ip='',f5()">重置</el-button>
+					
+				</el-form>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td name="序号" type="index"></sa-td>
+					<sa-td name="名称" prop="name" ></sa-td>
+					<sa-td name="所属组织" prop="deptName" ></sa-td>
+					<sa-td name="所在道闸" prop="venuesName" ></sa-td>
+					<sa-td name="方向" prop="direction" type="enum" :jv="{1: '入场', 2: '离场'}"></sa-td>
+					<sa-td name="序列号" prop="sn" ></sa-td>
+					<sa-td name="IP地址" prop="ip" ></sa-td>
+					<el-table-column label="通讯">
+						<template slot-scope="s">
+							<el-button class="c-btn" @click="checkFn(s.row)">检测
+							</el-button>
+						</template>
+					</el-table-column>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<el-table-column label="操作" fixed="right"  width="240px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" @click="open(s.row)">开闸</el-button>
+							<el-button class="c-btn" type="primary"  @click="update(s.row)">修改</el-button>
+							<el-button class="c-btn" type="danger" @click="del(s.row)">删除</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),  
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),		
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 名称 
+						deptId: '',		// 部门id 
+						sn: '',		// 序列号 
+						ip: '',		// IP地址 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					open(data){
+						sa.confirm('是否远程开闸?', function() {
+							sa.ajax('/TbGateTerminal/open?id=' + data.id, function(res) {
+								sa.ok('开闸成功');
+							}.bind(this))
+						}.bind(this));
+					},
+					checkFn(data){
+						sa.ajax('/TbGateTerminal/check', data, function(res) {
+							sa.ok('通讯正常');
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbGateTerminal/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-gate-terminal-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-gate-terminal-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-gate-terminal-add.html?id=-1', '700px', '60%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbGateTerminal/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/TbGateTerminal/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 3 - 5
sa-view/tb-terminal/tb-terminal-add.html

@@ -44,6 +44,7 @@
 								</el-option-group>
 							</el-select>
 						</div>
+						<sa-item type="enum" name="方向" v-model="m.direction" :jv="{1: '入场', 2: '离场'}" jtype="3" br></sa-item>
 						<sa-item type="textarea" name="备注" v-model="m.remark" br></sa-item>
 						<sa-item name="" class="s-ok" br>
 							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
@@ -74,15 +75,12 @@
 						state: '', // 状态(0=离线,1=正常 no-add no-s) 
 						sn: '', // 序列号 
 						venuesId: '', // 场所ID 
+						direction:1,
 						venuesName: '', // 场所名称 
 						channelId: '', // 通道ID 
 						channelName: '', // 通道名称 
-						lastOnLine: '', // 最近一次上线 
 						remark: '', // 备注 
-						createTime: '', // 创建时间 
-						createBy: '', // 创建人 
-						updateTime: '', // 更新时间 
-						updateBy: '', // 更新人 
+	
 					}, // 实体对象 
 				},
 				methods: {

+ 10 - 1
sa-view/tb-terminal/tb-terminal-list.html

@@ -37,8 +37,9 @@
 				<el-table class="data-table" ref="data-table" :data="dataList">
 					<sa-td name="序号" type="index"></sa-td>
 					<sa-td name="名称" prop="name"></sa-td>
-					<sa-td name="部门" prop="deptName"></sa-td>
+					<sa-td name="组织" prop="deptName" width="180"></sa-td>
 					<sa-td name="IP地址" prop="ipAddress"></sa-td>
+					<sa-td name="方向" prop="direction" type="enum" :jv="{1: '入场', 2: '离场'}"></sa-td>
 					<sa-td name="状态" prop="state"></sa-td>
 					<sa-td name="人脸数" prop="personNum"></sa-td>
 					<sa-td name="SN" prop="sn" width="260"></sa-td>
@@ -55,6 +56,9 @@
 							<el-button v-if="sa.isAuth('tb-terminal-open')" class="c-btn" type="success"
 								 @click="open(s.row)">开门
 							</el-button>
+							<el-button v-if="sa.isAuth('tb-terminal-sync-time')" class="c-btn" type="primary"
+								 @click="sync(s.row)">时钟同步
+							</el-button>
 							<el-button v-if="sa.isAuth('tb-terminal-clear')" class="c-btn" type="danger"
 								 @click="clear(s.row)">清除
 							</el-button>
@@ -91,6 +95,11 @@
 					dataList: [], // 数据集合 
 				},
 				methods: {
+					sync(data){
+						sa.ajax('/TbTerminal/sync-time?id=' + data.id, function(res) {
+							sa.ok('命令已下发');
+						}.bind(this))
+					},
 					open(data) {
 						sa.confirm('是否确定远程开门?', function() {
 							sa.ajax('/TbTerminal/open?id=' + data.id, function(res) {