From d41b8c33c18627c17db8f1b013e8826a9be2d292 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期四, 14 五月 2026 09:32:21 +0800
Subject: [PATCH] gxwc
---
scripts/build.js | 167 ++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 108 insertions(+), 59 deletions(-)
diff --git a/scripts/build.js b/scripts/build.js
index a08bf81..4423024 100644
--- a/scripts/build.js
+++ b/scripts/build.js
@@ -25,11 +25,11 @@
fs.mkdirSync(DIST, { recursive: true });
for (const key of targets) {
const t = TARGETS[key];
- const outDir = path.join(DIST, `jms-connection-service-${t.os}`);
+ const outDir = path.join(DIST, "jms-connection-service-" + t.os);
try {
fs.rmSync(outDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 500 });
} catch {
- console.log(` ⚠ ${t.os} 目录清理失败(可能被占用),尝试增量覆盖...`);
+ console.log(" ⚠ " + t.os + " 目录清理失败(可能被占用),尝试增量覆盖...");
}
}
@@ -47,21 +47,21 @@
for (const key of targets) {
const t = TARGETS[key];
- const baseName = `jms-connection-service-${t.os}`;
- const outDir = path.join(DIST, `jms-connection-service-${t.os}`);
+ const baseName = "jms-connection-service-" + t.os;
+ const outDir = path.join(DIST, "jms-connection-service-" + t.os);
fs.mkdirSync(outDir, { recursive: true });
const outPath = path.join(outDir, baseName);
- console.log(` 编译 ${t.id} → ${path.relative(ROOT, outPath)}${t.ext}`);
+ console.log(" 编译 " + t.id + " → " + path.relative(ROOT, outPath) + t.ext);
try {
execSync(
- `npx pkg . --targets ${t.id} --output "${outPath}"`,
- { cwd: ROOT, stdio: "inherit", env: { ...process.env, PKG_CACHE_PATH: PKG_CACHE } }
+ 'npx pkg . --targets ' + t.id + ' --output "' + outPath + '"',
+ { cwd: ROOT, stdio: "inherit", env: Object.assign({}, process.env, { PKG_CACHE_PATH: PKG_CACHE }) }
);
- builtFiles.push({ key, outDir, baseName, ext: t.ext, os: t.os });
+ builtFiles.push({ key: key, outDir: outDir, baseName: baseName, ext: t.ext, os: t.os });
} catch (err) {
- console.error(` ✗ ${t.id} 编译失败: ${err.message}`);
+ console.error(" ✗ " + t.id + " 编译失败: " + err.message);
process.exit(1);
}
}
@@ -70,7 +70,7 @@
console.log("[4/5] 组装发布包...");
for (const item of builtFiles) {
- const { outDir } = item;
+ const outDir = item.outDir;
// 复制配置模板
const configSrc = path.join(ROOT, "config.json");
@@ -81,86 +81,135 @@
fs.mkdirSync(path.join(outDir, "logs"), { recursive: true });
// 写入使用说明
- const readme = [
- "JMS 透析机 TCP 联机服务",
- "========================",
- "",
- "快速开始:",
- " 1. 编辑 config.json,配置设备 IP、端口、序列号",
- " 2. 命令行启动:",
- ` Windows: .\\jms-connection-service-windows.exe`,
- ` Linux: ./jms-connection-service-linux`,
- " 3. 浏览器访问 http://localhost:3100 查看监控大屏",
- "",
- "目录结构:",
- ` jms-connection-service-${item.os}/`,
- ` ├── jms-connection-service-${item.os}${item.ext} # 主程序`,
- " ├── config.json # 配置文件(可编辑)",
- " └── logs/ # 日志目录(自动创建)",
- "",
- "注册为系统服务(推荐生产环境):",
- ` Windows: sc create JMSConnection binPath= "完整路径\\jms-connection-service-windows.exe" start= auto`,
- " Linux: 参考 DEPLOY.md 中的 PM2 / systemd 章节",
- "",
- "详细文档见 DEPLOY.md",
- ].join("\n");
+ var readmeLines = [];
+ readmeLines.push("JMS 透析机 TCP 联机服务");
+ readmeLines.push("========================");
+ readmeLines.push("");
+ readmeLines.push("快速开始:");
+ readmeLines.push(" 1. 编辑 config.json,配置设备 IP、端口、序列号");
+ readmeLines.push(" 2. 命令行启动:");
+ readmeLines.push(" Windows: .\\jms-connection-service-windows.exe");
+ readmeLines.push(" Linux: ./jms-connection-service-linux");
+ readmeLines.push(" 3. 浏览器访问 http://localhost:3100 查看监控大屏");
+ readmeLines.push("");
+ readmeLines.push("──────────────────────────────────────────────────────");
+ readmeLines.push("config.json 配置项说明");
+ readmeLines.push("──────────────────────────────────────────────────────");
+ readmeLines.push("");
+ readmeLines.push("【全局参数】");
+ readmeLines.push(" pollIntervalMs = 10000 // K 轮询间隔(毫秒)");
+ readmeLines.push(" connectTimeoutMs = 5000 // TCP 握手超时(毫秒)");
+ readmeLines.push(" reconnectBaseMs = 3000 // 重连退避基数(毫秒)");
+ readmeLines.push(" reconnectMaxMs = 60000 // 重连退避上限(毫秒)");
+ readmeLines.push(" logDir = \"./logs\" // 日志目录,基于程序所在目录");
+ readmeLines.push(" logRetentionDays = 30 // 日志保留天数");
+ readmeLines.push(" dashboardPort = 3100 // 监控大屏 HTTP 端口");
+ readmeLines.push("");
+ readmeLines.push("【MQTT 上传(可选,默认关闭)】");
+ readmeLines.push(" mqtt.enabled = false // 是否启用 MQTT");
+ readmeLines.push(" mqtt.brokerUrl = \"mqtt.ihemodialysis.com\"");
+ readmeLines.push(" mqtt.port = 62283");
+ readmeLines.push(" mqtt.username = \"data\"");
+ readmeLines.push(" mqtt.password = \"data#2018\"");
+ readmeLines.push(" mqtt.reconnectPeriod = 5000 // 重连间隔(毫秒)");
+ readmeLines.push(" mqtt.clientCode = \"CLIENT...\" // 客户端标识");
+ readmeLines.push(" mqtt.defaultTopicPrefix = \"touxiji\" // topic = prefix/序列号");
+ readmeLines.push(" mqtt.qos = 1");
+ readmeLines.push("");
+ readmeLines.push("【阿里云 IoT 上传(可选,默认开启)】");
+ readmeLines.push(" aliyun.enabled = true");
+ readmeLines.push(" aliyun.autoRegister = true // 设备不存在时自动注册");
+ readmeLines.push(" aliyun.tupleApiBaseUrl = \"https://things.icoldchain.cn/\"");
+ readmeLines.push(" aliyun.tupleApiPath = \"device/info/getAliyunDeviceSecret\"");
+ readmeLines.push(" aliyun.tupleRetryCooldownMs = 60000 // 三元组失败冷却(毫秒)");
+ readmeLines.push("");
+ readmeLines.push("【设备列表(必填)】");
+ readmeLines.push(" devices = [");
+ readmeLines.push(" {");
+ readmeLines.push(" \"ip\": \"192.168.1.101\", // 设备 IP(必填)");
+ readmeLines.push(" \"port\": 10001, // 端口(GC-110N 默认 10001)");
+ readmeLines.push(" \"serialNumber\": \"D001\", // 序列号(必填,上传标识)");
+ readmeLines.push(" \"enabled\": true // 是否启用(false=跳过)");
+ readmeLines.push(" },");
+ readmeLines.push(" ...可添加多台设备");
+ readmeLines.push(" ]");
+ readmeLines.push("");
+ readmeLines.push("──────────────────────────────────────────────────────");
+ readmeLines.push("重连策略: 断线后指数退避 3s → 6s → 12s → 24s → 48s → 60s 上限");
+ readmeLines.push("连接成功后计数器重置。");
+ readmeLines.push("");
+ readmeLines.push("目录结构:");
+ readmeLines.push(" jms-connection-service-" + item.os + "/");
+ readmeLines.push(" ├── jms-connection-service-" + item.os + item.ext + " # 主程序");
+ readmeLines.push(" ├── config.json # 配置文件");
+ readmeLines.push(" └── logs/ # 日志目录");
+ readmeLines.push("");
+ readmeLines.push("注册为系统服务(推荐生产环境):");
+ readmeLines.push(" Windows: sc create JMSConnection binPath= \"完整路径\\jms-connection-service-windows.exe\" start= auto");
+ readmeLines.push(" Linux: 参考 DEPLOY.md 中的 PM2 / systemd 章节");
+ readmeLines.push("");
+ readmeLines.push("详细文档见 DEPLOY.md");
+ var readme = readmeLines.join("\n");
fs.writeFileSync(path.join(outDir, "README.txt"), readme, "utf-8");
- console.log(` ${item.os}: ${path.relative(ROOT, outDir)}/ 组装完成`);
+ console.log(" " + item.os + ": " + path.relative(ROOT, outDir) + "/ 组装完成");
}
// ── 5. 打包归档 ──
console.log("[5/5] 打包归档...");
for (const item of builtFiles) {
- const { outDir, baseName, os } = item;
+ const outDir = item.outDir;
+ const baseName = item.baseName;
+ const os = item.os;
const dirName = path.basename(outDir);
if (os === "windows") {
- const zipPath = path.join(DIST, `${baseName}.zip`);
+ const zipPath = path.join(DIST, baseName + ".zip");
try {
- // 清除旧 zip
- try { fs.unlinkSync(zipPath); } catch {}
+ try { fs.unlinkSync(zipPath); } catch (e) {}
execSync(
- `powershell -Command "Compress-Archive -Path '${outDir}' -DestinationPath '${zipPath}' -Force"`,
+ "powershell -Command \"Compress-Archive -Path '" + outDir + "' -DestinationPath '" + zipPath + "' -Force\"",
{ stdio: "ignore" }
);
- console.log(` ${path.basename(zipPath)} (${formatSize(fs.statSync(zipPath).size)})`);
- } catch {
- console.log(` ⚠ PowerShell 不可用,跳过 zip (文件在 ${path.relative(ROOT, outDir)}/)`);
+ console.log(" " + path.basename(zipPath) + " (" + formatSize(fs.statSync(zipPath).size) + ")");
+ } catch (e) {
+ console.log(" ⚠ PowerShell 不可用,跳过 zip (文件在 " + path.relative(ROOT, outDir) + "/)");
}
} else {
- const tgzPath = path.join(DIST, `${baseName}.tar.gz`);
+ const tgzPath = path.join(DIST, baseName + ".tar.gz");
try {
- try { fs.unlinkSync(tgzPath); } catch {}
- // 用相对路径避免 Windows 盘符问题
+ try { fs.unlinkSync(tgzPath); } catch (e) {}
execSync(
- `tar -czf "${tgzPath}" -C "${DIST}" "${dirName}"`,
+ 'tar -czf "' + tgzPath + '" -C "' + DIST + '" "' + dirName + '"',
{ stdio: "ignore", cwd: DIST }
);
- console.log(` ${path.basename(tgzPath)} (${formatSize(fs.statSync(tgzPath).size)})`);
- } catch {
- console.log(` ⚠ tar 不可用,跳过归档 (文件在 ${path.relative(ROOT, outDir)}/)`);
+ console.log(" " + path.basename(tgzPath) + " (" + formatSize(fs.statSync(tgzPath).size) + ")");
+ } catch (e) {
+ console.log(" ⚠ tar 不可用,跳过归档 (文件在 " + path.relative(ROOT, outDir) + "/)");
}
}
}
// ── 汇总 ──
-console.log("\n======== 打包完成 ========");
-console.log(`输出目录: ${path.relative(ROOT, DIST)}/`);
+console.log("");
+console.log("======== 打包完成 ========");
+console.log("输出目录: " + path.relative(ROOT, DIST) + "/");
const distFiles = fs.readdirSync(DIST);
-for (const f of distFiles) {
- const full = path.join(DIST, f);
- const stat = fs.statSync(full);
+for (var i = 0; i < distFiles.length; i++) {
+ var f = distFiles[i];
+ var full = path.join(DIST, f);
+ var stat = fs.statSync(full);
if (stat.isDirectory()) {
- const contents = fs.readdirSync(full);
- const exe = contents.find(x => x.endsWith(".exe") || x.startsWith("jms-connection-service-"));
- console.log(` ${f}/ (${exe ? exe + "、" : ""}config.json、logs/、README.txt)`);
+ var contents = fs.readdirSync(full);
+ var exe = contents.find(function(x) { return x.endsWith(".exe") || x.startsWith("jms-connection-service-"); });
+ console.log(" " + f + "/ (" + (exe || "?") + "、config.json、logs/、README.txt)");
} else {
- console.log(` ${f} (${formatSize(stat.size)})`);
+ console.log(" " + f + " (" + formatSize(stat.size) + ")");
}
}
-console.log("\n下一步: 进入 dist/ 对应目录,编辑 config.json 后启动程序验证。");
+console.log("");
+console.log("下一步: 进入 dist/ 对应目录,编辑 config.json 后启动程序验证。");
// ── helpers ──
function formatSize(bytes) {
--
Gitblit v1.8.0