From e65bfa1d46d255f307eaa057665f01c8bde0e122 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 16 六月 2026 11:14:36 +0800
Subject: [PATCH] 君歌 1.端口修改

---
 src/views/productionManagement/processRoute/processRouteItem/index.vue |  775 ++++++++++++++++++++---------------------------------------
 1 files changed, 266 insertions(+), 509 deletions(-)

diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index 6fbaa2c..db7905d 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -30,24 +30,54 @@
             <span class="info-value">{{ routeInfo.model || '-' }}</span>
           </div>
         </div>
-        <div class="info-item">
+        <div class="info-item"
+             v-if="routeInfo.quantity && routeInfo.quantity !== 0">
           <div class="info-label-wrapper">
-            <span class="info-label">BOM缂栧彿</span>
+            <span class="info-label">闇�姹傛暟閲�</span>
           </div>
           <div class="info-value-wrapper">
-            <span class="info-value">{{ routeInfo.bomNo || '-' }}</span>
+            <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>
+    <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>
+          </template>
+        </el-table-column>
+      </el-table>
     </el-card>
     <!-- 琛ㄦ牸瑙嗗浘 -->
     <div v-if="viewMode === 'table'"
@@ -59,7 +89,8 @@
                    style="margin-right: 10px;">
           鍗$墖瑙嗗浘
         </el-button>
-        <el-button type="primary"
+        <el-button v-if="editable"
+                   type="primary"
                    @click="handleAdd">鏂板</el-button>
       </div>
     </div>
@@ -80,7 +111,7 @@
                        prop="technologyOperationId"
                        width="200">
         <template #default="scope">
-          {{ getProcessName(scope.row.technologyOperationId) || '-' }}
+          {{ scope.row.technologyOperationName || scope.row.operationName || '-' }}
         </template>
       </el-table-column>
       <el-table-column label="鍙傛暟鍒楄〃"
@@ -101,11 +132,25 @@
       <el-table-column label="鍗曚綅"
                        prop="unit"
                        width="100" />
+      <el-table-column label="璁¤垂绫诲瀷"
+                       prop="type"
+                       width="100">
+        <template #default="scope">
+          {{scope.row.type==0 ? "璁℃椂" : "璁′欢"}}
+        </template>
+      </el-table-column>
       <el-table-column label="鏄惁璐ㄦ"
                        prop="isQuality"
                        width="100">
         <template #default="scope">
           {{scope.row.isQuality ? "鏄�" : "鍚�"}}
+        </template>
+      </el-table-column>
+      <el-table-column label="鏄惁鐢熶骇"
+                       prop="isProduction"
+                       width="100">
+        <template #default="scope">
+          {{scope.row.isProduction ? "鏄�" : "鍚�"}}
         </template>
       </el-table-column>
       <el-table-column label="鎿嶄綔"
@@ -117,12 +162,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>
@@ -136,7 +181,8 @@
                      style="margin-right: 10px;">
             琛ㄦ牸瑙嗗浘
           </el-button>
-          <el-button type="primary"
+          <el-button v-if="editable"
+                     type="primary"
                      @click="handleAdd">鏂板</el-button>
         </div>
       </div>
@@ -151,7 +197,7 @@
             <!-- 搴忓彿鍦嗗湀 -->
             <div class="card-header">
               <div class="card-number">{{ index + 1 }}</div>
-              <div class="card-process-name">{{ getProcessName(item.technologyOperationId) || '-' }}</div>
+              <div class="card-process-name">{{ item.technologyOperationName || item.operationName || '-' }}</div>
             </div>
             <!-- 浜у搧淇℃伅 -->
             <div class="card-content">
@@ -163,9 +209,17 @@
                   {{ item.model }}
                   <!-- <span v-if="item.unit" class="product-unit">{{ item.unit }}</span> -->
                 </div>
+                <el-tag class="product-tag"
+                        :type="item.type == 1 ? 'primary' : 'success'"
+                        style="margin-left: 8px;">{{ item.type==0?'璁℃椂':'璁′欢' }}</el-tag>
                 <el-tag type="primary"
                         class="product-tag"
+                        style="margin-left: 8px;"
                         v-if="item.isQuality">璐ㄦ</el-tag>
