import { MagnifyingGlassIcon } from "@heroicons/react/24/outline"; import { Button, DatePicker, Form, Input, Modal, Select, AutoComplete, Tag, Dropdown, Space, } from "antd"; import { useCallback, useEffect, useState, useRef } from "react"; import _ from "lodash"; import { useMainContext } from "../layout/MainProvider"; import DeviceTable from "./devicetable/page"; import DeviceModal from "./devicemodal/page"; import React from "react"; import { SearchOutlined, ReloadOutlined, PlusOutlined, ImportOutlined, ExportOutlined, UpOutlined, DownOutlined, HistoryOutlined, CloseOutlined, } from "@ant-design/icons"; import DepartmentSelect from "@web/src/components/models/department/department-select"; import SystemTypeSelect from "@web/src/app/main/devicepage/select/System-select"; import DeviceTypeSelect from "@web/src/app/main/devicepage/select/Device-select"; import dayjs from "dayjs"; import FixTypeSelect from "./select/Fix-select"; import { api } from "@nice/client"; const { RangePicker } = DatePicker; // 添加筛选条件类型 type SearchCondition = { deletedAt: null; systemType?: string; deviceType?: string; deptId?: string; responsiblePerson?: { contains: string }; createdAt?: { gte: string; lte: string; }; }; // 搜索历史类型 type SearchHistory = { id: string; keyword: string; conditions: SearchCondition; timestamp: number; label: string; // 用于显示的标签 }; export default function DeviceMessage() { const { form, formValue, setFormValue, setVisible, setSearchValue, editingRecord, } = useMainContext(); // 控制展开/收起状态 const [expanded, setExpanded] = useState(false); // 添加所有筛选条件的状态 const [selectedSystem, setSelectedSystem] = useState(null); const [selectedDeviceType, setSelectedDeviceType] = useState( null ); const [selectedDept, setSelectedDept] = useState(null); // 修改为日期范围 const [dateRange, setDateRange] = useState< [dayjs.Dayjs | null, dayjs.Dayjs | null] | null >(null); const [ipAddress, setIpAddress] = useState(""); const [macAddress, setMacAddress] = useState(""); const [serialNumber, setSerialNumber] = useState(""); const [assetNumber, setAssetNumber] = useState(""); const [manufacturer, setManufacturer] = useState(""); const [model, setModel] = useState(""); const [location, setLocation] = useState(""); const [status, setStatus] = useState(null); const [selectedSystemTypeId, setSelectedSystemTypeId] = useState(""); const [selectedFixType, setSelectedFixType] = useState(null); // 搜索历史相关状态 const [searchHistory, setSearchHistory] = useState([]); const [searchKeyword, setSearchKeyword] = useState(""); const [showHistory, setShowHistory] = useState(false); // 创建ref以访问DeviceTable内部方法 const tableRef = useRef(null); // 存储选中行的状态 const [selectedKeys, setSelectedKeys] = useState([]); const [selectedData, setSelectedData] = useState([]); // 添加数据查询以获取名称信息 const { data: systemTypeTerms } = api.term.findMany.useQuery({ where: { taxonomy: { slug: "system_type" }, deletedAt: null }, orderBy: { order: "asc" }, }); const { data: deviceTypeTerms } = api.term.findMany.useQuery({ where: { taxonomy: { slug: "device_type" }, deletedAt: null }, orderBy: { order: "asc" }, }); const { data: departments } = api.department.findMany.useQuery({ where: { deletedAt: null }, }); // 根据ID获取名称的辅助函数 const getSystemTypeName = (id: string) => { const term = systemTypeTerms?.find((t) => t.id === id); return term?.name || id; }; const getDeviceTypeName = (id: string) => { const term = deviceTypeTerms?.find((t) => t.id === id); return term?.name || id; }; const getDepartmentName = (id: string) => { const dept = departments?.find((d) => d.id === id); return dept?.name || id; }; // 初始化时加载搜索历史 useEffect(() => { const savedHistory = localStorage.getItem("device-search-history"); if (savedHistory) { try { setSearchHistory(JSON.parse(savedHistory)); } catch (error) { console.error("加载搜索历史失败:", error); } } }, []); // 保存搜索历史到localStorage const saveSearchHistory = (history: SearchHistory[]) => { localStorage.setItem("device-search-history", JSON.stringify(history)); setSearchHistory(history); }; // 生成搜索标签 - 修改为显示名称而不是ID,并支持日期范围 const generateSearchLabel = ( conditions: SearchCondition, keyword: string ) => { const parts = []; if (keyword) parts.push(`关键词: ${keyword}`); if (conditions.systemType) parts.push(`网系: ${getSystemTypeName(conditions.systemType)}`); if (conditions.deviceType) parts.push(`故障类型: ${getDeviceTypeName(conditions.deviceType)}`); if (conditions.deptId) parts.push(`单位: ${getDepartmentName(conditions.deptId)}`); if (conditions.createdAt) { const startDate = dayjs(conditions.createdAt.gte).format("YYYY-MM-DD"); const endDate = dayjs(conditions.createdAt.lte).format("YYYY-MM-DD"); if (startDate === endDate) { parts.push(`日期: ${startDate}`); } else { parts.push(`日期: ${startDate} ~ ${endDate}`); } } return parts.length > 0 ? parts.join(" | ") : "全部故障"; }; // 添加搜索历史 const addSearchHistory = ( conditions: SearchCondition, keyword: string = "" ) => { const newHistory: SearchHistory = { id: Date.now().toString(), keyword, conditions, timestamp: Date.now(), label: generateSearchLabel(conditions, keyword), }; const updatedHistory = [ newHistory, ...searchHistory.filter((h) => h.label !== newHistory.label), ].slice(0, 10); // 只保留最近10条 saveSearchHistory(updatedHistory); }; // 应用历史搜索 - 修改为支持日期范围 const applyHistorySearch = (history: SearchHistory) => { const { conditions, keyword } = history; // 恢复搜索条件 setSelectedSystem(conditions.systemType || null); setSelectedDeviceType(conditions.deviceType || null); setSelectedDept(conditions.deptId || null); setSelectedFixType(conditions.responsiblePerson?.contains || null); setSearchKeyword(keyword); if (conditions.createdAt) { const startDate = dayjs(conditions.createdAt.gte); const endDate = dayjs(conditions.createdAt.lte); setDateRange([startDate, endDate]); } else { setDateRange(null); } // 应用搜索条件 setSearchValue(conditions as any); setShowHistory(false); }; // 删除搜索历史 const removeSearchHistory = (historyId: string, event: React.MouseEvent) => { event.stopPropagation(); const updatedHistory = searchHistory.filter((h) => h.id !== historyId); saveSearchHistory(updatedHistory); }; // 清空所有搜索历史 const clearAllHistory = () => { saveSearchHistory([]); }; const handleNew = () => { form.setFieldsValue(formValue); console.log(editingRecord); setVisible(true); }; // 查询按钮点击处理 - 修改为支持日期范围 const handleSearch = () => { // 构建查询条件 const whereCondition: SearchCondition = { deletedAt: null, ...(selectedSystem && { systemType: selectedSystem }), ...(selectedDeviceType && { deviceType: selectedDeviceType }), ...(selectedFixType && { deviceStatus: selectedFixType }), ...(selectedDept && { deptId: selectedDept }), ...(dateRange && dateRange[0] && dateRange[1] && { createdAt: { gte: dateRange[0].startOf("day").toISOString(), lte: dateRange[1].endOf("day").toISOString(), }, }), ...(searchKeyword && { OR: [ { description: { contains: searchKeyword } }, { location: { contains: searchKeyword } }, { responsiblePerson: { contains: searchKeyword } }, ], }), }; // 添加到搜索历史 addSearchHistory(whereCondition, searchKeyword); // 更新查询条件到全局上下文 setSearchValue(whereCondition as any); }; // 重置按钮处理 - 修改为重置日期范围 const handleReset = () => { setSelectedSystem(null); setSelectedDeviceType(null); setSelectedDept(null); setDateRange(null); // 重置日期范围 setSearchKeyword(""); setIpAddress(""); setMacAddress(""); setSerialNumber(""); setAssetNumber(""); setManufacturer(""); setModel(""); setLocation(""); saveSearchHistory([]); // 重置为只查询未删除的记录 setSearchValue({ deletedAt: null } as any); }; // 修复DepartmentSelect的onChange类型 const handleDeptChange = (value: string | string[]) => { setSelectedDept(value as string); }; // 处理选择变更的回调 const handleSelectedChange = (keys: React.Key[], data: any[]) => { console.log("选中状态变化:", keys.length); setSelectedKeys(keys); setSelectedData(data); }; // 处理导出按钮点击 const handleExport = () => { if (tableRef.current) { tableRef.current.handleExportSelected(); } }; // 系统类别变化处理 const handleSystemTypeChange = (value: string) => { setSelectedSystemTypeId(value); form.setFieldValue("deviceType", undefined); // 清空已选故障类型 }; // 搜索历史下拉菜单 const historyMenuItems = [ { key: "header", label: (
搜索历史 {searchHistory.length > 0 && ( )}
), disabled: true, }, ...searchHistory.map((history) => ({ key: history.id, label: (
applyHistorySearch(history)} >
{history.label}
{dayjs(history.timestamp).format("MM-DD HH:mm")}
), })), ...(searchHistory.length === 0 ? [ { key: "empty", label: (
暂无搜索历史
), disabled: true, }, ] : []), ]; return (

故障收录检索

setDateRange(dates)} format="YYYY-MM-DD" allowClear />
{/* 显示当前搜索历史标签 */} {searchHistory.length > 0 && (
最近搜索:
{searchHistory.slice(0, 5).map((history) => ( applyHistorySearch(history)} closable onClose={(e) => { e.preventDefault(); removeSearchHistory(history.id, e as any); }} > {history.label.length > 25 ? `${history.label.substring(0, 25)}...` : history.label} ))}
)}
); }