From d460a2475ccf345d119701f3c631584f747ce2f5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 15 六月 2026 17:17:25 +0800
Subject: [PATCH] 君歌 1.不需要bom、生产核算 2.新增销售台账后自动生成一个生产订单,然后对订单进行排产 3.生产排产要求可以选择计划时间,时间格式为年月日+时分秒;也要可以多选报工人 4.web和app生产报工中要细分报工开始和报工结束两个操作,根据操作的提交时间记录实际报工时长展示报工台账中 5.报工人选择的谁,只有在相关账号才能看到可报工的数据 6.不合格管理字段按照单据进行修改。 7.生产工时、质量问题汇总、客户档案、销售及回款都能从各模块中导出数据

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

diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index 3c52410..db7905d 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -30,14 +30,6 @@
             <span class="info-value">{{ routeInfo.model || '-' }}</span>
           </div>
         </div>
-        <div class="info-item">
-          <div class="info-label-wrapper">
-            <span class="info-label">BOM缂栧彿</span>
-          </div>
-          <div class="info-value-wrapper">
-            <span class="info-value">{{ routeInfo.bomNo || '-' }}</span>
-          </div>
-        </div>
         <div class="info-item"
              v-if="routeInfo.quantity && routeInfo.quantity !== 0">
           <div class="info-label-wrapper">
@@ -253,164 +245,6 @@
         </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' && editable">
-        <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>
-          <el-form ref="bomFormRef"
-                   :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%"
-                                     @change="handleUnitQuantityChange"
-                                     :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="true" />
-                  </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="bomDataValue.showProductDialog"
-                         :single="true"
-                         @confirm="handleBomProduct" />
     <!-- 涓婁紶缁勪欢寮圭獥 -->
     <el-dialog v-model="uploadDialogVisible"
                title="涓婁紶闄勪欢"
@@ -553,12 +387,6 @@
     sortRouteItem,
   } from "@/api/productionManagement/productProcessRoute.js";
   import { processList } from "@/api/productionManagement/productionProcess.js";
-  import { listProcessBom } from "@/api/productionManagement/productionOrder.js";
-  import {
-    queryList,
-    queryList2,
-    add2,
-  } from "@/api/productionManagement/productStructure.js";
   import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
   import {
     attachmentList,
@@ -584,7 +412,6 @@
   const dialogVisible = ref(false);
   const operationType = ref("add"); // add | edit
   const formRef = ref(null);
-  const bomFormRef = ref(null);
   const submitLoading = ref(false);
   const cardsContainer = ref(null);
   const tableRef = ref(null);
@@ -593,7 +420,6 @@
     processRouteCode: "",
     productName: "",
     model: "",
-    bomNo: "",
     description: "",
     quantity: 0,
     technologyRoutingId: "",
@@ -770,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);
@@ -783,16 +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;
   };
 
   // 鏂板
@@ -1147,103 +967,6 @@
     }
   };
 