+                <el-tag type="primary"
+                        class="product-tag"
+                        style="margin-left: 8px;"
+                        v-if="item.isProduction">鐢熶骇</el-tag>
               </div>
               <div v-else
                    class="product-info empty">鏆傛棤浜у搧淇℃伅</div>
@@ -176,7 +230,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"
@@ -185,169 +239,24 @@
                          link
                          size="small"
                          @click="handleDelete(item)"
-                         :disabled="item.isComplete">鍒犻櫎</el-button>
+                         :disabled="item.isComplete || !editable">鍒犻櫎</el-button>
             </div>
           </div>
         </div>
       </div>
     </template>
-    <!-- bom妯″潡 -->
-    <div class="section-header"
-         style="margin-top: 20px;">
-      <div class="section-title">BOM 缁撴瀯</div>
-      <div class="section-actions"
-           v-if="pageType === 'order'">
-        <el-button v-if="!bomDataValue.isEdit"
-                   type="primary"
-                   @click="bomDataValue.isEdit = true">
-          缂栬緫
-        </el-button>
-        <el-button v-if="bomDataValue.isEdit"
-                   @click="cancelEditBom">
-          鍙栨秷
-        </el-button>
-        <el-button v-if="bomDataValue.isEdit"
-                   type="primary"
-                   @click="handleSaveBom"
-                   :loading="bomDataValue.loading">
-          淇濆瓨BOM
-        </el-button>
-      </div>
-    </div>
-    <el-table :data="bomTableData"
-              border
-              :preserve-expanded-content="false"
-              :default-expand-all="true"
-              style="width: 100%">
-      <el-table-column type="expand">
-        <template #default="props">
-          <el-form ref="form"
-                   :model="bomDataValue">
-            <el-table :data="bomDataValue.dataList"
-                      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="pageType === 'order' && bomDataValue.isEdit"
-                                :rules="[{ required: true, message: '璇烽�夋嫨瑙勬牸', trigger: ['blur','change'] }]"
-                                style="margin: 0">
-                    <el-select v-model="row.model"
-                               placeholder="璇烽�夋嫨瑙勬牸"
-                               clearable
-                               :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)"
-                               style="width: 100%"
-                               @visible-change="(v) => { if (v) openBomDialog(row.tempId) }">
-                      <el-option v-if="row.model"
-                                 :label="row.model"
-                                 :value="row.model" />
-                    </el-select>
-                  </el-form-item>
-                </template>
-              </el-table-column>
-              <el-table-column prop="processName"
-                               label="娑堣�楀伐搴�">
-                <template #default="{ row }">
-                  <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
-                                :rules="bomDataValue.dataList.some(item => (item).tempId === row.tempId) ? [] : [{ required: true, message: '璇烽�夋嫨娑堣�楀伐搴�', trigger: 'change' }]"
-                                style="margin: 0">
-                    <el-select v-model="row.processId"
-                               placeholder="璇烽�夋嫨"
-                               filterable
-                               clearable
-                               style="width: 100%"
-                               @change="value => handleBomProcessChange(row, value)"
-                               :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)">
-                      <el-option v-for="item in bomDataValue.processOptions"
-                                 :key="item.id"
-                                 :label="item.name"
-                                 :value="item.id" />
-                    </el-select>
-                  </el-form-item>
-                </template>
-              </el-table-column>
-              <el-table-column prop="unitQuantity"
-                               label="鍗曚綅浜у嚭鎵�闇�鏁伴噺">
-                <template #default="{ row }">
-                  <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
-                                :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺', trigger: ['blur','change'] }]"
-                                style="margin: 0">
-                    <el-input-number v-model="row.unitQuantity"
-                                     :min="0"
-                                     :precision="2"
-                                     :step="1"
-                                     controls-position="right"
-                                     style="width: 100%"
-                                     :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
-                  </el-form-item>
-                </template>
-              </el-table-column>
-              <el-table-column v-if="pageType === 'order'"
-                               prop="demandedQuantity"
-                               label="闇�姹傛�婚噺">
-                <template #default="{ row }">
-                  <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
-                                :rules="[{ required: true, message: '璇疯緭鍏ラ渶姹傛�婚噺', trigger: ['blur','change'] }]"
-                                style="margin: 0">
-                    <el-input-number v-model="row.demandedQuantity"
-                                     :min="0"
-                                     :precision="2"
-                                     :step="1"
-                                     controls-position="right"
-                                     style="width: 100%"
-                                     :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
-                  </el-form-item>
-                </template>
-              </el-table-column>
-              <el-table-column prop="unit"
-                               label="鍗曚綅">
-                <template #default="{ row }">
-                  <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
-                                :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣�', trigger: ['blur','change'] }]"
-                                style="margin: 0">
-                    <el-input v-model="row.unit"
-                              placeholder="璇疯緭鍏ュ崟浣�"
-                              clearable
-                              :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
-                  </el-form-item>
-                </template>
-              </el-table-column>
-              <el-table-column label="鎿嶄綔"
-                               fixed="right"
-                               width="200"
-                               v-if="pageType === 'order' && bomDataValue.isEdit">
-                <template #default="{ row }">
-                  <el-button v-if="bomDataValue.isEdit && !bomDataValue.dataList.some(item => (item).tempId === row.tempId)"
-                             type="danger"
-                             text
-                             @click="removeBomItem(row.tempId)">鍒犻櫎
-                  </el-button>
-                  <el-button v-if="bomDataValue.isEdit"
-                             type="primary"
-                             text
-                             @click="addBomItem(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="productName" />
-      <el-table-column label="瑙勬牸鍨嬪彿"
-                       prop="model" />
-    </el-table>
-    <ProductSelectDialog v-if="bomDataValue.showProductDialog"
-                         v-model:model-value="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' ? '鏂板宸ヨ壓璺嚎椤圭洰' : '缂栬緫宸ヨ壓璺嚎椤圭洰'"
@@ -358,10 +267,12 @@
                :rules="rules"
                label-width="120px">
         <el-form-item label="宸ュ簭"
