Commit Graph
182 Commits
Author SHA1 Message Date
郭庆泰 9f132d4f86 fix(meetings): copy 模式 reset periodNo, 清 meetingId 防走错分支; goBack 按 mode 区分回上游 (new→projects, edit/copy→meetings) 2026-08-18 23:45:45 +08:00
郭庆泰 8fd7eaeb5a fix(meetings): 还原 MeetingNew.vue 到 a081da8 模板结构 (左6+右5, 无项目形式/总期数), 保留 3 模式逻辑 2026-08-18 23:45:08 +08:00
郭庆泰 ba34f04432 fix(meetings): 调表单右列顺序 (会议名称→项目形式→期数→总期数→开始→结束→备注), 备注跨双列, form 字段顺序同步 2026-08-18 23:41:41 +08:00
郭庆泰 936256df2b fix(meetings): 修上轮重命名 projectId→urlProjectId 后没同步 onMounted new 分支, 导致建会流程空跑 2026-08-18 23:40:57 +08:00
郭庆泰 1e4546d791 fix(meetings): 修改/复制 URL 带 projectId 让左列快照立刻加载; meeting 冗余字段兜底防 project_id 为 NULL 2026-08-18 23:38:28 +08:00
郭庆泰 f2830196a1 refactor(meetings): 修改/复制跳独立页 /manager/meetings/new?meetingId=xxx[&mode=copy], 移除列表页 edit dialog 2026-08-18 23:36:08 +08:00
郭庆泰 580410f70f docs(manager_meetings): 重写, 按 skill 标准 11 章走, 修复记录归附录 2026-08-18 23:31:09 +08:00
郭庆泰 bae9fa6a6f fix(meetings): 恢复会议ID filter (原型有), 第?期 改 el-input-number 2026-08-18 23:27:17 +08:00
郭庆泰 c91272a05f fix(meetings): 删会议ID 筛选框 (P0#2), 保留列 (用户未要求删) 2026-08-18 23:23:35 +08:00
郭庆泰 af4373b2dd docs(manager_meetings): 第四轮修复记录 (P0#1 mapper 筛选), 待修复表 #1, 记 DB stage 数据不一致 2026-08-18 23:21:21 +08:00
郭庆泰 14757f359b fix(meetings): selectList 加 7 个筛选 if (P0#1), Date 字段加 @DateTimeFormat 让字符串能 Spring 绑定 2026-08-18 23:20:54 +08:00
郭庆泰 e644e0897f docs(manager_meetings): 第三轮修复记录 (style-alignment + 批量按钮去 plain), §9/§10/§11 同步, 待修复表新增 #18-#20 2026-08-18 23:17:53 +08:00
郭庆泰 6774c44429 fix(meetings): 批量提交按钮去 plain (disabled 顺色), 提示推最右 2026-08-18 23:15:57 +08:00
郭庆泰 6d4f1e66d4 style(meetings): 对齐 People.vue — 删 inline margin, batch-bar 顺序对齐, 加 .date-sep 2026-08-18 23:13:56 +08:00
郭庆泰 869f7de1bc docs(manager_meetings): 第二轮修复记录 (onCopy 走 bizAdd + 双 toast 修), 待修复表 P0#3/#4 标 2026-08-18 23:10:09 +08:00
郭庆泰 08d81e95bd fix(meetings): onCopy 走 bizAdd 创建副本 (修 0 行误报成功 bug), submit/onSubmit/onBatchSubmit 加 __silentError 修双 toast 2026-08-18 23:08:32 +08:00
郭庆泰 a081da82e4 style(meeting-new): 期数 placeholder 改为请填写第几期 2026-08-18 23:02:21 +08:00
郭庆泰 ffda9c618e feat(biz_project): 加 create_user_id 列, JOIN biz_person 取创建人姓名 2026-08-18 23:00:41 +08:00
郭庆泰andClaude ac31387b95 fix(meeting-new): 修双 toast (axios 拦截器 + catch 各弹一次)
bizAdd 第3 个参数 opts 透传到 request.post, 设置 __silentError: true 让
拦截器不自动 toast, 错误统一由下方 catch 处理, 避免:
- 英文: Request failed with status code 500
- 中文: 保存失败

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:49:11 +08:00
郭庆泰andClaude a4810099d0 style(meeting-new): 面包屑 margin-bottom 12px → 24px, 表单离面包屑远一点
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:47:55 +08:00
郭庆泰andClaude 379cf226f5 style(meeting-new): 删红字提示 *会议名称默认为项目名称,不可修改
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:47:31 +08:00
郭庆泰andClaude 29a4b02d27 style(meeting-new): 删 margin:0 auto, 主面板不居中 (跟 Accounts.vue 一致)
Accounts.vue 用法: .manager-accounts { padding: 16px; max-width: 1200px; }
无 margin: 0 auto, 所以主面板靠左对齐, 不是居中。
我之前加的 margin: 0 auto 让它居中了, 跟 Accounts.vue 不一致, 已删。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:46:53 +08:00
郭庆泰andClaude 518da057e4 refactor(meeting-new): 恢复 2 列布局, 保留 el-form 项目标准
之前把 grid 改成单列 el-form-item 序列, 偏离原型 2 列布局。
现在用 .form-grid (CSS Grid 2 列 + grid-auto-flow: column 让左 6 右 5 对齐)
包住 11 个 el-form-item, 同时保留:
- el-form + :rules (项目标准)
- el-button type=primary (项目标准, 不覆盖 CSS)
- label-width 110px (跟原型一致, 不是 skill 的 120px — 因为原型是设计真源)
- :deep(.el-form-item) { margin-bottom: 0 } 让 grid 控制间距

按钮用 el-form-item 包裹 (skill 标准), 通过 CSS 隐藏 label 列避免空白。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:45:45 +08:00
郭庆泰andClaude 8f62f65c0b style(meeting-new): 严格按 People.vue 标准重写 (第二轮)
按 /style-alignment skill 重新对齐:
- 用 el-form + el-form-item (skill form 页标准, 不另起 div.form-actions)
- 用 el-button type=primary (Element Plus 默认主题, 不覆盖 CSS)
- 用 el-input / el-date-picker (替代 raw input[type=text], Element Plus 风格统一)
- 删自定义 .btn / .btn-primary / .btn-default / .form-row / .form-label / .form-input CSS
- 删自定义 2 列 grid 布局 (prototype 特定, 跟项目标准不符)
- 11 项全用 el-form-item 包裹 (label 无冒号)
- 底部按钮直接 <el-form-item> 包裹 (skill 标准)
- 单 page-card + max-width: 1200px (form 页 skill 标准)
- 保留 红字提示 .hint-text + 只读值 .form-value 业务专属 CSS
- 保留 el-form :rules 校验 (替代手动 if 判断)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:43:33 +08:00
郭庆泰andClaude 5b4008d24a style(meeting-new): 对齐 manager/MeetingNew.vue 到项目统一风格
- 替换 #1890ff / #169bd5 硬编码蓝 → var(--brand-primary) / var(--brand-primary-deep)
- 单 page-card 包裹 + max-width: 1200px (form 页 skill 标准)
- 面包屑 改 首页 / 会议管理 / 新建会议 (skill 标准, 原型 项目列表 / 新建会议)
- 删 h1 新建会议 大标题 (skill 禁忌)
- 红字提示包到 .hint-text (skill .hint-list 风格, 12px #ff4d4f + #fff bg + #f0f0f0 border)
- form-label 110px → 120px (skill label-width 标准)
- 保留 6+5 form-row 布局 (跟原型 1:1)
- 保留 768px 响应式

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:41:04 +08:00
郭庆泰andClaude 4fbfcbfb0c refactor(meeting-new): 跟原型 new-meeting.html 1:1 对齐
完全重写 MeetingNew.vue, 严格按原型 HTML/CSS 翻译:
- 结构: 面包屑(可点击项目列表) + h1 + 红字提示 + .card + .form-grid (2列) + .form-actions
- 左列 6 项只读: 项目编号/项目名称/总场次/总期数/支持单位/创建时间/创建人员
- 右列 5 项: 会议名称(只读) + 期数/开始时间/结束时间/备注(输入)
- CSS 完整照搬: #169bd5 主按钮 + 32px input + 12px 面包屑 + 22px h1 + #ff4d4f 红字 + grid 1fr 1fr + 768px 响应式
- grid-auto-flow: column 让左 6 右 5 对齐 (符合原型 §#4/##5 设计意图)
- 字段映射: 总场次/总期数→biz_project.totalSessions; 支持单位→biz_project.sponsorOrgName (JOIN biz_org)

删除多余项 (前几轮加的): 项目形式/总期数/当前阶段下拉/page-sub/el-descriptions/会议ID输入框

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:39:02 +08:00
郭庆泰andClaude 66a928a870 fix(meeting-new): 落实 manager/meetings/new 审查报告 13 项修复
P0 数据正确性:
- BizMeetingMapper.xml INSERT 扩 20 列 (原只插 meeting_id)
- BizMeetingServiceImpl businessId 兜底生成 (DDL NOT NULL, 前端无字段)
- MeetingNew.vue onMounted 回填 projectId/projectName (原只 projectNo)

P1 核心功能:
- 删 会议ID 输入框 (PK 让用户填错)
- 加 6 个项目只读快照 (el-descriptions, 跟原型对齐)
- 会议名称默认 = 项目名称, 不可修改 (加红字提示 + disabled)
- meetingId String → Long (6 文件: BizMeeting/Mapper/ServiceImpl/Controller/IBizMeetingService/Mapper.xml)
- supervisionTime String → Date + @JsonFormat

P2 体验:
- 面包屑改 项目列表 / 新建会议
- page-sub 显示项目名而非 ID 13
- 当前阶段 el-select 4 → 10 选项
- resultMap/selectFields 补 9 个漏字段 (projectId/projectName/orgName/supervision*/invitation*/schedule*/labor*)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:33:37 +08:00
郭庆泰andClaude e1252f0f52 docs(meeting-new): 加 manager/meetings/new 端到端审查报告 (315 行, 11 章)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 22:31:30 +08:00
郭庆泰 35e55403cf refactor(manager/Projects): 2 列 label "执行单位得分" → "执行单位评分"
- line 61: 执行单位得分(合规) → 执行单位评分(合规)
- line 67: 执行单位得分(支持) → 执行单位评分(支持)
仅 manager/Projects.vue, 范围最小。其他角色文件 (sponsor/executor/leader) 暂不动。
2026-08-18 22:20:21 +08:00
郭庆泰 7c9e5c373a docs(manager_projects): §6.3 加中文列名列 (DB COMMENT 优先, 加速类型不一致排查)
每行从 5 列扩到 6 列: 实体字段 / 中文列名 (DB COMMENT) / 类型 / 表字段 / 类型 / 一致?
中文名来源 (按优先级):
  1. SQL information_schema.COLUMNS.COLUMN_COMMENT (DDL COMMENT, 最权威)
  2. 前端 UI label (table header / form label)
  3. 实体 @Excel(name) (导出列头, 兜底)
好处: 一眼看出"哪个中文字段对哪个英文 DB 列", §6.3 之前发现的 projectId String vs project_id bigint / startTime String vs start_time datetime 这类 bug 一目了然。
2026-08-18 22:17:28 +08:00
郭庆泰 c3b6212478 docs(manager_projects): 更新修复记录 + 索引表 + §10 标已修 (P1/P2 5 项)
修复记录章节加 6 条 (2026-08-18):
- #7 batchScoreRows 死代码删除
- #5 4 处 console 调试删除
- #9 日期选择器 value-format 对齐 type
- #12 biz_project 加 idx_sponsor_admin_user_id
- #13 biz_project 加 idx_start_end_time 复合索引
- #14 biz_project_assign 加 uk_project_unit UNIQUE (executor 分配防重复)

§7 索引表更新:
- biz_project 7 个 (新增 idx_sponsor_admin_user_id + idx_start_end_time)
- biz_project_assign 5 个 (新增 uk_project_unit)

§10 待修复列表 5 项标 ~~删除线~~ (5/7/9/12/13/14)
2026-08-18 22:12:28 +08:00
郭庆泰 8e43960481 fix(manager/Projects): 删 4 处 console 调试 + 日期选择器 value-format 对齐 type
- 删 console.info/error 4 处 (line 299, 302, 306, 874): 原 review §10 #5 (P1)
- el-date-picker type=date + value-format YYYY-MM-DD HH:mm:ss 不匹配 (line 17, 19):
  改 value-format 为 YYYY-MM-DD, 跟 type=date 对齐; MySQL 对 datetime 列做隐式转换
  原 review §10 #9 (P1)
2026-08-18 22:06:09 +08:00
郭庆泰 f0866300ad refactor(manager/Projects): 删 batchScoreRows 死代码 (line 501)
注释说"保留兼容旧引用",但 grep 全文无任何引用, 纯死代码。
原 review 报告 §10 待修复列表 #7 (P2)。
2026-08-18 22:04:06 +08:00
郭庆泰 66068c6f57 refactor(biz/project): 修实体类型不一致 projectId String→Long + startTime/endTime String→Date
- BizProject.projectId String→Long (9 文件: domain / IBizProjectService / BizProjectServiceImpl /
  BizProjectMapper.java+xml / BizProjectController / BizExecutionIntentController /
  BizPublicityIntentController / BizPublicController). 删 SnowflakeId.injectIfEmpty
  (Long setter 不匹配反射 NoSuchMethodException, biz_project 用 AUTO_INCREMENT 安全)
- BizProject.startTime/endTime String→Date, 加 @JsonFormat yyyy-MM-dd HH:mm:ss (跟 BizMeeting 一致)
- Mapper XML 8 处 <if test='x != null and x != ""'> → <if test='x != null'> (Date 无 isEmpty)
- _self/manager_projects.md: §6.3 + §9.1 标已修, 加修复记录章节
2026-08-18 22:03:45 +08:00
郭庆泰andClaude 14968d46e5 style(sponsor/PersonDetail): 对齐 executor/PersonDetail 风格
- 加 page-card 包裹 + breadcrumb 三级 '首页 / 人员管理 / 人员详情'
- detail-card → form-card nested (跟 NewPerson 一致)
- detail-actions → form-actions
- max-width: 1000px → 1200px
- 删 :deep(.el-button) { border-radius } (skill 禁忌覆盖 el 默认主题)
- 删 :deep(.el-form-item__label) 颜色覆盖 (让 el 默认)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:44:07 +08:00
郭庆泰andClaude d2e7ec110d style(executor/people): 对齐 People.vue 风格 — 加 breadcrumb, 删 page-sub
- 用 breadcrumb (首页 / 人员管理) 替代 page-sub 副标题
- 删 .page-sub / .filter-tip 死样式
- 跟 sponsor/SponsorPeople.vue 一致

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:41:40 +08:00
郭庆泰andClaude 13e3e9e1d1 style(executor/people): 去掉批量导入模板提示文案
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:40:37 +08:00
郭庆泰andClaude 4634339bc2 feat(executor/people): 查看改为新页面 (只读, 无账号/状态字段)
- 新建 executor/PersonDetail.vue, 结构与 NewPerson.vue 一致
  (page-card + breadcrumb + el-card form-card + 两列 el-row),
  但只读 + 不显示用户名/初始密码/状态 (6 字段: 姓名/手机号/所属公司/部门/职务/角色)
- router 加 /executor/people/detail/:id → PersonDetail.vue
- People.vue: onView 改为 router.push, 删 view dialog 块 + view/viewOpen refs

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:39:58 +08:00
郭庆泰andClaude e59b512e4b fix(person): 子账号继承主账号 role_type + Login 不再硬编 leader
问题: sponsor 主账号新建的子账号 role_type 没写入,
      被 sys_user.role_type DEFAULT 'executor' 覆盖,
      导致子账号进入 executor 视角;另外 Login.vue
      autoRole/短信登录都硬编 'leader' 兜底, getInfo
      失败时静默跳 /leader/home。

修复:
- BizPersonServiceImpl.insert 读主账号 SysUser,
  把 mainUser.getRoleType() 写到新子账号
  (SysUserMapper.xml insertUser 已支持 role_type 列)
- Login.vue: 短信登录 fallbackRole 改 '',
  autoRole 不匹配返回 '', afterLogin 无 role 跳 /login
  (不再 fallback /leader/home)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:35:51 +08:00
郭庆泰 40f296b59d refactor(executor): 对齐 sponsor 人员管理模式 + 修 3 个 bug
后端:
- BizAuthController.registerExecutor step 6 同步建 biz_person (主账号自己=管理员, name=unitName, role='admin', unit_type='executor'), 让"人员管理"能看见自己 (跟 registerSponsor 同模式, 走 BizPersonMapper 直插, 绕过 SUB 子账号逻辑)
- BizPersonMapper.xml selectExecutorList 加 OR u.user_id=主账号 (主账号自己能查到), + countAdminByOrgId (校验公司唯一管理员)
- SysUserMapper.xml 手机号正则 1[3-9] → 1[0-9] (允许 10 开头测试号段, 跟 sponsor 一致)

前端 executor/NewPerson.vue 1:1 对齐 sponsor/NewPerson.vue:
- el-card form-card 包裹 + el-row :gutter=12 两列布局
- 用户名/初始密码 行 (v-if=!isEdit)
- 状态改用 el-radio-group, 值 0=正常 1=禁用
- 修了状态值反向 bug: 原 executor 正常→"1" 禁用→"0" 跟 DB/UserStatus enum 相反, 编辑时反向生效 (BizPersonServiceImpl.insert 硬编码 status='0' 掩盖了 bug)
- role 统一 el-select + admin 选项 :disabled=true (管理员只能注册时建)
- 编辑模式 el-select :disabled=true (不能改角色)
- phone 正则 /^1[0-9]\d{9}$/, userName 3-30 模式, password 6-30, department maxlength=100
- 新建成功 ElMessageBox.alert 展示子账号+密码
- 重复手机号走 warning 黄 (isDuplicateError)
- confirmCancel 取消确认
- loadMyOrg 自动带出主账号公司

前端 executor/People.vue:
- 状态列对齐 sponsor: row.status === '0' ? '正常' : '禁用' (修原 || '正常' fallback bug 导致显示原始 '0' + 颜色永远红的两个 bug)
- 批量导入 完整实装 (原 downloadTemplate/submitImport 都是 stub, 只弹提示):
  - downloadTemplate GET /business/person/executorImportTemplate + blob 下载 + 解析 Content-Disposition 文件名
  - submitImport POST /business/person/executorImport + FormData + 导入结果 dialog (行号/姓名/手机号/成功+错误信息)
  - el-upload 加 :on-change=:on-remove 自管 file, footer 改 "关闭/开始导入" 带 loading/disabled
  - 新增 onImport 先 clearFiles 再开 dialog
2026-08-18 21:32:10 +08:00
郭庆泰andClaude 6716074eee refactor(sponsor/NewPerson): 角色统一 el-select, 管理员选项禁用, 编辑模式整体置灰
之前: v-if/v-else 二选一 (role='admin' 静态 tag / 其他 el-select)
       历史主账号 role=NULL 时空白显示, UI 不一致

现在: 统一用 el-select
- :disabled=isEdit  (编辑模式整体灰, 不可改)
- 管理员 option :disabled=true 常驻但永远不可选
   (一公司一管理员只在注册时建, 不能从 UI 任命)
- 新建: 下拉只允许选监察员 (管理员 option 禁用)
- 编辑: 整个 select 灰, 显示当前 role (supervisor/admin/null 都能稳定渲染)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:09:35 +08:00
郭庆泰andClaude 1cba0d4052 refactor(person/import): 模板精简到 4 列, 所属公司+角色由后端兜底
BizPersonImportVO.java:
- @Excel 注解砍掉 orgName (所属公司) + role (角色), 字段保留兼容老模板
- 部门/职务 sort 序号重排: 3, 4
- 模板列头从 6 列精简到 4 列: 姓名/手机号/部门/职务

BizPersonController.java doImport:
- 删除 orgName 必填校验 + bizOrgMapper 字符串匹配 orgName → orgId 的旧逻辑
- 删除 p.setOrgId(orgId), 让 BizPersonServiceImpl.insert 按 mainUid + unitType
  自动反查主账号 biz_org 兜底 (service 内已有 line 56-70 兜底逻辑)
- p.setRole(row.getRole()) 改成 unitType 写死:
  sponsor → 'supervisor' (监察员), executor → 'meetingExecutor' (会议执行)
- 死代码清理: 删除 BizOrg + BizOrgMapper import + @Autowired (controller 内不再使用)

行为变化:
- 老模板 (6 列) 上传不会报错, 多出的 orgName/role 列值被忽略 (setter 保留)
- sponsor/executor 双端受益, 都不再需要 Excel 提供 orgName/role

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:09:05 +08:00
郭庆泰andClaude 25ec74114f feat(sponsor/people): 批量删除自我保护 + 批量导入 UI 用 el-upload 对齐其他页面
1. 批量删除主账号自我保护 (防误删):
   - 复选框 :selectable 排除主账号自己 (row.userId === store.user?.userId)
   - 批量删除按钮 :disabled 在包含主账号时置灰 (computed: hasSelfInSelection)
   - onBatchRemove 函数入口再校验一次 (defense in depth)

2. 批量导入 dialog 用 el-upload 对齐 manager/admin/executor:
   - 替换手写 <input type=file> + 浏览/上传 button, 改用标准 el-upload
     (:auto-upload=false :limit=1 :on-change :on-remove)
   - footer 加'开始导入'按钮 (disabled by !importFile)
   - 文件名显示 + 删除按钮 el-upload 自带, 不再手写
   - uploadFile() 改 submitImport(), 语义更准
   - onImport() 开头 clearFiles() 防止关闭再打开时残留

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 21:08:01 +08:00
郭庆泰andClaude 8aba05aa0f docs(review): sponsor/account 端到端审查报告
11 章穿透审查:
- 四跳定位 (AdminLayout → router → Account.vue → proto)
- 后端链路: SysProfileController → SysUserMapper
- DB 实测 sys_user DDL + 索引
- 与原型 sponsor-account.html 对比
- 发现 P1: 改手机号未走短信验证码 (后端 /changePhone 已实现但前端未用)
- 发现 P3: sys_user 缺 uk_user_name / idx_phonenumber

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 20:47:23 +08:00
郭庆泰andClaude 76dd4d7306 feat(sponsor/people): 主账号同步建 biz_person (admin/总负责人), 列表可见 + 操作列对本人隐藏 + 新建下拉不包含 admin
后端:
- BizAuthController.registerSponsor step 6: 为主账号同步建 biz_person
  (走 BizPersonMapper 直插, 绕过 BizPersonServiceImpl 创 SUB 子账号的逻辑;
   SnowflakeId 注入 personId; department=管理部, position=总负责人, role=admin,
   unit_type=sponsor, user_id=主账号自己)
- BizPersonMapper.java + xml 新增 countAdminByOrgId: 校验某 org 下是否已有 admin
  (注册场景下天然返回 0, 是给未来 bug 兜底, registerSponsor 暂不调用)
- BizPersonMapper.xml selectSponsorList: WHERE 加 OR u.user_id=#{sponsorOwnerUid},
  让主账号自己的 biz_person (parent_user_id=NULL) 也能被自身 list 看到

前端:
- utils/roleMap.js: PERSON_ROLE_LABEL 加 admin:'管理员'
- sponsor/SponsorPeople.vue: 角色列改用 translatePersonRole, tag type 按 role 动态
  (admin=warning, supervisor=primary); 操作列本人隐藏 禁用/恢复 + 删除
  (v-if=row.userId !== store.user?.userId, 防主账号把自己禁用/误删)
- sponsor/NewPerson.vue: 编辑模式 role=admin 显示静态 el-tag, 新建下拉仍只含 supervisor
- sponsor/PersonDetail.vue: 角色展示同步用 translatePersonRole
- auth/Login.vue + portal/Home.vue: 文案 监察员 → 管理员 (注册即管理员, 可建监察员子账号)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-18 20:46:42 +08:00
郭庆泰 50c2678ec6 refactor(executor/people): 加 executorList 兜底, SQL 硬编码 unit_type='executor' (跟 sponsor 同模式)
- mapper BizPersonMapper.xml 新增 selectExecutorList, SQL 内硬编码 unit_type + parent_user_id=当前主账号
- controller 加 GET /business/person/executorList
- service / mapper 接口同步声明 selectExecutorList
- 前端 api/business/person.js 加 listExecutorPerson
- executor/People.vue 改调 listExecutorPerson, 删 bizList + unitType 参数

效果: executor 端人员列表也走专属接口, 前端传 unitType 绕不开 SQL 兜底
2026-08-18 01:42:05 +08:00
郭庆泰 ce9de7c880 refactor(executor/overview): 整改对齐 manager/Workbench 风格
UI 风格:
- 5 个 KPI 卡 (从 3 个补到 5 个: + 已执行会议 + 未执行会议)
- 卡片改深色底 + 白字 (var(--brand-primary) 不用硬编码)
- 消息通知加"更多 →"链接 + 更多链接样式
- breadcrumb '首页' → '首页 / 工作台'
- notices 改用 listMyMessages API (从写死数据改为真接口, 跟 manager 一致)
- section-title 改 div (不写 h2, 跟 SKILL 一致; manager 自己也违规但本次顺手按 SKILL 写对)

业务逻辑:
- 删 page-title 隐藏 (display:none)
- loadStats 与 manager 完全一致 (简化掉无效的 executorList: true 参数)
2026-08-18 01:27:17 +08:00
郭庆泰 c74c238ef0 refactor(layout): executor 菜单"账号信息"移到最后一位
之前: ...人员管理 / 账号信息 / 劳务凭证
现在: ...人员管理 / 劳务凭证 / 账号信息

(其它角色菜单的账号信息位置不变)
2026-08-18 01:25:52 +08:00
郭庆泰 7573b4180e fix(account): 手机号正则 1[3-9] → 1[0-9], 允许 10 开头测试号段
3 个账号页 (manager/sponsor/executor) 同步修
2026-08-18 01:25:09 +08:00
郭庆泰 ff8b172f7e refactor(executor/account): 重写为与 manager/Accounts.vue 完全一致
原差异 (现在都消除了):
- breadcrumb: '账号信息' → '账号管理'
- 删 page-sub 副标题
- form 字段: name/phone/oldPwd/newPwd/confirmPwd → nickName/phonenumber/oldPassword/newPassword/confirmPassword
- 加 :rules + ref="formRef" (之前无校验, 只占位 ElMessage)
- 真调用 /system/user/profile (PUT) + /system/user/profile/updatePwd (之前只占位)
- onSave 用 formRef.validate + saving loading
- onMounted 调 loadProfile() (之前从 store.user 读, 没有 PUT 接口)
- account-form max-width 520 → 600
- 加 filter-tip 密码长度提示
- 加 .page-card max-width 1200px
2026-08-18 01:24:21 +08:00