import { useState } from "react" import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" import { rosterApi } from '../../lib/api-services' import Card from "../../components/ui/Card" import Button from "../../components/ui/Button" import { Input, Label, Select } from "../../components/ui/Input" import { AlertTriangle, Check } from "lucide-react" // ========== 绩效记录管理 ========== export default function PerformanceInfo({ employeeId, records }: { employeeId: string; records: any[] }) { const queryClient = useQueryClient() const [showForm, setShowForm] = useState(false) const [form, setForm] = useState({ period: '', periodType: 'MONTHLY' as 'MONTHLY' | 'QUARTERLY' | 'YEARLY', score: 80, grade: 'B', result: 'QUALIFIED', summary: '', improvementPlan: '', employeeAck: false, ackDate: '', reviewer: '', templateId: '' }) const [dimensionScores, setDimensionScores] = useState>({}) const { data: templates } = useQuery({ queryKey: ['performance-templates'], queryFn: () => rosterApi.performanceTemplates(), }) const createMutation = useMutation({ mutationFn: (data: any) => rosterApi.performance(employeeId, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['roster-profile'] }); setShowForm(false); setDimensionScores({}) }, }) const deleteMutation = useMutation({ mutationFn: (id: string) => rosterApi.removePerformance(employeeId, id), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['roster-profile'] }), }) const resultMap: Record = { EXCELLENT: '优秀', QUALIFIED: '合格', NEED_IMPROVE: '需改进', UNQUALIFIED: '不胜任' } // 根据得分自动计算等级和结果 const scoreToGrade = (score: number): { grade: string; result: string } => { if (score >= 90) return { grade: 'A', result: 'EXCELLENT' } if (score >= 80) return { grade: 'B', result: 'QUALIFIED' } if (score >= 60) return { grade: 'C', result: 'NEED_IMPROVE' } return { grade: 'D', result: 'UNQUALIFIED' } } const handleScoreChange = (score: number) => { const { grade, result } = scoreToGrade(score) setForm({ ...form, score, grade, result }) } const selectedTemplate = (templates || []).find((t: any) => t.id === form.templateId) const dimensions: any[] = selectedTemplate?.dimensions || [] const handleDimensionChange = (name: string, score: number) => { const updated = { ...dimensionScores, [name]: score } setDimensionScores(updated) if (dimensions.length > 0) { const totalScore = dimensions.reduce((sum: number, d: any) => { const s = updated[d.name] ?? 0 const weight = d.weight || 0 const maxScore = d.maxScore || 100 return sum + (s / maxScore) * weight * 100 }, 0) const { grade, result } = scoreToGrade(Math.round(totalScore)) setForm(prev => ({ ...prev, score: Math.round(totalScore), grade, result })) } } const handleSubmit = () => { const data: any = { ...form } if (form.templateId) { data.dimensionScores = dimensionScores } createMutation.mutate(data) } return (

绩效考核记录({records?.length || 0}条)

{showForm && (
setForm({ ...form, period: e.target.value })} placeholder={form.periodType === 'MONTHLY' ? '如 2026-07' : form.periodType === 'QUARTERLY' ? '如 2026-Q3' : '如 2026'} />
{dimensions.length > 0 ? (
考核维度(按权重计算总分)
{dimensions.map((d: any) => (
{d.name} 权重{d.weight}%
handleDimensionChange(d.name, Number(e.target.value))} placeholder={`满分${d.maxScore || 100}`} className="text-sm" />
/{d.maxScore || 100}
))}
) : ( <>
handleScoreChange(Number(e.target.value))} />
)}
setForm({ ...form, reviewer: e.target.value })} />
setForm({ ...form, summary: e.target.value })} />
setForm({ ...form, improvementPlan: e.target.value })} placeholder="如:调岗至XX岗位,培训XX技能" />
setForm({ ...form, employeeAck: e.target.checked })} />
{form.employeeAck &&
setForm({ ...form, ackDate: e.target.value })} />
}
)} {records?.length === 0 ? (
暂无绩效记录
) : records?.map((r) => (
{r.period} {resultMap[r.result] || r.result} 得分 {r.score} · 等级 {r.grade}
{r.dimensionScores && Object.keys(r.dimensionScores).length > 0 && (
{Object.entries(r.dimensionScores).map(([name, score]: [string, any]) => ( {name}: {score} ))}
)} {r.summary &&
{r.summary}
} {r.improvementPlan && (
改进计划:{r.improvementPlan}
)}
{r.employeeAck ? ( 已签字({r.ackDate?.toString().slice(0, 10)}) ) : ( 未签字 )} {r.reviewer && 考核人:{r.reviewer}}
))}
) }