4.6 KiB
派车日历自动同步现场日历 Implementation Plan
使用 executing-plans 逐项执行;需求已确认,在当前已有单据类型改动上继续,不另行拆分工作区。
Goal: 新建酸、碱、其他派车记录按起止地生成并维护一条现场记录,历史记录不补录。
Architecture: 来源开关区分历史;唯一来源关联防重复;后端行锁与同事务保存;前端自动记录只读。
Tech Stack: Python 3.9、SQLAlchemy、Pydantic v2、MySQL 5.7、Vue 3。
Task 1:先建立回归
- 新建
backend/tests/test_pl_dispatch_calendar_site_sync.py,复用现有 SQLite fixture,通过公开 CRUD 验证匹配矩阵、生命周期、历史不补录、隔离、关联保护、唯一约束与失败回滚。 - 在 backend 执行
ENV_FILE=/dev/null venv/bin/python -m pytest tests/test_pl_dispatch_calendar_site_sync.py -q,确认自动生成断言失败。
Task 2:模型、事务和迁移
- 修改
backend/app/models/pl_dispatch_calendar.py,增加site_sync_enabledsmallint 默认 0、source_record_idvarchar(64) 可空、租户来源唯一索引。 - 修改
backend/app/services/pl_dispatch_calendar_service.py:get_record(..., for_update=True)锁定来源;创建时启用新来源;同步助手按四种匹配结果原地维护现场行;更新、删除拒绝自动现场行;每次 CRUD 只提交一次且失败 rollback。 sourceRecordId仅输出,不加入可写 schema。补充现有字段集合测试。- 新建
docs/sql/migrations/2026-10-30-dispatch-calendar-site-sync.sql并同步docs/sql/shanxia2.0.sql;使用 information_schema 和 PREPARE 条件执行 ALTER,禁止历史数据 UPDATE/INSERT。 - 执行两个后端日历测试模块,确认通过。
Task 3:界面保护与验证
-
在
web-admin/scripts/test-manual-dispatch-calendar.mjs加入自动现场 fixture,验证有维护权限时详情仍无编辑/删除且显示来源提示;先运行确认失败。 -
修改
web-admin/src/api/pl/dispatch-calendar.ts的只读 Record 类型,增加sourceRecordId?: string | null。 -
修改
web-admin/src/views/pl/dispatch-calendar/ManualCalendar.vue,详情提示来源维护,隐藏关联行编辑删除;共享useManualCalendar.ts防止直接打开编辑和删除。 -
执行已有浏览器脚本、前端模型测试、受影响文件 ESLint、
pnpm build,完成代码审查。数据库迁移另按后续用户授权执行,见下方记录。 -
按后续要求调整现场卡片:单据类型以普通文字追加在路线末尾的中文括号中;复制文本隐藏起止地和备注,类型追加在产品、数量末尾。单条和同车多条浏览器回归通过。
验证结果
- 后端两个日历模块:98 项通过,包含事务故障注入、1213 有限重试及禁止提交后重放。
- 前端日历模型:13 项通过;ESLint、Stylelint 通过。
- 浏览器:Web 酸/碱/其他/现场和 H5 酸共 5 个场景通过,现场自动行的详情只读提示通过。
- Web
pnpm build通过(41.95 秒),保留已有组件命名冲突和产物大小提示。 - 代码审查已完成,死锁重试和提交后刷新边界问题已修复并回归。
- SQL 迁移已按用户授权在测试库和生产库执行并核验(MySQL 5.7.36),详见下方执行记录。后端业务回归使用 SQLite;真实 MySQL 并发仍未实测。
- 浏览器测试时钟改为固定起点后正常前进,避免冻结 Date.now 导致 Vue 嵌套点击时间戳过滤;业务页面未为测试增加特殊逻辑。
数据库执行记录(2026-10-30 北京时间 13:54)
用户明确授权在测试数据库及生产数据库执行两个 SQL,按测试后生产顺序完成。连接分别来自 backend/.env 和 backend/.env.production,未修改环境配置。
| 环境 | 数据库 | 执行前记录数 | 执行后记录数 | 原有字段及记录 | 历史同步开关 |
|---|---|---|---|---|---|
| 测试 | shanxia2.0 | 7 | 7 | 逐行比对未变 | 全部为 0 |
| 生产 | shanxia2.0 | 31 | 31 | 逐行比对未变 | 全部为 0 |
两库均成功新增 document_type、site_sync_enabled、source_record_id,并核验唯一索引 uk_dispatch_calendar_source (tenant_no, source_record_id)。未补录历史数据,未部署应用或重启服务。
执行脚本 SHA-256:
2026-10-30-dispatch-calendar-document-type.sql:7bba5867852a45d43bded641ca29e0c4a6b654159c911352fc4440deeda8456b2026-10-30-dispatch-calendar-site-sync.sql:0a6bd205d7a93253b0bae119b1ba7cbcf56c31fb3f2380a03bcdd94fa6fb5f04