feature/ui #5

Merged
admin merged 6 commits from feature/ui into develop 2025-06-10 09:41:12 +00:00
6 changed files with 1373 additions and 358 deletions

View File

@ -26,4 +26,6 @@ public class DeviceCmd {
String name;
Short type;
String content;
Integer sort;
}

View File

@ -183,7 +183,7 @@ public class CmdLineController extends BasicController{
public JSONObject listCmd(int page, int limit) {
Page<DeviceCmd> pageable = new Page<>(page, limit);
QueryWrapper<DeviceCmd> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
queryWrapper.orderByAsc("sort");
IPage<DeviceCmd> cs = deviceCmdMapper.selectPage(pageable, queryWrapper);
JSONObject jsonObject = new JSONObject();
@ -208,10 +208,19 @@ public class CmdLineController extends BasicController{
return jsonObject;
}
private int getMaxSort() {
QueryWrapper<DeviceCmd> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("sort");
queryWrapper.last("limit 1");
DeviceCmd maxSortCmd = deviceCmdMapper.selectOne(queryWrapper);
return maxSortCmd != null ? maxSortCmd.getSort() : 0;
}
@PostMapping("/gnss/cmd/add")
@ResponseBody
public String addCmd(@RequestBody JSONObject object) throws Exception {
DeviceCmd deviceCmd = JSONObject.toJavaObject(object,DeviceCmd.class);
DeviceCmd deviceCmd = JSONObject.toJavaObject(object, DeviceCmd.class);
deviceCmd.setSort(getMaxSort() + 1);
int num = deviceCmdMapper.insert(deviceCmd);
if (num == 0) {
@ -229,6 +238,7 @@ public class CmdLineController extends BasicController{
return HttpResult.failed();
} else return HttpResult.ok();
}
@PostMapping("/gnss/cmd/go_top")
@ResponseBody
public String topCmd(@RequestParam int id) throws Exception {
@ -236,14 +246,75 @@ public class CmdLineController extends BasicController{
if(cmd == null) return HttpResult.failed();
QueryWrapper<DeviceCmd> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
queryWrapper.orderByAsc("sort");
queryWrapper.last("limit 1");
DeviceCmd cmdMaxId = deviceCmdMapper.selectOne(queryWrapper);
if(!cmdMaxId.getId().equals(cmd.getId())){
deviceCmdMapper.deleteById(cmd.getId());
cmd.setId(cmdMaxId.getId()+1);
deviceCmdMapper.insert(cmd);
DeviceCmd minSortCmd = deviceCmdMapper.selectOne(queryWrapper);
if(minSortCmd != null && !minSortCmd.getId().equals(cmd.getId())) {
cmd.setSort(minSortCmd.getSort() - 1);
deviceCmdMapper.updateById(cmd);
}
return HttpResult.ok();
}
@PostMapping("/gnss/cmd/go_bottom")
@ResponseBody
public String bottomCmd(@RequestParam int id) throws Exception {
DeviceCmd cmd = deviceCmdMapper.selectById(id);
if(cmd == null) return HttpResult.failed();
cmd.setSort(getMaxSort() + 1);
deviceCmdMapper.updateById(cmd);
return HttpResult.ok();
}
@PostMapping("/gnss/cmd/move_up")
@ResponseBody
public String moveUpCmd(@RequestParam int id) throws Exception {
DeviceCmd cmd = deviceCmdMapper.selectById(id);
if(cmd == null) return HttpResult.failed();
QueryWrapper<DeviceCmd> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("sort", cmd.getSort());
queryWrapper.orderByDesc("sort");
queryWrapper.last("limit 1");
DeviceCmd prevCmd = deviceCmdMapper.selectOne(queryWrapper);
if(prevCmd != null) {
int tempSort = cmd.getSort();
cmd.setSort(prevCmd.getSort());
prevCmd.setSort(tempSort);
deviceCmdMapper.updateById(cmd);
deviceCmdMapper.updateById(prevCmd);
}
return HttpResult.ok();
}
@PostMapping("/gnss/cmd/move_down")
@ResponseBody
public String moveDownCmd(@RequestParam int id) throws Exception {
DeviceCmd cmd = deviceCmdMapper.selectById(id);
if(cmd == null) return HttpResult.failed();
QueryWrapper<DeviceCmd> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("sort", cmd.getSort());
queryWrapper.orderByAsc("sort");
queryWrapper.last("limit 1");
DeviceCmd nextCmd = deviceCmdMapper.selectOne(queryWrapper);
if(nextCmd != null) {
int tempSort = cmd.getSort();
cmd.setSort(nextCmd.getSort());
nextCmd.setSort(tempSort);
deviceCmdMapper.updateById(cmd);
deviceCmdMapper.updateById(nextCmd);
}
return HttpResult.ok();
}
@ -255,4 +326,17 @@ public class CmdLineController extends BasicController{
return HttpResult.failed();
} else return HttpResult.ok();
}
@PostMapping("/gnss/cmd/update")
@ResponseBody
public String updateCmd(@RequestBody JSONObject object) throws Exception {
DeviceCmd deviceCmd = JSONObject.toJavaObject(object, DeviceCmd.class);
int num = deviceCmdMapper.updateById(deviceCmd);
if (num == 0) {
return HttpResult.failed();
} else {
return HttpResult.ok();
}
}
}

View File

@ -1,6 +1,7 @@
package com.imdroid.beidou.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.query.MPJQueryWrapper;
@ -45,6 +46,26 @@ public class IndexController extends BasicController{
int noGGA = 0;
int noFix = 0;
//未推送设备数同时满足非SAAS服务商使用状态正常fwd_group_id和fwd_group_id2都为"不推送"的设备
Long deviceNoFwdNum;
QueryWrapper<GnssDevice> noFwdQueryWrapper = new QueryWrapper<>();
if (tenantId != Tenant.SAAS_PROVIDER_ID) {
// 非SAAS服务商查询当前租户
noFwdQueryWrapper.eq("tenantid", tenantId);
} else {
// SAAS服务商查询所有非SAAS的租户
noFwdQueryWrapper.ne("tenantid", Tenant.SAAS_PROVIDER_ID);
}
// 使用状态正常
noFwdQueryWrapper.eq("opmode", GnssDevice.OP_MODE_USE);
// 设备类型为测站非基站
noFwdQueryWrapper.eq("devicetype", GnssDevice.TYPE_ROVER);
// fwd_group_id为"不推送"
noFwdQueryWrapper.eq("fwd_group_id", GnssGroupFwd.FWD_TYPE_NONE);
// fwd_group_id2为"不推送"或为null
noFwdQueryWrapper.and(wrapper -> wrapper.eq("fwd_group_id2", GnssGroupFwd.FWD_TYPE_NONE).or().isNull("fwd_group_id2"));
deviceNoFwdNum = gnssDeviceMapper.selectCount(noFwdQueryWrapper);
List<GnssStatusJoin> deviceList;
if(tenantId == Tenant.SAAS_PROVIDER_ID){
deviceList = statusMapper.queryDeployed();
@ -94,6 +115,7 @@ public class IndexController extends BasicController{
m.addAttribute("warningTotalNum", warning1Num+warning2Num);
m.addAttribute("noGGA", noGGA);
m.addAttribute("noFix", noFix);
m.addAttribute("deviceNoFwdNum", deviceNoFwdNum);
m.addAttribute("deviceList", deviceList);
return "/page/device_overview";
@ -149,6 +171,13 @@ public class IndexController extends BasicController{
else if(query.equals("nogga")){
queryWrapper.isNull("latitude");
}
else if(query.equals("no_fwd")){
// 查询同时满足使用状态正常设备类型为测站fwd_group_id和fwd_group_id2都为"不推送"的设备
queryWrapper.eq("d.opmode", GnssDevice.OP_MODE_USE)
.eq("d.devicetype", GnssDevice.TYPE_ROVER)
.eq("d.fwd_group_id", GnssGroupFwd.FWD_TYPE_NONE)
.and(wrapper -> wrapper.eq("d.fwd_group_id2", GnssGroupFwd.FWD_TYPE_NONE).or().isNull("d.fwd_group_id2"));
}
session.setAttribute("query",query);
}

View File

@ -12,165 +12,522 @@
body {
background-color: #ffffff;
}
.ctx-menu-container {
position: absolute;
background: #fff;
border: 1px solid #d2d2d2;
border-radius: 2px;
box-shadow: 0 2px 4px rgba(0,0,0,.12);
z-index: 999;
display: none;
}
.ctx-menu-container li {
padding: 7px 15px;
cursor: pointer;
}
.ctx-menu-container li:hover {
background-color: #f2f2f2;
}
.ctx-submenu {
padding-left: 20px;
display: none;
}
.active-row {
background-color: #f2f2f2 !important;
}
.highlight-row {
background-color: #fffdd1 !important;
transition: background-color 0.5s;
}
</style>
</head>
<body>
<div class="layui-form layuimini-form">
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
<input type="hidden" name="device_id" id="device_id">
<input type="hidden" name="send_channel" id="send_channel">
<input type="hidden" name="device_id" id="device_id" th:value="${device_id}">
<input type="hidden" name="send_channel" id="send_channel" th:value="${send_channel}">
</div>
<div class="layui-card top-panel">
<div class="layui-card-body">
<input type="hidden" name="id" id="id">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label required">指令名称</label>
<div class="layui-input-block">
<input type="text" name="name" id="name" lay-verify="required" lay-reqtext="不能为空" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">指令类型</label>
<div class="layui-input-inline">
<select name="type" lay-filter="type">
<option value="0">GNSS</option>
<option value="10">DTU</option>
<option value="2">MPU</option>
<option value="11">DTU2</option>
<option value="3">DEBUG</option>
<option value="16">V3.2 DEBUG</option>
</select>
</div>
<div id="cmdFormDialog" style="display: none; padding: 20px;">
<form class="layui-form" lay-filter="cmdForm">
<input type="hidden" name="id" id="id">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label required">指令名称</label>
<div class="layui-input-block">
<input type="text" name="name" id="name" lay-verify="required" lay-reqtext="不能为空" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">指令</label>
<div class="layui-input-block">
<textarea name="content" id="content" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
<div class="layui-inline">
<label class="layui-form-label">指令类型</label>
<div class="layui-input-inline">
<select name="type" id="type" lay-filter="type">
<option value="0">GNSS</option>
<option value="10">DTU</option>
<option value="2">MPU</option>
<option value="11">DTU2</option>
<option value="3">DEBUG</option>
<option value="16">V3.2 DEBUG</option>
</select>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">指令</label>
<div class="layui-input-block">
<textarea name="content" id="content" class="layui-textarea"></textarea>
</div>
</div>
</form>
</div>
<div class="ctx-menu-container" id="rightMenu">
<ul>
<li id="ctx-menu-edit">编辑</li>
<li id="ctx-menu-send">发送</li>
<li id="ctx-menu-top">置顶</li>
<li id="ctx-menu-up">上移</li>
<li id="ctx-menu-down">下移</li>
<li id="ctx-menu-bottom">置底</li>
<li id="ctx-menu-delete">删除</li>
</ul>
</div>
<script src="../../lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="add">添加指令</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="edit" id="btnEdit" disabled>编辑</button>
<button class="layui-btn layui-btn-sm" lay-event="go_top" id="btnTop" disabled>置顶</button>
<button class="layui-btn layui-btn-sm" lay-event="move_up" id="btnUp" disabled>上移</button>
<button class="layui-btn layui-btn-sm" lay-event="move_down" id="btnDown" disabled>下移</button>
<button class="layui-btn layui-btn-sm" lay-event="go_bottom" id="btnBottom" disabled>置底</button>
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="delete" id="btnDelete" disabled>删除</button>
</div>
</script>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal layui-btn-xs " lay-event="use">发送</a>
<a class="layui-btn layui-btn-normal layui-btn-xs " lay-event="go_top">置顶</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="use">发送</a>
</script>
<script th:inline="javascript">
layui.use(['form', 'table'], function () {
layui.use(['form', 'table', 'layer'], function () {
var $ = layui.$,
form = layui.form,
table = layui.table;
table = layui.table,
layer = layui.layer;
var iframeIndex = parent.layer.getFrameIndex(window.name);
var isMoving = false;
var lastMovedId = null;
var isManualOperation = false;
/**
* 初始化表单,要加上,不然刷新部分组件可能会不加载
*/
form.render();
table.render({
var selectedRow = null;
var tableIns = table.render({
elem: '#currentTableId',
url: '/gnss/cmd/list',
cols: [
[
{field: 'name', title: '指令名称',width:'20%'},
{field: 'type', title: '类型',templet: '#typeTrans'},
{field: 'content', title: '指令',width:'40%'},
{title: '操作', toolbar: '#currentTableBar', align: "center", minWidth: 180}
]
],
toolbar: '#toolbarDemo', // 指定工具栏
defaultToolbar: ['filter', 'exports', 'print'], // 默认工具栏
cols: [[
{type: 'checkbox', fixed: 'left'}, // 添加复选框
{field: 'name', title: '指令名称', width: '20%'},
{field: 'type', title: '类型', templet: '#typeTrans'},
{field: 'content', title: '指令', width: '40%'},
{title: '操作', toolbar: '#currentTableBar', width: 100} // 只保留发送按钮
]],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line'
skin: 'line',
done: function(res, curr, count) {
// 表格加载完成后,检查是否有需要选中的行
// 这个部分是需要连续上移或者下移
//
if (lastMovedId && !isManualOperation) {
var data = res.data;
for (var i = 0; i < data.length; i++) {
if (data[i].id == lastMovedId) {
var index = i;
var tr = $('.layui-table-body').find('tr[data-index="' + index + '"]');
tr.find('.layui-form-checkbox').click();
tr.addClass('highlight-row');
setTimeout(function() {
tr.removeClass('highlight-row');
}, 1000);
break;
}
}
}
selectedRow = null;
updateToolbarStatus();
isMoving = false;
isManualOperation = false;
}
});
function updateToolbarStatus() {
var checkStatus = table.checkStatus('currentTableId');
var hasSelection = checkStatus.data.length > 0;
var isSingleSelection = checkStatus.data.length === 1;
// 只能删除,其他的不给点
$('#btnEdit').prop('disabled', !isSingleSelection);
$('#btnTop').prop('disabled', !isSingleSelection);
$('#btnUp').prop('disabled', !isSingleSelection);
$('#btnDown').prop('disabled', !isSingleSelection);
$('#btnBottom').prop('disabled', !isSingleSelection);
$('#btnDelete').prop('disabled', !hasSelection);
if (isSingleSelection) {
$('#btnEdit,#btnTop,#btnUp,#btnDown,#btnBottom').removeClass('layui-btn-disabled');
} else {
$('#btnEdit,#btnTop,#btnUp,#btnDown,#btnBottom').addClass('layui-btn-disabled');
}
if (hasSelection) {
$('#btnDelete').removeClass('layui-btn-disabled');
} else {
$('#btnDelete').addClass('layui-btn-disabled');
}
}
table.on('checkbox(currentTableFilter)', function(obj) {
updateToolbarStatus();
if (obj.type === 'one' && !obj.checked) {
isManualOperation = true;
lastMovedId = null;
}
});
// table.on('rowDouble(currentTableFilter)', function(obj) {
// var data = obj.data;
// editCmd(data);
// });
table.on('sort(currentTableFilter)', function(obj){
isManualOperation = true;
lastMovedId = null;
});
table.on('tool(currentTableFilter)', function (obj) {
isManualOperation = true;
lastMovedId = null;
var data = obj.data;
if (obj.event === 'use') {
parent.setCmd(data.type, data.content);
$.ajax({
type:"POST",
url:"/gnss/config_cmd",
data: {
'device_id':[[${device_id}]],
'send_channel':[[${send_channel}]],
'cmd_type':data.type,
'tx_win':data.content
},
success: function (result) {
if(result.code == 0) parent.setResult(result);
else layer.alert(result.msg);
},
error: function () {
console.log("ajax error");
}
});
}
else if (obj.event === 'delete') {
layer.confirm('确定删除'+data.name+"?", function(index){
$.ajax({
type:"POST",
url:"/gnss/cmd/delete",
data:{
'del_id':data.id
},
success: function (data) {
//data是cotroller相应处理函数的返回值
table.reload('currentTableId');
},
error: function () {
console.log("ajax error");
}
});
layer.close(index);
});
}
else if (obj.event === 'go_top') {
$.ajax({
type:"POST",
url:"/gnss/cmd/go_top",
data:{
'id':data.id
},
success: function (data) {
table.reload('currentTableId');
},
error: function () {
console.log("ajax error");
}
});
sendCmd(data);
}
});
form.on('submit(saveBtn)', function (data) {
function editCmd(data) {
form.val("cmdForm", {
"id": data.id,
"name": data.name,
"type": data.type,
"content": data.content
});
layer.open({
type: 1,
title: '编辑指令',
area: ['500px', '400px'],
content: $('#cmdFormDialog'),
btn: ['保存', '取消'],
yes: function(index, layero) {
saveCmd(index);
},
btn2: function(index, layero) {
layer.close(index);
return false;
}
});
}
function sendCmd(data) {
parent.setCmd(data.type, data.content);
var deviceId = $('#device_id').val();
var sendChannel = $('#send_channel').val();
$.ajax({
type:"POST",
url:"/gnss/cmd/add",
contentType: "application/json;charset=UTF-8",
data: JSON.stringify(data.field),
url:"/gnss/config_cmd",
data: {
'device_id': deviceId,
'send_channel': sendChannel,
'cmd_type': data.type,
'tx_win': data.content
},
success: function (result) {
table.reload('currentTableId');
if(result.code == 0) parent.setResult(result);
else layer.alert(result.msg);
},
error: function () {
console.log("ajax error");
}
});
}
function deleteCmd(id) {
layer.confirm('确定删除此指令?', function(index) {
$.ajax({
type:"POST",
url:"/gnss/cmd/delete",
data:{
'del_id':id
},
success: function (data) {
tableIns.reload();
layer.close(index);
},
error: function () {
console.log("ajax error");
}
});
});
}
// 监听头工具栏事件
table.on('toolbar(currentTableFilter)', function(obj){
var checkStatus = table.checkStatus(obj.config.id);
var data = checkStatus.data; // 获取选中的数据
// 如果不是移动操作重置lastMovedId
if (obj.event !== 'move_up' && obj.event !== 'move_down' &&
obj.event !== 'go_top' && obj.event !== 'go_bottom') {
lastMovedId = null;
isManualOperation = true;
}
switch(obj.event){
case 'add':
// 清空表单
form.val("cmdForm", {
"id": "",
"name": "",
"type": 0,
"content": ""
});
layer.open({
type: 1,
title: '添加指令',
area: ['500px', '400px'],
content: $('#cmdFormDialog'),
btn: ['保存', '取消'],
yes: function(index, layero) {
saveCmd(index);
},
btn2: function(index, layero) {
layer.close(index);
return false;
}
});
break;
case 'edit':
if(data.length === 1) {
editCmd(data[0]);
}
break;
case 'delete':
if(data.length === 0) {
layer.msg('请选择要删除的数据');
return;
}
layer.confirm('确定删除选中的 ' + data.length + ' 条数据?', function(index) {
var deleteCount = 0;
var totalCount = data.length;
for(var i = 0; i < data.length; i++) {
$.ajax({
type:"POST",
url:"/gnss/cmd/delete",
data:{
'del_id': data[i].id
},
success: function() {
deleteCount++;
if(deleteCount === totalCount) {
tableIns.reload();
layer.close(index);
}
}
});
}
});
break;
case 'go_top':
if(data.length === 1) {
moveCmd(data[0].id, 'go_top');
}
break;
case 'move_up':
if(data.length === 1) {
moveCmd(data[0].id, 'move_up');
}
break;
case 'move_down':
if(data.length === 1) {
moveCmd(data[0].id, 'move_down');
}
break;
case 'go_bottom':
if(data.length === 1) {
moveCmd(data[0].id, 'go_bottom');
}
break;
}
});
function saveCmd(index) {
var formData = form.val("cmdForm");
if(!formData.name) {
layer.msg('指令名称不能为空');
return;
}
var url = formData.id ? "/gnss/cmd/update" : "/gnss/cmd/add";
$.ajax({
type: "POST",
url: url,
contentType: "application/json;charset=UTF-8",
data: JSON.stringify(formData),
success: function(result) {
// 关闭弹窗
layer.close(index);
// 刷新表格
tableIns.reload();
layer.msg('保存成功');
},
error: function() {
console.log("ajax error");
layer.msg('保存失败');
}
});
}
// 移动指令(包括置顶、上移、下移、置底)
function moveCmd(id, moveType) {
// 如果当前正在进行移动操作,则忽略本次请求
if (isMoving) {
return;
}
// 设置锁定状态
isMoving = true;
// 记录移动的行ID
lastMovedId = id;
$.ajax({
type:"POST",
url:"/gnss/cmd/" + moveType,
data:{
'id': id
},
success: function() {
tableIns.reload();
},
error: function() {
console.log("ajax error");
isMoving = false;
lastMovedId = null;
}
});
}
var rightMenu = $('#rightMenu');
$(document).on('contextmenu', '.layui-table-view .layui-table-body table tr', function(e) {
var index = $(this).attr('data-index');
var tableData = table.cache['currentTableId'];
selectedRow = tableData[index];
$('.layui-table-body tr').removeClass('active-row');
$(this).addClass('active-row');
var mouseX = e.pageX;
var mouseY = e.pageY;
rightMenu.css({
left: mouseX,
top: mouseY
}).show();
return false;
});
$(document).click(function() {
rightMenu.hide();
});
$('#ctx-menu-edit').click(function() {
if(selectedRow) {
editCmd(selectedRow);
rightMenu.hide();
}
});
$('#ctx-menu-send').click(function() {
if(selectedRow) {
sendCmd(selectedRow);
rightMenu.hide();
}
});
$('#ctx-menu-top').click(function() {
if(selectedRow) {
moveCmd(selectedRow.id, 'go_top');
rightMenu.hide();
}
});
$('#ctx-menu-up').click(function() {
if(selectedRow) {
moveCmd(selectedRow.id, 'move_up');
rightMenu.hide();
}
});
$('#ctx-menu-down').click(function() {
if(selectedRow) {
moveCmd(selectedRow.id, 'move_down');
rightMenu.hide();
}
});
$('#ctx-menu-bottom').click(function() {
if(selectedRow) {
moveCmd(selectedRow.id, 'go_bottom');
rightMenu.hide();
}
});
$('#ctx-menu-delete').click(function() {
if(selectedRow) {
deleteCmd(selectedRow.id);
rightMenu.hide();
}
});
$(document).on('click', '.layui-table-page a', function() {
lastMovedId = null;
isManualOperation = true;
});
$(document).on('click', '.layui-table-tool-panel li', function() {
lastMovedId = null;
isManualOperation = true;
});
});
</script>

View File

@ -12,6 +12,65 @@
body {
background-color: #ffffff;
}
.layui-btn-normal {
background-color: #1aa094;
}
.icon-btn {
/* width: 30px; */
height: 26px;
padding: 0;
}
.layui-table-fixed-l .layui-table-body {
box-shadow: none !important;
}
.layui-btn-normal:hover {
background-color: #148e83;
}
.layui-table-fixed-l .layui-table-body {
box-shadow: none !important;
}
.layui-table-cell {
height: auto;
line-height: 28px;
padding: 6px 15px;
position: relative;
box-sizing: border-box;
}
.layui-btn-xs {
padding: 0 8px;
font-size: 12px;
height: 26px;
line-height: 24px;
}
.device-id-btn {
display: flex;
align-items: center;
justify-content: center;
background-color: #4b97d5f5;
color: white;
border-radius: 5px;
padding: 3px 10px;
cursor: pointer;
transition: background-color 0.3s;
width: 100%;
}
.device-id-btn:hover {
background-color: #339af0;
}
.device-id-btn i {
margin-right: 5px;
}
.icon-only-btn {
background: none;
border: none;
padding: 0;
cursor: pointer;
font-size: 16px;
color: #1aa094;
}
.icon-only-btn:hover {
color: #148e83;
}
</style>
</head>
<body>
@ -28,34 +87,49 @@
form = layui.form,
table = layui.table;
var iframeIndex = parent.layer.getFrameIndex(window.name);
/**
* 初始化表单,要加上,不然刷新部分组件可能会不加载
*/
form.render();
table.render({
elem: '#currentTableId',
url: '/gnss/q_status/list',
cols: [[
{field: 'deviceid', title: '设备号', sort: true},
{field: 'devicetype', title: '设备类型',templet: '#typeTrans'},
{field: 'project_id', title: '项目号'},
{field: 'name', title: '工点'},
{field: 'updatetime', title: '更新时间', templet: "<div>{{layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}</div>"},
{field: 'state', title: '状态',templet: '#stateTrans'},
{field: 'warning', title: '告警',templet: '#warningTrans'},
{field: 'voltage', title: '电压'},
{field: 'temperature', title: '温度'},
{field: 'humidity', title: '湿度'},
{field: 'rssi', title: '信号'},
{field: 'pitch', title: 'x倾角'},
{field: 'roll', title: 'y倾角'},
{field: 'satelliteinuse', title: '使用卫星数'}
{field: 'deviceid', title: '设备号', width: 120, templet: '#deviceIdTpl', align: 'center',sort: true},
{field: 'devicetype', title: '设备类型', templet: '#typeTrans', width: 100},
{field: 'project_id', title: '项目号', width: 100},
{field: 'name', title: '工点', width: 150},
{field: 'updatetime', title: '更新时间', templet: "<div>{{layui.util.toDateString(d.updatetime, 'yyyy-MM-dd HH:mm:ss')}}</div>", width: 170},
{field: 'state', title: '状态', templet: '#stateTrans', width: 80, align: 'center'},
{field: 'warning', title: '告警', templet: '#warningTrans', width: 80, align: 'center'},
{field: 'voltage', title: '电压', width: 80},
{field: 'temperature', title: '温度', width: 80},
{field: 'humidity', title: '湿度', width: 80},
{field: 'rssi', title: '信号', width: 80},
{field: 'pitch', title: 'x倾角', width: 80},
{field: 'roll', title: 'y倾角', width: 80},
{field: 'satelliteinuse', title: '使用卫星数', width: 110},
{field: 'latitude', title: '纬度', hide: true},
{field: 'longitude', title: '经度', hide: true}
]],
limits: [10, 15, 20, 25, 50, 100],
limit: 15,
page: true,
skin: 'line'
skin: 'line',
even: true,
loading: true,
text: {
none: '暂无符合条件的设备'
}
});
table.on('tool(currentTableFilter)', function(obj) {
var data = obj.data;
if (obj.event === 'locate') {
if (data.latitude && data.longitude) {
parent.locateDeviceOnMap(data.deviceid, data.latitude, data.longitude);
} else {
layer.msg('设备无经纬度信息,无法定位');
}
}
});
});
@ -92,5 +166,11 @@
{{# } }}
</script>
<script type="text/html" id="deviceIdTpl">
<div class="device-id-btn" lay-event="locate">
<i class="layui-icon layui-icon-location"></i>{{d.deviceid}}
</div>
</script>
</body>
</html>