在worklist页面中,实现通过双击列表中的数据行来触发"RIS数据保存到本地"功能的需求。具体要求:
src/pages/patient/worklist.tsx 中的 handleRowDoubleClick 函数目前对所有数据行都调用 worklistToExam(record) 进入检查src/pages/patient/components/ActionPanel.tsx 中的 handleRisSave 函数实现了"RIS数据保存到本地"的完整功能entry_id 字段,本地study数据没有此字段采用分层架构,将业务逻辑从UI层分离:
Domain层:src/domain/patient/risSaveLogic.ts
worklistToExam.ts 保持一致的架构风格UI层:src/pages/patient/worklist.tsx
record.entry_id 字段判断数据类型worklistToExam 函数创建 src/domain/patient/risSaveLogic.ts 文件:
import { saveRisBatch } from '@/API/patient/risActions';
import { Modal, message } from 'antd';
import store from '@/states/store';
import { setPage, setPageSize } from '@/states/patient/worklist/slices/searchSlice';
import { fetchWorkThunk } from '@/states/patient/worklist/slices/workSlice';
import { WorkFilter } from '@/states/patient/worklist/types/workfilter';
/**
* RIS数据保存成功弹框
*/
const showSaveSuccessModal = (count: number) => {
Modal.success({
title: '🎉 保存成功',
content: (
<div style={{ padding: '16px 0' }}>
<p style={{ fontSize: '16px', margin: '8px 0' }}>
成功保存 <strong style={{ color: '#52c41a' }}>{count}</strong> 条RIS数据到本地
</p>
<p style={{ color: '#666', margin: '8px 0' }}>
系统将自动刷新列表显示最新数据
</p>
</div>
),
okText: '确定',
centered: true,
afterClose: () => {
// 弹框自动消失后执行列表刷新
triggerSearch();
}
});
};
/**
* 触发搜索刷新列表(复用SearchPanel的逻辑)
*/
const triggerSearch = () => {
const dispatch = store.dispatch;
const searchState = store.getState().search;
// 重置分页
dispatch(setPage(1));
dispatch(setPageSize(10));
// 构建过滤条件
const filters: WorkFilter = {
patient_id: searchState.id,
patient_name: searchState.name,
access_number: searchState.acc_no,
start_time: searchState.start_time,
end_time: searchState.end_time,
status: 'Arrived,InProgress',
};
// 调用搜索
dispatch(fetchWorkThunk({ page: 1, pageSize: 10, filters }));
};
/**
* 保存单个RIS数据到本地
* @param entryId RIS条目ID
*/
export const saveRisData = async (entryId: string) => {
try {
console.log('RIS双击保存本地参数:', entryId);
// 调用RIS批量保存API(传递单个entryId的数组)
await saveRisBatch([entryId]);
console.log('RIS双击保存本地成功');
// 显示成功弹框(暂逝后自动刷新)
showSaveSuccessModal(1);
} catch (error) {
console.error('RIS双击保存本地失败:', error);
const errorMessage = error instanceof Error ? error.message : '保存过程中发生未知错误';
Modal.error({
title: '❌ 保存失败',
content: (
<div style={{ padding: '16px 0' }}>
<p style={{ margin: '8px 0' }}>{errorMessage}</p>
<p style={{ color: '#666', fontSize: '14px' }}>
请检查网络连接或联系技术支持
</p>
</div>
),
okText: '确定',
centered: true
});
}
};
修改 src/pages/patient/worklist.tsx 文件:
// 添加导入
import { saveRisData } from '@/domain/patient/risSaveLogic';
// 修改handleRowDoubleClick函数
const handleRowDoubleClick = (record: Task) => {
console.log(
'[WorklistTable] Row double-clicked:',
JSON.stringify(record, null, 2)
);
// 判断是否为RIS数据
if (record.entry_id) {
// RIS数据:触发保存到本地
saveRisData(record.entry_id);
} else {
// 本地study数据:进入检查
worklistToExam(record);
}
};
RIS数据双击保存测试:
本地数据双击进入检查测试:
保存失败测试:
边界情况测试:
原有功能验证:
性能测试:
saveRisBatch API能正确处理单个entryId的数组开发阶段:
risSaveLogic.ts 文件worklist.tsx 文件测试阶段:
部署阶段: