fix: parse WhatsApp lastUpdate datetime string to ms epoch

WA list endpoints return wall-clock strings ('2026-08-01 16:39') for
lastUpdate; storing raw broke CustomerOut.last_chat_time (int) validation
-> 500 on /api/customers?channel=whatsapp. Now parsed via parse_datetime_to_ms.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-01 17:58:00 +08:00
parent a57ed57616
commit 4bfaed4693
+7 -3
View File
@@ -33,7 +33,7 @@ from collections.abc import AsyncIterator
from typing import Any
from app.scraper.base import paginate_by_cursor, paginate_by_page
from app.scraper.parsers import coerce_int_or_none, normalize_whatsapp_type
from app.scraper.parsers import coerce_int_or_none, normalize_whatsapp_type, parse_datetime_to_ms
from app.session.yunke_client import YunkeClient
__all__ = [
@@ -44,6 +44,10 @@ __all__ = [
WHATSAPP_ACCOUNTS_PATH = "/qqweb/WhatsAppUser/businessSalesList"
WHATSAPP_FRIENDS_PATH = "/qqweb/WhatsAppUser/businessFriendList"
# WhatsApp list endpoints return wall-clock strings like "2026-08-01 16:39"
# (no seconds) for lastUpdate/createTime — parse to ms epoch (naive UTC).
_WA_DATETIME_FORMATS = ["%Y-%m-%d %H:%M", "%Y-%m-%d %H:%M:%S"]
WHATSAPP_MESSAGES_PATH = "/qqweb/WhatsAppUser/chatRecords"
@@ -121,7 +125,7 @@ def _normalize_whatsapp_account(record: dict[str, Any]) -> dict[str, Any]:
"talker_count": record.get("talkerCount"),
"friend_add_num": record.get("friendAddNum"),
"is_on_job": record.get("isOnJob"),
"last_update": record.get("lastUpdate"),
"last_update": parse_datetime_to_ms(record.get("lastUpdate"), _WA_DATETIME_FORMATS),
"version": record.get("version"),
"raw_json": record,
}
@@ -254,7 +258,7 @@ def _normalize_whatsapp_friend(record: dict[str, Any]) -> dict[str, Any]:
"sale_name": record.get("salesNickName"),
"user_id": record.get("userId"),
"message_count": record.get("messageCount"),
"last_chat_time": record.get("lastUpdate"),
"last_chat_time": parse_datetime_to_ms(record.get("lastUpdate"), _WA_DATETIME_FORMATS),
"version": record.get("version"),
"raw_json": record,
}