| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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;
- }
|