|
|
@@ -0,0 +1,411 @@
|
|
|
+/**
|
|
|
+ * 工作流 - 工作流设置组件
|
|
|
+ */
|
|
|
+import React, { useState } from 'react';
|
|
|
+import { Form, Card, Switch, Input, InputNumber, Radio, Checkbox, Table, Button, Space, Divider } from 'antd';
|
|
|
+import { SPACING } from '../../constants';
|
|
|
+
|
|
|
+const { Group: RadioGroup } = Radio;
|
|
|
+
|
|
|
+// 字段配置数据类型
|
|
|
+interface FieldConfig {
|
|
|
+ key: string;
|
|
|
+ field: string;
|
|
|
+ visible: boolean;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 工作流组件
|
|
|
+ * 实现图像采集、多任务管理、APR编辑等设置功能
|
|
|
+ */
|
|
|
+const Workflow: React.FC = () => {
|
|
|
+ const [form] = Form.useForm();
|
|
|
+
|
|
|
+ // 任务清单显示配置数据
|
|
|
+ const [taskListConfig, setTaskListConfig] = useState<FieldConfig[]>([
|
|
|
+ { key: '1', field: '动物ID', visible: true },
|
|
|
+ { key: '2', field: '动物名称', visible: true },
|
|
|
+ { key: '3', field: '动物类型', visible: true },
|
|
|
+ { key: '4', field: '性别', visible: true },
|
|
|
+ { key: '5', field: '年龄', visible: true },
|
|
|
+ { key: '6', field: '检查描述', visible: true },
|
|
|
+ { key: '7', field: '检查时间', visible: true },
|
|
|
+ { key: '8', field: '主人', visible: true },
|
|
|
+ { key: '9', field: '登记号', visible: true },
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 历史清单显示配置数据
|
|
|
+ const [historyListConfig, setHistoryListConfig] = useState<FieldConfig[]>([
|
|
|
+ { key: '1', field: '动物ID', visible: true },
|
|
|
+ { key: '2', field: '动物名称', visible: true },
|
|
|
+ { key: '3', field: '动物类型', visible: true },
|
|
|
+ { key: '4', field: '性别', visible: true },
|
|
|
+ { key: '5', field: '年龄', visible: true },
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 表格列配置
|
|
|
+ const getTableColumns = (onChange: (key: string, visible: boolean) => void) => [
|
|
|
+ {
|
|
|
+ title: '可见',
|
|
|
+ dataIndex: 'visible',
|
|
|
+ key: 'visible',
|
|
|
+ width: 80,
|
|
|
+ render: (visible: boolean, record: FieldConfig) => (
|
|
|
+ <Checkbox
|
|
|
+ checked={visible}
|
|
|
+ onChange={(e) => onChange(record.key, e.target.checked)}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '列',
|
|
|
+ dataIndex: 'field',
|
|
|
+ key: 'field',
|
|
|
+ },
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 处理任务清单配置变更
|
|
|
+ const handleTaskListConfigChange = (key: string, visible: boolean) => {
|
|
|
+ setTaskListConfig(prev =>
|
|
|
+ prev.map(config =>
|
|
|
+ config.key === key ? { ...config, visible } : config
|
|
|
+ )
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
+ // 处理历史清单配置变更
|
|
|
+ const handleHistoryListConfigChange = (key: string, visible: boolean) => {
|
|
|
+ setHistoryListConfig(prev =>
|
|
|
+ prev.map(config =>
|
|
|
+ config.key === key ? { ...config, visible } : config
|
|
|
+ )
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
+ // 处理保存
|
|
|
+ const handleSave = () => {
|
|
|
+ form.validateFields().then(values => {
|
|
|
+ console.log('保存设置:', {
|
|
|
+ ...values,
|
|
|
+ taskListConfig,
|
|
|
+ historyListConfig
|
|
|
+ });
|
|
|
+ // TODO: 调用API保存设置
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // 处理取消
|
|
|
+ const handleCancel = () => {
|
|
|
+ form.resetFields();
|
|
|
+ // 重置任务清单配置到初始状态
|
|
|
+ setTaskListConfig([
|
|
|
+ { key: '1', field: '动物ID', visible: true },
|
|
|
+ { key: '2', field: '动物名称', visible: true },
|
|
|
+ { key: '3', field: '动物类型', visible: true },
|
|
|
+ { key: '4', field: '性别', visible: true },
|
|
|
+ { key: '5', field: '年龄', visible: true },
|
|
|
+ { key: '6', field: '检查描述', visible: true },
|
|
|
+ { key: '7', field: '检查时间', visible: true },
|
|
|
+ { key: '8', field: '主人', visible: true },
|
|
|
+ { key: '9', field: '登记号', visible: true },
|
|
|
+ ]);
|
|
|
+ // 重置历史清单配置到初始状态
|
|
|
+ setHistoryListConfig([
|
|
|
+ { key: '1', field: '动物ID', visible: true },
|
|
|
+ { key: '2', field: '动物名称', visible: true },
|
|
|
+ { key: '3', field: '动物类型', visible: true },
|
|
|
+ { key: '4', field: '性别', visible: true },
|
|
|
+ { key: '5', field: '年龄', visible: true },
|
|
|
+ ]);
|
|
|
+ };
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
|
|
|
+ {/* 主内容区 - 分割视图 */}
|
|
|
+ <div style={{ flex: 1, display: 'flex', gap: SPACING.LG, padding: SPACING.LG }}>
|
|
|
+ {/* 左侧面板 - 表单设置 */}
|
|
|
+ <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: SPACING.MD, overflowY: 'auto' }}>
|
|
|
+ <Form
|
|
|
+ form={form}
|
|
|
+ layout="vertical"
|
|
|
+ initialValues={{
|
|
|
+ autoJumpToNextView: false,
|
|
|
+ autoExposureCountdown: false,
|
|
|
+ jumpDelaySeconds: 0,
|
|
|
+ suggestAPRTable: false,
|
|
|
+ allowMergeTasks: false,
|
|
|
+ allowEditAfterAcquisition: false,
|
|
|
+ requireRejectionReason: false,
|
|
|
+ showRejectedImages: false,
|
|
|
+ smallAnimalExposureMode: 'bodyThickness',
|
|
|
+ generatorPower: false,
|
|
|
+ tubePower: false,
|
|
|
+ generatorTemp: false,
|
|
|
+ detectorPower: false,
|
|
|
+ detectorWifi: false,
|
|
|
+ detectorTemp: false,
|
|
|
+ showRealImage: false,
|
|
|
+ showAnatomyImage: false,
|
|
|
+ exposureStatusEnabled: false,
|
|
|
+ exportPathMode: 'default',
|
|
|
+ exportCustomPath: '',
|
|
|
+ doseAdjustmentEnabled: false,
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {/* 图像采集设置 */}
|
|
|
+ <Card title="图像采集设置" size="small">
|
|
|
+ <Space direction="vertical" style={{ width: '100%' }}>
|
|
|
+ <Form.Item
|
|
|
+ label="是否自动跳转到下个视图"
|
|
|
+ name="autoJumpToNextView"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="是否开启倒计时自动曝光"
|
|
|
+ name="autoExposureCountdown"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="自动跳转到下个视图延迟时间(秒)"
|
|
|
+ name="jumpDelaySeconds"
|
|
|
+ rules={[
|
|
|
+ { type: 'number', min: 0, max: 60, message: '延迟时间必须在0-60秒之间' }
|
|
|
+ ]}
|
|
|
+ >
|
|
|
+ <InputNumber min={0} max={60} style={{ width: '100%' }} />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="提供建议的曝光APR表"
|
|
|
+ name="suggestAPRTable"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Checkbox />
|
|
|
+ </Form.Item>
|
|
|
+ </Space>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 多个任务设置 */}
|
|
|
+ <Card title="多个任务设置" size="small">
|
|
|
+ <Form.Item
|
|
|
+ label="允许同一患者的多个任务合并开始检查"
|
|
|
+ name="allowMergeTasks"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Checkbox />
|
|
|
+ </Form.Item>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 编辑APR设置 */}
|
|
|
+ <Card title="编辑APR设置" size="small">
|
|
|
+ <Form.Item
|
|
|
+ label="图像采集后在检查中允许编辑曝光信息如APR、DAP"
|
|
|
+ name="allowEditAfterAcquisition"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Checkbox />
|
|
|
+ </Form.Item>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 拒绝图像设置 */}
|
|
|
+ <Card title="拒绝图像设置" size="small">
|
|
|
+ <Space direction="vertical" style={{ width: '100%' }}>
|
|
|
+ <Form.Item
|
|
|
+ label="当拒绝图片时需输入拒绝原因"
|
|
|
+ name="requireRejectionReason"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="是否显示拒绝图像"
|
|
|
+ name="showRejectedImages"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+ </Space>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 小动物默认曝光参数 */}
|
|
|
+ <Card title="小动物默认曝光参数" size="small">
|
|
|
+ <Form.Item
|
|
|
+ label="曝光参数计算方式"
|
|
|
+ name="smallAnimalExposureMode"
|
|
|
+ >
|
|
|
+ <RadioGroup>
|
|
|
+ <Radio value="bodyThickness">根据体厚计算</Radio>
|
|
|
+ <Radio value="bodyType">根据体型获取</Radio>
|
|
|
+ </RadioGroup>
|
|
|
+ </Form.Item>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 状态栏图标 */}
|
|
|
+ <Card title="状态栏图标" size="small">
|
|
|
+ <Space direction="vertical" style={{ width: '100%' }}>
|
|
|
+ <Form.Item
|
|
|
+ label="发生器电量"
|
|
|
+ name="generatorPower"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="球管管电量"
|
|
|
+ name="tubePower"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="发生器温度"
|
|
|
+ name="generatorTemp"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="探测器电量"
|
|
|
+ name="detectorPower"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="探测器Wi-Fi"
|
|
|
+ name="detectorWifi"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="探测器温度"
|
|
|
+ name="detectorTemp"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+ </Space>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 辅助定位 */}
|
|
|
+ <Card title="辅助定位" size="small">
|
|
|
+ <Space direction="vertical" style={{ width: '100%' }}>
|
|
|
+ <Form.Item
|
|
|
+ label="是否显示真实效果图"
|
|
|
+ name="showRealImage"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="是否显示解剖图"
|
|
|
+ name="showAnatomyImage"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+ </Space>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 曝光状态显示 */}
|
|
|
+ <Card title="曝光状态显示" size="small">
|
|
|
+ <Form.Item
|
|
|
+ label="是否开启曝光状态显示"
|
|
|
+ name="exposureStatusEnabled"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 导出图像路径 */}
|
|
|
+ <Card title="导出图像路径" size="small">
|
|
|
+ <Space direction="vertical" style={{ width: '100%' }}>
|
|
|
+ <Form.Item
|
|
|
+ label="路径选择"
|
|
|
+ name="exportPathMode"
|
|
|
+ >
|
|
|
+ <RadioGroup>
|
|
|
+ <Radio value="default">默认路径</Radio>
|
|
|
+ <Radio value="lastUsed">上一次导出路径</Radio>
|
|
|
+ </RadioGroup>
|
|
|
+ </Form.Item>
|
|
|
+
|
|
|
+ <Form.Item
|
|
|
+ label="上一次导出路径"
|
|
|
+ name="exportCustomPath"
|
|
|
+ >
|
|
|
+ <Input placeholder="请输入导出路径" />
|
|
|
+ </Form.Item>
|
|
|
+ </Space>
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 剂量调整设置 */}
|
|
|
+ <Card title="剂量调整设置" size="small">
|
|
|
+ <Form.Item
|
|
|
+ label="是否启用剂量调整功能"
|
|
|
+ name="doseAdjustmentEnabled"
|
|
|
+ valuePropName="checked"
|
|
|
+ >
|
|
|
+ <Switch />
|
|
|
+ </Form.Item>
|
|
|
+ </Card>
|
|
|
+ </Form>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 右侧面板 - 表格配置 */}
|
|
|
+ <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: SPACING.MD }}>
|
|
|
+ {/* 任务清单显示配置 */}
|
|
|
+ <Card title="任务清单显示配置" size="small" style={{ flex: 1 }}>
|
|
|
+ <Table
|
|
|
+ columns={getTableColumns(handleTaskListConfigChange)}
|
|
|
+ dataSource={taskListConfig}
|
|
|
+ pagination={false}
|
|
|
+ size="small"
|
|
|
+ scroll={{ y: 300 }}
|
|
|
+ />
|
|
|
+ </Card>
|
|
|
+
|
|
|
+ {/* 历史清单显示配置 */}
|
|
|
+ <Card title="历史清单显示配置" size="small" style={{ flex: 1 }}>
|
|
|
+ <Table
|
|
|
+ columns={getTableColumns(handleHistoryListConfigChange)}
|
|
|
+ dataSource={historyListConfig}
|
|
|
+ pagination={false}
|
|
|
+ size="small"
|
|
|
+ scroll={{ y: 200 }}
|
|
|
+ />
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 底部操作区 */}
|
|
|
+ <div style={{
|
|
|
+ padding: SPACING.LG,
|
|
|
+ borderTop: '1px solid #f0f0f0',
|
|
|
+ display: 'flex',
|
|
|
+ justifyContent: 'flex-end',
|
|
|
+ gap: SPACING.MD
|
|
|
+ }}>
|
|
|
+ <Button onClick={handleCancel}>取消</Button>
|
|
|
+ <Button type="primary" onClick={handleSave}>保存</Button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+export default Workflow;
|