import Parse from '../../../../shared/db/parse-client.js'; import { getAllRooms, getSessionList } from './qiwe-api.service.js'; import { initNewGroupDefaults, prepareGroupListForDisplay } from './groups.service.js'; const GUID = process.env.QIWE_GUID || ''; /** 从会话列表补全群(getRoomList 为空时,群会话 sessionType=1 仍可能有数据) */ export async function syncGroupSessionsFromQiWe(): Promise<{ created: number; updated: number; skipped: number; }> { const result = { created: 0, updated: 0, skipped: 0 }; const sessions = await getSessionList(1); console.log(`[Sync] 会话列表中群会话 ${sessions.length} 个`); for (const session of sessions) { const roomId = String(session.sessionId ?? ''); if (!roomId || roomId.length < 14 || !/^\d+$/.test(roomId)) { result.skipped++; continue; } try { const query = new Parse.Query('GroupChat'); query.equalTo('roomId', roomId); query.equalTo('guid', GUID); const existing = await query.first({ useMasterKey: true }); if (existing) { existing.set('status', 'active'); await existing.save(null, { useMasterKey: true }); result.updated++; } else { const obj = new Parse.Object('GroupChat'); obj.set('roomId', roomId); obj.set('guid', GUID); obj.set('roomName', `群 ${roomId.slice(-6)}`); obj.set('status', 'active'); obj.set('memberCount', 0); initNewGroupDefaults(obj); await obj.save(null, { useMasterKey: true }); result.created++; } } catch (err: unknown) { const message = err instanceof Error ? err.message : String(err); console.warn(`[Sync] 会话群 roomId=${roomId} 写入失败: ${message}`); } } return result; } /** 一次性对齐群目录:企微群列表 + 会话 + 历史消息 */ export async function reconcileGroupCatalog(): Promise<{ rooms: { created: number; updated: number; errors: string[] }; sessions: { created: number; updated: number; skipped: number }; fromMessages: number; namesUpdated: number; }> { const rooms = await syncGroupsFromQiWe(); const sessions = await syncGroupSessionsFromQiWe(); const fromMessages = await prepareGroupListForDisplay(true); console.log( `[Sync] 群目录对齐完成 rooms+${rooms.created}/${rooms.updated} sessions+${sessions.created} messages+${fromMessages}`, ); return { rooms, sessions, fromMessages, namesUpdated: 0 }; } export async function syncGroupsFromQiWe(): Promise<{ created: number; updated: number; errors: string[]; }> { const result = { created: 0, updated: 0, errors: [] as string[] }; console.log('[Sync] 开始从企微平台拉取群列表...'); const rooms = await getAllRooms(); console.log(`[Sync] 共获取 ${rooms.length} 个群`); for (const room of rooms) { try { const query = new Parse.Query('GroupChat'); query.equalTo('roomId', room.roomId); query.equalTo('guid', GUID); const existing = await query.first({ useMasterKey: true }); if (existing) { existing.set('roomName', room.roomName); existing.set('ownerId', room.roomOwnerId); existing.set('memberCount', room.roomMemberCount); existing.set('avatarUrl', room.roomAvatarUrl); existing.set('status', 'active'); await existing.save(null, { useMasterKey: true }); result.updated++; } else { const obj = new Parse.Object('GroupChat'); obj.set('roomId', room.roomId); obj.set('guid', GUID); obj.set('roomName', room.roomName); obj.set('ownerId', room.roomOwnerId); obj.set('memberCount', room.roomMemberCount); obj.set('avatarUrl', room.roomAvatarUrl); obj.set('status', 'active'); initNewGroupDefaults(obj); await obj.save(null, { useMasterKey: true }); result.created++; } } catch (err: any) { result.errors.push(`roomId=${room.roomId}: ${err.message}`); } } console.log(`[Sync] 完成 — 新建 ${result.created}, 更新 ${result.updated}, 错误 ${result.errors.length}`); return result; }