zhangwencui
3 天以前 f099476f3fd101fd815467c986c6c1ad9da926f1
工艺路线接口对接
已修改2个文件
729 ■■■■ 文件已修改
src/api/productionManagement/processRouteItem.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/processRoute/index.vue 698 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/processRouteItem.js
@@ -36,3 +36,34 @@
    method: "delete",
  });
}
// 获取工序参数列表
export function getProcessParamList(query) {
  return request({
    url: `/ProcessRouteItemParam/pageList`,
    method: "get",
    params: query,
  });
}
// 工艺路线参数新增
export function addProcessRouteItemParam(data) {
  return request({
    url: "/ProcessRouteItemParam/save",
    method: "post",
    data: data,
  });
}
// 工艺路线参数修改
export function editProcessRouteItemParam(data) {
  return request({
    url: "/ProcessRouteItemParam/edit",
    method: "put",
    data: data,
  });
}
// 工艺路线参数修改
export function delProcessRouteItemParam(id) {
  return request({
    url: `/ProcessRouteItemParam/remove/${id}`,
    method: "delete",
  });
}
src/views/productionManagement/processRoute/index.vue
@@ -78,7 +78,7 @@
              <el-icon>
                <Document />
              </el-icon>
              <span class="meta-label">路线描述:</span>
              <span class="meta-label">备注:</span>
              <span class="meta-value">{{ route.description || '暂无描述' }}</span>
            </span>
          </div>
@@ -112,6 +112,13 @@
                  <div class="process-number">{{ index + 1 }}</div>
                  <div class="process-actions">
                    <el-button link
                               type="primary"
                               @click="handleEditProcessSelect(route, index, process)">
                      <el-icon>
                        <Edit />
                      </el-icon>
                    </el-button>
                    <el-button link
                               type="danger"
                               @click="handleDeleteProcess(route.id, process)">
                      <el-icon>
@@ -121,9 +128,9 @@
                  </div>
                </div>
                <div class="process-node-body">
                  <div class="process-code">{{ process.no }}</div>
                  <div class="process-name">{{ process.name }}</div>
                  <div class="process-desc">{{ process.remark || '暂无描述' }}</div>
                  <!-- <div class="process-code">{{ process.processId }}</div> -->
                  <div class="process-name">{{ process.processName }}</div>
                  <!-- <div class="process-desc">{{ process.remark || '暂无描述' }}</div> -->
                </div>
                <div class="process-node-footer">
                  <!-- <el-tag size="small"
@@ -135,7 +142,7 @@
                             size="small"
                             @click="toggleProcessParams(process)">
                    {{ process.expanded ? '收起参数' : '展开参数' }}
                    ({{ process.paramList?.length || 0 }})
                    ({{ process.paramCount }})
                  </el-button>
                </div>
                <div v-if="process.expanded"
@@ -156,14 +163,17 @@
                         :key="param.id"
                         class="param-item">
                      <div class="param-info">
                        <span class="param-code">{{ param.parameterCode }}</span>
                        <span class="param-name">{{ param.parameterName }}</span>
                        <span class="param-code">{{ param.paramName }}</span>
                        <!-- <span class="param-name">{{ param.paramName }}</span> -->
                        <!-- <el-tag size="small"
                                style="margin-right: 20px;"
                                :type="getParamTypeTag(param.parameterType)">
                          {{ param.parameterType }}
                        </el-tag> -->
                        <span class="param-value">标准值:{{ param.standardValue }} {{ param.unit }}</span>
                        <span v-if="param.valueMode==1"
                              class="param-value">标准值:{{ param.standardValue }} {{ param.unit }}</span>
                        <span v-else
                              class="param-value">标准值:{{ param.minValue }}-{{ param.maxValue }} {{ param.unit }}</span>
                      </div>
                      <div class="param-actions">
                        <el-button link
@@ -204,6 +214,16 @@
        </div>
      </div>
    </div>
    <!-- 分页控件 -->
    <div class="pagination-container">
      <el-pagination v-model:current-page="routePage.current"
                     v-model:page-size="routePage.size"
                     :page-sizes="[10, 20, 50, 100]"
                     layout="total, sizes, prev, pager, next, jumper"
                     :total="routePage.total"
                     @size-change="handleRouteSizeChange"
                     @current-change="handleRouteCurrentChange" />
    </div>
    <!-- 工艺路线新增/编辑对话框 -->
    <el-dialog v-model="routeDialogVisible"
               :title="isRouteEdit ? '编辑工艺路线' : '新增工艺路线'"
