feat: 事务管理新增命令行控制

This commit is contained in:
yarnom 2025-11-19 15:44:31 +08:00
parent 2adc892fd2
commit 12eb4471f9
2 changed files with 44 additions and 13 deletions

View File

@ -33,6 +33,8 @@ public class RtkTransactionController extends BasicController {
Page<RtkTransaction> pageable = new Page<>(page, limit);
QueryWrapper<RtkTransaction> qw = new QueryWrapper<>();
if(device_id!=null && !device_id.isEmpty()) qw.eq("device_id", device_id);
// 最新在最上按自增ID倒序等价于按创建时间倒序
qw.orderByDesc("id");
IPage<RtkTransaction> cs = mapper.selectPage(pageable, qw);
JSONObject json = new JSONObject();
json.put("code",0);

View File

@ -40,6 +40,17 @@
<script>
layui.use(['form','table'], function(){
var $=layui.$, form=layui.form, table=layui.table;
var cmdWs=null, cmdConnected=false;
function connectCmdWs(onmsg){
if(cmdWs && cmdWs.readyState===WebSocket.OPEN) return;
var cur=window.location.href; var pn=window.location.pathname; var pos=cur.indexOf(pn); var base=cur.substring(0,pos);
var url=(base+"/websocket/cmdline").replace("http","ws");
cmdWs=new WebSocket(url);
cmdWs.onopen=function(){ cmdConnected=true; if(onmsg) onmsg('已连接设备通讯通道'); };
cmdWs.onclose=function(){ cmdConnected=false; if(onmsg) onmsg('通讯通道已关闭'); };
cmdWs.onerror=function(){ if(onmsg) onmsg('通讯通道连接失败'); };
}
function sendDebugCmd(dev, content, onres){ if(!dev){layer.msg('无设备号');return;} $.ajax({ type:'POST', url:'/gnss/config_cmd', data:{ tx_win: content, device_id: dev, cmd_type: 3, send_channel: 0 }, success:function(res){ if(onres) onres(res); }, error:function(){ layer.alert('请求失败'); } }); }
function toHexSp(str){
var s=''; for(var i=0;i<str.length;i++){ var h=str.charCodeAt(i).toString(16).toUpperCase(); if(h.length<2) h='0'+h; s+=h+(i<str.length-1?' ':''); } return s;
}
@ -68,20 +79,38 @@ layui.use(['form','table'], function(){
if(obj.event==='check'){
var cmd = '$POLCFGBASE,' + d.latitude + ',' + d.longitude + ',' + d.altitude + '\r\n\r\n';
var hex = toHexSp(cmd);
var html = '<div style="padding:10px;">' +
'<div class="layui-text">命令</div><pre class="layui-code">'+cmd.replace(/</g,'&lt;')+'</pre>'+
var html = ''+
'<div style="padding:10px;">'+
'<div class="layui-row">'+
'<div class="layui-col-md12">'+
'<div class="layui-text">设备号:<b>'+ (d.device_id||'') +'</b></div><hr/>'+
'<div class="layui-btn-group" style="margin-bottom:8px;">'+
'<button class="layui-btn layui-btn-primary" id="btn-tx-connect">连接通道</button>'+
'<button class="layui-btn" id="btn-tx-0100">发送 0100</button>'+
'<button class="layui-btn" id="btn-tx-0102">发送 0102</button>'+
'</div>'+
'<div class="layui-text">生效命令</div><pre class="layui-code">'+cmd.replace(/</g,'&lt;')+'</pre>'+
'<div class="layui-text">十六进制</div><pre class="layui-code">'+hex+'</pre>'+
'<div class="layui-text">命令行消息</div><pre id="tx-cmd-info" style="white-space: pre-wrap;word-break: break-all;max-height:220px;overflow-y:auto;border:1px solid #e6e6e6;border-radius:2px;padding:6px;"></pre>'+
'</div>'+
'</div>'+
'</div>';
layer.open({
title:'检查', type:1, area:['600px','420px'], content: html,
btn:['生效','取消'],
yes: function(index){
$.post('/rtk/transaction/check',{id:d.id, apply:true}, function(){ layer.close(index); table.reload('txTable'); });
var idx = layer.open({ title:'检查', type:1, area:['680px','560px'], content: html, btn:['生效','取消'],
success:function(){
var info = layui.$('#tx-cmd-info');
var deviceId = d.device_id;
layui.$('#btn-tx-connect').on('click', function(){ connectCmdWs(function(m){ info.text(info.text()+m+'\n'); var el=info.get(0); el.scrollTop=el.scrollHeight; }); });
layui.$('#btn-tx-0100').on('click', function(){ sendDebugCmd(deviceId,'0100', function(res){ var s=(res&&res.data)||''; info.text(info.text()+s+'\n'); var el=info.get(0); el.scrollTop=el.scrollHeight; }); });
layui.$('#btn-tx-0102').on('click', function(){ sendDebugCmd(deviceId,'0102', function(res){ var s=(res&&res.data)||''; info.text(info.text()+s+'\n'); var el=info.get(0); el.scrollTop=el.scrollHeight; }); });
// 监听 WebSocket 输出
try{
connectCmdWs(function(){});
if(cmdWs){ cmdWs.onmessage=function(e){ var msg=e.data||''; var parts=msg.trim().split(/\s+/); if(parts[0]==='RX' && parts.length>3){ if(deviceId && parts[3]!==deviceId) return; } info.text(info.text()+msg+'\n'); var el=info.get(0); el.scrollTop=el.scrollHeight; }; }
}catch(e){}
},
btn2: function(index){
$.post('/rtk/transaction/check',{id:d.id, apply:false}, function(){ layer.close(index); table.reload('txTable'); });
return false;
}
yes: function(index){ $.post('/rtk/transaction/check',{id:d.id, apply:true}, function(){ layer.close(index); table.reload('txTable'); }); },
btn2: function(index){ $.post('/rtk/transaction/check',{id:d.id, apply:false}, function(){ layer.close(index); table.reload('txTable'); }); return false; },
end:function(){ try{ if(cmdWs){ cmdWs.close(); cmdWs=null; } }catch(e){} }
});
}
});