| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-tabs v-model="activeTab" @tab-change="handleTabChange"> |
| | | <!-- 定时任务管理tab --> |
| | | <el-tab-pane label="定时任务管理" name="scheduled"> |
| | | <!-- 保养任务管理tab --> |
| | | <el-tab-pane label="保养任务管理" name="scheduled"> |
| | | <div class="search_form"> |
| | | <el-form :model="scheduledFilters" :inline="true"> |
| | | <el-form-item label="任务名称"> |
| | |
| | | /> |
| | | </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-select v-model="scheduledFilters.isActive" placeholder="请选择任务状态" clearable style="width: 200px"> |
| | | <el-option label="启用" :value="1" /> |
| | | <el-option label="停用" :value="0" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | </div> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-text class="mx-1" size="large">定时任务管理</el-text> |
| | | <el-text class="mx-1" size="large">保养任务管理</el-text> |
| | | <div> |
| | | <el-button type="primary" icon="Plus" @click="addScheduledTask"> |
| | | 新增任务 |
| | |
| | | @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> |
| | | <el-tag v-if="row.isActive === 1" type="success">启用</el-tag> |
| | | <el-tag v-if="row.isActive === 0" type="danger">停用</el-tag> |
| | | </template> |
| | | <template #operation="{ row }"> |
| | | <el-button |
| | |
| | | </el-tab-pane> |
| | | |
| | | <!-- 任务记录tab(原设备保养页面) --> |
| | | <el-tab-pane label="任务记录" name="record"> |
| | | <el-tab-pane label="保养任务记录" name="record"> |
| | | <div class="search_form"> |
| | | <el-form :model="filters" :inline="true"> |
| | | <el-form-item label="设备名称"> |
| | |
| | | </div> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-text class="mx-1" size="large">任务记录</el-text> |
| | | <el-text class="mx-1" size="large">保养任务记录</el-text> |
| | | <div> |
| | | <el-button type="success" icon="Van" @click="addPlan"> |
| | | 新增计划 |
| | |
| | | @selection-change="handleSelectionChange" |
| | | @pagination="changePage" |
| | | > |
| | | <template #maintenanceResultRef="{ row }"> |
| | | <div>{{ row.maintenanceResult || '-' }}</div> |
| | | </template> |
| | | <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 === 0" type="warning">待保养</el-tag> |
| | | </template> |
| | | <template #operation="{ row }"> |
| | | <!-- 这个功能跟新增保养功能一模一样,有啥意义? --> |
| | | <!-- <el-button |
| | | type="primary" |
| | | text |
| | | @click="addMaintain(row)" |
| | | <el-button |
| | | type="primary" |
| | | link |
| | | @click="openDetail(row)" |
| | | > |
| | | 新增保养 |
| | | </el-button> --> |
| | | 详情 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | link |
| | |
| | | <PlanModal ref="planModalRef" @ok="getTableData" /> |
| | | <MaintenanceModal ref="maintainModalRef" @ok="getTableData" /> |
| | | <FormDia ref="formDiaRef" @closeDia="getScheduledTableData" /> |
| | | <FileListDialog |
| | | <UpkeepDetailModal ref="upkeepDetailModalRef" :java-api="javaApi" /> |
| | | <FileListDialog |
| | | ref="fileListDialogRef" |
| | | v-model="fileDialogVisible" |
| | | :show-upload-button="true" |
| | | :show-delete-button="true" |
| | | :title="currentRecordFinished ? '附件(已完结,仅可查看)' : '附件'" |
| | | :show-upload-button="!currentRecordFinished" |
| | | :show-delete-button="!currentRecordFinished" |
| | | :delete-method="handleAttachmentDelete" |
| | | :name-column-label="'附件名称'" |
| | | :rulesRegulationsManagementId="currentMaintenanceTaskId" |
| | | @upload="handleAttachmentUpload" /> |
| | | :upload-url="maintenanceFileUploadUrl" |
| | | :upload-data="maintenanceFileUploadData" |
| | | :upload-direct-save="true" |
| | | @upload="refreshFileList" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import PlanModal from './Form/PlanModal.vue' |
| | | import MaintenanceModal from './Form/MaintenanceModal.vue' |
| | | import UpkeepDetailModal from './Form/UpkeepDetailModal.vue' |
| | | import FormDia from './Form/formDia.vue' |
| | | import FileListDialog from '@/components/Dialog/FileListDialog.vue' |
| | | import { |
| | |
| | | } from '@/api/equipmentManagement/upkeep' |
| | | import { |
| | | listMaintenanceTaskFiles, |
| | | addMaintenanceTaskFile, |
| | | delMaintenanceTaskFile, |
| | | } from '@/api/equipmentManagement/maintenanceTaskFile' |
| | | import dayjs from 'dayjs' |
| | |
| | | const planModalRef = ref() |
| | | // 保养弹窗控制器 |
| | | const maintainModalRef = ref() |
| | | const upkeepDetailModalRef = ref() |
| | | // 定时任务弹窗控制器 |
| | | const formDiaRef = ref() |
| | | // 附件弹窗 |
| | | const fileListDialogRef = ref(null) |
| | | const fileDialogVisible = ref(false) |
| | | const currentMaintenanceTaskId = ref(null) |
| | | /** 当前附件所属记录是否已完结(status=1) */ |
| | | const currentRecordFinished = ref(false) |
| | | |
| | | const javaApi = import.meta.env.VITE_APP_BASE_API |
| | | const maintenanceFileUploadUrl = `${javaApi}/maintenanceTaskFile/upload` |
| | | const maintenanceFileUploadData = computed(() => ({ |
| | | deviceMaintenanceId: currentMaintenanceTaskId.value, |
| | | })) |
| | | |
| | | const normalizeMaintenanceFileUrl = (rawUrl = "") => { |
| | | let fileUrl = rawUrl || "" |
| | | if (!fileUrl) return "" |
| | | if (fileUrl.startsWith("http://") || fileUrl.startsWith("https://")) return fileUrl |
| | | if (fileUrl.indexOf("\\") > -1) { |
| | | const lowerPath = fileUrl.toLowerCase() |
| | | const uploadPathIndex = lowerPath.indexOf("uploadpath") |
| | | if (uploadPathIndex > -1) { |
| | | fileUrl = fileUrl.substring(uploadPathIndex).replace(/\\/g, "/") |
| | | } else { |
| | | fileUrl = fileUrl.replace(/\\/g, "/") |
| | | } |
| | | } |
| | | fileUrl = fileUrl.replace(/^\/?uploadPath/i, "/profile") |
| | | if (!fileUrl.startsWith("/")) fileUrl = "/" + fileUrl |
| | | if (!fileUrl.startsWith(javaApi)) fileUrl = javaApi + fileUrl |
| | | return fileUrl |
| | | } |
| | | |
| | | // 任务记录tab(原设备保养页面)相关变量 |
| | | const filters = reactive({ |
| | |
| | | }) |
| | | const multipleList = ref([]) |
| | | |
| | | // 定时任务管理tab相关变量 |
| | | // 保养任务管理tab相关变量 |
| | | const scheduledFilters = reactive({ |
| | | taskName: '', |
| | | status: '', |
| | | isActive: '', |
| | | }) |
| | | |
| | | const scheduledDataList = ref([]) |
| | |
| | | }) |
| | | const scheduledMultipleList = ref([]) |
| | | |
| | | // 定时任务管理表格列配置 |
| | | // 保养任务管理表格列配置 |
| | | const scheduledColumns = ref([ |
| | | { prop: "taskName", label: "设备名称"}, |
| | | { |
| | |
| | | } |
| | | }, |
| | | { prop: "registrant", label: "登记人", minWidth: 100 }, |
| | | { prop: "maintenancePerson", label: "保养人", minWidth: 100 }, |
| | | { |
| | | prop: "maintenanceLocation", |
| | | label: "保养部位", |
| | | minWidth: 150, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | prop: "maintenanceItems", |
| | | label: "保养内容", |
| | | minWidth: 180, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { prop: "registrationDate", label: "登记日期", minWidth: 100 }, |
| | | { |
| | | label: "任务状态", |
| | | prop: "isActive", |
| | | minWidth: 100, |
| | | dataType: "slot", |
| | | slot: "statusRef", |
| | | align: "center", |
| | | }, |
| | | { |
| | | fixed: "right", |
| | | label: "操作", |
| | |
| | | label: "规格型号", |
| | | align: "center", |
| | | prop: "deviceModel", |
| | | }, |
| | | { |
| | | label: "保养部位", |
| | | align: "center", |
| | | prop: "maintenanceLocation", |
| | | minWidth: 150, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "保养内容", |
| | | align: "center", |
| | | prop: "maintenanceItems", |
| | | minWidth: 150, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "保养人", |
| | | align: "center", |
| | | prop: "maintenancePerson", |
| | | }, |
| | | { |
| | | label: "计划保养日期", |
| | |
| | | label: "保养结果", |
| | | align: "center", |
| | | prop: "maintenanceResult", |
| | | dataType: "slot", |
| | | slot: "maintenanceResultRef", |
| | | minWidth: 200, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "状态", |
| | |
| | | dataType: "slot", |
| | | slot: "operation", |
| | | align: "center", |
| | | width: "350px", |
| | | width: "400px", |
| | | }, |
| | | ]) |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // 定时任务管理相关方法 |
| | | // 保养任务管理相关方法 |
| | | const getScheduledTableData = async () => { |
| | | try { |
| | | const params = { |
| | | current: scheduledPagination.currentPage, |
| | | size: scheduledPagination.pageSize, |
| | | taskName: scheduledFilters.taskName || undefined, |
| | | status: scheduledFilters.status || undefined, |
| | | isActive: scheduledFilters.isActive !== '' ? scheduledFilters.isActive : undefined, |
| | | } |
| | | const { code, data } = await deviceMaintenanceTaskList(params) |
| | | if (code === 200) { |
| | |
| | | |
| | | const resetScheduledFilters = () => { |
| | | scheduledFilters.taskName = '' |
| | | scheduledFilters.status = '' |
| | | scheduledFilters.isActive = '' |
| | | getScheduledTableData() |
| | | } |
| | | |
| | |
| | | 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, |
| | | url: normalizeMaintenanceFileUrl(item.fileUrl || item.url), |
| | | raw: item, |
| | | })) |
| | | fileListDialogRef.value?.setList(mapped) |
| | |
| | | } |
| | | } |
| | | |
| | | const openDetail = (row) => { |
| | | upkeepDetailModalRef.value?.open(row) |
| | | } |
| | | |
| | | // 打开附件弹窗 |
| | | const openFileDialog = async (row) => { |
| | | currentMaintenanceTaskId.value = row.id |
| | | currentRecordFinished.value = row.status === 1 |
| | | fileDialogVisible.value = true |
| | | await fetchMaintenanceTaskFiles(row.id) |
| | | } |
| | |
| | | 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 (currentRecordFinished.value) { |
| | | ElMessage.warning('该保养已完结,不可删除附件') |
| | | return false |
| | | } |
| | | if (!row?.id) return false |
| | | try { |
| | | await ElMessageBox.confirm('确认删除该附件?', '提示', { type: 'warning' }) |