get_assignment_statistics
Analyze bug assignment statistics in Mantis Bug Tracker to track user-specific issue distributions, filter by status, and include unassigned issues for comprehensive insights.
Instructions
獲取 Mantis 問題分派統計數據,分析不同用戶的問題分派情況
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| includeUnassigned | No | 是否包含未分派問題 | |
| projectId | No | 專案 ID | |
| statusFilter | No | 狀態過濾器,只計算特定狀態的問題 |
Implementation Reference
- src/server.ts:301-400 (handler)Handler function that implements the core logic of get_assignment_statistics: fetches issues, filters by status, gathers handler users, computes per-user statistics (total, open, closed issues), handles unassigned issues.async (params) => { return withMantisConfigured("get_assignment_statistics", async () => { // 獲取問題 const issues = await mantisApi.getIssues({ projectId: params.projectId, pageSize: 1000 // 獲取大量數據用於統計 }); // 過濾問題 let filteredIssues = issues; if (params.statusFilter?.length) { filteredIssues = issues.filter(issue => params.statusFilter?.includes(issue.status.id) ); } // 建立用戶問題統計 const userMap = new Map<number, { id: number; name: string; email: string; issueCount: number; openIssues: number; closedIssues: number; issues: number[]; }>(); // 從問題中收集所有處理人ID const handlerIds = new Set<number>(); filteredIssues.forEach(issue => { if (issue.handler?.id) { handlerIds.add(issue.handler.id); } }); // 查詢每個處理人的詳細資訊並初始化統計 for (const handlerId of handlerIds) { const user = await mantisApi.getUser(handlerId); userMap.set(user.id, { id: user.id, name: user.name, email: user.email || '', issueCount: 0, openIssues: 0, closedIssues: 0, issues: [] }); } // 未分派問題統計 let unassignedCount = 0; let unassignedIssues: number[] = []; // 計算統計 filteredIssues.forEach(issue => { if (issue.handler && issue.handler.id) { const userStat = userMap.get(issue.handler.id); if (userStat) { userStat.issueCount++; userStat.issues.push(issue.id); // 根據狀態判斷是否為關閉狀態 if (issue.status.name.toLowerCase().includes('closed') || issue.status.name.toLowerCase().includes('resolved')) { userStat.closedIssues++; } else { userStat.openIssues++; } } } else if (params.includeUnassigned) { unassignedCount++; unassignedIssues.push(issue.id); } }); // 構建結果 const statistics = { totalIssues: filteredIssues.length, assignedIssues: filteredIssues.length - unassignedCount, unassignedIssues: unassignedCount, userStatistics: Array.from(userMap.values()) .filter(stat => stat.issueCount > 0) .sort((a, b) => b.issueCount - a.issueCount) }; if (params.includeUnassigned && unassignedCount > 0) { statistics.userStatistics.push({ id: 0, name: "未分派", email: "", issueCount: unassignedCount, openIssues: unassignedCount, closedIssues: 0, issues: unassignedIssues }); } return JSON.stringify(statistics, null, 2); }); }
- src/server.ts:296-300 (schema)Zod schema defining input parameters for the get_assignment_statistics tool.{ projectId: z.number().optional().describe("專案 ID"), includeUnassigned: z.boolean().default(true).describe("是否包含未分派問題"), statusFilter: z.array(z.number()).optional().describe("狀態過濾器,只計算特定狀態的問題"), },
- src/server.ts:293-401 (registration)Registration of the get_assignment_statistics tool on the MCP server.server.tool( "get_assignment_statistics", "獲取 Mantis 問題分派統計數據,分析不同用戶的問題分派情況", { projectId: z.number().optional().describe("專案 ID"), includeUnassigned: z.boolean().default(true).describe("是否包含未分派問題"), statusFilter: z.array(z.number()).optional().describe("狀態過濾器,只計算特定狀態的問題"), }, async (params) => { return withMantisConfigured("get_assignment_statistics", async () => { // 獲取問題 const issues = await mantisApi.getIssues({ projectId: params.projectId, pageSize: 1000 // 獲取大量數據用於統計 }); // 過濾問題 let filteredIssues = issues; if (params.statusFilter?.length) { filteredIssues = issues.filter(issue => params.statusFilter?.includes(issue.status.id) ); } // 建立用戶問題統計 const userMap = new Map<number, { id: number; name: string; email: string; issueCount: number; openIssues: number; closedIssues: number; issues: number[]; }>(); // 從問題中收集所有處理人ID const handlerIds = new Set<number>(); filteredIssues.forEach(issue => { if (issue.handler?.id) { handlerIds.add(issue.handler.id); } }); // 查詢每個處理人的詳細資訊並初始化統計 for (const handlerId of handlerIds) { const user = await mantisApi.getUser(handlerId); userMap.set(user.id, { id: user.id, name: user.name, email: user.email || '', issueCount: 0, openIssues: 0, closedIssues: 0, issues: [] }); } // 未分派問題統計 let unassignedCount = 0; let unassignedIssues: number[] = []; // 計算統計 filteredIssues.forEach(issue => { if (issue.handler && issue.handler.id) { const userStat = userMap.get(issue.handler.id); if (userStat) { userStat.issueCount++; userStat.issues.push(issue.id); // 根據狀態判斷是否為關閉狀態 if (issue.status.name.toLowerCase().includes('closed') || issue.status.name.toLowerCase().includes('resolved')) { userStat.closedIssues++; } else { userStat.openIssues++; } } } else if (params.includeUnassigned) { unassignedCount++; unassignedIssues.push(issue.id); } }); // 構建結果 const statistics = { totalIssues: filteredIssues.length, assignedIssues: filteredIssues.length - unassignedCount, unassignedIssues: unassignedCount, userStatistics: Array.from(userMap.values()) .filter(stat => stat.issueCount > 0) .sort((a, b) => b.issueCount - a.issueCount) }; if (params.includeUnassigned && unassignedCount > 0) { statistics.userStatistics.push({ id: 0, name: "未分派", email: "", issueCount: unassignedCount, openIssues: unassignedCount, closedIssues: 0, issues: unassignedIssues }); } return JSON.stringify(statistics, null, 2); }); } );