# 变更日志 (Changelog) 本项目的所有重要变更都将记录在此文件中。 ## [1.22.1] - 2025-12-23 13:33 ### 变更 (Changed) - **MQTT服务连接稳定性和事件管理增强** - 系统性优化两个MQTT服务的连接管理和事件处理机制 - 增强MQTT连接配置,添加keepalive(120秒)和reconnectPeriod(5秒)参数 - 为每个客户端生成唯一ID,避免连接冲突 - 添加连接状态管理(isConnecting标志),防止重复连接调用 - 实现旧连接清理机制,调用removeAllListeners()防止内存泄漏 - 完善连接生命周期事件监听:reconnect、close、offline、disconnect - 增强日志记录系统,添加ISO时间戳和状态emoji图标(✅🔄🚪📡⚠️❌) - 改进错误处理,将错误事件发送到应用层(MQTT_ERROR、DEVICE_MQTT_ERROR) - 实现优雅的连接关闭逻辑,支持错误处理和资源释放 - 为两个MQTT服务(mqttService和mqttServiceForDevice)同步实施相同优化 **核心改进:** - 连接稳定性:通过心跳和自动重连机制减少连接中断 - 内存管理:清理旧连接和事件监听器,避免内存泄漏 - 状态可见性:完整的事件监听和日志记录,便于监控和调试 - 错误恢复:优雅的错误处理和重连机制,提升系统健壮性 - 资源管理:正确的连接关闭流程,确保资源释放 **技术实现:** - 连接配置优化: - 添加 keepalive: 120 和 reconnectPeriod: 5000 - 使用随机生成的唯一 clientId - 状态管理: - 添加 isConnecting 标志防止重复调用 - mqttClient 类型改为 any 并初始化为 null - 连接生命周期: - startListening 前清理旧连接 - connect 事件接收 connack 参数并发送成功事件 - 添加 reconnect、close、offline、disconnect 事件监听 - 日志增强: - 使用 ISO 时间戳函数 `() => new Date().toISOString()` - 添加 emoji 图标标识不同状态 - 错误日志只记录第一行堆栈信息 - 错误处理: - 发送 MQTT_CONNECTED/DEVICE_MQTT_CONNECTED 事件 - 发送 MQTT_ERROR/DEVICE_MQTT_ERROR 事件到应用层 - error 事件重置 isConnecting 标志 - 优雅关闭: - 检查 mqttClient 是否存在 - 调用 removeAllListeners() 清理监听器 - 使用 end(false, callback) 优雅关闭 - catch 块中强制关闭 end(true) **改动文件:** - src/domain/mqttService.ts - src/domain/mqttServiceForDevice.ts - CHANGELOG.md - package.json (版本更新: 1.22.0 -> 1.22.1) --- ## [1.22.0] - 2025-12-22 19:27 ### 新增 (Added) - **软件包在线升级功能基础实现** - 实现应用启动时检查软件版本更新并显示提示框的功能 - 创建版本更新服务(VersionUpdateService),负责检查新版本可用性 - 实现版本更新状态管理(Redux slice),管理更新状态和版本信息 - 添加版本更新API接口,封装后端版本检查请求 - 创建版本更新提示模态框(VersionUpdateModal),显示新版本可用信息 - 创建下载进度模态框(DownloadProgressModal),预留下载进度显示功能 - 在应用初始化时集成版本检查逻辑,用户登录后自动触发 - 在主页面集成版本更新模态框显示控制逻辑 - 添加版本更新相关的Cypress测试用例和Mock数据 - 更新Redux store配置,集成版本更新状态管理 - 添加MQTT工具类和版本工具类,为后续功能扩展做准备 - 更新全局类型定义,添加版本更新相关类型 **核心功能实现:** - 版本检查:应用启动后自动检查是否有新版本可用 - 提示显示:检测到新版本时显示更新提示模态框 - 用户交互:用户可以选择稍后提醒或关闭提示框 - 状态管理:通过Redux统一管理版本更新状态 - 错误处理:版本检查失败不影响应用正常启动 - 预留扩展:为下载、安装等后续功能预留接口和组件 **技术实现:** - 服务层:VersionUpdateService 单例服务管理版本检查业务逻辑 - 状态管理:versionUpdateSlice 处理状态变更和副作用 - API层:versionUpdate.ts 封装HTTP请求接口 - 组件层:VersionUpdateModal 和 DownloadProgressModal 提供用户界面 - 测试层:Cypress E2E测试和Mock服务确保功能稳定性 - 工具层:mqttUtils.ts 和 versionUtils.ts 为后续功能提供支持 **改动文件:** - cypress/e2e/versionUpdate.cy.ts (新增) - cypress/support/mock/handlers/versionUpdate.ts (新增) - docs/实现/软件包在线升级功能设计与实现方案.md (新增) - src/API/versionUpdate.ts (新增) - src/components/DownloadProgressModal.tsx (新增) - src/components/VersionUpdateModal.tsx (新增) - src/services/VersionUpdateService.ts (新增) - src/states/versionUpdateSlice.ts (新增) - src/types/global.d.ts (修改) - src/utils/mqttUtils.ts (新增) - src/utils/versionUtils.ts (新增) - cypress/support/mock/index.ts (修改) - package-lock.json (修改) - src/app.tsx (修改) - src/pages/index/AppInitializer.tsx (修改) - src/pages/index/index.tsx (修改) - src/states/store.ts (修改) - CHANGELOG.md - package.json (版本更新: 1.21.0 -> 1.22.0) --- ## [1.21.0] - 2025-12-22 17:24 ### 新增 (Added) - **国际化改进 - 添加宠物类型键并完善组件多语言支持** - 实现完整的宠物产品和诊断报告界面的国际化支持 - 在 RegisterAvailableFilterBar.tsx 中添加基于产品的患者类型选择器国际化,区分人类和宠物产品 - 在 AnimalBaseInfo.tsx 中添加完整多语言支持,包括患者姓名、性别、年龄、主人类别和报告相关字段 - 在 i18n 文件中添加宠物类型和报告字段的多语言键,包括申请科室、检查号、检查方法、放射科医生、审核医师等 - 支持 VETDROS(宠物产品)和 DROS(人类产品)的动态文本切换 **核心功能实现:** - 产品区分支持:根据 productName 动态选择不同的国际化键 - 诊断报告国际化:AnimalBaseInfo 组件所有标签支持多语言 - 宠物类型键:新增 "animal.register.patientType" 支持宠物产品 - 报告字段键:新增 "report." 前缀的诊断报告相关多语言键 **技术实现:** - 在 RegisterAvailableFilterBar 组件中添加 productName 选择器 - 使用条件表达式根据产品名称选择患者类型标签 - 在 AnimalBaseInfo 组件中为所有表单项添加 FormattedMessage - 新增多语言键到 zh.js 和 en.js 文件 - 保持与现有 register.form.tsx 组件的一致性设计模式 **改动文件:** - src/pages/patient/components/RegisterAvailableFilterBar.tsx - src/pages/patient/DiagnosticReport/components/AnimalBaseInfo.tsx - src/assets/i18n/messages/zh.js - src/assets/i18n/messages/en.js - scripts/output/i18n/zh.js - scripts/output/i18n/en.js - CHANGELOG.md - package.json (版本更新: 1.20.2 -> 1.21.0) --- ## [1.20.2] - 2025-12-22 16:36 ### 新增 (Added) - **编辑任务模态框和操作面板产品区分多语言支持** - 为编辑任务界面添加产品类型区分的国际化支持 - 在 EditTaskModal.tsx 中根据 productName 动态切换标题、患者信息标题和字段标签 - 在 ActionPanel.tsx 中为编辑按钮工具提示添加产品区分支持 - 在 zh.js 和 en.js 中添加动物相关的多语言 key - 支持 VETDROS(动物产品)和普通产品显示不同的界面文本 **核心功能实现:** - 模态框标题区分:动物产品显示"编辑动物",普通产品显示"编辑患者" - 患者信息标题区分:动物产品显示"动物信息",普通产品显示"患者信息" - 字段标签区分:动物姓名/宠物昵称,动物ID/宠物编号等 - 操作面板工具提示:编辑按钮根据产品类型显示相应提示 **技术实现:** - 在 EditTaskModal 组件中添加 productName 选择器 - 使用条件表达式根据产品名称选择不同的翻译 key - 新增动物相关多语言键值对到国际化文件 - 保持与现有 SearchPanel 组件的一致性设计模式 **改动文件:** - src/pages/patient/components/EditTaskModal.tsx - src/pages/patient/components/ActionPanel.tsx - src/assets/i18n/messages/zh.js - src/assets/i18n/messages/en.js - CHANGELOG.md - package.json (版本更新: 1.20.1 -> 1.20.2) --- ## [1.20.1] - 2025-12-22 15:36 ### 新增 (Added) - **搜索面板宠物专用国际化支持** - 添加搜索框占位符文本的宠物专用版本 - 在 SearchPanel.tsx 中根据 productName 动态切换搜索框占位符文本 - 在 zh.js 和 en.js 中添加宠物专用搜索面板国际化 key **改动文件:** - src/pages/patient/components/SearchPanel.tsx - src/assets/i18n/messages/zh.js - src/assets/i18n/messages/en.js - CHANGELOG.md - package.json (版本更新: 1.20.0 -> 1.20.1) --- ## [1.20.0] - 2025-12-22 15:24 ### 新增 (Added) - **调整注册表单patient_name字段位置** - 将patient_name字段从gender字段之后移动到species字段之后,提升表单字段逻辑顺序 - 修改 BasicInfoForm 组件中字段排列顺序 - 确保patient_name字段紧跟在species字段之后,更符合用户填写逻辑 **改动文件:** - src/pages/patient/components/register.form.tsx - CHANGELOG.md - package.json (版本更新: 1.19.0 -> 1.20.0) --- ## [1.19.0] - 2025-12-22 14:46 ### 新增 (Added) - **系统设置中添加"关于系统"模块** - 实现系统版本信息展示功能 - 创建 AboutSystem 组件,展示系统名称、版本号和项目标识 - 使用 Ant Design Descriptions 和 Card 组件实现信息展示 - 直接从 package.json 读取版本号,确保版本信息自动同步 - 在系统设置的"系统之家"分类中添加"关于系统"二级模块 - 模块位于"软件许可"之后,方便用户快速查看系统版本信息 **核心功能实现:** - 版本信息展示:显示系统名称(医学成像系统)、当前版本(1.19.0)和项目标识(zsis) - 自动同步:版本号直接从 package.json 读取,无需手动维护 - 界面设计:与现有 SiteInfo 组件保持一致的布局风格 - 配置管理:在系统设置配置中添加 about_system 配置项 **技术实现:** - 创建 AboutSystem.tsx 组件 - 使用 `import packageJson from '../../../../../package.json'` 导入版本信息 - 添加 @ts-ignore 注释处理 TypeScript 类型检查 - 使用 Descriptions 组件展示系统信息 - 使用 Card 组件包裹,保持视觉一致性 - 更新 SystemHome/index.tsx - 导出 AboutSystem 组件 - 添加"关于系统 - 已实现"注释 - 更新 config.tsx - 在 software_license 后添加 about_system 配置项 - 配置 id、title 和 component 属性 **改动文件:** - src/pages/system/SettingsModal/sections/SystemHome/AboutSystem.tsx (新增) - src/pages/system/SettingsModal/sections/SystemHome/index.tsx - src/pages/system/SettingsModal/config.tsx - CHANGELOG.md - package.json (版本更新: 1.18.2 -> 1.19.0) --- ## [1.18.2] - 2025-12-22 14:07 ### 修复 (Fixed) - **从历史清单进入检查后体位列表未更新问题** ([src/domain/patient/worklistToExam.ts](src/domain/patient/worklistToExam.ts)) - 修复从 Worklist/History 双击进入检查界面时,体位列表不更新为最新选中 work 的问题 - 将体位列表转换和设置(`transformWorksToBodyPositions` 和 `setBodyPositions`)提前到判断曝光状态之前执行 - 确保无论进入检查界面还是处理界面,体位列表都能被正确更新 - 添加 await 关键字优化异步 dispatch 调用(`clearWorks` 和 `addWork`) - 添加调试日志便于问题排查 **核心改进:** - 数据同步优化:体位列表现在在进入任何界面前都会正确更新 - 异步流程优化:使用 await 确保状态更新的顺序性 - 问题排查增强:添加关键步骤的调试日志 - 代码格式规范:修正 `judged_status` 字段的空格格式 **技术实现:** - 修改 `worklistToExam` 函数中的执行顺序 - 将体位列表更新逻辑从 `if (allExposed)` 分支移到分支判断之前 - 添加 `await` 关键字到 `clearWorks()` 和 `addWork()` dispatch 调用 - 添加 `console.log` 调试输出跟踪执行流程 - 格式修正:`judged_status:image.judged_status` → `judged_status: image.judged_status` **改动文件:** - src/domain/patient/worklistToExam.ts - docs/从任务清单进入检查的流程.md (新增) - CHANGELOG.md - package.json (版本更新: 1.18.1 -> 1.18.2) --- ## [1.18.1] - 2025-12-22 13:00 ### 修复 (Fixed) - **Original Size 功能在不同体位间表现不一致问题** ([src/pages/view/components/viewers/stack.image.viewer.tsx](src/pages/view/components/viewers/stack.image.viewer.tsx)) - 重写 setOriginalSize 函数,完全忽略 DICOM spacing,实现真正的像素级 1:1 显示 - 修复因不同体位 spacing 不同导致的缩放结果差异 - 第一个体位 spacing=1 时:zoomFactor=0.278,图像正确放大 ✅ - 第二个体位 spacing=0.14 时:zoomFactor=1.987,图像意外缩小 ❌ - 改为只基于像素尺寸计算:fitScale = min(canvas宽/图像宽, canvas高/图像高),finalZoom = 1 / fitScale - 添加详细的调试日志输出,包括图像尺寸、canvas 尺寸、fitScale 和 finalZoom - 确保所有体位都能得到一致的像素级 1:1 显示效果 **核心改进:** - 缩放算法优化:移除对 spacing 的依赖,简化计算逻辑 - 一致性保证:不同 spacing 的体位现在都能正确放大到原始尺寸 - 调试增强:详细的日志输出便于问题排查 **改动文件:** - src/pages/view/components/viewers/stack.image.viewer.tsx - CHANGELOG.md - package.json (版本更新: 1.18.0 -> 1.18.1) --- ## [1.18.0] - 2025-12-22 11:27 ### 新增 (Added) - **图标主题化和高分辨率升级** - 实现完整的图标系统主题化和资源优化 - 在 ActionPanel 和 FunctionArea 中统一图标主题支持 - 添加动态主题色和尺寸控制,使用 Ant Design useToken - 创建 SVG 处理脚本,自动替换 fill/stroke 为 currentColor - 删除低分辨率 1x PNG/SVG 图标资源,减少项目体积 - 新增高分辨率 2x 图标目录,提升视觉质量 **核心功能实现:** - 图标主题化: 所有图标支持动态主题色,自动适配深色/浅色主题 - 样式统一: 使用 fontSize 和 Tailwind CSS 实现灵活的图标尺寸控制 - SVG 处理: 自动化脚本批量处理 SVG 文件,替换硬编码颜色为 currentColor - 资源优化: 清理旧的 1x 图标,升级到 2x 高分辨率图标 - 代码重构: 简化图标使用方式,移除硬编码的主题和状态属性 **技术实现:** - 在 ActionPanel.tsx 中: - 导入 antd theme 和 useToken hook - 将图标 theme 属性从 "default" 改为 {themeType} - 添加 style={{fontSize: '48px'}} 控制图标大小 - 添加 className={`text-[${useToken().token.colorPrimary}]`} 动态主题色 - 在 FunctionArea.tsx 中: - 导入 antd theme 和 useToken hook - 重构 getIconStyle 函数,添加 fontSize 基础样式 - 将激活状态颜色从硬编码改为动态 colorPrimary - 修改图标 theme 属性为 "default" - 添加动态 className 支持主题色 - 优化按钮边框和背景色,使用主题色 - 创建 scripts/replace-svg-fill.js: - 递归扫描 SVG 文件 - 自动替换 fill="#000000" 为 fill="currentColor" - 自动替换 stroke="#000000" 为 stroke="currentColor" - 统计处理结果和修改文件数量 - 图标资源升级: - 删除 src/assets/Icons/base/module-process/theme-default/1x/ 目录下的所有图标 - 删除 src/assets/Icons/base/module-patient/theme-dark/1x/report.svg - 新增 src/assets/Icons/base/module-patient/theme-default/2x/ 目录 - 新增 src/assets/Icons/base/module-process/theme-default/2x/ 目录 **改动文件:** - scripts/replace-svg-fill.js (新增) - src/assets/Icons/base/module-patient/theme-default/2x/ (新增目录) - src/assets/Icons/base/module-process/theme-default/2x/ (新增目录) - src/pages/patient/components/ActionPanel.tsx - src/pages/view/components/FunctionArea.tsx - src/assets/Icons/base/module-process/theme-default/1x/ (删除大量图标) - src/assets/Icons/base/module-patient/theme-dark/1x/report.svg (删除) - CHANGELOG.md - package.json (版本更新: 1.17.1 -> 1.18.0) --- ## [1.17.1] - 2025-12-20 16:25 ### 修复 (Fixed) - **出生日期选择未来日期问题修复** ([src/pages/patient/components/register.form.tsx](src/pages/patient/components/register.form.tsx)) - 修复患者注册表单中出生日期可以选择未来日期的问题 - 在 DatePicker 组件中添加 disabledDate 属性,禁用大于今天的日期 - 使用 dayjs().endOf('day') 确保包括今天整天,避免边界问题 - 提升数据完整性,防止输入无效的出生日期 **核心改进:** - 用户体验优化:日期选择器现在自动禁用未来日期,避免用户输入错误 - 数据验证增强:通过 UI 层面限制,配合表单验证确保数据正确性 - 代码简洁:利用 Ant Design DatePicker 的 disabledDate 属性实现,无需额外验证逻辑 **改动文件:** - src/pages/patient/components/register.form.tsx - CHANGELOG.md - package.json (版本更新: 1.17.0 -> 1.17.1) --- ## [1.17.0] - 2025-12-20 16:00 ### 新增 (Added) - **有状态按钮工具状态自动同步功能** - 实现cornerstone工具激活状态与按钮状态的自动同步 - 新增 `ToolStateListener` 类,监听cornerstone工具状态变化事件 - 实现Redux状态管理,维护激活工具的状态映射 - 修改按钮状态判断逻辑,有状态按钮基于工具激活状态显示激活效果 - 在应用初始化时自动启动工具状态监听器 - 支持"Adjust Brightness and Contrast"和"Magnifier"按钮的状态自动同步 **核心功能实现:** - 工具状态监听:监听`TOOL_MODE_CHANGED`事件,自动更新Redux状态 - 按钮状态同步:有状态按钮的激活状态自动反映cornerstone工具的实际状态 - 单例模式:确保只有一个工具状态监听器实例,避免重复监听 - 错误处理:完善的异常处理和日志记录,确保系统稳定性 **技术实现:** - 创建`src/utils/toolStateListener.ts`工具状态监听器 - 扩展`functionAreaSlice.ts`添加工具激活状态管理 - 修改`FunctionArea.tsx`按钮状态基于工具激活状态判断 - 在`app.tsx`应用初始化时启动监听器 **改动文件:** - src/utils/toolStateListener.ts (新增) - src/states/view/functionAreaSlice.ts - src/pages/view/components/FunctionArea.tsx - src/app.tsx - CHANGELOG.md - package.json (版本更新: 1.16.0 -> 1.17.0) --- ## [1.16.0] - 2025-12-20 14:06 ### 新增 (Added) - **添加掩码功能** - 实现完整的医学图像多边形遮罩系统 - 新增 MaskTool 核心工具类,支持多边形绘制和遮罩效果应用 - 集成测量工具管理系统,支持多视口遮罩独立管理 - 实现 Redux 状态管理,统一 Add Mask 和 Delete Mask 操作 - 支持工具注册和全局激活,确保跨环境兼容性 **核心功能实现:** - 多边形绘制:用户可以在图像上绘制多边形区域作为遮罩 - 遮罩效果:多边形内部区域保持可见,外部区域变黑 - 工具管理:支持激活、停用和清除遮罩工具 - 交互优化:在 FunctionArea 和 RectCropPanel 中提供遮罩按钮 **技术实现:** - 新增 MaskTool.ts 工具类,继承 AnnotationTool - 扩展 MeasurementToolManager,支持遮罩工具生命周期管理 - 更新 ViewerContainer,添加 Add Mask 和 Delete Mask 动作处理 - 集成 stack.image.viewer.tsx,注册并导出遮罩相关函数 - 更新 cornerstoneToolsSetup.ts,全局注册 MaskTool **改动文件:** - docs/实现/添加掩码功能实现方案.md - src/components/tools/MaskTool.ts - src/pages/view/components/FunctionArea.tsx - src/pages/view/components/ViewerContainer.tsx - src/pages/view/components/viewers/stack.image.viewer.tsx - src/utils/cornerstoneToolsSetup.ts - src/utils/measurementToolManager.ts - CHANGELOG.md - package.json (版本更新: 1.15.1 -> 1.16.0) --- ## [1.15.1] - 2025-12-20 11:22 ### 修复 (Fixed) - **标记功能未选中viewport时无法添加问题** ([src/pages/view/components/ViewerContainer.tsx](src/pages/view/components/ViewerContainer.tsx)) - 修复预定义标记、自定义标记和时间戳在未选中viewport时无法添加到图像的问题 - 实现智能viewport选择:有选中时仅添加到选中的viewport,无选中时自动添加到所有可见viewport - 确保标记功能与测量工具保持一致的交互逻辑 - 提升用户体验,无需手动选中图像即可添加标记 **核心改进:** - 预定义标记处理优化:支持未选中viewport时自动添加到所有可见图像 - 自定义标记处理优化:从下拉列表选择的标记现在能正确添加到图像 - 时间戳处理优化:时间戳标记支持自动添加到所有可见图像 - 交互一致性:与其他功能(如测量工具)保持相同的交互模式 **技术实现:** - 添加 selectedViewportIds.length 检查条件 - 未选中时使用 getVisibleViewportCount() 获取可见viewport数量 - 遍历所有可见viewport并调用 addCustomMark() 函数 - 使用 getViewportIdByUrl() 正确转换imageUrl到viewportId **改动文件:** - src/pages/view/components/ViewerContainer.tsx - CHANGELOG.md - package.json (版本更新: 1.15.0 -> 1.15.1) --- ## [1.15.0] - 2025-12-19 18:50 ### 新增 (Added) - **二维码扫码录入病人信息功能** - 实现完整的跨平台二维码扫描录入系统 - 支持浏览器、Electron、Cordova Android三平台二维码扫描 - 浏览器/Electron平台使用html5-qrcode库实时扫描 - Cordova平台使用拍照+jsQR识别方案 - 支持解析制表符分隔的文本格式(姓名、年龄、身份证号) - 自动填充注册表单并支持体位自动注册 - 完善的数据验证、错误处理和跨平台兼容性 - 集成完整的Redux状态管理和用户交互流程 **核心功能实现:** - 跨平台兼容:智能检测运行平台,自动选择最佳扫描方案 - 文本格式解析:支持"贾桂霞 32 岁 122410551217111712"格式的病人信息 - 自动表单填充:扫描成功后自动填充姓名、年龄、身份证等字段 - 体位自动注册:如果二维码包含体位信息,自动创建检查并进入检查页面 - 用户体验优化:扫描结果确认、错误处理、状态反馈 **技术实现:** - 新增 `src/components/QRCodeScanner/` 组件模块 - 新增 `src/domain/qrcode/` 业务逻辑层 - 新增 `src/states/patient/register/qrCodeScanSlice.ts` 状态管理 - 新增 `src/types/qrcode.ts` 类型定义 - 新增 `docs/实现/二维码扫码录入功能.md` 详细设计文档 - 集成 `html5-qrcode` 和 `jsqr` 库支持 - 更新 Cordova 配置支持摄像头插件 **改动文件:** - 新增文件: - `src/components/QRCodeScanner/QRCodeScanButton.tsx` - `src/components/QRCodeScanner/QRCodeScanModal.tsx` - `src/components/QRCodeScanner/index.ts` - `src/domain/qrcode/qrCodeDataProcessor.ts` - `src/domain/qrcode/qrCodeValidator.ts` - `src/domain/qrcode/autoRegisterHandler.ts` - `src/states/patient/register/qrCodeScanSlice.ts` - `src/types/qrcode.ts` - `docs/实现/二维码扫码录入功能.md` - 修改文件: - `src/pages/patient/register.tsx` - 添加扫码按钮 - `src/states/store.ts` - 注册 qrCodeScanSlice - `package.json` - 添加 html5-qrcode 和 jsqr 依赖 - `.build/config.xml` - 移除有问题的二维码插件 - `CHANGELOG.md` - 新增变更记录 --- ## [1.14.3] - 2025-12-19 18:17 ### 修复 (Fixed) - **Cordova插件异步初始化和准备检查功能** ([src/features/serverConfig/storage/CordovaStorageAdapter.ts](src/features/serverConfig/storage/CordovaStorageAdapter.ts)) - 在CordovaStorageAdapter中添加异步插件初始化逻辑 - 实现initializePlugin方法处理deviceready事件 - 添加ensureReady方法确保插件准备好后再执行操作 - 在所有存储操作前调用await this.ensureReady() **核心改进:** - 异步初始化:确保Cordova插件在deviceready后初始化 - 错误处理:添加超时机制和错误日志 - 性能优化:避免插件未准备好时的操作失败 **改动文件:** - src/features/serverConfig/storage/CordovaStorageAdapter.ts - CHANGELOG.md - package.json (版本更新: 1.14.2 -> 1.14.3) --- ## [1.14.2] - 2025-12-19 18:05 ### 新增 (Added) - **功能按钮悬停状态和视觉反馈功能** ([src/pages/view/components/FunctionArea.tsx](src/pages/view/components/FunctionArea.tsx)) - 实现功能按钮的悬停状态管理,添加 isHovered 状态变量 - 添加鼠标进入和离开事件处理函数,实现动态悬停检测 - 实现图标样式根据状态变化:禁用时灰度显示,激活时蓝色高亮,悬停时浅蓝色显示 - 添加按钮悬停时的边框和背景色视觉反馈,提升交互体验 - 优化按钮样式结构,确保悬停时显示浅蓝色边框和背景 **核心改进:** - 用户体验增强:按钮现在提供清晰的视觉反馈,悬停时显示边框和背景变化 - 状态管理优化:集成 Redux 状态管理,支持按钮激活状态检测 - 样式系统完善:根据按钮状态动态调整图标和按钮样式 - 交互友好性:悬停状态提供即时反馈,提升操作流畅度 **改动文件:** - src/pages/view/components/FunctionArea.tsx - CHANGELOG.md - package.json (版本更新: 1.14.1 -> 1.14.2) --- ## [1.14.1] - 2025-12-18 17:30 ### 修复 (Fixed) - **HumanBody组件调试边框移除** ([src/components/HumanBody.tsx](src/components/HumanBody.tsx)) - 移除了调试用的红色边框样式,提升界面美观性 **核心改进:** - 界面优化:移除调试边框,提升组件的视觉呈现效果 - 代码清理:删除不必要的调试样式,保持代码整洁 **改动文件:** - src/components/HumanBody.tsx - CHANGELOG.md - package.json (版本更新: 1.14.0 -> 1.14.1) --- ## [1.14.0] - 2025-12-18 15:00 ### 新增 (Added) - **体位列表追加弹框成功回调功能** ([src/pages/exam/components/BodyPositionList.tsx](src/pages/exam/components/BodyPositionList.tsx)) - 为 AppendViewModal 组件添加 onSuccess 回调属性 - 实现追加体位成功后自动关闭弹框的功能 - 提升用户交互体验,减少手动关闭弹框的步骤 **核心改进:** - 用户体验优化:追加成功后自动关闭弹框,操作流程更流畅 - 组件交互增强:支持成功回调处理,提升组件复用性 **改动文件:** - src/pages/exam/components/BodyPositionList.tsx - CHANGELOG.md - package.json (版本更新: 1.13.1 -> 1.14.0) --- ## [1.13.1] - 2025-12-18 14:35 ### 修复 (Fixed) - **操作者ID必填问题修复** ([src/validation/patient/registerSchema.ts](src/validation/patient/registerSchema.ts)) - 移除 operator_id 字段的 .optional() 调用,使其成为必填字段 - 修复患者注册表单中操作者ID字段的验证逻辑 - 确保操作者ID在表单提交时必须填写 **核心改进:** - 数据验证增强:确保操作者ID字段必填,提升数据完整性 - 用户体验优化:明确必填字段要求,减少表单提交错误 **改动文件:** - src/validation/patient/registerSchema.ts - CHANGELOG.md - package.json (版本更新: 1.13.0 -> 1.13.1) --- ## [1.13.0] - 2025-12-18 14:18 ### 新增 (Added) - **体位列表追加按钮多语言提示功能** ([src/pages/exam/components/BodyPositionList.tsx](src/pages/exam/components/BodyPositionList.tsx)) - 为体位列表底部的追加按钮添加多语言 Tooltip 提示 - 新增中文和英文的多语言键值对:"exam.action.addMorePositions" - 集成 React Intl 的 useIntl hook 和 Tooltip 组件 - 支持鼠标悬停时显示对应语言的提示文本 **核心改进:** - 用户体验提升:追加按钮现在有清晰的提示信息 - 国际化支持:支持中文"添加更多体位"和英文"Add More Positions" - 代码架构优化:使用标准的 React Intl 多语言方案 - 视觉反馈增强:悬停时显示提示,提升交互友好性 **技术实现:** - 新增多语言键值对到 zh.js 和 en.js - 在 BodyPositionList 组件中导入 Tooltip 和 useIntl - 使用 Tooltip 包裹追加按钮区域 - 动态获取当前语言对应的提示文本 **改动文件:** - src/assets/i18n/messages/zh.js - 添加中文翻译 - src/assets/i18n/messages/en.js - 添加英文翻译 - src/pages/exam/components/BodyPositionList.tsx - 实施 Tooltip 功能 - CHANGELOG.md - package.json (版本更新: 1.12.5 -> 1.13.0) --- ## [1.12.5] - 2025-12-18 13:47 ### 修复 (Fixed) - **人体部位服务端名称格式修复** ([src/components/HumanBody.tsx](src/components/HumanBody.tsx)) - 修复人体部位服务端名称格式,将下划线分隔改为空格分隔 - 上肢(左/右):`Human_UPPER_LIMB` → `Human_UPPER LIMB` - 下肢(左/右):`Human_LOWER_LIMB` → `Human_LOWER LIMB` - 确保前后端数据交互时名称格式一致性 - 提升代码可读性和系统兼容性 **核心改进:** - 数据规范化:统一服务端名称格式,使用空格而非下划线分隔 - 系统兼容性:确保前后端通信时名称格式正确匹配 - 可读性提升:空格分隔更符合自然语言习惯 **技术实现:** - 修改 bodyParts 配置对象中的 serverName 属性 - 影响左右上肢和左右下肢共3处修改 - 保持其他部位名称格式不变 **改动文件:** - src/components/HumanBody.tsx - CHANGELOG.md - package.json (版本更新: 1.12.4 -> 1.12.5) - package-lock.json --- ## [1.12.4] - 2025-12-18 13:06 ### 修复 (Fixed) - **体型选择器崩溃问题** ([src/pages/exam/ContentAreaLarge.tsx](src/pages/exam/ContentAreaLarge.tsx)) - 修复进入检查页面时,bodysize 为空导致的崩溃问题 - 在 Select 组件的 value 属性上添加条件检查:`!!bodysize ? intl.formatMessage({ id: bodysize }) : undefined` - 避免在 bodysize 为 null/undefined 时调用 formatMessage 导致错误 - 确保体型选择器在初始状态下正确显示占位符 **核心改进:** - 防御性编程:添加空值检查,提升代码健壮性 - 用户体验:进入检查页面不再崩溃,正常显示体型选择器 - 错误处理:优雅处理 bodysize 未初始化的场景 **技术实现:** - 使用 `!!bodysize` 进行真值检查 - 空值时返回 undefined,让 Select 组件显示 placeholder - 保持与 Ant Design Select 组件的正确交互 **改动文件:** - src/pages/exam/ContentAreaLarge.tsx - CHANGELOG.md - package.json (版本更新: 1.12.3 -> 1.12.4) --- ## [1.12.3] - 2025-12-18 10:07 ### 修复 (Fixed) - **反色对比功能多选问题** ([src/pages/view/components/InvertContrastThumbnailList.tsx](src/pages/view/components/InvertContrastThumbnailList.tsx)) - 修复反色对比Modal打开后左侧列表可以多选的问题 - 将 Checkbox(复选框)改为 Radio(单选按钮) - 修改选择逻辑:从"最多选择2个体位"改为"单选一个体位" - 移除 isDisabled 禁用逻辑和超过2个时的限制判断 - 更新组件注释:从"支持多选用于对比"改为"支持单选用于反色对比" - 更新 UI 文案:去掉"(最多2个)"提示 - 简化选择逻辑:handlePositionToggle 改为 handlePositionSelect,每次选择直接替换 - 优化交互体验:整个卡片区域可点击,移除按钮嵌套 **核心改进:** - 交互更清晰:用户明确知道只能选择一个体位进行反色对比 - 符合业务语义:反色对比的重点是反色效果,而不是两张不同图像的对比 - 简化逻辑:去除多选相关的复杂判断和禁用逻辑 - 提升体验:整个卡片可点击,交互更自然 **技术实现:** - 导入组件变更:Checkbox → Radio - 函数重构:handlePositionToggle(bodyPosition, checked) → handlePositionSelect(bodyPosition) - 逻辑简化:直接使用 dispatch(updateSelectedPositions({ positions: [dcmUrl] })) - UI 优化:移除 disabled 判断,简化点击事件处理 **改动文件:** - src/pages/view/components/InvertContrastThumbnailList.tsx - CHANGELOG.md - package.json (版本更新: 1.12.2 -> 1.12.3) --- ## [1.12.2] - 2025-12-18 09:54 ### 修复 (Fixed) - **体位卡片高度不一致和文本显示问题** ([src/pages/patient/components/register.available.view.list.tsx](src/pages/patient/components/register.available.view.list.tsx)) - 修复图片大小不同导致卡片高度不一致的问题 - 将图片尺寸从响应式(100% / auto)改为固定尺寸(100px / 100px) - 添加文本省略样式(overflow: hidden, textOverflow: ellipsis, whiteSpace: nowrap) - 引入 Ant Design Tooltip 组件,鼠标悬停时显示完整的体位名称 - 确保所有体位卡片保持统一高度,提升界面整齐度 **核心改进:** - 布局优化:固定图片高度确保所有卡片高度一致 - 文本处理:过长文本显示省略号,不换行撑开卡片 - 用户体验:Tooltip 悬停提示显示完整文本内容 - 视觉统一:所有体位卡片整齐排列,界面更加美观 **技术实现:** - 添加 Tooltip 组件到 antd 导入列表 - 修改 Image 组件样式:width: '100px', height: '100px' - 为文本 div 添加省略号样式 - 使用 Tooltip 包裹文本 div,title 属性设为完整文本 **改动文件:** - src/pages/patient/components/register.available.view.list.tsx - package.json (版本更新: 1.12.1 -> 1.12.2) --- ## [1.12.1] - 2025-12-18 09:48 ### 修复 (Fixed) - **患者类型默认值问题** ([src/states/patientTypeSlice.ts](src/states/patientTypeSlice.ts)) - 修复登录后进入注册页面时患者类型默认为 DOG 的问题 - 将 initialState.current 从硬编码的 DOG 对象改为 null - 确保患者类型选择框初始为空,需要用户手动选择 - 避免因默认值导致的误操作 **核心改进:** - 数据规范化:移除硬编码的默认患者类型 - 用户体验:强制用户手动选择患者类型,避免误操作 - 代码简化:简化初始状态配置 **改动文件:** - src/states/patientTypeSlice.ts - package.json (版本更新: 1.12.0 -> 1.12.1) --- ## [1.12.0] - 2025-12-18 09:25 ### 新增 (Added) - **SVG图标组件化并支持主题颜色** ([#svg-icon-componentization](config/index.ts)) - 在 config/index.ts 中配置 @svgr/webpack 支持 SVG 转 React 组件 - 在 package.json 中添加 @svgr/webpack 依赖 - 在 ActionPanel.tsx 中更新图标使用方式,支持主题颜色 - 修改 report.svg 使用 currentColor 以支持动态主题 - 清理未使用的图标文件,优化项目结构 **核心改进:** - Webpack 配置增强:添加 @svgr/webpack loader,将 SVG 转换为 React 组件 - 图标主题支持:使用 currentColor 实现动态主题颜色适配 - 项目结构优化:删除 120+ 个未使用图标文件,减少项目体积 - 组件化升级:图标使用 fontSize 和 Tailwind CSS 实现灵活样式控制 **技术实现:** - 配置 webpack chain API 排除 SVG 被当作普通图片处理 - 使用 @svgr/webpack 将 Icons 目录下的 SVG 转换为 React 组件 - 在 ActionPanel 中引入 antd theme,使用 useToken 获取主题颜色 - SVG 文件使用 fill="currentColor" 支持动态颜色 - 删除多个模块的未使用图标:common、configuration、device、exam、output、patient、process、security **改动文件:** - config/index.ts - package.json (版本更新: 1.11.6 -> 1.12.0) - package-lock.json - src/pages/patient/components/ActionPanel.tsx - src/assets/Icons/base/module-patient/theme-dark/1x/report.svg - 删除 120+ 个未使用图标文件 --- 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 ## 版本号说明 本项目遵循[语义化版本 2.0.0](https://semver.org/lang/zh-CN/)规范: - **主版本号 (Major)**:当你做了不兼容的 API 修改 - **次版本号 (Minor)**:当你做了向下兼容的功能性新增 - **修订号 (Patch)**:当你做了向下兼容的问题修正 ### 变更类型说明 - **新增 (Added)**: 添加的新功能 - **变更 (Changed)**: 对现有功能的变更 - **弃用 (Deprecated)**: 即将移除的功能 - **移除 (Removed)**: 已移除的功能 - **修复 (Fixed)**: 任何 bug 修复 - **安全 (Security)**: 针对安全漏洞的修复 --- ## 链接说明 - [未发布]: 当前开发中的版本 - [1.2.7]: https://github.com/usernamedd/zsis/compare/v1.2.6...v1.2.7 - [1.2.6]: https://github.com/usernamedd/zsis/releases/tag/v1.2.6