src/views/basicData/product/index.vue
@@ -6,6 +6,7 @@
          v-model="search"
          style="width: 210px"
          placeholder="输入关键字进行搜索"
          @input="searchFilter"
          @change="searchFilter"
          @clear="searchFilter"
          clearable
@@ -73,7 +74,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"
@@ -152,6 +153,19 @@
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="厚度:" prop="thickness">
              <el-input
                v-model="modelForm.thickness"
                placeholder="请输入厚度"
                clearable
                @keydown.enter.prevent
                @blur="modelForm.thickness = formatThicknessTo15(modelForm.thickness)"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="单位:" prop="unit">
              <el-input
                v-model="modelForm.unit"
@@ -206,6 +220,12 @@
    prop: "model",
  },
  {
    label: "厚度",
    prop: "thickness",
    // 列表展示时统一保留 15 位小数
    formatData: (val) => formatThicknessTo15(val),
  },
  {
    label: "单位",
    prop: "unit",
  },
@@ -245,14 +265,24 @@
  },
  modelForm: {
    model: "",
    unit: "",
    thickness: "",
  },
  modelRules: {
    model: [{ required: true, message: "请输入", trigger: "blur" }],
    unit: [{ required: true, message: "请输入", trigger: "blur" }],
    thickness: [{ required: true, message: "请输入", trigger: "blur" }],
  },
});
const { form, rules, modelForm, modelRules } = toRefs(data);
// 把厚度格式化成固定 15 位小数(用于展示/提交)
const formatThicknessTo15 = (val) => {
  if (val === null || val === undefined) return "";
  const s = String(val).trim();
  if (s === "") return "";
  const n = Number(s);
  if (Number.isNaN(n)) return s;
  return n.toFixed(15);
};
// 查询产品树
const getProductTreeList = () => {
  treeLoad.value = true;
@@ -286,8 +316,8 @@
  modelOperationType.value = type;
  modelDia.value = true;
  modelForm.value.model = "";
  modelForm.value.model = "";
  modelForm.value.id = "";
  modelForm.value.thickness = "";
  if (type === "edit") {
    modelForm.value = { ...data };
  }
@@ -359,6 +389,7 @@
  proxy.$refs.modelFormRef.validate((valid) => {
    if (valid) {
      modelForm.value.productId = currentId.value;
      modelForm.value.thickness = formatThicknessTo15(modelForm.value.thickness);
      addOrEditProductModel(modelForm.value).then((res) => {
        proxy.$modal.msgSuccess("提交成功");
        closeModelDia();
@@ -431,13 +462,15 @@
    //如果数据为空,则返回true,显示所有的数据项
    return true;
  }
  // 查询列表是否有匹配数据,将值小写,匹配英文数据
  let val = value.toLowerCase();
  // 关键字与节点 label 均按小写比较,英文模糊匹配不区分大小写(如 LOW / low 可匹配 Low-E)
  const val = String(value).trim().toLowerCase();
  if (!val) return true;
  return chooseNode(val, data, node); // 调用过滤二层方法
};
// 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配,则返回该节点以及其下的所有子节点;如果参数是子节点,则返回该节点的父节点。name是中文字符,enName是英文字符.
const chooseNode = (value, data, node) => {
  if (data.label.indexOf(value) !== -1) {
  const labelLower = String(data.label ?? "").toLowerCase();
  if (labelLower.indexOf(value) !== -1) {
    return true;
  }
  const level = node.level;
@@ -450,8 +483,9 @@
  // 遍历当前节点的父节点
  let index = 0;
  while (index < level - 1) {
    // 如果匹配到直接返回,此处name值是中文字符,enName是英文字符。判断匹配中英文过滤
    if (parentData.data.label.indexOf(value) !== -1) {
    // 如果匹配到直接返回;与 filterNode 一致,标签与关键字均按小写比较,英文模糊匹配不区分大小写
    const parentLabelLower = String(parentData.data.label ?? "").toLowerCase();
    if (parentLabelLower.indexOf(value) !== -1) {
      return true;
    }
    // 否则的话再往上一层做匹配