From 31baed0f712d53ed888e17366347dfccc1cfe91b Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期五, 20 三月 2026 17:15:39 +0800
Subject: [PATCH] Merge branch 'dev_银川_中盛建材' of http://114.132.189.42:9002/r/product-inventory-management into dev_银川_中盛建材

---
 src/views/productionManagement/processRoute/processRouteItem/index.vue |  669 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 574 insertions(+), 95 deletions(-)

diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index cd9260a..5d841e8 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -47,6 +47,7 @@
          class="section-header">
       <div class="section-title">宸ヨ壓璺嚎椤圭洰鍒楄〃</div>
       <div class="section-actions">
+        <div class="sort-tip">鎷栨嫿琛ㄦ牸鎺掑簭</div>
         <el-button icon="Grid"
                    @click="toggleView"
                    style="margin-right: 10px;">
@@ -90,8 +91,8 @@
       <el-table-column label="鏄惁璐ㄦ"
                        prop="isQuality">
         <template #default="scope">
-          <el-tag :type="scope.row.isQuality ? 'success' : 'danger'">
-            {{scope.row.isQuality ? '鏄�' : '鍚�' }}
+          <el-tag :type="scope.row.isQuality == 1 ? 'success' : 'danger'">
+            {{scope.row.isQuality == 1 ? '鏄�' : '鍚�' }}
           </el-tag>
         </template>
       </el-table-column>
@@ -118,6 +119,7 @@
       <div class="section-header">
         <div class="section-title">宸ヨ壓璺嚎椤圭洰鍒楄〃</div>
         <div class="section-actions">
+          <div class="sort-tip">闀挎寜鎷栨嫿鍗$墖鎺掑簭</div>
           <el-button icon="Menu"
                      @click="toggleView"
                      style="margin-right: 10px;">
@@ -141,8 +143,8 @@
               <div class="card-process-name">{{ getProcessName(item.processId) || '-' }}</div>
             </div>
             <!-- 浜у搧淇℃伅 -->
-            <div class="card-content">
-            </div>
+            <!-- <div class="card-content">
+            </div> -->
             <!-- 鎿嶄綔鎸夐挳 -->
             <div class="card-footer">
               <el-button type="primary"
@@ -167,6 +169,16 @@
     <div class="section-BOM">
       <div class="section-header">
         <div class="section-title">BOM</div>
+        <div class="section-actions"
+             v-if="pageType === 'order'">
+          <el-button type="primary"
+                     @click="toggleBomEdit">
+            {{ bomDataValue.isEdit ? '鍙栨秷' : '缂栬緫' }}
+          </el-button>
+          <el-button v-if=" bomDataValue.isEdit"
+                     type="success"
+                     @click="saveBomChanges">淇濆瓨</el-button>
+        </div>
       </div>
       <div>
         <!-- BOM琛ㄦ牸 -->
@@ -177,28 +189,110 @@
                   style="width: 100%">
           <el-table-column type="expand">
             <template #default="props">
