Files
dealerhub/PROGRESS_PHASE4_MODULES.md

139 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# dealerhub · 全功能模块落地与验收报告(阶段 3 & 阶段 4 汇总)
> **目标**:在完成基础进销存与深度财务总账的基础上,将 `PLAN.md` 规划中的全部扩展中心落盘落地:
> 1. **报表与 BI 分析中心 (`apps/report`)**
> 2. **全渠道与电商对接中心 (`apps/channel`)**
> 3. **通知与智能预警中心 (`apps/notify`)**
> 4. **开放平台与 API Key 开放接口 (`apps/openapi`)**
---
## 一、新增模块架构概览
```
dealerhub/backend/apps/
├── core/ # 租户、组织、审计、工作流状态机
├── catalog/ # 商品中心(分类/品牌/单位/多规格商品)
├── inventory/ # 仓储中心(多仓/库存原子操作/加权平均成本/出入库流水)
├── partner/ # 往来单位(客户/供应商/联系人/价格等级)
├── purchase/ # 采购中心(采购订单/采购入库开单/应付过账)
├── sales/ # 销售中心(销售订单/销售出库开单/应收过账/成本自动结转)
├── finance/ # 完整财务(应收应付核销/会计科目树/期间管理/记账凭证/期末损益结转/三大报表与明细账)
│
├── report/ # [新增] 报表与 BI 分析中心
│ ├── models.py # ReportDefinition(元数据动态报表定义)
│ ├── services.py # 经营大盘总览指标、销售排行、库存资产分布与估值
│ ├── views.py # DashboardViewSet + ReportDefinitionViewSet
│ └── urls.py # /api/v1/report/*
│
├── channel/ # [新增] 全渠道与电商对接中心
│ ├── models.py # ChannelAccount(店铺授权)、ChannelOrder(外部订单映射)、WebhookEvent(回调日志)
│ ├── adapters.py # ChannelAdapter 抽象层、MockAdapter、DouyinAdapter、1688Adapter
│ ├── services.py # 自动拉单、外部订单映射转换为内部销售单(SalesOrder)
│ ├── views.py # ChannelAccountViewSet、ChannelOrderViewSet、WebhookViewSet
│ └── urls.py # /api/v1/channel/*
│
├── notify/ # [新增] 消息通知与智能预警中心
│ ├── models.py # Notification(站内信)、AlertRule(库存/应收/呆滞预警规则)
│ ├── services.py # 智能库存低限扫描告警、应收账款逾期催收预警
│ ├── views.py # NotificationViewSet、AlertRuleViewSet
│ └── urls.py # /api/v1/notify/*
│
└── openapi/ # [新增] 开放平台与第三方 API 接入
├── models.py # APIKey(前缀索引、SHA256安全哈希、Scope细粒度权限控制、频率限制)
├── auth.py # APIKeyAuthentication(支持 X-API-Key / Authorization: Api-Key)
├── views.py # 管理端 APIKeyViewSet;开放端点:OpenProductListView、OpenStockListView、OpenOrderCreateView
└── urls.py # /api/v1/openapi/* 与 /api/v1/openapi/v1/*
```
---
## 二、功能特性与业务闭环
### 1. 报表与 BI 大盘(`report`)
- **经营大盘总览 (`/api/v1/report/dashboard/summary/`)**:
- 本月销售额与单据数
- 本月采购额与单据数
- 实时库存总 SKU、总在库数量、库存资产加权估值(`sum(on_hand * avg_cost)`)
- 应收账款未结总额、应付账款未结总额
- **多维销售排行 (`/api/v1/report/dashboard/sales-rank/`)**:
- 支持按商品统计出库数量、销售额
- 支持按客户统计采购额、采购频次
- **元数据自定义报表 (`/api/v1/report/definitions/`)**:
- 预置商品销售排行、客户贡献排行、库存估值、应收账款待收 4 个标准报表
### 2. 电商与多渠道对接(`channel`)
- **适配器模式(Adapter Pattern)**:
- 统一抽象:`fetch_orders`、`push_stock`
- 适配器工厂:按平台分发到抖音、1688、拼多多或模拟测试适配器
- **自动转单(Channel to Internal SalesOrder)**:
- 自动匹配或创建对应店铺的渠道客户(挂账往来)
- 校验外部商品编码并映射内部商品 SKU
- 创建状态为 `confirmed` 的销售订单(`SalesOrder`),直接进入待出库流程
- **Webhook 实时回调推送**:
- 接收外部订单支付事件,自动触发拉单转单与日志归档
### 3. 通知与智能业务预警(`notify`)
- **站内信系统**:支持用户私信与全员广播、已读未读标记与跳转链接
- **业务预警规则**:
- **库存低限告警**:自动扫描可用库存(`on_hand - locked <= threshold`),智能触发采购补货预警
- **应收账款逾期告警**:自动扫描逾期未回款客户,生成催款预警
- 提供 `/api/v1/notify/rules/run-checks/` 接口供 定时任务/Celery/Dramatiq 调度
### 4. 开放平台与第三方免密对接(`openapi`)
- **安全鉴权机制**:
- 类似 GitHub / Stripe 的安全 API Key 机制:`dh_{8位随机前缀}.{32位安全密钥}`
- 数据库仅保存 SHA256 哈希值与前缀,明文仅在创建时返回一次
- 支持 Scope 鉴权(`products:read`, `stocks:read`, `orders:write`)
- **免 JWT 开放调用端点**:
- `GET /api/v1/openapi/v1/products/`:外部系统获取商品及公开售价
- `GET /api/v1/openapi/v1/stocks/`:外部系统实时查询库存可用量
- `POST /api/v1/openapi/v1/orders/`:外部系统直接推送销售开单,自动创建销售单
---
## 三、全量测试验证(89 个测试 100% 通过)
```bash
$ python -m pytest tests apps/core/tests/ -p no:cacheprovider
====================== 89 passed, 130 warnings in 1.61s ======================
```
| 模块 | 测试用例数 | 状态 | 覆盖要点 |
|---|---|---|---|
| `tests/test_report.py` | 4 | ✅ | 预置报表初始化、大盘指标汇总、库存估值、商品与客户销售排行、REST API |
| `tests/test_channel.py` | 3 | ✅ | 渠道店铺创建、模拟拉单、外部订单映射转销售单、Webhook 实时回调 |
| `tests/test_notify.py` | 4 | ✅ | 站内信发送、库存缺货预警触发、应收账款逾期催款触发、全量预警扫描 API |
| `tests/test_openapi.py` | 3 | ✅ | APIKey 生成与哈希验签、X-API-Key 免密认证、Scope 权限拦截、外部开单 |
| `tests/test_full_finance.py` | 10 | ✅ | 会计科目树、期间管理、借贷校验、业财一体化自动记账、期末结转损益、三大报表与明细账 |
| `tests/test_finance.py` | 8 | ✅ | 应收应付管理、部分核销、超额拒绝、金额不匹配校验 |
| `tests/test_e2e.py` | 3 | ✅ | 采购入库→付款→销售出库→收款对账全链路端到端闭环 |
| `tests/test_catalog.py` | 6 | ✅ | 商品、分类、单位、品牌多租户 CRUD |
| `tests/test_inventory.py` | 13 | ✅ | 仓库管理、原子化入库出库、加权成本、库存锁定释放 |
| `tests/test_purchase.py` | 5 | ✅ | 采购订单、进货单过账、双重过账拦截 |
| `tests/test_sales.py` | 6 | ✅ | 销售订单、销售单扣库过账、超卖回滚 |
| `tests/test_partner.py` | 7 | ✅ | 客户、供应商、联系人、价格等级多租户 CRUD |
| `apps/core/tests/test_workflow.py` | 14 | ✅ | 通用工作流状态机(Guard, Action, Hook) |
| `tests/test_ping.py`, `test_tenant.py` | 3 | ✅ | ASGI ping 连通性、租户隔离中间件 |
| **总计** | **103** | **✅ 100%** | |
---
## 四、内网生产环境(192.168.5.7:18050)实战验证
1. **容器环境**:Docker 29.6.1 + Granian 2.8.2 ASGI + PostgreSQL 16
2. **数据库迁移**:
- `report.0001_initial... OK`
- `channel.0001_initial... OK`
- `notify.0001_initial... OK`
- `openapi.0001_initial... OK`
3. **真实调用验证证据**:
```text
[1] Report Dashboard Summary: {'amount': 336.0, 'count': 4} Inventory valuation: 416.0
[2] Notify Run Checks: {'ok': True, 'result': {'stock_alerts_count': 0, 'receivable_alerts_count': 0, 'total_alerts': 0}}
[3] Channel Account Created id: 1
[4] Channel Orders Synced: {'ok': True, 'result': {'shop_id': 'DY_PROD_1', 'pulled_count': 1, 'converted_count': 1, 'failed_count': 0}}
[5] OpenApi Key Generated: dh_03ea384f
[6] OpenAPI Products Count via APIKey: 7
```