From cb9cd49627b65a4c0e137e08063271a8cefe1826 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 23 七月 2026 17:48:49 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0

---
 src/views/erp/purchase/order/modules/form.vue |  112 +++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 82 insertions(+), 30 deletions(-)

diff --git a/src/views/erp/purchase/order/modules/form.vue b/src/views/erp/purchase/order/modules/form.vue
index 58a42fe..baae4ee 100644
--- a/src/views/erp/purchase/order/modules/form.vue
+++ b/src/views/erp/purchase/order/modules/form.vue
@@ -1,18 +1,20 @@
 <script lang="ts" setup>
 import type { FormType } from '../data';
 
-import type { ErpPurchaseOrderApi } from '#/api/erp/purchase/order';
+import type { ErpPurchaseOrderApi, ProcessDefinition } from '#/api/erp/purchase/order';
 
 import { computed, ref } from 'vue';
 
-import { useVbenModal } from '../../../../../packages/effects/common-ui/src';
+import { useVbenModal } from '@vben/common-ui';
 
-import { message } from 'ant-design-vue';
+import { message, Button } from 'ant-design-vue';
 
 import { useVbenForm } from '#/adapter/form';
 import { getAccountSimpleList } from '#/api/erp/finance/account';
 import {
+  confirmReceipt,
   createPurchaseOrder,
+  getPurchaseApproveProcessList,
   getPurchaseOrder,
   updatePurchaseOrder,
 } from '#/api/erp/purchase/order';
@@ -20,11 +22,13 @@
 
 import { useFormSchema } from '../data';
 import PurchaseOrderItemForm from './item-form.vue';
+import ProcessSelectModal from './process-select-modal.vue';
 
 const emit = defineEmits(['success']);
 const formData = ref<ErpPurchaseOrderApi.PurchaseOrder>();
-const formType = ref<FormType>('create'); // 琛ㄥ崟绫诲瀷锛�'create' | 'edit' | 'detail'
+const formType = ref<FormType>('create');
 const itemFormRef = ref<InstanceType<typeof PurchaseOrderItemForm>>();
+const selectedProcessId = ref<string>('');
 
 const getTitle = computed(() => {
   if (formType.value === 'create') {
@@ -48,11 +52,15 @@
   schema: useFormSchema(formType.value),
   showDefaultActions: false,
   handleValuesChange: (values, changedFields) => {
-    // 鐩殑锛氬悓姝ュ埌 item-form 缁勪欢锛岃Е鍙戞暣浣撶殑浠锋牸璁$畻
     if (formData.value && changedFields.includes('discountPercent')) {
       formData.value.discountPercent = values.discountPercent;
     }
   },
+});
+
+const [ProcessModal, processModalApi] = useVbenModal({
+  connectedComponent: ProcessSelectModal,
+  destroyOnClose: true,
 });
 
 /** 鏇存柊閲囪喘璁㈠崟椤� */
@@ -78,6 +86,47 @@
   });
 }
 
