Ver Fonte

fix (1.30.0 -> 1.30.1): 修复bug 166 - 任务清单/历史清单打印功能只在有已曝光图像时激活

- 在 DataState 接口中添加 hasImage 字段,用于标识是否有实际图像
- 修改 getBtnAvailability 函数,worklist/historylist 的打印按钮要求同时满足 hasSelection && hasImage
- 在 BusinessZone.tsx 中使用 thumbnailList 判断是否有已曝光的图像(expose_status === 'Exposed')
- 利用现有的 API 数据流,thumbnailList 已通过 API 获取完整的图像曝光状态信息

改动文件:
- src/domain/permissionMap.ts
- src/layouts/BusinessZone.tsx
- CHANGELOG.md
- package.json
dengdx há 2 semanas atrás
pai
commit
57081a0238
4 ficheiros alterados com 42 adições e 4 exclusões
  1. 30 0
      CHANGELOG.md
  2. 1 1
      package.json
  3. 5 3
      src/domain/permissionMap.ts
  4. 6 0
      src/layouts/BusinessZone.tsx

+ 30 - 0
CHANGELOG.md

@@ -2,6 +2,36 @@
 
 本项目的所有重要变更都将记录在此文件中。
 
+## [1.30.1] - 2025-12-26 12:53
+
+### 修复 (Fixed)
+- **修复bug 166 - 任务清单/历史清单打印功能只在有已曝光图像时激活** - 优化打印按钮激活条件,确保只有存在实际图像时才能打印
+  - 在 DataState 接口中添加 `hasImage` 字段,用于标识是否有实际图像
+  - 修改 getBtnAvailability 函数,worklist/historylist 的打印按钮要求同时满足 `hasSelection && hasImage`
+  - 在 BusinessZone.tsx 中使用 thumbnailList 判断是否有已曝光的图像(expose_status === 'Exposed')
+  - 利用现有的 API 数据流,thumbnailList 已通过 API 获取完整的图像曝光状态信息
+  - 确保打印功能只在有实际可打印内容时才被激活,提升用户体验
+
+**核心改进:**
+- 权限控制精确化:打印按钮现在基于实际图像存在性,而非仅检查选中状态
+- 数据验证增强:使用服务器返回的 expose_status 判断图像是否可打印
+- 用户体验优化:避免用户在没有图像时误点打印按钮
+- 架构合理性:复用现有 thumbnailList 数据流,无需额外 API 调用
+
+**技术实现:**
+- 扩展 DataState 接口:添加 `hasImage?: boolean` 字段
+- 优化权限判断:worklist/historylist 的 print 按钮改为 `hasSelection && hasImage`
+- 状态计算:使用 `state.thumbnailList.thumbnails.some(t => t.expose_status === 'Exposed')`
+- 数据来源:thumbnailList 通过 updateThumbnailsFromWorkSelection/updateThumbnailsFromHistorySelection 异步获取
+
+**改动文件:**
+- src/domain/permissionMap.ts
+- src/layouts/BusinessZone.tsx
+- CHANGELOG.md
+- package.json (版本更新: 1.30.0 -> 1.30.1)
+
+---
+
 ## [1.30.0] - 2025-12-25 21:05
 
 ### 新增 (Added)

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "zsis",
-  "version": "1.30.0",
+  "version": "1.30.1",
   "private": true,
   "description": "医学成像系统",
   "main": "main.js",

+ 5 - 3
src/domain/permissionMap.ts

@@ -30,6 +30,7 @@ export type LocationKey =
 export interface DataState {
   hasSelection?: boolean; // 任务清单/历史清单
   hasExposedImage?: boolean; // 检查/处理
+  hasImage?: boolean; // 是否有实际图像
 }
 
 // 权限表:Record<location, Record<button, boolean>>
@@ -168,15 +169,16 @@ export function getBtnAvailability(
 ): Record<BtnKey, boolean> {
   const row = { ...PERMISSION_MAP[location] }; // 先拷贝一份
 
-  // 1. worklist / historylist 根据 hasSelection 开关 exam/process/print
+  // 1. worklist / historylist 根据 hasSelection 开关 exam/process,根据 hasSelection && hasImage 开关 print
   if (location === 'worklist' || location === 'historylist') {
     const ok = Boolean(dataState.hasSelection);
+    const printOk = Boolean(dataState.hasSelection && dataState.hasImage);
     console.log(
-      `当前是 ${location} 页面,hasSelection=${dataState.hasSelection},exam/process/print 可用性=${ok}`
+      `当前是 ${location} 页面,hasSelection=${dataState.hasSelection},hasImage=${dataState.hasImage},exam/process 可用性=${ok},print 可用性=${printOk}`
     );
     row.exam = ok;
     row.process = ok;
-    row.print = ok;
+    row.print = printOk;
   }
 
   // 2. exam / process 根据 hasExposedImage 开关 process/print

+ 6 - 0
src/layouts/BusinessZone.tsx

@@ -157,6 +157,9 @@ const BusinessZone: React.FC<BusinessZoneProps> = ({ onMenuClick }) => {
     if (currentKey === 'worklist') {
       return {
         hasSelection: state.workSelection.selectedIds.length > 0,
+        hasImage: state.thumbnailList.thumbnails.some(
+          thumbnail => thumbnail.expose_status === 'Exposed'
+        ),
         hasExposedImage:
           state.bodyPositionList.exposureStatus === 'Half Exposed' ||
           state.bodyPositionList.exposureStatus === 'Fully Exposed',
@@ -164,6 +167,9 @@ const BusinessZone: React.FC<BusinessZoneProps> = ({ onMenuClick }) => {
     } else if (currentKey === 'historylist') {
       return {
         hasSelection: state.historySelection.selectedIds.length > 0,
+        hasImage: state.thumbnailList.thumbnails.some(
+          thumbnail => thumbnail.expose_status === 'Exposed'
+        ),
         hasExposedImage:
           state.bodyPositionList.exposureStatus === 'Half Exposed' ||
           state.bodyPositionList.exposureStatus === 'Fully Exposed',