项目经营与回款管理系统 · 架构与界面原型图

模块化单体 · React/TS + NestJS/TS + PostgreSQL · 版本 1.0 · 2026-10-06 · 零外部依赖单文件(可直接双击打开)
主流程 / 允许调用 / 主按钮已审核 · 收清 · 已完成逾期 · 待补 · 暂估负数 · 超额 · 异常辅助 · 冻结列 · 只读禁止 / 受限边

T1 · 架构总览(六层分层)

回答:这套系统一共分几层、每一层负责什么、以及哪三条原则一旦破了整套账就不可信。

看图方式:从上往下是请求的方向。前端只负责展示; 网关层拦住没权限的请求;业务模块层各管一段业务; 领域服务层是金额与规则的唯一计算入口;数据层只存事实,不替业务做决定。
① 前端层React 18 + TypeScript + TanStack Table + Tailwind经营工作台指标卡片 / 提醒待办月度矩阵冻结列 · 下钻 · 导出表单与向导四步导入 / 录入的事实表单② 网关与鉴权层写请求必校验 角色 + 行级范围 + version;资金/审批/导入确认强制幂等键API 网关/api/v1 统一入口会话鉴权401 未登录角色与行级权限403 越权拦截幂等键校验同 key 同 body③ 业务模块层NestJS Module,11 个模块自治;模块间只走显式导出的 Service 接口M1 客户项目M2 合同服务M3 结算收入M4 资金应收M5 发票M6 成本M7 绩效M8 报表M9 导入M10 提醒M11 关账蓝色=主链路 灰底=只读/旁路 绿底=导入(须经暂存区)④ 领域服务层 · 唯一计算入口纯函数 + 事务编排;资金入账 / 核销 / 冲销 / 审计同一事务提交金额引擎核销引擎绩效引擎期间引擎审计服务⑤ 数据层PostgreSQL 15+ decimal(18,2) · 行锁 + 唯一键 + version 乐观锁PostgreSQL交易不可物理删除,只做反向冲销定时任务提醒日更 / 关账扫描任务队列异步导出 / 导入确认⑥ 文件存储抽象接口 · 首版本机私有目录合同 / 票据 / 凭证 / 导入原件私有授权下载,不暴露本机路径约束:前端不做金额浮点相加只做字符串展示与服务端聚合结果渲染HTTPS JSON已鉴权请求Service 接口同一事务提交附件读写(私有授权)报表只读聚合 / 快照落地
图 1-1 六层分层架构(含约束标注)

① 汇总必须由事实记录计算

页面上任何一个数字(包括月度矩阵的每个单元格)都不能手改,只能由底层事实——到账流水、收入分录、成本分配、绩效计提——聚合而来。没有例外,也不存在「可编辑的汇总字段」。

② 服务端是金额与权限的唯一计算入口

前端传来的金额只作为输入,不作为结果;权限判断在服务端逐条执行而不是靠前端藏按钮。资金写入 / 审批 / 导入确认 / 绩效入账强制幂等键。

③ 历史可复现

关账快照 + 审计日志 + 版本化规则,让任何历史报表都能重算复现;任何已审核记录只允许「留痕调整 / 反向冲销」,绝不物理删除。

技术选型一句话版模块化单体

React 18 + TypeScript 前端 / NestJS + TypeScript 后端 / PostgreSQL 15+(金额 decimal(18,2))/ 本机私有目录存附件(接口抽象,后续可换对象存储)。不做 ERP、不接税局自动开票、不接银行直连、不做完整财务总账。

T2 · 模块边界与依赖(11 个模块)

回答:谁可以调用谁、谁绝对不能碰谁的数字。箭头方向 = 依赖方向(A → B 表示 A 调用 B)。

四条禁止边(红色虚线)必须守住: 报表模块禁止写入任何业务账;导入模块禁止绕过暂存区直写正式账目;提醒模块禁止修改财务状态; 关账模块禁止在不审批的情况下静默重算历史。
主数据与履约成本与绩效导入(必须经暂存区)只读与旁路M1客户项目M2合同服务M3结算收入M4资金应收M6成本发生 / 支付 / 归属M7绩效规则 / 批次 / 发放M5发票开票 / 票据 / 红票M8报表M10提醒M11关账—导入暂存区 STAGE映射 / 预览 / 异常 / 确认M9导入上传 / 解析客户 / 项目合同 / 阶段 / KPI结算核定成本依据项目编号去重、归属人经毛利服务不含税毛利开票申请来源确认后同一事务落地:资金 / 成本 / 主数据落地资金落地成本落地主数据只读视图(DB 只读)报表禁止写入<|hy_place▁holder▁no▁813|>导入禁止直写正式账目提醒禁止修改财务状态关账不静默重算历史(只读 + 锁标记)图例允许调用(依赖方向)只读查询禁止 / 受限
图 2-1 模块依赖与禁止边(“—▸”为允许调用,“┈▸”红色为禁止)

蓝实线允许

