Commit Graph
90 Commits
Author SHA1 Message Date
郭庆泰andClaude 79d7849a27 feat(projects-assign): P1+P2+P3 修复 (含服务端超额校验)
P1:
- 截止天数 max=100 + min=1 (前端拦超界输入)
- 合同文件区实装 (support/execute_contract_url 走 Preview.vue, 单条模式显示)

P2:
- 可用金额公式实时显示 (总金额×(1-管理费/总金额)-累计劳务-累计会务)
- 服务端二次校验: BizProjectAssignServiceImpl.validateSum 防前端绕过

P3:
- 命名统一: 支持方→支持单位 / 执行方→执行单位
- 行内删除按钮: 仅剩1 行时禁用第一个
- loading 态: el-descriptions + 批量 info-bar 加 v-loading
- 批量模式加载失败提示: failed 数组 + ElMessageBox.alert

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:31:37 +08:00
郭庆泰andClaude bf1b4a3010 fix(projects-assign): el-descriptions v-if 条件改为仅 !batchMode
原 v-if="!batchMode && currentProject" 会因为 currentProject.value 异步未赋值或 ref unwrap 时机问题, 导致 el-descriptions 整块不渲染; 而 info-bar 用可选链 + || '-' 不受影响。

修复:
- v-if 简化为 v-if="!batchMode"
- 6 个字段访问统一用 currentProject?.xx || '-' (兜底)
- 这样单条模式一定渲染 el-descriptions 框架, 数据未加载完时显示 -

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:11:55 +08:00
郭庆泰andClaude 5e688f17b1 feat(projects-assign): 上半部分展示项目核心属性 (单条模式)
6 字段 3 列 el-descriptions 只读展示:
  - 项目编号 / 项目名称 / 项目形式
  - 总场次 / 总金额 / 管理费及税金
批量模式不展示 (各项目字段独立, 不适合合并展示)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:06:30 +08:00
郭庆泰andClaude 7f4c66e147 style(projects-assign): 限宽 1200px 改为靠左 (去掉 margin auto)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:04:51 +08:00
郭庆泰andClaude e3289a3bfc style(projects-assign): page-card 限宽 1200px 居中
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:04:37 +08:00
郭庆泰andClaude 3240590f40 refactor(projects): assign + assign-batch 合并为单路由, 子页面 v-if 区分
- router 删 /assign-batch 路由, 仅保留 /assign (单条/批量都走)
- Projects.vue openAssign() 2 个 push 路径统一为 /manager/projects/assign
- 子页面面包屑加 v-if 批量模式 tag (橙色 badge 标识)
- 单/批模式区分完全靠 query.projectId vs query.projectIds + 子页面内 v-if/v-else 区块 (info-bar / 实时校验栏)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:03:43 +08:00
郭庆泰andClaude 36b62a26b9 refactor(projects): 项目分配 dialog 拆为独立子页面
- 新增 ManagerProjectsAssign.vue (单条/批量共用, 通过 route.query.projectId/projectIds 区分)
- router 加 2 个路由 /manager/projects/assign 和 /assign-batch
- Projects.vue 移除项目分配 dialog (template + 9 个 state/computed/function)
- Projects.vue 两个入口 (toolbar 项目分配 + 行内项目分配) 改为 router.push
- 顶部筛选区的 searchSponsorOrgsForFilter / searchExecutorOrgsForFilter 保留 (跟子页面解耦)
- 功能 1:1 不变: 支持方 / 实时校验 / 执行方分配 / 总场次超量校验 / 提交截止天数

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:02:08 +08:00
郭庆泰 e462eeaa09 feat(projects): 服务机构筛选改多选 remote el-select (前端)
- 服务机构 el-input → 多选 remote el-select (跟 sponsor 镜像)
- q.execOrgName → q.execAdminUserIds (List<Long>)
- 新增 executorOrgOptions / execSearching / _executorFilterTimer
- 新增 searchExecutorOrgsForFilter (200ms debounce + 已选 userId 重拉回保证 label)
2026-08-20 22:31:52 +08:00
郭庆泰 c85370d925 feat: 支持单位筛选改 el-select 多选 (前端)
manager/Projects.vue 顶部筛选区的「支持单位」从 el-input 升级为 el-select multiple + 远程搜索。

