From 4be9b07e00bea78ae394aec67062b4db9895b565 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期六, 14 三月 2026 15:46:21 +0800
Subject: [PATCH] BOM产品选择弹窗改接口

---
 src/views/productionManagement/productionProcess/index.vue |  548 +++++------
 src/views/inventoryManagement/stockManagement/New.vue      |  289 +++---
 src/views/productionManagement/processRoute/index.vue      |    8 
 src/views/basicData/product/ProductSelectDialog.vue        |  322 ++++---
 src/views/productionManagement/productionOrder/New.vue     |  279 +++---
 src/views/basicData/parameterMaintenance/index.vue         |  118 +-
 src/views/inventoryManagement/stockManagement/Subtract.vue |  310 +++---
 src/views/productionManagement/productStructure/index.vue  |  824 +++++++++--------
 8 files changed, 1,365 insertions(+), 1,333 deletions(-)

diff --git a/src/views/basicData/parameterMaintenance/index.vue b/src/views/basicData/parameterMaintenance/index.vue
index 367f587..67ed7ef 100644
--- a/src/views/basicData/parameterMaintenance/index.vue
+++ b/src/views/basicData/parameterMaintenance/index.vue
@@ -54,6 +54,7 @@
         <el-form-item label="鍙傛暟绫诲瀷"
                       prop="paramType">
           <el-select v-model="formData.paramType"
+                     @change="handleParamTypeChange"
                      placeholder="璇烽�夋嫨鍙傛暟绫诲瀷">
             <el-option label="鏁板�兼牸寮�"
                        value="1" />
@@ -68,7 +69,6 @@
         <el-form-item label="鍙栧�兼ā寮�"
                       prop="valueMode">
           <el-select v-model="formData.valueMode"
-                     @change="handleValueModeChange"
                      placeholder="璇烽�夋嫨鍙栧�兼ā寮�">
             <el-option label="鍗曞��"
                        value="1" />
@@ -81,23 +81,33 @@
           <el-input v-model="formData.unit"
                     placeholder="璇疯緭鍏ュ崟浣�" />
         </el-form-item>
-        <el-form-item label="榛樿鍊�"
-                      v-if="formData.valueMode === '1'"
-                      prop="defaultValue">
-          <el-input v-model="formData.defaultValue"
-                    placeholder="璇疯緭鍏ラ粯璁ゅ��" />
+        <el-form-item label="鍙栧�兼牸寮�"
+                      v-if="formData.paramType == '1' || formData.paramType == '2'"
+                      prop="paramFormat">
+          <el-input v-model="formData.paramFormat"
+                    placeholder="璇疯緭鍏ュ彇鍊兼牸寮�" />
         </el-form-item>
-        <el-form-item label="鏈�灏忓��"
-                      v-if="formData.valueMode === '2'"
-                      prop="defaultMin">
-          <el-input v-model="formData.defaultMin"
-                    placeholder="璇疯緭鍏ユ渶灏忓��" />
+        <el-form-item label="涓嬫媺瀛楀吀"
+                      v-else-if="formData.paramType == '3'"
+                      prop="paramFormat">
+          <el-select v-model="formData.paramFormat"
+                     placeholder="璇烽�夋嫨鍙栧�兼ā寮�">
+            <el-option v-for="item in dictTypes"
+                       :key="item.dictType"
+                       :label="item.dictName"
+                       :value="item.dictType" />
+          </el-select>
         </el-form-item>
-        <el-form-item label="鏈�澶у��"
-                      v-if="formData.valueMode === '2'"
-                      prop="defaultMax">
-          <el-input v-model="formData.defaultMax"
-                    placeholder="璇疯緭鍏ユ渶澶у��" />
+        <el-form-item label="鏃堕棿鏍煎紡"
+                      v-else-if="formData.paramType == '4'"
+                      prop="paramFormat">
+          <el-select v-model="formData.paramFormat"
+                     placeholder="璇烽�夋嫨鍙栧�兼ā寮�">
+            <el-option label="YYYY-MM-DD"
+                       value="YYYY-MM-DD" />
+            <el-option label="YYYY-MM-DD HH:mm:ss"
+                       value="YYYY-MM-DD HH:mm:ss" />
+          </el-select>
         </el-form-item>
         <el-form-item label="鏄惁蹇呭~"
                       prop="isRequired">
@@ -242,24 +252,14 @@
       prop: "unit",
     },
     {
-      label: "榛樿鍊�",
-      prop: "defaultValue",
+      label: "鍙栧�兼牸寮�",
+      prop: "paramFormat",
       formatData: (val, row) => {
-        return row.valueMode === 2 ? "-" : val;
-      },
-    },
-    {
-      label: "鏈�灏忓��",
-      prop: "defaultMin",
-      formatData: (val, row) => {
-        return row.valueMode === 1 ? "-" : val;
-      },
-    },
-    {
-      label: "鏈�澶у��",
-      prop: "defaultMax",
-      formatData: (val, row) => {
-        return row.valueMode === 1 ? "-" : val;
+        if (row.paramType == "3") {
+          const dict = dictTypes.value.find(item => item.dictType === val);
+          return dict ? "瀛楀吀:" + dict.dictName : val;
+        }
+        return val;
       },
     },
     {
@@ -308,15 +308,6 @@
     size: 10,
     total: 0,
   });
-  const handleValueModeChange = val => {
-    if (val === "2") {
-      formData.defaultMin = "";
-      formData.defaultMax = "";
-    } else {
-      formData.defaultValue = "";
-    }
-  };
-
   // 鎼滅储琛ㄥ崟
   const searchForm = reactive({
     paramName: "",
@@ -333,9 +324,6 @@
     paramType: "",
     valueMode: "1",
     unit: "",
-    defaultValue: "",
-    defaultMin: "",
-    defaultMax: "",
     isRequired: "0",
     remark: "",
   });
@@ -343,7 +331,20 @@
     paramName: [{ required: true, message: "璇疯緭鍏ュ弬鏁板悕绉�", trigger: "blur" }],
     paramType: [{ required: true, message: "璇烽�夋嫨鍙傛暟绫诲瀷", trigger: "change" }],
     valueMode: [{ required: true, message: "璇烽�夋嫨鍙栧�兼ā寮�", trigger: "change" }],
-    unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
+    unit: [
+      {
+        required: false,
+        message: "璇疯緭鍏ュ崟浣�",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          if (formData.paramType === "1" && !value) {
+            callback(new Error("鏁板�肩被鍨嬪繀椤诲~鍐欏崟浣�"));
+          } else {
+            callback();
+          }
+        },
+      },
+    ],
   });
   // const productTypes = ref([]);
   const isEdit = ref(false);
@@ -364,13 +365,17 @@
   //   typeName: [{ required: true, message: "璇疯緭鍏ョ被鍨嬪悕绉�", trigger: "blur" }],
   // });
   // const isProductTypeEdit = ref(false);