@@ -215,7 +235,7 @@
        <el-form-item label="产品名称"
                      prop="productModelId">
          <el-button type="primary"
                     @click="showProductSelectDialog = true">
                     @click="handleProcessProductSelectClick2">
            {{ routeForm.productName && routeForm.productModelName 
              ? `${routeForm.productName} - ${routeForm.productModelName}` 
              : '选择产品' }}
@@ -240,7 +260,7 @@
                    disabled
                    placeholder="自动生成" />
        </el-form-item>
        <el-form-item label="路线描述"
        <el-form-item label="备注"
                      prop="description">
          <el-input v-model="routeForm.description"
                    type="textarea"
@@ -357,7 +377,7 @@
        <div class="process-detail-area">
          <div class="area-title">工序详情</div>
          <el-form v-if="selectedProcessItem"
                   :model="selectedProcessItem"
                   :model="processForm"
                   label-width="100px"
                   class="process-detail-form">
            <el-form-item label="工序编号">
@@ -381,9 +401,28 @@
                {{ selectedProcessItem.isQuality ? '质检' : '非质检' }}
              </el-tag>
            </el-form-item>
            <!-- <el-form-item label="参数数量">
              <span class="detail-text">{{ selectedProcessItem.paramCount || 0 }}个</span>
            </el-form-item> -->
            <el-form-item label="产品名称"
                          prop="productModelId">
              <el-button type="primary"
                         @click="handleProcessProductSelectClick">
                {{ processForm.productName && processForm.model
                  ? `${processForm.productName} - ${processForm.model}`
                  : '选择产品' }}
              </el-button>
            </el-form-item>
            <el-form-item label="单位"
                          prop="unit">
              <el-input v-model="processForm.unit"
                        :placeholder="processForm.productModelId ? '根据选择的产品自动带出' : '请先选择产品' "
                        clearable
                        :disabled="true" />
            </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>
          <el-empty v-else
                    description="请从左侧选择工序" />
@@ -393,7 +432,7 @@
        <span class="dialog-footer">
          <el-button @click="selectProcessDialogVisible = false">取消</el-button>
          <el-button type="primary"
                     :disabled="!selectedProcessItem"
                     :disabled="!selectedProcessItem || !processForm.productModelId"
                     @click="handleProcessSelectSubmit">确定</el-button>
        </span>
      </template>
