feat(ar): 应收账龄看板 + 逾期预警 overdue 接入(阶段A)

T1 逾期预警(§6 财务 2026-10-20 23:23 口径):
- alert_rules 支持 rule_type=ar_overdue;阈值/责任人/排除名单全量走 params(代码零业务常量)
- 90 天占比红线 key 保留但默认 null 停用(不回落 0.25);黄线 15%-25% 保留
- 新增逐户红线「>30 天且 >5 万」+ 聚合红线「150+ 占比环比上升 = 结构恶化」
- assignee 派生:manual → 近 3 个月主业务员(zxt_masterbill emp_id → employee_dict.u_Name,
  缺表时降级同库摘要制单人姓名)→ 部门负责人(渠道 118 / 商务 114 / 直属酒窖 117);
  两路皆失败 ⇒ 该户不生成、进 skipped[],禁落空 assignee
- POST /run-ar-overdue(dry_run 默认 true)+ check-all 分支;只 INSERT 同一 message 幂等

T2 账龄看板:
- GET /api/cma/ar-aging/{meta,trend,overview,customers,customers/export};每条查询带 entity_id
- 三口径分列、caliber=all → 400;缺期 has_data=false 且金额 null(不补 0)
- ArAging.vue:口径后缀/截止期徽标/趋势断点/六档堆叠/逐户可排序导出

单测 21 项全通过(SQLite 夹具,不连生产库);vite build 通过。
阶段A 零生产写:未 push、未部署、未 --apply、未 dry_run=false。
This commit is contained in:
fullstack-bot
2026-10-21 08:42:24 +08:00
committed by Hermes CI Fix
parent 790be2d6b1
commit 71867c4c7a
11 changed files with 2552 additions and 4 deletions
+15
View File
@@ -546,4 +546,19 @@ export const treasuryApi = {
listHits: (params?: any) => api.get('/treasury/control-hits', { params }),
}
// ── 应收账龄看板(T2 2026-10-20:逐户·六档·三口径禁合计,缺期不补 0)──
export const arAgingApi = {
meta: (params?: any) => api.get('/ar-aging/meta', { params }),
trend: (params?: any) => api.get('/ar-aging/trend', { params }),
overview: (params?: any) => api.get('/ar-aging/overview', { params }),
customers: (params?: any) => api.get('/ar-aging/customers', { params }),
exportUrl: (params: { period?: string; caliber?: string; overdue_only?: boolean }) => {
const q = new URLSearchParams()
if (params.period) q.set('period', params.period)
if (params.caliber) q.set('caliber', params.caliber)
if (params.overdue_only) q.set('overdue_only', 'true')
return `/api/cma/ar-aging/customers/export?${q.toString()}`
},
}
export default api