PurchaseApplicationModal.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. <AttachmentsEditTable :formDisabled="formDisabled" ref="attachmentsTable" :mainId="info?.id" :mainTable="currentTable" />
  16. </a-tab-pane>
  17. <a-tab-pane tab="采购物料清单" key="materialList" :forceRender="true">
  18. <JVxeTable
  19. keep-source
  20. resizable
  21. ref="materialList"
  22. :loading="materialListTable.loading"
  23. :columns="materialListTable.columns"
  24. :dataSource="materialListTable.dataSource"
  25. :height="340"
  26. :rowNumber="true"
  27. :rowSelection="true"
  28. :disabled="formDisabled"
  29. :toolbar="true"
  30. >
  31. <template #recommendSupplierOne="props">
  32. <el-api-select v-model:value="props.row.recommendSupplierOne" labelField="supplierName" :api="supplierList" placeholder="请选择供应商" />
  33. </template>
  34. <template #recommendSupplierTwo="props">
  35. <el-api-select v-model:value="props.row.recommendSupplierTwo" labelField="supplierName" :api="supplierList" placeholder="请选择供应商" />
  36. </template>
  37. </JVxeTable>
  38. </a-tab-pane>
  39. </a-tabs>
  40. </BasicModal>
  41. </template>
  42. <script lang="ts" setup>
  43. import { ref, computed, unref, reactive } from 'vue';
  44. import { BasicModal, useModalInner } from '/@/components/Modal';
  45. import { BasicForm, useForm } from '/@/components/Form/index';
  46. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  47. import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods';
  48. import { getFormSchema, materialListColumns, currentTable } from '../PurchaseApplication.data';
  49. import { saveOrUpdate, materialListList } from '../PurchaseApplication.api';
  50. import ElApiSelect from '/@/views/equipmentLifecycle/components/ElApiSelect.vue';
  51. import AttachmentsEditTable from '/@/views/equipmentLifecycle/manager/attachments/AttachmentsEditTable.vue';
  52. import { list as supplierList } from '/@/views/equipmentLifecycle/supplier/list/SupplierManage.api';
  53. // Emits声明
  54. const emit = defineEmits(['register', 'success']);
  55. const isUpdate = ref(true);
  56. const formDisabled = ref(false);
  57. const refKeys = ref(['materialList']);
  58. const activeKey = ref('purchaseApplicationAttachment');
  59. const attachmentsTable = ref();
  60. const materialList = ref();
  61. const tableRefs = { materialList };
  62. const materialListTable = reactive({
  63. loading: false,
  64. dataSource: [],
  65. columns: materialListColumns,
  66. });
  67. const { formSchema } = getFormSchema({
  68. onPurchasePlanSelect: (val, record) => {
  69. const { purchaseType, applicant, currentNode, approvalStatus, approvalEndTime, label } = record;
  70. setFieldsValue({
  71. purchasePlanId: val,
  72. purchaseTitle: label,
  73. purchasePlan: label,
  74. applicant,
  75. purchaseType: String(purchaseType),
  76. currentNode,
  77. approvalStatus: String(approvalStatus),
  78. approvalEndTime,
  79. });
  80. },
  81. });
  82. //表单配置
  83. const [registerForm, { setProps, resetFields, setFieldsValue }] = useForm({
  84. labelWidth: 100,
  85. schemas: formSchema,
  86. showActionButtonGroup: false,
  87. baseColProps: { span: 24 },
  88. });
  89. const info = ref<any>({});
  90. // 表单赋值
  91. const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
  92. //重置表单
  93. await reset();
  94. setModalProps({ confirmLoading: false, showCancelBtn: data?.showFooter, showOkBtn: data?.showFooter });
  95. isUpdate.value = !!data?.isUpdate;
  96. formDisabled.value = !data?.showFooter;
  97. info.value = data.record;
  98. if (unref(isUpdate)) {
  99. //表单赋值
  100. await setFieldsValue({
  101. ...data.record,
  102. approvalStatus: String(data.record.approvalStatus),
  103. });
  104. // 设置附件表格
  105. attachmentsTable.value.requestFileTableData();
  106. if (typeof requestSubTableData === 'function') {
  107. requestSubTableData(materialListList, { id: data?.record?.id }, materialListTable);
  108. }
  109. }
  110. // 隐藏底部时禁用整个表单
  111. setProps({ disabled: !data?.showFooter });
  112. });
  113. //方法配置
  114. const [handleChangeTabs, handleSubmit, requestSubTableData, formRef] = useJvxeMethod(
  115. requestAddOrEdit,
  116. classifyIntoFormData,
  117. tableRefs,
  118. activeKey,
  119. refKeys
  120. );
  121. //设置标题
  122. const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(formDisabled) ? '编辑' : '详情'));
  123. async function reset() {
  124. await resetFields();
  125. activeKey.value = 'purchaseApplicationAttachment';
  126. // 附件表格重置
  127. attachmentsTable.value.reset();
  128. materialListTable.dataSource = [];
  129. }
  130. function classifyIntoFormData(allValues) {
  131. let main = Object.assign({}, allValues.formValue);
  132. return {
  133. ...main, // 展开
  134. materialListList: allValues.tablesValue[0].tableData,
  135. };
  136. }
  137. //表单提交事件
  138. async function requestAddOrEdit(values) {
  139. try {
  140. setModalProps({ confirmLoading: true });
  141. // 验证附件是否有错误
  142. const valiRes = await attachmentsTable.value.validateTable();
  143. if (valiRes) {
  144. activeKey.value = 'purchaseApplicationAttachment';
  145. return;
  146. }
  147. // 提交表单
  148. await saveOrUpdate(values, isUpdate.value);
  149. // 保存附件
  150. await attachmentsTable.value.sumbit();
  151. //关闭弹窗
  152. closeModal();
  153. //刷新列表
  154. emit('success');
  155. } finally {
  156. setModalProps({ confirmLoading: false });
  157. }
  158. }
  159. </script>
  160. <style lang="less" scoped>
  161. /** 时间和数字输入框样式 */
  162. :deep(.ant-input-number) {
  163. width: 100%;
  164. }
  165. :deep(.ant-calendar-picker) {
  166. width: 100%;
  167. }
  168. </style>