在高级处理(SliderAdjustmentPanel)中实现双端保存机制:
在保存参数时调用后端API保存参数并重建DCM
rebuildDcm API 进行异步保存和重建DCM文件位置: src/pages/view/components/SliderAdjustmentPanel.tsx
用户滑动参数
↓
handleParameterChange (更新Redux状态)
↓
debouncedPreview / debouncedWASMPreview (防抖500ms/300ms)
↓
更新 viewer URL (触发图像重新渲染)
↓
✅ 预览更新完成
❌ 没有调用后端保存 API,也不需要
目前只有以下1种情况会调用 rebuildDcm:
handleSave) - 用户点击"保存参数"按钮文件位置: src/API/imageActions.ts
/**
* 重建dcm(保存应用增强参数后的dcm)
*/
export const rebuildDcm = async (
sopInstanceUid: string,
params: RebuildDcmRequest
): Promise<RebuildDcmResponse>
interface RebuildDcmRequest {
contrast: number; // 增益
detail: number; // 细节
latitude: number; // 动态范围
noise: number; // 噪声模式
ww_coef: number; // 对比度
wl_coef: number; // 亮度
}
参数变化可由多种用户操作和系统行为触发,需要区分哪些场景需要保存到后端:
触发时机: 组件挂载时自动执行
useEffect(() => {
// 从后端加载当前图像的参数
dispatch(loadImageProcessingParams(sopInstanceUid));
}, [dispatch]);
行为:
isInitialLoad = true 标志触发时机: 用户拖动任一参数滑块
handleParameterChange('contrast', 5.0) // 增益
handleParameterChange('detail', 8.0) // 细节
handleParameterChange('latitude', 6.0) // 动态范围
handleParameterChange('noise', 4.0) // 噪声模式
handleParameterChange('brightness', 1.2) // 对比度
handleParameterChange('sharpness', -0.5) // 亮度
行为:
isInitialLoad = false触发时机: 用户在下拉框中选择风格
handleStyleChange('高对比') // 均衡 | 高对比 | 锐组织 | 骨骼
行为:
isInitialLoad = false触发时机: 用户点击"重置参数"按钮
handleReset()
行为:
isInitialLoad = false触发时机: 用户点击"保存参数"按钮
handleSave()
行为:
触发时机: 用户切换算法或LUT
handleAlgorithmChange('算法A')
handleLUTChange('LUT1')
行为:
用户滑动参数
↓
handleParameterChange (更新Redux状态)
↓
debouncedPreview / debouncedWASMPreview (防抖)
↓
更新 viewer URL (触发图像重新渲染)
↓
✅ 预览更新完成(仅前端状态)
重建DCM仅在以下情况调用:
无需修改 debouncedPreview 和 debouncedWASMPreview 函数
Redux State → API Request
------------------------------
contrast → contrast
detail → detail
latitude → latitude
noise → noise
brightness → ww_coef
sharpness → wl_coef
try {
await rebuildDcm(...); // 保存到后端
console.log('✅ 参数已保存到后端');
} catch (saveError) {
console.error('⚠️ 保存参数失败:', saveError);
// 显示错误提示,但不影响其他操作
}
src/pages/view/components/SliderAdjustmentPanel.tsxsrc/API/imageActions.tssrc/states/view/sliderAdjustmentPanelSlice.tssrc/types/imageProcessing.ts