From 243696230aba26b6ddf486bd93ea468d1e010d45 Mon Sep 17 00:00:00 2001 From: Li1304553726 <1304553726@qq.com> Date: Mon, 2 Jun 2025 19:35:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=A9=E6=9D=B0=E6=B5=8B=E8=AF=95bug?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/main/devicepage/devicetable/page.tsx | 225 +++++++------ apps/web/src/app/main/devicepage/page.tsx | 297 ++++++++++++------ .../main/devicepage/select/Device-manager.tsx | 81 +++-- .../main/devicepage/select/Device-select.tsx | 6 +- 4 files changed, 378 insertions(+), 231 deletions(-) diff --git a/apps/web/src/app/main/devicepage/devicetable/page.tsx b/apps/web/src/app/main/devicepage/devicetable/page.tsx index caee924..4452aac 100755 --- a/apps/web/src/app/main/devicepage/devicetable/page.tsx +++ b/apps/web/src/app/main/devicepage/devicetable/page.tsx @@ -15,6 +15,7 @@ import { ExclamationCircleOutlined, ImportOutlined, ExportOutlined, + DatabaseOutlined, } from "@ant-design/icons"; import dayjs from "dayjs"; import { utils, writeFile, read } from "xlsx"; @@ -89,13 +90,13 @@ const DeviceTable = forwardRef( include: { children: true }, // 包含子级术语 orderBy: { order: "asc" }, // 按排序字段升序 }); - + // 设备类型术语查询(用于类型名称转换) const { data: deviceTypeTerms, refetch: refetchDeviceType } = api.term.findMany.useQuery({ where: { taxonomy: { slug: "device_type" }, deletedAt: null }, // 筛选设备类型术语 }); - + // 软删除设备的mutation方法(通过ID批量删除) const { mutate: softDeleteByIds } = api.device.softDeleteByIds.useMutation(); @@ -165,18 +166,22 @@ const DeviceTable = forwardRef( dataIndex: "systemType", key: "systemType", align: "center", - render: (text, record) => { - return getTermNameById(record.systemType, "system_type"); - }, + render: (text, record) => ( + + {getTermNameById(record.systemType, "system_type")} + + ), }, { title: "故障类型", dataIndex: "deviceType", key: "deviceType", align: "center", - render: (text, record) => { - return getTermNameById(record.deviceType, "device_type"); - }, + render: (text, record) => ( + + {getTermNameById(record.deviceType, "device_type")} + + ), }, { title: "单位", @@ -184,16 +189,15 @@ const DeviceTable = forwardRef( key: "deptId", align: "center", render: (text, record) => { - // 如果有部门关联,显示部门名称 - if (record.deptId && (record as any)?.department?.name) { - return (record as any)?.department?.name; - } - // 否则显示responsiblePerson(如果存在) - if (record.responsiblePerson) { - return record.responsiblePerson; - } - // 最后才显示未知 - return "未知"; + const unitName = + (record as any)?.department?.name || + record.responsiblePerson || + "未知"; + return ( + + {unitName} + + ); }, }, { @@ -204,14 +208,11 @@ const DeviceTable = forwardRef( render: (text, record) => (
handleShowDesc(record)} - style={{ - cursor: "pointer", - padding: "8px 0", - // backgroundColor: 'black', - fontWeight: "bold", - }} + className="cursor-pointer p-2 bg-gray-50 hover:bg-blue-50 rounded border border-gray-200 hover:border-blue-300 transition-colors duration-200" > - {text || "未命名故障"} + + {text || "未命名故障"} +
), }, @@ -224,30 +225,29 @@ const DeviceTable = forwardRef( const statusConfig = { normal: { text: "已修复", - color: "success", + className: "bg-green-100 text-green-800 border-green-200", }, maintenance: { text: "维修中", - color: "processing", + className: "bg-blue-100 text-blue-800 border-blue-200", }, broken: { text: "未修复", - color: "error", + className: "bg-red-100 text-red-800 border-red-200", }, }; const config = statusConfig[status] || { text: "未知", - color: "default", + className: "bg-gray-100 text-gray-800 border-gray-200", }; return ( - {config.text} - + ); }, }, @@ -256,25 +256,30 @@ const DeviceTable = forwardRef( dataIndex: "createdAt", key: "createdAt", align: "center", - render: (text, record) => - record.createdAt - ? dayjs(record.createdAt).format("YYYY-MM-DD HH:mm:ss") - : "未知", + render: (text, record) => ( + + {record.createdAt + ? dayjs(record.createdAt).format("YYYY-MM-DD HH:mm:ss") + : "未知"} + + ), }, { title: "操作", key: "action", align: "center", render: (_, record) => ( -
+
-
@@ -503,7 +508,7 @@ const DeviceTable = forwardRef( 单位: "单位名称", 故障名称: "示例故障名称", 故障状态: "未修复", // 可选值:已修复, 维修中, 未修复 - 描述: "这是一个示例描述", + 描述: "示例描述", }, ]; @@ -530,7 +535,7 @@ const DeviceTable = forwardRef( const rowSelection = { selectedRowKeys, onChange: onSelectChange, - columnWidth: 70, + columnWidth: 60, columnTitle: (
- 全选 + + 全选 +
), - preserveSelectedRowKeys: true, // 这个属性保证翻页时选中状态不丢失 + preserveSelectedRowKeys: true, }; const TableHeader = () => ( -
- -
+
+
+
+ +
+
+

数据管理

+

+ {devices?.length ? `共 ${devices.length} 条记录` : "暂无数据"} +

+
+
+
); return ( - <> +
- index % 2 === 0 - ? "bg-white hover:bg-blue-100" - : "bg-gray-100 hover:bg-blue-100" + `${ + index % 2 === 0 + ? "bg-white hover:bg-blue-50" + : "bg-gray-50 hover:bg-blue-50" + } transition-colors duration-200` } - onRow={(record) => { - return { - style: { cursor: "pointer" }, - onMouseEnter: () => {}, - }; - }} - onHeaderRow={() => { - return { - style: { - backgroundColor: "#d6e4ff", - }, - }; - }} + onRow={(record) => ({ + style: { cursor: "pointer" }, + })} + onHeaderRow={() => ({ + style: { + backgroundColor: "#f8fafc", + }, + })} scroll={{ x: "max-content" }} pagination={{ position: ["bottomCenter"], - className: "flex justify-center mt-4", + className: "mt-4", pageSize: pageSize, current: currentPage, showSizeChanger: true, pageSizeOptions: ["10", "15", "20"], responsive: true, - showTotal: (total, range) => `共${total} 条数据`, + showTotal: (total, range) => ( + + 显示第 {range[0]}-{range[1]} 条,共 {total} 条数据 + + ), showQuickJumper: true, onChange: handlePageChange, onShowSizeChange: handlePageSizeChange, }} - components={{ - header: { - cell: (props) => ( - +
+ + { + setSelectedSystem(value); + setSelectedSystemTypeId(value || ""); // 同步更新 + setSelectedDeviceType(null); // 清空故障类型选择 + }} + placeholder="选择网系类别" + className="w-full" + /> +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + 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} + + + ))} +
+
+ )} + + + {/* 表格区域 */} + - + ); } diff --git a/apps/web/src/app/main/devicepage/select/Device-manager.tsx b/apps/web/src/app/main/devicepage/select/Device-manager.tsx index 67c5c7f..d983b44 100755 --- a/apps/web/src/app/main/devicepage/select/Device-manager.tsx +++ b/apps/web/src/app/main/devicepage/select/Device-manager.tsx @@ -87,15 +87,15 @@ export default function DeviceManager({ title }: TermManagerProps) { orderBy: { order: "asc" }, }); - const handlePageChange = (page: number, size: number) => { - setCurrentPage(page); - setPageSize(size); - }; - - const handlePageSizeChange = (current: number, size: number) => { - setCurrentPage(1); // 重置到第一页 - setPageSize(size); - }; + const handlePageChange = (page: number, size: number) => { + setCurrentPage(page); + setPageSize(size); + }; + + const handlePageSizeChange = (current: number, size: number) => { + setCurrentPage(1); // 重置到第一页 + setPageSize(size); + }; // 构建包含两种分类的树形数据 useEffect(() => { if (systemTypeTerms && deviceTypeTerms) { @@ -261,14 +261,18 @@ export default function DeviceManager({ title }: TermManagerProps) { Modal.confirm({ title: "确认删除", content: `确定要删除"${term.name}"吗?这将同时删除其下所有子项!`, - onOk: () => softDeleteByIds({ ids: [term.id] },{ - onSuccess: () => { - message.success("删除成功"); - }, - onError: () => { - message.error("删除失败"); - }, - }), + onOk: () => + softDeleteByIds( + { ids: [term.id] }, + { + onSuccess: () => { + message.success("删除成功"); + }, + onError: () => { + message.error("删除失败"); + }, + } + ), }); refetchSystemType(); refetchDeviceType(); @@ -277,6 +281,12 @@ export default function DeviceManager({ title }: TermManagerProps) { const handleSave = () => { if (!termName.trim() || !taxonomyId) return; + // 如果是故障类型,上级分类为必填 + if (taxonomyId === deviceTypeTaxonomy?.id && !parentId) { + message.error("故障类型必须选择上级分类(网系类别)"); + return; + } + if (editingTerm) { updateTerm({ where: { id: editingTerm.id }, @@ -371,7 +381,7 @@ export default function DeviceManager({ title }: TermManagerProps) {
{/* 主要内容卡片 */} - {/* 统计信息区域 */} + {/* 统计信息区域 */}
@@ -395,15 +405,15 @@ export default function DeviceManager({ title }: TermManagerProps) { {/* */} - {/*
*/} - {/*
+ {/*
*/} + {/*
{deviceTypeTerms?.filter(term => !systemTypeTerms?.some(sysType => sysType.id === term.parentId) && deviceTypeTerms?.some(devType => devType.id === term.parentId) ).length || 0}
具体故障
*/} - {/*
+ {/*
*/}
@@ -438,8 +448,6 @@ export default function DeviceManager({ title }: TermManagerProps) { - - {/* 表格区域 */}
- ), - }, - }} bordered - className="device-table-no-wrap" + className="bg-white rounded-lg shadow-sm" /> + + {/* 简化的模态框 */} + + + {currentDesc.title} + + + } open={descModalVisible} onCancel={() => setDescModalVisible(false)} footer={[ @@ -664,22 +682,33 @@ const DeviceTable = forwardRef( 关闭 , ]} + width={800} > -
-
故障详情
-
- {currentDesc.desc} +
+
+
+ 故障详情 +
+
+
+ {currentDesc.desc} +
+
- {/* 添加附件展示区域 */} + {currentDesc?.id && ( -
-
相关附件
- +
+
+ 相关附件 +
+
+ +
)}
- +
); } ); diff --git a/apps/web/src/app/main/devicepage/page.tsx b/apps/web/src/app/main/devicepage/page.tsx index f475f06..9de2e9c 100755 --- a/apps/web/src/app/main/devicepage/page.tsx +++ b/apps/web/src/app/main/devicepage/page.tsx @@ -10,6 +10,10 @@ import { Tag, Dropdown, Space, + Card, + Row, + Col, + Typography, } from "antd"; import { useCallback, useEffect, useState, useRef } from "react"; import _ from "lodash"; @@ -27,6 +31,8 @@ import { DownOutlined, HistoryOutlined, CloseOutlined, + FilterOutlined, + DatabaseOutlined, } 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"; @@ -36,7 +42,7 @@ import FixTypeSelect from "./select/Fix-select"; import { api } from "@nice/client"; const { RangePicker } = DatePicker; - +const { Title } = Typography; // 添加筛选条件类型 type SearchCondition = { deletedAt: null; @@ -378,112 +384,199 @@ export default function DeviceMessage() { ]; 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} - - - ))} + + + +
-
- )} + +
-
+ {/* 搜索筛选区域 */} + +
+
+ + 筛选条件 +
+ + +
( + render: (text, record, index) => (
{/* 根据层级添加不同的图标 */} {record.taxonomyId === systemTypeTaxonomy?.id ? ( @@ -537,7 +545,7 @@ export default function DeviceManager({ title }: TermManagerProps) { showSizeChanger: true, showQuickJumper: true, showTotal: (total) => `共 ${total} 条记录`, - pageSizeOptions: [ "10", "15", "20"], + pageSizeOptions: ["10", "15", "20"], onChange: handlePageChange, onShowSizeChange: handlePageSizeChange, }} @@ -546,8 +554,8 @@ export default function DeviceManager({ title }: TermManagerProps) { record.taxonomyId === systemTypeTaxonomy?.id ? "bg-blue-25" : record.taxonomyId === deviceTypeTaxonomy?.id - ? "bg-green-25" - : "bg-orange-25" + ? "bg-green-25" + : "bg-orange-25" }` } onHeaderRow={() => ({ @@ -621,11 +629,27 @@ export default function DeviceManager({ title }: TermManagerProps) {
+
diff --git a/apps/web/src/app/main/devicepage/select/Device-select.tsx b/apps/web/src/app/main/devicepage/select/Device-select.tsx index ce206e0..40edf1d 100755 --- a/apps/web/src/app/main/devicepage/select/Device-select.tsx +++ b/apps/web/src/app/main/devicepage/select/Device-select.tsx @@ -76,10 +76,10 @@ export default function DeviceTypeSelect({ // 查找所有与该网系类别直接相关的故障类型 const relatedDeviceTypes = allDeviceTypes.filter( - (device) => - childrenIds.includes(device.id) || device.parentId === systemTypeId + // (device) => + // childrenIds.includes(device.id) || device.parentId === systemTypeId + (device) => device.parentId === systemTypeId ); - console.log("已选系统:", systemTerm.name); console.log("相关故障类型数量:", relatedDeviceTypes.length);