显式导出的 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 一致。
ER-1 主数据与履约主干回答:谁卖给谁、卖了什么、分几期、结算多少、确认多少收入LEGAL_ENTITY 己方主体PK iduuid namevarchar typecompany/personal statusvarcharPARTY 客户/角色主体PK iduuid full_namevarchar short_name简称 roles客户/渠道/供方 tax_no可空PROJECT 项目PK iduuid project_noUK customer_idFK business_typevarchar owner_idFK status状态机PROJECT_SALES_SHARE 份额PK iduuid project_idFK user_idFK share合计=1 rule_idFKCONTRACT 合同PK iduuid contract_noUK project_idFK seller_entity_idFK payer_party_idFK gross_amountdecimal status状态机SERVICE_PERIOD 服务阶段PK iduuid contract_idFK phase_noint platformvarchar kpi_text目标文本 unit_pricedecimal status状态机SETTLEMENT 考核结算PK iduuid period_idFK measure_mode计量/KPI approved_netdecimal kpi_actualdecimal status审核锁定REVENUE_ENTRY 收入分录PK iduuid settlement_idFK recognition_ondate net_amountdecimal entry_typenormal/reversal reversal_of可空1:N1:N业务份额:同项目合计 = 11:N己方收款主体1:N一项目多合同1:N分期服务1:N一阶段多结算1:N审核后生成收入关键约束① party 可同时是客户 / 渠道 / 付款方 / 供应商,别名「只提示相似、不自动合并」,合并须管理员审批并保留旧 ID 映射。② contract.gross_amount 是「上限」不是事实;服务阶段状态机见 T5;结算单审核后锁定,改动走「冲销 + 新单」。③ revenue_entry 的冲销写负向 entry_type=reversal 记录,原记录永不物理删除;金额一律 decimal(18,2)。
图 3-1 ER-1 主数据与履约主干
ER-2 资金 · 票据 · 成本 · 绩效回答:钱怎么进来、怎么核销、票怎么开、成本归到哪个项目、绩效怎么算出来PAYMENT_PLAN 付款计划PK iduuid contract_idFK amountdecimal percentage如30% expected_on可空 date_precision日/月/未知RECEIVABLE_ITEM 应收项PK iduuid contract_idFK settlement_idFK gross_duedecimal due_on可空 trigger_type计划/结算 status自动算不可手填CASH_TRANSACTION 资金流水PK iduuid directionin/out kind收/退/付 occurred_ondate amount恒为正 bank_ref防重复 status草稿/待核验/已批准RECEIPT_ALLOCATION 核销PK iduuid cash_idFK receivable_idFK amountdecimal allocated_ondate reversal_of可空INVOICE 票据PK iduuid invoice_no字符串UK issuer_entity_idFK kind蓝票/红票 gross_amountdecimal red_of可空COST_ENTRY 成本发生PK iduuid supplier_idFK category字典 service_month归属月 gross_amountdecimal cost_scope直接/共享/公司COST_ALLOCATION 归属拆分PK iduuid cost_idFK project_idFK net_amountdecimal method手填/按收入COST_PAYMENT 成本支付PK iduuid cash_idFK cost_idFK amountdecimalCOMMISSION_RULE 规则版本PK iduuid versionint effective_ondate profit_basis基数 rate比例 release_mode释放方式COMMISSION_RUN 计提批次PK iduuid project_idFK cutoff_ondate rule_version锁定 input_snapshotjson 快照 accrued_totaldecimal delta差额留痕COMMISSION_LINE 按人分行PK iduuid run_idFK user_idFK share比例 settleable_amountdecimal paid_amountdecimalCOMMISSION_PAY 发放核销PK iduuid cash_idFK line_idFK amountdecimal1:N债权成立后关联N:M经核销表关联1:N到账分配1:N 被核销1:1 非强制一对一1:N 开票明细来源1:N归属拆分(不可重复加回)1:N 一次付多条1:N 付款核销1:N版本锁定1:N按人分行1:N发放核销为什么核销要单独一张表:一笔到账可分给多个应收、一个应收可由多笔到账支付;跨表后才能支持「部分收 + 未分配 + 退款 reopen」而不改动任何原始记录。PROJECT(ER-1)→ COMMISSION_RUN / COST_ALLOCATION 为跨图引用,见 ER-1。
图 3-2 ER-2 资金 · 票据 · 成本 · 绩效
ER-3 关账与审计(历史可复现的地基)回答:去年的报表今天能不能复现、谁在什么时候改了什么PERIOD_CLOSE 期间关账PK monthYYYY-MM status开启/暂估/已关账 summary_snapshotjson 快照 closed_byFK versionint 乐观锁PERIOD_SNAPSHOT 期间快照PK iduuid monthFK metric_key指标键 metric_valuedecimal source_completeness完整性AUDIT_LOG 审计日志PK iduuid object_type对象 object_iduuid action审核/冲销/导出 before_valuejson after_valuejson reason原因必填 actor_idFK1:N期间快照N:1变更留痕(谁改、改前改后、原因)硬规则:已关账期间的『事实』不可直接改;要改须『重开 → 审批 → 生成新版本快照』,旧版本报表仍可原样复现。
图 3-3 ER-3 关账与审计

字段级硬规则工程师必读

