你的账,是补出来的还是做出来的
ERPLITE · 开源项目
中小企业要的 ERP,可能不是功能最多的那个,而是不用月底补账的那个。
中小企业上 ERP,通常栽在三件事上:功能一堆但八成用不上;账要月底手工对一遍;想改个字段得排厂商的期。
ERPLite 想解决的不是「功能不够」,而是把「单据 → 库存 → 账」这条链做顺:审核的那一刻,账就好了。
01 它是什么
一句话:面向中小企业的轻量级 ERP,六个业务模块共用一套基座。
默认配置下数据存在一个 SQLite 文件里,dotnet run 起来就能用,装到手机上是 PWA。表结构按 [Table] 在启动时非破坏式创建,同一套接口可切 PostgreSQL / MySQL / SQL Server / Oracle / 达梦。它不是云服务,不需要按人头买账号。

登录就选账套:集团、子公司、贸易公司各一个账套,数据分开,菜单按套餐走
登录页上有句话,是这个项目所有取舍的起点:每张单据审核完,账就已经做好了。 后面每一节都可以看作这句话的注解。
02 一屏看清今天要干什么
工作台不是把数字堆满,而是回答三个问题:钱在哪、货在哪、哪张单卡住了。

经营工作台:七个指标 + 待我处理 + 在制工单,逾期项直接标红
七个指标从左到右是本月销售额、采购额、完工量、库存金额、应收未收、应付未付、在职人数。每个数字下面都带一句限定条件——「2 张订单」「逾期 2 笔」「24 个 SKU」——因为脱离口径的金额没有意义。
右边「待我处理」有 49 项,按角色分发:逾期未收款、库存低于安全线、逾期未完工工单、质检不合格待评审、报废待审批。这些不是通知,是点进去就能办的待办。
03 一张订单走完全程
销售订单页上,真正有价值的不是列表,是四列。

销售订单:发货进度、收款、毛利三列同时在一行里
发货进度按行累计,能看出「这单还差多少没发」;收款是已收金额;毛利是订单级毛利——这一列很多系统做不出来,因为它要求成本在单据发生时就已经归集好,而不是月底再算。
上方四个数字覆盖的是老板每天问的四句话:这个区间做了几张单(9 张)、成交多少(41.8 万)、几张卡在审核(2 张)、几张还没发(6 张)。
订单审核后进生产。

生产工单:缺料项数直接写在列表里,逾期交期标红
工单列表里我特意留了「缺料」这一列。缺料是车间停工最常见的原因,但多数系统要你点进去、展开、逐行看才知道缺什么。这里直接显示「2 项」,点「缺料分析」看明细——按 BOM 展开算出来的缺口,不是靠人猜。
交期逾期那一行是红的(2026-11-06 已逾期),不用等报表。
04 业财一体:账为什么能自己做好
这是整个项目最花时间、也最难被抄走的一段。

一套基座六个模块;单据审核后在同一事务内写库存台账并生成凭证。数据层按方言生成 SQL——默认 SQLite 开箱即用,生产可切 PostgreSQL
很多 ERP 也有凭证模块,但账是「事后补」的:业务做一遍,财务再做一遍,月底对不上就手工调一笔。调账的次数一多,账就没人信了。
ERPLite 的做法是把过账放进业务事务里:
- 发货单审核 → 同一事务内写库存台账、生成应收和凭证;
- 领料单审核 → 同一事务内扣库存、把材料成本转到工单;
- 任一环节失败 → 整单回滚,不会出现「货发了但账没记」。
反审核和作废同理:冲销凭证同时生成,不留手工调账的口子。
系统里不该存在「业务已经发生、但账还没记」的时间窗口。做不到这一点,业财一体就只是个说法。
票是这条链的另一头,一进一出各一条路。
销售出票。审核完的销售发票点「开具」,直接调诺诺开放平台出票,票号、PDF、OFD、XML 一起回填;红字也走接口,账上是负数,报给服务商的正数由票种表达。单据号直接当幂等键:请求超时先查一次,查到已开就回填,绝不重发——一张票开两遍,比开不出来更难收拾。没配通道的机器不会假装成功,它会明确告诉你「退回手工登记税号」。
采购收票。点「识别电子票」,选供应商开来的 PDF 或 OFD,读文字层回填票号、开票日期、价税合计、税额、税率、购销双方和开票人,再按销方名称加不含税额自动挑出对应收货单。但它不直接入库:先预填一张登记单,人核对完才落账。识别错一个数字比手工填错更隐蔽,这一步不能省。
05 六个模块,一套基座
| 模块 | 主要能力 |
|---|---|
| 销售 | 客户档案与信用占用、订单、发货、退货(行级溯源)、订单状态机与信用门禁 |
| 采购 | 供应商档案、订单、收货验收(批次/合格量)、退货、准时率与来料合格率 |
| 生产 | BOM 多层展开、MRP 缺料分析、工单与工序报工、排程、领退料、质检、委外 |
| 仓储 | 多仓多货位、库存台账与移动加权平均成本、流水、预警、盘点与调拨 |
| 人事 | 组织架构、入转离、考勤、薪资、绩效、招聘与培训 |
| 财务 | 科目凭证、应收应付与账龄、收付款核销、成本、期末结转、三大报表 |
六个模块共用的是基座上这六件事:物料主数据、编码规则、库存引擎、过账引擎、状态机、权限。
模块只管业务,不重复实现「单据怎么编号」「库存怎么扣」「审批状态怎么流转」。这就是为什么加一个模块是几百行而不是几万行。
三个对交付很关键的设计:
- 模块可插拔。装哪些模块由
appsettings的ErpModules点名,没点名的模块连同菜单、页面、服务一起撤下。客户只要销售和库存,就只装这两个,界面上不会出现一堆灰色入口。 - 客户差异不进核心。装配清单、单据动作条、字段字典三个扩展点,客户定制放私有包,升级时不用合并冲突。
- 自定义字段走数据字典。用户能维护的分类词表(付款方式、运输方式这类)不写死在页面里,改词表不用改代码。
06 库存要能回答三个问题
「还有多少」「够不够领」「在哪个货位」——库存模块的价值就在这三个问题上。

