pregnancy_status类型设计.md 13 KB

Pregnancy Status 类型设计文档

概述

本文档定义了妊娠状态(pregnancy_status)的数据类型、验证规则和UI实现方案。

类型定义

PregnancyStatus 枚举

/**
 * 妊娠状态枚举
 * 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 接口

/**
 * 妊娠状态选项接口,用于UI下拉选择
 */
export interface PregnancyStatusOption {
  value: PregnancyStatus;
  label: React.ReactNode;
  description?: string;
}

实现方案

1. 类型定义文件

创建 src/domain/patient/pregnancyStatus.ts 文件:

/**
 * 妊娠状态类型定义
 */

/**
 * 妊娠状态枚举
 * 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 接口:

// 导入妊娠状态类型
import { PregnancyStatus } from '@/domain/patient/pregnancyStatus';

export interface RegisterInfo {
  // ... 其他字段
  /** 妊娠状态 */
  pregnancy_status: PregnancyStatus;
  // ... 其他字段
}

3. 更新 registerSchema.ts

修改 src/validation/patient/registerSchema.ts 文件:

// 导入妊娠状态类型
import { PregnancyStatus } from '@/domain/patient/pregnancyStatus';

const registerInfoSchema: Record<
  keyof Omit<RegisterInfo, IgnoredKeys>,
  z.ZodTypeAny
> = {
  // ... 其他字段
  /**---下面是人医专用字段--- */
  /** 妊娠状态 */
  pregnancy_status: z.nativeEnum(PregnancyStatus).optional(),
  // ... 其他字段
};

4. 更新 register.form.tsx

修改 src/pages/patient/components/register.form.tsx 文件:

// 导入妊娠状态类型和选项
import { PregnancyStatus, pregnancyStatusOptions } from '@/domain/patient/pregnancyStatus';

// 替换现有的 pregnancyStatusOptions
// const pregnancyStatusOptions = [
//   {
//     value: 'yes',
//     label: (
//       <FormattedMessage
//         id="register.pregnancyStatus.yes"
//         defaultMessage="register.pregnancyStatus.yes"
//       />
//     ),
//   },
//   {
//     value: 'no',
//     label: (
//       <FormattedMessage
//         id="register.pregnancyStatus.no"
//         defaultMessage="register.pregnancyStatus.no"
//       />
//     ),
//   },
//   {
//     value: 'na',
//     label: (
//       <FormattedMessage
//         id="register.pregnancyStatus.na"
//         defaultMessage="register.pregnancyStatus.na"
//       />
//     ),
//   },
// ];

// 使用国际化的妊娠状态选项
const pregnancyStatusOptions: PregnancyStatusOption[] = [
  {
    value: PregnancyStatus.NOT_PREGNANT,
    label: (
      <FormattedMessage
        id="register.pregnancyStatus.notPregnant"
        defaultMessage="未怀孕"
      />
    ),
  },
  {
    value: PregnancyStatus.POSSIBLY_PREGNANT,
    label: (
      <FormattedMessage
        id="register.pregnancyStatus.possiblyPregnant"
        defaultMessage="可能怀孕"
      />
    ),
  },
  {
    value: PregnancyStatus.DEFINITELY_PREGNANT,
    label: (
      <FormattedMessage
        id="register.pregnancyStatus.definitelyPregnant"
        defaultMessage="确定怀孕"
      />
    ),
  },
  {
    value: PregnancyStatus.UNKNOWN,
    label: (
      <FormattedMessage
        id="register.pregnancyStatus.unknown"
        defaultMessage="未知"
      />
    ),
  },
];

5. 更新 taskToRegister.ts

修改 src/domain/patient/taskToRegister.ts 文件:

// 导入妊娠状态类型
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,
    // ... 其他字段
  };
};

国际化支持

在国际化文件中添加以下键值对:

{
  "register.pregnancyStatus.notPregnant": "未怀孕",
  "register.pregnancyStatus.possiblyPregnant": "可能怀孕",
  "register.pregnancyStatus.definitelyPregnant": "确定怀孕",
  "register.pregnancyStatus.unknown": "未知"
}

测试用例

创建 src/domain/patient/pregnancyStatus.test.ts 文件:

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行):

const pregnancyStatusOptions = [
  {
    value: 'yes',
    label: (
      <FormattedMessage
        id="register.pregnancyStatus.yes"
        defaultMessage="register.pregnancyStatus.yes"
      />
    ),
  },
  {
    value: 'no',
    label: (
      <FormattedMessage
        id="register.pregnancyStatus.no"
        defaultMessage="register.pregnancyStatus.no"
      />
    ),
  },
  {
    value: 'na',
    label: (
      <FormattedMessage
        id="register.pregnancyStatus.na"
        defaultMessage="register.pregnancyStatus.na"
      />
    ),
  },
];

应修改为:

// 导入妊娠状态类型和选项
import { PregnancyStatus, pregnancyStatusOptions } from '@/domain/patient/pregnancyStatus';

// 使用新的pregnancyStatusOptions,替换原有的定义
// const pregnancyStatusOptions = [ ... ]; // 删除或注释掉原有定义

表单组件实现

当前表单组件(第360-377行):

<Form.Item
  label={
    <FormattedMessage
      id="register.pregnancyStatus"
      defaultMessage="register.pregnancyStatus"
    />
  }
  name="pregnancy_status"
  required={registerFormFields.pregnancy_status.required}
  validateTrigger={registerFormFields.pregnancy_status.trigger}
  rules={registerFormFields.pregnancy_status.validation}
>
  <Radio.Group
    options={pregnancyStatusOptions}
    optionType="button"
    buttonStyle="solid"
  />
</Form.Item>

这个实现已经符合我们的设计,只需要确保导入正确的pregnancyStatusOptions即可。

实施步骤

  1. 创建类型定义文件

    # 创建 src/domain/patient/pregnancyStatus.ts 文件
    # 复制设计文档中的代码到该文件
    
    1. 更新 register.form.tsx ```typescript // 在文件顶部添加导入 import { PregnancyStatus, pregnancyStatusOptions } from '@/domain/patient/pregnancyStatus';

    // 删除或注释掉原有的 pregnancyStatusOptions 定义 // const pregnancyStatusOptions = [ ... ]; ```

  2. 更新 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(),
  1. 更新 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": "未知"
   }
  1. 创建测试文件

    # 创建 src/domain/patient/pregnancyStatus.test.ts 文件
    # 复制设计文档中的测试代码到该文件
    

    注意事项

    1. 向后兼容性:如果数据库中已有使用旧值('yes', 'no', 'na')的记录,需要在数据映射函数中添加转换逻辑:
    // 在 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场景下:

   // 在 register.form.tsx 中
   <Form.Item
     // ... 其他属性
     initialValue={PregnancyStatus.UNKNOWN}
   >
     <Radio.Group
       options={pregnancyStatusOptions}
       optionType="button"
       buttonStyle="solid"
     />
   </Form.Item>

总结

通过以上实现,我们定义了完整的妊娠状态类型系统,包括:

  1. 类型定义:使用枚举明确定义了四种妊娠状态
  2. UI支持:提供了选项列表和描述函数
  3. 表单集成:更新了表单组件和验证规则
  4. 国际化:支持多语言显示
  5. 测试覆盖:确保类型和功能的正确性

这个实现可以确保妊娠状态在整个应用中保持一致性和类型安全。