diff --git a/src/App.tsx b/src/App.tsx index 7452bbb..2ecc4f1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -270,11 +270,19 @@ export default function App() { inventoryByRegion[s.region][s.city].push(s); } - const inventoryByModel: Record> = {}; + const INVENTORY_TYPE_ORDER = ['4.5T普货', '4.5T冷链', '18T', '49T', '挂车', '其他']; + const inventoryByModelRaw: Record> = {}; for (const s of filteredInventoryStats) { - if (!inventoryByModel[s.type]) inventoryByModel[s.type] = {}; - if (!inventoryByModel[s.type][s.model]) inventoryByModel[s.type][s.model] = []; - inventoryByModel[s.type][s.model].push(s); + if (!inventoryByModelRaw[s.type]) inventoryByModelRaw[s.type] = {}; + if (!inventoryByModelRaw[s.type][s.model]) inventoryByModelRaw[s.type][s.model] = []; + inventoryByModelRaw[s.type][s.model].push(s); + } + const inventoryByModel: Record> = {}; + for (const t of INVENTORY_TYPE_ORDER) { + if (inventoryByModelRaw[t]) inventoryByModel[t] = inventoryByModelRaw[t]; + } + for (const t of Object.keys(inventoryByModelRaw)) { + if (!inventoryByModel[t]) inventoryByModel[t] = inventoryByModelRaw[t]; } // Derived data for dept section @@ -297,13 +305,20 @@ export default function App() { const uniqueDepts = Array.from(new Set(customerData.map((s) => s.department).filter(Boolean))); const uniqueRegions = Array.from(new Set(customerData.map((s) => s.region))); const uniqueCities = Array.from(new Set(customerData.map((s) => s.city).filter(Boolean))); + const uniqueCustomerNames = Array.from(new Set(customerData.map((s) => s.customer).filter(Boolean))); + const uniqueCustomerManagers = Array.from(new Set(customerData.map((s) => s.manager).filter(Boolean))); + const uniqueInventoryModels = Array.from(new Set(inventoryData.map((s) => s.model).filter(Boolean))); + const uniqueModalPlates = Array.from(new Set(modalVehicles.map(v => v.plateNumber || v.vin).filter(Boolean))); + const uniqueModalModels = Array.from(new Set(modalVehicles.map(v => v.model).filter(Boolean))); + const uniqueModalBrands = Array.from(new Set(modalVehicles.map(v => v.brandLabel).filter((x): x is string => Boolean(x)))); + const uniqueModalLocations = Array.from(new Set(modalVehicles.map(v => v.location).filter(Boolean))); // Derived data for region section const filteredRegionData = regionData.filter((r) => !regionFilters.region || r.region === regionFilters.region); // Filtered modal vehicles based on modal filters const filteredModalVehicles = modalVehicles.filter((v) => { - const mp = !modalFilters.plateNumber || v.plateNumber.toLowerCase().includes(modalFilters.plateNumber.toLowerCase()); + const mp = !modalFilters.plateNumber || v.plateNumber.toLowerCase().includes(modalFilters.plateNumber.toLowerCase()) || v.vin.toLowerCase().includes(modalFilters.plateNumber.toLowerCase()); const mm = !modalFilters.model || v.model.toLowerCase().includes(modalFilters.model.toLowerCase()); const mb = !modalFilters.brand || (v.brandLabel || '').toLowerCase().includes(modalFilters.brand.toLowerCase()); const ml = !modalFilters.location || v.location.toLowerCase().includes(modalFilters.location.toLowerCase()); @@ -1003,59 +1018,75 @@ export default function App() {
- + className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" + /> + + {uniqueInventoryRegions.map(r =>
- + className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" + /> + + {uniqueInventoryCities.map(c =>
- + className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" + /> + + {uniqueInventoryBrands.map(b =>
- + className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" + /> + + {uniqueInventoryBatches.map(b =>
setInventoryFilters({...inventoryFilters, model: e.target.value})} className="w-full text-xs bg-white border border-slate-200 rounded-lg pl-7 pr-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> + + {uniqueInventoryModels.map(m =>
@@ -1410,17 +1441,20 @@ export default function App() { {deptViewMode === 'manager' && (
- setSelectedManager(e.target.value || 'All')} + className="w-full pl-9 pr-8 py-1.5 bg-white border border-gray-200 rounded-lg text-xs focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm font-bold text-gray-700" + /> + {allManagersList.map(m => ( - +
)} @@ -1921,38 +1955,48 @@ export default function App() {
- setRegionFilters(prev => ({ ...prev, customer: e.target.value }))} /> + + {uniqueCustomerNames.map(c =>
- + /> + + {uniqueRegions.map(r =>
- + /> + + {uniqueCities.map(c =>
@@ -2221,13 +2265,17 @@ export default function App() {
- setCustomerFilters(prev => ({ ...prev, customer: e.target.value }))} /> + + {uniqueCustomerNames.map(c =>
@@ -2235,49 +2283,62 @@ export default function App() {
- setCustomerFilters(prev => ({ ...prev, manager: e.target.value }))} /> + + {uniqueCustomerManagers.map(m =>
- + /> + + {uniqueBrands.map(b =>
- + /> + + {uniqueDepts.map(d =>
- + /> + + {uniqueRegions.map(r =>
@@ -2567,12 +2628,16 @@ export default function App() {
setModalFilters({...modalFilters, plateNumber: e.target.value})} placeholder="搜索车牌..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> + + {uniqueModalPlates.map(p =>
@@ -2580,12 +2645,16 @@ export default function App() {
setModalFilters({...modalFilters, model: e.target.value})} placeholder="搜索车型..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> + + {uniqueModalModels.map(m =>
@@ -2593,12 +2662,16 @@ export default function App() {
setModalFilters({...modalFilters, brand: e.target.value})} placeholder="搜索品牌..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> + + {uniqueModalBrands.map(b =>
@@ -2606,12 +2679,16 @@ export default function App() {
setModalFilters({...modalFilters, location: e.target.value})} placeholder="搜索所在地..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> + + {uniqueModalLocations.map(l =>
@@ -2701,7 +2778,7 @@ export default function App() { {v.type} {v.subjectOrg || '—'} {v.customerName || '—'} - {v.plateNumber} + {v.plateNumber || v.vin || '—'} ) : ( <> - {v.plateNumber} + {v.plateNumber || v.vin || '—'} {showPlateNumbers.source !== 'asset' && ( {v.customerName || '—'} )}