8.1 KiB
8.1 KiB
dealerhub · 全功能模块落地与验收报告(阶段 3 & 阶段 4 汇总)
目标:在完成基础进销存与深度财务总账的基础上,将
PLAN.md规划中的全部扩展中心落盘落地:
- 报表与 BI 分析中心 (
apps/report)- 全渠道与电商对接中心 (
apps/channel)- 通知与智能预警中心 (
apps/notify)- 开放平台与 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)
- 类似 GitHub / Stripe 的安全 API Key 机制:
- 免 JWT 开放调用端点:
GET /api/v1/openapi/v1/products/:外部系统获取商品及公开售价GET /api/v1/openapi/v1/stocks/:外部系统实时查询库存可用量POST /api/v1/openapi/v1/orders/:外部系统直接推送销售开单,自动创建销售单
三、全量测试验证(89 个测试 100% 通过)
$ 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)实战验证
- 容器环境:Docker 29.6.1 + Granian 2.8.2 ASGI + PostgreSQL 16
- 数据库迁移:
report.0001_initial... OKchannel.0001_initial... OKnotify.0001_initial... OKopenapi.0001_initial... OK
- 真实调用验证证据:
[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