优化成员画像初始化状态管理,避免空群重复回扫历史窗口
- 新增成员摘要群级状态表,记录每个群的初始化状态、最近一次初始化时间、初始化窗口天数、生成摘要数量与触达成员数量 - 将成员画像群日摘要逻辑拆分为初始化模式与日常增量模式 - 首次运行且群内尚无日摘要时,自动按 bootstrap_days 回补最近已结束日期 - 初始化完成后写入群级状态:有产出记为 done,无产出记为 empty - 后续调度或手动刷新时,若群级状态已是 done/empty,则不再重复按 60 天历史窗口回扫,改为仅按日常增量窗口处理前一天数据 - 解决冷群、空群、长期低活跃群在每天定时任务中反复初始化扫描的问题,减少无意义数据库扫描与等待时间 - 调整刷新群画像逻辑,即使最近 72 小时无活跃成员,首次初始化也能先尝试补历史摘要,再决定是否需要刷新成员画像 - 初始化模式下,会把历史窗口中真正产出过日摘要的成员补充进候选刷新集合,避免只依赖最近 72 小时活跃成员导致历史初始化不完整
This commit is contained in:
@@ -236,9 +236,6 @@ class MemberContextService:
|
||||
return {"refreshed": 0, "skipped": 0, "disabled": True}
|
||||
|
||||
active_members = self._get_recent_active_members(chatroom_id)
|
||||
if not active_members:
|
||||
self.LOG.info(f"群 {chatroom_id} 最近没有满足条件的活跃成员,跳过刷新")
|
||||
return {"refreshed": 0, "skipped": 0, "disabled": False, "active_candidates": 0}
|
||||
|
||||
members = self.contacts_db.get_chatroom_member_list(chatroom_id) or []
|
||||
enabled_members = {
|
||||
@@ -257,10 +254,38 @@ class MemberContextService:
|
||||
group_digest_stats = self.digest_service.ensure_recent_group_daily_digests(chatroom_id)
|
||||
self.LOG.info(
|
||||
f"[成员交互摘要] 群日摘要批处理完成: group={chatroom_id}, "
|
||||
f"mode={group_digest_stats.get('mode', '')}, "
|
||||
f"days={group_digest_stats.get('days', 0)}, "
|
||||
f"built_daily={group_digest_stats.get('built_daily', 0)}, "
|
||||
f"touched_members={len(group_digest_stats.get('touched_members', []))}"
|
||||
)
|
||||
|
||||
candidate_map = {
|
||||
(member.get("wxid") or ""): dict(member)
|
||||
for member in active_members
|
||||
if member.get("wxid")
|
||||
}
|
||||
if group_digest_stats.get("mode") == "bootstrap":
|
||||
for wxid in group_digest_stats.get("touched_members", []):
|
||||
if not wxid or wxid in candidate_map:
|
||||
continue
|
||||
candidate_map[wxid] = {
|
||||
"wxid": wxid,
|
||||
"msg_count": 0,
|
||||
"latest_message_time": "",
|
||||
}
|
||||
self.LOG.info(
|
||||
f"[成员交互摘要] 初始化模式补充成员: group={chatroom_id}, "
|
||||
f"bootstrap_members={len(group_digest_stats.get('touched_members', []))}, "
|
||||
f"candidate_total={len(candidate_map)}"
|
||||
)
|
||||
|
||||
active_members = list(candidate_map.values())
|
||||
total = len(active_members)
|
||||
if not active_members:
|
||||
self.LOG.info(f"群 {chatroom_id} 初始化/增量后仍无可刷新成员,跳过刷新")
|
||||
return {"refreshed": 0, "skipped": 0, "disabled": False, "active_candidates": 0}
|
||||
|
||||
for index, active_member in enumerate(active_members, start=1):
|
||||
wxid = active_member.get("wxid")
|
||||
if wxid not in enabled_members:
|
||||
|
||||
Reference in New Issue
Block a user