318 lines
9.2 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.

# Hospital Adapter Service
医院接口中转平台。第一版输出标准数据字段,不输出 YKT 字段。
## 技术栈
- Node.js
- Express
- CommonJS
- dotenv
- MongoDB
- esbuild
## 运行
```bash
cd hospital-adapter-service
npm install
npm run dev
```
未配置 `CONFIG_NODE_PORT` 时默认端口是 `8082`;当前 gateway 和邹平子程序 bundle 都配置为 `18082`
测试 gateway 本地启动:
```cmd
npm run gateway
```
邹平子程序本地启动。默认按 `standalone` 模式启动,内部监听 `18082`gateway 通过前置机/Nginx 暴露的地址访问,例如 `http://120.224.145.13:8082`:
```cmd
npm run zp
```
前置机轻量部署可以不安装 Mongo只安装 Node.js 和 PM2。Mongo 默认关闭,查询接口仍可直接访问医院视图。
## 运行角色
- `standalone`: 单机调试/院内直接部署,标准资源接口和 YKT 兼容接口都由本机查询 HIS。
- `gateway`: 中心网关,给 `ytk-customer-service` 调用,并按医院配置选择 `local``direct``edge` 路由。
- `edge`: 院内 Agent主动连接中心网关只负责访问院内 HIS适合医院不开放入站端口的场景。
关键配置:
```text
CONFIG_ADAPTER_ROLE=standalone|gateway|edge
CONFIG_GATEWAY_URL=http://中心网关地址
CONFIG_EDGE_ID=zpfb-edge-1
CONFIG_EDGE_HOSPITAL_CODE=zpfb
CONFIG_HOSPITAL_ADAPTER_CORP_MAP={"corpId":"zpfb"}
CONFIG_HOSPITAL_ADAPTER_ROUTE_MODE_MAP={"zpfb":"direct"}
CONFIG_HOSPITAL_ADAPTER_DIRECT_URL_MAP={"zpfb":"http://120.224.145.13:8082"}
```
## Windows 前置机部署
本机生成单文件 bundle。建议一个医院一个 env 文件,例如 `.env.zpfb``.env.gateway`:
```cmd
cd /d C:\code\yk\ykt\hospital-adapter-service
npm install
npm run build:zp
```
构建输出:
```text
dist\bundle.zpfb.js
```
构建时会把指定 env 文件的变量直接写进 bundle。部署到前置机时只需要复制对应 bundle不需要复制源码目录、`node_modules``.env` 或启动脚本。
如果希望输出文件固定叫 `bundle.js`:
```cmd
npm run build -- --env zpfb --out dist\bundle.js
```
```cmd
node bundle.js
```
PM2 启动示例:
```cmd
pm2 start bundle.js --name hospital-adapter-service
```
邹平子程序 bundle 也是同一个构建命令,只是每家医院用自己的 env 文件。比如 `.env.zpfb`:
```bash
CONFIG_NODE_PORT=18082
CONFIG_ADAPTER_ROLE=standalone
CONFIG_MONGO_ENABLED=false
```
然后重新构建:
```cmd
npm run build:zp
```
把生成的 `dist\bundle.zpfb.js` 复制到前置机后启动,可以复制时改名为 `bundle.js`:
```cmd
pm2 start bundle.js --name hospital-adapter-zpfb
```
也可以不改名直接启动:
```cmd
pm2 start bundle.zpfb.js --name hospital-adapter-zpfb
```
中心 gateway 用自己的 env例如 `.env.gateway`:
```cmd
npm run build:gateway
```
构建输出:
```text
dist\bundle.gateway.js
```
当前 `.env.gateway``gateway` 模式,前端 HIS 选项会传固定 `corpId`,网关按 `corpId` 路由医院编码,再按医院编码选择调用模式。广口走本地 `gk` adapter邹平走 `direct` 访问前置机公网地址:
```bash
CONFIG_HOSPITAL_ADAPTER_CORP_MAP={"wwa54dfba0b5441ef1":"gk","wpLgjyawAAEqxCUmBMjLo8CnXdDuQoeg":"zpfb"}
CONFIG_HOSPITAL_ADAPTER_ROUTE_MODE_MAP={"gk":"local","zpfb":"direct"}
CONFIG_HOSPITAL_ADAPTER_DIRECT_URL_MAP={"zpfb":"http://120.224.145.13:8082"}
CONFIG_GK_JHIDS_PROXY_URL=https://crm.gykqyy.com/ykt/getYoucanData/gkJhids
```
如果后续要直接连接嘉和 JHIDS再使用 `gk``gk-standalone` env:
```cmd
npm run build -- --env gk-standalone --out dist\bundle.gk-standalone.js
```
也可以直接指定 env 文件路径:
```cmd
npm run build -- --env-file .env.zpfb --out dist\bundle.zpfb.js
```
## 环境变量
- `CONFIG_NODE_PORT`: 服务端口
- `CONFIG_MONGO_ENABLED`: 是否启用 Mongo默认 `false`
- `CONFIG_MONGO_OPTIONAL`: Mongo 连接失败时是否允许服务继续启动,默认 `true`
- `CONFIG_MONGO_URI`: Mongo 连接串
- `CONFIG_DB_NAME`: 平台库名,默认 `hospital_adapter`
- `CONFIG_DEFAULT_PAGE_SIZE`: 默认分页,默认 `20`
- `CONFIG_MAX_PAGE_SIZE`: 最大分页,默认 `200`
- `CONFIG_HOSPITAL_ADAPTER_TIMEOUT_MS`: 上游超时,默认 `15000`
每家医院可配置:
- `CONFIG_<HOSPITAL>_SOURCE_TYPE`: `view | http | webservice`
- `CONFIG_<HOSPITAL>_BASE_URL`: HTTP/WebService 上游地址
- `CONFIG_<HOSPITAL>_DB_TYPE`: 视图数据库类型,支持 `mssql | oracle | oracle_sqlplus`
- `CONFIG_<HOSPITAL>_DB_HOST`: 视图数据库地址
- `CONFIG_<HOSPITAL>_DB_PORT`: 视图数据库端口SQL Server 默认 `1433`
- `CONFIG_<HOSPITAL>_DB_NAME`: 视图数据库名
- `CONFIG_<HOSPITAL>_DB_USER`: 视图数据库用户名
- `CONFIG_<HOSPITAL>_DB_PASSWORD`: 视图数据库密码
- `CONFIG_<HOSPITAL>_<RESOURCE>_SOURCE_TYPE`: 单资源数据源覆盖
- `CONFIG_<HOSPITAL>_<RESOURCE>_VIEW_NAME`: 单资源视图名覆盖
- `CONFIG_<HOSPITAL>_<RESOURCE>_ENDPOINT`: 单资源接口路径覆盖
- `CONFIG_<HOSPITAL>_<RESOURCE>_ORDER_BY`: view 分页排序字段
- `CONFIG_<HOSPITAL>_<RESOURCE>_DATE_RANGE_FIELD`: `start_date/end_date` 对应的标准日期字段
广医口腔嘉和模块固定医院编码为 `gk`。gateway 路由到该模块时配置:
```bash
CONFIG_HOSPITAL_ADAPTER_CORP_MAP={"wwa54dfba0b5441ef1":"gk"}
```
测试环境前端可通过 HIS 选项传固定广口 `corpId`,网关仍按 `corpId` 路由:
```bash
CONFIG_HOSPITAL_ADAPTER_CORP_MAP={"wwa54dfba0b5441ef1":"gk"}
```
`gk` 模块使用嘉和 JHIDS 配置:
```bash
CONFIG_GK_JHIDS_PROXY_URL=
CONFIG_GK_JHIDS_DATA_QUERY_URL=
CONFIG_GK_JHIDS_TOKEN_URL=
CONFIG_GK_JHIDS_CLIENT_ID=
CONFIG_GK_JHIDS_CLIENT_SECRET=
CONFIG_GK_JHIDS_SYS_CODE=GKDW
CONFIG_GK_JHIDS_PAGE_SIZE=1000
CONFIG_GK_JHIDS_TIMEOUT_MS=15000
CONFIG_GK_JHIDS_TLS_REJECT_UNAUTHORIZED=true
```
测试环境使用现有 dev-jcpt 服务时,只需要配置 `CONFIG_GK_JHIDS_PROXY_URL`;中继平台会请求 dev-jcpt 的 `queryJhidsData` 原始能力,再执行本地 `gk` 字段映射。
兼容旧变量名 `CONFIG_JHIDS_*`,但新部署建议使用 `CONFIG_GK_JHIDS_*`
## 查询接口
以下 curl 用于 `standalone` 或院内直连调试。邹平正式接中心网关时使用 `direct` 模式:邹平子程序内部监听 `18082`,前置机/Nginx 对外暴露 `http://120.224.145.13:8082`gateway 主动访问这个对外地址。
```bash
curl -X POST "http://127.0.0.1:18082/api/zpfb/patient/query" \
-H "Content-Type: application/json" \
-d '{"id_num":"110101199001011234","page":1,"pageSize":20}'
```
YKT HIS 兼容入口:
```bash
curl -X POST "http://127.0.0.1:18082/api/ykt/customerHisSync" \
-H "Content-Type: application/json" \
-d '{"hospitalCode":"zpfb","type":"getHisCustomerArchive","idCard":"身份证号"}'
```
返回:
```json
{
"success": true,
"message": "获取成功",
"list": []
}
```
响应:
```json
{
"status": "success",
"message": "查询成功",
"data": [],
"page": 1,
"pageSize": 20,
"total": 0
}
```
## ytk-customer-service 接入
主服务保持旧 HIS 分支不变,新医院通过环境变量映射到本平台:
```bash
CONFIG_HOSPITAL_ADAPTER_GATEWAY_URL=http://127.0.0.1:18082
```
主服务收到 `customerHisSync` 后,如果未命中旧 HIS 分支,会转发到本平台的 `/api/ykt/customerHisSync`。本平台返回 YKT 兼容格式 `{ success, message, list }`
## 资源
- `patient`
- `outpatientRecord`
- `orderInfo`
- `pacsInfo`
- `lisInfo`
- `lisDetail`
## 通用 View 数据源
`view` 数据源用于快速接入医院提供的数据库视图。每家医院在 adapter 配置里声明资源启停、视图名、排序字段和字段映射;查询仍然通过 HTTP 接口进入本服务。
邹平妇保示例:
```bash
CONFIG_NODE_PORT=18082
CONFIG_ADAPTER_ROLE=standalone
CONFIG_MONGO_ENABLED=false
CONFIG_ZPFB_SOURCE_TYPE=view
CONFIG_ZPFB_DB_TYPE=oracle_sqlplus
CONFIG_ZPFB_DB_HOST=<db-host>
CONFIG_ZPFB_DB_PORT=1521
CONFIG_ZPFB_DB_NAME=<db-name>
CONFIG_ZPFB_DB_USER=<db-user>
CONFIG_ZPFB_DB_PASSWORD=<deploy-secret>
CONFIG_ZPFB_DB_ORACLE_CONNECT_MODE=service
CONFIG_ZPFB_DB_SQLPLUS_PATH=<sqlplus-path>
CONFIG_ZPFB_DB_SQLPLUS_ENCODING=gbk
```
前置机 CMD 临时启动示例仅用于未打包时排查。正常单文件部署时,相关变量应写入本机 `.env.zpfb` 后重新 `npm run build:zp`
```cmd
set CONFIG_NODE_PORT=18082
set CONFIG_ADAPTER_ROLE=standalone
set CONFIG_MONGO_ENABLED=false
node index.js
```
说明: 邹平正式接中心网关时使用 `direct`,由 gateway 主动访问 `http://120.224.145.13:8082`;前置机内部子程序仍监听 `18082`
邹平第一版默认只启用:
- `patient` -> `v_youcan_patient`
- `outpatientRecord` -> `v_youcan_outpatient_record`
如果医院视图字段不是标准字段,在对应 adapter 的 `fieldMapping` 中配置 `标准字段 -> 视图字段`。密码只放部署环境变量,不提交到代码。
## 同步标准快照
```bash
curl -X POST "http://127.0.0.1:18082/api/his/sync" \
-H "Content-Type: application/json" \
-d '{"hospitalCode":"zpfb","resource":"patient","maxPages":1,"pageSize":200}'
```
标准快照写入平台 Mongo 的 `standard-snapshot`,不写入 YKT 的 `admin.member` 等主业务集合。
如果 `CONFIG_MONGO_ENABLED=false`,同步标准快照接口会返回 `MONGO_DISABLED`;普通查询接口不受影响。