From 8ba79292b0a1b6a8f93ca00432c6f2db827b1a93 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 19 三月 2026 17:32:29 +0800
Subject: [PATCH] 。

---
 src/views/productionManagement/productionProcess/index.vue             |   71 ++-
 src/views/productionManagement/processRoute/index.vue                  |   33 +
 src/views/basicData/product/index.vue                                  |    4 
 src/views/productionManagement/processRoute/processRouteItem/index.vue |  218 ++++++++----
 src/components/ProcessParamListDialog.vue                              |  210 ++++++++---
 src/api/productionManagement/productionOrder.js                        |    2 
 src/components/PIMTable/PIMTable.vue                                   |    7 
 src/views/energyManagement/officeEnergyConsumption/index.vue           |    1 
 src/api/productionManagement/productProcessRoute.js                    |   49 ++
 src/views/productionManagement/productStructure/Detail/index.vue       |    4 
 src/api/productionManagement/processRouteItem.js                       |    2 
 src/views/productionManagement/productionOrder/index.vue               |  336 ++++++++++++------
 src/views/productionPlan/productionPlan/index.vue                      |  123 ++++--
 src/views/energyManagement/productionEnergyConsumption/index.vue       |    1 
 src/views/productionManagement/processRoute/index2.vue                 |   10 
 15 files changed, 750 insertions(+), 321 deletions(-)

diff --git a/src/api/productionManagement/processRouteItem.js b/src/api/productionManagement/processRouteItem.js
index e19556b..d8c16a1 100644
--- a/src/api/productionManagement/processRouteItem.js
+++ b/src/api/productionManagement/processRouteItem.js
@@ -60,7 +60,7 @@
     data: data,
   });
 }
-// 宸ヨ壓璺嚎鍙傛暟淇敼
+// 宸ヨ壓璺嚎鍙傛暟鍒犻櫎
 export function delProcessRouteItemParam(id) {
   return request({
     url: `/ProcessRouteItemParam/remove/${id}`,
diff --git a/src/api/productionManagement/productProcessRoute.js b/src/api/productionManagement/productProcessRoute.js
index e8d5da5..c7fb302 100644
--- a/src/api/productionManagement/productProcessRoute.js
+++ b/src/api/productionManagement/productProcessRoute.js
@@ -4,16 +4,24 @@
 // 鍒楄〃鏌ヨ
 export function findProductProcessRouteItemList(query) {
   return request({
-    url: "/productProcessRoute/list",
+    url: `/processRouteItemInstance/list/${query.orderId}`,
     method: "get",
     params: query,
   });
 }
+// 鍒楄〃鏌ヨ-鐢熶骇璁㈠崟
+export function findProcessRouteItemInstanceList(query) {
+  return request({
+    url: `/processRouteItemInstance/list/${query.orderId}`,
+    method: "get",
+  });
+}
+
 
 export function addOrUpdateProductProcessRouteItem(data) {
   return request({
-    url: "/productProcessRoute/updateRouteItem",
-    method: "post",
+    url: "/processRouteItemInstance/update",
+    method: "put",
     data: data,
   });
 }
@@ -21,7 +29,7 @@
 // 鐢熶骇璁㈠崟涓嬶細鏂板宸ヨ壓璺嚎椤圭洰
 export function addRouteItem(data) {
   return request({
-    url: "/productProcessRoute/addRouteItem",
+    url: "/processRouteItemInstance/add",
     method: "post",
     data,
   });
@@ -39,7 +47,7 @@
 // 鍒犻櫎宸ヨ壓璺嚎椤圭洰锛堣矾鐢卞悗鎷兼帴 id锛�
 export function deleteRouteItem(id) {
   return request({
-    url: `/productProcessRoute/deleteRouteItem/${id}`,
+    url: `/processRouteItemInstance/delete/${id}`,
     method: "delete",
   });
 }
@@ -52,3 +60,34 @@
     data,
   });
 }
+// 鑾峰彇宸ュ簭鍙傛暟鍒楄〃-鐢熶骇璁㈠崟
+export function findProcessParamListOrder(query) {
+  return request({
+    url: `/processRouteItemParamInstance/list`,
+    method: "get",
+    params: query,
+  });
+}
+// 宸ヨ壓璺嚎鍙傛暟鏂板-鐢熶骇璁㈠崟
+export function addProcessRouteItemParamOrder(data) {
+  return request({
+    url: "/processRouteItemParamInstance/add",
+    method: "post",
+    data: data,
+  });
+}
+// 宸ヨ壓璺嚎鍙傛暟淇敼-鐢熶骇璁㈠崟
+export function editProcessRouteItemParamOrder(data) {
+  return request({
+    url: "/processRouteItemParamInstance/update",
+    method: "put",
+    data: data,
+  });
+}
+// 宸ヨ壓璺嚎鍙傛暟鍒犻櫎-鐢熶骇璁㈠崟
+export function delProcessRouteItemParamOrder(id) {
+  return request({
+    url: `/processRouteItemParamInstance/delete/${id}`,
+    method: "delete",
+  });
+}
\ No newline at end of file
diff --git a/src/api/productionManagement/productionOrder.js b/src/api/productionManagement/productionOrder.js
index 6c8dbe2..28cbb51 100644
--- a/src/api/productionManagement/productionOrder.js
+++ b/src/api/productionManagement/productionOrder.js
@@ -30,7 +30,7 @@
 // 鐢熶骇璁㈠崟-缁戝畾宸ヨ壓璺嚎
 export function bindingRoute(data) {
   return request({
-    url: "/productOrder/bindingRoute",
+    url: "/appendix/bindingRoute",
     method: "post",
     data,
   });
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index 629e972..6fee5d6 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -22,7 +22,8 @@
     <el-table-column align="center"
                      type="selection"
                      width="55"
-                     v-if="isSelection" />
+                     v-if="isSelection"
+                     :selectable="selectable" />
     <el-table-column align="center"
                      label="搴忓彿"
                      type="index"
@@ -311,6 +312,10 @@
       type: [String, Object],
       default: () => ({ width: "100%" }),
     },
+    selectable: {
+      type: Function,
+      default: () => true,
+    },
   });
 
   // Data
diff --git a/src/components/ProcessParamListDialog.vue b/src/components/ProcessParamListDialog.vue
index 3b9f158..5d76781 100644
--- a/src/components/ProcessParamListDialog.vue
+++ b/src/components/ProcessParamListDialog.vue
@@ -152,7 +152,9 @@
                         placeholder="璇疯緭鍏ユ帓搴�" />
             </el-form-item>
             <el-form-item label="鏄惁蹇呭~">
