暂时优化体检加项面板

This commit is contained in:
xianyi
2025-12-16 17:17:55 +08:00
parent 70d02b0ee9
commit 564c80d63a
2 changed files with 54 additions and 29 deletions

View File

@@ -1,6 +1,6 @@
import { useState } from 'react'; import { useEffect, useMemo, useState } from 'react';
import type { ExamClient } from '../../data/mockData'; import { searchPhysicalExamAddItem } from '../../api';
import { Button, Input } from '../ui'; import { Button, Input } from '../ui';
interface AddonTag { interface AddonTag {
@@ -15,40 +15,56 @@ interface AddonItem {
tags?: AddonTag[]; tags?: AddonTag[];
originalPrice?: string; originalPrice?: string;
currentPrice?: string; currentPrice?: string;
price?: number; // 兼容 addonOptions 结构
} }
export const ExamAddonPanel = ({ client }: { client: ExamClient }) => { export const ExamAddonPanel = () => {
// 从 client 获取加项选项数据 const [addonList, setAddonList] = useState<AddonItem[]>([]);
const addonOptions = (client['addonOptions' as keyof ExamClient] as AddonItem[] | undefined) || []; const [addonSearch, setAddonSearch] = useState('');
const addonSummary = (client['addonSummary' as keyof ExamClient] as AddonItem[] | undefined) || []; const [addonLoading, setAddonLoading] = useState(false);
const [addonError, setAddonError] = useState<string | null>(null);
// 合并数据,优先使用 addonOptions如果没有则使用 addonSummary // 拉取加项列表
const allAddons: AddonItem[] = addonOptions.length > 0 useEffect(() => {
? addonOptions.map(item => ({ const fetchList = async () => {
id: item.id || `addon_${item.name}`, setAddonLoading(true);
name: item.name, setAddonError(null);
paid: item.paid || false, try {
tags: item.tags || [], const res = await searchPhysicalExamAddItem({ item_name: addonSearch.trim() });
originalPrice: item.originalPrice || (item.price ? item.price.toFixed(2) : '0.00'), if (res.Status === 200 && Array.isArray(res.Data)) {
currentPrice: item.currentPrice || (item.price ? item.price.toFixed(2) : '0.00'), const list: AddonItem[] = res.Data.map((item) => ({
})) id: item.item_id ? String(item.item_id) : `addon_${item.item_name}`,
: addonSummary; name: item.item_name || '',
originalPrice: item.original_price !== undefined ? Number(item.original_price).toFixed(2) : '0.00',
currentPrice: item.actual_received_amount !== undefined
? Number(item.actual_received_amount).toFixed(2)
: (item.original_price !== undefined ? Number(item.original_price).toFixed(2) : '0.00'),
tags: [],
paid: false,
}));
setAddonList(list);
} else {
setAddonError(res.Message || '获取加项列表失败');
setAddonList([]);
}
} catch (err) {
console.error('获取加项列表失败', err);
setAddonError('获取加项列表失败,请稍后重试');
setAddonList([]);
} finally {
setAddonLoading(false);
}
};
fetchList();
}, [addonSearch]);
const [selectedIds, setSelectedIds] = useState<Set<string>>( const allAddons = useMemo(() => addonList, [addonList]);
new Set(allAddons.filter(item => item.paid).map(item => item.id || item.name))
); const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());
const maxSelect = 15; const maxSelect = 15;
const selectedCount = selectedIds.size; const selectedCount = selectedIds.size;
const [addonSearch, setAddonSearch] = useState(''); const filteredAddons = allAddons;
const filteredAddons = addonSearch.trim()
? allAddons.filter(item =>
item.name.toLowerCase().includes(addonSearch.toLowerCase())
)
: allAddons;
const toggleSelect = (id: string) => { const toggleSelect = (id: string) => {
if (selectedIds.has(id)) { if (selectedIds.has(id)) {
@@ -125,6 +141,15 @@ export const ExamAddonPanel = ({ client }: { client: ExamClient }) => {
{/* 加项网格 */} {/* 加项网格 */}
<div className='grid grid-cols-5 gap-3 min-h-[142px]'> <div className='grid grid-cols-5 gap-3 min-h-[142px]'>
{addonError && (
<div className='col-span-5 text-xs text-amber-600'>{addonError}</div>
)}
{addonLoading && (
<div className='col-span-5 text-xs text-gray-500'>...</div>
)}
{!addonLoading && !addonError && filteredAddons.length === 0 && (
<div className='col-span-5 text-xs text-gray-500'></div>
)}
{filteredAddons.map((item) => { {filteredAddons.map((item) => {
const id = item.id || item.name; const id = item.id || item.name;
const isSelected = selectedIds.has(id); const isSelected = selectedIds.has(id);

View File

@@ -153,7 +153,7 @@ export const ExamModal = ({ client, tab, onTabChange, onClose }: ExamModalProps)
/> />
)} )}
{tab === 'sign' && <ExamSignPanel examId={Number(client.id)} onBusyChange={setSignBusy} />} {tab === 'sign' && <ExamSignPanel examId={Number(client.id)} onBusyChange={setSignBusy} />}
{tab === 'addon' && <ExamAddonPanel client={client} />} {tab === 'addon' && <ExamAddonPanel />}
{tab === 'print' && <ExamPrintPanel client={client} />} {tab === 'print' && <ExamPrintPanel client={client} />}
{tab === 'delivery' && <ExamDeliveryPanel client={client} />} {tab === 'delivery' && <ExamDeliveryPanel client={client} />}
</div> </div>