diff --git a/.env.development b/.env.development index f7ff9da..f9304df 100644 --- a/.env.development +++ b/.env.development @@ -5,7 +5,7 @@ VITE_APP_TITLE = 新能源场站智慧运维平台 VITE_APP_ENV = 'development' # 开发环境 -VITE_APP_BASE_API = 'http://192.168.110.149:18899' +VITE_APP_BASE_API = 'http://192.168.110.210:18899' # 应用访问路径 例如使用前缀 /admin/ VITE_APP_CONTEXT_PATH = '/' diff --git a/src/views/zhinengxunjian/banzhuzhuangtai.vue b/src/views/zhinengxunjian/banzhuzhuangtai.vue index c2ad935..dd67f95 100644 --- a/src/views/zhinengxunjian/banzhuzhuangtai.vue +++ b/src/views/zhinengxunjian/banzhuzhuangtai.vue @@ -31,6 +31,7 @@ suffix-icon="el-icon-search" @keyup.enter="handleSearch" > + 重置 新增班组 diff --git a/src/views/zhinengxunjian/baoxiuguanli.vue b/src/views/zhinengxunjian/baoxiuguanli.vue index c848ef8..60675d6 100644 --- a/src/views/zhinengxunjian/baoxiuguanli.vue +++ b/src/views/zhinengxunjian/baoxiuguanli.vue @@ -22,6 +22,9 @@
+
+ +
@@ -46,6 +49,7 @@
搜索 + 重置 手动创建任务
@@ -391,6 +395,7 @@ import { ElMessage, ElLoading } from 'element-plus'; const activeTab = ref('task'); // 筛选条件 +const keyword = ref(''); const taskStatus = ref(''); const planType = ref(''); const executor = ref(''); @@ -580,12 +585,23 @@ const statusOrder = { // 分页处理后的数据(含排序) const pagedTasks = computed(() => { - // 先按状态排序 - const sortedTasks = [...tasks.value].sort((a, b) => { - return statusOrder[a.status] - statusOrder[b.status]; - }); + // 先关键词过滤 + let filtered = [...tasks.value]; + if (keyword.value && keyword.value.trim()) { + const kw = keyword.value.trim(); + filtered = filtered.filter((t) => + (t.title && t.title.includes(kw)) || + (t.reporter && t.reporter.includes(kw)) || + (t.maintainer && t.maintainer.includes(kw)) || + (t.id && String(t.id).includes(kw)) + ); + } - // 再进行分页 + // 按状态排序 + const sortedTasks = filtered.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]); + + // 更新总数并分页 + total.value = sortedTasks.length; const startIndex = (currentPage.value - 1) * pageSize.value; const endIndex = startIndex + pageSize.value; return sortedTasks.slice(startIndex, endIndex); @@ -597,6 +613,15 @@ const handleSearch = () => { getTaskList(); // 调用接口获取数据 }; +const resetFilters = () => { + keyword.value = ''; + taskStatus.value = ''; + planType.value = ''; + executor.value = ''; + currentPage.value = 1; + getTaskList(); +}; + // 创建报修任务弹窗相关 const createTaskDialogVisible = ref(false); const createTaskFormRef = ref(null); diff --git a/src/views/zhinengxunjian/baoxiujilu.vue b/src/views/zhinengxunjian/baoxiujilu.vue index c875cd4..389e6ef 100644 --- a/src/views/zhinengxunjian/baoxiujilu.vue +++ b/src/views/zhinengxunjian/baoxiujilu.vue @@ -23,6 +23,9 @@
+
+ +
@@ -56,6 +59,7 @@
搜索 + 重置
@@ -379,6 +383,7 @@ const taskStatus = ref(''); const priority = ref(''); const executor = ref(''); const dateRange = ref([]); +const keyword = ref(''); // 分页相关 const currentPage = ref(1); @@ -438,8 +443,13 @@ const fetchRepairRecords = async () => { // 筛选后的记录 const filteredRecords = computed(() => { - // 实际应用中这里会根据筛选条件过滤数据 - return repairRecords.value; + const kw = keyword.value.trim().toLowerCase(); + if (!kw) return repairRecords.value; + return repairRecords.value.filter((r) => + [r.id, r.reportInfo, r.reportName, r.sendPersonVo?.userName, getStatusText(r.status)] + .filter(Boolean) + .some((v) => String(v).toLowerCase().includes(kw)) + ); }); // 搜索处理 @@ -448,6 +458,17 @@ const handleSearch = () => { fetchRepairRecords(); // 重新获取数据 }; +// 重置筛选 +const resetFilters = () => { + taskStatus.value = ''; + priority.value = ''; + executor.value = ''; + dateRange.value = []; + keyword.value = ''; + currentPage.value = 1; + fetchRepairRecords(); +}; + // 分页事件 const handleSizeChange = (val) => { pageSize.value = val; diff --git a/src/views/zhinengxunjian/cheliangzhuangtai.vue b/src/views/zhinengxunjian/cheliangzhuangtai.vue index 482ff0c..b62db7d 100644 --- a/src/views/zhinengxunjian/cheliangzhuangtai.vue +++ b/src/views/zhinengxunjian/cheliangzhuangtai.vue @@ -71,6 +71,11 @@
+
+ + 搜索 + 重置 +
diff --git a/src/views/zhinengxunjian/gongdanliebiao.vue b/src/views/zhinengxunjian/gongdanliebiao.vue index 0101186..29a560c 100644 --- a/src/views/zhinengxunjian/gongdanliebiao.vue +++ b/src/views/zhinengxunjian/gongdanliebiao.vue @@ -22,6 +22,9 @@
+
+ +
@@ -53,6 +56,7 @@
搜索 + 重置 发起工单任务
@@ -454,6 +458,7 @@ import { ElMessageBox } from 'element-plus'; const activeTab = ref('list'); // 筛选条件 +const keyword = ref(''); const workOrderType = ref('all'); const workOrderStatus = ref('all'); const priority = ref('all'); @@ -604,10 +609,82 @@ const formatDate = (dateString) => { // 初始化加载数据 fetchWorkOrderList(); -// 分页处理后的数据 +// 分页处理后的数据(前端筛选+分页) const pagedTableData = computed(() => { - // 由于接口已经处理了分页和筛选,这里直接返回全部数据 - return rawTableData.value; + let filteredData = [...rawTableData.value]; + + if (keyword.value && keyword.value.trim()) { + const kw = keyword.value.trim(); + filteredData = filteredData.filter((item) => + (item.title && item.title.includes(kw)) || + (item.description && item.description.includes(kw)) || + (item.creator && item.creator.includes(kw)) || + (item.orderNo && item.orderNo.includes(kw)) + ); + } + + if (workOrderType.value !== 'all') { + let typeText = ''; + switch (workOrderType.value) { + case 'maintenance': + typeText = '维护保养'; + break; + case 'inspection': + typeText = '检查检测'; + break; + case 'installation': + typeText = '安装调试'; + break; + case 'upgrade': + typeText = '升级改造'; + break; + } + filteredData = filteredData.filter((item) => item.type === typeText); + } + + if (workOrderStatus.value !== 'all') { + let statusText = ''; + switch (workOrderStatus.value) { + case 'accepted': + statusText = '已接单'; + break; + case 'pending': + statusText = '待处理'; + break; + case 'executing': + statusText = '执行中'; + break; + case 'completed': + statusText = '已完成'; + break; + } + filteredData = filteredData.filter((item) => item.status === statusText); + } + + if (priority.value !== 'all') { + let priorityText = ''; + switch (priority.value) { + case 'high': + priorityText = '高'; + break; + case 'medium': + priorityText = '中'; + break; + case 'low': + priorityText = '低'; + break; + } + filteredData = filteredData.filter((item) => item.priority === priorityText); + } + + if (createDate.value) { + filteredData = filteredData.filter((item) => item.createTime && item.createTime.includes(createDate.value)); + } + + total.value = filteredData.length; + const startIndex = (currentPage.value - 1) * pageSize.value; + const endIndex = startIndex + pageSize.value; + return filteredData.slice(startIndex, endIndex); }); // 获取类型标签样式 @@ -690,19 +767,26 @@ const getStepStatusText = (status) => { const handleSearch = () => { currentPage.value = 1; // 重置到第一页 - fetchWorkOrderList(); // 重新获取数据 +}; + +// 重置筛选 +const resetFilters = () => { + keyword.value = ''; + workOrderType.value = 'all'; + workOrderStatus.value = 'all'; + priority.value = 'all'; + createDate.value = ''; + currentPage.value = 1; }; // 分页事件 const handleSizeChange = (val) => { pageSize.value = val; currentPage.value = 1; - fetchWorkOrderList(); // 重新获取数据 }; const handleCurrentChange = (val) => { currentPage.value = val; - fetchWorkOrderList(); // 重新获取数据 }; // 选项卡点击 @@ -1539,46 +1623,7 @@ const handleInspectionManagement3 = () => { } /* 导航栏样式 */ -.navigation-tabs { - display: flex; - margin-bottom: 20px; - background-color: #fff; - border-radius: 4px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); - padding: 2px; -} - -.nav-tab { - padding: 12px 24px; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 4px; - font-size: 14px; - color: #606266; - border-right: 1px solid #f0f0f0; - flex: 1; - text-align: center; -} - -.nav-tab:last-child { - border-right: none; -} - -.nav-tab:hover { - color: #409eff; - background-color: #ecf5ff; -} - -.nav-tab.active { - background-color: #409eff; - color: #fff; - box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3); -} - -.nav-tab { - cursor: pointer; - user-select: none; -} +/* 已注释的导航栏样式移除 */ /* 弹窗样式 */ .create-dialog { diff --git a/src/views/zhinengxunjian/paidanjilu.vue b/src/views/zhinengxunjian/paidanjilu.vue index b32c45c..4bcdbd4 100644 --- a/src/views/zhinengxunjian/paidanjilu.vue +++ b/src/views/zhinengxunjian/paidanjilu.vue @@ -24,6 +24,9 @@
+
+ +
@@ -55,6 +58,7 @@
搜索 + 重置
@@ -509,6 +513,7 @@ import ImageUpload from '@/components/ImageUpload/index.vue'; import { ElMessageBox, ElMessage } from 'element-plus'; // 筛选条件 +const keyword = ref(''); const workOrderType = ref('all'); const workOrderStatus = ref('all'); const priority = ref('all'); @@ -750,6 +755,18 @@ const pagedTableData = computed(() => { // 筛选逻辑 let filteredData = [...rawTableData.value]; + if (keyword.value && keyword.value.trim()) { + const kw = keyword.value.trim(); + filteredData = filteredData.filter((item) => { + return ( + (item.title && item.title.includes(kw)) || + (item.description && item.description.includes(kw)) || + (item.creator && item.creator.includes(kw)) || + (item.orderNo && item.orderNo.includes(kw)) + ); + }); + } + if (workOrderType.value !== 'all') { // 转换筛选条件为显示文本进行匹配 let typeText = ''; @@ -862,6 +879,16 @@ const handleSearch = () => { currentPage.value = 1; // 重置到第一页 }; +// 重置筛选 +const resetFilters = () => { + keyword.value = ''; + workOrderType.value = 'all'; + workOrderStatus.value = 'all'; + priority.value = 'all'; + createDate.value = ''; + currentPage.value = 1; +}; + // 分页事件 const handleSizeChange = (val) => { pageSize.value = val; @@ -1763,46 +1790,7 @@ const handleCloseDetailDialog = () => { } /* 导航栏样式 */ -.navigation-tabs { - display: flex; - margin-bottom: 20px; - background-color: #fff; - border-radius: 4px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); - padding: 2px; -} - -.nav-tab { - padding: 12px 24px; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 4px; - font-size: 14px; - color: #606266; - border-right: 1px solid #f0f0f0; - flex: 1; - text-align: center; -} - -.nav-tab:last-child { - border-right: none; -} - -.nav-tab:hover { - color: #409eff; - background-color: #ecf5ff; -} - -.nav-tab.active { - background-color: #409eff; - color: #fff; - box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3); -} - -.nav-tab { - cursor: pointer; - user-select: none; -} +/* 已注释的导航栏样式移除 */ /* 弹窗样式 */ .create-dialog { diff --git a/src/views/zhinengxunjian/qiangxiuguanli.vue b/src/views/zhinengxunjian/qiangxiuguanli.vue index 31ed789..8175d94 100644 --- a/src/views/zhinengxunjian/qiangxiuguanli.vue +++ b/src/views/zhinengxunjian/qiangxiuguanli.vue @@ -22,6 +22,9 @@
+
+ +
@@ -49,6 +52,7 @@
搜索 + 重置 手动创建任务
@@ -426,6 +430,7 @@ import { xunjianUserlist } from '@/api/zhinengxunjian/xunjian'; const taskStatus = ref('all'); const planType = ref('all'); const executor = ref('all'); +const keyword = ref(''); // 任务数据 - 添加了更多字段以展示滚动效果 const tasks = ref([]); // 分页相关 @@ -458,6 +463,16 @@ const handleSearch = () => { getTaskList(); // 调用接口获取数据 }; +// 重置筛选 +const resetFilters = () => { + taskStatus.value = 'all'; + planType.value = 'all'; + executor.value = 'all'; + keyword.value = ''; + currentPage.value = 1; + getTaskList(); +}; + // 创建紧急抢修任务弹窗相关 const createTaskDialogVisible = ref(false); const createTaskFormRef = ref(null); // 表单引用 @@ -1090,9 +1105,8 @@ async function getTaskList() { const res = await qiangxiulist(requestParams); if (res.code === 200 && res.rows) { - total.value = res.total || 0; // 将API返回的数据转换为前端显示所需的格式 - tasks.value = res.rows.map((item) => ({ + const mapped = res.rows.map((item) => ({ id: item.id, title: item.name || '未命名抢修任务', status: mapStatusToKey(item.status), @@ -1124,6 +1138,19 @@ async function getTaskList() { // 添加needSupport字段,确保从API返回数据中获取实际值 needSupport: item.support || '' })); + + // 关键词过滤 + const kw = keyword.value.trim().toLowerCase(); + const filtered = kw + ? mapped.filter((t) => + [t.title, t.reporter, t.maintainer, t.position, t.statusText] + .filter(Boolean) + .some((v) => String(v).toLowerCase().includes(kw)) + ) + : mapped; + + tasks.value = filtered; + total.value = kw ? filtered.length : res.total || filtered.length; } else { tasks.value = []; total.value = 0; @@ -1578,7 +1605,8 @@ setTimeout(() => { .detail-value { flex: 1; color: #4e5969; - word-break: break-all; + word-break: break-word; + line-height: 1.5; } .task-result { @@ -1595,13 +1623,7 @@ setTimeout(() => { align-items: center; padding-top: 12px; border-top: 1px solid #f0f2f5; - position: absolute; - bottom: 16px; - right: 16px; - left: 16px; background-color: #fff; - padding: 12px 0 0 0; - z-index: 10; } .action-btn { @@ -1705,10 +1727,11 @@ setTimeout(() => { } .task-title { - font-size: 14px; + font-size: 16px; font-weight: 500; color: #1d2129; line-height: 1.4; + word-break: break-word; flex: 1; margin-right: 8px; } @@ -1721,35 +1744,32 @@ setTimeout(() => { border: 1px solid transparent; } -/* 不同故障类型的颜色 */ -/* 电力,设备故障为红色 */ -.task-type-tag.electric, -.task-type-tag.equipment { +/* 优先级标签背景色样式 - 与保修管理页面保持一致 */ +.priority-high { background-color: #fff2f0; color: #ff4d4f; border-color: #ffccc7; } -/* 供水,设备损坏为黄色 */ -.task-type-tag.water, -.task-type-tag.damage { +.priority-medium { background-color: #fffbe6; color: #fa8c16; border-color: #ffe58f; } -/* 其余为绿色 */ -.task-type-tag { - background-color: #f6ffed; - color: #52c41a; - border-color: #b7eb8f; +.priority-low { + background-color: #e6f7ff; + color: #1890ff; + border-color: #91d5ff; } .task-card:hover { transform: translateY(-3px); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); } -.task-card[data-v-2668390e]::before { + +/* 左侧状态线样式 - 与保修管理页面保持一致 */ +.task-card::before { content: ''; position: absolute; left: 0; @@ -1757,6 +1777,22 @@ setTimeout(() => { bottom: 0; width: 4px; } + +.left-line-high::before { + background-color: #ff4d4f; +} + +.left-line-medium::before { + background-color: #fa8c16; +} + +.left-line-low::before { + background-color: #1677ff; +} + +.left-line-completed::before { + background-color: #52c41a; +} .task-details { margin-bottom: 16px; } @@ -1769,8 +1805,9 @@ setTimeout(() => { } .detail-label { - flex: 0 0 70px; + flex: 0 0 85px; color: #86909c; + margin-right: 4px; } .detail-value { diff --git a/src/views/zhinengxunjian/qiangxiujilu.vue b/src/views/zhinengxunjian/qiangxiujilu.vue index a49d7ab..f0d84df 100644 --- a/src/views/zhinengxunjian/qiangxiujilu.vue +++ b/src/views/zhinengxunjian/qiangxiujilu.vue @@ -22,6 +22,9 @@
+
+ +
@@ -54,6 +57,7 @@
搜索 + 重置
@@ -366,6 +370,7 @@ const priority = ref(''); const executor = ref(''); const dateRange = ref([]); const showFilter = ref(false); +const keyword = ref(''); // 表单验证规则 const assignTaskRules = { @@ -433,7 +438,7 @@ const getTaskList = async () => { if (res && res.code === 200) { // 更新表格数据,将接口返回的字段映射到表格期望的字段 - repairRecords.value = Array.isArray(res.rows) + const mapped = Array.isArray(res.rows) ? res.rows.map((item) => ({ // 映射抢修单号 reportNo: `R-${item.id || '000'}`, @@ -460,7 +465,19 @@ const getTaskList = async () => { originalData: item })) : []; - total.value = res.total || 0; + + // 关键词过滤 + const kw = keyword.value.trim().toLowerCase(); + const filtered = kw + ? mapped.filter((r) => + [r.reportNo, r.content, r.reporter, r.handler, r.status] + .filter(Boolean) + .some((v) => String(v).toLowerCase().includes(kw)) + ) + : mapped; + + repairRecords.value = filtered; + total.value = kw ? filtered.length : res.total || filtered.length; } else { ElMessage.error(`获取抢修记录失败:${res?.msg || '未知错误'}`); repairRecords.value = []; diff --git a/src/views/zhinengxunjian/shiyanguanli.vue b/src/views/zhinengxunjian/shiyanguanli.vue index 00dda93..fea39af 100644 --- a/src/views/zhinengxunjian/shiyanguanli.vue +++ b/src/views/zhinengxunjian/shiyanguanli.vue @@ -24,6 +24,7 @@
+ @@ -49,7 +50,8 @@ >
- 搜索 + 搜索 + 重置 新增实验记录
@@ -581,6 +583,7 @@ const activeTab = ref('plan'); // 默认为"巡检计划" const timeRange = ref('month'); // 统计时间范围:月/周/日 // 2. 筛选条件 +const keyword = ref(''); const filterStatus = ref('all'); const filterType = ref('all'); const dateRange = ref([]); @@ -628,6 +631,22 @@ const fetchExperimentData = async () => { } }; +// 搜索与重置(当前数据主要来自接口,保留前端筛选入口) +const handleSearch = () => { + // 可根据项目需要将 keyword/filter 传给接口;当前保持页内刷新 + currentPage.value = 1; + fetchExperimentData(); +}; + +const resetFilters = () => { + keyword.value = ''; + filterStatus.value = 'all'; + filterType.value = 'all'; + dateRange.value = []; + currentPage.value = 1; + fetchExperimentData(); +}; + // 辅助方法 const getTestObjectText = (type) => { const typeMap = { @@ -1237,41 +1256,7 @@ const formatDateTime = (dateString) => { background-color: #f9fbfd; min-height: 100vh; } -.navigation-tabs { - display: flex; - margin-bottom: 20px; - background-color: #fff; - border-radius: 4px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); - padding: 2px; -} - -.nav-tab { - padding: 12px 24px; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 4px; - font-size: 14px; - color: #606266; - border-right: 1px solid #f0f0f0; - flex: 1; - text-align: center; -} - -.nav-tab:last-child { - border-right: none; -} - -.nav-tab:hover { - color: #409eff; - background-color: #ecf5ff; -} - -.nav-tab.active { - background-color: #409eff; - color: #fff; - box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3); -} +/* 已注释的导航栏样式移除 */ /* 3. 页面标题 */ .page-header { diff --git a/src/views/zhinengxunjian/shiyanjilu.vue b/src/views/zhinengxunjian/shiyanjilu.vue index 0cbdf3f..09ab4c6 100644 --- a/src/views/zhinengxunjian/shiyanjilu.vue +++ b/src/views/zhinengxunjian/shiyanjilu.vue @@ -23,6 +23,7 @@
+ @@ -47,7 +48,8 @@ class="date-picker" > - 搜索 + 搜索 + 重置
@@ -132,7 +134,7 @@
{ } }; +// 前端过滤后的试验记录 +const filteredTestRecords = computed(() => { + let data = [...testRecords.value]; + + if (keyword.value && keyword.value.trim()) { + const kw = keyword.value.trim(); + data = data.filter((rec) => { + return ( + (rec.taskName && rec.taskName.includes(kw)) || + (rec.personInfo?.userName && rec.personInfo.userName.includes(kw)) || + (rec.id && String(rec.id).includes(kw)) + ); + }); + } + + // 可根据筛选状态/类型进一步过滤(若后续需要) + return data; +}); + +// 搜索与重置 +const handleSearch = () => { + // 若后端支持条件,可在此调用接口;当前保持前端过滤 +}; + +const resetFilters = () => { + keyword.value = ''; + filterStatus.value = 'all'; + filterType.value = 'all'; + dateRange.value = []; +}; + // 8. 方法:获取统计数据 const getStatisticsData = async () => { try { @@ -715,41 +749,7 @@ onMounted(async () => { min-height: 100vh; } -.navigation-tabs { - display: flex; - margin-bottom: 20px; - background-color: #fff; - border-radius: 4px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); - padding: 2px; -} - -.nav-tab { - padding: 12px 24px; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 4px; - font-size: 14px; - color: #606266; - border-right: 1px solid #f0f0f0; - flex: 1; - text-align: center; -} - -.nav-tab:last-child { - border-right: none; -} - -.nav-tab:hover { - color: #409eff; - background-color: #ecf5ff; -} - -.nav-tab.active { - background-color: #409eff; - color: #fff; - box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3); -} +/* 已注释的导航栏样式移除 */ /* 3. 选项卡样式 */ .tabs-wrapper { diff --git a/src/views/zhinengxunjian/shiyanrenwu.vue b/src/views/zhinengxunjian/shiyanrenwu.vue index 478bda9..f6a87d8 100644 --- a/src/views/zhinengxunjian/shiyanrenwu.vue +++ b/src/views/zhinengxunjian/shiyanrenwu.vue @@ -24,6 +24,9 @@
+
+ +
@@ -50,6 +53,7 @@
搜索 + 重置 手动创建任务
@@ -479,6 +483,7 @@ const loading = ref(false); // 筛选条件(与接口参数对应) const taskStatus = ref(''); // 任务状态:1=待执行,2=暂停(已延期),3=失败,4=执行中,5=已完成 const planType = ref(''); // 关联计划ID:1=每日,2=每周,3=每月 +const keyword = ref(''); // 关键词 /** * 将节点数据按模块分组 @@ -716,8 +721,18 @@ const getTaskList = async () => { if (response.code === 200) { // 3. 接口数据映射为页面展示格式 - tasks.value = (response.rows || []).map((item) => mapApiToView(item)); - total.value = response.total || 0; // 同步总条数 + const mapped = (response.rows || []).map((item) => mapApiToView(item)); + // 4. 前端关键词过滤 + const kw = keyword.value.trim(); + const filtered = kw + ? mapped.filter((t) => + [t.title, t.target, t.executor, t.relatedPlan, t.statusText] + .filter(Boolean) + .some((v) => String(v).toLowerCase().includes(kw.toLowerCase())) + ) + : mapped; + tasks.value = filtered; + total.value = kw ? filtered.length : response.total || filtered.length; // 同步总条数 } else { ElMessage.error('获取任务列表失败:' + (response.msg || '未知错误')); tasks.value = []; @@ -833,6 +848,18 @@ const mapApiToView = (apiData) => { try { // 优先查找nodes数组中处于执行中或失败的节点来确定当前试验阶段 if (apiData && apiData.nodes && Array.isArray(apiData.nodes)) { + // 优先查找失败状态的节点(根据需求,优先显示status为3的数据) + const failedNode = apiData.nodes.find((node) => { + if (!node || node.status === undefined) return false; + return node.status === '3' || node.status === 3; + }); + + // 如果有失败的节点,根据code判断阶段 + if (failedNode && failedNode.code !== undefined) { + const stepName = failedNode.name || '未命名步骤'; + return `第${failedNode.code}步(${stepName})`; + } + // 查找执行中状态的节点 const executingNode = apiData.nodes.find((node) => { if (!node || node.status === undefined) return false; @@ -845,18 +872,6 @@ const mapApiToView = (apiData) => { return `第${executingNode.code}步(${stepName})`; } - // 查找失败状态的节点 - const failedNode = apiData.nodes.find((node) => { - if (!node || node.status === undefined) return false; - return node.status === '3' || node.status === 3; - }); - - // 如果有失败的节点,根据code判断阶段 - if (failedNode && failedNode.code !== undefined) { - const stepName = failedNode.name || '未命名步骤'; - return `第${failedNode.code}步(${stepName})`; - } - // 查找已完成的节点,确定最后完成的阶段 const completedNodes = apiData.nodes.filter((node) => { if (!node || node.status === undefined) return false; @@ -921,6 +936,16 @@ const handleSearch = () => { getTaskList(); }; +// 重置筛选条件 +const resetFilters = () => { + taskStatus.value = ''; + planType.value = ''; + executor.value = 'all'; + keyword.value = ''; + currentPage.value = 1; + getTaskList(); +}; + /** * 每页条数变化 * @param {number} val - 新的每页条数 diff --git a/src/views/zhinengxunjian/xunjianjihua.vue b/src/views/zhinengxunjian/xunjianjihua.vue index 3160b96..e4d4f6a 100644 --- a/src/views/zhinengxunjian/xunjianjihua.vue +++ b/src/views/zhinengxunjian/xunjianjihua.vue @@ -654,46 +654,7 @@ const handleInspectionManagement3 = () => { } /* 导航栏样式 */ -.navigation-tabs { - display: flex; - margin-bottom: 20px; - background-color: #fff; - border-radius: 4px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); - padding: 2px; -} - -.nav-tab { - padding: 12px 24px; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 4px; - font-size: 14px; - color: #606266; - border-right: 1px solid #f0f0f0; - flex: 1; - text-align: center; -} - -.nav-tab:last-child { - border-right: none; -} - -.nav-tab:hover { - color: #409eff; - background-color: #ecf5ff; -} - -.nav-tab.active { - background-color: #409eff; - color: #fff; - box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3); -} - -.nav-tab { - cursor: pointer; - user-select: none; -} +/* 已移除未使用的导航样式(模板中为注释状态) */ /* 选项卡样式 */ .tabs-wrapper { diff --git a/src/views/zhinengxunjian/xunjianrenwu.vue b/src/views/zhinengxunjian/xunjianrenwu.vue index b2e3022..325da96 100644 --- a/src/views/zhinengxunjian/xunjianrenwu.vue +++ b/src/views/zhinengxunjian/xunjianrenwu.vue @@ -23,6 +23,9 @@
+
+ +
@@ -43,6 +46,7 @@
搜索 + 重置 手动创建任务
@@ -429,11 +433,13 @@ import { xjrenwuDetail, xjrenwulist, addxjrenwu, updatexjrenwu } from '@/api/zhi import { xunjianUserlist, xunjianlist } from '@/api/zhinengxunjian/xunjian/index'; import { addjiedian } from '@/api/zhinengxunjian/jiedian/index'; import { ElMessage, ElLoading, ElForm } from 'element-plus'; +import { formatDate } from '@/utils/index'; // 筛选条件 const taskStatus = ref(''); const planType = ref(''); const executor = ref(''); +const keyword = ref(''); // 任务数据 - 初始为空数组,通过API获取 const tasks = ref([]); @@ -543,16 +549,13 @@ const getTaskList = async () => { const params = { pageSize: pageSize.value, pageNum: currentPage.value, - personId: 1, - taskType: taskStatus.value || undefined, // 任务状态 - planType: planType.value || undefined, // 计划类型 - personName: executor.value || undefined // 执行人 + projectId: 1 }; const response = await xjrenwulist(params); if (response.code === 200 && response.rows) { - tasks.value = response.rows.map((item) => { + const mapped = response.rows.map((item) => { // 获取原始数据中的id const taskId = item.id || ''; if (!taskId) { @@ -603,13 +606,16 @@ const getTaskList = async () => { return task; }); - - total.value = response.total || tasks.value.length; - - // 搜索后如果没有结果,显示提示信息 - if (tasks.value.length === 0) { - ElMessage.info('未找到符合条件的任务'); - } + const kw = keyword.value.trim(); + const filtered = kw + ? mapped.filter((t) => + [t.title, t.target, t.executor, t.relatedPlan, t.statusText] + .filter(Boolean) + .some((v) => String(v).toLowerCase().includes(kw.toLowerCase())) + ) + : mapped; + tasks.value = filtered; + total.value = kw ? filtered.length : response.total || filtered.length; } } catch (error) { console.error('获取巡检任务数据失败:', error); @@ -809,7 +815,7 @@ const handleSaveTask = async () => { createTime: new Date().toISOString(), updateTime: new Date().toISOString(), - startTime: new Date().toISOString().slice(0, 19).replace('T', ' '), + startTime: formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss'), params: { property1: 'string', property2: 'string' @@ -1045,7 +1051,7 @@ const handleAction = async (task) => { const updateData = { ...originalTask.rawData, id: task.id, - startTime: new Date().toISOString().slice(0, 19).replace('T', ' '), + startTime: formatDate(new Date().toString()), taskType: '3', // 3表示执行中 status: 'executing', taskProgress: 0 @@ -1072,14 +1078,7 @@ const handleAction = async (task) => { const originalTask = tasks.value[taskIndex]; - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const day = String(now.getDate()).padStart(2, '0'); - const hours = String(now.getHours()).padStart(2, '0'); - const minutes = String(now.getMinutes()).padStart(2, '0'); - const seconds = String(now.getSeconds()).padStart(2, '0'); - const finishTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + const finishTime = formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss'); const updateData = { ...originalTask.rawData, diff --git a/src/views/zhinengxunjian/zhixingjilu.vue b/src/views/zhinengxunjian/zhixingjilu.vue index d7185e3..8ec8f01 100644 --- a/src/views/zhinengxunjian/zhixingjilu.vue +++ b/src/views/zhinengxunjian/zhixingjilu.vue @@ -24,6 +24,9 @@
+
+ +
@@ -55,6 +58,7 @@
搜索 + 重置
@@ -552,6 +556,7 @@ import ImageUpload from '@/components/ImageUpload/index.vue'; import { ElMessageBox, ElMessage } from 'element-plus'; // 筛选条件 +const keyword = ref(''); const workOrderType = ref('all'); const workOrderStatus = ref('all'); const priority = ref('all'); @@ -961,6 +966,18 @@ const pagedTableData = computed(() => { // 筛选逻辑 let filteredData = [...rawTableData.value]; + if (keyword.value && keyword.value.trim()) { + const kw = keyword.value.trim(); + filteredData = filteredData.filter((item) => { + return ( + (item.title && item.title.includes(kw)) || + (item.description && item.description.includes(kw)) || + (item.creator && item.creator.includes(kw)) || + (item.orderNo && item.orderNo.includes(kw)) + ); + }); + } + if (workOrderType.value !== 'all') { // 转换筛选条件为显示文本进行匹配 let typeText = ''; @@ -1114,6 +1131,16 @@ const handleSearch = () => { currentPage.value = 1; // 重置到第一页 }; +// 重置筛选 +const resetFilters = () => { + keyword.value = ''; + workOrderType.value = 'all'; + workOrderStatus.value = 'all'; + priority.value = 'all'; + createDate.value = ''; + currentPage.value = 1; +}; + // 分页事件 const handleSizeChange = (val) => { pageSize.value = val; @@ -2191,46 +2218,7 @@ const handleCloseDetailDialog = () => { } /* 导航栏样式 */ -.navigation-tabs { - display: flex; - margin-bottom: 20px; - background-color: #fff; - border-radius: 4px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); - padding: 2px; -} - -.nav-tab { - padding: 12px 24px; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 4px; - font-size: 14px; - color: #606266; - border-right: 1px solid #f0f0f0; - flex: 1; - text-align: center; -} - -.nav-tab:last-child { - border-right: none; -} - -.nav-tab:hover { - color: #409eff; - background-color: #ecf5ff; -} - -.nav-tab.active { - background-color: #409eff; - color: #fff; - box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3); -} - -.nav-tab { - cursor: pointer; - user-select: none; -} +/* 导航栏相关样式移除(对应模板已注释) */ /* 弹窗样式 */ .create-dialog { @@ -2711,17 +2699,7 @@ const handleCloseDetailDialog = () => { } /* 动画效果 */ -@keyframes pulse { - 0% { - box-shadow: 0 0 0 0 rgba(22, 93, 255, 0.4); - } - 70% { - box-shadow: 0 0 0 10px rgba(22, 93, 255, 0); - } - 100% { - box-shadow: 0 0 0 0 rgba(22, 93, 255, 0); - } -} +/* 重复的 pulse 动画移除(下方已存在统一定义) */ .custom-steps { padding: 20px 10px; @@ -3122,17 +3100,7 @@ const handleCloseDetailDialog = () => { position: relative; overflow: hidden; } -.custom-steps::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background: linear-gradient(90deg, #165dff, #409eff, #69c0ff); - z-index: 0; - border-radius: 4px 4px 0 0; -} +/* 去重:自定义步骤条顶部装饰在下方统一块中定义 */ /* 重点跟踪区域样式 */ .tracking-section { @@ -3350,17 +3318,7 @@ const handleCloseDetailDialog = () => { } /* 顶部装饰条 */ -.custom-steps::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 6px; - background: linear-gradient(90deg, #165dff, #409eff, #69c0ff); - border-radius: 6px 6px 0 0; - box-shadow: 0 2px 12px rgba(22, 93, 255, 0.2); -} +/* 去重:自定义步骤条顶部装饰重复定义移除 */ /* 背景装饰 */ .custom-steps::after { @@ -3376,30 +3334,10 @@ const handleCloseDetailDialog = () => { } /* 左侧装饰 */ -.custom-steps::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 6px; - background: linear-gradient(90deg, #165dff, #409eff, #69c0ff); - border-radius: 6px 6px 0 0; - box-shadow: 0 2px 12px rgba(22, 93, 255, 0.2); -} +/* 去重:重复 before 装饰定义移除 */ /* 右侧装饰 */ -.custom-steps::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 6px; - background: linear-gradient(90deg, #165dff, #409eff, #69c0ff); - border-radius: 6px 6px 0 0; - box-shadow: 0 2px 12px rgba(22, 93, 255, 0.2); -} +/* 去重:重复 before 装饰定义移除 */ /* 左侧装饰球 */ .custom-steps::before {