-              <el-switch v-model="selectedParam.isRequired" />
+              <el-switch :active-value="true"
+                         :inactive-value="false"
+                         v-model="selectedParam.isRequired" />
             </el-form-item>
           </el-form>
           <el-empty v-else
@@ -235,6 +237,12 @@
     editProcessRouteItemParam,
     addProcessRouteItemParam,
   } from "@/api/productionManagement/processRouteItem.js";
+  import {
+    addProcessRouteItemParamOrder,
+    delProcessRouteItemParamOrder,
+    editProcessRouteItemParamOrder,
+  } from "@/api/productionManagement/productProcessRoute.js";
+
   import { getBaseParamList } from "@/api/basicData/parameterMaintenance.js";
 
   const props = defineProps({
@@ -261,6 +269,14 @@
     editable: {
       type: Boolean,
       default: true,
+    },
+    orderId: {
+      type: Number,
+      default: 0,
+    },
+    pageType: {
+      type: String,
+      default: "route",
     },
   });
 
@@ -292,7 +308,7 @@
     minValue: null,
     maxValue: null,
     sort: 1,
-    isRequired: 0,
+    isRequired: false,
     paramType: null,
     paramFormat: "",
     unit: "",
@@ -326,7 +342,7 @@
       minValue: param.minValue,
       maxValue: param.maxValue,
       sort: param.sort || 1,
-      isRequired: param.isRequired || 0,
+      isRequired: param.isRequired || false,
       paramType: param.parameterType || param.paramType,
       paramFormat: param.parameterFormat || param.paramFormat,
       unit: param.unit || param.unit,
@@ -343,15 +359,27 @@
     })
       .then(() => {
         // 璋冪敤API鍒犻櫎鍙傛暟
-        delProcessRouteItemParam(param.id)
-          .then(res => {
-            ElMessage.success("鍒犻櫎鎴愬姛");
-            emit("refresh");
-          })
-          .catch(err => {
-            ElMessage.error("鍒犻櫎鍙傛暟澶辫触");
-            console.error("鍒犻櫎鍙傛暟澶辫触锛�", err);
-          });
+        if (props.pageType === "order") {
+          delProcessRouteItemParamOrder(param.id)
+            .then(res => {
+              ElMessage.success("鍒犻櫎鎴愬姛");
+              emit("refresh");
+            })
+            .catch(err => {
+              ElMessage.error("鍒犻櫎鍙傛暟澶辫触");
+              console.error("鍒犻櫎鍙傛暟澶辫触锛�", err);
+            });
+        } else {
+          delProcessRouteItemParam(param.id)
+            .then(res => {
+              ElMessage.success("鍒犻櫎鎴愬姛");
+              emit("refresh");
+            })
+            .catch(err => {
+              ElMessage.error("鍒犻櫎鍙傛暟澶辫触");
+              console.error("鍒犻櫎鍙傛暟澶辫触锛�", err);
+            });
+        }
       })
       .catch(() => {});
   };
@@ -390,31 +418,62 @@
     }
 
     // 鍒ゆ柇鍙傛暟绫诲瀷锛屽彧鏈夋暟鍊肩被鍨嬫墠浼犳爣鍑嗗�笺�佹渶澶у�煎拰鏈�灏忓��
-    const isNumericMode = selectedParam.value.valueMode === 1;
-
+    const isNumericMode = selectedParam.value.paramType == 1;
+    console.log(isNumericMode, "isNumericMode");
     // 璋冪敤API鏂板鍙傛暟
