From 974e68cf54c160949f9fc459eda926c0d92351b2 Mon Sep 17 00:00:00 2001 From: jsowell <123@jsowell.com> Date: Thu, 16 Jul 2026 16:50:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BE=85=E5=8A=9E=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E8=8F=9C=E5=8D=95=E5=92=8C=E5=9F=BA=E7=A1=80=E6=9D=83?= =?UTF-8?q?=E9=99=90=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-07-16-todo-center-task-tracker.md | 24 ++- docs/sql/sys_todo_menu.sql | 142 ++++++++++++++++++ 2 files changed, 158 insertions(+), 8 deletions(-) create mode 100644 docs/sql/sys_todo_menu.sql diff --git a/docs/plan/2026-07-16-todo-center-task-tracker.md b/docs/plan/2026-07-16-todo-center-task-tracker.md index 1dbbc967a..1690dd494 100644 --- a/docs/plan/2026-07-16-todo-center-task-tracker.md +++ b/docs/plan/2026-07-16-todo-center-task-tracker.md @@ -43,10 +43,10 @@ PRD 同时要求“幂等键唯一”和“任务完成后允许同一业务重 | --- | --- | --- | --- | --- | --- | | B01 | 任务拆分、数据表和索引 | P0 | done | SQL 结构和索引评审通过 | `e65017ab2` | | B02 | 实体、命令模型、枚举、Mapper、Service | P0 | done | 模块编译和 Mapper XML 校验通过 | `181d4a5b4` | -| B03 | 当前用户查询、已读、完成、取消接口及测试 | P0 | done | 全量依赖编译、9 个专项测试通过 | 本批提交 | -| B04 | 前端 API、待办中心页面和路由跳转 | P0 | todo | - | - | -| B05 | 首页待办卡片、数量展示和轮询刷新 | P0 | todo | - | - | -| B06 | 菜单权限 SQL、联调和首期回归 | P0 | todo | - | - | +| B03 | 当前用户查询、已读、完成、取消接口及测试 | P0 | done | 全量依赖编译、9 个专项测试通过 | `f84ec43ce` | +| B04 | 前端 API、待办中心页面和路由跳转 | P0 | done | ESLint 和生产构建通过 | 前端 `ff6b890` | +| B05 | 首页待办卡片、数量展示和轮询刷新 | P0 | done | ESLint 和生产构建通过 | 前端 `0627061` | +| B06 | 菜单权限 SQL、联调和首期回归 | P0 | done | 菜单 SQL、构建和专项回归通过;待测试库执行 SQL | 本批提交 | | B07 | 平台采购开票待办接入 | P1 | todo | - | - | | B08 | 司机开票申请待办接入 | P1 | todo | - | - | | B09 | 管理端创建、分配、取消和隐藏能力 | P1 | todo | - | - | @@ -97,7 +97,7 @@ PRD 同时要求“幂等键唯一”和“任务完成后允许同一业务重 - 优先级:P0 - 批次:B04 -- 状态:todo +- 状态:done - 目标:增加 API 封装、待办中心列表、筛选、分页、批量已读和安全跳转。 - 验收标准: - 支持任务状态、阅读状态、任务类型和关键字筛选。 @@ -109,7 +109,7 @@ PRD 同时要求“幂等键唯一”和“任务完成后允许同一业务重 - 优先级:P0 - 批次:B05 -- 状态:todo +- 状态:done - 目标:在运营商工作台首页展示未完成数量和最近 3 条任务。 - 验收标准: - 数量超过 99 显示 `99+`。 @@ -121,7 +121,12 @@ PRD 同时要求“幂等键唯一”和“任务完成后允许同一业务重 - 优先级:P0 - 批次:B06 -- 状态:todo +- 状态:in_progress +- 当前进展: + - 菜单、查询、已读、完成和取消权限 SQL 已完成。 + - 列表、查询和已读权限默认授予正常角色;完成和取消权限保留为按业务角色授权。 + - 后端 9 个专项测试、前端专项 ESLint 和生产构建已通过。 + - 待在测试库执行 `docs/sql/sys_todo_menu.sql` 后进行登录态 HTTP 联调。 - 目标:补充菜单与权限 SQL,完成前后端构建和核心流程联调。 - 验收标准: - 普通用户只看到本人待办。 @@ -176,4 +181,7 @@ PRD 同时要求“幂等键唯一”和“任务完成后允许同一业务重 - 2026-07-16,B01:完成优先级拆分、任务跟踪文档和 `sys_todo_task` 建表脚本;通过 SQL 人工结构评审与 `git diff --check`;commit `e65017ab2`。 - 2026-07-16,B01 环境进展:用户已在测试数据库创建 `sys_todo_task` 表,可供后续接口联调。 - 2026-07-16,B02:完成领域模型、创建/查询 DTO、状态常量、Mapper 和统一 Service;`mvn -pl jsowell-system -am -DskipTests compile` 与 Mapper XML 语法校验通过;commit `181d4a5b4`。 -- 2026-07-16,B03:完成当前用户数量、首页列表、分页列表、详情、已读、全部已读、完成和取消接口;`mvn -pl jsowell-admin -am -DskipTests compile` 通过,9 个 Service/Controller 专项测试通过;commit hash 在下一批记录中回填。 +- 2026-07-16,B03:完成当前用户数量、首页列表、分页列表、详情、已读、全部已读、完成和取消接口;`mvn -pl jsowell-admin -am -DskipTests compile` 通过,9 个 Service/Controller 专项测试通过;commit `f84ec43ce`。 +- 2026-07-16,B04:完成前端 API、待办中心筛选分页、批量已读和安全路由跳转;新增文件专项 ESLint 通过,`NODE_OPTIONS=--openssl-legacy-provider npm run build:prd` 构建通过;前端 commit `ff6b890`。 +- 2026-07-16,B05:完成首页右侧待办卡片、`99+` 数量、最近 3 条、空状态、错误重试和 60 秒轮询;专项 ESLint 与生产构建通过;前端 commit `0627061`。 +- 2026-07-16,B06:完成幂等菜单/权限 SQL;列表、查询和已读权限默认授予正常角色,完成和取消权限需按业务角色显式授权;后端 9 个专项测试再次通过,前端构建沿用 B05 验证结果;commit hash 在下一批记录中回填。 diff --git a/docs/sql/sys_todo_menu.sql b/docs/sql/sys_todo_menu.sql new file mode 100644 index 000000000..2754f2fca --- /dev/null +++ b/docs/sql/sys_todo_menu.sql @@ -0,0 +1,142 @@ +-- 待办中心菜单与基础权限 +-- 执行效果: +-- 1. 新增可访问 /system/todo 的顶级菜单。 +-- 2. 为所有正常角色授予列表、详情和已读权限;接口始终只返回当前登录用户数据。 +-- 3. 完成和取消权限默认不授予普通角色,需按业务职责显式分配。 + +SET @todoMenuId := ( + SELECT menu_id + FROM sys_menu + WHERE path = 'system/todo' + AND menu_type = 'C' + LIMIT 1 +); + +INSERT INTO sys_menu ( + menu_name, parent_id, order_num, path, component, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, remark +) +SELECT + '待办中心', 0, 8, 'system/todo', 'system/todo/index', 1, 0, + 'C', '0', '0', 'system:todo:list', 'list', 'system', sysdate(), '当前登录用户待办中心' +FROM DUAL +WHERE @todoMenuId IS NULL; + +SET @todoMenuId := COALESCE(@todoMenuId, LAST_INSERT_ID()); + +SET @todoQueryMenuId := ( + SELECT menu_id FROM sys_menu + WHERE parent_id = @todoMenuId AND perms = 'system:todo:query' + LIMIT 1 +); + +INSERT INTO sys_menu ( + menu_name, parent_id, order_num, path, component, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, remark +) +SELECT + '待办查询', @todoMenuId, 1, '#', '', 1, 0, + 'F', '0', '0', 'system:todo:query', '#', 'system', sysdate(), '' +FROM DUAL +WHERE @todoQueryMenuId IS NULL; + +SET @todoQueryMenuId := COALESCE(@todoQueryMenuId, LAST_INSERT_ID()); + +SET @todoReadMenuId := ( + SELECT menu_id FROM sys_menu + WHERE parent_id = @todoMenuId AND perms = 'system:todo:read' + LIMIT 1 +); + +INSERT INTO sys_menu ( + menu_name, parent_id, order_num, path, component, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, remark +) +SELECT + '待办已读', @todoMenuId, 2, '#', '', 1, 0, + 'F', '0', '0', 'system:todo:read', '#', 'system', sysdate(), '' +FROM DUAL +WHERE @todoReadMenuId IS NULL; + +SET @todoReadMenuId := COALESCE(@todoReadMenuId, LAST_INSERT_ID()); + +SET @todoCompleteMenuId := ( + SELECT menu_id FROM sys_menu + WHERE parent_id = @todoMenuId AND perms = 'system:todo:complete' + LIMIT 1 +); + +INSERT INTO sys_menu ( + menu_name, parent_id, order_num, path, component, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, remark +) +SELECT + '待办完成', @todoMenuId, 3, '#', '', 1, 0, + 'F', '0', '0', 'system:todo:complete', '#', 'system', sysdate(), '仅分配给具备对应业务处理权限的角色' +FROM DUAL +WHERE @todoCompleteMenuId IS NULL; + +SET @todoCompleteMenuId := COALESCE(@todoCompleteMenuId, LAST_INSERT_ID()); + +SET @todoCancelMenuId := ( + SELECT menu_id FROM sys_menu + WHERE parent_id = @todoMenuId AND perms = 'system:todo:cancel' + LIMIT 1 +); + +INSERT INTO sys_menu ( + menu_name, parent_id, order_num, path, component, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, remark +) +SELECT + '待办取消', @todoMenuId, 4, '#', '', 1, 0, + 'F', '0', '0', 'system:todo:cancel', '#', 'system', sysdate(), '仅分配给具备关闭任务权限的角色' +FROM DUAL +WHERE @todoCancelMenuId IS NULL; + +SET @todoCancelMenuId := COALESCE(@todoCancelMenuId, LAST_INSERT_ID()); + +-- 所有正常角色均可查看、查询并标记本人的待办。 +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT role_id, @todoMenuId +FROM sys_role role_info +WHERE role_info.status = '0' + AND role_info.del_flag = '0' + AND NOT EXISTS ( + SELECT 1 FROM sys_role_menu relation + WHERE relation.role_id = role_info.role_id + AND relation.menu_id = @todoMenuId + ); + +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT role_id, @todoQueryMenuId +FROM sys_role role_info +WHERE role_info.status = '0' + AND role_info.del_flag = '0' + AND NOT EXISTS ( + SELECT 1 FROM sys_role_menu relation + WHERE relation.role_id = role_info.role_id + AND relation.menu_id = @todoQueryMenuId + ); + +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT role_id, @todoReadMenuId +FROM sys_role role_info +WHERE role_info.status = '0' + AND role_info.del_flag = '0' + AND NOT EXISTS ( + SELECT 1 FROM sys_role_menu relation + WHERE relation.role_id = role_info.role_id + AND relation.menu_id = @todoReadMenuId + ); + +-- 完成/取消权限按业务角色手工授权示例: +-- INSERT INTO sys_role_menu (role_id, menu_id) VALUES (<业务处理角色ID>, @todoCompleteMenuId); +-- INSERT INTO sys_role_menu (role_id, menu_id) VALUES (<任务关闭角色ID>, @todoCancelMenuId); + +SELECT + @todoMenuId AS todo_menu_id, + @todoQueryMenuId AS todo_query_menu_id, + @todoReadMenuId AS todo_read_menu_id, + @todoCompleteMenuId AS todo_complete_menu_id, + @todoCancelMenuId AS todo_cancel_menu_id;