改动:
- L6: el-input → el-select (multiple + filterable + remote + clearable + collapse-tags + collapse-tags-tooltip)
  - v-model: q.sponsorOrgName (string) → q.sponsorAdminUserIds (number[])
  - remote-method: searchSponsorOrgsForFilter (新增)
  - loading: sponsorSearching (新增)
  - width: 260px (比输入框宽, 容纳标签)
- L291: q ref 字段重命名 + 改类型
- L341: reset() 同步
- 新增: sponsorSearching ref (loading 指示)
- 新增: _supporterFilterTimer (filter 防抖, 与 assignForm 的 _supporterTimer 分离)
- 新增: searchSponsorOrgsForFilter(query) — 复用 listSponsorOrgs + sponsorOrgOptions
  - 200ms debounce
  - 已选项不在结果里时按 userId 单独拉回 (multi-select 必须保证每个 tag 都有 label)

未做 / 后续:
- 执行方 (execOrgName) 同样可改多选, 沿用本次模式即可, 暂不动
- q.sponsorOrgName 字段已从源消失, 注释提到「sponsorOrgName」的 _self/manager_projects.md 待同步 (下一 commit)
2026-08-20 22:20:53 +08:00
郭庆泰 44a020da68 feat: 整体废弃 leader 业务角色
leader 角色 (项目负责人) 业务上已不再使用, 整体下线。仅保留 sys_dept.leader 字段 (部门负责人, RuoYi 标准字段, 与角色无关)。

