diff --git a/inventory-web/src/utils/format.ts b/inventory-web/src/utils/format.ts index e69de29..1a84029 100644 --- a/inventory-web/src/utils/format.ts +++ b/inventory-web/src/utils/format.ts @@ -0,0 +1,36 @@ +// ============================================================================ +// 通用格式化工具 +// ============================================================================ + +/** + * 数量显示格式化 —— 整数不显示小数点,小数去除末尾多余的 0。 + * + * 1.0000 -> '1' + * 2.5000 -> '2.5' + * 0.30000000000000004 -> '0.3' (后端 float 累加产生的尾巴) + * null / undefined / '' -> fallback + * + * ★ 为什么先 toFixed(4) 再 Number: + * 本系统数量列在库中一律为 numeric(19,4),但后端有一批运算写成 + * `float(a) + float(b)`,累加后可能带出 0.30000000000000004 这类二进制 + * 浮点尾数。先按量纲精度收敛到 4 位,再交给 Number 归一 —— Number('0.3000') + * 即 0.3,String() 后自然就是 '0.3'。 + */ +export function formatQty(value: any, fallback = '0'): string { + if (value === null || value === undefined || value === '') return fallback + const n = Number(value) + if (!Number.isFinite(n)) return fallback + return String(Number(n.toFixed(4))) +} + +/** + * 数量归一化为 number —— 供 el-input-number 等**需要数值而非字符串**的 + * 组件使用。作用同 formatQty,只是保留 number 类型。 + * + * ★ 不要把 formatQty 的返回值喂给 el-input-number:传字符串会让 v-model + * 失去数值语义,组件内部的步进/边界比较也会退化。 + */ +export function normalizeQty(value: any, fallback = 0): number { + const n = Number(value) + return Number.isFinite(n) ? Number(n.toFixed(4)) : fallback +} diff --git a/inventory-web/src/views/outbound/index.vue b/inventory-web/src/views/outbound/index.vue index 8c9c88e..020c6fa 100644 --- a/inventory-web/src/views/outbound/index.vue +++ b/inventory-web/src/views/outbound/index.vue @@ -122,11 +122,18 @@ + 已退满的行(returnable_quantity <= 0)按钮置灰不可点。 + + ★ 权限双重保障,两者用同一个权限码 outbound_return,判定一致: + · v-if="canReturn" 响应式判定。v-permission 指令只在 mounted + 执行一次,而表格行会重渲染,用响应式判定兜底更稳。 + · v-permission 本系统规范的按钮级指令,声明式表达权限要求, + 无权限时直接把元素移出 DOM(普通领料员工完全看不到)。 --> - + + + @@ -104,19 +106,37 @@ - + @@ -145,14 +165,15 @@ {{ restockDialog.row?.material_name || '-' }} - {{ restockDialog.row?.remaining_qty ?? 0 }} + {{ formatQty(restockDialog.row?.remaining_qty) }} + @@ -190,14 +211,14 @@ {{ scrapDialog.row?.material_name || '-' }} - {{ scrapDialog.row?.remaining_qty ?? 0 }} + {{ formatQty(scrapDialog.row?.remaining_qty) }} + @@ -227,14 +248,23 @@