2026-05-16 f15c2ea99e9ede2a6e7ee3a206ba08d3172aa36d
feat(equipment): 添加设备维保和巡检任务的启用状态功能

- 在维保任务表单中新增是否启用开关组件
- 在巡检任务表单中新增是否启用开关组件
- 添加启用状态的数据字段初始化和赋值逻辑
- 实现后端API接口用于切换任务启用状态
- 在维保任务列表中添加启用状态筛选条件
- 在巡检任务列表中添加启用状态筛选条件
- 实现表格中启用状态开关的实时切换功能
- 添加启用状态切换前的验证和错误处理机制
- 优化数据加载时启用状态字段的兼容性处理
已修改6个文件
186 ■■■■ 文件已修改
src/api/equipmentManagement/upkeep.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/inspectionManagement/index.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/inspectionManagement/components/formDia.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/inspectionManagement/index.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/upkeep/Form/formDia.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/upkeep/index.vue 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/equipmentManagement/upkeep.js
@@ -102,3 +102,12 @@
    data: params,
  });
};
// 设备保养定时任务启用状态切换
export const deviceMaintenanceTaskChangeEnable = (params) => {
  return request({
    url: '/deviceMaintenanceTask/changeEnable',
    method: "post",
    data: params,
  });
};
src/api/inspectionManagement/index.js
@@ -58,4 +58,13 @@
        method: 'post',
        data: query
    })
}
}
// 定时巡检任务启用状态切换
export function changeTimingTaskEnable(query) {
    return request({
        url: '/timingTask/changeEnable',
        method: 'post',
        data: query
    })
}
src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -77,6 +77,15 @@
              <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">
@@ -191,6 +200,7 @@
    inspector: [],
    inspectorIds: "",
    remarks: "",
    isEnabled: 1,
    frequencyType: "",
    frequencyDetail: "",
    week: "",
@@ -365,6 +375,7 @@
    inspector: [],
    inspectorIds: "",
    remarks: "",
    isEnabled: 1,
    frequencyType: "",
    frequencyDetail: "",
    week: "",
@@ -387,6 +398,7 @@
    form.value = {
      ...form.value,
      ...row,
      isEnabled: Number(row.isEnabled ?? row.status ?? 1),
      inspector: row.inspectorIds
        ? String(row.inspectorIds)
            .split(",")
@@ -447,6 +459,7 @@
      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();
src/views/equipmentManagement/inspectionManagement/index.vue
@@ -23,6 +23,17 @@
          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"
@@ -90,6 +101,15 @@
            <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" />
@@ -99,13 +119,14 @@
<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,
@@ -119,6 +140,7 @@
const queryParams = reactive({
  taskName: "",
  areaId: undefined,
  isEnabled: undefined,
  createTimeStart: undefined,
  createTimeEnd: undefined,
});
@@ -190,6 +212,14 @@
  { prop: "registrant", label: "登记人", minWidth: 100 },
  { prop: "createTime", label: "登记日期", width: 130 },
]);
const isEnabledColumn = {
  prop: "isEnabled",
  label: "是否启用",
  minWidth: 110,
  dataType: "slot",
  slot: "isEnabledSwitch",
};
// 巡检状态列(仅定时任务记录显示)
const inspectionStatusColumn = {
@@ -271,13 +301,14 @@
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;
@@ -319,6 +350,12 @@
      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
@@ -343,6 +380,7 @@
const resetQuery = () => {
  queryParams.taskName = "";
  queryParams.areaId = undefined;
  queryParams.isEnabled = undefined;
  queryParams.createTimeStart = undefined;
  queryParams.createTimeEnd = undefined;
  // 定时任务记录时重置为当天
@@ -383,6 +421,30 @@
  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: "确认",
src/views/equipmentManagement/upkeep/Form/formDia.vue
@@ -173,6 +173,17 @@
      </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>
@@ -219,6 +230,7 @@
    deviceLedgerIds: [],
    deviceLedgerIdsStr: undefined,
    taskName: undefined,
    isEnabled: 1,
    inspector: undefined,
    remarks: "",
    frequencyType: "",
@@ -368,6 +380,7 @@
    deviceLedgerIds: [],
    deviceLedgerIdsStr: undefined,
    taskName: undefined,
    isEnabled: 1,
    inspector: undefined,
    remarks: "",
    frequencyType: "",
@@ -394,6 +407,7 @@
    form.value = {
      ...form.value,
      ...row,
      isEnabled: Number(row.isEnabled ?? row.status ?? 1),
      inspector: row.registrantId || row.inspector,
    };
    form.value.deviceLedgerIds = normalizeIdList(
@@ -451,13 +465,7 @@
        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(",");
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>
@@ -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
@@ -243,6 +248,7 @@
  delUpkeep,
  deviceMaintenanceTaskList,
  deviceMaintenanceTaskDel,
  deviceMaintenanceTaskChangeEnable,
} from '@/api/equipmentManagement/upkeep'
import {
  listMaintenanceTaskFiles,
@@ -286,7 +292,7 @@
// 定时任务管理tab相关变量
const scheduledFilters = reactive({
  taskName: '',
  status: '',
  isEnabled: undefined,
})
const scheduledDataList = ref([])
@@ -344,6 +350,14 @@
    },
    { prop: "registrant", label: "登记人", minWidth: 100 },
    { prop: "registrationDate", label: "登记日期", minWidth: 100 },
    {
        label: "是否启用",
        prop: "isEnabled",
        dataType: "slot",
        slot: "isEnabledRef",
        align: "center",
        width: "120px",
    },
    {
        fixed: "right",
        label: "操作",
@@ -440,11 +454,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) {
@@ -454,7 +473,7 @@
const resetScheduledFilters = () => {
  scheduledFilters.taskName = ''
  scheduledFilters.status = ''
  scheduledFilters.isEnabled = undefined
  getScheduledTableData()
}
@@ -496,6 +515,30 @@
  }
}
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('导出定时任务功能待实现')
}