@@ -672,7 +711,7 @@
</template>
<script setup>
  import { ref, reactive, getCurrentInstance } from "vue";
  import { ref, reactive, getCurrentInstance, onMounted } from "vue";
  import { ElMessage, ElMessageBox } from "element-plus";
  import {
    Plus,
@@ -690,6 +729,16 @@
  import { listType } from "@/api/system/dict/type";
  import { getByModel } from "@/api/productionManagement/productBom.js";
  import { add, update, del } from "@/api/productionManagement/processRoute.js";
  import {
    addOrUpdateProcessRouteItem,
    batchDeleteProcessRouteItem,
    sortProcessRouteItem,
    findProcessRouteItemList,
    getProcessParamList,
    addProcessRouteItemParam,
    editProcessRouteItemParam,
    delProcessRouteItemParam,
  } from "@/api/productionManagement/processRouteItem.js";
  import { list as getProcessListApi } from "@/api/productionManagement/productionProcess.js";
  import { getBaseParamList } from "@/api/basicData/parameterMaintenance.js";
  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
@@ -697,6 +746,13 @@
  // 工艺路线列表
  const routeList = ref([]);
  const dictTypes = ref([]);
  // 工艺路线分页
  const routePage = reactive({
    current: 1,
    size: 10,
    total: 0,
  });
  // 获取全局实例
  const { proxy } = getCurrentInstance();
@@ -876,7 +932,7 @@
  const getRouteList = () => {
    // 导入 listPage 方法
    import("@/api/productionManagement/processRoute.js").then(({ listPage }) => {
      listPage({ pageNum: 1, pageSize: 100 })
      listPage({ pageNum: routePage.current, pageSize: routePage.size })
        .then(res => {
          // 处理返回的数据,映射到页面需要的格式
          routeList.value = (res.data?.records || []).map(item => ({
@@ -890,12 +946,19 @@
            description: item.description || item.description,
            status: item.status,
            expanded: false,
            processList: item.processList || [],
            processList: (item.processList || []).map(process => ({
              ...process,
              processId: process.processId || process.id,
              expanded: false,
            })),
          }));
          // 更新分页总数
          routePage.total = res.data?.total || 0;
        })
        .catch(err => {
          console.error("获取工艺路线列表失败:", err);
          routeList.value = [];
          routePage.total = 0;
        });
    });
  };
@@ -903,13 +966,77 @@
  // 展开/收起工艺路线
  const toggleExpand = route => {
    route.expanded = !route.expanded;
    if (route.expanded) {
      // 调用接口获取工序列表
      findProcessRouteItemList({ routeId: route.id })
        .then(res => {
          route.processList = (res.data || []).map(process => ({
            ...process,
            processId: process.processId || process.id,
            expanded: false,
          }));
        })
        .catch(err => {
          console.error("获取工序列表失败:", err);
          route.processList = [];
        });
    }
  };
  // 展开/收起工序参数
  const toggleProcessParams = process => {
    process.expanded = !process.expanded;
    if (process.expanded && process.id) {
      // 调用接口获取参数列表
      getProcessParamList({
        routeItemId: process.id,
        pageNum: 1,
        pageSize: 1000,
      })
        .then(res => {
          if (res.code === 200) {
            process.paramList = res.data?.records || [];
            process.paramCount = process.paramList.length;
          } else {
            ElMessage.error(res.msg || "获取参数列表失败");
            process.paramList = [];
            process.paramCount = 0;
          }
        })
        .catch(err => {
          console.error("获取参数列表失败:", err);
          ElMessage.error("获取参数列表失败");
          process.paramList = [];
          process.paramCount = 0;
        });
    }
  };
  const toggleProcessParams2 = process => {
    if (process.expanded && process.id) {
      // 调用接口获取参数列表
      getProcessParamList({
        routeItemId: process.id,
        pageNum: 1,
        pageSize: 1000,
      })
        .then(res => {
          if (res.code === 200) {
            process.paramList = res.data?.records || [];
            process.paramCount = process.paramList.length;
          } else {
            ElMessage.error(res.msg || "获取参数列表失败");
            process.paramList = [];
            process.paramCount = 0;
          }
        })
        .catch(err => {
          console.error("获取参数列表失败:", err);
          ElMessage.error("获取参数列表失败");
          process.paramList = [];
          process.paramCount = 0;
        });
    }
  };
  // 工艺路线操作
  const handleAddRoute = () => {
    isRouteEdit.value = false;
@@ -993,39 +1120,66 @@
      }
    });
  };
  const isform2 = ref(null);
  const handleProcessProductSelectClick = () => {
    isform2.value = true;
    showProductSelectDialog.value = true;
  };
  const handleProcessProductSelectClick2 = () => {
    isform2.value = false;
    showProductSelectDialog.value = true;
  };
  // 产品选择处理
  const handleProductSelect = async products => {
    if (products && products.length > 0) {
      const product = products[0];
      // 先查询BOM列表(必选)
      try {
        const res = await getByModel(product.id);
        // 处理返回的BOM数据:可能是数组、对象或包含data字段
        let bomList = [];
        if (Array.isArray(res)) {
          bomList = res;
        } else if (res && res.data) {
          bomList = Array.isArray(res.data) ? res.data : [res.data];
        } else if (res && typeof res === "object") {
          bomList = [res];
        }
    if (isform2.value) {
      // 帮我写工序中的选择产品的回调,并且把字段加进processForm
      if (products && products.length > 0) {
        const product = products[0];
        console.log("product:", product);
        // 把product中的字段添加到processForm中
        // Object.assign(processForm, product);
        processForm.productModelId = product.id;
        processForm.productName = product.productName;
        processForm.model = product.model;
        processForm.unit = product.unit || "";
        console.log("processForm:", processForm);
        if (bomList.length > 0) {
          routeForm.productModelId = product.id;
          routeForm.productName = product.productName;
          routeForm.productModelName = product.model;
          routeForm.bomId = undefined; // 重置BOM选择
          bomOptions.value = bomList;
          showProductSelectDialog.value = false;
          // 触发表单验证更新
          proxy.$refs["routeFormRef"]?.validateField("productModelId");
        } else {
        // 触发表单验证更新
        proxy.$refs["processFormRef"]?.validateField("productModelId");
      }
    } else {
      if (products && products.length > 0) {
        const product = products[0];
        // 先查询BOM列表(必选)
        try {
          const res = await getByModel(product.id);
          // 处理返回的BOM数据:可能是数组、对象或包含data字段
          let bomList = [];
          if (Array.isArray(res)) {
            bomList = res;
          } else if (res && res.data) {
            bomList = Array.isArray(res.data) ? res.data : [res.data];
          } else if (res && typeof res === "object") {
            bomList = [res];
          }
          console.log("bomList:", bomList);
          if (bomList.length > 0) {
            routeForm.productModelId = product.id;
            routeForm.productName = product.productName;
            routeForm.productModelName = product.model;
            routeForm.bomId = undefined; // 重置BOM选择
            bomOptions.value = bomList;
            showProductSelectDialog.value = false;
            // 触发表单验证更新
            proxy.$refs["routeFormRef"]?.validateField("productModelId");
          } else {
            proxy.$modal.msgError("该产品没有BOM,请先创建BOM");
          }
        } catch (error) {
          // 如果接口返回404或其他错误,说明没有BOM
          proxy.$modal.msgError("该产品没有BOM,请先创建BOM");
        }
      } catch (error) {
        // 如果接口返回404或其他错误,说明没有BOM
        proxy.$modal.msgError("该产品没有BOM,请先创建BOM");
      }
    }
  };
@@ -1065,31 +1219,46 @@
        });
    });
  };
  // 工序操作
  const handleSelectProcess = (route, index) => {
    console.log("route:", route);
    currentRouteId.value = route.id;
    currentRouteIndex.value = index;
    // 获取可选工序列表
    getProcessListApi()
      .then(res => {
        // 处理返回的数据,映射到页面需要的格式
        availableProcessList.value = (res.data || []).map(item => ({
          id: item.id,
          no: item.no || item.no,
          name: item.name || item.name,
          remark: item.remark || item.remark,
          status: item.status,
          isQuality: item.isQuality,
        }));
        filteredProcessList.value = availableProcessList.value;
        processSearchKeyword.value = "";
        selectedProcessItem.value = null;
        selectProcessDialogVisible.value = true;
      })
      .catch(() => {
        ElMessage.error("获取工序列表失败");
      });
    // 重置搜索和选择状态
    filteredProcessList.value = availableProcessList.value;
    processSearchKeyword.value = "";
    selectedProcessItem.value = null;
    selectProcessDialogVisible.value = true;
  };
  const dragSort = ref(0);
  const currentId = ref(null);
  // 修改工序
  const handleEditProcessSelect = (route, index, process) => {
    console.log("route:", route);
    console.log("process:", process);
    currentId.value = process.id;
    currentRouteId.value = route.id;
    currentRouteIndex.value = index;
    // 重置搜索和选择状态
    filteredProcessList.value = availableProcessList.value;
    processSearchKeyword.value = "";
    // 设置选中的工序
    filteredProcessList.value.map(item => {
      if (item.id === process.processId) {
        selectedProcessItem.value = item;
      }
    });
    dragSort.value = process.dragSort;
    // selectedProcessItem.value = process;
    // 填充产品选择表单
    processForm.productModelId = process.productModelId;
    processForm.productName = process.productName;
    processForm.model = process.model;
    processForm.processId = process.no;
    // processForm.name = process.name;
    processForm.unit = process.unit || "";
    processForm.isQuality = process.isQuality || false;
    selectProcessDialogVisible.value = true;
  };
  const handleEditProcess = (routeId, process) => {
@@ -1109,8 +1278,30 @@
      cancelButtonText: "取消",
      type: "warning",
    }).then(() => {
      ElMessage.success("删除成功");
      getRouteList();
      // 调用API删除工序
      batchDeleteProcessRouteItem([process.id])
        .then(res => {
          ElMessage.success("删除成功");
          // 调用接口更新工序列表
          findProcessRouteItemList({ routeId: routeId })
            .then(res => {
              const route = routeList.value.find(r => r.id === routeId);
              if (route) {
                route.processList = (res.data || []).map(process => ({
                  ...process,
                  processId: process.processId || process.id,
                  expanded: false,
                }));
              }
            })
            .catch(err => {
              console.error("获取工序列表失败:", err);
            });
        })
        .catch(err => {
          ElMessage.error("删除失败");
          console.error("删除工序失败:", err);
        });
    });
  };
