feat: Kotlin+Solon 重构医院前置机(业务+被控端+Agent+升级流程)

主程序(com.hospital.front):
- Kotlin 2.0.21 + Solon 3.10.7 + MyBatis-Plus + HikariCP + Logback
- HospitalAdapter 策略模式:5 家医院(xinglongyuan/qingyang/ningxia/yanan/jinghe)+ dev Mock
- 三方言 Mapper:bsm(Oracle)/ nx / ya(SqlServer),存储过程参数原样迁移
- 20 个业务接口(/order/*)+ 11 个被控端接口(/api/admin/*,Token 鉴权+脱敏+防穿越)
- 全局异常处理、Result 统一响应、业务开关热更新

Agent(com.hospital.agent,独立进程,单 jar 双 main):
- WebSocket 主动出站连 B 端(指数退避重连),心跳转发主程序健康
- ProcessGuard 看门狗:3 次探测失败自动拉起主程序
- UpgradeCommand:下载→SHA256 校验→备份→替换→拉起→健康检查→失败自动回滚
- 命令分发:PING/日志/配置/重启等 10 类命令

部署(pac/):
- Windows Server 脚本(start.bat/agent.bat/WinSW 服务),纯 ASCII 注释防 GBK 错乱
- 5 家医院配置模板 + agent.properties

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-21 12:35:05 +08:00
co-authored by Claude
parent b6c6b436c3
commit 535162e63a
49 changed files with 4893 additions and 25 deletions
+49
View File
@@ -0,0 +1,49 @@
# 外置配置示例(部署时拷贝到 conf\)
> **使用流程**
> 1. 首次部署:把整个 `conf-example\` 目录拷贝为 `conf\`
> ```
> xcopy /E /I conf-example conf
> ```
> 2. 编辑 `conf\app-{编码}.yml`,把 `CHANGE_ME` 替换为真实密码(或通过环境变量注入)
> 3. 根据实际部署环境修改 `hospital.id`、数据库 URL 等
>
> **本目录不入 Git**(已在 `.gitignore` 中声明 `pac/conf/*.yml`)。
## 5 家医院配置清单
| 医院 | 文件 | 数据库 | 默认端口 | `hm.type` |
|---|---|---|---|---|
| 兴隆园医院 | `app-xinglongyuan.yml` | Oracle | 8082 | `bsm` |
| 庆阳医院 | `app-qingyang.yml` | Oracle | 8082 | `bsm` |
| 宁夏宝石花医院 | `app-ningxia.yml` | SqlServer | 8082 | `nx` |
| 延安医院 | `app-yanan.yml` | SqlServer | 8082 | `ya` |
| 泾河医院 | `app-jinghe.yml` | Oracle | 8082 | `bsm` |
## 切换医院
```batch
# 启动泾河(默认)
bin\start.bat start
# 启动其他医院
set HOSPITAL=xinglongyuan
bin\start.bat start
```
## 环境变量占位
配置文件中使用 `${ENV_VAR:DEFAULT}` 占位语法,例如:
```yaml
password: ${DB_PWD_JINGHE:CHANGE_ME}
```
启动前设置环境变量(推荐,避免明文写密码):
```batch
set DB_PWD_JINGHE=ActualPassword
bin\start.bat start
```
> **安全提示**
> 1. 部署后 `chmod 600` 整个 `conf\` 目录(Linux)或 `Set-Acl`Windows PowerShell
> 2. **不要**把包含真实密码的 yml 提交到 Git
+29
View File
@@ -0,0 +1,29 @@
# ====================================
# Agent 配置(部署时拷贝到 D:\hospital-front\conf\agent.properties
# Agent 启动命令:javaw -cp bin\hospital-front.jar com.hospital.agent.AgentMainKt
# 环境变量可覆盖:AGENT_ 前缀 + 大写 + 下划线(如 AGENT_SERVER_URL
# ====================================
# B 端管理服务器 WebSocket 地址
server.url=ws://127.0.0.1:9091/ws
# 设备编号(每台前置机唯一,建议按医院+序号命名)
device.id=jinghe-01
# 设备鉴权 Token(与 B 端注册信息一致)
device.token=
# 主程序健康检查地址
main.health.url=http://127.0.0.1:8082/api/admin/health
# 主程序管理接口 Token(与主程序 app.yml 的 admin.token 一致)
main.admin.token=
# 主程序启动命令(宕机拉起用;Windows 用 .batLinux 用 .sh
main.start.cmd=bin/start.bat
# 心跳间隔(秒)
heartbeat.sec=30
# 是否守护主程序(宕机自动拉起)
guard.enable=true
+18
View File
@@ -0,0 +1,18 @@
# 泾河医院 → 本地 Oracle 测试库(mac204bsm 方言)
hospital:
active: jinghe
hospital.id: 40289fa481b283a90181b340ec060001
hm:
type: bsm
ver: V2
allsecondFlag: false
occFlag: false
solon.dataSources:
db1!:
class: "com.zaxxer.hikari.HikariDataSource"
jdbcUrl: jdbc:oracle:thin:@192.168.50.204:1521/FREEPDB1
username: SYSTEM
password: ${DB_PWD:jyf@2024}
minimumIdle: 2
maximumPoolSize: 10
connectionTimeout: 30000
+18
View File
@@ -0,0 +1,18 @@
# 宁夏宝石花医院 → 本地 SqlServer 测试库(mac204nx 方言)
hospital:
active: ningxia
hospital.id: 402885e0788113ad01788124b3430007
hm:
type: nx
ver: V2
allsecondFlag: true
occFlag: false
solon.dataSources:
db1!:
class: "com.zaxxer.hikari.HikariDataSource"
jdbcUrl: jdbc:sqlserver://192.168.50.204:1433;DatabaseName=HospitalTest;trustServerCertificate=true;encrypt=false
username: sa
password: ${DB_PWD:jyf@2024}
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
minimumIdle: 2
maximumPoolSize: 10
+32
View File
@@ -0,0 +1,32 @@
# ====================================
# 庆阳医院(先与 jinghe 一致,正式环境再调整) 配置
# 文件路径:D:\hospital-front\conf\app-qingyang.yml
# 启动:set HOSPITAL=qingyang && bin\start.bat start
# ====================================
hospital:
active: qingyang
# 医院业务 ID(HIS 系统分配,正式环境核对)
hospital.id: CHANGE_ME_HOSPITAL_ID
# 业务开关
hm:
type: bsm
ver: V2
allsecondFlag: false
occFlag: false
# 数据源(HikariCPSolon 默认连接池;db1! 中 ! 表示默认数据源)
solon.dataSources:
db1!:
class: "com.zaxxer.hikari.HikariDataSource"
jdbcUrl: jdbc:oracle:thin:@CHANGE_ME:1521/ORCL
username: CHANGE_ME
password: ${DB_PWD:CHANGE_ME}
minimumIdle: 2
maximumPoolSize: 10
connectionTimeout: 30000
# 驱动说明:Oracle 由 jdbcUrl 自动识别;SqlServer 需加 driverClassName
# Oracle 驱动按 jdbcUrl 自动识别
+32
View File
@@ -0,0 +1,32 @@
# ====================================
# 兴隆园医院 配置
# 文件路径:D:\hospital-front\conf\app-xinglongyuan.yml
# 启动:set HOSPITAL=xinglongyuan && bin\start.bat start
# ====================================
hospital:
active: xinglongyuan
# 医院业务 ID(HIS 系统分配,正式环境核对)
hospital.id: CHANGE_ME_HOSPITAL_ID
# 业务开关
hm:
type: bsm
ver: V2
allsecondFlag: false
occFlag: false
# 数据源(HikariCPSolon 默认连接池;db1! 中 ! 表示默认数据源)
solon.dataSources:
db1!:
class: "com.zaxxer.hikari.HikariDataSource"
jdbcUrl: jdbc:oracle:thin:@172.17.10.8:1521/ORCL
username: CHANGE_ME
password: ${DB_PWD:CHANGE_ME}
minimumIdle: 2
maximumPoolSize: 10
connectionTimeout: 30000
# 驱动说明:Oracle 由 jdbcUrl 自动识别;SqlServer 需加 driverClassName
# Oracle 驱动按 jdbcUrl 自动识别
+18
View File
@@ -0,0 +1,18 @@
# 延安医院 → 本地 SqlServer 测试库(mac204ya 方言)
hospital:
active: yanan
hospital.id: 402885e0788113ad01788124b3430007
hm:
type: ya
ver: V2
allsecondFlag: false
occFlag: false
solon.dataSources:
db1!:
class: "com.zaxxer.hikari.HikariDataSource"
jdbcUrl: jdbc:sqlserver://192.168.50.204:1433;DatabaseName=HospitalTest;trustServerCertificate=true;encrypt=false
username: sa
password: ${DB_PWD:jyf@2024}
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
minimumIdle: 2
maximumPoolSize: 10