Files
wish-pool/lib/categorization.ts
2025-07-19 02:47:06 +08:00

379 lines
8.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 工作痛點分類系統 - 精簡版 10 個分類
export const categories = [
{
name: "重複作業",
description: "每天遇到都在做的重工、報表、開票等例行事務",
keywords: [
"重複",
"重工",
"報表",
"開票",
"例行",
"每天",
"固定",
"重複性",
"例行公事",
"重複工作",
"日常作業",
"定期",
"週期性",
"重複操作",
"機械化",
"單調",
],
color: "#3B82F6",
bgColor: "from-blue-500/20 to-blue-600/20",
borderColor: "border-blue-400/30",
textColor: "text-blue-200",
icon: "🔄",
},
{
name: "數據混亂",
description: "資料統整困難、爆表、無法分析或視覺化",
keywords: [
"數據",
"資料",
"統整",
"爆表",
"分析",
"視覺化",
"整理",
"混亂",
"散亂",
"不一致",
"格式",
"匯入",
"匯出",
"Excel",
"CSV",
"報告",
"圖表",
],
color: "#DB2777",
bgColor: "from-pink-600/20 to-rose-700/20",
borderColor: "border-pink-500/30",
textColor: "text-pink-200",
icon: "📊",
},
{
name: "找不到資料",
description: "文件、SOP、規則等資訊難查找",
keywords: [
"找不到",
"文件",
"SOP",
"規則",
"資訊",
"查找",
"搜尋",
"文檔",
"手冊",
"說明",
"指引",
"標準",
"程序",
"知識",
"資料庫",
"檔案",
"位置",
],
color: "#F59E0B",
bgColor: "from-yellow-500/20 to-amber-600/20",
borderColor: "border-yellow-400/30",
textColor: "text-yellow-200",
icon: "🔍",
},
{
name: "流程卡關",
description: "請購、採購、維修等流程追蹤不到",
keywords: [
"流程",
"請購",
"採購",
"維修",
"追蹤",
"卡關",
"停滯",
"延遲",
"審核",
"簽核",
"申請",
"進度",
"狀態",
"追不到",
"不知道",
"等待",
],
color: "#EF4444",
bgColor: "from-red-500/20 to-rose-600/20",
borderColor: "border-red-400/30",
textColor: "text-red-200",
icon: "🚧",
},
{
name: "文件太多",
description: "表單量、會議紀錄等需人工輸入/比對",
keywords: [
"文件",
"表單",
"會議紀錄",
"人工輸入",
"比對",
"繁瑣",
"太多",
"大量",
"手動",
"輸入",
"填寫",
"紙本",
"列印",
"掃描",
"歸檔",
"整理",
],
color: "#8B5CF6",
bgColor: "from-purple-500/20 to-violet-600/20",
borderColor: "border-purple-400/30",
textColor: "text-purple-200",
icon: "📄",
},
{
name: "協作混亂",
description: "人工配置、斷線、跨部門難協調",
keywords: [
"協作",
"人工配置",
"斷線",
"跨部門",
"協調",
"溝通",
"配合",
"團隊",
"合作",
"聯繫",
"回應",
"討論",
"會議",
"同事",
"部門",
"協調",
],
color: "#10B981",
bgColor: "from-green-500/20 to-emerald-600/20",
borderColor: "border-green-400/30",
textColor: "text-green-200",
icon: "🤝",
},
{
name: "時間浪費",
description: "等資料、等簽核、等開會系統等無效率時間",
keywords: [
"時間",
"等資料",
"等簽核",
"等開會",
"無效率",
"浪費",
"等待",
"拖延",
"慢",
"效率",
"速度",
"加班",
"忙碌",
"趕工",
"deadline",
"截止",
],
color: "#F97316",
bgColor: "from-orange-500/20 to-red-600/20",
borderColor: "border-orange-400/30",
textColor: "text-orange-200",
icon: "⏰",
},
{
name: "諮詢煩重",
description: "客戶或內部常見問答人力吃緊",
keywords: [
"諮詢",
"客戶",
"內部",
"問答",
"人力吃緊",
"常見問題",
"重複問題",
"客服",
"支援",
"解答",
"回覆",
"詢問",
"疑問",
"FAQ",
"服務",
"處理",
],
color: "#0891B2",
bgColor: "from-cyan-600/20 to-teal-700/20",
borderColor: "border-cyan-500/30",
textColor: "text-cyan-300",
icon: "💬",
},
{
name: "權限不清",
description: "權限管理混亂、責任不明",
keywords: [
"權限",
"管理",
"混亂",
"責任",
"不明",
"不清楚",
"授權",
"存取",
"帳號",
"密碼",
"登入",
"角色",
"職責",
"負責人",
"歸屬",
"分工",
],
color: "#84CC16",
bgColor: "from-lime-500/20 to-green-600/20",
borderColor: "border-lime-400/30",
textColor: "text-lime-200",
icon: "🔐",
},
{
name: "系統太多",
description: "多系統操作、切換成本高",
keywords: [
"系統",
"多系統",
"切換",
"成本高",
"太多",
"太雜",
"操作",
"介面",
"平台",
"工具",
"軟體",
"應用程式",
"登入",
"帳號",
"整合",
"統一",
],
color: "#6366F1",
bgColor: "from-indigo-500/20 to-purple-600/20",
borderColor: "border-indigo-400/30",
textColor: "text-indigo-200",
icon: "💻",
},
]
export interface Wish {
id: number
title: string
currentPain: string
expectedSolution: string
expectedEffect: string
createdAt: string
}
export interface Category {
name: string
description: string
keywords: string[]
color: string
bgColor: string
borderColor: string
textColor: string
icon: string
}
// 多標籤自動分類函數 - 最多返回3個
export function categorizeWishMultiple(wish: Wish): Category[] {
const fullText = `${wish.title} ${wish.currentPain} ${wish.expectedSolution} ${wish.expectedEffect}`.toLowerCase()
const matchedCategories: Category[] = []
// 檢查每個分類,收集所有匹配的分類
categories.forEach((category) => {
const matchedKeywords = category.keywords.filter((keyword) => fullText.includes(keyword.toLowerCase()))
if (matchedKeywords.length > 0) {
matchedCategories.push({
...category,
matchScore: matchedKeywords.length, // 添加匹配分數
} as Category & { matchScore: number })
}
})
// 如果有匹配的分類按匹配分數排序並返回最多3個
if (matchedCategories.length > 0) {
return matchedCategories.sort((a, b) => (b as any).matchScore - (a as any).matchScore).slice(0, 3) // 最多3個標籤
}
// 如果沒有匹配到任何分類,返回默認分類
return [
{
name: "其他問題",
description: "未能歸類的特殊工作困擾",
keywords: [],
color: "#94A3B8",
bgColor: "from-slate-400/20 to-slate-500/20",
borderColor: "border-slate-400/40",
textColor: "text-slate-200",
icon: "❓",
},
]
}
// 保持向後兼容的單一分類函數
export function categorizeWish(wish: Wish): Category {
const categories = categorizeWishMultiple(wish)
return categories[0] // 返回最匹配的分類
}
// 獲取所有願望的分類統計(支持多標籤)
export function getCategoryStats(wishes: Wish[]) {
const stats: { [key: string]: number } = {}
// 初始化統計
categories.forEach((cat) => {
stats[cat.name] = 0
})
stats["其他問題"] = 0
// 統計每個分類的數量(多標籤計算)
wishes.forEach((wish) => {
const wishCategories = categorizeWishMultiple(wish)
wishCategories.forEach((category) => {
stats[category.name]++
})
})
return stats
}
// 獲取分類統計(用於雷達圖,避免重複計算)
export function getCategoryStatsForRadar(wishes: Wish[]) {
const stats: { [key: string]: number } = {}
// 初始化統計
categories.forEach((cat) => {
stats[cat.name] = 0
})
stats["其他問題"] = 0
// 統計每個分類的數量(每個願望只計算一次,取主要分類)
wishes.forEach((wish) => {
const primaryCategory = categorizeWish(wish)
stats[primaryCategory.name]++
})
return stats
}