zhang_nuo
2026-08-11 1be6a8fc84764d7e816737b365f9e1c8869db9a7
src/views/equipmentManagement/upkeep/index.vue
@@ -142,91 +142,68 @@
                     </el-button>
                     <el-button type="danger"
                                icon="Delete"
                                :disabled="multipleList.length <= 0"
                         :disabled="multipleList.length <= 0 || hasFinishedStatus"
                                @click="delRepairByIds(multipleList.map((item) => item.id))">
                        批量删除
                     </el-button>
                  </div>
               </div>
               <el-table
                  :data="groupedDataList"
                  border
                  v-loading="tableLoading"
          <PIMTable rowKey="id"
                    isSelection
                    :column="columns"
                    :tableData="dataList"
                    :page="{
          current: pagination.currentPage,
          size: pagination.pageSize,
          total: pagination.total,
        }"
                  @selection-change="handleSelectionChange"
                  :expand-row-keys="expandedRowKeys"
                  :row-key="(row) => row.date"
                  @expand-change="onExpandChange"
               >
                  <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 || '--' }}
                    @pagination="changePage">
            <template #maintenanceResultRef="{ row }">
              <div>{{ row.maintenanceResult || '-' }}</div>
                              </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 #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>
                           </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
            <template #operation="{ row }">
              <!-- 这个功能跟新增保养功能一模一样,有啥意义? -->
              <!-- <el-button
                           type="primary"
                           size="small"
                           :disabled="!row.children.some(c => c.status === 0)"
                           @click="handleBatchComplete(row.date)"
              text
              @click="addMaintain(row)"
                        >
                           一键保养完成
            新增保养
          </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>
                  </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"
               />
          </PIMTable>
            </div>
         </el-tab-pane>
      </el-tabs>
@@ -240,7 +217,6 @@
                v-model:visible="fileDialogVisible"
                :record-type="'device_maintenance'"
                :record-id="currentMaintenanceTaskId" />
   </div>
</template>
@@ -264,11 +240,8 @@
   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(() =>
@@ -300,56 +273,10 @@
const dataList = ref([]);
const pagination = ref({
   currentPage: 1,
   pageSize: 100,
    pageSize: 10,
   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({
@@ -422,7 +349,8 @@
      label: "登记日期",
      minWidth: 100,
      formatData: cell =>
         cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
          // cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
      cell ? dayjs(cell).format("YYYY-MM-DD") : "-",
   },
   {
      fixed: "right",
@@ -586,7 +514,6 @@
// 保养记录相关方法(原设备保养页面方法)
const getTableData = async () => {
   tableLoading.value = true;
   try {
      const params = {
         current: pagination.value.currentPage,
@@ -608,8 +535,6 @@
      }
   } catch (error) {
      console.log(error);
   } finally {
      tableLoading.value = false;
   }
};
@@ -622,15 +547,13 @@
};
const handleSelectionChange = selection => {
   // 从选中的分组行中收集所有子记录ID
   const ids = [];
   selection.forEach(group => {
      if (group.children) {
         group.children.forEach(child => ids.push(child.id));
      }
   });
   multipleList.value = ids;
    multipleList.value = selection;
};
  // 检查选中的记录中是否有完结状态的
  const hasFinishedStatus = computed(() => {
    return multipleList.value.some(item => item.status === 1);
  });
const changePage = page => {
   pagination.value.currentPage = page.page;
@@ -651,8 +574,12 @@
};
const delRepairByIds = async ids => {
   const idList = Array.isArray(ids) ? ids : [ids];
   if (idList.length === 0) return;
    // 检查是否有完结状态的记录
    const hasFinished = multipleList.value.some(item => item.status === 1);
    if (hasFinished) {
      ElMessage.warning("不能删除状态为完结的记录");
      return;
    }
   
   try {
      await ElMessageBox.confirm("确认删除保养数据, 此操作不可逆?", "警告", {
@@ -661,7 +588,7 @@
         type: "warning",
      });
      
      const { code } = await delUpkeep(idList);
      const { code } = await delUpkeep(ids);
      if (code === 200) {
         ElMessage.success("删除成功");
         getTableData();