员工岗位可重新启用;调价认空运航线;会话存档跳号补拉;陆运报价按车型列回填
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -278,6 +278,83 @@ def _poll_by_scan_users(
|
||||
return merged
|
||||
|
||||
|
||||
def _merge_records_by_seq(
|
||||
*batches: Sequence[dict[str, Any]],
|
||||
min_seq: int = 0,
|
||||
) -> list[dict[str, Any]]:
|
||||
"""按 seq 去重合并多页;同 seq 后写覆盖。只保留 seq > min_seq。"""
|
||||
by_seq: dict[int, dict[str, Any]] = {}
|
||||
for batch in batches:
|
||||
for rec in batch or ():
|
||||
seq = _record_seq(rec)
|
||||
if seq <= min_seq:
|
||||
continue
|
||||
by_seq[seq] = dict(rec)
|
||||
return [by_seq[s] for s in sorted(by_seq)]
|
||||
|
||||
|
||||
def _backfill_room_seq_gap(
|
||||
api: WshotoOpenClient,
|
||||
*,
|
||||
room: str,
|
||||
last_seq: int,
|
||||
rows: list[dict[str, Any]],
|
||||
page_size: int,
|
||||
lookback: int,
|
||||
clock: Callable[[], float],
|
||||
) -> list[dict[str, Any]]:
|
||||
"""
|
||||
增量结果跳号时,用时间窗补中间漏掉的消息。
|
||||
|
||||
现网:游标 9892,管家增量只回撤回 9899,把「解散群」9898 永久跨过。
|
||||
若本页最小 seq > last_seq+1,再打一枪时间窗,按 seq 合并后返回。
|
||||
补洞失败则原样返回(调用方仍按本页 max 推进,故补洞要尽量成功)。
|
||||
"""
|
||||
if last_seq <= 0 or not rows:
|
||||
return rows
|
||||
page_seqs = [_record_seq(r) for r in rows if _record_seq(r) > 0]
|
||||
if not page_seqs:
|
||||
return rows
|
||||
min_page = min(page_seqs)
|
||||
if min_page <= last_seq + 1:
|
||||
return rows
|
||||
now_i = int(clock())
|
||||
window = min(max(60, int(lookback or 0)), _NEW_ROOM_LOOKBACK_SEC)
|
||||
logger.warning(
|
||||
"微盛房间增量跳号 chat=%s last=%s min_page=%s,时间窗补洞 window=%ss",
|
||||
room,
|
||||
last_seq,
|
||||
min_page,
|
||||
window,
|
||||
)
|
||||
try:
|
||||
fill = api.list_group_messages(
|
||||
userid="",
|
||||
target_id=room,
|
||||
last_seq=0,
|
||||
page_size=page_size,
|
||||
msg_time_start=now_i - window,
|
||||
msg_time_end=now_i,
|
||||
)
|
||||
except WshotoError as exc:
|
||||
logger.warning(
|
||||
"微盛房间补洞失败 chat=%s code=%s msg=%s",
|
||||
room,
|
||||
exc.code,
|
||||
exc.msg,
|
||||
)
|
||||
return rows
|
||||
merged = _merge_records_by_seq(rows, fill or [], min_seq=last_seq)
|
||||
if len(merged) > len(rows):
|
||||
logger.info(
|
||||
"微盛房间补洞成功 chat=%s added=%s total=%s",
|
||||
room,
|
||||
len(merged) - len(rows),
|
||||
len(merged),
|
||||
)
|
||||
return merged
|
||||
|
||||
|
||||
def _poll_by_rooms(
|
||||
api: WshotoOpenClient,
|
||||
*,
|
||||
@@ -341,6 +418,17 @@ def _poll_by_rooms(
|
||||
polled += 1
|
||||
if not is_room_hot(room):
|
||||
cold_polled += 1
|
||||
# 增量若跳号:管家有时先吐出撤回等高 seq,游标一步跨过中间正文
|
||||
# (现网:解散群 seq=9898 被撤回 9899 推过去后永远听不见)。跳号则时间窗补洞。
|
||||
rows = _backfill_room_seq_gap(
|
||||
api,
|
||||
room=room,
|
||||
last_seq=last,
|
||||
rows=list(rows or []),
|
||||
page_size=page_size,
|
||||
lookback=lookback,
|
||||
clock=clock,
|
||||
)
|
||||
max_seq = last
|
||||
for rec in rows:
|
||||
seq = _record_seq(rec)
|
||||
|
||||
Reference in New Issue
Block a user