feat(equipment): 添加设备维保和巡检任务的启用状态功能
- 在维保任务表单中新增是否启用开关组件
- 在巡检任务表单中新增是否启用开关组件
- 添加启用状态的数据字段初始化和赋值逻辑
- 实现后端API接口用于切换任务启用状态
- 在维保任务列表中添加启用状态筛选条件
- 在巡检任务列表中添加启用状态筛选条件
- 实现表格中启用状态开关的实时切换功能
- 添加启用状态切换前的验证和错误处理机制
- 优化数据加载时启用状态字段的兼容性处理
| | |
| | | data: params, |
| | | }); |
| | | }; |
| | | |
| | | // 设备保养定时任务启用状态切换 |
| | | export const deviceMaintenanceTaskChangeEnable = (params) => { |
| | | return request({ |
| | | url: '/deviceMaintenanceTask/changeEnable', |
| | | method: "post", |
| | | data: params, |
| | | }); |
| | | }; |
| | |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | } |
| | | |
| | | // 定时巡检任务启用状态切换 |
| | | export function changeTimingTaskEnable(query) { |
| | | return request({ |
| | | url: '/timingTask/changeEnable', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | |
| | | <el-input v-model="form.remarks" placeholder="请输入备注" type="textarea" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="是否启用" prop="isEnabled"> |
| | | <el-switch |
| | | v-model="form.isEnabled" |
| | | :active-value="1" |
| | | :inactive-value="0" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | |
| | | inspector: [], |
| | | inspectorIds: "", |
| | | remarks: "", |
| | | isEnabled: 1, |
| | | frequencyType: "", |
| | | frequencyDetail: "", |
| | | week: "", |
| | |
| | | inspector: [], |
| | | inspectorIds: "", |
| | | remarks: "", |
| | | isEnabled: 1, |
| | | frequencyType: "", |
| | | frequencyDetail: "", |
| | | week: "", |
| | |
| | | form.value = { |
| | | ...form.value, |
| | | ...row, |
| | | isEnabled: Number(row.isEnabled ?? row.status ?? 1), |
| | | inspector: row.inspectorIds |
| | | ? String(row.inspectorIds) |
| | | .split(",") |
| | |
| | | payload.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(","); |
| | | payload.taskName = form.value.taskName; |
| | | payload.deviceModel = form.value.deviceModel || "-"; |
| | | payload.isEnabled = Number(form.value.isEnabled ?? 1); |
| | | |
| | | await addOrEditTimingTask(payload); |
| | | cancel(); |
| | |
| | | style="width: 220px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item v-show="activeRadio === 'taskManage'" label="是否启用"> |
| | | <el-select |
| | | v-model="queryParams.isEnabled" |
| | | placeholder="请选择" |
| | | clearable |
| | | style="width: 140px" |
| | | > |
| | | <el-option label="启用" :value="1" /> |
| | | <el-option label="禁用" :value="0" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item v-show="activeRadio === 'task'" label="执行日期"> |
| | | <el-date-picker |
| | | v-model="queryDate" |
| | |
| | | <span v-else class="no-data">--</span> |
| | | </div> |
| | | </template> |
| | | <template #isEnabledSwitch="{ row }"> |
| | | <el-switch |
| | | v-model="row.isEnabled" |
| | | :active-value="1" |
| | | :inactive-value="0" |
| | | :loading="row.enableSwitchLoading" |
| | | :before-change="() => handleTimingTaskEnableBeforeChange(row)" |
| | | /> |
| | | </template> |
| | | </PIMTable> |
| | | </el-card> |
| | | <form-dia ref="formDia" @closeDia="handleQuery" /> |
| | |
| | | |
| | | <script setup> |
| | | import { Delete, Plus } from "@element-plus/icons-vue"; |
| | | import { ElMessageBox } from "element-plus"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { getCurrentInstance, nextTick, onMounted, reactive, ref } from "vue"; |
| | | import dayjs from "dayjs"; |
| | | import PIMTable from "@/components/PIMTable/PIMTable.vue"; |
| | | import FormDia from "@/views/equipmentManagement/inspectionManagement/components/formDia.vue"; |
| | | import ViewFiles from "@/views/equipmentManagement/inspectionManagement/components/viewFiles.vue"; |
| | | import { |
| | | changeTimingTaskEnable, |
| | | delTimingTask, |
| | | inspectionTaskList, |
| | | timingTaskList, |
| | |
| | | const queryParams = reactive({ |
| | | taskName: "", |
| | | areaId: undefined, |
| | | isEnabled: undefined, |
| | | createTimeStart: undefined, |
| | | createTimeEnd: undefined, |
| | | }); |
| | |
| | | { prop: "registrant", label: "登记人", minWidth: 100 }, |
| | | { prop: "createTime", label: "登记日期", width: 130 }, |
| | | ]); |
| | | |
| | | const isEnabledColumn = { |
| | | prop: "isEnabled", |
| | | label: "是否启用", |
| | | minWidth: 110, |
| | | dataType: "slot", |
| | | slot: "isEnabledSwitch", |
| | | }; |
| | | |
| | | // 巡检状态列(仅定时任务记录显示) |
| | | const inspectionStatusColumn = { |
| | |
| | | const radioChange = (value) => { |
| | | if (value === "taskManage") { |
| | | const operationColumn = getOperationColumn(["edit"]); |
| | | tableColumns.value = [...columns.value, ...(operationColumn ? [operationColumn] : [])]; |
| | | tableColumns.value = [...columns.value, isEnabledColumn, ...(operationColumn ? [operationColumn] : [])]; |
| | | } else { |
| | | const operationColumn = getOperationColumn(["viewFile"]); |
| | | // 定时任务记录添加巡检状态列 |
| | | tableColumns.value = [...columns.value, inspectionStatusColumn, inspectionResultColumn, ...(operationColumn ? [operationColumn] : [])]; |
| | | // 切换到定时任务记录时,默认查询当天 |
| | | queryDate.value = dayjs().format("YYYY-MM-DD"); |
| | | queryParams.isEnabled = undefined; |
| | | } |
| | | pageNum.value = 1; |
| | | pageSize.value = 10; |
| | |
| | | const rawData = res?.data?.records || []; |
| | | tableData.value = rawData.map((item) => { |
| | | const processedItem = { ...item }; |
| | | if (activeRadio.value === "taskManage") { |
| | | processedItem.isEnabled = Number( |
| | | processedItem.isEnabled ?? processedItem.status ?? 1 |
| | | ); |
| | | processedItem.enableSwitchLoading = false; |
| | | } |
| | | if (processedItem.inspector) { |
| | | if (typeof processedItem.inspector === "string") { |
| | | processedItem.inspector = processedItem.inspector |
| | |
| | | const resetQuery = () => { |
| | | queryParams.taskName = ""; |
| | | queryParams.areaId = undefined; |
| | | queryParams.isEnabled = undefined; |
| | | queryParams.createTimeStart = undefined; |
| | | queryParams.createTimeEnd = undefined; |
| | | // 定时任务记录时重置为当天 |
| | |
| | | selectedRows.value = selection; |
| | | }; |
| | | |
| | | const handleTimingTaskEnableBeforeChange = async (row) => { |
| | | if (row.enableSwitchLoading) { |
| | | return false; |
| | | } |
| | | const nextValue = Number(row.isEnabled) === 1 ? 0 : 1; |
| | | row.enableSwitchLoading = true; |
| | | try { |
| | | const res = await changeTimingTaskEnable({ |
| | | id: row.id, |
| | | isEnabled: nextValue, |
| | | }); |
| | | if (res?.code !== 200) { |
| | | throw new Error(res?.msg || "更新失败"); |
| | | } |
| | | ElMessage.success("启用状态已更新"); |
| | | return true; |
| | | } catch (error) { |
| | | proxy.$modal.msgError(error?.message || "启用状态更新失败"); |
| | | return false; |
| | | } finally { |
| | | row.enableSwitchLoading = false; |
| | | } |
| | | }; |
| | | |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", { |
| | | confirmButtonText: "确认", |
| | |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="是否启用" prop="isEnabled"> |
| | | <el-switch |
| | | v-model="form.isEnabled" |
| | | :active-value="1" |
| | | :inactive-value="0" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="备注" prop="remarks"> |
| | | <el-input v-model="form.remarks" placeholder="请输入备注" type="textarea" /> |
| | | </el-form-item> |
| | |
| | | deviceLedgerIds: [], |
| | | deviceLedgerIdsStr: undefined, |
| | | taskName: undefined, |
| | | isEnabled: 1, |
| | | inspector: undefined, |
| | | remarks: "", |
| | | frequencyType: "", |
| | |
| | | deviceLedgerIds: [], |
| | | deviceLedgerIdsStr: undefined, |
| | | taskName: undefined, |
| | | isEnabled: 1, |
| | | inspector: undefined, |
| | | remarks: "", |
| | | frequencyType: "", |
| | |
| | | form.value = { |
| | | ...form.value, |
| | | ...row, |
| | | isEnabled: Number(row.isEnabled ?? row.status ?? 1), |
| | | inspector: row.registrantId || row.inspector, |
| | | }; |
| | | form.value.deviceLedgerIds = normalizeIdList( |
| | |
| | | payload.frequencyDetail = `${payload.week},${payload.time}`; |
| | | } |
| | | |
| | | if ( |
| | | payload.status === undefined || |
| | | payload.status === null || |
| | | payload.status === "" |
| | | ) { |
| | | payload.status = "0"; |
| | | } |
| | | payload.isEnabled = Number(form.value.isEnabled ?? 1); |
| | | |
| | | payload.deviceLedgerIds = [...form.value.deviceLedgerIds]; |
| | | payload.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(","); |
| | |
| | | @change="getScheduledTableData" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="任务状态"> |
| | | <el-select v-model="scheduledFilters.status" placeholder="请选择任务状态" clearable style="width: 200px"> |
| | | <el-option label="启用" value="1" /> |
| | | <el-option label="停用" value="0" /> |
| | | <el-form-item label="是否启用"> |
| | | <el-select v-model="scheduledFilters.isEnabled" placeholder="请选择是否启用" clearable style="width: 200px"> |
| | | <el-option label="启用" :value="1" /> |
| | | <el-option label="禁用" :value="0" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | @selection-change="handleScheduledSelectionChange" |
| | | @pagination="changeScheduledPage" |
| | | > |
| | | <template #statusRef="{ row }"> |
| | | <el-tag v-if="row.status === 1" type="success">启用</el-tag> |
| | | <el-tag v-if="row.status === 0" type="danger">停用</el-tag> |
| | | <template #isEnabledRef="{ row }"> |
| | | <el-switch |
| | | v-model="row.isEnabled" |
| | | :active-value="1" |
| | | :inactive-value="0" |
| | | :loading="row.enableSwitchLoading" |
| | | :before-change="() => handleScheduledEnableBeforeChange(row)" |
| | | /> |
| | | </template> |
| | | <template #operation="{ row }"> |
| | | <el-button |
| | |
| | | delUpkeep, |
| | | deviceMaintenanceTaskList, |
| | | deviceMaintenanceTaskDel, |
| | | deviceMaintenanceTaskChangeEnable, |
| | | } from '@/api/equipmentManagement/upkeep' |
| | | import { |
| | | listMaintenanceTaskFiles, |
| | |
| | | // 定时任务管理tab相关变量 |
| | | const scheduledFilters = reactive({ |
| | | taskName: '', |
| | | status: '', |
| | | isEnabled: undefined, |
| | | }) |
| | | |
| | | const scheduledDataList = ref([]) |
| | |
| | | }, |
| | | { prop: "registrant", label: "登记人", minWidth: 100 }, |
| | | { prop: "registrationDate", label: "登记日期", minWidth: 100 }, |
| | | { |
| | | label: "是否启用", |
| | | prop: "isEnabled", |
| | | dataType: "slot", |
| | | slot: "isEnabledRef", |
| | | align: "center", |
| | | width: "120px", |
| | | }, |
| | | { |
| | | fixed: "right", |
| | | label: "操作", |
| | |
| | | current: scheduledPagination.currentPage, |
| | | size: scheduledPagination.pageSize, |
| | | taskName: scheduledFilters.taskName || undefined, |
| | | status: scheduledFilters.status || undefined, |
| | | isEnabled: scheduledFilters.isEnabled, |
| | | } |
| | | const { code, data } = await deviceMaintenanceTaskList(params) |
| | | if (code === 200) { |
| | | scheduledDataList.value = data?.records || [] |
| | | const records = data?.records || [] |
| | | scheduledDataList.value = records.map((item) => ({ |
| | | ...item, |
| | | isEnabled: Number(item.isEnabled ?? item.status ?? 1), |
| | | enableSwitchLoading: false, |
| | | })) |
| | | scheduledPagination.total = data?.total || 0 |
| | | } |
| | | } catch (error) { |
| | |
| | | |
| | | const resetScheduledFilters = () => { |
| | | scheduledFilters.taskName = '' |
| | | scheduledFilters.status = '' |
| | | scheduledFilters.isEnabled = undefined |
| | | getScheduledTableData() |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | const handleScheduledEnableBeforeChange = async (row) => { |
| | | if (row.enableSwitchLoading) { |
| | | return false |
| | | } |
| | | const nextValue = Number(row.isEnabled) === 1 ? 0 : 1 |
| | | row.enableSwitchLoading = true |
| | | try { |
| | | const res = await deviceMaintenanceTaskChangeEnable({ |
| | | id: row.id, |
| | | isEnabled: nextValue, |
| | | }) |
| | | if (res?.code !== 200) { |
| | | throw new Error(res?.msg || '更新失败') |
| | | } |
| | | ElMessage.success('启用状态已更新') |
| | | return true |
| | | } catch (error) { |
| | | ElMessage.error(error?.message || '启用状态更新失败') |
| | | return false |
| | | } finally { |
| | | row.enableSwitchLoading = false |
| | | } |
| | | } |
| | | |
| | | const handleScheduledOut = () => { |
| | | ElMessage.info('导出定时任务功能待实现') |
| | | } |