spring
2026-05-25 0c4429a719f5c95a7690fae51efaaa799ef4e77d
src/views/basicData/product/index.vue
@@ -44,6 +44,14 @@
              </span>
              <div>
                <el-button
                  v-if="node.level > 1"
                  type="success"
                  link
                  @click.stop="handleDownCopy(node, data)"
                >
                  向下复制
                </el-button>
                <el-button
                  type="primary"
                  link
                  @click="openProDia('edit', data)"
@@ -73,7 +81,7 @@
        <el-button type="primary" @click="openModelDia('add')">
          新增规格型号
        </el-button>
        <ImportExcel @uploadSuccess="getModelList" />
        <ImportExcel :product-id="currentId" @uploadSuccess="getModelList" />
        <el-button
          type="danger"
          @click="handleDelete"
@@ -140,6 +148,18 @@
      >
        <el-row>
          <el-col :span="24">
            <el-form-item label="料号:" prop="materialCode">
              <el-input
                  v-model="modelForm.materialCode"
                  placeholder="请输入料号"
                  clearable
                  @keydown.enter.prevent
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="规格型号:" prop="model">
              <el-input
                v-model="modelForm.model"
@@ -183,6 +203,7 @@
  delProductModel,
  modelListPage,
  productTreeList,
  downCopyProductModel,
} from "@/api/basicData/product.js";
import ImportExcel from "./ImportExcel/index.vue";
@@ -201,6 +222,10 @@
const list = ref([]);
const expandedKeys = ref([]);
const tableColumn = ref([
  {
    label: "料号",
    prop: "materialCode",
  },
  {
    label: "规格型号",
    prop: "model",
@@ -244,10 +269,12 @@
    ],
  },
  modelForm: {
    materialCode: "",
    model: "",
    unit: "",
  },
  modelRules: {
    materialCode: [{ required: true, message: "请输入", trigger: "blur" }, { max: 200, message: "物料编号不能超过200个字符", trigger: "blur" }],
    model: [{ required: true, message: "请输入", trigger: "blur" }],
    unit: [{ required: true, message: "请输入", trigger: "blur" }],
  },
@@ -344,6 +371,49 @@
      proxy.$modal.msg("已取消");
    });
};
// 向下复制
const handleDownCopy = (node, data) => {
  if (currentId.value !== data.id) {
    proxy.$modal.msgWarning("请先选中当前产品并勾选需要复制的型号");
    return;
  }
  // 获取同层级节点
  const parent = node.parent;
  const siblings = parent.childNodes || [];
  // 找到当前节点在同层级中的索引
  const currentIndex = siblings.findIndex(item => item.data.id === data.id);
  // 获取下一行节点
  const nextNode = siblings[currentIndex + 1];
  if (!nextNode) {
    proxy.$modal.msgWarning("当前节点是同层级最后一个,没有下一行数据可复制");
    return;
  }
  const modelListId = selectedRows.value.map((item) => item.id);
  if (!modelListId.length) {
    proxy.$modal.msgWarning("没有选择要复制的型号");
    return;
  }
  ElMessageBox.confirm("确认将当前节点的规格型号复制到下一行节点?", "向下复制", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "info",
  })
    .then(() => {
      downCopyProductModel({
        productId: data.id,
        targetProductId: nextNode.data.id,
        modelListId,
      }).then(() => {
        proxy.$modal.msgSuccess("复制成功");
      });
    })
    .catch(() => {});
};
// 选择产品
const handleNodeClick = (val, node, el) => {
  // 判断是否为叶子节点
@@ -351,6 +421,7 @@
  // 只有叶子节点才执行以下逻辑
  currentId.value = val.id;
  currentParentId.value = val.parentId;
  selectedRows.value = [];
  getModelList();
};
@@ -385,6 +456,7 @@
};
const getModelList = () => {
  tableLoading.value = true;
  selectedRows.value = [];
  modelListPage({
    id: currentId.value,
    current: page.current,