@@ -1119,7 +1310,25 @@
      if (valid) {
        ElMessage.success(isProcessEdit.value ? "编辑成功" : "新增成功");
        processDialogVisible.value = false;
        getRouteList();
        // 调用接口更新工序列表
        if (currentRouteId.value) {
          findProcessRouteItemList({ routeId: currentRouteId.value })
            .then(res => {
              const route = routeList.value.find(
                r => r.id === currentRouteId.value
              );
              if (route) {
                route.processList = (res.data || []).map(process => ({
                  ...process,
                  processId: process.processId || process.id,
                  expanded: false,
                }));
              }
            })
            .catch(err => {
              console.error("获取工序列表失败:", err);
            });
        }
      }
    });
  };
@@ -1130,14 +1339,34 @@
    if (!keyword) {
      filteredProcessList.value = availableProcessList.value;
    } else {
      filteredProcessList.value = availableProcessList.value.filter(item =>
        item.name.toLowerCase().includes(keyword)
      filteredProcessList.value = availableProcessList.value.filter(
        item =>
          (item.name && item.name.toLowerCase().includes(keyword)) ||
          (item.no && item.no.toLowerCase().includes(keyword))
      );
    }
  };
  const handleProcessSelect = row => {
    selectedProcessItem.value = row;
    // 重置产品选择表单
    processForm.productModelId = undefined;
    processForm.productName = "";
    processForm.productModelName = "";
    processForm.unit = "";
    processForm.isQuality = row.isQuality || false;
  };
  // 处理工序选择时的产品选择
  const handleProcessProductSelect = async products => {
    if (products && products.length > 0) {
      const product = products[0];
      processForm.productModelId = product.id;
      processForm.productName = product.productName;
      processForm.productModelName = product.model;
      processForm.unit = product.unit || "";
      showProductSelectDialog.value = false;
    }
  };
  const handleProcessSelectSubmit = () => {
@@ -1146,30 +1375,59 @@
      return;
    }
    // 检查工序是否已存在
    const route = routeList.value[currentRouteIndex.value];
    const exists = route.processList.some(
      p => p.id === selectedProcessItem.value.id
    );
    if (exists) {
      ElMessage.warning("该工序已存在于工艺路线中");
    if (!processForm.productModelId) {
      ElMessage.warning("请选择产品");
      return;
    }
    // 添加工序到工艺路线
    const newProcess = {
      id: Date.now(),
      no: selectedProcessItem.value.no,
      name: selectedProcessItem.value.name,
      remark: selectedProcessItem.value.remark,
      status: selectedProcessItem.value.status,
      paramList: [],
      expanded: false,
    // 构建请求参数
    const params = {
      routeId: currentRouteId.value,
      processId: selectedProcessItem.value.id,
      dragSort: routePage.total + 1,
      ...processForm,
    };
    route.processList.push(newProcess);
    ElMessage.success("添加工序成功");
    selectProcessDialogVisible.value = false;
    // 如果是修改操作,添加id参数
    if (selectedProcessItem.value.id) {
      params.id = currentId.value;
      params.dragSort = dragSort.value;
    }
    // 调用API添加工序或修改工序
    addOrUpdateProcessRouteItem(params)
      .then(res => {
        ElMessage.success(
          selectedProcessItem.value.id ? "修改工序成功" : "添加工序成功"
        );
        selectProcessDialogVisible.value = false;
        // 调用接口更新工序列表
        findProcessRouteItemList({ routeId: currentRouteId.value })
          .then(res => {
            const route = routeList.value.find(
              r => r.id === currentRouteId.value
            );
            if (route) {
              route.processList = (res.data || []).map(process => ({
                ...process,
                processId: process.processId || process.id,
                expanded: false,
              }));
            }
          })
          .catch(err => {
            console.error("获取工序列表失败:", err);
          });
      })
      .catch(err => {
        ElMessage.error(
          selectedProcessItem.value.id ? "修改工序失败" : "添加工序失败"
        );
        console.error(
          selectedProcessItem.value.id ? "修改工序失败:" : "添加工序失败:",
          err
        );
      });
  };
  // 参数操作
@@ -1217,8 +1475,17 @@
      cancelButtonText: "取消",
      type: "warning",
    }).then(() => {
      ElMessage.success("删除成功");
      getRouteList();
      // 调用API删除参数
      delProcessRouteItemParam(param.id)
        .then(res => {
          ElMessage.success("删除成功");
          // 刷新参数列表
          toggleProcessParams2(process);
        })
        .catch(err => {
          ElMessage.error("删除参数失败");
          console.error("删除参数失败:", err);
        });
    });
  };
