Просмотр исходного кода

fix: 修复客户端更新VBScript文件冲突和配置UI交互问题
1. VBScript备份逻辑从CopyFile改为MoveFile,避免"文件已存在"错误
2. 版本号延迟写入,由VBScript在文件移动成功后写入,避免失败时版本号已变
3. UI配置框改为默认留空,增加"获取当前配置"按钮按需填充
4. 实体类添加currentConfigJson的@Column注解

修改文件:
- khd/mesclient-{op170,okng,qm}/src/com/mes/util/ClientRuntimeAgent.java
- mescloud/src/main/resources/views/modules/mesclient/mesClient{Runtime,Version}List.html
- mescloud/src/main/java/com/jeesite/modules/mesclient/entity/MesClientRuntime.java

wangxichen 2 недель назад
Родитель
Сommit
f75df28f4f

+ 1 - 0
src/main/java/com/jeesite/modules/mesclient/entity/MesClientRuntime.java

@@ -16,6 +16,7 @@ import java.util.Date;
         @Column(name = "status", attrName = "status", label = "status"), @Column(name = "status_message", attrName = "statusMessage", label = "status_message", queryType = QueryType.LIKE),
         @Column(name = "last_heartbeat", attrName = "lastHeartbeat", label = "last_heartbeat"), @Column(name = "desired_jar_version", attrName = "desiredJarVersion", label = "desired_jar_version"),
         @Column(name = "desired_config_version", attrName = "desiredConfigVersion", label = "desired_config_version"), @Column(name = "desired_config_json", attrName = "desiredConfigJson", label = "desired_config_json"),
+        @Column(name = "current_config_json", attrName = "currentConfigJson", label = "current_config_json"),
         @Column(name = "create_by", attrName = "createBy", label = "create_by", isUpdate = false, isQuery = false), @Column(name = "create_date", attrName = "createDate", label = "create_date", isUpdate = false, isQuery = false),
         @Column(name = "update_by", attrName = "updateBy", label = "update_by", isQuery = false), @Column(name = "update_date", attrName = "updateDate", label = "update_date", isQuery = false)
 }, orderBy = "a.last_heartbeat DESC")

+ 71 - 15
src/main/resources/views/modules/mesclient/mesClientRuntimeList.html

