Files
shanxia2.0/docs/superpowers/plans/2026-10-30-dispatch-calendar-site-sync.md
T
wuzilong fcbf8a9b65 feat: 为现场日历增加单据类型并同步派车记录,减少重复录入。
按起止地关键词生成现场出入库计划,同步来源修改和删除,保留历史记录不补录。调整卡片及复制文本的单据类型格式,并记录测试库和生产库迁移结果。
2026-10-30 14:04:24 +08:00

4.6 KiB
Raw Blame History

派车日历自动同步现场日历 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_enabled smallint 默认 0、source_record_id varchar(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:7bba5867852a45d43bded641ca29e0c4a6b654159c911352fc4440deeda8456b
  • 2026-10-30-dispatch-calendar-site-sync.sql:0a6bd205d7a93253b0bae119b1ba7cbcf56c31fb3f2380a03bcdd94fa6fb5f04