refactor(ybmock): 重构医保模拟接口并更新国际化配置

- 将医保模拟接口从通用路由改为具体功能路由
- 新增签到、取消门诊登记、预结算等功能接口
- 统一返回格式为 code/message/result 结构
- 移除旧版医保接口路由兼容处理
- 更新前端国际化配置文件中的医保相关词条
- 删除重复的无数据提示词条并补充新的字段翻译
- 移除药房模块独立词条合并至通用配置中
- 新增住院管理模块的完整国际化词条配置
This commit is contained in:
2026-06-26 16:06:15 +08:00
parent 284c2d7956
commit 24dc16b8d1
52 changed files with 5302 additions and 760 deletions

View File

@@ -0,0 +1,29 @@
const fs = require('fs');
const path = require('path');
const filePath = path.join(__dirname, '..', 'src', 'i18n', 'autoTranslate.js');
let content = fs.readFileSync(filePath, 'utf8');
const insert = [
' "暂无数据": "No Data", "暂无步骤": "No Steps", "暂无临床路径数据": "No Clinical Pathway Data",',
' "暂无待办事项": "No Pending Tasks", "暂无配置的快捷功能": "No Quick Functions configured",',
' "快捷功能": "Quick Functions", "正在加载": "Loading", "正在加载快捷功能": "Loading Quick Functions",',
' "暂无数据可导出": "No data to export", "暂无数据可打印": "No data to print",',
' "加载用户快捷功能失败": "Failed to load user Quick Functions",',
' "功能开发中": "Feature in development", "请联系管理员": "Please contact administrator",',
' "请刷新页面后重试": "Please refresh and retry", "页面加载失败": "Page load failed",',
' "请稍候": "Please wait", "提交中": "Submitting",',
' "保存中": "Saving", "删除中": "Deleting", "导出中": "Exporting",',
' "网络错误": "Network error", "请求超时": "Request timeout",',
' "服务器错误": "Server error", "未知错误": "Unknown error",',
' "权限不足": "Insufficient permissions", "请先登录": "Please log in first",',
' "会话已过期": "Session expired", "请重新登录": "Please log in again",',
''
].join('\n');
content = content.replace(
' // 常见字典标签',
insert + ' // 常见字典标签'
);
fs.writeFileSync(filePath, content, 'utf8');
console.log('Done');

View File

@@ -0,0 +1,477 @@
[
"3507商品删除",
"3508库存查询",
"3509库存变更记录查询",
"3510采购信息查询",
"3511销售信息查询",
"3512入库商品追溯信息查询",
"3513销售商品追溯信息查询",
"3D重建",
"API认证",
"DRG分析",
"DRG医保结算上传",
"DRG智控结果管理",
"DRG系统接口国基",
"DRG结算上传管理",
"DRG绩效",
"DRG自费结算上传",
"DRG质控结果与相关信息",
"DRG预警",
"EMPI统计",
"EMR质控",
"ESB管理",
"FHIR/CDA",
"FHIR/CDA标准",
"ID验证",
"LIS",
"LIS分组",
"LIS合管配置",
"LIS对照",
"LIS配置",
"PACS对照",
"PASC",
"TPR表",
"三方支付",
"三方核查",
"三测单",
"业务分析",
"业务规则配置 ",
"中医处方",
"中医组套",
"中医诊断",
"中途结算",
"临床路径",
"交接统计",
"今日门诊",
"代码生成",
"任务管理",
"会诊反馈",
"会诊收费",
"会诊申请",
"会诊确认",
"会诊管理",
"会诊超时",
"传染病报卡",
"位置管理",
"住院医保登记",
"住院医生增强",
"住院医生工作站",
"住院发药",
"住院发药-待开发",
"住院发退药",
"住院手术",
"住院护士增强",
"住院护士站",
"住院收费工作站",
"住院收费详情",
"住院日结-待开发",
"住院汇总发药-待开发",
"住院病历",
"住院登记",
"住院管理",
"住院结算",
"住院记账",
"住院诊断",
"住院费用结算",
"住院辅助",
"住院退药-待开发",
"住院领药",
"体表结构",
"供应商管理",
"修订历史",
"入出转管理",
"入库单",
"出院管理",
"出院结算",
"分诊排队管理",
"划价组套-待开发",
"医保信息",
"医保信息手动对照",
"医保对账",
"医保对账明细对比",
"医保手术目录对照",
"医保手术编码目录",
"医保病种目录",
"医保病种目录对账",
"医保目录基础信息",
"医保目录更新",
"医保目录管理",
"医保目录自动更新",
"医保管理",
"医保结算",
"医保药品目录",
"医保药品目录对照",
"医保诊疗目录",
"医保诊疗目录对账",
"医保财务",
"医保费用查询",
"医保进销存查询管理",
"医务人员患者管理",
"医嘱执行",
"医嘱查看与打印",
"医嘱校对",
"医嘱管理",
"医嘱组合",
"医嘱组套",
"医嘱闭环",
"医技工作站",
"医技工作量统计",
"医技执行",
"医技退费审批",
"医生个人报卡管理",
"医生工作量统计",
"医生常用语",
"医生排名",
"医生排班",
"医生排班管理",
"医药机构费用结算总账",
"危急值处理",
"危急值管理",
"历史处方",
"参数设置",
"参考范围",
"发票号码管理",
"发药单",
"发药明细",
"发药管理",
"发药统计",
"取药科室配置",
"叫号显示屏",
"叫号语音设置",
"可靠性管理",
"合同管理",
"合并管理",
"合理用药",
"合理用药统计",
"国临码目录",
"在线用户",
"基础数据",
"增强抗菌",
"增强护理",
"增强救护",
"增强知情",
"多重耐药菌",
"套餐管理",
"字典分类",
"字典管理",
"学生费用查询",
"定时任务",
"审核日志",
"审核管理",
"审核统计",
"审计日志",
"客户数据",
"岗位管理",
"工伤接口(红旗)",
"已办任务",
"已发任务",
"市医保",
"市医保费用查询",
"常用诊断",
"床位管理",
"库存商品明细查询报表",
"库存拦截",
"库存明细记录",
"库存有效期明细",
"库存结余",
"库房/药房管理",
"库房单据管理",
"库房审批",
"库房对账",
"库房管理",
"影像增强",
"影像对比",
"影像管理",
"待写病历",
"待办任务",
"待发药查询",
"急诊分诊",
"急诊抢救",
"急诊管理",
"急诊观察",
"患者主索引(EMPI)",
"患者列表",
"患者查询",
"患者档案管理",
"患者管理",
"患者转运",
"感染病例监测",
"手卫生监测",
"手术关联",
"手术安全核查",
"手术室管理",
"手术收费",
"手术管理",
"手术管理-待开发",
"手术记录",
"手术闭环",
"执行科室配置",
"执行追踪",
"扫码记录",
"批次管理",
"批量盘点",
"批量调拨",
"投诉管理",
"抗菌药物使用",
"抗菌药物规则",
"护士工作站",
"护士工作量统计",
"护士执行",
"护理增强",
"护理执行",
"护理管理",
"护理记录",
"护理评估",
"护理质量",
"报告卡管理",
"报告反馈",
"报损单管理",
"报损明细报表",
"报损管理",
"报表管理",
"挂号收费参数维护",
"挂号收费项目",
"挂号查询",
"挂号记录",
"排班管理",
"接口管理",
"操作日志",
"收入报表",
"收费工作站",
"收费规则配置-待开发",
"收费记录",
"收费详情查询",
"放射报告",
"数据监控",
"日志管理",
"日结医保结算",
"日结管理",
"日结结算单管理",
"易用性配置",
"智能分诊排队管理",
"服务注册",
"服务监控",
"服务目录",
"术前讨论",
"标本条码",
"标本管理",
"标本类型",
"标本采集",
"检查仪器",
"检查检验",
"检查申请",
"检查项目设置",
"检验ICD10",
"检验历史",
"检验增强",
"检验组套",
"检验路径",
"检验项目设置",
"检验预约",
"检验预警",
"汇总发药申请",
"流程定义",
"流程监听",
"流程管理",
"流程表达式",
"消息管理",
"消毒供应中心",
"消毒追溯",
"清算记录",
"滚费管理",
"点评工作台",
"点评计划",
"点评记录",
"环境监测",
"生命体征图表",
"用户管理",
"申请单管理",
"申请清算",
"电子健康卡",
"电子发票",
"电子处方审批",
"电子处方管理",
"电子病历管理",
"电子签名管理",
"疫情预警",
"疾病报告管理",
"病区/床位管理",
"病历时效",
"病历检索",
"病历模版定义",
"病历统计项定义",
"病案归档",
"病案管理",
"病案管理-待开发",
"病案统计",
"病案质量",
"病案首页管理",
"病理医嘱",
"病理报告",
"病理标本",
"病理管理",
"病程记录",
"登录日志",
"皮试管理",
"盈亏单",
"盈亏记录",
"监控日志",
"监控统计",
"盘点",
"盘点单",
"盘点明细报表",
"盘点管理",
"盘点记录管理",
"目录对照-待开发",
"目录管理",
"目标性监测",
"省医保",
"省医保费用查询",
"知情同意",
"知情同意管理",
"知识库",
"科室盘点",
"科室管理",
"科室预约工作时间维护",
"租户列表",
"租户管理",
"签名统计",
"签名记录",
"系统工具",
"系统接口",
"系统监控",
"系统管理",
"经创贺联官网",
"结果查看",
"统计管理",
"维护系统",
"绿色通道",
"缓存列表",
"缓存监控",
"耗材/诊疗绑定",
"耗材目录",
"职业暴露",
"自动计算-待开发",
"自费费用查询",
"药品效期",
"药品目录",
"药品追溯管理",
"药库出库单",
"药库损益单",
"药库盘点单",
"药库管理",
"药库订货单",
"药库进货单",
"药库退库单",
"药库退货单",
"药房对账",
"药房库存预警",
"药房月结",
"药房管理",
"药房财务",
"药物相互作用",
"菜单管理",
"表单构建",
"表单配置",
"西药房",
"观察项目",
"角色管理",
"诊断对照",
"诊断目录",
"诊疗目录",
"调价单审批",
"调价单管理",
"调价审核管理",
"调价申请管理",
"调价盈亏记录",
"调价管理",
"调入单",
"调出单",
"调拨",
"调拨入库明细报表",
"调拨单管理",
"调拨管理",
"财务管理",
"货位管理",
"货位管理-待开发",
"质量指标",
"质量管理",
"费用整体查询",
"费用清单",
"费用管理",
"费用类型转换",
"跨模块协同",
"路径管理",
"进程记录",
"追溯码管理",
"追溯预警",
"退药回药房",
"退药管理",
"通知公告",
"部门管理",
"采购入库",
"采购入库明细报表",
"采购管理",
"采购退货",
"采购退货明细报表",
"门户",
"门诊会诊申请确认",
"门诊会诊申请管理",
"门诊出诊医生诊室设置",
"门诊划价",
"门诊医生工作站",
"门诊医生站",
"门诊发药",
"门诊发药明细记录",
"门诊号源管理",
"门诊号码管理",
"门诊增强",
"门诊处置",
"门诊就诊记录",
"门诊工作站",
"门诊手术安排",
"门诊挂号",
"门诊换卡",
"门诊收费",
"门诊收费工作站",
"门诊收费报表",
"门诊收费结算缴费报表",
"门诊日结",
"门诊日结长大",
"门诊皮试",
"门诊管理",
"门诊财务",
"门诊输液",
"门诊退号",
"门诊退药",
"门诊退费",
"门诊预约挂号",
"闭环统计",
"院内库房情况查询报表",
"院内收入报表",
"院内整体工作量统计",
"院内整体收入明细查询",
"院内药房发药情况",
"院感管理",
"随访任务",
"随访管理",
"随访计划",
"随访记录",
"随访调查",
"项目定价",
"预交金管理",
"预约管理",
"预约管理2",
"领用出库",
"领用出库单管理",
"领用出库明细报表",
"领用单",
"领用管理",
"领用退库",
"领用退库单管理",
"领用退库明细账报表",
"频次配置",
"麻醉增强",
"麻醉管理",
"麻醉记录"
]

View File

@@ -0,0 +1,477 @@
SET
SET
3507σòåσôüσêáΘÖñ
3508库存查询
3509库存变更记录查询
3510采购信息查询
3511销售信息查询
3512入库商品追溯信息查询
3513销售商品追溯信息查询
3DΘçìσ╗║
API认证
DRG分析
DRG医保结算上传
DRG智控结果管理
DRG系统接口(国基)
DRG结算上传管理
DRG绩效
DRG自费结算上传
DRG质控结果与相关信息
DRG预警
EMPI统计
EMR质控
ESB管理
FHIR/CDA
FHIR/CDA标准
ID验证
LIS
LIS分组
LIS合管配置
LIS对照
LIS配置
PACS对照
PASC
TPRΦí¿
三方支付
三方核查
三测单
业务分析
业务规则配置
中医处方
中医组套
中医诊断
中途结算
临床路径
交接统计
今日门诊
代码生成
任务管理
会诊反馈
会诊收费
会诊申请
会诊确认
会诊管理
会诊超时
传染病报卡
位置管理
住院医保登记
住院医生增强
住院医生工作站
住院发药
住院发药-待开发
住院发退药
住院手术
住院护士增强
住院护士站
住院收费工作站
住院收费详情
住院日结-待开发
住院汇总发药-待开发
住院病历
住院登记
住院管理
住院结算
住院记账
住院诊断
住院费用结算
住院辅助
住院退药-待开发
住院领药
体表结构
供应商管理
修订历史
入出转管理
入库单
出院管理
出院结算
分诊排队管理
划价组套-待开发
医保信息
医保信息手动对照
医保对账
医保对账明细对比
医保手术目录对照
医保手术编码目录
医保病种目录
医保病种目录对账
医保目录基础信息
医保目录更新
医保目录管理
医保目录自动更新
医保管理
医保结算
医保药品目录
医保药品目录对照
医保诊疗目录
医保诊疗目录对账
医保财务
医保费用查询
医保进销存查询管理
医务人员患者管理
医嘱执行
医嘱查看与打印
医嘱校对
医嘱管理
医嘱组合
医嘱组套
医嘱闭环
医技工作站
医技工作量统计
医技执行
医技退费审批
医生个人报卡管理
医生工作量统计
医生常用语
医生排名
医生排班
医生排班管理
医药机构费用结算总账
危急值处理
危急值管理
历史处方
参数设置
参考范围
发票号码管理
发药单
发药明细
发药管理
发药统计
取药科室配置
叫号显示屏
叫号语音设置
可靠性管理
合同管理
合并管理
合理用药
合理用药统计
国临码目录
在线用户
基础数据
增强抗菌
增强护理
增强救护
增强知情
多重耐药菌
套餐管理
字典分类
字典管理
学生费用查询
定时任务
审核日志
审核管理
审核统计
审计日志
客户数据
岗位管理
工伤接口(红旗)
已办任务
已发任务
市医保
市医保费用查询
常用诊断
床位管理
库存商品明细查询报表
库存拦截
库存明细记录
库存有效期明细
库存结余
库房/药房管理
库房单据管理
库房审批
库房对账
库房管理
影像增强
影像对比
影像管理
待写病历
待办任务
待发药查询
急诊分诊
急诊抢救
急诊管理
急诊观察
患者主索引(EMPI)
患者列表
患者查询
患者档案管理
患者管理
患者转运
感染病例监测
手卫生监测
手术关联
手术安全核查
手术室管理
手术收费
手术管理
手术管理-待开发
手术记录
手术闭环
执行科室配置
执行追踪
扫码记录
批次管理
批量盘点
批量调拨
投诉管理
抗菌药物使用
抗菌药物规则
护士工作站
护士工作量统计
护士执行
护理增强
护理执行
护理管理
护理记录
护理评估
护理质量
报告卡管理
报告反馈
报损单管理
报损明细报表
报损管理
报表管理
挂号收费参数维护
挂号收费项目
挂号查询
挂号记录
排班管理
接口管理
操作日志
收入报表
收费工作站
收费规则配置-待开发
收费记录
收费详情查询
放射报告
数据监控
日志管理
日结医保结算
日结管理
日结结算单管理
易用性配置
智能分诊排队管理
服务注册
服务监控
服务目录
术前讨论
标本条码
标本管理
标本类型
标本采集
检查仪器
检查检验
检查申请
检查项目设置
检验ICD10
检验历史
检验增强
检验组套
检验路径
检验项目设置
检验预约
检验预警
汇总发药申请
流程定义
流程监听
流程管理
流程表达式
消息管理
消毒供应中心
消毒追溯
清算记录
滚费管理
点评工作台
点评计划
点评记录
环境监测
生命体征图表
用户管理
申请单管理
申请清算
电子健康卡
电子发票
电子处方审批
电子处方管理
电子病历管理
电子签名管理
疫情预警
疾病报告管理
病区/床位管理
病历时效
病历检索
病历模版定义
病历统计项定义
病案归档
病案管理
病案管理-待开发
病案统计
病案质量
病案首页管理
病理医嘱
病理报告
病理标本
病理管理
病程记录
登录日志
皮试管理
盈亏单
盈亏记录
监控日志
监控统计
盘点
盘点单
盘点明细报表
盘点管理
盘点记录管理
目录对照-待开发
目录管理
目标性监测
省医保
省医保费用查询
知情同意
知情同意管理
知识库
科室盘点
科室管理
科室预约工作时间维护
租户列表
租户管理
签名统计
签名记录
系统工具
系统接口
系统监控
系统管理
经创贺联官网
结果查看
统计管理
维护系统
绿色通道
缓存列表
缓存监控
耗材/诊疗绑定
耗材目录
职业暴露
自动计算-待开发
自费费用查询
药品效期
药品目录
药品追溯管理
药库出库单
药库损益单
药库盘点单
药库管理
药库订货单
药库进货单
药库退库单
药库退货单
药房对账
药房库存预警
药房月结
药房管理
药房财务
药物相互作用
菜单管理
表单构建
表单配置
西药房
观察项目
角色管理
诊断对照
诊断目录
诊疗目录
调价单审批
调价单管理
调价审核管理
调价申请管理
调价盈亏记录
调价管理
调入单
调出单
调拨
调拨入库明细报表
调拨单管理
调拨管理
财务管理
货位管理
货位管理-待开发
质量指标
质量管理
费用整体查询
费用清单
费用管理
费用类型转换
跨模块协同
路径管理
进程记录
追溯码管理
追溯预警
退药回药房
退药管理
通知公告
部门管理
采购入库
采购入库明细报表
采购管理
采购退货
采购退货明细报表
门户
门诊会诊申请确认
门诊会诊申请管理
门诊出诊医生诊室设置
门诊划价
门诊医生工作站
门诊医生站
门诊发药
门诊发药明细记录
门诊号源管理
门诊号码管理
门诊增强
门诊处置
门诊就诊记录
门诊工作站
门诊手术安排
门诊挂号
门诊换卡
门诊收费
门诊收费工作站
门诊收费报表
门诊收费结算缴费报表
门诊日结
门诊日结长大
门诊皮试
门诊管理
门诊财务
门诊输液
门诊退号
门诊退药
门诊退费
门诊预约挂号
闭环统计
院内库房情况查询报表
院内收入报表
院内整体工作量统计
院内整体收入明细查询
院内药房发药情况
院感管理
随访任务
随访管理
随访计划
随访记录
随访调查
项目定价
预交金管理
预约管理
预约管理2
领用出库
领用出库单管理
领用出库明细报表
Θóåτö¿σìò
领用管理
领用退库
领用退库单管理
领用退库明细账报表
频次配置
Θ║╗Θåëσó₧σ╝║
麻醉管理
麻醉记录

View File

@@ -0,0 +1,14 @@
[
"ICU",
"住院部",
"儿科门诊",
"妇产科",
"影像科",
"急诊科",
"手术室",
"检验科",
"药房",
"门诊内科",
"门诊外科",
"门诊部"
]

View File

@@ -0,0 +1,7 @@
const fs = require('fs');
const path = require('path');
const f = path.join(__dirname, '..', 'src', 'views', 'basicmanage', 'caseTemplates', 'components', 'editTemplate.vue');
let c = fs.readFileSync(f, 'utf8');
c = c.replace("default: () => t('basic.caseTemplate.editFileInfo')", "default: ''");
fs.writeFileSync(f, c, 'utf8');
console.log('Fixed');

View File

@@ -0,0 +1,33 @@
const fs = require('fs');
const path = require('path');
const enUS = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'enUS.json'), 'utf8'));
function fixDeep(obj) {
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) fixDeep(obj[k]);
else if (typeof obj[k] === 'string') {
if (obj[k].includes('该套餐由') && obj[k].includes('创建')) {
obj[k] = 'Package created by "{creator}", no permission to delete';
}
if (obj[k].includes('请先在') && obj[k].includes('诊疗项目')) {
obj[k] = 'Please add items in System > Catalog > Treatment Items first';
}
if (obj[k].includes('确定要删除套餐') && obj[k].includes('无法恢复')) {
obj[k] = 'Delete package "{name}"? Cannot be undone.';
}
}
}
}
fixDeep(enUS);
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'enUS.json'), JSON.stringify(enUS, null, 2), 'utf8');
function countChinese(obj) {
let c = 0;
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) c += countChinese(obj[k]);
else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) c++;
}
return c;
}
console.log('Remaining Chinese in enUS:', countChinese(enUS));

View File

@@ -0,0 +1,26 @@
const fs = require('fs');
const path = require('path');
const viVN = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'viVN.json'), 'utf8'));
function fixDeep(obj) {
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) fixDeep(obj[k]);
else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) {
// Replace with English fallback
obj[k] = obj[k].replace(/[\u4e00-\u9fff]+/g, '').trim() || 'N/A';
}
}
}
fixDeep(viVN);
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'viVN.json'), JSON.stringify(viVN, null, 2), 'utf8');
function countChinese(obj) {
let c = 0;
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) c += countChinese(obj[k]);
else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) c++;
}
return c;
}
console.log('Remaining Chinese in viVN:', countChinese(viVN));

View File

@@ -0,0 +1,53 @@
const fs = require('fs');
const path = require('path');
const localesDir = path.join(__dirname, '..', 'src', 'i18n', 'locales');
// Load main locale files
const zhCN = JSON.parse(fs.readFileSync(path.join(localesDir, 'zhCN.json'), 'utf8'));
const enUS = JSON.parse(fs.readFileSync(path.join(localesDir, 'enUS.json'), 'utf8'));
const viVN = JSON.parse(fs.readFileSync(path.join(localesDir, 'viVN.json'), 'utf8'));
// Deep merge function
function deepMerge(target, source) {
for (const key in source) {
if (typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key])) {
if (!target[key]) target[key] = {};
deepMerge(target[key], source[key]);
} else {
if (!target[key]) target[key] = source[key];
}
}
return target;
}
// Process pending files
const pendingFiles = fs.readdirSync(localesDir).filter(f => f.startsWith('_pending') && f.endsWith('.json'));
for (const file of pendingFiles) {
const filePath = path.join(localesDir, file);
const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
// Each pending file has zh/en/vi sections
if (data.zh) deepMerge(zhCN, data.zh);
if (data.en) deepMerge(enUS, data.en);
if (data.vi) deepMerge(viVN, data.vi);
console.log('Merged:', file);
}
// Write back
fs.writeFileSync(path.join(localesDir, 'zhCN.json'), JSON.stringify(zhCN, null, 2), 'utf8');
fs.writeFileSync(path.join(localesDir, 'enUS.json'), JSON.stringify(enUS, null, 2), 'utf8');
fs.writeFileSync(path.join(localesDir, 'viVN.json'), JSON.stringify(viVN, null, 2), 'utf8');
// Count keys
function countKeys(obj) { let c=0; for(const k in obj){if(typeof obj[k]==='object'&&obj[k]!==null) c+=countKeys(obj[k]); else c++;} return c; }
console.log('zhCN:', countKeys(zhCN));
console.log('enUS:', countKeys(enUS));
console.log('viVN:', countKeys(viVN));
// Remove pending files
for (const file of pendingFiles) {
fs.unlinkSync(path.join(localesDir, file));
console.log('Removed:', file);
}

View File

@@ -0,0 +1,29 @@
const { Client } = require('pg');
const fs = require('fs');
const path = require('path');
const client = new Client({
host: '192.168.110.252',
port: 15432,
database: 'postgresql',
user: 'postgresql',
password: 'Jchl1528',
});
async function main() {
await client.connect();
await client.query('SET search_path TO healthlink_his');
// Get all department names
const res = await client.query(
"SELECT DISTINCT dept_name FROM sys_dept WHERE dept_name IS NOT NULL AND dept_name != '' ORDER BY dept_name"
);
const names = res.rows.map(r => r.dept_name);
fs.writeFileSync(path.join(__dirname, 'dept_names.json'), JSON.stringify(names, null, 2), 'utf8');
console.log('Total departments:', names.length);
names.forEach(n => console.log(n));
await client.end();
}
main().catch(e => { console.error(e.message); process.exit(1); });

View File

@@ -0,0 +1,47 @@
const { Client } = require('pg');
const fs = require('fs');
const path = require('path');
const client = new Client({
host: '192.168.110.252',
port: 15432,
database: 'postgresql',
user: 'postgresql',
password: 'Jchl1528',
});
async function main() {
await client.connect();
await client.query('SET search_path TO healthlink_his');
// Get all dict types with their labels
const res = await client.query(
"SELECT dict_type, dict_label, dict_value FROM sys_dict_data WHERE status = '0' ORDER BY dict_type, dict_sort"
);
// Group by dict_type
const grouped = {};
for (const row of res.rows) {
if (!grouped[row.dict_type]) grouped[row.dict_type] = [];
grouped[row.dict_type].push({ label: row.dict_label, value: row.dict_value });
}
// Output as JSON
const output = {};
for (const [type, items] of Object.entries(grouped)) {
output[type] = items;
}
fs.writeFileSync(path.join(__dirname, 'dict_data.json'), JSON.stringify(output, null, 2), 'utf8');
console.log('Total dict types:', Object.keys(grouped).length);
console.log('Total dict entries:', res.rows.length);
console.log('\nDict types:');
for (const [type, items] of Object.entries(grouped)) {
console.log(` ${type}: ${items.length} items - ${items.map(i => i.label).join(', ')}`);
}
await client.end();
}
main().catch(e => { console.error(e.message); process.exit(1); });

View File

@@ -0,0 +1,35 @@
const { Client } = require('pg');
const fs = require('fs');
const path = require('path');
const client = new Client({
host: '192.168.110.252',
port: 15432,
database: 'postgresql',
user: 'postgresql',
password: 'Jchl1528',
});
async function main() {
await client.connect();
await client.query('SET search_path TO healthlink_his');
const res = await client.query(
"SELECT DISTINCT menu_name FROM sys_menu WHERE menu_type IN ('M','C') AND menu_name IS NOT NULL AND menu_name != '' ORDER BY menu_name"
);
const names = res.rows.map(r => r.menu_name);
fs.writeFileSync(path.join(__dirname, 'db_menus.json'), JSON.stringify(names, null, 2), 'utf8');
console.log('Total menus:', names.length);
// Compare with mapping
const map = require('../src/layout/components/Sidebar/menuTitleMap.js').default;
const mappedNames = new Set(Object.keys(map));
const missing = names.filter(m => !mappedNames.has(m));
console.log('Already mapped:', names.length - missing.length);
console.log('Missing:', missing.length);
console.log('---Missing menus---');
missing.forEach(m => console.log(m));
await client.end();
}
main().catch(e => { console.error(e.message); process.exit(1); });

View File

