# Pregnancy Status 类型设计文档 ## 概述 本文档定义了妊娠状态(pregnancy_status)的数据类型、验证规则和UI实现方案。 ## 类型定义 ### PregnancyStatus 枚举 ```typescript /** * 妊娠状态枚举 * 0001: not pregnant - 未怀孕 * 0002: possibly pregnant - 可能怀孕 * 0003: definitely pregnant - 确定怀孕 * 0004: unknown - 未知 */ export enum PregnancyStatus { NOT_PREGNANT = '0001', // 未怀孕 POSSIBLY_PREGNANT = '0002', // 可能怀孕 DEFINITELY_PREGNANT = '0003', // 确定怀孕 UNKNOWN = '0004', // 未知 } ``` ### PregnancyStatusOption 接口 ```typescript /** * 妊娠状态选项接口,用于UI下拉选择 */ export interface PregnancyStatusOption { value: PregnancyStatus; label: React.ReactNode; description?: string; } ``` ## 实现方案 ### 1. 类型定义文件 创建 `src/domain/patient/pregnancyStatus.ts` 文件: ```typescript /** * 妊娠状态类型定义 */ /** * 妊娠状态枚举 * 0001: not pregnant - 未怀孕 * 0002: possibly pregnant - 可能怀孕 * 0003: definitely pregnant - 确定怀孕 * 0004: unknown - 未知 */ export enum PregnancyStatus { NOT_PREGNANT = '0001', // 未怀孕 POSSIBLY_PREGNANT = '0002', // 可能怀孕 DEFINITELY_PREGNANT = '0003', // 确定怀孕 UNKNOWN = '0004', // 未知 } /** * 妊娠状态选项接口,用于UI下拉选择 */ export interface PregnancyStatusOption { value: PregnancyStatus; label: React.ReactNode; description?: string; } /** * 妊娠状态选项列表 */ export const pregnancyStatusOptions: PregnancyStatusOption[] = [ { value: PregnancyStatus.NOT_PREGNANT, label: '未怀孕', description: '患者未怀孕' }, { value: PregnancyStatus.POSSIBLY_PREGNANT, label: '可能怀孕', description: '患者可能怀孕' }, { value: PregnancyStatus.DEFINITELY_PREGNANT, label: '确定怀孕', description: '患者确定怀孕' }, { value: PregnancyStatus.UNKNOWN, label: '未知', description: '患者妊娠状态未知' } ]; /** * 根据值获取妊娠状态描述 * @param status 妊娠状态值 * @returns 妊娠状态描述 */ export const getPregnancyStatusDescription = (status: string): string => { switch (status) { case PregnancyStatus.NOT_PREGNANT: return '未怀孕'; case PregnancyStatus.POSSIBLY_PREGNANT: return '可能怀孕'; case PregnancyStatus.DEFINITELY_PREGNANT: return '确定怀孕'; case PregnancyStatus.UNKNOWN: return '未知'; default: return '未知'; } }; ``` ### 2. 更新 workActions.ts 修改 `src/API/patient/workActions.ts` 文件中的 RegisterInfo 接口: ```typescript // 导入妊娠状态类型 import { PregnancyStatus } from '@/domain/patient/pregnancyStatus'; export interface RegisterInfo { // ... 其他字段 /** 妊娠状态 */ pregnancy_status: PregnancyStatus; // ... 其他字段 } ``` ### 3. 更新 registerSchema.ts 修改 `src/validation/patient/registerSchema.ts` 文件: ```typescript // 导入妊娠状态类型 import { PregnancyStatus } from '@/domain/patient/pregnancyStatus'; const registerInfoSchema: Record< keyof Omit, z.ZodTypeAny > = { // ... 其他字段 /**---下面是人医专用字段--- */ /** 妊娠状态 */ pregnancy_status: z.nativeEnum(PregnancyStatus).optional(), // ... 其他字段 }; ``` ### 4. 更新 register.form.tsx 修改 `src/pages/patient/components/register.form.tsx` 文件: ```typescript // 导入妊娠状态类型和选项 import { PregnancyStatus, pregnancyStatusOptions } from '@/domain/patient/pregnancyStatus'; // 替换现有的 pregnancyStatusOptions // const pregnancyStatusOptions = [ // { // value: 'yes', // label: ( // // ), // }, // { // value: 'no', // label: ( // // ), // }, // { // value: 'na', // label: ( // // ), // }, // ]; // 使用国际化的妊娠状态选项 const pregnancyStatusOptions: PregnancyStatusOption[] = [ { value: PregnancyStatus.NOT_PREGNANT, label: ( ), }, { value: PregnancyStatus.POSSIBLY_PREGNANT, label: ( ), }, { value: PregnancyStatus.DEFINITELY_PREGNANT, label: ( ), }, { value: PregnancyStatus.UNKNOWN, label: ( ), }, ]; ``` ### 5. 更新 taskToRegister.ts 修改 `src/domain/patient/taskToRegister.ts` 文件: ```typescript // 导入妊娠状态类型 import { PregnancyStatus } from '@/domain/patient/pregnancyStatus'; export const mapTaskToRegisterInfo = (task: Task): RegisterInfo => { // ... 其他代码 // 处理妊娠状态 let pregnancyStatus: PregnancyStatus = PregnancyStatus.UNKNOWN; if (task.pregnancy_status && Object.values(PregnancyStatus).includes(task.pregnancy_status as PregnancyStatus)) { pregnancyStatus = task.pregnancy_status as PregnancyStatus; } return { // ... 其他字段 // 人医专用字段 pregnancy_status: pregnancyStatus, // ... 其他字段 }; }; ``` ## 国际化支持 在国际化文件中添加以下键值对: ```json { "register.pregnancyStatus.notPregnant": "未怀孕", "register.pregnancyStatus.possiblyPregnant": "可能怀孕", "register.pregnancyStatus.definitelyPregnant": "确定怀孕", "register.pregnancyStatus.unknown": "未知" } ``` ## 测试用例 创建 `src/domain/patient/pregnancyStatus.test.ts` 文件: ```typescript import { PregnancyStatus, pregnancyStatusOptions, getPregnancyStatusDescription } from './pregnancyStatus'; describe('PregnancyStatus', () => { it('should have correct values', () => { expect(PregnancyStatus.NOT_PREGNANT).toBe('0001'); expect(PregnancyStatus.POSSIBLY_PREGNANT).toBe('0002'); expect(PregnancyStatus.DEFINITELY_PREGNANT).toBe('0003'); expect(PregnancyStatus.UNKNOWN).toBe('0004'); }); it('should have correct options', () => { expect(pregnancyStatusOptions).toHaveLength(4); expect(pregnancyStatusOptions[0].value).toBe(PregnancyStatus.NOT_PREGNANT); expect(pregnancyStatusOptions[1].value).toBe(PregnancyStatus.POSSIBLY_PREGNANT); expect(pregnancyStatusOptions[2].value).toBe(PregnancyStatus.DEFINITELY_PREGNANT); expect(pregnancyStatusOptions[3].value).toBe(PregnancyStatus.UNKNOWN); }); it('should return correct description', () => { expect(getPregnancyStatusDescription('0001')).toBe('未怀孕'); expect(getPregnancyStatusDescription('0002')).toBe('可能怀孕'); expect(getPregnancyStatusDescription('0003')).toBe('确定怀孕'); expect(getPregnancyStatusDescription('0004')).toBe('未知'); expect(getPregnancyStatusDescription('9999')).toBe('未知'); }); }); ``` ## 现有代码修改指南 ### 修改 register.form.tsx 中的 pregnancyStatusOptions 当前代码(第39-67行): ```typescript const pregnancyStatusOptions = [ { value: 'yes', label: ( ), }, { value: 'no', label: ( ), }, { value: 'na', label: ( ), }, ]; ``` 应修改为: ```typescript // 导入妊娠状态类型和选项 import { PregnancyStatus, pregnancyStatusOptions } from '@/domain/patient/pregnancyStatus'; // 使用新的pregnancyStatusOptions,替换原有的定义 // const pregnancyStatusOptions = [ ... ]; // 删除或注释掉原有定义 ``` ### 表单组件实现 当前表单组件(第360-377行): ```typescript } name="pregnancy_status" required={registerFormFields.pregnancy_status.required} validateTrigger={registerFormFields.pregnancy_status.trigger} rules={registerFormFields.pregnancy_status.validation} > ``` 这个实现已经符合我们的设计,只需要确保导入正确的pregnancyStatusOptions即可。 ### 实施步骤 1. **创建类型定义文件** ```bash # 创建 src/domain/patient/pregnancyStatus.ts 文件 # 复制设计文档中的代码到该文件 ``` 2. **更新 register.form.tsx** ```typescript // 在文件顶部添加导入 import { PregnancyStatus, pregnancyStatusOptions } from '@/domain/patient/pregnancyStatus'; // 删除或注释掉原有的 pregnancyStatusOptions 定义 // const pregnancyStatusOptions = [ ... ]; ``` 3. **更新 workActions.ts** ```typescript // 在文件顶部添加导入 import { PregnancyStatus } from '@/domain/patient/pregnancyStatus'; // 修改 RegisterInfo 接口中的 pregnancy_status 字段 pregnancy_status: PregnancyStatus; ``` 4. **更新 registerSchema.ts** ```typescript // 在文件顶部添加导入 import { PregnancyStatus } from '@/domain/patient/pregnancyStatus'; // 修改 pregnancy_status 的验证规则 pregnancy_status: z.nativeEnum(PregnancyStatus).optional(), ``` 5. **更新 taskToRegister.ts** ```typescript // 在文件顶部添加导入 import { PregnancyStatus } from '@/domain/patient/pregnancyStatus'; // 修改 mapTaskToRegisterInfo 函数中的 pregnancy_status 处理 // 处理妊娠状态 let pregnancyStatus: PregnancyStatus = PregnancyStatus.UNKNOWN; if (task.pregnancy_status && Object.values(PregnancyStatus).includes(task.pregnancy_status as PregnancyStatus)) { pregnancyStatus = task.pregnancy_status as PregnancyStatus; } // 在返回对象中使用 pregnancy_status: pregnancyStatus, ``` 6. **添加国际化支持** ```json // 在国际化文件中添加 { "register.pregnancyStatus.notPregnant": "未怀孕", "register.pregnancyStatus.possiblyPregnant": "可能怀孕", "register.pregnancyStatus.definitelyPregnant": "确定怀孕", "register.pregnancyStatus.unknown": "未知" } ``` 7. **创建测试文件** ```bash # 创建 src/domain/patient/pregnancyStatus.test.ts 文件 # 复制设计文档中的测试代码到该文件 ``` ### 注意事项 1. **向后兼容性**:如果数据库中已有使用旧值('yes', 'no', 'na')的记录,需要在数据映射函数中添加转换逻辑: ```typescript // 在 taskToRegister.ts 中添加 const mapOldPregnancyStatusToNew = (oldStatus: string): PregnancyStatus => { switch (oldStatus) { case 'yes': return PregnancyStatus.DEFINITELY_PREGNANT; case 'no': return PregnancyStatus.NOT_PREGNANT; case 'na': default: return PregnancyStatus.UNKNOWN; } }; // 在 mapTaskToRegisterInfo 函数中使用 let pregnancyStatus: PregnancyStatus = PregnancyStatus.UNKNOWN; if (task.pregnancy_status) { if (Object.values(PregnancyStatus).includes(task.pregnancy_status as PregnancyStatus)) { pregnancyStatus = task.pregnancy_status as PregnancyStatus; } else { // 处理旧值 pregnancyStatus = mapOldPregnancyStatusToNew(task.pregnancy_status); } } ``` 2. **表单默认值**:考虑在表单中设置默认值,特别是在ReRegister场景下: ```typescript // 在 register.form.tsx 中 ``` ## 总结 通过以上实现,我们定义了完整的妊娠状态类型系统,包括: 1. 类型定义:使用枚举明确定义了四种妊娠状态 2. UI支持:提供了选项列表和描述函数 3. 表单集成:更新了表单组件和验证规则 4. 国际化:支持多语言显示 5. 测试覆盖:确保类型和功能的正确性 这个实现可以确保妊娠状态在整个应用中保持一致性和类型安全。