소스 검색

人脸设备对接

qzyReal 3 년 전
부모
커밋
e6a7f9ba59
29개의 변경된 파일2851개의 추가작업 그리고 594개의 파일을 삭제
  1. 433 316
      sa-frame/menu-list-sp.js
  2. 10 0
      sa-frame/menu-list.js
  3. 0 7
      sa-view/tb-car-filing/tb-car-filing-add.html
  4. 1 3
      sa-view/tb-car-filing/tb-car-filing-info.html
  5. 0 2
      sa-view/tb-car-filing/tb-car-filing-list.html
  6. 147 0
      sa-view/tb-car-visit-record/tb-car-visit-record-add.html
  7. 144 0
      sa-view/tb-car-visit-record/tb-car-visit-record-handler.html
  8. 74 0
      sa-view/tb-car-visit-record/tb-car-visit-record-info.html
  9. 166 0
      sa-view/tb-car-visit-record/tb-car-visit-record-list.html
  10. 133 0
      sa-view/tb-command-log/tb-command-log-add.html
  11. 74 0
      sa-view/tb-command-log/tb-command-log-info.html
  12. 146 0
      sa-view/tb-command-log/tb-command-log-list.html
  13. 142 0
      sa-view/tb-manager/tb-manager-add.html
  14. 73 0
      sa-view/tb-manager/tb-manager-info.html
  15. 183 0
      sa-view/tb-manager/tb-manager-list.html
  16. 6 12
      sa-view/tb-person-filing/tb-person-filing-add.html
  17. 1 3
      sa-view/tb-person-filing/tb-person-filing-info.html
  18. 11 9
      sa-view/tb-person-filing/tb-person-filing-list.html
  19. 187 0
      sa-view/tb-person-visit-record/tb-person-visit-record-add.html
  20. 179 0
      sa-view/tb-person-visit-record/tb-person-visit-record-edit.html
  21. 76 0
      sa-view/tb-person-visit-record/tb-person-visit-record-info.html
  22. 176 0
      sa-view/tb-person-visit-record/tb-person-visit-record-list.html
  23. 168 0
      sa-view/tb-person-visit-record/tb-person-visit-temperature-list.html
  24. 65 89
      sa-view/tb-terminal/tb-terminal-add.html
  25. 91 95
      sa-view/tb-terminal/tb-terminal-list.html
  26. 28 13
      sa-view/tb-venues/tb-venues-add.html
  27. 107 0
      sa-view/tb-venues/tb-venues-addchildren.html
  28. 1 4
      sa-view/tb-venues/tb-venues-info.html
  29. 29 41
      sa-view/tb-venues/tb-venues-list.html

+ 433 - 316
sa-frame/menu-list-sp.js

