在 src/pages/patient/components/register.form.tsx 文件中,性别选项(genderOptions)目前硬编码为宠物性别选项:
const genderOptions = [
{
value: 'male_pet',
label: (
<FormattedMessage
id="register.gender.male_pet"
defaultMessage="register.gender.male_pet"
/>
),
},
{
value: 'female_pet',
label: (
<FormattedMessage
id="register.gender.female_pet"
defaultMessage="register.gender.female_pet"
/>
),
},
// ... 其他宠物性别选项
];
问题:
系统支持两种产品类型:
性别选项需要根据产品类型动态切换:
productName 自动选择合适的性别选项文件: src/domain/patient/genderOptions.ts
import { FormattedMessage } from 'react-intl';
/**
* 人类性别枚举
*/
export enum HumanGender {
MALE = 'male',
FEMALE = 'female',
OTHER = 'other',
UNKNOWN = 'unknown',
}
/**
* 宠物性别枚举
*/
export enum PetGender {
MALE_PET = 'male_pet',
FEMALE_PET = 'female_pet',
NEUTERED_MALE = 'neutered_male',
NEUTERED_FEMALE = 'neutered_female',
UNKNOWN_PET = 'unknown_pet',
}
/**
* 性别选项接口
*/
export interface GenderOption {
value: string;
label: React.ReactNode;
}
/**
* 人类性别选项
*/
export const humanGenderOptions: GenderOption[] = [
{
value: HumanGender.MALE,
label: (
<FormattedMessage
id="register.gender.male"
defaultMessage="Male"
/>
),
},
{
value: HumanGender.FEMALE,
label: (
<FormattedMessage
id="register.gender.female"
defaultMessage="Female"
/>
),
},
{
value: HumanGender.OTHER,
label: (
<FormattedMessage
id="register.gender.other"
defaultMessage="Other"
/>
),
},
{
value: HumanGender.UNKNOWN,
label: (
<FormattedMessage
id="register.gender.unknown"
defaultMessage="Unknown"
/>
),
},
];
/**
* 宠物性别选项
*/
export const petGenderOptions: GenderOption[] = [
{
value: PetGender.MALE_PET,
label: (
<FormattedMessage
id="register.gender.male_pet"
defaultMessage="Male Pet"
/>
),
},
{
value: PetGender.FEMALE_PET,
label: (
<FormattedMessage
id="register.gender.female_pet"
defaultMessage="Female Pet"
/>
),
},
{
value: PetGender.NEUTERED_MALE,
label: (
<FormattedMessage
id="register.gender.neutered_male"
defaultMessage="Neutered Male"
/>
),
},
{
value: PetGender.NEUTERED_FEMALE,
label: (
<FormattedMessage
id="register.gender.neutered_female"
defaultMessage="Neutered Female"
/>
),
},
{
value: PetGender.UNKNOWN_PET,
label: (
<FormattedMessage
id="register.gender.unknown_pet"
defaultMessage="Unknown Pet"
/>
),
},
];
/**
* 根据产品类型获取性别选项
* @param productName 产品名称 ('DROS' | 'VETDROS')
* @returns 性别选项数组
*/
export function getGenderOptions(productName: string): GenderOption[] {
switch (productName) {
case 'DROS':
return humanGenderOptions;
case 'VETDROS':
return petGenderOptions;
default:
// 默认使用人类性别选项
console.warn(`Unknown product name: ${productName}, using human gender options`);
return humanGenderOptions;
}
}
文件: src/pages/patient/components/register.form.tsx
// 导入性别选项配置
import { getGenderOptions } from '@/domain/patient/genderOptions';
// 获取产品类型
const productName = useSelector((state: RootState) => state.product.productName);
// 动态获取性别选项
const genderOptions = useMemo(() => {
return getGenderOptions(productName);
}, [productName]);
// 替换原有的硬编码 genderOptions
// 原代码:
// const genderOptions = [/* 硬编码的宠物性别选项 */];
// 使用动态获取的性别选项
// genderOptions 变量已在上面定义
文件: src/assets/i18n/messages/en.js
添加人类性别选项的英文翻译:
{
// ... 现有翻译
// 人类性别选项
"register.gender.male": "Male",
"register.gender.female": "Female",
"register.gender.other": "Other",
"register.gender.unknown": "Unknown",
// 宠物性别选项(如果需要更新)
"register.gender.male_pet": "Male",
"register.gender.female_pet": "Female",
"register.gender.neutered_male": "Neutered Male",
"register.gender.neutered_female": "Neutered Female",
"register.gender.unknown_pet": "Unknown",
}
文件: src/assets/i18n/messages/zh.js
添加中文翻译:
{
// ... 现有翻译
// 人类性别选项
"register.gender.male": "男",
"register.gender.female": "女",
"register.gender.other": "其他",
"register.gender.unknown": "未知",
// 宠物性别选项(如果需要更新)
"register.gender.male_pet": "公",
"register.gender.female_pet": "母",
"register.gender.neutered_male": "已绝育公",
"register.gender.neutered_female": "已绝育母",
"register.gender.unknown_pet": "未知",
}
src/domain/patient/genderOptions.ts 文件getGenderOptions 函数register.form.tsx 中导入 getGenderOptionsproductName 从 Redux storeuseMemo 动态计算 genderOptionsconst productName = useSelector((state: RootState) => state.product.productName);
const genderOptions = useMemo(() => {
return getGenderOptions(productName);
}, [productName]);
useMemo 避免不必要的重新计算productName 变化时重新计算性别选项// 使用枚举确保类型安全
export enum HumanGender {
MALE = 'male',
FEMALE = 'female',
OTHER = 'other',
UNKNOWN = 'unknown',
}
// 统一的选项接口
export interface GenderOption {
value: string;
label: React.ReactNode;
}
// 使用 FormattedMessage 进行国际化
label: (
<FormattedMessage
id="register.gender.male"
defaultMessage="Male"
/>
),
| 测试场景 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| DROS 产品性别选项 | 产品类型为 DROS | 打开注册表单 | 显示男/女/其他/未知选项 |
| VETDROS 产品性别选项 | 产品类型为 VETDROS | 打开注册表单 | 显示公/母/已绝育公/已绝育母/未知选项 |
| 表单提交 | 选择性别选项 | 提交表单 | 数据正确保存到后端 |
| 测试场景 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| 英文环境 | 切换到英文语言 | 查看性别选项 | 显示 Male/Female/Other/Unknown |
| 中文环境 | 切换到中文语言 | 查看性别选项 | 显示 男/女/其他/未知 |
| 测试场景 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|
| 未知产品类型 | productName 为未知值 | 打开注册表单 | 默认显示人类性别选项 |
| 产品类型为空 | productName 为空字符串 | 打开注册表单 | 默认显示人类性别选项 |
src/pages/patient/components/register.form.tsx - 主要修改文件src/assets/i18n/messages/en.js - 添加英文翻译src/assets/i18n/messages/zh.js - 添加中文翻译src/domain/patient/genderOptions.ts - 性别选项配置src/states/productSlice.ts - 产品状态管理src/states/patient/register/formSlice.ts - 表单状态管理通过创建性别选项配置文件,实现根据产品类型动态切换性别选项的功能:
该方案具有良好的扩展性,未来如需添加新的产品类型或性别选项,只需在配置文件中添加即可。
实现日期: 2025-11-14 文档版本: v1.0 作者: Cline AI Assistant