2026-09-21 17:04:40 +08:00
2026-08-04 16:45:59 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-08-25 13:39:09 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-09-21 17:04:40 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-09-15 13:44:07 +08:00
2026-07-27 11:28:33 +08:00
2026-07-30 17:31:20 +08:00
2026-09-15 13:44:07 +08:00
2026-08-25 17:03:56 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-09-15 13:44:07 +08:00
2026-07-27 11:28:33 +08:00
2026-09-15 13:44:07 +08:00
2026-09-15 13:44:07 +08:00
2026-09-15 13:44:07 +08:00
2026-07-27 11:28:33 +08:00
2026-07-27 11:28:33 +08:00
2026-09-21 17:04:40 +08:00
2026-07-27 11:28:33 +08:00

腾讯 IM 图片本地归档

腾讯 IM 的图片消息在 /IMCallBack 入库后,会异步下载 TIMImageElem 中的 Type=1 原图并保存到服务器私有目录。归档状态保存在 Internet-hospital.im-chat-msg.imageArchive。

可选环境变量:

# 建议在生产环境显式配置为代码目录之外、具备持久化和备份的绝对路径
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 部署时必须挂载持久化卷。

服务启动时会主动创建并检查该目录是否可读写。启动日志中应出现:

腾讯 IM 图片归档目录已就绪,/opt/apps/private-files/im-chat

如果日志中出现 EACCES,需要给实际运行 Node/PM2 的 Linux 用户授予该目录的 读写权限。

归档成功后可通过下面的接口读取图片:

GET /im-chat/image/:msgId

当前接口按需求暂未启用 JWT,但仅允许通过 MsgId 查询数据库中归档成功的受控路径。 生产使用前建议补充问诊订单权限验证。

处方 PDF

处方笺下载接口为 GET /hlw/prescriptions/:id/pdf;默认输出 A5,传 paperSize=A4 可输出 A4。

服务运行环境需要预装 Chromium/Chrome,并配置其可执行文件路径:

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。

Description
海宁服务端代码
Readme 1.9 MiB
Languages
JavaScript 98.6%
TypeScript 1.3%
Java 0.1%