包含多个会话的累积代码变更: - backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔 - admin-web: ETL 状态页、任务管理、调度配置、登录优化 - miniprogram: 看板页面、聊天集成、UI 组件、导航更新 - etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强 - tenant-admin: 项目初始化 - db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8) - packages/shared: 枚举和工具函数更新 - tools: 数据库工具、报表生成、健康检查 - docs: PRD/架构/部署/合约文档更新 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
97 lines
3.5 KiB
Markdown
97 lines
3.5 KiB
Markdown
# P8→NS1/RNS1 缺失项 #14:财务看板数字的格式化规范
|
||
|
||
## 简要结论
|
||
- 状态:✅ 已解决
|
||
- 风险等级:🟡 低
|
||
- 千分位、小数位、货币符号的格式化规范已在设计文档中定义,工具函数已实现(TS + WXS 双版本),财务看板已使用
|
||
|
||
## 详细审查
|
||
|
||
### 审查范围
|
||
- `docs/miniprogram-dev/design-system/DISPLAY-STANDARDS.md`
|
||
- `apps/miniprogram/miniprogram/utils/money.ts`
|
||
- `apps/miniprogram/miniprogram/utils/format.wxs`
|
||
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts`
|
||
- `apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts`
|
||
|
||
### 发现
|
||
|
||
#### 1. 设计规范文档已完善
|
||
`DISPLAY-STANDARDS.md` 第 1 章"金额展示规范"明确定义了:
|
||
- 正常金额:`¥N,NNN`(千分位逗号,无小数)
|
||
- 负数金额:`-¥N,NNN`(负号在 ¥ 前)
|
||
- 零值:`¥0`
|
||
- 空值:`--`
|
||
- 大额金额:不简写,保留完整数字
|
||
- 禁止事项:禁止 `¥-368`、`¥0.00`、`¥12万`、`toLocaleString()`
|
||
|
||
#### 2. TS 工具函数已实现(`utils/money.ts`)
|
||
- `formatMoney(value)` — 金额格式化,千分位 + ¥ 前缀
|
||
- `formatCount(value, unit)` — 计数格式化,千分位 + 单位
|
||
- `formatNumber(value)` — 纯数字千分位
|
||
- `formatPercent(value)` — 百分比,保留 1 位小数
|
||
- `formatTrendValue(value)` — 同比/环比差值,+¥/-¥ 前缀
|
||
- `toProgressWidth(value)` — 进度条宽度,截断至 [0, 100]
|
||
|
||
#### 3. WXS 工具函数已实现(`utils/format.wxs`)
|
||
- `money(value)` — 金额格式化(WXS 版,用于 WXML 模板)
|
||
- `count(value, unit)` — 计数格式化
|
||
- `percent(value)` — 百分比
|
||
- `hours(value)` — 课时格式化
|
||
- `trendValue(value)` — 同比/环比差值
|
||
- `safe(val)` — 空值兜底
|
||
|
||
#### 4. 看板页面已使用格式化函数
|
||
- `board-finance.ts`:导入并使用 `formatMoney` 格式化赠送卡矩阵数据
|
||
- `board-coach.ts`:导入并使用 `formatMoney`、`formatCount`、`formatHours` 格式化助教数据
|
||
- `board-finance.wxml`:未引入 `format.wxs`(财务看板数据在 TS 层预格式化后传入模板)
|
||
- `board-customer.wxml`:引入 `format.wxs`,使用 `fmt.safe()` 兜底
|
||
|
||
### 证据
|
||
|
||
DISPLAY-STANDARDS.md 金额规范:
|
||
```markdown
|
||
| 场景 | 格式 | 示例 |
|
||
|---|---|---|
|
||
| 正常金额 | `¥N,NNN`(千分位逗号,无小数) | `¥12,680` |
|
||
| 负数金额 | `-¥N,NNN`(负号在 ¥ 前) | `-¥368` |
|
||
| 零值 | `¥0` | `¥0` |
|
||
| 空值 / undefined | `--` | `--` |
|
||
```
|
||
|
||
money.ts 核心函数:
|
||
```typescript
|
||
export function formatMoney(value: number | null | undefined): string {
|
||
if (value === null || value === undefined) return '--'
|
||
if (value === 0) return '¥0'
|
||
const abs = Math.round(Math.abs(value))
|
||
const formatted = abs.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
|
||
return value < 0 ? `-¥${formatted}` : `¥${formatted}`
|
||
}
|
||
```
|
||
|
||
format.wxs 金额函数(WXS 版,逻辑一致):
|
||
```javascript
|
||
function money(value) {
|
||
if (value === undefined || value === null) return '--'
|
||
if (value === 0) return '¥0'
|
||
// ... 千分位处理
|
||
return (value < 0 ? '-¥' : '¥') + result
|
||
}
|
||
```
|
||
|
||
board-finance.ts 使用示例:
|
||
```typescript
|
||
import { formatMoney } from '../../utils/money'
|
||
// ...
|
||
wine: formatMoney(row.liquor?.value),
|
||
table: formatMoney(row.tableFee?.value),
|
||
```
|
||
|
||
### 建议
|
||
无。格式化规范已完整覆盖:
|
||
- 设计文档(DISPLAY-STANDARDS.md)定义了规则
|
||
- TS 工具函数(money.ts)供 JS 层使用
|
||
- WXS 工具函数(format.wxs)供 WXML 模板使用
|
||
- 看板页面已实际调用格式化函数
|