PatientEdit.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <script setup lang="ts">
  2. import type { VxeFormInstance, VxeFormListeners, VxeFormProps } from 'vxe-pc-ui';
  3. import { useForm } from 'alova/client';
  4. import { pageDiagnoseSymptomMethod, 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. { field: 'syndrome', title: '症状', span: 24, slots: { default: 'syndrome-remote-select' } },
  50. {
  51. field: 'date',
  52. title: '就诊日期',
  53. span: 24,
  54. itemRender: { name: 'VxeDatePicker', props: { type: 'date', endDate: Date.now() } },
  55. },
  56. { field: 'department', title: '就诊科室', span: 24, itemRender: { name: 'VxeInput' } },
  57. { field: 'doctor', title: '就诊医生', span: 24, itemRender: { name: 'VxeInput' } },
  58. { align: 'center', span: 24, slots: { default: 'active' } },
  59. ],
  60. rules: {
  61. name: [{ required: true, message: '请输入姓名' }],
  62. phone: [{ required: true, message: '请输入手机号码' }, { validator: 'ValidMobile' }],
  63. cardno: [{ required: true, message: '请输入身份证号' }, { validator: 'ValidIdentityCard' }],
  64. /*gender: [
  65. { required: true, message: '请选择性别' },
  66. ],
  67. age: [
  68. { required: true, message: '请输入年龄' },
  69. ],*/
  70. disease: [{ required: true, message: '请选择疾病' }],
  71. date: [{ required: true, message: '请选择就诊日期' }],
  72. },
  73. });
  74. const formEmits: VxeFormListeners<FormModel> = {
  75. submit({ data }) {
  76. submit(data);
  77. },
  78. reset() {
  79. reset();
  80. },
  81. };
  82. </script>
  83. <template>
  84. <vxe-form ref="formRef" :data="form" v-bind="formProps" v-on="formEmits">
  85. <template #active>
  86. <vxe-button type="submit" status="primary" content="提交" :loading="submitting"></vxe-button>
  87. <vxe-button type="reset" content="重置" :disabled="submitting"></vxe-button>
  88. </template>
  89. <template #disease-remote-select="{ data, field }">
  90. <RemoteSelect v-model:value="data[field]" :load="pageMedicineMethod" :multiple="true" key-prop="name" @blur="formRef?.validateField(field)" @update:value="formRef?.validateField(field)" />
  91. </template>
  92. <template #symptom-remote-select="{ data, field }">
  93. <RemoteSelect v-model:value="data[field]" :load="pageDiagnoseTypeMethod" :multiple="true" key-prop="name" @blur="formRef?.validateField(field)" @update:value="formRef?.validateField(field)" />
  94. </template>
  95. <template #syndrome-remote-select="{ data, field }">
  96. <RemoteSelect v-model:value="data[field]" :load="pageDiagnoseSymptomMethod" :multiple="true" key-prop="name" @blur="formRef?.validateField(field)" @update:value="formRef?.validateField(field)" />
  97. </template>
  98. </vxe-form>
  99. </template>
  100. <style scoped lang="scss"></style>