diff --git a/admin-frontend-vue/src/pages/asin/AsinInvalidPage.vue b/admin-frontend-vue/src/pages/asin/AsinInvalidPage.vue
new file mode 100644
index 00000000..86d63eb1
--- /dev/null
+++ b/admin-frontend-vue/src/pages/asin/AsinInvalidPage.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
不符合 ASIN 数据
+
管理命中"不符合 ASIN"的品牌数据库记录。
+
+
新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+ {{ (row as InvalidAsinItem).brand || '—' }}
+
+
+
+
+
+ {{ recordSourceLabel((row as InvalidAsinItem).recordSource) }}
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 保存
+
+
+
+
+
+
diff --git a/admin-frontend-vue/tests/task-255.test.ts b/admin-frontend-vue/tests/task-255.test.ts
new file mode 100644
index 00000000..8cbd594d
--- /dev/null
+++ b/admin-frontend-vue/tests/task-255.test.ts
@@ -0,0 +1,56 @@
+import test from 'node:test'
+import assert from 'node:assert/strict'
+import { readSource } from './helpers.ts'
+
+// module 13 task 255:品牌数据库(不符合ASIN)页对齐 admin panel-invalid-asin-data ——
+// 分组筛选、来源列用 recordSourceLabel、自动导入记录编辑隐藏分组、删除文案用模型辅助。
+
+test('test_task_255_invalidasin_normal_primary_path', () => {
+ const page = readSource('src/pages/asin/AsinInvalidPage.vue')
+ assert.match(page, /分组/, '筛选需含分组下拉')
+ assert.match(page, /recordSourceLabel/, '来源列需用 recordSourceLabel 文案')
+ assert.match(page, /el-tag/, '来源宜用 tag 形态')
+})
+
+test('test_task_255_invalidasin_normal_variant_input', () => {
+ const page = readSource('src/pages/asin/AsinInvalidPage.vue')
+ assert.match(page, /invalidAsinDeleteText/, '删除需用模型删除文案')
+ assert.match(page, /includeGroup/, '更新提交需按来源决定是否迁组')
+ assert.match(page, /MANUAL/, '需判断来源是否为手动新增')
+})
+
+test('test_task_255_invalidasin_normal_repeated_operation_is_idempotent', () => {
+ const page = readSource('src/pages/asin/AsinInvalidPage.vue')
+ assert.ok(page.includes('分组'))
+ assert.ok(page.includes('分组'))
+})
+
+test('test_task_255_invalidasin_boundary_empty_input', () => {
+ const page = readSource('src/pages/asin/AsinInvalidPage.vue')
+ assert.match(page, /filter\.brand|品牌/, '需保留品牌筛选')
+ assert.match(page, /filter\.dataValue|ASIN/, '需保留 ASIN 筛选')
+ assert.match(page, /requireGroup/, '新建需校验分组必选')
+})
+
+test('test_task_255_invalidasin_boundary_single_item', () => {
+ // 边界:自动导入(非 MANUAL)记录编辑时不应展示分组字段(admin 语义)。
+ const page = readSource('src/pages/asin/AsinInvalidPage.vue')
+ assert.match(page, /editingSource|recordSource/, '需记录当前编辑行来源以控制分组显隐')
+})
+
+test('test_task_255_invalidasin_boundary_limit_or_missing_field', () => {
+ const api = readSource('src/pages/invalidasin/invalid-asin-api.ts')
+ assert.match(api, /groupId/, '查询适配需支持分组筛选参数')
+})
+
+test('test_task_255_invalidasin_invalid_input_rejected', () => {
+ const page = readSource('src/pages/asin/AsinInvalidPage.vue')
+ assert.equal(page.includes('MANUAL') && page.includes('recordSourceLabel'), true, '来源展示必须统一走映射')
+})
+
+test('test_task_255_invalidasin_dependency_failure_returns_actionable_message', () => {
+ // 依赖失败:模型已提供记录来源与删除文案纯函数,页面不得自造不一致文案。
+ const model = readSource('src/pages/invalidasin/invalid-asin-model.ts')
+ assert.match(model, /recordSourceLabel/, '模型需提供来源标签函数')
+ assert.match(model, /手动新增/, '手动新增文案存在')
+})