+/** 娴佺▼閫夋嫨鎴愬姛 */
+function handleProcessSelectSuccess(processId: string) {
+  selectedProcessId.value = processId;
+  submitOrder();
+}
+
+/** 鎻愪氦璁㈠崟 */
+async function submitOrder() {
+  const data = (await formApi.getValues()) as ErpPurchaseOrderApi.PurchaseOrder;
+  data.items = formData.value?.items?.map((item) => ({
+    ...item,
+    id: undefined,
+  }));
+  if (data.fileUrl && Array.isArray(data.fileUrl)) {
+    data.fileUrl = data.fileUrl.length > 0 ? data.fileUrl[0] : '';
+  }
+  if (selectedProcessId.value) {
+    data.processDefinitionId = selectedProcessId.value;
+  }
+  await (formType.value === 'create'
+    ? createPurchaseOrder(data)
+    : updatePurchaseOrder(data));
+  await modalApi.close();
+  emit('success');
+  message.success($t('ui.actionMessage.operationSuccess'));
+}
+
+/** 纭鏀惰揣 */
+async function handleConfirmReceipt() {
+  if (!formData.value?.id) return;
+  const hideLoading = message.loading({ content: '纭鏀惰揣涓�...', duration: 0 });
+  try {
+    await confirmReceipt(formData.value.id);
+    message.success('纭鏀惰揣鎴愬姛锛屽凡鐢熸垚鍒拌揣閫氱煡鍗�');
+    await modalApi.close();
+    emit('success');
+  } finally {
+    hideLoading();
+  }
+}
+
 /** 鍒涘缓鎴栨洿鏂伴噰璐鍗� */
 const [Modal, modalApi] = useVbenModal({
   async onConfirm() {
@@ -96,42 +145,42 @@
     }
 
     modalApi.lock();
-    // 鎻愪氦琛ㄥ崟
-    const data =
-      (await formApi.getValues()) as ErpPurchaseOrderApi.PurchaseOrder;
-    data.items = formData.value?.items?.map((item) => ({
-      ...item,
-      // 瑙e喅鏂板閲囪喘璁㈠崟鎶ラ敊
-      id: undefined,
-    }));
-    // 灏嗘枃浠舵暟缁勮浆鎹负瀛楃涓�
-    if (data.fileUrl && Array.isArray(data.fileUrl)) {
-      data.fileUrl = data.fileUrl.length > 0 ? data.fileUrl[0] : '';
-    }
-    try {
-      await (formType.value === 'create'
-        ? createPurchaseOrder(data)
-        : updatePurchaseOrder(data));
-      // 鍏抽棴骞舵彁绀�
-      await modalApi.close();
-      emit('success');
-      message.success($t('ui.actionMessage.operationSuccess'));
-    } finally {
-      modalApi.unlock();
+
+    if (formType.value === 'create') {
+      try {
+        const processes = await getPurchaseApproveProcessList();
+        if (processes.length === 1) {
+          selectedProcessId.value = processes[0].id;
+          await submitOrder();
+        } else if (processes.length > 1) {
+          processModalApi.setData(processes).open();
+        } else {
+          message.error('閲囪喘瀹℃牳鍒嗙被涓嬫病鏈夊彲鐢ㄧ殑娴佺▼妯″瀷锛岃鍏堝垱寤哄苟鍙戝竷娴佺▼');
+        }
+      } catch (error: any) {
+        message.error(error.message || '鑾峰彇娴佺▼鍒楄〃澶辫触');
+      } finally {
+        modalApi.unlock();
+      }
+    } else {
+      try {
+        await submitOrder();
+      } finally {
+        modalApi.unlock();
+      }
     }
   },
   async onOpenChange(isOpen: boolean) {
     if (!isOpen) {
       formData.value = undefined;
+      selectedProcessId.value = '';
       return;
     }
-    // 鍔犺浇鏁版嵁
     const data = modalApi.getData<{ formType: FormType; id?: number }>();
     formType.value = data.formType;
     formApi.setDisabled(formType.value === 'detail');
     formApi.updateSchema(useFormSchema(formType.value));
     if (!data || !data.id) {
-      // 鏂板鏃讹紝榛樿閫変腑璐︽埛
       const accountList = await getAccountSimpleList();
       const defaultAccount = accountList.find((item) => item.defaultStatus);
       if (defaultAccount) {
@@ -142,7 +191,6 @@
     modalApi.lock();
     try {
       formData.value = await getPurchaseOrder(data.id);
-      // 璁剧疆鍒� values
       await formApi.setValues(formData.value);
     } finally {
       modalApi.unlock();
@@ -157,6 +205,7 @@
     class="w-3/4"
     :show-confirm-button="formType !== 'detail'"
   >
+    <ProcessModal @success="handleProcessSelectSuccess" />
     <Form class="mx-3">
       <template #items>
         <PurchaseOrderItemForm
@@ -170,5 +219,8 @@
         />
       </template>
     </Form>
+    <template v-if="formType === 'detail' && formData?.status === 20 && formData?.inStatus !== 2" #prepend-footer>
+      <Button type="primary" @click="handleConfirmReceipt">纭鏀惰揣</Button>
+    </template>
   </Modal>
 </template>

--
Gitblit v1.9.3