src/views/equipmentManagement/upkeep/index.vue
@@ -142,68 +142,91 @@
              </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>
@@ -217,6 +240,7 @@
              v-model:visible="fileDialogVisible"
              :record-type="'device_maintenance'"
              :record-id="currentMaintenanceTaskId" />
  </div>
</template>
@@ -240,8 +264,11 @@
    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(() =>
@@ -273,10 +300,56 @@
  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({
@@ -513,6 +586,7 @@
  // 保养记录相关方法(原设备保养页面方法)
  const getTableData = async () => {
    tableLoading.value = true;
    try {
      const params = {
        current: pagination.value.currentPage,
@@ -534,6 +608,8 @@
      }
    } catch (error) {
      console.log(error);
    } finally {
      tableLoading.value = false;
    }
  };
@@ -546,13 +622,15 @@
  };
  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;
@@ -573,12 +651,8 @@
  };
  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("确认删除保养数据, 此操作不可逆?", "警告", {
@@ -587,7 +661,7 @@
        type: "warning",
      });
      const { code } = await delUpkeep(ids);
      const { code } = await delUpkeep(idList);
      if (code === 200) {
        ElMessage.success("删除成功");
        getTableData();