瀏覽代碼

feat(registration): add pet-related registration items and validation information

sw 3 周之前
父節點
當前提交
513b49e3ec

+ 12 - 4
src/API/patient/workActions.ts

@@ -17,10 +17,6 @@ export interface RegisterInfo {
   patient_age: string;
   patient_dob: string;
   patient_sex: string;
-  // sex_neutered: string;
-  pregnancy_status: string;
-  // chip_number: string;
-  // variety: string;
   patient_type: string;
   ref_physician: string;
   operator_id: string;
@@ -31,6 +27,18 @@ export interface RegisterInfo {
   study_type: 'Normal' | 'Emergency';
   comment: string;
   views: View[];
+  /**---下面是宠物专用字段---------------------------- */
+  owner_name: string;
+  sex_neutered: string;
+  chip_number: string;
+  variety: string;
+  /** 麻醉状态 */
+  is_anaesthesia: boolean;
+  /** 是否镇静 */
+  is_sedation: boolean;
+  /**---下面是人医专用字段------------------------------ */
+  /** 妊娠状态 */
+  pregnancy_status: string;
 }
 
 export interface RegisterWorkResponseData {

+ 6 - 0
src/domain/animalSpecificInfo.ts

@@ -0,0 +1,6 @@
+const omitSchemaFields = ['owner_name', 'variety'] as const;
+//表单验证时忽略动物专用字段
+const omitAnimalSchemaMap = Object.fromEntries(
+  omitSchemaFields.map((k) => [k, true])
+) as Record<(typeof omitSchemaFields)[number], true>;
+export { omitAnimalSchemaMap };

+ 90 - 54
src/pages/patient/components/register.form.tsx

@@ -12,6 +12,8 @@ import { useIntl, FormattedMessage } from 'react-intl';
 import { registerFormFields } from '@/validation/patient/registerSchema';
 import NumberWithUnit from '@/components/NumberWithUnit';
 import dayjs from 'dayjs';
+import { useSelector } from 'react-redux';
+import { RootState } from '@/states/store';
 
 const genderOptions = [
   {
@@ -79,6 +81,9 @@ const BasicInfoForm: React.FC<BasicInfoFormProps> = ({
   React.useEffect(() => {
     console.log('patient_age 变化了:', patient_age); // 每次 NumberWithUnit onChange 都会触发
   }, [patient_age]);
+  const productName = useSelector(
+    (state: RootState) => state.product.productName
+  );
 
   const intl = useIntl();
   return (
@@ -92,6 +97,28 @@ const BasicInfoForm: React.FC<BasicInfoFormProps> = ({
       }}
       onValuesChange={onValuesChange}
     >
+      {/** 宠物专用 */}
+      {productName === 'VETDROS' && (
+        <Form.Item
+          label={
+            <FormattedMessage
+              id="register.owner_name"
+              defaultMessage="register.owner_name"
+            />
+          }
+          name="sex_neutered"
+          required={registerFormFields.owner_name.required}
+          validateTrigger={registerFormFields.owner_name.trigger}
+          rules={registerFormFields.owner_name.validation}
+        >
+          <Input
+            placeholder={intl.formatMessage({
+              id: 'register.owner_name.placeholder',
+              defaultMessage: 'register.owner_name.placeholder',
+            })}
+          />
+        </Form.Item>
+      )}
       <Form.Item
         label={
           <FormattedMessage
@@ -226,25 +253,28 @@ const BasicInfoForm: React.FC<BasicInfoFormProps> = ({
       >
         <Select options={genderOptions} />
       </Form.Item>
-      {/* <Form.Item
-        label={
-          <FormattedMessage
-            id="register.sexNeutered"
-            defaultMessage="register.sexNeutered"
+      {/** 宠物专用 */}
+      {productName === 'VETDROS' && (
+        <Form.Item
+          label={
+            <FormattedMessage
+              id="register.sexNeutered"
+              defaultMessage="register.sexNeutered"
+            />
+          }
+          name="sex_neutered"
+          required={registerFormFields.sex_neutered.required}
+          validateTrigger={registerFormFields.sex_neutered.trigger}
+          rules={registerFormFields.sex_neutered.validation}
+        >
+          <Input
+            placeholder={intl.formatMessage({
+              id: 'register.sexNeutered.placeholder',
+              defaultMessage: 'register.sexNeutered.placeholder',
+            })}
           />
-        }
-        name="sex_neutered"
-        required={registerFormFields.sex_neutered.required}
-        validateTrigger={registerFormFields.sex_neutered.trigger}
-        rules={registerFormFields.sex_neutered.validation}
-      >
-        <Input
-          placeholder={intl.formatMessage({
-            id: 'register.sexNeutered.placeholder',
-            defaultMessage: 'register.sexNeutered.placeholder',
-          })}
-        />
-      </Form.Item> */}
+        </Form.Item>
+      )}
       <Form.Item
         label={
           <FormattedMessage
@@ -263,44 +293,50 @@ const BasicInfoForm: React.FC<BasicInfoFormProps> = ({
           buttonStyle="solid"
         />
       </Form.Item>
-      {/* <Form.Item
-        label={
-          <FormattedMessage
-            id="register.chipNumber"
-            defaultMessage="register.chipNumber"
+      {/** 宠物专用 */}
+      {productName === 'VETDROS' && (
+        <Form.Item
+          label={
+            <FormattedMessage
+              id="register.chipNumber"
+              defaultMessage="register.chipNumber"
+            />
+          }
+          name="chip_number"
+          required={registerFormFields.chip_number.required}
+          validateTrigger={registerFormFields.chip_number.trigger}
+          rules={registerFormFields.chip_number.validation}
+        >
+          <Input
+            placeholder={intl.formatMessage({
+              id: 'register.chipNumber.placeholder',
+              defaultMessage: 'register.chipNumber.placeholder',
+            })}
           />
-        }
-        name="chip_number"
-        required={registerFormFields.chip_number.required}
-        validateTrigger={registerFormFields.chip_number.trigger}
-        rules={registerFormFields.chip_number.validation}
-      >
-        <Input
-          placeholder={intl.formatMessage({
-            id: 'register.chipNumber.placeholder',
-            defaultMessage: 'register.chipNumber.placeholder',
-          })}
-        />
-      </Form.Item> */}
-      {/* <Form.Item
-        label={
-          <FormattedMessage
-            id="register.variety"
-            defaultMessage="register.variety"
+        </Form.Item>
+      )}
+      {/** 宠物专用 */}
+      {productName === 'VETDROS' && (
+        <Form.Item
+          label={
+            <FormattedMessage
+              id="register.variety"
+              defaultMessage="register.variety"
+            />
+          }
+          name="variety"
+          required={registerFormFields.variety.required}
+          validateTrigger={registerFormFields.variety.trigger}
+          rules={registerFormFields.variety.validation}
+        >
+          <Input
+            placeholder={intl.formatMessage({
+              id: 'register.variety.placeholder',
+              defaultMessage: 'register.variety.placeholder',
+            })}
           />
-        }
-        name="variety"
-        required={registerFormFields.variety.required}
-        validateTrigger={registerFormFields.variety.trigger}
-        rules={registerFormFields.variety.validation}
-      >
-        <Input
-          placeholder={intl.formatMessage({
-            id: 'register.variety.placeholder',
-            defaultMessage: 'register.variety.placeholder',
-          })}
-        />
-      </Form.Item> */}
+        </Form.Item>
+      )}
       {/* <Form.Item
         label={
           <FormattedMessage

+ 3 - 2
src/pages/patient/register.tsx

@@ -19,6 +19,7 @@ import dayjs from 'dayjs';
 import utc from 'dayjs/plugin/utc';
 import { View } from '@/API/patient/viewActions';
 import BodyPositionFilter from './components/bodyPositionFilter';
+import { omitAnimalSchemaMap } from '@/domain/animalSpecificInfo';
 dayjs.extend(utc);
 
 const { useBreakpoint } = Grid;
@@ -49,8 +50,8 @@ const RegisterPage: React.FC = () => {
 
       values = { ...values, patient_dob: formatDob };
       console.log(`${JSON.stringify(values, null, 2)}`);
-
-      const validateResult = registerformSchema.safeParse(values);
+      const humanSchema = registerformSchema.omit(omitAnimalSchemaMap);
+      const validateResult = humanSchema.safeParse(values);
       if (!validateResult.success) {
         message.error(`必填项未填写或者不合规则`);
         // todo 更详细和人性化的提示

+ 59 - 5
src/validation/patient/registerSchema.ts

@@ -24,11 +24,7 @@ const registerInfoSchema: Record<
   }),
   patient_dob: z.string().nonempty(),
   patient_sex: z.string().optional(),
-  // sex_neutered: z.string().optional(),
-  pregnancy_status: z.string().optional(),
-  // chip_number: z.string().optional(),
-  // variety: z.string().optional(),
-  // patient_type: z.string().nonempty(),
+
   ref_physician: z.string().optional(),
   operator_id: z.string().optional(),
   weight: z.number().optional(),
@@ -39,6 +35,15 @@ const registerInfoSchema: Record<
   //   view_id: z.string(),
   //   procedure_id: z.string()
   // })).optional()
+  /**---下面是宠物专用字段--- */
+  sex_neutered: z.string().optional(),
+  chip_number: z.string().optional(),
+  variety: z.string().optional(),
+  owner_name: z.string().nonempty(),
+  is_anaesthesia: z.boolean().optional(),
+  is_sedation: z.boolean().optional(),
+  /**---下面是人医专用字段--- */
+  pregnancy_status: z.string().optional(),
 };
 
 const registerformSchema = z.object(registerInfoSchema);
@@ -188,6 +193,55 @@ export const registerFormFields = {
     message: 'Comment is optional',
     trigger: ['onChange', 'onBlur'],
   },
+  //动物专用字段
+  owner_name: {
+    label: 'Owner Name',
+    required: true,
+    requiredLabel: '',
+    validation: zodToAntdRules(registerformSchema.shape.owner_name),
+    message: 'Owner Name is required',
+    trigger: ['onChange', 'onBlur'],
+  },
+  sex_neutered: {
+    label: 'neutered',
+    required: false,
+    requiredLabel: '',
+    validation: zodToAntdRules(registerformSchema.shape.sex_neutered),
+    message: 'neutered is optional',
+    trigger: ['onChange', 'onBlur'],
+  },
+  chip_number: {
+    label: 'Chip Number',
+    required: false,
+    requiredLabel: '',
+    validation: zodToAntdRules(registerformSchema.shape.chip_number),
+    message: 'Chip Number is optional',
+    trigger: ['onChange', 'onBlur'],
+  },
+  variety: {
+    label: 'Variety',
+    required: false,
+    requiredLabel: '',
+    validation: zodToAntdRules(registerformSchema.shape.variety),
+    message: 'Variety is optional',
+    trigger: ['onChange', 'onBlur'],
+  },
+  is_anaesthesia: {
+    label: 'Anaesthesia',
+    required: false,
+    requiredLabel: '',
+    validation: zodToAntdRules(registerformSchema.shape.is_anaesthesia),
+    message: 'Anaesthesia is optional',
+    trigger: ['onChange', 'onBlur'],
+  },
+  is_sedation: {
+    label: 'Sedation',
+    required: false,
+    requiredLabel: '',
+    validation: zodToAntdRules(registerformSchema.shape.is_sedation),
+    message: 'Sedation is optional',
+    trigger: ['onChange', 'onBlur'],
+  },
 } satisfies Record<
   keyof Omit<RegisterInfo, IgnoredKeys>,
   {