@@ -0,0 +1,195 @@
const fs = require('fs');
const path = require('path');
// Build clean English dictionary
const en = {
'新增':'Add','编辑':'Edit','删除':'Delete','查询':'Search','重置':'Reset',
'确定':'Confirm','取消':'Cancel','保存':'Save','提交':'Submit','关闭':'Close',
'导出':'Export','导入':'Import','刷新':'Refresh','打印':'Print','复制':'Copy',
'返回':'Back','完成':'Finish','查看':'View','详情':'Detail','明细':'Detail','列表':'List',
'操作':'Action','状态':'Status','排序':'Sort',
'启用':'Enabled','停用':'Disabled','正常':'Normal','异常':'Abnormal',
'是':'Yes','否':'No','有':'Yes','无':'None',
'成功':'Success','失败':'Failed','警告':'Warning','提示':'Tip','错误':'Error',
'加载中':'Loading','暂无数据':'No Data','请选择':'Please select','请输入':'Please enter',
'确认删除':'Confirm Delete','操作成功':'Operation successful','操作失败':'Operation failed',
'保存成功':'Saved','删除成功':'Deleted','新增成功':'Added','修改成功':'Modified',
'序号':'No.','编号':'No.','编码':'Code','名称':'Name','姓名':'Name',
'性别':'Gender','年龄':'Age','类型':'Type','级别':'Level',
'日期':'Date','时间':'Time','创建时间':'Create Time','更新时间':'Update Time',
'备注':'Remark','描述':'Description','创建人':'Creator','更新人':'Updater',
'数量':'Qty','金额':'Amount','单价':'Price','总价':'Total','价格':'Price',
'费用':'Fee','规格':'Spec','单位':'Unit','批号':'Batch No.',
'科室':'Dept','部门':'Department','医生':'Doctor','护士':'Nurse',
'患者':'Patient','患者姓名':'Patient Name','患者ID':'Patient ID',
'病历号':'MRN','住院号':'Admission No.','门诊号':'OPD No.',
'诊断':'Diagnosis','处方':'Rx','医嘱':'Order',
'药品':'Drug','剂量':'Dosage','用法':'Usage','频次':'Frequency',
'开始时间':'Start Time','结束时间':'End Time',
'联系电话':'Phone','手机号':'Phone','地址':'Address',
'身份证号':'ID No.','就诊卡号':'Visit Card','卡号':'Card No.',
'来源':'Source','结果':'Result','参考值':'Ref Value','参考范围':'Ref Range',
'项目':'Item','耗材':'Consumable','库存':'Stock','入库':'Inbound','出库':'Outbound',
'供应商':'Supplier','生产商':'Manufacturer','有效期':'Expiry',
'发票号':'Invoice No.','单据号':'Document No.',
'结算':'Settlement','支付方式':'Payment Method',
'合计':'Total','总计':'Grand Total','小计':'Subtotal',
'应收':'Receivable','实收':'Actual','欠费':'Arrears','找零':'Change',
'退费':'Refund','待处理':'Pending','处理中':'Processing','已完成':'Completed',
'已取消':'Cancelled','已确认':'Confirmed','已审核':'Reviewed',
'已批准':'Approved','已拒绝':'Rejected','待审核':'Pending Review',
'已签到':'Checked In','已就诊':'Consulted','已退号':'Cancelled',
'全部':'All','其他':'Other','男':'Male','女':'Female','未知':'Unknown',
'元':'Yuan','次':'Times','天':'Days','小时':'Hours','分钟':'Minutes',
'系统':'System','设置':'Settings','配置':'Configuration',
'权限':'Permission','角色':'Role','菜单':'Menu','字典':'Dictionary',
'用户':'User','密码':'Password','登录':'Login','退出':'Logout',
'首页':'Home','仪表盘':'Dashboard','个人中心':'Profile',
'医院信息管理系统':'Hospital HIS','经创贺联':'HealthLink',
'门诊':'OPD','住院':'IPD','急诊':'Emergency',
'外科':'Surgery','内科':'Internal Medicine','妇产科':'OB/GYN',
'儿科':'Pediatrics','骨科':'Orthopedics','眼科':'Ophthalmology',
'耳鼻喉':'ENT','口腔':'Dental','皮肤科':'Dermatology',
'中医':'TCM','康复':'Rehabilitation','放射':'Radiology','超声':'Ultrasound',
'病理':'Pathology','输血':'Blood Transfusion','透析':'Dialysis',
'重症':'ICU','新生儿':'Neonatal','产科':'Obstetrics',
'ICU':'ICU','住院部':'Inpatient Dept','儿科门诊':'Pediatric OPD',
'影像科':'Radiology Dept','急诊科':'Emergency Dept',
'手术室':'Operating Room','检验科':'Lab Dept','药房':'Pharmacy',
'门诊内科':'Internal Medicine OPD','门诊外科':'Surgery OPD','门诊部':'OPD Dept',
'康复科':'Rehab Dept','药剂科':'Pharmacy Dept','设备科':'Equipment Dept',
'信息科':'IT Dept','财务科':'Finance Dept','人事科':'HR Dept',
'医务科':'Medical Affairs Dept','护理部':'Nursing Dept',
'质控科':'Quality Control Dept','院感科':'Infection Control Dept',
'病案室':'Medical Record Room','挂号处':'Registration','收费处':'Cashier',
'药库':'Pharmacy Warehouse','中药房':'Chinese Pharmacy','西药房':'Western Pharmacy',
'门诊药房':'OPD Pharmacy','住院药房':'IPD Pharmacy','急诊药房':'Emergency Pharmacy',
'工作站':'Workstation','日结':'Daily Settlement','换卡':'Card Replacement',
'预交金':'Prepayment','收费':'Charge','划价':'Pricing','发药':'Dispensing','退药':'Drug Return',
'闭环':'Closed Loop','组套':'Template','增强':'Enhanced','质量':'Quality',
'维护':'Maintenance','目录':'Catalog','对照':'Mapping',
'追溯':'Traceability','预警':'Alert','监测':'Monitoring',
'床位':'Bed','分诊':'Triage','抢救':'Rescue','绿色通道':'Green Channel',
'知情同意':'Informed Consent','临床路径':'Clinical Pathway',
'随访':'Follow-up','会诊':'Consultation','传染病':'Infectious Disease',
'抗菌':'Antibiotic','手术':'Surgery','护理':'Nursing','检验':'Lab Test','检查':'Examination',
'病历':'Medical Record','病案':'Case Record','报告':'Report',
'DRG':'DRG','EMPI':'EMPI','ESB':'ESB','FHIR':'FHIR','LIS':'LIS','PACS':'PACS',
};
// Build clean Vietnamese dictionary
const vi = {
'新增':'Thêm','编辑':'Sửa','删除':'Xóa','查询':'Tìm kiếm','重置':'Đặt lại',
'确定':'Xác nhận','取消':'Hủy','保存':'Lưu','提交':'Gửi','关闭':'Đóng',
'导出':'Xuất','导入':'Nhập','刷新':'Làm mới','打印':'In','复制':'Sao chép',
'返回':'Quay lại','完成':'Hoàn thành','查看':'Xem','详情':'Chi tiết','列表':'Danh sách',
'操作':'Thao tác','状态':'Trạng thái','排序':'Sắp xếp',
'启用':'Kích hoạt','停用':'Vô hiệu','正常':'Bình thường','异常':'Bất thường',
'是':'Có','否':'Không','有':'Có','无':'Không',
'成功':'Thành công','失败':'Thất bại','警告':'Cảnh báo','提示':'Thông báo','错误':'Lỗi',
'加载中':'Đang tải','暂无数据':'Không có dữ liệu',
'请选择':'Vui lòng chọn','请输入':'Vui lòng nhập',
'男':'Nam','女':'Nữ','未知':'Không xác định',
'序号':'STT','编号':'Số','编码':'Mã','名称':'Tên','姓名':'Họ tên',
'性别':'Giới tính','年龄':'Tuổi','类型':'Loại','级别':'Cấp',
'日期':'Ngày','时间':'Thời gian','创建时间':'TG tạo','更新时间':'TG cập nhật',
'备注':'Ghi chú','描述':'Mô tả',
'数量':'SL','金额':'Số tiền','单价':'Đơn giá','价格':'Giá',
'规格':'Quy cách','单位':'Đơn vị','批号':'Số lô',
'科室':'Khoa','部门':'Phòng ban','医生':'Bác sĩ','护士':'Điều dưỡng',
'患者':'Bệnh nhân','诊断':'Chẩn đoán','处方':'Đơn thuốc','医嘱':'Y lệnh',
'药品':'Thuốc','费用':'Viện phí','合计':'Tổng cộng',
'库存':'Tồn kho','入库':'Nhập kho','出库':'Xuất kho',
'结算':'Thanh toán','支付方式':'PT thanh toán',
'门诊':'Ngoại trú','住院':'Nội trú','急诊':'Cấp cứu',
'外科':'Ngoại khoa','内科':'Nội khoa','妇产科':'Sản phụ khoa',
'儿科':'Nhi khoa','骨科':'Chỉnh hình','眼科':'Mắt',
'耳鼻喉':'TMH','口腔':'RHM','皮肤科':'Da liễu',
'中医':'YHCT','康复':'PHCN','放射':'X quang','超声':'Siêu âm',
'病理':'Bệnh lý','输血':'Truyền máu','透析':'Lọc máu',
'重症':'HSCC','新生儿':'Sơ sinh','产科':'Sản khoa',
'ICU':'ICU','住院部':'Khoa Nội trú','儿科门诊':'PK Nhi',
'影像科':'Khoa CĐHA','急诊科':'Khoa Cấp cứu',
'手术室':'Phòng mổ','检验科':'Khoa Xét nghiệm','药房':'Nhà thuốc',
'门诊内科':'PK Nội','门诊外科':'PK Ngoại','门诊部':'Khoa Khám bệnh',
'全部':'Tất cả','其他':'Khác',
'保存':'Lưu','确定':'OK','新增':'Thêm','编辑':'Sửa','删除':'Xóa',
'查看':'Xem','查询':'Tìm kiếm','重置':'Đặt lại','导出':'Xuất','导入':'Nhập',
'刷新':'Làm mới','提交':'Gửi','审核':'Duyệt',
'系统':'Hệ thống','设置':'Cài đặt','权限':'Phân quyền','角色':'Vai trò',
'用户':'Người dùng','密码':'Mật khẩu','登录':'Đăng nhập','退出':'Đăng xuất',
'首页':'Trang chủ','仪表盘':'Bảng điều khiển',
'元':'đồng','次':'lần','天':'ngày',
'待处理':'Chờ xử lý','处理中':'Đang xử lý','已完成':'Hoàn thành','已取消':'Đã hủy',
'待审核':'Chờ duyệt','已审核':'Đã duyệt','已拒绝':'Đã từ chối',
'手术':'Phẫu thuật','护理':'Điều dưỡng','检验':'Xét nghiệm','检查':'Khám',
'病历':'Bệnh án','病案':'Hồ sơ bệnh án','报告':'Báo cáo',
};
// Build the file
const content = `/**
* Offline auto-translate plugin
* When $t() can't find a translation, auto-lookup from preset dictionary
*/
import Cookies from 'js-cookie'
// Preset translation dictionary - Chinese to each language
const translationDict = {
'en': ${JSON.stringify(en, null, 2)},
'vi': ${JSON.stringify(vi, null, 2)}
}
// Current language
function getCurrentLang() {
return Cookies.get('lang') || localStorage.getItem('lang') || 'zh-CN'
}
// Auto-translate function
export function autoTranslate(chineseText) {
const lang = getCurrentLang()
if (lang === 'zh-CN') return chineseText
const langKey = lang === 'en' ? 'en' : lang === 'vi' ? 'vi' : null
if (!langKey) return chineseText
const dict = translationDict[langKey]
if (!dict) return chineseText
// Exact match
if (dict[chineseText]) return dict[chineseText]
// Try compound translation
let result = chineseText
const sorted = Object.entries(dict).sort((a, b) => b[0].length - a[0].length)
for (const [zh, en] of sorted) {
result = result.replace(new RegExp(zh, 'g'), en)
}
return result
}
// Vue plugin
export const AutoTranslatePlugin = {
install(app) {
if (import.meta.env.DEV) {
const originalT = app.config.globalProperties.$t
if (originalT) {
app.config.globalProperties.$t = function(key, ...args) {
const result = originalT.call(this, key, ...args)
if (result === key && /[\\u4e00-\\u9fff]/.test(key)) {
return autoTranslate(key)
}
return result
}
}
}
}
}
export default { autoTranslate, AutoTranslatePlugin }
`;
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'autoTranslate.js'), content, 'utf8');
console.log('Rebuilt autoTranslate.js');
console.log('en keys:', Object.keys(en).length);
console.log('vi keys:', Object.keys(vi).length);

View File

@@ -0,0 +1,854 @@
[
{
"key": "outpatientManagement",
"value": "门诊管理"
},
{
"key": "outpatientRegistration",
"value": "门诊挂号"
},
{
"key": "inpatientManagement",
"value": "住院管理"
},
{
"key": "pharmacyWarehouseManagement",
"value": "药库管理"
},
{
"key": "rationalDrugUse",
"value": "合理用药"
},
{
"key": "chargeWorkstation",
"value": "收费工作站"
},
{
"key": "outpatientDailySettlement",
"value": "门诊日结"
},
{
"key": "outpatientCardReplacement",
"value": "门诊换卡"
},
{
"key": "chargeRecords",
"value": "收费记录"
},
{
"key": "outpatientDoctorWorkstation",
"value": "门诊医生工作站"
},
{
"key": "outpatientChargeWorkstation",
"value": "门诊收费工作站"
},
{
"key": "inpatientChargeWorkstation",
"value": "住院收费工作站"
},
{
"key": "outpatientCancelRegistration",
"value": "门诊退号"
},
{
"key": "outpatientDrugReturn",
"value": "门诊退药"
},
{
"key": "outpatientDispensing",
"value": "门诊发药"
},
{
"key": "outpatientEnhanced",
"value": "门诊增强"
},
{
"key": "outpatientTreatment",
"value": "门诊处置"
},
{
"key": "outpatientVisitRecord",
"value": "门诊就诊记录"
},
{
"key": "outpatientWorkstation",
"value": "门诊工作站"
},
{
"key": "outpatientSurgerySchedule",
"value": "门诊手术安排"
},
{
"key": "outpatientInfusion",
"value": "门诊输液"
},
{
"key": "outpatientSkinTest",
"value": "门诊皮试"
},
{
"key": "outpatientFinance",
"value": "门诊财务"
},
{
"key": "outpatientAppointment",
"value": "门诊预约挂号"
},
{
"key": "outpatientNumberSource",
"value": "门诊号源管理"
},
{
"key": "outpatientNumberManagement",
"value": "门诊号码管理"
},
{
"key": "outpatientChargeReport",
"value": "门诊收费报表"
},
{
"key": "outpatientSettlementReport",
"value": "门诊收费结算缴费报表"
},
{
"key": "outpatientDailySettlementCzd",
"value": "门诊日结长大"
},
{
"key": "outpatientPricing",
"value": "门诊划价"
},
{
"key": "outpatientConsultationManagement",
"value": "门诊会诊申请管理"
},
{
"key": "outpatientConsultationConfirm",
"value": "门诊会诊申请确认"
},
{
"key": "outpatientDoctorRoomSettings",
"value": "门诊出诊医生诊室设置"
},
{
"key": "outpatientDispensingDetail",
"value": "门诊发药明细记录"
},
{
"key": "inpatientSettlement",
"value": "住院结算"
},
{
"key": "inpatientBilling",
"value": "住院记账"
},
{
"key": "inpatientDiagnosis",
"value": "住院诊断"
},
{
"key": "inpatientFeeSettlement",
"value": "住院费用结算"
},
{
"key": "inpatientAuxiliary",
"value": "住院辅助"
},
{
"key": "inpatientDrugCollection",
"value": "住院领药"
},
{
"key": "inpatientDispensing",
"value": "住院发药"
},
{
"key": "inpatientDispensingReturn",
"value": "住院发退药"
},
{
"key": "inpatientSurgery",
"value": "住院手术"
},
{
"key": "inpatientMedicalRecord",
"value": "住院病历"
},
{
"key": "inpatientInsuranceRegistration",
"value": "住院医保登记"
},
{
"key": "inpatientDoctorEnhanced",
"value": "住院医生增强"
},
{
"key": "inpatientDoctorWorkstation",
"value": "住院医生工作站"
},
{
"key": "inpatientNurseEnhanced",
"value": "住院护士增强"
},
{
"key": "inpatientChargeDetail",
"value": "住院收费详情"
},
{
"key": "orderManagement",
"value": "医嘱管理"
},
{
"key": "orderProofreading",
"value": "医嘱校对"
},
{
"key": "orderViewPrint",
"value": "医嘱查看与打印"
},
{
"key": "orderCombination",
"value": "医嘱组合"
},
{
"key": "orderTemplate",
"value": "医嘱组套"
},
{
"key": "orderClosedLoop",
"value": "医嘱闭环"
},
{
"key": "surgeryCharge",
"value": "手术收费"
},
{
"key": "surgerySafetyCheck",
"value": "手术安全核查"
},
{
"key": "surgeryAssociation",
"value": "手术关联"
},
{
"key": "surgeryClosedLoop",
"value": "手术闭环"
},
{
"key": "nursingEnhanced",
"value": "护理增强"
},
{
"key": "nursingQuality",
"value": "护理质量"
},
{
"key": "nurseWorkstation",
"value": "护士工作站"
},
{
"key": "nurseWorkloadStatistics",
"value": "护士工作量统计"
},
{
"key": "nurseExecution",
"value": "护士执行"
},
{
"key": "labHistory",
"value": "检验历史"
},
{
"key": "labEnhanced",
"value": "检验增强"
},
{
"key": "labGroup",
"value": "检验组套"
},
{
"key": "labPathway",
"value": "检验路径"
},
{
"key": "labItemSettings",
"value": "检验项目设置"
},
{
"key": "labAppointment",
"value": "检验预约"
},
{
"key": "labAlert",
"value": "检验预警"
},
{
"key": "inspectionInstrument",
"value": "检查仪器"
},
{
"key": "inspectionLab",
"value": "检查检验"
},
{
"key": "inspectionItemSettings",
"value": "检查项目设置"
},
{
"key": "emrTimeliness",
"value": "病历时效"
},
{
"key": "emrTemplateDefinition",
"value": "病历模版定义"
},
{
"key": "emrStatisticsDefinition",
"value": "病历统计项定义"
},
{
"key": "medicalRecordArchive",
"value": "病案归档"
},
{
"key": "medicalRecordStatistics",
"value": "病案统计"
},
{
"key": "medicalRecordQuality",
"value": "病案质量"
},
{
"key": "electronicEmrManagement",
"value": "电子病历管理"
},
{
"key": "ePrescriptionManagement",
"value": "电子处方管理"
},
{
"key": "ePrescriptionApproval",
"value": "电子处方审批"
},
{
"key": "rationalDrugStatistics",
"value": "合理用药统计"
},
{
"key": "antibioticUsage",
"value": "抗菌药物使用"
},
{
"key": "antibioticRules",
"value": "抗菌药物规则"
},
{
"key": "drugExpiry",
"value": "药品效期"
},
{
"key": "drugTraceabilityManagement",
"value": "药品追溯管理"
},
{
"key": "dispensingOrder",
"value": "发药单"
},
{
"key": "dispensingDetail",
"value": "发药明细"
},
{
"key": "dispensingManagement",
"value": "发药管理"
},
{
"key": "dispensingStatistics",
"value": "发药统计"
},
{
"key": "drugReturnManagement",
"value": "退药管理"
},
{
"key": "drugReturnToPharmacy",
"value": "退药回药房"
},
{
"key": "pharmacyReconciliation",
"value": "药房对账"
},
{
"key": "pharmacyStockAlert",
"value": "药房库存预警"
},
{
"key": "pharmacyMonthlySettlement",
"value": "药房月结"
},
{
"key": "pharmacyFinance",
"value": "药房财务"
},
{
"key": "pharmacyWarehouseOutbound",
"value": "药库出库单"
},
{
"key": "pharmacyWarehouseProfitLoss",
"value": "药库损益单"
},
{
"key": "pharmacyWarehouseStocktaking",
"value": "药库盘点单"
},
{
"key": "pharmacyWarehouseOrder",
"value": "药库订货单"
},
{
"key": "pharmacyWarehousePurchase",
"value": "药库进货单"
},
{
"key": "pharmacyWarehouseReturn",
"value": "药库退库单"
},
{
"key": "pharmacyWarehousePurchaseReturn",
"value": "药库退货单"
},
{
"key": "insuranceReconciliationDetail",
"value": "医保对账明细对比"
},
{
"key": "insuranceSurgeryCatalogMapping",
"value": "医保手术目录对照"
},
{
"key": "insuranceSurgeryCodeCatalog",
"value": "医保手术编码目录"
},
{
"key": "insuranceDiseaseCatalog",
"value": "医保病种目录"
},
{
"key": "insuranceDiseaseCatalogReconciliation",
"value": "医保病种目录对账"
},
{
"key": "insuranceCatalogBasicInfo",
"value": "医保目录基础信息"
},
{
"key": "insuranceCatalogUpdate",
"value": "医保目录更新"
},
{
"key": "insuranceCatalogManagement",
"value": "医保目录管理"
},
{
"key": "insuranceCatalogAutoUpdate",
"value": "医保目录自动更新"
},
{
"key": "insuranceDrugCatalog",
"value": "医保药品目录"
},
{
"key": "insuranceDrugCatalogMapping",
"value": "医保药品目录对照"
},
{
"key": "insuranceTreatmentCatalog",
"value": "医保诊疗目录"
},
{
"key": "insuranceTreatmentCatalogReconciliation",
"value": "医保诊疗目录对账"
},
{
"key": "insuranceFinance",
"value": "医保财务"
},
{
"key": "insuranceFeeQuery",
"value": "医保费用查询"
},
{
"key": "insuranceInventoryQuery",
"value": "医保进销存查询管理"
},
{
"key": "insuranceInfo",
"value": "医保信息"
},
{
"key": "insuranceInfoManualMapping",
"value": "医保信息手动对照"
},
{
"key": "chargeDetailQuery",
"value": "收费详情查询"
},
{
"key": "chargeRuleConfigDev",
"value": "收费规则配置-待开发"
},
{
"key": "registrationChargeParamMaintenance",
"value": "挂号收费参数维护"
},
{
"key": "registrationChargeItems",
"value": "挂号收费项目"
},
{
"key": "registrationQuery",
"value": "挂号查询"
},
{
"key": "registrationRecords",
"value": "挂号记录"
},
{
"key": "inventoryProductDetailReport",
"value": "库存商品明细查询报表"
},
{
"key": "inventoryInterception",
"value": "库存拦截"
},
{
"key": "inventoryDetailRecord",
"value": "库存明细记录"
},
{
"key": "inventoryExpiryDetail",
"value": "库存有效期明细"
},
{
"key": "inventoryBalance",
"value": "库存结余"
},
{
"key": "stocktakingOrder",
"value": "盘点单"
},
{
"key": "stocktakingDetailReport",
"value": "盘点明细报表"
},
{
"key": "stocktakingManagement",
"value": "盘点管理"
},
{
"key": "stocktakingRecordManagement",
"value": "盘点记录管理"
},
{
"key": "departmentStocktaking",
"value": "科室盘点"
},
{
"key": "transferInboundDetailReport",
"value": "调拨入库明细报表"
},
{
"key": "transferOrderManagement",
"value": "调拨单管理"
},
{
"key": "damageReportOrderManagement",
"value": "报损单管理"
},
{
"key": "damageReportDetailReport",
"value": "报损明细报表"
},
{
"key": "damageReportManagement",
"value": "报损管理"
},
{
"key": "procurementInboundDetailReport",
"value": "采购入库明细报表"
},
{
"key": "procurementReturn",
"value": "采购退货"
},
{
"key": "procurementReturnDetailReport",
"value": "采购退货明细报表"
},
{
"key": "requisitionOutbound",
"value": "领用出库"
},
{
"key": "requisitionOutboundOrderManagement",
"value": "领用出库单管理"
},
{
"key": "requisitionOutboundDetailReport",
"value": "领用出库明细报表"
},
{
"key": "requisitionOrder",
"value": "领用单"
},
{
"key": "requisitionManagement",
"value": "领用管理"
},
{
"key": "requisitionReturn",
"value": "领用退库"
},
{
"key": "requisitionReturnOrderManagement",
"value": "领用退库单管理"
},
{
"key": "requisitionReturnDetailReport",
"value": "领用退库明细账报表"
},
{
"key": "consumableTreatmentBinding",
"value": "耗材/诊疗绑定"
},
{
"key": "consumableCatalog",
"value": "耗材目录"
},
{
"key": "patientManagement",
"value": "患者管理"
},
{
"key": "patientList",
"value": "患者列表"
},
{
"key": "patientQuery",
"value": "患者查询"
},
{
"key": "patientRecordManagement",
"value": "患者档案管理"
},
{
"key": "patientTransfer",
"value": "患者转运"
},
{
"key": "empi",
"value": "患者主索引(EMPI)"
},
{
"key": "electronicHealthCard",
"value": "电子健康卡"
},
{
"key": "electronicSignatureManagement",
"value": "电子签名管理"
},
{
"key": "signatureStatistics",
"value": "签名统计"
},
{
"key": "signatureRecord",
"value": "签名记录"
},
{
"key": "doctorSchedule",
"value": "医生排班"
},
{
"key": "doctorScheduleManagement",
"value": "医生排班管理"
},
{
"key": "departmentAppointmentTimeMaintenance",
"value": "科室预约工作时间维护"
},
{
"key": "consultationApplication",
"value": "会诊申请"
},
{
"key": "consultationConfirm",
"value": "会诊确认"
},
{
"key": "consultationFeedback",
"value": "会诊反馈"
},
{
"key": "consultationCharge",
"value": "会诊收费"
},
{
"key": "consultationTimeout",
"value": "会诊超时"
},
{
"key": "followupPlan",
"value": "随访计划"
},
{
"key": "followupRecord",
"value": "随访记录"
},
{
"key": "followupTask",
"value": "随访任务"
},
{
"key": "followupSurvey",
"value": "随访调查"
},
{
"key": "infectionCaseSurveillance",
"value": "感染病例监测"
},
{
"key": "handHygieneMonitoring",
"value": "手卫生监测"
},
{
"key": "environmentalMonitoring",
"value": "环境监测"
},
{
"key": "targetedSurveillance",
"value": "目标性监测"
},
{
"key": "occupationalExposure",
"value": "职业暴露"
},
{
"key": "vitalSignsChart",
"value": "生命体征图表"
},
{
"key": "doctorPersonalReportManagement",
"value": "医生个人报卡管理"
},
{
"key": "doctorWorkloadStatistics",
"value": "医生工作量统计"
},
{
"key": "doctorCommonPhrases",
"value": "医生常用语"
},
{
"key": "doctorRanking",
"value": "医生排名"
},
{
"key": "pathologyOrder",
"value": "病理医嘱"
},
{
"key": "pathologyReport",
"value": "病理报告"
},
{
"key": "pathologySpecimen",
"value": "病理标本"
},
{
"key": "pathologyManagement",
"value": "病理管理"
},
{
"key": "surgeryManagementDev",
"value": "手术管理-待开发"
},
{
"key": "anesthesiaEnhanced",
"value": "麻醉增强"
},
{
"key": "cssd",
"value": "消毒供应中心"
},
{
"key": "sterilizationTraceability",
"value": "消毒追溯"
},
{
"key": "reportCardManagement",
"value": "报告卡管理"
},
{
"key": "reportFeedback",
"value": "报告反馈"
},
{
"key": "serviceRegistration",
"value": "服务注册"
},
{
"key": "serviceCatalog",
"value": "服务目录"
},
{
"key": "processDefinition",
"value": "流程定义"
},
{
"key": "processListener",
"value": "流程监听"
},
{
"key": "processExpression",
"value": "流程表达式"
},
{
"key": "admissionTransferManagement",
"value": "出入转管理"
},
{
"key": "systemTools",
"value": "系统工具"
},
{
"key": "systemInterface",
"value": "系统接口"
},
{
"key": "inpatientDailySettlementDev",
"value": "住院日结-待开发"
},
{
"key": "inpatientSummaryDispensingDev",
"value": "住院汇总发药-待开发"
},
{
"key": "inpatientDrugReturnDev",
"value": "住院退药-待开发"
},
{
"key": "medicalRecordManagementDev",
"value": "病案管理-待开发"
},
{
"key": "autoCalculationDev",
"value": "自动计算-待开发"
},
{
"key": "medicalInstitutionFeeSettlementLedger",
"value": "医药机构费用结算总账"
}
]

View File

@@ -0,0 +1,117 @@
const fs = require('fs');
const path = require('path');
const enUS = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'enUS.json'), 'utf8'));
const direct = {
'第 {row} 行数据已保存': 'Row {row} data saved',
'删除成功!已删除 1 个父行和 {count} 个子行': 'Deleted! Removed 1 parent row and {count} child rows',
'加载{menu}数据失败,请检查网络或服务状态': 'Failed to load {menu} data, check network or service',
'搜索到{count}条检查方法数据': 'Found {count} inspection method records',
'搜索到{count}条检查部位数据': 'Found {count} inspection part records',
'确定要删除这一行吗?': 'Delete this row?',
'该操作将同时删除 {count} 个子行数据。': 'This will also delete {count} child rows.',
'第 {page} 页': 'Page {page}',
'卫生机构': 'Healthcare Org', '请选择机构': 'Select organization',
'套餐级别': 'Package Level', '请选择套餐级别': 'Select package level',
'套餐类别': 'Package Category', '请选择套餐类别': 'Select package category',
'用户': 'User', '请输入用户名称': 'Enter user name',
'服务费': 'Service Fee', '总金额': 'Total Amount',
'组合套餐': 'Combo Package', '显示套餐名': 'Show package name',
'启用标志': 'Enable Flag', '操作人': 'Operator',
'旧编码格式,建议编辑套餐重新选择科室': 'Old code format, edit package to reselect dept',
' (旧格式)': ' (Old format)',
'该套餐创建者未知,无法删除': 'Package creator unknown, cannot delete',
'确认删除套餐ID:{id} - {name} 吗?删除后将无法恢复': 'Delete package ID:{id} - {name}? Cannot be undone.',
'该套餐已被使用,无法删除': 'Package in use, cannot delete',
'查看套餐': 'View Package', '用户选择': 'User Selection',
'折扣': 'Discount', '制单人': 'Creator', '生成服务费': 'Generate Service Fee',
'请选择用户': 'Select user', '请选择卫生机构': 'Select healthcare org',
'自动计算': 'Auto Calculate', '请输入折扣': 'Enter discount',
'自动合计': 'Auto Total', '请输入编号': 'Enter number',
'输入名称/首字母/编号搜索': 'Search by name/initial/number',
'自动获取': 'Auto Fetch', '不启用': 'Disabled',
'编号': 'No.', '途径': 'Route', '频次': 'Frequency', '天数': 'Days', '产地': 'Origin',
'添加': 'Add', '无匹配项目': 'No matching items',
'请尝试其他关键词': 'Try other keywords', '暂无项目数据': 'No item data',
'未命名': 'Unnamed',
'成功加载{count}个诊疗项目': 'Loaded {count} treatment items',
'未获取到诊疗项目数据': 'No treatment item data',
'获取诊疗项目列表失败': 'Failed to get treatment item list',
'请输入有效数量': 'Enter valid quantity', '未找到该项目信息': 'Item info not found',
'折扣必须在0-100之间': 'Discount must be 0-100',
'请完善必填项:': 'Please complete required fields:',
'请至少添加一条套餐明细': 'Add at least one package detail',
'请先确认所有正在编辑的行': 'Confirm all editing rows first',
'请完善所有明细项目信息(项目名称和数量为必填项)': 'Complete all detail items (name and quantity required)',
'保存失败,请检查表单数据': 'Save failed, check form data',
'至': 'to', '卫生机构:': 'Healthcare Org:', '套餐级别:': 'Package Level:',
'套餐类别:': 'Package Category:', '用户:': 'User:',
'全院套餐': 'Hospital Package', '个人套餐': 'Personal Package',
'总数:': 'Total:', '加载用户列表失败': 'Failed to load user list',
'获取机构列表失败': 'Failed to get org list',
'无法获取套餐ID请刷新页面后重试': 'Cannot get package ID, refresh and retry',
'无法获取套餐ID删除失败': 'Cannot get package ID, delete failed',
'编码': 'Code', '名称': 'Name', '类型': 'Type', '状态': 'Status',
'操作': 'Action', '备注': 'Remark', '排序': 'Sort', '描述': 'Description',
'科室': 'Dept', '部门': 'Department', '医生': 'Doctor', '护士': 'Nurse',
'患者': 'Patient', '诊断': 'Diagnosis', '处方': 'Rx', '医嘱': 'Order',
'费用': 'Fee', '金额': 'Amount', '数量': 'Qty', '单价': 'Price',
'合计': 'Total', '开始时间': 'Start Time', '结束时间': 'End Time',
'门诊': 'OPD', '住院': 'IPD', '急诊': 'Emergency',
'手术': 'Surgery', '护理': 'Nursing', '检验': 'Lab', '检查': 'Inspection',
'病历': 'EMR', '病案': 'Case', '药品': 'Drug', '耗材': 'Consumable',
'报告': 'Report', '统计': 'Statistics', '报表': 'Report',
'质量': 'Quality', '指标': 'Indicator', '管理': 'Management',
'设置': 'Settings', '配置': 'Config', '参数': 'Parameter',
'维护': 'Maintenance', '目录': 'Catalog', '对照': 'Mapping',
'追溯': 'Traceability', '预警': 'Alert', '监测': 'Monitoring',
'执行': 'Execution', '追踪': 'Tracking',
'评估': 'Assessment', '筛查': 'Screening',
'审批': 'Approval', '审核': 'Review',
'闭环': 'Closed Loop', '组套': 'Template', '增强': 'Enhanced',
'收费': 'Charge', '退费': 'Refund', '结算': 'Settlement',
'挂号': 'Registration', '预约': 'Appointment',
'发药': 'Dispensing', '退药': 'Drug Return',
'入库': 'Inbound', '出库': 'Outbound', '盘点': 'Stocktaking', '调拨': 'Transfer',
};
function translateDeep(obj) {
let count = 0;
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) {
count += translateDeep(obj[k]);
} else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) {
if (direct[obj[k]]) {
obj[k] = direct[obj[k]];
count++;
} else {
let result = obj[k];
const sorted = Object.entries(direct).sort((a, b) => b[0].length - a[0].length);
for (const [zh, en] of sorted) {
const escaped = zh.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
result = result.replace(new RegExp(escaped, 'g'), en);
}
result = result.replace(/\s+/g, ' ').trim();
if (result !== obj[k] && !/[\u4e00-\u9fff]/.test(result)) {
obj[k] = result;
count++;
}
}
}
}
return count;
}
const c = translateDeep(enUS);
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'enUS.json'), JSON.stringify(enUS, null, 2), 'utf8');
console.log('Translated:', c);
function countChinese(obj) {
let c = 0;
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) c += countChinese(obj[k]);
else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) c++;
}
return c;
}
console.log('Remaining Chinese in enUS:', countChinese(enUS));

View File

