liu
2026-09-24 a7172a363ef947c2a9db279519626eb84150efcd
feat(生产工单): 规格列显示产品大类,规格参数并入产品名称

- 生产工单、生产排产列表:产品名称列展示「产品名 + 具体规格参数」
(如「大提琴80L 4/4」),两者相同时不重复拼接
- 规格列改为显示产品大类(小提琴/中提琴/大提琴/贝斯);
红木、琴盒等非乐器判不出大类,回退显示其自身规格,不留白

Co-Authored-By: Claude <noreply@anthropic.com>
已修改2个文件
56 ■■■■■ 文件已修改
src/views/productionManagement/workOrderEdit/index.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrderManagement/index.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrderEdit/index.vue
@@ -38,6 +38,14 @@
                       :color="progressColor(toProgressPercentage(row?.completionStatus))"
                       :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" />
        </template>
        <!-- 产品名称:产品名 + 具体规格参数(如「大提琴80L 4/4」);两者相同时不重复 -->
        <template #productNameDisplay="{ row }">
          {{ displayProductName(row) }}
        </template>
        <!-- 规格:乐器显示大类;红木、琴盒等非乐器判不出大类,回退显示其自身规格 -->
        <template #specDisplay="{ row }">
          {{ row?.majorCategory || row?.model || "" }}
        </template>
      </PIMTable>
    </div>
    <el-dialog v-model="editDialogVisible"
@@ -161,13 +169,20 @@
      width: "140",
    },
    {
      // 具体规格参数(4/4、1/2 等)跟在产品名称后面展示
      label: "产品名称",
      prop: "productName",
      width: "140",
      width: "180",
      dataType: "slot",
      slot: "productNameDisplay",
    },
    {
      // 乐器显示产品大类(小提琴/中提琴/大提琴/贝斯),不展示 4/4、1/2 这类尺寸;
      // 非乐器(红木、琴盒等)判不出大类,回退显示其自身规格,不留白
      label: "规格",
      prop: "model",
      prop: "majorCategory",
      dataType: "slot",
      slot: "specDisplay",
    },
    {
      label: "单位",
@@ -292,6 +307,15 @@
  });
  const { searchForm } = toRefs(data);
  // 产品名称列:产品名后跟具体规格参数(如「大提琴80L 4/4」);
  // 规格与产品名相同时不重复拼接。
  const displayProductName = row => {
    const name = row?.productName || "";
    const model = row?.model || "";
    if (!name) return model;
    if (!model || model === name) return name;
    return `${name} ${model}`;
  };
  const toProgressPercentage = val => {
    const n = Number(val);
    if (!Number.isFinite(n)) return 0;
src/views/productionManagement/workOrderManagement/index.vue
@@ -38,6 +38,14 @@
                       :color="progressColor(toProgressPercentage(row?.completionStatus))"
                       :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" />
        </template>
        <!-- 产品名称:产品名 + 具体规格参数(如「大提琴80L 4/4」);两者相同时不重复 -->
        <template #productNameDisplay="{ row }">
          {{ displayProductName(row) }}
        </template>
        <!-- 规格:乐器显示大类;红木、琴盒等非乐器判不出大类,回退显示其自身规格 -->
        <template #specDisplay="{ row }">
          {{ row?.majorCategory || row?.model || "" }}
        </template>
      </PIMTable>
    </div>
    <!-- 二维码弹窗 -->
@@ -263,13 +271,20 @@
      width: "140",
    },
    {
      // 具体规格参数(4/4、1/2 等)跟在产品名称后面展示
      label: "产品名称",
      prop: "productName",
      width: "140",
      width: "180",
      dataType: "slot",
      slot: "productNameDisplay",
    },
    {
      // 乐器显示产品大类(小提琴/中提琴/大提琴/贝斯),不展示 4/4、1/2 这类尺寸;
      // 非乐器(红木、琴盒等)判不出大类,回退显示其自身规格,不留白
      label: "规格",
      prop: "model",
      prop: "majorCategory",
      dataType: "slot",
      slot: "specDisplay",
    },
    {
      label: "单位",
@@ -530,6 +545,15 @@
    },
  });
  const { searchForm } = toRefs(data);
  // 产品名称列:产品名后跟具体规格参数(如「大提琴80L 4/4」);
  // 规格与产品名相同时(如红木的型号也叫红木×)不重复拼接。
  const displayProductName = row => {
    const name = row?.productName || "";
    const model = row?.model || "";
    if (!name) return model;
    if (!model || model === name) return name;
    return `${name} ${model}`;
  };
  const toProgressPercentage = val => {
    const n = Number(val);
    if (!Number.isFinite(n)) return 0;