# 2026-05-23 会话记忆

## 项目：tiny-erp

### 核心决策

1. **包路径确定**：`com.witsoft.erp`（不是 com.example 或 com.witsoft.tinyerp）
   - tiny 是项目别名，包名使用正式名称 erp

2. **技术栈确认**：
   - JDK 11+（不是 1.8）
   - Spring Boot 2.7.18
   - MyBatis Plus 3.5.3.1
   - PostgreSQL 14+
   - Spring Security + JWT (jjwt 0.11.5)
   - SpringDoc OpenAPI 3（不是 Knife4j）

3. **多租户方案**：ecid 字段隔离 + TenantLineHandler 自动拦截
   - 系统表（sys_*）不进行租户隔离（登录时需要查询）
   - 业务表全部需要 ecid 隔离
   - **所有表的 ecid 字段为 NOT NULL**

4. **API 设计规范**：
   - 分页列表接口使用 POST（不是 GET）
   - 请求体携带查询条件 + 分页参数
   - 统一返回格式：{code, message, data}

5. **异常处理规范**：
   - BusinessException 支持自定义错误码
   - GlobalExceptionHandler 统一处理各类异常
   - 参数校验失败返回 400 + 具体错误信息

6. **模块命名**：基础数据模块（bd）替代主数据模块（md）

### 已完成模块

| 模块 | 功能 | 状态 |
|------|------|------|
| system | 租户、用户、字典、JWT 认证 | ✅ |
| bd | 物料分类、工厂、仓库、物料 | ✅ |
| om | 销售订单、发货单（含库存扣减） | ✅ |
| mc | 采购订单 | ✅ |
| im | 库存查询、库存流水 | ✅ |

### 数据库脚本结构

```
scripts/postgresql/
├── 00-init.sql           # 数据库初始化
├── 10-system.sql         # 系统模块
├── 20-basic-data.sql     # 基础数据模块
├── 30-sales.sql          # 销售模块
├── 40-purchase.sql       # 采购模块
├── 50-inventory.sql      # 库存模块
└── 99-data.sql           # 初始化数据
```

### 默认账号

- admin / admin123 / default
- test / admin123 / default

### 待开发功能

1. 采购收货单 + 库存增加（P0）
2. 销售退货单（P1）
3. 采购申请单（P1）
4. 库存调拨（P1）
5. 库存盘点（P1）
6. 操作日志、登录日志（P1/P2）
7. 报表统计（P2）

### 关键代码位置

- JWT 工具：`framework/security/JwtUtil.java`
- 租户上下文：`framework/tenant/TenantContext.java`
- 租户拦截器：`framework/tenant/TenantLineHandlerImpl.java`
- 全局异常：`common/core/GlobalExceptionHandler.java`
- 业务异常：`common/core/BusinessException.java`

### 文档位置

- README.md：项目根目录
- 开发方案：`yangxuan/设计/01-开发方案.md`

---

> ⚠️ 2026-05-26: 当前只关注 md（主数据）和 im（库存）模块。om/mc/fin/system/home 代码已存在但不再关注。
