diff --git a/yunke-server/app/api/routers/organization.py b/yunke-server/app/api/routers/organization.py index dec8b56..8c4d31c 100644 --- a/yunke-server/app/api/routers/organization.py +++ b/yunke-server/app/api/routers/organization.py @@ -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) ) diff --git a/yunke-server/app/db/models.py b/yunke-server/app/db/models.py index 0b4bee7..a72e587 100644 --- a/yunke-server/app/db/models.py +++ b/yunke-server/app/db/models.py @@ -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() diff --git a/yunke-server/scripts/scrape_via_page.py b/yunke-server/scripts/scrape_via_page.py index b91f62b..7117816 100644 --- a/yunke-server/scripts/scrape_via_page.py +++ b/yunke-server/scripts/scrape_via_page.py @@ -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}")