-    addProcessRouteItemParam({
-      routeItemId: props.process.id,
-      paramId: selectedParam.value.id,
-      standardValue: isNumericMode ? selectedParam.value.standardValue || "" : "",
-      minValue: isNumericMode ? selectedParam.value.minValue || 0 : null,
-      maxValue: isNumericMode ? selectedParam.value.maxValue || 0 : null,
-      isRequired: selectedParam.value.isRequired || 0,
-      sort: selectedParam.value.sort || 1,
-    })
-      .then(res => {
-        if (res.code === 200) {
-          ElMessage.success("娣诲姞鍙傛暟鎴愬姛");
-          selectParamDialogVisible.value = false;
-          emit("refresh");
-        } else {
-          ElMessage.error(res.msg || "娣诲姞鍙傛暟澶辫触");
-        }
+    if (props.pageType === "order") {
+      addProcessRouteItemParamOrder({
+        orderId: Number(props.orderId),
+        processId: props.process.id,
+        routeItemId: Number(props.routeId),
+        paramId: selectedParam.value.id,
+        standardValue: isNumericMode
+          ? selectedParam.value.standardValue || ""
+          : "",
+        minValue: isNumericMode ? selectedParam.value.minValue || 0 : null,
+        maxValue: isNumericMode ? selectedParam.value.maxValue || 0 : null,
+        isRequired: selectedParam.value.isRequired || false,
+        sort: selectedParam.value.sort || 1,
       })
-      .catch(err => {
-        ElMessage.error("娣诲姞鍙傛暟澶辫触");
-        console.error("娣诲姞鍙傛暟澶辫触锛�", err);
-      });
+        .then(res => {
+          if (res.code === 200) {
+            ElMessage.success("娣诲姞鍙傛暟鎴愬姛");
+            selectParamDialogVisible.value = false;
+            emit("refresh");
+          } else {
+            ElMessage.error(res.msg || "娣诲姞鍙傛暟澶辫触");
+          }
+        })
+        .catch(err => {
+          ElMessage.error("娣诲姞鍙傛暟澶辫触");
+          console.error("娣诲姞鍙傛暟澶辫触锛�", err);
+        });
+    } else {
+      addProcessRouteItemParam({
+        routeItemId: props.process.id,
+        paramId: selectedParam.value.id,
+        standardValue: isNumericMode
+          ? selectedParam.value.standardValue || ""
+          : "",
+        minValue: isNumericMode ? selectedParam.value.minValue || 0 : null,
+        maxValue: isNumericMode ? selectedParam.value.maxValue || 0 : null,
+        isRequired: selectedParam.value.isRequired || false,
+        sort: selectedParam.value.sort || 1,
+      })
+        .then(res => {
+          if (res.code === 200) {
+            ElMessage.success("娣诲姞鍙傛暟鎴愬姛");
+            selectParamDialogVisible.value = false;
+            emit("refresh");
+          } else {
+            ElMessage.error(res.msg || "娣诲姞鍙傛暟澶辫触");
+          }
+        })
+        .catch(err => {
+          ElMessage.error("娣诲姞鍙傛暟澶辫触");
+          console.error("娣诲姞鍙傛暟澶辫触锛�", err);
+        });
+    }
   };
 
   // 鎻愪氦缂栬緫鍙傛暟
@@ -423,33 +482,60 @@
     editParamFormRef.value.validate(valid => {
       if (valid) {
         // 鍒ゆ柇鍙傛暟绫诲瀷锛屽彧鏈夋暟鍊肩被鍨嬫墠浼犳爣鍑嗗�笺�佹渶澶у�煎拰鏈�灏忓��
-        const isNumericMode = editParamForm.value.valueMode == 1;
-
-        // 璋冪敤API淇敼鍙傛暟
-        editProcessRouteItemParam({
-          id: editParamForm.value.id,
-          routeItemId: props.process.id,
-          paramId: editParamForm.value.paramId,
-          standardValue: isNumericMode
-            ? editParamForm.value.standardValue || ""
-            : "",
-          minValue: isNumericMode ? editParamForm.value.minValue || 0 : null,
-          maxValue: isNumericMode ? editParamForm.value.maxValue || 0 : null,
-          isRequired: editParamForm.value.isRequired || 0,
-        })
-          .then(res => {
-            if (res.code === 200) {
-              ElMessage.success("缂栬緫鎴愬姛");
-              editParamDialogVisible.value = false;
-              emit("refresh");
-            } else {
-              ElMessage.error(res.msg || "缂栬緫澶辫触");
-            }
+        const isNumericMode = editParamForm.value.paramType == 1;
+        console.log(isNumericMode, "isNumericMode");
+        if (props.pageType === "order") {
+          editProcessRouteItemParamOrder({
+            id: editParamForm.value.id,
+            // routeItemId: props.process.id,
+            // paramId: editParamForm.value.paramId,
+            standardValue: isNumericMode
+              ? editParamForm.value.standardValue || ""
+              : "",
+            minValue: isNumericMode ? editParamForm.value.minValue || 0 : null,
+            maxValue: isNumericMode ? editParamForm.value.maxValue || 0 : null,
+            isRequired: editParamForm.value.isRequired || false,
           })
-          .catch(err => {
-            ElMessage.error("缂栬緫鍙傛暟澶辫触");
-            console.error("缂栬緫鍙傛暟澶辫触锛�", err);
-          });
+            .then(res => {
+              if (res.code === 200) {
+                ElMessage.success("缂栬緫鎴愬姛");
+                editParamDialogVisible.value = false;
+                emit("refresh");
+              } else {
+                ElMessage.error(res.msg || "缂栬緫澶辫触");
+              }
+            })
+            .catch(err => {
+              ElMessage.error("缂栬緫鍙傛暟澶辫触");
+              console.error("缂栬緫鍙傛暟澶辫触锛�", err);
+            });
+        } else {
+          // 璋冪敤API淇敼鍙傛暟
+          editProcessRouteItemParam({
+            id: editParamForm.value.id,
+            routeItemId: props.process.id,
+            paramId: editParamForm.value.paramId,
+            standardValue: isNumericMode
+              ? editParamForm.value.standardValue || ""
+              : "",
+            minValue: isNumericMode ? editParamForm.value.minValue || 0 : null,
+            maxValue: isNumericMode ? editParamForm.value.maxValue || 0 : null,
+            isRequired: editParamForm.value.isRequired || false,
+          })
+            .then(res => {
+              if (res.code === 200) {
+                ElMessage.success("缂栬緫鎴愬姛");
+                editParamDialogVisible.value = false;
+                emit("refresh");
+              } else {
+                ElMessage.error(res.msg || "缂栬緫澶辫触");
+              }
+            })
+            .catch(err => {
+              ElMessage.error("缂栬緫鍙傛暟澶辫触");
+              console.error("缂栬緫鍙傛暟澶辫触锛�", err);
+            });
+        }
       }
     });
   };
@@ -497,7 +583,7 @@
           minValue: null,
           maxValue: null,
           sort: 1,
-          isRequired: 0,
+          isRequired: false,
           paramType: null,
           paramFormat: "",
           unit: "",
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index 45931bc..954d01e 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -913,8 +913,8 @@
     gap: 20px;
   }
   .left {
-    width: 465px;
-    min-width: 465px;
+    width: 35%;
+    min-width: 35%;
     background: #ffffff;
     border-radius: 8px;
     box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
diff --git a/src/views/energyManagement/officeEnergyConsumption/index.vue b/src/views/energyManagement/officeEnergyConsumption/index.vue
index 0def5d5..71ceb18 100644
--- a/src/views/energyManagement/officeEnergyConsumption/index.vue
+++ b/src/views/energyManagement/officeEnergyConsumption/index.vue
@@ -1049,7 +1049,6 @@
   }
   .search_form {
     :deep(.el-form-item) {
-      margin-bottom: 0px !important;
     }
   }
 </style>
diff --git a/src/views/energyManagement/productionEnergyConsumption/index.vue b/src/views/energyManagement/productionEnergyConsumption/index.vue
index cf8784f..00f4cac 100644
--- a/src/views/energyManagement/productionEnergyConsumption/index.vue
+++ b/src/views/energyManagement/productionEnergyConsumption/index.vue
@@ -1049,7 +1049,6 @@
   }
   .search_form {
     :deep(.el-form-item) {
-      margin-bottom: 0px !important;
     }
   }
 </style>
diff --git a/src/views/productionManagement/processRoute/index.vue b/src/views/productionManagement/processRoute/index.vue
index 2ba70f2..628c5e3 100644
--- a/src/views/productionManagement/processRoute/index.vue
+++ b/src/views/productionManagement/processRoute/index.vue
@@ -15,6 +15,18 @@
                        :value="option.dictCode" />
           </el-select>
         </el-form-item>
+        <el-form-item label="鐘舵��:">
+          <el-select v-model="searchForm.status"
+                     style="width: 200px;"
+                     placeholder="璇烽�夋嫨鐘舵��"
+                     clearable
+                     @change="handleQuery">
+            <el-option label="宸叉壒鍑�"
+                       :value="true" />
+            <el-option label="鑽夌"
+                       :value="false" />
+          </el-select>
+        </el-form-item>
         <el-form-item>
           <el-button type="primary"
                      @click="handleQuery">鎼滅储</el-button>
@@ -73,6 +85,7 @@
   const data = reactive({
     searchForm: {
       dictCode: "",
+      status: "",
     },
   });
   const { searchForm } = toRefs(data);
