本文档定义了妊娠状态(pregnancy_status)的数据类型、验证规则和UI实现方案。
/**
* 妊娠状态枚举
* 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;
}
创建 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 '未知';
}
};
修改 src/API/patient/workActions.ts
文件中的 RegisterInfo 接口:
// 导入妊娠状态类型
import { PregnancyStatus } from '@/domain/patient/pregnancyStatus';
export interface RegisterInfo {
// ... 其他字段
/** 妊娠状态 */
pregnancy_status: PregnancyStatus;
// ... 其他字段
}
修改 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(),
// ... 其他字段
};
修改 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="未知"
/>
),
},
];
修改 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('未知');
});
});
当前代码(第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即可。
创建类型定义文件
# 创建 src/domain/patient/pregnancyStatus.ts 文件
# 复制设计文档中的代码到该文件
// 删除或注释掉原有的 pregnancyStatusOptions 定义 // const pregnancyStatusOptions = [ ... ]; ```
更新 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(),
// 修改 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": "未知"
}
创建测试文件
# 创建 src/domain/patient/pregnancyStatus.test.ts 文件
# 复制设计文档中的测试代码到该文件
// 在 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);
}
}
表单默认值:考虑在表单中设置默认值,特别是在ReRegister场景下:
// 在 register.form.tsx 中
<Form.Item
// ... 其他属性
initialValue={PregnancyStatus.UNKNOWN}
>
<Radio.Group
options={pregnancyStatusOptions}
optionType="button"
buttonStyle="solid"
/>
</Form.Item>
通过以上实现,我们定义了完整的妊娠状态类型系统,包括:
这个实现可以确保妊娠状态在整个应用中保持一致性和类型安全。