+                      v-if="operationType === 'add' || pageType === 'route'"
                       prop="technologyOperationId">
           <el-select v-model="form.technologyOperationId"
                      placeholder="璇烽�夋嫨宸ュ簭"
                      clearable
+                     @change="processChange"
                      style="width: 100%">
             <el-option v-for="process in processOptions"
                        :key="process.id"
@@ -369,27 +280,54 @@
                        :value="process.id" />
           </el-select>
         </el-form-item>
+        <el-form-item label="宸ュ簭"
+                      v-else>
+          <span>{{ getProcessName(form.technologyOperationId) }}</span>
+        </el-form-item>
         <el-form-item label="浜у搧鍚嶇О"
+                      v-if="operationType === 'add' || pageType === 'route'"
                       prop="productModelId">
           <el-button type="primary"
                      @click="showProductSelectDialog = true">
-            {{ form.productName && form.model 
-              ? `${form.productName} - ${form.model}` 
+            {{ form.productName
+              ? (form.model ? `${form.productName} - ${form.model}` : form.productName)
               : '閫夋嫨浜у搧' }}
           </el-button>
         </el-form-item>
+        <el-form-item label="浜у搧鍚嶇О"
+                      v-else>
+          <span>{{ form.productName }}{{ form.model ? ' - ' + form.model : '' }}</span>
+        </el-form-item>
         <el-form-item label="鍗曚綅"
+                      v-if="operationType === 'add' || pageType === 'route'"
                       prop="unit">
           <el-input v-model="form.unit"
                     :placeholder="form.productModelId ? '鏍规嵁閫夋嫨鐨勪骇鍝佽嚜鍔ㄥ甫鍑�' : '璇峰厛閫夋嫨浜у搧'"
                     clearable
                     :disabled="true" />
         </el-form-item>
+        <el-form-item label="鍗曚綅"
+                      v-else>
+          <span>{{ form.unit }}</span>
+        </el-form-item>
+        <el-form-item label="璁¤垂绫诲瀷"
+                      prop="type">
+          <el-radio-group v-model="form.type">
+            <el-radio :label="0">璁℃椂</el-radio>
+            <el-radio :label="1">璁′欢</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="鏄惁璐ㄦ"
                       prop="isQuality">
           <el-switch v-model="form.isQuality"
                      :active-value="true"
-                     inactive-value="false" />
+                     :inactive-value="false" />
+        </el-form-item>
+        <el-form-item label="鏄惁鐢熶骇"
+                      prop="isProduction">
+          <el-switch v-model="form.isProduction"
+                     :active-value="true"
+                     :inactive-value="false" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -404,14 +342,14 @@
                          @confirm="handleProductSelect"
                          single />
     <!-- 鍙傛暟鍒楄〃瀵硅瘽妗� -->
-    <!-- :editable="!routeInfo.status" -->
     <ProcessParamListDialog v-model="showParamListDialog"
-                            :title="`${currentProcess ? (currentProcess.processName || getProcessName(currentProcess.technologyOperationId)) : ''} - 鍙傛暟鍒楄〃`"
+                            :title="`${currentProcess ? (currentProcess.processName || currentProcess.technologyOperationName || currentProcess.operationName) : ''} - 鍙傛暟鍒楄〃`"
                             :route-id="routeId"
                             :order-id="orderId"
                             :process="currentProcess"
                             :page-type="pageType"
                             :param-list="paramList"
+                            :editable="editable"
                             @getsyncProcessParamItem="getsyncProcessParamItem"
                             @refresh="refreshParamList" />
   </div>
@@ -436,7 +374,10 @@
     batchDeleteProcessRouteItem,
     getProcessParamList,
   } from "@/api/productionManagement/processRouteItem.js";
-  import { syncProcessParamItem } from "@/api/productionManagement/processRouteItem.js";
+  import {
+    syncProcessParamItem,
+    syncProcessParamItemOrder,
+  } from "@/api/productionManagement/processRouteItem.js";
   import {
     findProductProcessRouteItemList,
     deleteRouteItem,
@@ -446,11 +387,13 @@
     sortRouteItem,
   } from "@/api/productionManagement/productProcessRoute.js";
   import { processList } from "@/api/productionManagement/productionProcess.js";
-  import { listProcessBom } from "@/api/productionManagement/productionOrder.js";
+  import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
   import {
-    queryList,
-    addBomDetail,
-  } from "@/api/productionManagement/productStructure.js";
+    attachmentList,
+    deleteAttachment,
+    createAttachment,
+  } from "@/api/basicData/storageAttachment.js";
+
   import { useRoute } from "vue-router";
   import { ElMessageBox, ElMessage } from "element-plus";
   import Sortable from "sortablejs";
