import React, { useEffect, useState, useCallback } from 'react'; import { StyleSheet, View, FlatList, Text, ActivityIndicator, Alert, RefreshControl, } from 'react-native'; import { SearchBar, CheckBox, Button, Overlay, ListItem } from '@rneui/themed'; import api from '../services/api'; import { getConfig } from '../services/configService'; interface Location { id: string; layer_name: string; is_occupied: boolean; is_locked: boolean; is_empty_tray: boolean; is_disabled: boolean; } const LocationScreen = () => { const [locations, setLocations] = useState([]); const [search, setSearch] = useState(''); const [loading, setLoading] = useState(true); const [selectedLocations, setSelectedLocations] = useState([]); const [isOverlayVisible, setOverlayVisible] = useState(false); const [isRefreshing, setIsRefreshing] = useState(false); const fetchData = useCallback(async (query = '') => { setLoading(true); try { const config = await getConfig(); const endpoint = (config?.apiEndpoints as any)?.getLocationList || '/api/vwed-operate-point/list'; const response = await api.get(endpoint, { params: { layer_name: query }, }); console.log('API Response:', response); // 调试日志 // API 拦截器已经处理了响应,直接使用返回的数据 const data = response as any; if (data && data.storage_locations) { setLocations(data.storage_locations); } else if (Array.isArray(data)) { setLocations(data); } else { console.warn('Unexpected response format:', data); setLocations([]); } } catch (error) { console.error(error); Alert.alert('错误', '加载库位列表失败。'); } finally { setLoading(false); } }, []); useEffect(() => { fetchData(); }, [fetchData]); const handleSearch = () => { fetchData(search); }; const handleRefresh = useCallback(async () => { setIsRefreshing(true); try { await fetchData(search); } catch (error) { console.error('刷新失败:', error); } finally { setIsRefreshing(false); } }, [fetchData, search]); const toggleSelection = (id: string) => { setSelectedLocations(prev => prev.includes(id) ? prev.filter(item => item !== id) : [...prev, id], ); }; const handleBatchUpdate = async (action: string) => { if (selectedLocations.length === 0) { Alert.alert('未选择', '请选择要操作的库位。'); return; } setOverlayVisible(false); try { const config = await getConfig(); const endpoint = (config?.apiEndpoints as any)?.batchUpdateLocation || '/api/vwed-operate-point/batch-status'; const response = await api.put(endpoint, { layer_names: selectedLocations, action: action, }); console.log('Batch Update Response:', response); // 调试日志 // API 拦截器已经处理了响应,直接使用返回的数据 const { success_count, failed_count, results } = response as any; let message = `批量操作完成:\n成功 ${success_count} 个, 失败 ${failed_count} 个。\n\n`; if (failed_count > 0) { message += '失败详情:\n'; results.forEach((res: any) => { if (!res.success) { message += `${res.layer_name}: ${res.message}\n`; } }); } Alert.alert('操作结果', message); fetchData(search); setSelectedLocations([]); } catch (error: any) { console.error(error); Alert.alert('错误', `批量操作失败: ${error.message}`); } }; const actions = [ { title: '禁用', action: 'disable' }, { title: '启用', action: 'enable' }, { title: '占用', action: 'occupy' }, { title: '释放', action: 'release' }, { title: '锁定', action: 'lock' }, { title: '解锁', action: 'unlock' }, ]; const renderItem = ({ item }: { item: Location }) => ( toggleSelection(item.id)} containerStyle={styles.checkboxContainer} checkedColor="#4CAF50" uncheckedColor="#666" /> {item.layer_name} {item.is_occupied ? '是' : '否'} {item.is_locked ? '是' : '否'} {item.is_empty_tray ? '是' : '否'} {item.is_disabled ? '是' : '否'} ); if (loading) { return ( 加载中... ); } return (