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,
        }"
               <el-table
                  :data="groupedDataList"
                  border
                  v-loading="tableLoading"
                    @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)"
                  :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-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>
          </PIMTable>
                  </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;
  };
  // 检查选中的记录中是否有完结状态的
  const hasFinishedStatus = computed(() => {
    return multipleList.value.some(item => item.status === 1);
   // 从选中的分组行中收集所有子记录ID
   const ids = [];
   selection.forEach(group => {
      if (group.children) {
         group.children.forEach(child => ids.push(child.id));
      }
  });
   multipleList.value = ids;
};
  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();