From a7dc7b230fcc6abc6ee5a7bfadb90789b03d2ca8 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 07 九月 2026 16:45:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0

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

diff --git a/src/views/mes/pro/workorder/modules/form.vue b/src/views/mes/pro/workorder/modules/form.vue
index 5da9d79..36a346e 100644
--- a/src/views/mes/pro/workorder/modules/form.vue
+++ b/src/views/mes/pro/workorder/modules/form.vue
@@ -8,7 +8,6 @@
 
   import { confirm, useVbenModal } from "@vben/common-ui";
   import {
-    BarcodeBizTypeEnum,
     MesProWorkOrderStatusEnum,
   } from "@vben/constants";
 
@@ -24,7 +23,7 @@
   } from "#/api/mes/pro/workorder";
   import { batchSaveWorkOrderProcess, getWorkOrderProcessListByWorkOrderId } from "#/api/mes/pro/workorder/process";
   import { $t } from "#/locales";
-  import { BarcodeDetail } from "#/views/wls/barcode/components";
+  // import { BarcodeDetail } from "#/views/wls/barcode/components";
 
   import { useFormSchema } from "../data";
   import PredictDelivery from "./ai/predict-delivery.vue";
@@ -39,7 +38,7 @@
   const formData = ref<MesProWorkOrderApi.WorkOrder>();
   const originalSnapshot = ref("");
   const subTabsName = ref("process");
-  const barcodeDetailRef = ref<InstanceType<typeof BarcodeDetail>>();
+  // const barcodeDetailRef = ref<InstanceType<typeof BarcodeDetail>>();
   const processListRef = ref<InstanceType<typeof ProcessList>>();
   const currentProductId = ref<number>(); // 褰撳墠閫変腑鐨勪骇鍝� ID锛堢敤浜庡伐搴忓姞杞斤級
   const tempProcessList = ref<MesProWorkOrderProcessApi.WorkOrderProcess[]>([]); // 涓存椂宸ュ簭鍒楄〃
