diff --git a/src/views/zhinengxunjian/banzhuzhuangtai.vue b/src/views/zhinengxunjian/banzhuzhuangtai.vue index dd67f95..3cbe46e 100644 --- a/src/views/zhinengxunjian/banzhuzhuangtai.vue +++ b/src/views/zhinengxunjian/banzhuzhuangtai.vue @@ -22,18 +22,37 @@ -
-
- - 重置 - 新增班组 + +
+
+ + + + + + + + + + + + + + + + + + 搜索 + 重置 + + +
+
+ +
+ 新增班组 +
@@ -178,13 +197,35 @@ diff --git a/src/views/zhinengxunjian/qiangxiujilu.vue b/src/views/zhinengxunjian/qiangxiujilu.vue index f0d84df..af1f822 100644 --- a/src/views/zhinengxunjian/qiangxiujilu.vue +++ b/src/views/zhinengxunjian/qiangxiujilu.vue @@ -39,10 +39,9 @@
- + - - +
@@ -426,13 +425,52 @@ const getTaskList = async () => { try { isLoading.value = true; - // 构建查询参数 + // 构建查询参数,严格匹配JSON数据结构 const params = { projectId: 1, pageNum: currentPage.value, pageSize: pageSize.value }; + // 添加任务状态筛选条件 - 严格匹配JSON数据中的status字段 + if (taskStatus.value && taskStatus.value !== 'all') { + // 状态映射:pending -> 1(待处理), processing -> 2(处理中), completed -> 3(已完成) + const statusMap = { + 'pending': '1', + 'processing': '2', + 'completed': '3' + }; + params.status = statusMap[taskStatus.value] || taskStatus.value; + } + + // 添加紧急程度筛选条件 - 严格匹配JSON数据中的level字段 + if (priority.value && priority.value !== 'all') { + // 优先级映射:normal -> 1(常规), urgent -> 2(紧急), fatal -> 3(致命) + const priorityMap = { + 'normal': '1', + 'urgent': '2', + 'fatal': '3' + }; + params.level = priorityMap[priority.value] || priority.value; + } + + // 添加维修人员筛选条件 - 严格匹配JSON数据中的sendPerson字段 + if (executor.value && executor.value !== 'all') { + // 直接使用用户ID作为sendPerson参数 + params.sendPerson = executor.value; + } + + // 添加时间范围筛选条件 + if (dateRange.value && dateRange.value.length === 2) { + params.startTime = dateRange.value[0]; + params.endTime = dateRange.value[1]; + } + + // 添加关键词搜索条件 + if (keyword.value && keyword.value.trim()) { + params.keyword = keyword.value.trim(); + } + // 调用接口获取数据 const res = await qiangxiulist(params); @@ -470,9 +508,7 @@ const getTaskList = async () => { 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)) + [r.reportNo, r.content, r.reporter, r.handler, r.status].filter(Boolean).some((v) => String(v).toLowerCase().includes(kw)) ) : mapped; @@ -650,7 +686,7 @@ const getStatisticsData = async () => { // 初始化数据 const initData = async () => { - await Promise.all([getTaskList(), getStatisticsData()]); + await Promise.all([getTaskList(), getStatisticsData(), getUsersList()]); }; // 组件挂载时初始化数据 @@ -690,6 +726,27 @@ const selectedExecutor = ref(''); const executors = ref([]); const assignLoading = ref(false); +// 获取用户列表函数 +const getUsersList = async () => { + try { + loadingUsers.value = true; + const res = await xunjianUserlist(); + if (res && res.code === 200) { + // 过滤无效数据+统一userId为字符串 + executors.value = (res.rows || []) + .filter((item) => item.userId && item.userName) + .map((item) => ({ + userId: item.userId.toString(), // 使用userId字段 + userName: item.userName || '未知用户' + })); + } + } catch (error) { + console.error('获取用户列表失败:', error); + } finally { + loadingUsers.value = false; + } +}; + // 跟进弹窗相关 const followDialogVisible = ref(false); const reportFinal = ref(''); @@ -773,16 +830,8 @@ const handleAction = (record) => { const handleAssign = async (record) => { currentRecord.value = { ...record }; try { - const res = await xunjianUserlist(); - if (res && res.code === 200) { - // 过滤无效数据+统一userId为字符串 - executors.value = (res.rows || []) - .filter((item) => item.userId && item.userName) - .map((item) => ({ - userId: item.userId.toString(), // 使用userId字段 - userName: item.userName || '未知用户' - })); - } + // 重新获取用户列表以确保最新数据 + await getUsersList(); } catch (error) { console.error('获取人员列表失败:', error); ElMessage.error('获取人员列表失败,请稍后重试'); diff --git a/src/views/zhinengxunjian/shiyanguanli.vue b/src/views/zhinengxunjian/shiyanguanli.vue index 7d692c8..14043ce 100644 --- a/src/views/zhinengxunjian/shiyanguanli.vue +++ b/src/views/zhinengxunjian/shiyanguanli.vue @@ -24,19 +24,26 @@
- - + + - - - + + + + - + - - - + + + + + + + + +
搜索 - 重置 + 重置 新增实验记录
@@ -586,6 +593,7 @@ const timeRange = ref('month'); // 统计时间范围:月/周/日 const keyword = ref(''); const filterStatus = ref('all'); const filterType = ref('all'); +const filterManager = ref('all'); const dateRange = ref([]); // 分页参数 @@ -603,8 +611,14 @@ const fetchExperimentData = async () => { const queryParams = { projectId: 1, pageSize: pageSize.value, - pageNum: currentPage.value - // 其他参数... + pageNum: currentPage.value, + // 根据筛选条件构建查询参数 + keyword: keyword.value || undefined, + testStatus: filterStatus.value === 'all' ? undefined : filterStatus.value, + testObject: filterType.value === 'all' ? undefined : filterType.value, + personCharge: filterManager.value === 'all' ? undefined : filterManager.value, + beginTime: dateRange.value.length > 0 ? dateRange.value[0] : undefined, + endTime: dateRange.value.length > 0 ? dateRange.value[1] : undefined }; const response = await shiyanlist(queryParams); @@ -642,6 +656,7 @@ const resetFilters = () => { keyword.value = ''; filterStatus.value = 'all'; filterType.value = 'all'; + filterManager.value = 'all'; dateRange.value = []; currentPage.value = 1; fetchExperimentData(); diff --git a/src/views/zhinengxunjian/shiyanjilu.vue b/src/views/zhinengxunjian/shiyanjilu.vue index ad2012a..90f091b 100644 --- a/src/views/zhinengxunjian/shiyanjilu.vue +++ b/src/views/zhinengxunjian/shiyanjilu.vue @@ -23,19 +23,21 @@
- - + + - - - + + + + - + - - - + + + +
-

{{ record.taskName || '试验任务' }}

+

{{ record.taskName || record.testPlan?.planName || '试验任务' }}

开始时间 {{ formatDate(record.beginTime) }} - 计划完成时间: {{ record.planFinishTime ? formatDate(record.planFinishTime) : '未知' }} + 计划完成时间: {{ record.endTime ? formatDate(record.endTime) : '未知' }}

{{ getStatusText(record.status) }} @@ -172,11 +174,11 @@

- {{ record.status === '3' ? '失败原因分析' : '试验结果' }} + {{ record.status === '4' ? '失败原因分析' : '试验结果' }}

- {{ record.status === '3' ? record.failReason || '未提供失败原因' : record.testFinal || '试验未完成,未提供详细结果' }} + {{ record.status === '4' ? record.failReason || '未提供失败原因' : record.testFinal || '试验未完成,未提供详细结果' }}

@@ -185,7 +187,7 @@

-
+

建议: {{ record.faileTips }}

@@ -399,7 +401,7 @@ const activeTab = ref('record'); // 默认显示"试验记录" // 2. 筛选条件 const keyword = ref(''); -const filterStatus = ref('all'); +const status = ref('all'); const filterType = ref('all'); const dateRange = ref([]); @@ -433,18 +435,33 @@ const currentPage = ref(1); const pageSize = ref(20); const totalRecords = ref(0); -// 7. 方法:获取试验记录数据 +// 7. 方法:获取试验记录数据,根据提供的JSON数据结构优化参数 const getTestRecords = async () => { try { - const response = await syrenwulist({ + // 构建与JSON数据结构匹配的查询参数 + const queryParams = { projectId: 1, - page: currentPage.value, - size: pageSize.value - }); + pageNum: currentPage.value, + pageSize: pageSize.value, + // 筛选条件 + keyword: keyword.value || undefined, + status: status.value === 'all' ? undefined : status.value, + testObject: filterType.value === 'all' ? undefined : filterType.value, + beginTime: dateRange.value.length > 0 ? dateRange.value[0] : undefined, + endTime: dateRange.value.length > 0 ? dateRange.value[1] : undefined + }; + + const response = await syrenwulist(queryParams); console.log('syrenwulist API响应:', response); if (response && response.code === 200 && response.rows) { - testRecords.value = response.rows; + // 处理返回的数据,确保ID是字符串避免大整数精度问题 + testRecords.value = response.rows.map((item) => ({ + ...item, + id: String(item.id), // 强制转换为字符串 + // 处理personInfo字段,确保与页面显示匹配 + personInfo: item.person || item.persons?.[0] || null + })); totalRecords.value = response.total; } } catch (error) { @@ -452,35 +469,51 @@ const getTestRecords = async () => { } }; -// 前端过滤后的试验记录 +// 前端过滤后的试验记录,与JSON数据结构匹配 const filteredTestRecords = computed(() => { let data = [...testRecords.value]; + // 关键字过滤 - 匹配planName/planCode/负责人姓名 if (keyword.value && keyword.value.trim()) { const kw = keyword.value.trim(); data = data.filter((rec) => { return ( - (rec.taskName && rec.taskName.includes(kw)) || + (rec.planName && rec.planName.includes(kw)) || + (rec.planCode && rec.planCode.includes(kw)) || (rec.personInfo?.userName && rec.personInfo.userName.includes(kw)) || (rec.id && String(rec.id).includes(kw)) ); }); } - // 可根据筛选状态/类型进一步过滤(若后续需要) + // 状态过滤 - 匹配返回数据中的status字段 + if (status.value !== 'all') { + data = data.filter((rec) => rec.status === status.value); + } + + // 类型过滤 + if (filterType.value !== 'all') { + data = data.filter((rec) => rec.testObject === filterType.value); + } + return data; }); // 搜索与重置 const handleSearch = () => { - // 若后端支持条件,可在此调用接口;当前保持前端过滤 + // 重置为第一页并重新获取数据 + currentPage.value = 1; + getTestRecords(); }; const resetFilters = () => { keyword.value = ''; - filterStatus.value = 'all'; + status.value = 'all'; filterType.value = 'all'; dateRange.value = []; + currentPage.value = 1; + // 重置后重新获取数据 + getTestRecords(); }; // 8. 方法:获取统计数据 @@ -592,14 +625,13 @@ const getProgressColor = (status) => { return colorMap[status] || '#e5e7eb'; }; -// 15. 辅助方法:获取状态文本 +// 15. 辅助方法:获取状态文本 - 根据返回数据更新状态映射 const getStatusText = (status) => { const statusMap = { '1': '待执行', - '4': '执行中', - '2': '已延期', - '5': '已完成', - '3': '失败', + '2': '执行中', + '3': '已完成', + '4': '失败', 'completed': '已完成', 'failed': '失败', 'paused': '已延期', @@ -628,14 +660,13 @@ const getTaskStatusText = (status) => { return statusMap[status] || '未知状态'; }; -// 17. 辅助方法:获取状态类名 +// 17. 辅助方法:获取状态类名 - 根据返回数据更新状态类映射 const getStatusClass = (status) => { const classMap = { '1': 'tag-pending', // 待执行 - '4': 'tag-executing', // 执行中 - '2': 'status-unknown', // 未完成 - '5': 'tag-completed', // 已完成 - '3': 'status-failed', // 失败 + '2': 'tag-executing', // 执行中 + '3': 'tag-completed', // 已完成 + '4': 'status-failed', // 失败 'completed': 'tag-completed', 'failed': 'status-failed', 'paused': 'tag-delayed', diff --git a/src/views/zhinengxunjian/shiyanrenwu.vue b/src/views/zhinengxunjian/shiyanrenwu.vue index c9781e7..a9a1d8a 100644 --- a/src/views/zhinengxunjian/shiyanrenwu.vue +++ b/src/views/zhinengxunjian/shiyanrenwu.vue @@ -32,19 +32,11 @@ -
-
- - - - - - -
+
@@ -706,14 +698,14 @@ const getExperimentPlanList = async () => { const getTaskList = async () => { try { loading.value = true; - // 1. 构造接口请求参数(严格匹配createDept结构) + // 1. 构造接口请求参数(严格匹配返回的JSON数据结构) const requestParams = { pageNum: currentPage.value, pageSize: pageSize.value, - projectId: 1, // 项目ID(必需字段,需从全局状态/路由获取真实值) - status: taskStatus.value || undefined, // 任务状态(为空不传递) - testPlanId: planType.value || undefined, // 关联计划ID(筛选条件) - person: executor.value === 'all' ? undefined : executor.value // 执行人ID(筛选条件) + projectId: 1, // 项目ID(必需字段) + status: taskStatus.value || undefined, // 任务状态(对应JSON中的status字段) + testPlanId: planType.value || undefined, // 关联计划ID(对应JSON中的testPlanId字段) + person: executor.value === 'all' ? undefined : executor.value // 执行人ID(对应JSON中的person字段) }; // 2. 调用接口(已引入的syrenwulist函数) @@ -1124,9 +1116,9 @@ const handleAction = async (task) => { case '3': // 失败 → 重试(状态改为1) updateParams.status = '1'; // 清空失败相关字段,使用适合各字段数据类型的默认值 - updateParams.failReason = ''; - updateParams.failTime = ''; // 时间类型字段使用null - updateParams.failPhase = ''; // 整数类型字段使用0 + updateParams.failReason = null; + updateParams.failTime = null; // 时间类型字段使用null + updateParams.failPhase = null; // 整数类型字段使用0 // 将失败的步骤状态改回2(未完成) if (taskDetails.nodes && Array.isArray(taskDetails.nodes)) { diff --git a/src/views/zhinengxunjian/xunjianjihua.vue b/src/views/zhinengxunjian/xunjianjihua.vue index e4d4f6a..e34f807 100644 --- a/src/views/zhinengxunjian/xunjianjihua.vue +++ b/src/views/zhinengxunjian/xunjianjihua.vue @@ -145,7 +145,7 @@
-->
- 解决效率 + 问题解决效率 {{ timelinessRate }}%
@@ -394,7 +394,7 @@ const initPieChart = () => { }, data: [ { value: completionRate.value, name: '巡检完成率', itemStyle: { color: '#409eff' } }, - { value: timelinessRate.value, name: '解决效率', itemStyle: { color: '#67c23a' } } + { value: timelinessRate.value, name: '问题解决效率', itemStyle: { color: '#67c23a' } } ] } ] @@ -434,12 +434,12 @@ const fetchDashboardData = async () => { // 根据时间范围确定type参数:1是月,2是周,3是日 let type; if (timeRange.value === 'month') { - type = 1; + type = 3; } else if (timeRange.value === 'week') { type = 2; } else { // day - type = 3; + type = 1; } // 构建查询参数 diff --git a/src/views/zhinengxunjian/xunjianrenwu.vue b/src/views/zhinengxunjian/xunjianrenwu.vue index d29d91c..351476a 100644 --- a/src/views/zhinengxunjian/xunjianrenwu.vue +++ b/src/views/zhinengxunjian/xunjianrenwu.vue @@ -28,22 +28,17 @@
- - - - + + + +
- - - - + +
-
- -
搜索 重置 @@ -441,6 +436,10 @@ const planType = ref(''); const executor = ref(''); const keyword = ref(''); +// 执行人列表相关 +const usersList = ref([]); +const loadingUsers = ref(false); + // 任务数据 - 初始为空数组,通过API获取 const tasks = ref([]); @@ -549,7 +548,11 @@ const getTaskList = async () => { const params = { pageSize: pageSize.value, pageNum: currentPage.value, - projectId: 1 + projectId: 1, + status: taskStatus.value || undefined, + planType: planType.value || undefined, + personId: executor.value || undefined, + keyword: keyword.value.trim() || undefined }; const response = await xjrenwulist(params); @@ -629,6 +632,7 @@ const getTaskList = async () => { // 页面加载时获取数据 onMounted(() => { getTaskList(); + getUsersList(); }); // 分页相关 @@ -880,11 +884,13 @@ const planList = ref([]); // 获取负责人列表 const getUsersList = async () => { + loadingUsers.value = true; try { const response = await xunjianUserlist(); // 适配新接口格式:检查code为200且rows为数组 const userRows = response.code === 200 && response.rows && Array.isArray(response.rows) ? response.rows : []; + // 更新userList变量(用于创建任务弹窗) userList.value = userRows .filter((item) => item && typeof item === 'object') .map((item) => ({ @@ -892,12 +898,27 @@ const getUsersList = async () => { value: String(item.userId || '') // 使用userId作为唯一标识 })); + // 同时更新usersList变量(用于筛选栏) + usersList.value = userRows + .filter((item) => item && typeof item === 'object') + .map((item) => ({ + id: String(item.userId || ''), + name: item.userName || '未知用户' + })); + + // 空数据处理 if (userList.value.length === 0) { userList.value = [{ label: '默认用户', value: 'default' }]; } + if (usersList.value.length === 0) { + usersList.value = [{ id: 'default', name: '默认用户' }]; + } } catch (error) { console.error('获取负责人列表失败:', error); userList.value = [{ label: '默认用户', value: 'default' }]; + usersList.value = [{ id: 'default', name: '默认用户' }]; + } finally { + loadingUsers.value = false; } };