| 项 | 值 |
|---|---|
| 项目 | huanyan/web |
| 分支 | v0.1.53 |
| 基线 commit(base) | 6ba246988cfa9e7431a4ce60cf146d7d8763832a |
| 目标 commit(head) | f4dc29b94ad6d204afdb337c658c6ca74fe231e1 |
| 变更文件数 | 4(1 生产代码 + 1 模型 + 2 测试) |
| 变更主题 | POS 开单工作台·销售单「整单多人业绩分摊」默认比例由小数百分比改为整数百分比 |
本次提交是一次口径收紧型重构:将销售单整单多人的默认按人数平分比例,从 4 位小数(如 33.33%/33.33%/33.34%)改为整数百分比(如 34%/33%/33%),并让输入控件只接受整数。金额尾差归位(largest-remainder)逻辑保持不变。
| 文件 | 类型 | 变更摘要 |
|---|---|---|
src/pages/pos/workbench/model.ts | 生产代码 | 重写 evenAllocRatios:整数平分 + 余数从前往后各 +1;更新文档注释 |
src/pages/pos/workbench/AllocPanel.tsx | 生产代码 | 销售单/服务单两处比例输入框:precision 2→0、新增 step={1}、显示值改 Math.round(ratio*100)、写回改 Math.round(v)/100 |
src/pages/pos/workbench/__tests__/allocMulti.test.tsx | 测试 | 默认平分断言 33.33/33.33/33.34 → 34/33/33 |
src/pages/pos/workbench/__tests__/orderPayload.test.ts | 测试 | 新增 n=2/6/7 的整数平分与 Σ=100 断言;金额用例同步为新比例 |
说明:
codescan.source_read默认读取的是 base 工作树;以上 head 内容已用commit_hash逐段核对确认。
evenAllocRatios(n) 重写(model.ts)变更前
const share = Math.floor((1 / n) * 10000) / 10000 // 4 位小数
const out = Array.from({ length: n }, () => share)
out[n - 1] = Math.round((1 - share * (n - 1)) * 10000) / 10000 // 尾差归最后一档
变更后
const base = Math.floor(100 / n)
const out = Array.from({ length: n }, () => base)
const remainder = 100 - base * n
for (let i = 0; i < remainder; i += 1) out[i] += 1 // 余数从前往后各 +1
return out.map((pct) => pct / 100)
行为对照(已人工验算)
| 人数 n | 整比(%) | 合计 | 旧口径 |
|---|---|---|---|
| 0 / 负数 | [] | — | 同(n<=0 早返回) |
| 1 | 100 | 100% | 100% |
| 2 | 50 / 50 | 100% | 50/50(不变) |
| 3 | 34 / 33 / 33 | 100% | 33.33/33.33/33.34 |
| 6 | 17/17/17/17/16/16 | 100% | — |
| 7 | 15/15/14/14/14/14/14 | 100% | — |
100 - base*n = 100 mod n,恒 < n(n≤100 时 base≥1;n>100 时 base=0 且 100<n),循环下标不会越界。InputNumber:precision 2→0、新增 step={1};round2(ratio*100) → Math.round(ratio*100);Math.round((v/100)*10000)/10000 → Math.round(v)/100。即「显示整数百分比、存储 0.01 精度比例」,用户可用步进器按 1% 调整,不再出现 33.33。
allocAmountOf / allocAmountsOf(金额 = 基数×比例 并做尾差归位/largest-remainder);salesAllocPending、lineAllocPending(Σ≠100% ±0.01 容差判待分摊);salesAllocsToPayload(按 {staff_id, ratio} 提交)。本次仅改「默认比例生成」与「输入精度」,提交载荷与金额计算口径不变,服务端仍按客户端显式传入的比例用同式重算,故前后端一致性保持。
使用 codescan.issues_diff 对 base..head 比对:
问题对比结果:修复 0 条 / 新增 0 条(两版本质量无差异)
本次变更为口径重构,未引入静态质检告警,也未消除既有告警。
未发现阻断性问题,以下为需留意点(非缺陷):
[3.33,3.33,3.34],新 [3.40,3.30,3.30]。因客户端把整数比例(34/33/33)提交给服务端,服务端用同比例重算,前后端仍一致;但历史/对照报表若按旧默认值推算会出现差异。base=0,第 101 人及以后比例可能为 0%,salesAllocPending 因存在 ratio<=0 判为待分摊(提交被拦)。现实中分摊人数远小于 100,可接受;如需兜底可对 n>100 做提示。value 用 Math.round(ratio*100)。若读取到旧版本产生的 0.3333 类小数比例,输入框会显示为整数(如 33),而底层比例仍为小数,直到用户改动才归一。属遗留数据兼容问题,非本次逻辑缺陷。ratioPctText(用于「下单时已排」只读横幅)仍按 2 位小数格式化,draftIntent.test.ts 中 1/3 → 33.33% 用例保持通过。该函数与可编辑面板为两条展示路径,互不影响;如需全局统一整数口径可后续一并调整。Math.round(ratio*100) 与写回 Math.round(v)/100 对 0.29/0.33/0.34 等回归为正确整数;ratioSumOf 已 round2,Σ 判定含 0.01 容差,无精度误判风险。