From f606f0dd0bba1e666c7de2f1bb56a3a641b65581 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 30 四月 2026 16:32:43 +0800
Subject: [PATCH] 增加结束订单功能,并在生产订单和报工页面限制已结束订单的编辑操作

---
 src/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue |    5 +-
 src/views/productionManagement/processRoute/processRouteItem/index.vue             |   20 ++++++----
 src/views/productionManagement/productionOrder/index.vue                           |   53 +++++++++++++++++++++++---
 src/api/productionManagement/productionOrder.js                                    |    9 ++++
 src/components/PIMTable/PIMTable.vue                                               |    5 ++
 src/views/productionManagement/workOrderManagement/index.vue                       |    4 ++
 6 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/src/api/productionManagement/productionOrder.js b/src/api/productionManagement/productionOrder.js
index 688abfc..9b5751d 100644
--- a/src/api/productionManagement/productionOrder.js
+++ b/src/api/productionManagement/productionOrder.js
@@ -45,6 +45,15 @@
   });
 }
 
+// 鐢熶骇璁㈠崟-淇敼
+export function updateProductOrder(data) {
+  return request({
+    url: "/productionOrder/updateOrder",
+    method: "post",
+    data: data,
+  });
+}
+
 export function delProductOrder(ids) {
   return request({
     url: `/productionOrder/delete`,
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index 61df179..f99b1eb 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -21,6 +21,7 @@
             class="lims-table">
     <el-table-column align="center"
                      type="selection"
+                     :selectable="selectable"
                      width="55"
                      v-if="isSelection" />
     <el-table-column align="center"
@@ -258,6 +259,10 @@
       type: Boolean,
       default: false,
     },
+    selectable: {
+      type: Function,
+      default: () => true,
+    },
     isShowPagination: {
       type: Boolean,
       default: true,
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index fd1a6a8..6d64c30 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -68,7 +68,8 @@
                    style="margin-right: 10px;">
           鍗$墖瑙嗗浘
         </el-button>
-        <el-button type="primary"
+        <el-button v-if="editable"
+                   type="primary"
                    @click="handleAdd">鏂板</el-button>
       </div>
     </div>
@@ -133,12 +134,12 @@
                      link
                      size="small"
                      @click="handleEdit(scope.row)"
-                     :disabled="scope.row.isComplete">缂栬緫</el-button>
+                     :disabled="scope.row.isComplete || !editable">缂栬緫</el-button>
           <el-button type="danger"
                      link
                      size="small"
                      @click="handleDelete(scope.row)"
-                     :disabled="scope.row.isComplete">鍒犻櫎</el-button>
+                     :disabled="scope.row.isComplete || !editable">鍒犻櫎</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -152,7 +153,8 @@
                      style="margin-right: 10px;">
             琛ㄦ牸瑙嗗浘
           </el-button>
-          <el-button type="primary"
+          <el-button v-if="editable"
+                     type="primary"
                      @click="handleAdd">鏂板</el-button>
         </div>
       </div>
@@ -196,7 +198,7 @@
                          link
                          size="small"
                          @click="handleEdit(item)"
-                         :disabled="item.isComplete">缂栬緫</el-button>
+                         :disabled="item.isComplete || !editable">缂栬緫</el-button>
               <el-button type="info"
                          link
                          size="small"
@@ -205,7 +207,7 @@
                          link
                          size="small"
                          @click="handleDelete(item)"
-                         :disabled="item.isComplete">鍒犻櫎</el-button>
+                         :disabled="item.isComplete || !editable">鍒犻櫎</el-button>
             </div>
           </div>
         </div>
@@ -216,7 +218,7 @@
          style="margin-top: 20px;">
       <div class="section-title">BOM 缁撴瀯</div>
       <div class="section-actions"
-           v-if="pageType === 'order'">
+           v-if="pageType === 'order' && editable">
         <el-button v-if="!bomDataValue.isEdit"
                    type="primary"
                    @click="bomDataValue.isEdit = true">
@@ -447,7 +449,6 @@
                          @confirm="handleProductSelect"
                          single />
     <!-- 鍙傛暟鍒楄〃瀵硅瘽妗� -->
-    <!-- :editable="!routeInfo.status" -->
     <ProcessParamListDialog v-model="showParamListDialog"
                             :title="`${currentProcess ? (currentProcess.processName || currentProcess.technologyOperationName || currentProcess.operationName) : ''} - 鍙傛暟鍒楄〃`"
                             :route-id="routeId"
@@ -455,6 +456,7 @@
                             :process="currentProcess"
                             :page-type="pageType"
                             :param-list="paramList"
+                            :editable="editable"
                             @getsyncProcessParamItem="getsyncProcessParamItem"
                             @refresh="refreshParamList" />
   </div>
@@ -509,6 +511,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 !== "false");
 
   const tableLoading = ref(false);
   const tableData = ref([]);
@@ -878,6 +881,7 @@
   // 鍒濆鍖栨嫋鎷芥帓搴�
   const initSortable = () => {
     destroySortable();
+    if (!editable.value) return;
 
     if (viewMode.value === "table") {
       // 琛ㄦ牸瑙嗗浘鐨勬嫋鎷芥帓搴�
diff --git a/src/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue
index e9b2646..370815e 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue
@@ -55,14 +55,15 @@
                              controls-position="right"
                              placeholder="杈撳叆瀹為檯鏁伴噺"
                              style="width: 100%;"
-                             :disabled="row.returned"
+                             :disabled="row.returned || orderRow?.end"
                              @change="val => handleActualQtyChange(row, val)" />
           </template>
         </el-table-column>
       </el-table>
       <template #footer>
         <span class="dialog-footer">
-          <el-button type="warning"
+          <el-button v-if="!orderRow?.end"
+                     type="warning"
                      :loading="materialReturnConfirming"
                      :disabled="!canOpenReturnSummary"
                      @click="openReturnSummaryDialog">
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 00996ba..93fc177 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -40,6 +40,8 @@
                        value="3" />
             <el-option label="宸插彇娑�"
                        value="4" />
+            <el-option label="宸茬粨鏉�"
+                       value="5" />
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -65,6 +67,7 @@
                 :tableLoading="tableLoading"
                 :row-class-name="tableRowClassName"
                 :isSelection="true"
+                :selectable="row => !row.endOrder"
                 @selection-change="handleSelectionChange"
                 @pagination="pagination">
         <template #completionStatus="{ row }">
@@ -210,6 +213,7 @@
     listProcessBom,
     delProductOrder,
     getProductOrderSource,
+    updateProductOrder,
   } from "@/api/productionManagement/productionOrder.js";
   import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
   import MaterialLedgerDialog from "@/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue";
@@ -243,7 +247,7 @@
       prop: "npsNo",
       width: "150px",
     },
-    // 1.寰呭紑濮嬨��2.杩涜涓��3.宸插畬鎴愩��4.宸插彇娑�
+    // 1.寰呭紑濮嬨��2.杩涜涓��3.宸插畬鎴愩��4.宸插彇娑堛��5.宸茬粨鏉�
     {
       label: "鐘舵��",
       prop: "status",
@@ -256,6 +260,8 @@
           ? "杩涜涓�"
           : val === 3
           ? "宸插畬鎴�"
+          : val === 5
+          ? "宸茬粨鏉�"
           : "宸插彇娑�",
       formatType: val =>
         val === 1
@@ -264,7 +270,9 @@
           ? "warning"
           : val === 3
           ? "success"
-          : "danger",
+          : val === 5
+          ? "danger"
+          : "info",
     },
     {
       label: "浜у搧鍚嶇О",
@@ -319,7 +327,7 @@
       label: "鎿嶄綔",
       align: "center",
       fixed: "right",
-      width: 260,
+      width: 280,
       operation: [
         {
           name: "宸ヨ壓璺嚎",
@@ -332,7 +340,7 @@
         {
           name: "缁戝畾宸ヨ壓璺嚎",
           type: "text",
-          showHide: row => !row.processRouteCode,
+          showHide: row => !row.processRouteCode && !row.endOrder,
           clickFun: row => {
             openBindRouteDialog(row, "add");
           },
@@ -340,7 +348,7 @@
         {
           name: "鏇存崲宸ヨ壓璺嚎",
           type: "text",
-          showHide: row => row.processRouteCode,
+          showHide: row => row.processRouteCode && !row.endOrder,
           clickFun: row => {
             openBindRouteDialog(row, "change");
           },
@@ -356,6 +364,7 @@
           name: "棰嗘枡",
           type: "text",
           color: "#5EC7AB",
+          showHide: row => !row.endOrder,
           clickFun: row => {
             openMaterialDialog(row);
           },
@@ -364,6 +373,7 @@
           name: "琛ユ枡",
           type: "text",
           color: "#5EC7AB",
+          showHide: row => !row.endOrder,
           clickFun: row => {
             openMaterialSupplementDialog(row);
           },
@@ -379,7 +389,8 @@
         {
           name: "鎵撳嵃棰嗘枡鍗�",
           type: "text",
-          color: "#409eff",
+          color: "#5EC7AB",
+          showHide: row => !row.endOrder,
           clickFun: row => {
             handlePrint(row);
           },
@@ -397,6 +408,15 @@
                 model: row.model,
               },
             });
+          },
+        },
+        {
+          name: "缁撴潫璁㈠崟",
+          type: "text",
+          color: "red",
+          showHide: row => !row.endOrder,
+          clickFun: row => {
+            handleEndOrder(row);
           },
         },
       ],
@@ -642,6 +662,7 @@
           quantity: row.quantity || 0,
           orderId,
           type: "order",
+          editable: !row.endOrder,
         },
       });
     } catch (e) {
@@ -736,6 +757,26 @@
       });
   };
 