主题规则
金额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 框表示同一时刻只会走其中一条分支。
流程 A 到账 → 审批 → 核销 → 应收状态更新 → 回款矩阵刷新回答:一笔钱进来之后,系统到底做了哪些事、哪些数字会被自动改、哪些绝不允许手改财务 / 出纳回款中心 WEB资金模块 API核销引擎PostgreSQL审计服务月度矩阵alt 校验通过(互斥)else 超额 / 跨主体 / 并发冲突录入到账:付款方 / 己方收款主体 / 到账日期+精度 / 金额 / 凭证 / 银行参考号1.POST /api/v1/cash-transactions(草稿)2.INSERT cash_transactions status = draft3.POST /cash-transactions/:id/approve(强制 Idempotency-Key)4.BEGIN 事务;SELECT … FOR UPDATE 锁住流水行5.UPDATE status = 已批准6.记录审批前后值 before / after / reason7.请求「同客户应收建议」8.返回候选应收清单(含到期日与未核销余额)9.POST /cash-transactions/:id/allocations [{receivable_id, amount}]10.校验:同客户 / 同己方收款主体 / 可用余额 / version11.事务锁:流水行 + 全部目标应收行12.INSERT receipt_allocations(写分配明细)13.重算 receivable 已核销额与余额14.派生状态:待收 / 部分收 / 收清(自动计算,禁止手填)15.写核销审计——与业务操作同一次提交16.返回剩余未分配金额(例:40,000 − 31,800 = 8,200)17.回滚并返回 409 / 422(冲突 or 业务不平衡)18.提示:不可超额、不可跨客户、不可跨己方收款主体19.发布「事实变更」事件20.GET /reports/matrix 重新聚合21.返回月度单元格 + 指标卡片(全部由事实计算,无手改字段)22.矩阵刷新,单元格可点击下钻到明细抽屉23.验收锚点场景 A:到账 40,000 只核销 31,800,剩余 8,200 落「未分配到账」,二期未到期不算逾期;场景 B:一笔 50,000 同时分给两个项目的应收,报表侧不会出现金额放大;场景 J:两人并发各核销 6,000 争 8,000 余额,行锁 + version 保证只有一笔成功,另一笔得 409。
图 4-1 流程 A 到账 → 审批 → 核销 → 应收状态 → 矩阵刷新
流程 B 阶段履约 → KPI 核定 → 收入 → 成本归属 → 毛利 → 绩效计提 → 发放回答:老板最关心的「毛利与提成」,是怎么从一张张原始记录一步步算出来的项目负责人结算模块收入模块成本模块毛利服务绩效引擎财务PostgreSQLalt 成本齐全 或 老板批准「暂估」else 成本未齐提交阶段履约证据与 KPI 实际值(附件留痕)1.人工核定:13,000 可核定 12,897(不自动解析备注公式)POST /settlements/:id/submit3.POST /settlements/:id/approve(幂等键)4.UPDATE settlements status = 已审核 → 锁定5.生成 revenue_entry(含税 / 不含税 / 税额)6.INSERT revenue_entries(审核后锁定,只能反向冲销)7.生成或复用 receivable_item(同一债权不重复建)8.应收已生效9.录入成本发生 + 项目归属分配(发生月 ≠ 付款月)10.INSERT cost_entries + cost_allocations11.按发生月聚合:不含税收入 − 已归属直接成本12.返回项目毛利 / 毛利率(亏损项目毛利为 0 起算)13.POST /commission-runs/preview(试算,不入账)14.冻结快照:毛利 / 规则版本 / 份额 / 回款系数15.返回累计应计与累计可结算(未写任何分录)16.POST /commission-runs 正式批次17.INSERT commission_run + commission_line(delta 差额留痕)18.POST /commission-runs/:id/approve19.UPDATE commission_run status = 已批准20.仅允许试算并标记「暂估」,不允许批准与发放21.POST /commission-payments/:id/allocations(登记支付)22.发放核销——不再计入利润表费用(避免重复扣除)23.返回待发金额,超发时给出红色提示(不自动抹平)24.验收锚点场景 D:1 月发生的成本 2 月付款,利润只在 1 月扣一次,2 月支付不再扣;场景 F:补录成本后绩效产生 −1,000 负调整,已付款记录保留不动,提示追偿 / 后续抵扣;场景 L:10,000 元分三期 3,333.33 / 3,333.33 / 3,333.34,尾差落在最后一期,月末闰年正确。
图 4-2 流程 B 阶段履约 → 收入 → 成本 → 毛利 → 绩效 → 发放

为什么核销要「先锁再写」并发

步骤 11—12 会锁住流水行和全部目标应收行,再写分配明细并重算余额。 这样两个人同时核销同一笔尾款时,必定只有一个成功(另一个拿 409),不会出现超额核销。

为什么绩效要「先快照后入账」可解释

试算时把毛利、规则版本、份额、回款系数冻结成快照,业务能看懂「这个数怎么来的」; 正式批次一旦批准,规则变更也不再影响它。

T5 · 状态流转(5 张状态机)

回答:每条记录现在处在哪个阶段、谁能把它推到下一步,以及哪些状态是「算出来的」而不是「选出来的」。

最容易出错的三条口径: ① 应收状态(待收 / 部分收 / 收清)由已核销金额自动计算,禁止手填; ② 逾期是一个独立标签,不是状态:无到期日的应收进「待定」桶而不是直接算未逾期; ③ 坏账核销 / 减免走独立事件,绝不允许标成「收清」。
5.1 项目状态草稿待启动服务中待验收已完成已归档暂停已终止提交启动服务期满验收通过归档中止服务恢复服务验收不通过 → 需整改终止(必填原因)提前终止(必填原因,留下 CT 记录)注:项目「已完成」≠ 已回款;被任何事实引用的客户 / 项目禁止硬删,只能归档。
图 5-1 项目状态
5.2 服务阶段状态未开始执行中待考核已验收已结算需整改到达开始日服务期结束考核通过核定结算额并审核考核不通过整改后重跑阶段生成规则· 按模板批量生成期号(Q / 月 / 一次性)· 月度模板跨年自动展开到次年· 「20 天」按日历日算,含起止日则 +19 天· KPI 目标 / 实际同时留档,核定金额人工确定
图 5-2 服务阶段状态
5.3 应收状态(由余额自动计算,禁止手填)待收部分收收清已终止核销额 < 应收额余额归零一次核销完成退款 reopen:恢复应收继续核销 / 减免 reduce(自循环)坏账核销(独立事件)坏账核销(独立事件)三条必须记住的口径① 应收状态完全由「已核销金额 vs 应收金额」算出,  页面上没有任何一个可手填的状态下拉框。② 逾期是「独立标签」不是状态:due_on < 统计日  且余额 > 0 才打逾期标;到期当天不逾期,次日算 1 天。③ 坏账核销 / 减免必须走独立事件,  绝对不允许标成「收清」——否则回款数据失真。无到期日的应收进「待定」桶独立展示:既不能算逾期,也不能混入「未来 30 天回款预测」。
图 5-3 应收状态(自动计算,禁止手填)
5.4 绩效批次状态试算待审已批准部分发放已发放生成批次财务审批支付登记尾款付清已批准 → 一次付清重算:只覆盖草稿,不入账负调整:新建批次做差额,绝不回写旧批次注:每批次冻结「毛利快照 + 规则版本 + 份额 + 回款系数」,规则变更只影响之后的批次,历史报表可复现。
图 5-4 绩效批次状态
5.5 合同 / 结算 / 成本 / 票据 / 到账(通用审核链)合同专用链草稿待审已签生效到期终止提交批准到达生效日服务期满提前终止结算 / 成本 / 票据 / 到账 通用链草稿待审已审核提交审核只允许「留痕调整 / 反向冲销」,不直接改原始分录到账核销状态:未分配 / 部分分配 / 全部分配同样由「已分配金额 vs 到账金额」自动算出,禁止手填。只有「已批准」的到账才计入回款指标。
图 5-5 合同与通用审核链

