feat(staff): 员工列表排序对齐云客API返回顺序(list_order列+抓取记序+API按序排)

- wechat_account 加 list_order 列(云客 wxUser/list 返回顺序)
- 抓取器记录每行在API响应中的序号
- /api/accounts ORDER BY list_order(对齐云客员工列表排列)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-24 11:25:33 +08:00
parent 68f535d637
commit 804addf725
3 changed files with 16 additions and 2 deletions
+8 -1
View File
@@ -115,6 +115,7 @@ async def list_accounts(
WechatAccount.group_num.label("group_num"),
WechatAccount.is_on_job.label("is_on_job"),
WechatAccount.raw_json.label("raw_json"),
WechatAccount.list_order.label("list_order"),
)
whatsapp_q = sa.select(
WhatsappAccount.uid.label("account_id"),
@@ -127,6 +128,7 @@ async def list_accounts(
WhatsappAccount.group_num.label("group_num"),
WhatsappAccount.is_on_job.label("is_on_job"),
WhatsappAccount.raw_json.label("raw_json"),
sa.literal(None).label("list_order"),
)
if channel == "wechat":
@@ -148,7 +150,12 @@ async def list_accounts(
page_q = (
sa.select(sub)
.order_by(sub.c.channel.asc(), sub.c.account_id.asc())
.order_by(
sub.c.channel.asc(),
# list_order 优先(云客员工列表排列顺序,2026-08-24),NULL 排后
sa.nullslast(sa.cast(sub.c.list_order, sa.Integer).asc()),
sub.c.account_id.asc(),
)
.offset((page - 1) * page_size)
.limit(page_size)
)
+2
View File
@@ -166,6 +166,8 @@ class WechatAccount(Base):
last_update: Mapped[int | None] = mapped_column(BigInteger, nullable=True)
version: Mapped[str | None] = mapped_column(String(64), nullable=True)
# 云客 wxUser/list 返回顺序(对齐云客员工列表排列;NULL=未回填按 wx_id 排)
list_order: Mapped[int | None] = mapped_column(Integer, nullable=True)
raw_json: Mapped[dict[str, Any] | None] = mapped_column(JSON, nullable=True)
fetched_at: Mapped[dt.datetime] = _fetched_at()
updated_at: Mapped[dt.datetime] = _updated_at()
+6 -1
View File
@@ -1171,7 +1171,12 @@ async def scrape_accounts(cookie_str: str, max_pages: int = 100):
max_pages=max_pages,
)
records = [_normalize_wxuser_account(row) for row in rows]
records = []
for idx, row in enumerate(rows):
rec = _normalize_wxuser_account(row)
# 记录云客 API 返回顺序(对齐员工列表排列)
rec["list_order"] = idx
records.append(rec)
await _upsert_all(upsert_wechat_account, records)
total = len(records)
logger.info(f"DONE: accounts fetched={total}, upserted={total}")