| | |
| | | </el-button> |
| | | <el-button type="danger" |
| | | icon="Delete" |
| | | :disabled="multipleList.length <= 0 || hasFinishedStatus" |
| | | :disabled="multipleList.length <= 0" |
| | | @click="delRepairByIds(multipleList.map((item) => item.id))"> |
| | | 批量删除 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | <PIMTable rowKey="id" |
| | | isSelection |
| | | :column="columns" |
| | | :tableData="dataList" |
| | | :page="{ |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize, |
| | | total: pagination.total, |
| | | }" |
| | | @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-table |
| | | :data="groupedDataList" |
| | | border |
| | | v-loading="tableLoading" |
| | | @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" |
| | | :row-key="(row) => row.date" |
| | | @expand-change="onExpandChange" |
| | | > |
| | | 新增保养 |
| | | </el-button> --> |
| | | <el-button type="primary" |
| | | link |
| | | :disabled="row.status === 1" |
| | | @click="editPlan(row.id)"> |
| | | 编辑 |
| | | </el-button> |
| | | <el-button type="success" |
| | | link |
| | | :disabled="row.status === 1" |
| | | @click="addMaintain(row)"> |
| | | 保养 |
| | | </el-button> |
| | | <el-button type="danger" |
| | | link |
| | | :disabled="row.status === 1" |
| | | @click="delRepairByIds(row.id)"> |
| | | 删除 |
| | | </el-button> |
| | | <el-button type="primary" |
| | | link |
| | | @click="openFileDialog(row)"> |
| | | 附件 |
| | | </el-button> |
| | | </template> |
| | | </PIMTable> |
| | | <el-table-column type="selection" width="55" /> |
| | | <el-table-column type="expand"> |
| | | <template #default="props"> |
| | | <el-table :data="props.row.children" border row-key="id"> |
| | | <el-table-column label="设备名称" prop="deviceName" align="center" /> |
| | | <el-table-column label="规格型号" prop="deviceModel" align="center" /> |
| | | <el-table-column label="录入人" prop="createUserName" align="center" /> |
| | | <el-table-column label="保养项目" prop="machineryCategory" align="center"> |
| | | <template #default="{ row }"> |
| | | {{ row.machineryCategory || '--' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="实际保养人" prop="maintenanceActuallyName" align="center" /> |
| | | <el-table-column label="实际保养日期" align="center"> |
| | | <template #default="{ row }"> |
| | | {{ row.maintenanceActuallyTime ? dayjs(row.maintenanceActuallyTime).format('YYYY-MM-DD HH:mm:ss') : '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="保养结果" align="center"> |
| | | <template #default="{ row }"> |
| | | {{ row.maintenanceResult || '-' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="状态" align="center"> |
| | | <template #default="{ 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> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="300"> |
| | | <template #default="{ row }"> |
| | | <el-button type="primary" link :disabled="row.status === 1" @click="editPlan(row.id)">编辑</el-button> |
| | | <el-button type="success" link :disabled="row.status !== 0" @click="handleSingleComplete(row.id)">保养完成</el-button> |
| | | <el-button type="success" link :disabled="row.status === 1" @click="addMaintain(row)">保养</el-button> |
| | | <el-button type="danger" link :disabled="row.status === 1" @click="delRepairByIds(row.id)">删除</el-button> |
| | | <el-button type="primary" link @click="openFileDialog(row)">附件</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="计划保养日期" prop="date" align="center" /> |
| | | <el-table-column label="保养记录数" prop="count" align="center" /> |
| | | <el-table-column label="待保养数" align="center" width="120"> |
| | | <template #default="{ row }"> |
| | | {{ row.children.filter(c => c.status === 0).length }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-button |
| | | type="primary" |
| | | size="small" |
| | | :disabled="!row.children.some(c => c.status === 0)" |
| | | @click="handleBatchComplete(row.date)" |
| | | > |
| | | 一键保养完成 |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <Pagination |
| | | v-show="pagination.total > 0" |
| | | :total="pagination.total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="pagination.currentPage" |
| | | :limit="pagination.pageSize" |
| | | @pagination="changePage" |
| | | /> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | |
| | | v-model:visible="fileDialogVisible" |
| | | :record-type="'device_maintenance'" |
| | | :record-id="currentMaintenanceTaskId" /> |
| | | |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | delUpkeep, |
| | | deviceMaintenanceTaskList, |
| | | deviceMaintenanceTaskDel, |
| | | batchCompleteMaintenance, |
| | | completeMaintenance, |
| | | } from "@/api/equipmentManagement/upkeep"; |
| | | import dayjs from "dayjs"; |
| | | import Pagination from "@/components/PIMTable/Pagination.vue"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | const FileList = defineAsyncComponent(() => |
| | |
| | | const dataList = ref([]); |
| | | const pagination = ref({ |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | pageSize: 100, |
| | | total: 0, |
| | | }); |
| | | const multipleList = ref([]); |
| | | const tableLoading = ref(false); |
| | | const expandedRowKeys = ref([]); |
| | | |
| | | const groupByDate = (list) => { |
| | | const map = {}; |
| | | list.forEach(item => { |
| | | const date = item.dateStr || (item.maintenancePlanTime ? dayjs(item.maintenancePlanTime).format('YYYY-MM-DD') : (item.createTime ? dayjs(item.createTime).format('YYYY-MM-DD') : '未知日期')); |
| | | if (!map[date]) map[date] = []; |
| | | map[date].push(item); |
| | | }); |
| | | return Object.entries(map).map(([date, children]) => ({ date, children, count: children.length })); |
| | | }; |
| | | |
| | | const groupedDataList = computed(() => groupByDate(dataList.value)); |
| | | |
| | | // 单条保养完成 |
| | | const handleSingleComplete = async (id) => { |
| | | try { |
| | | await ElMessageBox.confirm('确认将该保养记录标记为完成?', '提示', { type: 'warning' }); |
| | | const res = await completeMaintenance(id); |
| | | if (res.code === 200) { |
| | | ElMessage.success('保养完成'); |
| | | getTableData(); |
| | | } else { |
| | | ElMessage.error(res.msg || '操作失败'); |
| | | } |
| | | } catch { /* 取消 */ } |
| | | }; |
| | | |
| | | // 一键保养完成 |
| | | const handleBatchComplete = async (dateStr) => { |
| | | try { |
| | | await ElMessageBox.confirm(`确认将 ${dateStr} 的所有待保养记录标记为完成?`, '提示', { type: 'warning' }); |
| | | const res = await batchCompleteMaintenance(dateStr); |
| | | if (res.code === 200) { |
| | | ElMessage.success(res.msg || '批量保养完成成功'); |
| | | getTableData(); |
| | | } else { |
| | | ElMessage.error(res.msg || '批量保养完成失败'); |
| | | } |
| | | } catch { /* 取消 */ } |
| | | }; |
| | | |
| | | const onExpandChange = (row, expandedRows) => { |
| | | expandedRowKeys.value = expandedRows.map(r => r.date); |
| | | }; |
| | | |
| | | // 保养任务tab相关变量 |
| | | const scheduledFilters = reactive({ |
| | |
| | | |
| | | // 保养记录相关方法(原设备保养页面方法) |
| | | const getTableData = async () => { |
| | | tableLoading.value = true; |
| | | try { |
| | | const params = { |
| | | current: pagination.value.currentPage, |
| | |
| | | } |
| | | } catch (error) { |
| | | console.log(error); |
| | | } finally { |
| | | tableLoading.value = false; |
| | | } |
| | | }; |
| | | |
| | |
| | | }; |
| | | |
| | | const handleSelectionChange = selection => { |
| | | multipleList.value = selection; |
| | | // 从选中的分组行中收集所有子记录ID |
| | | const ids = []; |
| | | selection.forEach(group => { |
| | | if (group.children) { |
| | | group.children.forEach(child => ids.push(child.id)); |
| | | } |
| | | }); |
| | | multipleList.value = ids; |
| | | }; |
| | | |
| | | // 检查选中的记录中是否有完结状态的 |
| | | const hasFinishedStatus = computed(() => { |
| | | return multipleList.value.some(item => item.status === 1); |
| | | }); |
| | | |
| | | const changePage = page => { |
| | | pagination.value.currentPage = page.page; |
| | |
| | | }; |
| | | |
| | | const delRepairByIds = async ids => { |
| | | // 检查是否有完结状态的记录 |
| | | const hasFinished = multipleList.value.some(item => item.status === 1); |
| | | if (hasFinished) { |
| | | ElMessage.warning("不能删除状态为完结的记录"); |
| | | return; |
| | | } |
| | | const idList = Array.isArray(ids) ? ids : [ids]; |
| | | if (idList.length === 0) return; |
| | | |
| | | try { |
| | | await ElMessageBox.confirm("确认删除保养数据, 此操作不可逆?", "警告", { |
| | |
| | | type: "warning", |
| | | }); |
| | | |
| | | const { code } = await delUpkeep(ids); |
| | | const { code } = await delUpkeep(idList); |
| | | if (code === 200) { |
| | | ElMessage.success("删除成功"); |
| | | getTableData(); |