@@ -82,6 +95,26 @@
       prop: "processRouteCode",
     },
     {
+      label: "鐘舵��",
+      prop: "status",
+      dataType: "tag",
+
+      formatData: params => {
+        if (params) {
+          return "宸叉壒鍑�";
+        } else {
+          return "鑽夌";
+        }
+      },
+      formatType: params => {
+        if (params) {
+          return "success";
+        } else {
+          return "info";
+        }
+      },
+    },
+    {
       label: "浜у搧绫诲瀷",
       prop: "dictLabel",
     },
diff --git a/src/views/productionManagement/processRoute/index2.vue b/src/views/productionManagement/processRoute/index2.vue
index 40ab129..71fe53c 100644
--- a/src/views/productionManagement/processRoute/index2.vue
+++ b/src/views/productionManagement/processRoute/index2.vue
@@ -397,8 +397,8 @@
             </el-form-item>
             <el-form-item label="鏄惁璐ㄦ">
               <el-tag size="small"
-                      :type="selectedProcessItem.isQuality ? 'success' : 'info'">
-                {{ selectedProcessItem.isQuality ? '璐ㄦ' : '闈炶川妫�' }}
+                      :type="selectedProcessItem.isQuality == 1 ? 'success' : 'info'">
+                {{ selectedProcessItem.isQuality == 1 ? '璐ㄦ' : '闈炶川妫�' }}
               </el-tag>
             </el-form-item>
             <el-form-item label="浜у搧鍚嶇О"
@@ -420,8 +420,8 @@
             <el-form-item label="鏄惁璐ㄦ"
                           prop="isQuality">
               <el-switch v-model="processForm.isQuality"
-                         :active-value="true"
-                         inactive-value="false" />
+                         :active-value="1"
+                         :inactive-value="0" />
             </el-form-item>
           </el-form>
           <el-empty v-else
@@ -1366,7 +1366,7 @@
     processForm.productName = "";
     processForm.productModelName = "";
     processForm.unit = "";
-    processForm.isQuality = row.isQuality || false;
+    processForm.isQuality = row.isQuality || 0;
   };
 
   // 澶勭悊宸ュ簭閫夋嫨鏃剁殑浜у搧閫夋嫨
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index cd9260a..2a5186c 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"
@@ -232,8 +234,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>
@@ -251,8 +253,10 @@
     <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,6 +284,7 @@
     findProductProcessRouteItemList,
     deleteRouteItem,
     addRouteItem,
+    findProcessParamListOrder,
     addOrUpdateProductProcessRouteItem,
     sortRouteItem,
   } from "@/api/productionManagement/productProcessRoute.js";
@@ -295,6 +300,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([]);
@@ -341,7 +347,7 @@
     productName: "",
     model: "",
     unit: "",