@@ -0,0 +1,116 @@
const fs = require('fs');
const path = require('path');
const viVN = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'viVN.json'), 'utf8'));
const direct = {
'划价收费1相关配置': 'Cấu hình Định giá & Thu phí 1',
'划价收费2相关配置': 'Cấu hình Định giá & Thu phí 2',
'使用发票': 'Sử dụng hóa đơn', '普通单据': 'Chứng từ thường',
'挂号预约相关配置': 'Cấu hình Đăng ký khám', '其他选项相关配置': 'Cấu hình Tùy chọn khác',
'病人账户相关配置': 'Cấu hình Tài khoản BN', '配置数据加载成功': 'Tải cấu hình thành công',
'无法加载配置数据': 'Không thể tải dữ liệu cấu hình', '使用默认值': 'Sử dụng mặc định',
'已恢复默认值': 'Đã khôi phục mặc định', '获取配置列表失败': 'Lấy danh sách cấu hình thất bại',
'无法保存参数': 'Không thể lưu tham số', '保存成功': 'Lưu thành công',
'个参数保存成功': 'tham số đã lưu, nhưng', '但以下': 'nhưng các mục sau',
'个参数保存失败': 'tham số lưu thất bại', '所有参数保存失败': 'Tất cả tham số lưu thất bại',
'请检查系统配置': 'Vui lòng kiểm tra cấu hình hệ thống',
'保存操作异常': 'Lỗi thao tác lưu', '请重试': 'Vui lòng thử lại',
'请输入曝光次数': 'Nhập số lần phơi sáng', '选择服务范围': 'Chọn phạm vi dịch vụ',
'选择下级医技类型': 'Chọn loại kỹ thuật y tế cấp dưới',
'无': 'Không', '未知错误': 'Lỗi không xác định',
'未获取到检查方法数据': 'Không có dữ liệu phương pháp kiểm tra',
'未获取到检查部位数据': 'Không có dữ liệu vị trí kiểm tra',
'获取检查类型列表失败': 'Lấy danh sách loại kiểm tra thất bại',
'无法获取保存ID': 'Không thể lấy ID lưu', '无效的删除ID': 'ID xóa không hợp lệ',
'请先保存父项': 'Vui lòng lưu mục cha trước',
'未找到检查方法数据': 'Không tìm thấy dữ liệu phương pháp kiểm tra',
'未找到检查部位数据': 'Không tìm thấy dữ liệu vị trí kiểm tra',
'功能开发中': 'Tính năng đang phát triển',
'确定要删除这一行吗?': 'Xóa dòng này?',
'系统提示': 'Thông báo hệ thống',
'第 {page} 页': 'Trang {page}',
'卫生机构': 'Cơ sở y tế', '请选择机构': 'Chọn cơ sở',
'套餐级别': 'Cấp gói', '请选择套餐级别': 'Chọn cấp gói',
'套餐类别': 'Loại gói', '请选择套餐类别': 'Chọn loại gói',
'用户': 'Người dùng', '请输入用户名称': 'Nhập tên người dùng',
'服务费': 'Phí dịch vụ', '总金额': 'Tổng số tiền',
'组合套餐': 'Gói kết hợp', '显示套餐名': 'Hiện tên gói',
'启用标志': 'Cờ kích hoạt', '操作人': 'Người thao tác',
'用户选择': 'Chọn người dùng', '折扣': 'Giảm giá', '制单人': 'Người lập phiếu',
'生成服务费': 'Tạo phí dịch vụ', '请选择用户': 'Chọn người dùng',
'请选择卫生机构': 'Chọn cơ sở y tế', '自动计算': 'Tự động tính',
'请输入折扣': 'Nhập giảm giá', '自动合计': 'Tự động tổng hợp',
'请输入编号': 'Nhập số', '自动获取': 'Tự động lấy', '不启用': 'Không kích hoạt',
'编号': 'Số', '途径': 'Đường dùng', '频次': 'Tần suất', '天数': 'Số ngày', '产地': 'Nơi sản xuất',
'添加': 'Thêm', '无匹配项目': 'Không có mục phù hợp',
'请尝试其他关键词': 'Thử từ khóa khác', '暂无项目数据': 'Không có dữ liệu mục',
'未命名': 'Chưa đặt tên',
'请输入有效数量': 'Nhập số lượng hợp lệ', '未找到该项目信息': 'Không tìm thấy thông tin mục',
'折扣必须在0-100之间': 'Giảm giá phải từ 0-100',
'请完善必填项:': 'Vui lòng hoàn thành mục bắt buộc:',
'请至少添加一条套餐明细': 'Thêm ít nhất 1 chi tiết gói',
'请先确认所有正在编辑的行': 'Xác nhận tất cả dòng đang chỉnh sửa trước',
'保存失败,请检查表单数据': 'Lưu thất bại, kiểm tra dữ liệu biểu mẫu',
'至': 'đến', '卫生机构:': 'Cơ sở y tế:', '套餐级别:': 'Cấp gói:',
'套餐类别:': 'Loại gói:', '用户:': 'Người dùng:',
'全院套餐': 'Gói toàn viện', '个人套餐': 'Gói cá nhân',
'总数:': 'Tổng:', '加载用户列表失败': 'Tải danh sách người dùng thất bại',
'获取机构列表失败': 'Lấy danh sách cơ sở thất bại',
'编码': 'Mã', '名称': 'Tên', '类型': 'Loại', '状态': 'Trạng thái',
'操作': 'Thao tác', '备注': 'Ghi chú', '排序': 'Sắp xếp', '描述': 'Mô tả',
'科室': 'Khoa', '部门': 'Phòng ban', '医生': 'Bác sĩ', '护士': 'Điều dưỡng',
'患者': 'Bệnh nhân', '诊断': 'Chẩn đoán', '处方': 'Đơn thuốc', '医嘱': 'Y lệnh',
'费用': 'Viện phí', '金额': 'Số tiền', '数量': 'SL', '单价': 'Đơn giá',
'合计': 'Tổng cộng', '门诊': 'Ngoại trú', '住院': 'Nội trú', '急诊': 'Cấp cứu',
'手术': 'Phẫu thuật', '护理': 'Điều dưỡng', '检验': 'XN', '检查': 'CLS',
'病历': 'Bệnh án', '病案': 'Hồ sơ BA', '药品': 'Thuốc', '耗材': 'Vật tư',
'管理': 'Quản lý', '设置': 'Cài đặt', '配置': 'Cấu hình', '参数': 'Tham số',
'维护': 'Bảo trì', '目录': 'Danh mục', '对照': 'Đối chiếu',
'报告': 'Báo cáo', '统计': 'Thống kê', '报表': 'Báo cáo',
'追溯': 'Truy xuất', '预警': 'Cảnh báo', '监测': 'Giám sát',
'执行': 'Thực hiện', '追踪': 'Theo dõi', '评估': 'Đánh giá',
'审批': 'Phê duyệt', '审核': 'Duyệt',
'收费': 'Thu phí', '退费': 'Hoàn phí', '结算': 'Thanh toán',
'挂号': 'Đăng ký khám', '预约': 'Hẹn khám',
'发药': 'Phát thuốc', '退药': 'Trả thuốc',
'入库': 'Nhập kho', '出库': 'Xuất kho', '盘点': 'Kiểm kê', '调拨': 'Điều chuyển',
'DRG': 'DRG', 'EMPI': 'EMPI', 'ESB': 'ESB', 'FHIR': 'FHIR', 'LIS': 'LIS', 'PACS': 'PACS',
};
function translateDeep(obj) {
let count = 0;
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) {
count += translateDeep(obj[k]);
} else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) {
if (direct[obj[k]]) { obj[k] = direct[obj[k]]; count++; }
else {
let result = obj[k];
const sorted = Object.entries(direct).sort((a, b) => b[0].length - a[0].length);
for (const [zh, en] of sorted) {
const escaped = zh.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
result = result.replace(new RegExp(escaped, 'g'), en);
}
result = result.replace(/\s+/g, ' ').trim();
if (result !== obj[k] && !/[\u4e00-\u9fff]/.test(result)) {
obj[k] = result; count++;
}
}
}
}
return count;
}
const c = translateDeep(viVN);
fs.writeFileSync(path.join(__dirname, '..', 'src', 'i18n', 'locales', 'viVN.json'), JSON.stringify(viVN, null, 2), 'utf8');
console.log('Translated:', c);
function countChinese(obj) {
let c = 0;
for (const k in obj) {
if (typeof obj[k] === 'object' && obj[k] !== null) c += countChinese(obj[k]);
else if (typeof obj[k] === 'string' && /[\u4e00-\u9fff]/.test(obj[k])) c++;
}
return c;
}
console.log('Remaining Chinese in viVN:', countChinese(viVN));

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,35 @@
const { Client } = require('pg');
const path = require('path');
const client = new Client({
host: '192.168.110.252',
port: 15432,
database: 'postgresql',
user: 'postgresql',
password: 'Jchl1528',
});
async function main() {
await client.connect();
await client.query('SET search_path TO healthlink_his');
const res = await client.query(
"SELECT DISTINCT menu_name FROM sys_menu WHERE menu_type IN ('M','C') AND menu_name IS NOT NULL AND menu_name != '' ORDER BY menu_name"
);
const names = res.rows.map(r => r.menu_name);
const map = require('../src/layout/components/Sidebar/menuTitleMap.js').default;
const mappedNames = new Set(Object.keys(map));
const missing = names.filter(m => !mappedNames.has(m));
console.log('Total DB menus:', names.length);
console.log('Mapped:', names.length - missing.length);
console.log('Still missing:', missing.length);
if (missing.length > 0) {
console.log('---');
missing.forEach(m => console.log(m));
}
await client.end();
}
main().catch(e => { console.error(e.message); process.exit(1); });

View File

@@ -733,7 +733,6 @@
"confirmBatchDelete": "Confirm to delete selected items?",
"noPermission": "No permission",
"loading": "Loading...",
"noData": "No data",
"pleaseSelect": "Please select",
"pleaseEnter": "Please enter",
"queryTime": "Query Time",
@@ -761,7 +760,57 @@
"no": "No",
"startTime": "Start Date",
"endTime": "End Date",
"gender": "Gender"
"gender": "Gender",
"keyword": "Keyword",
"applicationNo": "Application No.",
"patientName": "Patient Name",
"applicationType": "Application Type",
"applicationTime": "Application Time",
"startDate": "Start Date",
"endDate": "End Date",
"age": "Age",
"outpatientNo": "Outpatient No.",
"applicationItem": "Application Item",
"applicantDoctor": "Applicant Doctor",
"applicantDept": "Applicant Department",
"currentPatients": "Current Patients",
"enterPatientName": "Enter patient name",
"firstVisit": "First Visit",
"patientInfo": "Patient Info",
"registrationTime": "Registration Time",
"item": "Item",
"totalQty": "Total Qty",
"totalAmount": "Total Amount",
"pharmacyDept": "Pharmacy/Dept",
"issuer": "Issuer",
"issueTime": "Issue Time",
"male": "Male",
"female": "Female",
"yearsOld": "y/o",
"visitDate": "Visit Date",
"basicInfo": "Basic Info",
"visitNo": "Visit No.",
"name": "Name",
"noData": "No Data",
"group": "Group",
"code": "Code",
"totalExecutions": "Total Executions",
"executedCount": "Executed",
"orderingDoctor": "Ordering Doctor",
"drugInfo": "Drug Info",
"drugQty": "Drug Qty",
"drugStatus": "Drug Status",
"skinTestFlag": "Skin Test",
"executionTime": "Execution Time",
"executor": "Executor",
"executionDept": "Execution Dept",
"executionStatus": "Execution Status",
"infusionOrder": "Infusion Orders",
"infusionHistory": "Infusion History",
"confirmExecution": "Confirm Execution",
"printBottleLabel": "Print Bottle Label",
"viewOrders": "View Orders",
"revoke": "Revoke"
},
"component": {
"rightToolbar": {
@@ -1454,78 +1503,6 @@
"msgOrderAdjusted": "Queue order adjusted (saved)",
"msgOrderAdjustFailed": "Queue order adjustment failed (unsaved)"
},
"pharmacy": {
"patientInfo": "Patient Info",
"placeholderNameOrId": "Enter name/ID number",
"dispenseStatus": "Dispense Status",
"placeholderSelectDispenseStatus": "Select dispense status",
"visitDate": "Visit Date",
"startDate": "Start Date",
"endDate": "End Date",
"name": "Name",
"gender": "Gender",
"age": "Age",
"phone": "Phone",
"visitDateCol": "Visit Date",
"preparer": "Preparer",
"placeholderPreparer": "Preparer",
"drugCategory": "Drug Category",
"placeholderDrugCategory": "Drug Category",
"westernChinese": "Western/Chinese Patent",
"chinese": "Chinese Herbal",
"project": "Project",
"placeholderProject": "Project",
"all": "All",
"drug": "Drug",
"consumable": "Consumable",
"batchDispense": "Batch Dispense",
"scan": "Scan",
"prescriptionPrint": "Print Prescription",
"totalAmount": "Total Amount",
"prescriptionNo": "Prescription No.",
"diagnosis": "Diagnosis",
"prescriptionType": "Prescription Type",
"itemName": "Item Name",
"merchandiseName": "Merchandise Name",
"dispenseQty": "Dispense Qty",
"lotNumber": "Lot Number",
"dispenseStatusCol": "Dispense Status",
"days": "Days",
"spec": "Spec",
"traceNo": "Trace No.",
"placeholderTraceNo": "Enter trace number",
"amount": "Amount",
"dispensePharmacy": "Dispense Pharmacy",
"manufacturer": "Manufacturer",
"orderingDoctor": "Ordering Doctor",
"frequency": "Frequency",
"usage": "Usage",
"operation": "Action",
"dispense": "Dispense",
"void": "Void",
"selectVoidReason": "Select Void Reason",
"placeholderSelectVoidReason": "Select void reason",
"confirm": "OK",
"cancel": "Cancel",
"printWarningNoTable": "Table not initialized, please refresh and retry",
"printWarningNoSelect": "No items selected for printing, print failed",
"printWarningNoData": "Failed to get print data, please retry later",
"printFailed": "Prescription print failed",
"msgDispenseSuccess": "Dispensed successfully",
"msgDispenseFailed": "Dispense failed",
"msgNoMatchTraceNo": "No trace number matched in inventory, please scan individually in the dispense list",
"msgOperationFailed": "Operation failed",
"msgInsufficientStock": "Insufficient stock for this lot",
"msgQtyExceedsTotal": "Dispense quantity cannot exceed total quantity",
"msgQtyBelowTotal": "Dispense quantity cannot be less than total quantity",
"msgSelectDispenseItem": "No items selected for dispensing, please reselect",
"msgSelectVoidReason": "Please select a void reason",
"msgNoDataSelected": "No data selected",
"voiding": "Voiding...",
"yuan": "yuan",
"remaining": "remaining",
"expDate": "exp"
},
"billing": {
"patientList": "Patient List",
"searchPlaceholder": "Enter patient name/medical record no.",
@@ -7403,5 +7380,666 @@
"withdrawn": "Withdrawn",
"pendingApply": "Pending Apply"
}
},
"inHospital": {
"feeTypeConversion": {
"admissionDate": "Admission Date",
"age": "Age:",
"repeatHospitalization": "Repeat Hospitalization",
"medicalECard": "Medical E-Card",
"thirdPartyLiability": "Third Party",
"convertToSelf": "Convert to Self",
"registrationChange": "Registration Change",
"emergencyFlag": "Emergency Flag",
"feeUpload": "Upload Fee",
"enter": "Enter",
"originalFeeType": "Original Fee Type:",
"personType": "Person Type:",
"feeType": "Fee Type",
"admissionDiagnosis": "Admission Diagnosis",
"socialSecurityCard": "Social Security",
"basicInfo": "Basic Info",
"inpatientNo": "Inpatient No.",
"birthDate": "Birth Date:",
"residentIdCard": "Resident ID",
"specialOutpatient": "Special Outpatient",
"specialPoorHousehold": "Special Poor",
"foreignFlag": "Foreign Flag",
"medicalFace": "Medical Face",
"patientName": "Patient Name:",
"insuredArea": "Insured Area:",
"insuranceType": "Insurance Type:",
"wardArea": "Ward",
"cityEmployeeMedical": "City Employee Medical",
"readCard": "Read Card",
"gender": "Gender:",
"insuredPlace": "Insured Place",
"patientNo": "Patient No.:",
"balance": "Balance:",
"medicalCategory": "Medical Category",
"traumaFlag": "Trauma Flag",
"medicalCard": "Medical Card",
"medicalRegistration": "Medical Registration",
"patientNameLabel": "Patient Name",
"selectDate": "Select date",
"clinicalTrial": "Clinical Trial",
"companyName": "Company:",
"diseaseName": "Disease Name",
"idType": "ID Type:"
},
"portal": {
"edit": "Edit",
"title": "Inpatient Portal",
"deleteDev": "Delete feature in development",
"editDev": "Edit feature in development",
"status": "Status",
"disabled": "Disabled",
"normal": "Normal",
"delete": "Delete",
"search": "Search",
"add": "Add",
"addDev": "Add feature in development",
"name": "Name",
"code": "Code",
"seqNo": "No.",
"operation": "Action"
},
"register": {
"idCardNumber": "ID Card Number",
"pendingRegistration": "Pending Registration",
"registrationStatus": "Reg Status",
"voidSuccess": "Void success",
"registered": "Registered",
"noFileRegistration": "No-File Registration",
"diagnosisCategory": "Diagnosis Category",
"modify": "Modify",
"medicalRegistrationConfirm": "Need medical insurance registration?",
"noPatientInfo": "No patient info",
"enterPatientName": "Enter patient name",
"patientInpatientNo": "Inpatient No.",
"feeNature": "Fee Nature",
"maritalStatus": "Marital Status",
"contactRequired": "Enter contact info",
"applyPatient": "Apply Patient",
"nationality": "Nationality:",
"registrar": "Registrar",
"admissionDiagnosis": "Admission Diagnosis",
"medicalCardNo": "Medical Card No.",
"phoneLabel": "Phone:",
"voidConfirm": "Void Confirm",
"medicalInfo": "Medical Info",
"workUnit": "Work Unit",
"enterIdCard": "Enter ID card number",
"contactInfo": "Contact Info",
"registerBtnLabel": "Register",
"marriage": "Marriage:",
"loadSuccess": "Load success",
"view": "View",
"invalidRowData": "Invalid row data",
"inHospitalPatient": "Inpatients",
"diagnosisRequired": "Select admission diagnosis",
"registerBtn": "Register",
"contactPerson": "Contact Person",
"patientCondition": "Patient Condition",
"patientCode": "Patient Code:",
"jumpMedicalFail": "Jump to medical registration failed",
"bloodTypeABO": "Blood Type ABO",
"deceasedTime": "Deceased Time",
"countryCode": "Country Code",
"applicationTime": "Apply Time",
"patientName": "Patient Name",
"idCard": "ID Card",
"admissionTypeLabel": "Admission Type",
"applicationSource": "Apply Source",
"medicalRegistrationTitle": "Medical Registration Confirm",
"void": "Void",
"completedRegistration": "Completed Registration",
"bloodTypeRH": "Blood Type RH",
"voidFail": "Void failed",
"genderLabel": "Gender:",
"detailAddress": "Detail Address",
"contactRelation": "Contact Relation",
"occupation": "Occupation",
"wardRequired": "Select admission ward",
"idTypeLabel": "ID Type:",
"voided": "Voided",
"hospitalInfo": "Hospital Info",
"gender": "Gender",
"encounterIdNotExist": "Encounter ID not exist",
"admissionDeptLabel": "Admission Dept",
"confirmVoid": "Confirm void registration? Cannot undo",
"saveBtn": "Save",
"diagnosisDesc": "Diagnosis Desc",
"noHospitalInfo": "No hospital info",
"occupationLabel": "Occupation:",
"companyName": "Company:",
"nation": "Ethnicity",
"bedCount": "Bed Count:",
"feeNatureLabel": "Fee Nature",
"outpatientDoctor": "Outpatient Doctor",
"ageLabel": "Age:",
"admissionMethod": "Admission Method",
"patientNameRequired": "Enter patient name",
"admissionType": "Admission Type",
"yearSuffix": " yrs",
"reset": "Reset",
"voidedCannotPrint": "Record voided, cannot print",
"currentAddress": "Address:",
"printCertFail": "Print certificate failed",
"patientIdNotExist": "Patient ID not exist",
"scanPay": "Scan Pay",
"nationLabel": "Ethnicity:",
"registerFail": "Registration failed",
"selectDeptFirst": "Select dept first",
"cardType": "Card Type",
"advanceNotFilled": "Advance not filled, confirm registration?",
"birthDateLabel": "Birth Date:",
"deptRequired": "Select admission dept",
"nativePlace": "Native Place:",
"addressSelect": "Address Select",
"basicInfo": "Basic Info",
"query": "Query",
"admissionWard": "Admission Ward",
"registrationTime": "Reg Time",
"selectPatient": "Select a patient first",
"age": "Age",
"idNoLabel": "ID No.:",
"hospitalNo": "Inpatient No.:",
"idCardNo": "ID Card No.",
"admissionDateLabel": "Admission Date",
"printCert": "Print Certificate",
"admitted": "Admitted",
"viewResult": "View Result",
"ageRequired": "Enter age",
"hospitalCount": "Hospital Count:",
"paymentAdvance": "Advance Payment",
"admissionDept": "Admission Dept",
"patientSource": "Patient Source:",
"admissionWardLabel": "Admission Ward",
"pending": "Pending",
"contactPhone": "Contact Phone"
},
"surgeryManage": {
"selectTime": "Select time",
"search": "Search",
"confirmDelete": "Confirm delete this surgery record?",
"selectLevel": "Select level",
"enterSurgeonName": "Please enter surgeon name",
"title": "Surgery Management",
"status": "Status",
"reset": "Reset",
"confirmComplete": "Confirm complete this surgery?",
"deleteSuccess": "Deleted successfully",
"patientName": "Patient Name",
"level4": "Level 4",
"remarkPlaceholder": "Surgery remark",
"surgeryLevel": "Surgery Level",
"pending": "Pending",
"edit": "Edit",
"addSurgery": "Add Surgery",
"surgeryName": "Surgery Name",
"detail": "Detail",
"start": "Start",
"plannedTime": "Planned Time",
"cancel": "Cancel",
"surgeryCompleted": "Surgery completed",
"addSuccess": "Added successfully",
"surgeryStarted": "Surgery started",
"pendingSurgery": "Pending",
"inProgress": "In Progress",
"inpatientNo": "Inpatient No.",
"patient": "Patient",
"complete": "Complete",
"delete": "Delete",
"enterSurgeryName": "Please enter surgery name",
"surgeryRemark": "Surgery Remark",
"enterPatientName": "Please enter patient name",
"anesthesiologist": "Anesthesiologist",
"surgeryDate": "Surgery Date",
"confirm": "Confirm",
"editSuccess": "Modified successfully",
"surgeryInProgress": "In Progress",
"all": "All",
"surgeryCancelled": "Cancelled",
"level3": "Level 3",
"surgeonName": "Surgeon",
"completed": "Completed",
"cancelled": "Cancelled",
"level1": "Level 1",
"surgeryDetail": "Surgery Detail",
"level2": "Level 2",
"surgeryStatus": "Surgery Status",
"confirmStart": "Confirm start this surgery?",
"surgeryDone": "Completed"
},
"advanceDeposit": {
"wardArea": "Ward Area",
"receiptNo": "Receipt No.",
"wechat": "WeChat",
"deptWard": "Dept/Ward:",
"amount": "Amount",
"query": "Query",
"billType": "Bill Type",
"cashier": "Cashier",
"payAmount": "Pay Amount:",
"confirmCharge": "Confirm Charge",
"enterPayAmount": "Enter pay amount",
"patientList": "Patient List",
"selectPatient": "Select patient first!",
"networkError": "Network error, retry",
"inHospitalPatient": "Inpatients",
"payMethodLabel": "Pay Method:",
"chargeFail": "Charge failed",
"select": "Select",
"actualCollect": "Actual Total:",
"selectPayMethod": "Select pay method",
"enterHospitalNo": "Enter inpatient no. first!",
"collectAdvance": "Collect Advance",
"collectTime": "Collect Time",
"cancel": "Cancel",
"rmbPrefix": "RMB: ",
"payAmountMustPositive": "Amount must be positive",
"bedNo": "Bed No.:",
"confirmRefund": "Confirm Refund",
"payMethod": "Pay Method",
"cash": "Cash",
"alipay": "Alipay",
"hospitalNo": "Inpatient No.:",
"confirm": "Confirm",
"selfPay": "Self Pay",
"reprintTag": "Reprint",
"printFail": "Print failed",
"balance": "Balance:",
"advancePayment": "Advance Payment",
"print": "Print",
"hospitalNoPlaceholder": "Enter inpatient no.",
"patientNo": "Patient No.",
"refund": "Refund",
"actualRefund": "Refund Total:",
"advanceTotal": "Advance Total:",
"serialNo": "Serial/Inpatient/Name",
"unionPay": "UnionPay",
"printSuccess": "Print success",
"feeType": "Fee Type:",
"chargeSuccess": "Charge success"
},
"inpatientDiagnosis": {
"diagnosisName": "Diagnosis Name",
"addDiagnosis": "Add Diagnosis",
"enterEncounterId": "Please enter encounter ID",
"cancel": "Cancel",
"diagnosisDate": "Diagnosis Date",
"operationFail": "Operation failed",
"secondary": "Secondary",
"confirm": "Confirm",
"confirmDelete": "Confirm delete this diagnosis?",
"selectClassification": "Select classification",
"admissionDiagnosis": "Admission",
"editSuccess": "Modified successfully",
"postopDiagnosis": "Post-op",
"encounterId": "Encounter ID",
"dischargeDiagnosis": "Discharge",
"title": "Admission Diagnosis",
"mainDiagnosis": "Primary",
"classification": "Classification",
"delete": "Delete",
"selectDate": "Select date",
"edit": "Edit",
"diagnosisDesc": "Diagnosis Desc",
"deleteSuccess": "Deleted successfully",
"doctor": "Doctor",
"query": "Query",
"preopDiagnosis": "Pre-op",
"addSuccess": "Added successfully",
"enterDiagnosisName": "Please enter diagnosis name",
"outpatientDiagnosis": "Outpatient"
},
"feeSettlement": {
"confirmCharge": "Confirm Charge",
"discount": "Discount",
"receivable": "Receivable",
"orderDept": "Order Dept",
"docNo": "Doc No.",
"medicalCode": "Medical Code",
"searchPlaceholder": "Patient name/inpatient no./bed",
"cashier": "Cashier",
"quantity": "Qty",
"selfToMedical": "Self to Medical",
"reading": "Reading...",
"amount": "Amount",
"discountRate": "Discount Rate",
"basicInfo": "Basic Info",
"idCard": "ID Card",
"eVoucher": "E-Voucher",
"studentMedicalToSelf": "Student Medical to Self",
"chargeItems": "Charge Items",
"preSettleFail": "Pre-settle failed",
"print": "Print",
"chargeTime": "Charge Time",
"selectChargeItem": "Select a charge item",
"operationSuccess": "Success",
"patientList": "Patient List",
"medicalToSelf": "Medical to Self",
"settleStatusCol": "Settle Status",
"age": "Age:",
"medicalCard": "Medical Card",
"received": "Received",
"medicalType": "Medical Type",
"balanceAmount": "Balance",
"gender": "Gender:",
"totalAmount": "Total:",
"feeNature": "Fee Nature",
"settleStatus": "Settle Status",
"prescriptionNo": "Prescription No.",
"studentSelfToMedical": "Student Self to Medical",
"name": "Name:",
"chargeItem": "Charge Item"
},
"settlement": {
"project": "Project",
"total": "Total:",
"payMethodLabel": "Pay Method",
"availableAmount": "Available",
"remark": "Remark",
"used": "Used",
"currentInvoiceNo": "Current Invoice: ",
"cancelSettle": "Cancel Settle",
"selectSettleFee": "Select Settle Fee",
"advanceTotal": "Advance Total:",
"balance": "Balance:",
"tip": "Tip",
"medicalAccount": "Medical Account:",
"uncheckedCost": "Unchecked:",
"patientInfo": "Patient Info",
"settlementCancel": "Settlement Cancel",
"rechargeTime": "Recharge Time",
"settler": "Settler",
"amount": "Amount",
"preSettle": "Pre-Settle",
"settle": "Settle",
"advanceBalance": "Advance Balance:",
"totalCost": "Total Cost:",
"returnable": "Returnable",
"category": "Category",
"advancePayment": "Advance:",
"reimbursementMethod": "Reimbursement",
"name": "Name",
"returnAmount": "Return Amount",
"invoiceNoLabel": "Invoice No.",
"toDeposit": "To Deposit",
"advanceManagement": "Advance Mgmt",
"bankCard": "Bank Card",
"cancelMedicalDischarge": "Cancel medical discharge?",
"reimbursement": "Reimbursement:",
"confirm": "Confirm",
"totalFee": "Total Fee:",
"returnMethod": "Return Method",
"query": "Query",
"checkedCost": "Checked:",
"noPatientFound": "No patient found!",
"noData": "No Data",
"inpatientSettlement": "Inpatient Settlement",
"receivable": "Receivable",
"wechat": "WeChat",
"settleCancelSuccess": "Cancel success!",
"inpatientNo": "Inpatient No.",
"payMethod": "Pay Method",
"deduction": "Deduction:",
"settleType": "Settle Type",
"selfPay": "Self Pay:",
"midwaySettlement": "Midway Settlement",
"skipNumber": "Skip",
"cash": "Cash",
"masterIndex": "Master Index",
"addDeduction": "Add Deduction",
"supplementary": "Supplementary",
"settleSuccess": "Settle success!",
"alipay": "Alipay",
"refund": "Refund"
},
"settleAccounts": {
"reset": "Reset",
"refundReason": "Refund Reason",
"change": "Change",
"viewInvoice": "View Invoice",
"payment": "Payment",
"invoiceNo": "Invoice No.:",
"issueInvoice": "Issue Invoice",
"payStatus": "Pay Status",
"confirm": "Confirm",
"invoiceNoPlaceholder": "Invoice No.",
"enterRefundReason": "Enter refund reason",
"payType": "Pay Type",
"settleTimeCol": "Settle Time",
"reasonLengthLimit": "1-200 characters",
"query": "Query",
"refund": "Refund",
"refundSuccess": "Refund success",
"settleTime": "Settle Time:",
"chargeSerialNo": "Charge Serial No.",
"writeOffInvoice": "Write Off Invoice",
"settleAmount": "Settle Amount",
"chargeDetail": "Charge Detail",
"invoiceNoCol": "Invoice No.",
"enterReason": "Enter reason",
"amount": "Amount",
"cashier": "Cashier",
"medicalSettleId": "Medical Settle ID",
"feeType": "Fee Type",
"payAmount": "Pay Amount",
"writeOffSuccess": "Write off success",
"printCount": "Print Count",
"writeOffReason": "Write Off Reason",
"cancel": "Cancel",
"payResult": "Pay Result",
"patientName": "Patient Name:",
"patientNamePlaceholder": "Patient Name",
"patientNameCol": "Patient Name",
"refundReasonMaxLength": "Max 200 characters"
},
"medicalRecord": {
"patientName": "Patient Name",
"specification": "Spec",
"unitPrice": "Unit Price",
"itemType": "Type",
"admissionDate": "Admission Date",
"status": "Status",
"age": "Age",
"itemName": "Item Name",
"inpatientNo": "Inpatient No.",
"search": "Search",
"amount": "Amount",
"title": "Medical Record",
"inHospital": "In Hospital",
"department": "Department",
"deptName": "Department",
"detail": "Record Detail",
"gender": "Gender",
"quantity": "Qty",
"discharged": "Discharged",
"reset": "Reset",
"bedNo": "Bed No.",
"patient": "Patient",
"feeOverview": "Fee Overview",
"dischargeDate": "Discharge Date"
},
"listFee": {
"amount": "Amount",
"unitPrice": "Unit Price",
"specification": "Spec",
"quantity": "Qty",
"enterTime": "Entry Time",
"doctorName": "Doctor",
"itemName": "Item Name",
"feeList": "Fee List",
"itemType": "Type",
"total": "Total",
"searchPlaceholder": "Search patient(name/inpatient no.)",
"title": "Inpatient"
},
"orderManage": {
"unknown": "Unknown",
"confirmSignOff": "Confirm sign off this order?",
"resume": "Resume",
"frequency": "Frequency",
"signOff": "Sign Off",
"searchPlaceholder": "Search patient(name/inpatient no.)",
"route": "Route",
"status": "Status",
"stop": "Stop",
"currentAdvice": "Current Orders",
"prescribingDoctor": "Prescribing Doctor",
"title": "Inpatient",
"adviceList": "Order List",
"confirmStop": "Confirm stop this order?",
"adviceContent": "Order Content",
"stopped": "Order stopped",
"resumed": "Order resumed",
"dosage": "Dosage",
"type": "Type",
"startTime": "Start Time",
"historyAdvice": "History Orders",
"signedOff": "Order signed off",
"confirmResume": "Confirm resume this order?"
},
"inpatientRecord": {
"gender": "Gender",
"medicalHistoryNarrator": "History Narrator",
"domicileAddress": "Domicile Address",
"maritalHistory": "Marital History",
"workUnit": "Work Unit",
"contactPerson": "Contact",
"pastHistory": "Past History",
"familyHistory": "Family History",
"reliability": "Reliability",
"phone": "Phone",
"physicalExamination": "Physical Examination",
"maritalStatus": "Marital Status",
"medicalRecordWriteTime": "Record Write Time",
"name": "Name",
"idCard": "ID Card",
"age": "Age",
"presentIllness": "Present Illness",
"occupation": "Occupation",
"title": "Admission Record",
"homeAddress": "Home Address",
"preliminaryDiagnosis": "Preliminary Diagnosis",
"bedNo": "Bed No.",
"department": "Department",
"specialtyCheck": "Specialty Exam",
"doctorSignature": "Doctor Signature",
"auxiliaryCheck": "Auxiliary Exam",
"admissionDate": "Admission Date",
"writingTime": "Writing Time",
"inpatientNo": "Inpatient No.",
"personalHistory": "Personal History",
"relationship": "Relationship",
"chiefComplaint": "Chief Complaint",
"nation": "Ethnicity"
},
"common": {
"reset": "Reset",
"fail": "Failed",
"deptName": "Department",
"endDate": "End Date",
"modify": "Modify",
"success": "Success",
"prompt": "Prompt",
"void": "Void",
"confirm": "Confirm",
"start": "Start",
"startTime": "Start Time",
"seqNo": "No.",
"inpatientNo": "Inpatient No.",
"query": "Query",
"startDate": "Start Date",
"operation": "Action",
"confirmDelete": "Confirm delete?",
"pleaseEnter": "Please enter",
"noData": "No Data",
"bedNo": "Bed No.",
"endTime": "End Time",
"add": "Add",
"print": "Print",
"phone": "Phone",
"cancel": "Cancel",
"age": "Age",
"complete": "Complete",
"edit": "Edit",
"pleaseSelect": "Please select",
"detail": "Detail",
"gender": "Gender",
"status": "Status",
"delete": "Delete",
"patientName": "Patient Name",
"yuan": "Yuan",
"loading": "Loading",
"search": "Search",
"address": "Address",
"view": "View",
"save": "Save"
}
},
"outpatientEnhanced": {
"title": "Outpatient Doctor Workstation Enhanced",
"structuredTemplate": "Structured Template",
"addTemplate": "Add Template",
"templateName": "Template Name",
"type": "Type",
"department": "Department",
"version": "Version",
"systemTemplate": "System Template",
"icd10Code": "ICD-10 Code",
"searchPlaceholder": "Enter code/name/pinyin",
"code": "Code",
"diagnosisName": "Diagnosis Name",
"category": "Category",
"isLeaf": "Leaf",
"rationalDrugUse": "Rational Drug Use Review",
"drugInteractionCheck": "Drug Interaction Check",
"drugA": "Drug A",
"drugB": "Drug B",
"check": "Check",
"foundInteractionRules": "Found {count} interaction rules",
"noInteraction": "No interaction found",
"interactionType": "Type",
"severity": "Severity",
"description": "Description",
"dischargeSummary": "Discharge Summary",
"patient": "Patient",
"admissionDiagnosis": "Admission Diagnosis",
"dischargeDiagnosis": "Discharge Diagnosis",
"dischargeCondition": "Discharge Condition",
"attendingDoctor": "Attending Doctor",
"draft": "Draft",
"completed": "Completed",
"archived": "Archived",
"prescriptionIntercept": "Prescription Intercept",
"intercept": "Intercept",
"forcePass": "Force Pass",
"drug": "Drug",
"interceptType": "Intercept Type",
"message": "Message",
"doctor": "Doctor",
"action": "Action",
"blocked": "Blocked"
},
"outpatientFinance": {
"dayEndSetTitle": "Day-End Settlement Management",
"settleDate": "Settle Date",
"selectDate": "Select Date",
"cashier": "Cashier",
"cashierName": "Cashier Name",
"seq": "No.",
"totalAmount": "Total Amount",
"cash": "Cash",
"card": "Card",
"wechat": "WeChat",
"alipay": "Alipay",
"settled": "Settled",
"unsettled": "Unsettled",
"dayEndDetail": "Day-End Detail",
"dayEndReport": "day-end-report.xlsx",
"exportSuccess": "Export successful"
}
}