-  const handleParameterTypeChange = () => {
-    if (formData.parameterType === "鏁板�兼牸寮�") {
-      formData.parameterFormat = "#.0000";
-    } else if (formData.parameterType === "鏃堕棿鏍煎紡") {
-      formData.parameterFormat = "YYYY-MM-DD HH:mm:ss";
+  const handleParamTypeChange = () => {
+    if (formData.paramType === "1") {
+      formData.paramFormat = "#.0000";
+    } else if (formData.paramType === "4") {
+      formData.paramFormat = "YYYY-MM-DD HH:mm:ss";
     } else {
-      formData.parameterFormat = "";
+      formData.paramFormat = "";
+    }
+    // 瑙﹀彂鍗曚綅瀛楁楠岃瘉
+    if (formRef.value) {
+      formRef.value.validateField("unit");
     }
   };
   // 浜у搧绫诲瀷缁存姢鎸夐挳鐐瑰嚮浜嬩欢 - 宸叉敞閲�
@@ -491,9 +496,6 @@
     formData.paramType = "";
     formData.valueMode = "1";
     formData.unit = "";
-    formData.defaultValue = "";
-    formData.defaultMin = "";
-    formData.defaultMax = "";
     formData.isRequired = "0";
     formData.remark = "";
     dialogVisible.value = true;
@@ -510,12 +512,6 @@
     formData.valueMode =
       row.valueMode !== undefined ? String(row.valueMode) : "1";
     formData.unit = row.unit || "";
-    formData.defaultValue =
-      row.defaultValue !== undefined ? String(row.defaultValue) : "";
-    formData.defaultMin =
-      row.defaultMin !== undefined ? String(row.defaultMin) : "";
-    formData.defaultMax =
-      row.defaultMax !== undefined ? String(row.defaultMax) : "";
     formData.isRequired =
       row.isRequired !== undefined ? String(row.isRequired) : "0";
     formData.remark = row.remark || "";
diff --git a/src/views/basicData/product/ProductSelectDialog.vue b/src/views/basicData/product/ProductSelectDialog.vue
index 70dbb16..3c826a5 100644
--- a/src/views/basicData/product/ProductSelectDialog.vue
+++ b/src/views/basicData/product/ProductSelectDialog.vue
@@ -1,39 +1,72 @@
 <template>
-  <el-dialog v-model="visible" title="閫夋嫨浜у搧" width="900px" destroy-on-close :close-on-click-modal="false">
-    <el-form :inline="true" :model="query" class="mb-2">
-      <el-form-item label="浜у搧澶х被">
-        <el-input v-model="query.productName" placeholder="杈撳叆浜у搧澶х被" clearable @keyup.enter="onSearch" />
+  <el-dialog v-model="visible"
+             title="閫夋嫨浜у搧"
+             width="900px"
+             destroy-on-close
+             :close-on-click-modal="false">
+    <el-form :inline="true"
+             :model="query"
+             class="mb-2">
+      <el-form-item label="瑙勬牸">
+        <el-input v-model="query.specification"
+                  placeholder="杈撳叆瑙勬牸"
+                  clearable
+                  @keyup.enter="onSearch" />
       </el-form-item>
-
-      <el-form-item label="鍨嬪彿鍚嶇О">
-        <el-input v-model="query.model" placeholder="杈撳叆鍨嬪彿鍚嶇О" clearable @keyup.enter="onSearch" />
+      <el-form-item label="鐗╂枡缂栫爜">
+        <el-input v-model="query.materialCode"
+                  placeholder="杈撳叆鐗╂枡缂栫爜"
+                  clearable
+                  @keyup.enter="onSearch" />
       </el-form-item>
-
       <el-form-item>
-        <el-button type="primary" @click="onSearch">鎼滅储</el-button>
+        <el-button type="primary"
+                   @click="onSearch">鎼滅储</el-button>
         <el-button @click="onReset">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
-
     <!-- 鍒楄〃 -->
-    <el-table ref="tableRef" v-loading="loading" :data="tableData" height="420" highlight-current-row row-key="id"
-      @selection-change="handleSelectionChange" @select="handleSelect">
-      <el-table-column type="selection" width="55" />
-      <el-table-column type="index" label="搴忓彿" width="60" />
-      <el-table-column prop="productName" label="浜у搧澶х被" min-width="160" />
-      <el-table-column prop="model" label="鍨嬪彿鍚嶇О" min-width="200" />
-      <el-table-column prop="unit" label="鍗曚綅" min-width="160" />
+    <el-table ref="tableRef"
+              v-loading="loading"
+              :data="tableData"
+              height="420"
+              highlight-current-row
+              row-key="skuId"
+              @selection-change="handleSelectionChange"
+              @select="handleSelect">
+      <el-table-column type="selection"
+                       width="55" />
+      <el-table-column type="index"
+                       label="搴忓彿"
+                       width="60" />
+      <el-table-column prop="materialName"
+                       label="浜у搧鍚嶇О"
+                       min-width="160" />
+      <el-table-column prop="materialCode"
+                       label="鐗╂枡缂栫爜"
+                       min-width="200" />
+      <el-table-column prop="specification"
+                       label="瑙勬牸"
+                       min-width="200" />
+      <el-table-column prop="baseUnit"
+                       label="鍗曚綅"
+                       min-width="160" />
     </el-table>
-
     <div class="mt-3 flex justify-end">
-      <el-pagination background layout="total, sizes, prev, pager, next, jumper" :total="total"
-        v-model:page-size="page.pageSize" v-model:current-page="page.pageNum" :page-sizes="[10, 20, 50, 100]"
-        @size-change="onPageChange" @current-change="onPageChange" />
+      <el-pagination background
+                     layout="total, sizes, prev, pager, next, jumper"
+                     :total="total"
+                     v-model:page-size="page.pageSize"
+                     v-model:current-page="page.pageNum"
+                     :page-sizes="[10, 20, 50, 100]"
+                     @size-change="onPageChange"
+                     @current-change="onPageChange" />
     </div>
-
     <template #footer>
       <el-button @click="close()">鍙栨秷</el-button>
-      <el-button type="primary" :disabled="multipleSelection.length === 0" @click="onConfirm">
+      <el-button type="primary"
+                 :disabled="multipleSelection.length === 0"
+                 @click="onConfirm">
         纭畾
       </el-button>
     </template>
@@ -41,140 +74,147 @@
 </template>
 
 <script setup lang="ts">
-import { computed, onMounted, reactive, ref, watch, nextTick } from "vue";
-import { ElMessage } from "element-plus";
-import { productModelList } from '@/api/basicData/productModel'
+  import { computed, onMounted, reactive, ref, watch, nextTick } from "vue";
+  import { ElMessage } from "element-plus";
+  import { modelListPage } from "@/api/basicData/newProduct";
 
-export type ProductRow = {
-  id: number;
-  productName: string;
-  model: string;
-  unit?: string;
-};
+  export type ProductRow = {
+    skuId: number;
+    specification: string;
+    materialCode: string;
+    baseUnit?: string;
+    materialName?: string;
+  };
 
-const props = defineProps<{
-  modelValue: boolean;
-  single?: boolean; // 鏄惁鍙兘閫夋嫨涓�涓紝榛樿false锛堝彲閫夋嫨澶氫釜锛�
-}>();
+  const props = defineProps<{
+    modelValue: boolean;
+    single?: boolean; // 鏄惁鍙兘閫夋嫨涓�涓紝榛樿false锛堝彲閫夋嫨澶氫釜锛�
+  }>();
 
-const emit = defineEmits(['update:modelValue', 'confirm']);
+  const emit = defineEmits(["update:modelValue", "confirm"]);
 
-const visible = computed({
-  get: () => props.modelValue,
-  set: (v) => emit("update:modelValue", v),
-});
+  const visible = computed({
+    get: () => props.modelValue,
+    set: v => emit("update:modelValue", v),
+  });
 
-const query = reactive({
-  productName: "",
-  model: "",
-});
+  const query = reactive({
+    specification: "",
+    materialCode: "",
+  });
 
-const page = reactive({
-  pageNum: 1,
-  pageSize: 10,
-});
+  const page = reactive({
+    pageNum: 1,
+    pageSize: 10,
+  });
 
-const loading = ref(false);
-const tableData = ref<ProductRow[]>([]);
-const total = ref(0);
-const multipleSelection = ref<ProductRow[]>([]);
-const tableRef = ref();
+  const loading = ref(false);
+  const tableData = ref<ProductRow[]>([]);
+  const total = ref(0);
+  const multipleSelection = ref<ProductRow[]>([]);
+  const tableRef = ref();
 
-function close() {
-  visible.value = false;
-}
-
-const handleSelectionChange = (val: ProductRow[]) => {
-  if (props.single && val.length > 1) {
-    // 濡傛灉闄愬埗涓哄崟涓�夋嫨锛屽彧淇濈暀鏈�鍚庝竴涓�変腑鐨�
-    const lastSelected = val[val.length - 1];
-    multipleSelection.value = [lastSelected];
-    // 娓呯┖琛ㄦ牸閫変腑鐘舵�侊紝鐒跺悗閲嶆柊閫変腑鏈�鍚庝竴涓�
-    nextTick(() => {
-      if (tableRef.value) {
-        tableRef.value.clearSelection();
-        tableRef.value.toggleRowSelection(lastSelected, true);
-      }
-    });
-  } else {
-    multipleSelection.value = val;
+  function close() {
+    visible.value = false;
   }
-}
 
-// 澶勭悊鍗曚釜閫夋嫨
-const handleSelect = (selection: ProductRow[], row: ProductRow) => {
-  if (props.single) {
-    // 濡傛灉闄愬埗涓哄崟涓紝娓呯┖鍏朵粬閫夋嫨锛屽彧淇濈暀褰撳墠琛�
-    if (selection.includes(row)) {
-      // 閫変腑褰撳墠琛屾椂锛屾竻绌哄叾浠栭�変腑
-      multipleSelection.value = [row];
+  const handleSelectionChange = (val: ProductRow[]) => {
+    if (props.single && val.length > 1) {
+      // 濡傛灉闄愬埗涓哄崟涓�夋嫨锛屽彧淇濈暀鏈�鍚庝竴涓�変腑鐨�
+      const lastSelected = val[val.length - 1];
+      multipleSelection.value = [lastSelected];
+      // 娓呯┖琛ㄦ牸閫変腑鐘舵�侊紝鐒跺悗閲嶆柊閫変腑鏈�鍚庝竴涓�
       nextTick(() => {
         if (tableRef.value) {
-          tableData.value.forEach((item) => {
-            if (item.id !== row.id) {
-              tableRef.value.toggleRowSelection(item, false);
-            }
-          });
+          tableRef.value.clearSelection();
+          tableRef.value.toggleRowSelection(lastSelected, true);
         }
       });
+    } else {
+      multipleSelection.value = val;
+    }
+  };
+
+  // 澶勭悊鍗曚釜閫夋嫨
+  const handleSelect = (selection: ProductRow[], row: ProductRow) => {
+    if (props.single) {
+      // 濡傛灉闄愬埗涓哄崟涓紝娓呯┖鍏朵粬閫夋嫨锛屽彧淇濈暀褰撳墠琛�
+      if (selection.includes(row)) {
+        // 閫変腑褰撳墠琛屾椂锛屾竻绌哄叾浠栭�変腑
+        multipleSelection.value = [row];
+        nextTick(() => {
+          if (tableRef.value) {
+            tableData.value.forEach(item => {
+              if (item.skuId !== row.skuId) {
+                tableRef.value.toggleRowSelection(item, false);
+              }
+            });
+          }
+        });
+      }
+    }
+  };
+
+  function onSearch() {
+    page.pageNum = 1;
+    loadData();
+  }
+
+  function onReset() {
+    query.specification = "";
+    query.materialCode = "";
+    page.pageNum = 1;
+    loadData();
+  }
+
+  function onPageChange() {
+    loadData();
+  }
+
+  function onConfirm() {
+    if (multipleSelection.value.length === 0) {
+      ElMessage.warning("璇烽�夋嫨涓�鏉′骇鍝�");
+      return;
+    }
+    if (props.single && multipleSelection.value.length > 1) {
+      ElMessage.warning("鍙兘閫夋嫨涓�涓骇鍝�");
+      return;
+    }
+    emit(
+      "confirm",
+      props.single ? [multipleSelection.value[0]] : multipleSelection.value
+    );
+    close();
+  }
+
+  async function loadData() {
+    loading.value = true;
+    try {
+      multipleSelection.value = []; // 缈婚〉/鎼滅储鍚庢竻绌洪�夋嫨鏇寸鍚堥鏈�
+      const res: any = await modelListPage({
+        specification: query.specification.trim(),
+        materialCode: query.materialCode.trim(),
+        current: page.pageNum,
+        size: page.pageSize,
+      });
+      tableData.value = res.data.records;
+      total.value = res.data.total;
+    } finally {
+      loading.value = false;
     }
   }
-}
 
-function onSearch() {
-  page.pageNum = 1;
-  loadData();
-}
+  // 鐩戝惉寮圭獥鎵撳紑锛岄噸缃�夋嫨
+  watch(
+    () => props.modelValue,
+    visible => {
+      if (visible) {
+        multipleSelection.value = [];
+      }
+    }
+  );
 
-function onReset() {
-  query.productName = "";
-  query.model = "";
-  page.pageNum = 1;
-  loadData();
-}
-
-function onPageChange() {
-  loadData();
-}
-
-function onConfirm() {
-  if (multipleSelection.value.length === 0) {
-    ElMessage.warning("璇烽�夋嫨涓�鏉′骇鍝�");
-    return;
-  }
-  if (props.single && multipleSelection.value.length > 1) {
-    ElMessage.warning("鍙兘閫夋嫨涓�涓骇鍝�");
-    return;
-  }
-  emit("confirm", props.single ? [multipleSelection.value[0]] : multipleSelection.value);
-  close();
-}
-
-async function loadData() {
-  loading.value = true;
-  try {
-    multipleSelection.value = []; // 缈婚〉/鎼滅储鍚庢竻绌洪�夋嫨鏇寸鍚堥鏈�
-    const res: any = await productModelList({
-      productName: query.productName.trim(),
-      model: query.model.trim(),
-      current: page.pageNum,
-      size: page.pageSize,
-    });
-    tableData.value = res.records;
-    total.value = res.total;
-  } finally {
-    loading.value = false;
-  }
-}
-
-// 鐩戝惉寮圭獥鎵撳紑锛岄噸缃�夋嫨
-watch(() => props.modelValue, (visible) => {
-  if (visible) {
-    multipleSelection.value = [];
-  }
-});
-
-onMounted(() => {
-  loadData()
-})
+  onMounted(() => {
+    loadData();
+  });
 </script>
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index 1f86fd6..2e79ace 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -1,71 +1,67 @@
 <template>
   <div>
-    <el-dialog
-        v-model="isShow"
-        title="鏂板搴撳瓨"
-        width="800"
-        @close="closeModal"
-    >
-      <el-form label-width="140px" :model="formState" label-position="top" ref="formRef">
-        <el-form-item
-            label="浜у搧鍚嶇О"
-            prop="productModelId"
-            :rules="[
+    <el-dialog v-model="isShow"
+               title="鏂板搴撳瓨"
+               width="800"
+               @close="closeModal">
+      <el-form label-width="140px"
+               :model="formState"
+               label-position="top"
+               ref="formRef">
+        <el-form-item label="浜у搧鍚嶇О"
+                      prop="productModelId"
+                      :rules="[
                 {
                 required: true,
                 message: '璇烽�夋嫨浜у搧',
                 trigger: 'change',
               }
-            ]"
-        >
-          <el-button type="primary" @click="showProductSelectDialog = true">
+            ]">
+          <el-button type="primary"
+                     @click="showProductSelectDialog = true">
             {{ formState.productName ? formState.productName : '閫夋嫨浜у搧' }}
           </el-button>
         </el-form-item>
-
-        <el-form-item
-            label="瑙勬牸"
-            prop="productModelName"
-        >
-          <el-input v-model="formState.productModelName"  disabled />
+        <el-form-item label="瑙勬牸"
+                      prop="productModelName">
+          <el-input v-model="formState.productModelName"
+                    disabled />
         </el-form-item>
-
-        <el-form-item
-            label="鍗曚綅"
-            prop="unit"
-        >
-          <el-input v-model="formState.unit"  disabled />
+        <el-form-item label="鍗曚綅"
+                      prop="unit">
+          <el-input v-model="formState.unit"
+                    disabled />
         </el-form-item>
-
-        <el-form-item
-            label="搴撳瓨鏁伴噺"
-            prop="qualitity"
-        >
-          <el-input-number v-model="formState.qualitity" :step="1" :min="1" style="width: 100%" />
+        <el-form-item label="搴撳瓨鏁伴噺"
+                      prop="qualitity">
+          <el-input-number v-model="formState.qualitity"
+                           :step="1"
+                           :min="1"
+                           style="width: 100%" />
         </el-form-item>
-
-        <el-form-item
-            v-if="type === 'qualified'"
-            label="搴撳瓨棰勮鏁伴噺"
-            prop="warnNum"
-        >
-          <el-input-number v-model="formState.warnNum" :step="1" :min="0" :max="formState.qualitity" style="width: 100%" />
+        <el-form-item v-if="type === 'qualified'"
+                      label="搴撳瓨棰勮鏁伴噺"
+                      prop="warnNum">
+          <el-input-number v-model="formState.warnNum"
+                           :step="1"
+                           :min="0"
+                           :max="formState.qualitity"
+                           style="width: 100%" />
         </el-form-item>
-
-        <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="formState.remark" type="textarea" />
+        <el-form-item label="澶囨敞"
+                      prop="remark">
+          <el-input v-model="formState.remark"
+                    type="textarea" />
         </el-form-item>
       </el-form>
-
       <!-- 浜у搧閫夋嫨寮圭獥 -->
-      <ProductSelectDialog
-          v-model="showProductSelectDialog"
-          @confirm="handleProductSelect"
-          single
-      />
+      <ProductSelectDialog v-model="showProductSelectDialog"
+                           @confirm="handleProductSelect"
+                           single />
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="handleSubmit">纭</el-button>
+          <el-button type="primary"
+                     @click="handleSubmit">纭</el-button>
           <el-button @click="closeModal">鍙栨秷</el-button>
         </div>
       </template>
@@ -74,116 +70,115 @@
 </template>
 
 <script setup>
-import {ref, computed, getCurrentInstance} from "vue";
-import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
-import {createStockInventory} from "@/api/inventoryManagement/stockInventory.js";
-import {createStockUnInventory} from "@/api/inventoryManagement/stockUninventory.js";
+  import { ref, computed, getCurrentInstance } from "vue";
+  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
+  import { createStockInventory } from "@/api/inventoryManagement/stockInventory.js";
+  import { createStockUnInventory } from "@/api/inventoryManagement/stockUninventory.js";
 
-const props = defineProps({
-  visible: {
-    type: Boolean,
-    required: true,
-  },
+  const props = defineProps({
+    visible: {
+      type: Boolean,
+      required: true,
+    },
 
-  type: {
-    type: String,
-    required: true,
-    default: 'qualified',
-  },
-});
+    type: {
+      type: String,
+      required: true,
+      default: "qualified",
+    },
+  });
 
-const emit = defineEmits(['update:visible', 'completed']);
+  const emit = defineEmits(["update:visible", "completed"]);
 
-// 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
-const formState = ref({
-  productId: undefined,
-  productModelId: undefined,
-  productName: "",
-  productModelName: "",
-  unit: "",
-  qualitity: 0,
-  warnNum: 0,
-  remark: '',
-});
-
-const isShow = computed({
-  get() {
-    return props.visible;
-  },
-  set(val) {
-    emit('update:visible', val);
-  },
-});
-
-const showProductSelectDialog = ref(false);
-
-let { proxy } = getCurrentInstance()
-
-const closeModal = () => {
-  // 閲嶇疆琛ㄥ崟鏁版嵁
-  formState.value = {
+  // 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
+  const formState = ref({
     productId: undefined,
     productModelId: undefined,
     productName: "",
     productModelName: "",
-    description: '',
+    unit: "",
+    qualitity: 0,
+    warnNum: 0,
+    remark: "",
+  });
+
+  const isShow = computed({
+    get() {
+      return props.visible;
+    },
+    set(val) {
+      emit("update:visible", val);
+    },
+  });
+
+  const showProductSelectDialog = ref(false);
+
+  let { proxy } = getCurrentInstance();
+
+  const closeModal = () => {
+    // 閲嶇疆琛ㄥ崟鏁版嵁
+    formState.value = {
+      productId: undefined,
+      productModelId: undefined,
+      productName: "",
+      productModelName: "",
+      description: "",
+    };
+    isShow.value = false;
   };
-  isShow.value = false;
-};
 
-// 浜у搧閫夋嫨澶勭悊
-const handleProductSelect = async (products) => {
-  if (products && products.length > 0) {
-    const product = products[0];
-    formState.value.productId = product.productId;
-    formState.value.productName = product.productName;
-    formState.value.productModelName = product.model;
-    formState.value.productModelId = product.id;
-    formState.value.unit = product.unit;
-    showProductSelectDialog.value = false;
-    // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
-    proxy.$refs["formRef"]?.validateField('productModelId');
-  }
-};
+  // 浜у搧閫夋嫨澶勭悊
+  const handleProductSelect = async products => {
+    if (products && products.length > 0) {
+      const product = products[0];
+      formState.value.productId = product.skuId;
+      formState.value.productName = product.materialName;
+      formState.value.productModelName = product.specification;
 
-const handleSubmit = () => {
-  proxy.$refs["formRef"].validate(valid => {
-    if (valid) {
-      // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰瑙勬牸
-      if (!formState.value.productModelId) {
-        proxy.$modal.msgError("璇烽�夋嫨浜у搧");
-        return;
-      }
-      if (!formState.value.productModelId) {
-        proxy.$modal.msgError("璇烽�夋嫨瑙勬牸");
-        return;
-      }
-      if (props.type === 'qualified') {
-        createStockInventory(formState.value).then(res => {
-          // 鍏抽棴妯℃�佹
-          isShow.value = false;
-          // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
-          emit('completed');
-          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        })
-      } else {
-        createStockUnInventory(formState.value).then(res => {
-          // 鍏抽棴妯℃�佹
-          isShow.value = false;
-          // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
-          emit('completed');
-          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        })
-      }
-
+      formState.value.productModelId = product.skuId;
+      formState.value.unit = product.baseUnit;
+      showProductSelectDialog.value = false;
+      // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
+      proxy.$refs["formRef"]?.validateField("productModelId");
     }
-  })
-};
+  };
 
+  const handleSubmit = () => {
+    proxy.$refs["formRef"].validate(valid => {
+      if (valid) {
+        // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰瑙勬牸
+        if (!formState.value.productModelId) {
+          proxy.$modal.msgError("璇烽�夋嫨浜у搧");
+          return;
+        }
+        if (!formState.value.productModelId) {
+          proxy.$modal.msgError("璇烽�夋嫨瑙勬牸");
+          return;
+        }
+        if (props.type === "qualified") {
+          createStockInventory(formState.value).then(res => {
+            // 鍏抽棴妯℃�佹
+            isShow.value = false;
+            // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
+            emit("completed");
+            proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          });
+        } else {
+          createStockUnInventory(formState.value).then(res => {
+            // 鍏抽棴妯℃�佹
+            isShow.value = false;
+            // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
+            emit("completed");
+            proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          });
+        }
+      }
+    });
+  };
 
-defineExpose({
-  closeModal,
-  handleSubmit,
-  isShow,
-});
+  defineExpose({
+    closeModal,
+    handleSubmit,
+    isShow,
+  });
 </script>
diff --git a/src/views/inventoryManagement/stockManagement/Subtract.vue b/src/views/inventoryManagement/stockManagement/Subtract.vue
index a277a00..b7f983b 100644
--- a/src/views/inventoryManagement/stockManagement/Subtract.vue
+++ b/src/views/inventoryManagement/stockManagement/Subtract.vue
@@ -1,63 +1,60 @@
 <template>
   <div>
-    <el-dialog
-        v-model="isShow"
-        title="棰嗙敤"
-        width="800"
-        @close="closeModal"
-    >
-      <el-form label-width="140px" :model="formState" label-position="top" ref="formRef">
-        <el-form-item
-            label="浜у搧鍚嶇О"
-            prop="productModelId"
-            :rules="[
+    <el-dialog v-model="isShow"
+               title="棰嗙敤"
+               width="800"
+               @close="closeModal">
+      <el-form label-width="140px"
+               :model="formState"
+               label-position="top"
+               ref="formRef">
+        <el-form-item label="浜у搧鍚嶇О"
+                      prop="productModelId"
+                      :rules="[
                 {
                 required: true,
                 message: '璇烽�夋嫨浜у搧',
                 trigger: 'change',
               }
-            ]"
-        >
-          <el-button type="primary" @click="showProductSelectDialog = true" disabled>
+            ]">
+          <el-button type="primary"
+                     @click="showProductSelectDialog = true"
+                     disabled>
             {{ formState.productName ? formState.productName : '閫夋嫨浜у搧' }}
           </el-button>
         </el-form-item>
-
-        <el-form-item
-            label="瑙勬牸"
-            prop="productModelName"
-        >
-          <el-input v-model="formState.model"  disabled />
+        <el-form-item label="瑙勬牸"
+                      prop="productModelName">
+          <el-input v-model="formState.model"
+                    disabled />
         </el-form-item>
-
-        <el-form-item
-            label="鍗曚綅"
-            prop="unit"
-        >
-          <el-input v-model="formState.unit"  disabled />
+        <el-form-item label="鍗曚綅"
+                      prop="unit">
+          <el-input v-model="formState.unit"
+                    disabled />
         </el-form-item>
-
-        <el-form-item
-            label="鏁伴噺"
-            prop="qualitity"
-        >
-          <el-input-number v-model="formState.qualitity" :step="1" :min="1" :max="maxQuality" style="width: 100%" />
+        <el-form-item label="鏁伴噺"
+                      prop="qualitity">
+          <el-input-number v-model="formState.qualitity"
+                           :step="1"
+                           :min="1"
+                           :max="maxQuality"
+                           style="width: 100%" />
         </el-form-item>
-
-        <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="formState.remark" type="textarea" />
+        <el-form-item label="澶囨敞"
+                      prop="remark">
+          <el-input v-model="formState.remark"
+                    type="textarea" />
         </el-form-item>
       </el-form>
-
       <!-- 浜у搧閫夋嫨寮圭獥 -->
-      <ProductSelectDialog
-          v-model="showProductSelectDialog"
-          @confirm="handleProductSelect"
-          single
-      />
+      <ProductSelectDialog v-model="showProductSelectDialog"
+                           @confirm="handleProductSelect"
+                           single />
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="handleSubmit">纭</el-button>
+          <el-button type="primary"
+                     @click="handleSubmit">纭</el-button>
           <el-button @click="closeModal">鍙栨秷</el-button>
         </div>
       </template>
@@ -66,134 +63,133 @@
 </template>
 
 <script setup>
-import {ref, computed, getCurrentInstance} from "vue";
-import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
-import {subtractStockInventory} from "@/api/inventoryManagement/stockInventory.js";
-import {subtractStockUnInventory} from "@/api/inventoryManagement/stockUninventory.js";
+  import { ref, computed, getCurrentInstance } from "vue";
+  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
+  import { subtractStockInventory } from "@/api/inventoryManagement/stockInventory.js";
+  import { subtractStockUnInventory } from "@/api/inventoryManagement/stockUninventory.js";
 
-const props = defineProps({
-  visible: {
-    type: Boolean,
-    required: true,
-  },
-  record: {
-    type: Object,
-    default: () => {},
-  },
-  type: {
-    type: String,
-    required: true,
-    default: 'qualified',
-  },
-});
+  const props = defineProps({
+    visible: {
+      type: Boolean,
+      required: true,
+    },
+    record: {
+      type: Object,
+      default: () => {},
+    },
+    type: {
+      type: String,
+      required: true,
+      default: "qualified",
+    },
+  });
 
-const emit = defineEmits(['update:visible', 'completed']);
+  const emit = defineEmits(["update:visible", "completed"]);
 
-onMounted(() => {
-  initFormData()
-})
+  onMounted(() => {
+    initFormData();
+  });
 
-const maxQuality = computed(() => {
-  return props.record.unLockedQuantity ? props.record.unLockedQuantity :  0;
-})
+  const maxQuality = computed(() => {
+    return props.record.unLockedQuantity ? props.record.unLockedQuantity : 0;
+  });
 
-const initFormData = () => {
-  if (props.record) {
-    formState.value = {
-      ...props.record,
+  const initFormData = () => {
+    if (props.record) {
+      formState.value = {
+        ...props.record,
+      };
     }
-  }
-}
+  };
 
-// 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
-const formState = ref({
-  productId: undefined,
-  productModelId: undefined,
-  productName: "",
-  model: "",
-  unit: "",
-  qualitity: 0,
-  remark: '',
-});
-
-const isShow = computed({
-  get() {
-    return props.visible;
-  },
-  set(val) {
-    emit('update:visible', val);
-  },
-});
-
-const showProductSelectDialog = ref(false);
-
-let { proxy } = getCurrentInstance()
-
-const closeModal = () => {
-  // 閲嶇疆琛ㄥ崟鏁版嵁
-  formState.value = {
+  // 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
+  const formState = ref({
     productId: undefined,
     productModelId: undefined,
     productName: "",
-    productModelName: "",
-    description: '',
+    model: "",
+    unit: "",
+    qualitity: 0,
+    remark: "",
+  });
+
+  const isShow = computed({
+    get() {
+      return props.visible;
+    },
+    set(val) {
+      emit("update:visible", val);
+    },
+  });
+
+  const showProductSelectDialog = ref(false);
+
+  let { proxy } = getCurrentInstance();
+
+  const closeModal = () => {
+    // 閲嶇疆琛ㄥ崟鏁版嵁
+    formState.value = {
+      productId: undefined,
+      productModelId: undefined,
+      productName: "",
+      productModelName: "",
+      description: "",
+    };
+    isShow.value = false;
   };
-  isShow.value = false;
-};
 
-// 浜у搧閫夋嫨澶勭悊
-const handleProductSelect = async (products) => {
-  if (products && products.length > 0) {
-    const product = products[0];
-    console.log(product)
-    formState.value.productId = product.productId;
-    formState.value.productName = product.productName;
-    formState.value.productModelName = product.model;
-    formState.value.productModelId = product.id;
-    formState.value.unit = product.unit;
-    showProductSelectDialog.value = false;
-    // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
-    proxy.$refs["formRef"]?.validateField('productModelId');
-  }
-};
-
-const handleSubmit = () => {
-  proxy.$refs["formRef"].validate(valid => {
-    if (valid) {
-      // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰瑙勬牸
-      if (!formState.value.productModelId) {
-        proxy.$modal.msgError("璇烽�夋嫨浜у搧");
-        return;
-      }
-      if (!formState.value.productModelId) {
-        proxy.$modal.msgError("璇烽�夋嫨瑙勬牸");
-        return;
-      }
-      if (props.type === 'qualified') {
-        subtractStockInventory(formState.value).then(res => {
-          // 鍏抽棴妯℃�佹
-          isShow.value = false;
-          // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
-          emit('completed');
-          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        })
-      } else {
-        subtractStockUnInventory(formState.value).then(res => {
-          // 鍏抽棴妯℃�佹
-          isShow.value = false;
-          // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
-          emit('completed');
-          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        })
-      }
+  // 浜у搧閫夋嫨澶勭悊
+  const handleProductSelect = async products => {
+    if (products && products.length > 0) {
+      const product = products[0];
+      console.log(product);
+      formState.value.productId = product.skuId;
+      formState.value.productName = product.materialName;
+      formState.value.productModelName = product.specification;
+      formState.value.productModelId = product.skuId;
+      formState.value.unit = product.baseUnit;
+      showProductSelectDialog.value = false;
+      // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
+      proxy.$refs["formRef"]?.validateField("productModelId");
     }
-  })
-};
+  };
 
+  const handleSubmit = () => {
+    proxy.$refs["formRef"].validate(valid => {
+      if (valid) {
+        // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰瑙勬牸
+        if (!formState.value.productModelId) {
+          proxy.$modal.msgError("璇烽�夋嫨浜у搧");
+          return;
+        }
+        if (!formState.value.productModelId) {
+          proxy.$modal.msgError("璇烽�夋嫨瑙勬牸");
+          return;
+        }
+        if (props.type === "qualified") {
+          subtractStockInventory(formState.value).then(res => {
+            // 鍏抽棴妯℃�佹
+            isShow.value = false;
+            // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
+            emit("completed");
+            proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          });
+        } else {
+          subtractStockUnInventory(formState.value).then(res => {
+            // 鍏抽棴妯℃�佹
+            isShow.value = false;
+            // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
+            emit("completed");
+            proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          });
+        }
+      }
+    });
+  };
 
-defineExpose({
-  closeModal,
-  handleSubmit,
-  isShow,
-});
+  defineExpose({
+    closeModal,
+    handleSubmit,
+    isShow,
+  });
 </script>
diff --git a/src/views/productionManagement/processRoute/index.vue b/src/views/productionManagement/processRoute/index.vue
index afdd542..e971c9b 100644
--- a/src/views/productionManagement/processRoute/index.vue
+++ b/src/views/productionManagement/processRoute/index.vue
@@ -783,7 +783,7 @@
       const product = products[0];
       // 鍏堟煡璇OM鍒楄〃锛堝繀閫夛級
       try {
-        const res = await getByModel(product.id);
+        const res = await getByModel(product.skuId);
         // 澶勭悊杩斿洖鐨凚OM鏁版嵁锛氬彲鑳芥槸鏁扮粍銆佸璞℃垨鍖呭惈data瀛楁
         let bomList = [];
         if (Array.isArray(res)) {
@@ -795,9 +795,9 @@
         }
 
         if (bomList.length > 0) {
-          routeForm.productModelId = product.id;
-          routeForm.productName = product.productName;
-          routeForm.productModelName = product.model;
+          routeForm.productModelId = product.skuId;
+          routeForm.productName = product.materialName;
+          routeForm.productModelName = product.specification;
           routeForm.bomId = undefined; // 閲嶇疆BOM閫夋嫨
           bomOptions.value = bomList;
           showProductSelectDialog.value = false;
diff --git a/src/views/productionManagement/productStructure/index.vue b/src/views/productionManagement/productStructure/index.vue
index 1ae3f77..835e0f5 100644
--- a/src/views/productionManagement/productStructure/index.vue
+++ b/src/views/productionManagement/productStructure/index.vue
@@ -1,380 +1,483 @@
 <template>
   <div class="app-container">
     <div style="text-align: right; margin-bottom: 10px;">
-      <el-button type="info" plain icon="Upload" @click="handleImport"
-        v-hasPermi="['product:bom:import']">瀵煎叆</el-button>
-      <el-button type="warning" plain icon="Download" @click="handleExport" :disabled="selectedRows.length !== 1"
-        v-hasPermi="['product:bom:export']">瀵煎嚭</el-button>
-      <el-button type="primary" @click="handleAdd">鏂板</el-button>
-      <el-button type="danger" plain @click="handleBatchDelete" :disabled="selectedRows.length === 0">鍒犻櫎</el-button>
+      <el-button type="info"
+                 plain
+                 icon="Upload"
+                 @click="handleImport"
+                 v-hasPermi="['product:bom:import']">瀵煎叆</el-button>
+      <el-button type="warning"
+                 plain
+                 icon="Download"
+                 @click="handleExport"
+                 :disabled="selectedRows.length !== 1"
+                 v-hasPermi="['product:bom:export']">瀵煎嚭</el-button>
+      <el-button type="primary"
+                 @click="handleAdd">鏂板</el-button>
+      <el-button type="danger"
+                 plain
+                 @click="handleBatchDelete"
+                 :disabled="selectedRows.length === 0">鍒犻櫎</el-button>
     </div>
-    <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
-      @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination">
+    <PIMTable rowKey="id"
+              :column="tableColumn"
+              :tableData="tableData"
+              :page="page"
+              :isSelection="true"
+              @selection-change="handleSelectionChange"
+              :tableLoading="tableLoading"
+              @pagination="pagination">
       <template #detail="{ row }">
-        <el-button type="primary" text @click="showDetail(row)">{{ row.bomNo }}
+        <el-button type="primary"
+                   text
+                   @click="showDetail(row)">{{ row.bomNo }}
         </el-button>
       </template>
     </PIMTable>
-    <StructureEdit v-if="showEdit" v-model:show-model="showEdit" :record="currentRow" />
-
+    <StructureEdit v-if="showEdit"
+                   v-model:show-model="showEdit"
+                   :record="currentRow" />
     <!-- 鏂板/缂栬緫寮圭獥 -->
-    <el-dialog v-model="dialogVisible" :title="operationType === 'add' ? '鏂板BOM' : '缂栬緫BOM'" width="600px"
-      @close="closeDialog">
-      <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
-        <el-form-item label="浜у搧鍚嶇О" prop="productModelId">
-          <el-button type="primary" @click="showProductSelectDialog = true">
+    <el-dialog v-model="dialogVisible"
+               :title="operationType === 'add' ? '鏂板BOM' : '缂栬緫BOM'"
+               width="600px"
+               @close="closeDialog">
+      <el-form ref="formRef"
+               :model="form"
+               :rules="rules"
+               label-width="120px">
+        <el-form-item label="浜у搧鍚嶇О"
+                      prop="productModelId">
+          <el-button type="primary"
+                     @click="showProductSelectDialog = true">
             {{ form.productName || '閫夋嫨浜у搧' }}
           </el-button>
         </el-form-item>
-        <el-form-item label="鐗堟湰鍙�" prop="version">
-          <el-input v-model="form.version" placeholder="璇疯緭鍏ョ増鏈彿" clearable />
+        <el-form-item label="鐗堟湰鍙�"
+                      prop="version">
+          <el-input v-model="form.version"
+                    placeholder="璇疯緭鍏ョ増鏈彿"
+                    clearable />
         </el-form-item>
-        <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉�" clearable />
+        <el-form-item label="澶囨敞"
+                      prop="remark">
+          <el-input v-model="form.remark"
+                    type="textarea"
+                    :rows="3"
+                    placeholder="璇疯緭鍏ュ娉�"
+                    clearable />
         </el-form-item>
       </el-form>
       <template #footer>
         <el-button @click="closeDialog">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSubmit">纭畾</el-button>
+        <el-button type="primary"
+                   @click="handleSubmit">纭畾</el-button>
       </template>
     </el-dialog>
-
     <!-- 浜у搧閫夋嫨寮圭獥 -->
-    <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single />
-
+    <ProductSelectDialog v-model="showProductSelectDialog"
+                         @confirm="handleProductSelect"
+                         single />
     <!-- BOM瀵煎叆瀵硅瘽妗� -->
-    <ImportDialog ref="uploadRef" v-model="upload.open" :title="upload.title" :action="upload.url"
-      :headers="upload.headers" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress"
-      :on-success="handleFileSuccess" :show-download-template="true" @confirm="submitFileForm"
-      @download-template="handleDownloadTemplate" @close="handleImportClose" />
+    <ImportDialog ref="uploadRef"
+                  v-model="upload.open"
+                  :title="upload.title"
+                  :action="upload.url"
+                  :headers="upload.headers"
+                  :disabled="upload.isUploading"
+                  :on-progress="handleFileUploadProgress"
+                  :on-success="handleFileSuccess"
+                  :show-download-template="true"
+                  @confirm="submitFileForm"
+                  @download-template="handleDownloadTemplate"
+                  @close="handleImportClose" />
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, toRefs, onMounted, getCurrentInstance, defineAsyncComponent } from "vue";
-import { getToken } from "@/utils/auth";
-import { listPage, add, update, batchDelete, exportBom, downloadTemplate } from "@/api/productionManagement/productBom.js";
-import { useRouter } from 'vue-router'
-import { ElMessageBox } from 'element-plus'
-import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
-import ImportDialog from "@/components/Dialog/ImportDialog.vue";
+  import {
+    ref,
+    reactive,
+    toRefs,
+    onMounted,
+    getCurrentInstance,
+    defineAsyncComponent,
+  } from "vue";
+  import { getToken } from "@/utils/auth";
+  import {
+    listPage,
+    add,
+    update,
+    batchDelete,
+    exportBom,
+    downloadTemplate,
+  } from "@/api/productionManagement/productBom.js";
+  import { useRouter } from "vue-router";
+  import { ElMessageBox } from "element-plus";
+  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
+  import ImportDialog from "@/components/Dialog/ImportDialog.vue";
 
-const router = useRouter()
-const { proxy } = getCurrentInstance()
-const StructureEdit = defineAsyncComponent(() => import('@/views/productionManagement/productStructure/StructureEdit.vue'))
+  const router = useRouter();
+  const { proxy } = getCurrentInstance();
+  const StructureEdit = defineAsyncComponent(() =>
+    import("@/views/productionManagement/productStructure/StructureEdit.vue")
+  );
 
-const tableColumn = ref([
-  {
-    label: "BOM缂栧彿",
-    prop: "bomNo",
-    dataType: 'slot',
-    slot: "detail",
-    minWidth: 140
-  },
-  {
-    label: "浜у搧鍚嶇О",
-    prop: "productName",
+  const tableColumn = ref([
+    {
+      label: "BOM缂栧彿",
+      prop: "bomNo",
+      dataType: "slot",
+      slot: "detail",
+      minWidth: 140,
+    },
+    {
+      label: "浜у搧鍚嶇О",
+      prop: "productName",
 
-    minWidth: 160
-  },
-  {
-    label: "瑙勬牸鍨嬪彿",
-    prop: "productModelName",
-    minWidth: 140
-  },
-  {
-    label: "鐗堟湰鍙�",
-    prop: "version",
-    width: 100
-  },
-  {
-    label: "澶囨敞",
-    prop: "remark",
-    minWidth: 160
-  },
-  {
-    dataType: "action",
-    label: "鎿嶄綔",
-    align: "center",
-    fixed: "right",
-    width: 150,
-    operation: [
-      {
-        name: "缂栬緫",
-        type: "text",
-        clickFun: (row) => {
-          handleEdit(row)
-        }
-      },
-      {
-        name: "鍒犻櫎",
-        type: "danger",
-        link: true,
-        clickFun: (row) => {
-          handleDelete(row)
-        }
-      }
-    ]
-  }
-]);
+      minWidth: 160,
+    },
+    {
+      label: "瑙勬牸鍨嬪彿",
+      prop: "productModelName",
+      minWidth: 140,
+    },
+    {
+      label: "鐗堟湰鍙�",
+      prop: "version",
+      width: 100,
+    },
+    {
+      label: "澶囨敞",
+      prop: "remark",
+      minWidth: 160,
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 150,
+      operation: [
+        {
+          name: "缂栬緫",
+          type: "text",
+          clickFun: row => {
+            handleEdit(row);
+          },
+        },
+        {
+          name: "鍒犻櫎",
+          type: "danger",
+          link: true,
+          clickFun: row => {
+            handleDelete(row);
+          },
+        },
+      ],
+    },
+  ]);
 
-const tableData = ref([]);
-const tableLoading = ref(false);
-const showEdit = ref(false);
-const selectedRows = ref([]);
-const currentRow = ref({});
-const dialogVisible = ref(false);
-const operationType = ref('add'); // add | edit
-const formRef = ref(null);
-const showProductSelectDialog = ref(false);
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const showEdit = ref(false);
+  const selectedRows = ref([]);
+  const currentRow = ref({});
+  const dialogVisible = ref(false);
+  const operationType = ref("add"); // add | edit
+  const formRef = ref(null);
+  const showProductSelectDialog = ref(false);
 
-//  BOM瀵煎叆鍙傛暟
-const upload = reactive({
-  // 鏄惁鏄剧ず寮瑰嚭灞傦紙BOM瀵煎叆锛�
-  open: false,
-  // 寮瑰嚭灞傛爣棰橈紙BOM瀵煎叆锛�
-  title: "",
-  // 鏄惁绂佺敤涓婁紶
-  isUploading: false,
-  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
-  headers: { Authorization: "Bearer " + getToken() },
-  // 涓婁紶鐨勫湴鍧�
-  url: import.meta.env.VITE_APP_BASE_API + "/productBom/uploadBom"
-});
-
-const page = reactive({
-  current: 1,
-  size: 10,
-  total: 0,
-});
-
-const data = reactive({
-  form: {
-    id: undefined,
-    productName: "",
-    productModelName: "",
-    productModelId: "",
-    remark: "",
-    version: ""
-  },
-  rules: {
-    productModelId: [{ required: true, message: "璇烽�夋嫨浜у搧", trigger: "change" }],
-    version: [{ required: true, message: "璇疯緭鍏ョ増鏈彿", trigger: "blur" }]
-  }
-});
-
-const { form, rules } = toRefs(data);
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-
-// 鍒嗛〉
-const pagination = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-
-// 鏌ヨ鍒楄〃
-const getList = () => {
-  tableLoading.value = true;
-  listPage({
-    current: page.current,
-    size: page.size,
-  })
-    .then((res) => {
-      const records = res?.data?.records || [];
-      tableData.value = records;
-      page.total = res?.data?.total || 0;
-    })
-    .catch((err) => {
-      console.error("鑾峰彇鍒楄〃澶辫触锛�", err);
-    })
-    .finally(() => {
-      tableLoading.value = false;
-    });
-};
-
-// 鏂板
-const handleAdd = () => {
-  operationType.value = 'add';
-  Object.assign(form.value, {
-    id: undefined,
-    productName: "",
-    productModelName: "",
-    productModelId: "",
-    remark: "",
-    version: ""
+  //  BOM瀵煎叆鍙傛暟
+  const upload = reactive({
+    // 鏄惁鏄剧ず寮瑰嚭灞傦紙BOM瀵煎叆锛�
+    open: false,
+    // 寮瑰嚭灞傛爣棰橈紙BOM瀵煎叆锛�
+    title: "",
+    // 鏄惁绂佺敤涓婁紶
+    isUploading: false,
+    // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+    headers: { Authorization: "Bearer " + getToken() },
+    // 涓婁紶鐨勫湴鍧�
+    url: import.meta.env.VITE_APP_BASE_API + "/productBom/uploadBom",
   });
-  dialogVisible.value = true;
-};
 
-// 缂栬緫
-const handleEdit = (row) => {
-  operationType.value = 'edit';
-  Object.assign(form.value, {
-    id: row.id,
-    productName: row.productName || "",
-    productModelName: row.productModelName || "",
-    productModelId: row.productModelId || "",
-    remark: row.remark || "",
-    version: row.version || ""
+  const page = reactive({
+    current: 1,
+    size: 10,
+    total: 0,
   });
-  dialogVisible.value = true;
-};
 
-// 鍒犻櫎锛堝崟鏉★級
-const handleDelete = (row) => {
-  ElMessageBox.confirm('纭鍒犻櫎璇OM锛�', '鎻愮ず', {
-    confirmButtonText: '纭',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning'
-  })
-    .then(() => {
-      batchDelete([row.id])
-        .then(() => {
-          proxy.$modal.msgSuccess('鍒犻櫎鎴愬姛');
-          getList();
-        })
-        .catch(() => {
-          proxy.$modal.msgError('鍒犻櫎澶辫触');
-        });
-    })
-    .catch(() => { });
-};
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
-  if (!selectedRows.value.length) {
-    proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁');
-    return;
-  }
-  const ids = selectedRows.value.map(item => item.id);
-  ElMessageBox.confirm('閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�', '鍒犻櫎鎻愮ず', {
-    confirmButtonText: '纭',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning'
-  })
-    .then(() => {
-      batchDelete(ids)
-        .then(() => {
-          proxy.$modal.msgSuccess('鍒犻櫎鎴愬姛');
-          getList();
-        })
-        .catch(() => {
-          proxy.$modal.msgError('鍒犻櫎澶辫触');
-        });
-    })
-    .catch(() => { });
-};
-
-// 浜у搧閫夋嫨
-const handleProductSelect = (products) => {
-  if (products && products.length > 0) {
-    const product = products[0];
-    form.value.productModelId = product.id;
-    form.value.productName = product.productName;
-    form.value.productModelName = product.model;
-  }
-  showProductSelectDialog.value = false;
-};
-
-// 鎻愪氦琛ㄥ崟
-const handleSubmit = () => {
-  formRef.value.validate((valid) => {
-    if (valid) {
-      const payload = { ...form.value };
-      if (operationType.value === 'add') {
-        add(payload)
-          .then(() => {
-            proxy.$modal.msgSuccess('鏂板鎴愬姛');
-            closeDialog();
-            getList();
-          })
-          .catch(() => {
-            proxy.$modal.msgError('鏂板澶辫触');
-          });
-      } else {
-        update(payload)
-          .then(() => {
-            proxy.$modal.msgSuccess('淇敼鎴愬姛');
-            closeDialog();
-            getList();
-          })
-          .catch(() => {
-            proxy.$modal.msgError('淇敼澶辫触');
-          });
-      }
-    }
+  const data = reactive({
+    form: {
+      id: undefined,
+      productName: "",
+      productModelName: "",
+      productModelId: "",
+      remark: "",
+      version: "",
+    },
+    rules: {
+      productModelId: [
+        { required: true, message: "璇烽�夋嫨浜у搧", trigger: "change" },
+      ],
+      version: [{ required: true, message: "璇疯緭鍏ョ増鏈彿", trigger: "blur" }],
+    },
   });
-};
 
-// 鍏抽棴寮圭獥
-const closeDialog = () => {
-  dialogVisible.value = false;
-  formRef.value?.resetFields();
-};
+  const { form, rules } = toRefs(data);
 
-//  瀵煎叆鎸夐挳鎿嶄綔
-const handleImport = () => {
-  upload.title = "BOM瀵煎叆";
-  upload.open = true;
-};
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  const handleSelectionChange = selection => {
+    selectedRows.value = selection;
+  };
 
-// 鍏抽棴瀵煎叆瀵硅瘽妗嗘椂娓呴櫎鏂囦欢
-const handleImportClose = () => {
-  proxy.$refs["uploadRef"].clearFiles();
-};
-
-//  鏂囦欢涓婁紶涓鐞�
-const handleFileUploadProgress = (event, file, fileList) => {
-  upload.isUploading = true;
-};
-
-//  鏂囦欢涓婁紶鎴愬姛澶勭悊
-const handleFileSuccess = (response, file, fileList) => {
-  upload.open = false;
-  upload.isUploading = false;
-  proxy.$refs["uploadRef"].clearFiles();
-  if (response.code === 200) {
-    proxy.$modal.msgSuccess(response.msg || "瀵煎叆鎴愬姛");
+  // 鍒嗛〉
+  const pagination = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
     getList();
-  } else {
-    proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true });
-  }
-};
+  };
 
-// 鎻愪氦涓婁紶鏂囦欢
-const submitFileForm = () => {
-  proxy.$refs["uploadRef"].submit();
-};
+  // 鏌ヨ鍒楄〃
+  const getList = () => {
+    tableLoading.value = true;
+    listPage({
+      current: page.current,
+      size: page.size,
+    })
+      .then(res => {
+        const records = res?.data?.records || [];
+        tableData.value = records;
+        page.total = res?.data?.total || 0;
+      })
+      .catch(err => {
+        console.error("鑾峰彇鍒楄〃澶辫触锛�", err);
+      })
+      .finally(() => {
+        tableLoading.value = false;
+      });
+  };
 
-//  瀵煎嚭鎸夐挳鎿嶄綔
-const handleExport = () => {
-  if (selectedRows.value.length !== 1) {
-    proxy.$modal.msgWarning("璇烽�夋嫨涓�鏉℃暟鎹繘琛屽鍑�");
-    return;
-  }
+  // 鏂板
+  const handleAdd = () => {
+    operationType.value = "add";
+    Object.assign(form.value, {
+      id: undefined,
+      productName: "",
+      productModelName: "",
+      productModelId: "",
+      remark: "",
+      version: "",
+    });
+    dialogVisible.value = true;
+  };
 
-  const bomId = selectedRows.value[0].id;
-  const fileName = `BOM_${selectedRows.value[0].bomNo || bomId}.xlsx`;
+  // 缂栬緫
+  const handleEdit = row => {
+    operationType.value = "edit";
+    Object.assign(form.value, {
+      id: row.id,
+      productName: row.productName || "",
+      productModelName: row.productModelName || "",
+      productModelId: row.productModelId || "",
+      remark: row.remark || "",
+      version: row.version || "",
+    });
+    dialogVisible.value = true;
+  };
 
-  exportBom(bomId).then(res => {
-    // 杩斿洖鐨勬暟鎹槸鍚︿负绌�
-    if (!res) {
-      proxy.$modal.msgError("瀵煎嚭澶辫触锛岃繑鍥炴暟鎹负绌�");
+  // 鍒犻櫎锛堝崟鏉★級
+  const handleDelete = row => {
+    ElMessageBox.confirm("纭鍒犻櫎璇OM锛�", "鎻愮ず", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        batchDelete([row.id])
+          .then(() => {
+            proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+            getList();
+          })
+          .catch(() => {
+            proxy.$modal.msgError("鍒犻櫎澶辫触");
+          });
+      })
+      .catch(() => {});
+  };
+
+  // 鎵归噺鍒犻櫎
+  const handleBatchDelete = () => {
+    if (!selectedRows.value.length) {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    const ids = selectedRows.value.map(item => item.id);
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        batchDelete(ids)
+          .then(() => {
+            proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+            getList();
+          })
+          .catch(() => {
+            proxy.$modal.msgError("鍒犻櫎澶辫触");
+          });
+      })
+      .catch(() => {});
+  };
+
+  // 浜у搧閫夋嫨
+  const handleProductSelect = products => {
+    if (products && products.length > 0) {
+      const product = products[0];
+      form.value.productModelId = product.skuId;
+      form.value.productName = product.materialName;
+      form.value.productModelName = product.specification;
+    }
+    showProductSelectDialog.value = false;
+  };
+
+  // 鎻愪氦琛ㄥ崟
+  const handleSubmit = () => {
+    formRef.value.validate(valid => {
+      if (valid) {
+        const payload = { ...form.value };
+        if (operationType.value === "add") {
+          add(payload)
+            .then(() => {
+              proxy.$modal.msgSuccess("鏂板鎴愬姛");
+              closeDialog();
+              getList();
+            })
+            .catch(() => {
+              proxy.$modal.msgError("鏂板澶辫触");
+            });
+        } else {
+          update(payload)
+            .then(() => {
+              proxy.$modal.msgSuccess("淇敼鎴愬姛");
+              closeDialog();
+              getList();
+            })
+            .catch(() => {
+              proxy.$modal.msgError("淇敼澶辫触");
+            });
+        }
+      }
+    });
+  };
+
+  // 鍏抽棴寮圭獥
+  const closeDialog = () => {
+    dialogVisible.value = false;
+    formRef.value?.resetFields();
+  };
+
+  //  瀵煎叆鎸夐挳鎿嶄綔
+  const handleImport = () => {
+    upload.title = "BOM瀵煎叆";
+    upload.open = true;
+  };
+
+  // 鍏抽棴瀵煎叆瀵硅瘽妗嗘椂娓呴櫎鏂囦欢
+  const handleImportClose = () => {
+    proxy.$refs["uploadRef"].clearFiles();
+  };
+
+  //  鏂囦欢涓婁紶涓鐞�
+  const handleFileUploadProgress = (event, file, fileList) => {
+    upload.isUploading = true;
+  };
+
+  //  鏂囦欢涓婁紶鎴愬姛澶勭悊
+  const handleFileSuccess = (response, file, fileList) => {
+    upload.open = false;
+    upload.isUploading = false;
+    proxy.$refs["uploadRef"].clearFiles();
+    if (response.code === 200) {
+      proxy.$modal.msgSuccess(response.msg || "瀵煎叆鎴愬姛");
+      getList();
+    } else {
+      proxy.$alert(
+        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+          response.msg +
+          "</div>",
+        "瀵煎叆缁撴灉",
+        { dangerouslyUseHTMLString: true }
+      );
+    }
+  };
+
+  // 鎻愪氦涓婁紶鏂囦欢
+  const submitFileForm = () => {
+    proxy.$refs["uploadRef"].submit();
+  };
+
+  //  瀵煎嚭鎸夐挳鎿嶄綔
+  const handleExport = () => {
+    if (selectedRows.value.length !== 1) {
+      proxy.$modal.msgWarning("璇烽�夋嫨涓�鏉℃暟鎹繘琛屽鍑�");
       return;
     }
 
-    const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
-    const downloadElement = document.createElement('a');
+    const bomId = selectedRows.value[0].id;
+    const fileName = `BOM_${selectedRows.value[0].bomNo || bomId}.xlsx`;
+
+    exportBom(bomId)
+      .then(res => {
+        // 杩斿洖鐨勬暟鎹槸鍚︿负绌�
+        if (!res) {
+          proxy.$modal.msgError("瀵煎嚭澶辫触锛岃繑鍥炴暟鎹负绌�");
+          return;
+        }
+
+        const blob = new Blob([res], {
+          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        });
+        const downloadElement = document.createElement("a");
+        const href = window.URL.createObjectURL(blob);
+
+        downloadElement.style.display = "none";
+        downloadElement.href = href;
+        downloadElement.download = fileName;
+
+        document.body.appendChild(downloadElement);
+        downloadElement.click();
+
+        document.body.removeChild(downloadElement);
+        window.URL.revokeObjectURL(href);
+
+        proxy.$modal.msgSuccess("瀵煎嚭鎴愬姛");
+      })
+      .catch(err => {
+        console.error("瀵煎嚭寮傚父锛�", err);
+        proxy.$modal.msgError("绯荤粺寮傚父锛屽鍑哄け璐�");
+      });
+  };
+
+  //  涓嬭浇妯℃澘
+  const handleDownloadTemplate = async () => {
+    const res = await downloadTemplate();
+    // 杩斿洖鐨勬暟鎹槸鍚︿负绌�
+    if (!res) {
+      proxy.$modal.msgError("涓嬭浇澶辫触锛岃繑鍥炴暟鎹负绌�");
+      return;
+    }
+
+    const blob = new Blob([res], {
+      type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+    });
+    const downloadElement = document.createElement("a");
     const href = window.URL.createObjectURL(blob);
 
-    downloadElement.style.display = 'none';
     downloadElement.href = href;
-    downloadElement.download = fileName;
+    downloadElement.download = "BOM妯℃澘.xlsx";
 
     document.body.appendChild(downloadElement);
     downloadElement.click();
@@ -382,52 +485,23 @@
     document.body.removeChild(downloadElement);
     window.URL.revokeObjectURL(href);
 
-    proxy.$modal.msgSuccess("瀵煎嚭鎴愬姛");
-  }).catch(err => {
-    console.error("瀵煎嚭寮傚父锛�", err);
-    proxy.$modal.msgError("绯荤粺寮傚父锛屽鍑哄け璐�");
+    proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
+  };
+
+  // 鏌ョ湅璇︽儏
+  const showDetail = row => {
+    router.push({
+      path: "/productionManagement/productStructureDetail",
+      query: {
+        id: row.id,
+        bomNo: row.bomNo || "",
+        productName: row.productName || "",
+        productModelName: row.productModelName || "",
+      },
+    });
+  };
+
+  onMounted(() => {
+    getList();
   });
-};
-
-//  涓嬭浇妯℃澘
-const handleDownloadTemplate = async () => {
-  const res = await downloadTemplate();
-  // 杩斿洖鐨勬暟鎹槸鍚︿负绌�
-  if (!res) {
-    proxy.$modal.msgError("涓嬭浇澶辫触锛岃繑鍥炴暟鎹负绌�");
-    return;
-  }
-
-  const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
-  const downloadElement = document.createElement('a');
-  const href = window.URL.createObjectURL(blob);
-
-  downloadElement.href = href;
-  downloadElement.download = "BOM妯℃澘.xlsx";
-
-  document.body.appendChild(downloadElement);
-  downloadElement.click();
-
-  document.body.removeChild(downloadElement);
-  window.URL.revokeObjectURL(href);
-
-  proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
-};
-
-// 鏌ョ湅璇︽儏
-const showDetail = (row) => {
-  router.push({
-    path: '/productionManagement/productStructureDetail',
-    query: {
-      id: row.id,
-      bomNo: row.bomNo || '',
-      productName: row.productName || '',
-      productModelName: row.productModelName || ''
-    }
-  });
-};
-
-onMounted(() => {
-  getList();
-});
 </script>
diff --git a/src/views/productionManagement/productionOrder/New.vue b/src/views/productionManagement/productionOrder/New.vue
index c9c478b..55cb118 100644
--- a/src/views/productionManagement/productionOrder/New.vue
+++ b/src/views/productionManagement/productionOrder/New.vue
@@ -1,42 +1,37 @@
 <template>
   <div>
-    <el-dialog
-        v-model="isShow"
-        title="鏂板鐢熶骇璁㈠崟"
-        width="800"
-        @close="closeModal"
-    >
-      <el-form label-width="140px" :model="formState" label-position="top" ref="formRef">
-        <el-form-item
-            label="浜у搧鍚嶇О"
-            prop="productModelId"
-            :rules="[
+    <el-dialog v-model="isShow"
+               title="鏂板鐢熶骇璁㈠崟"
+               width="800"
+               @close="closeModal">
+      <el-form label-width="140px"
+               :model="formState"
+               label-position="top"
+               ref="formRef">
+        <el-form-item label="浜у搧鍚嶇О"
+                      prop="productModelId"
+                      :rules="[
                 {
                 required: true,
                 message: '璇烽�夋嫨浜у搧',
                 trigger: 'change',
               }
-            ]"
-        >
-          <el-button type="primary" @click="showProductSelectDialog = true">
+            ]">
+          <el-button type="primary"
+                     @click="showProductSelectDialog = true">
             {{ formState.productName ? formState.productName : '閫夋嫨浜у搧' }}
           </el-button>
         </el-form-item>
-
-        <el-form-item
-            label="瑙勬牸"
-            prop="productModelName"
-        >
-          <el-input v-model="formState.productModelName"  disabled />
+        <el-form-item label="瑙勬牸"
+                      prop="productModelName">
+          <el-input v-model="formState.productModelName"
+                    disabled />
         </el-form-item>
-
-        <el-form-item
-            label="鍗曚綅"
-            prop="unit"
-        >
-          <el-input v-model="formState.unit"  disabled />
+        <el-form-item label="鍗曚綅"
+                      prop="unit">
+          <el-input v-model="formState.unit"
+                    disabled />
         </el-form-item>
-
         <el-form-item label="宸ヨ壓璺嚎">
           <el-select v-model="formState.routeId"
                      placeholder="璇烽�夋嫨宸ヨ壓璺嚎"
@@ -48,24 +43,22 @@
                        :value="item.id" />
           </el-select>
         </el-form-item>
-
-        <el-form-item
-            label="闇�姹傛暟閲�"
-            prop="quantity"
-        >
-          <el-input-number v-model="formState.quantity" :step="1" :min="1" style="width: 100%" />
+        <el-form-item label="闇�姹傛暟閲�"
+                      prop="quantity">
+          <el-input-number v-model="formState.quantity"
+                           :step="1"
+                           :min="1"
+                           style="width: 100%" />
         </el-form-item>
       </el-form>
-
       <!-- 浜у搧閫夋嫨寮圭獥 -->
-      <ProductSelectDialog
-          v-model="showProductSelectDialog"
-          @confirm="handleProductSelect"
-          single
-      />
+      <ProductSelectDialog v-model="showProductSelectDialog"
+                           @confirm="handleProductSelect"
+                           single />
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="handleSubmit">纭</el-button>
+          <el-button type="primary"
+                     @click="handleSubmit">纭</el-button>
           <el-button @click="closeModal">鍙栨秷</el-button>
         </div>
       </template>
@@ -74,119 +67,123 @@
 </template>
 
 <script setup>
-import {ref, computed, getCurrentInstance} from "vue";
-import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
-import {addProductOrder, listProcessRoute} from "@/api/productionManagement/productionOrder.js";
+  import { ref, computed, getCurrentInstance } from "vue";
+  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
+  import {
+    addProductOrder,
+    listProcessRoute,
+  } from "@/api/productionManagement/productionOrder.js";
 
-const props = defineProps({
-  visible: {
-    type: Boolean,
-    required: true,
-  },
+  const props = defineProps({
+    visible: {
+      type: Boolean,
+      required: true,
+    },
 
-  type: {
-    type: String,
-    required: true,
-    default: 'qualified',
-  },
-});
+    type: {
+      type: String,
+      required: true,
+      default: "qualified",
+    },
+  });
 
-const emit = defineEmits(['update:visible', 'completed']);
+  const emit = defineEmits(["update:visible", "completed"]);
 
-// 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
-const formState = ref({
-  productId: undefined,
-  productModelId: undefined,
-  routeId: undefined,
-  productName: "",
-  productModelName: "",
-  unit: "",
-  quantity: 0,
-});
-
-const isShow = computed({
-  get() {
-    return props.visible;
-  },
-  set(val) {
-    emit('update:visible', val);
-  },
-});
-
-const showProductSelectDialog = ref(false);
-
-let { proxy } = getCurrentInstance()
-
-const closeModal = () => {
-  // 閲嶇疆琛ㄥ崟鏁版嵁
-  formState.value = {
+  // 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
+  const formState = ref({
     productId: undefined,
     productModelId: undefined,
     routeId: undefined,
     productName: "",
     productModelName: "",
-    quantity: '',
+    unit: "",
+    quantity: 0,
+  });
+
+  const isShow = computed({
+    get() {
+      return props.visible;
+    },
+    set(val) {
+      emit("update:visible", val);
+    },
+  });
+
+  const showProductSelectDialog = ref(false);
+
+  let { proxy } = getCurrentInstance();
+
+  const closeModal = () => {
+    // 閲嶇疆琛ㄥ崟鏁版嵁
+    formState.value = {
+      productId: undefined,
+      productModelId: undefined,
+      routeId: undefined,
+      productName: "",
+      productModelName: "",
+      quantity: "",
+    };
+    isShow.value = false;
   };
-  isShow.value = false;
-};
 
-// 浜у搧閫夋嫨澶勭悊
-const handleProductSelect = async (products) => {
-  if (products && products.length > 0) {
-    const product = products[0];
-    formState.value.productId = product.productId;
-    formState.value.productName = product.productName;
-    formState.value.productModelName = product.model;
-    formState.value.productModelId = product.id;
-    formState.value.unit = product.unit;
-    showProductSelectDialog.value = false;
-    fetchRouteOptions( product.id);
-    // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
-    proxy.$refs["formRef"]?.validateField('productModelId');
-  }
-};
-
-const routeOptions = ref([]);
-const bindRouteLoading = ref(false);
-const fetchRouteOptions = (productModelId) => {
-  formState.value.routeId = undefined;
-  routeOptions.value = []
-  bindRouteLoading.value = true;
-  listProcessRoute({ productModelId: productModelId }).then(res => {
-    routeOptions.value = res.data || [];
-  }).finally(() => {
-    bindRouteLoading.value = false;
-  })
-}
-
-const handleSubmit = () => {
-  proxy.$refs["formRef"].validate(valid => {
-    if (valid) {
-      // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰瑙勬牸
-      if (!formState.value.productModelId) {
-        proxy.$modal.msgError("璇烽�夋嫨浜у搧");
-        return;
-      }
-      if (!formState.value.productModelId) {
-        proxy.$modal.msgError("璇烽�夋嫨瑙勬牸");
-        return;
-      }
-
-      addProductOrder(formState.value).then(res => {
-        // 鍏抽棴妯℃�佹
-        isShow.value = false;
-        // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
-        emit('completed');
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-      })
+  // 浜у搧閫夋嫨澶勭悊
+  const handleProductSelect = async products => {
+    if (products && products.length > 0) {
+      const product = products[0];
+      formState.value.productId = product.skuId;
+      formState.value.productName = product.materialName;
+      formState.value.productModelName = product.specification;
+      formState.value.productModelId = product.skuId;
+      formState.value.unit = product.baseUnit;
+      showProductSelectDialog.value = false;
+      fetchRouteOptions(product.skuId);
+      // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
+      proxy.$refs["formRef"]?.validateField("productModelId");
     }
-  })
-};
+  };
 
+  const routeOptions = ref([]);
+  const bindRouteLoading = ref(false);
+  const fetchRouteOptions = productModelId => {
+    formState.value.routeId = undefined;
+    routeOptions.value = [];
+    bindRouteLoading.value = true;
+    listProcessRoute({ productModelId: productModelId })
+      .then(res => {
+        routeOptions.value = res.data || [];
+      })
+      .finally(() => {
+        bindRouteLoading.value = false;
+      });
+  };
 
-defineExpose({
-  closeModal,
-  handleSubmit,
-  isShow,
-});
+  const handleSubmit = () => {
+    proxy.$refs["formRef"].validate(valid => {
+      if (valid) {
+        // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰瑙勬牸
+        if (!formState.value.productModelId) {
+          proxy.$modal.msgError("璇烽�夋嫨浜у搧");
+          return;
+        }
+        if (!formState.value.productModelId) {
+          proxy.$modal.msgError("璇烽�夋嫨瑙勬牸");
+          return;
+        }
+
+        addProductOrder(formState.value).then(res => {
+          // 鍏抽棴妯℃�佹
+          isShow.value = false;
+          // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
+          emit("completed");
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        });
+      }
+    });
+  };
+
+  defineExpose({
+    closeModal,
+    handleSubmit,
+    isShow,
+  });
 </script>
diff --git a/src/views/productionManagement/productionProcess/index.vue b/src/views/productionManagement/productionProcess/index.vue
index 5ecb747..f221b80 100644
--- a/src/views/productionManagement/productionProcess/index.vue
+++ b/src/views/productionManagement/productionProcess/index.vue
@@ -13,14 +13,15 @@
             </el-icon>鏂板宸ュ簭
           </el-button>
         </div>
-        <div class="process-card-list">
-          <div v-for="process in processList"
+        <div class="process-card-list"
+             v-loading="processLoading">
+          <div v-for="process in processValueList"
                :key="process.id"
                class="process-card"
                :class="{ active: selectedProcess?.id === process.id }"
                @click="selectProcess(process)">
             <div class="card-header">
-              <span class="process-code">{{ process.processCode }}</span>
+              <div class="process-name">{{ process.name }} <span class="process-code">{{ process.no }}</span></div>
               <div class="card-actions">
                 <el-button link
                            type="primary"
@@ -41,15 +42,21 @@
               </div>
             </div>
             <div class="card-body">
-              <div class="process-name">{{ process.processName }}</div>
-              <div class="process-desc">{{ process.processDesc || '鏆傛棤鎻忚堪' }}</div>
+              <!-- <div class="process-name">{{ process.name }}</div> -->
+              <div class="process-desc">{{ process.remark || '鏆傛棤鎻忚堪' }}</div>
             </div>
             <div class="card-footer">
-              <el-tag size="small"
-                      :type="process.status === '1' ? 'success' : 'info'">
-                {{ process.status === '1' ? '鍚敤' : '鍋滅敤' }}
-              </el-tag>
-              <span class="param-count">鍙傛暟: {{ process.paramCount || 0 }}涓�</span>
+              <div class="status-tag"> <el-tag size="small"
+                        :type="process.status ? 'success' : 'info'">
+                  {{ process.status ? '鍚敤' : '鍋滅敤' }}
+                </el-tag>
+                <el-tag size="small"
+                        :type="process.isQuality ? 'warning' : 'info'"
+                        style="margin-left: 8px">
+                  {{ process.isQuality ? '璐ㄦ' : '闈炶川妫�' }}
+                </el-tag>
+              </div>
+              <span class="param-count">宸ヨ祫瀹氶: 楼{{ process.salaryQuota || 0 }}</span>
             </div>
           </div>
         </div>
@@ -58,7 +65,7 @@
       <div class="param-list-section">
         <div class="section-header">
           <h3 class="section-title">
-            {{ selectedProcess ? selectedProcess.processName + ' - 鍙傛暟閰嶇疆' : '璇烽�夋嫨宸ュ簭' }}
+            {{ selectedProcess ? selectedProcess.name + ' - 鍙傛暟閰嶇疆' : '璇烽�夋嫨宸ュ簭' }}
           </h3>
           <el-button type="primary"
                      size="small"
@@ -95,18 +102,30 @@
                ref="processFormRef"
                label-width="100px">
         <el-form-item label="宸ュ簭缂栫爜"
-                      prop="processCode">
-          <el-input v-model="processForm.processCode"
+                      prop="no">
+          <el-input v-model="processForm.no"
                     placeholder="璇疯緭鍏ュ伐搴忕紪鐮�" />
         </el-form-item>
         <el-form-item label="宸ュ簭鍚嶇О"
-                      prop="processName">
-          <el-input v-model="processForm.processName"
+                      prop="name">
+          <el-input v-model="processForm.name"
                     placeholder="璇疯緭鍏ュ伐搴忓悕绉�" />
         </el-form-item>
+        <el-form-item label="宸ヨ祫瀹氶"
+                      prop="salaryQuota">
+          <el-input v-model="processForm.salaryQuota"
+                    type="number"
+                    :step="0.001" />
+        </el-form-item>
+        <el-form-item label="鏄惁璐ㄦ"
+                      prop="isQuality">
+          <el-switch v-model="processForm.isQuality"
+                     :active-value="true"
+                     inactive-value="false" />
+        </el-form-item>
         <el-form-item label="宸ュ簭鎻忚堪"
-                      prop="processDesc">
-          <el-input v-model="processForm.processDesc"
+                      prop="remark">
+          <el-input v-model="processForm.remark"
                     type="textarea"
                     :rows="3"
                     placeholder="璇疯緭鍏ュ伐搴忔弿杩�" />
@@ -114,8 +133,8 @@
         <el-form-item label="鐘舵��"
                       prop="status">
           <el-radio-group v-model="processForm.status">
-            <el-radio label="1">鍚敤</el-radio>
-            <el-radio label="0">鍋滅敤</el-radio>
+            <el-radio :label="true">鍚敤</el-radio>
+            <el-radio :label="false">鍋滅敤</el-radio>
           </el-radio-group>
         </el-form-item>
       </el-form>
@@ -156,15 +175,15 @@
             <el-table-column prop="parameterCode"
                              label="鍙傛暟缂栧彿"
                              width="100" />
-            <el-table-column prop="parameterName"
+            <el-table-column prop="paramName"
                              label="鍙傛暟鍚嶇О" />
-            <el-table-column prop="parameterType"
+            <el-table-column prop="paramType"
                              label="鍙傛暟绫诲瀷"
                              width="100">
               <template #default="scope">
                 <el-tag size="small"
-                        :type="getParamTypeTag(scope.row.parameterType)">
-                  {{ scope.row.parameterType }}
+                        :type="getParamTypeTag(scope.row.paramType)">
+                  {{ scope.row.paramType }}
                 </el-tag>
               </template>
             </el-table-column>
@@ -181,28 +200,40 @@
               <span class="detail-text">{{ selectedParam.parameterCode }}</span>
             </el-form-item>
             <el-form-item label="鍙傛暟鍚嶇О">
-              <span class="detail-text">{{ selectedParam.parameterName }}</span>
+              <span class="detail-text">{{ selectedParam.paramName }}</span>
             </el-form-item>
             <el-form-item label="鍙傛暟妯″紡">
               <el-tag size="small"
-                      :type="selectedParam.parameterType2 === '1' ? 'success' : 'warning'">
-                {{ selectedParam.parameterType2 === '1' ? '鍗曞��' : '鍖洪棿' }}
+                      :type="selectedParam.valueMode == '1' ? 'success' : 'warning'">
+                {{ selectedParam.valueMode == '1' ? '鍗曞��' : '鍖洪棿' }}
               </el-tag>
             </el-form-item>
             <el-form-item label="鍙傛暟绫诲瀷">
               <el-tag size="small"
-                      :type="getParamTypeTag(selectedParam.parameterType)">
-                {{ selectedParam.parameterType }}
+                      :type="getParamTypeTag(selectedParam.paramType)">
+                {{ selectedParam.paramType }}
               </el-tag>
             </el-form-item>
             <el-form-item label="鍙傛暟鏍煎紡">
-              <span class="detail-text">{{ selectedParam.parameterFormat || '-' }}</span>
-            </el-form-item>
-            <el-form-item label="鏍囧噯鍊�">
-              <span class="detail-text">{{ selectedParam.standardValue }}</span>
+              <span class="detail-text">{{ selectedParam.paramFormat || '-' }}</span>
             </el-form-item>
             <el-form-item label="鍗曚綅">
               <span class="detail-text">{{ selectedParam.unit || '-' }}</span>
+            </el-form-item>
+            <el-form-item label="榛樿鍊�"
+                          v-if="selectedParam.valueMode === '1'">
+              <el-input v-model="selectedParam.defaultValue"
+                        placeholder="璇疯緭鍏ラ粯璁ゅ��" />
+            </el-form-item>
+            <el-form-item label="鏈�灏忓��"
+                          v-if="selectedParam.valueMode === '2'">
+              <el-input v-model="selectedParam.defaultMin"
+                        placeholder="璇疯緭鍏ユ渶灏忓��" />
+            </el-form-item>
+            <el-form-item label="鏈�澶у��"
+                          v-if="selectedParam.valueMode === '2'">
+              <el-input v-model="selectedParam.defaultMax"
+                        placeholder="璇疯緭鍏ユ渶澶у��" />
             </el-form-item>
           </el-form>
           <el-empty v-else
@@ -227,9 +258,16 @@
   import { Plus, Edit, Delete, Search } from "@element-plus/icons-vue";
   import PIMTable from "@/components/PIMTable/PIMTable.vue";
   import { listType } from "@/api/system/dict/type";
+  import {
+    add,
+    update,
+    del,
+    list as getProcessListApi,
+    processList,
+  } from "@/api/productionManagement/productionProcess.js";
 
   // 宸ュ簭鍒楄〃鏁版嵁
-  const processList = ref([]);
+  const processValueList = ref([]);
   const selectedProcess = ref(null);
   const processLoading = ref(false);
 
@@ -251,14 +289,32 @@
   const processFormRef = ref(null);
   const processForm = reactive({
     id: null,
-    processCode: "",
-    processName: "",
-    processDesc: "",
-    status: "1",
+    no: "",
+    name: "",
+    salaryQuota: null,
+    isQuality: false,
+    remark: "",
+    status: true,
   });
   const processRules = {
-    processCode: [{ required: true, message: "璇疯緭鍏ュ伐搴忕紪鐮�", trigger: "blur" }],
-    processName: [{ required: true, message: "璇疯緭鍏ュ伐搴忓悕绉�", trigger: "blur" }],
+    no: [{ required: true, message: "璇疯緭鍏ュ伐搴忕紪鐮�", trigger: "blur" }],
+    name: [{ required: true, message: "璇疯緭鍏ュ伐搴忓悕绉�", trigger: "blur" }],
+    salaryQuota: [
+      {
+        required: true,
+        message: "璇疯緭鍏ュ伐璧勫畾棰�",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          if (value === null || value === undefined || value === "") {
+            callback(new Error("璇疯緭鍏ュ伐璧勫畾棰�"));
+          } else if (isNaN(value) || value < 0) {
+            callback(new Error("宸ヨ祫瀹氶蹇呴』鏄潪璐熸暟瀛�"));
+          } else {
+            callback();
+          }
+        },
+      },
+    ],
   };
 
   // 鍙傛暟瀵硅瘽妗�
@@ -277,18 +333,18 @@
     },
     {
       label: "鍙傛暟鍚嶇О",
-      prop: "parameterName",
+      prop: "paramName",
     },
     {
       label: "鍙傛暟妯″紡",
-      prop: "parameterType2",
+      prop: "valueMode",
       dataType: "tag",
-      formatType: row => (row.parameterType2 === "1" ? "success" : "warning"),
-      formatData: row => (row.parameterType2 === "1" ? "鍗曞��" : "鍖洪棿"),
+      formatType: row => (row.valueMode === "1" ? "success" : "warning"),
+      formatData: row => (row.valueMode === "1" ? "鍗曞��" : "鍖洪棿"),
     },
     {
       label: "鍙傛暟绫诲瀷",
-      prop: "parameterType",
+      prop: "paramType",
       dataType: "tag",
       formatType: row => {
         const typeMap = {
@@ -297,17 +353,38 @@
           涓嬫媺閫夐」: "warning",
           鏃堕棿鏍煎紡: "success",
         };
-        return typeMap[row.parameterType] || "default";
+        return typeMap[row.paramType] || "default";
       },
     },
     {
       label: "鍙傛暟鏍煎紡",
-      prop: "parameterFormat",
+      prop: "paramFormat",
     },
     {
       label: "鏍囧噯鍊�",
-      prop: "standardValue",
-      className: row => (row.parameterType === "鏁板�兼牸寮�" ? "quantity-cell" : ""),
+      prop: "defaultValue",
+      className: row => (row.paramType === "鏁板�兼牸寮�" ? "quantity-cell" : ""),
+    },
+    {
+      label: "榛樿鍊�",
+      prop: "defaultValue",
+      formatData: (val, row) => {
+        return row.valueMode === "1" ? val : "-";
+      },
+    },
+    {
+      label: "鏈�灏忓��",
+      prop: "defaultMin",
+      formatData: (val, row) => {
+        return row.valueMode === "2" ? val : "-";
+      },
+    },
+    {
+      label: "鏈�澶у��",
+      prop: "defaultMax",
+      formatData: (val, row) => {
+        return row.valueMode === "2" ? val : "-";
+      },
     },
     {
       label: "鍗曚綅",
@@ -328,212 +405,33 @@
 
   // 鑾峰彇宸ュ簭鍒楄〃
   const getProcessList = () => {
-    // 鍋囨暟鎹�
-    processList.value = [
-      {
-        id: 1,
-        processCode: "PROC001",
-        processName: "鍘熸枡閰嶆瘮",
-        processDesc: "鍘熸潗鏂欓厤姣斿伐搴�",
-        status: "1",
-        paramCount: 3,
-      },
-      {
-        id: 2,
-        processCode: "PROC002",
-        processName: "鎼呮媽娣峰悎",
-        processDesc: "鎼呮媽娣峰悎宸ュ簭",
-        status: "1",
-        paramCount: 2,
-      },
-      {
-        id: 3,
-        processCode: "PROC003",
-        processName: "娴囩瓚鎴愬瀷",
-        processDesc: "娴囩瓚鎴愬瀷宸ュ簭",
-        status: "1",
-        paramCount: 4,
-      },
-      {
-        id: 4,
-        processCode: "PROC004",
-        processName: "钂稿帇鍏绘姢",
-        processDesc: "钂稿帇鍏绘姢宸ュ簭",
-        status: "0",
-        paramCount: 2,
-      },
-      {
-        id: 5,
-        processCode: "PROC005",
-        processName: "鍒囧壊鍔犲伐",
-        processDesc: "鍒囧壊鍔犲伐宸ュ簭",
-        status: "1",
-        paramCount: 3,
-      },
-    ];
+    processLoading.value = true;
+    getProcessListApi()
+      .then(res => {
+        processValueList.value = res.data || [];
+      })
+      .catch(() => {
+        ElMessage.error("鑾峰彇宸ュ簭鍒楄〃澶辫触");
+      })
+      .finally(() => {
+        processLoading.value = false;
+      });
   };
 
   // 鑾峰彇鍙傛暟鍒楄〃
   const getParamList = processId => {
     paramLoading.value = true;
-    // 鍋囨暟鎹�
-    setTimeout(() => {
-      paramLoading.value = false;
-      const mockData = {
-        1: [
-          {
-            id: 1,
-            parameterCode: "P001",
-            parameterName: "姘存偿姣斾緥",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "30",
-            unit: "%",
-          },
-          {
-            id: 2,
-            parameterCode: "P002",
-            parameterName: "鐮傛瘮渚�",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "60",
-            unit: "%",
-          },
-          {
-            id: 3,
-            parameterCode: "P003",
-            parameterName: "姘存瘮渚�",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "10",
-            unit: "%",
-          },
-        ],
-        2: [
-          {
-            id: 4,
-            parameterCode: "P004",
-            parameterName: "鎼呮媽鏃堕棿",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "5",
-            unit: "鍒嗛挓",
-          },
-          {
-            id: 5,
-            parameterCode: "P005",
-            parameterName: "鎼呮媽閫熷害",
-            parameterType2: "2",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "100-200",
-            unit: "rpm",
-          },
-        ],
-        3: [
-          {
-            id: 6,
-            parameterCode: "P006",
-            parameterName: "娴囩瓚娓╁害",
-            parameterType2: "2",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "20-30",
-            unit: "鈩�",
-          },
-          {
-            id: 7,
-            parameterCode: "P007",
-            parameterName: "娴囩瓚鍘嬪姏",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "0.5",
-            unit: "MPa",
-          },
-          {
-            id: 8,
-            parameterCode: "P008",
-            parameterName: "鎴愬瀷鐘舵��",
-            parameterType2: "1",
-            parameterType: "涓嬫媺閫夐」",
-            parameterFormat: "status",
-            standardValue: "姝e父",
-            unit: "",
-          },
-          {
-            id: 9,
-            parameterCode: "P009",
-            parameterName: "鎴愬瀷鏃堕棿",
-            parameterType2: "1",
-            parameterType: "鏃堕棿鏍煎紡",
-            parameterFormat: "YYYY-MM-DD HH:mm:ss",
-            standardValue: "2024-01-01 08:00:00",
-            unit: "",
-          },
-        ],
-        4: [
-          {
-            id: 10,
-            parameterCode: "P010",
-            parameterName: "钂稿帇娓╁害",
-            parameterType2: "2",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "180-200",
-            unit: "鈩�",
-          },
-          {
-            id: 11,
-            parameterCode: "P011",
-            parameterName: "钂稿帇鍘嬪姏",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "1.2",
-            unit: "MPa",
-          },
-        ],
-        5: [
-          {
-            id: 12,
-            parameterCode: "P012",
-            parameterName: "鍒囧壊灏哄",
-            parameterType2: "1",
-            parameterType: "鏂囨湰鏍煎紡",
-            parameterFormat: "",
-            standardValue: "600x200x100",
-            unit: "mm",
-          },
-          {
-            id: 13,
-            parameterCode: "P013",
-            parameterName: "鍒囧壊绮惧害",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "卤1",
-            unit: "mm",
-          },
-          {
-            id: 14,
-            parameterCode: "P014",
-            parameterName: "鍒囧壊閫熷害",
-            parameterType2: "1",
-            parameterType: "鏁板�兼牸寮�",
-            parameterFormat: "",
-            standardValue: "2",
-            unit: "m/min",
-          },
-        ],
-      };
-      paramList.value = mockData[processId] || [];
-      paramPage.total = paramList.value.length;
-    }, 300);
+    getProcessParamList(processId)
+      .then(res => {
+        paramList.value = res.data || [];
+        paramPage.total = paramList.value.length;
+      })
+      .catch(() => {
+        ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
+      })
+      .finally(() => {
+        paramLoading.value = false;
+      });
   };
 
   // 閫夋嫨宸ュ簭
@@ -546,19 +444,23 @@
   const handleAddProcess = () => {
     isProcessEdit.value = false;
     processForm.id = null;
-    processForm.processCode = "";
-    processForm.processName = "";
-    processForm.processDesc = "";
-    processForm.status = "1";
+    processForm.no = "";
+    processForm.name = "";
+    processForm.salaryQuota = null;
+    processForm.isQuality = false;
+    processForm.remark = "";
+    processForm.status = true;
     processDialogVisible.value = true;
   };
 
   const handleEditProcess = process => {
     isProcessEdit.value = true;
     processForm.id = process.id;
-    processForm.processCode = process.processCode;
-    processForm.processName = process.processName;
-    processForm.processDesc = process.processDesc;
+    processForm.no = process.no;
+    processForm.name = process.name;
+    processForm.salaryQuota = process.salaryQuota;
+    processForm.isQuality = process.isQuality || false;
+    processForm.remark = process.remark || "";
     processForm.status = process.status;
     processDialogVisible.value = true;
   };
@@ -569,21 +471,34 @@
       cancelButtonText: "鍙栨秷",
       type: "warning",
     }).then(() => {
-      ElMessage.success("鍒犻櫎鎴愬姛");
-      getProcessList();
-      if (selectedProcess.value?.id === process.id) {
-        selectedProcess.value = null;
-        paramList.value = [];
-      }
+      del([process.id])
+        .then(() => {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getProcessList();
+          if (selectedProcess.value?.id === process.id) {
+            selectedProcess.value = null;
+            paramList.value = [];
+          }
+        })
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
     });
   };
 
   const handleProcessSubmit = () => {
     processFormRef.value.validate(valid => {
       if (valid) {
-        ElMessage.success(isProcessEdit.value ? "缂栬緫鎴愬姛" : "鏂板鎴愬姛");
-        processDialogVisible.value = false;
-        getProcessList();
+        const apiMethod = isProcessEdit.value ? update : add;
+        apiMethod(processForm)
+          .then(() => {
+            ElMessage.success(isProcessEdit.value ? "缂栬緫鎴愬姛" : "鏂板鎴愬姛");
+            processDialogVisible.value = false;
+            getProcessList();
+          })
+          .catch(() => {
+            ElMessage.error(isProcessEdit.value ? "缂栬緫澶辫触" : "鏂板澶辫触");
+          });
       }
     });
   };
@@ -599,71 +514,71 @@
       {
         id: 101,
         parameterCode: "P101",
-        parameterName: "娓╁害",
-        parameterType2: "2",
-        parameterType: "鏁板�兼牸寮�",
-        parameterFormat: "",
-        standardValue: "20-30",
+        paramName: "娓╁害",
+        valueMode: "2",
+        paramType: "鏁板�兼牸寮�",
+        paramFormat: "",
+        defaultValue: "20-30",
         unit: "鈩�",
       },
       {
         id: 102,
         parameterCode: "P102",
-        parameterName: "鍘嬪姏",
-        parameterType2: "1",
-        parameterType: "鏁板�兼牸寮�",
-        parameterFormat: "",
-        standardValue: "0.5",
+        paramName: "鍘嬪姏",
+        valueMode: "1",
+        paramType: "鏁板�兼牸寮�",
+        paramFormat: "",
+        defaultValue: "0.5",
         unit: "MPa",
       },
       {
         id: 103,
         parameterCode: "P103",
-        parameterName: "婀垮害",
-        parameterType2: "2",
-        parameterType: "鏁板�兼牸寮�",
-        parameterFormat: "",
-        standardValue: "40-60",
+        paramName: "婀垮害",
+        valueMode: "2",
+        paramType: "鏁板�兼牸寮�",
+        paramFormat: "",
+        defaultValue: "40-60",
         unit: "%",
       },
       {
         id: 104,
         parameterCode: "P104",
-        parameterName: "閫熷害",
-        parameterType2: "1",
-        parameterType: "鏁板�兼牸寮�",
-        parameterFormat: "",
-        standardValue: "100",
+        paramName: "閫熷害",
+        valueMode: "1",
+        paramType: "鏁板�兼牸寮�",
+        paramFormat: "",
+        defaultValue: "100",
         unit: "m/min",
       },
       {
         id: 105,
         parameterCode: "P105",
-        parameterName: "鐘舵��",
-        parameterType2: "1",
-        parameterType: "涓嬫媺閫夐」",
-        parameterFormat: "status",
-        standardValue: "姝e父",
+        paramName: "鐘舵��",
+        valueMode: "1",
+        paramType: "涓嬫媺閫夐」",
+        paramFormat: "status",
+        defaultValue: "姝e父",
         unit: "",
       },
       {
         id: 106,
         parameterCode: "P106",
-        parameterName: "璁板綍鏃堕棿",
-        parameterType2: "1",
-        parameterType: "鏃堕棿鏍煎紡",
-        parameterFormat: "YYYY-MM-DD HH:mm:ss",
-        standardValue: "2024-01-01 08:00:00",
+        paramName: "璁板綍鏃堕棿",
+        valueMode: "1",
+        paramType: "鏃堕棿鏍煎紡",
+        paramFormat: "YYYY-MM-DD HH:mm:ss",
+        defaultValue: "2024-01-01 08:00:00",
         unit: "",
       },
       {
         id: 107,
         parameterCode: "P107",
-        parameterName: "澶囨敞",
-        parameterType2: "1",
-        parameterType: "鏂囨湰鏍煎紡",
-        parameterFormat: "",
-        standardValue: "鏃�",
+        paramName: "澶囨敞",
+        valueMode: "1",
+        paramType: "鏂囨湰鏍煎紡",
+        paramFormat: "",
+        defaultValue: "鏃�",
         unit: "",
       },
     ];
@@ -683,7 +598,7 @@
       filteredParamList.value = availableParamList.value;
     } else {
       filteredParamList.value = availableParamList.value.filter(item =>
-        item.parameterName.toLowerCase().includes(keyword)
+        item.paramName.toLowerCase().includes(keyword)
       );
     }
   };
@@ -704,8 +619,14 @@
       cancelButtonText: "鍙栨秷",
       type: "warning",
     }).then(() => {
-      ElMessage.success("鍒犻櫎鎴愬姛");
-      getParamList(selectedProcess.value.id);
+      deleteProcessParam(row.id)
+        .then(() => {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getParamList(selectedProcess.value.id);
+        })
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
     });
   };
 
@@ -714,9 +635,21 @@
       ElMessage.warning("璇峰厛閫夋嫨涓�涓弬鏁�");
       return;
     }
-    ElMessage.success("娣诲姞鎴愬姛");
-    paramDialogVisible.value = false;
-    getParamList(selectedProcess.value.id);
+    addProcessParam({
+      processId: selectedProcess.value.id,
+      paramId: selectedParam.value.id,
+      defaultValue: selectedParam.value.defaultValue,
+      defaultMin: selectedParam.value.defaultMin,
+      defaultMax: selectedParam.value.defaultMax,
+    })
+      .then(() => {
+        ElMessage.success("娣诲姞鎴愬姛");
+        paramDialogVisible.value = false;
+        getParamList(selectedProcess.value.id);
+      })
+      .catch(() => {
+        ElMessage.error("娣诲姞澶辫触");
+      });
   };
 
   const handleParamPagination = obj => {
@@ -810,7 +743,8 @@
 
       .process-code {
         font-size: 12px;
-        color: #909399;
+        // color: #909399;
+        color: #cb9b18;
         font-family: "Courier New", monospace;
       }
 

--
Gitblit v1.9.3