优化体检客户列表空数据展示

This commit is contained in:
xianyi
2025-12-18 11:41:34 +08:00
parent 32af1cc335
commit b72765695d
2 changed files with 103 additions and 98 deletions

View File

@@ -8,7 +8,7 @@ import { cls } from '../../utils/cls';
interface ExamSectionProps { interface ExamSectionProps {
filteredClients: ExamClient[]; filteredClients: ExamClient[];
selectedExamClient: ExamClient; selectedExamClient: ExamClient | undefined;
examFilterTag: (typeof EXAM_TAGS)[number]; examFilterTag: (typeof EXAM_TAGS)[number];
onFilterChange: (tag: (typeof EXAM_TAGS)[number]) => void; onFilterChange: (tag: (typeof EXAM_TAGS)[number]) => void;
onOpenModal: (id: string, tab: ExamModalTab) => void; onOpenModal: (id: string, tab: ExamModalTab) => void;
@@ -76,97 +76,104 @@ export const ExamSection = ({
</div> </div>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<div className='grid grid-cols-3 gap-3 text-sm'> {filteredClients.length === 0 ? (
{filteredClients.map((client) => { <div className='text-center text-gray-500 py-8'>
// 检查操作记录:优先使用 localStorage 记录,如果没有则使用原有逻辑 <div className='text-sm'></div>
const idCardSignInDone = isExamActionDone(client.id, 'idCardSignIn'); <div className='text-xs mt-1'></div>
const printSignDone = isExamActionDone(client.id, 'printSign'); </div>
) : (
<div className='grid grid-cols-3 gap-3 text-sm'>
{filteredClients.map((client) => {
// 检查操作记录:优先使用 localStorage 记录,如果没有则使用原有逻辑
const idCardSignInDone = isExamActionDone(client.id, 'idCardSignIn');
const printSignDone = isExamActionDone(client.id, 'printSign');
const signDone = idCardSignInDone || client.signStatus === '已登记' || client.checkedItems.includes('签到'); const signDone = idCardSignInDone || client.signStatus === '已登记' || client.checkedItems.includes('签到');
const addonCount = client.addonCount || 0; const addonCount = client.addonCount || 0;
const printDone = printSignDone || !!client.guidePrinted; const printDone = printSignDone || !!client.guidePrinted;
const openModal = (tab: ExamModalTab) => onOpenModal(client.id, tab); const openModal = (tab: ExamModalTab) => onOpenModal(client.id, tab);
return ( return (
<div <div
key={client.id} key={client.id}
role='button' role='button'
tabIndex={0} tabIndex={0}
onClick={() => openModal('detail')} onClick={() => openModal('detail')}
className={cls( className={cls(
'text-left p-3 rounded-2xl border bg-white hover:bg-gray-50 flex flex-col gap-1 cursor-pointer', 'text-left p-3 rounded-2xl border bg-white hover:bg-gray-50 flex flex-col gap-1 cursor-pointer',
selectedExamClient.id === client.id && 'border-gray-900 bg-gray-50', selectedExamClient?.id === client.id && 'border-gray-900 bg-gray-50',
)} )}
> >
<div className='flex items-center justify-between mb-1'> <div className='flex items-center justify-between mb-1'>
<span className='font-medium'>{client.name}</span> <span className='font-medium'>{client.name}</span>
<Badge>{client.level}</Badge> <Badge>{client.level}</Badge>
</div> </div>
<div className='text-xs text-gray-500 truncate'>{client.packageName}</div> <div className='text-xs text-gray-500 truncate'>{client.packageName}</div>
<div className='flex items-center justify-between text-xs text-gray-500 mt-1'> <div className='flex items-center justify-between text-xs text-gray-500 mt-1'>
<span>{client.status}</span> <span>{client.status}</span>
<span>{client.elapsed}</span> <span>{client.elapsed}</span>
</div> </div>
<div className='mt-2 flex flex-wrap gap-1 text-[11px]'> <div className='mt-2 flex flex-wrap gap-1 text-[11px]'>
<button <button
type='button' type='button'
className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1' className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1'
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
openModal('detail'); openModal('detail');
}} }}
> >
<span></span> <span></span>
</button> </button>
<button <button
type='button' type='button'
className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1' className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1'
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
openModal('sign'); openModal('sign');
}} }}
> >
<span></span> <span></span>
{signDone && <span></span>} {signDone && <span></span>}
</button> </button>
<button <button
type='button' type='button'
className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1' className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1'
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
openModal('addon'); openModal('addon');
}} }}
> >
<span></span> <span></span>
{addonCount > 0 && <span className='opacity-80'>({addonCount})</span>} {addonCount > 0 && <span className='opacity-80'>({addonCount})</span>}
</button> </button>
<button <button
type='button' type='button'
className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1' className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1'
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
openModal('print'); openModal('print');
}} }}
> >
<span></span> <span></span>
{printDone && <span></span>} {printDone && <span></span>}
</button> </button>
<button <button
type='button' type='button'
className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1' className='px-2 py-0.5 rounded-2xl border bg-white hover:bg-gray-100 flex items-center gap-1'
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
openModal('delivery'); openModal('delivery');
}} }}
> >
<span></span> <span></span>
</button> </button>
</div>
</div> </div>
</div> );
); })}
})} </div>
</div> )}
</CardContent> </CardContent>
</Card> </Card>
</div> </div>

View File

@@ -112,17 +112,15 @@ export const ExamPage = () => {
return ( return (
<> <>
{selectedExamClient && ( <ExamSection
<ExamSection filteredClients={clients}
filteredClients={clients} selectedExamClient={selectedExamClient}
selectedExamClient={selectedExamClient} examFilterTag={examFilterTag}
examFilterTag={examFilterTag} onFilterChange={setExamFilterTag}
onFilterChange={setExamFilterTag} onOpenModal={handleOpenModal}
onOpenModal={handleOpenModal} />
/>
)}
{examModalOpen && ( {examModalOpen && selectedExamClient && (
<ExamModal <ExamModal
client={selectedExamClient} client={selectedExamClient}
tab={examPanelTab} tab={examPanelTab}