import React, { useEffect, useRef } from 'react'; import { Form, Input, DatePicker, InputNumber, Select, Radio, FormInstance, } from 'antd'; import { useIntl, FormattedMessage } from 'react-intl'; import { registerFormFields } from '@/validation/patient/registerSchema'; import NumberWithUnit from '@/components/NumberWithUnit'; import dayjs, { Dayjs } from 'dayjs'; import { useSelector } from 'react-redux'; import { RootState } from '@/states/store'; const genderOptions = [ { value: 'male', label: ( ), }, { value: 'female', label: ( ), }, ]; const pregnancyStatusOptions = [ { value: 'yes', label: ( ), }, { value: 'no', label: ( ), }, { value: 'na', label: ( ), }, ]; interface BasicInfoFormProps { style?: React.CSSProperties; form?: FormInstance; // eslint-disable-next-line @typescript-eslint/no-explicit-any onValuesChange?: (changedValues: any, allValues: any) => void; } const BasicInfoForm: React.FC = ({ style, form, onValuesChange, }) => { // 使用 ref 记录更新源,防止循环触发 const updateSourceRef = useRef<'age' | 'dob' | null>(null); const patient_age = Form.useWatch('patient_age', form); const patient_dob = Form.useWatch('patient_dob', form); const productName = useSelector( (state: RootState) => state.product.productName ); const intl = useIntl(); // 根据年龄计算出生日期 const calculateDobFromAge = (age: { number: number; unit: 'D' | 'M' | 'Y'; }): Dayjs => { const now = dayjs(); switch (age.unit) { case 'D': return now.subtract(age.number, 'day'); case 'M': return now.subtract(age.number, 'month'); case 'Y': return now.subtract(age.number, 'year'); default: return now; } }; // 根据出生日期计算年龄 const calculateAgeFromDob = ( dob: Dayjs ): { number: number; unit: 'D' | 'M' | 'Y' } => { const now = dayjs(); const years = now.diff(dob, 'year'); if (years >= 1) { return { number: years, unit: 'Y' }; } const months = now.diff(dob, 'month'); if (months >= 1) { return { number: months, unit: 'M' }; } const days = now.diff(dob, 'day'); return { number: Math.max(0, days), unit: 'D' }; }; // 监听年龄变化 useEffect(() => { // 如果是出生日期联动更新的年龄,跳过 if (updateSourceRef.current === 'dob') { updateSourceRef.current = null; return; } // 如果年龄有效,计算出生日期 if (patient_age && patient_age.number >= 0 && form) { updateSourceRef.current = 'age'; const newDob = calculateDobFromAge(patient_age); form.setFieldsValue({ patient_dob: newDob }); console.log('年龄变化,更新出生日期:', newDob.format('YYYY-MM-DD')); } }, [patient_age, form]); // 监听出生日期变化 useEffect(() => { // 如果是年龄联动更新的出生日期,跳过 if (updateSourceRef.current === 'age') { updateSourceRef.current = null; return; } // 如果出生日期有效,计算年龄 if (patient_dob && dayjs.isDayjs(patient_dob) && form) { updateSourceRef.current = 'dob'; const newAge = calculateAgeFromDob(patient_dob); form.setFieldsValue({ patient_age: newAge }); console.log('出生日期变化,更新年龄:', newAge); } }, [patient_dob, form]); return (
{/** 宠物专用 */} {productName === 'VETDROS' && ( } name="owner_name" required={registerFormFields.owner_name.required} validateTrigger={registerFormFields.owner_name.trigger} rules={registerFormFields.owner_name.validation} > )} } name="accession_number" required={registerFormFields.accession_number.required} validateTrigger={registerFormFields.accession_number.trigger} rules={registerFormFields.accession_number.validation} > } name="patient_id" required={registerFormFields.patient_id.required} validateTrigger={registerFormFields.patient_id.trigger} rules={registerFormFields.patient_id.validation} > } name="patient_name" required={registerFormFields.patient_name.required} validateTrigger={registerFormFields.patient_name.trigger} rules={registerFormFields.patient_name.validation} > } name="patient_size" required={registerFormFields.patient_size.required} validateTrigger={registerFormFields.patient_size.trigger} rules={registerFormFields.patient_size.validation} initialValue="Medium" > } name="patient_age" required={registerFormFields.patient_age.required} validateTrigger={registerFormFields.patient_age.trigger} rules={registerFormFields.patient_age.validation} initialValue={{ number: 0, unit: 'Y' }} > } name="patient_dob" required={registerFormFields.patient_dob.required} validateTrigger={registerFormFields.patient_dob.trigger} rules={registerFormFields.patient_dob.validation} > } name="patient_sex" required={registerFormFields.patient_sex.required} validateTrigger={registerFormFields.patient_sex.trigger} rules={registerFormFields.patient_sex.validation} > ALTERED (绝育) UNALTERED (未绝育) )} {/** 人类专用 */} {productName === 'DROS' && ( } name="pregnancy_status" required={registerFormFields.pregnancy_status.required} validateTrigger={registerFormFields.pregnancy_status.trigger} rules={registerFormFields.pregnancy_status.validation} > )} {/** 宠物专用 */} {productName === 'VETDROS' && ( } name="chip_number" required={registerFormFields.chip_number.required} validateTrigger={registerFormFields.chip_number.trigger} rules={registerFormFields.chip_number.validation} > )} {/** 宠物专用 */} {productName === 'VETDROS' && ( } name="variety" required={registerFormFields.variety.required} validateTrigger={registerFormFields.variety.trigger} rules={registerFormFields.variety.validation} > )} {/* } name="patient_type" required={registerFormFields.patient_type.required} validateTrigger={registerFormFields.patient_type.trigger} rules={registerFormFields.patient_type.validation} > */} } name="ref_physician" required={registerFormFields.ref_physician.required} validateTrigger={registerFormFields.ref_physician.trigger} rules={registerFormFields.ref_physician.validation} > } name="operator_id" required={registerFormFields.operator_id.required} validateTrigger={registerFormFields.operator_id.trigger} rules={registerFormFields.operator_id.validation} > } name="weight" required={registerFormFields.weight.required} validateTrigger={registerFormFields.weight.trigger} rules={registerFormFields.weight.validation} > } name="thickness" required={registerFormFields.thickness.required} validateTrigger={registerFormFields.thickness.trigger} rules={registerFormFields.thickness.validation} > } name="length" required={registerFormFields.length.required} validateTrigger={registerFormFields.length.trigger} rules={registerFormFields.length.validation} > } name="comment" required={registerFormFields.comment.required} validateTrigger={registerFormFields.comment.trigger} rules={registerFormFields.comment.validation} >
); }; export default BasicInfoForm;