gaoluyang
2026-08-06 377c0a70c094d024aeb0bb94f4b791c6d5530c1e
src/views/equipmentManagement/upkeep/index.vue
@@ -15,10 +15,10 @@
                  @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>
@@ -39,7 +39,7 @@
                icon="Delete"
                :disabled="scheduledMultipleList.length <= 0"
                @click="delScheduledTaskByIds(scheduledMultipleList.map((item) => item.id))"
              >
               v-hasPermi="['equipmentManagement:upkeep:remove']">
                批量删除
              </el-button>
            </div>
@@ -57,9 +57,14 @@
            @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
@@ -73,7 +78,7 @@
                type="danger"
                link
                @click="delScheduledTaskByIds(row.id)"
              >
               v-hasPermi="['equipmentManagement:upkeep:remove']">
                删除
              </el-button>
            </template>
@@ -144,7 +149,7 @@
                icon="Delete"
                :disabled="multipleList.length <= 0 || hasFinishedStatus"
                @click="delRepairByIds(multipleList.map((item) => item.id))"
              >
               v-hasPermi="['equipmentManagement:upkeep:remove']">
                批量删除
              </el-button>
            </div>
@@ -163,44 +168,45 @@
        @pagination="changePage"
      >
        <template #maintenanceResultRef="{ row }">
          <div>{{ row.maintenanceResult || '-' }}</div>
          <div>{{ { "0": "维修", "1": "完好" }[row.maintenanceResult] || 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 === 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"
            link
            :disabled="row.status === 1"
            @click="delRepairByIds(row.id)"
          >
           v-hasPermi="['equipmentManagement:upkeep:remove']">
            删除
          </el-button>
          <el-button
@@ -217,28 +223,45 @@
    </el-tabs>
    <PlanModal ref="planModalRef" @ok="getTableData" />
        <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
        <AcceptanceModal ref="acceptanceModalRef" @ok="getTableData" />
        <FormDia ref="formDiaRef" @closeDia="getScheduledTableData" />
    <FileList v-if="fileDialogVisible"  v-model:visible="fileDialogVisible" :record-type="'device_maintenance'" :record-id="currentMaintenanceTaskId"  />
    <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>
<script setup>
import {ref, onMounted, reactive, getCurrentInstance, nextTick, computed, defineAsyncComponent} from 'vue'
import { ref, onMounted, reactive, getCurrentInstance, nextTick, computed } from 'vue'
import { Search } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
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 FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
// Tab相关
const activeTab = ref('scheduled')
@@ -247,6 +270,8 @@
const planModalRef = ref()
// 保养弹窗控制器
const maintainModalRef = ref()
// 验收审批弹窗控制器
const acceptanceModalRef = ref()
// 定时任务弹窗控制器
const formDiaRef = ref()
// 附件弹窗
@@ -273,7 +298,7 @@
// 定时任务管理tab相关变量
const scheduledFilters = reactive({
  taskName: '',
  status: '',
  isEnabled: undefined,
})
const scheduledDataList = ref([])
@@ -286,6 +311,10 @@
// 定时任务管理表格列配置
const scheduledColumns = ref([
   {
      label: "所在区域",
      prop: "areaName",
   },
   { prop: "taskName", label: "设备名称"},
   {
      label: "规格型号",
@@ -300,7 +329,8 @@
         DAILY: "每日",
         WEEKLY: "每周",
         MONTHLY: "每月",
         QUARTERLY: "季度"
         QUARTERLY: "季度",
         YEARLY: "每年",
      }[cell] || "")
   },
   {
@@ -326,6 +356,15 @@
   },
   { prop: "registrant", label: "登记人", minWidth: 100 },
   { prop: "registrationDate", label: "登记日期", minWidth: 100 },
   { prop: "maintenanceContent", label: "保养内容", minWidth: 150, showOverflowTooltip: true },
   {
      label: "是否启用",
      prop: "isEnabled",
      dataType: "slot",
      slot: "isEnabledRef",
      align: "center",
      width: "120px",
   },
   {
      fixed: "right",
      label: "操作",
@@ -338,6 +377,10 @@
// 任务记录表格列配置(原设备保养表格列)
const columns = ref([
   {
      label: "所在区域",
      prop: "areaName",
   },
   {
      label: "设备名称",
      align: "center",
@@ -359,11 +402,6 @@
      align: "center",
      prop: "createUserName",
   },
  {
    label: "项目",
    align: "center",
    prop: "machineryCategory",
  },
   // {
   //   label: "录入日期",
   //   align: "center",
@@ -390,12 +428,32 @@
      dataType: "slot",
      slot: "maintenanceResultRef",
   },
   { prop: "maintenanceContent", label: "保养内容", minWidth: 150, showOverflowTooltip: true },
   {
      label: "状态",
      align: "center",
      prop: "status",
      dataType: "slot",
      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",
@@ -423,11 +481,16 @@
      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) {
@@ -437,7 +500,7 @@
const resetScheduledFilters = () => {
  scheduledFilters.taskName = ''
  scheduledFilters.status = ''
  scheduledFilters.isEnabled = undefined
  getScheduledTableData()
}
@@ -476,6 +539,30 @@
    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
  }
}
@@ -589,10 +676,82 @@
  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(() => {