feat: 迁移预警处理审核与备注附件流程
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
# 预警日志附件的文件 ID 迁移补充
|
||||
|
||||
现有 `sw_to_kra_migrate.sql` 为 `sys_oss.oss_id` 建立 `entity='file'` 映射并导入 `media_file_upload_and_downloads`,同时只更新预警操作日志的操作人 ID,没有转换 `attachment_ids` 中的文件 ID。日志数字数组仍引用旧文件,不能直接当成 Kra 文件 ID 查询。
|
||||
|
||||
代码迁移步骤 `202611030007_business_alert_attachments` 在服务启动的迁移流程中执行,不修改用户提供的 SQL。最终数据库复制验收时,先完成原 SQL,再启动包含本步骤的新服务。
|
||||
|
||||
处理规则:
|
||||
|
||||
1. 新库没有旧日志备份和映射表时不执行转换。
|
||||
2. 按日志 ID 与 `bak_sw2kra_20261103_sys_alert_operation_log` 关联,只处理当前附件与旧备份一致的纯数字数组,兼容 JSON 数字和数字字符串。
|
||||
3. 根据文件映射写入新文件 ID,保留原数组顺序。没有旧文件映射的引用原本无法展示,转换后不指向任何同号新文件;原始引用仍在备份中保留。
|
||||
4. URL 数组、混合 URL 数组、新日志、已改动的旧日志均不转换。分批查询和事务写入,重复执行不会二次映射。
|
||||
5. 运行时附件解析支持数字 ID 与 URL;文件查询分批执行,已删除或不存在文件不展示。大数字 ID 在解析及返回过程中不经过浮点数。
|
||||
|
||||
隔离测试覆盖超出 JavaScript 精确整数范围的旧 ID、失效引用、新旧文件同号、URL、新日志、已转换日志及重复执行。最终实库验收应以旧、新附件解析出的 URL 对比,而不是要求转换后的 JSON 字节仍与旧 ID 数组一致。
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"scope": "既有 sw7,只读查询及必然拒绝的无效写请求;正向流转另用隔离 SQLite 和 TCP HTTP 测试",
|
||||
"base_url": "http://127.0.0.1:18000",
|
||||
"checks": [
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/sw/alertRecord/list?pageNum=1&pageSize=10",
|
||||
"http": 200,
|
||||
"code": 0,
|
||||
"msg": "成功",
|
||||
"passed": true,
|
||||
"total": 0,
|
||||
"available": true,
|
||||
"status_count": {}
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/sw/alertRecord/list?platformCodes=lx,hw&status=5",
|
||||
"http": 200,
|
||||
"code": 0,
|
||||
"msg": "成功",
|
||||
"passed": true,
|
||||
"total": 0,
|
||||
"available": true,
|
||||
"status_count": {}
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/sw/alertRule/ruleTypes",
|
||||
"http": 200,
|
||||
"code": 0,
|
||||
"msg": "成功",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/sw/business/list?pageNum=1&pageSize=500",
|
||||
"http": 200,
|
||||
"code": 0,
|
||||
"msg": "成功",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/sw/alertRecord/list?businessId=10007",
|
||||
"http": 200,
|
||||
"code": 0,
|
||||
"msg": "成功",
|
||||
"passed": true,
|
||||
"total": 0,
|
||||
"available": false,
|
||||
"status_count": {}
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/sw/alertRecord/list?businessId=10001",
|
||||
"http": 200,
|
||||
"code": 0,
|
||||
"msg": "成功",
|
||||
"passed": true,
|
||||
"total": 0,
|
||||
"available": true,
|
||||
"status_count": {}
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/sw/alertRecord/detail/0",
|
||||
"http": 200,
|
||||
"code": 7,
|
||||
"msg": "预警记录参数不正确",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/sw/alertRecord/startProcess",
|
||||
"http": 200,
|
||||
"code": 7,
|
||||
"msg": "预警记录参数不正确",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/sw/alertRecord/submitAudit",
|
||||
"http": 200,
|
||||
"code": 7,
|
||||
"msg": "预警记录参数不正确",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/sw/alertRecord/approve",
|
||||
"http": 200,
|
||||
"code": 7,
|
||||
"msg": "预警记录参数不正确",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/sw/alertRecord/reject",
|
||||
"http": 200,
|
||||
"code": 7,
|
||||
"msg": "预警记录参数不正确",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/sw/alertRecord/reProcess",
|
||||
"http": 200,
|
||||
"code": 7,
|
||||
"msg": "预警记录参数不正确",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/sw/alertRecord/addNote",
|
||||
"http": 200,
|
||||
"code": 7,
|
||||
"msg": "预警记录参数不正确",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"method": "真实 Chrome 渲染;受控身份、预警数据、写接口和图片上传;未修改真实业务数据",
|
||||
"results": [
|
||||
{
|
||||
"level": 0,
|
||||
"stateButtons": [
|
||||
{
|
||||
"status": 1,
|
||||
"label": "处理"
|
||||
},
|
||||
{
|
||||
"status": 2,
|
||||
"label": "继续处理"
|
||||
},
|
||||
{
|
||||
"status": 3,
|
||||
"label": "查看"
|
||||
},
|
||||
{
|
||||
"status": 4,
|
||||
"label": "重新处理"
|
||||
},
|
||||
{
|
||||
"status": 5,
|
||||
"label": "查看"
|
||||
}
|
||||
],
|
||||
"passed": true,
|
||||
"pageErrors": []
|
||||
},
|
||||
{
|
||||
"level": 1,
|
||||
"stateButtons": [
|
||||
{
|
||||
"status": 1,
|
||||
"label": "处理"
|
||||
},
|
||||
{
|
||||
"status": 2,
|
||||
"label": "继续处理"
|
||||
},
|
||||
{
|
||||
"status": 3,
|
||||
"label": "审核"
|
||||
},
|
||||
{
|
||||
"status": 4,
|
||||
"label": "重新处理"
|
||||
},
|
||||
{
|
||||
"status": 5,
|
||||
"label": "查看"
|
||||
}
|
||||
],
|
||||
"passed": true,
|
||||
"workflowAndAttachments": true,
|
||||
"pasteDropAndRemove": true,
|
||||
"pageErrors": []
|
||||
},
|
||||
{
|
||||
"level": 2,
|
||||
"stateButtons": [
|
||||
{
|
||||
"status": 1,
|
||||
"label": "处理"
|
||||
},
|
||||
{
|
||||
"status": 2,
|
||||
"label": "继续处理"
|
||||
},
|
||||
{
|
||||
"status": 3,
|
||||
"label": "查看"
|
||||
},
|
||||
{
|
||||
"status": 4,
|
||||
"label": "重新处理"
|
||||
},
|
||||
{
|
||||
"status": 5,
|
||||
"label": "查看"
|
||||
}
|
||||
],
|
||||
"passed": true,
|
||||
"statusCardsAndUnavailable": true,
|
||||
"pageErrors": []
|
||||
},
|
||||
{
|
||||
"level": 3,
|
||||
"stateButtons": [
|
||||
{
|
||||
"status": 1,
|
||||
"label": "处理"
|
||||
},
|
||||
{
|
||||
"status": 2,
|
||||
"label": "继续处理"
|
||||
},
|
||||
{
|
||||
"status": 3,
|
||||
"label": "查看"
|
||||
},
|
||||
{
|
||||
"status": 4,
|
||||
"label": "重新处理"
|
||||
},
|
||||
{
|
||||
"status": 5,
|
||||
"label": "查看"
|
||||
}
|
||||
],
|
||||
"passed": true,
|
||||
"pageErrors": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23,7 +23,7 @@
|
||||
| --- | --- | --- |
|
||||
| 1 | 商务用户字段、层级与角色、账号资料和审核、偏好、登录及找回密码 | 进行中 |
|
||||
| 2 | 平台绑定、商务/渠道可见范围、外部平台与 OA 数据源、商务列表及抽屉 | 进行中;绑定和旗下渠道已接入,画像及 OA 同步待迁移 |
|
||||
| 3 | 预警规则、记录与状态机、操作日志、附件、消息、任务注册与调度 | 进行中;规则已接入,记录和工作流待迁移 |
|
||||
| 3 | 预警规则、记录与状态机、操作日志、附件、消息、任务注册与调度 | 进行中;规则、记录和工作流已接入,生成任务及消息待迁移 |
|
||||
| 4 | 渠道列表及新增、渠道激活、推广游戏等业务接口与页面 | 待实现 |
|
||||
| 5 | 日汇总构建、充值/注册明细、渠道/游戏/区服报表、排行、画像与仪表盘 | 待实现 |
|
||||
| 6 | 静态接口核对、后端测试、前端构建和页面验证 | 随阶段推进,最终全量复核 |
|
||||
@@ -63,4 +63,10 @@
|
||||
- 预警规则七个接口及 Kra 页面已接入。一级商务管理自己的规则,二/三级读取所属一级的规则,超管可管理全部;启停、软删除、监控指标与原校验一致。分类选项来自历史预警记录,删除规则不会丢失历史分类。编辑不覆盖独立的启停/删除状态,省略的可选指标字段沿用旧值。
|
||||
- 新增预警表缺表建表迁移,保留既有表;阈值列支持原页面 9999% 上限。当前 sw7 启动前后均为 `decimal(7,2)`,没有改动既有规则数据。触发检测任务和记录去重写入尚未迁移,不作为规则页面完成范围。
|
||||
- 规则批次通过 biz/data/service/cmd/server/modules 检查、前端 ESLint 与生产构建;隔离 SQLite + TCP HTTP 测试覆盖新增、编辑、启停、软删除、历史分类和跨商务权限。`alert-rules-http-2026-11-03.json` 记录真实 sw7 查询与无效写请求,`alert-rules-page-2026-11-03.json` 记录四级角色入口与指标表单联动;可复用脚本为 `scripts/sw_alert_rules_smoke.cjs`。
|
||||
- 预警记录八个接口与列表、处理抽屉已接入。列表、详情和写入同时按所属一级商务及本人/下级的已通过绑定隔离,渠道键包含平台,保留停用一级渠道的历史预警。`businessId` 筛选取指定商务渠道范围与查看范围的交集,不误用预警归属一级字段。状态汇总仅随范围、平台和指定渠道变化,不受名称、分类、指标及列表状态筛选影响。
|
||||
- 完整工作流为未处理→处理中→待审核→已处理,或待审核→审核驳回→处理中后重新提交。审核只允许一级商务,超管等级为零时也不能审核。状态条件在带权限条件的行锁事务中检查,状态日志及可选备注共同提交;独立备注不改状态,保留原接口允许已关闭记录追加备注的行为(旧页面只读态仍不展示备注编辑区)。
|
||||
- 备注图片复用 Kra 上传接口,支持选取、拖拽、粘贴、暂存预览和移除;添加备注时才上传。修复旧前后端矛盾:先要求非空备注再上传,部分上传或备注失败重试时复用已上传结果。历史数字附件批量查询新文件表,URL 附件保持原值,异常 JSON 视为空附件;记录/规则/日志大 ID 使用字符串响应,避免浏览器精度丢失。
|
||||
- 补充 `202611030007_business_alert_attachments`,针对原 SQL 遗留的日志数字附件做文件 ID 映射。只转换与 `bak_sw2kra_20261103_sys_alert_operation_log` 备份相符的旧日志,新日志、URL 或已变化引用不改动;缺失旧文件不解释为同号新文件,原引用保留在备份。详见 `alert-attachment-migration.md`。
|
||||
- 预警记录批次全量 `go test ./...`、前端 ESLint 与生产构建通过。隔离 SQLite + 实际 TCP HTTP 覆盖全部处理动作、驳回重提、跨商务/平台拒绝、大 ID、附件读取与缺表场景;仓储测试覆盖日志失败回滚与重复请求。MySQL 行锁的真实并发验证留待最终隔离旧库验收。`alert-records-http-2026-11-03.json` 记录当前 sw7 的真实会话请求;当前预警零条,未创建真实预警或上传文件。原商务 45 条、绑定 58 条的 HTTP 回归继续通过。
|
||||
- `alert-records-page-2026-11-03.json` 记录真实 Chrome 下四个等级、五种状态的入口检查,以及完整抽屉流程、附件延迟上传、状态卡片筛选、缺渠道数据提示。浏览器业务数据、处理写入和上传使用受控替身;正向服务端行为另由前述 TCP HTTP 测试覆盖。
|
||||
- 当前没有执行最终旧数据库复制与迁移验收。
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
## 其他页面
|
||||
|
||||
渠道列表、渠道激活、渠道统计、充值明细、注册明细、游戏数据、区服分析、排行榜和预警列表,均需在各自实现前逐项提取旧模板的筛选项、列、按钮、抽屉、权限和跳转。数据库菜单清单或后端接口清单只能用于交叉核对,不能替代页面核对。
|
||||
渠道列表、渠道激活、渠道统计、充值明细、注册明细、游戏数据、区服分析和排行榜,均需在各自实现前逐项提取旧模板的筛选项、列、按钮、抽屉、权限和跳转。数据库菜单清单或后端接口清单只能用于交叉核对,不能替代页面核对。
|
||||
|
||||
## 预警规则
|
||||
|
||||
@@ -51,7 +51,27 @@
|
||||
| 删除需要确认 | 已实现,后端软删除 |
|
||||
| 预警触发去重说明 | 按最终后端描述平台、渠道、类型的未关闭记录去重;生成任务仍待迁移 |
|
||||
|
||||
验证:`alert-rules-http-2026-11-03.json`、`alert-rules-page-2026-11-03.json`,以及隔离数据的真实 TCP HTTP 生命周期测试。预警记录及审核流程仍待迁移。
|
||||
验证:`alert-rules-http-2026-11-03.json`、`alert-rules-page-2026-11-03.json`,以及隔离数据的真实 TCP HTTP 生命周期测试。预警检测与生成任务仍待迁移。
|
||||
|
||||
## 预警列表与处理抽屉
|
||||
|
||||
来源:`sw/web/src/views/AlertCenter/AlertList.vue`、`components/AlertHandleDialog.vue`,并核对最终 `SysAlertRecordServiceImpl` 和 `SysAlertOperationLogServiceImpl`。
|
||||
|
||||
| 旧页面行为 | 新页面状态 |
|
||||
| --- | --- |
|
||||
| 顶部五种状态卡片,点击筛选、再次点击取消 | 已实现;状态卡片统计保留原后端口径 |
|
||||
| 平台默认全选;规则名称、类型、状态、归属商务筛选 | 已实现;平台取消全选时清空列表,不误查询全部 |
|
||||
| 所属平台、触发时间、规则名称、类型、预警对象、归属商务、内容、状态、操作 | 已实现,触发时间按月日时分显示 |
|
||||
| 行操作按五种状态显示处理、继续处理、审核/查看、重新处理、查看 | 已实现;待审核仅一级显示审核,等级为零的超管显示查看 |
|
||||
| 右侧处理/详情抽屉展示摘要与不可删除的操作记录 | 已实现,日志按时间、ID 倒序,动作编码映射中文 |
|
||||
| 只读态隐藏备注与写入按钮 | 已实现;详情最新状态与服务端 canAudit 同时决定可操作性 |
|
||||
| 开始、提交、驳回、重新处理需要确认;审核通过直接提交 | 已对齐 |
|
||||
| 操作成功刷新详情与列表,抽屉保持打开 | 已实现,状态变化后按钮和只读态同步更新 |
|
||||
| 图片选取、拖拽、粘贴、预览、移除,添加备注时才上传 | 已实现;失败重试复用已上传结果,暂存图片阻止直接流转 |
|
||||
| 旧页面允许只选图片,后端要求非空备注 | 按原后端契约提前校验备注,避免先上传后失败 |
|
||||
| 缺渠道表无法判断可见范围 | 返回 available=false,卡片显示未接入,不把未知范围当成真实零 |
|
||||
|
||||
验证:`alert-records-http-2026-11-03.json`、`alert-records-page-2026-11-03.json`;后端完整状态流转通过独立 SQLite 和真实 TCP HTTP 测试,浏览器核对四个等级和五种状态的入口。预警检测/生成任务仍未接入,不因列表和工作流完成而宣称整个预警链路完成。
|
||||
|
||||
## 登录页
|
||||
|
||||
|
||||
Reference in New Issue
Block a user