库存查询:可用量与货位同列,底部给周转率
关键在可用量 = 现存量 − 已分配。销售订单审核就占用了,所以业务员看到的「能卖多少」和仓管看到的「有多少」是同一个数,不会出现接了单才发现货被别的单占了。
界面底部还有一行:周转率 0.43 次/90 天,约 209 天周转一次。这个数不好看,但它是真话——库存系统的意义不是让数字好看,是让不好看的数字早点被看见。
07 账龄是催收的起点
应收页上有两个数最该天天看:未收总额和逾期金额。

应收账款:账龄五档 + 逾期天数,行上直接登记收款
12.2 万未收里,5.6 万已经逾期。账龄按未到期、30 天内、31–60、61–90、90 天以上分五档,每档多少笔、多少钱一目了然。
那条「31–60 天(逾 40 天)」的行是黄的,「未到期」是绿的——颜色是按逾期天数算的,不是人工标的。业务员不用自己算,打开就看见哪几笔该催了。
08 车间里的人不该为了报工跑回办公室
桌面端 124 个业务页面,手机端 38 条路由,同一个服务、同一套权限。
| 场景 | 手机上能做的 |
|---|---|
| 收货 | 扫码收货、按批次录合格量 |
| 领料 | 按工单领料、扫码出库 |
| 报工 | 工单报工、完工入库 |
| 盘点 | 扫码盘点、提交差异 |
| 查货 | 查现存量、查货位、看预警 |
| 考勤 | 打卡、请假、查工资条 |
| 审批 | 待办列表、单据审批 |
| 客户 | 客户档案、跟进记录、销售上报 |
它不是一个单独做的 App,是同一套页面在手机尺寸下的另一种排布——权限和数据范围两边完全一致。车间主任在手机上看到的,和他回办公室打开电脑看到的是同一份数据。
对中小企业来说,这一条往往比多十个报表管用:报工的人本来就在车间,让他回办公室录单,他宁可下班前一次性补——补出来的数据,时间全是假的。
09 技术栈,和几个刻意的取舍
.NET 10 · C# · Blazor WebAssembly · ASP.NET Core · SQLite / PostgreSQL · Known · AGPL-3.0
几个不是「顺手」而是「故意」的决定:
- 默认 SQLite 是为了开箱即用,生产上 PostgreSQL。默认配 SQLite,图的是「下载、解压、跑起来」三步就能看到完整系统,不用先装数据库;30–100 人的厂一年几万张单据,它也扛得住。但它是默认配置,不是生产上限:上生产时切到 PostgreSQL(开源免费,无授权成本),业务代码一行不改——SQL 全由 Known 的方言层按目标库生成,业务层没有裸 SQL,切换的动作是「改一行 Provider 配置 + 迁一次数据」,不是重写。
- AI 只出建议稿。客户来信可以解析、可以生成销售草稿单,但确认和改价必须由人完成。ERP 里一个数字错了,后面全是错的,这个责任不该交给模型。
- 单据操作条可配置。同一张订单,贸易公司只要「审核/发货」,制造企业还要「转生产」,操作条按客户装配,不写死在页面里。
10 适合谁,不适合谁
适合
30–100 人的中小制造和贸易企业;产品能拆成 BOM、钱压在库存和账期上的行业(机械加工、电子组装、五金、包装印刷、汽配二级供应商);现在用 Excel 加微信管业务、没有历史系统包袱的团队;以及想拿一套真实分层代码做参考的 .NET 开发者。
暂时不适合
需要集团合并报表和内部交易抵销的多法人集团(有多账套,但没有合并);100 人以上同时在线(默认的 SQLite 单文件写串行,生产要切 PostgreSQL);GMP 无菌、军工保密这类有专门法规文档体系的行业;零售连锁、餐饮、物流货代这些模型完全不同的业务。
几处边界还是要说清:红冲目前只做全额,部分红冲还在方案里;采购发票识别只读 PDF / OFD 的文字层,扫描件和拍照件不行,会明确提示你让供应商给电子版;开票通道按账套配置(AppKey 与销方税号),没配就退回手工登记票号;进项勾选认证和电子税务局申报仍是系统外的动作,系统管的是票面、台账,以及它与采购和应收的勾稽。
11 关于开源协议
ERPLite 用 AGPL-3.0,这一点必须说清楚,因为它比 MIT / Apache-2.0 严格:
- 自己公司内部部署、自己改,随便用,没有义务公开;
- 拿它给客户做私有化交付,也可以;
- 但如果基于它改成对外提供的 SaaS 服务,你的修改需要按 AGPL 开源。
选这个协议的理由很直接:它是一个真要拿去给企业实施的东西,不是玩具。如果谁都能闭源包装成自己的 SaaS 卖,那这套东西的维护就没有着落。
把它拿到手
OPEN SOURCE · ERPLITE
如果这套东西对你有点用,欢迎去 Gitee 点一个 Star;也欢迎提 Issue,说说你的行业和卡在哪一步。
仓库地址:https://gitee.com/known/ERPLite
运行环境:.NET 10 SDK,以及同级目录下的 Known 框架源码。一条命令启动:dotnet run --project ERPLiteWeb。
把单据、库存和账,收进同一条链。
审核的那一刻,账就是对的。

浙公网安备 33010602011771号