+  // 缁撴潫璁㈠崟
+  const handleEndOrder = row => {
+    ElMessageBox.confirm(`鏄惁纭缁撴潫璁㈠崟锛�${row.npsNo}锛焋, "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        const params = {
+          id: row.id,
+          endOrder: true,
+        };
+        updateProductOrder(params).then(() => {
+          proxy.$modal.msgSuccess("缁撴潫璁㈠崟鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {});
+  };
+
   const handleConfirmRoute = () => {};
 
   onMounted(() => {
diff --git a/src/views/productionManagement/workOrderManagement/index.vue b/src/views/productionManagement/workOrderManagement/index.vue
index bb09a10..9eb232d 100644
--- a/src/views/productionManagement/workOrderManagement/index.vue
+++ b/src/views/productionManagement/workOrderManagement/index.vue
@@ -244,6 +244,7 @@
                     @refresh="getList" />
     <FileList v-if="fileDialogVisible"
               v-model:visible="fileDialogVisible"
+              :editable="!currentWorkOrderRow?.endOrder"
               :record-type="'production_operation_task'"
               :record-id="currentWorkOrderId" />
   </div>
@@ -370,6 +371,7 @@
           clickFun: row => {
             showReportDialog(row);
           },
+          showHide: row => !row.endOrder,
           disabled: row => {
             if (row.planQuantity <= 0) return true;
             if (!row.userIds) return false;
@@ -631,9 +633,11 @@
   const printTransferCard = () => {
     window.print();
   };
+  const currentWorkOrderRow = ref(null);
 
   const openWorkOrderFiles = row => {
     currentWorkOrderId.value = row.id;
+    currentWorkOrderRow.value = row;
     fileDialogVisible.value = true;
   };
 

--
Gitblit v1.9.3