@@ -1327,6 +1594,17 @@
    });
  };
  // 工艺路线分页处理
  const handleRouteSizeChange = size => {
    routePage.size = size;
    getRouteList();
  };
  const handleRouteCurrentChange = current => {
    routePage.current = current;
    getRouteList();
  };
  const handleParamSelectSubmit = () => {
    if (!selectedParam.value) {
      ElMessage.warning("请先选择一个参数");
@@ -1339,64 +1617,70 @@
    if (route && process) {
      // 检查参数是否已存在
      const exists = process.paramList?.some(
        p =>
          p.paramId === selectedParam.value.id ||
          p.parameterCode === selectedParam.value.paramCode
      );
      if (exists) {
        ElMessage.warning("该参数已存在于工序中");
        return;
      }
      // const exists = process.paramList?.some(
      //   p =>
      //     p.paramId === selectedParam.value.id ||
      //     p.parameterCode === selectedParam.value.paramCode
      // );
      // if (exists) {
      //   ElMessage.warning("该参数已存在于工序中");
      //   return;
      // }
      // 添加工序到工艺路线
      const newParam = {
        id: Date.now(),
      // 调用API新增参数
      addProcessRouteItemParam({
        routeItemId: process.id,
        paramId: selectedParam.value.id,
        parameterCode: selectedParam.value.paramCode,
        parameterName: selectedParam.value.paramName,
        parameterType2: selectedParam.value.valueMode || "1",
        parameterType: selectedParam.value.paramType,
        parameterFormat: selectedParam.value.paramFormat,
        standardValue: selectedParam.value.standardValue,
        minValue: selectedParam.value.minValue,
        maxValue: selectedParam.value.maxValue,
        unit: selectedParam.value.unit,
        sort: selectedParam.value.sort || 1,
        standardValue: selectedParam.value.standardValue || "",
        minValue: selectedParam.value.minValue || 0,
        maxValue: selectedParam.value.maxValue || 0,
        isRequired: selectedParam.value.isRequired || 0,
      };
      if (!process.paramList) {
        process.paramList = [];
      }
      process.paramList.push(newParam);
      ElMessage.success("添加参数成功");
      selectParamDialogVisible.value = false;
      })
        .then(res => {
          ElMessage.success("添加参数成功");
          selectParamDialogVisible.value = false;
          // 刷新参数列表
          toggleProcessParams2(process);
        })
        .catch(err => {
          ElMessage.error("添加参数失败");
          console.error("添加参数失败:", err);
        });
    }
  };
  const handleEditParamSubmit = () => {
    editParamFormRef.value.validate(valid => {
      if (valid) {
        // 找到对应的工艺路线、工序和参数
        const route = routeList.value.find(r => r.id === currentRouteId.value);
        const process = route?.processList.find(
          p => p.id === currentProcessId.value
        );
        const param = process?.paramList.find(p => p.id === editParamForm.id);
        if (param) {
          // 更新参数信息
          param.standardValue = editParamForm.standardValue;
          param.minValue = editParamForm.minValue;
          param.maxValue = editParamForm.maxValue;
          param.sort = editParamForm.sort;
          param.isRequired = editParamForm.isRequired;
          ElMessage.success("编辑成功");
          editParamDialogVisible.value = false;
        }
        // 调用API修改参数
        editProcessRouteItemParam({
          id: editParamForm.id,
          routeItemId: currentProcessId.value,
          paramId: editParamForm.paramId,
          standardValue: editParamForm.standardValue || "",
          minValue: editParamForm.minValue || 0,
          maxValue: editParamForm.maxValue || 0,
          isRequired: editParamForm.isRequired || 0,
        })
          .then(res => {
            ElMessage.success("编辑成功");
            editParamDialogVisible.value = false;
            // 找到对应的工艺路线和工序
            const route = routeList.value.find(
              r => r.id === currentRouteId.value
            );
            const process = route?.processList.find(
              p => p.id === currentProcessId.value
            );
            // 刷新参数列表
            if (process) {
              toggleProcessParams2(process);
            }
          })
          .catch(err => {
            ElMessage.error("编辑参数失败");
            console.error("编辑参数失败:", err);
          });
      }
    });
  };
@@ -1420,9 +1704,37 @@
    const route = routeList.value.find(r => r.id === routeId);
    if (route && route.processList) {
      const draggedProcess = route.processList[draggedItem.value];
      route.processList.splice(draggedItem.value, 1);
      route.processList.splice(dropIndex, 0, draggedProcess);
      ElMessage.success("排序成功");
      // 计算新的排序值
      const newDragSort = dropIndex + 1;
      // 调用API排序工序
      sortProcessRouteItem({
        id: draggedProcess.id,
        dragSort: newDragSort,
      })
        .then(res => {
          // 调用接口获取最新的工序列表
          findProcessRouteItemList({ routeId: routeId })
            .then(res => {
              if (route) {
                route.processList = (res.data || []).map(process => ({
                  ...process,
                  processId: process.processId || process.id,
                  expanded: false,
                }));
              }
              ElMessage.success("排序成功");
            })
            .catch(err => {
              console.error("获取工序列表失败:", err);
              ElMessage.success("排序成功");
            });
        })
        .catch(err => {
          ElMessage.error("排序失败");
          console.error("排序工序失败:", err);
        });
    }
  };
