Initial commit
This commit is contained in:
378
lib/categorization.ts
Normal file
378
lib/categorization.ts
Normal file
@@ -0,0 +1,378 @@
|
||||
// 工作痛點分類系統 - 精簡版 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: "#EC4899",
|
||||
bgColor: "from-pink-500/20 to-rose-600/20",
|
||||
borderColor: "border-pink-400/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: "#06B6D4",
|
||||
bgColor: "from-cyan-500/20 to-teal-600/20",
|
||||
borderColor: "border-cyan-400/30",
|
||||
textColor: "text-cyan-200",
|
||||
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: "#6B7280",
|
||||
bgColor: "from-gray-500/20 to-slate-600/20",
|
||||
borderColor: "border-gray-400/30",
|
||||
textColor: "text-gray-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
|
||||
}
|
Reference in New Issue
Block a user