@@ -461,6 +404,8 @@
   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 technologyRoutingId = computed(() => route.query.technologyRoutingId);
 
   const tableLoading = ref(false);
   const tableData = ref([]);
@@ -475,9 +420,68 @@
     processRouteCode: "",
     productName: "",
     model: "",
-    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);
@@ -505,6 +509,8 @@
     model: "",
     unit: "",
     isQuality: false,
+    type: 0,
+    isProduction: false,
   });
 
   const rules = {
@@ -523,17 +529,31 @@
       type: "warning",
     })
       .then(() => {
-        syncProcessParamItem({
-          replaceExisting: true,
-          technologyRoutingOperationId: currentProcess.value.id,
-        }).then(res => {
-          if (res.code === 200) {
-            ElMessage.success("鍚屾鎴愬姛");
-            refreshParamList();
-          } else {
-            ElMessage.error(res.msg || "鍚屾澶辫触");
-          }
-        });
+        if (pageType.value === "order") {
+          syncProcessParamItemOrder({
+            replaceExisting: true,
+            technologyRoutingOperationId: currentProcess.value.id,
+          }).then(res => {
+            if (res.code === 200) {
+              ElMessage.success("鍚屾鎴愬姛");
+              refreshParamList();
+            } else {
+              ElMessage.error(res.msg || "鍚屾澶辫触");
+            }
+          });
+        } else {
+          syncProcessParamItem({
+            replaceExisting: true,
+            technologyRoutingOperationId: currentProcess.value.id,
+          }).then(res => {
+            if (res.code === 200) {
+              ElMessage.success("鍚屾鎴愬姛");
+              refreshParamList();
+            } else {
+              ElMessage.error(res.msg || "鍚屾澶辫触");
+            }
+          });
+        }
       })
       .catch(() => {});
   };
