From 000bbc47e9a2220d18f9cd69b35af23d4d838d46 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 21 五月 2026 09:33:38 +0800
Subject: [PATCH] 工艺路线附件位置变更

---
 src/views/productionManagement/processRoute/index.vue                  |   18 +++--
 src/views/productionManagement/processRoute/processRouteItem/index.vue |  145 ++++++++++++++++++++++++++++++++++++++++++++++--
 src/views/productionManagement/productionOrder/index.vue               |    1 
 3 files changed, 149 insertions(+), 15 deletions(-)

diff --git a/src/views/productionManagement/processRoute/index.vue b/src/views/productionManagement/processRoute/index.vue
index 43425c6..edbc491 100644
--- a/src/views/productionManagement/processRoute/index.vue
+++ b/src/views/productionManagement/processRoute/index.vue
@@ -61,7 +61,9 @@
   import EditProcess from "@/views/productionManagement/processRoute/Edit.vue";
   import RouteItemForm from "@/views/productionManagement/processRoute/ItemsForm.vue";
   import { listPage, del } from "@/api/productionManagement/processRoute.js";
-  const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
+  const FileList = defineAsyncComponent(() =>
+    import("@/components/Dialog/FileList.vue")
+  );
 
   import { useRouter } from "vue-router";
   import { ElMessage, ElMessageBox } from "element-plus";
@@ -115,13 +117,13 @@
             showItemModal(row);
           },
         },
-        {
-          name: "闄勪欢",
-          type: "text",
-          clickFun: row => {
-            openFileDialog(row);
-          },
-        },
+        // {
+        //   name: "闄勪欢",
+        //   type: "text",
+        //   clickFun: row => {
+        //     openFileDialog(row);
+        //   },
+        // },
       ],
     },
   ]);
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index eaf6397..ea922bc 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -47,16 +47,59 @@
             <span class="info-value">{{ routeInfo.quantity || '-' }}</span>
           </div>
         </div>
-        <div class="info-item full-width"
-             v-if="routeInfo.description">
+        <div class="info-item">
           <div class="info-label-wrapper">
-            <span class="info-label">鎻忚堪</span>
+            <span class="info-label">澶囨敞</span>
           </div>
           <div class="info-value-wrapper">
             <span class="info-value">{{ routeInfo.description }}</span>
           </div>
         </div>
       </div>
+    </el-card>
+    <!-- 闄勪欢妯″潡 -->
+    <div v-if="pageType === 'order'"
+         class="section-header">
+      <div class="section-title">闄勪欢</div>
+      <div class="section-actions">
+        <el-button v-if="editable"
+                   type="primary"
+                   @click="handleUploadAttachment">
+          涓婁紶闄勪欢
+        </el-button>
+      </div>
+    </div>
+    <el-card v-if="pageType === 'order'"
+             class="attachment-card"
+             shadow="hover"
+             style="margin-top: 10px; margin-bottom: 20px;">
+      <el-table :data="attachmentTableData"
+                border
+                class="attachment-table">
+        <el-table-column label="闄勪欢鍚嶇О"
+                         prop="originalFilename"
+                         show-overflow-tooltip />
+        <el-table-column fixed="right"
+                         label="鎿嶄綔"
+                         width="200"
+                         align="center">
+          <template #default="scope">
+            <el-button link
+                       type="primary"
+                       size="small"
+                       @click="downloadAttachmentFile(scope.row.downloadURL)">
+              涓嬭浇
+            </el-button>
+            <el-button v-if="editable"
+                       link
+                       type="danger"
+                       size="small"
+                       @click="handleDeleteAttachment(scope.row)">
+              鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
     </el-card>
     <!-- 琛ㄦ牸瑙嗗浘 -->
     <div v-if="viewMode === 'table'"
@@ -382,6 +425,18 @@
                          v-model="bomDataValue.showProductDialog"
                          :single="true"
                          @confirm="handleBomProduct" />
+    <!-- 涓婁紶缁勪欢寮圭獥 -->
+    <el-dialog v-model="uploadDialogVisible"
+               title="涓婁紶闄勪欢"
+               width="50%"
+               @close="closeAttachmentUpload">
+      <AttachmentUpload v-model:file-list="newFileList" />
+      <template #footer>
+        <el-button @click="saveAttachmentUpload"
+                   type="primary">淇濆瓨</el-button>
+        <el-button @click="closeAttachmentUpload">鍏抽棴</el-button>
+      </template>
+    </el-dialog>
     <!-- 鏂板/缂栬緫寮圭獥 -->
     <el-dialog v-model="dialogVisible"
                :title="operationType === 'add' ? '鏂板宸ヨ壓璺嚎椤圭洰' : '缂栬緫宸ヨ壓璺嚎椤圭洰'"
@@ -518,6 +573,12 @@
     queryList2,
     add2,
   } from "@/api/productionManagement/productStructure.js";
+  import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
+  import {
+    attachmentList,
+    deleteAttachment,
+    createAttachment,
+  } from "@/api/basicData/storageAttachment.js";
 
   import { useRoute } from "vue-router";
   import { ElMessageBox, ElMessage } from "element-plus";