前端清理 (15 文件):
- 路由: 删除 /leader 块 + 4 子路由 (router L56-61)
- 菜单: 删除 AdminLayout 中 leader 菜单 (5 行)
- 视图: 删除整个 views/leader/ 目录 (Home/Projects/Meetings/Account.vue 共 ~32KB)
- Login.vue: 删默认 role='leader', 删 leader 角色选项, 删 autoRole 的 leader 分支, 删 roleHome 的 leader 项
- PortalShell.vue + 5 个 portal/* (Home/Publicity/ArticleView/PublicityDetail/SpecialPlanDetail): admin fallback '/leader/home' → '/admin/workbench', 删 leader 项, 同步更新 admin 入口 (/leader/home → /admin/workbench)
- 5 处 ROLE_LABEL 字典删 leader: '项目负责人' (AdminLayout/Account/Roles/Users/Workbench)
- Roles.vue 注释同步

后端清理 (7 文件):
- BizDashboardController: 删除 /leader dashboard 端点 (整个方法)
- BizPersonController: BUSINESS_MAIN_ROLES 删 leader
- BizExecutorController/BizProjectPlanController/ISysUserService/SysUserExtendVo/SysUser: 注释同步删 leader

测试:
- test_20rounds.py: 删 leader 路由断言 + view_map + role_home + role_view 共 5 处

未做 / 后续:
- DB: sys_user.role_type='leader' 现存账号是测试账号, 用户确认可忽略, 后续手动清理
- 文档: proto/html/leader.html 等原型文件保留 (历史)
- _self/*.md 笔记提及 leader 不动 (笔记)
2026-08-20 22:02:24 +08:00
郭庆泰 af1ee0a5f7 style: /admin/users 角色/状态下拉宽度 140px
之前两个 select 没有显式 width, 跟着 el-select 默认走, 视觉上比旁边的输入框窄, 看着不平衡。

参考项目惯例 (SponsorOrgs/ExecutorOrs/BizSpecialPlanAdmin 等) 统一用 140px。
2026-08-20 21:47:50 +08:00
郭庆泰 7ad6b3ddbe feat: /admin/users 新增删除按钮
admin 用户管理此前只有编辑/停用, 没有删除入口 (但后端 DELETE /system/user/{userIds} 一直存在, @PreAuthorize('system:user:remove'))。

改动:
- 操作列新增「删除」按钮 (danger, link 风格, 与编辑/停用风格一致)
- 操作列宽度 180 → 240 容纳 3 个按钮
- 删除自己时禁用 (前端 UX 防护, 后端亦会 reject: ArrayUtils.contains(userIds, getUserId()))
- 二次确认框: 提示用户名/姓名 + 「删除后无法恢复, 关联数据将受影响」, type='error', 红色「确认删除」按钮
- 后端: DELETE /system/user/{userId} (RuoYi 标准 /{userIds} 路径, 单 ID 即可)

权限: admin 角色默认拥有 system:user:remove (RuoYi 默认 admin 配), 验证通过后即生效。
2026-08-20 21:46:47 +08:00
郭庆泰 8c9fe1cd04 feat: 删除 admin 会议全览菜单 + 死页面 admin/Meetings.vue
admin 账号不关注会议, 移除 admin 视角的会议入口。

清理:
- router L29: 删除 admin-meetings 路由
- AdminLayout L78: 删除「会议全览」菜单项
- 删除 ry-vue3/src/views/admin/Meetings.vue (~95 行死页面, 同 admin/Projects.vue 一样是早期未完成桩)

Calendar icon 仍由 leader/manager/doctor/executor/sponsor 角色使用, 保留 import。
2026-08-20 21:43:07 +08:00
郭庆泰 06c0a0e523 feat: admin/Projects.vue 桩合并到 manager/Projects.vue
admin 的 Projects.vue 原本是未完成桩 (91 行, 5 列只读, 无操作), 实质上是 manager 的 Projects.vue (874 行全功能) 的早期开始但没收尾。

合并方案 (最小动刀):
- router L28: admin-projects 组件由 @/views/admin/Projects.vue 改为 @/views/manager/Projects.vue
  注意: admin 路由 meta.title 由 '项目全览' 一并改为 '项目管理', 与 manager 文案统一
- AdminLayout L77: 菜单标题 '项目全览' → '项目管理' (与 router 同步)
- 删除 ry-vue3/src/views/admin/Projects.vue

admin 角色登录后看到的项目页 = manager 的全功能页 (新建/编辑/分配/评分/批量/导出/结题/开通/删除公告), 一步到位, 后续不用再分叉。

未做 / 后续:
- admin 角色缺 /projects/new /projects/edit/:id /projects/detail/:id 路由, 想新建/编辑/查看会 404 (当前 manager 专属)
- 后端权限校验 (例如 /business/project/rate) 是否对 admin 开放待确认
2026-08-20 21:41:18 +08:00
郭庆泰 31588f259b chore: 删除死页面 admin/manager Orgs.vue (公司管理)
两个 Orgs.vue 是早期未按 orgType 拆分前的合集视图, 已被 sponsor-orgs + executor-orgs 替代。无菜单入口, 只能通过 URL 直接访问, 功能冗余。

清理:
- 删 admin/Orgs.vue + manager/Orgs.vue
- 删 router admin-orgs + manager-orgs 两条路由
- 共 -4 处, 0 引用风险
2026-08-20 21:10:42 +08:00
郭庆泰 1e86865a40 feat: 合并 admin/manager 重复页 + 公示意向 + 劳务签署
页合并 (admin/manager 共用, route.path 角色感知):
- expert: Experts.vue + ExpertNew.vue (list/new/edit/view 一套)
- sponsor-orgs: SponsorOrgs.vue
- sponsor-people: SponsorPeople.vue + SponsorPersonNew.vue + SponsorPersonDetail.vue
- executor-orgs: ExecutorOrgs.vue
- executor-people: ExecutorPeople.vue + ExecutorPersonNew.vue + ExecutorPersonDetail.vue
- 给 SponsorPeople / ExecutorPeople op 列补上 查看/编辑 按钮 (潜在 bug 修复)
- 详情弹窗统一用 el-descriptions 风格 (替代 admin 旧版 ElMessageBox.alert)

后端:
- BizSignController + BizSignServiceImpl + PdfService (劳务签署 PDF 流程)
- BizPublicityIntentController (公示意向: 支持/执行)
- BizPublicitySupportIntent / BizPublicityExecutionIntent ExportVo
- BizMeetingAttendee 字段合并 (bank_region 替代 bankProvince/bankCity)
- BizExpert 字段合并 (id_card_attachments CSV, bank_region)
- Excel 导入模板精简 (开户行 1 列)

前端:
- doctor/SignFill + SignContract + SignSuccess (劳务签署 3 页流程)
- ImportResultDialog 通用组件
- IdCardUploader 重构 (单 v-model:idCardAttachments, CSV 格式)
- AreaCascader 调整
- Login.vue + AdminLayout.vue + PortalShell.vue + Home.vue 适配

DB: 字段合并 (id_card_front/back → id_card_attachments, bank_province/city → bank_region)
2026-08-20 21:02:56 +08:00
郭庆泰andClaude 3198c408b7 feat: 劳务协议编辑改独立页 + 去 el-card 圆角框
- 新增 LaborProtocolEdit.vue (独立页, 新建/编辑复用, 跟 ExpertNew.vue 风格一致)
- 加路由 /admin/labor-protocol/new 和 /admin/labor-protocol/edit/:id
- LaborProtocol.vue 删 el-dialog + 改为 router.push 跳转
- 新增 .form-card.nested { border: none; box-shadow: none; } 去 el-card 圆角框
- 新增 _self/admin_labor_protocol.md 审查报告

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-19 21:17:56 +08:00
郭庆泰andClaude e496f34393 feat: 多处页面改造 + 新增劳务协议模板配置
主要改动:
- biz_meeting_attendee 中间表 + doctor/expert 角色数据隔离
- biz_meeting_attendee 加 handsign/labor_protocol 字段 (劳务协议改造)
- biz_labor_protocol_template 配置表 + admin 页面 (从 HeguiConstants 迁移)
- biz_expert.expertId 改 Long + IdGenerator 生成 (去自增)
- Login.vue / PublicityDetail.vue / Home.vue 等多处 bug 修复 + UI 改进
- 新增 page-tech-review 报告 3 篇 (_self/*.md)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-19 21:06:49 +08:00
郭庆泰andClaude ec4a8aa8f0 feat: org disable 整改 + biz_meeting 补字段 + 表格 0/1 显示标准化
1. backend: 禁用主账号 dual-write + 子账号登录校验主账号状态

   - BizOrgServiceImpl.toggleStatus: 同步 biz_org.status 与 sys_user.status

   - BizOrgController.toggleStatus: 严格校验 '0'/'1'

   - BizAuthController.smsLogin 4.5: 子账号校验主账号状态拦截

2. fix: BizMeeting 补 9 个字段 getters/setters

   - projectId / projectName / orgName / supervisionOpinion / supervisionBy

   - supervisionTime / invitationUrl / scheduleUrl / laborSigned

   - 解决 Meetings.vue 修改/复制 projectId 为空的 bug

3. frontend: 0/1 status 标准化显示

   - 10 个 Orgs/People 表格 el-tag 由 raw 0/1 改为 正常/禁用

   - 4 个 People 页面修复 row.status || '正常' 在 '0' 时不

     回退的 bug (字符串 '0' 是 truthy)

   - 筛选下拉 / 编辑表单 / onToggleStatus label 全部对齐 0/1 语义

   - DB 迁移: 10 行脏数据 (7 正常/合作中 → 0, 3 禁用 → 1)

   - 备份表 biz_org_backup_20260819

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-19 00:27:15 +08:00
郭庆泰 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
郭庆泰 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
郭庆泰 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
郭庆泰 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
郭庆泰 35e55403cf refactor(manager/Projects): 2 列 label "执行单位得分" → "执行单位评分"
- line 61: 执行单位得分(合规) → 执行单位评分(合规)
- line 67: 执行单位得分(支持) → 执行单位评分(支持)
仅 manager/Projects.vue, 范围最小。其他角色文件 (sponsor/executor/leader) 暂不动。
2026-08-18 22:20:21 +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
郭庆泰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