| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- 'use strict';
- const assert = require('assert');
- const fs = require('fs');
- const os = require('os');
- const path = require('path');
- const { createUnifiedTaskService } = require('../mcp/src/dashboard/unified-task-service');
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-diagnosis-actions-'));
- async function main() {
- try {
- const service = createUnifiedTaskService({
- outputsDir: tempDir,
- getConversations: () => ({ status: 'ok', data: { conversations: [] } })
- });
- const input = {
- question: '哪些客户今天必须跟进?',
- diagnosisType: 'customer-operations',
- scope: { date: '2026-07-24' },
- action: { id: 'open-customer-master', label: '打开客户主档', description: '按任务与画像完整度处理', route: '#customer-ops', priority: 'high' },
- evidence: [{ label: '画像覆盖率', value: 40, source: 'dashboard-state' }],
- dataGaps: [{ code: 'LOW_PORTRAIT_COVERAGE', label: '画像覆盖不足' }]
- };
- const created = service.createDiagnosisCandidate(input);
- assert.equal(created.status, 'ok');
- assert.equal(created.summary.created, true);
- assert.equal(created.summary.requiresPromotion, true);
- assert.match(created.data.candidate.sourceKey, /^diagnosis:/);
- const duplicate = service.createDiagnosisCandidate(input);
- assert.equal(duplicate.summary.created, false);
- assert.equal(duplicate.summary.duplicate, true);
- const firstHub = service.hub();
- assert.equal(firstHub.summary.candidates, 1);
- const candidate = firstHub.data.tasks.find(task => task.source === 'diagnosis-candidate');
- assert(candidate);
- assert.equal(candidate.actions.promote, true);
- const promoted = service.createLocalTask({
- title: candidate.title,
- priority: candidate.priority,
- evidence: candidate.evidence,
- sourceTitle: candidate.sourceTitle,
- source: candidate.source,
- sourceKey: candidate.id
- });
- assert.equal(promoted.summary.created, true);
- const prematureFeedback = service.updateDiagnosisOutcome({ taskId: promoted.data.task.id, outcome: 'effective' });
- assert.equal(prematureFeedback.status, 'error');
- const completed = await service.update({ source: 'local', taskId: promoted.data.task.id, status: 'done' });
- assert.equal(completed.status, 'ok');
- const feedback = service.updateDiagnosisOutcome({
- taskId: promoted.data.task.id,
- outcome: 'effective',
- note: '跟进任务按计划完成,复盘确认流程有效。',
- actor: 'smoke-test'
- });
- assert.equal(feedback.status, 'ok');
- assert.equal(feedback.summary.internalOnly, true);
- assert.equal(feedback.summary.customerMessageSent, false);
- const secondHub = service.hub();
- assert.equal(secondHub.summary.promotedCandidates, 1);
- assert.equal(secondHub.summary.diagnosisFeedback.candidates, 1);
- assert.equal(secondHub.summary.diagnosisFeedback.promoted, 1);
- assert.equal(secondHub.summary.diagnosisFeedback.completed, 1);
- assert.equal(secondHub.summary.diagnosisFeedback.effective, 1);
- assert.equal(secondHub.summary.diagnosisFeedback.adoptionRate, 1);
- assert.equal(secondHub.summary.diagnosisFeedback.effectivenessRate, 1);
- assert.equal(secondHub.data.tasks.find(task => task.id === candidate.id).actions.promote, false);
- const completedTask = secondHub.data.tasks.find(task => task.id === promoted.data.task.id);
- assert.equal(completedTask.diagnosisOutcome.value, 'effective');
- assert.equal(completedTask.actions.diagnosisFeedback, true);
- const candidateStore = service.readDiagnosisCandidates();
- assert(candidateStore.candidates[0].lifecycle.some(item => item.event === 'promoted'));
- assert(candidateStore.candidates[0].lifecycle.some(item => item.event === 'completed'));
- assert(candidateStore.candidates[0].lifecycle.some(item => item.event === 'outcome_recorded'));
- assert(fs.existsSync(path.join(tempDir, 'knowledge', 'diagnoses', 'action-candidates.json')));
- process.stdout.write(`${JSON.stringify({ status: 'ok', checks: 30, candidateSource: candidate.source, promotedCandidates: secondHub.summary.promotedCandidates, effectivenessRate: secondHub.summary.diagnosisFeedback.effectivenessRate }, null, 2)}\n`);
- } finally {
- fs.rmSync(tempDir, { recursive: true, force: true });
- }
- }
- main().catch(error => {
- process.stderr.write(`${error.stack || error.message}\n`);
- process.exit(1);
- });
|