状态机在界面上的落点控件

状态一律用彩色徽章展示并且不可编辑;页面上出现的按钮(提交 / 审核 / 冲销 / 归档 / 重开) 才是状态迁移的唯一入口,每次迁移都会写审计日志(含前后值与原因)。

T6 · 界面原型(重点:这套系统长什么样)

回答:老板每天打开看到什么、点哪里、点到之后能追到哪一层原始记录。

⚠ 界面中的金额均为「结构演示用」的合成示例数据,不是客户真实数字。 页面上的客户名取自老板 Excel 中实际出现过的抬头(颍尚 / 上海森朗 / 凯邦仕科 / 云歆 / 嘉韵 / 涟隐), 但金额是为了演示布局与口径关系而合成的一组内部自洽数字。
ⓘ 真实数据如何进入系统:必须经过「设置与数据 / 数据导入向导」四步 —— 上传原件 → 工作表与字段映射(年份列归属由人工确认)→ 预览与异常(差额逐条处置)→ 确认导入; 系统不替任何未解释的差额做决定,也不会自动过账。
这不是截图,是用 HTML + CSS 拼出来的高保真线框,所以里面的 Tab、开关、抽屉、度量切换都是可以真的点的。 下面每一页都按架构师第 6 章的线框规格绘制。

全局布局框架① 先看这里

左侧常驻一级导航 9 项 · 顶部面包屑 + 全局搜索 + 期间切换 + 提醒铃铛 · 右侧内容区 · 右下角浮出明细抽屉(不跳页)。
经营工作台 / 月度矩阵 🔍 全局搜索:客户 / 项目 / 合同号 / 发票号 期间 2026 ▾ 12 张老板 ▾
③ 右侧内容区 ④ 顶部:面包屑 / 全局搜索 / 期间 / 提醒 ⑤ 明细抽屉
该月明细抽屉
客户 / 项目 / 2026年3月 / 度量:回款
回款流水收入 成本绩效发票
ⓘ 金额只读,新增只能走底部两个入口
+ 新增到账+ 新增成本
① 左侧一级导航(9 项) ② 内容区承载全部页面,切换不跳出身

为什么这么做IA

把老板每天要看的月度矩阵放在落地页第一行,客户 / 项目 / 回款 / 发票 / 成本 / 绩效 / 报表 / 设置共 9 个一级入口, 与 Excel 里「一张表一个主题」的习惯对齐。

抽屉而不是新页面交互

所有明细用右侧抽屉展开,不跳页、不丢筛选条件;抽屉底部固定「新增到账 / 新增成本」入口, 新增的事实会回流到矩阵单元格。

全局能力框架

顶部常驻:面包屑 + 全局搜索 + 当前期间切换 + 提醒铃铛(红点数字)。期间切换决定所有界面的统计口径,避免跨年误读。

页面原型(可交互)7 个页面

