'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 && (
暂无数据
)}
)}
);
}