feat(huya): 协作台账店铺字典·新建强校验·同买家多单 + uid 放开(迁移 0057/0058)

- 店铺字典(迁移 0057):大按钮点选 + 「新店」自定义自动登记;重命名可级联、
  停用/备注;列表行内改、详情、筛选条共用同一个 picker
- 新建强校验:订单编号/店铺/CK/礼包名/主页截图必填;贴 CK 即探针预览,
  读不到绑定角色禁止提交;礼包用工作台配置的活动 SID 现拉(浏览器缓存 + 强制刷新)
- 图片:绑定图停用、「绑定斗鱼号」下线(绑定关系改由探针读 bind_game_*),
  主页截图改为新建必填(弹窗内先传 OSS 再随表单落库)
- 同买家多单软识别:按「绑定账号 + 绑定角色」整批一次查询,列表「同买家」列 +
  详情分组,点单号直接切单
- uid 放开唯一性(迁移 0058):同一份 CK 可服务多单,原 409 冲突改为提示 + 审计
- 列表体验:序号列、搜索扩到 11 个字段、CK 状态列截断、新建弹窗放大并去滚动条
- 验证:pytest 932 passed / 6 skipped;接口冒烟 56 项全绿;tsc+eslint+build 通过
This commit is contained in:
yml2213
2026-10-16 21:29:08 +08:00
parent df8c63b829
commit aac264b639
17 changed files with 3237 additions and 155 deletions
+43 -5
View File
@@ -1033,6 +1033,45 @@ class FileAsset(Base):
)
class HuyaCollabShop(Base):
"""协作台账的**店铺字典**(新建协作单时点一下选,不用手打)。
几个取舍,改之前先看:
1. **订单里存的是店铺名字符串,不是 id**(`huya_external_orders.shop`)——
历史 Excel 数据就是文本,改成外键要动所有读写与导入。代价:改名要么级联
(`update_shop(..., rename_orders=True)`,默认开),要么只影响以后的单子;
2. **订单里出现过的店铺名会自动登记**(新建/编辑/粘贴导入都走
`ensure_shops_registered`),所以字典永远覆盖已有数据,筛选下拉不会漏;
3. **停用(`is_active=0`)≠ 删除**:只是不再出现在新建的选择里,历史订单与筛选照旧;
4. **不加乐观锁 version**:字典是十几行的低频维度,改名冲突靠审计看,不值得为它
再加一套版本号(台账订单行才需要,见 `HuyaExternalOrder`)。
"""
__tablename__ = "huya_collab_shops"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
name: Mapped[str] = mapped_column(
String(64), unique=True, nullable=False, index=True
)
# 越小越靠前(新建下拉、筛选下拉都按它排)。
sort_order: Mapped[int] = mapped_column(Integer, default=0, server_default="0")
is_active: Mapped[bool] = mapped_column(
Boolean, default=True, server_default="1", index=True
)
remark: Mapped[str] = mapped_column(String(255), default="", server_default="")
created_by: Mapped[int | None] = mapped_column(
ForeignKey("users.id"), nullable=True
)
updated_by: Mapped[int | None] = mapped_column(
ForeignKey("users.id"), nullable=True
)
created_at: Mapped[datetime] = mapped_column(UTCDateTime, default=_utcnow)
updated_at: Mapped[datetime] = mapped_column(
UTCDateTime, default=_utcnow, onupdate=_utcnow
)
class HuyaExternalOrder(Base):
"""虎牙外部 CK 协作台账(替代 Excel 多人协同表)。
@@ -1067,11 +1106,10 @@ class HuyaExternalOrder(Base):
)
# ---- 外部 CK 本体(独立于 huya_accounts)----
# uid 唯一但可空:MySQL 唯一索引允许多个 NULL,于是「先建单、后贴 CK」与
# 「一个虎牙号只能挂一单」同时成立。
uid: Mapped[str | None] = mapped_column(
String(32), unique=True, nullable=True, index=True
)
# uid 可空、**不再唯一**(2026-10-16 用户拍板):同一个买家买两件常常继续用同一份 CK,
# 唯一索引会让第二单直接插不进去(迁移 0058 把唯一索引降成普通索引)。
# 「这个虎牙号还挂在哪些单上」只作为提示与审计信息,不做约束(见设计文档 §5.6)。
uid: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
yyuid: Mapped[str] = mapped_column(String(32), default="", server_default="")
hy_username: Mapped[str] = mapped_column(String(128), default="", server_default="")
nickname: Mapped[str] = mapped_column(String(128), default="", server_default="")