feat(生产工单): 规格列显示产品大类,规格参数并入产品名称
- 生产工单、生产排产列表:产品名称列展示「产品名 + 具体规格参数」
(如「大提琴80L 4/4」),两者相同时不重复拼接
- 规格列改为显示产品大类(小提琴/中提琴/大提琴/贝斯);
红木、琴盒等非乐器判不出大类,回退显示其自身规格,不留白
Co-Authored-By: Claude <noreply@anthropic.com>
| | |
| | | :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" |
| | |
| | | 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: "单位", |
| | |
| | | }); |
| | | 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; |
| | |
| | | :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> |
| | | <!-- 二维码弹窗 --> |
| | |
| | | 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: "单位", |
| | |
| | | }, |
| | | }); |
| | | 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; |