T1 · 架构总览(六层分层)
回答:这套系统一共分几层、每一层负责什么、以及哪三条原则一旦破了整套账就不可信。
看图方式:从上往下是请求的方向。前端只负责展示;
网关层拦住没权限的请求;业务模块层各管一段业务;
领域服务层是金额与规则的唯一计算入口;数据层只存事实,不替业务做决定。
① 汇总必须由事实记录计算
页面上任何一个数字(包括月度矩阵的每个单元格)都不能手改,只能由底层事实——到账流水、收入分录、成本分配、绩效计提——聚合而来。没有例外,也不存在「可编辑的汇总字段」。
② 服务端是金额与权限的唯一计算入口
前端传来的金额只作为输入,不作为结果;权限判断在服务端逐条执行而不是靠前端藏按钮。资金写入 / 审批 / 导入确认 / 绩效入账强制幂等键。
③ 历史可复现
关账快照 + 审计日志 + 版本化规则,让任何历史报表都能重算复现;任何已审核记录只允许「留痕调整 / 反向冲销」,绝不物理删除。
技术选型一句话版模块化单体
React 18 + TypeScript 前端 / NestJS + TypeScript 后端 / PostgreSQL 15+(金额 decimal(18,2))/
本机私有目录存附件(接口抽象,后续可换对象存储)。不做 ERP、不接税局自动开票、不接银行直连、不做完整财务总账。
T2 · 模块边界与依赖(11 个模块)
回答:谁可以调用谁、谁绝对不能碰谁的数字。箭头方向 = 依赖方向(A → B 表示 A 调用 B)。
四条禁止边(红色虚线)必须守住:
报表模块禁止写入任何业务账;导入模块禁止绕过暂存区直写正式账目;提醒模块禁止修改财务状态;
关账模块禁止在不审批的情况下静默重算历史。
蓝实线允许
显式导出的 Service 接口调用。禁止跨模块直接访问对方的 Repository 或数据表。
灰细线 / 虚线只读
报表、提醒、关账只能读。它们可以生成任务、生成快照、导出文件,但不能改任何业务事实。
红虚线禁止
这四条一旦被打破,就会出现「报表数字和实际账对不上」这种最难查的问题,因此要在代码层面强制。
模块职责与依赖规则表11 项
| 模块 | 负责 | 可依赖 | 禁止 |
|---|---|---|---|
| M1 客户项目 | 客户/别名/主体身份、项目、归属人、外部链接 | — | 不计算金额 |
| M2 合同服务 | 合同、版本、服务阶段、KPI、付款计划模板 | M1 | 不直接生成应收 |
| M3 结算收入 | 考核结算、收入分录、冲销 | M2 | 不碰现金流 |
| M4 资金应收 | 应收、到账流水、核销、退款、未分配 | M2、M3 | 不改收入/成本 |
| M5 发票 | 开票申请、票据、红票、发票明细 | M2、M3、M4 | 不认定回款状态 |
| M6 成本 | 成本发生、支付、项目归属分配 | M1、M2 | 不参与回款核销 |
| M7 绩效 | 规则版本、计提批次、审批、发放 | M3、M6(经毛利服务) | 不改毛利 |
| M8 报表 | 只读聚合、快照、导出 | 全部(只读视图) | 禁止任何写入 |
| M9 导入 | 上传、映射、预览、异常、确认 | 导入暂存区 | 禁止直写正式账目 |
| M10 提醒 | 生成提醒任务、去重、跟进 | 只读查询 | 禁止改财务状态 |
| M11 关账 | 期间快照、锁定、重开审批 | 只读 + 锁标记 | 不静默重算历史 |
T3 · 数据模型(18 个骨干实体 / 3 张 ER)
回答:钱、合同、票、成本、提成分别存在哪里,它们之间怎么连,以及为什么「核销」要单独一张表。
通用字段在图里省略:id UUID、org_id、
created_at/by、updated_at、version(乐观锁)。
每个查询与外键关系都必须校验 org_id 一致。
字段级硬规则工程师必读
| 主题 | 规则 |
|---|---|
| 金额 | DB decimal(18,2);API / 前端一律十进制字符串(如 "106000.00");禁止 JS number 浮点累加;ORM 映射为 string。 |
| 比例 | decimal(9,6);展示的百分比不参与计算。 |
| 日期 | 业务日期 DATE;审计时间 timestamptz UTC;展示与期间划分用 Asia/Shanghai。 |
| 精度 | 月度历史流水带 date_precision = month,不参与日级回款周期计算。 |
| 编号 | 合同号、发票号、21 位审批号全部按字符串存储,避免精度丢失。 |
| 冲销 | 交易不物理删除,只写负向 reversal_of 记录。 |
| 幂等 | 资金写入 / 审批 / 导入确认 / 绩效入账要求 Idempotency-Key;同 key 同 body 返回原结果,不同 body 返回 409。 |
T4 · 核心流程时序(两条主链路)
回答:一笔钱进来、一次提成发出去,系统在后台到底按什么顺序做什么事;哪些环节会锁表、哪些会失败回滚。
读法:矩形是参与者,虚线是它的生命线,横向箭头是消息(带编号)。
绿色虚线箭头=返回值;alt / else 框表示同一时刻只会走其中一条分支。
为什么核销要「先锁再写」并发
步骤 11—12 会锁住流水行和全部目标应收行,再写分配明细并重算余额。
这样两个人同时核销同一笔尾款时,必定只有一个成功(另一个拿 409),不会出现超额核销。
为什么绩效要「先快照后入账」可解释
试算时把毛利、规则版本、份额、回款系数冻结成快照,业务能看懂「这个数怎么来的」;
正式批次一旦批准,规则变更也不再影响它。
T5 · 状态流转(5 张状态机)
回答:每条记录现在处在哪个阶段、谁能把它推到下一步,以及哪些状态是「算出来的」而不是「选出来的」。
最容易出错的三条口径:
① 应收状态(待收 / 部分收 / 收清)由已核销金额自动计算,禁止手填;
② 逾期是一个独立标签,不是状态:无到期日的应收进「待定」桶而不是直接算未逾期;
③ 坏账核销 / 减免走独立事件,绝不允许标成「收清」。
状态机在界面上的落点控件
状态一律用彩色徽章展示并且不可编辑;页面上出现的按钮(提交 / 审核 / 冲销 / 归档 / 重开)
才是状态迁移的唯一入口,每次迁移都会写审计日志(含前后值与原因)。
T6 · 界面原型(重点:这套系统长什么样)
回答:老板每天打开看到什么、点哪里、点到之后能追到哪一层原始记录。
⚠ 界面中的金额均为「结构演示用」的合成示例数据,不是客户真实数字。
页面上的客户名取自老板 Excel 中实际出现过的抬头(颍尚 / 上海森朗 / 凯邦仕科 / 云歆 / 嘉韵 / 涟隐),
但金额是为了演示布局与口径关系而合成的一组内部自洽数字。
ⓘ 真实数据如何进入系统:必须经过「设置与数据 / 数据导入向导」四步 —— 上传原件 → 工作表与字段映射(年份列归属由人工确认)→ 预览与异常(差额逐条处置)→ 确认导入; 系统不替任何未解释的差额做决定,也不会自动过账。
ⓘ 真实数据如何进入系统:必须经过「设置与数据 / 数据导入向导」四步 —— 上传原件 → 工作表与字段映射(年份列归属由人工确认)→ 预览与异常(差额逐条处置)→ 确认导入; 系统不替任何未解释的差额做决定,也不会自动过账。
这不是截图,是用 HTML + CSS 拼出来的高保真线框,所以里面的 Tab、开关、抽屉、度量切换都是可以真的点的。
下面每一页都按架构师第 6 章的线框规格绘制。
全局布局框架① 先看这里
左侧常驻一级导航 9 项 · 顶部面包屑 + 全局搜索 + 期间切换 + 提醒铃铛 ·
右侧内容区 · 右下角浮出明细抽屉(不跳页)。
经营工作台 / 月度矩阵
🔍 全局搜索:客户 / 项目 / 合同号 / 发票号
期间 2026 ▾
12
张老板 ▾
该月明细抽屉
客户 / 项目 / 2026年3月 / 度量:回款
回款流水收入
成本绩效发票
ⓘ 金额只读,新增只能走底部两个入口
+ 新增到账+ 新增成本
为什么这么做IA
把老板每天要看的月度矩阵放在落地页第一行,客户 / 项目 / 回款 / 发票 / 成本 / 绩效 / 报表 / 设置共 9 个一级入口,
与 Excel 里「一张表一个主题」的习惯对齐。
抽屉而不是新页面交互
所有明细用右侧抽屉展开,不跳页、不丢筛选条件;抽屉底部固定「新增到账 / 新增成本」入口,
新增的事实会回流到矩阵单元格。
全局能力框架
顶部常驻:面包屑 + 全局搜索 + 当前期间切换 + 提醒铃铛(红点数字)。期间切换决定所有界面的统计口径,避免跨年误读。
页面原型(可交互)7 个页面
试一下:切换到「月度矩阵」页 → 打开右上「两年并排」开关(列数变 24) →
点「成本 / 毛利 / 绩效」切换度量 → 再点任意金额单元格,右侧抽屉会列出构成这个数字的全部事实记录。
本期实际回款
907,549.00
环比 ↑ 12.4% · 全部为已批准到账
已确认收入
962,001.94
按不含税口径 · 审核后锁定
直接成本
526,378.42
按发生月计入 · 不含公司间接费用
毛利 ⓘ
435,623.52
毛利率 45.3%
计提绩效
52,278.28
规则 R-v2 · 20% · 回款系数释放
经营利润
383,345.24
含未确认数据时的暂估值
期末应收
486,300.00
截止 2026-12-31 的期末余额(存量不相加)
逾期
74,200.00
2 笔 · 最长逾期 6 天
待分配到账 ⚠
8,200.00
到账 40,000 已核销 31,800
成本未归属 ⚠
12,000.00
3 笔媒体消耗无项目归属
年份 2026 ▾
客户 ▾收款主体 ▾
归属人 ▾项目状态 ▾
列配置 ▾
矩阵单元格不支持直接编辑。每个数字都由底层事实(到账流水 / 收入分录 / 成本分配 / 绩效计提)实时聚合而来;
要改数字,请点开单元格,在右侧抽屉底部用「新增到账 / 新增成本」录入新的事实记录,旧记录只能反向冲销不能删除。
⚠ 以下金额均为结构演示用的合成示例数据,不是客户真实数字;真实数据须经四步导入向导(字段映射 → 预览 → 异常处置 → 确认)逐条人工确认后进入系统。
⚠ 以下金额均为结构演示用的合成示例数据,不是客户真实数字;真实数据须经四步导入向导(字段映射 → 预览 → 异常处置 → 确认)逐条人工确认后进入系统。
| 客户简称 | 己方收款主体 | 归属人 | 项目名称 | 项目状态 | 2026 年(当前期间) | 2025 年(对照 · 已关账快照) | 年度合计 | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 12月 | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 12月 | ||||||
| ▾ 颍尚(客户小计) | – | 42,000.00 | 38,000.00 | 31,500.00 | 66,000.00 | – | 47,000.00 | 54,000.00 | – | 39,000.00 | 88,000.00 | 36,000.00 | – | 34,440.00 | 31,160.00 | 25,830.00 | 54,120.00 | – | 38,540.00 | 44,280.00 | – | 31,980.00 | 72,160.00 | 29,520.00 | 441,500.00 | ||||
| 欢恒 | 张三 | SEO-1期 ⓘ台账 | 服务中 | – | 42,000.00 | 38,000.00 | – | 66,000.00 | – | – | 54,000.00 | – | – | 88,000.00 | – | – | 34,440.00 | 31,160.00 | – | 54,120.00 | – | – | 44,280.00 | – | – | 72,160.00 | – | 288,000.00 | |
| 欢恒 | 张三 | SEO-2期 ⚠暂估 ⓘ台账 | 待验收 | – | – | – | 31,500.00 | – | – | 47,000.00 | – | – | 39,000.00 | – | 36,000.00 | – | – | – | 25,830.00 | – | – | 38,540.00 | – | – | 31,980.00 | – | 29,520.00 | 153,500.00 | |
| ▾ 上海森朗(客户小计) | 56,000.00 | 18,000.00 | – | – | 72,000.00 | – | – | – | 64,000.00 | – | – | 58,000.00 | 45,920.00 | 14,760.00 | – | – | 59,040.00 | – | – | – | 52,480.00 | – | – | 47,560.00 | 268,000.00 | ||||
| 凯邦仕科 | 李四 | 全案代运营 | 服务中 | 56,000.00 | – | – | – | 72,000.00 | – | – | – | 64,000.00 | – | – | 58,000.00 | 45,920.00 | – | – | – | 59,040.00 | – | – | – | 52,480.00 | – | – | 47,560.00 | 250,000.00 | |
| 凯邦仕科 | 李四 | 内容GEO-N | 暂停 | – | 18,000.00 | – | – | – | – | – | – | – | – | – | – | – | 14,760.00 | – | – | – | – | – | – | – | – | – | – | 18,000.00 | |
| ▾ 个人(客户小计) | – | – | – | 24,000.00 | – | – | – | – | – | – | – | – | – | – | – | 19,680.00 | – | – | – | – | – | – | – | – | 24,000.00 | ||||
| 云歆 | 王五 | 官网优化 | 已完成 | – | – | – | 24,000.00 | – | – | – | – | – | – | – | – | – | – | – | 19,680.00 | – | – | – | – | – | – | – | – | 24,000.00 | |
| ▾ 嘉韵(客户小计) | – | – | – | – | 50,200.00 | – | – | – | – | – | – | – | – | – | – | – | 41,164.00 | – | – | – | – | – | – | – | 50,200.00 | ||||
| 欢恒 | 李四 | 品牌词包年 ⓘ差额 | 已完成 | – | – | – | – | 50,200.00 | – | – | – | – | – | – | – | – | – | – | – | 41,164.00 | – | – | – | – | – | – | – | 50,200.00 | |
| ▾ 涟隐(客户小计) | – | – | – | – | – | 123,909.00 | – | – | -60.00 | – | – | – | – | – | – | – | – | 101,605.38 | – | – | -49.20 | – | – | – | 123,849.00 | ||||
| 上海森朗 | 张三 | SEM代投放 | 服务中 | – | – | – | – | – | 123,909.00 | – | – | -60.00 | – | – | – | – | – | – | – | – | 101,605.38 | – | – | -49.20 | – | – | – | 123,849.00 | |
| ▾ 内部往来(客户小计) | – | – | – | – | – | -343,581.00 | – | – | – | – | – | – | – | – | – | – | – | -281,736.42 | – | – | – | – | – | – | -343,581.00 | ||||
| 欢恒⇄上海森朗 | 财务 | 内部转账冲回 ⓘ不计回款 | 不计经营 | – | – | – | – | – | -343,581.00 | – | – | – | – | – | – | – | – | – | – | – | -281,736.42 | – | – | – | – | – | – | -343,581.00 | |
| 合计(全口径 · 含内部往来) | 56,000.00 | 45,920.00 | 60,000.00 | 49,200.00 | 38,000.00 | 31,160.00 | 55,500.00 | 45,510.00 | 188,200.00 | 154,324.00 | -219,672.00 | -180,131.04 | 47,000.00 | 38,540.00 | 54,000.00 | 44,280.00 | 63,940.00 | 52,430.80 | 39,000.00 | 31,980.00 | 88,000.00 | 72,160.00 | 94,000.00 | 77,080.00 | 563,968.00 | ||||
左侧 5 列冻结、右侧「年度合计」列冻结、合计行吸底;中部 1—12 月可横向滚动。
负数保留负号并显示为红色(如 −60 退款冲回、−343,581 内部转账冲回),不取绝对值。
合计行为全口径(含内部转账冲回),因此与顶部「本期实际回款」不同:经营口径会剔除内部转账。
设计要点:保留 Excel 的「客户—项目—月份」二维浏览习惯,但把每个数字都变成可下钻的入口:点单元格 → 右侧抽屉 → 看原始流水 → 底部新增事实。数字永远来自事实,不由人填。
颍尚信息科技(上海)有限公司 常用简称:颍尚
客户付款方
渠道:无
编辑 合并申请
归档
别名:颍尚、颖尚(错别字变体)、颍尚信息
⚠ 检测到近似名称「颖尚 / 颍尚」,仅提示相似,不自动合并;
合并须管理员审批并保留旧 ID 映射与日志
服务品牌:颍尚 ┃ 付款方(开票抬头):颍尚信息科技(上海)有限公司 ┃
己方收款主体:欢恒 ┃ 税号:9131xxxx…(可选,缺失不影响经营口径)
项目数(去重) ⓘ
3
按 project_id 去重
活跃项目
2
服务中 / 待验收,不含已归档
合同额
530,000.00
合同「上限」口径,不是已确认收入
净到账
441,500.00
已批准到账 − 退款(不含内部转账)
未收应收
88,400.00
2 笔未到期 + 1 笔待定日期
已确认收入
467,990.00
不含税 · 结算审核后锁定
毛利
211,920.00
扣减已归属直接成本
毛利率
45.3%
汇总利润 ÷ 汇总收入,不是单项目平均
| 项目号 | 项目名称 | 归属人 | 状态 | 合同额 | 净回款 | 未收应收 | 毛利 | 操作 |
|---|---|---|---|---|---|---|---|---|
| PRJ-2026-018 | SEO-1期 | 张三 | 服务中 | 318,000.00 | 288,000.00 | 30,000.00 | 138,240.00 | 打开 |
| PRJ-2026-019 | SEO-2期 | 张三 | 待验收 | 212,000.00 | 153,500.00 | 58,500.00 | 73,680.00 | 打开 |
| PRJ-2026-041 | SEM代投放 | 张三 | 服务中 | 84,000.00 | -60.00 | 84,060.00 | -35.49 | 打开 |
活跃 / 累计 ▾主体 ▾归属人 ▾导出
ⓘ PRJ-2026-041 已发生媒体成本但只发生一笔 −60.00 退款冲回,因此毛利为负:亏损项目的绩效计提按 0 处理(累计应计提基数为 max(累计毛利, 0)),不会算出负提成。
| 合同号 | 版本 | 签订日 | 己方收款主体 | 含税额 | 不含税额 | 状态 |
|---|---|---|---|---|---|---|
| CT-2026-033 | v1 | 2026-01-05 | 欢恒 | 318,000.00 | 300,000.00 | 生效 |
| CT-2026-033 | v2(追加预算) | 2026-06-18 | 欢恒 | 212,000.00 | 200,000.00 | 生效 |
| CT-2025-011 | v1 | 2025-01-08 | 欢恒 | 212,000.00 | 200,000.00 | 到期 |
| 结算单 | 项目 / 期号 | 计量方式 | 核定不含税 | 税额 | 含税应收 | 审核状态 |
|---|---|---|---|---|---|---|
| ST-2026-0112 | SEO-1期 / 1 期 | KPI 核定 | 49,000.00 | 2,940.00 | 51,940.00 | 已审核 |
| ST-2026-0140 | SEO-2期 / 2 期 | reversal 冲销 | -1,000.00 | -60.00 | -1,060.00 | 已审核 |
| 应收标题 | 项目 | 应收含税 | 已核销 | 余额 | 到期日 | 应收状态 |
|---|---|---|---|---|---|---|
| 1 期首款 | SEO-1期 | 31,800.00 | 31,800.00 | 0.00 | 2026-03-31 | 收清 |
| 2 期尾款 | SEO-1期 | 74,200.00 | 0.00 | 74,200.00 | 2026-09-30 | 待收 ⚠ 逾期 6 天 |
| SEM 预付 | SEM代投放 | 84,000.00 | -60.00 | 84,060.00 | unknown | 待收 |
到账列表只列已批准流水;退款以负号记录,余额恢复而不是把应收标成收清。
| 票据号 | 开票日 | 类型 | 含税额 | 不含税 | 关联应收 | 状态 |
|---|---|---|---|---|---|---|
| INV-2026-0031 | 2026-03-15 | 蓝票 | 106,000.00 | 100,000.00 | 1 期首款 | 已开 |
| INV-2026-0031-R | 2026-04-02 | 红票 | -10,600.00 | -10,000.00 | 同上(销售折让) | 已红 |
开票状态与到账状态各自独立:开了票不等于收到钱。
| 发生月 | 供应商 | 类别 | 含税金额 | 范围 | 归属项目 | 状态 |
|---|---|---|---|---|---|---|
| 2026-01 | 巨量引擎 | 媒体消耗 | 12,000.00 | 共享 | SEO-1期 60% / SEO-2期 40% | 已审核 |
| 2026-03 | 百度推广 | 媒体消耗 | -60.00 | 直接 | SEM代投放 100% | 已审核 |
| 2026-06 | 外包写手 | 内容外包 | 8,000.00 | 直接 | 未归属 | 待归属 |
| 批次号 | 项目 | 截止月 | 规则版本 | 累计应计 | 可结算 | 状态 |
|---|---|---|---|---|---|---|
| CR-0012 | SEO-1期 | 2026-06 | R-v2 | 8,000.00 | 4,000.00 | 已批准 |
| CR-0014 | SEM代投放 | 2026-10 | R-v2 | 0.00 | 0.00 | 毛利为负 → 计提 0 |
业务人员进入「我的绩效」只能看到自己的份额与只读依据快照。
| 时间 | 对象 | 动作 | 改前 → 改后 | 操作人 | 原因 |
|---|---|---|---|---|---|
| 2026-09-10 14:22 | CT-2026-033 | 新增版本 | v1 → v2 | 张三 | 追加下半年媒体预算 |
| 2026-09-18 10:05 | PRJ-2026-041 | 退款登记 | 余额 84,000 → 84,060 | 财务·王 | 误收退回 −60 |
| 2026-10-06 11:07 | 别名 | 相似提示 | 无(未合并) | 系统 | 检测到「颖尚」字形近似 |
设计要点:客户 ≠ 付款方 ≠ 服务品牌 ≠ 渠道:这四种角色在这一屏被拆开建模、分开展示,避免出现 Excel 里「一个抬头混着用」的局面 —— 同一个商业伙伴可以既是客户又是渠道又是供应商,但每一笔钱、每一张票、每一项成本都挂到明确的角色上;别名只提示相似不做自动合并。
PRJ-2026-018 SEO optimization — 颍尚信息 服务中
更多操作 ▾
客户:颍尚信息(上海森朗代签)┃ 归属人:张三 ┃ 服务起止:2026-01-01 ~ 2026-12-31 ┃ 己方收款主体:欢恒
合同额
530,000.00
含「上限」口径
已确认结算
305,000.00
6 期已审核
已开票
291,500.00
含 1 张红票 −10,600
净回款
288,000.00
全部为已批准到账
应收余额
74,200.00
2 期未到期
逾期
0.00
无
直接成本
167,040.00
已归属 100%
毛利 ⓘ
156,260.00
毛利率 48.7%
毛利率
48.7%
由汇总利润 ÷ 汇总收入,不是单期平均
计提绩效
18,751.20
规则 R-v2
经营利润
137,508.80
已扣计提绩效
数据完整性 ⚠
⚠ 缺 2 项
成本未归属 12,000 / 日期待补 5 项
| 合同号 | 版本 | 签订日 | 己方收款主体 | 含税额 | 不含税额 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|
| CT-2026-033 | v1 | 2026-01-05 | 欢恒 | 318,000.00 | 300,000.00 | 生效 | 变更 |
| CT-2026-033 | v2(补充媒体预算) | 2026-06-18 | 欢恒 | 212,000.00 | 200,000.00 | 生效 | 查看 diff |
| CT-2025-011 | v1 | 2025-01-08 | 欢恒 | 212,000.00 | 200,000.00 | 到期 | 续约 |
合同变更只写新版本,历史期间已确认的收入与应收账款不被回写;续约是「建新合同 + 关联旧合同」,不是覆写原合同。
| 期号 | 服务期间 | 平台 | 关键词 | 单价 | KPI 目标 / 实际 | 核定额 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|---|
| 1 期 | 2026-01-01 ~ 2026-06-30 | 百度 | 核心词 × 10 | 50,000.00 | 100 / 98 | 49,000.00 | 已结算 | 结算单 |
| 2 期 | 2026-07-01 ~ 2026-12-31 | 百度 + 360 | 核心词 × 8 | 50,000.00 | 80 / — | — | 执行中 | 提交考核 |
| 3 期 | 2027-01-01 ~ 2027-06-30 | 百度 | 待定 | 50,000.00 | 待定 / — | — | 未开始 | 编辑 |
按模板生成阶段 ⓘ 月度模板跨年自动展开;「20 天」按日历日计算,含起止日则 +19 天;KPI 核定 13,000 可人工核减为 12,897,不自动解析备注里的公式,须留证据附件。
| 结算单号 | 期号 | 计量方式 | 考核额 | 核定不含税 | 税额 | 含税应收 | 审核状态 | 操作 |
|---|---|---|---|---|---|---|---|---|
| ST-2026-0112 | 1 期 | KPI 核定 | 13,000.00 | 12,896.23 | 773.77 | 13,670.00 | 已审核 | 查看 |
| ST-2026-0135 | 2 期 | 计量 | 49,000.00 | 49,000.00 | 2,940.00 | 51,940.00 | 待审 | 审核 |
| ST-2026-0140 | 2 期冲销 | reversal | -1,000.00 | -1,000.00 | -60.00 | -1,060.00 | 已审核 | 原单 |
结算单审核后锁定;要改只能「反向冲销 + 新单」,原记录与 -1,000.00 的负向记录同时保留在历史里。
| 应收标题 | 来源 | 应收含税额 | 已核销 | 余额 | 到期日 | 日期精度 | 逾期 | 应收状态 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| 1 期首款 | 付款计划 30% | 31,800.00 | 31,800.00 | 0.00 | 2026-03-31 | day | 0 天 | 收清 | 明细 |
| 1 期尾款 | 结算 ST-0112 | 13,670.00 | 0.00 | 13,670.00 | 2026-09-30 | day | ⚠ 6 天 | 待收 | 核销 |
| 2 期首款 | 付款计划 60% | 60,530.00 | 0.00 | 60,530.00 | unknown | unknown | 待定 | 待收 | 补日期 |
到期日缺失的应收进入「待定」桶独立展示:既不算逾期,也不能混入「未来 30 天回款预测」。
| 票据号 | 开票主体 | 开票日 | 类型 | 含税额 | 不含税 | 税额 | 关联应收 | 状态 |
|---|---|---|---|---|---|---|---|---|
| INV-2026-0031 | 欢恒 | 2026-03-15 | 蓝票 | 106,000.00 | 100,000.00 | 6,000.00 | 1 期首款 | 已开 |
| INV-2026-0031-R | 欢恒 | 2026-04-02 | 红票 | -10,600.00 | -10,000.00 | -600.00 | 同上(折让) | 已红 |
| INV-2026-0088 | 欢恒 | 2026-09-10 | 蓝票 | 13,670.00 | 12,896.23 | 773.77 | 1 期尾款 | 已开 |
发票状态与到账状态各自独立展示:开了票不等于收到钱,收了钱也不等于已开票。
| 发生月 | 供应商 | 类别 | 含税金额 | 可抵扣税 | 范围 | 已归属 | 支付月 | 状态 |
|---|---|---|---|---|---|---|---|---|
| 2026-01 | 巨量引擎 | 媒体消耗 | 12,000.00 | 679.25 | 共享 | 10,000 / 2 个项目 | 2026-02 | 已审核 |
| 2026-03 | 百度推广 | 媒体消耗 | -60.00 | 0.00 | 直接 | 已归属 100% | — | 已审核 |
| 2026-06 | 外包写手 | 内容外包 | 8,000.00 | 0.00 | 直接 | 未归属 | 2026-07 | 待归属 |
成本以发生月计入项目利润,不以付款日期计入;1 月发生 2 月付款,只扣 1 月一次。
| 批次号 | 截止月 | 规则版本 | 累计应计 | 累计可结算 | 回款系数 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|
| CR-0012 | 2026-06 | R-v2 | 8,000.00 | 4,000.00 | 0.50 | 已批准 | 详情 |
| CR-0013 | 2026-09 | R-v2 | 6,000.00 | 3,000.00 | 0.50 | 试算 | 详情 |
| CR-0014 | 2026-10 | R-v2 | -1,000.00 | -500.00 | 0.50 | 待审 | 负调整 |
CR-0014 因补录成本产生 −1,000 负调整:已发放记录保留不动,系统提示「超发」由老板决定追偿还是后续抵扣。
| 名称 | 类型 | 上传者 | 时间 | 操作 |
|---|---|---|---|---|
| 报价表_v3.xlsx | 附件 | 张三 | 2026-01-04 | 下载 |
| KPI 考核表.pdf | 附件 | 张三 | 2026-07-02 | 下载 |
| 飞书多维表格 | 外链 | 李四 | 2026-01-04 | 打开 ↗ |
附件走私有授权下载,服务器不暴露真实路径;敏感件(工资/票据)单独授权。
| 时间 | 对象 | 动作 | 改前 → 改后 | 操作人 | 原因 |
|---|---|---|---|---|---|
| 2026-09-10 14:22 | ST-2026-0135 | 提交审核 | 草稿 → 待审 | 张三 | 提交 2 期考核 |
| 2026-09-12 09:41 | ST-2026-0135 | 退回 | 待审 → 草稿 | 财务·王 | 证据附件缺 KPI 截图 |
| 2026-10-06 11:07 | CR-0013 | 试算 | — → 试算 6,000 | 财务·王 | 季末试算,未入账 |
审计日志记录前后值 + 原因 + 操作人;任何记录都不能被物理删除。
设计要点:项目详情是「一个项目的全部事实」:合同只留版本、结算只留正负两张单、成本记录发生与付款两笔、绩效留每次快照。老板点任何数字都能追到原始记录与改它的人。
| 计划节点 | 客户 | 项目 | 合同含税 | 比例 | 预计金额 | 预计日期 | 日期精度 | 是否已生成应收 |
|---|---|---|---|---|---|---|---|---|
| 首款 30% | 颍尚信息 | SEO-1期 | 318,000.00 | 30% | 95,400.00 | 2026-01-31 | day | 是 |
| 尾款 70% | 颍尚信息 | SEO-1期 | 318,000.00 | 70% | 222,600.00 | 2026-09-30 | day | 是 |
| 2 期首款 | 上海森朗 | 全案代运营 | 186,500.00 | 60% | 111,900.00 | unknown | unknown | 否 |
日期精度为 unknown 的计划单独成组,不参与未来 30 天回款预测;只有「债权成立」才生成应收。
| 应收标题 | 客户 | 收款主体 | 应收含税 | 已核销 | 余额 | 到期日 | 逾期 | 应收状态 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| 1 期首款 | 学而思(上海XX) | 上海森朗 | 31,800.00 | 31,800.00 | 0.00 | 2026-03-31 | 0 天 | 收清 | 明细 |
| 2 期尾款 | 学而思(上海XX) | 上海森朗 | 74,200.00 | 0.00 | 74,200.00 | 2026-09-30 | ⚠ 6 天 | 待收 | 核销 |
| 专项服务款 | 嘉韵传媒 | 欢恒 | 50,200.00 | 20,000.00 | 30,200.00 | 2026-11-15 | 0 天 | 部分收 | 核销 |
应收「状态」列没有下拉框:待收 / 部分收 / 收清由「已核销金额 vs 应收金额」自动算出;逾期是独立红色标签。
| 应收标题 | 客户 | 余额 | 到期日 | 逾期天数 | 最近跟进 | 责任人 | 操作 |
|---|---|---|---|---|---|---|---|
| 2 期尾款 | 学而思(上海XX) | 74,200.00 | 2026-09-30 | 6 天 | 2026-10-06 电话催收 | 张三 | 跟进 |
| 品牌词尾款 | 嘉韵传媒 | 0.00 | 2026-10-05 | 1 天 | — | 李四 | 改期 |
逾期 = 到期日 < 统计日 且 余额 > 0;到期当天不算逾期,次日算 1 天。
| 到账日 | 付款方 | 己方收款主体 | 金额 | 银行参考号 | 已核销 | 未分配 | 状态 | 凭证 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| 2026-03-12 | 学而思(上海XX) | 上海森朗 | 40,000.00 | ICBK8823… | 31,800.00 | 8,200.00 | 已批准 | 查看 | 核销 |
| 2026-06-20 | 嘉韵传媒 | 欢恒 | 20,000.00 | CMB77120… | 20,000.00 | 0.00 | 已批准 | 查看 | 明细 |
| 2026-08-05 | 内部转账 | 欢恒 ⇄ 上海森朗 | -343,581.00 | 内部-2026-018 | 0.00 | -343,581.00 | 已批准 | 查看 | 成对核销 |
| 2026-10-08 | 涟隐科技 | 上海森朗 | 123,909.00 | ABC9912… | 0.00 | 123,909.00 | 待核验 | 查看 | 审批 |
只有「已批准」的到账才计入回款指标;待核验的流水不影响任何经营数字。内部转账成对录入并带组号,不计客户回款。
| 到账流水 | 金额 | 未分配额 | 停留天数 | 建议核销 | 操作 |
|---|---|---|---|---|---|
| 2026-03-12 学而思 → 上海森朗 | 40,000.00 | 8,200.00 | ⚠ 3 天 | 建议挂 2 期尾款 74,200 | 查看建议 |
| 2026-10-08 涟隐 → 上海森朗 | 123,909.00 | 123,909.00 | 0 天 | 待核销 / 待确认年份归属 | 查看建议 |
未分配到账金额会单独进老板视野(工作台「待分配到账 ⚠」卡片):钱进了公司但还没挂到任何应收,不能当作已回款。
| 退款日 | 原到账 | 客户 | 金额 | 退款属性 | 影响 | 凭证 | 状态 |
|---|---|---|---|---|---|---|---|
| 2026-09-18 | 2026-08-20 | 涟隐科技 | -60.00 | 误收退回 | 恢复应收 reopen(不冲收入) | 查看 | 已批准 |
| 2026-09-25 | 2026-06-20 | 嘉韵传媒 | -10,600.00 | 业务取消 | 减收入 + 减应收 reduce | 查看 | 已批准 |
退款分两类:取消业务同时减收入与应收;误收退回只恢复应收不冲收入;坏账核销走独立事件,绝不标成收清。
设计要点:回款中心只回答四个问题:还有多少钱没收、哪些已经逾期、已经到账的钱有没有全部挂出去、以及退款到底影响的是收入还是应收。所有状态列自动算值,没有手填框。
| 发生月 | 供应商 | 类别 | 含税金额 | 可抵扣税 | 范围 | 归属项目 | 支付月 | 状态 |
|---|---|---|---|---|---|---|---|---|
| 2026-01 | 巨量引擎 | 媒体消耗 | 12,000.00 | 679.25 | 共享 | 颍尚 SEO-1期 60% / 上海森朗 40% | 2026-02 | 已审核 |
| 2026-01 | — | 工资社保 | 50,000.00 | 0.00 | 公司 | — | 2026-01 | 已审核 |
| 2026-02 | XX 物业 | 房租 | 5,000.00 | 0.00 | 公司 | 未分摊 | 2026-02 | 已审核 |
| 2026-03 | 百度推广 | 媒体消耗 | -60.00 | 0.00 | 直接 | SEM代投放 100% | — | 已审核 |
ⓘ 工资 / 社保 / 房租默认进「公司间接费用」,只有明确分摊规则才分摊到项目。
ⓘ 成本以发生月计入项目利润,不以付款日期计入;负数保留负号,不取绝对值。
ⓘ 成本以发生月计入项目利润,不以付款日期计入;负数保留负号,不取绝对值。
| 付款日 | 付款流水号 | 金额 | 核销的成本(可跨月) | 凭证 | 状态 |
|---|---|---|---|---|---|
| 2026-02-10 | PAY-2026-0044 | 12,000.00 | 2026-01 巨量引擎 12,000 | 查看 | 已批准 |
| 2026-07-15 | PAY-2026-0231 | 8,000.00 | 2026-06 外包写手 8,000 | 查看 | 已批准 |
① 录发生(金额/供应商/类别/发生月/凭证/范围)→ ② 录支付(付款流水核销到成本)。两者可跨月,互不覆盖。
| 成本 | 含税金额 | 可分配额 | 发生月 | 分配方式 | 操作 |
|---|---|---|---|---|---|
| 媒体消耗(巨量引擎) | 10,000.00 | 10,000.00 | 2026-01 | 按收入 / 手填 | 分配 |
| 内容外包 | 8,000.00 | 8,000.00 | 2026-06 | 按收入 / 手填 | 分配 |
| SEM 消耗 | -60.00 | -60.00 | 2026-03 | 手填 | 分配 |
未归属成本会让项目利润变成「暂估」,指标卡不显示「完整性已通过」;只有补齐归属或老板批准暂估,绩效才允许进入正式批次。
| 字典项 | 类型 | 默认值 | 是否参与分摊 | 关联项目数 | 操作 |
|---|---|---|---|---|---|
| 巨量引擎 | 供应商 | 媒体消耗 | 是 | 4 | 编辑 |
| 百度推广 | 供应商 | 媒体消耗 | 是 | 3 | 编辑 |
| 工资社保 | 类别 | 公司间接费用 | 否 | — | 编辑 |
| 房租 | 类别 | 公司间接费用 | 否 | — | 编辑 |
设计要点:成本中心把「发生」和「付款」拆成两步:利润按发生月扣一次,现金流按付款月记一次,两者互不干扰。共享费用走人工分配,公司总成本只算一次,不会因为分摊而翻倍。
| 批次号 | 项目 | 截止月 | 规则版本 | 累计应计 | 累计可结算 | 回款系数 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|---|
| CR-0012 | 学而思 SEO-1期 | 2026-06 | R-v2 | 8,000.00 | 4,000.00 | 0.50 | 已批准 | 支付登记 试算快照 |
| CR-0013 | 学而思 SEO-1期 | 2026-09 | R-v2 | 6,000.00 | 3,000.00 | 0.50 | 试算 | 提交审批 试算快照 |
| CR-0014 | 学而思 SEO-2期 | 2026-10 | R-v2 | -1,000.00 | -500.00 | 0.50 | 待审 | 审批 |
⚠ CR-0014 因补录成本产生 −1,000 负调整(α=回款系数后为 −500):已发放记录保留不动,系统只提示「超发」,由老板决定追偿还是后续抵扣,不自动倒扣工资。
累计应计 = max(累计毛利, 0) × 比例 × 份额;累计可结算 = 累计应计 × 回款系数;毛利基础是扣除绩效前的毛利,避免循环计算。
| 规则名 | 版本 | 生效日 | 毛利基础 | 计提比例 | 释放方式 | 追偿方式 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|---|
| 标准提成 | R-v1 | 2025-01-01 | 不含税收入 − 直接成本 | 20% | 按月计提 | 全额追偿 | 已归档 | 查看 |
| 标准提成 | R-v2 | 2026-01-01 | 不含税收入 − 已归属直接成本 | 20% | 按回款比例释放 | 后续抵扣 | 生效中 | 新建版本 |
| 渠道分成 | R-draft | 待确认 | 待确认 | 49%(待确认) | 待确认 | 待确认 | 草稿 | 编辑 |
⚠ 「渠道分成是否固定 49%」「毛利基础是否含间接费用」「超发追偿还是抵扣」尚未由老板确认 → 规则只能存草稿,只允许试算,禁止批准与发放。
| 计提批次 | 项目 | 我的份额 | 累计应计 | 可结算 | 已发放 | 待发 | 依据 |
|---|---|---|---|---|---|---|---|
| CR-0012 | 学而思 SEO-1期 | 60% | 4,800.00 | 2,400.00 | 2,400.00 | 0.00 | 查看只读快照 |
| CR-0013 | 学而思 SEO-1期 | 60% | 3,600.00 | 1,800.00 | 0.00 | 1,800.00 | 查看只读快照 |
业务人员只能看到自己份额与计算依据快照;看不到他人绩效,也看不到工资与成本明细。
设计要点:绩效中心的每个批次都冻结一份「输入快照」:毛利多少、用的哪版规则、回款系数多少、谁占多少份额,全在快照里。规则改了不影响老批次,因此历史报表永远可以复现。
1① 上传文件
2② 工作表与字段映射
3③ 预览与异常
4④ 确认导入
← 上一步
下一步 →
任意时刻都可以回退修改;回退不会丢弃已确认的映射。
拖拽或点击上传 .xlsx
原件只读留档,系统不修改你的 Excel
原件只读留档,系统不修改你的 Excel
已上传:回款管理表_2026Q3.xlsx 文件 hash:a3f9c2…d81(重复上传会被识别)
已识别 8 个工作表
回款管理表 / yan / 成本消耗 / dl广告 / yp / jw / 结算单 / a
ⓘ 原表结构千差万别,系统不猜测表结构,只做列坐标层面的识别。
回款管理表 / yan / 成本消耗 / dl广告 / yp / jw / 结算单 / a
ⓘ 原表结构千差万别,系统不猜测表结构,只做列坐标层面的识别。
⚠ 21 位审批号在原 Excel 里已经是科学计数法(精度已丢失),
这类字段只能「标记需回查」,不能被系统自动补回来。
工作表:回款管理表 ▾
年份列归属:G:R = 2025 / S:AD = 2026 ▾ ⚠ 必须由你确认
日期精度:month(月度台账)▾
⚠ 年份列归属必须由用户显式选择:系统不按 E/F 两列的排列顺序去推断哪年是 2025、哪年是 2026。
选错年份等于整表错位一年,这一步没有默认值。
| 原表列 / 区域 | 映射到 | 说明 / 校验 |
|---|---|---|
| 抬头简称(C) | 客户简称 | 需字典匹配 ⚠ 3 项未命中:颖尚 / 颍尚、个人、XX教育 |
| 收款抬头(D) | 己方收款主体 | 上海森朗 / 山东森朗 / 欢恒 / 凯邦仕科 / 云歆(角色待定 ⚠) |
| 项目归属人(E) | 归属人 | ⚠ 2 项缺失待补 |
| 26 年 / 25 年(F、AI) | 年度对照值 | 仅作对照展示,不导入为事实 |
| G:R 月列 | 2025 年 1—12 月 | 二维月列 → 长表展开(12 行/客户) |
| S:AD 月列 | 2026 年 1—12 月 | 二维月列 → 长表展开(12 行/客户) |
金额性质:
⚠ 必须选择;默认不允许落地任何金额。
ⓘ 二维月列转长表:一行客户 → 12 行「月份 + 金额」记录,
每笔都带 date_precision = month,后续补逐笔时可替换并保留桥接对账(两份不相加)。
| 坐标 | 问题 | 详情 | 处理 |
|---|---|---|---|
| F15 / G15 | 年度差额 | 嘉韵:年度 54,200 vs 月明细合计 50,200,差 4,000 | 保留原值 标记异常 |
| F16 | 年份错配 | 涟隐:2025 年列为空,2026 年列却有 123,909 | 按选定映射 跳过此行 |
| C2 · jw 表 | 长数字失真 | 21 位审批号已变成科学计数法,末位精度丢失 | 标记需回查 |
| M18 | 负数 | 出现 -60,可能是退款 / 冲回 / 调整 | 按交易属性确认 |
| 合计行 | 汇总差异 | 年度值与月明细合计差 127,910(4,000 + 123,909) | 作为异常留存 |
下载异常行清单
ⓘ 不自动修补、不以调整分录强行清零:未解释的差额原样保留为异常项,
导入后出现在「历史迁移对账表」里,等你和业务确认。
将写入
historical_month_entries 19 行
全部带 date_precision = month
来源文件 hash 与行列坐标全部留档
historical_month_entries 19 行
全部带 date_precision = month
来源文件 hash 与行列坐标全部留档
不会写入
银行流水、正式应收账款、会计凭证 —— 一个都不会自动生成
银行流水、正式应收账款、会计凭证 —— 一个都不会自动生成
ⓘ 不伪造银行流水日期;月度台账不参与日级回款周期计算;
后续补录到逐笔流水时,按切换点日期替换该月台账并保留桥接对账,两份不相加。
⛔ 上传后绝不自动过账。
只有在这一步显式点了「确认导入(带 Idempotency-Key)」,数据才会以同一事务落到暂存事实;
重复提交同一 key 返回原结果,不同内容返回 409。
← 上一步
确认导入(需 Idempotency-Key)
预计写入 19 行 · 异常 9 项将一并留档
设计要点:导入向导的全部设计目标是「不让脏数据悄悄变成正式账」:年份要你选、金额性质要你选、每一行异常都要你处置、最后一步还要再点一次确认,而且全程绝不自动过账。
我的提醒 / 待办
| 类型 | 对象 | 到期日 | 责任人 | 状态 | 操作 |
|---|---|---|---|---|---|
| 应收到期 | 2 期尾款 74,200 | 2026-09-30 | 张三 | 待处理 | 跟进改期 |
| 到账待分配 | 2026-03-12 到账 8,200 | — | 财务 | 超 3 天 | 去核销 |
| 成本缺失 | 学而思(内容外包 8,000) | — | 李四 | 超 7 天 | 去补录 |
| 票据未开 | 1 期尾款 13,670 | — | 财务 | 待处理 | 去开票 |
ⓘ 处理提醒不直接标记已回款。提醒只负责生成任务、去重、催办;收清状态只能由「真实核销」推导出来。
提醒按 dedupe_key 建唯一索引:同一天、同一对象、同一类型只生成一条,重跑不会产生重复。
月结 / 关账
期间关账 2026-09
当前状态:开启
数据完整性 64%(有异常项,建议暂估关账)
核对项
- 未分配到账 8,200.00 ⚠
- 未归属成本 12,000.00 ⚠
- 日期缺失 5 项(进入待定桶)
- 导入差额 4,000.00 ⚠
操作
关账为「暂估」
正式关账
申请重开(需审批)
ⓘ 已关账期间的事实不可直接修改:关账后补录会被拒绝(409)。
重开必须审批,并生成新版本快照;旧版本报表仍可用原快照复现。
设计要点:提醒不越权改账、关账不静默重算:这两条保证「今天的报表」和「三个月前的同一份报表」能对得上,也让每一笔调整都留下责任人。
T7 · 实施路线与待确认事项
回答:按什么顺序做、每个阶段交付什么才算「做完」、以及哪些业务口径必须由老板拍板后才能放行。
先把 P0 四个阶段做完,系统就有完整的经营闭环(钱→应收→收入→成本→毛利→绩效);
P1 的报表与关账决定「历史能不能解释清楚」,可以稍后但不能没有。
T01|阶段一 骨架与主数据 P0
对应 FR:FR01、FR13(权限骨架) │ 依赖:无
主要文件组:
- apps/api/src/main.ts、app.module.ts、common/*(拦截器 / 过滤器 / 幂等 / 审计 / 事务)、auth/*
- apps/api/src/migrations/*(基础表 + org / legal_entity / party / project)
- apps/api/src/modules/parties/*、modules/projects/*
- packages/shared/*(money 十进制工具、enums、dto)
- apps/web/src/main.tsx、App.tsx、router/、layouts/、pages/customers/*、pages/projects/*
验收:相似客户名称只提示不自动合并;系统管理员默认读不到经营报表;月度矩阵骨架可渲染空表。
T02|阶段二 合同、服务阶段、结算与收入 P0
对应 FR:FR02、FR03 │ 依赖:T01
主要文件组:
- apps/api/src/modules/contracts/*(合同、版本、付款计划、服务阶段模板生成)
- apps/api/src/modules/settlements/*(结算单、提交 / 审核 / 冲销、收入分录)
- apps/api/src/domain/period.ts(月末递推、跨年展开、「20 天」按日历日)
- apps/web/src/pages/projects/*(合同与续约、服务阶段 / KPI、结算 三个页签)
- apps/web/src/components/DrawerDetail/*、StatusBadge/*
验收:月度 / 季度 / 年度 / 一次性计费方式都能建;13,000 可人工核定 12,897 且保留 KPI 与证据(不自动解析备注公式);10,000 分三期 3,333.33 / 3,333.33 / 3,333.34,闰年与月末正确。
T03|阶段三 资金、应收、发票 P0
对应 FR:FR04、FR05、FR06、FR07 │ 依赖:T02
主要文件组:
- apps/api/src/modules/receivables/*(应收、应收事件、付款计划)
- apps/api/src/modules/cash/*(流水、审批、核销、退款)
- apps/api/src/domain/allocation.ts(核销引擎:事务锁、主体 / 客户 / 余额校验)
- apps/api/src/modules/invoices/*(开票申请、票据、红票)
- apps/web/src/pages/receivables/*(6 页签 + 核销抽屉)、pages/invoices/*
- apps/web/src/components/MatrixTable/*(月度矩阵表体)
验收:30% / 70% 付款计划、unknown 日期保留、确认债权才进应收;一票两项目、部分开票、红票净额可追溯;一笔分多应收、多笔付一应收、超收进未分配、并发不超额;退款分别处理收入 / 应收 / 票据。
T04|阶段四 成本与绩效 P0
对应 FR:FR08、FR09 │ 依赖:T02、T03
主要文件组:
- apps/api/src/modules/costs/*(成本发生、支付核销、分配、待归属队列)
- apps/api/src/modules/commissions/*(规则版本、批次、行、支付核销)
- apps/api/src/domain/grossProfit.ts、domain/commission.ts(毛利服务 + 绩效快照)
- apps/web/src/pages/costs/*、pages/commissions/*
- apps/web/src/pages/dashboard/*(指标卡片区 + 度量切换)
验收:发生与支付可跨月、共享费用人工分配、公司利润不重复扣分摊;按快照计算、补成本产生差额、规则变更不回写已锁批次;补成本后负调整 1,000,已付记录保留并提示超发,亏损项目绩效为零。
T05|阶段五 报表、提醒、导入、关账 P1
对应 FR:FR10、FR11、FR12、FR14 │ 依赖:T03、T04
主要文件组:
- apps/api/src/modules/reports/*(只读聚合、快照、导出:matrix / aging / cash-forecast / operations)
- apps/api/src/modules/imports/*(上传、映射、预览、异常、确认)
- apps/api/src/modules/reminders/*、modules/periods/*、jobs/*
- apps/web/src/pages/reports/*、pages/settings/*(导入向导四步 + 关账页)
- apps/web/src/pages/dashboard/*(我的提醒)
验收:每月数字可下钻,季度 / 年度流量求和,期末应收取期末余额;提醒重跑不重复、收清自动结束提醒;8 表预览、二维月份展开、异常报告、来源保留、重复导入无重复流水;关账后补录被拒,重开需审批,旧版报表可复现。
开发前必须由老板确认的 12 件事未确认时按「保守默认」执行,不阻塞开发
以下事项不阻塞架构与骨架开发,但决定真实数据能否正式结算。
每项都已经给出「未确认时的保守处理」——宁可显示成「暂估 / 待定 / 异常」,也绝不替业务做假设。
| # | 需确认事项 | 影响模块 | 未确认时的保守默认处理 |
|---|---|---|---|
| 1 | 回款管理表月列是否全部为实际到账;G:R / S:AD 究竟对应 2025 还是 2026 | 导入 M9、资金 M4 | 历史金额进 historical_month_entries 暂存,不进入实际回款总额;年份映射必须在导入第 2 步显式选择,系统不按 E/F 排列推断。 |
| 2 | 各「抬头」的角色:客户 / 渠道 / 己方收款主体 / 代付方 / 供应商(「付款抬头」与「收款抬头」是否同义) | 主数据 M1 | 全部进人工字典映射,禁止推断合并;「颖尚 / 颍尚」只提示不归一;个人收款主体与客户个人身份分开。 |
| 3 | yan 表「收款销售额」与「实际销售额」约 6% 差额的本质:VAT / 代开服务费 / 渠道佣金 | 结算 M3、成本 M6 | 金额原样保留并标记「疑似扣减」,禁止默认 6% 税率,禁止用含税 ×94% 反推不含税收入。 |
| 4 | 分佣比例制度(是否固定 49%)、毛利基础是否含间接费用、释放方式、超发追偿还是后续抵扣 | 绩效 M7 | 规则只存草稿,允许试算,禁止批准与发放。 |
| 5 | 供应商消耗、工资、社保、房租、分成如何归到项目 | 成本 M6 | 未归属与公司级成本单列;工资 / 社保 / 房租默认公司间接费用不分摊;项目利润标记「暂估」。 |
| 6 | 服务考核 13,000 → 12,897 的核定规则 | 结算 M3 | 人工核定 + 证据附件 + 审批;不自动解析备注,不做自由文本公式引擎。 |
| 7 | 原表年度值与月明细差额(嘉韵 4,000、涟隐 123,909,合计 127,910)与底部汇总差异 | 导入 M9 | 作为异常留存,导入时展示对照但按确认后的明细控制数迁移,不以调整分录强行清零。 |
| 8 | 历史合同、债权成立日期、尾款预计时间 | 资金 M4 | 标记待补信息,不伪造日期;未知日期用 unknown,不纳入日级回款周期;历史未收款通过「期初应收」录入并保留原债权信息。 |
| 9 | 是否启用「同人审核」例外(小团队) | 权限 | 默认关闭;开启需老板显式配置,且每次记录原因并入审计。 |
| 10 | 己方主体间内部转账、借款、股东出资的识别规则 | 资金 M4 | 一律不计业务回款;内部转账需成对录入并带组号,客户维度自动剔除。 |
| 11 | 成本中的正数(K23=2,455、O27=1,519.31)与负数(M18=−60)的属性:退款 / 冲回 / 调整 | 成本 M6、资金 M4 | 导入时逐条让用户按交易属性确认,不统一取绝对值;正数优先匹配客户退款。 |
| 12 | 上线切换点日期与历史 / 新交易的互斥边界 | 全模块 | 设定切换日后,历史台账与新交易互斥;后续补逐笔替换该月台账并保留桥接对账,两份不相加。 |
验收场景 ↔ 架构落点对照14 个场景,可直接作为测试用例
| 场景 | 一句话 | 架构落点 |
|---|---|---|
| A | 到账 40,000 只核销 31,800,余 8,200 待分配;二期未到期不算逾期 | 核销引擎 + 应收余额计算(4.1 / 5.3) |
| B | 一笔 50,000 分两项目,不因多票多成本放大 | 报表先聚合后关联(7.3-22) |
| C | 一票 106,000 + 红票 10,600 = 净 95,400;退款前后分别处理 | 发票 M5 + 退款分配(5.5) |
| D | 1 月成本 2 月付,1 月毛利 4,000,2 月不再扣 | 成本发生 / 支付分离(6.6) |
| E | 共享 10,000 按 60/40 分配,公司总成本仍 10,000 | cost_allocation 归属拆分(3.2 / 6.6) |
| F | 补成本后绩效负调整 1,000,已付保留并提示超发 | 绩效引擎快照 + 负向批次(4.2 / 5.4) |
| G | 关账后补录被拒,重开需审批,旧报表可复现 | period_close + 快照版本(3.3) |
| H | 10/6 不逾期,10/7 逾期 1 天;跨年范围正确 | 逾期标签计算(5.3 / 7.3-11) |
| I | 重复导入无重复;长审批号不失真;差额进异常 | 导入 hash 去重 + 字符串编号(6.8) |
| J | 并发两人各核销 6,000 争 8,000 余额,只成功一笔 | 事务行锁 + version + 409(4.1) |
| K | 业务看不到他人绩效与工资;管理员看不到经营报表 | 行级权限 Guard(7.3-13 / 18) |
| L | 10,000 分三期尾差正确;月末 / 闰年正确 | 期间引擎 + 分舍入(7.3-4) |
| M | 取消业务退款减收入与应收;误收退回恢复应收不冲收入;坏账不算回款 | 退款 reopen / reduce(5.3 / 7.3) |
| N | 提醒重跑唯一;备份恢复后一致 | dedupe_key 唯一索引 + 备份演练 |
原型图绘制顺序(本文件就是这个顺序)已完成
P1 全局框架 + 月度矩阵(最重要,先给老板看) → P2 项目详情 9 页签 + 客户详情 →
P3 回款中心 6 页签 + 核销抽屉 → P4 成本中心 + 绩效中心 → P5 导入四步向导 + 提醒 + 关账。
本文件依据《项目经营与回款管理系统 — 系统架构设计与原型图规格》v1.0 绘制 |
所有图表均为内联 SVG / HTML-CSS 手绘,无任何 CDN、字体或脚本外链 | 浅色主题 | 建议 1366×768 以上桌面端查看