@@ -530,6 +591,7 @@
   const orderId = computed(() => route.query.orderId);
   const pageType = computed(() => route.query.type);
   const editable = computed(() => route.query.editable !== "false");
+  const technologyRoutingId = computed(() => route.query.technologyRoutingId);
 
   const tableLoading = ref(false);
   const tableData = ref([]);
@@ -548,7 +610,66 @@
     bomNo: "",
     description: "",
     quantity: 0,
+    technologyRoutingId: "",
   });
+
+  // 闄勪欢鐩稿叧
+  const attachmentTableData = ref([]);
+  const uploadDialogVisible = ref(false);
+  const newFileList = ref([]);
+
+  const getAttachmentList = () => {
+    if (!technologyRoutingId.value) return;
+    attachmentList({
+      recordType: "technology_routing",
+      recordId: technologyRoutingId.value,
+    }).then(res => {
+      attachmentTableData.value = (res && res.data) || [];
+    });
+  };
+
+  const handleUploadAttachment = () => {
+    uploadDialogVisible.value = true;
+  };
+
+  const saveAttachmentUpload = async () => {
+    if (newFileList.value.length > 0) {
+      createAttachment({
+        application: "file",
+        recordType: "technology_routing",
+        recordId: technologyRoutingId.value,
+        storageBlobDTOs: [...newFileList.value, ...attachmentTableData.value],
+      })
+        .then(res => {
+          if (res && res.code === 200) {
+            proxy?.$modal?.msgSuccess("涓婁紶鎴愬姛");
+            newFileList.value = [];
+            getAttachmentList();
+          }
+        })
+        .finally(() => {
+          uploadDialogVisible.value = false;
+        });
+    }
+  };
+
+  const closeAttachmentUpload = () => {
+    newFileList.value = [];
+    uploadDialogVisible.value = false;
+  };
+
+  const handleDeleteAttachment = async row => {
+    deleteAttachment([row.storageAttachmentId]).then(res => {
+      if (res && res.code === 200) {
+        proxy?.$modal?.msgSuccess("鍒犻櫎鎴愬姛");
+        getAttachmentList();
+      }
+    });
+  };
+
+  const downloadAttachmentFile = url => {
+    window.open(url, "_blank");
+  };
 
   const processOptions = ref([]);
   const showProductSelectDialog = ref(false);
@@ -680,6 +801,7 @@
       bomId: route.query.bomId || "",
       description: route.query.description || "",
       quantity: route.query.quantity || 0,
+      technologyRoutingId: route.query.technologyRoutingId || "",
       status: !(route.query.status == 1 || route.query.status === "false"),
     };
     bomTableData.value[0].productName = routeInfo.value.productName;
@@ -1165,12 +1287,16 @@
   const handleBomProcessChange = (row, value) => {
     row.processId = value || "";
     syncProcessOperationFields(row);
-    
+
     // 妫�鏌ュ悓涓�灞傜骇鏄惁宸茬粡鏈夊叾浠栦笉鍚岀殑宸ュ簭琚�変腑
     const siblings = findSiblings(bomDataValue.value.dataList, row.tempId);
     if (siblings && value) {
       const hasDifferentProcess = siblings.some(sibling => {
-        return sibling.tempId !== row.tempId && sibling.processId && sibling.processId !== value;
+        return (
+          sibling.tempId !== row.tempId &&
+          sibling.processId &&
+          sibling.processId !== value
+        );
       });
       if (hasDifferentProcess) {
         ElMessage.warning("鍚屼竴灞傜骇宸插瓨鍦ㄤ笉鍚岀殑宸ュ簭锛岃鍏堢粺涓�宸ュ簭鍚庡啀杩涜淇敼");
@@ -1392,11 +1518,13 @@
     };
 
     // 鏍¢獙鍚屼竴灞傜骇鐨勫伐搴忔槸鍚︿竴鑷�
-    const validateProcessConsistency = (items) => {
+    const validateProcessConsistency = items => {
       if (!items || items.length === 0) return;
 
       // 妫�鏌ュ綋鍓嶅眰绾�
-      const processes = items.filter(item => item.processId).map(item => item.processId);
+      const processes = items
+        .filter(item => item.processId)
+        .map(item => item.processId);
       if (processes.length > 1) {
         const uniqueProcesses = [...new Set(processes)];
         if (uniqueProcesses.length > 1) {
@@ -1474,6 +1602,9 @@
     getList();
     getProcessList();
     fetchBomData();
+    if (pageType.value === "order") {
+      getAttachmentList();
+    }
   };
 
   onMounted(() => {
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 90ca51d..9c7682b 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -723,6 +723,7 @@
           bomNo: row.bomNo || "",
           description: data.description || "",
           quantity: row.quantity || 0,
+          technologyRoutingId: data.technologyRoutingId,
           orderId,
           type: "order",
           editable: !row.endOrder,

--
Gitblit v1.9.3