-              <el-table :data="props.row.bomList"
-                        row-key="id"
-                        default-expand-all
-                        :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
-                        style="width: 100%">
-                <el-table-column prop="productName"
-                                 label="浜у搧" />
-                <el-table-column prop="model"
-                                 label="瑙勬牸" />
-                <el-table-column prop="processName"
-                                 label="娑堣�楀伐搴�" />
-                <el-table-column prop="unitQuantity"
-                                 label="鍗曚綅浜у嚭鎵�闇�鏁伴噺" />
-                <el-table-column prop="unit"
-                                 label="鍗曚綅" />
-              </el-table>
+              <el-form ref="bomFormRef"
+                       :model="bomDataValue">
+                <el-table :data="props.row.bomList"
+                          row-key="tempId"
+                          default-expand-all
+                          :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+                          style="width: 100%">
+                  <el-table-column prop="productName"
+                                   label="浜у搧" />
+                  <el-table-column prop="model"
+                                   label="瑙勬牸">
+                    <template #default="{ row }">
+                      <el-form-item v-if="bomDataValue.isEdit"
+                                    style="margin: 0">
+                        <el-select v-model="row.model"
+                                   placeholder="璇烽�夋嫨瑙勬牸"
+                                   :disabled="!bomDataValue.isEdit"
+                                   style="width: 100%"
+                                   @visible-change="(v) => { if (v) openBomProductDialog(row.tempId) }">
+                          <el-option v-if="row.model"
+                                     :label="row.model"
+                                     :value="row.model" />
+                        </el-select>
+                      </el-form-item>
+                      <span v-else>{{ row.model }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="processName"
+                                   label="娑堣�楀伐搴�">
+                    <template #default="{ row }">
+                      <el-form-item v-if="bomDataValue.isEdit"
+                                    style="margin: 0">
+                        <el-select v-model="row.processId"
+                                   placeholder="璇烽�夋嫨娑堣�楀伐搴�"
+                                   :disabled="!bomDataValue.isEdit"
+                                   style="width: 100%">
+                          <el-option v-for="process in processOptions"
+                                     :key="process.id"
+                                     :label="process.name"
+                                     :value="process.id" />
+                        </el-select>
+                      </el-form-item>
+                      <span v-else>{{ row.processName }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="unitQuantity"
+                                   label="鍗曚綅浜у嚭鎵�闇�鏁伴噺">
+                    <template #default="{ row }">
+                      <el-form-item v-if="bomDataValue.isEdit"
+                                    style="margin: 0">
+                        <el-input-number v-model="row.unitQuantity"
+                                         :min="0"
+                                         :step="1"
+                                         controls-position="right"
+                                         style="width: 100%"
+                                         :disabled="!bomDataValue.isEdit" />
+                      </el-form-item>
+                      <span v-else>{{ row.unitQuantity }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="unit"
+                                   label="鍗曚綅">
+                    <template #default="{ row }">
+                      <el-form-item v-if="bomDataValue.isEdit"
+                                    style="margin: 0">
+                        <el-input v-model="row.unit"
+                                  placeholder="璇疯緭鍏ュ崟浣�"
+                                  clearable
+                                  :disabled="!bomDataValue.isEdit" />
+                      </el-form-item>
+                      <span v-else>{{ row.unit }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="鎿嶄綔"
+                                   fixed="right"
+                                   v-if="pageType === 'order'"
+                                   width="180">
+                    <template #default="{ row }">
+                      <el-button v-if="bomDataValue.isEdit"
+                                 type="danger"
+                                 text
+                                 size="small"
+                                 @click="removeBomItem(row.tempId)">鍒犻櫎</el-button>
+                      <el-button v-if="bomDataValue.isEdit"
+                                 type="primary"
+                                 text
+                                 size="small"
+                                 @click="addBomItem2(row.tempId)">娣诲姞瀛愰」</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </el-form>
             </template>
           </el-table-column>
           <el-table-column label="BOM缂栧彿"
                            prop="bomNo" />
           <el-table-column label="浜у搧绫诲瀷"
                            prop="dictLabel" />
+          <!-- <el-table-column label="鎿嶄綔"
+                           width="150">
+            <template #default="{ row }">
+            
+            </template>
+          </el-table-column> -->
           <!-- <el-table-column label="浜у搧缂栫爜"
                            prop="productCode" />
           <el-table-column label="浜у搧鍚嶇О"
@@ -206,6 +300,18 @@
           <el-table-column label="瑙勬牸鍨嬪彿"
                            prop="model" /> -->
         </el-table>
+        <div v-if="bomDataValue.isEdit"
+             style="text-align: center;border: 1px solid #e4e7ed;padding: 10px;transition: all 0.3s ease;cursor: pointer;"
+             :class="{'hover-effect': bomDataValue.isEdit}">
+          <el-button type="primary"
+                     text
+                     @click="addBomItem">
+            <el-icon style="vertical-align: middle;margin-right: 5px;">
+              <Plus />
+            </el-icon>
+            娣诲姞
+          </el-button>
+        </div>
       </div>
     </div>
     <!-- 鏂板/缂栬緫寮圭獥 -->
@@ -232,8 +338,8 @@
         <el-form-item label="鏄惁璐ㄦ"
                       prop="isQuality">
           <el-switch v-model="form.isQuality"
-                     :active-value="true"
-                     inactive-value="false" />
+                     :active-value="1"
+                     :inactive-value="0" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -247,12 +353,18 @@
     <ProductSelectDialog v-model="showProductSelectDialog"
                          @confirm="handleProductSelect"
                          single />
+    <!-- BOM浜у搧閫夋嫨瀵硅瘽妗� -->
+    <ProductSelectDialog v-model="bomDataValue.showProductDialog"
+                         @confirm="handleBomProductSelect"
+                         single />
     <!-- 鍙傛暟鍒楄〃瀵硅瘽妗� -->
     <ProcessParamListDialog v-model="showParamListDialog"
                             :title="`${currentProcess ? getProcessName(currentProcess.processId) : ''} - 鍙傛暟鍒楄〃`"
                             :route-id="routeId"
-                            :editable="false"
+                            :editable="editable"
+                            :order-id="orderId"
                             :process="currentProcess"
+                            :page-type="pageType"
                             :param-list="paramList"
                             @refresh="refreshParamList" />
   </div>
@@ -280,11 +392,16 @@
     findProductProcessRouteItemList,
     deleteRouteItem,
     addRouteItem,
+    findProcessParamListOrder,
     addOrUpdateProductProcessRouteItem,
     sortRouteItem,
   } from "@/api/productionManagement/productProcessRoute.js";
   import { processList } from "@/api/productionManagement/productionProcess.js";
-  import { queryList } from "@/api/productionManagement/productStructure.js";
+  import {
+    queryList2,
+    queryList,
+    add2,
+  } from "@/api/productionManagement/productStructure.js";
   import { useRoute } from "vue-router";
   import { ElMessageBox, ElMessage } from "element-plus";
   import Sortable from "sortablejs";
@@ -295,6 +412,7 @@
   const routeId = computed(() => route.query.id);
   const orderId = computed(() => route.query.orderId);
   const pageType = computed(() => route.query.type);
+  const editable = computed(() => route.query.editable === "true");
 
   const tableLoading = ref(false);
   const tableData = ref([]);
@@ -321,6 +439,14 @@
   const currentProcess = ref(null);
   const paramList = ref([]);
   const bomTableData = ref([]);
+  const bomFormRef = ref(null);
+  const bomDataValue = ref({
+    dataList: [],
+    showProductDialog: false,
+    currentRowName: null,
+    loading: false,
+    isEdit: false,
+  });
   let tableSortable = null;
   let cardSortable = null;
 
@@ -341,7 +467,7 @@
     productName: "",
     model: "",
     unit: "",
-    isQuality: false,
+    isQuality: 0,
   });
 
   const rules = {
@@ -401,12 +527,21 @@
       bomId: route.query.bomId || null,
       description: route.query.description || "",
     };
-
-    // 濡傛灉鏈塨omId锛岃幏鍙朆OM鏁版嵁
-    if (routeInfo.value.bomId) {
-      queryList(routeInfo.value.bomId)
+    if (pageType.value === "order") {
+      queryList2(route.query.orderId)
         .then(res => {
           if (res.data) {
+            // 涓築OM鏁版嵁璁剧疆tempId
+            const setTempIdRecursively = items => {
+              items.forEach(item => {
+                item.tempId = item.id || new Date().getTime();
+                if (item.children && item.children.length > 0) {
+                  setTempIdRecursively(item.children);
+                }
+              });
+            };
+            setTempIdRecursively(res.data);
+
             bomTableData.value = [
               {
                 bomNo: routeInfo.value.bomNo,
@@ -417,12 +552,49 @@
                 bomList: res.data,
               },
             ];
+
+            // 淇濆瓨鍘熷BOM鏁版嵁
+            bomDataValue.value.dataList = res.data;
+          }
+        })
+        .catch(err => {
+          console.error("鑾峰彇BOM鏁版嵁澶辫触锛�", err);
+        });
+    } else {
+      queryList(Number(route.query.bomId))
+        .then(res => {
+          if (res.data) {
+            // 涓築OM鏁版嵁璁剧疆tempId
+            const setTempIdRecursively = items => {
+              items.forEach(item => {
+                item.tempId = item.id || new Date().getTime();
+                if (item.children && item.children.length > 0) {
+                  setTempIdRecursively(item.children);
+                }
+              });
+            };
+            setTempIdRecursively(res.data);
+
+            bomTableData.value = [
+              {
+                bomNo: routeInfo.value.bomNo,
+                dictLabel: routeInfo.value.dictLabel,
+                productCode: "",
+                productName: routeInfo.value.productName,
+                model: routeInfo.value.model,
+                bomList: res.data,
+              },
+            ];
+
+            // 淇濆瓨鍘熷BOM鏁版嵁
+            bomDataValue.value.dataList = res.data;
           }
         })
         .catch(err => {
           console.error("鑾峰彇BOM鏁版嵁澶辫触锛�", err);
         });
     }
+    // 鑾峰彇BOM鏁版嵁锛屼娇鐢ㄦ柊鐨勬帴鍙�
   };
 
   // 鏂板
@@ -502,12 +674,10 @@
 
           const addPromise = isOrderPage
             ? addRouteItem({
-                productOrderId: orderId.value,
-                productRouteId: routeId.value,
+                orderId: orderId.value,
+                routeId: routeId.value,
                 processId: form.value.processId,
-                productModelId: form.value.productModelId,
                 isQuality: form.value.isQuality,
-                dragSort,
               })
             : addOrUpdateProcessRouteItem({
                 routeId: routeId.value,
@@ -537,7 +707,6 @@
             ? addOrUpdateProductProcessRouteItem({
                 id: form.value.id,
                 processId: form.value.processId,
-                productModelId: form.value.productModelId,
                 isQuality: form.value.isQuality,
               })
             : addOrUpdateProcessRouteItem({
@@ -583,6 +752,241 @@
   const closeDialog = () => {
     dialogVisible.value = false;
     resetForm();
+  };
+
+  // BOM鐩稿叧鏂规硶
+  // 鍒囨崲BOM缂栬緫妯″紡
+  const toggleBomEdit = () => {
+    bomDataValue.value.isEdit = !bomDataValue.value.isEdit;
+    if (!bomDataValue.value.isEdit) {
+      // 鍙栨秷缂栬緫鏃堕噸鏂板姞杞芥暟鎹�
+      getRouteInfo();
+    }
+  };
+
+  // 娣诲姞BOM椤�
+  const addBomItem = () => {
+    if (bomTableData.value.length > 0) {
+      const newItem = {
+        parentId: "",
+        parentTempId: "",
+        productName: "",
+        productId: "",
+        model: undefined,
+        productModelId: undefined,
+        processId: "",
+        processName: "",
+        unitQuantity: 0,
+        unit: "",
+        children: [],
+        tempId: new Date().getTime(),
+      };
+      bomTableData.value[0].bomList.push(newItem);
+      // 鐢变簬bomDataValue.value.dataList鍜宐omTableData.value[0].bomList鎸囧悜鍚屼竴涓暟缁勶紝涓嶉渶瑕侀噸澶嶆坊鍔�
+    }
+  };
+
+  // 娣诲姞BOM瀛愰」
+  const addBomItem2 = tempId => {
+    const addChildItem = (items, tempId) => {
+      for (let i = 0; i < items.length; i++) {
+        const item = items[i];
+        if (item.tempId === tempId) {
+          if (!item.children) {
+            item.children = [];
+          }
+          item.children.push({
+            parentId: item.id || "",
+            parentTempId: item.tempId || "",
+            productName: "",
+            productId: "",
+            model: undefined,
+            productModelId: undefined,
+            processId: "",
+            processName: "",
+            unitQuantity: 0,
+            unit: "",
+            children: [],
+            tempId: new Date().getTime(),
+          });
+          return true;
+        }
+        if (item.children && item.children.length > 0) {
+          if (addChildItem(item.children, tempId)) {
+            return true;
+          }
+        }
+      }
+      return false;
+    };
+
+    if (bomTableData.value.length > 0) {
+      addChildItem(bomTableData.value[0].bomList, tempId);
+      // 鐢变簬bomDataValue.value.dataList鍜宐omTableData.value[0].bomList鎸囧悜鍚屼竴涓暟缁勶紝涓嶉渶瑕侀噸澶嶆坊鍔�
+    }
+  };
+
+  // 鍒犻櫎BOM椤�
+  const removeBomItem = tempId => {
+    // 浠嶣OM琛ㄦ牸鏁版嵁涓垹闄�
+    if (bomTableData.value.length > 0) {
+      const removeFromList = (items, tempId) => {
+        for (let i = 0; i < items.length; i++) {
+          const item = items[i];
+          if (item.tempId === tempId) {
+            items.splice(i, 1);
+            return true;
+          }
+          if (item.children && item.children.length > 0) {
+            if (removeFromList(item.children, tempId)) {
+              return true;
+            }
+          }
+        }
+        return false;
+      };
+      removeFromList(bomTableData.value[0].bomList, tempId);
+      // 鐢变簬bomDataValue.value.dataList鍜宐omTableData.value[0].bomList鎸囧悜鍚屼竴涓暟缁勶紝涓嶉渶瑕侀噸澶嶅垹闄�
+    }
+  };
+
+  // 鎵撳紑BOM浜у搧閫夋嫨瀵硅瘽妗�
+  const openBomProductDialog = tempId => {
+    bomDataValue.value.currentRowName = tempId;
+    bomDataValue.value.showProductDialog = true;
+  };
+
+  // 澶勭悊BOM浜у搧閫夋嫨
+  const handleBomProductSelect = products => {
+    if (products && products.length > 0) {
+      const product = products[0];
+      const updateProductInfo = (items, tempId, productData) => {
+        for (let i = 0; i < items.length; i++) {
+          const item = items[i];
+          if (item.tempId === tempId) {
+            item.productName = productData.productName;
+            item.model = productData.model;
+            item.productModelId = productData.id;
+            item.unit = productData.unit || "";
+            return true;
+          }
+          if (item.children && item.children.length > 0) {
+            if (updateProductInfo(item.children, tempId, productData)) {
+              return true;
+            }
+          }
+        }
+        return false;
+      };
+
+      if (bomTableData.value.length > 0) {
+        updateProductInfo(
+          bomTableData.value[0].bomList,
+          bomDataValue.value.currentRowName,
+          product
+        );
+        // 鐢变簬bomDataValue.value.dataList鍜宐omTableData.value[0].bomList鎸囧悜鍚屼竴涓暟缁勶紝涓嶉渶瑕侀噸澶嶆洿鏂�
+      }
+      bomDataValue.value.showProductDialog = false;
+    }
+  };
+
+  // 淇濆瓨BOM鏇存敼
+  const saveBomChanges = () => {
+    // 鏍¢獙BOM鏁版嵁
+    const validateBomData = items => {
+      for (let i = 0; i < items.length; i++) {
+        const item = items[i];
+        // 鏍¢獙浜у搧鏄惁蹇呭~
+        if (!item.productModelId) {
+          ElMessage.error("璇烽�夋嫨浜у搧");
+          return false;
+        }
+        // 鏍¢獙鍗曚綅浜у嚭鎵�闇�鏁伴噺鏄惁蹇呭~
+        if (
+          item.unitQuantity === undefined ||
+          item.unitQuantity === null ||
+          item.unitQuantity === 0
+        ) {
+          ElMessage.error("璇峰~鍐欏崟浣嶄骇鍑烘墍闇�鏁伴噺");
+          return false;
+        }
+        // 閫掑綊鏍¢獙瀛愰」
+        if (item.children && item.children.length > 0) {
+          if (!validateBomData(item.children)) {
+            return false;
+          }
+        }
+      }
+      return true;
+    };
+
+    // 鎵ц鏍¢獙
+    if (bomTableData.value.length > 0) {
+      if (!validateBomData(bomTableData.value[0].bomList)) {
+        return;
+      }
+    }
+
+    // 璋冪敤鏂扮殑淇濆瓨鎺ュ彛
+    // 鍑嗗淇濆瓨鏁版嵁锛岀‘淇濇牸寮忔纭�
+    // 閫掑綊澶勭悊BOM椤瑰強鍏跺瓙椤�
+    const processBomItem = (item, parentId = null, parentTempId = null) => {
+      const cleanItem = {
+        id: item.id || null,
+        orderId: Number(orderId.value) || null,
+        parentId: parentId,
+        parentTempId: parentTempId || null,
+        productModelId: item.productModelId || null,
+        processId: item.processId || null,
+        unitQuantity: item.unitQuantity || 0,
+        demandedQuantity: item.demandedQuantity || null,
+        unit: item.unit || "",
+        tempId: item.tempId || new Date().getTime(),
+        tenantId: item.tenantId || null,
+        bomId: Number(route.query.bomId) || null,
+        children: [],
+      };
+
+      // 閫掑綊澶勭悊瀛愰」
+      if (item.children && item.children.length > 0) {
+        cleanItem.children = item.children.map(child =>
+          processBomItem(child, item.id, item.tempId || null)
+        );
+      }
+
+      return cleanItem;
+    };
+
+    const saveData = bomTableData.value[0].bomList.map(item =>
+      processBomItem(item, item.parentId, item.parentTempId || null)
+    );
+    const formData = {
+      orderId: Number(orderId.value) || null,
+      children: saveData,
+    };
+
+    add2(formData)
+      .then(res => {
+        if (res.code === 200) {
+          ElMessage.success("BOM淇濆瓨鎴愬姛");
+          bomDataValue.value.isEdit = false;
+          // 閲嶆柊鍔犺浇鏁版嵁浠ヨ幏鍙栨渶鏂扮姸鎬�
+          getRouteInfo();
+        } else {
+          ElMessage.error("BOM淇濆瓨澶辫触锛�" + (res.msg || "鏈煡閿欒"));
+        }
+      })
+      .catch(err => {
+        console.error("淇濆瓨BOM鏁版嵁澶辫触锛�", err);
+        ElMessage.error("BOM淇濆瓨澶辫触锛氱綉缁滈敊璇�");
+      });
+  };
+
+  // 鍙栨秷BOM缂栬緫
+  const cancelBomEdit = () => {
+    bomDataValue.value.isEdit = false;
+    getRouteInfo();
   };
 
   // 鍒濆鍖栨嫋鎷芥帓搴�
@@ -660,6 +1064,7 @@
         ghostClass: "sortable-ghost",
         handle: ".process-card",
         filter: ".el-button",
+        delay: 500, // 闀挎寜500姣鍚庡紑濮嬫嫋鎷�
         onEnd: evt => {
           if (evt.oldIndex === evt.newIndex || !tableData.value[evt.oldIndex])
             return;
@@ -730,50 +1135,96 @@
   const handleViewParams = process => {
     currentProcess.value = process;
     // 璋冪敤API鑾峰彇鍙傛暟鍒楄〃
-    getProcessParamList({
-      routeItemId: process.id,
-      pageNum: 1,
-      pageSize: 1000,
-    })
-      .then(res => {
-        if (res.code === 200) {
-          paramList.value = res.data?.records || [];
-        } else {
-          ElMessage.error(res.msg || "鑾峰彇鍙傛暟鍒楄〃澶辫触");
-          paramList.value = [];
-        }
-        showParamListDialog.value = true;
+    if (pageType.value === "order") {
+      findProcessParamListOrder({
+        orderId: orderId.value,
+        routeItemId: process.id,
+        pageNum: 1,
+        pageSize: 1000,
       })
-      .catch(err => {
-        console.error("鑾峰彇鍙傛暟鍒楄〃澶辫触锛�", err);
-        ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
-        paramList.value = [];
-        showParamListDialog.value = true;
-      });
+        .then(res => {
+          if (res.code === 200) {
+            paramList.value = res.data || [];
+          } else {
+            ElMessage.error(res.msg || "鑾峰彇鍙傛暟鍒楄〃澶辫触");
+            paramList.value = [];
+          }
+          showParamListDialog.value = true;
+        })
+        .catch(err => {
+          console.error("鑾峰彇鍙傛暟鍒楄〃澶辫触锛�", err);
+          ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
+          paramList.value = [];
+          showParamListDialog.value = true;
+        });
+    } else {
+      getProcessParamList({
+        routeItemId: process.id,
+        pageNum: 1,
+        pageSize: 1000,
+      })
+        .then(res => {
+          if (res.code === 200) {
+            paramList.value = res.data?.records || [];
+          } else {
+            ElMessage.error(res.msg || "鑾峰彇鍙傛暟鍒楄〃澶辫触");
+            paramList.value = [];
+          }
+          showParamListDialog.value = true;
+        })
+        .catch(err => {
+          console.error("鑾峰彇鍙傛暟鍒楄〃澶辫触锛�", err);
+          ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
+          paramList.value = [];
+          showParamListDialog.value = true;
+        });
+    }
   };
 
   // 鍒锋柊鍙傛暟鍒楄〃
   const refreshParamList = () => {
     if (!currentProcess.value) return;
     // 閲嶆柊璋冪敤API鑾峰彇鍙傛暟鍒楄〃
-    getProcessParamList({
-      routeItemId: currentProcess.value.id,
-      pageNum: 1,
-      pageSize: 1000,
-    })
-      .then(res => {
-        if (res.code === 200) {
-          paramList.value = res.data?.records || [];
-        } else {
-          ElMessage.error(res.msg || "鑾峰彇鍙傛暟鍒楄〃澶辫触");
-          paramList.value = [];
-        }
+    if (pageType.value === "order") {
+      findProcessParamListOrder({
+        orderId: orderId.value,
+        routeItemId: currentProcess.value.id,
+        pageNum: 1,
+        pageSize: 1000,
       })
-      .catch(err => {
-        console.error("鑾峰彇鍙傛暟鍒楄〃澶辫触锛�", err);
-        ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
-        paramList.value = [];
-      });
+        .then(res => {
+          if (res.code === 200) {
+            paramList.value = res.data || [];
+          } else {
+            ElMessage.error(res.msg || "鑾峰彇鍙傛暟鍒楄〃澶辫触");
+            paramList.value = [];
+          }
+        })
+        .catch(err => {
+          console.error("鑾峰彇鍙傛暟鍒楄〃澶辫触锛�", err);
+          ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
+          paramList.value = [];
+        });
+    } else {
+      getProcessParamList({
+        routeItemId: currentProcess.value.id,
+        pageNum: 1,
+        pageSize: 1000,
+      })
+        .then(res => {
+          if (res.code === 200) {
+            paramList.value = res.data?.records || [];
+          } else {
+            ElMessage.error(res.msg || "鑾峰彇鍙傛暟鍒楄〃澶辫触");
+            paramList.value = [];
+          }
+        })
+        .catch(err => {
+          console.error("鑾峰彇鍙傛暟鍒楄〃澶辫触锛�", err);
+          ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
+          paramList.value = [];
+        });
+    }
   };
 
   onUnmounted(() => {
@@ -790,10 +1241,10 @@
 
   .cards-wrapper {
     display: flex;
-    gap: 16px;
+    gap: 24px;
     overflow-x: auto;
     padding: 10px 0;
-    min-height: 200px;
+    /* min-height: 250px; */
   }
 
   .cards-wrapper::-webkit-scrollbar {
@@ -816,11 +1267,12 @@
 
   .process-card {
     flex-shrink: 0;
-    width: 220px;
+    /* width: 300px; */
     background: #fff;
-    border-radius: 8px;
-    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-    padding: 16px;
+    border-radius: 12px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+    /* padding: 30px 24px; */
+    padding: 25px 50px;
     display: flex;
     flex-direction: column;
     cursor: move;
@@ -828,45 +1280,45 @@
   }
 
   .process-card:hover {
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
-    transform: translateY(-2px);
+    box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12);
+    transform: translateY(-4px);
   }
 
   .card-header {
     text-align: center;
-    margin-bottom: 12px;
+    margin-bottom: 20px;
   }
 
   .card-number {
-    width: 36px;
-    height: 36px;
-    line-height: 36px;
+    width: 60px;
+    height: 60px;
+    line-height: 60px;
     border-radius: 50%;
     background: #409eff;
     color: #fff;
     font-weight: bold;
-    font-size: 16px;
-    margin: 0 auto 8px;
+    font-size: 20px;
+    margin: 0 auto 16px;
   }
 
   .card-process-name {
-    font-size: 14px;
+    font-size: 18px;
     color: #333;
-    font-weight: 500;
+    font-weight: 600;
     word-break: break-all;
   }
 
   .card-content {
     flex: 1;
-    margin-bottom: 12px;
-    min-height: 60px;
+    margin-bottom: 20px;
+    min-height: 80px;
     display: flex;
     align-items: center;
     justify-content: center;
   }
 
   .product-info {
-    font-size: 13px;
+    font-size: 14px;
     color: #666;
     text-align: center;
     width: 100%;
@@ -879,7 +1331,7 @@
   }
 
   .product-name {
-    margin-bottom: 6px;
+    margin-bottom: 8px;
     word-break: break-all;
     line-height: 1.5;
     text-align: center;
@@ -887,7 +1339,7 @@
 
   .product-model {
     color: #909399;
-    font-size: 12px;
+    font-size: 13px;
     word-break: break-all;
     line-height: 1.5;
     text-align: center;
@@ -899,19 +1351,32 @@
   }
 
   .product-tag {
-    margin: 10px 0;
+    margin: 12px 0;
   }
 
   .card-footer {
     display: flex;
-    justify-content: space-around;
-    padding-top: 12px;
+    justify-content: center;
+    gap: 20px;
+    padding-top: 16px;
     border-top: 1px solid #f0f0f0;
   }
 
   .card-footer .el-button {
     padding: 0;
-    font-size: 12px;
+    font-size: 14px;
+  }
+
+  .card-footer .el-button:nth-child(1) {
+    color: #409eff;
+  }
+
+  .card-footer .el-button:nth-child(2) {
+    color: #67c23a;
+  }
+
+  .card-footer .el-button:nth-child(3) {
+    color: #f56c6c;
   }
 
   :deep(.sortable-ghost) {
@@ -965,6 +1430,12 @@
   .section-actions {
     display: flex;
     align-items: center;
+  }
+  .sort-tip {
+    font-size: 12px;
+    color: #909399;
+    margin-left: 8px;
+    margin-right: 20px;
   }
 
   /* 宸ヨ壓璺嚎淇℃伅鍗$墖鏍峰紡 */
@@ -1043,3 +1514,11 @@
     word-break: break-all;
   }
 </style>
+<style scoped>
+  .hover-effect:hover {
+    border-color: #409eff;
+    background-color: #ecf5ff;
+    transform: translateY(-2px);
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3