View File

@@ -733,7 +733,6 @@
"confirmBatchDelete": "Xác nhận xóa các mục đã chọn?",
"noPermission": "Không có quyền",
"loading": "Đang tải...",
"noData": "Không có dữ liệu",
"pleaseSelect": "Vui lòng chọn",
"pleaseEnter": "Vui lòng nhập",
"queryTime": "Thời Gian Truy Vấn",
@@ -761,7 +760,57 @@
"no": "Không",
"startTime": "Ngày bắt đầu",
"endTime": "Ngày kết thúc",
"gender": "Giới tính"
"gender": "Giới tính",
"keyword": "Từ khóa",
"applicationNo": "Số đơn",
"patientName": "Tên bệnh nhân",
"applicationType": "Loại đơn",
"applicationTime": "Thời gian đăng ký",
"startDate": "Ngày bắt đầu",
"endDate": "Ngày kết thúc",
"age": "Tuổi",
"outpatientNo": "Số ngoại trú",
"applicationItem": "Dịch vụ đăng ký",
"applicantDoctor": "Bác sĩ đăng ký",
"applicantDept": "Khoa đăng ký",
"currentPatients": "Bệnh nhân hiện tại",
"enterPatientName": "Nhập tên bệnh nhân",
"firstVisit": "Khám lần đầu",
"patientInfo": "Thông tin bệnh nhân",
"registrationTime": "Thời gian đăng ký",
"item": "Dịch vụ",
"totalQty": "Tổng SL",
"totalAmount": "Tổng tiền",
"pharmacyDept": "Nhà thuốc/Khoa",
"issuer": "Người phát",
"issueTime": "Thời gian phát",
"male": "Nam",
"female": "Nữ",
"yearsOld": "tuổi",
"visitDate": "Ngày khám",
"basicInfo": "Thông tin cơ bản",
"visitNo": "Số khám",
"name": "Họ tên",
"noData": "Không có dữ liệu",
"group": "Nhóm",
"code": "Mã",
"totalExecutions": "Tổng số lần",
"executedCount": "Đã thực hiện",
"orderingDoctor": "Bác sĩ chỉ định",
"drugInfo": "Thông tin thuốc",
"drugQty": "Số lượng thuốc",
"drugStatus": "Trạng thái thuốc",
"skinTestFlag": "Test da",
"executionTime": "Thời gian thực hiện",
"executor": "Người thực hiện",
"executionDept": "Khoa thực hiện",
"executionStatus": "Trạng thái thực hiện",
"infusionOrder": "Lệnh truyền dịch",
"infusionHistory": "Lịch sử truyền dịch",
"confirmExecution": "Xác nhận thực hiện",
"printBottleLabel": "In nhãn chai",
"viewOrders": "Xem y lệnh",
"revoke": "Thu hồi"
},
"component": {
"rightToolbar": {
@@ -1455,76 +1504,46 @@
"msgOrderAdjustFailed": "Điều chỉnh thứ tự thất bại (chưa lưu)"
},
"pharmacy": {
"patientInfo": "Thông Tin Bệnh Nhân",
"placeholderNameOrId": "Nhập tên/số giấy tờ",
"dispenseStatus": "Trạng Thái Phát Thuốc",
"placeholderSelectDispenseStatus": "Chọn trạng thái phát thuốc",
"visitDate": "Ngày Khám",
"startDate": "Ngày Bắt Đầu",
"endDate": "Ngày Kết Thúc",
"name": "Họ Tên",
"gender": "Giới Tính",
"age": "Tuổi",
"phone": "Điện Thoại",
"visitDateCol": "Ngày Khám",
"preparer": "Dược Sĩ Pha Chế",
"placeholderPreparer": "Dược Sĩ Pha Chế",
"drugCategory": "Phân Loại Thuốc",
"placeholderDrugCategory": "Phân Loại Thuốc",
"westernChinese": "Tây Y/Thuốc Hoàn",
"chinese": "Thuốc Nam",
"project": "Dự Án",
"placeholderProject": "Dự Án",
"all": "Tất Cả",
"drug": "Thuốc",
"consumable": "Vật Tư",
"batchDispense": "Phát Hàng Loạt",
"scan": "Quét Mã",
"prescriptionPrint": "In Đơn Thuốc",
"totalAmount": "Tổng Tiền",
"prescriptionNo": "Số Đơn",
"diagnosis": "Chẩn Đoán",
"prescriptionType": "Loại Đơn",
"itemName": "Tên Mục",
"merchandiseName": "Tên Hàng Hóa",
"dispenseQty": "SL Phát",
"lotNumber": "Số Lô",
"dispenseStatusCol": "Trạng Thái",
"days": "Số Ngày",
"spec": "Quy Cách",
"traceNo": "Mã Truy Xuất",
"placeholderTraceNo": "Nhập mã truy xuất",
"amount": "Thành Tiền",
"dispensePharmacy": "Nhà Thuốc",
"manufacturer": "Nhà Sản Xuất",
"orderingDoctor": "Bác Sĩ Kê Đơn",
"frequency": "Tần Suất",
"usage": "Cách Dùng",
"operation": "Thao Tác",
"dispense": "Phát",
"void": "Hủy",
"selectVoidReason": "Chọn Lý Do Hủy",
"placeholderSelectVoidReason": "Chọn lý do hủy",
"confirm": "Xác Nhận",
"cancel": "Hủy Bỏ",
"printWarningNoTable": "Bảng chưa sẵn sàng, vui lòng tải lại",
"printWarningNoSelect": "Chưa chọn mục để in, in thất bại",
"printWarningNoData": "Lấy dữ liệu in thất bại, vui lòng thử lại",
"printFailed": "In đơn thuốc thất bại",
"msgDispenseSuccess": "Phát thuốc thành công",
"msgDispenseFailed": "Phát thuốc thất bại",
"msgNoMatchTraceNo": "Không khớp mã truy xuất trong kho, vui lòng quét riêng trong danh sách",
"msgOperationFailed": "Thao tác thất bại",
"msgInsufficientStock": "Tồn kho lô này không đủ",
"msgQtyExceedsTotal": "Số lượng phát không được vượt quá tổng",
"msgQtyBelowTotal": "Số lượng phát không được nhỏ hơn tổng",
"msgSelectDispenseItem": "Chưa chọn mục để phát, vui lòng chọn lại",
"msgSelectVoidReason": "Vui lòng chọn lý do hủy",
"msgNoDataSelected": "Chưa chọn dữ liệu",
"voiding": "Đang hủy...",
"yuan": "đ",
"remaining": "còn lại",
"expDate": "HSD"
"title": "Quản Lý Cảnh Báo Tồn Kho Dược Phẩm",
"refresh": "Làm mới",
"addAlert": "Thêm cảnh báo",
"exportReport": "Xuất báo cáo",
"totalAlerts": "Tổng cảnh báo",
"outOfStock": "Hết hàng",
"lowStock": "Tồn kho thấp",
"expiring": "Sắp hết hạn",
"supplierCount": "Số nhà cung cấp",
"pendingRestock": "Chờ nhập hàng",
"alertLevel": "Mức cảnh báo",
"drugCategory": "Loại dược phẩm",
"query": "Tìm kiếm",
"reset": "Đặt lại",
"western": "Tây dược",
"chineseMedicine": "Trung dược",
"herbal": "Thảo dược",
"biological": "Sinh phẩm",
"drugCode": "Mã dược phẩm",
"drugName": "Tên dược phẩm",
"spec": "Quy cách",
"currentStock": "Tồn kho hiện tại",
"minStock": "Tồn kho tối thiểu",
"maxStock": "Tồn kho tối đa",
"supplier": "Nhà cung cấp",
"lastRestock": "Lần nhập cuối",
"expiryDate": "Ngày hết hạn",
"action": "Thao tác",
"restockApply": "Yêu cầu nhập hàng",
"addDialogTitle": "Thêm cảnh báo tồn kho dược phẩm",
"enterDrugCode": "Nhập mã dược phẩm",
"enterDrugName": "Nhập tên dược phẩm",
"specExample": "VD: 0.5g*24 viên",
"pleaseSelect": "Vui lòng chọn",
"enterSupplier": "Nhập tên nhà cung cấp",
"cancel": "Hủy",
"confirm": "Xác nhận",
"normal": "Bình thường",
"addSuccess": "Thêm thành công",
"exportWip": "Tính năng xuất đang được phát triển"
},
"billing": {
"patientList": "Danh sách bệnh nhân",
@@ -7170,48 +7189,6 @@
"medicationList3": "Đơn thuốc 3"
}
},
"pharmacy": {
"title": "Quản Lý Cảnh Báo Tồn Kho Dược Phẩm",
"refresh": "Làm mới",
"addAlert": "Thêm cảnh báo",
"exportReport": "Xuất báo cáo",
"totalAlerts": "Tổng cảnh báo",
"outOfStock": "Hết hàng",
"lowStock": "Tồn kho thấp",
"expiring": "Sắp hết hạn",
"supplierCount": "Số nhà cung cấp",
"pendingRestock": "Chờ nhập hàng",
"alertLevel": "Mức cảnh báo",
"drugCategory": "Loại dược phẩm",
"query": "Tìm kiếm",
"reset": "Đặt lại",
"western": "Tây dược",
"chineseMedicine": "Trung dược",
"herbal": "Thảo dược",
"biological": "Sinh phẩm",
"drugCode": "Mã dược phẩm",
"drugName": "Tên dược phẩm",
"spec": "Quy cách",
"currentStock": "Tồn kho hiện tại",
"minStock": "Tồn kho tối thiểu",
"maxStock": "Tồn kho tối đa",
"supplier": "Nhà cung cấp",
"lastRestock": "Lần nhập cuối",
"expiryDate": "Ngày hết hạn",
"action": "Thao tác",
"restockApply": "Yêu cầu nhập hàng",
"addDialogTitle": "Thêm cảnh báo tồn kho dược phẩm",
"enterDrugCode": "Nhập mã dược phẩm",
"enterDrugName": "Nhập tên dược phẩm",
"specExample": "VD: 0.5g*24 viên",
"pleaseSelect": "Vui lòng chọn",
"enterSupplier": "Nhập tên nhà cung cấp",
"cancel": "Hủy",
"confirm": "Xác nhận",
"normal": "Bình thường",
"addSuccess": "Thêm thành công",
"exportWip": "Tính năng xuất đang được phát triển"
},
"medicineStorage": {
"common": {
"add": "Thêm",
@@ -7403,5 +7380,666 @@
"withdrawn": "Đã rút",
"pendingApply": "Chờ nộp"
}
},
"inHospital": {
"feeSettlement": {
"orderDept": "Khoa chỉ định",
"medicalCard": "Thẻ BHYT",
"operationSuccess": "Thành công",
"amount": "Số tiền",
"medicalType": "Loại y tế",
"chargeTime": "Thời gian thu",
"receivable": "Số tiền phải thu",
"chargeItem": "Mục thu phí",
"basicInfo": "Thông tin cơ bản",
"confirmCharge": "Xác nhận thu phí",
"discount": "Giảm giá",
"docNo": "Số chứng từ",
"discountRate": "Tỷ lệ giảm",
"quantity": "SL",
"cashier": "Thu ngân",
"name": "Họ tên:",
"reading": "Đang đọc...",
"preSettleFail": "Thanh toán trước thất bại",
"received": "Số tiền đã thu",
"idCard": "CCCD",
"prescriptionNo": "Số đơn thuốc",
"settleStatusCol": "TT thanh toán",
"selfToMedical": "Tự trả sang BHYT",
"settleStatus": "TT thanh toán",
"searchPlaceholder": "Tên BN/số nội trú/giường",
"totalAmount": "Tổng cộng:",
"medicalCode": "Mã BHYT",
"age": "Tuổi:",
"feeNature": "Tính chất phí",
"medicalToSelf": "BHYT sang tự trả",
"chargeItems": "Mục thu phí",
"print": "In",
"selectChargeItem": "Chọn một mục thu phí",
"balanceAmount": "Số dư",
"studentSelfToMedical": "SV tự trả sang SV BHYT",
"eVoucher": "Phiếu điện tử",
"gender": "Giới tính:",
"patientList": "DS bệnh nhân",
"studentMedicalToSelf": "SV BHYT sang SV tự trả"
},
"settlement": {
"settler": "NV thanh toán",
"confirm": "Xác nhận",
"amount": "Số tiền",
"advanceBalance": "Số dư tạm ứng:",
"refund": "Hoàn phí",
"wechat": "WeChat",
"settleCancelSuccess": "Hủy thành công!",
"totalCost": "Tổng chi phí:",
"payMethod": "Phương thức TT",
"inpatientSettlement": "TT nội trú",
"totalFee": "Tổng phí:",
"patientInfo": "Thông tin BN",
"used": "Đã dùng",
"advanceManagement": "Quản lý tạm ứng",
"currentInvoiceNo": "HĐ hiện tại: ",
"toDeposit": "Chuyển đặt cọc",
"invoiceNoLabel": "Số hóa đơn",
"total": "Tổng:",
"preSettle": "TT trước",
"medicalAccount": "TK BHYT:",
"addDeduction": "Thêm giảm trừ",
"noPatientFound": "Không tìm thấy BN!",
"selectSettleFee": "Chọn phí TT",
"returnable": "Phải trả",
"project": "Dự án",
"reimbursement": "Bảo hiểm:",
"cancelMedicalDischarge": "Hủy xuất viện BHYT?",
"supplementary": "Bổ sung",
"remark": "Ghi chú",
"query": "Truy vấn",
"advancePayment": "Tạm ứng:",
"returnAmount": "Số tiền trả",
"returnMethod": "Phương thức trả",
"category": "Danh mục",
"rechargeTime": "Thời gian nạp",
"masterIndex": "Chỉ mục chính",
"bankCard": "Thẻ ngân hàng",
"selfPay": "Tự trả:",
"uncheckedCost": "Chưa chọn:",
"advanceTotal": "Tổng tạm ứng:",
"payMethodLabel": "Phương thức TT",
"checkedCost": "Đã chọn:",
"alipay": "Alipay",
"settlementCancel": "Hủy TT",
"cash": "Tiền mặt",
"cancelSettle": "Hủy TT",
"noData": "Không có dữ liệu",
"settleSuccess": "Thanh toán thành công!",
"reimbursementMethod": "Phương thức BH",
"midwaySettlement": "TT giữa chừng",
"availableAmount": "Có thể dùng",
"settle": "Thanh toán",
"receivable": "Phải thu",
"tip": "Thông báo",
"skipNumber": "Bỏ qua",
"balance": "Số dư:",
"deduction": "Giảm trừ:",
"settleType": "Loại TT",
"inpatientNo": "Số nội trú",
"name": "Họ tên"
},
"advanceDeposit": {
"payMethod": "Phương thức TT",
"hospitalNo": "Số nội trú:",
"confirmRefund": "Xác nhận hoàn phí",
"amount": "Số tiền",
"print": "In",
"cash": "Tiền mặt",
"patientList": "DS bệnh nhân",
"wechat": "WeChat",
"unionPay": "UnionPay",
"inHospitalPatient": "BN nội trú",
"rmbPrefix": "Nhân dân tệ: ",
"selfPay": "Tự trả",
"payAmountMustPositive": "Số tiền phải lớn hơn 0",
"billType": "Loại hóa đơn",
"confirm": "Xác nhận",
"query": "Truy vấn",
"deptWard": "Khoa/Khu:",
"bedNo": "Số giường:",
"refund": "Hoàn phí",
"chargeSuccess": "Thu phí thành công",
"cashier": "Thu ngân",
"chargeFail": "Thu phí thất bại",
"patientNo": "Số BN",
"reprintTag": "In lại lần",
"feeType": "Loại phí:",
"payAmount": "Số tiền TT:",
"enterPayAmount": "Nhập số tiền thanh toán",
"actualCollect": "Tổng thu thực tế:",
"enterHospitalNo": "Vui lòng nhập số nội trú!",
"confirmCharge": "Xác nhận thu phí",
"wardArea": "Khu điều trị",
"balance": "Số dư:",
"advancePayment": "Tiền tạm ứng nội trú",
"printSuccess": "In thành công",
"selectPayMethod": "Chọn phương thức TT",
"collectAdvance": "Thu tiền tạm ứng",
"alipay": "Alipay",
"advanceTotal": "Tổng tạm ứng:",
"selectPatient": "Vui lòng chọn bệnh nhân!",
"serialNo": "Số/Số nội trú/Tên",
"actualRefund": "Tổng hoàn thực tế:",
"printFail": "In thất bại",
"hospitalNoPlaceholder": "Nhập số nội trú",
"payMethodLabel": "Phương thức TT:",
"receiptNo": "Số biên lai",
"collectTime": "Thời gian thu",
"select": "Chọn",
"networkError": "Lỗi mạng, thử lại",
"cancel": "Hủy"
},
"inpatientDiagnosis": {
"selectClassification": "Chọn phân loại",
"selectDate": "Chọn ngày",
"dischargeDiagnosis": "Xuất viện",
"delete": "Xóa",
"diagnosisName": "Tên chẩn đoán",
"query": "Truy vấn",
"diagnosisDesc": "Mô tả chẩn đoán",
"addDiagnosis": "Thêm chẩn đoán",
"admissionDiagnosis": "Nhập viện",
"outpatientDiagnosis": "Ngoại trú",
"preopDiagnosis": "Trước mổ",
"encounterId": "ID lần khám",
"confirm": "Xác nhận",
"diagnosisDate": "Ngày chẩn đoán",
"enterEncounterId": "Vui lòng nhập ID lần khám",
"confirmDelete": "Xác nhận xóa chẩn đoán này?",
"cancel": "Hủy",
"addSuccess": "Thêm thành công",
"mainDiagnosis": "Chính",
"doctor": "Bác sĩ",
"deleteSuccess": "Xóa thành công",
"postopDiagnosis": "Sau mổ",
"operationFail": "Thao tác thất bại",
"title": "Chẩn đoán nhập viện",
"edit": "Sửa",
"editSuccess": "Sửa thành công",
"classification": "Phân loại",
"enterDiagnosisName": "Vui lòng nhập tên chẩn đoán",
"secondary": "Phụ"
},
"register": {
"deptRequired": "Chọn khoa nhập viện",
"admissionDeptLabel": "Khoa nhập viện",
"registrationStatus": "TT đăng ký",
"genderLabel": "Giới tính:",
"confirmVoid": "Xác nhận hủy đăng ký? Không thể hoàn tác",
"diagnosisDesc": "Mô tả chẩn đoán",
"basicInfo": "Thông tin cơ bản",
"selectPatient": "Chọn BN từ danh sách trước",
"contactRequired": "Nhập thông tin liên hệ",
"nativePlace": "Quê quán:",
"yearSuffix": " tuổi",
"bedCount": "Số giường:",
"admissionType": "Loại nhập viện",
"viewResult": "Xem kết quả",
"diagnosisCategory": "Loại chẩn đoán",
"countryCode": "Mã quốc gia",
"voidFail": "Hủy thất bại",
"voided": "Đã hủy",
"patientCode": "Mã BN:",
"deceasedTime": "Thời gian tử vong",
"noHospitalInfo": "Không có thông tin nội trú",
"currentAddress": "Địa chỉ:",
"admitted": "Đã vào khoa",
"registerBtnLabel": "Đăng ký",
"medicalRegistrationTitle": "Xác nhận ĐK BHYT",
"contactPerson": "Người liên hệ",
"idTypeLabel": "Loại giấy tờ:",
"wardRequired": "Chọn khu nhập viện",
"completedRegistration": "Đã đăng ký nhập viện",
"addressSelect": "Chọn địa chỉ",
"saveBtn": "Lưu",
"patientNameRequired": "Nhập tên BN",
"enterIdCard": "Nhập số CCCD",
"medicalInfo": "Thông tin BHYT",
"patientInpatientNo": "Số nội trú",
"occupation": "Nghề nghiệp",
"bloodTypeABO": "Nhóm máu ABO",
"patientIdNotExist": "ID BN không tồn tại",
"voidConfirm": "Xác nhận hủy",
"occupationLabel": "Nghề nghiệp:",
"advanceNotFilled": "Chưa nhập tạm ứng, xác nhận đăng ký?",
"noFileRegistration": "ĐK không hồ sơ",
"age": "Tuổi",
"printCert": "In giấy nhập viện",
"paymentAdvance": "Tiền tạm ứng",
"hospitalInfo": "Thông tin nội trú",
"contactInfo": "Thông tin liên hệ",
"birthDateLabel": "Ngày sinh:",
"loadSuccess": "Tải thành công",
"admissionDiagnosis": "Chẩn đoán nhập viện",
"reset": "Đặt lại",
"applicationTime": "Thời gian đăng ký",
"applicationSource": "Nguồn đăng ký",
"printCertFail": "In giấy nhập viện thất bại",
"admissionTypeLabel": "Loại nhập viện",
"pending": "Chờ đăng ký",
"medicalCardNo": "Số thẻ khám",
"feeNatureLabel": "Tính chất phí",
"void": "Hủy bỏ",
"bloodTypeRH": "Nhóm máu RH",
"registrationTime": "Thời gian ĐK",
"nationality": "Quốc tịch:",
"maritalStatus": "Tình trạng hôn nhân",
"detailAddress": "Địa chỉ chi tiết",
"hospitalNo": "Số nội trú:",
"voidedCannotPrint": "Bản ghi đã hủy, không thể in",
"registerFail": "Đăng ký thất bại",
"nation": "Dân tộc",
"gender": "Giới tính",
"view": "Xem",
"hospitalCount": "Số lần nội trú:",
"idCardNo": "Số CCCD",
"ageLabel": "Tuổi:",
"marriage": "Hôn nhân:",
"registerBtn": "Đăng ký",
"selectDeptFirst": "Chọn khoa trước",
"diagnosisRequired": "Chọn chẩn đoán nhập viện",
"encounterIdNotExist": "ID lần khám không tồn tại",
"companyName": "Công ty:",
"contactPhone": "SĐT liên hệ",
"modify": "Sửa",
"patientCondition": "Tình trạng BN",
"enterPatientName": "Nhập tên BN",
"feeNature": "Tính chất phí",
"medicalRegistrationConfirm": "Cần đăng ký BHYT?",
"scanPay": "Quét mã TT",
"applyPatient": "BN đăng ký",
"idCardNumber": "Số CCCD",
"nationLabel": "Dân tộc:",
"admissionDept": "Khoa nhập viện",
"admissionWard": "Khu nhập viện",
"admissionMethod": "Phương thức nhập viện",
"cardType": "Loại thẻ",
"pendingRegistration": "Chờ đăng ký nhập viện",
"ageRequired": "Nhập tuổi",
"jumpMedicalFail": "Chuyển đến trang ĐK BHYT thất bại",
"patientSource": "Nguồn BN:",
"patientName": "Tên BN",
"invalidRowData": "Dữ liệu không hợp lệ",
"registrar": "NV đăng ký",
"query": "Truy vấn",
"outpatientDoctor": "Bác sĩ ngoại trú",
"idNoLabel": "Số giấy tờ:",
"noPatientInfo": "Không có thông tin BN",
"registered": "Đã đăng ký",
"admissionDateLabel": "Ngày nhập viện",
"voidSuccess": "Hủy thành công",
"inHospitalPatient": "BN nội trú",
"admissionWardLabel": "Khu nhập viện",
"phoneLabel": "Điện thoại:",
"workUnit": "Nơi làm việc",
"contactRelation": "Quan hệ",
"idCard": "CCCD"
},
"portal": {
"delete": "Xóa",
"search": "Tìm kiếm",
"status": "Trạng thái",
"editDev": "Chức năng sửa đang phát triển",
"disabled": "Vô hiệu",
"deleteDev": "Chức năng xóa đang phát triển",
"add": "Thêm",
"code": "Mã",
"edit": "Sửa",
"title": "Cổng Bệnh nhân nội trú",
"normal": "Bình thường",
"name": "Tên",
"addDev": "Chức năng thêm đang phát triển",
"seqNo": "STT",
"operation": "Thao tác"
},
"medicalRecord": {
"itemName": "Tên mục",
"bedNo": "Số giường",
"itemType": "Loại",
"admissionDate": "Ngày nhập viện",
"dischargeDate": "Ngày xuất viện",
"status": "Trạng thái",
"inHospital": "Đang nội trú",
"quantity": "Số lượng",
"specification": "Quy cách",
"deptName": "Khoa",
"department": "Khoa",
"detail": "Chi tiết bệnh án",
"patientName": "Tên bệnh nhân",
"feeOverview": "Tổng quan phí",
"unitPrice": "Đơn giá",
"reset": "Đặt lại",
"inpatientNo": "Số nội trú",
"amount": "Số tiền",
"age": "Tuổi",
"discharged": "Đã xuất viện",
"patient": "Bệnh nhân",
"gender": "Giới tính",
"title": "Quản lý bệnh án",
"search": "Tìm kiếm"
},
"orderManage": {
"frequency": "Tần suất",
"prescribingDoctor": "Bác sĩ kê",
"currentAdvice": "Y lệnh hiện tại",
"stop": "Dừng",
"status": "Trạng thái",
"confirmResume": "Xác nhận khôi phục y lệnh này?",
"confirmSignOff": "Xác nhận ký trả y lệnh này?",
"signedOff": "Y lệnh đã ký trả",
"stopped": "Y lệnh đã dừng",
"resume": "Khôi phục",
"resumed": "Y lệnh đã khôi phục",
"adviceContent": "Nội dung y lệnh",
"historyAdvice": "Lịch sử y lệnh",
"startTime": "Thời gian bắt đầu",
"dosage": "Liều lượng",
"adviceList": "Danh sách y lệnh",
"route": "Đường dùng",
"title": "Bệnh nhân nội trú",
"searchPlaceholder": "Tìm bệnh nhân(tên/số nội trú)",
"type": "Loại",
"unknown": "Không rõ",
"signOff": "Ký trả",
"confirmStop": "Xác nhận dừng y lệnh này?"
},
"surgeryManage": {
"surgeryCompleted": "Phẫu thuật đã hoàn thành",
"level4": "Cấp 4",
"remarkPlaceholder": "Ghi chú phẫu thuật",
"title": "Quản lý phẫu thuật",
"complete": "Hoàn thành",
"pendingSurgery": "Chờ mổ",
"selectTime": "Chọn thời gian",
"patient": "Bệnh nhân",
"all": "Tất cả",
"confirmDelete": "Xác nhận xóa bản ghi phẫu thuật?",
"surgeryLevel": "Cấp độ PT",
"enterPatientName": "Vui lòng nhập tên bệnh nhân",
"inpatientNo": "Số nội trú",
"edit": "Sửa",
"surgeryInProgress": "Đang mổ",
"surgeryStatus": "Trạng thái PT",
"confirm": "Xác nhận",
"level2": "Cấp 2",
"deleteSuccess": "Xóa thành công",
"status": "Trạng thái",
"surgeryDate": "Ngày phẫu thuật",
"addSuccess": "Thêm thành công",
"enterSurgeonName": "Vui lòng nhập tên bác sĩ mổ",
"level1": "Cấp 1",
"enterSurgeryName": "Vui lòng nhập tên phẫu thuật",
"confirmStart": "Xác nhận bắt đầu phẫu thuật?",
"surgeryRemark": "Ghi chú PT",
"plannedTime": "Thời gian dự kiến",
"addSurgery": "Thêm phẫu thuật",
"delete": "Xóa",
"surgeonName": "Bác sĩ mổ",
"editSuccess": "Sửa thành công",
"surgeryDone": "Hoàn thành",
"inProgress": "Đang mổ",
"surgeryCancelled": "Đã hủy",
"start": "Bắt đầu",
"patientName": "Tên bệnh nhân",
"pending": "Chờ mổ",
"surgeryName": "Tên phẫu thuật",
"level3": "Cấp 3",
"confirmComplete": "Xác nhận hoàn thành phẫu thuật?",
"anesthesiologist": "Bác sĩ gây mê",
"surgeryDetail": "Chi tiết PT",
"search": "Tìm kiếm",
"surgeryStarted": "Phẫu thuật đã bắt đầu",
"selectLevel": "Chọn cấp độ",
"reset": "Đặt lại",
"detail": "Chi tiết",
"completed": "Hoàn thành",
"cancelled": "Đã hủy",
"cancel": "Hủy"
},
"feeTypeConversion": {
"residentIdCard": "CCCD",
"specialOutpatient": "Ngoại trú đặc biệt",
"birthDate": "Ngày sinh:",
"inpatientNo": "Số nội trú",
"registrationChange": "Thay đổi đăng ký",
"repeatHospitalization": "Nhập viện lại",
"patientNo": "Số BN:",
"patientNameLabel": "Tên BN",
"admissionDiagnosis": "Chẩn đoán nhập viện",
"selectDate": "Chọn ngày",
"convertToSelf": "Chuyển tự trả",
"foreignFlag": "Dấu hiệu nước ngoài",
"emergencyFlag": "Dấu hiệu cấp cứu",
"medicalFace": "Nhận diện khuôn mặt",
"thirdPartyLiability": "Trách nhiệm bên thứ 3",
"age": "Tuổi:",
"medicalECard": "Thẻ ĐT BHYT",
"clinicalTrial": "Thử nghiệm lâm sàng",
"medicalCategory": "Loại y tế",
"admissionDate": "Ngày nhập viện",
"medicalRegistration": "Đăng ký BHYT",
"feeType": "Loại phí",
"companyName": "Công ty:",
"balance": "Số dư:",
"personType": "Loại người:",
"traumaFlag": "Dấu hiệu chấn thương",
"feeUpload": "Tải phí",
"originalFeeType": "Loại phí gốc:",
"gender": "Giới tính:",
"medicalCard": "Thẻ BHYT",
"patientName": "Tên BN:",
"cityEmployeeMedical": "BHYT CBNV thành phố",
"insuredArea": "Khu vực tham gia:",
"insuredPlace": "Nơi tham gia",
"socialSecurityCard": "Thẻ BHXH",
"wardArea": "Khu",
"enter": "Nhập",
"diseaseName": "Tên bệnh",
"basicInfo": "Thông tin cơ bản",
"insuranceType": "Loại bảo hiểm:",
"idType": "Loại giấy tờ:",
"readCard": "Đọc thẻ",
"specialPoorHousehold": "Hộ đặc biệt khó khăn"
},
"common": {
"status": "Trạng thái",
"query": "Truy vấn",
"modify": "Sửa đổi",
"seqNo": "STT",
"operation": "Thao tác",
"add": "Thêm",
"edit": "Sửa",
"search": "Tìm kiếm",
"deptName": "Khoa",
"detail": "Chi tiết",
"endDate": "Ngày kết thúc",
"fail": "Thất bại",
"save": "Lưu",
"loading": "Đang tải",
"startTime": "Thời gian bắt đầu",
"complete": "Hoàn thành",
"cancel": "Hủy",
"phone": "Điện thoại",
"void": "Hủy bỏ",
"patientName": "Tên bệnh nhân",
"confirm": "Xác nhận",
"delete": "Xóa",
"start": "Bắt đầu",
"inpatientNo": "Số nội trú",
"startDate": "Ngày bắt đầu",
"pleaseEnter": "Vui lòng nhập",
"address": "Địa chỉ",
"prompt": "Thông báo",
"age": "Tuổi",
"yuan": "NDT",
"confirmDelete": "Xác nhận xóa?",
"bedNo": "Số giường",
"print": "In",
"pleaseSelect": "Vui lòng chọn",
"reset": "Đặt lại",
"endTime": "Thời gian kết thúc",
"gender": "Giới tính",
"noData": "Không có dữ liệu",
"view": "Xem",
"success": "Thành công"
},
"settleAccounts": {
"query": "Truy vấn",
"refund": "Hoàn phí",
"refundReason": "Lý do hoàn phí",
"feeType": "Loại phí",
"payment": "Số tiền nộp",
"change": "Tiền thừa",
"enterReason": "Nhập lý do",
"payAmount": "Số tiền trả",
"writeOffReason": "Lý do hủy",
"invoiceNoPlaceholder": "Số hóa đơn",
"patientNameCol": "Tên BN",
"refundSuccess": "Hoàn phí thành công",
"refundReasonMaxLength": "Tối đa 200 ký tự",
"invoiceNo": "Số hóa đơn:",
"reasonLengthLimit": "1-200 ký tự",
"cancel": "Hủy",
"chargeDetail": "Chi tiết thu phí",
"payStatus": "TT thanh toán",
"patientName": "Tên BN:",
"viewInvoice": "Xem hóa đơn",
"confirm": "Xác nhận",
"settleTime": "Thời gian TT:",
"payType": "Loại thanh toán",
"issueInvoice": "Phát hành HĐ",
"settleAmount": "Số tiền TT",
"patientNamePlaceholder": "Tên BN",
"cashier": "Thu ngân",
"writeOffSuccess": "Hủy thành công",
"medicalSettleId": "ID TT BHYT",
"payResult": "Kết quả TT",
"printCount": "Số lần in",
"amount": "Số tiền",
"chargeSerialNo": "Số CT thu phí",
"reset": "Đặt lại",
"writeOffInvoice": "Hủy hóa đơn",
"enterRefundReason": "Nhập lý do hoàn phí",
"settleTimeCol": "Thời gian TT",
"invoiceNoCol": "Số hóa đơn"
},
"inpatientRecord": {
"presentIllness": "Bệnh sử hiện tại",
"department": "Khoa",
"medicalRecordWriteTime": "Thời gian viết bệnh án",
"specialtyCheck": "Khám chuyên khoa",
"writingTime": "Thời gian viết",
"auxiliaryCheck": "Xét nghiệm cận lâm sàng",
"age": "Tuổi",
"relationship": "Quan hệ",
"contactPerson": "Người liên hệ",
"domicileAddress": "Địa chỉ hộ khẩu",
"chiefComplaint": "Lý do khám",
"bedNo": "Số giường",
"preliminaryDiagnosis": "Chẩn đoán sơ bộ",
"doctorSignature": "Chữ ký bác sĩ",
"personalHistory": "Tiền sử cá nhân",
"maritalStatus": "Tình trạng hôn nhân",
"occupation": "Nghề nghiệp",
"familyHistory": "Tiền sử gia đình",
"idCard": "CMND/CCCD",
"homeAddress": "Địa chỉ nhà",
"maritalHistory": "Tiền sử hôn nhân",
"phone": "Điện thoại",
"inpatientNo": "Số nội trú",
"gender": "Giới tính",
"name": "Họ tên",
"admissionDate": "Ngày nhập viện",
"reliability": "Độ tin cậy",
"medicalHistoryNarrator": "Người kể bệnh sử",
"pastHistory": "Tiền sử bệnh",
"title": "Bệnh án nhập viện",
"nation": "Dân tộc",
"physicalExamination": "Khám thể lực",
"workUnit": "Nơi làm việc"
},
"listFee": {
"quantity": "Số lượng",
"amount": "Số tiền",
"doctorName": "Bác sĩ",
"feeList": "Danh sách phí",
"enterTime": "Thời gian nhập",
"total": "Tổng cộng",
"itemType": "Loại",
"title": "Bệnh nhân nội trú",
"itemName": "Tên mục",
"specification": "Quy cách",
"searchPlaceholder": "Tìm bệnh nhân(tên/số nội trú)",
"unitPrice": "Đơn giá"
}
},
"outpatientEnhanced": {
"title": "Trạm làm việc bác sĩ ngoại trú nâng cao",
"structuredTemplate": "Mẫu bệnh án cấu trúc",
"addTemplate": "Thêm mẫu",
"templateName": "Tên mẫu",
"type": "Loại",
"department": "Khoa",
"version": "Phiên bản",
"systemTemplate": "Mẫu hệ thống",
"icd10Code": "Mã ICD-10",
"searchPlaceholder": "Nhập mã/tên/pinyin",
"code": "Mã",
"diagnosisName": "Tên chẩn đoán",
"category": "Phân loại",
"isLeaf": "Cấp cuối",
"rationalDrugUse": "Kiểm tra sử dụng thuốc hợp lý",
"drugInteractionCheck": "Kiểm tra tương tác thuốc",
"drugA": "Thuốc A",
"drugB": "Thuốc B",
"check": "Kiểm tra",
"foundInteractionRules": "Tìm thấy {count} quy tắc tương tác",
"noInteraction": "Không phát hiện tương tác",
"interactionType": "Loại",
"severity": "Mức độ nghiêm trọng",
"description": "Mô tả",
"dischargeSummary": "Tóm tắt xuất viện",
"patient": "Bệnh nhân",
"admissionDiagnosis": "Chẩn đoán nhập viện",
"dischargeDiagnosis": "Chẩn đoán xuất viện",
"dischargeCondition": "Tình trạng xuất viện",
"attendingDoctor": "Bác sĩ điều trị",
"draft": "Bản nháp",
"completed": "Hoàn thành",
"archived": "Đã lưu trữ",
"prescriptionIntercept": "Chặn đơn thuốc",
"intercept": "Chặn",
"forcePass": "Ép thông qua",
"drug": "Thuốc",
"interceptType": "Loại chặn",
"message": "Thông báo",
"doctor": "Bác sĩ",
"action": "Xử lý",
"blocked": "Đã chặn"
},
"outpatientFinance": {
"dayEndSetTitle": "Quản lý quyết toán cuối ngày",
"settleDate": "Ngày quyết toán",
"selectDate": "Chọn ngày",
"cashier": "Thu ngân",
"cashierName": "Tên thu ngân",
"seq": "STT",
"totalAmount": "Tổng tiền",
"cash": "Tiền mặt",
"card": "Quẹt thẻ",
"wechat": "WeChat",
"alipay": "Alipay",
"settled": "Đã quyết toán",
"unsettled": "Chưa quyết toán",
"dayEndDetail": "Chi tiết cuối ngày",
"dayEndReport": "bao-cao-cuoi-ngay.xlsx",
"exportSuccess": "Xuất thành công"
}
}