@@ -1440,13 +1752,35 @@
  getRouteList();
  getDictTypes();
  // 页面加载时获取工序列表
  onMounted(() => {
    getProcessListApi()
      .then(res => {
        // 处理返回的数据,映射到页面需要的格式
        availableProcessList.value = (res.data || []).map(item => ({
          id: item.id,
          no: item.no || item.no,
          name: item.name || item.name,
          remark: item.remark || item.remark,
          status: item.status,
          isQuality: item.isQuality,
        }));
        filteredProcessList.value = availableProcessList.value;
      })
      .catch(() => {
        ElMessage.error("获取工序列表失败");
      });
  });
</script>
<style scoped lang="scss">
  .app-container {
    padding: 20px;
    padding-bottom: 80px;
    background-color: #f0f2f5;
    min-height: calc(100vh - 84px);
    overflow: hidden;
  }
  .route-header {
@@ -1486,9 +1820,31 @@
  }
  .route-card-list {
    display: flex;
    flex-direction: column;
    display: grid;
    grid-template-columns: repeat(1, 1fr);
    gap: 20px;
    max-height: calc(100vh - 240px);
    overflow-y: auto;
    padding-right: 10px;
  }
  /* 自定义滚动条样式 */
  .route-card-list::-webkit-scrollbar {
    width: 8px;
  }
  .route-card-list::-webkit-scrollbar-track {
    background: #f1f1f1;
    border-radius: 4px;
  }
  .route-card-list::-webkit-scrollbar-thumb {
    background: #c1c1c1;
    border-radius: 4px;
  }
  .route-card-list::-webkit-scrollbar-thumb:hover {
    background: #a8a8a8;
  }
  .route-card {
@@ -1834,7 +2190,7 @@
          align-items: center;
          justify-content: center;
          min-width: 100px;
          height: 175px;
          height: 137px;
          border: 2px dashed #dcdfe6;
          border-radius: 12px;
          background: #fafafa;
@@ -1997,4 +2353,50 @@
      }
    }
  }
  // 分页控件样式
  .pagination-container {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    justify-content: flex-end;
    padding: 16px 20px;
    background-color: #fff !important;
    border-top: 1px solid #ebeef5;
    box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1);
    z-index: 100;
    .el-pagination {
      .el-pagination__sizes {
        margin-right: 16px;
      }
      .el-pagination__jump {
        margin-left: 16px;
      }
      .el-pagination__total {
        color: #606266;
        font-size: 14px;
      }
      .el-pagination__button {
        border-radius: 4px;
        transition: all 0.3s ease;
        &:hover:not(:disabled) {
          color: #409eff;
          border-color: #409eff;
        }
      }
      .el-pagination__button--active {
        background-color: #409eff;
        border-color: #409eff;
        color: #fff;
      }
    }
  }
</style>