hn-hlw-service/README.md
2026-09-24 18:22:05 +08:00

68 lines
3.4 KiB
Markdown
Raw 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.

# 腾讯 IM 图片本地归档
腾讯 IM 的图片消息在 `/IMCallBack` 入库后,会异步下载 `TIMImageElem`
中的 `Type=1` 原图并保存到服务器私有目录。归档状态保存在
`Internet-hospital.im-chat-msg.imageArchive`。
可选环境变量:
```ini
# 建议在生产环境显式配置为代码目录之外、具备持久化和备份的绝对路径
CONFIG_IM_IMAGE_ROOT=/data/hn-private-files/im-chat
# 默认 30MB
CONFIG_IM_IMAGE_MAX_BYTES=31457280
# 逗号分隔的腾讯图片域名后缀
CONFIG_IM_IMAGE_ALLOWED_HOSTS=.my-imcloud.com,.im.qcloud.com,.myqcloud.com
```
未设置 `CONFIG_IM_IMAGE_ROOT` 时,路径规则与现有 `/upload` 一致:以服务入口
目录为基准,保存到 `../private-files/im-chat`。例如:
- 源码从 `hn-hlw-service/index.js` 运行时,保存到项目组目录下的
`private-files/im-chat`,与现有 `upload-files` 同级。
- bundle 位于 `/opt/apps/hnhlw/bundle_xx.js` 时,保存到
`/opt/apps/private-files/im-chat`,与 `/opt/apps/upload-files` 同级。
`private-files` 不会通过 Express 静态目录公开。该目录不能在发布时被清理;
Docker 部署时必须挂载持久化卷。
服务启动时会主动创建并检查该目录是否可读写。启动日志中应出现:
```text
腾讯 IM 图片归档目录已就绪,/opt/apps/private-files/im-chat
```
如果日志中出现 `EACCES`,需要给实际运行 Node/PM2 的 Linux 用户授予该目录的
读写权限。
归档成功后可通过下面的接口读取图片:
```text
GET /im-chat/image/:msgId
```
当前接口按需求暂未启用 JWT,但仅允许通过 `MsgId` 查询数据库中归档成功的受控路径。
生产使用前建议补充问诊订单权限验证。
## 处方 PDF
处方笺下载接口为 `GET /hlw/prescriptions/:id/pdf`;默认输出 A5,传 `paperSize=A4` 可输出 A4。获取 PDF Base64 内容可调用 `GET /hlw/prescriptions/:id/base64`,响应中的 `data` 字段为 Base64 字符串,也支持 `paperSize=A4`。
服务运行环境需要预装 Chromium/Chrome,并配置其可执行文件路径:
```env
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
PRESCRIPTION_PDF_MAX_CONCURRENCY=2
# 推荐挂载到持久化卷;未设置时默认 ../private-files/prescriptions
CONFIG_PRESCRIPTION_PDF_ROOT=/data/hn-private-files/prescriptions
```
`PRESCRIPTION_PDF_MAX_CONCURRENCY` 默认为 2,用于限制 Chromium 同时渲染的页面数。首次访问会生成并原子写入持久化目录,之后同一处方和纸张规格直接读取已有文件。该链接当前不需要认证。医生和药师签名支持 `data:image/*;base64,...`、项目上传目录的 `/upload-files/*.png|jpg|jpeg|webp` 路径,或 HTTP(S) 图片 URL。按本地文件、网络下载、姓名文本的顺序回退;网络请求最长 5 秒、最大 1 MB。
PDF 响应使用 `Cache-Control: no-cache`,浏览器每次访问都会向服务端校验文件;已保存的 PDF 仍直接从磁盘读取,不会重复渲染。
PDF 按处方 ObjectId 的 UTC 创建日期分目录保存,例如 `/opt/apps/private-files/prescriptions/2026/09/15/{处方ID}-A5-v5.pdf`,避免大量文件堆积在同一个目录。
Linux 服务端需安装中文字体,否则 Chrome 无法渲染处方中的中文。TencentOS Server 4 可执行 `dnf install -y google-noto-sans-cjk-sc-fonts fontconfig && fc-cache -f`,模板会优先使用 `Noto Sans CJK SC`。