View File

@@ -741,7 +741,6 @@
"confirmBatchDelete": "确认删除选中的数据项吗?",
"noPermission": "暂无权限",
"loading": "加载中...",
"noData": "暂无数据",
"pleaseSelect": "请选择",
"pleaseEnter": "请输入",
"queryTime": "查询时间",
@@ -769,7 +768,57 @@
"no": "否",
"startTime": "开始日期",
"endTime": "结束日期",
"gender": "性别"
"gender": "性别",
"keyword": "关键字",
"applicationNo": "申请单号",
"patientName": "患者姓名",
"applicationType": "申请类型",
"applicationTime": "申请时间",
"startDate": "开始日期",
"endDate": "结束日期",
"age": "年龄",
"outpatientNo": "门诊号",
"applicationItem": "申请项目",
"applicantDoctor": "申请医生",
"applicantDept": "申请科室",
"currentPatients": "现诊患者",
"enterPatientName": "请输入患者名",
"firstVisit": "初诊",
"patientInfo": "患者信息",
"registrationTime": "挂号时间",
"item": "项目",
"totalQty": "总量",
"totalAmount": "总金额",
"pharmacyDept": "药房/科室",
"issuer": "签发人",
"issueTime": "签发时间",
"male": "男",
"female": "女",
"yearsOld": "岁",
"visitDate": "就诊日期",
"basicInfo": "基础信息",
"visitNo": "就诊号",
"name": "姓名",
"noData": "暂无数据",
"group": "组",
"code": "编码",
"totalExecutions": "总执行次数",
"executedCount": "已执行次数",
"orderingDoctor": "开单医生",
"drugInfo": "药品信息",
"drugQty": "药品数量",
"drugStatus": "药品状态",
"skinTestFlag": "皮试标志",
"executionTime": "执行时间",
"executor": "执行人",
"executionDept": "执行科室",
"executionStatus": "执行状态",
"infusionOrder": "院注医嘱",
"infusionHistory": "院注执行历史",
"confirmExecution": "确认执行",
"printBottleLabel": "打印瓶签",
"viewOrders": "查看医嘱",
"revoke": "撤销"
},
"component": {
"rightToolbar": {
@@ -1461,78 +1510,6 @@
"msgOrderAdjusted": "队列顺序已调整(已保存)",
"msgOrderAdjustFailed": "队列顺序调整失败(未保存)"
},
"pharmacy": {
"patientInfo": "患者信息",
"placeholderNameOrId": "请输入姓名/证件号",
"dispenseStatus": "发药状态",
"placeholderSelectDispenseStatus": "请选择发药状态",
"visitDate": "就诊日期",
"startDate": "开始日期",
"endDate": "结束日期",
"name": "姓名",
"gender": "性别",
"age": "年龄",
"phone": "电话",
"visitDateCol": "就诊日期",
"preparer": "调配药师",
"placeholderPreparer": "调配药师",
"drugCategory": "药品分类",
"placeholderDrugCategory": "药品分类",
"westernChinese": "西药中成药",
"chinese": "中药",
"project": "项目",
"placeholderProject": "项目",
"all": "全部",
"drug": "药品",
"consumable": "耗材",
"batchDispense": "批量发药",
"scan": "扫码",
"prescriptionPrint": "处方打印",
"totalAmount": "总金额",
"prescriptionNo": "处方号",
"diagnosis": "诊断",
"prescriptionType": "处方类型",
"itemName": "项目名称",
"merchandiseName": "商品名称",
"dispenseQty": "发药数量",
"lotNumber": "批次号",
"dispenseStatusCol": "发药状态",
"days": "天数",
"spec": "规格",
"traceNo": "追溯码",
"placeholderTraceNo": "请输入追溯码",
"amount": "金额",
"dispensePharmacy": "发药药房",
"manufacturer": "生产厂家",
"orderingDoctor": "开单医生",
"frequency": "频次",
"usage": "用法",
"operation": "操作",
"dispense": "发药",
"void": "作废",
"selectVoidReason": "选择作废原因",
"placeholderSelectVoidReason": "请选择作废原因",
"confirm": "确定",
"cancel": "取消",
"printWarningNoTable": "表格组件未初始化,请刷新页面重试",
"printWarningNoSelect": "未选择要打印的项目,请重新选择,打印失败",
"printWarningNoData": "获取打印数据失败,请稍后重试",
"printFailed": "处方打印失败",
"msgDispenseSuccess": "发药成功",
"msgDispenseFailed": "发药失败",
"msgNoMatchTraceNo": "未在库存中匹配到追溯码,请在发药列表中单独扫描",
"msgOperationFailed": "操作失败",
"msgInsufficientStock": "当前批次库存不足",
"msgQtyExceedsTotal": "发药数量不能大于总数量",
"msgQtyBelowTotal": "发药数量不能小于总数量",
"msgSelectDispenseItem": "未选择要发药的项目,请重新选择,发药失败",
"msgSelectVoidReason": "请选择作废原因",
"msgNoDataSelected": "未选择数据",
"voiding": "作废中...",
"yuan": "元",
"remaining": "剩余",
"expDate": "有效期至"
},
"billing": {
"patientList": "患者列表",
"searchPlaceholder": "请输入患者名/病历号",
@@ -7410,5 +7387,666 @@
"withdrawn": "已撤回",
"pendingApply": "待审请"
}
},
"inHospital": {
"medicalRecord": {
"patient": "患者",
"deptName": "科室",
"discharged": "已出院",
"unitPrice": "单价",
"admissionDate": "入院日期",
"itemName": "项目名称",
"inpatientNo": "住院号",
"specification": "规格",
"gender": "性别",
"dischargeDate": "出院日期",
"quantity": "数量",
"feeOverview": "费用概览",
"patientName": "患者姓名",
"department": "科室",
"status": "状态",
"reset": "重置",
"inHospital": "在院",
"search": "搜索",
"age": "年龄",
"bedNo": "床号",
"amount": "金额",
"title": "病案管理",
"detail": "病案详情",
"itemType": "类型"
},
"settleAccounts": {
"chargeDetail": "收费详情",
"refundReasonMaxLength": "退费原因长度不能超过200个字符",
"reset": "重置",
"enterRefundReason": "请输入退费原因",
"confirm": "确 定",
"patientNameCol": "患者姓名",
"enterReason": "请输入原因",
"printCount": "打印次数",
"feeType": "费用类型",
"cashier": "收款人",
"payResult": "支付结果",
"refund": "退费",
"payStatus": "支付状态",
"amount": "金额",
"payment": "交款",
"refundReason": "退费原因",
"payAmount": "支付金额",
"chargeSerialNo": "收费流水号",
"refundSuccess": "退费成功",
"settleTimeCol": "结算时间",
"cancel": "取 消",
"settleTime": "结算时间:",
"writeOffReason": "冲销原因",
"settleAmount": "结算金额",
"issueInvoice": "开具电子发票",
"invoiceNoCol": "发票号",
"patientNamePlaceholder": "患者姓名",
"viewInvoice": "调阅发票",
"query": "查询",
"patientName": "患者姓名:",
"invoiceNoPlaceholder": "发票号",
"writeOffInvoice": "冲销发票",
"writeOffSuccess": "红冲成功",
"payType": "支付类型",
"medicalSettleId": "医保结算Id",
"invoiceNo": "发票号:",
"reasonLengthLimit": "长度在1到200个字符之间",
"change": "找零"
},
"common": {
"loading": "加载中",
"success": "操作成功",
"search": "搜索",
"prompt": "提示",
"reset": "重置",
"delete": "删除",
"endDate": "结束日期",
"bedNo": "床号",
"pleaseEnter": "请输入",
"start": "开始",
"gender": "性别",
"pleaseSelect": "请选择",
"confirmDelete": "确认删除?",
"void": "作废",
"seqNo": "序号",
"age": "年龄",
"modify": "修改",
"deptName": "科室",
"detail": "详情",
"startTime": "开始时间",
"status": "状态",
"cancel": "取消",
"noData": "暂无数据",
"complete": "完成",
"yuan": "元",
"endTime": "结束时间",
"edit": "编辑",
"view": "查看",
"query": "查询",
"address": "地址",
"save": "保存",
"patientName": "患者姓名",
"print": "打印",
"confirm": "确定",
"inpatientNo": "住院号",
"add": "新增",
"fail": "操作失败",
"startDate": "开始日期",
"operation": "操作",
"phone": "手机"
},
"feeTypeConversion": {
"patientNo": "患者编号:",
"medicalCard": "医保卡",
"specialOutpatient": "特殊门诊",
"convertToSelf": "转自费",
"feeType": "费别",
"personType": "人员类别:",
"birthDate": "出生日期:",
"idType": "证件类型:",
"insuredPlace": "参保地",
"traumaFlag": "外伤标志",
"wardArea": "病区",
"balance": "账户余额:",
"diseaseName": "病种名称",
"medicalCategory": "医疗类别",
"medicalFace": "医保刷脸",
"socialSecurityCard": "社会保障卡",
"medicalRegistration": "医保登记",
"medicalECard": "医保电子凭证",
"repeatHospitalization": "重复住院",
"thirdPartyLiability": "第三方责任",
"patientNameLabel": "患者姓名",
"selectDate": "请选择日期",
"residentIdCard": "居民身份证",
"emergencyFlag": "急诊标志",
"enter": "请输入",
"feeUpload": "费用上传",
"inpatientNo": "住院号",
"registrationChange": "登记变更",
"companyName": "单位名称:",
"insuranceType": "险种类型:",
"admissionDiagnosis": "入院诊断",
"basicInfo": "基础信息",
"age": "年龄:",
"patientName": "患者姓名:",
"originalFeeType": "原费别:",
"insuredArea": "参保区域:",
"foreignFlag": "涉外标志",
"clinicalTrial": "临床试验",
"cityEmployeeMedical": "市职工医保",
"readCard": "读卡",
"admissionDate": "入院日期",
"specialPoorHousehold": "特困户",
"gender": "性别:"
},
"settlement": {
"patientInfo": "患者信息",
"name": "姓名",
"returnAmount": "退还金额",
"cash": "现金",
"amount": "金额",
"uncheckedCost": "勾选未结费用:",
"supplementary": "补缴",
"rechargeTime": "充值时间",
"advanceTotal": "预缴金合计金额:",
"selectSettleFee": "选择结算费用",
"midwaySettlement": "中途结算",
"settleSuccess": "结算成功!",
"query": "查询",
"tip": "提示",
"advanceManagement": "预缴金管理",
"returnMethod": "返还方式",
"addDeduction": "添加减免",
"receivable": "应收",
"refund": "返费",
"inpatientSettlement": "住院结算",
"selfPay": "自付:",
"deduction": "减免:",
"project": "项目",
"noData": "暂无数据",
"inpatientNo": "住院号",
"remark": "备注",
"cancelMedicalDischarge": "是否取消患者的医保出院登记?",
"cancelSettle": "取消结算",
"checkedCost": "勾选已结费用:",
"reimbursement": "报销:",
"payMethodLabel": "缴费方式",
"confirm": "确认",
"invoiceNoLabel": "发票号",
"category": "类别",
"settleType": "结算类型",
"toDeposit": "转押金",
"wechat": "微信",
"total": "总额:",
"payMethod": "支付方式",
"masterIndex": "主索引",
"currentInvoiceNo": "当前发票号: ",
"settlementCancel": "结算取消",
"returnable": "应返",
"medicalAccount": "医保账户:",
"bankCard": "银行卡",
"settler": "结算人",
"availableAmount": "可用金额",
"skipNumber": "跳号",
"alipay": "支付宝",
"balance": "余额:",
"totalCost": "总费用:",
"totalFee": "费用总额:",
"advancePayment": "预缴金:",
"settle": "结算",
"advanceBalance": "预交余额:",
"used": "已使用",
"reimbursementMethod": "报销方式",
"settleCancelSuccess": "结算取消成功!",
"noPatientFound": "未查询到患者!",
"preSettle": "预结算"
},
"surgeryManage": {
"confirm": "确定",
"confirmStart": "确认开始该手术?",
"inpatientNo": "住院号",
"remarkPlaceholder": "手术备注信息",
"surgeonName": "手术医生",
"complete": "完成",
"surgeryName": "手术名称",
"all": "全部",
"enterPatientName": "请输入患者姓名",
"cancel": "取消",
"addSurgery": "新增手术",
"enterSurgeonName": "请输入手术医生",
"start": "开始",
"pending": "待手术",
"confirmComplete": "确认完成该手术?",
"surgeryDetail": "手术详情",
"surgeryRemark": "手术备注",
"level3": "三级",
"patientName": "患者姓名",
"pendingSurgery": "待手术",
"search": "搜索",
"editSuccess": "修改成功",
"status": "状态",
"enterSurgeryName": "请输入手术名称",
"surgeryDone": "已完成",
"selectTime": "选择时间",
"deleteSuccess": "删除成功",
"title": "手术管理",
"anesthesiologist": "麻醉医生",
"delete": "删除",
"confirmDelete": "确认删除该手术记录?",
"level1": "一级",
"reset": "重置",
"inProgress": "手术中",
"surgeryDate": "手术日期",
"surgeryInProgress": "手术中",
"detail": "详情",
"edit": "编辑",
"surgeryStarted": "手术已开始",
"plannedTime": "计划时间",
"selectLevel": "选择等级",
"cancelled": "已取消",
"level4": "四级",
"patient": "患者",
"completed": "已完成",
"addSuccess": "新增成功",
"surgeryCompleted": "手术已完成",
"surgeryStatus": "手术状态",
"surgeryCancelled": "已取消",
"surgeryLevel": "手术等级",
"level2": "二级"
},
"portal": {
"deleteDev": "删除功能开发中",
"disabled": "停用",
"name": "名称",
"addDev": "新增功能开发中",
"delete": "删除",
"status": "状态",
"editDev": "编辑功能开发中",
"code": "编码",
"title": "住院门户",
"search": "搜索",
"edit": "编辑",
"normal": "正常",
"add": "新增",
"seqNo": "序号",
"operation": "操作"
},
"inpatientDiagnosis": {
"doctor": "诊断医生",
"addSuccess": "新增成功",
"dischargeDiagnosis": "出院诊断",
"delete": "删除",
"selectClassification": "选择分类",
"editSuccess": "修改成功",
"confirm": "确定",
"enterDiagnosisName": "请输入诊断名称",
"confirmDelete": "确认删除该诊断?",
"encounterId": "就诊ID",
"mainDiagnosis": "主诊断",
"cancel": "取消",
"title": "入院诊断",
"diagnosisDesc": "诊断描述",
"operationFail": "操作失败",
"addDiagnosis": "新增诊断",
"outpatientDiagnosis": "门诊诊断",
"selectDate": "选择日期",
"classification": "分类",
"admissionDiagnosis": "入院诊断",
"diagnosisDate": "诊断日期",
"secondary": "次要",
"edit": "编辑",
"query": "查询",
"postopDiagnosis": "术后诊断",
"preopDiagnosis": "术前诊断",
"deleteSuccess": "删除成功",
"enterEncounterId": "请输入就诊ID",
"diagnosisName": "诊断名称"
},
"orderManage": {
"startTime": "开始时间",
"unknown": "未知",
"confirmResume": "确认恢复该医嘱?",
"confirmSignOff": "确认签退该医嘱?",
"signOff": "签退",
"currentAdvice": "当前医嘱",
"type": "类型",
"stopped": "医嘱已停止",
"resume": "恢复",
"status": "状态",
"frequency": "频次",
"adviceContent": "医嘱内容",
"route": "途径",
"searchPlaceholder": "搜索患者(姓名/住院号)",
"signedOff": "医嘱已签退",
"confirmStop": "确认停止该医嘱?",
"historyAdvice": "历史医嘱",
"adviceList": "医嘱列表",
"resumed": "医嘱已恢复",
"stop": "停止",
"dosage": "剂量",
"title": "住院患者",
"prescribingDoctor": "开嘱医生"
},
"feeSettlement": {
"selfToMedical": "自费转医保",
"medicalCard": "医保卡",
"chargeItem": "收费项目",
"balanceAmount": "账户余额",
"patientList": "患者列表",
"preSettleFail": "预结算失败",
"settleStatus": "结算状态",
"selectChargeItem": "请选择一条收费项目",
"discountRate": "折扣率",
"medicalToSelf": "医保转自费",
"gender": "性别:",
"reading": "正在读取...",
"searchPlaceholder": "请输入患者名/住院号/床号",
"receivable": "应收金额",
"confirmCharge": "确认收费",
"medicalCode": "医保编码",
"docNo": "单据号",
"amount": "金额",
"age": "年龄:",
"chargeItems": "收费项目",
"idCard": "身份证",
"name": "姓名:",
"feeNature": "费用性质",
"chargeTime": "收费时间",
"operationSuccess": "操作成功",
"settleStatusCol": "结算状态",
"medicalType": "医疗类型",
"cashier": "收款人",
"received": "实收金额",
"discount": "优惠金额",
"totalAmount": "合计金额:",
"quantity": "数量",
"studentSelfToMedical": "学生自费转学生医保",
"studentMedicalToSelf": "学生医保转学生自费",
"basicInfo": "基本信息",
"prescriptionNo": "处方号",
"orderDept": "开立科室",
"print": "打印",
"eVoucher": "电子凭证"
},
"register": {
"patientCode": "患者编码:",
"registered": "已登记",
"admissionWard": "入院病区",
"pendingRegistration": "待登记入院",
"contactRelation": "联系人关系",
"admissionDeptLabel": "入院科室",
"advanceNotFilled": "住院预交金额未填写,确认登记吗",
"medicalRegistrationConfirm": "是否需要进行医保登记?",
"paymentAdvance": "缴费预交金",
"admissionTypeLabel": "入院类型",
"registerBtn": "登记",
"currentAddress": "现住址:",
"wardRequired": "请选择入院病区",
"detailAddress": "详细地址",
"enterIdCard": "请输入身份证号码",
"idCardNo": "身份证号码",
"basicInfo": "基础信息",
"viewResult": "查看结果",
"hospitalInfo": "住院信息",
"idCard": "身份证号",
"admissionWardLabel": "入院病区",
"printCert": "打印住院证",
"admissionDateLabel": "入院日期",
"admissionType": "入院类型",
"addressSelect": "地址选择",
"jumpMedicalFail": "跳转到医保登记页面失败",
"confirmVoid": "确认作废该患者的住院登记信息吗?作废后不可撤销",
"idCardNumber": "证件号码",
"gender": "性别",
"bloodTypeABO": "血型ABO",
"phoneLabel": "手机:",
"companyName": "单位名称:",
"cardType": "卡类别",
"medicalCardNo": "就诊卡号",
"reset": "重置",
"nationality": "国籍:",
"countryCode": "国家编码",
"applicationSource": "申请来源",
"applyPatient": "申请患者",
"nationLabel": "民族:",
"contactInfo": "联系方式",
"query": "查询",
"deceasedTime": "死亡时间",
"voidedCannotPrint": "该记录已作废,无法打印入院证",
"view": "查看",
"admissionDept": "入院科室",
"admissionMethod": "入院方式",
"patientIdNotExist": "患者 ID 不存在",
"age": "年龄",
"registrationStatus": "登记状态",
"diagnosisDesc": "诊断描述",
"printCertFail": "打印入院证失败",
"medicalRegistrationTitle": "医保登记确认",
"voided": "已作废",
"deptRequired": "请选择入院科室",
"applicationTime": "申请时间",
"voidFail": "作废失败",
"feeNature": "费用性质",
"contactPerson": "联系人",
"selectDeptFirst": "请先选择入院科室",
"ageRequired": "请输入年龄",
"modify": "修改",
"contactRequired": "请输入联系方式",
"genderLabel": "性别:",
"occupation": "职业",
"void": "作废",
"enterPatientName": "请输入患者姓名",
"hospitalCount": "住院次数:",
"bedCount": "床位数:",
"invalidRowData": "无效的行数据",
"medicalInfo": "医保信息",
"encounterIdNotExist": "就诊 ID 不存在",
"bloodTypeRH": "血型RH",
"patientSource": "病人来源:",
"nation": "民族",
"loadSuccess": "加载成功",
"patientName": "患者姓名",
"patientNameRequired": "请输入患者姓名",
"voidConfirm": "作废确认",
"idNoLabel": "证件号:",
"yearSuffix": "岁",
"noFileRegistration": "无档登记",
"registrationTime": "登记时间",
"birthDateLabel": "出生日期:",
"hospitalNo": "住院号:",
"scanPay": "扫码支付",
"voidSuccess": "作废成功",
"contactPhone": "联系人电话",
"saveBtn": "保存",
"patientInpatientNo": "患者住院号",
"registrar": "登记员",
"feeNatureLabel": "费用性质",
"completedRegistration": "已登记入院",
"occupationLabel": "职业:",
"ageLabel": "年龄:",
"workUnit": "工作单位",
"maritalStatus": "婚姻状态",
"admitted": "已入科",
"nativePlace": "籍贯:",
"diagnosisRequired": "请选择入院诊断",
"selectPatient": "请先从列表中选中一位患者",
"noPatientInfo": "未获取到患者信息",
"registerBtnLabel": "登记",
"admissionDiagnosis": "入院诊断",
"inHospitalPatient": "在院患者",
"outpatientDoctor": "门诊医生",
"noHospitalInfo": "未获取到住院信息",
"patientCondition": "患者病情",
"idTypeLabel": "证件类型:",
"pending": "待登记",
"diagnosisCategory": "诊断类别",
"registerFail": "登记失败",
"marriage": "婚姻:"
},
"advanceDeposit": {
"confirm": "确 定",
"confirmRefund": "确认退费",
"rmbPrefix": "人民币:",
"select": "选择",
"patientNo": "患者编号",
"feeType": "费用类型:",
"actualCollect": "实收合计:",
"actualRefund": "实退合计:",
"chargeFail": "收费失败",
"cancel": "取 消",
"bedNo": "床号:",
"collectTime": "收款时间",
"unionPay": "银联",
"wechat": "微信",
"selfPay": "自费",
"inHospitalPatient": "在院患者",
"printSuccess": "打印成功",
"cashier": "收款员",
"payAmount": "支付金额:",
"confirmCharge": "确认收费",
"payMethod": "支付方式",
"hospitalNoPlaceholder": "请输入住院号",
"networkError": "网络错误,请重试",
"selectPayMethod": "请选择支付方式",
"refund": "退费",
"enterPayAmount": "请输入支付金额",
"advanceTotal": "预交金总额:",
"advancePayment": "住院预缴款",
"deptWard": "在院科室/病区:",
"serialNo": "流水号/住院号/患者姓名",
"query": "查询",
"receiptNo": "收据号",
"print": "打印",
"billType": "票据类型",
"wardArea": "在院病区",
"balance": "余额:",
"printFail": "打印失败",
"enterHospitalNo": "请先输入住院号!",
"payAmountMustPositive": "支付金额必须大于0",
"reprintTag": "补打第",
"cash": "现金",
"payMethodLabel": "支付方式:",
"chargeSuccess": "收费成功",
"patientList": "患者列表",
"alipay": "支付宝",
"amount": "金额",
"selectPatient": "请先选择病人!",
"hospitalNo": "住院号:",
"collectAdvance": "收预交金"
},
"listFee": {
"amount": "金额",
"enterTime": "录入时间",
"quantity": "数量",
"title": "住院患者",
"feeList": "费用清单",
"itemName": "项目名称",
"searchPlaceholder": "搜索患者(姓名/住院号)",
"doctorName": "开单医生",
"unitPrice": "单价",
"specification": "规格",
"total": "合计",
"itemType": "类型"
},
"inpatientRecord": {
"chiefComplaint": "主诉",
"occupation": "职业",
"auxiliaryCheck": "辅助检查",
"reliability": "可靠程度",
"medicalHistoryNarrator": "病史陈述者",
"presentIllness": "现病史",
"pastHistory": "既往史",
"idCard": "身份证号",
"homeAddress": "家庭地址",
"familyHistory": "家族史",
"specialtyCheck": "专科检查",
"workUnit": "工作单位",
"age": "年龄",
"gender": "性别",
"title": "入院记录",
"maritalStatus": "婚姻",
"inpatientNo": "住院号",
"department": "科室",
"domicileAddress": "户口地址",
"nation": "民族",
"doctorSignature": "医师签名",
"personalHistory": "个人史",
"preliminaryDiagnosis": "初步诊断",
"writingTime": "书写时间",
"name": "姓名",
"bedNo": "床号",
"contactPerson": "联系人",
"physicalExamination": "体格检查",
"medicalRecordWriteTime": "病历书写时间",
"maritalHistory": "婚育史",
"admissionDate": "入院日期",
"phone": "电话",
"relationship": "关系"
}
},
"outpatientEnhanced": {
"title": "门诊医生工作站增强",
"structuredTemplate": "结构化病历模板",
"addTemplate": "新增模板",
"templateName": "模板名称",
"type": "类型",
"department": "科室",
"version": "版本",
"systemTemplate": "系统模板",
"icd10Code": "ICD-10编码",
"searchPlaceholder": "输入编码/名称/拼音",
"code": "编码",
"diagnosisName": "诊断名称",
"category": "分类",
"isLeaf": "末级",
"rationalDrugUse": "合理用药审核",
"drugInteractionCheck": "用药相互作用检查",
"drugA": "药品A",
"drugB": "药品B",
"check": "检查",
"foundInteractionRules": "发现 {count} 条相互作用规则",
"noInteraction": "未发现相互作用",
"interactionType": "类型",
"severity": "严重程度",
"description": "描述",
"dischargeSummary": "出院小结",
"patient": "患者",
"admissionDiagnosis": "入院诊断",
"dischargeDiagnosis": "出院诊断",
"dischargeCondition": "出院情况",
"attendingDoctor": "主管医生",
"draft": "草稿",
"completed": "已完成",
"archived": "已归档",
"prescriptionIntercept": "处方拦截",
"intercept": "拦截",
"forcePass": "强制通过",
"drug": "药品",
"interceptType": "拦截类型",
"message": "信息",
"doctor": "医生",
"action": "处理",
"blocked": "已拦截"
},
"outpatientFinance": {
"dayEndSetTitle": "日结结算单管理",
"settleDate": "结算日期",
"selectDate": "选择日期",
"cashier": "收费员",
"cashierName": "收费员姓名",
"seq": "序号",
"totalAmount": "总金额",
"cash": "现金",
"card": "刷卡",
"wechat": "微信",
"alipay": "支付宝",
"settled": "已结",
"unsettled": "未结",
"dayEndDetail": "日结详情",
"dayEndReport": "日结报表.xlsx",
"exportSuccess": "导出成功"
}
}

View File

@@ -141,7 +141,7 @@
{{ recordDetail.airwayAssessment }}
</el-descriptions-item>
<el-descriptions-item label="禁食确认">
{{ recordDetail.fastingConfirmed ? '是' : '否' }}
{{ recordDetail.fastingConfirmed ? $t('common.yes') : $t('common.no') }}
</el-descriptions-item>
<el-descriptions-item label="知情同意">
{{ recordDetail.consentSigned ? '已签署' : '未签署' }}
@@ -294,10 +294,12 @@
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { getRecordDetail, getByEncounter, getVitalSigns, getMedications, getIoSummary, completeRecord } from '@/api/anesthesia'
import { ElMessage, ElMessageBox } from 'element-plus'
const { proxy } = getCurrentInstance()
const { t } = useI18n()
const loading = ref(false)
const showSearch = ref(true)
const dataList = ref([])

View File

@@ -119,7 +119,7 @@
:type="row.nauseaVomiting?'danger':'success'"
size="small"
>
{{ row.nauseaVomiting?'是':'否' }}
{{ row.nauseaVomiting?$t('common.yes'):$t('common.no') }}
</el-tag>
</template>
</el-table-column>
@@ -246,8 +246,10 @@
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {useI18n} from 'vue-i18n'
import {ElMessage,ElMessageBox} from 'element-plus'
import {getSpecimenPage,addSpecimen,reportSpecimen,getFollowupPage,addFollowup,getQcPage,addQc,getQcStats} from './api'
const { t } = useI18n()
const tab=ref('specimen')
const specData=ref([]),fuData=ref([]),qcData=ref([])
const qcStats=ref({})

