'use client'; import * as React from 'react'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, } from '@nice/ui/components/sheet'; import { Separator } from '@nice/ui/components/separator'; import { Card, CardContent, CardHeader, CardTitle } from '@nice/ui/components/card'; import { IconBuilding, IconStarFilled, IconUsers } from '@tabler/icons-react'; import { cn } from '@nice/ui/lib/utils'; import { EliteFormData } from '@fenghuo/common'; import { DutyLevel } from '@fenghuo/common/enum'; import { useTRPC } from '@fenghuo/client'; import { useQuery } from '@tanstack/react-query'; function getDutyLevelName(level: number): string { switch (level) { case 1: return DutyLevel.PRIMARY; case 2: return DutyLevel.MIDDLE; case 3: return DutyLevel.HIGH; default: return ''; } } // 职务等级星星显示组件 function DutyLevelStars({ level }: { level: number }) { return (
{Array.from({ length: 3 }, (_, i) => ( {i < level ? ( ) : ( null )} ))}
); } // 人员信息显示组件 function PersonCard({ person, onViewDetail }: { person: { id: string; name: string; dutyName: string; dutyCode: string; dutyLevel: number; }; onViewDetail: (id: string) => void; }) { return (
onViewDetail(person.id)} >
{person.name} #{person.dutyCode}
{ person.dutyLevel > 0 && (
{getDutyLevelName(person.dutyLevel)}
) }
); } // 职业统计函数 - 计算职业内各等级人数 function getProfessionLevelStats(persons: Array<{ dutyLevel: number }>) { return persons.reduce((acc, person) => { const level = person.dutyLevel; acc[level] = (acc[level] || 0) + 1; return acc; }, {} as Record); } // 渲染职业等级统计 function renderProfessionLevelStats(levelStats: Record) { const stats: string[] = []; if (levelStats?.[3]) stats.push(`首席教练员: ${levelStats[3]}人`); if (levelStats?.[2]) stats.push(`教练员: ${levelStats[2]}人`); if (levelStats?.[1]) stats.push(`助理教练员: ${levelStats[1]}人`); return stats.length > 0 ? ( ({stats.join(', ')}) ) : null; } // 台站板块组件 function StationSection({ stationName, data, onViewDetail }: { stationName: string; data: { technicians: Array<{ id: string; name: string; dutyName: string; dutyCode: string; dutyLevel: number; }>; supervisors: Array<{ id: string; name: string; dutyName: string; dutyCode: string; dutyLevel: number; }>; operators: Array<{ id: string; name: string; dutyName: string; dutyCode: string; dutyLevel: number; }>; }; onViewDetail: (id: string) => void; }) { const totalCount = data.technicians.length + data.supervisors.length + data.operators.length; // 统计各等级人数 const allPersons = [...data.technicians, ...data.supervisors, ...data.operators]; const levelStats = allPersons.reduce((acc, person) => { const level = person.dutyLevel; acc[level] = (acc[level] || 0) + 1; return acc; }, {} as Record); return ( {stationName}
总人数: {totalCount} 人
{Object.entries(levelStats).reverse().map(([level, count]) => { if (Number(level) > 0) { return (
{getDutyLevelName(Number(level))} : {count}人
) } return null })}
{ totalCount > 0 ? ( {/* 技师 */} {data.technicians.length > 0 && (
技师 {data.technicians.length}人 {renderProfessionLevelStats(getProfessionLevelStats(data.technicians))}
{data.technicians.map((person) => ( ))}
)} {/* 领班员/台站长 */} {data.supervisors.length > 0 && (
领班员/台站长 {data.supervisors.length}人 {renderProfessionLevelStats(getProfessionLevelStats(data.supervisors))}
{data.supervisors.map((person) => ( ))}
)} {/* 值机员 */} {data.operators.length > 0 && (
值机员 {data.operators.length}人 {renderProfessionLevelStats(getProfessionLevelStats(data.operators))}
{data.operators.map((person) => ( ))}
)}
) : ( 暂无数据 ) }
); } export interface EliteSheetProps { open: boolean; onOpenChange: (open: boolean) => void; title: string; // 修改为通用标题 professionId?: string; // 可选的专业ID stationId?: string; // 可选的台站ID onViewDetail: (personId: string) => void; } export function EliteSheet({ open, onOpenChange, title, professionId, stationId, onViewDetail }: EliteSheetProps) { const trpc = useTRPC(); // 根据传入的ID动态获取数据 const { data: sheetData, isLoading } = useQuery({ ...trpc.profile.findElite.queryOptions({ professionIds: professionId ? [professionId] : undefined, stationIds: stationId ? [stationId] : undefined, page: 1, pageSize: 1000, // 获取所有数据 }), enabled: open, // 只有当Sheet打开时才获取数据 }); // 按台站分组数据 const stationData = React.useMemo(() => { const groupedByStation: Record = {}; sheetData?.data.forEach((item) => { const stationName = item.station; const parentOrganizationName = item.parentOrganization; // 使用父级组织名称和台站名称组合作为key let groupKey = ''; if (!parentOrganizationName) { groupKey = stationName; } else { groupKey = `${parentOrganizationName}/${stationName}`; } if (!groupedByStation[groupKey]) { groupedByStation[groupKey] = { sequence: item.sequence, profession: item.profession, professionId: item.professionId, // 添加专业ID station: item.station, stationId: item.stationId, // 添加台站ID parentOrganization: item.parentOrganization, technicians: [], supervisors: [], operators: [] }; } // 合并人员数据 groupedByStation[groupKey]!.technicians.push(...item.technicians); groupedByStation[groupKey]!.supervisors.push(...item.supervisors); groupedByStation[groupKey]!.operators.push(...item.operators); }); return groupedByStation; }, [sheetData?.data]); // 计算总统计信息 const totalStats = React.useMemo(() => { const allPersons = sheetData?.data.flatMap(item => [ ...item.technicians, ...item.supervisors, ...item.operators ]) || []; const totalCount = allPersons.length; const levelStats = allPersons.reduce((acc, person) => { const level = person.dutyLevel; acc[level] = (acc[level] || 0) + 1; return acc; }, {} as Record); return { totalCount, levelStats }; }, [sheetData?.data]); return ( {title} 总人数: {totalStats.totalCount} 人 {Object.entries(totalStats.levelStats).reverse().map(([level, count]) => { if (Number(level) > 0) { return ( {getDutyLevelName(Number(level))} : {count}人 ) } else { return null } })} {isLoading ? (
加载中...
) : (
{Object.entries(stationData).map(([stationName, stationInfo]) => ( ))} {Object.keys(stationData).length === 0 && (
暂无数据
)}
)}
); }