forked from erp-dev/erp
5.7 KiB
5.7 KiB
2026-01-13 工作日志
今日目标
- SSE 模块重构 → Notifications 通知系统(独立分支)
- Stateflow 信号机制 + Shipment 模块开发(主分支)
已完成工作(SSE 重构分支)
A1. SSE 问题修复
- 根因:SSE 长连接占用数据库连接不释放,导致连接池耗尽
- 修复:在
sse/views.py中认证后立即connection.close() - 新增:连接超时(30分钟)、心跳超时(2分钟)、连接数上限(每商户30个)
A2. Notifications 通知系统(新模块)
-
目的:将事件发布与 SSE 渠道解耦,支持未来扩展(企业微信等)
-
文件结构:
notifications/ ├── __init__.py ├── apps.py # 渠道注册 ├── base.py # NotificationPayload + NotificationChannel 抽象基类 ├── dispatcher.py # NotificationDispatcher 分发器 ├── events.py # resource_changed(), object_event() └── channels/ └── sse.py # SSE 渠道实现 -
核心设计:
- 业务代码调用
notifications.events,不关心具体渠道 - 分发器同步调用各渠道的
send() - 各渠道自行决定同步/异步(SSE 同步放入队列,企业微信应内部 Celery)
- 新增渠道只需实现
NotificationChannel并注册
- 业务代码调用
-
配置:
SSE_ENABLED同时控制 SSE 端点和通知渠道
A3. 文档整理
-
创建:
docs/notifications.md— 后端通知接口文档docs/notifications_frontend.md— 前端 SSE 接入文档docs/sse_refactor_execute_django_ver.md— 技术方案文档
-
删除(减少心智成本):
docs/sse.mddocs/sse_event_interface.mddocs/sse_refactor.md
A4. 兼容处理
sse/events.py改为兼容层,调用会触发DeprecationWarning- 现有业务代码无需立即修改
已完成工作(主分支)
1. Stateflow 信号机制
-
文件:
stateflow/signals.py(新增) -
功能:
- 定义
process_completed信号 — 流程全部完成时触发 - 定义
state_advanced信号 — 每次状态推进时触发 sender使用content_object.__class__,支持按类型过滤- 参数包含:
process_id、business_object、content_object、last_completed_state_id、last_completed_by等
- 定义
-
文件:
stateflow/services.py(修改)- 在
advance_to_next_state中发送信号 - 添加日志记录信号发送过程
- 在
2. Shipment 模块(新建)
-
文件结构:
shipment/ ├── __init__.py ├── apps.py ├── models.py ├── admin.py └── migrations/ ├── 0001_initial.py ├── 0002_salesitem_shipment_nullable.py └── 0003_salesitem_position_remark.py -
模型:
Shipment(出货单)— 关联客户,包含多个销售品SalesItem(销售品)— 名称、数量、单位(米/件/码/个)、货位、备注、关联生产任务ID
-
设计特点:
SalesItem.shipment可空,支持"待分配"状态printing_job_id使用整数而非外键,避免模块间强依赖- 提供
get_printing_job()方法获取关联对象,带完整 type hint
3. PrintingJob 流程完成自动创建销售品
-
文件:
printing/handlers.py(新增)- 监听
process_completed信号(sender=PrintingJob) - 从指定流程节点获取"米数"参数
- 自动创建
SalesItem,关联printing_job_id
- 监听
-
文件:
printing/apps.py(修改)- 在
ready()中注册信号处理器 - 添加启动日志确认注册成功
- 在
-
配置项(settings.py + .env):
PRINTING_SALES_ITEM_SOURCE_STATE_ID = env.int('PRINTING_SALES_ITEM_SOURCE_STATE_ID') # 必须配置 PRINTING_SALES_ITEM_QUANTITY_KEY = '米数'
4. 其他修改
-
stateflow/services.py:
- 添加
logging模块导入 clone_business_object函数暂停使用(2026-01-13),抛出NotImplementedError
- 添加
-
flower/settings.py:
- 添加
'shipment'到INSTALLED_APPS - 添加销售品自动创建配置项
- 添加
架构说明
信号流程
PrintingJob 流程推进完成
↓
stateflow.services.advance_to_next_state()
↓
发送 process_completed 信号 (sender=PrintingJob)
↓
printing.handlers.on_printing_job_process_completed() 接收
↓
从指定节点获取"米数"参数
↓
创建 SalesItem(待分配出货单)
解耦设计
- stateflow 不依赖任何业务模块,只发送信号
- printing 监听信号并处理自己的业务逻辑
- shipment 被 printing 调用,但不知道调用者是谁
待办事项
SSE 重构分支
- 合并到主分支后,在测试环境启用 SSE(
SSE_ENABLED=True) - 前端实现重连逻辑
- 监控数据库连接数,确认不再泄漏
- 逐步迁移业务代码到
notifications.events
主分支
- 在
.env中配置PRINTING_SALES_ITEM_SOURCE_STATE_ID - 应用数据库迁移:
uv run python manage.py migrate shipment - 测试完整流程:推进 PrintingJob 直到完成,验证 SalesItem 创建
- 移除调试日志(生产环境前)
备注
SSE 重构分支
- SSE 模块此前因数据库连接泄漏导致线上灾难,已被禁用
- Notifications 模块设计考虑了未来 Golang 迁移和企业微信扩展
- 企业微信渠道仅有示例代码,尚未实现
主分支
- Shipment 模块是全新创建的,需要执行迁移
- 信号处理器只在流程全部完成时触发,不是每次推进
- 如果指定节点的"米数"参数不存在,会跳过创建并记录警告日志