@@ -2,341 +2,458 @@
 // 如需添加自定义菜单,请不要更改此文件,请在 menu-list.js 里添加 (没有这个文件就新建)
 window.menuList = window.menuList || [];
 window.menuList.unshift({
-	id: 'bas',
-	name: '身份相关',
-	isShow: false, // 隐藏显示
-	childList: [{
-			id: 'dev',
-			name: '开发者权限',
-			isShow: false
-		},
-		{
-			id: 'in-system',
-			name: '后台管理权限',
-			isShow: false
-		},
-	]
-}, {
-	id: 'auth',
-	name: '基础数据管理',
-	icon: 'el-icon-unlock',
-	parent: true,
+		id: 'bas',
+		name: '身份相关',
+		isShow: false, // 隐藏显示
+		childList: [{
+				id: 'dev',
+				name: '开发者权限',
+				isShow: false
+			},
+			{
+				id: 'in-system',
+				name: '后台管理权限',
+				isShow: false
+			},
+		]
+	}, {
+		id: 'auth',
+		name: '基础数据管理',
+		icon: 'el-icon-unlock',
+		parent: true,
 
-	childList: [{
-			id: 'tb-dept-list',
-			name: '组织管理',
-			url: 'sa-view/tb-dept/tb-dept-list.html',
-			childList: [{
-					id: 'tb-dept-add',
-					name: '添加',
-					isShow: false,
-				},
-				{
-					id: 'tb-dept-del',
-					name: '删除',
-					isShow: false,
+		childList: [{
+				id: 'tb-dept-list',
+				name: '组织管理',
+				url: 'sa-view/tb-dept/tb-dept-list.html',
+				childList: [{
+						id: 'tb-dept-add',
+						name: '添加',
+						isShow: false,
+					},
+					{
+						id: 'tb-dept-del',
+						name: '删除',
+						isShow: false,
 
-				},
-				{
-					id: 'tb-dept-edit',
-					name: '编辑',
-					isShow: false,
+					},
+					{
+						id: 'tb-dept-edit',
+						name: '编辑',
+						isShow: false,
 
-				},
-			]
-		},
-		{
-			id: 'admin-list',
-			name: '用户管理',
-			url: 'sa-view-sp/sp-admin/admin-list.html',
-			info: '所有管理员账号',
-			childList: [{
-					id: 'sp-admin-add',
-					name: '添加',
-					isShow: false,
-				},
-				{
-					id: 'sp-admin-del',
-					name: '删除',
-					isShow: false,
+					},
+				]
+			},
+			{
+				id: 'admin-list',
+				name: '用户管理',
+				url: 'sa-view-sp/sp-admin/admin-list.html',
+				info: '所有管理员账号',
+				childList: [{
+						id: 'sp-admin-add',
+						name: '添加',
+						isShow: false,
+					},
+					{
+						id: 'sp-admin-del',
+						name: '删除',
+						isShow: false,
 
-				},
-				{
-					id: 'sp-admin-edit',
-					name: '编辑',
-					isShow: false,
+					},
+					{
+						id: 'sp-admin-edit',
+						name: '编辑',
+						isShow: false,
 
-				},
-			]
-		},
-		{
-			id: 'role-list',
-			name: '角色管理',
-			url: 'sa-view-sp/sp-role/role-list.html',
-			info: '管理系统各种角色',
-			childList: [{
-					id: 'sp-role-add',
-					name: '添加',
-					isShow: false,
-				},
-				{
-					id: 'sp-role-del',
-					name: '删除',
-					isShow: false,
+					},
+				]
+			},
+			{
+				id: 'role-list',
+				name: '角色管理',
+				url: 'sa-view-sp/sp-role/role-list.html',
+				info: '管理系统各种角色',
+				childList: [{
+						id: 'sp-role-add',
+						name: '添加',
+						isShow: false,
+					},
+					{
+						id: 'sp-role-del',
+						name: '删除',
+						isShow: false,
 
-				},
-				{
-					id: 'sp-role-edit',
-					name: '编辑',
-					isShow: false,
+					},
+					{
+						id: 'sp-role-edit',
+						name: '编辑',
+						isShow: false,
 
-				},
-				{
-					id: 'sp-role-permission',
-					name: '分配权限',
-					isShow: false,
+					},
+					{
+						id: 'sp-role-permission',
+						name: '分配权限',
+						isShow: false,
 
-				},
-			]
-		},
-		{
-			id: 'menu-list',
-			name: '菜单列表',
-			url: 'sa-view-sp/sp-role/menu-list.html',
-			info: '所有菜单项预览'
-		},
-		{
-			id: 'apilog-list',
-			name: '日志管理',
-			url: 'sa-view-sp/sp-apilog/api-log-list.html',
-			info: '记录本系统所有的api请求'
-		},
-		{
-			id: 'sys-dict-list',
-			name: '字典管理',
-			url: 'sa-view/sys-dict/sys-dict-list.html',
+					},
+				]
+			},
+			{
+				id: 'menu-list',
+				name: '菜单列表',
+				url: 'sa-view-sp/sp-role/menu-list.html',
+				info: '所有菜单项预览'
+			},
+			{
+				id: 'apilog-list',
+				name: '日志管理',
+				url: 'sa-view-sp/sp-apilog/api-log-list.html',
+				info: '记录本系统所有的api请求'
+			},
+			{
+				id: 'sys-dict-list',
+				name: '字典管理',
+				url: 'sa-view/sys-dict/sys-dict-list.html',
+				childList: [{
+						id: 'sys-dict-add',
+						name: '添加',
+						isShow: false,
+					},
+					{
+						id: 'sys-dict-del',
+						name: '删除',
+						isShow: false,
+
+					},
+					{
+						id: 'sys-dict-edit',
+						name: '编辑',
+						isShow: false,
+
+					},
+
+				]
+			},
+		]
+	}, {
+		id: 'console',
+		name: '监控中心',
+		parent: true,
+		icon: 'el-icon-view',
+		info: '对本系统的各种监控',
+		childList: [{
+				id: 'redis-console',
+				name: 'Redis控制台',
+				url: 'sa-view-sp/sp-console/redis-console.html',
+				info: 'redis常用工具'
+			},
+
+			{
+				id: 'sql-console',
+				name: 'SQL 监控台',
+				url: 'sa-view-sp/sp-console/sql-console.html',
+				info: 'sql控制台'
+			},
+			{
+				id: 'form-generator',
+				name: '在线表单构建',
+				url: 'https://mrhj.gitee.io/form-generator/#/'
+			},
+		]
+	}, {
+		id: 'sp-cfg',
+		name: '系统配置',
+		parent: true,
+		icon: 'el-icon-setting',
+		info: '有关系统的一些配置',
+		childList: [{
+				id: 'sp-cfg-app',
+				name: '系统对公配置',
+				url: 'sa-view-sp/sp-cfg/app-cfg.html'
+			},
+			{
+				id: 'sp-cfg-server',
+				name: '服务器私有配置',
+				url: 'sa-view-sp/sp-cfg/server-cfg.html'
+			},
+		]
+	}, {
+		id: 'filing-system',
+		name: '备案管理子系统',
+		parent: true,
+		icon: 'el-icon-setting',
+		childList: [{
+				id: 'tb-filing',
+				name: '备案管理',
+				parent: true,
+				url: 'sa-view/tb-car-black/tb-car-black-list.html',
+				childList: [{
+						id: 'tb-car-filing-list',
+						name: '车辆备案',
+						url: 'sa-view/tb-car-filing/tb-car-filing-list.html',
+						childList: [{
+								id: 'tb-car-filing-add',
+								name: '添加',
+								isShow: false,
+							},
+							{
+								id: 'tb-car-filing-del',
+								name: '删除',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-car-filing-edit',
+								name: '编辑',
+								isShow: false,
+
+							},
+						]
+					},
+					{
+						id: 'tb-person-filing-list',
+						name: '人员备案',
+						url: 'sa-view/tb-person-filing/tb-person-filing-list.html',
+						childList: [{
+								id: 'tb-person-filing-add',
+								name: '添加',
+								isShow: false,
+							},
+							{
+								id: 'tb-person-filing-del',
+								name: '删除',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-person-filing-edit',
+								name: '编辑',
+								isShow: false,
+
+							},
+						]
+					}
+				]
+			},
+			{
+				id: 'tb-black',
+				name: '黑名单管理',
+				parent: true,
+				url: 'sa-view/tb-car-black/tb-car-black-list.html',
+				childList: [{
+						id: 'tb-car-black-list',
+						name: '车辆黑名单',
+						url: 'sa-view/tb-car-black/tb-car-black-list.html',
+						childList: [{
+								id: 'tb-car-black-add',
+								name: '添加',
+								isShow: false,
+							},
+							{
+								id: 'tb-car-black-del',
+								name: '删除',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-car-black-edit',
+								name: '编辑',
+								isShow: false,
+
+							},
+						]
+					},
+					{
+						id: 'tb-person-black-list',
+						name: '人员黑名单',
+						url: 'sa-view/tb-person-black/tb-person-black-list.html',
+						childList: [{
+								id: 'tb-person-black-add',
+								name: '添加',
+								isShow: false,
+							},
+							{
+								id: 'tb-person-black-del',
+								name: '删除',
+								isShow: false,
+
+							},
+							{
+								id: 'tb-person-black-edit',
+								name: '编辑',
+								isShow: false,
+
+							},
+						]
+					}
+				]
+			}
+
+		]
+	}, {
+		id: 'tb-person-visit-record',
+		name: '人脸识别子系统',
+		icon: 'el-icon-folder-opened',
+		parent: true,
+		childList: [{
+				id: 'tb-person-visit-record-list',
+				name: '出入记录',
+				url: 'sa-view/tb-person-visit-record/tb-person-visit-record-list.html',
+				childList: [{
+						id: 'tb-person-visit-record-export',
+						name: '导出',
+						isShow: false,
+					},
+					{
+						id: 'tb-person-visit-record-edit',
+						name: '修改',
+						isShow: false,
+					},
+					{
+						id: 'tb-person-visit-record-del',
+						name: '删除',
+						isShow: false
+					}
+				]
+			},
+			{
+				id: 'tb-person-visit-temperature-list',
+				name: '出入体温检测',
+				url: 'sa-view/tb-person-visit-record/tb-person-visit-temperature-list.html'
+			},
+			{
+				id: 'tb-person-visit-record-add',
+				name: '手工补录',
+				url: 'sa-view/tb-person-visit-record/tb-person-visit-record-add.html'
+			},
+		]
+	}, {
+		id: 'tb-car-visit-record',
+		name: '车辆识别子系统',
+		icon: 'el-icon-folder-opened',
+		parent: true,
+		childList: [{
+			id: 'tb-car-visit-record-list',
+			name: '车辆出入记录',
+			url: 'sa-view/tb-car-visit-record/tb-car-visit-record-list.html',
 			childList: [{
-					id: 'sys-dict-add',
-					name: '添加',
+					id: 'tb-car-visit-record-export',
+					name: '导出',
 					isShow: false,
 				},
 				{
-					id: 'sys-dict-del',
-					name: '删除',
+					id: 'tb-car-visit-record-add',
+					name: '新增',
 					isShow: false,
-
 				},
 				{
-					id: 'sys-dict-edit',
-					name: '编辑',
+					id: 'tb-car-visit-record-edit',
+					name: '修改',
 					isShow: false,
-
-				},
-
-			]
-		},
-	]
-}, {
-	id: 'console',
-	name: '监控中心',
-	parent: true,
-	icon: 'el-icon-view',
-	info: '对本系统的各种监控',
-	childList: [{
-			id: 'redis-console',
-			name: 'Redis控制台',
-			url: 'sa-view-sp/sp-console/redis-console.html',
-			info: 'redis常用工具'
-		},
-
-		{
-			id: 'sql-console',
-			name: 'SQL 监控台',
-			url: 'sa-view-sp/sp-console/sql-console.html',
-			info: 'sql控制台'
-		},
-		{
-			id: 'form-generator',
-			name: '在线表单构建',
-			url: 'https://mrhj.gitee.io/form-generator/#/'
-		},
-	]
-}, {
-	id: 'sp-cfg',
-	name: '系统配置',
-	parent: true,
-	icon: 'el-icon-setting',
-	info: '有关系统的一些配置',
-	childList: [{
-			id: 'sp-cfg-app',
-			name: '系统对公配置',
-			url: 'sa-view-sp/sp-cfg/app-cfg.html'
-		},
-		{
-			id: 'sp-cfg-server',
-			name: '服务器私有配置',
-			url: 'sa-view-sp/sp-cfg/server-cfg.html'
-		},
-	]
-}, {
-	id: 'filing-system',
-	name: '备案管理子系统',
-	parent: true,
-	icon: 'el-icon-setting',
-	childList: [{
-			id: 'tb-filing',
-			name: '备案管理',
-			parent: true,
-			url: 'sa-view/tb-car-black/tb-car-black-list.html',
-			childList: [{
-					id: 'tb-car-filing-list',
-					name: '车辆备案',
-					url: 'sa-view/tb-car-filing/tb-car-filing-list.html',
-					childList: [{
-							id: 'tb-car-filing-add',
-							name: '添加',
-							isShow: false,
-						},
-						{
-							id: 'tb-car-filing-del',
-							name: '删除',
-							isShow: false,
-					
-						},
-						{
-							id: 'tb-car-filing-edit',
-							name: '编辑',
-							isShow: false,
-					
-						},
-					]
 				},
 				{
-					id: 'tb-person-filing-list',
-					name: '人员备案',
-					url: 'sa-view/tb-person-filing/tb-person-filing-list.html',
-					childList: [{
-							id: 'tb-person-filing-add',
-							name: '添加',
-							isShow: false,
-						},
-						{
-							id: 'tb-person-filing-del',
-							name: '删除',
-							isShow: false,
-					
-						},
-						{
-							id: 'tb-person-filing-edit',
-							name: '编辑',
-							isShow: false,
-					
-						},
-					]
+					id: 'tb-car-visit-record-del',
+					name: '删除',
+					isShow: false
 				}
 			]
-		},
-		{
-			id: 'tb-black',
-			name: '黑名单管理',
-			parent: true,
-			url: 'sa-view/tb-car-black/tb-car-black-list.html',
-			childList: [{
-					id: 'tb-car-black-list',
-					name: '车辆黑名单',
-					url: 'sa-view/tb-car-black/tb-car-black-list.html',
-					childList: [{
-							id: 'tb-car-black-add',
-							name: '添加',
-							isShow: false,
-						},
-						{
-							id: 'tb-car-black-del',
-							name: '删除',
-							isShow: false,
-
-						},
-						{
-							id: 'tb-car-black-edit',
-							name: '编辑',
-							isShow: false,
-
-						},
-					]
-				},
-				{
-					id: 'tb-person-black-list',
-					name: '人员黑名单',
-					url: 'sa-view/tb-person-black/tb-person-black-list.html',
-					childList: [{
-							id: 'tb-person-black-add',
-							name: '添加',
-							isShow: false,
-						},
-						{
-							id: 'tb-person-black-del',
-							name: '删除',
-							isShow: false,
-
-						},
-						{
-							id: 'tb-person-black-edit',
-							name: '编辑',
-							isShow: false,
+		}, {
+			id: 'tb-car-visit-record-handler',
+			name: '手动放行',
+			url: 'sa-view/tb-car-visit-record/tb-car-visit-record-handler.html',
+		}]
+	},
 
-						},
-					]
-				}
-			]
-		}
+	{
+		id: 'tb-terminal-venues',
+		name: '设备场所子系统',
+		icon: 'el-icon-folder-opened',
+		info: '设备管理表数据的维护',
+		parent: true,
+		childList: [
+			
+			{
+				id: 'tb-venues-list',
+				name: '场所管理',
+				url: 'sa-view/tb-venues/tb-venues-list.html',
+				childList: [{
+						id: 'tb-venues-add',
+						name: '添加',
+						isShow: false,
+					},
+					{
+						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-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-channel',
-	name: '通道管理',
-	icon: 'el-icon-folder-opened',
-	info: '通道管理表数据的维护',
-	childList: [{
-			id: 'tb-channel-list',
-			name: '通道管理-列表',
-			url: 'sa-view/tb-channel/tb-channel-list.html'
-		},
-		{
-			id: 'tb-channel-add',
-			name: '通道管理-添加',
-			url: 'sa-view/tb-channel/tb-channel-add.html'
-		},
-	]
-}, {
-	id: 'tb-terminal',
-	name: '设备管理',
-	icon: 'el-icon-folder-opened',
-	info: '设备管理表数据的维护',
-	childList: [{
-			id: 'tb-terminal-list',
-			name: '设备管理-列表',
-			url: 'sa-view/tb-terminal/tb-terminal-list.html'
-		},
-		{
-			id: 'tb-terminal-add',
-			name: '设备管理-添加',
-			url: 'sa-view/tb-terminal/tb-terminal-add.html'
-		},
-	]
-}, {
-	id: 'tb-venues',
-	name: '场所管理',
-	icon: 'el-icon-folder-opened',
-	info: '场所管理表数据的维护',
-	childList: [{
-			id: 'tb-venues-list',
-			name: '场所管理-列表',
-			url: 'sa-view/tb-venues/tb-venues-list.html'
-		},
-		{
-			id: 'tb-venues-add',
-			name: '场所管理-添加',
-			url: 'sa-view/tb-venues/tb-venues-add.html'
-		},
-	]
-}, );
+	},
+);

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

@@ -16,4 +16,14 @@
 
 // 定义菜单列表 
 var menuList =	[
+	{
+		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'},
+		]
+	},
 ]

+ 0 - 7
sa-view/tb-car-filing/tb-car-filing-add.html

@@ -46,8 +46,6 @@
 						<sa-item type="text" name="联系人" v-model="m.driverName" br need></sa-item>
 						<sa-item type="num" name="联系电话" v-model="m.driverContact" br need></sa-item>
 						<sa-item type="text" name="联系人身份证" v-model="m.driverIdCard" br need></sa-item>
-						<sa-item type="datetime" name="预计来访时间" v-model="m.preComeTime" br :need="m.type==1"></sa-item>
-						<sa-item type="datetime" name="预计结束时间" v-model="m.preLeaveTime" br :need="m.type==1"></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>
@@ -105,11 +103,6 @@
 							sa.error('请输入正确的身份证');
 							return false;
 						}
-						let type = m.type;
-						if (type == 1) {
-							sa.checkNull(m.preComeTime, '请输入 [预计来访时间]');
-							sa.checkNull(m.preLeaveTime, '请输入 [预计结束时间]');
-						}
 						m=sa.removeNull(m);
 						// 开始增加或修改
 						if (this.id <= 0) { // 添加

+ 1 - 3
sa-view/tb-car-filing/tb-car-filing-info.html

@@ -32,12 +32,10 @@
 								<sa-info name="车牌号" br>{{m.carNo}}</sa-info>
 								<sa-info name="联系人" br>{{m.driverName}}</sa-info>
 								<sa-info name="联系电话" br>{{m.driverContact}}</sa-info>
-								<sa-info name="联系人身份证" br>{{m.driverIdCard}}</sa-info>
 							</el-col>
 							<el-col :span="12">
+								<sa-info name="联系人身份证" br>{{m.driverIdCard}}</sa-info>
 								<sa-info type="enum" name="类型" :value="m.type" :jv="{1: '临时', 2: '内部'}" br></sa-info>
-								<sa-info name="预计来访时间" br>{{m.preComeTime}}</sa-info>
-								<sa-info name="预计结束时间" br>{{m.preLeaveTime}}</sa-info>
 								<sa-info name="备注" br>{{m.remark}}</sa-info>
 								<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
 							</el-col>

+ 0 - 2
sa-view/tb-car-filing/tb-car-filing-list.html

@@ -41,8 +41,6 @@
 					<sa-td name="联系人" prop="driverName"></sa-td>
 					<sa-td name="联系电话" prop="driverContact"></sa-td>
 					<sa-td name="联系人身份证" prop="driverIdCardStr" width="150"></sa-td>
-					<sa-td name="预计来访时间" prop="preComeTime"></sa-td>
-					<sa-td name="预计结束时间" prop="preLeaveTime"></sa-td>
 					<sa-td name="创建时间" prop="createTime"></sa-td>
 					<sa-td name="更新时间" prop="updateTime"></sa-td>
 					<el-table-column label="操作" fixed="right" width="240px">

+ 147 - 0
sa-view/tb-car-visit-record/tb-car-visit-record-add.html

@@ -0,0 +1,147 @@
+<!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>
+		<script src="../../static/kj/upload-util.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">
+						<div class="c-item">
+							<label class="c-label"><span style="color: red;">*</span>通道:</label>
+							<el-select v-model="m.channelId" 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="text" name="车牌" v-model="m.carNo" br need></sa-item>
+						<sa-item type="text" name="联系人" v-model="m.driverName" br need></sa-item>
+						<sa-item type="text" name="联系电话" v-model="m.driverContact" br need></sa-item>
+						<sa-item type="enum" name="出/入" v-model="m.direction" :jv="{1: '入场', 2: '离场'}" jtype="1" br>
+						</sa-item>
+						<sa-item type="datetime" name="时间" v-model="m.visitTime" br need></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: {
+					getVenuesList() {
+						sa.ajax('/TbVenues/getTree', function(res) {
+							this.areaList = res.data; // 数据
+						}.bind(this));
+					},
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '', // 主键 
+							channelId: '', // 通道 
+							carNo: '', // 车牌 
+							visitTime: '', // 通过时间 
+							direction: 1, // 方向(1=入,2=出) 
+							image: '', // 图片 
+							type: '', // 类型(1=临时,2=内部) 
+							driverName: '', // 联系人 
+							driverContact: '', // 联系电话 
+							driverIdCard: '', // 联系人身份证 
+							recordType: '', // 方式(1=手动,2=自动) 
+						}
+					},
+					// 提交数据 
+					ok: function() {
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.channelId, '请选择 [通道]');
+						sa.checkNull(m.carNo, '请输入 [车牌]');
+						sa.checkNull(m.visitTime, '请输入 [通过时间]');
+						sa.checkNull(m.driverName, '请输入 [联系人]');
+						let driverContact=m.driverContact;
+						if(!sa.isPhone(driverContact)){
+							sa.error('请输入正确的联系号码');
+							return false;
+						}
+						m = sa.removeNull(m);
+						// 开始增加或修改
+						if (this.id <= 0) { // 添加
+							sa.ajax('/TbCarVisitRecord/add', m, function(res) {
+								sa.alert('增加成功', this.clean);
+							}.bind(this));
+						} else { // 修改
+							sa.ajax('/TbCarVisitRecord/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('/TbCarVisitRecord/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if (res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+		</script>
+	</body>
+</html>

+ 144 - 0
sa-view/tb-car-visit-record/tb-car-visit-record-handler.html

@@ -0,0 +1,144 @@
+<!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>
+					<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-venues-add')">新增场所</el-button>
+					<el-button type="info"  icon="el-icon-refresh"  @click="p.name='',f5()">重置</el-button>
+					
+				</el-form>
+				<!-- ------------- 快捷按钮 ------------- -->
+				
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList"  row-key="id" border @expand-change="sa.f5TableHeight()">
+					<sa-td name="序号" type="index"></sa-td>
+					<sa-td name="部门" prop="deptName" ></sa-td>
+					<sa-td name="名称" prop="name" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<el-table-column label="操作" fixed="right"  width="320px">
+						<template slot-scope="s">
+							<el-button v-if="s.row.pId===-1&&sa.isAuth('tb-venues-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="s.row.pId!==-1&&sa.isAuth('tb-venues-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="updateChild(s.row)">修改</el-button>
+							<el-button v-if="s.row.pId===-1&&sa.isAuth('tb-venues-add')" class="c-btn" type="primary" icon="el-icon-plus" @click="addChildren(s.row)">添加通道</el-button>
+							<el-button v-if="sa.isAuth('tb-venues-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()" :sizes="[1000]"></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: '',		//  
+						deptId: '',		// 部门ID 
+						deptName: '',		// 部门 
+						pId: '',		// 父ID 
+						name: '',		// 名称 
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbVenues/getTree', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-venues-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-venues-add.html?id=' + data.id, '600px', '60%');
+					},
+					updateChild(data){
+						sa.showIframe('修改通道', 'tb-venues-addchildren.html?id=' + data.id+'&deptId='+data.deptId, '500px', '60%');
+						
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增场所', 'tb-venues-add.html?id=-1', '500px', '50%');
+					},
+					// 新增子级
+					addChildren: function(data) {
+						sa.showIframe('新增通道', 'tb-venues-addchildren.html?id=-1&pId=' + data.id+'&deptId='+data.deptId, '500px', '50%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbVenues/delete?id=' + data.id, function(res) {
+								this.f5();
+							}.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('/TbVenues/deleteByIds', {ids: ids.join(',')}, function(res) {
+								this.f5();
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 74 - 0
sa-view/tb-car-visit-record/tb-car-visit-record-info.html

@@ -0,0 +1,74 @@
+<!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">
+						<el-row>
+							<el-col :span="12">
+								<sa-info name="车牌" br>{{m.carNo}}</sa-info>
+								<sa-info name="部门" br>{{m.deptName}}</sa-info>
+								<sa-info name="联系人" br>{{m.driverName}}</sa-info>
+								<sa-info name="联系电话" br>{{m.driverContact}}</sa-info>
+							</el-col>
+							<el-col :span="12">
+								<sa-info name="通道" br>{{m.channel}}</sa-info>
+								<sa-info type="enum" name="出/入" :value="m.direction" :jv="{1: '入场', 2: '离场'}" br></sa-info>
+								<sa-info type="img" name="图片" :value="m.image" br></sa-info>
+								<sa-info name="时间" br>{{m.visitTime}}</sa-info>
+								<sa-info type="enum" name="方式" :value="m.recordType" :jv="{1: '手动', 2: '自动'}" br></sa-info>
+							</el-col>
+						</el-row>
+					</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('/TbCarVisitRecord/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 166 - 0
sa-view/tb-car-visit-record/tb-car-visit-record-list.html

@@ -0,0 +1,166 @@
+<!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.carNo"></sa-item>
+					<sa-item type="text" name="联系人" v-model="p.driverName"></sa-item>
+					<sa-item type="text" name="联系电话" v-model="p.driverContact"></sa-item>
+					<sa-item type="enum" name="方式" v-model="p.recordType" :jv="{1: '手动', 2: '自动'}" jtype="2" def="不限">
+					</sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button type="info" icon="el-icon-refresh"
+						@click="p.carNo='';p.driverName='';p.driverContact='';p.recordType='';f5()">
+						重置</el-button>
+					<el-button type="primary" icon="el-icon-plus" @click="add"
+						v-if="sa.isAuth('tb-car-visit-record-add')">新增</el-button>
+					<el-button type="primary" v-if="sa.isAuth('tb-car-visit-record-export')" icon="el-icon-s-unfold"
+						@click="exportFn">导出</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="deptName"></sa-td>
+					<sa-td name="通道" prop="channel"></sa-td>
+					<sa-td name="车牌" prop="carNo"></sa-td>
+					<sa-td name="联系人" prop="driverName"></sa-td>
+					<sa-td name="联系电话" prop="driverContact"></sa-td>
+					<sa-td name="时间" prop="visitTime"></sa-td>
+					<sa-td name="方向" prop="direction" type="enum" :jv="{1: '入场', 2: '离场'}"></sa-td>
+					<sa-td name="图片" prop="image" type="img"></sa-td>
+					<sa-td name="方式" prop="recordType" type="enum" :jv="{1: '手动', 2: '自动'}"></sa-td>
+					<el-table-column label="操作" fixed="right" width="240px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看
+							</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改
+							</el-button>
+							<el-button 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>
+		</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: '', // 主键 
+						channel: '', // 通道 
+						carNo: '', // 车牌 
+						visitTime: '', // 通过时间 
+						direction: '', // 方向(1=入,2=出) 
+						type: '', // 类型(1=临时,2=内部) 
+						driverName: '', // 联系人 
+						driverContact: '', // 联系电话 
+						driverIdCard: '', // 联系人身份证 
+						recordType: '', // 方式(1=手动,2=自动) 
+						pageNo: 1, // 当前页 
+						pageSize: 10, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					exportFn() {
+						sa.confirm('是否导出符合条件的记录?', function() {
+							sa.ajax('/TbCarVisitRecord/export', sa.removeNull(this.p), function(res) {
+								window.location.href = res.data;
+							}.bind(this));
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbCarVisitRecord/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-car-visit-record-info.html?id=' + data.id, '700px', '60%');
+					},
+					// 查看 - 根据选中的
+					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-car-visit-record-add.html?id=' + data.id, '700px', '60%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-car-visit-record-add.html?id=-1', '700px', '60%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbCarVisitRecord/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('/TbCarVisitRecord/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>

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

@@ -0,0 +1,133 @@
+<!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.channelName" br></sa-item>
+						<sa-item type="text" name="下发时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="回复时间" v-model="m.responseTime" br></sa-item>
+						<sa-item type="text" name="消息ID" v-model="m.msgId" br></sa-item>
+						<sa-item type="text" name="回复内容" v-model="m.responseContent" br></sa-item>
+						<sa-item type="text" name="回复code" v-model="m.responseCode" 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: '',		// 设备名 
+							channelName: '',		// 通道 
+							createTime: '',		// 下发时间 
+							responseTime: '',		// 回复时间 
+							msgId: '',		// 消息ID 
+							responseContent: '',		// 回复内容 
+							responseCode: '',		// 回复code 
+						}
+					},
+					// 提交数据 
+					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.channelName, '请输入 [通道]');
+						sa.checkNull(m.createTime, '请输入 [下发时间]');
+						sa.checkNull(m.responseTime, '请输入 [回复时间]');
+						sa.checkNull(m.msgId, '请输入 [消息ID]');
+						sa.checkNull(m.responseContent, '请输入 [回复内容]');
+						sa.checkNull(m.responseCode, '请输入 [回复code]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbCommandLog/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbCommandLog/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('/TbCommandLog/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

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

@@ -0,0 +1,74 @@
+<!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">
+						<el-row>
+							<el-col :span="12">
+								<sa-info name="设备名" br>{{m.terminalName}}</sa-info>
+								<sa-info name="设备SN" br>{{m.sn}}</sa-info>
+								<sa-info name="通道" br>{{m.channelName}}</sa-info>
+								<sa-info name="下发时间" br>{{m.createTime}}</sa-info>
+									<sa-info name="命令" br>{{m.command}}</sa-info>
+							</el-col>
+							<el-col :span="12">
+								<sa-info name="回复时间" br>{{m.responseTime}}</sa-info>
+								<sa-info name="消息ID" br>{{m.msgId}}</sa-info>
+								<sa-info name="回复内容" br>{{m.responseContent}}</sa-info>
+								<sa-info name="回复code" br>{{m.responseCode}}</sa-info>
+							</el-col>
+						</el-row>
+					</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('/TbCommandLog/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

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

@@ -0,0 +1,146 @@
+<!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.command"></sa-item>
+					<sa-item type="text" name="设备名" v-model="p.terminalName"></sa-item>
+					<sa-item type="text" name="通道" v-model="p.channelName"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<!-- ------------- 快捷按钮 ------------- -->
+					<sa-item style="display: inline;" type="fast-btn" show="reset"></sa-item>
+				</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="通道" prop="channelName"></sa-td>
+					<sa-td name="下发时间" prop="createTime"></sa-td>
+					<sa-td name="回复时间" prop="responseTime"></sa-td>
+					<sa-td name="回复内容" prop="responseContent"></sa-td>
+					<sa-td name="下发人" prop="createBy"></sa-td>
+					<el-table-column label="命令">
+						<template slot-scope="s">
+							<el-button class="c-btn" @click="showCommand(s.row)">查看
+							</el-button>
+						</template>
+					</el-table-column>
+					<el-table-column label="操作" fixed="right" width="240px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看
+							</el-button>
+							<el-button v-if="sa.isAuth('tb-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: {
+					commandVisible:false,
+					commandContent:'',
+					p: { // 查询参数  
+						id: '', // 主键 
+						deptId: '', // 部门ID 
+						command: '', // 命令 
+						sn: '', // 设备SN 
+						terminalName: '', // 设备名 
+						channelName: '', // 通道 
+						createTime: '', // 下发时间 
+						responseTime: '', // 回复时间 
+						msgId: '', // 消息ID 
+						responseContent: '', // 回复内容 
+						responseCode: '', // 回复code 
+						pageNo: 1, // 当前页 
+						pageSize: 15, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					showCommand(data){
+						this.commandVisible=true;
+						this.commandContent=data.command
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbCommandLog/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-command-log-info.html?id=' + data.id, '1080px', '70%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if (selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbCommandLog/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 142 - 0
sa-view/tb-manager/tb-manager-add.html

@@ -0,0 +1,142 @@
+<!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></sa-item>
+						<sa-item type="text" name="联系号码" v-model="m.phone" br></sa-item>
+						<sa-item type="text" name="部门ID" v-model="m.deptId" br></sa-item>
+						<sa-item type="text" name="职能" v-model="m.position" br></sa-item>
+						<sa-item type="text" name="场所ID" v-model="m.venuesId" br></sa-item>
+						<sa-item type="text" name="值班地点" v-model="m.venuesName" br></sa-item>
+						<sa-item type="text" name="值班开始时间" v-model="m.workStartTime" br></sa-item>
+						<sa-item type="text" name="值班结束时间" v-model="m.workEndTime" br></sa-item>
+						<sa-item type="text" name="备注" v-model="m.remark" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人" v-model="m.updateBy" 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: '',		// 主键 
+							name: '',		// 姓名 
+							phone: '',		// 联系号码 
+							deptId: '',		// 部门ID 
+							position: '',		// 职能 
+							venuesId: '',		// 场所ID 
+							venuesName: '',		// 值班地点 
+							workStartTime: '',		// 值班开始时间 
+							workEndTime: '',		// 值班结束时间 
+							remark: '',		// 备注 
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [姓名]');
+						sa.checkNull(m.phone, '请输入 [联系号码]');
+						sa.checkNull(m.deptId, '请输入 [部门ID]');
+						sa.checkNull(m.position, '请输入 [职能]');
+						sa.checkNull(m.venuesId, '请输入 [场所ID]');
+						sa.checkNull(m.venuesName, '请输入 [值班地点]');
+						sa.checkNull(m.workStartTime, '请输入 [值班开始时间]');
+						sa.checkNull(m.workEndTime, '请输入 [值班结束时间]');
+						sa.checkNull(m.remark, '请输入 [备注]');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbManager/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbManager/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('/TbManager/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 73 - 0
sa-view/tb-manager/tb-manager-info.html

@@ -0,0 +1,73 @@
+<!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="联系号码" br>{{m.phone}}</sa-info>
+						<sa-info name="部门ID" br>{{m.deptId}}</sa-info>
+						<sa-info name="职能" br>{{m.position}}</sa-info>
+						<sa-info name="场所ID" br>{{m.venuesId}}</sa-info>
+						<sa-info name="值班地点" br>{{m.venuesName}}</sa-info>
+						<sa-info name="值班开始时间" br>{{m.workStartTime}}</sa-info>
+						<sa-info name="值班结束时间" br>{{m.workEndTime}}</sa-info>
+						<sa-info name="备注" br>{{m.remark}}</sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人" br>{{m.createBy}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人" br>{{m.updateBy}}</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('/TbManager/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 183 - 0
sa-view/tb-manager/tb-manager-list.html

@@ -0,0 +1,183 @@
+<!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="num" name="主键" v-model="p.id"></sa-item>
+					<sa-item type="text" name="姓名" v-model="p.name"></sa-item>
+					<sa-item type="text" name="联系号码" v-model="p.phone"></sa-item>
+					<sa-item type="text" name="职能" v-model="p.position"></sa-item>
+					<sa-item type="text" name="场所ID" v-model="p.venuesId"></sa-item>
+					<sa-item type="text" name="值班地点" v-model="p.venuesName"></sa-item>
+					<sa-item type="text" name="值班开始时间" v-model="p.workStartTime"></sa-item>
+					<sa-item type="text" name="值班结束时间" v-model="p.workEndTime"></sa-item>
+					<sa-item type="text" name="备注" v-model="p.remark"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人" v-model="p.updateBy"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<br />
+					<sa-item name="综合排序">
+						<el-radio-group v-model="p.sortType" class="s-radio-text">
+							<el-radio :label="0">默认</el-radio>
+							<el-radio :label="1">主键</el-radio>
+							<el-radio :label="2">姓名</el-radio>
+							<el-radio :label="3">联系号码</el-radio>
+							<el-radio :label="4">部门ID</el-radio>
+							<el-radio :label="5">职能</el-radio>
+							<el-radio :label="6">场所ID</el-radio>
+							<el-radio :label="7">值班地点</el-radio>
+							<el-radio :label="8">值班开始时间</el-radio>
+							<el-radio :label="9">值班结束时间</el-radio>
+							<el-radio :label="10">备注</el-radio>
+							<el-radio :label="11">创建时间</el-radio>
+							<el-radio :label="12">创建人</el-radio>
+							<el-radio :label="13">更新时间</el-radio>
+							<el-radio :label="14">更新人</el-radio>
+						</el-radio-group>
+					</sa-item>
+				</el-form>
+				<!-- ------------- 快捷按钮 ------------- -->
+				<sa-item type="fast-btn" show="add,get,delete,export,reset"></sa-item>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" >
+					<sa-td type="selection"></sa-td>
+					<sa-td name="主键" prop="id" type="num"></sa-td>
+					<sa-td name="姓名" prop="name" ></sa-td>
+					<sa-td name="联系号码" prop="phone" ></sa-td>
+					<sa-td name="部门ID" prop="deptId" ></sa-td>
+					<sa-td name="职能" prop="position" ></sa-td>
+					<sa-td name="场所ID" prop="venuesId" ></sa-td>
+					<sa-td name="值班地点" prop="venuesName" ></sa-td>
+					<sa-td name="值班开始时间" prop="workStartTime" ></sa-td>
+					<sa-td name="值班结束时间" prop="workEndTime" ></sa-td>
+					<sa-td name="备注" prop="remark" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人" prop="createBy" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人" prop="updateBy" ></sa-td>
+					<el-table-column label="操作" fixed="right"  width="240px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button 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>
+		</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: '',		// 姓名 
+						phone: '',		// 联系号码 
+						deptId: '',		// 部门ID 
+						position: '',		// 职能 
+						venuesId: '',		// 场所ID 
+						venuesName: '',		// 值班地点 
+						workStartTime: '',		// 值班开始时间 
+						workEndTime: '',		// 值班结束时间 
+						remark: '',		// 备注 
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbManager/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-manager-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-manager-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-manager-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbManager/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('/TbManager/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>

+ 6 - 12
sa-view/tb-person-filing/tb-person-filing-add.html

@@ -14,6 +14,7 @@
 		<script src="../../static/kj/jquery.min.js"></script>
 		<script src="../../static/kj/layer/layer.js"></script>
 		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
 		<style type="text/css">
 			.c-panel .el-form .c-label {
 				width: 7.5em !important;
@@ -43,11 +44,10 @@
 						</div>
 						<sa-item type="text" name="姓名" v-model="m.name" br need></sa-item>
 						<sa-item type="num" name="联系电话" v-model="m.phone" br need></sa-item>
-						<sa-item type="enum" name="类型" v-model="m.type" :jv="{1: '临时', 2: '内部'}" jtype="3" br></sa-item>
 						<sa-item type="text" name="身份证" v-model="m.idCard" br need></sa-item>
-						<sa-item type="text" name="来访事由" v-model="m.visitReason" br need></sa-item>
-						<sa-item type="datetime" name="预计来访时间" v-model="m.preComeTime" br :need="m.type==1"></sa-item>
-						<sa-item type="datetime" name="预计结束时间" v-model="m.preLeaveTime" br :need="m.type==1"></sa-item>
+						<sa-item type="img" name="人脸" v-model="m.photo" br need></sa-item>
+						<sa-item type="enum" name="类型" v-model="m.type" :jv="{1: '临时', 2: '内部'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="来访事由" v-model="m.visitReason" br></sa-item>
 						<sa-item type="textarea" name="备注" v-model="m.remark" br></sa-item>
 						</sa-item>
 					</el-form>
@@ -97,7 +97,7 @@
 					ok: function() {
 						// 表单校验 
 						let m = this.m;
-						let phone=m.phone;
+						let phone = m.phone;
 						sa.checkNull(m.deptId, '请选择部门');
 						sa.checkNull(m.name, '请输入 [姓名]');
 						if (!sa.isPhone(phone)) {
@@ -110,13 +110,7 @@
 							sa.error('请输入正确的身份证');
 							return false;
 						}
-						sa.checkNull(m.visitReason, '请输入 [来访事由]');
-						let type = m.type;
-						if (type == 1) {
-							sa.checkNull(m.preComeTime, '请输入 [预计来访时间]');
-							sa.checkNull(m.preLeaveTime, '请输入 [预计结束时间]');
-						}
-						m=sa.removeNull(m);
+						m = sa.removeNull(m);
 						// 开始增加或修改
 						if (this.id <= 0) { // 添加
 							sa.ajax('/TbPersonFiling/add', m, function(res) {

+ 1 - 3
sa-view/tb-person-filing/tb-person-filing-info.html

@@ -32,11 +32,9 @@
 								<sa-info name="部门" br>{{m.deptName}}</sa-info>
 								<sa-info type="enum" name="类型" :value="m.type" :jv="{1: '临时', 2: '内部'}" br></sa-info>
 								<sa-info name="身份证" br>{{m.idCadStr}}</sa-info>
-								<sa-info name="来访事由" br>{{m.visitReason}}</sa-info>
 							</el-col>
 							<el-col :span="12">
-								<sa-info name="预计来访时间" br>{{m.preComeTime}}</sa-info>
-								<sa-info name="预计结束时间" br>{{m.preLeaveTime}}</sa-info>
+								<sa-info name="来访事由" br>{{m.visitReason}}</sa-info>
 								<sa-info name="备注" br>{{m.remark}}</sa-info>
 								<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
 								<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>

+ 11 - 9
sa-view/tb-person-filing/tb-person-filing-list.html

@@ -26,31 +26,33 @@
 					</sa-item>
 					<sa-item type="text" name="身份证" v-model="p.idCard"></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-person-filing-add')">新增</el-button>
-					<el-button type="info"  icon="el-icon-refresh"  @click="f5">重置</el-button>
+					<el-button type="primary" icon="el-icon-plus" @click="add" v-if="sa.isAuth('tb-person-filing-add')">
+						新增</el-button>
+					<el-button type="info" icon="el-icon-refresh" @click="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="phone"></sa-td>
 					<sa-td name="部门" prop="deptName"></sa-td>
-					<sa-td name="类型" prop="type" type="enum" :jv="{1: '临时', 2: '内部'}"></sa-td>
+					<sa-td name="联系号码" prop="phone"></sa-td>
 					<sa-td name="身份证" prop="idCadStr" width="150"></sa-td>
+					<sa-td type="img" name="人脸" prop="photo"> </sa-td>
+					<sa-td name="类型" prop="type" type="enum" :jv="{1: '临时', 2: '内部'}"></sa-td>
 					<sa-td name="来访事由" prop="visitReason"></sa-td>
-					<sa-td name="预计来访时间" prop="preComeTime"></sa-td>
-					<sa-td name="预计结束时间" prop="preLeaveTime"></sa-td>
 					<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" icon="el-icon-view" @click="get(s.row)">查看
 							</el-button>
-							<el-button v-if="sa.isAuth('tb-person-filing-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改
+							<el-button v-if="sa.isAuth('tb-person-filing-edit')" class="c-btn" type="primary"
+								icon="el-icon-edit" @click="update(s.row)">修改
 							</el-button>
-							<el-button v-if="sa.isAuth('tb-person-filing-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除
+							<el-button v-if="sa.isAuth('tb-person-filing-del')" class="c-btn" type="danger"
+								icon="el-icon-delete" @click="del(s.row)">删除
 							</el-button>
 						</template>
 					</el-table-column>

+ 187 - 0
sa-view/tb-person-visit-record/tb-person-visit-record-add.html

@@ -0,0 +1,187 @@
+<!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>
+		<script src="../../static/kj/upload-util.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>
+						<el-card>
+							<div slot="header" class="clearfix">
+								<span>人员信息</span>
+							</div>
+							<el-row>
+								<el-col :span="12">
+									<sa-item type="text" name="姓名" v-model="m.name" br need></sa-item>
+									<sa-item type="text" name="身份证" v-model="m.idCard" br need></sa-item>
+								</el-col>
+								<el-col :span="12">
+									<sa-item type="text" name="联系号码" v-model="m.phone" br need></sa-item>
+									<div class="c-item">
+										<label class="c-label"><span style="color: red;">*</span>健康码:</label>
+										<el-select v-model="m.healthStatus" :disabled="currentUser.deptId!==9999999">
+											<el-option label="请选择" v-for="(item,index) in healthList" :key="index"
+												:label="item" :value="item"></el-option>
+
+										</el-select>
+									</div>
+								</el-col>
+
+							</el-row>
+						</el-card>
+						<el-card>
+							<div slot="header" class="clearfix">
+								<span>出入信息</span>
+							</div>
+							<div style="display: flex;">
+								<div class="c-item">
+									<label class="c-label">入场通道:</label>
+									<el-select v-model="m.inChannel" 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="num" name="入场体温" v-model="m.inTemperature" br></sa-item>
+								<sa-item type="datetime" name="入场时间" v-model="m.inTime" br></sa-item>
+							</div>
+							<div style="display: flex;">
+								<div class="c-item">
+									<label class="c-label">离场通道:</label>
+									<el-select v-model="m.outChannel" 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="text" name="离场体温" v-model="m.outTemperature" br></sa-item>
+								<sa-item type="datetime" name="离场时间" v-model="m.outTime" br></sa-item>
+							</div>
+						</el-card>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+				</div>
+
+				</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: {
+					currentUser: sa.$sys.getCurrUser(),
+					healthList: [
+						'绿码', '黄码', '红码', '未知'
+					],
+					areaList: [],
+					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改) 
+					m: {
+						id: '', // 主键 
+						deptId: '', // 部门ID 
+						healthStatus: '绿码', // 健康码 
+						name: '', // 姓名 
+						idCard: '', // 身份证 
+						phone: '',
+						inChannel: '', // 场所 
+						outChannel: '',
+						inTemperature: '36.5', // 体温 
+						outTemperature: '36.5',
+						inTime: '', // 时间 
+						outTime: ''
+					}, // 实体对象 
+				},
+				methods: {
+					getVenuesList() {
+						sa.ajax('/TbVenues/getTree', function(res) {
+							this.areaList = res.data; // 数据
+						}.bind(this));
+					},
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '', // 主键 
+							deptId: '', // 部门ID 
+							healthStatus: '绿码', // 健康码 
+							name: '', // 姓名 
+							idCard: '', // 身份证 
+							phone: '',
+							inChannel: '', // 场所 
+							outChannel: '',
+							inTemperature: '36.5', // 体温 
+							outTemperature: '36.5',
+							inTime: '', // 时间 
+							outTime: ''
+						}
+					},
+
+					// 提交数据 
+					ok: function() {
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.name, '请输入 [姓名]');
+						let phone = m.phone;
+						if (!sa.isPhone(phone)) {
+							sa.error('请输入正确的号码');
+							return false;
+						}
+						sa.checkNull(m.idCard, '请输入 [身份证]');
+						sa.ajax('/TbPersonVisitRecord/add', m, function(res) {
+							sa.alert('增加成功', this.clean);
+						}.bind(this));
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						this.m = this.createModel();
+					}
+				},
+				mounted: function() {
+					this.getVenuesList();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 179 - 0
sa-view/tb-person-visit-record/tb-person-visit-record-edit.html

@@ -0,0 +1,179 @@
+<!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>
+		<script src="../../static/kj/upload-util.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">
+						<el-row>
+							<el-col :span="12">
+								<div class="c-item">
+									<label class="c-label"><span style="color: red;">*</span>部门:</label>
+									<el-select v-model="m.deptId" disabled>
+										<el-option label="请选择" v-for="(item,index) in deptList" :key="item.id"
+											:label="item.name" :value="item.id"></el-option>
+
+									</el-select>
+								</div>
+								<sa-item type="text" name="姓名" v-model="m.name" br need></sa-item>
+								<sa-item type="text" name="身份证" v-model="m.idCard" br need></sa-item>
+								<sa-item type="text" name="联系号码" v-model="m.phone" br need></sa-item>
+							</el-col>
+							<el-col :span="12">
+								<sa-item type="text" name="体温" v-model="m.temperature" br need></sa-item>
+								<div class="c-item">
+									<label class="c-label">离场通道:</label>
+									<el-select v-model="m.channel" 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>
+								<div class="c-item">
+									<label class="c-label"><span style="color: red;">*</span>健康码:</label>
+									<el-select v-model="m.healthStatus" :disabled="currentUser.deptId!==9999999">
+										<el-option label="请选择" v-for="(item,index) in healthList" :key="index"
+											:label="item" :value="item"></el-option>
+
+									</el-select>
+								</div>
+								<sa-item type="datetime" name="时间" v-model="m.visitDate" br need></sa-item>
+							</el-col>
+						</el-row>
+					</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: {
+					currentUser: sa.$sys.getCurrUser(),
+					areaList: [],
+					healthList: [
+						'绿码', '黄码', '红码', '未知'
+					],
+					deptList: [],
+					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null, // 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '', // 主键 
+							direction: '', // 出入(1=入场,2=离场) 
+							deptId: '', // 部门ID 
+							phone: '', // 部门名称 
+							name: '', // 姓名 
+							picture: '', // 图片 
+							idCard: '', // 身份证 
+							channel: '', // 通过通道 
+							venues: '', // 场所 
+							temperature: '', // 体温 
+							healthStatus: '', // 健康码 
+							sn: '', // 上传设备 
+							visitDate: '', // 时间 
+							createTime: '', // 创建时间 
+						}
+					},
+					// 提交数据 
+					ok: function() {
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.name, '请输入 [姓名]');
+						let phone = m.phone;
+						if (!sa.isPhone(phone)) {
+							sa.error('请输入正确的号码');
+							return false;
+						}
+						sa.checkNull(m.idCard, '请输入 [身份证]');
+						sa.checkNull(m.channel, '请输入 [通过通道]');
+						sa.checkNull(m.venues, '请输入 [场所]');
+						sa.checkNull(m.temperature, '请输入 [体温]');
+						sa.checkNull(m.healthStatus, '请输入 [健康码]');
+						sa.ajax('/TbPersonVisitRecord/update', m, function(res) {
+							sa.alert('修改成功', this.clean);
+						}.bind(this));
+					},
+					getVenuesList() {
+						sa.ajax('/TbVenues/getTree', function(res) {
+							this.areaList = res.data; // 数据
+						}.bind(this));
+					},
+					getDeptList() {
+						sa.ajax('/TbDept/getList', {
+							pageNo: 1,
+							pageSize: 100
+						}, function(resp) {
+							let list = resp.data;
+							let deptId = this.currentUser.deptId;
+							if (deptId != 9999999) {
+								this.m.deptId = deptId;
+							}
+							this.deptList = list;
+						}.bind(this))
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						parent.app.f5(); // 刷新父页面列表
+						sa.closeCurrIframe(); // 关闭本页 
+					},
+					getById() {
+						sa.ajax('/TbPersonVisitRecord/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if (res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				},
+				mounted: function() {
+					this.getDeptList();
+					this.getVenuesList();
+					this.getById();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 76 - 0
sa-view/tb-person-visit-record/tb-person-visit-record-info.html

@@ -0,0 +1,76 @@
+<!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">
+						<el-row>
+							<el-col :span="12">
+								<sa-info type="enum" name="出入" :value="m.direction" :jv="{1: '入场', 2: '离场'}" br></sa-info>
+								<sa-info name="部门名称" br>{{m.deptName}}</sa-info>
+								<sa-info name="姓名" br>{{m.name}}</sa-info>
+								<sa-info type="img" name="图片" :value="m.picture" br></sa-info>
+								<sa-info name="身份证" br>{{m.idCard}}</sa-info>
+								<sa-info name="通过通道" br>{{m.channel}}</sa-info>
+							</el-col>
+							<el-col :span="12">
+								<sa-info name="体温" br>{{m.temperature}}</sa-info>
+								<sa-info name="健康码" br>{{m.healthStatus}}</sa-info>
+								<sa-info name="检测设备" br>{{m.sn}}</sa-info>
+								<sa-info name="检测时间" br>{{m.visitDate}}</sa-info>
+								<sa-info name="上传时间" br>{{m.createTime}}</sa-info>
+							</el-col>
+						</el-row>
+					</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('/TbPersonVisitRecord/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 176 - 0
sa-view/tb-person-visit-record/tb-person-visit-record-list.html

@@ -0,0 +1,176 @@
+<!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>
+					<el-row>
+						<el-col :span="20">
+							<div>
+								<sa-item type="text" name="姓名" v-model="p.name"></sa-item>
+								<sa-item type="enum" name="出入场" v-model="p.direction" :jv="{1: '入场', 2: '离场'}" jtype="4"
+									def="不限">
+								</sa-item>
+								<sa-item type="enum" name="健康码" v-model="p.healthStatus"
+									:jv="{'绿码': '绿码', '黄码': '黄码', '红码': '红码'}" jtype="4" def="全部">
+								</sa-item>
+							</div>
+							<div>
+								<sa-item type="datetime" name="开始时间" v-model="p.startTime"></sa-item>
+								<sa-item type="datetime" name="结束时间" v-model="p.endTime"></sa-item>
+								<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询
+								</el-button>
+								<el-button type="info" icon="el-icon-refresh"
+									@click="p.direction='';p.name='';p.healthStatus='';p.startTime='';p.endTime='';f5()">
+									重置</el-button>
+								<el-button type="primary" v-if="sa.isAuth('tb-person-visit-record-export')"
+									icon="el-icon-s-unfold" @click="exportFn">导出</el-button>
+							</div>
+						</el-col>
+						<el-col :span="4">
+						</el-col>
+					</el-row>
+
+				</el-form>
+				<!-- ------------- 快捷按钮 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" style="margin-top: 10px;">
+					<sa-td name="序号" type="index"></sa-td>
+					<sa-td name="组织" prop="deptName" width="180"></sa-td>
+					<sa-td name="姓名" prop="name"></sa-td>
+					<sa-td name="联系号码" prop="phone"></sa-td>
+					<sa-td name="图片" prop="picture" type="img"></sa-td>
+					<sa-td name="场所/通道" prop="channel"></sa-td>
+					<sa-td name="出/入" prop="direction" type="enum" :jv="{1: '入场', 2: '离场'}"></sa-td>
+					<sa-td name="体温" prop="temperature"></sa-td>
+					<sa-td name="健康码" prop="healthStatus"></sa-td>
+					<sa-td name="检测设备" prop="terminalName"></sa-td>
+					<sa-td name="检测时间" prop="visitDate" width="160"></sa-td>
+					<sa-td name="分类" prop="type" type="enum" :jv="{1: '补录', 2: '设备上传'}"></sa-td>
+					<el-table-column label="操作" fixed="right" width="240px">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看
+							</el-button>
+							<el-button v-if="sa.isAuth('tb-person-visit-record-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-person-visit-record-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>
+		</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: {
+					healthStatusList: [{
+							name: '全部',
+							value: ''
+						},
+						{
+							name: '绿码',
+							value: '绿码'
+						},
+						{
+							name: '红码',
+							value: '红码'
+						},
+						{
+							name: '黄码',
+							value: '黄码'
+						},
+					],
+					p: { // 查询参数  
+						id: '', // 主键 
+						direction: '', // 出入(1=入场,2=离场) 
+						deptName: '', // 部门名称 
+						startTime: '',
+						endTime: '',
+						name: '', // 姓名 
+						idCard: '', // 身份证 
+						channel: '', // 通过通道 
+						venues: '', // 场所 
+						temperature: '', // 体温 
+						healthStatus: '', // 健康码 
+						pageNo: 1, // 当前页 
+						pageSize: 10, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					exportFn() {
+						sa.confirm('是否导出符合条件的记录?', function() {
+							sa.ajax('/TbPersonVisitRecord/export', sa.removeNull(this.p), function(res) {
+								window.location.href = res.data;
+							}.bind(this));
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbPersonVisitRecord/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-person-visit-record-info.html?id=' + data.id, '700px', '70%');
+					},
+					// 查看 - 根据选中的
+					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-person-visit-record-edit.html?id=' + data.id, '900px', '70%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbPersonVisitRecord/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight(); // 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 168 - 0
sa-view/tb-person-visit-record/tb-person-visit-temperature-list.html

@@ -0,0 +1,168 @@
+<!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>
+					<el-row>
+						<el-col :span="20">
+							<div>
+								<sa-item type="text" name="姓名" v-model="p.name"></sa-item>
+								<sa-item type="text" name="联系电话" v-model="p.phone">
+								</sa-item>
+								<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询
+								</el-button>
+								<el-button type="info" icon="el-icon-refresh"
+									@click="p.name='';p.phone='';f5()">
+									重置</el-button>
+							</div>
+						</el-col>
+						<el-col :span="4">
+						</el-col>
+					</el-row>
+
+				</el-form>
+				<!-- ------------- 快捷按钮 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" style="margin-top: 10px;">
+					<sa-td name="序号" type="index"></sa-td>
+					<sa-td name="部门" prop="deptName"></sa-td>
+					<sa-td name="姓名" prop="name"></sa-td>
+					<sa-td name="联系号码" prop="phone"></sa-td>
+					<sa-td name="场所" prop="venues"></sa-td>
+					<sa-td name="图片" prop="picture" type="img"></sa-td>
+					<sa-td name="体温" prop="temperature"></sa-td>
+					<sa-td name="时间" prop="visitDate" width="160"></sa-td>
+				</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: {
+					healthStatusList: [{
+							name: '全部',
+							value: ''
+						},
+						{
+							name: '绿码',
+							value: '绿码'
+						},
+						{
+							name: '红码',
+							value: '红码'
+						},
+						{
+							name: '黄码',
+							value: '黄码'
+						},
+					],
+					p: { // 查询参数  
+						id: '', // 主键 
+						phone: '', // 出入(1=入场,2=离场) 
+						name: '', // 姓名 
+						type:2,
+						pageNo: 1, // 当前页 
+						pageSize: 10, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					exportFn() {
+						sa.confirm('是否导出符合条件的记录?', function() {
+							sa.ajax('/TbPersonVisitRecord/export', sa.removeNull(this.p), function(res) {
+								window.location.href = res.data;
+							}.bind(this));
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbPersonVisitRecord/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-person-visit-record-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-person-visit-record-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-person-visit-record-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/TbPersonVisitRecord/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('/TbPersonVisitRecord/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>

+ 65 - 89
sa-view/tb-terminal/tb-terminal-add.html

@@ -3,7 +3,8 @@
 	<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" />
+		<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">
@@ -14,8 +15,14 @@
 		<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;}
+			.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>
@@ -23,25 +30,21 @@
 			<!-- ------- 内容部分 ------- -->
 			<div class="s-body">
 				<div class="c-panel">
-                    <div class="c-title" v-if="id == 0">数据添加</div>
+					<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.id" br></sa-item>
-						<sa-item type="text" name="部门ID" v-model="m.deptId" br></sa-item>
-						<sa-item type="text" name="名称" v-model="m.name" br></sa-item>
-						<sa-item type="text" name="IP地址" v-model="m.ipAddress" br></sa-item>
-						<sa-item type="enum" name="状态" v-model="m.state" :jv="{0: '离线', 1: '正常 no-add no-s'}" jtype="3" br></sa-item>
-						<sa-item type="text" name="序列号" v-model="m.sn" br></sa-item>
-						<sa-item type="text" name="场所ID" v-model="m.venuesId" br></sa-item>
-						<sa-item type="text" name="场所名称" v-model="m.venuesName" br></sa-item>
-						<sa-item type="num" name="通道ID" v-model="m.channelId" br></sa-item>
-						<sa-item type="text" name="通道名称" v-model="m.channelName" br></sa-item>
-						<sa-item type="text" name="最近一次上线" v-model="m.lastOnLine" br></sa-item>
-						<sa-item type="text" name="备注" v-model="m.remark" br></sa-item>
-						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
-						<sa-item type="text" name="创建人" v-model="m.createBy" br></sa-item>
-						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
-						<sa-item type="text" name="更新人" v-model="m.updateBy" br></sa-item>
+						<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.channelId" 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="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>
 						</sa-item>
@@ -54,96 +57,69 @@
 				<el-button @click="sa.closeCurrIframe()">取消</el-button>
 			</div>
 		</div>
-        <script>
-			
+		<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,		// 实体对象 
+					areaList: [],
+					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改) 
+					m: {
+						id: '', //  
+						deptId: '', // 部门ID 
+						name: '', // 名称 
+						ipAddress: '', // IP地址 
+						state: '', // 状态(0=离线,1=正常 no-add no-s) 
+						sn: '', // 序列号 
+						venuesId: '', // 场所ID 
+						venuesName: '', // 场所名称 
+						channelId: '', // 通道ID 
+						channelName: '', // 通道名称 
+						lastOnLine: '', // 最近一次上线 
+						remark: '', // 备注 
+						createTime: '', // 创建时间 
+						createBy: '', // 创建人 
+						updateTime: '', // 更新时间 
+						updateBy: '', // 更新人 
+					}, // 实体对象 
 				},
 				methods: {
-					// 创建一个 默认Model 
-					createModel: function() {
-						return {
-							id: '',		//  
-							deptId: '',		// 部门ID 
-							name: '',		// 名称 
-							ipAddress: '',		// IP地址 
-							state: '',		// 状态(0=离线,1=正常 no-add no-s) 
-							sn: '',		// 序列号 
-							venuesId: '',		// 场所ID 
-							venuesName: '',		// 场所名称 
-							channelId: '',		// 通道ID 
-							channelName: '',		// 通道名称 
-							lastOnLine: '',		// 最近一次上线 
-							remark: '',		// 备注 
-							createTime: '',		// 创建时间 
-							createBy: '',		// 创建人 
-							updateTime: '',		// 更新时间 
-							updateBy: '',		// 更新人 
-						}
+					getVenuesList() {
+						sa.ajax('/TbVenues/getTree', function(res) {
+							this.areaList = res.data; // 数据
+						}.bind(this));
 					},
 					// 提交数据 
-					ok: function(){
+					ok: function() {
 						// 表单校验 
 						let m = this.m;
-						sa.checkNull(m.id, '请输入 []');
-						sa.checkNull(m.deptId, '请输入 [部门ID]');
 						sa.checkNull(m.name, '请输入 [名称]');
-						sa.checkNull(m.ipAddress, '请输入 [IP地址]');
-						sa.checkNull(m.state, '请输入 [状态]');
-						sa.checkNull(m.sn, '请输入 [序列号]');
-						sa.checkNull(m.venuesId, '请输入 [场所ID]');
-						sa.checkNull(m.venuesName, '请输入 [场所名称]');
-						sa.checkNull(m.channelId, '请输入 [通道ID]');
-						sa.checkNull(m.channelName, '请输入 [通道名称]');
-						sa.checkNull(m.lastOnLine, '请输入 [最近一次上线]');
-						sa.checkNull(m.remark, '请输入 [备注]');
-						sa.checkNull(m.createTime, '请输入 [创建时间]');
-						sa.checkNull(m.createBy, '请输入 [创建人]');
-						sa.checkNull(m.updateTime, '请输入 [更新时间]');
-						sa.checkNull(m.updateBy, '请输入 [更新人]');
-				
+						sa.checkNull(m.channelId, '请选择 [通道]');
 						// 开始增加或修改
-						if(this.id <= 0) {	// 添加
-							sa.ajax('/TbTerminal/add', m, function(res){
-								sa.alert('增加成功', this.clean); 
-							}.bind(this));
-						} else {	// 修改
-							sa.ajax('/TbTerminal/update', m, function(res){
-								sa.alert('修改成功', this.clean);
-							}.bind(this));
-						}
+						m = sa.removeNull(m);
+						sa.ajax('/TbTerminal/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();	// 关闭本页 
-						}
+						parent.app.f5(); // 刷新父页面列表
+						sa.closeCurrIframe(); // 关闭本页 
 					}
 				},
-				mounted: function(){
+				mounted: function() {
+					this.getVenuesList();
 					// 初始化数据 
-					if(this.id <= 0) {	
-						this.m = this.createModel();
-					} else {	
-						sa.ajax('/TbTerminal/getById?id=' + this.id, function(res) {
-							this.m = res.data;
-							if(res.data == null) {
-								sa.alert('未能查找到 id=' + this.id + " 详细数据");
-							}
-						}.bind(this))
-					}
+					sa.ajax('/TbTerminal/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if (res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
 				}
 			})
-			
 		</script>
 	</body>
-</html>
+</html>

+ 91 - 95
sa-view/tb-terminal/tb-terminal-list.html

@@ -3,7 +3,8 @@
 	<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" />
+		<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">
@@ -19,119 +20,112 @@
 			<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.id"></sa-item>
-					<sa-item type="text" name="部门ID" v-model="p.deptId"></sa-item>
-					<sa-item type="text" name="名称" v-model="p.name"></sa-item>
-					<sa-item type="text" name="IP地址" v-model="p.ipAddress"></sa-item>
-					<sa-item type="enum" name="状态" v-model="p.state" 
-						:jv="{0: '离线', 1: '正常 no-add no-s'}" jtype="2" def="不限"></sa-item>
-					<sa-item type="text" name="序列号" v-model="p.sn"></sa-item>
-					<sa-item type="text" name="场所ID" v-model="p.venuesId"></sa-item>
-					<sa-item type="text" name="场所名称" v-model="p.venuesName"></sa-item>
-					<sa-item type="num" name="通道ID" v-model="p.channelId"></sa-item>
-					<sa-item type="text" name="通道名称" v-model="p.channelName"></sa-item>
-					<sa-item type="text" name="最近一次上线" v-model="p.lastOnLine"></sa-item>
-					<sa-item type="text" name="备注" v-model="p.remark"></sa-item>
-					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
-					<sa-item type="text" name="创建人" v-model="p.createBy"></sa-item>
-					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
-					<sa-item type="text" name="更新人" v-model="p.updateBy"></sa-item>
-					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
-					<br />
-					<sa-item name="综合排序">
-						<el-radio-group v-model="p.sortType" class="s-radio-text">
-							<el-radio :label="0">默认</el-radio>
-							<el-radio :label="1"></el-radio>
-							<el-radio :label="2">部门ID</el-radio>
-							<el-radio :label="3">名称</el-radio>
-							<el-radio :label="4">IP地址</el-radio>
-							<el-radio :label="5">状态</el-radio>
-							<el-radio :label="6">序列号</el-radio>
-							<el-radio :label="7">场所ID</el-radio>
-							<el-radio :label="8">场所名称</el-radio>
-							<el-radio :label="9">通道ID</el-radio>
-							<el-radio :label="10">通道名称</el-radio>
-							<el-radio :label="11">最近一次上线</el-radio>
-							<el-radio :label="12">备注</el-radio>
-							<el-radio :label="13">创建时间</el-radio>
-							<el-radio :label="14">创建人</el-radio>
-							<el-radio :label="15">更新时间</el-radio>
-							<el-radio :label="16">更新人</el-radio>
-						</el-radio-group>
-					</sa-item>
-				</el-form>
-				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,export,reset"></sa-item>
+				<sa-item type="text" name="名称" v-model="p.name"></sa-item>
+				<div class="c-item">
+					<label class="c-label">状态:</label>
+					<el-select v-model="p.state" placeholder="请选择">
+						<el-option label="全部" value=""></el-option>
+						<el-option label="在线" value="在线"></el-option>
+						<el-option label="离线" value="离线"></el-option>
+					</el-select>
+				</div>
+				<el-button type="primary" icon="el-icon-search" @click="f5()">查询
+				</el-button>
+
+				<sa-item style="display: inline;" type="fast-btn" show="reset"></sa-item>
 				<!-- ------------- 数据列表 ------------- -->
-				<el-table class="data-table" ref="data-table" :data="dataList" >
-					<sa-td type="selection"></sa-td>
-					<sa-td name="" prop="id" ></sa-td>
-					<sa-td name="部门ID" prop="deptId" ></sa-td>
-					<sa-td name="名称" prop="name" ></sa-td>
-					<sa-td name="IP地址" prop="ipAddress" ></sa-td>
-					<sa-td name="状态" prop="state" type="enum" :jv="{0: '离线', 1: '正常 no-add no-s'}"></sa-td>
-					<sa-td name="序列号" prop="sn" ></sa-td>
-					<sa-td name="场所ID" prop="venuesId" ></sa-td>
-					<sa-td name="场所名称" prop="venuesName" ></sa-td>
-					<sa-td name="通道名称" prop="channelName" ></sa-td>
-					<sa-td name="最近一次上线" prop="lastOnLine" ></sa-td>
-					<sa-td name="备注" prop="remark" ></sa-td>
-					<sa-td name="创建时间" prop="createTime" ></sa-td>
-					<sa-td name="创建人" prop="createBy" ></sa-td>
-					<sa-td name="更新时间" prop="updateTime" ></sa-td>
-					<sa-td name="更新人" prop="updateBy" ></sa-td>
-					<el-table-column label="操作" fixed="right"  width="240px">
+				<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="IP地址" prop="ipAddress"></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>
+					<sa-td name="通道名称" prop="channelName"></sa-td>
+					<sa-td name="创建时间" prop="createTime"></sa-td>
+					<el-table-column label="操作" fixed="right" width="320px">
 						<template slot-scope="s">
-							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
-							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
-							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+							<el-button v-if="sa.isAuth('tb-terminal-edit')" class="c-btn" type="primary"
+								 @click="update(s.row)">修改
+							</el-button>
+							<el-button v-if="sa.isAuth('tb-terminal-reboot')" class="c-btn" type="success"
+								 @click="restart(s.row)">重启
+							</el-button>
+							<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-clear')" class="c-btn" type="danger"
+								 @click="clear(s.row)">清除
+							</el-button>
+							<el-button v-if="sa.isAuth('tb-terminal-unbind')&&s.row.channelId" class="c-btn"
+								type="danger"  @click="unbind(s.row)">解绑
+							</el-button>
+							<el-button v-if="sa.isAuth('tb-terminal-del')" 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>
+				<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'),		
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
 				},
 				el: '.vue-box',
 				data: {
 					p: { // 查询参数  
-						id: '',		//  
-						deptId: '',		// 部门ID 
-						name: '',		// 名称 
-						ipAddress: '',		// IP地址 
-						state: '',		// 状态(0=离线,1=正常 no-add no-s) 
-						sn: '',		// 序列号 
-						venuesId: '',		// 场所ID 
-						venuesName: '',		// 场所名称 
-						channelId: '',		// 通道ID 
-						channelName: '',		// 通道名称 
-						lastOnLine: '',		// 最近一次上线 
-						remark: '',		// 备注 
-						createTime: '',		// 创建时间 
-						createBy: '',		// 创建人 
-						updateTime: '',		// 更新时间 
-						updateBy: '',		// 更新人 
-						pageNo: 1,		// 当前页 
-						pageSize: 10,	// 页大小 
-						sortType: 0		// 排序方式 
+						name: '', // 名称 
+						state: '', // 状态(0=离线,1=正常 no-add no-s) 
+						pageNo: 1, // 当前页 
+						pageSize: 15, // 页大小 
+						sortType: 0 // 排序方式 
 					},
 					dataCount: 0,
 					dataList: [], // 数据集合 
 				},
 				methods: {
+					open(data) {
+						sa.confirm('是否确定远程开门?', function() {
+							sa.ajax('/TbTerminal/open?id=' + data.id, function(res) {
+								sa.ok('命令已下发');
+							}.bind(this))
+						}.bind(this));
+					},
+					clear(data) {
+						sa.confirm('是否清除设备所有数据?', function() {
+							sa.ajax('/TbTerminal/clear?id=' + data.id, function(res) {
+								sa.ok('命令已下发');
+							}.bind(this))
+						}.bind(this));
+					},
+					unbind(data) {
+						sa.confirm('是否解除设备与场所关联?', function() {
+							sa.ajax('/TbTerminal/unbind?id=' + data.id, function(res) {
+								sa.ok('设备以解绑');
+								this.f5();
+							}.bind(this))
+						}.bind(this));
+					},
+					restart(data) {
+						sa.confirm('是否重启设备?', function() {
+							sa.ajax('/TbTerminal/restart?sn=' + data.sn, function(res) {
+								sa.ok('命令已下发');
+							}.bind(this))
+						}.bind(this));
+					},
 					// 刷新
 					f5: function() {
 						sa.ajax('/TbTerminal/getList', sa.removeNull(this.p), function(res) {
 							this.dataList = res.data; // 数据
 							this.dataCount = res.dataCount; // 数据总数 
-							sa.f5TableHeight();		// 刷新表格高度 
+							sa.f5TableHeight(); // 刷新表格高度 
 						}.bind(this));
 					},
 					// 查看
@@ -141,14 +135,14 @@
 					// 查看 - 根据选中的
 					getBySelect: function(data) {
 						var selection = this.$refs['data-table'].selection;
-						if(selection.length == 0) {
+						if (selection.length == 0) {
 							return sa.msg('请选择一条数据')
 						}
 						this.get(selection[0]);
 					},
 					// 修改
 					update: function(data) {
-						sa.showIframe('修改数据', 'tb-terminal-add.html?id=' + data.id, '1000px', '90%');
+						sa.showIframe('修改数据', 'tb-terminal-add.html?id=' + data.id, '600px', '60%');
 					},
 					// 新增
 					add: function(data) {
@@ -160,7 +154,7 @@
 							sa.ajax('/TbTerminal/delete?id=' + data.id, function(res) {
 								sa.arrayDelete(this.dataList, data);
 								sa.ok('删除成功');
-								sa.f5TableHeight();		// 刷新表格高度 
+								sa.f5TableHeight(); // 刷新表格高度 
 							}.bind(this))
 						}.bind(this));
 					},
@@ -169,15 +163,17 @@
 						// 获取选中元素的id列表 
 						let selection = this.$refs['data-table'].selection;
 						let ids = sa.getArrayField(selection, 'id');
-						if(selection.length == 0) {
+						if (selection.length == 0) {
 							return sa.msg('请至少选择一条数据')
 						}
 						// 提交删除 
 						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
-							sa.ajax('/TbTerminal/deleteByIds', {ids: ids.join(',')}, function(res) {
+							sa.ajax('/TbTerminal/deleteByIds', {
+								ids: ids.join(',')
+							}, function(res) {
 								sa.arrayDelete(this.dataList, selection);
 								sa.ok('删除成功');
-								sa.f5TableHeight();		// 刷新表格高度 
+								sa.f5TableHeight(); // 刷新表格高度 
 							}.bind(this))
 						}.bind(this));
 					},

+ 28 - 13
sa-view/tb-venues/tb-venues-add.html

@@ -26,13 +26,15 @@
                     <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.id" br></sa-item>
-						<sa-item type="text" name="部门ID" v-model="m.deptId" br></sa-item>
-						<sa-item type="text" name="名称" v-model="m.name" br></sa-item>
-						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
-						<sa-item type="text" name="创建人" v-model="m.createBy" br></sa-item>
-						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
-						<sa-item type="text" name="更新人" v-model="m.updateBy" br></sa-item>
+						<div class="c-item">
+							<label class="c-label"><span style="color: red;">*</span>部门:</label>
+							<el-select v-model="m.deptId" :disabled="currentUser.deptId!==9999999">
+								<el-option label="请选择" v-for="(item,index) in deptList" :key="item.id"
+									:label="item.name" :value="item.id"></el-option>
+						
+							</el-select>
+						</div>
+						<sa-item type="text" name="场所名称" v-model="m.name" 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>
@@ -53,15 +55,32 @@
 				},
 				el: '.vue-box',
 				data: {
+					deptList:[],
+					currentUser: sa.$sys.getCurrUser(),
 					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
 					m: null,		// 实体对象 
 				},
 				methods: {
+					getDeptList() {
+						sa.ajax('/TbDept/getList', {
+							pageNo: 1,
+							pageSize: 100
+						}, function(resp) {
+							let list = resp.data;
+							let deptId = this.currentUser.deptId;
+							if (deptId != 9999999) {
+								this.m.deptId = deptId;
+							}
+							this.deptList = list;
+						}.bind(this))
+					},
 					// 创建一个 默认Model 
 					createModel: function() {
 						return {
 							id: '',		//  
 							deptId: '',		// 部门ID 
+							deptName: '',		// 部门 
+							pId: sa.p('pId', '-1'),		// 父ID 
 							name: '',		// 名称 
 							createTime: '',		// 创建时间 
 							createBy: '',		// 创建人 
@@ -73,13 +92,8 @@
 					ok: function(){
 						// 表单校验 
 						let m = this.m;
-						sa.checkNull(m.id, '请输入 []');
-						sa.checkNull(m.deptId, '请输入 [部门ID]');
+						sa.checkNull(m.deptId, '请选择 [部门]');
 						sa.checkNull(m.name, '请输入 [名称]');
-						sa.checkNull(m.createTime, '请输入 [创建时间]');
-						sa.checkNull(m.createBy, '请输入 [创建人]');
-						sa.checkNull(m.updateTime, '请输入 [更新时间]');
-						sa.checkNull(m.updateBy, '请输入 [更新人]');
 				
 						// 开始增加或修改
 						if(this.id <= 0) {	// 添加
@@ -103,6 +117,7 @@
 					}
 				},
 				mounted: function(){
+					this.getDeptList();
 					// 初始化数据 
 					if(this.id <= 0) {	
 						this.m = this.createModel();

+ 107 - 0
sa-view/tb-venues/tb-venues-addchildren.html

@@ -0,0 +1,107 @@
+<!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>
+						<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: sa.p('deptId', '-1'),		// 部门ID 
+							deptName: '',		// 部门 
+							pId: sa.p('pId', '-1'),		// 父ID 
+							name: '',		// 名称 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.name, '请输入通道 [名称]');
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbVenues/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbVenues/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('/TbVenues/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 1 - 4
sa-view/tb-venues/tb-venues-info.html

@@ -23,13 +23,10 @@
 			<div class="s-body">
 				<div class="c-panel">
 					<el-form v-if="m">
-						<sa-info name="" br>{{m.id}}</sa-info>
-						<sa-info name="部门ID" br>{{m.deptId}}</sa-info>
+						<sa-info name="部门" br>{{m.deptName}}</sa-info>
 						<sa-info name="名称" br>{{m.name}}</sa-info>
 						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
-						<sa-info name="创建人" br>{{m.createBy}}</sa-info>
 						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
-						<sa-info name="更新人" br>{{m.updateBy}}</sa-info>
 					</el-form>
 				</div>
 			</div>

+ 29 - 41
sa-view/tb-venues/tb-venues-list.html

@@ -20,50 +20,32 @@
 				<!-- ------------- 检索参数 ------------- -->
 				<div class="c-title">检索参数</div>
 				<el-form ref="form" :model='p' @submit.native.prevent>
-					<sa-item type="text" name="" v-model="p.id"></sa-item>
-					<sa-item type="text" name="部门ID" v-model="p.deptId"></sa-item>
-					<sa-item type="text" name="名称" v-model="p.name"></sa-item>
-					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
-					<sa-item type="text" name="创建人" v-model="p.createBy"></sa-item>
-					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
-					<sa-item type="text" name="更新人" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="场所名称" v-model="p.name"></sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
-					<br />
-					<sa-item name="综合排序">
-						<el-radio-group v-model="p.sortType" class="s-radio-text">
-							<el-radio :label="0">默认</el-radio>
-							<el-radio :label="1"></el-radio>
-							<el-radio :label="2">部门ID</el-radio>
-							<el-radio :label="3">名称</el-radio>
-							<el-radio :label="4">创建时间</el-radio>
-							<el-radio :label="5">创建人</el-radio>
-							<el-radio :label="6">更新时间</el-radio>
-							<el-radio :label="7">更新人</el-radio>
-						</el-radio-group>
-					</sa-item>
+					<el-button type="primary" icon="el-icon-plus" @click="add" v-if="sa.isAuth('tb-venues-add')">新增场所</el-button>
+					<el-button type="info"  icon="el-icon-refresh"  @click="p.name='',f5()">重置</el-button>
+					
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,export,reset"></sa-item>
+				
 				<!-- ------------- 数据列表 ------------- -->
-				<el-table class="data-table" ref="data-table" :data="dataList" >
-					<sa-td type="selection"></sa-td>
-					<sa-td name="" prop="id" ></sa-td>
-					<sa-td name="部门ID" prop="deptId" ></sa-td>
+				<el-table class="data-table" ref="data-table" :data="dataList"  row-key="id" border @expand-change="sa.f5TableHeight()">
+					<sa-td name="序号" type="index"></sa-td>
+					<sa-td name="部门" prop="deptName" ></sa-td>
 					<sa-td name="名称" prop="name" ></sa-td>
 					<sa-td name="创建时间" prop="createTime" ></sa-td>
-					<sa-td name="创建人" prop="createBy" ></sa-td>
 					<sa-td name="更新时间" prop="updateTime" ></sa-td>
-					<sa-td name="更新人" prop="updateBy" ></sa-td>
-					<el-table-column label="操作" fixed="right"  width="240px">
+					<el-table-column label="操作" fixed="right"  width="320px">
 						<template slot-scope="s">
-							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
-							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
-							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+							<el-button v-if="s.row.pId===-1&&sa.isAuth('tb-venues-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="s.row.pId!==-1&&sa.isAuth('tb-venues-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="updateChild(s.row)">修改</el-button>
+							<el-button v-if="s.row.pId===-1&&sa.isAuth('tb-venues-add')" class="c-btn" type="primary" icon="el-icon-plus" @click="addChildren(s.row)">添加通道</el-button>
+							<el-button v-if="sa.isAuth('tb-venues-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>
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()" :sizes="[1000]"></sa-item>
 			</div>
 		</div>
 		<script>
@@ -77,6 +59,8 @@
 					p: { // 查询参数  
 						id: '',		//  
 						deptId: '',		// 部门ID 
+						deptName: '',		// 部门 
+						pId: '',		// 父ID 
 						name: '',		// 名称 
 						createTime: '',		// 创建时间 
 						createBy: '',		// 创建人 
@@ -92,7 +76,7 @@
 				methods: {
 					// 刷新
 					f5: function() {
-						sa.ajax('/TbVenues/getList', sa.removeNull(this.p), function(res) {
+						sa.ajax('/TbVenues/getTree', sa.removeNull(this.p), function(res) {
 							this.dataList = res.data; // 数据
 							this.dataCount = res.dataCount; // 数据总数 
 							sa.f5TableHeight();		// 刷新表格高度 
@@ -112,19 +96,25 @@
 					},
 					// 修改
 					update: function(data) {
-						sa.showIframe('修改数据', 'tb-venues-add.html?id=' + data.id, '1000px', '90%');
+						sa.showIframe('修改场所', 'tb-venues-add.html?id=' + data.id, '600px', '60%');
+					},
+					updateChild(data){
+						sa.showIframe('修改通道', 'tb-venues-addchildren.html?id=' + data.id+'&deptId='+data.deptId, '500px', '60%');
+						
 					},
 					// 新增
 					add: function(data) {
-						sa.showIframe('新增数据', 'tb-venues-add.html?id=-1', '1000px', '90%');
+						sa.showIframe('新增场所', 'tb-venues-add.html?id=-1', '500px', '50%');
+					},
+					// 新增子级
+					addChildren: function(data) {
+						sa.showIframe('新增通道', 'tb-venues-addchildren.html?id=-1&pId=' + data.id+'&deptId='+data.deptId, '500px', '50%');
 					},
 					// 删除
 					del: function(data) {
 						sa.confirm('是否删除,此操作不可撤销', function() {
 							sa.ajax('/TbVenues/delete?id=' + data.id, function(res) {
-								sa.arrayDelete(this.dataList, data);
-								sa.ok('删除成功');
-								sa.f5TableHeight();		// 刷新表格高度 
+								this.f5();
 							}.bind(this))
 						}.bind(this));
 					},
@@ -139,9 +129,7 @@
 						// 提交删除 
 						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
 							sa.ajax('/TbVenues/deleteByIds', {ids: ids.join(',')}, function(res) {
-								sa.arrayDelete(this.dataList, selection);
-								sa.ok('删除成功');
-								sa.f5TableHeight();		// 刷新表格高度 
+								this.f5();
 							}.bind(this))
 						}.bind(this));
 					},