-  // 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 ?? item.technologyOperationId ?? "";
-    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;
-    if (pageType.value === "order") {
-      item.technologyOperationId = processId;
-    } else {
-      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 toQuantityNumber = value => {
-    const numberValue = Number(value);
-    if (!Number.isFinite(numberValue)) {
-      return 0;
-    }
-    return Number(numberValue.toFixed(2));
-  };
-
-  const syncDemandedQuantityTree = (items, parentDemandedQuantity = null) => {
-    items.forEach(item => {
-      if (parentDemandedQuantity !== null) {
-        item.demandedQuantity = toQuantityNumber(
-          parentDemandedQuantity * toQuantityNumber(item.unitQuantity)
-        );
-      }
-
-      if (Array.isArray(item.children) && item.children.length > 0) {
-        syncDemandedQuantityTree(
-          item.children,
-          toQuantityNumber(item.demandedQuantity)
-        );
-      }
-    });
-  };
-
-  const recalculateDemandedQuantities = () => {
-    if (pageType.value !== "order") {
-      return;
-    }
-
-    const rootDemandedQuantity = routeInfo.value.quantity;
-    if (
-      rootDemandedQuantity === undefined ||
-      rootDemandedQuantity === null ||
-      rootDemandedQuantity === ""
-    ) {
-      syncDemandedQuantityTree(bomDataValue.value.dataList);
-      return;
-    }
-
-    syncDemandedQuantityTree(
-      bomDataValue.value.dataList,
-      toQuantityNumber(rootDemandedQuantity)
-    );
-  };
-
   const processChange = value => {
     processOptions.value.forEach(item => {
       if (item.id == value) {
@@ -1254,340 +977,10 @@
     });
   };
 
-  const findSiblings = (items, tempId) => {
-    if (!items || items.length === 0) return null;
-    // 妫�鏌ュ綋鍓嶅眰绾�
-    if (items.some(item => item.tempId === tempId)) {
-      return items;
-    }
-    // 閫掑綊鏌ユ壘瀛愮骇
-    for (const item of items) {
-      if (item.children && item.children.length > 0) {
-        const result = findSiblings(item.children, tempId);
-        if (result) return result;
-      }
-    }
-    return null;
-  };
-
-  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
-        );
-      });
-      if (hasDifferentProcess) {
-        ElMessage.warning("鍚屼竴灞傜骇宸插瓨鍦ㄤ笉鍚岀殑宸ュ簭锛岃鍏堢粺涓�宸ュ簭鍚庡啀杩涜淇敼");
-      }
-    }
-  };
-
-  const openBomDialog = tempId => {
-    bomDataValue.value.currentRowName = tempId;
-    bomDataValue.value.showProductDialog = true;
-  };
-
-  const fetchBomData = async () => {
-    try {
-      const isOrderPage = pageType.value === "order";
-      const { data } = await (isOrderPage ? queryList2 : queryList)(
-        routeInfo.value.bomId
-      );
-      bomDataValue.value.dataList = data || [];
-      normalizeTreeData(bomDataValue.value.dataList);
-      recalculateDemandedQuantities();
-    } 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 handleUnitQuantityChange = () => {
-    recalculateDemandedQuantities();
-  };
-
-  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: "",
-        [pageType.value === "order" ? "technologyOperationId" : "operationId"]:
-          "",
-        operationName: "",
-        unitQuantity: 1,
-        demandedQuantity: 0,
-        children: [],
-        unit: "",
-        tempId: new Date().getTime(),
-      });
-      recalculateDemandedQuantities();
-      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: "",
-          [pageType.value === "order" ? "technologyOperationId" : "operationId"]:
-            "",
-          operationName: "",
-          unitQuantity: 1,
-          demandedQuantity: 0,
-          unit: "",
-          children: [],
-          tempId: new Date().getTime(),
-        });
-        recalculateDemandedQuantities();
-        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);
-        });
-      }
-    };
-
-    // 鏍¢獙鍚屼竴灞傜骇鐨勫伐搴忔槸鍚︿竴鑷�
-    const validateProcessConsistency = items => {
-      if (!items || items.length === 0) return;
-
-      // 妫�鏌ュ綋鍓嶅眰绾�
-      const processes = items
-        .filter(item => item.processId)
-        .map(item => item.processId);
-      if (processes.length > 1) {
-        const uniqueProcesses = [...new Set(processes)];
-        if (uniqueProcesses.length > 1) {
-          ElMessage.error("鍚屼竴灞傜骇鐨勫伐搴忓繀椤讳竴鑷�");
-          isValid = false;
-          return;
-        }
-      }
-
-      // 閫掑綊妫�鏌ュ瓙绾�
-      items.forEach(item => {
-        if (item.children && item.children.length > 0) {
-          validateProcessConsistency(item.children);
-        }
-      });
-    };
-
-    bomDataValue.value.dataList.forEach(item => {
-      validateItem(item, true);
-    });
-
-    validateProcessConsistency(bomDataValue.value.dataList);
-
-    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;
-    console.log(bomDataValue.value.dataList, "bomDataValue.value.dataList");
-
-    normalizeTreeData(bomDataValue.value.dataList);
-    recalculateDemandedQuantities();
-
-    const valid = validateAllBom();
-    if (valid) {
-      add2({
-        // bomId: Number(routeInfo.value.bomId),
-        productionOrderBomId: Number(routeInfo.value.bomId) || null,
-        children: buildSubmitTree(bomDataValue.value.dataList || []),
-      })
-        .then(() => {
-          ElMessage.success("BOM淇濆瓨鎴愬姛");
-          bomDataValue.value.isEdit = false;
-          refreshCurrentPage();
-        })
-        .catch(() => {
-          ElMessage.error("BOM淇濆瓨澶辫触");
-        })
-        .finally(() => {
-          bomDataValue.value.loading = false;
-        });
-    } else {
-      bomDataValue.value.loading = false;
-    }
-  };
-
   const refreshCurrentPage = () => {
     getRouteInfo();
     getList();
     getProcessList();
-    fetchBomData();
     if (pageType.value === "order") {
       getAttachmentList();
     }

--
Gitblit v1.9.3