Files
xk-hy-transit-go/docs/COMMANDS.md
2026-07-15 08:47:41 +08:00

241 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# xk-hy-transit-go 运行命令说明
## 前置
1. 复制环境配置:`cp .env.example .env`,填写 `XK_API_TOKEN``HY_*``FORWARD_BASE_URL``MYSQL_DSN`。云端 `HY_TRANSIT_API_TOKEN` 须与 `XK_API_TOKEN` 一致;默认开启 `/api/hy/*` 响应 `result` 传输加密(`HY_TRANSIT_PAYLOAD_ENCRYPT`Go 客户端自动解密。
2. 本机 MySQL 已执行 [`sql/hy_transit_schema.sql`](../../sql/hy_transit_schema.sql)。若库已存在且 Web 需展示**推送明文**,另执行 [`sql/hy_push_log_plain_migration.sql`](../../sql/hy_push_log_plain_migration.sql)。
3. 内网已启动 **xk-hy-forward-go**`forward.exe``go run .`)。
4. 云端已部署 `xk_hy_transit_cloud.sql``routes/hy.php`
---
## 运营推荐:直接运行(交互菜单)
无参数启动程序,按中文提示选择,无需记忆子命令:
```bat
transit.exe
```
或开发环境:
```bash
go run ./cmd/transit
```
菜单示例:
```
======== 互联网医院监管中转 ========
1) 单次执行(跑一轮后退出)
2) 定时执行(常驻,按 .env 中 CRON 每天跑)
3) 查看日志Web 控制台,不跑定时)
0) 退出
10s 内未选择将自动启动「2) 定时执行(常驻)」
请选择 [0-3]:
```
- **10 秒无输入**:自动选择 **2** 并进入确认步骤;确认步骤同样 **10 秒无输入** 则自动启动常驻(适合双击 `transit.exe` 无人值守)。超时秒数可用环境变量 `MENU_AUTO_SERVE_TIMEOUT_SEC`(正整数,默认 10调整。
-**1**:再输入 `step`(默认 all`date`(回车=按 ANCHOR_OFFSET_DAYS 推算,默认昨日);该路径仍须手动输入,无自动超时。
-**2**:显示当前 cron 配置,确认后进程常驻,到点自动 `step=all`,并启动 Web 控制台(默认 `http://127.0.0.1:8765/`)。
-**3**:仅启动 Web可浏览文件日志与本机同步流水测试同步需选 2 用 serve
-**0**:退出。
### Web 控制台serve 自动启动)
| 页面 | 路径 | 说明 |
|------|------|------|
| 首页 | `/` | 导航 |
| 文件日志 | `/logs` | app / pull / push |
| 同步流水 | `/runs` | 三表关联 + JSON 详情;可一键清空本机三表 |
| 测试执行 | `/test` | POST 触发一次 sync |
API`POST /api/runs/truncate` — 清空本机 `hy_push_log` / `hy_push_record` / `hy_sync_job`(需 MySQL 已连接sync 运行中返回 409。仅影响本机 `xk_hy_transit` 审计库。
环境变量:`LOG_WEB_ADDR`(默认 `127.0.0.1:8765`)、`LOG_WEB_ALLOW_TEST`(默认 `true`。Cron 与 Web 测试共用互斥锁,不会并行执行两次 sync截断与 sync 亦互斥。
---
## 单次执行(跑完即退出)
适用于补跑某天数据、联调、Windows 计划任务每日调一次。
| 场景 | 命令 |
|------|------|
| 全量四步(推荐) | `go run ./cmd/transit sync --step=all` |
| 指定锚定日 | `go run ./cmd/transit sync --step=all --date=2026-05-18` |
| 只跑咨询 | `go run ./cmd/transit sync --step=consult` |
| 只跑处方 | `go run ./cmd/transit sync --step=recipe` |
| 编译后 exe | `transit.exe sync --step=all` |
| 兼容旧写法 | `go run ./cmd/transit --step=all --date=2026-05-18` |
`--step` 可选:`consult` | `referral` | `recipe` | `verification` | `all`
未传 `--date` 时,锚定日 = 今天减去 `.env``ANCHOR_OFFSET_DAYS`(默认 1即昨日
### Windows 计划任务(每日单次,不常驻)
```bat
schtasks /Create /TN "HyTransitSync" /TR "D:\path\to\transit.exe sync --step=all" /SC DAILY /ST 22:00
```
---
## 定时任务执行(进程常驻)
适用于:外网机 7×24 保活,由内置 Cron 到点执行。
| 场景 | 命令 / 配置 |
|------|-------------|
| 默认每天 22:00 | `go run ./cmd/transit serve``transit.exe serve` |
| 自定义 cron | `.env` 设置 `CRON_EXPR=0 30 22 * * *`(分 时 日 月 周) |
| 简写时间 | `SCHEDULE_TIME=22:30`(仅当未设置 `CRON_EXPR` 时生效) |
说明:`serve` 启动后阻塞不退出;到点执行 `step=all` + 默认锚定日。修改 cron 需重启进程。
优先级:`CRON_EXPR` 环境变量存在 > `SCHEDULE_TIME` > 默认 `0 22 * * *`
---
## 与 xk-hy-forward-go 配合(双通道)
外网 **transit-go** 只访问内网 **forward-go**,由 forward 转发至政务云 `59.202.52.129`
| 通道 | transit 请求路径 | forward 转发目标 |
|------|------------------|------------------|
| 监管业务 JSON | `POST {FORWARD_BASE_URL}/province/supervise/data` | `28212` `/province/supervise/data` |
| 处方 PDF 上传 | `POST {FORWARD_BASE_URL}/mng/file/auth/upload` | `28211` `/mng/file/auth/upload` |
内网机先启动转发服务:
```bash
cd xk-hy-forward-go
go run .
```
`forward.exe`。详见 [forward-go README](../xk-hy-forward-go/README.md)。
`.env` 建议:
```env
FORWARD_BASE_URL=http://192.168.1.10:8080
FILE_UPLOAD_VIA_FORWARD=true
```
`FILE_UPLOAD_VIA_FORWARD=true`(默认)时 PDF **不直连**政务云,避免外网机访问 `59.202.52.129:28211` 失败。
---
## 处方 PDF 本地落盘
生成处方 PDF 并上传监管前,会同步写入本地文件(失败仅告警,不阻断上传):
```text
{程序目录}/pdf/{YYYY-MM-DD}/{患者姓名}{诊所名} {处方号} {YYYY-MM-DD HH-mm-ss}.pdf
```
| 场景 | 程序目录 |
|------|----------|
| 打包运行 `transit.exe` | exe 所在目录 |
| 开发 `go run ./cmd/transit` | 当前工作目录(建议在 `xk-hy-transit-go` 下执行) |
| 配置 | 说明 |
|------|------|
| `CHROME_PATH` | 可选Chrome/Edge 路径;未设则自动探测 |
| xk-api | 打印 HTML 由 `GET /api/hy/transit/prescription/detail` 生成(与 PC 处方详情版式一致) |
示例:`D:\deploy\pdf\2026-05-19\张三萧康中医馆 ZY8181791680594661 2026-05-19 14-30-05.pdf`exe 同级 `pdf` 目录)
流程:**拉取 HTML → chromedp 转 PDF → 落盘 `pdf/` → 上传监管**。
### 单独测 PDF不走上报
```bash
go run ./cmd/transit pdf-test --prescription-id=12345
# 或本地 HTML
go run ./cmd/transit pdf-test --html-file=./test.html --patient=张三 --store=测试诊所 --prescription-no=ZY123
```
成功时应看到 `saved local pdf: ...\pdf\2026-05-19\...pdf`
### 单独测监管文件上传
需 xk-api 配置 `HY_APP_KEY``HY_APP_SECRET``HY_FILE_BUCKET`transit 按 FileAuth 算法本地生成 `uploadToken`,每次上传前自动刷新)。算法说明见 [`docs/FILEAUTH.md`](FILEAUTH.md)。
```bash
go run ./cmd/transit upload-test --pdf=./test.pdf
```
成功输出 `upload ok fileId=...`
---
## 应用日志
默认写入项目内 `{程序目录}/log/transit/`(可用 `LOG_DIR` 覆盖根路径,实际为 `{LOG_DIR}/transit/`
```text
xk-hy-transit-go\log\transit\
pull-YYYY-MM-DD.log # 批次、拉取、校验跳过
push-YYYY-MM-DD.log # 每条上报、PDF 上传、code/msgCode
app-YYYY-MM-DD.log # 启动、cron、同步摘要
```
每次 `sync` / 定时 cron 执行会在三个日文件中写入 `======== BEGIN ... ========``======== END ... ========` 分隔行。
与 MySQL `hy_push_log` 互补。**控制台**仅输出开始、结束、失败摘要(`[同步]` / `[定时]`);详情见上述日志文件。
定时常驻启动时会打印 `日志目录=...`,请以此路径为准,勿与空的 `xk-hy-transit-go\log\` 下未使用目录混淆。
内网 forward 日志仍在同级 `log/forward/`forward-go 进程)。
监管业务上报成功条件Ver2.0
-`body.msgCode`(或 `body.body.msgCode`HTTP 200 且 JSON `code=200``msgCode=200`
- **无** `msgCode` 字段HTTP 200 且 JSON `code=200` 即可
---
## 排错
| 现象 | 处理 |
|------|------|
| `chromedp: context canceled` | 已修复:勿在浏览器初始化后立即 cancel allocator请拉最新代码后重试 |
| `缺少环境变量 XK_API_TOKEN` | 检查 `.env` 与云端 `HY_TRANSIT_API_TOKEN` 一致 |
| `batch_id required` | 云端拉取接口需先 `batch/create`;请用新版 sync 流程 |
| `pull consult http 401` | Token 错误或过期 |
| 转发超时 | 检查 forward-go 是否启动、`ALLOW_IPS` 是否拦了中转机 IP |
| 交互菜单不出现 | 非 TTY 环境CI/重定向)会只打印用法;请用 `sync`/`serve` 子命令 |
| PDF 未生成 / chromedp 报错 | 安装 Chrome 或设置 `CHROME_PATH`;首次需 `go mod tidy` 拉取 chromedp 依赖 |
| 样式与 PC 不一致 | 对比 `GET /api/hy/transit/prescription/detail``recipe_file_html` 与后台处方打印预览 |
| `upload token empty` / `appKey/appSecret/fileBucket 未配置` | xk-api 或 transit `.env` 配置 `HY_APP_KEY` / `HY_APP_SECRET` / `HY_FILE_BUCKET``/config` 点「重新拉取」 |
| PDF 上传连接超时 | 确认 `FILE_UPLOAD_VIA_FORWARD=true` 且 forward 已监听 `/mng/file/auth/upload`;检查 forward `.env``FILE_TARGET_URL` |
| 推送显示 success 但监管未入库 | 若响应含 `msgCode` 须为 200`msgCode` 时看 `code` 与 HTTP |
| 文件上传 HTTP 403 body=`forbidden` | **forward-go 本地拒绝**:检查 `ALLOW_IPS``FORWARD_SHARED_SECRET` 与 transit `X-Forward-Token` |
| 文件上传 HTTP 403 含 JSON `message` | **政务云拒绝 token**:核对 `HY_FILE_BUCKET` scope、密钥`/config` 重新拉取Web `/upload` 查看完整 `detail` |
| xk-api 改了 HY_APP_* 但 transit 仍是旧值 | transit `serve` 长进程需 Web「重新拉取」或重启云端凭证优先于本地 `.env`uploadToken 每次上传前自动重生 |
### Web 控制台页面(`transit serve`
| 路径 | 说明 |
|------|------|
| `/config` | 查看云端 / 本地 / 生效互医配置;对比云端预生成 token 与 Runner 本地 FileAuth token |
| `/upload` | 测试 PDF 上传(含 `httpStatus`/`rawBody` 政务云文件服务响应) |
| `/supervise-step` | 处方/核销单步联调(含 `push.response_body` 业务上报响应) |
| `/runs` | 同步流水;失败记录可「整条重试」 |
改 xk-api `.env` 后:`php artisan config:clear` + 重启 PHP/Laravel-S再在 transit `/config` 点重新拉取。
---
## 子命令速查
```text
transit # 无参数 → 交互菜单(运营)
transit sync ... # 单次同步
transit serve # 定时常驻
transit upload-test --pdf=... # 单独测文件上传
transit --step=all # 兼容旧单次参数
```
接口说明见云端 [hy-transit-api.md](../../xk-api/docs/hy-transit-api.md)(路径以实际部署为准)。