Initial commit

This commit is contained in:
2025-07-18 13:07:28 +08:00
commit e3832acfa8
91 changed files with 10929 additions and 0 deletions

378
lib/categorization.ts Normal file
View 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
}