-    isQuality: false,
+    isQuality: 0,
   });
 
   const rules = {
@@ -502,12 +508,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 +541,6 @@
             ? addOrUpdateProductProcessRouteItem({
                 id: form.value.id,
                 processId: form.value.processId,
-                productModelId: form.value.productModelId,
                 isQuality: form.value.isQuality,
               })
             : addOrUpdateProcessRouteItem({
@@ -660,6 +663,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 +734,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 +840,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 +866,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 +879,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 +930,7 @@
   }
 
   .product-name {
-    margin-bottom: 6px;
+    margin-bottom: 8px;
     word-break: break-all;
     line-height: 1.5;
     text-align: center;
@@ -887,7 +938,7 @@
 
   .product-model {
     color: #909399;
-    font-size: 12px;
+    font-size: 13px;
     word-break: break-all;
     line-height: 1.5;
     text-align: center;
@@ -899,19 +950,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) {
@@ -966,6 +1030,12 @@
     display: flex;
     align-items: center;
   }
+  .sort-tip {
+    font-size: 12px;
+    color: #909399;
+    margin-left: 8px;
+    margin-right: 20px;
+  }
 
   /* 宸ヨ壓璺嚎淇℃伅鍗$墖鏍峰紡 */
   .route-info-card {
diff --git a/src/views/productionManagement/productStructure/Detail/index.vue b/src/views/productionManagement/productStructure/Detail/index.vue
index e26b502..07a8db5 100644
--- a/src/views/productionManagement/productStructure/Detail/index.vue
+++ b/src/views/productionManagement/productStructure/Detail/index.vue
@@ -144,9 +144,9 @@
       <el-table-column label="浜у搧绫诲瀷"
                        prop="dictLabel" />
     </el-table>
-    <div v-if="dataValue.isEdit && dataValue.dataList.length == 0"
+    <div v-if="dataValue.isEdit"
          style="text-align: center;border: 1px solid #e4e7ed;padding: 10px;transition: all 0.3s ease;cursor: pointer;"
-         :class="{'hover-effect': dataValue.isEdit && dataValue.dataList.length == 0}">
+         :class="{'hover-effect': dataValue.isEdit}">
       <el-button type="primary"
                  text
                  @click="addItem">
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 761139e..a306bff 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -3,24 +3,8 @@
     <div class="search_form">
       <el-form :model="searchForm"
                :inline="true">
-        <el-form-item label="瀹㈡埛鍚嶇О:">
-          <el-input v-model="searchForm.customerName"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 160px;"
-                    @change="handleQuery" />
-        </el-form-item>
-        <el-form-item label="鍚堝悓鍙�:">
-          <el-input v-model="searchForm.salesContractNo"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 160px;"
-                    @change="handleQuery" />
-        </el-form-item>
         <el-form-item label="浜у搧鍚嶇О:">
-          <el-input v-model="searchForm.productCategory"
+          <el-input v-model="searchForm.productName"
                     placeholder="璇疯緭鍏�"
                     clearable
                     prefix-icon="Search"
@@ -28,21 +12,34 @@
                     @change="handleQuery" />
         </el-form-item>
         <el-form-item label="瑙勬牸:">
-          <el-input v-model="searchForm.specificationModel"
+          <el-input v-model="searchForm.model"
                     placeholder="璇疯緭鍏�"
                     clearable
                     prefix-icon="Search"
                     style="width: 160px;"
                     @change="handleQuery" />
         </el-form-item>
+        <el-form-item label="鐘舵��:">
+          <el-select v-model="searchForm.status"
+                     placeholder="璇烽�夋嫨"
+                     style="width: 160px;"
+                     @change="handleQuery">
+            <el-option v-for="item in statusOptions"
+                       :key="item.value"
+                       :label="item.label"
+                       :value="item.value" />
+          </el-select>
+        </el-form-item>
         <el-form-item>
           <el-button type="primary"
                      @click="handleQuery">鎼滅储</el-button>
+          <el-button type="primary"
+                     @click="handleReset">閲嶇疆</el-button>
         </el-form-item>
       </el-form>
       <div>
-        <el-button type="primary" @click="isShowNewModal = true">鏂板</el-button>
-        <el-button type="danger" @click="handleDelete">鍒犻櫎</el-button>
+        <el-button type="danger"
+                   @click="handleDelete">閫�鍥�</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
       </div>
     </div>
@@ -54,14 +51,13 @@
                 :tableLoading="tableLoading"
                 :row-class-name="tableRowClassName"
                 :isSelection="true"
+                :selectable="row => row.status != 4"
                 @selection-change="handleSelectionChange"
                 @pagination="pagination">
         <template #completionStatus="{ row }">
-          <el-progress
-            :percentage="toProgressPercentage(row?.completionStatus)"
-            :color="progressColor(toProgressPercentage(row?.completionStatus))"
-            :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''"
-          />
+          <el-progress :percentage="toProgressPercentage(row?.completionStatus)"
+                       :color="progressColor(toProgressPercentage(row?.completionStatus))"
+                       :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" />
         </template>
       </PIMTable>
     </div>
@@ -90,10 +86,9 @@
         </span>
       </template>
     </el-dialog>
-
     <new-product-order v-if="isShowNewModal"
-                         v-model:visible="isShowNewModal"
-                         @completed="handleQuery" />
+                       v-model:visible="isShowNewModal"
+                       @completed="handleQuery" />
   </div>
 </template>
 
@@ -102,16 +97,21 @@
   import { ElMessageBox } from "element-plus";
   import dayjs from "dayjs";
   import { useRouter } from "vue-router";
+  import { getDicts } from "@/api/system/dict/data";
   import {
     productOrderListPage,
     listProcessRoute,
     bindingRoute,
-    listProcessBom, delProductOrder,
+    listProcessBom,
+    delProductOrder,
   } from "@/api/productionManagement/productionOrder.js";
+  import { listPage } from "@/api/productionManagement/processRoute.js";
   import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
-  import {fileDel} from "@/api/financialManagement/revenueManagement.js";
+  import { fileDel } from "@/api/financialManagement/revenueManagement.js";
   import PIMTable from "@/components/PIMTable/PIMTable.vue";
-  const NewProductOrder = defineAsyncComponent(() => import("@/views/productionManagement/productionOrder/New.vue"));
+  const NewProductOrder = defineAsyncComponent(() =>
+    import("@/views/productionManagement/productionOrder/New.vue")
+  );
 
   const { proxy } = getCurrentInstance();
 
@@ -120,34 +120,54 @@
 
   const tableColumn = ref([
     {
+      label: "鐘舵��",
+      prop: "status",
+      dataType: "tag",
+
+      formatData: val => {
+        const statusMap = {
+          1: "寰呭紑濮�",
+          2: "杩涜涓�",
+          3: "宸插畬鎴�",
+          4: "宸插彇娑�",
+        };
+        return statusMap[val] || "";
+      },
+      formatType: val => {
+        const statusMap = {
+          1: "error",
+          2: "warning",
+          3: "success",
+          4: "info",
+        };
+        return statusMap[val] || "info";
+      },
+      width: 100,
+    },
+    {
       label: "鐢熶骇璁㈠崟鍙�",
       prop: "npsNo",
-      width: '120px',
-    },
-    {
-      label: "閿�鍞悎鍚屽彿",
-      prop: "salesContractNo",
-      width: '150px',
-    },
-    {
-      label: "瀹㈡埛鍚嶇О",
-      prop: "customerName",
-      width: '200px',
+      width: "120px",
     },
     {
       label: "浜у搧鍚嶇О",
-      prop: "productCategory",
-      width: '120px',
+      prop: "productName",
+      width: "120px",
     },
     {
       label: "瑙勬牸",
-      prop: "specificationModel",
-      width: '120px',
+      prop: "model",
+      width: "120px",
+    },
+    {
+      label: "鐗╂枡缂栫爜",
+      prop: "materialCode",
+      width: "120px",
     },
     {
       label: "宸ヨ壓璺嚎缂栧彿",
       prop: "processRouteCode",
-      width: '200px',
+      width: "200px",
     },
     {
       label: "闇�姹傛暟閲�",
@@ -178,17 +198,25 @@
     },
     {
       label: "浜や粯鏃ユ湡",
-      prop: "deliveryDate",
+      prop: "planCompleteTime",
       formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
       width: 120,
     },
+
     {
       dataType: "action",
       label: "鎿嶄綔",
       align: "center",
       fixed: "right",
-      width: 200,
+      width: 300,
       operation: [
+        {
+          name: "鏉ユ簮",
+          type: "text",
+          clickFun: row => {
+            showSourceData(row);
+          },
+        },
         {
           name: "宸ヨ壓璺嚎",
           type: "text",
@@ -199,18 +227,26 @@
         {
           name: "缁戝畾宸ヨ壓璺嚎",
           type: "text",
-          showHide: row => !row.processRouteCode,
+          showHide: row => !row.routeId,
           clickFun: row => {
             openBindRouteDialog(row);
           },
         },
         {
-          name: "浜у搧缁撴瀯",
+          name: "鍒犻櫎",
           type: "text",
+          showHide: row => row.status == 4,
           clickFun: row => {
-            showProductStructure(row);
+            handleDeleteSolo(row);
           },
         },
+        // {
+        //   name: "浜у搧缁撴瀯",
+        //   type: "text",
+        //   clickFun: row => {
+        //     showProductStructure(row);
+        //   },
+        // },
       ],
     },
   ]);
@@ -228,8 +264,8 @@
       customerName: "",
       salesContractNo: "",
       projectName: "",
-      productCategory: "",
-      specificationModel: "",
+      productName: "",
+      model: "",
     },
   });
   const { searchForm } = toRefs(data);
@@ -253,19 +289,18 @@
 
   // 娣诲姞琛ㄨ绫诲悕鏂规硶
   const tableRowClassName = ({ row }) => {
-    if (!row.deliveryDate) return '';
-    if (row.isFh) return '';
-
-    const diff = row.deliveryDaysDiff;
-    if (diff === 15) {
-      return 'yellow';
-    } else if (diff === 10) {
-      return 'pink';
-    } else if (diff === 2) {
-      return 'purple';
-    } else if (diff < 2) {
-      return 'red';
-    }
+    // if (!row.planCompleteTime) return "";
+    // if (row.isFh) return "";
+    // const diff = row.deliveryDaysDiff;
+    // if (diff === 15) {
+    //   return "yellow";
+    // } else if (diff === 10) {
+    //   return "pink";
+    // } else if (diff === 2) {
+    //   return "purple";
+    // } else if (diff < 2) {
+    //   return "red";
+    // }
   };
 
   // 缁戝畾宸ヨ壓璺嚎寮规
@@ -273,6 +308,7 @@
   const bindRouteLoading = ref(false);
   const bindRouteSaving = ref(false);
   const routeOptions = ref([]);
+  const productTypeOptions = ref([]);
   const bindForm = reactive({
     orderId: null,
     routeId: null,
@@ -283,15 +319,32 @@
     bindForm.routeId = null;
     bindRouteDialogVisible.value = true;
     routeOptions.value = [];
-    if (!row.productModelId) {
+    if (!row.model) {
       proxy.$modal.msgWarning("褰撳墠璁㈠崟缂哄皯浜у搧鍨嬪彿锛屾棤娉曟煡璇㈠伐鑹鸿矾绾�");
       bindRouteDialogVisible.value = false;
       return;
     }
     bindRouteLoading.value = true;
+    const distName =
+      row.productName == "鏉挎潗"
+        ? row.productName
+        : row.productName + "-" + row.strength;
+
     try {
-      const res = await listProcessRoute({ productModelId: row.productModelId });
-      routeOptions.value = res.data || [];
+      // 鑾峰彇浜у搧绫诲瀷瀛楀吀
+      const dictRes = await getDicts("product_type");
+      if (dictRes.code === 200) {
+        productTypeOptions.value = dictRes.data;
+        // 鐢╠istName鍖归厤dictLabel锛岃幏鍙杁ictCode
+        const matchedType = productTypeOptions.value.find(
+          item => item.dictLabel === distName
+        );
+        const dictCode = matchedType ? matchedType.dictCode : row.productType;
+
+        // 浣跨敤dictCode鏌ヨ宸ヨ壓璺嚎鍒楄〃
+        const res = await listPage({ dictCode, status: true });
+        routeOptions.value = res.data.records || [];
+      }
     } catch (e) {
       console.error("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触锛�", e);
       proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触");
@@ -321,7 +374,23 @@
       bindRouteSaving.value = false;
     }
   };
-
+  const statusOptions = ref([
+    { value: 1, label: "寰呭紑濮�" },
+    { value: 2, label: "杩涜涓�" },
+    { value: 3, label: "宸插畬鎴�" },
+    { value: 4, label: "宸插彇娑�" },
+  ]);
+  const handleReset = () => {
+    searchForm.value = {
+      customerName: "",
+      salesContractNo: "",
+      projectName: "",
+      productName: "",
+      model: "",
+      status: "",
+    };
+    handleQuery();
+  };
   // 鏌ヨ鍒楄〃
   /** 鎼滅储鎸夐挳鎿嶄綔 */
   const handleQuery = () => {
@@ -362,23 +431,23 @@
   const showRouteItemModal = async row => {
     const orderId = row.id;
     try {
-      const res = await getOrderProcessRouteMain(orderId);
-      const data = res.data || {};
-      if (!data || !data.id) {
-        proxy.$modal.msgWarning("鏈壘鍒板叧鑱旂殑宸ヨ壓璺嚎");
-        return;
-      }
       router.push({
         path: "/productionManagement/processRouteItem",
         query: {
-          id: data.id,
-          processRouteCode: data.processRouteCode || "",
-          productName: data.productName || "",
-          model: data.model || "",
-          bomNo: data.bomNo || "",
-          description: data.description || "",
-          orderId,
+          id: row.routeId,
+          processRouteCode: row.processRouteCode || "",
+          productName: row.productName || "",
+          model: row.model || "",
+          bomNo: row.bomNo || "",
+          bomId: row.bomId || "",
+          description: row.description || "",
+          dictLabel:
+            row.productName == "鏉挎潗"
+              ? row.productName
+              : row.productName + "-" + row.strength,
+          orderId: row.id,
           type: "order",
+          editable: true,
         },
       });
     } catch (e) {
@@ -388,44 +457,83 @@
   };
 
   const showProductStructure = row => {
+    if (!row.processRouteCode) {
+      proxy.$modal.msgWarning("璇峰厛缁戝畾宸ヨ壓璺嚎");
+      return;
+    }
     router.push({
       path: "/productionManagement/productStructureDetail",
       query: {
         id: row.id,
         bomNo: row.bomNo || "",
-        productName: row.productCategory || "",
-        productModelName: row.specificationModel || "",
+        productName: row.productName || "",
+        productModelName: row.model || "",
         orderId: row.id,
         type: "order",
       },
     });
   };
 
+  // 鏌ョ湅鏉ユ簮鐢熶骇璁″垝鏁版嵁
+  const showSourceData = row => {
+    // 杩欓噷闇�瑕佹牴鎹疄闄呯殑API鍜岃矾鐢辫繘琛岃皟鏁�
+    // 鍋囪鐢熶骇璁㈠崟涓湁鐢熶骇璁″垝ID瀛楁锛屾瘮濡俻roductionPlanId
+    if (row.productionPlanId) {
+      // 璺宠浆鍒扮敓浜ц鍒掕鎯呴〉闈�
+      router.push({
+        path: "/productionManagement/productionPlan",
+        query: {
+          id: row.productionPlanId,
+        },
+      });
+    } else {
+      proxy.$modal.msgWarning("褰撳墠璁㈠崟娌℃湁鍏宠仈鐨勭敓浜ц鍒�");
+    }
+  };
+
   // 琛ㄦ牸閫夋嫨鏁版嵁
-  const handleSelectionChange = (selection) => {
+  const handleSelectionChange = selection => {
     selectedRows.value = selection;
+  };
+  const handleDeleteSolo = row => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚��鍥烇紝鏄惁纭閫�鍥烇紵", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        delProductOrder([row.id]).then(res => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
   };
 
   const handleDelete = () => {
     let ids = [];
     if (selectedRows.value.length > 0) {
-      ids = selectedRows.value.map((item) => item.id);
+      ids = selectedRows.value.map(item => item.id);
     } else {
       proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
       return;
     }
-    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚��鍥烇紝鏄惁纭閫�鍥烇紵", "瀵煎嚭", {
       confirmButtonText: "纭",
       cancelButtonText: "鍙栨秷",
       type: "warning",
-    }).then(() => {
-      delProductOrder(ids).then((res) => {
-        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        getList();
+    })
+      .then(() => {
+        delProductOrder(ids).then(res => {
+          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
       });
-    }).catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
   };
 
   // 瀵煎嚭
@@ -436,7 +544,11 @@
       type: "warning",
     })
       .then(() => {
-        proxy.download("/productOrder/export", {...searchForm.value}, "鐢熶骇璁㈠崟.xlsx");
+        proxy.download(
+          "/productOrder/export",
+          { ...searchForm.value },
+          "鐢熶骇璁㈠崟.xlsx"
+        );
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
@@ -451,23 +563,23 @@
 </script>
 
 <style scoped lang="scss">
-.search_form{
-  align-items: start;
-}
+  .search_form {
+    align-items: start;
+  }
 
-::v-deep .yellow {
-  background-color: #FAF0DE;
-}
+  ::v-deep .yellow {
+    background-color: #faf0de;
+  }
 
-::v-deep .pink {
-  background-color: #FAE1DE;
-}
+  ::v-deep .pink {
+    background-color: #fae1de;
+  }
 
-::v-deep .red {
-  background-color: #f80202;
-}
+  ::v-deep .red {
+    background-color: #f80202;
+  }
 
-::v-deep .purple{
-  background-color: #F4DEFA;
-}
+  ::v-deep .purple {
+    background-color: #f4defa;
+  }
 </style>
diff --git a/src/views/productionManagement/productionProcess/index.vue b/src/views/productionManagement/productionProcess/index.vue
index 9994b94..b99c8d6 100644
--- a/src/views/productionManagement/productionProcess/index.vue
+++ b/src/views/productionManagement/productionProcess/index.vue
@@ -51,9 +51,9 @@
                   {{ process.status ? '鍚敤' : '鍋滅敤' }}
                 </el-tag>
                 <el-tag size="small"
-                        :type="process.isQuality ? 'warning' : 'info'"
+                        :type="process.isQuality == 1 ? 'warning' : 'info'"
                         style="margin-left: 8px">
-                  {{ process.isQuality ? '璐ㄦ' : '闈炶川妫�' }}
+                  {{ process.isQuality == 1 ? '璐ㄦ' : '闈炶川妫�' }}
                 </el-tag>
               </div>
               <span class="param-count">宸ヨ祫瀹氶: 楼{{ process.salaryQuota || 0 }}</span>
@@ -119,8 +119,8 @@
         <el-form-item label="鏄惁璐ㄦ"
                       prop="isQuality">
           <el-switch v-model="processForm.isQuality"
-                     :active-value="true"
-                     inactive-value="false" />
+                     :active-value="1"
+                     :inactive-value="0" />
         </el-form-item>
         <el-form-item label="宸ュ簭鎻忚堪"
                       prop="remark">
@@ -249,8 +249,8 @@
             </el-form-item>
             <el-form-item label="鏄惁蹇呭~">
               <el-switch v-model="selectedParam.isRequired"
-                         :active-value="1"
-                         :inactive-value="0" />
+                         :active-value="true"
+                         :inactive-value="false" />
             </el-form-item>
           </el-form>
           <el-empty v-else
@@ -313,8 +313,8 @@
         <el-form-item label="鏄惁蹇呭~"
                       prop="isRequired">
           <el-switch v-model="editParamForm.isRequired"
-                     :active-value="1"
-                     :inactive-value="0" />
+                     :active-value="true"
+                     :inactive-value="false" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -368,7 +368,7 @@
     no: "",
     name: "",
     salaryQuota: null,
-    isQuality: false,
+    isQuality: 0,
     remark: "",
     status: true,
   });
@@ -418,7 +418,7 @@
     minValue: null,
     maxValue: null,
     sort: 1,
-    isRequired: 0,
+    isRequired: false,
     tenantId: 1,
   });
   const editParamRules = {
@@ -562,8 +562,8 @@
       label: "鏄惁蹇呭~",
       prop: "isRequired",
       dataType: "tag",
-      formatType: row => (row.isRequired === 1 ? "success" : "info"),
-      formatData: row => (row.isRequired === 1 ? "鏄�" : "鍚�"),
+      formatType: row => (row.isRequired === true ? "success" : "info"),
+      formatData: row => (row.isRequired === true ? "鏄�" : "鍚�"),
     },
     {
       label: "鎿嶄綔",
@@ -626,7 +626,7 @@
     processForm.no = "";
     processForm.name = "";
     processForm.salaryQuota = null;
-    processForm.isQuality = false;
+    processForm.isQuality = 0;
     processForm.remark = "";
     processForm.status = true;
     processDialogVisible.value = true;
@@ -638,7 +638,7 @@
     processForm.no = process.no;
     processForm.name = process.name;
     processForm.salaryQuota = process.salaryQuota;
-    processForm.isQuality = process.isQuality || false;
+    processForm.isQuality = process.isQuality || 0;
     processForm.remark = process.remark || "";
     processForm.status = process.status;
     processDialogVisible.value = true;
@@ -797,7 +797,7 @@
     editParamForm.minValue = row.minValue;
     editParamForm.maxValue = row.maxValue;
     editParamForm.sort = row.sort || 1;
-    editParamForm.isRequired = row.isRequired || 0;
+    editParamForm.isRequired = row.isRequired || false;
     editParamForm.tenantId = 1;
     editParamDialogVisible.value = true;
   };
@@ -830,7 +830,7 @@
       standardValue: selectedParam.value.standardValue,
       minValue: selectedParam.value.minValue,
       maxValue: selectedParam.value.maxValue,
-      isRequired: selectedParam.value.isRequired || 0,
+      isRequired: selectedParam.value.isRequired || false,
       tenantId: 1,
     })
       .then(() => {
@@ -990,17 +990,52 @@
     box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
     display: flex;
     flex-direction: column;
+    min-width: 0;
   }
 
   .param-table-wrapper {
     flex: 1;
     padding: 0 20px 20px;
     overflow: auto;
+    min-width: 100%;
   }
 
   /* 琛ㄦ牸妯悜婊氬姩 */
-  :deep(.el-table) {
-    // min-width: 800px;
+  .param-table-wrapper :deep(.el-table) {
+    min-width: 100%;
+  }
+
+  .param-table-wrapper :deep(.el-table__body-wrapper) {
+    overflow-x: auto;
+  }
+
+  .pagination-container {
+    margin-top: 10px;
+    overflow-x: auto;
+    padding-bottom: 8px;
+  }
+
+  .pagination-container .el-pagination {
+    white-space: nowrap;
+  }
+
+  /* 鍝嶅簲寮忚皟鏁� */
+  @media screen and (max-width: 768px) {
+    .pagination-container {
+      font-size: 12px;
+    }
+
+    .pagination-container .el-pagination__sizes {
+      margin-right: 8px;
+    }
+
+    .pagination-container .el-pagination__jump {
+      margin-left: 8px;
+    }
+
+    .pagination-container .el-pagination__page-size {
+      font-size: 12px;
+    }
   }
 
   .empty-tip {
diff --git a/src/views/productionPlan/productionPlan/index.vue b/src/views/productionPlan/productionPlan/index.vue
index 649d991..aec4eed 100644
--- a/src/views/productionPlan/productionPlan/index.vue
+++ b/src/views/productionPlan/productionPlan/index.vue
@@ -3,36 +3,9 @@
     <div class="search_form">
       <el-form :model="searchForm"
                :inline="true">
-        <el-form-item label="瀹㈡埛鍚嶇О:">
-          <el-input v-model="searchForm.customerName"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    style="width: 160px;"
-                    @keyup.enter="handleQuery" />
-        </el-form-item>
+        <!-- 绠�鍖栫増鎼滅储鏉′欢 -->
         <el-form-item label="浜у搧鍚嶇О:">
           <el-input v-model="searchForm.productName"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    style="width: 160px;"
-                    @keyup.enter="handleQuery" />
-        </el-form-item>
-        <el-form-item label="浜у搧瑙勬牸:">
-          <el-input v-model="searchForm.model"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    style="width: 160px;"
-                    @keyup.enter="handleQuery" />
-        </el-form-item>
-        <el-form-item label="鐗╂枡缂栫爜:">
-          <el-input v-model="searchForm.materialCode"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    style="width: 160px;"
-                    @keyup.enter="handleQuery" />
-        </el-form-item>
-        <el-form-item label="鐢宠鍗曠紪鍙�:">
-          <el-input v-model="searchForm.applyNo"
                     placeholder="璇疯緭鍏�"
                     clearable
                     style="width: 160px;"
@@ -50,7 +23,7 @@
         </el-form-item>
         <el-form-item label="涓嬪彂鐘舵��:">
           <el-select v-model="searchForm.status"
-                     placeholder="璇烽�夋嫨鐘舵��" 
+                     placeholder="璇烽�夋嫨鐘舵��"
                      clearable
                      filterable
                      style="width: 100px">
@@ -62,6 +35,37 @@
                        value="2" />
           </el-select>
         </el-form-item>
+        <!-- 灞曞紑鐗堟悳绱㈡潯浠� -->
+        <template v-if="searchFormExpanded">
+          <el-form-item label="瀹㈡埛鍚嶇О:">
+            <el-input v-model="searchForm.customerName"
+                      placeholder="璇疯緭鍏�"
+                      clearable
+                      style="width: 160px;"
+                      @keyup.enter="handleQuery" />
+          </el-form-item>
+          <el-form-item label="浜у搧瑙勬牸:">
+            <el-input v-model="searchForm.model"
+                      placeholder="璇疯緭鍏�"
+                      clearable
+                      style="width: 160px;"
+                      @keyup.enter="handleQuery" />
+          </el-form-item>
+          <el-form-item label="鐗╂枡缂栫爜:">
+            <el-input v-model="searchForm.materialCode"
+                      placeholder="璇疯緭鍏�"
+                      clearable
+                      style="width: 160px;"
+                      @keyup.enter="handleQuery" />
+          </el-form-item>
+          <el-form-item label="鐢宠鍗曠紪鍙�:">
+            <el-input v-model="searchForm.applyNo"
+                      placeholder="璇疯緭鍏�"
+                      clearable
+                      style="width: 160px;"
+                      @keyup.enter="handleQuery" />
+          </el-form-item>
+        </template>
         <el-form-item>
           <el-button type="primary"
                      @click="handleQuery">鎼滅储</el-button>
@@ -81,6 +85,16 @@
       </el-form>
       <div>
       </div>
+    </div>
+    <div class="search-header">
+      <el-button type="text"
+                 @click="toggleSearchForm">
+        <el-icon>
+          <ArrowUp v-if="searchFormExpanded" />
+          <ArrowDown v-else />
+        </el-icon>
+        {{ searchFormExpanded ? '鏀惰捣鎼滅储鏉′欢' : '灞曞紑鎼滅储鏉′欢' }}
+      </el-button>
     </div>
     <div class="table_list">
       <PIMTable rowKey="id"
@@ -366,6 +380,7 @@
 <script setup>
   import { onMounted, ref, reactive, getCurrentInstance, toRefs } from "vue";
   import { ElMessage } from "element-plus";
+  import { ArrowUp, ArrowDown } from "@element-plus/icons-vue";
   import dayjs from "dayjs";
   import ImportDialog from "@/components/Dialog/ImportDialog.vue";
   import { getToken } from "@/utils/auth";
@@ -896,8 +911,14 @@
       applyNo: "",
       dateRange: [],
     },
+    searchFormExpanded: false,
   });
