PurchaseApplicationModal.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="registerModal"
  5. destroyOnClose
  6. :title="title"
  7. :body-style="{ padding: '20px 20px 0' }"
  8. :width="1200"
  9. @ok="handleSubmit"
  10. >
  11. <BasicForm @register="registerForm" ref="formRef" name="PurchaseApplicationForm" />
  12. <!-- 子表单区域 -->
  13. <a-tabs v-model:activeKey="activeKey" animated @change="handleChangeTabs">
  14. <a-tab-pane tab="采购申请相关附件" key="purchaseApplicationAttachment" :forceRender="true">
  15. <JVxeTable
  16. keep-source
  17. resizable
  18. ref="purchaseApplicationAttachment"
  19. :loading="purchaseApplicationAttachmentTable.loading"
  20. :columns="purchaseApplicationAttachmentTable.columns"
  21. :dataSource="purchaseApplicationAttachmentTable.dataSource"
  22. :height="340"
  23. :rowNumber="true"
  24. :rowSelection="true"
  25. :disabled="formDisabled"
  26. :toolbar="true"
  27. />
  28. </a-tab-pane>
  29. <a-tab-pane tab="采购物料清单" key="materialList" :forceRender="true">
  30. <JVxeTable
  31. keep-source
  32. resizable
  33. ref="materialList"
  34. :loading="materialListTable.loading"
  35. :columns="materialListTable.columns"
  36. :dataSource="materialListTable.dataSource"
  37. :height="340"
  38. :rowNumber="true"
  39. :rowSelection="true"
  40. :disabled="formDisabled"
  41. :toolbar="true"
  42. />
  43. </a-tab-pane>
  44. </a-tabs>
  45. </BasicModal>
  46. </template>
  47. <script lang="ts" setup>
  48. import { ref, computed, unref, reactive } from 'vue';
  49. import { BasicModal, useModalInner } from '/@/components/Modal';
  50. import { BasicForm, useForm } from '/@/components/Form/index';
  51. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  52. import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods';
  53. import { getFormSchema, purchaseApplicationAttachmentColumns, materialListColumns } from '../PurchaseApplication.data';
  54. import { saveOrUpdate, purchaseApplicationAttachmentList, materialListList } from '../PurchaseApplication.api';
  55. // Emits声明
  56. const emit = defineEmits(['register', 'success']);
  57. const isUpdate = ref(true);
  58. const formDisabled = ref(false);
  59. const refKeys = ref(['purchaseApplicationAttachment', 'materialList']);
  60. const activeKey = ref('purchaseApplicationAttachment');
  61. const purchaseApplicationAttachment = ref();
  62. const materialList = ref();
  63. const tableRefs = { purchaseApplicationAttachment, materialList };
  64. const purchaseApplicationAttachmentTable = reactive({
  65. loading: false,
  66. dataSource: [],
  67. columns: purchaseApplicationAttachmentColumns,
  68. });
  69. const materialListTable = reactive({
  70. loading: false,
  71. dataSource: [],
  72. columns: materialListColumns,
  73. });
  74. const { formSchema } = getFormSchema({
  75. onPurchasePlanSelect: (val, record) => {
  76. const { purchaseType, applicant, currentNode, approvalStatus, approvalEndTime, label } = record;
  77. setFieldsValue({
  78. purchasePlanId: val,
  79. purchaseTitle: label,
  80. purchasePlan: label,
  81. applicant,
  82. purchaseType: String(purchaseType),
  83. currentNode,
  84. approvalStatus: String(approvalStatus),
  85. approvalEndTime,
  86. });
  87. },
  88. });
  89. //表单配置
  90. const [registerForm, { setProps, resetFields, setFieldsValue }] = useForm({
  91. labelWidth: 100,
  92. schemas: formSchema,
  93. showActionButtonGroup: false,
  94. baseColProps: { span: 24 },
  95. });
  96. //表单赋值
  97. const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
  98. //重置表单
  99. await reset();
  100. setModalProps({ confirmLoading: false, showCancelBtn: data?.showFooter, showOkBtn: data?.showFooter });
  101. isUpdate.value = !!data?.isUpdate;
  102. formDisabled.value = !data?.showFooter;
  103. if (unref(isUpdate)) {
  104. //表单赋值
  105. await setFieldsValue({
  106. ...data.record,
  107. });
  108. if (typeof requestSubTableData === 'function') {
  109. requestSubTableData(purchaseApplicationAttachmentList, { id: data?.record?.id }, purchaseApplicationAttachmentTable);
  110. requestSubTableData(materialListList, { id: data?.record?.id }, materialListTable);
  111. }
  112. }
  113. // 隐藏底部时禁用整个表单
  114. setProps({ disabled: !data?.showFooter });
  115. });
  116. //方法配置
  117. const [handleChangeTabs, handleSubmit, requestSubTableData, formRef] = useJvxeMethod(
  118. requestAddOrEdit,
  119. classifyIntoFormData,
  120. tableRefs,
  121. activeKey,
  122. refKeys
  123. );
  124. //设置标题
  125. const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(formDisabled) ? '编辑' : '详情'));
  126. async function reset() {
  127. await resetFields();
  128. activeKey.value = 'purchaseApplicationAttachment';
  129. purchaseApplicationAttachmentTable.dataSource = [];
  130. materialListTable.dataSource = [];
  131. }
  132. function classifyIntoFormData(allValues) {
  133. let main = Object.assign({}, allValues.formValue);
  134. return {
  135. ...main, // 展开
  136. purchaseApplicationAttachmentList: allValues.tablesValue[0].tableData,
  137. materialListList: allValues.tablesValue[1].tableData,
  138. };
  139. }
  140. //表单提交事件
  141. async function requestAddOrEdit(values) {
  142. try {
  143. setModalProps({ confirmLoading: true });
  144. //提交表单
  145. await saveOrUpdate(values, isUpdate.value);
  146. //关闭弹窗
  147. closeModal();
  148. //刷新列表
  149. emit('success');
  150. } finally {
  151. setModalProps({ confirmLoading: false });
  152. }
  153. }
  154. </script>
  155. <style lang="less" scoped>
  156. /** 时间和数字输入框样式 */
  157. :deep(.ant-input-number) {
  158. width: 100%;
  159. }
  160. :deep(.ant-calendar-picker) {
  161. width: 100%;
  162. }
  163. </style>