试一下:切换到「月度矩阵」页 → 打开右上「两年并排」开关(列数变 24) → 点「成本 / 毛利 / 绩效」切换度量 → 再点任意金额单元格,右侧抽屉会列出构成这个数字的全部事实记录。
经营工作台 / 月度矩阵期间 2026 ▾
本期实际回款
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.0038,000.0031,500.0066,000.00–47,000.0054,000.00–39,000.0088,000.0036,000.00–34,440.0031,160.0025,830.0054,120.00–38,540.0044,280.00–31,980.0072,160.0029,520.00441,500.00
欢恒张三SEO-1期 ⓘ台账服务中–42,000.0038,000.00–66,000.00––54,000.00––88,000.00––34,440.0031,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.00153,500.00
▾ 上海森朗(客户小计)56,000.0018,000.00––72,000.00–––64,000.00––58,000.0045,920.0014,760.00––59,040.00–––52,480.00––47,560.00268,000.00
凯邦仕科李四全案代运营服务中56,000.00–––72,000.00–––64,000.00––58,000.0045,920.00–––59,040.00–––52,480.00––47,560.00250,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.0045,920.0060,000.0049,200.0038,000.0031,160.0055,500.0045,510.00188,200.00154,324.00-219,672.00-180,131.0447,000.0038,540.0054,000.0044,280.0063,940.0052,430.8039,000.0031,980.0088,000.0072,160.0094,000.0077,080.00 563,968.00
左侧 5 列冻结、右侧「年度合计」列冻结、合计行吸底;中部 1—12 月可横向滚动。 负数保留负号并显示为红色(如 −60 退款冲回、−343,581 内部转账冲回),不取绝对值。 合计行为全口径(含内部转账冲回),因此与顶部「本期实际回款」不同:经营口径会剔除内部转账。
设计要点:保留 Excel 的「客户—项目—月份」二维浏览习惯,但把每个数字都变成可下钻的入口:点单元格 → 右侧抽屉 → 看原始流水 → 底部新增事实。数字永远来自事实,不由人填。
客户 / 颍尚信息科技(上海)有限公司
颍尚信息科技(上海)有限公司 常用简称:颍尚 客户付款方 渠道:无 编辑 合并申请 归档
别名:颍尚、颖尚(错别字变体)、颍尚信息 ⚠ 检测到近似名称「颖尚 / 颍尚」,仅提示相似,不自动合并; 合并须管理员审批并保留旧 ID 映射与日志
服务品牌:颍尚 ┃ 付款方(开票抬头):颍尚信息科技(上海)有限公司 ┃ 己方收款主体:欢恒 ┃ 税号:9131xxxx…(可选,缺失不影响经营口径)
外部资料:报价表 ↗ · 飞书多维表 ↗ · 历史邮件 ↗ · KPI 考核表 ↗  ⓘ 附件私有授权下载;服务品牌 / 客户 / 付款方 / 渠道是四种不同角色,不合并成一个「抬头」
项目数(去重) ⓘ
3
按 project_id 去重
活跃项目
2
服务中 / 待验收,不含已归档
合同额
530,000.00
合同「上限」口径,不是已确认收入
净到账
441,500.00
已批准到账 − 退款(不含内部转账)
未收应收
88,400.00
2 笔未到期 + 1 笔待定日期
已确认收入
467,990.00
不含税 · 结算审核后锁定
毛利
211,920.00
扣减已归属直接成本
毛利率
45.3%
汇总利润 ÷ 汇总收入,不是单项目平均
③ 己方主体维度展开(双击折叠 / 展开)
展开己方收款主体合同额净到账未收应收备注
▾欢恒530,000.00441,500.0088,400.00该客户全部业务合同均由此主体收款
▾上海森朗(内部转账)0.000.000.00ⓘ 内部转账不计客户打款:成对录入并带组号,客户维度自动剔除
ⓘ 同一家客户可能对应多个己方收款主体(换主体开票是常态),因此所有金额都能按主体维度拆分查看;客户维度的总数 = 业务真实打款之和,不含任何内部转账、借款、股东出资。
项目号项目名称归属人状态合同额净回款未收应收毛利操作
PRJ-2026-018SEO-1期张三服务中318,000.00288,000.0030,000.00138,240.00打开
PRJ-2026-019SEO-2期张三待验收212,000.00153,500.0058,500.0073,680.00打开
PRJ-2026-041SEM代投放张三服务中84,000.00-60.0084,060.00-35.49打开
活跃 / 累计 ▾主体 ▾归属人 ▾导出
ⓘ PRJ-2026-041 已发生媒体成本但只发生一笔 −60.00 退款冲回,因此毛利为负:亏损项目的绩效计提按 0 处理(累计应计提基数为 max(累计毛利, 0)),不会算出负提成。
合同号版本签订日己方收款主体含税额不含税额状态
CT-2026-033v12026-01-05欢恒318,000.00300,000.00生效
CT-2026-033v2(追加预算)2026-06-18欢恒212,000.00200,000.00生效
CT-2025-011v12025-01-08欢恒212,000.00200,000.00到期
结算单项目 / 期号计量方式核定不含税税额含税应收审核状态
ST-2026-0112SEO-1期 / 1 期KPI 核定49,000.002,940.0051,940.00已审核
ST-2026-0140SEO-2期 / 2 期reversal 冲销-1,000.00-60.00-1,060.00已审核
应收标题项目应收含税已核销余额到期日应收状态
1 期首款SEO-1期31,800.0031,800.000.002026-03-31收清
2 期尾款SEO-1期74,200.000.0074,200.002026-09-30待收 ⚠ 逾期 6 天
SEM 预付SEM代投放84,000.00-60.0084,060.00unknown待收
到账列表只列已批准流水;退款以负号记录,余额恢复而不是把应收标成收清。
票据号开票日类型含税额不含税关联应收状态
INV-2026-00312026-03-15蓝票106,000.00100,000.001 期首款已开
INV-2026-0031-R2026-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-0012SEO-1期2026-06R-v28,000.004,000.00已批准
CR-0014SEM代投放2026-10R-v20.000.00毛利为负 → 计提 0
业务人员进入「我的绩效」只能看到自己的份额与只读依据快照。
时间对象动作改前 → 改后操作人原因
2026-09-10 14:22CT-2026-033新增版本v1 → v2张三追加下半年媒体预算
2026-09-18 10:05PRJ-2026-041退款登记余额 84,000 → 84,060财务·王误收退回 −60
2026-10-06 11:07别名相似提示无(未合并)系统检测到「颖尚」字形近似
设计要点:客户 ≠ 付款方 ≠ 服务品牌 ≠ 渠道:这四种角色在这一屏被拆开建模、分开展示,避免出现 Excel 里「一个抬头混着用」的局面 —— 同一个商业伙伴可以既是客户又是渠道又是供应商,但每一笔钱、每一张票、每一项成本都挂到明确的角色上;别名只提示相似不做自动合并。
项目 / PRJ-2026-018
PRJ-2026-018 SEO optimization — 颍尚信息 服务中 更多操作 ▾
客户:颍尚信息(上海森朗代签)┃ 归属人:张三 ┃ 服务起止:2026-01-01 ~ 2026-12-31 ┃ 己方收款主体:欢恒
外部链接:报价表 ↗ · KPI 考核表 ↗ · 飞书文档 ↗  ⓘ 附件为私有授权下载,不暴露本机路径
合同额
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-033v12026-01-05欢恒318,000.00300,000.00生效变更
CT-2026-033v2(补充媒体预算)2026-06-18欢恒212,000.00200,000.00生效查看 diff
CT-2025-011v12025-01-08欢恒212,000.00200,000.00到期续约
合同变更只写新版本,历史期间已确认的收入与应收账款不被回写;续约是「建新合同 + 关联旧合同」,不是覆写原合同。
期号服务期间平台关键词单价KPI 目标 / 实际核定额状态操作
1 期2026-01-01 ~ 2026-06-30百度核心词 × 1050,000.00100 / 9849,000.00已结算结算单
2 期2026-07-01 ~ 2026-12-31百度 + 360核心词 × 850,000.0080 / ——执行中提交考核
3 期2027-01-01 ~ 2027-06-30百度待定50,000.00待定 / ——未开始编辑
按模板生成阶段 ⓘ 月度模板跨年自动展开;「20 天」按日历日计算,含起止日则 +19 天;KPI 核定 13,000 可人工核减为 12,897,不自动解析备注里的公式,须留证据附件。
结算单号期号计量方式考核额核定不含税税额含税应收审核状态操作
ST-2026-01121 期KPI 核定13,000.0012,896.23773.7713,670.00已审核查看
ST-2026-01352 期计量49,000.0049,000.002,940.0051,940.00待审审核
ST-2026-01402 期冲销reversal-1,000.00-1,000.00-60.00-1,060.00已审核原单
结算单审核后锁定;要改只能「反向冲销 + 新单」,原记录与 -1,000.00 的负向记录同时保留在历史里。
应收标题来源应收含税额已核销余额到期日日期精度逾期应收状态操作
1 期首款付款计划 30%31,800.0031,800.000.002026-03-31day0 天收清明细
1 期尾款结算 ST-011213,670.000.0013,670.002026-09-30day⚠ 6 天待收核销
2 期首款付款计划 60%60,530.000.0060,530.00unknownunknown待定待收补日期
到期日缺失的应收进入「待定」桶独立展示:既不算逾期,也不能混入「未来 30 天回款预测」。
票据号开票主体开票日类型含税额不含税税额关联应收状态
INV-2026-0031欢恒2026-03-15蓝票106,000.00100,000.006,000.001 期首款已开
INV-2026-0031-R欢恒2026-04-02红票-10,600.00-10,000.00-600.00同上(折让)已红
INV-2026-0088欢恒2026-09-10蓝票13,670.0012,896.23773.771 期尾款已开
发票状态与到账状态各自独立展示:开了票不等于收到钱,收了钱也不等于已开票。
发生月供应商类别含税金额可抵扣税范围已归属支付月状态
2026-01巨量引擎媒体消耗12,000.00679.25共享10,000 / 2 个项目2026-02已审核
2026-03百度推广媒体消耗-60.000.00直接已归属 100%—已审核
2026-06外包写手内容外包8,000.000.00直接未归属2026-07待归属
成本以发生月计入项目利润,不以付款日期计入;1 月发生 2 月付款,只扣 1 月一次。
批次号截止月规则版本累计应计累计可结算回款系数状态操作
CR-00122026-06R-v28,000.004,000.000.50已批准详情
CR-00132026-09R-v26,000.003,000.000.50试算详情
CR-00142026-10R-v2-1,000.00-500.000.50待审负调整
CR-0014 因补录成本产生 −1,000 负调整:已发放记录保留不动,系统提示「超发」由老板决定追偿还是后续抵扣。
名称类型上传者时间操作
报价表_v3.xlsx附件张三2026-01-04下载
KPI 考核表.pdf附件张三2026-07-02下载
飞书多维表格外链李四2026-01-04打开 ↗
附件走私有授权下载,服务器不暴露真实路径;敏感件(工资/票据)单独授权。
时间对象动作改前 → 改后操作人原因
2026-09-10 14:22ST-2026-0135提交审核草稿 → 待审张三提交 2 期考核
2026-09-12 09:41ST-2026-0135退回待审 → 草稿财务·王证据附件缺 KPI 截图
2026-10-06 11:07CR-0013试算— → 试算 6,000财务·王季末试算,未入账
审计日志记录前后值 + 原因 + 操作人;任何记录都不能被物理删除。
设计要点:项目详情是「一个项目的全部事实」:合同只留版本、结算只留正负两张单、成本记录发生与付款两笔、绩效留每次快照。老板点任何数字都能追到原始记录与改它的人。
回款中心
期末应收
486,300.00
截止 2026-12-31 期末余额
逾期 ⚠
74,200.00
2 笔 · 最长 6 天
未分配到账 ⚠
8,200.00
到账 40,000 已核销 31,800
未来 30 天应收
211,470.00
不含 unknown 待定项
本月已核销
132,800.00
9 笔
计划节点客户项目合同含税比例预计金额预计日期日期精度是否已生成应收
首款 30%颍尚信息SEO-1期318,000.0030%95,400.002026-01-31day是
尾款 70%颍尚信息SEO-1期318,000.0070%222,600.002026-09-30day是
2 期首款上海森朗全案代运营186,500.0060%111,900.00unknownunknown否
日期精度为 unknown 的计划单独成组,不参与未来 30 天回款预测;只有「债权成立」才生成应收。
应收标题客户收款主体应收含税已核销余额到期日逾期应收状态操作
1 期首款学而思(上海XX)上海森朗31,800.0031,800.000.002026-03-310 天收清明细
2 期尾款学而思(上海XX)上海森朗74,200.000.0074,200.002026-09-30⚠ 6 天待收核销
专项服务款嘉韵传媒欢恒50,200.0020,000.0030,200.002026-11-150 天部分收核销
应收「状态」列没有下拉框:待收 / 部分收 / 收清由「已核销金额 vs 应收金额」自动算出;逾期是独立红色标签。
应收标题客户余额到期日逾期天数最近跟进责任人操作
2 期尾款学而思(上海XX)74,200.002026-09-306 天2026-10-06 电话催收张三跟进
品牌词尾款嘉韵传媒0.002026-10-051 天—李四改期
逾期 = 到期日 < 统计日 且 余额 > 0;到期当天不算逾期,次日算 1 天。
到账日付款方己方收款主体金额银行参考号已核销未分配状态凭证操作
2026-03-12学而思(上海XX)上海森朗40,000.00ICBK8823…31,800.008,200.00已批准查看核销
2026-06-20嘉韵传媒欢恒20,000.00CMB77120…20,000.000.00已批准查看明细
2026-08-05内部转账欢恒 ⇄ 上海森朗-343,581.00内部-2026-0180.00-343,581.00已批准查看成对核销
2026-10-08涟隐科技上海森朗123,909.00ABC9912…0.00123,909.00待核验查看审批
只有「已批准」的到账才计入回款指标;待核验的流水不影响任何经营数字。内部转账成对录入并带组号,不计客户回款。
到账流水金额未分配额停留天数建议核销操作
2026-03-12 学而思 → 上海森朗40,000.008,200.00⚠ 3 天建议挂 2 期尾款 74,200查看建议
2026-10-08 涟隐 → 上海森朗123,909.00123,909.000 天待核销 / 待确认年份归属查看建议
未分配到账金额会单独进老板视野(工作台「待分配到账 ⚠」卡片):钱进了公司但还没挂到任何应收,不能当作已回款。
退款日原到账客户金额退款属性影响凭证状态
2026-09-182026-08-20涟隐科技-60.00误收退回恢复应收 reopen(不冲收入)查看已批准
2026-09-252026-06-20嘉韵传媒-10,600.00业务取消减收入 + 减应收 reduce查看已批准
退款分两类:取消业务同时减收入与应收;误收退回只恢复应收不冲收入;坏账核销走独立事件,绝不标成收清。
设计要点:回款中心只回答四个问题:还有多少钱没收、哪些已经逾期、已经到账的钱有没有全部挂出去、以及退款到底影响的是收入还是应收。所有状态列自动算值,没有手填框。
成本中心
本期成本
486,300.00
2026 年累计(含税)
已归属项目
412,540.00
按发生月归集
未归属 ⚠
12,000.00
3 笔媒体消耗待分配
公司级间接费用
61,760.00
工资 / 房租 / 社保,默认不摊项目
发生月供应商类别含税金额可抵扣税范围归属项目支付月状态
2026-01巨量引擎媒体消耗12,000.00679.25共享颍尚 SEO-1期 60% / 上海森朗 40%2026-02已审核
2026-01—工资社保50,000.000.00公司—2026-01已审核
2026-02XX 物业房租5,000.000.00公司未分摊2026-02已审核
2026-03百度推广媒体消耗-60.000.00直接SEM代投放 100%—已审核
ⓘ 工资 / 社保 / 房租默认进「公司间接费用」,只有明确分摊规则才分摊到项目。
ⓘ 成本以发生月计入项目利润,不以付款日期计入;负数保留负号,不取绝对值。
付款日付款流水号金额核销的成本(可跨月)凭证状态
2026-02-10PAY-2026-004412,000.002026-01 巨量引擎 12,000查看已批准
2026-07-15PAY-2026-02318,000.002026-06 外包写手 8,000查看已批准
① 录发生(金额/供应商/类别/发生月/凭证/范围)→ ② 录支付(付款流水核销到成本)。两者可跨月,互不覆盖。
成本含税金额可分配额发生月分配方式操作
媒体消耗(巨量引擎)10,000.0010,000.002026-01按收入 / 手填分配
内容外包8,000.008,000.002026-06按收入 / 手填分配
SEM 消耗-60.00-60.002026-03手填分配
未归属成本会让项目利润变成「暂估」,指标卡不显示「完整性已通过」;只有补齐归属或老板批准暂估,绩效才允许进入正式批次。
字典项类型默认值是否参与分摊关联项目数操作
巨量引擎供应商媒体消耗是4编辑
百度推广供应商媒体消耗是3编辑
工资社保类别公司间接费用否—编辑
房租类别公司间接费用否—编辑
设计要点:成本中心把「发生」和「付款」拆成两步:利润按发生月扣一次,现金流按付款月记一次,两者互不干扰。共享费用走人工分配,公司总成本只算一次,不会因为分摊而翻倍。
绩效中心
累计应计
286,400.00
所有批次合计
累计可结算
143,200.00
回款系数释放后
已审批
98,000.00
正式批次
已发放
86,500.00
含保留的超发部分
待发
11,500.00
待财务登记支付
超发 ⚠
-1,000.00
1 笔负调整待处理
批次号项目截止月规则版本累计应计累计可结算回款系数状态操作
CR-0012学而思 SEO-1期2026-06R-v28,000.004,000.000.50已批准支付登记 试算快照
CR-0013学而思 SEO-1期2026-09R-v26,000.003,000.000.50试算提交审批 试算快照
CR-0014学而思 SEO-2期2026-10R-v2-1,000.00-500.000.50待审审批
⚠ CR-0014 因补录成本产生 −1,000 负调整(α=回款系数后为 −500):已发放记录保留不动,系统只提示「超发」,由老板决定追偿还是后续抵扣,不自动倒扣工资。
累计应计 = max(累计毛利, 0) × 比例 × 份额;累计可结算 = 累计应计 × 回款系数;毛利基础是扣除绩效前的毛利,避免循环计算。
规则名版本生效日毛利基础计提比例释放方式追偿方式状态操作
标准提成R-v12025-01-01不含税收入 − 直接成本20%按月计提全额追偿已归档查看
标准提成R-v22026-01-01不含税收入 − 已归属直接成本20%按回款比例释放后续抵扣生效中新建版本
渠道分成R-draft待确认待确认49%(待确认)待确认待确认草稿编辑
⚠ 「渠道分成是否固定 49%」「毛利基础是否含间接费用」「超发追偿还是抵扣」尚未由老板确认 → 规则只能存草稿,只允许试算,禁止批准与发放。
计提批次项目我的份额累计应计可结算已发放待发依据
CR-0012学而思 SEO-1期60%4,800.002,400.002,400.000.00查看只读快照
CR-0013学而思 SEO-1期60%3,600.001,800.000.001,800.00查看只读快照
业务人员只能看到自己份额与计算依据快照;看不到他人绩效,也看不到工资与成本明细。
设计要点:绩效中心的每个批次都冻结一份「输入快照」:毛利多少、用的哪版规则、回款系数多少、谁占多少份额,全在快照里。规则改了不影响老批次,因此历史报表永远可以复现。
设置与数据 / 数据导入向导
1① 上传文件
2② 工作表与字段映射
3③ 预览与异常
4④ 确认导入
← 上一步 下一步 → 任意时刻都可以回退修改;回退不会丢弃已确认的映射。
拖拽或点击上传 .xlsx
原件只读留档,系统不修改你的 Excel
已上传:回款管理表_2026Q3.xlsx 文件 hash:a3f9c2…d81(重复上传会被识别)
已识别 8 个工作表
回款管理表 / 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,后续补逐笔时可替换并保留桥接对账(两份不相加)。
识别行数
19
金额合计
1,391,677.00
异常
9 项
需字典确认
5 项
坐标问题详情处理
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 与行列坐标全部留档
不会写入
银行流水、正式应收账款、会计凭证 —— 一个都不会自动生成
ⓘ 不伪造银行流水日期;月度台账不参与日级回款周期计算; 后续补录到逐笔流水时,按切换点日期替换该月台账并保留桥接对账,两份不相加。
⛔ 上传后绝不自动过账。 只有在这一步显式点了「确认导入(带 Idempotency-Key)」,数据才会以同一事务落到暂存事实; 重复提交同一 key 返回原结果,不同内容返回 409。
← 上一步 确认导入(需 Idempotency-Key) 预计写入 19 行 · 异常 9 项将一并留档
设计要点:导入向导的全部设计目标是「不让脏数据悄悄变成正式账」:年份要你选、金额性质要你选、每一行异常都要你处置、最后一步还要再点一次确认,而且全程绝不自动过账。
设置与数据 / 提醒与关账
我的待处理提醒
12
超期未处理
3
本月已关账期间
8 / 9
最近关账
2026-08

