| | |
| | | @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 |
| | |
| | | <template #statusRef="{ row }"> |
| | | <el-tag v-if="row.status === 2" type="danger">失败</el-tag> |
| | | <el-tag v-if="row.status === 1" type="success">完结</el-tag> |
| | | <el-tag v-if="row.status === 3" type="warning">待验收</el-tag> |
| | | <el-tag v-if="row.status === 0" type="warning">待保养</el-tag> |
| | | </template> |
| | | <template #operation="{ row }"> |
| | | <!-- 这个功能跟新增保养功能一模一样,有啥意义? --> |
| | | <!-- <el-button |
| | | type="primary" |
| | | text |
| | | @click="addMaintain(row)" |
| | | > |
| | | 新增保养 |
| | | </el-button> --> |
| | | <el-button |
| | | type="primary" |
| | | link |
| | | :disabled="row.status === 1" |
| | | :disabled="row.status === 1 || row.status === 3" |
| | | @click="editPlan(row.id)" |
| | | > |
| | | 编辑 |
| | | </el-button> |
| | | <el-button |
| | | v-if="row.status === 0" |
| | | type="success" |
| | | link |
| | | :disabled="row.status === 1" |
| | | @click="addMaintain(row)" |
| | | > |
| | | 保养 |
| | | </el-button> |
| | | <el-button |
| | | v-if="row.status === 3" |
| | | type="success" |
| | | link |
| | | @click="openAcceptanceDialog(row)" |
| | | > |
| | | 验收审批 |
| | | </el-button> |
| | | <el-button |
| | | type="danger" |
| | |
| | | > |
| | | 删除 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | link |
| | | @click="openFileDialog(row)" |
| | | > |
| | | 附件 |
| | | </el-button> |
| | | </template> |
| | | </PIMTable> |
| | | </div> |
| | |
| | | </el-tabs> |
| | | <PlanModal ref="planModalRef" @ok="getTableData" /> |
| | | <MaintenanceModal ref="maintainModalRef" @ok="getTableData" /> |
| | | <AcceptanceModal ref="acceptanceModalRef" @ok="getTableData" /> |
| | | <FormDia ref="formDiaRef" @closeDia="getScheduledTableData" /> |
| | | <FileListDialog |
| | | ref="fileListDialogRef" |
| | | v-model="fileDialogVisible" |
| | | :show-upload-button="true" |
| | | :show-delete-button="true" |
| | | :delete-method="handleAttachmentDelete" |
| | | :name-column-label="'附件名称'" |
| | | :rulesRegulationsManagementId="currentMaintenanceTaskId" |
| | | @upload="handleAttachmentUpload" /> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import PlanModal from './Form/PlanModal.vue' |
| | | import MaintenanceModal from './Form/MaintenanceModal.vue' |
| | | import FormDia from './Form/formDia.vue' |
| | | import AcceptanceModal from './Form/AcceptanceModal.vue' |
| | | import FileListDialog from '@/components/Dialog/FileListDialog.vue' |
| | | import { |
| | | getUpkeepPage, |
| | | delUpkeep, |
| | | deviceMaintenanceTaskList, |
| | | deviceMaintenanceTaskDel, |
| | | deviceMaintenanceTaskChangeEnable, |
| | | maintenanceAcceptance, |
| | | } from '@/api/equipmentManagement/upkeep' |
| | | import { |
| | | listMaintenanceTaskFiles, |
| | | addMaintenanceTaskFile, |
| | | delMaintenanceTaskFile, |
| | | } from '@/api/equipmentManagement/maintenanceTaskFile' |
| | | import dayjs from 'dayjs' |
| | | |
| | | const { proxy } = getCurrentInstance() |
| | |
| | | const planModalRef = ref() |
| | | // 保养弹窗控制器 |
| | | const maintainModalRef = ref() |
| | | // 验收审批弹窗控制器 |
| | | const acceptanceModalRef = ref() |
| | | // 定时任务弹窗控制器 |
| | | const formDiaRef = ref() |
| | | // 附件弹窗 |
| | | const fileListDialogRef = ref(null) |
| | | const fileDialogVisible = ref(false) |
| | | const currentMaintenanceTaskId = ref(null) |
| | | |
| | | // 任务记录tab(原设备保养页面)相关变量 |
| | | const filters = reactive({ |
| | |
| | | // 定时任务管理tab相关变量 |
| | | const scheduledFilters = reactive({ |
| | | taskName: '', |
| | | status: '', |
| | | isEnabled: undefined, |
| | | }) |
| | | |
| | | const scheduledDataList = ref([]) |
| | |
| | | |
| | | // 定时任务管理表格列配置 |
| | | const scheduledColumns = ref([ |
| | | { |
| | | label: "所在区域", |
| | | prop: "areaName", |
| | | }, |
| | | { prop: "taskName", label: "设备名称"}, |
| | | { |
| | | label: "规格型号", |
| | |
| | | DAILY: "每日", |
| | | WEEKLY: "每周", |
| | | MONTHLY: "每月", |
| | | QUARTERLY: "季度" |
| | | QUARTERLY: "季度", |
| | | YEARLY: "每年", |
| | | }[cell] || "") |
| | | }, |
| | | { |
| | |
| | | { prop: "registrant", label: "登记人", minWidth: 100 }, |
| | | { prop: "registrationDate", label: "登记日期", minWidth: 100 }, |
| | | { |
| | | label: "是否启用", |
| | | prop: "isEnabled", |
| | | dataType: "slot", |
| | | slot: "isEnabledRef", |
| | | align: "center", |
| | | width: "120px", |
| | | }, |
| | | { |
| | | fixed: "right", |
| | | label: "操作", |
| | | dataType: "slot", |
| | |
| | | |
| | | // 任务记录表格列配置(原设备保养表格列) |
| | | const columns = ref([ |
| | | { |
| | | label: "所在区域", |
| | | prop: "areaName", |
| | | }, |
| | | { |
| | | label: "设备名称", |
| | | align: "center", |
| | |
| | | slot: "statusRef", |
| | | }, |
| | | { |
| | | label: "验收人", |
| | | align: "center", |
| | | prop: "acceptanceName", |
| | | formatData: (cell) => cell || "-", |
| | | }, |
| | | { |
| | | label: "验收时间", |
| | | align: "center", |
| | | prop: "acceptanceTime", |
| | | formatData: (cell) => |
| | | cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-", |
| | | }, |
| | | { |
| | | label: "验收备注", |
| | | align: "center", |
| | | prop: "acceptanceRemark", |
| | | formatData: (cell) => cell || "-", |
| | | }, |
| | | { |
| | | fixed: "right", |
| | | label: "操作", |
| | | dataType: "slot", |
| | | slot: "operation", |
| | | align: "center", |
| | | width: "300px", |
| | | width: "350px", |
| | | }, |
| | | ]) |
| | | |
| | |
| | | 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() |
| | | } |
| | | |
| | |
| | | getScheduledTableData() |
| | | } catch (error) { |
| | | // 用户取消删除 |
| | | } |
| | | } |
| | | |
| | | 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 |
| | | } |
| | | } |
| | | |
| | |
| | | getTableData() |
| | | } |
| | | |
| | | // 附件相关方法 |
| | | // 查询附件列表 |
| | | const fetchMaintenanceTaskFiles = async (deviceMaintenanceId) => { |
| | | try { |
| | | const params = { |
| | | current: 1, |
| | | size: 100, |
| | | deviceMaintenanceId, |
| | | rulesRegulationsManagementId:deviceMaintenanceId |
| | | } |
| | | const res = await listMaintenanceTaskFiles(params) |
| | | const records = res?.data?.records || [] |
| | | const mapped = records.map(item => ({ |
| | | id: item.id, |
| | | name: item.fileName || item.name, |
| | | url: item.fileUrl || item.url, |
| | | raw: item, |
| | | })) |
| | | fileListDialogRef.value?.setList(mapped) |
| | | } catch (error) { |
| | | ElMessage.error('获取附件列表失败') |
| | | } |
| | | } |
| | | |
| | | // 打开附件弹窗 |
| | | const openFileDialog = async (row) => { |
| | | currentMaintenanceTaskId.value = row.id |
| | | fileDialogVisible.value = true |
| | | await fetchMaintenanceTaskFiles(row.id) |
| | | } |
| | | |
| | | // 打开验收审批弹窗 |
| | | const openAcceptanceDialog = (row) => { |
| | | acceptanceModalRef.value.open(row.id, row) |
| | | } |
| | | |
| | | // 刷新附件列表 |
| | | const refreshFileList = async () => { |
| | | if (!currentMaintenanceTaskId.value) return |
| | | await fetchMaintenanceTaskFiles(currentMaintenanceTaskId.value) |
| | | } |
| | | |
| | | // 上传附件 |
| | | const handleAttachmentUpload = async (filePayload) => { |
| | | if (!currentMaintenanceTaskId.value) return |
| | | try { |
| | | const payload = { |
| | | name: filePayload?.fileName || filePayload?.name, |
| | | url: filePayload?.fileUrl || filePayload?.url, |
| | | deviceMaintenanceId: currentMaintenanceTaskId.value, |
| | | } |
| | | await addMaintenanceTaskFile(payload) |
| | | ElMessage.success('文件上传成功') |
| | | await refreshFileList() |
| | | } catch (error) { |
| | | ElMessage.error('文件上传失败') |
| | | } |
| | | } |
| | | |
| | | // 删除附件 |
| | | const handleAttachmentDelete = async (row) => { |
| | | if (!row?.id) return false |
| | | try { |
| | | await ElMessageBox.confirm('确认删除该附件?', '提示', { type: 'warning' }) |
| | | } catch { |
| | | return false |
| | | } |
| | | try { |
| | | await delMaintenanceTaskFile(row.id) |
| | | ElMessage.success('删除成功') |
| | | await refreshFileList() |
| | | return true |
| | | } catch (error) { |
| | | ElMessage.error('删除失败') |
| | | return false |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | // 根据默认激活的 Tab 调用对应的查询接口 |
| | | if (activeTab.value === 'scheduled') { |