From a27f80b043bb9651fd0032dcd28b2fee6cf820b9 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 03 八月 2026 13:42:34 +0800
Subject: [PATCH] feat(ai): 集成AI智能分析功能到MPS表单和仪表板

---
 src/views/mes/pro/workorder/modules/form.vue |   67 ++++++++++++++++++++++++---------
 1 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/src/views/mes/pro/workorder/modules/form.vue b/src/views/mes/pro/workorder/modules/form.vue
index c998ef8..5da9d79 100644
--- a/src/views/mes/pro/workorder/modules/form.vue
+++ b/src/views/mes/pro/workorder/modules/form.vue
@@ -27,6 +27,10 @@
   import { BarcodeDetail } from "#/views/wls/barcode/components";
 
   import { useFormSchema } from "../data";
+  import PredictDelivery from "./ai/predict-delivery.vue";
+  import PredictDuration from "./ai/predict-duration.vue";
+  import PredictMaterial from "./ai/predict-material.vue";
+  import PredictRisk from "./ai/predict-risk.vue";
   import ItemList from "./item-list.vue";
   import ProcessList from "./process-list.vue";
 
@@ -50,6 +54,12 @@
     () =>
       formType.value === "update" &&
       formData.value?.status === MesProWorkOrderStatusEnum.PREPARE
+  );
+  const canUseAi = computed(
+    () =>
+      formData.value?.id &&
+      (formData.value?.status === MesProWorkOrderStatusEnum.PREPARE ||
+        formData.value?.status === MesProWorkOrderStatusEnum.CONFIRMED)
   );
   const getTitle = computed(() => {
     const isChild = !!formData.value?.parentId;
@@ -99,19 +109,17 @@
   });
 
   /** 閲嶆柊鎸傝浇 schema 骞舵寜琛ㄥ崟鎬佹帶鍒跺簳閮ㄦ寜閽� */
+  const mainActionText = computed(() => {
+    if (isConfirm.value) return '纭';
+    if (isFinish.value) return '瀹屾垚';
+    return '鎻愪氦';
+  });
+
+  const showMainBtn = computed(() => isEditable.value || isConfirm.value || isFinish.value);
+
   function applySchema() {
     formApi.setState({ schema: useFormSchema(formType.value, formApi) });
-    const showBtn = isEditable.value || isConfirm.value || isFinish.value;
-    modalApi.setState({
-      showConfirmButton: showBtn,
-      confirmText: isConfirm.value || canConfirm.value
-        ? '纭'
-        : isFinish.value
-          ? '瀹屾垚'
-          : isCreateMode.value
-            ? '鏂板'
-            : '淇濆瓨',
-    });
+    modalApi.setState({ showCancelButton: false, showConfirmButton: false });
   }
 
   /** 浠呬繚瀛橈紙涓嶆敼鍙樼姸鎬侊級 */
@@ -353,14 +361,35 @@
       </Tabs>
     </template>
     <template #prepend-footer>
-      <Button v-if="canConfirm"
-              @click="handleSave">
-        淇濆瓨
-      </Button>
-      <Button v-if="formType === 'detail' && formData?.id"
-              @click="handleBarcode">
-        鏌ョ湅鏉$爜
-      </Button>
+      <div class="flex flex-auto flex-col gap-2">
+        <div v-if="canUseAi" class="flex items-center gap-2">
+          <PredictMaterial :work-order-id="formData!.id" />
+          <PredictDuration :work-order-id="formData!.id" />
+          <PredictRisk :work-order-id="formData!.id" />
+          <PredictDelivery :work-order-id="formData!.id" />
+        </div>
+        <div v-if="canUseAi && showMainBtn" class="border-t border-gray-200" />
+        <div class="flex items-center">
+          <Button v-if="showMainBtn"
+                  type="primary"
+                  @click="modalApi.onConfirm()">
+            {{ mainActionText }}
+          </Button>
+        </div>
+      </div>
+    </template>
+    <template #append-footer>
+      <div class="flex gap-2">
+        <Button v-if="canConfirm"
+                @click="handleSave">
+          淇濆瓨淇敼
+        </Button>
+        <Button v-if="formType === 'detail' && formData?.id"
+                @click="handleBarcode">
+          鏌ョ湅鏉$爜
+        </Button>
+        <Button @click="modalApi.close()">鍙栨秷</Button>
+      </div>
     </template>
   </Modal>
   <BarcodeDetail ref="barcodeDetailRef" />

--
Gitblit v1.9.3