PatientEdit.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <script setup lang="ts">
  2. import type { VxeFormInstance, VxeFormListeners, VxeFormProps } from 'vxe-pc-ui';
  3. import { useForm } from 'alova/client';
  4. import { pageDiagnoseTypeMethod, pageMedicineMethod } from '@/request/api/care.api';
  5. import { appendPatientMethod } from '@/request/api/patient.api';
  6. import { message as Message } from 'ant-design-vue/es/components';
  7. import RemoteSelect from '@/libs/v-select-page/RemoteSelect.vue';
  8. interface FormModel {}
  9. const emits = defineEmits<{
  10. destroy: [refresh?: boolean];
  11. }>();
  12. const {
  13. form,
  14. loading: submitting,
  15. send: submit,
  16. reset,
  17. } = useForm(appendPatientMethod, {
  18. initialForm: {},
  19. }).onSuccess(() => {
  20. Message.success(`新增患者成功`);
  21. emits('destroy', true);
  22. });
  23. const formRef = ref<VxeFormInstance<FormModel>>();
  24. const formProps = reactive<VxeFormProps<FormModel>>({
  25. titleWidth: 100,
  26. titleAlign: 'right',
  27. titleColon: true,
  28. items: [
  29. { field: 'name', title: '姓名', span: 24, itemRender: { name: 'VxeInput' } },
  30. { field: 'phone', title: '手机号码', span: 24, itemRender: { name: 'VxeInput', props: { maxLength: 11 } } },
  31. {
  32. field: 'cardno',
  33. title: '身份证号',
  34. span: 24,
  35. itemRender: { name: 'VxeInput', props: { minLength: 18, maxLength: 18 } },
  36. },
  37. /*{
  38. field: 'gender', title: '性别', span: 24, itemRender: {
  39. name: 'VxeRadioGroup',
  40. options: [
  41. { label: '男', value: '0' },
  42. { label: '女', value: '1' },
  43. ],
  44. },
  45. },*/
  46. // { field: 'age', title: '年龄', span: 24, itemRender: { name: 'VxeNumberInput', props: { min: 0, controls: false }, } },
  47. { field: 'disease', title: '疾病', span: 24, slots: { default: 'disease-remote-select' } },
  48. { field: 'symptom', title: '证型', span: 24, slots: { default: 'symptom-remote-select' } },
  49. {
  50. field: 'date',
  51. title: '就诊日期',
  52. span: 24,
  53. itemRender: { name: 'VxeDatePicker', props: { type: 'date', endDate: Date.now() } },
  54. },
  55. { field: 'department', title: '就诊科室', span: 24, itemRender: { name: 'VxeInput' } },
  56. { field: 'doctor', title: '就诊医生', span: 24, itemRender: { name: 'VxeInput' } },
  57. { align: 'center', span: 24, slots: { default: 'active' } },
  58. ],
  59. rules: {
  60. name: [{ required: true, message: '请输入姓名' }],
  61. phone: [{ required: true, message: '请输入手机号码' }, { validator: 'ValidMobile' }],
  62. cardno: [{ required: true, message: '请输入身份证号' }, { validator: 'ValidIdentityCard' }],
  63. /*gender: [
  64. { required: true, message: '请选择性别' },
  65. ],
  66. age: [
  67. { required: true, message: '请输入年龄' },
  68. ],*/
  69. disease: [{ required: true, message: '请输入疾病' }],
  70. date: [{ required: true, message: '请选择就诊日期' }],
  71. },
  72. });
  73. const formEmits: VxeFormListeners<FormModel> = {
  74. submit({ data }) {
  75. submit(data);
  76. },
  77. reset() {
  78. reset();
  79. },
  80. };
  81. </script>
  82. <template>
  83. <vxe-form ref="formRef" :data="form" v-bind="formProps" v-on="formEmits">
  84. <template #active>
  85. <vxe-button type="submit" status="primary" content="提交" :loading="submitting"></vxe-button>
  86. <vxe-button type="reset" content="重置" :disabled="submitting"></vxe-button>
  87. </template>
  88. <template #disease-remote-select="{ data, field }">
  89. <RemoteSelect v-model:value="data[field]" :load="pageMedicineMethod" key-prop="name" @blur="formRef?.validateField(field)" @update:value="formRef?.validateField(field)" />
  90. </template>
  91. <template #symptom-remote-select="{ data, field }">
  92. <RemoteSelect v-model:value="data[field]" :load="pageDiagnoseTypeMethod" key-prop="name" @blur="formRef?.validateField(field)" @update:value="formRef?.validateField(field)" />
  93. </template>
  94. </vxe-form>
  95. </template>
  96. <style scoped lang="scss"></style>