@@ -128,7 +127,10 @@
     if (!valid || !formData.value?.id) return;
     modalApi.lock();
     try {
-      const data = (await formApi.getValues()) as MesProWorkOrderApi.WorkOrder;
+      const data = (await formApi.getValues()) as any;
+      if (Array.isArray(data.feedbackRole)) {
+        data.feedbackRole = data.feedbackRole.join(',');
+      }
       await updateWorkOrder({ ...formData.value, ...data });
       if (tempProcessList.value.length > 0) {
         const processList = tempProcessList.value.map(item => ({
@@ -147,17 +149,17 @@
   }
 
   /** 鏌ョ湅璁㈠崟鏉$爜 */
-  function handleBarcode() {
-    if (!formData.value?.id) {
-      return;
-    }
-    barcodeDetailRef.value?.openByBusiness(
-      formData.value.id,
-      BarcodeBizTypeEnum.WORKORDER,
-      formData.value.code,
-      formData.value.name
-    );
-  }
+  // function handleBarcode() {
+  //   if (!formData.value?.id) {
+  //     return;
+  //   }
+  //   barcodeDetailRef.value?.openByBusiness(
+  //     formData.value.id,
+  //     BarcodeBizTypeEnum.WORKORDER,
+  //     formData.value.code,
+  //     formData.value.name
+  //   );
+  // }
 
   /** 宸ュ簭鍒楄〃鍙樺寲鍥炶皟 */
   function handleProcessListChange(list: MesProWorkOrderProcessApi.WorkOrderProcess[]) {
@@ -181,7 +183,10 @@
           if (isEditable.value) {
             const current = JSON.stringify(await formApi.getValues());
             if (current !== originalSnapshot.value) {
-              const data = (await formApi.getValues()) as MesProWorkOrderApi.WorkOrder;
+              const data = (await formApi.getValues()) as any;
+              if (Array.isArray(data.feedbackRole)) {
+                data.feedbackRole = data.feedbackRole.join(',');
+              }
               await updateWorkOrder({ ...formData.value, ...data });
               originalSnapshot.value = current;
             }
@@ -243,7 +248,10 @@
       const { valid } = await formApi.validate();
       if (!valid) return;
       modalApi.lock();
-      const data = (await formApi.getValues()) as MesProWorkOrderApi.WorkOrder;
+      const data = (await formApi.getValues()) as any;
+      if (Array.isArray(data.feedbackRole)) {
+        data.feedbackRole = data.feedbackRole.join(',');
+      }
       try {
         if (formData.value?.id) {
           // 缂栬緫妯″紡
@@ -307,7 +315,11 @@
         modalApi.lock();
         try {
           formData.value = await getWorkOrder(data.id);
-          await formApi.setValues(formData.value);
+          const formValues: any = { ...formData.value };
+          if (formValues.feedbackRole && typeof formValues.feedbackRole === 'string') {
+            formValues.feedbackRole = formValues.feedbackRole.split(',');
+          }
+          await formApi.setValues(formValues);
           currentProductId.value = formData.value.productId;
         } finally {
           modalApi.unlock();
@@ -341,6 +353,9 @@
         <Tabs.TabPane key="process"
                       tab="宸ュ簭"
                       forceRender>
+          <p class="mb-3 text-xs text-gray-400 leading-relaxed">
+            鏂板妯″紡浼氳嚜鍔ㄤ粠鎵�閫変骇鍝佺殑宸ヨ壓璺嚎甯﹀嚭宸ュ簭锛岀偣鍑昏棣栨墜鏌勫彲鎷栨嫿璋冩暣椤哄簭锛涖�屽叧閿伐搴忋�嶉渶閲嶇偣绠℃帶銆併�岃川妫�宸ュ簭銆嶇敱璐ㄦ浜哄憳妫�楠屻�佸嬀閫夈�屽�掑啿銆嶇殑宸ュ簭鍦ㄦ姤宸ュ悗鎸夋姇鏂欑敤閲忚嚜鍔ㄦ墸鍑忕墿鏂欏簱瀛樸�傛瘡閬撳伐搴忓彲鐐广�屾柊澧炵墿鏂欍�嶉厤缃姇鏂欐槑缁嗐��
+          </p>
           <ProcessList
             ref="processListRef"
             :form-type="formType"
@@ -352,6 +367,9 @@
         </Tabs.TabPane>
         <Tabs.TabPane key="item"
                       tab="鐗╂枡闇�姹�">
+          <p class="mb-3 text-xs text-gray-400 leading-relaxed">
+            鐗╂枡闇�姹傛寜鍚勫伐搴忋�屾姇鏂欐槑缁嗐�嵜楄鍗曟暟閲忚嚜鍔ㄦ眹鎬荤敓鎴愶紝浠呬緵鏌ョ湅锛涘闇�璋冩暣锛岃鍥炲埌銆屽伐搴忋�嶉〉绛剧淮鎶ゆ姇鏂欍��
+          </p>
           <ItemList v-if="formData?.id"
                     :work-order-id="formData.id" />
           <div v-else class="text-gray-400 text-center py-8">
@@ -362,11 +380,15 @@
     </template>
     <template #prepend-footer>
       <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 v-if="canUseAi" class="flex flex-wrap items-center gap-x-2 gap-y-1">
+          <span class="text-xs font-semibold text-gray-800 dark:text-gray-100">AI 鏅鸿兘鍒嗘瀽</span>
+          <div 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>
+          <span class="text-xs text-gray-400">鍩轰簬鍘嗗彶鐢熶骇鏁版嵁浼扮畻锛屼粎渚涘弬鑰冿紝涓嶅弬涓庝笟鍔¤绠�</span>
         </div>
         <div v-if="canUseAi && showMainBtn" class="border-t border-gray-200" />
         <div class="flex items-center">
@@ -384,13 +406,13 @@
                 @click="handleSave">
           淇濆瓨淇敼
         </Button>
-        <Button v-if="formType === 'detail' && formData?.id"
+        <!-- <Button v-if="formType === 'detail' && formData?.id"
                 @click="handleBarcode">
           鏌ョ湅鏉$爜
-        </Button>
+        </Button> -->
         <Button @click="modalApi.close()">鍙栨秷</Button>
       </div>
     </template>
   </Modal>
-  <BarcodeDetail ref="barcodeDetailRef" />
+  <!-- <BarcodeDetail ref="barcodeDetailRef" /> -->
 </template>

--
Gitblit v1.9.3