我的提醒 / 待办

类型对象到期日责任人状态操作
应收到期2 期尾款 74,2002026-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 · 无依赖客户 / 主体 / 项目 + 权限T02 合同服务结算P0 · 依赖 T01合同 → 阶段 → KPI → 收入T03 资金应收发票P0 · 依赖 T02到账 → 核销 → 未分配T04 成本与绩效P0 · 依赖 T02/T03成本归属 → 毛利 → 计提T05 报表提醒导入关账P1 · 依赖 T03/T04矩阵全度量 + 关账T01 的权限与原则必须先落地:关联查询必须校验 org_id,且这里也开始插 M9 的 hash 去重每个阶段 ≥3 组文件;阶段之间线性依赖,阶段内任务可并行。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

目标:跑通「客户 → 项目 → 合同 → 服务阶段 → KPI 考核结算 → 收入确认」主线。
对应 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全部进人工字典映射,禁止推断合并;「颖尚 / 颍尚」只提示不归一;个人收款主体与客户个人身份分开。
3yan 表「收款销售额」与「实际销售额」约 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)
D1 月成本 2 月付,1 月毛利 4,000,2 月不再扣成本发生 / 支付分离(6.6)
E共享 10,000 按 60/40 分配,公司总成本仍 10,000cost_allocation 归属拆分(3.2 / 6.6)
F补成本后绩效负调整 1,000,已付保留并提示超发绩效引擎快照 + 负向批次(4.2 / 5.4)
G关账后补录被拒,重开需审批,旧报表可复现period_close + 快照版本(3.3)
H10/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)
L10,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 以上桌面端查看