-  const { searchForm } = toRefs(data);
+  const { searchForm, searchFormExpanded } = toRefs(data);
+
+  // 鍒囨崲鎼滅储琛ㄥ崟灞曞紑/鏀惰捣鐘舵��
+  const toggleSearchForm = () => {
+    data.searchFormExpanded = !data.searchFormExpanded;
+  };
 
   // 鏌ヨ鍒楄〃
   /** 鎼滅储鎸夐挳鎿嶄綔 */
@@ -1087,10 +1108,12 @@
     }
 
     console.log(mergeForm, "mergeForm");
-    const strengthItem = block_strength.value.find(item => item.id === mergeForm.strength);
+    const strengthItem = block_strength.value.find(
+      item => item.id === mergeForm.strength
+    );
     const payload = {
       ...mergeForm,
-      strength: strengthItem ? strengthItem.label : mergeForm.strength
+      strength: strengthItem ? strengthItem.label : mergeForm.strength,
     };
     productionPlanCombine(payload)
       .then(res => {
@@ -1323,10 +1346,7 @@
   }
 
   .search_form {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 24px;
+    // margin-bottom: 24px;
     padding: 20px;
     background-color: #ffffff;
     border-radius: 6px;
@@ -1338,6 +1358,36 @@
     }
   }
 
+  .search-header {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    // margin-bottom: 5px;
+    // padding-bottom: 5px;
+    position: relative;
+    bottom: 35px;
+    // border-bottom: 1px solid #ebeef5;
+  }
+
+  .search-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #303133;
+  }
+
+  .search-header .el-button {
+    color: #606266;
+    transition: all 0.3s ease;
+  }
+
+  .search-header .el-button:hover {
+    color: #409eff;
+  }
+
+  .search-header .el-icon {
+    margin-right: 4px;
+  }
+
   .table_list {
     // margin-bottom: 24px;
     background-color: #ffffff;
@@ -1345,6 +1395,7 @@
     box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
     overflow: hidden;
     height: calc(100vh - 250px);
+    margin-top: 0px !important;
   }
 
   :deep(.el-table) {

--
Gitblit v1.9.3