@@ -576,7 +596,6 @@
     processList({ size: -1, current: -1 })
       .then(res => {
         processOptions.value = res.data.records || [];
-        bomDataValue.value.processOptions = processOptions.value;
       })
       .catch(err => {
         console.error("鑾峰彇宸ュ簭澶辫触锛�", err);
@@ -589,14 +608,11 @@
       processRouteCode: route.query.processRouteCode || "",
       productName: route.query.productName || "",
       model: route.query.model || "",
-      bomNo: route.query.bomNo || "",
-      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;
-    bomTableData.value[0].model = routeInfo.value.model;
-    bomTableData.value[0].bomNo = routeInfo.value.bomNo;
   };
 
   // 鏂板
@@ -618,6 +634,8 @@
       model: row.model || "",
       unit: row.unit || "",
       isQuality: row.isQuality,
+      type: row.type || 0,
+      isProduction: row.isProduction,
     };
     dialogVisible.value = true;
   };
@@ -650,15 +668,20 @@
 
   // 浜у搧閫夋嫨
   const handleProductSelect = products => {
+    console.log(products, "===products===");
     if (products && products.length > 0) {
       const product = products[0];
-      form.value.productModelId = product.id;
-      form.value.productName = product.productName;
-      form.value.model = product.model;
-      form.value.unit = product.unit || "";
+      console.log(product, "product");
+      form.value = {
+        ...form.value,
+        productModelId: product.id,
+        productName: product.productName,
+        model: product.model,
+        unit: product.unit || "",
+      };
       showProductSelectDialog.value = false;
       // 瑙﹀彂琛ㄥ崟楠岃瘉
-      formRef.value?.validateField("productModelId");
+      // formRef.value?.validateField("productModelId");
     }
   };
 
@@ -676,11 +699,15 @@
 
           const addPromise = isOrderPage
             ? addRouteItem({
-                productOrderId: orderId.value,
-                productRouteId: routeId.value,
+                productionOrderId: Number(orderId.value),
+                orderRoutingId: Number(routeId.value),
                 technologyOperationId: form.value.technologyOperationId,
+                technologyRoutingId: Number(routeId.value),
+                operationName: getProcessName(form.value.technologyOperationId),
                 productModelId: form.value.productModelId,
                 isQuality: form.value.isQuality,
+                type: form.value.type,
+                isProduction: form.value.isProduction,
                 dragSort,
               })
             : addOrUpdateProcessRouteItem({
@@ -688,6 +715,8 @@
                 technologyOperationId: form.value.technologyOperationId,
                 productModelId: form.value.productModelId,
                 isQuality: form.value.isQuality,
+                type: form.value.type,
+                isProduction: form.value.isProduction,
                 dragSort,
               });
 
@@ -711,8 +740,11 @@
             ? addOrUpdateProductProcessRouteItem({
                 id: form.value.id,
                 technologyOperationId: form.value.technologyOperationId,
+                operationName: getProcessName(form.value.technologyOperationId),
                 productModelId: form.value.productModelId,
                 isQuality: form.value.isQuality,
+                type: form.value.type,
+                isProduction: form.value.isProduction,
               })
             : addOrUpdateProcessRouteItem1({
                 technologyRoutingId: Number(routeId.value),
@@ -720,6 +752,8 @@
                 productModelId: form.value.productModelId,
                 id: form.value.id,
                 isQuality: form.value.isQuality,
+                type: form.value.type,
+                isProduction: form.value.isProduction,
               });
 
           updatePromise
@@ -749,6 +783,9 @@
       productName: "",
       model: "",
       unit: "",
+      isQuality: false,
+      type: 0,
+      isProduction: false,
     };
     formRef.value?.resetFields();
   };
