员工岗位可重新启用;调价认空运航线;会话存档跳号补拉;陆运报价按车型列回填

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-28 19:48:47 +08:00
co-authored by Cursor
parent 2b528758b4
commit 56ba8e93b5
62 changed files with 2960 additions and 793 deletions
+78 -1
View File
@@ -226,7 +226,8 @@ class WshotoPollTests(unittest.TestCase):
self.assertTrue(out["ok"])
call = api.calls[0]
self.assertEqual(call.get("msg_time_end"), 1_800_000_000)
self.assertEqual(call.get("msg_time_start"), 1_800_000_000 - 180)
# 新群回看上限见 poll._NEW_ROOM_LOOKBACK_SEC(3600),须盖过存档延迟。
self.assertEqual(call.get("msg_time_start"), 1_800_000_000 - 3600)
def test_poll_enqueues_member_skips_seat_and_advances_seq(self) -> None:
store = MemoryMessageStore()
@@ -317,6 +318,82 @@ class WshotoPollTests(unittest.TestCase):
self.assertEqual(b, 0)
self.assertEqual(skipped, 1)
def test_room_seq_gap_backfill_keeps_dissolve(self) -> None:
"""
现网事故:增量只先到「撤回」高 seq,游标一步跳到 9899,
中间的「解散群」再也拉不回来。跳号时必须时间窗补洞再推进游标。
"""
store = MemoryMessageStore()
redis = _redis()
room = "wr_gap_dissolve"
watch_collab_room(room, redis=redis)
save_last_seq(f"room:{room}", 9892, redis=redis)
all_rows = [
{
"msgid": "m9897",
"seq": 9897,
"from": "ShiChangChang",
"room_id": room,
"msgtype": "text",
"content": "随便说一句",
"msgtime": 1_792_546_051_000,
},
{
"msgid": "m9898",
"seq": 9898,
"from": "ShiChangChang",
"room_id": room,
"msgtype": "text",
"content": "解散群",
"msgtime": 1_792_546_055_000,
},
{
"msgid": "m9899",
"seq": 9899,
"from": "ShiChangChang",
"room_id": room,
"msgtype": "revoke",
"content": "[撤回消息]",
"msgtime": 1_792_546_059_000,
},
]
class _GapApi:
def __init__(self) -> None:
self.calls: list[dict] = []
def list_group_messages(self, **kwargs):
self.calls.append(dict(kwargs))
last = int(kwargs.get("last_seq") or 0)
time_start = int(kwargs.get("msg_time_start") or 0)
# 模拟管家增量晚到:先只吐撤回;时间窗才能看到中间「解散群」。
if time_start > 0:
return [r for r in all_rows if int(r["seq"]) > last]
if last > 0:
return [r for r in all_rows if int(r["seq"]) == 9899 and int(r["seq"]) > last]
return list(all_rows)
cfg = _Cfg()
cfg.wshoto_room_gap_ms = 0
out = poll_once(
client=_GapApi(),
settings=cfg,
redis=redis,
store=store,
now=lambda: 1_792_546_100,
)
self.assertTrue(out["ok"])
self.assertGreaterEqual(out["enqueued"], 1)
self.assertEqual(load_last_seq(f"room:{room}", redis=redis), 9899)
claimed = []
while True:
item = store.claim_inbound()
if item is None:
break
claimed.append(item.message.content)
self.assertIn("解散群", claimed)
def test_watched_rooms_preferred_without_seat_userid(self) -> None:
store = MemoryMessageStore()
redis = _redis()