# sap-learning **Repository Path**: leeyamaster/sap-learning ## Basic Information - **Project Name**: sap-learning - **Description**: SAP-inspired learning demo (MM / FI / master data) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-02 - **Last Updated**: 2026-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SAP 学习版 Mini ERP 面向程序员的教学型迷你 ERP:用一条能跑通的单据流,讲清楚 SAP 风格的 **采购到付款(P2P)** 和 **订单到收款(O2C)**,并带上库存与最简单的财务过账。 - 后端:NestJS + TypeORM + SQLite(`better-sqlite3`),零外部数据库 - 前端:Vite + React + TypeScript + Ant Design,界面为简体中文 - 不是生产系统:没有权限、没有审批流引擎、没有多账套并发控制 ## 本地运行 需要 Node.js 20+。 ```bash npm install # 终端 1:API http://127.0.0.1:43121/api npm run dev:api # 终端 2:Web http://127.0.0.1:43122 npm run dev:web ``` 也可一条命令同时拉起前后端: ```bash npm run dev ``` 第一次启动 API 时,若数据库为空会自动写入演示主数据和一条完整 happy path。 重置演示数据: ```bash npm run seed ``` 页面「业务流程导览」里也有同样的重置按钮。 SQLite 文件位于 `apps/api/data/mini-erp.sqlite`。 ## 建议学习路径 打开「业务流程导览」,按这个顺序点进去看单据、状态和关联凭证: 1. **主数据**:公司 `1000`、工厂 `1000`、库存地点 `0001/0002`,物料 / 客户 / 供应商 2. **采购申请 PR**(ME51N)→ 释放 → 转采购订单 3. **采购订单 PO**(ME21N)→ 收货入库 GR(MIGO,移动类型 101) 4. **供应商发票 VI**(MIRO,三单匹配:订单数量 ≥ 收货 ≥ 发票) 5. **销售订单 SO**(VA01)→ 发货 DN(VL01N,601,不允许负库存) 6. **客户开票 BI**(VF01) 7. **库存 MMBE** 与 **科目余额 / 会计凭证** 库里预置了一条演示链: | 步骤 | 单号 | 内容 | | --- | --- | --- | | 采购申请 | PR-0001 | 笔记本 10 台 | | 采购订单 | PO-0001 | 环球电子供应,进价 ¥4,800 | | 收货 | GR-0001 | 库存 +10,借 1401 / 贷 2203 | | 发票 | VI-0001 | 冲暂估,贷 应付 2202 ¥48,000 | | 销售订单 | SO-0001 | 华东数码 3 台,售价 ¥5,999 | | 发货 | DN-0001 | 库存 -3,借成本 6401 / 贷库存 | | 开票 | BI-0001 | 借应收 1122 / 贷收入 6001 ¥17,997 | 做完后库存应为 **7 台笔记本、金额 ¥33,600**。你可以用物料「显示器 / 无线键盘」自己再走一遍。 ## 教学规则(刻意做少、做清楚) - 不能超收:收货数量 ≤ 采购订单未清数量 - 三单匹配:发票数量 ≤ 已收货未开票数量 - 不能超发:发货数量 ≤ 销售订单未清数量 - 不允许负库存:发货时库存不足会直接拒绝 - 开票数量 ≤ 已发货未开票数量 - 每张物流过账单据都会生成 **借贷相等** 的 FI 凭证 财务科目(精简): | 科目 | 名称 | 何时用 | | --- | --- | --- | | 1401 | 库存商品 | 收货增加、发货减少 | | 2203 | 应付暂估 GR/IR | 收货贷方、发票借方 | | 2202 | 应付账款 | 供应商发票贷方 | | 6401 | 主营业务成本 | 发货借方 | | 1122 | 应收账款 | 客户开票借方 | | 6001 | 主营业务收入 | 客户开票贷方 | 库存金额按 **移动平均**:收货按采购单价入账,发货按当前库存金额 ÷ 数量结转成本。 ## 项目结构 ``` apps/api NestJS 模块:master-data / mm / sd / inventory / fi apps/web Vite React 界面 ``` 常用 API(均带 `/api` 前缀): - `GET /process/overview` 导览看板 - `POST /purchase-requisitions/:id/release|convert` - `POST /goods-receipts` `POST /vendor-invoices` - `POST /deliveries` `POST /customer-billings` - `GET /stock` `GET /trial-balance` `GET /journal-entries` - `POST /seed` 重置演示数据 ## 端口 | 服务 | 端口 | | --- | --- | | API | 43121 | | Web | 43122(已代理 `/api` → API) | Vite 与 API 已配置 CORS,分开启动即可。