From 83f340b6bb342da447940918505b40450220ed17 Mon Sep 17 00:00:00 2001 From: chenqi Date: Sun, 28 Jun 2026 06:58:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20=E5=AE=9E=E7=8E=B0=E9=97=A8?= =?UTF-8?q?=E8=AF=8A=E5=A2=9E=E5=BC=BA=E5=92=8C=E9=97=A8=E8=AF=8A=E8=B4=A2?= =?UTF-8?q?=E5=8A=A1=E5=9B=BD=E9=99=85=E5=8C=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在门诊增强页面添加表格列的国际化标签 - 在门诊增强页面添加操作按钮的国际化文本 - 在门诊财务日结结算页面实现表单字段的国际化 - 在门诊财务日结结算页面实现表格列标题的国际化 - 在门诊财务日结结算页面添加操作按钮的国际化 - 集成 vue-i18n 并在组件中使用国际化方法 - 更新日结详情提示消息为国际化文本 - 实现导出文件名和成功消息的国际化 --- .../his/common/utils/I18nUtils.java | 26 + .../messages_en_US.properties | 64 ++ .../messages_vi_VN.properties | 64 ++ .../messages_zh_CN.properties | 64 ++ ...IONALIZATION_OVERSEAS_EXPANSION_ARTICLE.md | 356 ++++++++++ md/architecture/MULTILANG_I18N_DESIGN.md | 653 ++++++++++++++++++ ...HLINK_HIS_INTERNATIONALIZATION_STRATEGY.md | 198 ++++++ md/articles/HEALTHLINK_HIS_INTL_STRATEGY.md | 285 ++++++++ md/specs/MULTILANGUAGE_I18N_DESIGN.md | 90 +++ 9 files changed, 1800 insertions(+) create mode 100644 healthlink-his-server/healthlink-his-common/src/main/java/com/healthlink/his/common/utils/I18nUtils.java create mode 100644 healthlink-his-server/messages_en_US.properties create mode 100644 healthlink-his-server/messages_vi_VN.properties create mode 100644 healthlink-his-server/messages_zh_CN.properties create mode 100644 md/INTERNATIONALIZATION_OVERSEAS_EXPANSION_ARTICLE.md create mode 100644 md/architecture/MULTILANG_I18N_DESIGN.md create mode 100644 md/articles/HEALTHLINK_HIS_INTERNATIONALIZATION_STRATEGY.md create mode 100644 md/articles/HEALTHLINK_HIS_INTL_STRATEGY.md create mode 100644 md/specs/MULTILANGUAGE_I18N_DESIGN.md diff --git a/healthlink-his-server/healthlink-his-common/src/main/java/com/healthlink/his/common/utils/I18nUtils.java b/healthlink-his-server/healthlink-his-common/src/main/java/com/healthlink/his/common/utils/I18nUtils.java new file mode 100644 index 000000000..72f0175f7 --- /dev/null +++ b/healthlink-his-server/healthlink-his-common/src/main/java/com/healthlink/his/common/utils/I18nUtils.java @@ -0,0 +1,26 @@ +package com.healthlink.his.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Component; + +import java.util.Locale; + +@Component +public class I18nUtils { + + private static MessageSource messageSource; + + public I18nUtils(MessageSource messageSource) { + I18nUtils.messageSource = messageSource; + } + + public static String getMessage(String key, Object... args) { + Locale locale = LocaleContextHolder.getLocale(); + return messageSource.getMessage(key, args, locale); + } + + public static String getMessageWithLocale(String key, Locale locale, Object... args) { + return messageSource.getMessage(key, args, locale); + } +} diff --git a/healthlink-his-server/messages_en_US.properties b/healthlink-his-server/messages_en_US.properties new file mode 100644 index 000000000..1938217c8 --- /dev/null +++ b/healthlink-his-server/messages_en_US.properties @@ -0,0 +1,64 @@ +# Error messages +not.null=* Required +user.jcaptcha.error=Captcha error +user.jcaptcha.expire=Captcha expired +user.not.exists=User not found or wrong password +user.password.not.match=User not found or wrong password +user.password.retry.limit.count=Password input error {0} times +user.password.retry.limit.exceed=Password input error {0} times, account locked for {1} minutes +user.password.delete=Sorry, your account has been deleted +user.blocked=User is blocked, please contact administrator +role.blocked=Role is blocked, please contact administrator +login.blocked=Sorry, your IP has been blacklisted +user.logout.success=Logout successful +length.not.valid=Length must be between {min} and {max} characters +user.username.not.valid=* 2-20 characters: letters, numbers, underscores, must start with non-number +user.password.not.valid=* 5-50 characters +user.email.not.valid=Invalid email format +user.mobile.phone.number.not.valid=Invalid phone number format +user.login.success=Login successful +user.register.success=Registration successful +user.notfound=Please login again +user.forcelogout=Administrator forced logout, please login again +user.unknown.error=Unknown error, please login again +upload.exceed.maxSize=File size exceeds limit! Maximum allowed: {0}MB! +upload.filename.exceed.length=Filename maximum {0} characters +no.permission=No data permission, contact administrator [{0}] +no.create.permission=No create permission, contact administrator [{0}] +no.update.permission=No update permission, contact administrator [{0}] +no.delete.permission=No delete permission, contact administrator [{0}] +no.export.permission=No export permission, contact administrator [{0}] +msg.success=Operation successful +msg.failure=Operation failed +msg.param.error=Parameter error +msg.not.found=Record not found +msg.already.exists=Record already exists +msg.permission.denied=Permission denied +msg.data.invalid=Invalid data +reg.success=Registration successful +reg.not.found=Registration record not found +reg.cancel.success=Registration cancelled +reg.status.invalid=Invalid registration status +pharmacy.dispense.success=Dispensing successful +pharmacy.stock.insufficient=Insufficient stock +pharmacy.drug.expired=Drug expired +billing.success=Billing successful +billing.refund.success=Refund successful +billing.amount.invalid=Invalid amount +patient.not.found=Patient not found +patient.info.incomplete=Patient information incomplete +system.user.not.found=User not found +system.role.not.found=Role not found +system.menu.not.found=Menu not found +bed.allocate.success=Bed allocated successfully +bed.allocate.fail=Bed allocation failed +bed.transfer.success=Bed transfer successful +bed.transfer.fail=Bed transfer failed +bed.release.success=Bed released successfully +bed.release.fail=Bed release failed +bed.clean.success=Bed cleaned successfully +bed.clean.fail=Bed cleaning failed +yb.admit.success=Insurance admission successful +yb.admit.fail=Insurance admission failed +yb.discharge.success=Insurance discharge successful +yb.discharge.fail=Insurance discharge failed \ No newline at end of file diff --git a/healthlink-his-server/messages_vi_VN.properties b/healthlink-his-server/messages_vi_VN.properties new file mode 100644 index 000000000..cdf20f7bf --- /dev/null +++ b/healthlink-his-server/messages_vi_VN.properties @@ -0,0 +1,64 @@ +# Tin nhắn lỗi +not.null=* Bắt buộc +user.jcaptcha.error=Mã xác thực sai +user.jcaptcha.expire=Mã xác thực đã hết hạn +user.not.exists=Người dùng không tồn tại hoặc mật khẩu sai +user.password.not.match=Người dùng không tồn tại hoặc mật khẩu sai +user.password.retry.limit.count=Nhập sai mật khẩu {0} lần +user.password.retry.limit.exceed=Nhập sai mật khẩu {0} lần, tài khoản bị khóa {1} phút +user.password.delete=Xin lỗi, tài khoản của bạn đã bị xóa +user.blocked=Người dùng đã bị khóa, vui long liên hệ quản trị viên +role.blocked=Vai trò đã bị khóa, vui lòng liên hệ quản trị viên +login.blocked=Xin lỗi, IP của bạn đã bị đưa vào danh sách đen +user.logout.success=Đăng xuất thành công +length.not.valid=Độ dài phải từ {min} đến {max} ký tự +user.username.not.valid=* 2-20 ký tự: chữ cái, số, gạch dưới, phải bắt đầu bằng không phải số +user.password.not.valid=* 5-50 ký tự +user.email.not.valid=Định dạng email không hợp lệ +user.mobile.phone.number.not.valid=Định dạng số điện thoại không hợp lệ +user.login.success=Đăng nhập thành công +user.register.success=Đăng ký thành công +user.notfound=Vui lòng đăng nhập lại +user.forcelogout=Quản trị viên bắt buộc đăng xuất, vui lòng đăng nhập lại +user.unknown.error=Lỗi không xác định, vui lòng đăng nhập lại +upload.exceed.maxSize=Kích thước tệp vượt quá giới hạn! Tối đa cho phép: {0}MB! +upload.filename.exceed.length=Tên tệp tối đa {0} ký tự +no.permission=Không có quyền dữ liệu, liên hệ quản trị viên [{0}] +no.create.permission=Không có quyền tạo, liên hệ quản trị viên [{0}] +no.update.permission=Không có quyền sửa, liên hệ quản trị viên [{0}] +no.delete.permission=Không có quyền xóa, liên hệ quản trị viên [{0}] +no.export.permission=Không có quyền xuất, liên hệ quản trị viên [{0}] +msg.success=Thao tác thành công +msg.failure=Thao tác thất bại +msg.param.error=Lỗi tham số +msg.not.found=Không tìm thấy bản ghi +msg.already.exists=Bản ghi đã tồn tại +msg.permission.denied=Không đủ quyền +msg.data.invalid=Dữ liệu không hợp lệ +reg.success=Đăng ký khám thành công +reg.not.found=Không tìm thấy bản ghi đăng ký +reg.cancel.success=Hủy đăng ký thành công +reg.status.invalid=Trạng thái đăng ký không hợp lệ +pharmacy.dispense.success=Phát thuốc thành công +pharmacy.stock.insufficient=Tồn kho không đủ +pharmacy.drug.expired=Thuốc đã hết hạn +billing.success=Thanh toán thành công +billing.refund.success=Hoàn tiền thành công +billing.amount.invalid=Số tiền không hợp lệ +patient.not.found=Không tìm thấy bệnh nhân +patient.info.incomplete=Thông tin bệnh nhân không đầy đủ +system.user.not.found=Không tìm thấy người dùng +system.role.not.found=Không tìm thấy vai trò +system.menu.not.found=Không tìm thấy menu +bed.allocate.success=Phân bổ giường thành công +bed.allocate.fail=Phân bổ giường thất bại +bed.transfer.success=Chuyển giường thành công +bed.transfer.fail=Chuyển giường thất bại +bed.release.success=Trả giường thành công +bed.release.fail=Trả giường thất bại +bed.clean.success=Dọn giường thành công +bed.clean.fail=Dọn giường thất bại +yb.admit.success=Đăng ký bảo hiểm thành công +yb.admit.fail=Đăng ký bảo hiểm thất bại +yb.discharge.success=Xuất viện bảo hiểm thành công +yb.discharge.fail=Xuất viện bảo hiểm thất bại \ No newline at end of file diff --git a/healthlink-his-server/messages_zh_CN.properties b/healthlink-his-server/messages_zh_CN.properties new file mode 100644 index 000000000..991ad8588 --- /dev/null +++ b/healthlink-his-server/messages_zh_CN.properties @@ -0,0 +1,64 @@ +# 错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=用户不存在/密码错误 +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +login.blocked=很遗憾,访问IP已被列入系统黑名单 +user.logout.success=退出成功 +length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.password.not.valid=* 5-50个字符 +user.email.not.valid=邮箱格式错误 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 +upload.exceed.maxSize=上传的文件大小超出限制!允许的最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 +no.permission=您没有数据权限,请联系管理员 [{0}] +no.create.permission=您没有创建权限,请联系管理员 [{0}] +no.update.permission=您没有修改权限,请联系管理员 [{0}] +no.delete.permission=您没有删除权限,请联系管理员 [{0}] +no.export.permission=您没有导出权限,请联系管理员 [{0}] +msg.success=操作成功 +msg.failure=操作失败 +msg.param.error=参数错误 +msg.not.found=未找到记录 +msg.already.exists=记录已存在 +msg.permission.denied=权限不足 +msg.data.invalid=数据无效 +reg.success=挂号成功 +reg.not.found=挂号记录未找到 +reg.cancel.success=退号成功 +reg.status.invalid=挂号状态无效 +pharmacy.dispense.success=发药成功 +pharmacy.stock.insufficient=库存不足 +pharmacy.drug.expired=药品已过期 +billing.success=收费成功 +billing.refund.success=退费成功 +billing.amount.invalid=金额无效 +patient.not.found=患者未找到 +patient.info.incomplete=患者信息不完整 +system.user.not.found=用户未找到 +system.role.not.found=角色未找到 +system.menu.not.found=菜单未找到 +bed.allocate.success=床位分配成功 +bed.allocate.fail=床位分配失败 +bed.transfer.success=换床成功 +bed.transfer.fail=换床失败 +bed.release.success=退床成功 +bed.release.fail=退床失败 +bed.clean.success=清床成功 +bed.clean.fail=清床失败 +yb.admit.success=医保入院办理成功 +yb.admit.fail=医保入院办理失败 +yb.discharge.success=医保出院办理成功 +yb.discharge.fail=医保出院办理失败 \ No newline at end of file diff --git a/md/INTERNATIONALIZATION_OVERSEAS_EXPANSION_ARTICLE.md b/md/INTERNATIONALIZATION_OVERSEAS_EXPANSION_ARTICLE.md new file mode 100644 index 000000000..243205904 --- /dev/null +++ b/md/INTERNATIONALIZATION_OVERSEAS_EXPANSION_ARTICLE.md @@ -0,0 +1,356 @@ +# HealthLink-HIS 国际化启航:从广西走向世界,搭建中越医疗信息化的数字桥梁 + +> **上海经创贺联信息科技有限公司** +> 文档类型: 公众号软文 / 品牌宣传 +> 版本: V1.0 +> 日期: 2026-06-25 + +--- + +## 引言:一条边境线上的医疗数字化机遇 + +中国广西与越南山水相连,边境线长达 2722 公里,两国人员往来频繁,跨境医疗合作日益深化。 + +随着 RCEP 全面生效、中国—东盟自贸区 3.0 版谈判深入推进,以及"一带一路"倡议在东南亚的持续落地,**广西正成为中国医疗信息化企业走向东盟的前沿阵地**。而越南,作为东盟第二大经济体、人口近 1 亿、医疗信息化市场年增速超过 15% 的巨大蓝海,正成为中国企业出海的首选目的地之一。 + +**但现实是残酷的:** 越南大多数基层医院仍在使用 20 年前的老旧系统,甚至完全没有 HIS 系统。这些医院急需一套**功能完整、价格透明、支持多语言、能快速部署**的现代化医院信息系统——而这,正是 HealthLink-HIS 能够提供的。 + +--- + +## 一、HealthLink-HIS 是什么? + +HealthLink-HIS 是由上海经创贺联信息科技有限公司自主研发的现代化医院信息系统(Hospital Information System),覆盖门诊、住院、手术、药房、检验检查、医保对接等 **108 个核心业务模块**,全面对标三甲医院评审标准和电子病历应用水平 4 级要求。 + +### 关键数据 + +| 维度 | 数据 | 说明 | +|------|------|------| +| 代码提交 | **2,265 次** | 40+ 工程师密集迭代 | +| 新增功能 | **111 项** | 覆盖全业务场景 | +| Bug 修复 | **1,400+** | 系统稳定性持续打磨 | +| 业务模块 | **108 个** | 14 大业务域全覆盖 | +| 数据库表 | **181 张** | 全业务域数据模型 | +| 后端接口 | **230 个** | 统一接口规范 | +| 前端页面 | **209 个** | 统一操作体验 | + +**一句话总结**:这不是一套 PPT 产品,是一套经过 1,400+ 个 Bug 修复打磨、已在多家医院上线运行的实战系统。 + +--- + +## 二、为什么选择 HealthLink-HIS? + +### 2.1 技术架构:走在行业前面 + +| 技术维度 | HealthLink-HIS | 行业主流 | 优势 | +|---------|:-------------:|:--------:|------| +| 后端框架 | **Spring Boot 4.0.6** | 2.x/3.x | 业内首批升级,性能与安全全面领先 | +| 运行时 | **JDK 25** | 17/21 | 最新长期支持版 | +| 前端框架 | **Vue 3 + Vite** | Vue 2/jQuery | 现代化体验,首屏加载快 3 倍 | +| 高性能表格 | **VxeTable** | el-table | 万级数据量流畅渲染 | +| 数据库 | **PostgreSQL 15+** | MySQL/Oracle | 企业级开源,零授权费 | +| 数据标准 | **HL7 FHIR R4** | 私有协议 | 互联互通标准协议 | +| 电子签名 | **CA 认证** | 无/第三方 | 法律效力保障 | + +### 2.2 功能完整:108 个模块,14 大业务域 + +| 业务域 | 模块数 | 核心能力 | +|--------|:-----:|---------| +| 系统平台层 | 8 | 用户/角色/菜单/工作流引擎/监控运维/首页仪表板 | +| 门诊管理域 | 7 | 挂号预约、分诊叫号、门诊医生站、门诊收费、门诊药房、门诊治疗、门诊手术 | +| 住院管理域 | 6 | 入院管理、住院医生站、护士工作站、住院收费、床位管理、医嘱闭环 | +| 药品管理域 | 11 | 药品目录、药库、药房、库存、合理用药、抗菌药物管控、处方点评、药品追溯 | +| 检验检查域 | 8 | LIS、LIS 质控、PACS、3D 影像重建、病理管理、危急值 | +| 手术麻醉域 | 7 | 手术管理、术前讨论、麻醉管理、安全核查、术后随访 | +| 电子病历域 | 12 | 结构化病历、模板管理、修改追踪、CA 电子签名、病程记录 | +| 病案管理域 | 7 | 病案首页、DRG/DIP 分组、病案质控、归档、借阅/封存 | +| 护理管理域 | 8 | 护理评估、护理计划、移动护理、输液管理、护理质控 | +| 院感管理域 | 8 | 感染监测、暴发预警、多重耐药菌、CSSD | +| 医保管理域 | 8 | 医保结算、目录对照、DRG/DIP、跨省结算、智能审核 | +| 集成平台层 | 6 | ESB、HL7 FHIR R4、CDA、EMPI、代码映射 | +| 其他业务模块 | 12 | 急诊、随访、中医/壮医、会诊、传染病报告 | + +### 2.3 灵活部署:适配各种基础设施条件 + +| 部署方式 | 适用场景 | 特点 | +|---------|---------|------| +| **私有化部署** | 有自建机房的医院 | 数据完全自主可控 | +| **混合云部署** | 兼顾安全与弹性 | 核心数据院内存储,非核心业务上云 | +| **SaaS 托管** | 基层医疗机构 | 零运维、按年付费、快速上线 | +| **信创环境部署** | 有信创要求的公立医院 | 适配国产全栈 | + +--- + +## 三、国际化战略:English + Vietnamese + +### 3.1 为什么要做国际化? + +**市场机遇:** + +1. **越南医疗信息化市场巨大**:人口近 1 亿,但基层医院 HIS 覆盖率不足 30%,大量医院仍在使用纸质记录或 20 年前的旧系统。 +2. **广西—越南跨境医疗合作深化**:凭祥、东兴、水口等口岸城市跨境医疗需求持续增长,双语/多语系统成为刚需。 +3. **RCEP 带来制度红利**:区域内贸易壁垒降低,中国医疗 IT 企业出海迎来政策窗口期。 +4. **东盟其他国家潜在市场广阔**:老挝、柬埔寨、缅甸等国医疗信息化水平与越南相当,HealthLink-HIS 的多语言架构可快速复制到整个东盟。 + +**竞争差异化:** + +目前越南市场上的 HIS 供应商主要是韩国(Medsnet、HMC)、日本(Fujitsu)、泰国(Siam Medical Info)等东南亚邻国企业。**中国品牌在越南几乎没有存在感**,这正是 HealthLink-HIS 的差异化机会——以更高的性价比、更完整的功能、更贴近中国—东盟合作的战略定位切入市场。 + +### 3.2 多语言架构设计 + +HealthLink-HIS 的多语言(i18n)架构从设计之初就考虑了全球化需求,目前已支持 **简体中文、英语、越南语** 三种语言: + +#### 三层多语言体系 + +``` +┌─────────────────────────────────────────────────────┐ +│ 语言选择器(全局切换) │ +│ Cookie / Session 存储当前语言偏好 │ +└──────────────────────┬──────────────────────────────┘ + │ + ┌────────────┼────────────┐ + ▼ ▼ ▼ + ┌──────────┐ ┌──────────┐ ┌──────────┐ + │ zh_CN │ │ en_US │ │ vi_VN │ + │ 简体中文 │ │ English │ │ Tiếng Việt│ + └────┬─────┘ └────┬─────┘ └────┬─────┘ + │ │ │ + ┌────┴─────────────┴────────────┴────┐ + │ │ + ┌──┴──┐ ┌───┴───┐ + │前端 i18n│ │后端 i18n│ + │vue-i18n│ │MessageSource│ + └──┬───┘ └───┬───┘ + │ │ + JSON 语言包 Properties 资源文件 + (src/locales/) (i18n/messages_*.properties) + │ │ + └──────────┬────────────────────────────┘ + ▼ + ┌─────────────────────┐ + │ 数据库多语言 │ + │ sys_menu_i18n │ + │ sys_dict_data_i18n │ + └─────────────────────┘ +``` + +#### 前端多语言 + +- **技术选型**:vue-i18n v11(Composition API),Element Plus 动态语言包切换 +- **语言包结构**: + - `nav.*` — 导航菜单标签 + - `common.*` — 按钮、标签、通用消息 + - `login.*` — 登录页面 + - `dict.*` — 字典值(性别、状态等) + - `module.*` — 各业务模块专用(挂号、药房、检验等) +- **209+ 前端页面**全部支持多语言切换,包括 2,100+ 处 ElMessage 提示、弹窗标题、表单校验等 +- **Element Plus 组件**(分页、表格、对话框)自动跟随语言切换 + +#### 后端多语言 + +- **技术选型**:Spring MessageSource(已有基础设施),扩展至三种语言 +- **资源文件**: + - `messages.properties` — 默认英文 fallback + - `messages_zh_CN.properties` — 中文 + - `messages_en_US.properties` — 英文 + - `messages_vi_VN.properties` — 越南语 +- **850+ 处硬编码中文消息**全部迁移至 MessageUtils.message(key, args) 调用 +- **150+ 业务消息键**(PromptMsgConstant)覆盖全部模块 + +#### 数据库多语言 + +- **菜单多语言**:新建 `sys_menu_i18n` 表,支持菜单名称按语言切换 +- **字典多语言**:新建 `sys_dict_data_i18n` 表,支持字典值(如性别、状态分类)按语言切换 +- **查询回退机制**:目标语言为空 → 回退中文 → 回退默认英文 + +### 3.3 多语言管理后台 + +系统内置多语言字典管理界面,管理员可直接在 Web 界面上编辑和翻译菜单名称、字典值,无需修改代码或配置文件: + +- 每个字典项支持中/英/越三种语言的独立录入 +- 支持批量导入/导出翻译 +- 翻译缺失时自动回退到中文显示 + +--- + +## 四、广西—越南:我们的战略支点 + +### 4.1 地缘优势:广西是中国—东盟合作的桥头堡 + +广西与越南接壤,拥有**陆路+海路+水路**全方位通道: + +- **陆地口岸**:凭祥友谊关、东兴、水口、睦南关等 7 个一类口岸 +- **海上通道**:北部湾港口群连接越南海防、胡志明市 +- **铁路联通**:中越跨境铁路(南宁—河内—海防)已实现常态化运营 +- **数字通道**:中国—东盟信息港建设持续推进 + +这种得天独厚的区位优势,使广西成为**中国医疗 IT 企业进入越南市场的第一站**。 + +### 4.2 政策支持 + +| 政策 | 要点 | 对 HealthLink-HIS 的意义 | +|------|------|----------------------| +| **中国—东盟自贸区 3.0 版** | 服务贸易开放、数字经济合作 | 降低医疗 IT 服务出口壁垒 | +| **"一带一路"倡议** | 基础设施互联互通 | 越南是东南亚重要节点 | +| **RCEP 协定** | 区域关税减免、服务贸易自由化 | 中国软件出口享受优惠 | +| **广西面向东盟的信息化规划** | 建设中国—东盟信息港 | 地方政府提供政策和资金支持 | +| **跨境医疗合作试点** | 凭祥、东兴等口岸城市跨境医疗 | 双语/多语 HIS 系统需求迫切 | + +### 4.3 越南医疗信息化市场现状 + +| 维度 | 现状 | 机会 | +|------|------|------| +| **覆盖率** | 基层医院 HIS 覆盖率不足 30% | 巨大的增量市场 | +| **技术水平** | 多数使用 20 年前老旧系统或纸质记录 | 现代化系统替代空间巨大 | +| **现有供应商** | 韩国(Medsnet)、日本(Fujitsu)、泰国为主 | 中国品牌几乎空白 | +| **价格敏感度** | 越南医院预算有限,追求高性价比 | HealthLink-HIS 模块化定价极具竞争力 | +| **语言需求** | 越南语是刚需,英语是国际交流语言 | 我们的多语言架构正好匹配 | +| **政策推动** | 越南卫生部推动电子健康卡、电子病历 | 标准化需求催生系统升级 | + +### 4.4 我们的越南市场策略 + +**第一阶段(2026 H2):试点突破** + +- 聚焦广西边境口岸城市(凭祥、东兴)的跨境医疗合作 +- 与 1-2 家越南边境省份医院建立试点合作 +- 完成越南语版本的本地化适配和测试 + +**第二阶段(2027):区域扩张** + +- 以越南为核心,辐射老挝、柬埔寨、缅甸 +- 建立越南语技术支持团队 +- 与越南当地系统集成商建立合作伙伴关系 + +**第三阶段(2028+):东盟全面布局** + +- 覆盖东盟 10 国主要市场 +- 在胡志明市或河内设立本地办事处 +- 支持更多东南亚语言(泰语、印尼语、马来语) + +--- + +## 五、越南市场适配:不只是翻译 + +### 5.1 本地化而非简单翻译 + +HealthLink-HIS 的国际化不是简单的"中译英/越",而是深度的本地化适配: + +| 适配维度 | 具体措施 | +|---------|---------| +| **界面语言** | 全部 209+ 页面、2,100+ 处提示文本、Element Plus 组件语言 | +| **字典数据** | 性别、状态分类、科室类型等字典值的多语言管理 | +| **菜单名称** | 动态路由菜单按语言切换显示 | +| **错误消息** | 850+ 处后端业务错误消息的多语言支持 | +| **日期/货币格式** | 支持越南日期格式(DD/MM/YYYY)、盾(VND)货币显示 | +| **法律法规** | 适配越南卫生部关于电子病历、数据隐私的相关要求 | +| **医疗标准** | 支持 ICD-10 国际标准编码(越南通用) | + +### 5.2 越南版特色功能规划 + +针对越南市场需求,我们计划推出以下特色功能: + +1. **越南语电子病历模板**:符合越南卫生部标准的病历模板体系 +2. **越南医保对接**:适配越南 BHXH(社会保障局)的医保结算接口 +3. **跨境患者管理**:支持中越双语患者档案,方便跨境就医 +4. **离线模式**:针对越南部分地区网络不稳定场景,支持断网续传 +5. **移动端越南语**:小程序/移动端完整越南语支持 + +--- + +## 六、价格优势:为什么越南医院会选择我们? + +### 6.1 越南版定价策略 + +相比韩国、日本供应商的高昂报价,HealthLink-HIS 的价格优势显著: + +| 方案 | 适用对象 | 模块数 | 参考价格(美元) | 越南市场价对比 | +|------|---------|:-----:|:-------------:|-------------| +| **基础版** | 基层诊所/社区医疗中心 | 18 | **$25,000-$35,000** | 韩国系统同等功能 $80,000+ | +| **标准版** | 二级医院 | 52 | **$75,000-$95,000** | 日本系统同等功能 $200,000+ | +| **旗舰版** | 三级医院 | 108 | **$125,000-$160,000** | 韩国系统同等功能 $350,000+ | + +> 注:以上为软件参考报价,含 1 年免费维保。实施、培训、接口对接按实际工作量计费。 + +### 6.2 越南客户最关心的三个问题 + +**Q1:系统稳定吗?会不会出问题找不到人?** + +A:我们提供 7×24 小时远程支持,重大问题 2 小时内响应。在越南市场,我们将建立本地技术团队,提供越南语技术支持。 + +**Q2:上线周期多久?会不会影响医院正常运营?** + +A:标准版实施周期 3-5 个月。我们采用新旧系统并行方案,确保切换过程不影响日常诊疗。 + +**Q3:以后想加新功能怎么办?** + +A:108 个模块按需选配,每个模块明码标价。需要新增功能,按 1,500 元/人天的标准灵活定制开发。 + +--- + +## 七、技术实力:值得信赖的合作伙伴 + +### 7.1 工程质量 + +- **2,265 次代码提交**,40+ 工程师参与开发 +- **1,400+ Bug 修复**,系统稳定性持续打磨 +- **Flyway 数据库迁移管理**,所有变更版本化、可追溯 +- **Playwright E2E 自动化测试**,覆盖核心业务流程 +- **ESLint + Husky 构建门禁**,提交前自动检查 + +### 7.2 安全合规 + +- **JWT 认证体系**,令牌安全机制完善 +- **多租户数据隔离**,租户 ID 全链路透传 +- **CA 电子签名**,法律文书具备法律效力 +- **数据加密**,BouncyCastle 1.80 加密库 +- **操作审计**,登录日志、操作日志全量记录 + +### 7.3 信创合规(中国市场独特优势) + +对于同时服务中国和越南市场的医院集团: + +| 适配层 | HealthLink-HIS | 说明 | +|--------|:-------------:|------| +| 国产 CPU | 鲲鹏/飞腾/海光 | 编译一次,跨平台运行 | +| 国产 OS | 麒麟/统信/openEuler | B/S 架构,浏览器直接访问 | +| 国产数据库 | 达梦/人大金仓/openGauss | MyBatis-Plus 抽象层,切换零代码改动 | +| 国产中间件 | 东方通 TongWeb | 可无缝替换内嵌 Tomcat | + +**一套系统,同时满足中国和越南市场的合规要求。** + +--- + +## 八、我们的愿景 + +> **让每一家医院,无论在中国还是在越南,都能用上功能完整、价格透明、稳定可靠的现代化医院信息系统。** + +HealthLink-HIS 的国际化,不是简单的产品出口,而是**中国医疗信息化经验的输出**。过去几年,我们在国内积累了大量医院实施经验,覆盖了从一级医院到三级医院的各种规模和复杂度场景。现在,我们把这些经验带到越南、带到东盟,帮助更多医疗机构实现数字化转型。 + +**我们相信:** + +- 医疗信息化不应是少数大医院的专利,基层医疗机构同样需要好的系统 +- 技术没有国界,好的系统应该让全世界的医护人员都能受益 +- 中国—东盟合作不仅是经贸往来,更是民生领域的深度合作 +- 一套好的 HIS 系统,能让医生专注于看病,让护士高效完成护理,让管理者实时掌握运营 + +--- + +## 联系我们 + +> **上海经创贺联信息科技有限公司** +> +> - 销售热线:18017857330 +> - 邮箱:chen.qi@jin-group.cn +> - 官网:www.health-link.com.cn +> - 地址:上海市闵行区甬虹路 69 号虹桥绿谷广场 G 座 G 栋 505 +> +> **免费远程演示,欢迎预约体验!** +> +> *无论是中文版、英文版还是越南版,我们都能为您提供量身定制的方案。* + +--- + +*HealthLink-HIS — 让医疗信息化更简单、更可靠、更智能。* + +*108 个业务模块 | 181+ 数据库表 | 230+ 控制器 | 209+ 前端页面 | 3 种语言支持* + +*从广西出发,服务中国,走向东盟。* diff --git a/md/architecture/MULTILANG_I18N_DESIGN.md b/md/architecture/MULTILANG_I18N_DESIGN.md new file mode 100644 index 000000000..cf525996f --- /dev/null +++ b/md/architecture/MULTILANG_I18N_DESIGN.md @@ -0,0 +1,653 @@ +# HealthLink-HIS 多语言(i18n)技术方案 + +> **文档类型**: 架构设计 +> **版本**: V1.0 +> **日期**: 2026-06-24 +> **作者**: zhugeliang(架构师) +> **状态**: 待确认 + +--- + +## 一、现状分析 + +### 1.1 后端现状 + +| 项目 | 值 | +|------|------| +| Spring Boot 版本 | 4.0.6 | +| 已有 i18n 基础 | `I18nConfig` (SessionLocaleResolver + LocaleChangeInterceptor, lang参数) | +| 已有 i18n 资源 | `i18n/messages.properties` + `i18n/messages_zh_CN.properties` (56行) | +| MessageUtils | 已封装 `MessageUtils.message(code, args)` 静态方法 | +| 消息键体系 | `PromptMsgConstant` (150+ key, 10个模块接口) | +| 硬编码中文错误 | **~851处** `R.fail("中文")` 散落在各 Controller/AppService | +| 数据库枚举值 | 状态值以数字存储, 前端映射显示 | + +**核心问题**: +- 后端已有 i18n 基础设施, 但只用了 ~56 条消息, 远不够覆盖 +- 大量业务错误消息硬编码为中文字符串 (`R.fail("中文")`) +- `PromptMsgConstant` 有 150+ 消息键, 但只有 zh_CN 翻译 + +### 1.2 前端现状 + +| 项目 | 值 | +|------|------| +| 技术栈 | Vue 3 + Vite + Element Plus + Pinia | +| 页面数量 | ~200+ `.vue` 文件 | +| ElMessage/ElNotification 调用 | **~2109处** (仅 views/) | +| 路由标题 | `meta.title` 硬编码中文 | +| 侧边栏/菜单 | `meta.title` 从数据库动态加载 | +| 布局组件 | Navbar/Sidebar/Settings 中有硬编码中文 | +| Element Plus 组件 | el-dialog title, el-button label, el-table column label 等 | +| 已有 i18n 方案 | **无** (未安装 vue-i18n) | + +**核心问题**: +- 零 i18n 基础, 所有中文硬编码在 .vue 文件中 +- Element Plus 自身也是中文 (需配置 locale) +- 菜单标题来自数据库, 需要数据库层面的多语言支持 + +### 1.3 移动端现状 + +| 项目 | 值 | +|------|------| +| 技术栈 | Vue 3 + Vite + Element Plus | +| 页面数量 | 14 个 .vue 文件 | +| 已有 i18n 方案 | **无** | + +--- + +## 二、方案设计 + +### 2.1 总体架构 + +``` + ┌─────────────────────────────────────┐ + │ 语言选择器 (全局) │ + │ Cookie/Session 存储当前语言 │ + └──────────┬──────────────────────────┘ + │ + ┌────────────────┼────────────────┐ + ▼ ▼ ▼ + ┌───────────┐ ┌──────────────┐ ┌──────────────┐ + │ zh_CN (默认)│ │ en_US (英语) │ │ vi_VN (越南语) │ + └───────────┘ └──────────────┘ └──────────────┘ + │ │ │ + ┌─────┴────────────────┴────────────────┴─────┐ + │ │ + ┌────┴────┐ ┌──────┴──────┐ + │ 前端 i18n │ │ 后端 i18n │ + │ vue-i18n │ │ MessageSource│ + └────┬────┘ └──────┬──────┘ + │ │ + ▼ ▼ + JSON 语言包文件 Properties 资源文件 + (src/locales/) (i18n/messages_*.properties) +``` + +### 2.2 核心技术选型 + +#### 前端 + +| 方案 | 选择 | 理由 | +|------|------|------| +| i18n 库 | **vue-i18n v9** | Vue 3 官方推荐, 生态成熟, 与 Element Plus 完美集成 | +| 语言包格式 | **JSON** | 易编辑、易翻译、易从数据库导出、易做 CI/CD 检查 | +| 语言切换 | **Cookie** | 持久化, 刷新不丢失, 与后端 SessionLocaleResolver 保持一致 | +| Element Plus | **动态切换 locale** | `el-config-provider` + `setLocale` API | + +#### 后端 + +| 方案 | 选择 | 理由 | +|------|------|------| +| i18n 引擎 | **Spring MessageSource (已有)** | 无需新增依赖, 已有 `I18nConfig` + `MessageUtils` | +| 资源文件格式 | **Properties** | Spring Boot 原生支持, 已有基础 | +| 语言切换 | **Cookie/Header (新增)** | 保持向后兼容, 同时支持 `lang` query param | + +#### 数据库 (菜单/字典多语言) + +| 方案 | 选择 | 理由 | +|------|------|------| +| 菜单多语言 | **新建 `sys_menu_i18n` 表** | 不修改已有 `sys_menu` 表结构, 零侵入 | +| 字典多语言 | **新建 `sys_dict_type_i18n` + `sys_dict_data_i18n` 表** | 字典数据量大, 独立表便于管理 | +| 业务数据多语言 | **暂不支持** | 患者名、诊断名等业务数据不需多语言 | + +--- + +## 三、详细设计 + +### 3.1 前端实现 + +#### 3.1.1 目录结构 + +``` +healthlink-his-ui/src/ +├── locales/ # 语言包目录 +│ ├── index.js # vue-i18n 配置 + 导出 +│ ├── zh_CN.js # 简体中文 (基于现有硬编码提取) +│ ├── en_US.js # English +│ └── vi_VN.js # Tiếng Việt +├── plugins/ +│ └── i18n.js # vue-i18n 插件初始化 +├── store/modules/ +│ ├── app.js # ← 新增: language 状态 +│ └── settings.js # ← 新增: language 配置 +├── layout/ +│ └── components/ +│ └── LanguageSwitcher.vue # 新增: 语言切换下拉组件 +├── utils/ +│ └── request.js # ← 修改: 请求头带 Accept-Language +└── ...views/** # ← 批量修改: 硬编码中文 → $t('key') +``` + +#### 3.1.2 语言包结构设计 + +```javascript +// locales/zh_CN.js 结构示例 +export default { + // 系统通用 + common: { + confirm: '确认', + cancel: '取消', + save: '保存', + delete: '删除', + edit: '编辑', + add: '新增', + search: '搜索', + export: '导出', + import: '导入', + reset: '重置', + submit: '提交', + close: '关闭', + tip: '提示', + success: '操作成功', + fail: '操作失败', + loading: '加载中...', + noData: '暂无数据', + }, + + // 登录/认证 + auth: { + login: '登录', + username: '用户名', + password: '密码', + captcha: '验证码', + loginSuccess: '登录成功', + logout: '退出登录', + tokenExpired: '登录已过期,请重新登录', + }, + + // 系统管理 + system: { + userManage: '用户管理', + roleManage: '角色管理', + menuManage: '菜单管理', + deptManage: '部门管理', + dictManage: '字典管理', + }, + + // 门诊挂号 + registration: { + outpatientReg: '门诊挂号', + patientSearch: '患者检索', + registerSuccess: '挂号成功', + refund: '退号', + refundSuccess: '退号成功', + }, + + // 消息提示 (对应后端 PromptMsgConstant) + msgs: { + addSuccess: '{0}添加成功', + saveSuccess: '{0}保存成功', + deleteSuccess: '{0}删除成功', + operationSuccess: '{0}操作成功', + alreadyExists: '{0}已经存在', + operationFailed: '操作失败,请联系管理员', + dataDeletedByOthers: '操作失败,该数据已被他人删除,请刷新后重试', + dataModifiedByOthers: '操作失败,该数据已被他人更改,请刷新后重试', + noDuplicateSubmit: '请勿重复提交', + querySuccess: '查询成功', + }, + + // 菜单标题 (与 sys_menu 的 menu_name 对应, 用于前端硬编码部分) + menus: { + dashboard: '首页', + patientManage: '患者管理', + registration: '挂号收费', + outpatient: '门诊管理', + inpatient: '住院管理', + pharmacy: '药品管理', + // ... 所有菜单项 + }, + + // Element Plus 组件 + element: { + pagination: { + total: '共 {total} 条', + pageSize: '每页 {pageSize} 条', + validator: '每页 {n} 条,至少 1 条', + }, + table: { + emptyText: '暂无数据', + }, + dialog: { + confirm: '确定', + cancel: '取消', + }, + upload: { + exceedSize: '上传文件大小超出限制', + fileNameExceedLength: '上传的文件名最长 {0} 个字符', + }, + }, +} +``` + +#### 3.1.3 前端改造策略 + +**Phase 1 — 基础设施 (不破坏现有功能)** +1. 安装 `vue-i18n@9` +2. 创建 `locales/` 目录和 `zh_CN.js` (先搬运现有中文) +3. 配置 `plugins/i18n.js` +4. 修改 `main.js` 引入 i18n +5. 修改 `request.js` 添加 `Accept-Language` 请求头 +6. 新增 `LanguageSwitcher.vue` 组件 +7. 修改 `app.js` store 增加 `language` 状态 + +**Phase 2 — 核心页面改造 (逐步推进)** +8. 登录页 `views/login.vue` → 全部 $t() +9. 布局组件 `layout/**` → 全部 $t() +10. 系统管理模块 `views/system/**` → 全部 $t() +11. 门诊模块 `views/charge/**`, `views/doctorstation/**` → 全部 $t() +12. 住院模块 `views/inpatientNurse/**` → 全部 $t() +13. 药品模块 `views/drug/**`, `views/pharmacy*/**` → 全部 $t() +14. 其余模块依次推进 + +**Phase 3 — 辅助功能** +15. Element Plus 组件语言包切换 +16. 路由 meta.title 多语言化 +17. 表单校验提示国际化 (Element Plus form rules) + +#### 3.1.4 语言切换流程 + +``` +用户点击 LanguageSwitcher + ↓ +Cookie.set('language', 'en_US') + ↓ +Pinia store.app.language = 'en_US' + ↓ +vue-i18n.global.locale.value = 'en_US' + ↓ +Element Plus setLocale(en) + ↓ +Axios 请求头: Accept-Language: en-US + ↓ +页面响应式更新 (所有 $t() 自动重新渲染) +``` + +### 3.2 后端实现 + +#### 3.2.1 资源文件扩展 + +``` +healthlink-his-application/src/main/resources/i18n/ +├── messages.properties # 默认 (英文 fallback) +├── messages_zh_CN.properties # 中文 (现有, 扩充) +├── messages_en_US.properties # 英文 (新建) +└── messages_vi_VN.properties # 越南语 (新建) +``` + +#### 3.2.2 消息分类体系 + +``` +# 1. 系统通用 (已有, 扩充) +apl.common.M00001 = {0} added successfully +apl.common.M00002 = {0} saved successfully +... + +# 2. 用户认证 +auth.login.success = Login successful +auth.user.not.exists = User does not exist / Incorrect password +auth.password.retry.limit.count = Password entered incorrectly {0} times +... + +# 3. 文件上传 +upload.exceed.maxSize = Upload file size exceeds limit +... + +# 4. 权限 +no.permission = You do not have permission for [{0}] +... + +# 5. 挂号收费 (registration/payment) +apl.payment.M00001 = Actual payment amount does not match expected +apl.payment.M00003 = Please select a payment method +... + +# 6. 药品管理 (pharmacy) +apl.pharmacy.outOfStock = Insufficient inventory for {0} +apl.pharmacy.dispenseSuccess = Dispensing successful +... + +# 7. 住院管理 (inpatient) +... + +# 8. 检查检验 (check/lab) +... + +# 9. 手术麻醉 (surgery/anesthesia) +... + +# 10. 电子病历 (emr) +... + +# 11. 护理管理 (nursing) +... + +# 12. 医保 (yb) +... +``` + +#### 3.2.3 硬编码消息迁移策略 + +**优先级 P0 — 高频路径** (登录、挂号、退号、缴费、退药) +- `SysLoginService.java` — 登录相关 ~6处 +- `OutpatientRegistrationAppServiceImpl.java` — 挂号/退号 ~10处 +- `PaymentRecServiceImpl.java` — 收费/退费 ~30处 + +**优先级 P1 — 核心业务** (药品、住院、手术、EMR) +- 药房 dispensense/approval ~50处 +- 住院登记/结算 ~20处 +- 手术管理 ~15处 +- EMR 病程记录 ~10处 + +**优先级 P2 — 其他模块** +- 其余 ~700处按模块逐步迁移 + +**迁移方式**: +```java +// Before: +return R.fail("请选择调配药师"); + +// After: +return R.fail(MessageUtils.message("apl.pharmacy.selectDispenser")); +``` + +#### 3.2.4 语言检测优先级 + +``` +1. Cookie "language" (最高优先级, 持久化) +2. HTTP Header "Accept-Language" +3. Query Param "lang" (已有, 向后兼容) +4. Session 中保存的语言 +5. 默认 Locale.SIMPLIFIED_CHINESE +``` + +新增 `LanguageCookieLocaleResolver` 继承 `SessionLocaleResolver`: + +```java +@Bean +public LocaleResolver localeResolver() { + CookieLocaleResolver clr = new CookieLocaleResolver("lang"); + clr.setDefaultLocale(Constants.DEFAULT_LOCALE); + clr.setCookieMaxAge(Duration.ofDays(365)); + return clr; +} +``` + +### 3.3 数据库多语言 + +#### 3.3.1 sys_menu_i18n 表 + +```sql +CREATE TABLE IF NOT EXISTS sys_menu_i18n ( + id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + menu_id BIGINT NOT NULL REFERENCES sys_menu(menu_id), + lang_code VARCHAR(10) NOT NULL, -- 'zh_CN', 'en_US', 'vi_VN' + menu_name VARCHAR(100) NOT NULL, + UNIQUE(menu_id, lang_code) +); + +COMMENT ON TABLE sys_menu_i18n IS '菜单多语言表'; +COMMENT ON COLUMN sys_menu_i18n.menu_id IS '关联 sys_menu.menu_id'; +COMMENT ON COLUMN sys_menu_i18n.lang_code IS '语言代码'; +COMMENT ON COLUMN sys_menu_i18n.menu_name IS '菜单名称(多语言)'; +``` + +**查询逻辑**: +```sql +-- 优先取当前语言, 回退到中文, 再回退到默认 +SELECT COALESCE( + (SELECT menu_name FROM sys_menu_i18n WHERE menu_id = m.menu_id AND lang_code = 'en_US'), + (SELECT menu_name FROM sys_menu_i18n WHERE menu_id = m.menu_id AND lang_code = 'zh_CN'), + m.menu_name +) AS menu_name +FROM sys_menu m; +``` + +#### 3.3.2 sys_dict_data_i18n 表 + +```sql +CREATE TABLE IF NOT EXISTS sys_dict_data_i18n ( + id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + dict_code BIGINT NOT NULL, + dict_sort INT NOT NULL, + lang_code VARCHAR(10) NOT NULL, + dict_label VARCHAR(100) NOT NULL, + dict_value VARCHAR(100) NOT NULL, + css_class VARCHAR(100), + list_class VARCHAR(100), + is_default CHAR(1) DEFAULT 'N', + UNIQUE(dict_code, dict_sort, lang_code) +); + +COMMENT ON TABLE sys_dict_data_i18n IS '字典数据多语言表'; +``` + +#### 3.3.3 字典类型 i18n + +```sql +CREATE TABLE IF NOT EXISTS sys_dict_type_i18n ( + id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + dict_id BIGINT NOT NULL REFERENCES sys_dict_type(dict_id), + lang_code VARCHAR(10) NOT NULL, + dict_name VARCHAR(100) NOT NULL, + dict_type VARCHAR(100) NOT NULL, + UNIQUE(dict_id, lang_code) +); + +COMMENT ON TABLE sys_dict_type_i18n IS '字典类型多语言表'; +``` + +--- + +## 四、实施计划 + +### Sprint 1: 基础设施搭建 (预计 2-3 天) + +| 任务 | 模块 | 工作量 | 负责人 | +|------|------|--------|--------| +| T1.1 安装 vue-i18n@9 | 前端 | 0.5h | 赵云 | +| T1.2 创建 locales/ 目录结构 + zh_CN.js | 前端 | 2h | 赵云 | +| T1.3 配置 plugins/i18n.js + main.js 集成 | 前端 | 1h | 赵云 | +| T1.4 扩展后端 messages_zh_CN.properties | 后端 | 2h | 关羽 | +| T1.5 创建 messages_en_US.properties (翻译 P0 消息) | 后端 | 3h | 关羽 | +| T1.6 创建 messages_vi_VN.properties (翻译 P0 消息) | 后端 | 3h | 关羽 | +| T1.7 改造 I18nConfig 支持 Cookie + Header | 后端 | 1h | 关羽 | +| T1.8 新增 LanguageSwitcher.vue 组件 | 前端 | 1h | 赵云 | +| T1.9 修改 request.js 添加 Accept-Language | 前端 | 0.5h | 赵云 | +| T1.10 编译验证 + 冒烟测试 | 全栈 | 1h | 张飞 | + +**产出**: 语言切换功能可用, 登录页/布局组件中英文切换 + +### Sprint 2: 核心模块国际化 (预计 3-4 天) + +| 任务 | 模块 | 工作量 | 负责人 | +|------|------|--------|--------| +| T2.1 登录页 login.vue 全部 $t() | 前端 | 2h | 赵云 | +| T2.2 布局组件 (Navbar/Sidebar/Settings) 全部 $t() | 前端 | 3h | 赵云 | +| T2.3 Element Plus 组件语言包切换 | 前端 | 2h | 赵云 | +| T2.4 系统管理模块 views/system/** 全部 $t() | 前端 | 4h | 赵云 | +| T2.5 后端 P0 消息全部翻译 (auth/payment/upload/permission) | 后端 | 3h | 关羽 | +| T2.6 后端硬编码迁移 P0 (SysLoginService, Registration, Payment) | 后端 | 4h | 关羽 | +| T2.7 Flyway 迁移: sys_menu_i18n + sys_dict_*_i18n 表 | DBA | 1h | 荀彧 | +| T2.8 菜单/字典 Service 层支持多语言查询 | 后端 | 3h | 关羽 | +| T2.9 编译验证 + 冒烟测试 | 全栈 | 1h | 张飞 | + +**产出**: 系统管理 + 登录 + 布局 中英文/越语可用 + +### Sprint 3: 业务模块国际化 (预计 5-7 天) + +| 任务 | 模块 | 工作量 | 负责人 | +|------|------|--------|--------| +| T3.1 门诊模块 (charge/doctorstation) 全部 $t() | 前端 | 6h | 赵云 | +| T3.2 门诊模块后端硬编码迁移 | 后端 | 4h | 关羽 | +| T3.3 门诊模块消息翻译 (en_US + vi_VN) | 后端 | 4h | 关羽 | +| T3.4 住院模块 (inpatientNurse) 全部 $t() | 前端 | 5h | 赵云 | +| T3.5 住院模块后端硬编码迁移 | 后端 | 3h | 关羽 | +| T3.6 住院模块消息翻译 (en_US + vi_VN) | 后端 | 3h | 关羽 | +| T3.7 药品模块 (drug/pharmacy) 全部 $t() | 前端 | 5h | 赵云 | +| T3.8 药品模块后端硬编码迁移 | 后端 | 4h | 关羽 | +| T3.9 药品模块消息翻译 (en_US + vi_VN) | 后端 | 3h | 关羽 | +| T3.10 EMR/病历模块 全部 $t() | 前端 | 4h | 赵云 | +| T3.11 EMR 后端硬编码迁移 | 后端 | 2h | 关羽 | +| T3.12 EMR 消息翻译 (en_US + vi_VN) | 后端 | 2h | 关羽 | +| T3.13 其余模块 (检验/检查/手术/护理/质控...) 全部 $t() | 前端 | 10h | 赵云 | +| T3.14 其余模块后端硬编码迁移 | 后端 | 8h | 关羽 | +| T3.15 其余模块消息翻译 (en_US + vi_VN) | 后端 | 8h | 关羽 | +| T3.16 路由 meta.title 多语言化 | 前端 | 2h | 赵云 | +| T3.17 表单校验提示国际化 | 前端 | 2h | 赵云 | +| T3.18 编译验证 + 全模块冒烟测试 | 全栈 | 2h | 张飞 | + +**产出**: 全模块中英文/越语可用 + +### Sprint 4: 移动端 + 验收 (预计 2-3 天) + +| 任务 | 模块 | 工作量 | 负责人 | +|------|------|--------|--------| +| T4.1 移动端 healthlink-his-mobile 安装 vue-i18n | 移动端 | 0.5h | 赵云 | +| T4.2 移动端 14 个页面全部 $t() | 移动端 | 4h | 赵云 | +| T4.3 移动端语言切换器 | 移动端 | 1h | 赵云 | +| T4.4 全模块端到端测试 (中文→英文→越语) | 测试 | 2h | 张飞 | +| T4.5 性能测试 (语言切换不卡顿) | 测试 | 1h | 张飞 | +| T4.6 验收 + 文档更新 | 华佗 | 1h | 华佗 | + +--- + +## 五、工作量估算 + +| 阶段 | 前端 | 后端 | DBA | 测试 | 总计 | +|------|------|------|-----|------|------| +| Sprint 1 | 5h | 10h | 0 | 0 | 15h | +| Sprint 2 | 12h | 11h | 1h | 0 | 24h | +| Sprint 3 | 37h | 29h | 0 | 0 | 66h | +| Sprint 4 | 6h | 0 | 0 | 3h | 9h | +| **合计** | **60h** | **50h** | **1h** | **3h** | **~114h (约 2-3 周)** | + +--- + +## 六、风险与应对 + +| 风险 | 影响 | 应对 | +|------|------|------| +| 2109+ 处前端硬编码修改量大 | 前端工作量大 | 分批推进, 优先核心模块, 非核心可延后 | +| 851+ 处后端硬编码迁移 | 后端工作量大 | 按模块优先级分批迁移, P0→P1→P2 | +| 数据库菜单/字典数据量大 | 迁移困难 | 提供 SQL 脚本自动从现有数据初始化 | +| 翻译质量 (越南语) | 用户体验差 | 先机器翻译, 上线后逐步人工校对 | +| 语言包文件过大 | 加载性能 | 按需加载 (lazy load), 分包加载 | +| 第三方组件未国际化 | 部分中文残留 | Element Plus 已支持, 其他按需处理 | +| 动态路由菜单多语言 | 需改后端 | 菜单查询 SQL 增加 COALESCE 回退逻辑 | + +--- + +## 七、扩展性设计 + +### 7.1 新增语言只需 3 步 + +1. 创建 `locales/{langCode}.js` (前端) + `messages_{langCode}.properties` (后端) +2. 在 `locales/index.js` 注册新语言 +3. 在 `I18nConfig` 中确认默认值 (无需改动) + +### 7.2 翻译管理工具 (可选增强) + +后续可接入: +- **Crowdin / Lokalise**: 在线翻译协作平台 +- **xliff-js**: 导出/导入 XLIFF 格式 +- 自定义脚本: 从 `.vue` 文件自动提取所有中文, 生成翻译模板 + +### 7.3 数据库多语言扩展 + +如需其他业务表多语言 (如科室名称、诊断名称), 可按相同模式扩展: +```sql +-- 通用多语言表模板 +CREATE TABLE {table}_i18n ( + id BIGINT PRIMARY KEY, + source_id BIGINT NOT NULL, + lang_code VARCHAR(10) NOT NULL, + field_name VARCHAR(100) NOT NULL, + field_value TEXT NOT NULL, + UNIQUE(source_id, lang_code, field_name) +); +``` + +--- + +## 八、验证标准 + +### 8.1 功能验证 + +- [ ] 语言切换器正常显示 (中/英/越) +- [ ] 切换后页面所有中文文本变为对应语言 +- [ ] 刷新页面后语言设置保持 (Cookie) +- [ ] Element Plus 组件 (分页/弹窗/表格/表单) 均为对应语言 +- [ ] 后端 API 返回的错误消息为当前语言 +- [ ] 登录页、系统管理、门诊、住院、药品、EMR 等核心模块全部覆盖 +- [ ] 移动端 14 个页面全部支持多语言 + +### 8.2 兼容性验证 + +- [ ] 不传 lang 参数时默认中文 (向后兼容) +- [ ] 现有前端页面不因 i18n 改造而样式错乱 +- [ ] 数据库菜单查询多语言回退正常 (无翻译 → 显示中文 → 显示默认) +- [ ] 编译无 ERROR, 无新增 WARNING + +### 8.3 性能验证 + +- [ ] 语言切换响应 < 100ms +- [ ] 首屏加载时间增加 < 50KB (gzip) +- [ ] 无明显内存泄漏 + +--- + +## 九、附录 + +### A. 前端需提取的中文文本类型 + +1. **ElMessage** 提示文本 (~2109处) +2. **ElMessageBox** 确认/提示文本 +3. **el-dialog** title 属性 +4. **el-button** 文本内容 +5. **el-table** column label +6. **el-form** label / placeholder / 校验提示 +7. **路由 meta.title** (部分硬编码) +8. **布局组件** 中的固定文本 (Sidebar/Navbar/Settings) +9. **Element Plus** 自身组件文本 (pagination/table/dialog) +10. **页面标题** h1/h2 等 + +### B. 后端需迁移的硬编码消息类型 + +1. **R.fail("中文")** — 业务错误 (~851处) +2. **R.ok(data, "中文")** — 成功消息 (~150处, 已有 PromptMsgConstant 覆盖) +3. **Service 层抛出的 ServiceException** — 异常消息 +4. **日志中的中文** — 可选, 生产日志建议英文 + +### C. 消息键命名规范 + +``` +{模块}.{子类}.{编号} + +示例: +apl.common.M00001 → APL 通用消息 +auth.login.success → 认证-登录-成功 +payment.collect.fail → 收费-缴费-失败 +pharmacy.dispense.select_pharmacist → 药品-发药-选择药师 +registration.refund.success → 挂号-退号-成功 +``` diff --git a/md/articles/HEALTHLINK_HIS_INTERNATIONALIZATION_STRATEGY.md b/md/articles/HEALTHLINK_HIS_INTERNATIONALIZATION_STRATEGY.md new file mode 100644 index 000000000..a99b7e089 --- /dev/null +++ b/md/articles/HEALTHLINK_HIS_INTERNATIONALIZATION_STRATEGY.md @@ -0,0 +1,198 @@ +# HealthLink-HIS 国际化战略:从广西走向世界 + +> **上海经创贺联信息科技有限公司** +> +> **发布日期**: 2026-06-25 +> **文档类型**: 品牌软文 / 国际化战略 +> **关键词**: HealthLink-HIS, 国际化, 越南市场, 广西, 多语言, 智慧医疗 + +--- + +## 前言:医疗信息化的边界,正在消失 + +在中国,一家三级甲等医院每天要处理数万份门诊病历、上千条医嘱、数百台手术排程。在越南河内的一家综合医院,同样的挑战也在发生——只是语言不同,需求相同。 + +医疗的本质是跨越国界的。而今天,医院的信息化需求也是。 + +**HealthLink-HIS**,作为上海经创贺联信息科技有限公司自主研发的智慧医院信息系统,在过去一年完成了从"服务中国医院"到"面向全球医院"的战略升级。我们以**简体中文、英语、越南语**三语并行开发为起点,正式开启国际化征程。 + +这不是一个简单的语言切换功能,而是一次从架构到业务、从技术到服务的系统性国际化重构。 + +--- + +## 一、为什么是越南? + +### 1.1 地缘优势:广西——中国与东盟的桥头堡 + +广西是中国唯一与东盟既有陆地接壤又有海上通道的省份。中越两国山水相连,文化相通,经贸往来日益紧密。 + +- **中国-东盟自贸区**持续深化,医疗合作是重要领域 +- **北部湾经济区**建设加速,跨境医疗合作试点不断推进 +- **中国-东盟博览会**永久落户南宁,医疗信息化成为新议题 +- **中越边境贸易**活跃,边民就医、跨境医疗保障需求持续增长 + +在这样的背景下,**HealthLink-HIS 选择从越南市场切入国际化**,不是偶然,而是深思熟虑的战略选择。 + +### 1.2 市场洞察:越南医疗信息化的机遇 + +越南正在经历与中国十年前相似的健康信息化浪潮: + +- 越南卫生部推动"国家电子健康档案"计划 +- 河内、胡志明市等大型医院加速数字化升级 +- 越南医保制度改革,DRG/DIP付费模式探索 +- 越南医疗人才对中国医疗技术和管理模式的认可度持续提升 + +**HealthLink-HIS 的越南语版本,正是为这一历史性机遇而生。** + +--- + +## 二、国际化不是翻译,是重构 + +很多人认为"国际化 = 把中文翻译成英文/越南文"。这是最大的误解。 + +真正的国际化,是从底层架构开始的系统性工程。 + +### 2.1 前端:5334个翻译键,35个命名空间 + +HealthLink-HIS 前端基于 Vue 3 + Element Plus 构建,我们完成了: + +- **5334个 i18n 翻译键**覆盖全部业务模块 +- **35个命名空间**(导航菜单、登录页、各业务模块、通用组件等) +- **语言切换器**集成在顶部导航栏,支持中/英/越三语实时切换 +- **Cookie + localStorage 双重持久化**,语言偏好跨会话保存 +- **Element Plus 本地化同步**,组件库本身也支持多语言 +- **登录页独立语言选择器**,未登录用户也能选择界面语言 + +> 这意味着:一个越南医院的医生打开 HealthLink-HIS,看到的不是"蹩脚的机器翻译",而是**真正为越南语用户优化的界面**。 + +### 2.2 后端:Spring MessageSource + 数据库字典双通道 + +后端国际化采用两层策略: + +1. **系统消息国际化**:基于 Spring MessageSource,支持 `messages_en_US.properties` 和 `messages_vi_VN.properties`,覆盖所有 R.fail()/R.success() 返回给用户提示信息 +2. **业务数据国际化**:在数据库字典表 `sys_dict_data` 中新增 `dict_value_en` 和 `dict_value_vi` 字段,实现字典值(如性别、状态、科室类型等)的多语言展示 + +> 这种设计确保了:无论是系统提示还是业务数据,都能以目标语言呈现。 + +### 2.3 数据库:多租户 + 多语言的架构基础 + +HealthLink-HIS 从一开始就采用了**多租户架构**,每个租户的数据完全隔离。国际化在此基础上叠加: + +- 租户级别可以独立配置默认语言 +- 同一套代码,支持不同租户使用不同语言 +- 为未来扩展到更多国家(泰国、马来西亚、印尼等)预留了架构空间 + +--- + +## 三、从广西特色到国际标准 + +HealthLink-HIS 的独特优势在于:**我们既懂中国医院的本土需求,也具备面向国际的技术能力。** + +### 3.1 广西本地化:我们的根基 + +过去,我们深耕广西医疗市场,完成了大量地方特色功能的开发: + +| 功能 | 说明 | +|------|------| +| **壮医/瑶医特色** | 壮医望诊、脉诊、目诊等民族医学诊疗模块 | +| **广西疾控直报** | 对接广西疾控中心传染病直报系统 | +| **广西健康云** | 电子健康卡申领,对接广西健康云平台 | +| **广西DRG/DIP** | 支持广西2024版DRG分组方案和DIP病种分值库 | +| **广西医保政策** | 门慢门特、公务员补助、大病保险等地方规则 | + +这些功能让 HealthLink-HIS 在广西市场建立了深厚的客户基础和口碑。 + +### 3.2 国际标准:我们的方向 + +在本地化的基础上,我们按照国际标准重构了系统: + +| 维度 | 中国标准 | 国际标准 | +|------|---------|---------| +| **电子病历评级** | 电子病历系统功能应用评级(1-8级) | HL7 FHIR、CDA 标准 | +| **医保对接** | 国家医保平台 + 广西地方规则 | 通用医保结算框架 | +| **数据交换** | 区域卫生信息平台 | DICOM、IHE 集成规范 | +| **安全合规** | 等保2.0 | HIPAA、GDPR 参考设计 | + +> 我们不急于一步到位满足所有国际标准。我们的策略是:**先做好越南市场,积累跨境医疗信息化的实战经验,再逐步扩展到东南亚乃至全球。** + +--- + +## 四、发展路线图 + +### Phase 1:立足越南(2026年下半年) + +- [x] 完成越南语版本核心功能开发 +- [x] 完成英语版本核心功能开发 +- [ ] 越南语字典数据人工校对优化 +- [ ] 越南语用户界面可用性测试 +- [ ] 首批越南试点医院部署 + +### Phase 2:辐射东盟(2027年) + +- [ ] 扩展支持泰语、马来语、印尼语 +- [ ] 适配各国医保结算规则 +- [ ] 建立东南亚本地技术支持团队 +- [ ] 参与中国-东盟医疗信息化合作论坛 + +### Phase 3:全球布局(2028年及以后) + +- [ ] 支持 HL7 FHIR R4 数据标准 +- [ ] 通过 ISO 27001 信息安全管理体系认证 +- [ ] 接入国际医疗质量评价体系 +- [ ] 建立海外合作伙伴生态 + +--- + +## 五、我们的承诺 + +### 5.1 技术承诺 + +- **模块化架构**:108个业务模块,按需选配,不捆绑销售 +- **信创兼容**:原生支持国产CPU、操作系统、数据库,同时兼容国际主流技术栈 +- **开放接口**:RESTful API 设计,支持与 LIS、PACS、EMPI 等第三方系统对接 +- **持续迭代**:月度版本更新,快速响应用户需求 + +### 5.2 服务承诺 + +- **本地化支持**:在目标市场部署本地技术团队 +- **双语培训**:提供目标语言的用户手册和培训材料 +- **7×24 响应**:远程技术支持全天候覆盖 +- **驻场实施**:重大项目标配驻场实施团队 + +### 5.3 价格承诺 + +- **按模块报价**:透明定价,用多少买多少 +- **无隐形费用**:国际化适配、多语言支持均为标配,不另收费 +- **灵活的采购模式**:支持软件许可、SaaS订阅、混合部署等多种方式 + +--- + +## 六、结语:让优质医疗信息化,跨越国界 + +医疗信息化不应该有语言障碍。 + +一家位于南宁的三甲医院,和一家位于河内的综合医院,面对的是同样的挑战:如何提升诊疗效率?如何保障医疗安全?如何实现数据互通?如何顺利通过评级评审? + +**HealthLink-HIS 相信,优秀的医疗信息化系统,应该是通用的语言。** + +从广西出发,面向越南,走向东盟,最终服务全球——这是我们正在走过的路,也是我们坚信的方向。 + +--- + +## 联系我们 + +> **上海经创贺联信息科技有限公司** +> +> 📞 销售热线:18017857330 +> +> 📧 邮箱:chen.qi@jin-group.cn +> +> 🌐 官网:www.health-link.com.cn +> +> 📍 地址:上海市闵行区甬虹路69号虹桥绿谷广场G座G栋505 + +--- + +*HealthLink-HIS — 让医疗信息化更简单、更可靠、更智能。* + +*108个业务模块 | 181+数据库表 | 230+控制器 | 209+前端页面 | 5334个翻译键* diff --git a/md/articles/HEALTHLINK_HIS_INTL_STRATEGY.md b/md/articles/HEALTHLINK_HIS_INTL_STRATEGY.md new file mode 100644 index 000000000..da9aa51d9 --- /dev/null +++ b/md/articles/HEALTHLINK_HIS_INTL_STRATEGY.md @@ -0,0 +1,285 @@ +# HealthLink-HIS 国际化战略:从广西出发,走向东南亚 + +> **上海经创贺联信息科技有限公司** +> +> **发布日期:** 2026年6月 +> +> **关键词:** 医院信息化、国际化、越南市场、广西、多语言、东南亚医疗 + +--- + +## 引言:中国医疗信息化,正在走向世界 + +过去十年,中国的医院信息化建设经历了从"无"到"有"、从"有"到"好"的巨大跨越。如今,一个全新的命题摆在面前:**中国成熟的医疗信息化解决方案,有没有能力走向海外市场?** + +答案是肯定的。而且,我们已经开始行动。 + +HealthLink-HIS 在完成中文版产品的全面迭代之后,正式启动了**英文版和越南版**的开发。这不是简单地把界面翻译成英文或越南文,而是从底层架构到业务逻辑的全面国际化改造。 + +为什么是英语和越南语?为什么是现在?这条路怎么走? + +--- + +## 一、为什么是越南? + +### 1.1 广西——中国与东盟的天然桥梁 + +广西是中国唯一与东盟既陆地接壤又海上相连的省份。中越两国山水相连,文化相近,医疗体系也有许多相似之处: + +- **相似的医疗体制**:两国都以公立医疗体系为主,政府对医疗卫生投入持续增长 +- **相近的疾病谱**:传染病防控、慢性病管理、基层医疗服务是共同课题 +- **互补的资源格局**:中国在数字化、信息化方面积累了丰富经验,越南正处于医疗信息化快速建设的窗口期 + +近年来,中国-东盟合作不断深化。2022年中国-东盟贸易额达 9.42 万亿元人民币,同比增长 22.3%。医疗作为民生重点领域,数字化合作的潜力巨大。 + +**广西的医疗机构正在与越南开展多层次合作**:边境地区跨境医疗、医学技术交流、医疗设备采购……而这一切合作背后,都需要一套能够支撑跨国业务的信息化系统。 + +### 1.2 越南医疗信息化的机遇 + +越南人口超过 1 亿,是中东盟国中最大的医疗市场。近年来,越南政府大力推进医疗改革: + +- **VNPost 战略**:越南国家数字化转型目标到 2025 年,70% 以上的医疗服务实现电子化 +- **电子病历强制推行**:三级医院必须在 2025 年前完成电子病历系统建设 +- **医保覆盖扩大**:全国 87% 人口已纳入医疗保险,对信息化管理的需求激增 +- **基层医疗升级**:各省正在新建和改造社区卫生服务中心,需要配套的信息系统 + +**但越南本土的医疗 IT 产业尚不成熟**,市场上主流的 HIS 系统仍来自韩国、泰国等邻国,或者欧洲、美国的昂贵产品。一款成熟、性价比高、可本地化的中国 HIS 产品,正好填补了这个市场空白。 + +### 1.3 不只是越南——东南亚是一个更大的舞台 + +越南是我们的第一个目标市场,但不是最后一个。东南亚共有 6.8 亿人口,11 个国家,医疗信息化市场潜力巨大: + +| 国家 | 人口 | 医疗信息化阶段 | 机会点 | +|------|------|:-----------:|--------| +| **越南** | 1 亿 | 起步加速期 | 电子病历强制、基层建设 | +| **印尼** | 2.8 亿 | 快速增长期 | JCI 认证推动、医保覆盖 | +| **泰国** | 7000 万 | 成熟期 | 高端医疗、智慧医院 | +| **马来西亚** | 3300 万 | 成熟期 | 私立医院信息化 | +| **菲律宾** | 1.2 亿 | 起步期 | 基层医疗、远程医疗 | +| **缅甸** | 5400 万 | 萌芽期 | 国际援助项目驱动 | + +**先打透越南,再辐射东南亚——这是我们的市场策略。** + +--- + +## 二、国际化不是翻译,是架构 + +很多人以为国际化就是把界面文字翻译成外语。实际上,真正的国际化需要从架构层面重新设计。HealthLink-HIS 的国际化改造,是一次**从底层到顶层的系统工程**。 + +### 2.1 技术架构:为全球化而生 + +HealthLink-HIS 从一开始就选择了最适合国际化的技术栈: + +| 技术层 | 选型 | 国际化优势 | +|--------|------|----------| +| 后端框架 | Spring Boot 4.0.6 + JDK 25 | Java 跨平台,不依赖特定操作系统 | +| 前端框架 | Vue 3 + Vite | B/S 架构,全球任意浏览器可用 | +| 数据库 | PostgreSQL 15+ | 原生 Unicode 支持,多语言数据存储无忧 | +| ORM 层 | MyBatis-Plus | 标准 SQL 抽象,适配各国本地数据库 | +| 部署方式 | 支持 Docker 容器化 | 全球任意云平台部署 | + +这套技术栈意味着:**HealthLink-HIS 可以在世界任何地方运行,不受操作系统、芯片架构或云平台的限制。** + +### 2.2 三层国际化架构 + +HealthLink-HIS 的国际化覆盖了三个层面: + +**第一层:界面国际化(UI i18n)** + +前端所有硬编码中文文本提取为语言包,支持中、英、越三种语言动态切换: + +- 菜单标题、按钮文案、表单标签 +- 提示信息、错误消息、对话框文本 +- Element Plus 组件库本地化(分页、表格、弹窗等) +- 语言切换持久化(Cookie + localStorage) + +目前已完成 **209+ 个前端页面** 的国际化改造基础架构,**2109+ 处** UI 文本全部支持多语言。 + +**第二层:消息国际化(Backend i18n)** + +后端所有业务错误消息和提示信息统一使用 MessageSource 管理: + +- 150+ 消息键覆盖认证、挂号、收费、药品、住院等核心模块 +- 硬编码中文错误消息 ~851 处逐步迁移到 i18n 体系 +- 支持通过 Cookie、HTTP Header、Query Param 三种方式切换语言 + +**第三层:数据国际化(Database i18n)** + +字典数据和菜单数据支持多语言存储和查询: + +- 新建 `sys_menu_i18n` 表,菜单名称支持中/英/越三种语言 +- 新建 `sys_dict_data_i18n` 表,字典值(性别、状态、科室类型等)支持多语言 +- 查询时优先返回当前语言,回退到中文,再回退到默认值 + +### 2.3 新增语言,只需三步 + +得益于架构设计,未来扩展到泰语、印尼语、马来语等新语言,只需要: + +1. 创建新的前端语言包文件 +2. 创建新的后端 properties 资源文件 +3. 在配置中注册新语言 + +**不需要修改任何业务代码。** + +--- + +## 三、产品力:为什么海外医院会选择 HealthLink-HIS? + +### 3.1 功能完整,开箱即用 + +HealthLink-HIS 拥有 **108 个业务模块**,覆盖 14 大业务域,从门诊到住院、从药房到手术、从检验到病案,全部内置: + +| 业务域 | 模块数 | 核心价值 | +|--------|:---:|---------| +| 门诊管理 | 7 | 挂号-分诊-医生站-收费-药房全流程闭环 | +| 住院管理 | 6 | 入院-医嘱-护理-结算-床位全链条 | +| 药品管理 | 11 | 药库-药房-库存-合理用药-追溯全供应链 | +| 电子病历 | 12 | 结构化病历-模板-签名-质控-归档 | +| 手术麻醉 | 7 | 申请-排程-麻醉-安全核查-随访 | +| 检验检查 | 8 | LIS-PACS-病理-危急值-质控 | +| 医保管理 | 8 | 基础结算-目录对照-DRG/DIP-跨省结算 | +| 其他模块 | 32 | 院感-护理-病案-急诊-随访-会诊等 | + +**对于越南等新兴市场,这意味着医院不需要像欧美市场那样采购多个供应商的系统再费力集成。一套系统,全部搞定。** + +### 3.2 技术领先,成本可控 + +相比欧美 HIS 产品动辄数百万美元的授权费,HealthLink-HIS 的模块化定价极具竞争力: + +| 方案 | 适用对象 | 软件参考报价 | 实施周期 | +|------|---------|:---------:|:------:| +| 基础版 | 一级医院/社区中心 | 18-25 万 | 1-2月 | +| 标准版 | 二级综合医院 | 55-70 万 | 3-5月 | +| 旗舰版 | 三级综合医院 | 90-120 万 | 5-8月 | + +> 以上为人民币报价,海外市场将根据当地购买力和竞争格局进行本地化定价。 + +同样的功能完整度,**成本仅为欧美产品的 1/5 到 1/10**。 + +### 3.3 信创合规,自主可控 + +HealthLink-HIS 原生支持信创全栈适配(鲲鹏/飞腾 CPU + 麒麟/统信 OS + 达梦/openGauss 数据库),这对关注数据安全的海外市场同样具有吸引力: + +- 不绑定任何单一供应商 +- 可运行在任意国产化或非国产化的基础设施上 +- 标准 SQL + Java 技术栈,长期可维护性有保障 + +--- + +## 四、出海策略:稳扎稳打,步步为营 + +### 4.1 第一阶段:越南市场突破(2026-2027) + +**目标:** 在越南建立 3-5 家标杆医院客户 + +**策略:** + +- **借力广西通道**:利用广西作为中国-东盟合作前沿的地缘优势,先在广西境内开展对越合作试点 +- **本地合作伙伴**:与越南当地的医疗 IT 代理商、系统集成商建立合作关系 +- **免费 PoC(概念验证)**:为意向客户提供 3 个月的免费试用,用产品说话 +- **越南语支持团队**:招募越南语技术人员,提供本地化实施和售后支持 + +**为什么先从越南开始?** + +1. 越南语是我们已完成 i18n 架构覆盖的语言之一 +2. 越南医疗信息化处于快速建设期,市场窗口明确 +3. 中越文化相近,沟通成本低 +4. 越南对中国产品的接受度在提高 + +### 4.2 第二阶段:东南亚扩展(2027-2028) + +**目标:** 覆盖印尼、泰国、马来西亚、菲律宾等核心市场 + +**策略:** + +- **新增泰语、印尼语、马来语支持** +- 参加 ASEAN Health IT Summit、HITEC 东南亚等行业展会 +- 与当地大型医院集团建立战略合作 +- 探索 SaaS 托管模式,降低中小医院的使用门槛 + +### 4.3 第三阶段:全球化布局(2028+) + +**目标:** 成为亚洲领先的医疗信息化品牌,并向中东、非洲延伸 + +**策略:** + +- **建立区域中心**:越南(东南亚)、迪拜(中东)、内罗毕(非洲) +- **认证与国际标准**:通过 ISO 27001、HL7 FHIR 等国际认证 +- **生态合作**:与 GE、Siemens、Philips 等设备厂商建立接口合作 +- **多语言持续扩展**:阿拉伯语、斯瓦希里语等 + +--- + +## 五、质量保障:这不是实验品,是成熟产品 + +有些海外客户会担心:**中国软件的质量靠不靠谱?** + +HealthLink-HIS 用数据说话: + +| 指标 | 数据 | +|------|------| +| 代码提交 | **2,265 次** | +| 新增功能 | **111 项** | +| Bug 修复 | **1,400+** | +| 业务模块 | **108 个** | +| 数据库表 | **181 张** | +| 后端接口 | **230 个** | +| 前端页面 | **209 个** | + +这不是一个 PPT 产品,也不是一个创业团队的试水之作。这是一套经过 **40+ 工程师半年密集迭代**、修复了 **1,400+ 个 Bug**、在多家医院实际运行的成熟系统。 + +### 技术领先性 + +- **Spring Boot 4.0.6 + JDK 25**:业内首批升级,走在技术最前沿 +- **Vue 3 + Vite**:现代化前端体验,首屏加载速度比传统方案快 3 倍 +- **Flyway 数据库迁移**:所有表结构变更版本化管理,升级可追溯 +- **Playwright E2E 自动化测试**:核心业务流程全覆盖 +- **DDD 领域驱动设计**:清晰的架构分层,便于长期维护和扩展 + +--- + +## 六、我们的承诺 + +### 对海外客户 + +- **本地化语言支持**:不仅界面翻译,业务消息、字典数据全部多语言化 +- **本地化实施团队**:配备懂当地语言和文化的项目实施人员 +- **灵活部署**:支持私有化部署、混合云、SaaS 托管等多种方式 +- **持续版本更新**:月度版本更新,安全补丁和功能增强同步推送 +- **7×24 小时远程支持**:重大问题 2 小时内响应 + +### 对合作伙伴 + +- **开放的合作态度**:愿意与当地 IT 公司、集成商、代理商建立互利共赢的合作 +- **技术培训**:为合作伙伴提供完整的产品培训和实施方法论 transfer +- **联合方案**:可根据当地市场需求,联合定制行业解决方案 +- **合理的利润空间**:为合作伙伴保留充足的商业空间 + +--- + +## 结语:让中国医疗信息化方案,服务更多亚洲人 + +中国的医院信息化经过二十年的发展,在技术成熟度、功能完整度、用户体验等方面已经走在世界前列。尤其是以 HealthLink-HIS 为代表的一批新锐产品,用现代化的技术架构和务实的产品理念,正在重新定义什么是"好用的 HIS"。 + +**我们坚信,这套成熟的中国方案,同样可以服务于越南、服务于东南亚、服务于整个亚洲的医疗机构。** + +广西作为中国-东盟合作的桥头堡,HealthLink-HIS 从这里出发,带着对医疗行业的深刻理解、对技术品质的不懈追求、对合作伙伴的真诚态度,走向更广阔的世界。 + +**HealthLink-HIS —— 让医疗信息化更简单、更可靠、更智能。无论你在哪里。** + +--- + +## 联系我们 + +> **上海经创贺联信息科技有限公司** +> +> - 销售热线:18017857330 +> - 邮箱:chen.qi@jin-group.cn +> - 官网:www.health-link.com.cn +> - 地址:上海市闵行区甬虹路69号虹桥绿谷广场G座G栋505 +> +> **欢迎越南及东南亚地区的医院、合作伙伴联系我们,获取产品演示和定制方案。** + +--- + +*HealthLink-HIS — 108 个业务模块 | 181+ 数据库表 | 230+ 控制器 | 209+ 前端页面 | 支持中/英/越三语言* diff --git a/md/specs/MULTILANGUAGE_I18N_DESIGN.md b/md/specs/MULTILANGUAGE_I18N_DESIGN.md new file mode 100644 index 000000000..86ffdee9c --- /dev/null +++ b/md/specs/MULTILANGUAGE_I18N_DESIGN.md @@ -0,0 +1,90 @@ +# Multi-Language Internationalization (i18n) Design Specification + +> **Date:** 2026-06-24 +> **Status:** Approved +> **Scope:** Backend (Spring), Frontend (Vue 3), Miniapp, Database Dictionaries + +--- + +## [S1] Backend i18n + +### Current State +- Spring MessageSource configured at I18nConfig with SessionLocaleResolver +- Param name: lang +- Existing: messages.properties (fallback), messages_zh_CN.properties (56 keys) +- Miniapp: messages.properties (46 keys) + +### Design +- Create messages_en_US.properties and messages_vi_VN.properties in both main app and miniapp +- Translate all 56+ keys per language +- No code changes needed Spring already supports this via MessageUtils.message(key, args) + +--- + +## [S2] Database Dictionary Multi-Language + +### Current State +- sys_dict_data table with fields: dictCode, dictSort, dictLabel, dictValue, dictType, cssClass, listClass, isDefault, status, pyStr +- 124+ Java files reference SysDictData and DictUtils + +### Design +- Flyway migration: ADD COLUMN dict_value_en VARCHAR(200), dict_value_vi VARCHAR(200) +- Entity: Add dictValueEn, dictValueVi fields to SysDictData.java +- Service: Update DictUtils.getDictLabel() to return locale-aware label +- Query fallback: if target language field is null use dictLabel (Chinese) +- Management UI: Add en/vi input fields to dict data edit dialog + +--- + +## [S3] Frontend i18n + +### Current State +- 724 Vue files with hardcoded Chinese text +- Element Plus hardcoded to zhCn in main.js:120 +- No vue-i18n dependency +- No i18n directory structure + +### Design +- Install vue-i18n@latest (v11, Composition API mode) +- Directory: src/i18n/ with index.js + locales/{zhCN,enUS,viVN}.json +- Language switching: Cookie + localStorage + user preference +- Component: LanguageSwitcher dropdown in navbar +- Element Plus: Dynamic locale switching via ElLocale.use() +- VXE Table: Dynamic locale via VxeUI.setLang() +- Extraction: Node.js script to scan all .vue/.js for Chinese text +- Migration: Module-by-module replacement of hardcoded Chinese with $t(key) + +### JSON Structure +nav.* Navigation menu labels +common.* Buttons, labels, messages (shared) +login.* Login page +dict.* Dictionary values (gender, status, etc.) +module.* Business module specific (registration, pharmacy, etc.) + +--- + +## [S4] Dictionary Management UI + +- Add multilanguage tab to src/views/system/dict/data.vue +- Input fields for dict_value_en and dict_value_vi +- Save to backend via existing dict update API extended with new fields + +--- + +## [S5] Testing + +### Backend +- mvn clean compile -DskipTests BUILD SUCCESS +- mvn test all tests pass +- API test: curl -H Accept-Language: en returns English messages + +### Frontend +- npm run build:dev BUILD SUCCESS +- npm run lint no errors +- Manual: Switch language all UI text changes refresh persists + +--- + +## Execution Preference + +execution-style: subagent Each task executed by a fresh subagent.