| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- const assert = require('assert');
- const fs = require('fs');
- const os = require('os');
- const path = require('path');
- const { responseMonitor, isStaffMessage } = require('../mcp/src/dashboard/response-monitor-service');
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-response-monitor-'));
- const groupsDir = path.join(root, 'outputs', 'groups');
- const messagesDir = path.join(root, 'outputs', 'messages');
- fs.mkdirSync(groupsDir, { recursive: true });
- fs.mkdirSync(messagesDir, { recursive: true });
- fs.writeFileSync(path.join(groupsDir, 'confirmed-mapping.json'), JSON.stringify({
- 'room-1': { roomName: '重点客户群' },
- 'room-2': { roomName: '待同步客户群' },
- }), 'utf8');
- fs.writeFileSync(path.join(groupsDir, 'rooms-latest.json'), JSON.stringify([
- { roomId: 'room-1', roomName: '重点客户群' },
- ]), 'utf8');
- fs.writeFileSync(path.join(messagesDir, 'room-room-1-2026-07-20T10-00-00.json'), JSON.stringify([
- { msgId: 'group-1', senderId: 'customer-1', senderName: '客户甲', content: '麻烦尽快回复', timestamp: '2026-07-20T08:00:00.000Z' },
- ]), 'utf8');
- const result = responseMonitor({
- projectRoot: root,
- now: Date.parse('2026-07-20T10:00:00.000Z'),
- warningMinutes: 15,
- urgentMinutes: 60,
- selfUserIds: ['staff-1'],
- selfNames: ['客服小夏'],
- conversations: [
- {
- id: 'conversation-1',
- contactId: 'customer-1',
- displayName: '王刚',
- messages: [{ role: 'customer', content: '在吗', timestamp: '2026-07-20T09:40:00.000Z' }],
- },
- {
- id: 'conversation-2',
- contactId: 'customer-2',
- displayName: '已回复客户',
- messages: [
- { role: 'customer', content: '你好', timestamp: '2026-07-20T09:20:00.000Z' },
- { role: 'human', content: '您好', timestamp: '2026-07-20T09:22:00.000Z' },
- ],
- },
- {
- id: 'conversation-3',
- contactId: 'customer-3',
- displayName: '无需回复客户',
- handledMessageId: 'ack-1',
- messages: [{ id: 'ack-1', role: 'customer', content: '收到', timestamp: '2026-07-20T09:00:00.000Z' }],
- },
- ],
- });
- assert.strictEqual(result.summary.monitoredCustomers, 3);
- assert.strictEqual(result.summary.monitoredGroups, 2);
- assert.strictEqual(result.summary.overdue, 2);
- assert.strictEqual(result.summary.urgent, 1);
- assert.strictEqual(result.summary.warning, 1);
- assert.strictEqual(result.summary.awaitingSync, 1);
- assert.strictEqual(result.reminders[0].kind, 'group');
- assert.strictEqual(result.reminders[0].severity, 'urgent');
- assert.strictEqual(result.reminders[1].conversationId, 'conversation-1');
- assert.strictEqual(result.scope.customers[1].status, 'replied');
- assert.strictEqual(result.scope.customers[2].status, 'no_reply_needed');
- assert.strictEqual(result.scope.customers[2].waitingMinutes, 0);
- assert.strictEqual(result.scope.groups[1].status, 'awaiting_sync');
- assert.strictEqual(isStaffMessage({ senderId: 'staff-1' }, ['staff-1'], []), true);
- assert.strictEqual(isStaffMessage({ senderName: '客服小夏' }, [], ['客服小夏']), true);
- const roomMessagesDir = path.join(messagesDir, 'rooms', 'room-1');
- fs.mkdirSync(roomMessagesDir, { recursive: true });
- fs.writeFileSync(path.join(roomMessagesDir, '2-group-agent-reply.json'), JSON.stringify({
- msgId: 'group-agent-reply',
- senderId: 'staff-1',
- senderName: '客服小夏',
- fromRoomId: 'room-1',
- content: '已经收到,我们马上处理。',
- timestamp: '2026-07-20T09:00:00.000Z',
- direction: 'outbound',
- }), 'utf8');
- const repliedResult = responseMonitor({
- projectRoot: root,
- now: Date.parse('2026-07-20T10:00:00.000Z'),
- warningMinutes: 15,
- urgentMinutes: 60,
- selfUserIds: ['staff-1'],
- selfNames: ['客服小夏'],
- conversations: [],
- });
- assert.strictEqual(repliedResult.scope.groups[0].status, 'replied');
- assert.strictEqual(repliedResult.summary.overdue, 0);
- fs.rmSync(root, { recursive: true, force: true });
- console.log(JSON.stringify({
- status: 'ok',
- checks: 17,
- monitoredCustomers: result.summary.monitoredCustomers,
- monitoredGroups: result.summary.monitoredGroups,
- overdue: result.summary.overdue,
- }, null, 2));
|