@@ -12,21 +12,77 @@
 </div><% } %>
 <script>
     function pushConfig(id) {
-        var ver = prompt('配置版本号');
-        if (ver === null) return;
-        var jar = prompt('目标JAR版本(留空不升级)');
-        if (jar === null) return;
-        var json = prompt('配置JSON(留空不修改配置)');
-        if (json === null) return;
-        $.post('${ctx}/mes/clientRuntime/command', {
-            id: id,
-            desiredJarVersion: jar === '' ? null : jar,
-            desiredConfigVersion: ver === '' ? null : ver,
-            desiredConfigJson: json
-        }, function (d) {
-            js.showMessage(d.message || '已下发');
-            $('#dataGrid').trigger('reloadGrid');
-        }, 'json');
+        $.getJSON('${ctx}/mes/clientRuntime/get', {id: id}, function(resp) {
+            if (!resp || resp.result !== 'true' || !resp.data) {
+                js.showMessage('未找到该客户端');
+                return;
+            }
+            var row = resp.data;
+
+            var html = ''
+                + '<div style="padding:18px 24px">'
+                +   '<div class="form-group">'
+                +     '<label>客户端:</label> '
+                +     '<b>' + (row.clientType || '') + ' / ' + (row.stationCode || '') + ' / ' + (row.hostIp || '') + '</b>'
+                +     ' <span style="color:#888">(当前 JAR v' + (row.jarVersion || 0) + ',配置 v' + (row.configVersion || 0) + ')</span>'
+                +   '</div>'
+                +   '<hr style="margin:10px 0">'
+                +   '<div class="form-group">'
+                +     '<label>目标 JAR 版本</label>'
+                +     '<input type="number" id="dlgJarVer" class="form-control" placeholder="留空不升级" value="">'
+                +     '<small style="color:#888">填写目标版本号,留空则不升级 JAR</small>'
+                +   '</div>'
+                +   '<div class="form-group">'
+                +     '<label>配置内容 '
+                +       '<button type="button" id="btnGetCurrentCfg" class="btn btn-xs btn-default">'
+                +         '<i class="fa fa-download"></i> 获取当前配置'
+                +       '</button>'
+                +     '</label>'
+                +     '<textarea id="dlgCfgJson" class="form-control" rows="8" style="font-family:Consolas,monospace;font-size:12px" placeholder="留空不修改配置"></textarea>'
+                +     '<small style="color:#888">留空表示不修改配置。填写后客户端会覆盖本地配置文件并重启。</small>'
+                +   '</div>'
+                + '</div>';
+
+            top.layer.open({
+                type: 1,
+                title: '配置 / 升级客户端',
+                area: ['620px', '480px'],
+                content: html,
+                btn: ['下发', '关闭'],
+                success: function(layero, index) {
+                    // 绑定"获取当前配置"按钮
+                    $(layero).find('#btnGetCurrentCfg').on('click', function() {
+                        var cfg = row.currentConfigJson || '';
+                        if (!cfg) {
+                            top.layer.msg('客户端尚未上报配置(等待首次心跳)');
+                            return;
+                        }
+                        $(layero).find('#dlgCfgJson').val(cfg);
+                    });
+                },
+                yes: function(index, layero) {
+                    var jar = $.trim($(layero).find('#dlgJarVer').val());
+                    var cfg = $.trim($(layero).find('#dlgCfgJson').val());
+                    var cv = null;
+
+                    if (cfg) {
+                        // 配置版本自动 +1
+                        cv = (row.configVersion || 0) + 1;
+                    }
+
+                    $.post('${ctx}/mes/clientRuntime/command', {
+                        id: id,
+                        desiredJarVersion: jar === '' ? null : jar,
+                        desiredConfigVersion: cv,
+                        desiredConfigJson: cfg === '' ? null : cfg
+                    }, function(d) {
+                        top.layer.msg(d.message || '已下发');
+                        top.layer.close(index);
+                        $('#dataGrid').trigger('reloadGrid');
+                    }, 'json');
+                }
+            });
+        });
     }
 
     $('#dataGrid').dataGrid({

+ 14 - 4
src/main/resources/views/modules/mesclient/mesClientVersionList.html

@@ -103,7 +103,7 @@ function openRuntimeDialog(id){
     });
 }
 function renderRuntimeDialog(id, row){
-    // 优先展示客户端本地当前配置(心跳上报的),拿不到才用模板兜底
+    // 准备配置内容:优先展示客户端本地当前配置(心跳上报的),拿不到才用模板兜底
     var cfgStr = row.currentConfigJson || '';
     var pretty = '';
     var isTemplate = false;
@@ -130,10 +130,14 @@ function renderRuntimeDialog(id, row){
         +   '<hr style="margin:10px 0">'
         +   '<div class="form-group"><label>目标 JAR 版本</label>'
         +     '<select id="dlgJarVer" class="form-control"><option value="">— 不升级 —</option></select>'
-        +     '<small style="color:#888">下拉列出该类型下已启用的版本;改动后客户端将自动下载并重启</small>'
+        +     '<small style="color:#888">下拉列出该类型下已启用的版本;留空则不升级 JAR</small>'
         +   '</div>'
-        +   '<div class="form-group"><label>本地配置(留空 = 不下发配置)</label>'
-        +     '<textarea id="dlgCfgJson" class="form-control" rows="10" style="font-family:Consolas,monospace;font-size:12px">'+pretty.replace(/</g,'&lt;')+'</textarea>'
+        +   '<div class="form-group"><label>本地配置(留空 = 不下发配置) '
+        +     '<button type="button" id="btnGetCurrentCfg" class="btn btn-xs btn-default">'
+        +       '<i class="fa fa-download"></i> 获取当前配置'
+        +     '</button>'
+        +   '</label>'
+        +     '<textarea id="dlgCfgJson" class="form-control" rows="10" style="font-family:Consolas,monospace;font-size:12px" placeholder="留空不修改配置"></textarea>'
         +     '<small style="color:#888">'+cfgHint+'</small>'
         +   '</div>'
         + '</div>';
@@ -155,6 +159,12 @@ function renderRuntimeDialog(id, row){
                         $sel.append('<option value="'+v.ver+'"'+sel+'>v'+v.ver+' — '+(v.content||'').replace(/</g,'&lt;')+'</option>');
                     });
                 }, 'json');
+
+            // 绑定"获取当前配置"按钮 - 点击时填充配置内容
+            $(layero).find('#btnGetCurrentCfg').on('click', function() {
+                $(layero).find('#dlgCfgJson').val(pretty);
+                top.layer.msg('已填充配置');
+            });
         },
         yes: function(index, layero){
             var jar = $(layero).find('#dlgJarVer').val();