2026-08-05-web-admin-order-edit-lock.md 3.2 KB

Web-Admin 订单编辑锁「查看不加锁」Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: 订单详情只读不加锁;仅写操作加锁;关闭解锁;锁 TTL 5 分钟;强制解锁可用;lockInfo 字段与前端对齐。

Architecture: DB 字段 lock_operator_id/lock_time 保持不变。CRUD 增加 TTL/force;GET 详情只读返回 lockInfo;写弹窗前后端 lock/unlock;写 API 统一校验他人未过期锁。

Tech Stack: FastAPI + SQLAlchemy、Vue3 + Element Plus、现有 web-admin 订单页。

Global Constraints

  • TTL = 300 秒(5 分钟)
  • 不改表结构
  • 不改小程序
  • lockInfo 字段:isLocked, lockBy, lockById, lockTime, isExpired
  • admin / super_admin 可 force unlock
  • Spec: docs/superpowers/specs/2026-08-05-web-admin-order-edit-lock-design.md

Task 1: CRUD TTL + force unlock

Files:

  • Modify: backend/app/crud/order.py (lock_order, unlock_order,新增辅助方法)

  • [ ] Step 1: 在 OrderCRUD 中增加常量与辅助方法,改写 lock_order/unlock_order

ORDER_EDIT_LOCK_TTL_SECONDS = 300

def is_order_lock_expired(self, order, ttl_seconds: int = ORDER_EDIT_LOCK_TTL_SECONDS) -> bool:
    if not order.lock_operator_id:
        return True
    if not order.lock_time:
        return True
    return (datetime.now() - order.lock_time).total_seconds() > ttl_seconds

def lock_order(..., ttl_seconds: int = ORDER_EDIT_LOCK_TTL_SECONDS):
    # empty / self / expired -> acquire; else ValueError with lock time

def unlock_order(..., force: bool = False):
    # force clears any; else only self; no lock -> success idempotent
  • Step 2: 本地用 Python 片段或现有测试思路验证过期判断逻辑(无强制要求新测文件时可手工跑 import)。

Task 2: admin API — 详情去自动锁 + lockInfo + 合并 unlock + 写接口校验

Files:

  • Modify: backend/app/api/admin.py

  • [ ] Step 1: 新增 _build_order_lock_info(db, order) 与 _ensure_order_write_lock(db, order, operator_id)

  • [ ] Step 2: get_order 去掉 lock_order;过期锁可顺手清空;返回统一 lockInfo

  • [ ] Step 3: 删除重复的第一个 unlock_order 路由(约 4390);保留锁定管理区唯一 unlock,接受 request: dict 含 force

  • [ ] Step 4: 写接口(adjust / assign-deliverer / assign-delivery / review-cancel / cancel / complete / force-complete)入口调用 _ensure_order_write_lock


Task 3: 前端 API + 订单页加解锁

Files:

  • Modify: web-admin/src/api/business.ts
  • Modify: web-admin/src/views/system/order/index.vue

  • [ ] Step 1: 增加 fetchOrderLock / fetchOrderUnlock

  • [ ] Step 2: 写弹窗打开前 lock;关闭/成功 unlock;详情关闭 unlock;强制解锁;beforeunload 尽力 unlock

  • [ ] Step 3: 提示条字段已对齐(lockBy/lockTime)


Task 4: 验证

  • 后端语法检查 / 关键函数冒烟
  • graphify update .(若本会话改了代码)
  • 不主动 commit(除非用户要求)