@@ -762,15 +799,19 @@
   // 鏌ョ湅鍙傛暟鍒楄〃
   const handleViewParams = row => {
     currentProcess.value = row;
-    const query = {
+    const param = {
+      productionOrderRoutingOperationId: row.id,
+      productionOrderId: orderId.value,
+    };
+    const param1 = {
       technologyRoutingOperationId: row.id,
-      orderId: orderId.value,
+      productionOrderId: orderId.value,
     };
 
     const apiPromise =
       pageType.value === "order"
-        ? findProcessParamListOrder(query)
-        : getProcessParamList(query);
+        ? findProcessParamListOrder(param)
+        : getProcessParamList(param1);
 
     apiPromise
       .then(res => {
@@ -793,6 +834,7 @@
   // 鍒濆鍖栨嫋鎷芥帓搴�
   const initSortable = () => {
     destroySortable();
+    if (!editable.value) return;
 
     if (viewMode.value === "table") {
       // 琛ㄦ牸瑙嗗浘鐨勬嫋鎷芥帓搴�
@@ -925,312 +967,27 @@
     }
   };
 
-  // BOM鐩稿叧鐘舵�佸拰鏂规硶
-  const bomTableData = ref([
-    {
-      productName: "",
-      model: "",
-      bomNo: "",
-    },
-  ]);
-
-  const bomDataValue = ref({
-    dataList: [],
-    processOptions: [],
-    showProductDialog: false,
-    currentRowName: null,
-    loading: false,
-    isEdit: false,
-  });
-
-  const syncProcessOperationFields = item => {
-    const processId = item.processId ?? item.operationId ?? "";
-    if (!processId) {
-      item.processId = "";
-      return;
-    }
-    const option = bomDataValue.value.processOptions.find(
-      p => p.id === processId
-    );
-    const processName =
-      option?.name || item.processName || item.operationName || "";
-
-    item.processId = processId;
-    item.operationId = processId;
-    item.processName = processName;
-    item.operationName = processName;
-  };
-
-  const normalizeTreeData = items => {
-    items.forEach(item => {
-      item.tempId = item.tempId || item.id || `${Date.now()}_${Math.random()}`;
-      syncProcessOperationFields(item);
-      if (Array.isArray(item.children) && item.children.length > 0) {
-        normalizeTreeData(item.children);
+  const processChange = value => {
+    processOptions.value.forEach(item => {
+      if (item.id == value) {
+        form.value.isQuality = item.isQuality;
+        form.value.type = item.type || 0;
+        form.value.isProduction = item.isProduction;
       }
     });
   };
 
-  const handleBomProcessChange = (row, value) => {
-    row.processId = value || "";
-    syncProcessOperationFields(row);
-  };
-
-  const openBomDialog = tempId => {
-    bomDataValue.value.currentRowName = tempId;
-    bomDataValue.value.showProductDialog = true;
-  };
-
-  const fetchBomData = async () => {
-    try {
-      const { data } = await queryList(routeInfo.value.bomId);
-      bomDataValue.value.dataList = data || [];
-      normalizeTreeData(bomDataValue.value.dataList);
-    } catch (err) {
-      console.error("鑾峰彇BOM鏁版嵁澶辫触锛�", err);
-    }
-  };
-
-  const childItem = (item, tempId, productData) => {
-    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) {
-      for (let child of item.children) {
-        if (childItem(child, tempId, productData)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  };
-
-  const handleBomProduct = row => {
-    if (!Array.isArray(row) || row.length === 0) {
-      ElMessage.warning("璇烽�夋嫨涓�涓骇鍝�");
-      return;
-    }
-    const productData = row[row.length - 1];
-
-    const isTopLevel = bomDataValue.value.dataList.some(
-      item => item.tempId === bomDataValue.value.currentRowName
-    );
-    if (isTopLevel) {
-      if (
-        productData.productName === bomTableData.value[0].productName &&
-        productData.model === bomTableData.value[0].model
-      ) {
-        const hasOther = bomDataValue.value.dataList.some(
-          item =>
-            item.tempId !== bomDataValue.value.currentRowName &&
-            item.productName === bomTableData.value[0].productName &&
-            item.model === bomTableData.value[0].model
-        );
-        if (hasOther) {
-          ElMessage.warning("鏈�澶栧眰鍜屽綋鍓嶄骇鍝佷竴鏍风殑涓�绾у彧鑳芥湁涓�涓�");
-          return;
-        }
-      }
-    }
-    bomDataValue.value.dataList.forEach(item => {
-      if (item.tempId === bomDataValue.value.currentRowName) {
-        item.productName = productData.productName;
-        item.model = productData.model;
-        item.productModelId = productData.id;
-        item.unit = productData.unit || "";
-        return;
-      }
-      childItem(item, bomDataValue.value.currentRowName, productData);
-    });
-    bomDataValue.value.showProductDialog = false;
-  };
-
-  const removeBomItem = tempId => {
-    const topIndex = bomDataValue.value.dataList.findIndex(
-      item => item.tempId === tempId
-    );
-    if (topIndex !== -1) {
-      bomDataValue.value.dataList.splice(topIndex, 1);
-      return;
-    }
-
-    const delchildItem = (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 (delchildItem(item.children, tempId)) {
-            return true;
-          }
-        }
-      }
-      return false;
-    };
-
-    bomDataValue.value.dataList.forEach(item => {
-      if (item.children && item.children.length > 0) {
-        delchildItem(item.children, tempId);
-      }
-    });
-  };
-
-  const addchildItem = (item, tempId) => {
-    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: "",
-        operationId: "",
-        operationName: "",
-        unitQuantity: 1,
-        demandedQuantity: 0,
-        children: [],
-        unit: "",
-        tempId: new Date().getTime(),
-      });
-      return true;
-    }
-    if (item.children && item.children.length > 0) {
-      for (let child of item.children) {
-        if (addchildItem(child, tempId)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  };
-
-  const addBomItem = tempId => {
-    bomDataValue.value.dataList.forEach(item => {
-      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: "",
-          operationId: "",
-          operationName: "",
-          unitQuantity: 1,
-          demandedQuantity: 0,
-          unit: "",
-          children: [],
-          tempId: new Date().getTime(),
-        });
-        return;
-      }
-      addchildItem(item, tempId);
-    });
-  };
-
-  const validateAllBom = () => {
-    let isValid = true;
-    const isOrderPage = pageType.value === "order";
-
-    const validateItem = (item, isTopLevel = false) => {
-      if (!item.model) {
-        ElMessage.error("璇烽�夋嫨瑙勬牸");
-        isValid = false;
-        return;
-      }
-      if (!isTopLevel && !item.processId) {
-        ElMessage.error("璇烽�夋嫨娑堣�楀伐搴�");
-        isValid = false;
-        return;
-      }
-      if (!item.unitQuantity) {
-        ElMessage.error("璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺");
-        isValid = false;
-        return;
-      }
-      if (isOrderPage && !item.demandedQuantity) {
-        ElMessage.error("璇疯緭鍏ラ渶姹傛�婚噺");
-        isValid = false;
-        return;
-      }
-
-      if (item.children && item.children.length > 0) {
-        item.children.forEach(child => {
-          validateItem(child, false);
-        });
-      }
-    };
-
-    bomDataValue.value.dataList.forEach(item => {
-      validateItem(item, true);
-    });
-
-    return isValid;
-  };
-
-  const buildSubmitTree = items => {
-    return items.map(item => {
-      const current = { ...item };
-      syncProcessOperationFields(current);
-      current.children = Array.isArray(current.children)
-        ? buildSubmitTree(current.children)
-        : [];
-      return current;
-    });
-  };
-
-  const cancelEditBom = () => {
-    bomDataValue.value.isEdit = false;
-    fetchBomData();
-  };
-
-  const handleSaveBom = () => {
-    bomDataValue.value.loading = true;
-    normalizeTreeData(bomDataValue.value.dataList);
-
-    const valid = validateAllBom();
-    if (valid) {
-      addBomDetail({
-        bomId: routeInfo.value.bomId,
-        children: buildSubmitTree(bomDataValue.value.dataList || []),
-      })
-        .then(() => {
-          ElMessage.success("BOM淇濆瓨鎴愬姛");
-          bomDataValue.value.isEdit = false;
-          fetchBomData();
-        })
-        .catch(() => {
-          ElMessage.error("BOM淇濆瓨澶辫触");
-        })
-        .finally(() => {
-          bomDataValue.value.loading = false;
-        });
-    } else {
-      bomDataValue.value.loading = false;
+  const refreshCurrentPage = () => {
+    getRouteInfo();
+    getList();
+    getProcessList();
+    if (pageType.value === "order") {
+      getAttachmentList();
     }
   };
 
   onMounted(() => {
-    getRouteInfo();
-    getList();
-    getProcessList();
-    fetchBomData();
+    refreshCurrentPage();
   });
 
   onUnmounted(() => {
@@ -1497,4 +1254,4 @@
     line-height: 1.5;
     word-break: break-all;
   }
-</style>
+</style>
\ No newline at end of file

--
Gitblit v1.9.3