yeg
2026-08-29 30082e57efc7215ebb2014920d72a8a0cfc66eac
修复测试列表删除未接线

接入测试删除 API、确认交互和列表刷新。
补充未开始接收测试删除及刷新持久性的浏览器回归。
3个文件已修改
42 ■■■■■ 已修改文件
src/api/tests.ts 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/TestList.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/e2e/test-required-device-bindings.spec.ts 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/tests.ts
@@ -156,3 +156,7 @@
export async function updateTest(payload: TestConfigurationPayload & { testId: number }): Promise<TestConfigurationDetail> {
  return (await request<TestDetailResponse>('/system/test', { method: 'PUT', body: JSON.stringify(payload) })).data
}
export async function deleteTests(testIds: number[]): Promise<void> {
  await request<ApiResponse>(`/system/test/${testIds.join(',')}`, { method: 'DELETE' })
}
src/views/TestList.vue
@@ -1,8 +1,8 @@
<script setup lang="ts">
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useRouter } from 'vue-router'
import { getTestList } from '@/api/tests'
import { deleteTests, getTestList } from '@/api/tests'
import { getTestTypeList } from '@/api/testTypes'
import type { TestRecord, TestStatus } from '@/stores/tests'
@@ -34,6 +34,7 @@
const appliedFilters = ref<FilterState>({ name: '', typeId: null, status: '', batteryNo: '', dateRange: null })
const currentPage = ref(1)
const pageSize = ref(10)
const deletingTestId = ref<number | null>(null)
async function loadTestTypes() {
  try {
@@ -117,8 +118,22 @@
  router.push(`/test-list/${item.id}/edit`)
}
function unavailableAction(action: string) {
  ElMessage.info(`${action}接口尚未对接`)
async function removeTest(item: TestRecord) {
  try {
    await ElMessageBox.confirm(`删除测试“${item.name}”后无法恢复,是否继续?`, '确认删除测试', {
      confirmButtonText: '删除', cancelButtonText: '取消', type: 'warning', confirmButtonClass: 'danger-confirm',
    })
    deletingTestId.value = item.id
    await deleteTests([item.id])
    ElMessage.success('测试已删除')
    if (records.value.length === 1 && currentPage.value > 1) currentPage.value -= 1
    await loadTests()
  } catch (error) {
    if (error === 'cancel' || error === 'close') return
    ElMessage.error(error instanceof Error ? error.message : '测试删除失败')
  } finally {
    deletingTestId.value = null
  }
}
function downloadTests() {
@@ -226,7 +241,7 @@
                <div class="row-actions">
                  <button type="button" @click="openConsole(item)">控制台</button>
                  <button v-if="item.editable" type="button" @click="editTest(item)">编辑</button>
                  <button class="delete-action" type="button" @click="unavailableAction('删除')">删除</button>
                  <button v-if="item.editable" class="delete-action" type="button" :disabled="deletingTestId !== null" @click="removeTest(item)">{{ deletingTestId === item.id ? '删除中...' : '删除' }}</button>
                </div>
              </td>
            </tr>
tests/e2e/test-required-device-bindings.spec.ts
@@ -213,6 +213,19 @@
    ]))
  })
  await test.step('未开始接收的测试可确认删除并在刷新后保持消失', async () => {
    await page.goto('/test-list')
    const listRow = page.locator('tbody tr').filter({ hasText: testName })
    await expect(listRow).toBeVisible()
    await listRow.getByRole('button', { name: '删除', exact: true }).click()
    await expect(page.getByRole('dialog', { name: '确认删除测试' })).toBeVisible()
    await page.getByRole('button', { name: '删除', exact: true }).last().click()
    await expect(page.getByRole('alert').filter({ hasText: '测试已删除' })).toBeVisible()
    await expect(listRow).toBeHidden()
    await page.reload()
    await expect(page.locator('tbody tr').filter({ hasText: testName })).toHaveCount(0)
  })
  const businessKeys = await page.evaluate(() => Object.keys(localStorage)
    .filter(key => key.includes('battery_detection_tests')))
  expect(businessKeys).toEqual([])