View File

@@ -188,7 +188,7 @@
:type="s.row.requireApproval?'danger':'success'"
size="small"
>
{{ s.row.requireApproval?'是':'否' }}
{{ s.row.requireApproval?$t('common.yes'):$t('common.no') }}
</el-tag>
</template>
</el-table-column>
@@ -347,7 +347,7 @@
{{ detailData.maxDurationDays }}
</el-descriptions-item>
<el-descriptions-item label="需审批">
{{ detailData.requireApproval ? '是' : '否' }}
{{ detailData.requireApproval ? $t('common.yes') : $t('common.no') }}
</el-descriptions-item>
<el-descriptions-item
label="适应症"
@@ -373,9 +373,11 @@
<script setup>
import {ref, reactive, onMounted} from 'vue'
import {useI18n} from 'vue-i18n'
import {ElMessage} from 'element-plus'
import {getRules, getStatistics, addRule} from '@/api/antibiotic'
const { t } = useI18n()
const loading = ref(false)
const list = ref([])
const showAdd = ref(false)

View File

@@ -132,7 +132,7 @@
>
<template #default="scope">
<el-tag :type="scope.row.isDisabled ? 'danger' : 'success'">
{{ scope.row.isDisabled ? '是' : '否' }}
{{ scope.row.isDisabled ? $t('common.yes') : $t('common.no') }}
</el-tag>
</template>
</vxe-column>
@@ -151,7 +151,7 @@
>
<template #default="scope">
<el-tag :type="scope.row.void ? 'danger' : 'success'">
{{ scope.row.void ? '是' : '否' }}
{{ scope.row.void ? $t('common.yes') : $t('common.no') }}
</el-tag>
</template>
</vxe-column>
@@ -366,6 +366,7 @@
<script setup name="ClinicRoom">
import {getCurrentInstance, onMounted, reactive, ref} from 'vue'
import {useI18n} from 'vue-i18n'
import {ElMessage, ElMessageBox} from 'element-plus'
import {
addClinicRoom,
@@ -378,6 +379,7 @@ import {
} from '@/api/appoinmentmanage/clinicRoom'
const { proxy } = getCurrentInstance()
const { t } = useI18n()
// 加载状态
const loading = ref(false)

View File

@@ -7,36 +7,36 @@
:model="queryParams"
:inline="true"
>
<el-form-item label="就诊日期">
<el-form-item :label="t('common.visitDate')">
<el-date-picker
v-model="dateRange"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('common.startDate')"
:end-placeholder="t('common.endDate')"
style="width: auto"
value-format="YYYY-MM-DD"
@change="handleQuery"
/>
</el-form-item>
<el-form-item
label="基础信息"
:label="t('common.basicInfo')"
prop="searchKey"
>
<el-input
v-model="queryParams.searchKey"
placeholder="门诊号/病人/ID"
:placeholder="t('common.outpatientNo') + '/' + t('common.name') + '/ID'"
clearable
style="width: 150px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item
label="执行状态"
:label="t('common.executionStatus')"
prop="searchKey"
>
<el-select
v-model="queryParams.serviceStatus"
placeholder="执行状态"
:placeholder="t('common.executionStatus')"
style="width: 150px"
@change="handleQuery"
>
@@ -54,13 +54,13 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ t('common.search') }}
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
{{ t('common.reset') }}
</el-button>
</div>
</el-form>
@@ -74,24 +74,24 @@
>
<vxe-column
field="encounterBusNo"
title="就诊号"
:title="t('common.visitNo')"
width="120px"
/>
<vxe-column
field="patientName"
title="姓名"
:title="t('common.name')"
/>
<vxe-column
field="genderEnum_enumText"
title="性别"
:title="t('common.gender')"
/>
<vxe-column
field="ageString"
title="年龄"
:title="t('common.age')"
/>
<vxe-column
field="serviceStatus_enumText"
title="执行状态"
:title="t('common.executionStatus')"
/>
</vxe-table>
<pagination
@@ -116,7 +116,7 @@
icon="SuccessFilled"
@click="handleSubmit"
>
确认执行
{{ t('common.confirmExecution') }}
</el-button>
<!-- <el-button type="primary" plain icon="Printer" @click="resetQuery">打印患者卡</el-button> -->
<el-button
@@ -125,7 +125,7 @@
icon="Printer"
@click="printLabel"
>
打印瓶签
{{ t('common.printBottleLabel') }}
</el-button>
<!-- <el-button type="primary" plain icon="Printer" @click="printbloodLabel"> -->
<!-- 打印采血条码 -->
@@ -136,13 +136,13 @@
plain
@click="geiAdviceList"
>
查看医嘱
{{ t('common.viewOrders') }}
</el-button>
</el-form-item>
</el-form>
<div>
<p style="margin: 0px 0px 10px 0px">
院注医嘱
{{ t('common.infusionOrder') }}
</p>
<vxe-table
ref="tableRef"
@@ -158,7 +158,7 @@
align="center"
/>
<vxe-column
title=""
:title="t('common.group')"
width="50"
>
<template #default="scope">
@@ -168,37 +168,37 @@
<!-- <vxe-column field="groupId" title="组" width="60" /> -->
<vxe-column
field="busNo"
title="编码"
:title="t('common.code')"
align="center"
/>
<vxe-column
field="serviceName"
title="项目"
:title="t('common.item')"
align="center"
/>
<vxe-column
field="executeNum"
title="总执行次数"
:title="t('common.totalExecutions')"
align="center"
/>
<vxe-column
field="performCount"
title="已执行次数"
:title="t('common.executedCount')"
align="center"
/>
<vxe-column
field="practitionerName"
title="开单医生"
:title="t('common.orderingDoctor')"
align="center"
/>
<vxe-column
field="medicationName"
title="药品信息"
:title="t('common.drugInfo')"
align="center"
/>
<vxe-column
field="dose"
title="药品数量"
:title="t('common.drugQty')"
align="center"
>
<template #default="scope">
@@ -214,12 +214,12 @@
<!-- <vxe-column field="speed" title="输液速度" width="80" /> -->
<vxe-column
field="dispenseStatus_enumText"
title="药品状态"
:title="t('common.drugStatus')"
align="center"
/>
<vxe-column
field="skinTestFlag_enumText"
title="皮试标志"
:title="t('common.skinTestFlag')"
align="center"
/>
<!-- <vxe-column field="clinicalStatusEnum_enumText" title="皮试结果" width="70" /> -->
@@ -227,7 +227,7 @@
</div>
<div>
<p style="margin: 13px 0px 10px 0px">
院注执行历史
{{ t('common.infusionHistory') }}
</p>
<vxe-table
:data="historyRecordsList"
@@ -236,7 +236,7 @@
>
<vxe-column
field="occurrenceEndTime"
title="执行时间"
:title="t('common.executionTime')"
align="center"
width="260"
>
@@ -259,26 +259,26 @@
</vxe-column>
<vxe-column
field="performerName"
title="执行人"
:title="t('common.executor')"
align="center"
/>
<vxe-column
field="serviceStatus_enumText"
title="执行状态"
:title="t('common.executionStatus')"
align="center"
/>
<vxe-column
field="serviceName"
title="项目"
:title="t('common.item')"
align="center"
/>
<vxe-column
field="orgName"
title="执行科室"
:title="t('common.executionDept')"
align="center"
/>
<vxe-column
title="操作"
:title="t('common.operation')"
align="center"
width="90"
fixed="right"
@@ -291,7 +291,7 @@
icon="Edit"
@click="handleCancelPerform(scope.row)"
>
撤销
{{ t('common.revoke') }}
</el-button>
</template>
</vxe-column>
@@ -308,6 +308,7 @@
<script setup name="InfusionRecord">
import {ref} from 'vue';
import {useI18n} from 'vue-i18n';
import {
cancelPerform,
editPatientInfusionTime,
@@ -322,6 +323,7 @@ import AdviceListDialog from './component/adviceListDialog.vue';
import {formatDate, formatDateStr} from '@/utils/index';
import { RequestStatus } from '@/utils/medicalConstants';
const { t } = useI18n();
const showSearch = ref(true);
const total = ref(1);
const selectedItems = ref([]);

View File

@@ -195,7 +195,7 @@
<el-col :span="6">
<el-form-item label="紧急标志">
<el-input
:model-value="formData.urgent ? '是' : '否'"
:model-value="formData.urgent ? t('common.yes') : t('common.no')"
disabled
/>
</el-form-item>
@@ -365,6 +365,7 @@
<script setup name="consultationConfirmation">
import { computed, ref, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Check } from '@element-plus/icons-vue'
import useUserStore from '@/store/modules/user'
@@ -379,6 +380,7 @@ import {
} from './api'
const userStore = useUserStore()
const { t } = useI18n()
const loading = ref(false)
const tableData = ref([])

View File

@@ -256,11 +256,11 @@
@change="(value) => handleMaindise(value, scope.rowIndex)"
>
<el-option
label=""
:label="$t('common.yes')"
:value="1"
/>
<el-option
label=""
:label="$t('common.no')"
:value="0"
/>
</el-select>
@@ -435,6 +435,7 @@
<script setup>
import {getCurrentInstance} from 'vue';
import {useI18n} from 'vue-i18n';
import { Close, ArrowDown } from '@element-plus/icons-vue';
import useUserStore from '@/store/modules/user';
import {
@@ -457,6 +458,7 @@ import AddDiagnosisDialog from './addDiagnosisDialog.vue';
import diagnosislist from '../diagnosis/diagnosislist.vue';
import InfectiousDiseaseReportDialog from './infectiousDiseaseReportDialog.vue';
// const diagnosisList = ref([]);
const { t } = useI18n();
const allowAdd = ref(false);
const tree = ref([]);
const openDiagnosis = ref(false);

View File

@@ -718,8 +718,8 @@
v-model="form.emergencyFlag"
:active-value="1"
:inactive-value="0"
active-text=""
inactive-text=""
:active-text="$t('common.yes')"
:inactive-text="$t('common.no')"
/>
</el-form-item>
</el-col>
@@ -732,8 +732,8 @@
v-model="form.implantFlag"
:active-value="1"
:inactive-value="0"
active-text=""
inactive-text=""
:active-text="$t('common.yes')"
:inactive-text="$t('common.no')"
/>
</el-form-item>
</el-col>
@@ -937,6 +937,7 @@
<script setup name="SurgeryApplication">
import { getCurrentInstance, ref, computed, watch, onMounted, nextTick } from 'vue'
import { useI18n } from 'vue-i18n'
import { getSurgeryPage, addSurgery, updateSurgery, deleteSurgery, getSurgeryDetail, updateSurgeryStatus } from '@/api/surgerymanage'
import { getEncounterDiagnosis, getDiagnosisTreatmentList, queryParticipantList } from '../api'
import { listUser } from '@/api/system/user'
@@ -947,6 +948,7 @@ import { useDict } from '@/utils/dict'
const { surgery_type, surgery_level, incision_level, anesthesia_type } = useDict('surgery_type', 'surgery_level', 'incision_level', 'anesthesia_type')
const { proxy } = getCurrentInstance()
const { t } = useI18n()
const userStore = useUserStore() // 🔧 BugFix: 初始化 userStore否则 applyDoctorName 和 applyDeptName 会是 undefined
const emit = defineEmits(['saved'])
const props = defineProps({

View File

@@ -460,7 +460,7 @@
:type="patientDetail.importantFlag ? 'danger' : 'info'"
size="small"
>
{{ patientDetail.importantFlag ? '是' : '否' }}
{{ patientDetail.importantFlag ? $t('common.yes') : $t('common.no') }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="是否已开药">
@@ -468,7 +468,7 @@
:type="patientDetail.hasPrescription ? 'success' : 'info'"
size="small"
>
{{ patientDetail.hasPrescription ? '是' : '否' }}
{{ patientDetail.hasPrescription ? $t('common.yes') : $t('common.no') }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="是否已检查">
@@ -476,7 +476,7 @@
:type="patientDetail.hasExamination ? 'success' : 'info'"
size="small"
>
{{ patientDetail.hasExamination ? '是' : '否' }}
{{ patientDetail.hasExamination ? $t('common.yes') : $t('common.no') }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="是否已检验">
@@ -484,7 +484,7 @@
:type="patientDetail.hasLaboratory ? 'success' : 'info'"
size="small"
>
{{ patientDetail.hasLaboratory ? '是' : '否' }}
{{ patientDetail.hasLaboratory ? $t('common.yes') : $t('common.no') }}
</el-tag>
</el-descriptions-item>
</el-descriptions>
@@ -520,6 +520,7 @@
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage, ElMessageBox } from 'element-plus'
import {
User, Clock, VideoPlay, CircleCheck, Timer, Watch
@@ -534,6 +535,7 @@ import {
} from './api.js'
// 数据
const { t } = useI18n()
const stats = ref({})
const patientList = ref([])
const total = ref(0)

View File

@@ -65,7 +65,7 @@
:type="row.isEmergencyContact?'success':'info'"
size="small"
>
{{ row.isEmergencyContact?'是':'否' }}
{{ row.isEmergencyContact?$t('common.yes'):$t('common.no') }}
</el-tag>
</template>
</el-table-column>
@@ -440,8 +440,10 @@
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {useI18n} from 'vue-i18n'
import {ElMessage,ElMessageBox} from 'element-plus'
import {getFamilyMembers,addFamilyMember,deleteFamilyMember,getMergeLogPage,listPersons,splitPersons,detectDuplicates,syncCrossSystem} from './api'
const { t } = useI18n()
const tab=ref('family')
const searchPatientId=ref('')
const familyData=ref([]),mergeData=ref([])

View File

@@ -5,19 +5,19 @@
class="pan-back-btn"
@click="back"
>
返回
{{ $t('error.back') }}
</el-button>
<el-row>
<el-col :span="12">
<h1 class="text-jumbo text-ginormous">
401错误!
{{ $t('error.401Title') }}
</h1>
<h2>您没有访问权限</h2>
<h6>对不起您没有访问权限请不要进行非法操作您可以返回主页面</h6>
<h2>{{ $t('error.401Heading') }}</h2>
<h6>{{ $t('error.401Info') }}</h6>
<ul class="list-unstyled">
<li class="link-type">
<router-link to="/">
回首页
{{ $t('error.backHome') }}
</router-link>
</li>
</ul>
@@ -35,6 +35,7 @@
</template>
<script setup>
import { ref, getCurrentInstance } from 'vue'
import errImage from "@/assets/401_images/401.gif";
let { proxy } = getCurrentInstance();

View File

@@ -25,19 +25,19 @@
</div>
<div class="bullshit">
<div class="bullshit__oops">
404错误!
{{ $t('error.404Title') }}
</div>
<div class="bullshit__headline">
{{ message }}
</div>
<div class="bullshit__info">
对不起您正在寻找的页面不存在尝试检查URL的错误然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容
{{ $t('error.404Info') }}
</div>
<router-link
to="/index"
class="bullshit__return-home"
>
返回首页
{{ $t('error.backHome') }}
</router-link>
</div>
</div>
@@ -45,8 +45,12 @@
</template>
<script setup>
import { computed } from 'vue'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
let message = computed(() => {
return '找不到网页!'
return t('error.404Message')
})
</script>

View File

@@ -25,7 +25,7 @@
</el-icon>
</div>
<div class="feature-title">
{{ feature.menuName }}
{{ translateMenuName(feature.menuName) }}
</div>
<div
v-if="feature.fullPath"
@@ -64,6 +64,8 @@
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { autoTranslate } from '@/i18n/autoTranslate'
import menuTitleMap from '@/layout/components/Sidebar/menuTitleMap'
import { listMenu, getMenuFullPath } from '@/api/system/menu'
import { getCurrentUserConfig } from '@/api/system/userConfig'
import {
@@ -138,6 +140,18 @@ const loading = ref(false)
const router = useRouter()
const { t } = useI18n()
function translateMenuName(name) {
if (!name) return ''
const key = menuTitleMap[name]
if (key) {
const result = t(key)
if (result === key) return autoTranslate(name)
return result
}
return autoTranslate(name)
}
const userFeatures = ref([])
// 图标映射

View File

@@ -2,7 +2,7 @@
<div class="insurance-form">
<div class="header">
<div class="title">
医保登记
{{ $t('inHospital.feeTypeConversion.medicalRegistration') }}
</div>
</div>
<div class="content">
@@ -14,37 +14,35 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="医疗类别"
:label="$t('inHospital.feeTypeConversion.medicalCategory')"
prop="medicalType"
>
<el-select
v-model="formData.medicalType"
placeholder="请选择"
:placeholder="$t('inHospital.common.pleaseSelect')"
>
<el-option
label="特殊门诊"
:label="$t('inHospital.feeTypeConversion.specialOutpatient')"
value="special"
/>
<!-- 其他选项 -->
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="病种名称"
:label="$t('inHospital.feeTypeConversion.diseaseName')"
prop="diseaseName"
>
<el-select
v-model="formData.diseaseName"
placeholder="请选择"
:placeholder="$t('inHospital.common.pleaseSelect')"
>
<!-- 病种选项 -->
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="入院日期"
:label="$t('inHospital.feeTypeConversion.admissionDate')"
prop="admissionDate"
>
<el-date-picker
@@ -53,7 +51,7 @@
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"
placeholder="请选择日期"
:placeholder="$t('inHospital.feeTypeConversion.selectDate')"
/>
</el-form-item>
</el-col>
@@ -61,110 +59,109 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="参保地"
:label="$t('inHospital.feeTypeConversion.insuredPlace')"
prop="insuredPlace"
>
<el-select
v-model="formData.insuredPlace"
placeholder="请选择"
:placeholder="$t('inHospital.common.pleaseSelect')"
>
<el-option
label="特困户"
:label="$t('inHospital.feeTypeConversion.specialPoorHousehold')"
value="special"
/>
<!-- 其他选项 -->
</el-select>
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item
label="入院诊断"
:label="$t('inHospital.feeTypeConversion.admissionDiagnosis')"
prop="admissionDiagnosis"
>
<el-input
v-model="formData.admissionDiagnosis"
placeholder="请输入"
:placeholder="$t('inHospital.feeTypeConversion.enter')"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="重复住院">
<el-form-item :label="$t('inHospital.feeTypeConversion.repeatHospitalization')">
<el-switch
v-model="formData.isRepeatHospitalization"
inline-prompt
active-text=""
inactive-text=""
:active-text="$t('common.yes')"
:inactive-text="$t('common.no')"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="外伤标志">
<el-form-item :label="$t('inHospital.feeTypeConversion.traumaFlag')">
<el-radio-group
v-model="formData.hasOutsideStandard"
class="ml-20"
>
<el-radio :value="true">
{{ $t('common.yes') }}
</el-radio>
<el-radio :value="false">
{{ $t('common.no') }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="临床试验">
<el-form-item :label="$t('inHospital.feeTypeConversion.clinicalTrial')">
<el-radio-group
v-model="formData.hasClinicalTrial"
class="ml-20"
>
<el-radio :value="true">
{{ $t('common.yes') }}
</el-radio>
<el-radio :value="false">
{{ $t('common.no') }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="第三方责任">
<el-form-item :label="$t('inHospital.feeTypeConversion.thirdPartyLiability')">
<el-radio-group
v-model="formData.hasThirdParty"
class="ml-20"
>
<el-radio :value="true">
{{ $t('common.yes') }}
</el-radio>
<el-radio :value="false">
{{ $t('common.no') }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="急诊标志">
<el-form-item :label="$t('inHospital.feeTypeConversion.emergencyFlag')">
<el-switch
v-model="formData.isEmergency"
inline-prompt
active-text=""
inactive-text=""
:active-text="$t('common.yes')"
:inactive-text="$t('common.no')"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="涉外标志">
<el-form-item :label="$t('inHospital.feeTypeConversion.foreignFlag')">
<el-radio-group
v-model="formData.hasOverseasStandard"
class="ml-20"
>
<el-radio :value="true">
{{ $t('common.yes') }}
</el-radio>
<el-radio :value="false">
{{ $t('common.no') }}
</el-radio>
</el-radio-group>
</el-form-item>
@@ -180,7 +177,7 @@
fixed
style="width: 100px"
>
登记变更
{{ $t('inHospital.feeTypeConversion.registrationChange') }}
</el-button>
</el-col>
</el-row>
@@ -190,9 +187,13 @@
</template>
<script setup>
import { useI18n } from 'vue-i18n'
defineOptions({
name: 'YbregisterEdit',
});
const { t } = useI18n()
// interface FormData {
// medicalType: string;
// diseaseName: string;

View File

@@ -6,7 +6,7 @@
class="demo-tabs"
>
<el-tab-pane
label="待登记入院"
:label="$t('inHospital.register.pendingRegistration')"
name="first"
>
<AwaitList
@@ -15,7 +15,7 @@
/>
</el-tab-pane>
<el-tab-pane
label="已登记入院"
:label="$t('inHospital.register.completedRegistration')"
name="second"
>
<AccomplishList v-if="activeName === 'second'" />
@@ -28,8 +28,10 @@
</template>
<script setup>
import {getCurrentInstance, reactive, ref} from 'vue';
import { useI18n } from 'vue-i18n';
import {AccomplishList, AwaitList} from './components/index.js';
const { t } = useI18n()
const { proxy } = getCurrentInstance();
const emits = defineEmits([]);
const props = defineProps({});

View File

@@ -11,19 +11,19 @@
class="inOut-tabs"
>
<el-tab-pane
label="住院结算"
:label="$t('inHospital.settlement.inpatientSettlement')"
name="first"
>
<SettlementHome />
</el-tab-pane>
<el-tab-pane
label="结算取消"
:label="$t('inHospital.settlement.settlementCancel')"
name="second"
>
<SettlementCancel />
</el-tab-pane>
<el-tab-pane
label="中途结算"
:label="$t('inHospital.settlement.midwaySettlement')"
name="third"
>
<SettlementMidway />
@@ -33,6 +33,9 @@
</template>
<script setup>
import {onBeforeMount, onMounted, reactive, ref} from 'vue'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
import SettlementHome from './components/home/index.vue'
import SettlementCancel from './components/cancel/index.vue'

View File

@@ -3,13 +3,13 @@
<el-card shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">入院诊断</span>
<span class="card-title">{{ $t('inHospital.inpatientDiagnosis.title') }}</span>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增诊断
{{ $t('inHospital.inpatientDiagnosis.addDiagnosis') }}
</el-button>
</div>
</template>
@@ -19,10 +19,10 @@
:model="queryParams"
label-width="80px"
>
<el-form-item label="就诊ID">
<el-form-item :label="$t('inHospital.inpatientDiagnosis.encounterId')">
<el-input
v-model="queryParams.encounterId"
placeholder="就诊ID"
:placeholder="$t('inHospital.inpatientDiagnosis.encounterId')"
clearable
style="width: 160px"
@keyup.enter="handleQuery"
@@ -34,7 +34,7 @@
icon="Search"
@click="handleQuery"
>
查询
{{ $t('inHospital.inpatientDiagnosis.query') }}
</el-button>
</el-form-item>
</el-form>
@@ -47,29 +47,29 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('inHospital.common.seqNo')"
width="60"
/>
<vxe-column
field="name"
title="诊断名称"
:title="$t('inHospital.inpatientDiagnosis.diagnosisName')"
min-width="180"
show-overflow="title"
/>
<vxe-column
field="diagnosisDesc"
title="诊断描述"
:title="$t('inHospital.inpatientDiagnosis.diagnosisDesc')"
min-width="200"
show-overflow="title"
/>
<vxe-column
field="classification"
title="分类"
:title="$t('inHospital.inpatientDiagnosis.classification')"
width="100"
/>
<vxe-column
field="maindiseFlag"
title="主诊断"
:title="$t('inHospital.inpatientDiagnosis.mainDiagnosis')"
width="80"
align="center"
>
@@ -79,29 +79,29 @@
type="danger"
size="small"
>
主诊断
{{ $t('inHospital.inpatientDiagnosis.mainDiagnosis') }}
</el-tag>
<el-tag
v-else
type="info"
size="small"
>
次要
{{ $t('inHospital.inpatientDiagnosis.secondary') }}
</el-tag>
</template>
</vxe-column>
<vxe-column
field="doctor"
title="诊断医生"
:title="$t('inHospital.inpatientDiagnosis.doctor')"
width="100"
/>
<vxe-column
field="diagnosisTime"
title="诊断日期"
:title="$t('inHospital.inpatientDiagnosis.diagnosisDate')"
width="120"
/>
<vxe-column
title="操作"
:title="$t('inHospital.common.operation')"
width="150"
fixed="right"
>
@@ -112,7 +112,7 @@
icon="Edit"
@click="handleEdit(row)"
>
编辑
{{ $t('inHospital.inpatientDiagnosis.edit') }}
</el-button>
<el-button
type="danger"
@@ -120,7 +120,7 @@
icon="Delete"
@click="handleDelete(row)"
>
删除
{{ $t('inHospital.inpatientDiagnosis.delete') }}
</el-button>
</template>
</vxe-column>
@@ -140,69 +140,69 @@
label-width="100px"
>
<el-form-item
label="诊断名称"
:label="$t('inHospital.inpatientDiagnosis.diagnosisName')"
prop="name"
>
<el-input
v-model="form.name"
placeholder="诊断名称"
:placeholder="$t('inHospital.inpatientDiagnosis.diagnosisName')"
/>
</el-form-item>
<el-form-item label="诊断描述">
<el-form-item :label="$t('inHospital.inpatientDiagnosis.diagnosisDesc')">
<el-input
v-model="form.diagnosisDesc"
type="textarea"
:rows="3"
placeholder="诊断描述"
:placeholder="$t('inHospital.inpatientDiagnosis.diagnosisDesc')"
/>
</el-form-item>
<el-form-item label="分类">
<el-form-item :label="$t('inHospital.inpatientDiagnosis.classification')">
<el-select
v-model="form.classification"
placeholder="选择分类"
:placeholder="$t('inHospital.inpatientDiagnosis.selectClassification')"
clearable
style="width: 100%"
>
<el-option
label="入院诊断"
:label="$t('inHospital.inpatientDiagnosis.admissionDiagnosis')"
value="入院诊断"
/>
<el-option
label="出院诊断"
:label="$t('inHospital.inpatientDiagnosis.dischargeDiagnosis')"
value="出院诊断"
/>
<el-option
label="术前诊断"
:label="$t('inHospital.inpatientDiagnosis.preopDiagnosis')"
value="术前诊断"
/>
<el-option
label="术后诊断"
:label="$t('inHospital.inpatientDiagnosis.postopDiagnosis')"
value="术后诊断"
/>
<el-option
label="门诊诊断"
:label="$t('inHospital.inpatientDiagnosis.outpatientDiagnosis')"
value="门诊诊断"
/>
</el-select>
</el-form-item>
<el-form-item label="主诊断">
<el-form-item :label="$t('inHospital.inpatientDiagnosis.mainDiagnosis')">
<el-switch
v-model="form.maindiseFlag"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<el-form-item label="诊断医生">
<el-form-item :label="$t('inHospital.inpatientDiagnosis.doctor')">
<el-input
v-model="form.doctor"
placeholder="诊断医生"
:placeholder="$t('inHospital.inpatientDiagnosis.doctor')"
/>
</el-form-item>
<el-form-item label="诊断日期">
<el-form-item :label="$t('inHospital.inpatientDiagnosis.diagnosisDate')">
<el-date-picker
v-model="form.diagnosisTime"
type="date"
placeholder="选择日期"
:placeholder="$t('inHospital.inpatientDiagnosis.selectDate')"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
@@ -210,13 +210,13 @@
</el-form>
<template #footer>
<el-button @click="formVisible = false">
取消
{{ $t('inHospital.inpatientDiagnosis.cancel') }}
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
{{ $t('inHospital.inpatientDiagnosis.confirm') }}
</el-button>
</template>
</el-dialog>
@@ -224,23 +224,25 @@
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ref, onMounted, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getDiagnosisList, addDiagnosis, updateDiagnosis, deleteDiagnosis } from './components/api'
const { t } = useI18n()
const loading = ref(false)
const tableData = ref([])
const queryParams = ref({ encounterId: '' })
const formVisible = ref(false)
const formTitle = ref('新增诊断')
const formTitle = ref('')
const isEdit = ref(false)
const formRef = ref()
const form = ref({ id: null, encounterId: null, name: '', diagnosisDesc: '', classification: '', maindiseFlag: 0, doctor: '', diagnosisTime: '' })
const rules = { name: [{ required: true, message: '请输入诊断名称', trigger: 'blur' }] }
const rules = computed(() => ({ name: [{ required: true, message: t('inHospital.inpatientDiagnosis.enterDiagnosisName'), trigger: 'blur' }] }))
function handleQuery() {
if (!queryParams.value.encounterId) { ElMessage.warning('请输入就诊ID'); return }
if (!queryParams.value.encounterId) { ElMessage.warning(t('inHospital.inpatientDiagnosis.enterEncounterId')); return }
loading.value = true
getDiagnosisList(queryParams.value.encounterId).then(res => {
tableData.value = res.data || []
@@ -248,13 +250,13 @@ function handleQuery() {
}
function handleAdd() {
isEdit.value = false; formTitle.value = '新增诊断'
isEdit.value = false; formTitle.value = t('inHospital.inpatientDiagnosis.addDiagnosis')
form.value = { id: null, encounterId: Number(queryParams.value.encounterId) || null, name: '', diagnosisDesc: '', classification: '', maindiseFlag: 0, doctor: '', diagnosisTime: '' }
formVisible.value = true
}
function handleEdit(row) {
isEdit.value = true; formTitle.value = '编辑诊断'
isEdit.value = true; formTitle.value = t('inHospital.inpatientDiagnosis.edit')
form.value = { ...row }
formVisible.value = true
}
@@ -264,16 +266,16 @@ function submitForm() {
if (!valid) return
const action = isEdit.value ? updateDiagnosis(form.value) : addDiagnosis(form.value)
action.then(res => {
if (res.code === 200) { ElMessage.success(isEdit.value ? '修改成功' : '新增成功'); formVisible.value = false; handleQuery() }
else ElMessage.error(res.msg || '操作失败')
if (res.code === 200) { ElMessage.success(isEdit.value ? t('inHospital.inpatientDiagnosis.editSuccess') : t('inHospital.inpatientDiagnosis.addSuccess')); formVisible.value = false; handleQuery() }
else ElMessage.error(res.msg || t('inHospital.inpatientDiagnosis.operationFail'))
})
})
}
function handleDelete(row) {
ElMessageBox.confirm('确认删除该诊断?', '提示', { type: 'warning' }).then(() => {
ElMessageBox.confirm(t('inHospital.inpatientDiagnosis.confirmDelete'), t('inHospital.common.prompt'), { type: 'warning' }).then(() => {
deleteDiagnosis(row.id).then(res => {
if (res.code === 200) { ElMessage.success('删除成功'); handleQuery() }
if (res.code === 200) { ElMessage.success(t('inHospital.inpatientDiagnosis.deleteSuccess')); handleQuery() }
})
}).catch(() => {})
}

View File

@@ -1,16 +1,15 @@
<template>
<div class="list-fee-container">
<!-- 左侧患者列表 -->
<el-card
class="patient-panel"
shadow="never"
>
<template #header>
<span class="card-title">住院患者</span>
<span class="card-title">{{ $t('inHospital.listFee.title') }}</span>
</template>
<el-input
v-model="searchKey"
placeholder="搜索患者(姓名/住院号)"
:placeholder="$t('inHospital.listFee.searchPlaceholder')"
clearable
style="margin-bottom: 10px"
@keyup.enter="loadPatients"
@@ -31,24 +30,24 @@
>
<vxe-column
field="patientName"
title="姓名"
:title="$t('inHospital.common.patientName')"
width="80"
/>
<vxe-column
field="encounterNo"
title="住院号"
:title="$t('inHospital.common.inpatientNo')"
width="130"
show-overflow="title"
/>
<vxe-column
field="deptName"
title="科室"
:title="$t('inHospital.common.deptName')"
width="100"
show-overflow="title"
/>
<vxe-column
field="bedNo"
title="床号"
:title="$t('inHospital.common.bedNo')"
width="50"
/>
</vxe-table>
@@ -61,14 +60,13 @@
/>
</el-card>
<!-- 右侧费用清单 -->
<el-card
class="fee-panel"
shadow="never"
>
<template #header>
<div class="card-header">
<span class="card-title">费用清单</span>
<span class="card-title">{{ $t('inHospital.listFee.feeList') }}</span>
<span
v-if="currentPatient"
class="patient-tag"
@@ -76,7 +74,7 @@
<span
v-if="feeTotal > 0"
class="fee-total"
>合计: ¥{{ feeTotal.toFixed(2) }}</span>
>{{ $t('inHospital.listFee.total') }}: ¥{{ feeTotal.toFixed(2) }}</span>
</div>
</template>
@@ -90,35 +88,35 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('inHospital.common.seqNo')"
width="60"
/>
<vxe-column
field="itemName"
title="项目名称"
:title="$t('inHospital.listFee.itemName')"
min-width="180"
show-overflow="title"
/>
<vxe-column
field="itemType_dictText"
title="类型"
:title="$t('inHospital.listFee.itemType')"
width="90"
/>
<vxe-column
field="specification"
title="规格"
:title="$t('inHospital.listFee.specification')"
width="100"
show-overflow="title"
/>
<vxe-column
field="quantity"
title="数量"
:title="$t('inHospital.listFee.quantity')"
width="70"
align="center"
/>
<vxe-column
field="unitPrice"
title="单价"
:title="$t('inHospital.listFee.unitPrice')"
width="90"
align="right"
>
@@ -128,7 +126,7 @@
</vxe-column>
<vxe-column
field="totalAmount"
title="金额"
:title="$t('inHospital.listFee.amount')"
width="100"
align="right"
>
@@ -138,12 +136,12 @@
</vxe-column>
<vxe-column
field="doctorName"
title="开单医生"
:title="$t('inHospital.listFee.doctorName')"
width="100"
/>
<vxe-column
field="enterTime"
title="录入时间"
:title="$t('inHospital.listFee.enterTime')"
width="150"
/>
</vxe-table>
@@ -153,8 +151,10 @@
<script setup>
import { ref, computed, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { getPatientPage, getPatientPrescription } from './components/api'
const { t } = useI18n()
const searchKey = ref('')
const patientList = ref([])
const patientTotal = ref(0)
@@ -168,7 +168,7 @@ const feeTotal = computed(() => feeItems.value.reduce((sum, item) => sum + (item
const footerData = computed(() => {
if (!feeItems.value.length) return []
return [{ itemName: '合计', totalAmount: feeTotal.value }]
return [{ itemName: t('inHospital.listFee.total'), totalAmount: feeTotal.value }]
})
function loadPatients() {

View File

@@ -3,7 +3,7 @@
<el-card shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">病案管理</span>
<span class="card-title">{{ $t('inHospital.medicalRecord.title') }}</span>
</div>
</template>
@@ -12,19 +12,19 @@
:model="queryParams"
label-width="80px"
>
<el-form-item label="患者">
<el-form-item :label="$t('inHospital.medicalRecord.patient')">
<el-input
v-model="queryParams.searchKey"
placeholder="患者姓名/住院号"
:placeholder="$t('inHospital.medicalRecord.patientName') + '/' + $t('inHospital.common.inpatientNo')"
clearable
style="width: 180px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="科室">
<el-form-item :label="$t('inHospital.medicalRecord.department')">
<el-input
v-model="queryParams.deptName"
placeholder="科室"
:placeholder="$t('inHospital.medicalRecord.department')"
clearable
style="width: 140px"
/>
@@ -35,13 +35,13 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ $t('inHospital.medicalRecord.search') }}
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
{{ $t('inHospital.medicalRecord.reset') }}
</el-button>
</el-form-item>
</el-form>
@@ -54,54 +54,54 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('inHospital.common.seqNo')"
width="60"
/>
<vxe-column
field="patientName"
title="患者姓名"
:title="$t('inHospital.medicalRecord.patientName')"
width="100"
/>
<vxe-column
field="genderEnum_enumText"
title="性别"
:title="$t('inHospital.medicalRecord.gender')"
width="60"
/>
<vxe-column
field="age"
title="年龄"
:title="$t('inHospital.medicalRecord.age')"
width="50"
/>
<vxe-column
field="encounterNo"
title="住院号"
:title="$t('inHospital.medicalRecord.inpatientNo')"
width="140"
show-overflow="title"
/>
<vxe-column
field="deptName"
title="科室"
:title="$t('inHospital.medicalRecord.deptName')"
width="120"
show-overflow="title"
/>
<vxe-column
field="bedNo"
title="床号"
:title="$t('inHospital.medicalRecord.bedNo')"
width="60"
/>
<vxe-column
field="admissionDate"
title="入院日期"
:title="$t('inHospital.medicalRecord.admissionDate')"
width="120"
/>
<vxe-column
field="dischargeDate"
title="出院日期"
:title="$t('inHospital.medicalRecord.dischargeDate')"
width="120"
/>
<vxe-column
field="status"
title="状态"
:title="$t('inHospital.medicalRecord.status')"
width="80"
align="center"
>
@@ -111,19 +111,19 @@
type="info"
size="small"
>
已出院
{{ $t('inHospital.medicalRecord.discharged') }}
</el-tag>
<el-tag
v-else
type="success"
size="small"
>
在院
{{ $t('inHospital.medicalRecord.inHospital') }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('inHospital.common.operation')"
width="120"
fixed="right"
>
@@ -134,7 +134,7 @@
icon="View"
@click="handleDetail(row)"
>
病案详情
{{ $t('inHospital.medicalRecord.detail') }}
</el-button>
</template>
</vxe-column>
@@ -149,10 +149,9 @@
/>
</el-card>
<!-- 病案详情抽屉 -->
<el-drawer
v-model="detailVisible"
title="病案详情"
:title="$t('inHospital.medicalRecord.detail')"
size="650px"
>
<div
@@ -163,28 +162,28 @@
:column="2"
border
>
<el-descriptions-item label="患者姓名">
<el-descriptions-item :label="$t('inHospital.medicalRecord.patientName')">
{{ detailData.patientName }}
</el-descriptions-item>
<el-descriptions-item label="住院号">
<el-descriptions-item :label="$t('inHospital.medicalRecord.inpatientNo')">
{{ detailData.encounterNo }}
</el-descriptions-item>
<el-descriptions-item label="科室">
<el-descriptions-item :label="$t('inHospital.medicalRecord.department')">
{{ detailData.deptName }}
</el-descriptions-item>
<el-descriptions-item label="床号">
<el-descriptions-item :label="$t('inHospital.medicalRecord.bedNo')">
{{ detailData.bedNo }}
</el-descriptions-item>
<el-descriptions-item label="入院日期">
<el-descriptions-item :label="$t('inHospital.medicalRecord.admissionDate')">
{{ detailData.admissionDate }}
</el-descriptions-item>
<el-descriptions-item label="出院日期">
{{ detailData.dischargeDate || '在院' }}
<el-descriptions-item :label="$t('inHospital.medicalRecord.dischargeDate')">
{{ detailData.dischargeDate || $t('inHospital.medicalRecord.inHospital') }}
</el-descriptions-item>
</el-descriptions>
<div class="section-title">
费用概览
{{ $t('inHospital.medicalRecord.feeOverview') }}
</div>
<vxe-table
:data="prescriptionItems"
@@ -194,34 +193,34 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('inHospital.common.seqNo')"
width="60"
/>
<vxe-column
field="itemName"
title="项目名称"
:title="$t('inHospital.medicalRecord.itemName')"
min-width="160"
show-overflow="title"
/>
<vxe-column
field="itemType_dictText"
title="类型"
:title="$t('inHospital.medicalRecord.itemType')"
width="90"
/>
<vxe-column
field="specification"
title="规格"
:title="$t('inHospital.medicalRecord.specification')"
width="100"
show-overflow="title"
/>
<vxe-column
field="quantity"
title="数量"
:title="$t('inHospital.medicalRecord.quantity')"
width="70"
/>
<vxe-column
field="unitPrice"
title="单价"
:title="$t('inHospital.medicalRecord.unitPrice')"
width="90"
align="right"
>
@@ -231,7 +230,7 @@
</vxe-column>
<vxe-column
field="totalAmount"
title="金额"
:title="$t('inHospital.medicalRecord.amount')"
width="90"
align="right"
>
@@ -247,8 +246,10 @@
<script setup>
import { ref, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { getPatientPage, getPatientPrescription } from './components/api'
const { t } = useI18n()
const loading = ref(false)
const tableData = ref([])
const total = ref(0)

View File

@@ -1,16 +1,15 @@
<template>
<div class="order-manage-container">
<!-- 左侧患者列表 -->
<el-card
class="patient-panel"
shadow="never"
>
<template #header>
<span class="card-title">住院患者</span>
<span class="card-title">{{ $t('inHospital.orderManage.title') }}</span>
</template>
<el-input
v-model="searchKey"
placeholder="搜索患者(姓名/住院号)"
:placeholder="$t('inHospital.orderManage.searchPlaceholder')"
clearable
style="margin-bottom: 10px"
@keyup.enter="loadPatients"
@@ -31,47 +30,46 @@
>
<vxe-column
field="patientName"
title="姓名"
:title="$t('inHospital.common.patientName')"
width="80"
/>
<vxe-column
field="genderEnum_enumText"
title="性别"
:title="$t('inHospital.common.gender')"
width="50"
/>
<vxe-column
field="age"
title="年龄"
:title="$t('inHospital.common.age')"
width="50"
/>
<vxe-column
field="encounterNo"
title="住院号"
:title="$t('inHospital.common.inpatientNo')"
width="130"
show-overflow="title"
/>
<vxe-column
field="deptName"
title="科室"
:title="$t('inHospital.common.deptName')"
width="100"
show-overflow="title"
/>
<vxe-column
field="bedNo"
title="床号"
:title="$t('inHospital.common.bedNo')"
width="60"
/>
</vxe-table>
</el-card>
<!-- 右侧医嘱内容 -->
<el-card
class="advice-panel"
shadow="never"
>
<template #header>
<div class="card-header">
<span class="card-title">医嘱列表</span>
<span class="card-title">{{ $t('inHospital.orderManage.adviceList') }}</span>
<span
v-if="currentPatient"
class="patient-tag"
@@ -84,11 +82,11 @@
@tab-change="handleTabChange"
>
<el-tab-pane
label="当前医嘱"
:label="$t('inHospital.orderManage.currentAdvice')"
name="current"
/>
<el-tab-pane
label="历史医嘱"
:label="$t('inHospital.orderManage.historyAdvice')"
name="history"
/>
</el-tabs>
@@ -101,48 +99,48 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('inHospital.common.seqNo')"
width="60"
/>
<vxe-column
field="adviceContent"
title="医嘱内容"
:title="$t('inHospital.orderManage.adviceContent')"
min-width="200"
show-overflow="title"
/>
<vxe-column
field="adviceType_dictText"
title="类型"
:title="$t('inHospital.orderManage.type')"
width="90"
/>
<vxe-column
field="frequency"
title="频次"
:title="$t('inHospital.orderManage.frequency')"
width="80"
/>
<vxe-column
field="dosage"
title="剂量"
:title="$t('inHospital.orderManage.dosage')"
width="80"
/>
<vxe-column
field="route"
title="途径"
:title="$t('inHospital.orderManage.route')"
width="80"
/>
<vxe-column
field="doctorName"
title="开嘱医生"
:title="$t('inHospital.orderManage.prescribingDoctor')"
width="100"
/>
<vxe-column
field="startTime"
title="开始时间"
:title="$t('inHospital.orderManage.startTime')"
width="150"
/>
<vxe-column
field="adviceStatus_dictText"
title="状态"
:title="$t('inHospital.orderManage.status')"
width="90"
align="center"
>
@@ -151,13 +149,13 @@
:type="adviceStatusType(row.adviceStatus)"
size="small"
>
{{ row.adviceStatus_dictText || '未知' }}
{{ row.adviceStatus_dictText || $t('inHospital.orderManage.unknown') }}
</el-tag>
</template>
</vxe-column>
<vxe-column
v-if="activeTab === 'current'"
title="操作"
:title="$t('inHospital.common.operation')"
width="180"
fixed="right"
>
@@ -168,7 +166,7 @@
link
@click="handleStop(row)"
>
停止
{{ $t('inHospital.orderManage.stop') }}
</el-button>
<el-button
v-if="row.adviceStatus === '1'"
@@ -176,7 +174,7 @@
link
@click="handleCancelStop(row)"
>
恢复
{{ $t('inHospital.orderManage.resume') }}
</el-button>
<el-button
v-if="row.adviceStatus === '2'"
@@ -184,7 +182,7 @@
link
@click="handleSignOff(row)"
>
签退
{{ $t('inHospital.orderManage.signOff') }}
</el-button>
</template>
</vxe-column>
@@ -195,9 +193,11 @@
<script setup>
import { ref, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getPatientList, getAdviceBaseInfo, getAdviceHistoryInfo, stopAdvice, cancelStopAdvice, signOffAdvice } from './components/api'
const { t } = useI18n()
const searchKey = ref('')
const patientList = ref([])
const currentPatient = ref(null)
@@ -235,26 +235,26 @@ function loadAdvice() {
}
function handleStop(row) {
ElMessageBox.confirm('确认停止该医嘱?', '提示', { type: 'warning' }).then(() => {
ElMessageBox.confirm(t('inHospital.orderManage.confirmStop'), t('inHospital.common.prompt'), { type: 'warning' }).then(() => {
stopAdvice([{ adviceId: row.adviceId }]).then(res => {
if (res.code === 200) { ElMessage.success('医嘱已停止'); loadAdvice() }
else ElMessage.error(res.msg || '操作失败')
if (res.code === 200) { ElMessage.success(t('inHospital.orderManage.stopped')); loadAdvice() }
else ElMessage.error(res.msg || t('inHospital.common.fail'))
})
}).catch(() => {})
}
function handleCancelStop(row) {
ElMessageBox.confirm('确认恢复该医嘱?', '提示', { type: 'info' }).then(() => {
ElMessageBox.confirm(t('inHospital.orderManage.confirmResume'), t('inHospital.common.prompt'), { type: 'info' }).then(() => {
cancelStopAdvice([{ adviceId: row.adviceId }]).then(res => {
if (res.code === 200) { ElMessage.success('医嘱已恢复'); loadAdvice() }
if (res.code === 200) { ElMessage.success(t('inHospital.orderManage.resumed')); loadAdvice() }
})
}).catch(() => {})
}
function handleSignOff(row) {
ElMessageBox.confirm('确认签退该医嘱?', '提示', { type: 'warning' }).then(() => {
ElMessageBox.confirm(t('inHospital.orderManage.confirmSignOff'), t('inHospital.common.prompt'), { type: 'warning' }).then(() => {
signOffAdvice([{ adviceId: row.adviceId }]).then(res => {
if (res.code === 200) { ElMessage.success('医嘱已签退'); loadAdvice() }
if (res.code === 200) { ElMessage.success(t('inHospital.orderManage.signedOff')); loadAdvice() }
})
}).catch(() => {})
}

View File

@@ -2,16 +2,16 @@
<div class="app-container">
<el-card shadow="never">
<template #header>
<span class="card-title">住院门户</span>
<span class="card-title">{{ $t('inHospital.portal.title') }}</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-form-item :label="$t('inHospital.portal.search')">
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
:placeholder="$t('inHospital.portal.search')"
clearable
@keyup.enter="handleQuery"
/>
@@ -22,14 +22,14 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ $t('inHospital.portal.search') }}
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
{{ $t('inHospital.portal.add') }}
</el-button>
</el-form-item>
</el-form>
@@ -40,29 +40,29 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('inHospital.portal.seqNo')"
width="60"
/>
<vxe-column
field="name"
title="名称"
:title="$t('inHospital.portal.name')"
/>
<vxe-column
field="code"
title="编码"
:title="$t('inHospital.portal.code')"
/>
<vxe-column
field="status"
title="状态"
:title="$t('inHospital.portal.status')"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
{{ row.status === '0' ? $t('inHospital.portal.normal') : $t('inHospital.portal.disabled') }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('inHospital.portal.operation')"
width="150"
>
<template #default="{ row }">
@@ -71,14 +71,14 @@
link
@click="handleEdit(row)"
>
编辑
{{ $t('inHospital.portal.edit') }}
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
{{ $t('inHospital.portal.delete') }}
</el-button>
</template>
</vxe-column>
@@ -89,12 +89,15 @@
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const queryParams = ref({ searchKey: '', pageNum: 1, pageSize: 10 })
const tableData = ref([])
const handleQuery = () => { tableData.value = [] }
const handleAdd = () => { ElMessage.info('新增功能开发中') }
const handleEdit = (row) => { ElMessage.info('编辑功能开发中') }
const handleDelete = (row) => { ElMessage.info('删除功能开发中') }
const handleAdd = () => { ElMessage.info(t('inHospital.portal.addDev')) }
const handleEdit = (row) => { ElMessage.info(t('inHospital.portal.editDev')) }
const handleDelete = (row) => { ElMessage.info(t('inHospital.portal.deleteDev')) }
onMounted(() => handleQuery())
</script>
<style scoped>.card-title { font-weight: bold; font-size: 16px; }</style>

View File

@@ -3,13 +3,13 @@
<el-card shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">手术管理</span>
<span class="card-title">{{ $t('inHospital.surgeryManage.title') }}</span>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增手术
{{ $t('inHospital.surgeryManage.addSurgery') }}
</el-button>
</div>
</template>
@@ -19,46 +19,46 @@
:model="queryParams"
label-width="80px"
>
<el-form-item label="患者">
<el-form-item :label="$t('inHospital.surgeryManage.patient')">
<el-input
v-model="queryParams.patientName"
placeholder="患者姓名"
:placeholder="$t('inHospital.surgeryManage.patientName')"
clearable
style="width: 160px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="手术状态">
<el-form-item :label="$t('inHospital.surgeryManage.surgeryStatus')">
<el-select
v-model="queryParams.statusEnum"
placeholder="全部"
:placeholder="$t('inHospital.surgeryManage.all')"
clearable
style="width: 120px"
>
<el-option
label="待手术"
:label="$t('inHospital.surgeryManage.pending')"
:value="0"
/>
<el-option
label="手术中"
:label="$t('inHospital.surgeryManage.inProgress')"
:value="1"
/>
<el-option
label="已完成"
:label="$t('inHospital.surgeryManage.completed')"
:value="2"
/>
<el-option
label="已取消"
:label="$t('inHospital.surgeryManage.cancelled')"
:value="3"
/>
</el-select>
</el-form-item>
<el-form-item label="手术日期">
<el-form-item :label="$t('inHospital.surgeryManage.surgeryDate')">
<el-date-picker
v-model="dateRange"
type="daterange"
start-placeholder="开始"
end-placeholder="结束"
:start-placeholder="$t('inHospital.common.startDate')"
:end-placeholder="$t('inHospital.common.endDate')"
value-format="YYYY-MM-DD"
style="width: 240px"
/>
@@ -69,13 +69,13 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ $t('inHospital.surgeryManage.search') }}
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
{{ $t('inHospital.surgeryManage.reset') }}
</el-button>
</el-form-item>
</el-form>
@@ -89,43 +89,43 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('inHospital.common.seqNo')"
width="60"
/>
<vxe-column
field="patientName"
title="患者姓名"
:title="$t('inHospital.surgeryManage.patientName')"
width="100"
/>
<vxe-column
field="encounterNo"
title="住院号"
:title="$t('inHospital.surgeryManage.inpatientNo')"
width="140"
/>
<vxe-column
field="surgeryName"
title="手术名称"
:title="$t('inHospital.surgeryManage.surgeryName')"
min-width="180"
show-overflow="title"
/>
<vxe-column
field="surgeonName"
title="手术医生"
:title="$t('inHospital.surgeryManage.surgeonName')"
width="100"
/>
<vxe-column
field="anesthesiologistName"
title="麻醉医生"
:title="$t('inHospital.surgeryManage.anesthesiologist')"
width="100"
/>
<vxe-column
field="plannedTime"
title="计划时间"
:title="$t('inHospital.surgeryManage.plannedTime')"
width="160"
/>
<vxe-column
field="statusEnum"
title="状态"
:title="$t('inHospital.surgeryManage.status')"
width="90"
align="center"
>
@@ -139,7 +139,7 @@
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('inHospital.common.operation')"
width="200"
fixed="right"
>
@@ -150,7 +150,7 @@
icon="View"
@click="handleDetail(row)"
>
详情
{{ $t('inHospital.surgeryManage.detail') }}
</el-button>
<el-button
type="warning"
@@ -158,7 +158,7 @@
icon="Edit"
@click="handleEdit(row)"
>
编辑
{{ $t('inHospital.surgeryManage.edit') }}
</el-button>
<el-button
v-if="row.statusEnum === 0"
@@ -167,7 +167,7 @@
icon="Check"
@click="handleStart(row)"
>
开始
{{ $t('inHospital.surgeryManage.start') }}
</el-button>
<el-button
v-if="row.statusEnum === 1"
@@ -176,7 +176,7 @@
icon="CircleCheck"
@click="handleComplete(row)"
>
完成
{{ $t('inHospital.surgeryManage.complete') }}
</el-button>
<el-button
v-if="row.statusEnum === 0"
@@ -185,7 +185,7 @@
icon="Delete"
@click="handleDelete(row)"
>
删除
{{ $t('inHospital.surgeryManage.delete') }}
</el-button>
</template>
</vxe-column>
@@ -200,7 +200,6 @@
/>
</el-card>
<!-- 新增/编辑弹窗 -->
<el-dialog
v-model="formVisible"
:title="formTitle"
@@ -216,23 +215,23 @@
<el-row :gutter="16">
<el-col :span="12">
<el-form-item
label="患者姓名"
:label="$t('inHospital.surgeryManage.patientName')"
prop="patientName"
>
<el-input
v-model="form.patientName"
placeholder="患者姓名"
:placeholder="$t('inHospital.surgeryManage.patientName')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="住院号"
:label="$t('inHospital.surgeryManage.inpatientNo')"
prop="encounterNo"
>
<el-input
v-model="form.encounterNo"
placeholder="住院号"
:placeholder="$t('inHospital.surgeryManage.inpatientNo')"
/>
</el-form-item>
</el-col>
@@ -240,12 +239,12 @@
<el-row :gutter="16">
<el-col :span="24">
<el-form-item
label="手术名称"
:label="$t('inHospital.surgeryManage.surgeryName')"
prop="surgeryName"
>
<el-input
v-model="form.surgeryName"
placeholder="手术名称"
:placeholder="$t('inHospital.surgeryManage.surgeryName')"
/>
</el-form-item>
</el-col>
@@ -253,23 +252,23 @@
<el-row :gutter="16">
<el-col :span="12">
<el-form-item
label="手术医生"
:label="$t('inHospital.surgeryManage.surgeonName')"
prop="surgeonName"
>
<el-input
v-model="form.surgeonName"
placeholder="手术医生"
:placeholder="$t('inHospital.surgeryManage.surgeonName')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="麻醉医生"
:label="$t('inHospital.surgeryManage.anesthesiologist')"
prop="anesthesiologistName"
>
<el-input
v-model="form.anesthesiologistName"
placeholder="麻醉医生"
:placeholder="$t('inHospital.surgeryManage.anesthesiologist')"
/>
</el-form-item>
</el-col>
@@ -277,40 +276,40 @@
<el-row :gutter="16">
<el-col :span="12">
<el-form-item
label="计划时间"
:label="$t('inHospital.surgeryManage.plannedTime')"
prop="plannedTime"
>
<el-date-picker
v-model="form.plannedTime"
type="datetime"
placeholder="选择时间"
:placeholder="$t('inHospital.surgeryManage.selectTime')"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手术等级">
<el-form-item :label="$t('inHospital.surgeryManage.surgeryLevel')">
<el-select
v-model="form.surgeryLevel"
placeholder="选择等级"
:placeholder="$t('inHospital.surgeryManage.selectLevel')"
clearable
style="width: 100%"
>
<el-option
label="一级"
:label="$t('inHospital.surgeryManage.level1')"
value="1"
/>
<el-option
label="二级"
:label="$t('inHospital.surgeryManage.level2')"
value="2"
/>
<el-option
label="三级"
:label="$t('inHospital.surgeryManage.level3')"
value="3"
/>
<el-option
label="四级"
:label="$t('inHospital.surgeryManage.level4')"
value="4"
/>
</el-select>
@@ -319,12 +318,12 @@
</el-row>
<el-row :gutter="16">
<el-col :span="24">
<el-form-item label="手术备注">
<el-form-item :label="$t('inHospital.surgeryManage.surgeryRemark')">
<el-input
v-model="form.remark"
type="textarea"
:rows="3"
placeholder="手术备注信息"
:placeholder="$t('inHospital.surgeryManage.remarkPlaceholder')"
/>
</el-form-item>
</el-col>
@@ -332,21 +331,20 @@
</el-form>
<template #footer>
<el-button @click="formVisible = false">
取消
{{ $t('inHospital.surgeryManage.cancel') }}
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
{{ $t('inHospital.surgeryManage.confirm') }}
</el-button>
</template>
</el-dialog>
<!-- 详情抽屉 -->
<el-drawer
v-model="detailVisible"
title="手术详情"
:title="$t('inHospital.surgeryManage.surgeryDetail')"
size="600px"
>
<el-descriptions
@@ -354,34 +352,34 @@
:column="2"
border
>
<el-descriptions-item label="患者姓名">
<el-descriptions-item :label="$t('inHospital.surgeryManage.patientName')">
{{ detailData.patientName }}
</el-descriptions-item>
<el-descriptions-item label="住院号">
<el-descriptions-item :label="$t('inHospital.surgeryManage.inpatientNo')">
{{ detailData.encounterNo }}
</el-descriptions-item>
<el-descriptions-item
label="手术名称"
:label="$t('inHospital.surgeryManage.surgeryName')"
:span="2"
>
{{ detailData.surgeryName }}
</el-descriptions-item>
<el-descriptions-item label="手术医生">
<el-descriptions-item :label="$t('inHospital.surgeryManage.surgeonName')">
{{ detailData.surgeonName }}
</el-descriptions-item>
<el-descriptions-item label="麻醉医生">
<el-descriptions-item :label="$t('inHospital.surgeryManage.anesthesiologist')">
{{ detailData.anesthesiologistName }}
</el-descriptions-item>
<el-descriptions-item
label="计划时间"
:label="$t('inHospital.surgeryManage.plannedTime')"
:span="2"
>
{{ detailData.plannedTime }}
</el-descriptions-item>
<el-descriptions-item label="手术等级">
<el-descriptions-item :label="$t('inHospital.surgeryManage.surgeryLevel')">
{{ detailData.surgeryLevel }}
</el-descriptions-item>
<el-descriptions-item label="状态">
<el-descriptions-item :label="$t('inHospital.surgeryManage.status')">
<el-tag
:type="statusTagType(detailData.statusEnum)"
size="small"
@@ -390,7 +388,7 @@
</el-tag>
</el-descriptions-item>
<el-descriptions-item
label="备注"
:label="$t('inHospital.surgeryManage.surgeryRemark')"
:span="2"
>
{{ detailData.remark || '-' }}
@@ -402,9 +400,11 @@
<script setup>
import { ref, onMounted, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getSurgeryPage, getSurgeryDetail, addSurgery, updateSurgery, deleteSurgery, updateSurgeryStatus } from './components/api'
const { t } = useI18n()
const loading = ref(false)
const tableData = ref([])
const total = ref(0)
@@ -415,20 +415,25 @@ const formRef = ref()
const queryParams = ref({ patientName: '', statusEnum: undefined, pageNo: 1, pageSize: 10 })
const formVisible = ref(false)
const formTitle = ref('新增手术')
const formTitle = ref('')
const detailVisible = ref(false)
const detailData = ref(null)
const isEdit = ref(false)
const form = ref({ id: null, patientName: '', encounterNo: '', surgeryName: '', surgeonName: '', anesthesiologistName: '', plannedTime: '', surgeryLevel: '', remark: '' })
const rules = {
patientName: [{ required: true, message: '请输入患者姓名', trigger: 'blur' }],
surgeryName: [{ required: true, message: '请输入手术名称', trigger: 'blur' }],
surgeonName: [{ required: true, message: '请输入手术医生', trigger: 'blur' }],
}
const rules = computed(() => ({
patientName: [{ required: true, message: t('inHospital.surgeryManage.enterPatientName'), trigger: 'blur' }],
surgeryName: [{ required: true, message: t('inHospital.surgeryManage.enterSurgeryName'), trigger: 'blur' }],
surgeonName: [{ required: true, message: t('inHospital.surgeryManage.enterSurgeonName'), trigger: 'blur' }],
}))
const statusText = (s) => ({ 0: '待手术', 1: '手术中', 2: '已完成', 3: '已取消' }[s] || '未知')
const statusText = (s) => ({
0: t('inHospital.surgeryManage.pending'),
1: t('inHospital.surgeryManage.inProgress'),
2: t('inHospital.surgeryManage.completed'),
3: t('inHospital.surgeryManage.cancelled'),
}[s] || t('inHospital.common.status'))
const statusTagType = (s) => ({ 0: 'warning', 1: 'danger', 2: 'success', 3: 'info' }[s] || 'info')
function getList() {
@@ -449,14 +454,14 @@ function resetQuery() { queryParams.value = { patientName: '', statusEnum: undef
function handleAdd() {
isEdit.value = false
formTitle.value = '新增手术'
formTitle.value = t('inHospital.surgeryManage.addSurgery')
form.value = { id: null, patientName: '', encounterNo: '', surgeryName: '', surgeonName: '', anesthesiologistName: '', plannedTime: '', surgeryLevel: '', remark: '' }
formVisible.value = true
}
function handleEdit(row) {
isEdit.value = true
formTitle.value = '编辑手术'
formTitle.value = t('inHospital.surgeryManage.edit')
getSurgeryDetail(row.id).then(res => {
form.value = { ...res.data }
formVisible.value = true
@@ -476,37 +481,37 @@ function submitForm() {
const action = isEdit.value ? updateSurgery(form.value) : addSurgery(form.value)
action.then(res => {
if (res.code === 200) {
ElMessage.success(isEdit.value ? '修改成功' : '新增成功')
ElMessage.success(isEdit.value ? t('inHospital.surgeryManage.editSuccess') : t('inHospital.surgeryManage.addSuccess'))
formVisible.value = false
getList()
} else {
ElMessage.error(res.msg || '操作失败')
ElMessage.error(res.msg || t('inHospital.common.fail'))
}
})
})
}
function handleDelete(row) {
ElMessageBox.confirm('确认删除该手术记录?', '提示', { type: 'warning' }).then(() => {
ElMessageBox.confirm(t('inHospital.surgeryManage.confirmDelete'), t('inHospital.common.prompt'), { type: 'warning' }).then(() => {
deleteSurgery(row.id).then(res => {
if (res.code === 200) { ElMessage.success('删除成功'); getList() }
else ElMessage.error(res.msg || '删除失败')
if (res.code === 200) { ElMessage.success(t('inHospital.surgeryManage.deleteSuccess')); getList() }
else ElMessage.error(res.msg || t('inHospital.common.fail'))
})
}).catch(() => {})
}
function handleStart(row) {
ElMessageBox.confirm('确认开始该手术?', '提示', { type: 'info' }).then(() => {
ElMessageBox.confirm(t('inHospital.surgeryManage.confirmStart'), t('inHospital.common.prompt'), { type: 'info' }).then(() => {
updateSurgeryStatus(row.id, 1).then(res => {
if (res.code === 200) { ElMessage.success('手术已开始'); getList() }
if (res.code === 200) { ElMessage.success(t('inHospital.surgeryManage.surgeryStarted')); getList() }
})
}).catch(() => {})
}
function handleComplete(row) {
ElMessageBox.confirm('确认完成该手术?', '提示', { type: 'success' }).then(() => {
ElMessageBox.confirm(t('inHospital.surgeryManage.confirmComplete'), t('inHospital.common.prompt'), { type: 'success' }).then(() => {
updateSurgeryStatus(row.id, 2).then(res => {
if (res.code === 200) { ElMessage.success('手术已完成'); getList() }
if (res.code === 200) { ElMessage.success(t('inHospital.surgeryManage.surgeryCompleted')); getList() }
})
}).catch(() => {})
}

View File

@@ -223,6 +223,8 @@ import { getCurrentUserConfig } from '@/api/system/userConfig'
import { listMenu, getMenuFullPath } from '@/api/system/menu'
import { getTodayMySchedule } from '@/api/appointmentmanage/doctorSchedule'
import { ElDivider, ElMessage } from 'element-plus'
import { autoTranslate } from '@/i18n/autoTranslate'
import menuTitleMap from '@/layout/components/Sidebar/menuTitleMap'
import {
User,
Document,
@@ -310,6 +312,17 @@ const userStore = useUserStore()
const router = useRouter()
const { t } = useI18n()
function translateMenuName(name) {
if (!name) return ''
const key = menuTitleMap[name]
if (key) {
const result = t(key)
if (result === key) return autoTranslate(name)
return result
}
return autoTranslate(name)
}
// 统计数据(从后端获取)
const statisticsData = ref({
totalPatients: 0,
@@ -488,7 +501,7 @@ const convertMenuIdsToQuickAccess = async (menuIds) => {
return {
key: menuItem.menuId,
label: menuItem.menuName,
label: translateMenuName(menuItem.menuName),
icon: menuItem.icon || 'document', // 使用数据库中的图标类名
iconColor: menuItem.iconColor || getIconColorByMenuType(menuItem.menuType) || '#10B981', // 优先使用数据库中的颜色,否则使用菜单类型的颜色
route: route
@@ -524,7 +537,7 @@ const convertMenuIdsToQuickAccess = async (menuIds) => {
// 将菜单数据转换为快捷功能格式
return {
key: matchedMenu.perms || matchedMenu.path || `menu_${matchedMenu.menuId}`,
label: matchedMenu.menuName,
label: translateMenuName(matchedMenu.menuName),
icon: matchedMenu.icon || 'document', // 使用数据库中的图标类名
iconColor: matchedMenu.iconColor || getIconColorByMenuType(matchedMenu.menuType),
route: fullPath || matchedMenu.path // 确保 route 不为空
@@ -534,7 +547,7 @@ const convertMenuIdsToQuickAccess = async (menuIds) => {
// 如果获取完整路径失败,使用现有路径作为备选
return {
key: matchedMenu.perms || matchedMenu.path || `menu_${matchedMenu.menuId}`,
label: matchedMenu.menuName,
label: translateMenuName(matchedMenu.menuName),
icon: matchedMenu.icon || 'document', // 使用数据库中的图标类名
iconColor: matchedMenu.iconColor || getIconColorByMenuType(matchedMenu.menuType),
route: matchedMenu.path || matchedMenu.fullPath || '/' // 确保 route 不为空
@@ -930,8 +943,8 @@ const fetchTodoList = async () => {
const rows = response.rows || [];
const todoData = rows.slice(0, 5).map((task, index) => ({
id: task.id || index,
title: task.taskName || task.name || '待办事项',
desc: task.description || '暂无描述',
title: task.taskName || task.name || t('home.todoFallback'),
desc: task.description || t('home.noDescription'),
priority: getPriorityFromTask(task),
status: getTaskStatus(task.status || task.state),
icon: getTaskIcon(task.category),
@@ -1016,7 +1029,7 @@ const fetchScheduleList = async () => {
}
// 确定标题
const title = schedule.doctorName ? `${schedule.doctorName}医生排班` : '医生排班'
const title = schedule.doctorName ? t('home.schedule.doctorSchedule', { name: schedule.doctorName }) : t('home.schedule.defaultTitle')
// 按照用户最新要求:直接展示 adm_doctor_schedule 的 clinic 字段或诊室名clinicRoom优先于科室名称。
// 增加对下划线命名的兼容性检查,防止后端映射异常。
@@ -1030,11 +1043,11 @@ const fetchScheduleList = async () => {
return {
id: schedule.id || index,
time: schedule.startTime ? `${schedule.startTime}-${schedule.endTime}` : '未知时间',
time: schedule.startTime ? `${schedule.startTime}-${schedule.endTime}` : t('home.schedule.unknownTime'),
title: title,
location: location,
type: tagType,
tag: schedule.timePeriod || '排班'
tag: schedule.timePeriod || t('home.schedule.tag')
}
})

View File

@@ -591,11 +591,11 @@
>
<el-option
:value="1"
label=""
:label="$t('common.yes')"
/>
<el-option
:value="0"
label=""
:label="$t('common.no')"
/>
</el-select>
</template>
@@ -779,8 +779,10 @@ import LeaveHospitalDialog from './applicationForm/leaveHospitalDialog.vue';
import TransferOrganizationDialog from './applicationForm/transferOrganizationDialog.vue';
import NursingStatus from '@/views/inpatientDoctor/home/components/applicationShow/nursingStatus.vue';
import OrderForm from './OrderForm.vue';
import { useI18n } from 'vue-i18n';
// Vue API (ref, computed, watch, nextTick, onMounted, etc.) are auto-imported by unplugin-auto-import
const { t } = useI18n();
const emit = defineEmits(['selectDiagnosis']);
const total = ref(0);
const queryParams = ref({});
@@ -1118,8 +1120,8 @@ function getListInfo(addNewRow) {
? (typeof parsedContent.skinTestFlag === 'number' ? parsedContent.skinTestFlag : (parsedContent.skinTestFlag ? 1 : 0))
: 0,
skinTestFlag_enumText: parsedContent?.skinTestFlag !== undefined && parsedContent?.skinTestFlag !== null
? (parsedContent.skinTestFlag == 1 ? '是' : '否')
: '否',
? (parsedContent.skinTestFlag == 1 ? t('common.yes') : t('common.no'))
: t('common.no'),
// 关键:优先使用 item.positionId后端 @JsonSerialize 保证精度),
// 而非 parsedContent.orgId来自 JSON.parse大 Long 可能精度丢失)
// 使用 resolveOrgId 从组织树中匹配正确的 String id
@@ -1634,7 +1636,7 @@ function selectAdviceBase(key, row) {
.then(() => {
// 用户点击"",设置皮试标志为""
prescriptionList.value[rowIndex.value].skinTestFlag = 1;
prescriptionList.value[rowIndex.value].skinTestFlag_enumText = '是';
prescriptionList.value[rowIndex.value].skinTestFlag_enumText = t('common.yes');
expandOrder.value = [currentUniqueKey];
// 使用 prescriptionList 而非 filterPrescriptionList避免过滤后找不到行导致展开失败
const rowObj = prescriptionList.value.find(item => item.uniqueKey === currentUniqueKey);
@@ -1646,7 +1648,7 @@ function selectAdviceBase(key, row) {
.catch((action) => {
// 用户点击"",设置皮试标志为""
prescriptionList.value[rowIndex.value].skinTestFlag = 0;
prescriptionList.value[rowIndex.value].skinTestFlag_enumText = '否';
prescriptionList.value[rowIndex.value].skinTestFlag_enumText = t('common.no');
expandOrder.value = [currentUniqueKey];
// 使用 prescriptionList 而非 filterPrescriptionList避免过滤后找不到行导致展开失败
const rowObj = prescriptionList.value.find(item => item.uniqueKey === currentUniqueKey);
@@ -2174,7 +2176,7 @@ function handleSaveSign(row, index) {
row.skinTestFlag = row.skinTestFlag !== undefined && row.skinTestFlag !== null
? (typeof row.skinTestFlag === 'number' ? row.skinTestFlag : (row.skinTestFlag ? 1 : 0))
: 0;
row.skinTestFlag_enumText = row.skinTestFlag == 1 ? '是' : '否';
row.skinTestFlag_enumText = row.skinTestFlag == 1 ? t('common.yes') : t('common.no');
row.contentJson = JSON.stringify(row);
// Bug #589: contentJson 已序列化(含 adviceType=1恢复内存中的出院带药类型显示
if (originalAdviceType == 7) {
@@ -2239,7 +2241,7 @@ function handleSaveBatch() {
skinTestFlag: item.skinTestFlag !== undefined && item.skinTestFlag !== null
? (typeof item.skinTestFlag === "number" ? item.skinTestFlag : (item.skinTestFlag ? 1 : 0))
: 0,
skinTestFlag_enumText: item.skinTestFlag == 1 ? '是' : '否',
skinTestFlag_enumText: item.skinTestFlag == 1 ? t('common.yes') : t('common.no'),
};
// Bug #589: 出院带药批量保存时转为药品类型
if (result.adviceType == 7) {
@@ -2375,8 +2377,8 @@ function setValue(row) {
? (typeof row.skinTestFlag === 'number' ? row.skinTestFlag : (row.skinTestFlag ? 1 : 0))
: 0,
skinTestFlag_enumText: (row.skinTestFlag !== undefined && row.skinTestFlag !== null
? (typeof row.skinTestFlag === 'number' ? (row.skinTestFlag == 1 ? '是' : '否') : (row.skinTestFlag ? '是' : '否'))
: '否'),
? (typeof row.skinTestFlag === 'number' ? (row.skinTestFlag == 1 ? t('common.yes') : t('common.no')) : (row.skinTestFlag ? t('common.yes') : t('common.no')))
: t('common.no')),
definitionId: row.chargeItemDefinitionId,
executeNum: 1,
...(row.adviceType != 3

View File

@@ -300,11 +300,11 @@
clearable
>
<el-option
label=""
:label="$t('common.yes')"
:value="1"
/>
<el-option
label=""
:label="$t('common.no')"
:value="0"
/>
</el-select>
@@ -376,7 +376,9 @@
<script setup name="InstrumentDialog">
import {addInstrument, deptTreeSelect, editInstrument} from './instrument.js';
import {useI18n} from 'vue-i18n';
const { t } = useI18n();
const { proxy } = getCurrentInstance();
const title = ref('');
const visible = ref(false);

View File

@@ -248,19 +248,19 @@
<td>
<span
class="status-tag"
:class="item.combined === '是' ? 'status-no' : 'status-yes'"
:class="item.combined === $t('common.no') ? 'status-no' : 'status-yes'"
>{{ item.combined }}</span>
</td>
<td>
<span
class="status-tag"
:class="item.display === '是' ? 'status-yes' : 'status-no'"
:class="item.display === $t('common.yes') ? 'status-yes' : 'status-no'"
>{{ item.display }}</span>
</td>
<td>
<span
class="status-tag"
:class="item.enabled === '是' ? 'status-yes' : 'status-no'"
:class="item.enabled === $t('common.yes') ? 'status-yes' : 'status-no'"
>{{ item.enabled }}</span>
</td>
<td>{{ item.operator }}</td>
@@ -608,9 +608,9 @@ async function loadData() {
amount: parseFloat((parseFloat(item.packageAmount || 0) - parseFloat(item.serviceFee || 0)).toFixed(2)),
fee: parseFloat(item.serviceFee || 0),
total: parseFloat(item.packageAmount || 0),
combined: item.enablePackagePrice === true ? '是' : '否',
display: item.showPackageName === true ? '是' : '否',
enabled: item.isDisabled === true ? '否' : '是',
combined: item.enablePackagePrice === true ? t('common.yes') : t('common.no'),
display: item.showPackageName === true ? t('common.yes') : t('common.no'),
enabled: item.isDisabled === true ? t('common.no') : t('common.yes'),
operator: item.createBy || ''
}

View File

@@ -134,7 +134,7 @@
v-if="cache.info"
class="cell"
>
{{ cache.info.aof_enabled == "0" ? "否" : "是" }}
{{ cache.info.aof_enabled == "0" ? $t('common.no') : $t('common.yes') }}
</div>
</td>
<td class="vxe-cell is-leaf">

View File

@@ -186,7 +186,7 @@
:type="row.isValid?'success':'danger'"
size="small"
>
{{ row.isValid?'是':'否' }}
{{ row.isValid?$t('common.yes'):$t('common.no') }}
</el-tag>
</template>
</el-table-column>
@@ -313,8 +313,10 @@
</template>
<script setup>
import {ref,onMounted} from 'vue'
import {useI18n} from 'vue-i18n'
import {ElMessage} from 'element-plus'
import {getPage,groupDrg,getOverview,getTopDrg} from './api'
const { t } = useI18n()
const activeTab=ref('list')
const tableData=ref([]);const total=ref(0);const overview=ref({});const topDrg=ref([])
const q=ref({pageNo:1,pageSize: 10,groupingType:'',patientName:''})

View File

@@ -1,14 +1,14 @@
<template>
<div style="padding:16px">
<div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">门诊医生工作站增强</span>
<span style="font-size:18px;font-weight:bold">{{ $t('outpatientEnhanced.title') }}</span>
</div>
<el-tabs
v-model="tab"
type="border-card"
>
<el-tab-pane
label="结构化病历模板"
:label="$t('outpatientEnhanced.structuredTemplate')"
name="template"
>
<div style="margin-bottom:12px">
@@ -16,7 +16,7 @@
type="success"
@click="showTemplate=true"
>
新增模板
{{ $t('outpatientEnhanced.addTemplate') }}
</el-button>
</div>
<el-table
@@ -26,28 +26,28 @@
>
<el-table-column
prop="templateName"
label="模板名称"
:label="$t('outpatientEnhanced.templateName')"
min-width="180"
/>
<el-table-column
prop="templateType"
label="类型"
:label="$t('outpatientEnhanced.type')"
width="100"
/>
<el-table-column
prop="departmentName"
label="科室"
:label="$t('outpatientEnhanced.department')"
width="120"
/>
<el-table-column
prop="version"
label="版本"
:label="$t('outpatientEnhanced.version')"
width="60"
align="center"
/>
<el-table-column
prop="isSystem"
label="系统模板"
:label="$t('outpatientEnhanced.systemTemplate')"
width="80"
>
<template #default="{row}">
@@ -55,19 +55,19 @@
:type="row.isSystem?'success':'info'"
size="small"
>
{{ row.isSystem?'是':'否' }}
{{ row.isSystem?$t('common.yes'):$t('common.no') }}
</el-tag>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane
label="ICD-10编码"
:label="$t('outpatientEnhanced.icd10Code')"
name="icd10"
>
<el-input
v-model="icd10Keyword"
placeholder="输入编码/名称/拼音"
:placeholder="$t('outpatientEnhanced.searchPlaceholder')"
clearable
style="width:300px;margin-bottom:12px"
/>
@@ -75,7 +75,7 @@
type="primary"
@click="searchIcd10Action"
>
搜索
{{ $t('common.search') }}
</el-button>
<el-table
:data="icd10Data"
@@ -85,22 +85,22 @@
>
<el-table-column
prop="code"
label="编码"
:label="$t('outpatientEnhanced.code')"
width="120"
/>
<el-table-column
prop="name"
label="诊断名称"
:label="$t('outpatientEnhanced.diagnosisName')"
min-width="250"
/>
<el-table-column
prop="category"
label="分类"
:label="$t('outpatientEnhanced.category')"
width="150"
/>
<el-table-column
prop="isLeaf"
label="末级"
:label="$t('outpatientEnhanced.isLeaf')"
width="60"
>
<template #default="{row}">
@@ -108,14 +108,14 @@
:type="row.isLeaf?'success':'info'"
size="small"
>
{{ row.isLeaf?'是':'否' }}
{{ row.isLeaf?$t('common.yes'):$t('common.no') }}
</el-tag>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane
label="合理用药审核"
:label="$t('outpatientEnhanced.rationalDrugUse')"
name="interaction"
>
<el-card
@@ -123,16 +123,16 @@
style="margin-bottom:12px"
>
<div style="font-weight:bold;margin-bottom:8px">
用药相互作用检查
{{ $t('outpatientEnhanced.drugInteractionCheck') }}
</div>
<el-form inline>
<el-form-item label="药品A">
<el-form-item :label="$t('outpatientEnhanced.drugA')">
<el-input
v-model="checkDrugA"
style="width:150px"
/>
</el-form-item>
<el-form-item label="药品B">
<el-form-item :label="$t('outpatientEnhanced.drugB')">
<el-input
v-model="checkDrugB"
style="width:150px"
@@ -143,7 +143,7 @@
type="primary"
@click="checkDrugInteraction"
>
检查
{{ $t('outpatientEnhanced.check') }}
</el-button>
</el-form-item>
</el-form>
@@ -151,13 +151,13 @@
v-if="interactionResult.hasInteraction"
style="color:#f56c6c;margin-top:8px"
>
发现 {{ interactionResult.rules?.length }} 条相互作用规则
{{ $t('outpatientEnhanced.foundInteractionRules', { count: interactionResult.rules?.length || 0 }) }}
</div>
<div
v-else-if="interactionResult.hasInteraction===false"
style="color:#67c23a;margin-top:8px"
>
未发现相互作用
{{ $t('outpatientEnhanced.noInteraction') }}
</div>
</el-card>
<el-table
@@ -167,22 +167,22 @@
>
<el-table-column
prop="drugA"
label="药品A"
:label="$t('outpatientEnhanced.drugA')"
width="150"
/>
<el-table-column
prop="drugB"
label="药品B"
:label="$t('outpatientEnhanced.drugB')"
width="150"
/>
<el-table-column
prop="interactionType"
label="类型"
:label="$t('outpatientEnhanced.interactionType')"
width="120"
/>
<el-table-column
prop="severity"
label="严重程度"
:label="$t('outpatientEnhanced.severity')"
width="100"
>
<template #default="{row}">
@@ -196,14 +196,14 @@
</el-table-column>
<el-table-column
prop="description"
label="描述"
:label="$t('outpatientEnhanced.description')"
min-width="200"
show-overflow-tooltip
/>
</el-table>
</el-tab-pane>
<el-tab-pane
label="出院小结"
:label="$t('outpatientEnhanced.dischargeSummary')"
name="discharge"
>
<el-table
@@ -213,34 +213,34 @@
>
<el-table-column
prop="patientName"
label="患者"
:label="$t('outpatientEnhanced.patient')"
width="90"
/>
<el-table-column
prop="admissionDiagnosis"
label="入院诊断"
:label="$t('outpatientEnhanced.admissionDiagnosis')"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
prop="dischargeDiagnosis"
label="出院诊断"
:label="$t('outpatientEnhanced.dischargeDiagnosis')"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
prop="dischargeCondition"
label="出院情况"
:label="$t('outpatientEnhanced.dischargeCondition')"
width="100"
/>
<el-table-column
prop="doctorName"
label="主管医生"
:label="$t('outpatientEnhanced.attendingDoctor')"
width="90"
/>
<el-table-column
prop="status"
label="状态"
:label="$t('common.status')"
width="80"
>
<template #default="{row}">
@@ -248,14 +248,14 @@
:type="['warning','success',''][row.status]"
size="small"
>
{{ ['草稿','已完成','已归档'][row.status] }}
{{ [$t('outpatientEnhanced.draft'),$t('outpatientEnhanced.completed'),$t('outpatientEnhanced.archived')][row.status] }}
</el-tag>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane
label="处方拦截"
:label="$t('outpatientEnhanced.prescriptionIntercept')"
name="intercept"
>
<el-card
@@ -266,12 +266,12 @@
<div>
<div style="font-size:24px;font-weight:bold;color:#f56c6c">
{{ interceptStats.blocked||0 }}
</div><div>拦截</div>
</div><div>{{ $t('outpatientEnhanced.intercept') }}</div>
</div>
<div>
<div style="font-size:24px;font-weight:bold;color:#e6a23c">
{{ interceptStats.overridden||0 }}
</div><div>强制通过</div>
</div><div>{{ $t('outpatientEnhanced.forcePass') }}</div>
</div>
</div>
</el-card>
@@ -282,7 +282,7 @@
>
<el-table-column
prop="drugName"
label="药品"
:label="$t('outpatientEnhanced.drug')"
width="150"
/>
<el-table-column
@@ -328,8 +328,10 @@
<script setup>
import {ref,onMounted} from 'vue'
import {useI18n} from 'vue-i18n'
import {ElMessage} from 'element-plus'
import {getTemplatePage,searchIcd10,getInteractionPage,checkInteraction,getDischargePage,getInterceptPage,getInterceptStats} from './api'
const { t } = useI18n()
const tab=ref('template')
const templateData=ref([]),icd10Data=ref([]),interactionData=ref([]),dischargeData=ref([]),interceptData=ref([])
const interceptStats=ref({})

View File

@@ -2,7 +2,7 @@
<div class="app-container">
<el-card class="left" shadow="hover">
<template #header>
<span style="font-weight: 600">患者列表</span>
<span style="font-weight: 600">{{ t('common.patientList') }}</span>
</template>
<div class="form">
<el-form
@@ -13,25 +13,25 @@
label-position="right"
>
<el-form-item
label="患者信息"
:label="t('common.patientInfo')"
prop="searchKey"
>
<el-input
v-model="queryParams.searchKey"
placeholder="请输入姓名/证件号"
:placeholder="t('common.enterNameOrId')"
clearable
style="width: 160px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item
label="发药状态"
:label="t('common.dispenseStatus')"
prop="departmentId"
style="margin-left: 10px"
>
<el-select
v-model="queryParams.statusEnum"
placeholder="请选择发药状态"
:placeholder="t('common.selectDispenseStatus')"
clearable
style="width: 160px"
@change="handleQuery"
@@ -44,12 +44,12 @@
/>
</el-select>
</el-form-item>
<el-form-item label="就诊日期">
<el-form-item :label="t('common.visitDate')">
<el-date-picker
v-model="dateRange"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('common.startDate')"
:end-placeholder="t('common.endDate')"
style="width: 250px"
value-format="YYYY-MM-DD"
@change="handleQuery"
@@ -60,10 +60,10 @@
type="primary"
@click="handleQuery"
>
搜索
{{ t('common.search') }}
</el-button>
<el-button @click="resetQuery">
重置
{{ t('common.reset') }}
</el-button>
</el-form-item>
</el-form>
@@ -80,31 +80,31 @@
>
<vxe-column
field="patientName"
title="姓名"
:title="t('common.name')"
min-width="55"
align="center"
/>
<vxe-column
field="genderEnum_enumText"
title="性别"
:title="t('common.gender')"
width="56"
align="center"
/>
<vxe-column
field="age"
title="年龄"
:title="t('common.age')"
width="56"
align="center"
/>
<vxe-column
field="phone"
title="电话"
:title="t('common.phone')"
min-width="55"
align="center"
/>
<vxe-column
field="receptionTime"
title="就诊日期"
:title="t('common.visitDate')"
min-width="100"
align="center"
>
@@ -126,9 +126,9 @@
<el-card class="right" shadow="hover">
<template #header>
<el-row justify="space-between" align="middle">
<span style="font-weight: 600">发药明细</span>
<span style="font-weight: 600">{{ t('common.dispenseDetail') }}</span>
<span style="font-size: 14px; color: #e6a23c">
总金额<strong>¥{{ medicineTotalPrice ? medicineTotalPrice.toFixed(2) : '0.00' }}</strong>
{{ t('common.totalAmount') }}<strong>¥{{ medicineTotalPrice ? medicineTotalPrice.toFixed(2) : '0.00' }}</strong>
</span>
</el-row>
</template>
@@ -136,11 +136,11 @@
<span
style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px"
>
调配药师
{{ t('common.preparerDoctor') }}
</span>
<el-select
v-model="preparerDoctor"
placeholder="调配药师"
:placeholder="t('common.preparerDoctor')"
style="width: 160px"
>
<el-option
@@ -153,11 +153,11 @@
<span
style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px"
>
药品分类
{{ t('common.drugCategory') }}
</span>
<el-select
v-model="tcmFlag"
placeholder="药品分类"
:placeholder="t('common.drugCategory')"
style="width: 160px"
@change="
() => {
@@ -177,11 +177,11 @@
<span
style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px"
>
项目
{{ t('common.item') }}
</span>
<el-select
v-model="projectTypeCode"
placeholder="项目"
:placeholder="t('common.item')"
style="width: 160px"
:clearable="false"
@change="
@@ -194,15 +194,15 @@
"
>
<el-option
label="全部"
:label="t('common.all')"
value="1"
/>
<el-option
label="药品"
:label="t('common.drug')"
value="2"
/>
<el-option
label="耗材"
:label="t('common.consumable')"
value="3"
/>
</el-select>
@@ -212,21 +212,21 @@
style="margin-left: 30px"
@click="handleBatch()"
>
批量发药
{{ t('common.batchDispense') }}
</el-button>
<el-button
type="primary"
style="margin-left: 30px"
@click="handleScan()"
>
扫码
{{ t('common.scanCode') }}
</el-button>
<el-button
type="primary"
style="margin-left: 30px"
@click="printPrescription()"
>
处方打印
{{ t('common.prescriptionPrint') }}
</el-button>
</div>
<vxe-table
@@ -248,37 +248,37 @@
/>
<vxe-column
field="prescriptionNo"
title="处方号"
:title="t('common.prescriptionNo')"
width="120"
align="center"
/>
<vxe-column
field="conditionName"
title="诊断"
:title="t('common.diagnosis')"
width="120"
align="center"
/>
<vxe-column
field="dispenseEnum_enumText"
title="处方类型"
:title="t('common.prescriptionType')"
width="120"
align="center"
/>
<vxe-column
field="itemName"
title="项目名称"
:title="t('common.itemName')"
width="160"
align="center"
/>
<vxe-column
field="merchandiseName"
title="商品名称"
:title="t('common.merchandiseName')"
width="160"
align="center"
/>
<vxe-column
field="quantity"
title="发药数量"
:title="t('common.dispenseQty')"
width="130"
align="center"
>
@@ -318,7 +318,7 @@
</vxe-column>
<vxe-column
field="lotNumber"
title="批次号"
:title="t('common.lotNumber')"
width="160"
align="center"
>
@@ -356,7 +356,7 @@
</vxe-column>
<vxe-column
field="statusEnum_enumText"
title="发药状态"
:title="t('common.dispenseStatus')"
width="100"
align="center"
>
@@ -368,7 +368,7 @@
</vxe-column>
<vxe-column
field="dispensePerDuration"
title="天数"
:title="t('common.days')"
width="80"
align="center"
/>
@@ -376,7 +376,7 @@
<!-- <vxe-column field="quantity" title="发药数量" width="100" align="center" /> -->
<vxe-column
field="totalVolume"
title="规格"
:title="t('common.specification')"
width="100"
align="center"
/>
@@ -395,7 +395,7 @@
<vxe-column
v-if="tcmFlag == '0'"
field="traceNo"
title="追溯码"
:title="t('common.traceCode')"
width="180"
align="center"
>
@@ -408,7 +408,7 @@
<el-input
:ref="'traceNoRef' + scope.rowIndex"
v-model="scope.row.traceNo"
placeholder="请输入追溯码"
:placeholder="t('common.enterTraceCode')"
@input="handleTraceNoInput(scope.row, scope.rowIndex)"
/>
</el-tooltip>
@@ -416,7 +416,7 @@
</vxe-column>
<vxe-column
field="totalPrice"
title="金额"
:title="t('common.amount')"
width="100"
:formatter="formatPrice"
align="right"
@@ -424,37 +424,37 @@
/>
<vxe-column
field="locationName"
title="发药药房"
:title="t('common.dispensePharmacy')"
width="90"
align="center"
/>
<vxe-column
field="manufacturerText"
title="生产厂家"
:title="t('common.manufacturer')"
width="200"
align="center"
/>
<vxe-column
field="doctorName"
title="开单医生"
:title="t('common.orderingDoctor')"
width="100"
align="center"
/>
<!-- <vxe-column field="dose" title="剂量" width="100" align="center" /> -->
<vxe-column
field="rateCode"
title="频次"
:title="t('common.frequency')"
width="100"
align="center"
/>
<vxe-column
field="methodCode_dictText"
title="用法"
:title="t('common.usage')"
width="100"
align="center"
/>
<vxe-column
title="操作"
:title="t('common.operation')"
align="center"
width="160"
fixed="right"
@@ -468,7 +468,7 @@
icon="SuccessFilled"
@click="handleBatch(scope.row)"
>
发药
{{ t('common.dispense') }}
</el-button>
<el-button
link
@@ -477,7 +477,7 @@
icon="CircleClose"
@click="backMedicine(scope.row)"
>
作废
{{ t('common.void') }}
</el-button>
</template>
</vxe-column>
@@ -504,13 +504,13 @@
<el-dialog
v-model="showDialog"
title="选择作废原因"
:title="t('common.selectVoidReason')"
width="30%"
>
<!-- 下拉选择框 -->
<el-select
v-model="notPerformedReasonEnum"
placeholder="请选择作废原因"
:placeholder="t('common.selectVoidReasonPlaceholder')"
>
<el-option
v-for="item in backReason"
@@ -526,8 +526,8 @@
<el-button
type="primary"
@click="handleConfirm"
> </el-button>
<el-button @click="handleCancel"> </el-button>
>{{ t('common.confirm') }}</el-button>
<el-button @click="handleCancel">{{ t('common.cancel') }}</el-button>
</span>
</template>
</el-dialog>
@@ -565,8 +565,10 @@ import templateJson from '@/components/Print/Pharmacy.json';
import chineseMedicineTemplateJson from '@/components/Print/ChineseMedicinePrescription.json';
import {formatInventory} from '../../../utils/his';
import useUserStore from '@/store/modules/user';
import {useI18n} from 'vue-i18n';
const userStore = useUserStore();
const {t} = useI18n();
const {proxy} = getCurrentInstance();
const showSearch = ref(true);
@@ -609,11 +611,11 @@ const projectTypeCode = ref("2");
const selectedRow = ref(null);
const medCategoryCode = ref([
{
label: "西药中成药",
label: t('common.westernChineseMedicine'),
value: "0",
},
{
label: "中药",
label: t('common.chineseMedicine'),
value: "1",
},
]);

View File

@@ -111,11 +111,11 @@
style="width: 100px"
>
<el-option
label=""
:label="$t('common.yes')"
:value="true"
/>
<el-option
label=""
:label="$t('common.no')"
:value="false"
/>
</el-select>
@@ -386,9 +386,11 @@
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getNotePage, getNoteDetail, addNote, updateNote, deleteNote, signNote, getMonitor } from './api'
const { t } = useI18n()
const loading = ref(false)
const tableData = ref([])
const total = ref(0)

View File

@@ -1,8 +1,8 @@
<template>
<div class="todo-container">
<div class="page-header">
<h2>全部待办事项</h2>
<p>这里展示了您的所有待办事项</p>
<h2>{{ $t('todo.allTodos') }}</h2>
<p>{{ $t('todo.allTodosDesc') }}</p>
</div>
<div class="filter-section">
@@ -12,47 +12,47 @@
:inline="true"
>
<el-form-item
label="优先级"
:label="$t('todo.priority')"
prop="priority"
>
<el-select
v-model="queryParams.priority"
placeholder="请选择优先级"
:placeholder="$t('todo.selectPriority')"
clearable
>
<el-option
label=""
:label="$t('todo.high')"
value="high"
/>
<el-option
label=""
:label="$t('todo.medium')"
value="medium"
/>
<el-option
label=""
:label="$t('todo.low')"
value="low"
/>
</el-select>
</el-form-item>
<el-form-item
label="状态"
:label="$t('todo.status')"
prop="status"
>
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
:placeholder="$t('todo.selectStatus')"
clearable
>
<el-option
label="未处理"
:label="$t('todo.pending')"
value="pending"
/>
<el-option
label="处理中"
:label="$t('todo.processing')"
value="processing"
/>
<el-option
label="已完成"
:label="$t('todo.completed')"
value="completed"
/>
</el-select>
@@ -63,13 +63,13 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ $t('common.search') }}
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
{{ $t('common.reset') }}
</el-button>
</el-form-item>
</el-form>
@@ -109,7 +109,7 @@
class="todo-priority"
:style="{ color: getPriorityColor(todo.priority) }"
>
{{ getPriorityText(todo.priority) }}优先级
{{ getPriorityText(todo.priority) }}{{ $t('todo.prioritySuffix') }}
</span>
</div>
</div>
@@ -119,13 +119,13 @@
size="small"
@click.stop="handleProcess(todo)"
>
立即处理
{{ $t('todo.processNow') }}
</el-button>
<el-button
size="small"
@click.stop="handleDetails(todo)"
>
查看详情
{{ $t('todo.viewDetails') }}
</el-button>
</div>
</el-card>
@@ -134,7 +134,7 @@
v-if="todoList.length === 0 && !loading"
class="empty-state"
>
<el-empty description="暂无待办事项" />
<el-empty :description="$t('todo.noTodos')" />
</div>
<div
v-if="loading"
@@ -163,8 +163,12 @@
<script setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { listTodo } from '@/api/workflow/task.js'
import { markRaw } from 'vue'
const { t } = useI18n()
const router = useRouter()
import {
Document,
User,
@@ -176,8 +180,6 @@ import {
Setting
} from '@element-plus/icons-vue'
const router = useRouter()
// 待办事项数据
const todoList = ref([])
const loading = ref(true)
@@ -203,8 +205,8 @@ const getList = async () => {
const rows = response.rows || [];
todoList.value = rows.map((task, index) => ({
id: task.id || index,
title: task.taskName || task.name || '待办事项',
desc: task.description || '暂无描述',
title: task.taskName || task.name || t('todo.fallbackTitle'),
desc: task.description || t('todo.noDescription'),
priority: getPriorityFromTask(task),
status: getTaskStatus(task.status || task.state),
icon: getTaskIcon(task.category),
@@ -254,7 +256,7 @@ const getTaskIcon = (category) => {
// 格式化日期
const formatDate = (dateStr) => {
if (!dateStr) return '刚刚'
if (!dateStr) return t('todo.justNow')
const date = new Date(dateStr)
const now = new Date()
@@ -263,10 +265,10 @@ const formatDate = (dateStr) => {
const diffHours = Math.floor(diffMins / 60)
const diffDays = Math.floor(diffHours / 24)
if (diffMins < 1) return '刚刚'
if (diffMins < 60) return `${diffMins}分钟前`
if (diffHours < 24) return `${diffHours}小时前`
if (diffDays < 7) return `${diffDays}天前`
if (diffMins < 1) return t('todo.justNow')
if (diffMins < 60) return t('todo.minsAgo', { n: diffMins })
if (diffHours < 24) return t('todo.hoursAgo', { n: diffHours })
if (diffDays < 7) return t('todo.daysAgo', { n: diffDays })
// 返回具体日期
return `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`
@@ -318,9 +320,9 @@ const getPriorityColor = (priority) => {
// 获取优先级文本
const getPriorityText = (priority) => {
switch (priority) {
case 'high': return '高'
case 'medium': return '中'
case 'low': return '低'
case 'high': return t('todo.high')
case 'medium': return t('todo.medium')
case 'low': return t('todo.low')
default: return ''
}
}
@@ -338,9 +340,9 @@ const getStatusTagType = (status) => {
// 获取状态文本
const getStatusText = (status) => {
switch (status) {
case 'pending': return '未处理'
case 'processing': return '处理中'
case 'completed': return '已完成'
case 'pending': return t('todo.pending')
case 'processing': return t('todo.processing')
case 'completed': return t('todo.completed')
default: return ''
}
}