该月明细

度量:回款
+ 新增到账 + 新增成本 ⓘ 金额只读;合计由上述事实记录汇总,不可手改

核销:把到账挂到应收

到账流水:2026-03-12 学而思(上海XX)→ 上海森朗 金额 40,000.00 银行参考号 ICBK8823… 可用余额:8,200.00
应收应收金额已核销余额本次分配
1 期首款(2026-03-31)31,800.0031,800.000.00—
2 期尾款(2026-09-30)74,200.000.0074,200.008,200.00
合计106,000.0031,800.0074,200.008,200.00
本次分配合计 ≤ 可用余额 8,200.00;核销后会同步更新应收余额与状态。
确认核销取消⚠ 禁止跨客户核销;⚠ 禁止跨己方收款主体核销;提交带 version,并发冲突返回 409。

成本归属分配

成本:2026-01 巨量引擎 · 媒体消耗 10,000.00 可分配额 10,000.00
项目分配方式比例分摊金额剩余可分配
颍尚信息 / SEO-1期按收入 60%60%6,000.004,000.00
上海森朗 / 全案代运营按收入 40%40%4,000.000.00
合计—100%10,000.000.00
ⓘ 10,000 分摊后公司总成本仍是 10,000,不是 20,000:分配表里写的只是原成本的归属拆分,公司总成本不会重复加计,只是在看不同项目的利润时各算各的。
⚠ 任意时刻「各项目分摊之和 ≤ 可分配额」;剩余未分配部分留在「未归属」并标橙色。
保存分配取消分摊后只会改变项目利润归属,不改变任何现金流记录。

计提批次 · 试算快照

批次 CR-0013 项目:学而思 SEO-1期 截止 2026-09-30 规则 R-v2 状态:试算(不入账)
输入快照(只读)
不含税收入
100,000.00
直接成本
60,000.00
毛利
40,000.00 (扣除绩效前口径)
毛利基础
按项目累计毛利取 max(毛利, 0)
计算过程
步骤口径结果
① 计提基数max(累计毛利, 0) = max(40,000, 0)40,000.00
② 计提比例规则 R-v2:利润计提 20%× 20% = 8,000.00
③ 回款系数min(已核销回款 ÷ 对应应收含税, 1) = 0.50× 0.50
④ 累计应计40,000 × 20%8,000.00
⑤ 累计可结算8,000 × 0.504,000.00
按份额分行
受益人份额累计应计本次可结算状态
张三60%4,800.002,400.00待发
李四40%3,200.001,600.00待发
合计100%8,000.004,000.00—
⚠ 成本完整性:存在未归属消耗 12,000 → 仅允许试算;正式结算须财务确认成本齐全,或由老板显式批准「暂估」。
保存试算提交审批登记支付快照只读;规则变更只会影响之后的批次。