feat: 迁移日汇总任务并修复商务菜单图标
This commit is contained in:
@@ -27,7 +27,7 @@
|
||||
| 2 | 平台绑定、商务/渠道可见范围、外部平台与 OA 数据源、商务列表及抽屉 | 进行中;绑定、旗下渠道、商务/SDK 画像、OA 激活只读接口已接入;外部数据源及审核实库联调待完成 |
|
||||
| 3 | 预警规则、记录与状态机、操作日志、附件、消息、任务注册与调度 | 进行中;规则、记录和工作流已接入;任务待迁移,消息盒子已确认属于未改动框架代码 |
|
||||
| 4 | 渠道列表及新增、渠道激活、推广游戏等业务接口与页面 | 功能已接入;包含渠道画像,完整业务数据和源平台联调仍待最终验收 |
|
||||
| 5 | 日汇总构建、充值/注册明细、渠道/游戏/区服报表、排行、画像与仪表盘 | 进行中;画像、注册/充值明细及导出、渠道/游戏/区服统计、独立排行榜与工作台仪表盘已接入,汇总构建及预警任务待迁移 |
|
||||
| 5 | 日汇总构建、充值/注册明细、渠道/游戏/区服报表、排行、画像与仪表盘 | 进行中;画像、明细及导出、各报表/排行榜、工作台和两类汇总构建已接入,预警检测任务与最终实库验收待完成 |
|
||||
| 6 | 静态接口核对、后端测试、前端构建和页面验证 | 随阶段推进,最终全量复核 |
|
||||
| 7 | 用户确认源数据库,复制至隔离库,执行迁移,启动并逐接口核对数据 | 未开始,必须等待用户确认 |
|
||||
|
||||
@@ -101,3 +101,7 @@
|
||||
- 工作台批次全量 Go、隔离 TCP HTTP、领域/仓储测试、前端 ESLint/构建通过;真实 sw7 请求记录见 `workbench-http-2026-11-04.json`。缺业务表时六卡返回 null、榜单明确报未接入。未执行页面交互检查或最终旧库复制。
|
||||
- 独立排行榜渠道、商务、游戏三个接口和 Kra 页面已接入,各有注册/充值/付费率/活跃 TOP20,保留平台、维度独立日期记忆、近 7 天默认周期和等长上期。付费率用百分点差,其余用百分比环比。商务按直属下级展示、合并其整个下级绑定树,再累加各渠道人数;三级不展示商务排行。
|
||||
- 排行批次全量 Go、隔离 TCP HTTP、领域/仓储测试、前端 ESLint/构建、真实 sw7 接口检查通过,见 `ranking-http-2026-11-04.json` 与 `ranking-source-notes.md`。当前 SQL 清单 63 个目标接口中 51 个已注册;其余 12 个均为 `SysUser` 历史系统别名,详见 `system-api-audit.md`,不能将接口注册数量当作全迁移完成证明。汇总和预警任务、最终旧库迁移验收仍待完成。
|
||||
- 已迁移日汇总/区服汇总的今日、昨日、按日期回跑六个任务方法,复用 Kra 原生任务创建、手动触发、执行日志和取消机制。汇总和身份键同事务替换,按报表类型与日期持有数据库行锁;增加 `202611040008_business_report_build_locks`。只注册方法,不自动新建或启用计划。当前真实 sw7 的 7 个导入任务均保持禁用。
|
||||
- 汇总领域/仓储测试和原生任务实际 TCP HTTP 测试通过,覆盖账号/身份证双口径、主/子账号差异、无平台登录歧义、原始账号新增付费交集、自然日格式、幂等回跑及写入失败回滚。全量 Go 通过;真实服务方法和禁用状态验证见 `report-build-http-2026-11-04.json`。未触发实际 sw7 的数据重建;完整源库重跑比较仍留待最终阶段。
|
||||
- 用户反馈仅排行榜图标可显示,定位为原 SQL 直接复制 RuoYi SVG 名称。已修正原 SQL 首次迁移和重复执行分支,模块菜单改用统一的 14 项有效 Kra 图标;新增 `202611040009_business_menu_icons` 修复已迁移库,单独补丁为 `menu-icon-repair.sql`。仅替换旧迁移值,保留其他自定义图标。
|
||||
- 14 个图标都已通过本地已安装组件的 SVG 输出验证;实际 8000 和 18000 菜单接口全部返回正确图标,见 `menu-icons-components-2026-11-04.json`、`menu-icons-live-http-2026-11-04.json`、`menu-icons-http-2026-11-04.json`。这次按用户明确要求修改原迁移 SQL,原有暂存内容继续保留;未执行整个旧库迁移脚本。
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
-- 已完成迁移的 Kra 数据库可单独执行;仅更新商务菜单的旧图标值。
|
||||
START TRANSACTION;
|
||||
-- RuoYi SVG 名称转换为 Kra 已注册图标;只修复旧值,保留后续自定义选择。
|
||||
UPDATE sys_base_menus SET icon=CASE name
|
||||
WHEN 'sw_BusMgmt' THEN 'Briefcase'
|
||||
WHEN 'sw_BusinessList' THEN 'UserFilled'
|
||||
WHEN 'sw_ChannelList' THEN 'Connection'
|
||||
WHEN 'sw_ChannelActivationList' THEN 'CircleCheck'
|
||||
WHEN 'sw_DataAnalysis' THEN 'DataAnalysis'
|
||||
WHEN 'sw_ChannelDataStatistics' THEN 'Histogram'
|
||||
WHEN 'sw_RechargeDetails' THEN 'Money'
|
||||
WHEN 'sw_RegistrationDetails' THEN 'User'
|
||||
WHEN 'sw_GameAnalytics' THEN 'TrendCharts'
|
||||
WHEN 'sw_ServerAnalysis' THEN 'Monitor'
|
||||
WHEN 'sw_RankingAnalysis' THEN 'Star'
|
||||
WHEN 'sw_AlertCenter' THEN 'Bell'
|
||||
WHEN 'sw_AlertList' THEN 'Warning'
|
||||
WHEN 'sw_AlertRules' THEN 'Setting'
|
||||
ELSE icon END
|
||||
WHERE name IN ('sw_BusMgmt','sw_BusinessList','sw_ChannelList','sw_ChannelActivationList','sw_DataAnalysis','sw_ChannelDataStatistics','sw_RechargeDetails','sw_RegistrationDetails','sw_GameAnalytics','sw_ServerAnalysis','sw_RankingAnalysis','sw_AlertCenter','sw_AlertList','sw_AlertRules')
|
||||
AND (icon IS NULL OR icon IN ('', 'category', 'email', 'chart', 'company', 'international', 'color', 'dict', 'cascader', 'education', 'excel', 'star', 'process-definition', 'documentation', 'example', 'data-analysis', 'user', 'money', 'warn'));
|
||||
COMMIT;
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"method": "本地已安装组件的 SSR SVG 验证,包含首次/重复迁移 SQL 与模块定义一致性检查",
|
||||
"icons": [
|
||||
{
|
||||
"name": "sw_BusMgmt",
|
||||
"icon": "Briefcase",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_BusinessList",
|
||||
"icon": "UserFilled",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelList",
|
||||
"icon": "Connection",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelActivationList",
|
||||
"icon": "CircleCheck",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_DataAnalysis",
|
||||
"icon": "DataAnalysis",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelDataStatistics",
|
||||
"icon": "Histogram",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RechargeDetails",
|
||||
"icon": "Money",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RegistrationDetails",
|
||||
"icon": "User",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_GameAnalytics",
|
||||
"icon": "TrendCharts",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ServerAnalysis",
|
||||
"icon": "Monitor",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RankingAnalysis",
|
||||
"icon": "Star",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertCenter",
|
||||
"icon": "Bell",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertList",
|
||||
"icon": "Warning",
|
||||
"svgRendered": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertRules",
|
||||
"icon": "Setting",
|
||||
"svgRendered": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"baseURL": "http://127.0.0.1:18000",
|
||||
"menuCount": 14,
|
||||
"checks": [
|
||||
{
|
||||
"name": "sw_BusMgmt",
|
||||
"icon": "Briefcase",
|
||||
"expected": "Briefcase",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_BusinessList",
|
||||
"icon": "UserFilled",
|
||||
"expected": "UserFilled",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelList",
|
||||
"icon": "Connection",
|
||||
"expected": "Connection",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelActivationList",
|
||||
"icon": "CircleCheck",
|
||||
"expected": "CircleCheck",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_DataAnalysis",
|
||||
"icon": "DataAnalysis",
|
||||
"expected": "DataAnalysis",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelDataStatistics",
|
||||
"icon": "Histogram",
|
||||
"expected": "Histogram",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RechargeDetails",
|
||||
"icon": "Money",
|
||||
"expected": "Money",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RegistrationDetails",
|
||||
"icon": "User",
|
||||
"expected": "User",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_GameAnalytics",
|
||||
"icon": "TrendCharts",
|
||||
"expected": "TrendCharts",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ServerAnalysis",
|
||||
"icon": "Monitor",
|
||||
"expected": "Monitor",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RankingAnalysis",
|
||||
"icon": "Star",
|
||||
"expected": "Star",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertCenter",
|
||||
"icon": "Bell",
|
||||
"expected": "Bell",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertList",
|
||||
"icon": "Warning",
|
||||
"expected": "Warning",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertRules",
|
||||
"icon": "Setting",
|
||||
"expected": "Setting",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"baseURL": "http://127.0.0.1:8000",
|
||||
"menuCount": 14,
|
||||
"checks": [
|
||||
{
|
||||
"name": "sw_BusMgmt",
|
||||
"icon": "Briefcase",
|
||||
"expected": "Briefcase",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_BusinessList",
|
||||
"icon": "UserFilled",
|
||||
"expected": "UserFilled",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelList",
|
||||
"icon": "Connection",
|
||||
"expected": "Connection",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelActivationList",
|
||||
"icon": "CircleCheck",
|
||||
"expected": "CircleCheck",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_DataAnalysis",
|
||||
"icon": "DataAnalysis",
|
||||
"expected": "DataAnalysis",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ChannelDataStatistics",
|
||||
"icon": "Histogram",
|
||||
"expected": "Histogram",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RechargeDetails",
|
||||
"icon": "Money",
|
||||
"expected": "Money",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RegistrationDetails",
|
||||
"icon": "User",
|
||||
"expected": "User",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_GameAnalytics",
|
||||
"icon": "TrendCharts",
|
||||
"expected": "TrendCharts",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_ServerAnalysis",
|
||||
"icon": "Monitor",
|
||||
"expected": "Monitor",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_RankingAnalysis",
|
||||
"icon": "Star",
|
||||
"expected": "Star",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertCenter",
|
||||
"icon": "Bell",
|
||||
"expected": "Bell",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertList",
|
||||
"icon": "Warning",
|
||||
"expected": "Warning",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"name": "sw_AlertRules",
|
||||
"icon": "Setting",
|
||||
"expected": "Setting",
|
||||
"passed": true
|
||||
}
|
||||
],
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
# 商务菜单图标修复
|
||||
|
||||
旧 SQL 使用 `COALESCE(n.icon,'')` 原样迁移 RuoYi 图标名。实际菜单接口返回 category/email/chart/international 等,Kra 未注册这些图标;star 恰好对应 Element Plus 的 Star。
|
||||
|
||||
Kra 的 `web/src/core/global.js` 注册全部 `@element-plus/icons-vue` 导出组件,以及仓库本地 SVG。现在明确使用组件导出名,避免依赖旧 SVG 文件或大小写猜测。
|
||||
|
||||
| 菜单 | Kra 图标 |
|
||||
| --- | --- |
|
||||
| 商务管理 / 商务列表 | Briefcase / UserFilled |
|
||||
| 渠道列表 / 渠道激活 | Connection / CircleCheck |
|
||||
| 数据分析 / 渠道数据统计 | DataAnalysis / Histogram |
|
||||
| 充值明细 / 注册明细 | Money / User |
|
||||
| 游戏数据 / 区服分析 | TrendCharts / Monitor |
|
||||
| 排行榜 | Star |
|
||||
| 预警中心 / 预警列表 / 预警规则 | Bell / Warning / Setting |
|
||||
|
||||
首次迁移按旧菜单 path 映射;重复执行分支和 `202611040009_business_menu_icons` 修复已迁移库。仅替换原迁移、早期模块默认图标或空值,其他自定义图标保留。无需完整重跑数据库迁移,独立 SQL 补丁见 `menu-icon-repair.sql`。
|
||||
|
||||
`scripts/sw_menu_icons_verify.cjs` 检查当前安装的真实组件、SVG 输出、模块定义和 SQL 两条分支的一致性。实际 8000/18000 菜单接口均已通过 14 项检查;没有进行浏览器交互检查。刷新页面重新加载菜单后生效。
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"scope": "真实 sw7 会话,只读任务接口;正向创建和触发通过隔离数据库原生任务 HTTP 测试。",
|
||||
"registeredMethods": [
|
||||
"swReportDayBackfillTask",
|
||||
"swReportDayTodayTask",
|
||||
"swReportDayYesterdayTask",
|
||||
"swReportServerDayBackfillTask",
|
||||
"swReportServerDayTodayTask",
|
||||
"swReportServerDayYesterdayTask"
|
||||
],
|
||||
"importedTasks": 7,
|
||||
"enabledImportedTasks": 0,
|
||||
"passed": true
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
# 日汇总和区服汇总任务迁移
|
||||
|
||||
核对旧 main 的两个 `SwReport*BuildServiceImpl`、两个 SnailJob 执行器、`ReportIdentityHelper` 和 `ReportBuildRangeSupport`。
|
||||
|
||||
## 原始数据口径
|
||||
|
||||
- 日汇总注册只取 `tab_user.puid=0`,注册时间按原 `CAST(register_time AS UNSIGNED)` 语义。按平台、渠道、首次游戏分组。
|
||||
- 日汇总活跃来自 `tab_user_day_login`,必须能找到同平台主账号。记录无平台时,仅当全库同 ID 恰好一个主账号时才接受;跨平台存在多个主账号时跳过。缺渠道回退账号的渠道。
|
||||
- 日汇总充值取当天成功支付,金额不限制主账号;付款用户不存在时模式 0 仍计账号,模式 1 因无身份证不计身份。没有付款用户 ID 的成功单仍计金额。
|
||||
- 新增付费先取同一分组内“当日注册账号 ∩ 当日付费账号”,再转身份证;不能直接用身份证交集,否则会把同证件的其他账号误认成新增付费。
|
||||
- 区服注册取 `tab_user_play_info.create_time` 的创角,活跃取 `play_time`,不套用日注册/登录的主账号限制。区服编号去首尾空白,保留前导零;创角/活跃缺游戏 ID 时忽略,充值缺游戏 ID 沿用 0。区服汇总没有新增付费指标。
|
||||
- 两类报表均按日、平台、渠道、游戏(区服额外编号)生成模式 0/1 两行及对应身份键。模式 1 去首尾空格、仅将末尾 X 转 x,空身份证丢弃。金额两种模式相同,查询层仍固定读取模式 0。
|
||||
- 游戏名作为当前游戏资料的快照写入。游戏/用户按关联 ID 批量加载,平台作为字典键的一部分,不混淆跨平台同号。
|
||||
|
||||
## 原子替换与任务
|
||||
|
||||
- 所有原始数据读取、计算和两张报表替换在同一事务。按报表类型+日期的锁表串行同分区重建,避免不同任务同时回跑同一天。读不到必要源表/目标表时拒绝重建,不清空既有数据。
|
||||
- 汇总、身份键按批写入,失败或取消回滚原有分区;其他日期不变。输出日期固定 `yyyy-MM-dd`,不采用驱动返回的时间格式作为写入日期。
|
||||
- 任务方法保留 `swReportDayTodayTask` / `YesterdayTask` / `BackfillTask` 和对应 `swReportServerDay*` 六个名字。已有迁移 SQL 保留旧执行器名和 `_execution` 参数,可直接绑定 Kra 方法执行器。
|
||||
- 回跑参数为 startDate/endDate;每个缺省日期独立取昨日,闭区间逐日重建、日间暂停一秒,最后一天不暂停。支持上下文取消,非法/倒置日期报错。
|
||||
- 不新建默认商务计划、不启用旧导入计划。原始同步表和四张业务报表表沿用旧库结构;本批只新建日期互斥锁表,不在系统库中伪造完整业务数据源。
|
||||
|
||||
## 验证边界
|
||||
|
||||
领域与存储测试覆盖身份/账号规则、重复构建、自然日筛选和身份明细写失败后的原子回滚。真实 TCP HTTP 使用隔离数据库和 Kra 原生任务创建、手动触发、执行日志,核对两种报表实际落库且任务仍为禁用。
|
||||
|
||||
全量 Go 测试通过。当前真实 sw7 仅查询注册方法和计划状态,7 个导入任务均禁用。没有在真实 sw7 重建报表,也没有开始最终旧数据库复制与同源结果比较;MySQL 并发锁效果须在最终隔离旧库联调中验证。
|
||||
Reference in New Issue
Block a user