Commit Graph
100 Commits
Author SHA1 Message Date
郭庆泰 5a0a892574 feat: 邀请函邮件发送 + 首次设密/密码为空 + 姓名单一可信源
邀请发送 (菜单暂隐藏, 待确认参数见 发送邀请-待确认参数.md):
- 后端: BizInvite / BizInviteRecipient + Controller/Service/Mapper/XML
- 邮件: InviteMailSender (spring-boot-starter-mail SMTP) + application*.yml 邮件配置
- 上传进度: UploadProgressRegistry + UploadProgressController
- 前端: InviteList / InviteNew / InviteDetail / InviteView + api/business/invite.js
- 原型: proto/html/components/invite-detail / new-invitation / send-invitation

登录/账号:
- 首次设密: /getInfo 返回 isPasswordEmpty, SysProfileController 密码为空时跳过旧密码校验, ForcePasswordDialog 强制弹窗
- 姓名单一可信源 resolveDisplayName: doctor→biz_expert.name, sponsor/executor→biz_person.name, 其余回退 nick_name
- OA compliance 门禁改为按手机号查 ecology 视图 (不再限定 manager/leader)

其它:
- OSS zip 在线查看 (列清单+取单文件, 公开只读) + SecurityConfig permitAll
- doctor 项目详情 ProjectDetail.vue
- 数据库/测试/设计文档 (md) 入库
2026-09-10 20:40:49 +08:00
郭庆泰 56615f9806 feat: OA(ecology)项目拉取 + 会议邀请函PDF/微信分享 + 参会人/执行意向增强
OA ecology:
- BizEcologyController + EcologyProjectService: 项目编号搜索/详情回填, 负责人静默建档
- ComplianceLoginService: 合规/负责人登录校验 + 视图 role 匹配
- application-prod/test.yml: ecology 只读库数据源

会议邀请函/分享:
- InvitationPdfService + WxShareService: 邀请函 PDF 生成 + 微信分享
- PdfViewer.vue (pdfjs-dist) + MeetingInvitation.vue: PDF 预览 + 邀请函页

参会人/执行意向:
- BizMeetingAttendee*: 参会人模块增强
- BizExecutionIntent*: 执行意向增强

签到/劳务/导入:
- BizSignServiceImpl + SignFill.vue: 签到劳务
- FieldMismatch/ImportMismatch: 导入校验 VO

公示/会议详情:
- PublicityDetail.vue / MeetingDetail.vue 等前端增强

配置:
- test 短信 mock + 供应商/招标接口切生产域名
2026-09-03 20:12:15 +08:00
郭庆泰 beb9799a06 feat: OA(泛微 ecology)登录身份校验 + 公示详情悬浮按钮/PDF缩放
OA 登录校验 (manager/leader 单一可信源 = ecology 合规视图 v_compliance_project_manager):
- ComplianceLoginService: 手机号登录查视图(type=1→manager/type=2→leader), 自动建号 sys_user+biz_person, 角色不匹配软删重建; 密码登录门禁 gateForPasswordLogin
- EcologyDataSourceConfig: 独立只读 JdbcTemplate(ecologyJdbcTemplate) 接泛微库, 不接入主库动态数据源
- SysLoginController: 密码登录前 complianceGate 校验 manager/leader 仍存于视图
- BizAuthController: smsLogin 改走 reconcileForLogin; 发码放行 ecology 视图内未注册手机号
- application*.yml: 新增 spring.datasource.ecology 只读连接(prod/test)
- Login.vue: 登录标题居中微调 + 供应商注册跳生产域名

公示详情 (publicity/:id):
- 右侧悬浮操作按钮从垂直居中改为主区右上(紧贴版心右缘), 中窄屏兜底贴右缘
- PDF 预览 #zoom 由 page-width 改为数值缩放(121), 放大正文占满宽度

文档:
- shouce/ 手册 md 入仓

注: oalogin/ (含 OA 管理员密码的临时笔记) 已加 .gitignore, 不入库
2026-09-01 20:45:15 +08:00
郭庆泰 a14d95288c 提交所有代码 2026-08-31 19:01:00 +08:00
郭庆泰andClaude f4d8bc1463 feat: 项目导出 + 会议跳转 + 机构软删除 + 供应商账号同步
- 项目/项目评价/报名专家 3 类导出, 勾选透传 projectIds
- 项目列表 总场次/已执行/未执行 三列点击跳对应会议列表 (executor 复用后端 role 隔离)
- 机构软删除 + 级联软删机构下账号
- 供应商开放接口账号同步

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-30 10:42:35 +08:00
郭庆泰andClaude 1876601ba7 feat: 会议阶段劳务/会务前缀投影 + 结算前未保存拦截
- 阶段投影: 待审核/审核通过/待整改/待结算 按劳务/会务前缀区分 (前后端镜像)
- 劳务材料提交门槛改为参会人员列表≥1人 (非上传文件)
- sponsor/manager 操作列「审核」「结算」提为直链
- 会议结算时间轴节点: 待结算态显示「补充凭证并结算」
- 结算前检测未保存改动, 弹「保存并结算」拦截

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-29 20:02:33 +08:00
郭庆泰andClaude e47f76478b 批量推送代码
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-29 17:52:05 +08:00
郭庆泰 36528b6e0c 批量推送代码 2026-08-26 23:14:46 +08:00
郭庆泰 a837e43b53 chore: 新增 refer 参考表格组件
- gr-table.vue: 通用 el-table 封装 (展开详情 + 事件透传)
- gr-table-simple.vue: 简化版表格
- gr-table-plus.vue: 增强版 (筛选框 + 展开详情)
2026-08-26 19:14:34 +08:00
郭庆泰 b0256ccac3 feat: 会议劳务/会务材料分轨审核 + 注册页标题 + 下拉空值修复
会议材料分轨 (material_audit_stage 单轨 → labor/service 双轨):
- biz_meeting: labor_audit_stage/labor_compliance_approved + service_audit_stage/service_compliance_approved 四列替换原单轨两列
- StageDeriver: 单轨状态机(R/N/C0/C1/A) + 角色优先级选代表轨 + 会议物理态取两轨最小进度
- MeetingAuditStageEnum / 前端 meetingStage.js 镜像: 分轨推导 + 颜色跟随角色展示阶段(避免文案与颜色错位)
- BizMeetingController/ServiceImpl/AuditLog + mapper + MeetingStageScheduler 同步分轨字段
- MeetingDetail/Meetings/doctor/executor Meetings/ManagerProjectDetail/ManagerProjectsAssign/PublicityDetail 同步双轨

其它:
- 注册页 (执行单位/专家/支持单位) 加居中页标题
- DoctorDeptSelect/DoctorTitleSelect 空字符串统一 null, 避免挂载必填项飘红
- BizOrgMapper sponsor/executor options 加 status 字段
- sponsor/NewPerson 编辑态 orgName 只读
2026-08-26 18:13:22 +08:00
郭庆泰 b5b3e3a213 feat: 会议批量审核 + 公示按发布时间倒序 + 现场照片 dialog 预览 + 重复报错精确
- 会议列表 manager 批量合规审核 (批量通过/退回, best-effort 逐条回执)
- 公示列表按 publish_time 倒序, 发布/开通写本地 publish_time (修 toISOString UTC 时区 bug)
- 签到表/前全景/后全景「查看照片」改 dialog 预览 (复用 Preview.vue)
- 手机号/用户名重复报错精确提示 (后端 fieldMap + 前端 duplicateTip)
- 医生首页欢迎语改「欢迎使用合规系统」
2026-08-26 00:41:33 +08:00
郭庆泰 ea2024d083 feat: 会议ID应用赋值 + 会议表单/详情优化 + admin工作台统计与用户管理
- meetingId 由 DB 自增改为应用赋值 10 位数字 (yyMMdd + 4 位序列, Redis 按日期计数)
- 会议开始时间不能晚于结束时间校验; 参会人表单身份证附件/角色单独一行
- 会议详情左右列比例 7:3 -> 8:2 (材料审核列收窄)
- admin/workbench 用户总数/角色类型数/各角色分布统计修复 (改用 listByRole 按 role_type 过滤)
- 新增 admin 用户管理接口 + 门户页脚 + H5 签到/上传优化
2026-08-25 23:33:14 +08:00
郭庆泰andClaude 591a43fe61 feat: 会议提交剩余时间+解冻 + 会务/劳务材料批量下载 + 多角色人员/账号模块完善
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 06:53:18 +08:00
郭庆泰 0c882ae846 feat: 本地 Java 发票 OCR + 策划方案多角色开放 + H5 相机脱敏修复
- OCR: 进程内 PaddleOCR ONNX Runtime 识别替代远程 Python 微服务
  (新增 ocr/core/service/config 引擎, 删 OcrClient/OcrConfig, PDF 文本层优先 + QR 快路径)
- 投稿: 项目设计投稿 → 项目策划方案, doctor/executor/sponsor 三角色开放
  (BizProjectPlan 按非 admin/manager 隔离, 复用 Submissions.vue, 设计文件改 OssFileUploader)
- H5: <video> 去掉 autoplay + safePlay 重试, 穿透 uni-app wrapper 找原生 video
- 脱敏: 签到表高斯模糊由横向条带改为全高竖条带 (20%~50% 宽度)
- 域名: ringdoctor.com → risingdoctor.com
2026-08-24 19:23:53 +08:00
郭庆泰andClaude 904e28710f feat: 生产部署 + 会议全链路 (执行方分配/费用结算/签到脱敏/H5相机)
- 生产 nginx 三路径: ry-vue3 /hg/, ry-h5 /camera/, API /hg-api, .env 分环境
- 签约链接/摄像头 base-url 走 yml, 不再硬编码 /hg 与 localhost
- 新增 biz_project_executor_assign (镜像 sponsor_assign) 执行方项目级分配
- 会议费用后台汇总 FeeCalcScheduler + 结算回写项目金额 + 状态流转调度
- 签到表拍照高斯模糊脱敏 extra_oss_url, 新增 PosterService/StageDeriver
- 清理 biz_support_intent 旧表 (6 Java/XML 删除)
- ry-h5 相机黑屏修复: 显式 video.play() + 动态 apiBase 上传
- 资源: simhei 字体 / logo.png / qrcode_1.png / favicon.ico

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 01:00:09 +08:00
郭庆泰 80a276e661 fix(theme): 4 个亮色 #4da2b5/#4db892/#80bdca/#80ccb1 不适合做背景色
问题: 之前 Element mix(white) 算法在 S=100% 主色 (#007A95)
上生成的中色 (#4da2b5 / #4db892) 跟主色对比度太低,
作 hover-bg / 选中态底色时白字看不清.

新算法: HSL 降饱和 + 提亮度 (色相不变, 灰度提升).
  text    = S-40 L+15  (中蓝可读, 链接用)
  light   = S-65 L+40  (灰中, disabled 浅背景)
  lighter = S-65 L+50  (灰浅, hover-bg / 选中态, **够淡字可读**)
  mix     = S-75 L+60  (近白, focus border)

主色 (#007A95):
  text    #2d9cb4  lighter #b7d6dd
  light   #95c2cc  mix     #dde8ea

次色 (#009963):
  text    #2eb887  lighter #baded1
  light   #98cdba  mix     #dfece7

Element Plus 联动:
  --el-color-primary-light-9 → var(--brand-primary-mix) (近白, 最浅)
  --el-color-success-light-9 → var(--brand-secondary-mix)

theme.js derivePalette 同步改成同算法 (运行时 setBrand 仍正确)
2026-08-22 21:31:08 +08:00
郭庆泰 746e9e01b4 fix(theme): 4 个亮色派生 #49deff/#4dffc0/#06d2ff/#0affa9 改为 Element mix() 算法
之前 HSL +35% 提亮算法生成荧光色 (例 #49deff / #4dffc0),
对政务/严肃网站完全不适用, 跟 Element Plus 默认色系也对不上.

新算法 (浅色) = Element Plus mix(white, base, N*10%):
  --brand-primary-light   = mix 50% white   (背景 / disabled)
  --brand-primary-lighter = mix 70% white   (hover-bg / 选中态)
  --brand-primary-text    = mix 30% white   (链接默认)
  --brand-primary-mix     = mix 80% white   (输入框 focus border)

新色 (全是低饱和度灰蓝/灰绿, 跟 Element 默认同源):
  PRIMARY (#007A95):
    light    #80bdca    lighter #4da2b5
    text     #b3d7df    mix     #3395aa
  SECONDARY (#009963):
    light    #80ccb1    lighter #4db892
    text     #b3e0d0    mix     #33ad82

深色 (deep/darker) 保持 HSL 算法不变 (合理, 政务场景需要深色 hover)

theme.js derivePalette 同步改成双轨: HSL 调深 + Element mix 调浅
2026-08-22 21:26:50 +08:00
郭庆泰 3c23222841 fix(theme): 修 hover 颜色不正确 - 干掉硬编码老蓝 + fallback 双重失效
核心问题 (按影响面排序):

1. Login.vue: login-btn hover 是硬编码 Tailwind blue-800 #1e40af
   跟主色 #007A95 青蓝完全不同色系, hover 突变
   - 改成 var(--brand-primary-deep) (#004858 暗青蓝)

2. 14 个页面写了 :deep(.el-button--primary:hover) { background:
   var(--brand-primary-deep, var(--brand-primary)) } — 第二参数
   fallback 让 hover 退化成主色 (不变深), 视觉上'按钮没反应'
   - 删第二参数, 直接 var(--brand-primary-deep)

3. AdminLayout: 菜单激活背景硬编码 #1890ff (Ant 老蓝),
   跟青蓝主题对比突兀
   - 改成 var(--brand-primary)

4. 17 处 .breadcrumb a:hover / .hint-link:hover / el-button.is-link:hover
   同样 fallback 双重失效问题, 删 fallback

5. 其余硬编码老蓝 (#1890ff / #409eff) 在:
   - OssFileUploader / OssImageUploader / IdCardUploader (upload hover border)
   - Login.vue (modal-btn, accent-color, user-type-item hover)
   - doctor/Account.vue (breadcrumb link, 章节左边竖线)
   - ManagerProjectsAssign.vue (合同链接)
   - PublicityDetail.vue (ann-menu hover)
   全部换成 var(--brand-primary) / var(--brand-primary-deep)

6. 修 PublicityDetail.vue 注释错误:
   原: // 深色用品牌主色 (#1890ff), ...
   正: 二维码 dark 是 #1f2937 (深灰), 不是主色

总计 24 个文件
grep '#1890ff|#409eff|#096dd9|#0050b3|#1e40af|#1d4ed8' 已 0 命中
2026-08-22 21:22:17 +08:00
郭庆泰 d9316e87d0 feat(ry-h5): logo 改为项目根 logo.png, 加 favicon
- ry-h5/static/logo.png 72x72 占位图 → 776x776 项目 logo
- ry-h5/index.html 加 <link rel='icon' type='image/png' href='/static/logo.png'>
- 代码里现无 logo 引用 (POC 只有相机页), 但文件统一品牌
2026-08-22 20:56:48 +08:00
郭庆泰 cec39554ee style(portal+login): 7 个 logo 占位符 '医' 换为 logo.png 图片
- components/PortalShell.vue (navbar + footer, 共享给 3 个注册页)
- views/portal/Home.vue (navbar + footer)
- views/portal/ArticleView.vue (navbar + footer)
- views/portal/SpecialPlanDetail.vue (navbar + footer)
- views/portal/Publicity.vue (navbar + footer)
- views/portal/PublicityDetail.vue (navbar + footer)
- views/auth/Login.vue (登录页 logo)

每个 .logo-icon / .footer-logo-icon:
  HTML: <div class='logo-icon'>医</div> → 含 <img src='/logo.png'>
  CSS:  删 background/color/font-size/font-weight (字标样式)
       改 overflow:hidden + object-fit:contain (图片容器)

全站 '医' 字符占位符清零.
2026-08-22 20:54:45 +08:00
郭庆泰 5b54e84c4d style(layout): 侧栏 logo 占位符 '医' 换成 logo.png 图片
- aside-logo 内 <div class='logo-icon'> 字符占位符 → <img src='/logo.png'>
- .logo-icon 改成 img 容器样式 (44x44, object-fit: contain)
- 删 logo-sub 'BAHIM 工作台' (与角色名重复)
- 浏览器 favicon 保持 logo.png (上一 commit)
2026-08-22 20:50:43 +08:00
郭庆泰 93133c2707 feat(favicon): 网站图标改为 logo.png
- ry-vue3/public/logo.png 从项目根 logo.png 拷入 (776x776 PNG)
- index.html head 加 <link rel='icon' type='image/png' href='/logo.png' />
- 浏览器 tab/书签/PWA 都用这个 logo

侧栏 logo 区 (AdminLayout 的 aside-logo 当前是 BAHIM 工作台 文字)
未改, 等用户确认.
2026-08-22 20:48:53 +08:00
郭庆泰 884eadcd8e feat(theme): 加 --brand-secondary 翠绿 #009963 (双品牌色系)
- theme.scss 加 7 个 --brand-secondary-* 派生色 (HSL 算法)
- 绑定 Element Plus --el-color-success* (绿=成功语义)
- theme.js derivePalette 重构成通用函数 (base, prefix), 加 setBrandSecondary / applyStoredBrands
- main.js 启动改调 applyStoredBrands, 主色+次色一起从 localStorage 恢复

主色 primary (青蓝 #007A95) / 次色 secondary (翠绿 #009963)
改 theme.scss :root 两个变量即可全局换色.
2026-08-22 20:46:28 +08:00
郭庆泰 e5fb015cd8 feat(theme): 主色从深海军蓝 #1E3A8A 改为青蓝 #007A95
改动 theme.scss :root 7 个 CSS 变量:
- --brand-primary        #1E3A8A → #007A95 (青蓝/cyan)
- --brand-primary-deep   #152a66 → #004858
- --brand-primary-darker #0d1d4d → #002129
- --brand-primary-light  #3a55a3 → #00acd2
- --brand-primary-lighter #c1cbe6 → #49deff
- --brand-primary-text   #4f6dbf → #06d2ff
- --brand-primary-mix    #8e9ad1 → #7ce7ff

派生色算法 (theme.js derivePalette):
- deep/darker: lightness -12 / -22
- light: lightness +12
- lighter: lightness +35
- text: lightness +22
- mix: lightness +45

新色 HSL: H=191° S=100% L=29% (青蓝范围)
派生色按 HSL lightness 算法重算, 跟 theme.js derivePalette() 一致.

业务代码全部用 var(--brand-primary) 变量, 无任何硬编码
(上个 commit cd01550 已清理), 换色自动全局生效.

Element Plus 联动变量 (--el-color-primary 等) 通过 main.js 同步, 也跟着换.
2026-08-22 20:40:54 +08:00
郭庆泰 cd01550d80 refactor(style): 全部硬编码 #1E3A8A 替换为 var(--brand-primary)
为支持全局换色 (theme.scss :root 改 1 行即换主色), 把所有业务代码里
硬编码主色清理掉, 改用 CSS 变量.

扫描结果 (grep -ri '#1[Ee]3[Aa]8[Aa]' src/):
- theme.scss:21 定义本身 → 保留
- theme.js:7-8 JSDoc 注释示例 → 保留
- 其它 19 处业务硬编码 → 全部替换

替换明细:
- auth/Login.vue     13 处 (login-tabs/bg/color/border/btn/links)
- manager/Workbench.vue 2 处 (stat-card bg + border, 跟上个 commit 对齐)
- sponsor/SponsorProjects.vue 1 处 (var(--brand-primary, #1E3A8A) fallback → 裸变量, SKILL 禁 fallback)
- doctor/SignContract.vue 1 处 (同上)

rgb(30,58,138) / rgba(30,58,138,X) 形式: 0 处.

效果: 改 theme.scss :root --brand-primary 一行, 全项目颜色自动跟随.
派生色 (deep/darker/light/lighter/text/mix) 已在 theme.scss 内 HEX→HSL 自动算, 不需手动改.
2026-08-22 20:36:47 +08:00
郭庆泰 976178c3f1 fix(admin/workbench): stat-card 改单色 var(--brand-primary), 跟 manager/Workbench 一致
上次 0f124de commit 用了 linear-gradient + 蓝色阴影, 跟项目其它 workbench 不一致.

按用户要求:
- 背景: linear-gradient → var(--brand-primary) 单色 (不用渐变)
- 边框: 删 → 加 1px solid var(--brand-primary) (单色, 跟 manager 同款)
- hover: translateY + box-shadow → opacity .9 + translateY(-2px) (manager 同款)
- label 颜色: rgba(255,255,255,0.75) → rgba(255,255,255,0.85) (跟 manager 一致)

现在 admin/manager 两个 workbench 的 stat-card 视觉完全一致, 都用系统主色变量.
2026-08-22 20:32:29 +08:00
郭庆泰 0f124dea61 style(admin/workbench): 上方 5 个 KPI stat-card 改为深色底白字
改动 (仅 CSS, 业务逻辑 100% 保留):
- .stat-card 背景: #fff → linear-gradient var(--brand-primary) → var(--brand-primary-deep)
- .stat-card 边框: 1px solid #f0f0f0 → 删 (深色底不需要边框)
- .stat-card 文字: inherit → #fff (白字)
- .stat-card hover: border-color 变化 → translateY(-2px) + 蓝色阴影上浮
- .stat-label 颜色: #8c8c8c → rgba(255,255,255,0.75) (白字次级)
- .stat-value 渐变文字 hack → 直接 color: #fff (去掉 -webkit-background-clip/text-fill-color)

视觉效果: 5 个 KPI 卡变深海军蓝渐变方块, 白字 + 半透明 label, 鼠标 hover 上浮 2px

不变: 模板/grid 布局/点击跳转逻辑/data load 函数 都不动
2026-08-22 20:31:41 +08:00
郭庆泰 5409b7f815 feat(RichEditor): 富文本编辑器支持 OSS 图片上传
原 customUpload: () => {} 是空函数, 工具栏点图片/粘贴图片/拖拽图片都无效.

参考 hwt-web/wang-editor4.vue 的思路, 但用项目已有的 /common/oss/sign 签名 + utils/oss.uploadToOss,
不在前端硬编码 accessKey (hwt-web 那种写法有 key 泄露风险).

新行为:
- 工具栏点 '图片' → 选本地 → uploadToO Oss → insertFn(url) 插入 OSS URL
- 粘贴图片 (Ctrl+V) → 同上
- 拖拽图片 → 同上
- 非图片文件 → ElMessage.warning '只支持图片文件'
- >5MB → ElMessage.warning '图片大小不能超过 5MB'
- 上传失败 → ElMessage.error

文件存到 OSS 'ry8080/rich-editor/' 目录.

适用场景:
- BizArticleEdit (协议管理)
- BizSpecialPlanEdit (专项计划管理)
- 其它用 <RichEditor> 的页面立即获得上传能力

业务逻辑 100% 保留: toolbarConfig excludeKeys (排除视频), placeholder, v-model 双向绑定, change emit 都不动.
2026-08-22 20:28:28 +08:00
郭庆泰 6710c459ce style(special-plan): 对齐 BizSpecialPlanEdit 到 People.vue 风格 (form 页)
改动 (仅 UI/CSS, 业务逻辑 100% 保留):
- 删 <div class="header"> 返回按钮 + 大标题 → 改用 <div class="breadcrumb">
  首页 / 网站管理 / 专项计划管理 / {{isEdit ? '编辑' : '新建'}}
- form-actions 改用 <el-form-item class="form-actions"> 包裹 (隐藏 label, 顶部
  border-top 分割线, 按钮左对齐)
- 取消按钮 @click="$router.back()" 改 router.push('/admin/special-plan')
  避免外链直接进编辑页时 back 跳出 SPA
- 删未用 import { ArrowLeft } (返回按钮已删)
- page-card 加 background/border/padding/max-width 1200px (form 页标准, 居左不居中)
- 加 .breadcrumb / .form-actions CSS (跟 MeetingNew.vue / ProjectsNew.vue 同款)

不动的:
- isEdit computed / loadDetail / save / onTypeChange handler
- 表单字段定义 / 校验逻辑
- RichEditor / OssFileUploader 用法
2026-08-22 20:26:05 +08:00
郭庆泰 e2df096f33 fix(meetings): 删 MeetingNew 死代码 import (useUserStore 实际未用, 路径错)
commit 996ac13 加了 import { useUserStore } from '@/store/modules/user'
+ const userStore = useUserStore(), 但:
- 实际 userStore 在文件里完全没被引用 (roleSegment 直接走 route.path.split('/'))
- import 路径错了: 真实路径是 @/store/user, 不是 @/store/modules/user
  (src/store/ 下只有 user.js, 没有 modules/ 子目录)

上次 commit e68476e 把 MeetingNew 挪到 views/meetings/ 后, Vite import-analysis
触发解析错误: '@/store/modules/user does the file exist?'

修法: 直接删 import + userStore 声明 (本来就没用).
roleSegment/isAdmin 仍然从 route.path 算, 不依赖 store.

为什么 996ac13 时没暴露:
- 用户没在那个 commit 后跑过 npm run dev
- e68476e 的 git mv 让 vite 重新分析 import, 才报出来
2026-08-22 20:23:46 +08:00
郭庆泰 e68476eeeb refactor(meetings): MeetingDetail + MeetingNew 挪到公共目录 views/meetings/
会议管理 3 个公共组件统一放在 views/meetings/ 下:
- Meetings.vue          (列表, 上轮 Option C 已挪)
- MeetingDetail.vue     ← 本次挪
- MeetingNew.vue        ← 本次挪

理由:
- 3 个组件都是 admin/manager 共用 (路由前缀对称指过去)
- 目录名 'meetings' 精确表达 '会议公共组件' 语义
- 避免 grep 'manager/Meeting*' 误以为是 manager 专属

router/index.js 4 个 import 路径同步更新:
- admin-meetings-detail / admin-meetings-new
- manager-meetings-detail / manager-meetings-new

git mv 保留文件历史 (rename detection), 无新增代码逻辑改动.
2026-08-22 20:22:46 +08:00
郭庆泰 996ac13994 refactor(meetings): MeetingNew admin/manager 双前缀路由 (admin 不用 /manager 路径)
把 'admin 用 manager 前缀 URL' 这个跨角色硬编码改对称.

router:
- 新增 admin-meetings-new → manager/MeetingNew.vue (公共页)

MeetingNew.vue goBack():
- new 模式: admin 跳 /admin/projects, manager 跳 /manager/projects (用 projectsBase computed)
- edit/copy 模式: admin 跳 /admin/meetings, manager 跳 /manager/meetings (用 meetingsBase computed)
- roleSegment / isAdmin 从 route.path.split('/')[1] 计算, 不依赖 userStore

meetings/Meetings.vue onEdit/onCopy:
- 引入 newRouteName computed (isAdmin ? 'admin-meetings-new' : 'manager-meetings-new')
- router.push({ name: newRouteName.value, query: {...} })

效果:
- admin 点 '新建/修改/复制' → URL 是 /admin/meetings/new, 不再跨到 /manager/meetings/new
- admin 取消保存 → 回 /admin/meetings (列表) 或 /admin/projects (新建上游)
- manager 行为不变
2026-08-22 20:21:01 +08:00
郭庆泰 62a855e562 refactor(meetings): admin/manager 会议管理合并为 1 文件双路由 (Option C)
把 admin/AdminMeetings.vue (212 行) + manager/Meetings.vue (262 行) 合并到
新位置 views/meetings/Meetings.vue (~265 行), 双路由指向同一组件.

角色感知实现 (route.path.split('/')[1] 算 roleSegment):
- 面包屑: admin 显示 '首页 / 项目管理 / 会议管理', manager 显示 '首页 / 会议管理'
- 详情跳转: admin 跳 /admin/meetings/detail/X, manager 跳 /manager/meetings/detail/X
- 修改/复制: 双角色都跳 manager-meetings-new (跨角色 URL, MeetingNew.vue 公共页)

admin 自动获得 manager 全部权限 (5 操作按钮 + 批量提交 + 备注筛选 +
详细删除确认文案), 跟 'admin 应该拥有全部权限' 的产品语义对齐.

净收益:
- 代码 -474/+265 = -209 行 (-44%)
- 真相源从 2 文件变 1 文件, 后续新增功能只改 1 处
- 物理消除 admin/manager 功能集漂移风险
2026-08-22 20:18:08 +08:00
郭庆泰 2eb2d1a43b feat(front): 项目/会议管理 admin 端补齐 + 删除按钮 + 级联 UI + 角色劳务组件
admin 会议管理:
- 新建 admin/AdminMeetings.vue (查看/删除/批量删除, 面包屑 首页/项目管理/会议管理)
- AdminLayout.vue 加 /admin/meetings 菜单
- router/index.js 加 admin-meetings + admin-meetings-detail 路由
- MeetingDetail.vue admin 删除按钮改 admin+manager 双角色可触发 (onAdminDelete 跳回按角色)

manager 会议管理:
- Meetings.vue 加批量删除 + 删除按钮 + 删除确认文案 (6 张表级联)
- MeetingDetail.vue 删除按钮 v-if 改 canDeleteMeeting = isAdmin || isManager

manager 项目管理:
- Projects.vue 加批量删除 + 删除项 + doDelete 改走 cascade (5 张项目表 + 会议链)
- ProjectsNew.vue style-alignment: page-card 居左 (max-width 1200px, 无 margin auto), form-actions 包在 el-form 内
- Projects.vue + Meetings.vue + AdminMeetings.vue 删页内冗余删除提示

store + 组件:
- store/user.js 加 isAdmin getter
- components/ProjectRoleSelect.vue 新建 (项目级角色劳务下拉, 接 roleLabor)
2026-08-22 20:16:46 +08:00
郭庆泰 0eb5da6ea8 feat(biz_project+meeting): 项目+会议软删除级联, admin/manager 双角色可删
biz_project* 5 表级联 (project/plan/assign/sponsor_assign/rating) + 会议链
biz_meeting* 6 表级联 admin-only → admin/manager 可删

DB:
- 5 ALTER TABLE 加 is_deleted TINYINT DEFAULT 0 NOT NULL (biz_project/plan/assign/sponsor_assign/rating)
- biz_meeting* 6 表已有 is_deleted 列 (上轮已 ALTER)

Domain (10 文件):
- 5 个 biz_project* 加 isDeleted 字段
- 6 个 biz_meeting* 加 isDeleted 字段
- (audit_log 列名特殊: 使用 deleted 字段存操作类型, 不冲突)

Mapper 接口 (10 文件):
- 5 个 project mapper 加 softDeleteByProjectId / softDeleteByProjectNo
- 5 个 meeting mapper 加 softDeleteByMeetingId
- BizMeetingMapper 加 selectIdListByProjectId (级联调用)

Mapper XML (10 文件):
- 所有 SELECT 加 is_deleted=0 过滤 (含 JOIN 子查询)
- 加 softDeleteByXxx UPDATE (10 处)
- BizMeetingMapper.xml 的 plan LEFT JOIN 加 proj.is_deleted=0 防悬挂

Service (3 文件):
- IBizProjectService.softDeleteCascade/Batch (含会议链调用)
- IBizMeetingService.softDeleteCascade/Batch
- BizProjectServiceImpl / BizMeetingServiceImpl @Transactional(rollbackFor=Exception.class)

Controller (2 文件):
- BizProjectController.DELETE 改 admin+manager 可删
- BizMeetingController.DELETE 改 admin+manager 可删 (放宽权限)
2026-08-22 20:16:40 +08:00
郭庆泰 da46a45682 feat(select): DoctorDeptSelect / DoctorTitleSelect 加 "其他" 逃生口 (虚拟项 + 下方 input + 自动回填识别) 2026-08-22 16:56:37 +08:00
郭庆泰 2bc2b7f36b feat(detail): 参会人 dialog 科室/职称 改用 DoctorDeptSelect / DoctorTitleSelect (与专家页对齐规范下拉) 2026-08-22 16:50:58 +08:00
郭庆泰 67fc425639 style(detail): 参会人 dialog 改 2 列布局 (760px grid 1fr 1fr) + close-on-click-modal=false 防误触关闭 2026-08-22 16:48:24 +08:00
郭庆泰 42cce867e3 style(import): Excel 模板列重命名 (姓名->医生, 手机号->联系电话, 工作单位->医院), 医生放最前 2026-08-22 16:43:48 +08:00
郭庆泰 64698fd022 fix(attendee): HttpServletResponse 改用 jakarta (Spring Boot 3 / Jakarta EE) 2026-08-22 16:39:11 +08:00
郭庆泰 0dafb47e7d feat(attendee): Excel 批量导入 (后端 /importData + /importTemplate + 5邀请差集推送, 前端 dialog-upload 套用 dialog-import SKILL) 2026-08-22 16:35:50 +08:00
郭庆泰 da7c19af6c feat(detail): 参会人表新增 增值税及附加/摘要/现场照片 3 列 + 劳务协议展示, 角色=劳务形式, 费项改名 应发金额/个税税金/实发金额 2026-08-22 16:27:54 +08:00
郭庆泰 2ae4cd3ea5 fix(detail): 参会人表撑爆 grid 修复 (left-col min-width:0 + wrap div overflow-x:auto) 2026-08-22 16:20:45 +08:00
郭庆泰 0fbe99eb1d style(detail): 网格比例改 7fr 3fr (会议信息 70%, 审核双栏 30%), 内层 1fr 1fr 各占 15% 2026-08-22 16:18:25 +08:00
郭庆泰 50bcb13861 style(detail): 移除材料管理卡片固定宽度, 跟 会议基本信息 一样宽 (跟 left-col 2fr 网格槽) 2026-08-22 16:17:07 +08:00
郭庆泰 2a4d3ae87f style(detail): 测试 材料管理 卡片固定宽度 800px, 观察表格 100% 跟随效果 2026-08-22 16:16:06 +08:00
郭庆泰 6b3e5fc9f7 style(detail): 参会人表宽度改回 width:100% 跟随 left-col 网格槽 2026-08-22 16:15:07 +08:00
郭庆泰 ae5c2a19d9 refactor(detail): 参会人表改为 style="width: 800px" 直接限宽, 移除 wrap div 2026-08-22 16:12:05 +08:00
郭庆泰 82a61963e7 style(detail): 参会人表 5 列 min-width 100→90, 减少总宽 ~50px 2026-08-22 16:10:11 +08:00
郭庆泰 6983368386 fix(detail): 参会人表外层加 overflow-x:auto, 防 13 列撑爆左侧网格 2026-08-22 16:09:15 +08:00
郭庆泰 67d1da4a71 feat(detail): 参会人表/dialog 加 银行/银行卡号码/开户行/身份证号 4 列
⚠️ 依赖 DB ALTER (需先在生产库执行加列):
  ALTER TABLE biz_meeting_attendee
    ADD COLUMN id_card VARCHAR(50) ...,
    ADD COLUMN bank_card VARCHAR(50) ...,
    ADD COLUMN bank_name VARCHAR(100) ...,
    ADD COLUMN bank_branch VARCHAR(200) ...;

表格新增 4 列 (顺序: 银行 / 银行卡号码 / 开户行 / 身份证号),
全部位于职称与劳务形式之间; dialog 表单同步加 4 字段 (身份证号/银行/银行卡号码/开户行)
emptyAttendeeForm + openAttendeeDialog(edit) 初始化逻辑同步补
2026-08-22 16:05:20 +08:00
郭庆泰 1076e660c7 style(detail): 参会人表头 姓名→医生 / 手机号→联系电话 / 工作单位→医院 2026-08-22 16:01:15 +08:00
郭庆泰 dfbc6859e4 style(detail): 参会人 table 上移到 劳务明细 + 劳务协议 上面 2026-08-22 15:57:07 +08:00
郭庆泰 61456e540e style(detail): 材料管理 tab 顺序改为 劳务/会务材料 + 劳务/会务凭证 2026-08-22 15:56:08 +08:00
郭庆泰 2cef296b1e feat(meeting): 会议详情页参会人 CRUD + BizProjectPlan audit 字段
- 后端: BizMeetingAttendee 增 list/add/update/delete 4 端点
  按手机号定位 sys_user (无则新建, 用户名=密码=phone, role_type='doctor')
  Mapper: insertWithProfile (一次写完整档案) + deleteByPrimaryKey
  Service: insertByPhoneWithProfile (重复参会人抛友好异常)
- #4 配套: BizProjectPlan.auditOpinion/auditBy/auditTime + 关联项目名
  BizProjectPlan.projectName (LEFT JOIN biz_project) 用于 #4 通知 content
- 前端 MeetingDetail.vue: 劳务材料 tab 内, 劳务明细表 file-row 下方
  直接出表 (无表题), 含姓名/手机/单位/科室/职称/劳务费/签字状态/操作
  新增/编辑 dialog 共用, 删除走 ElMessageBox.confirm 二次确认
- 触发 #5: 新参会人 POST 时也发会议邀请通知 (与 BizMeetingController.add 一致)
2026-08-22 15:53:06 +08:00
郭庆泰 86e85d02cb feat(msg): SSE 实时通知体系 (#1-#6) + dict 接口权限分层
- BizNotifyService 门面: 5 个语义方法 (expertAuditResult / planAuditResult /
  meetingInvitation / agreementAwaitingSign / projectAssignedToExecutor)
- #3 项目分配执行方: 跨调用对比旧 (sessions, amount) 差集去重
- #5 会议邀请: BizMeetingController.add 全量通知, edit 走 userIds 差集去重
- #6 协议待签: updateLaborProtocol 仅在旧 URL 空 → 新 URL 非空时推
- 前端: AdminLayout 全局 bell 角标 + 全局事件总线, doctor/Home 实时刷新,
  Messages 全部已读, Login.vue 角色统一跳首页, Toast 弹窗上移到 layout
- dict 权限分层 (读开放 / 写 admin-only): BizDictController + SysDictDataController
  避免 dropdown 403, 但写操作仍需 admin 防止误删
2026-08-22 15:53:01 +08:00
郭庆泰 b6ac5b7d41 feat(msg): SSE 实时通知体系 (Phase 1-4 + 7 部分)
后端:
- MessageSseService (emitter 注册表, 25s 心跳, pushNewMessage 仅 log 不抛)
- BizMessageSseController (独立 Controller, 避开 /{msgId} 路径抢匹配)
- BizMessageMapper.countUnread SQL 修复 (跟 limit 解耦, SSE 推真值)
- BizMessageServiceImpl.insert/markRead 成功后 pushNewMessage 触发 SSE
- BizNotifyService.expertAuditResult (#1: 审核结果通知专家本人)
- BizExpertServiceImpl.updateByPrimaryKey 比对旧 audit_status, 真变化才发通知
- PlaceholderConfig (Spring 7 严格 placeholder 兜底, ignoreUnresolvable=true)

前端:
- utils/sseClient.js (@microsoft/fetch-event-source 封装, Bearer 鉴权, 单例连接)
- 全局事件总线 onGlobal: SSE new_message 扇出到业务页面 (切路由不掉)
- AdminLayout 全局订阅 + bell 角标 (el-badge 显示 unreadCount)
- userStore.expertAuditApproved: doctor 审核状态实时跟 DB
- AdminLayout doctor menu 加 requireAuditApproved 过滤 (未通过审核隐藏 3 menu)
- doctor/Home: 待参加会议/待签协议 2 pannel 按 audit 状态显示; load() 仅审核通过才拉数据
- doctor/Home + doctor/Messages: 点列表弹详情 dialog + markMessageRead 真已读
- AdminLayout SSE 触发时: 刷新 unread + 重新拉 audit 状态 (审核通过瞬间可见)

业务规则:
- 专家注册不群发 manager (manager 群体可能 100+, 每条注册发 N 条浪费)
- 通过审核无需重新登录 (SSE 链路实时联动)
2026-08-22 08:46:26 +08:00
郭庆泰 c3eb8ed9c3 feat: OCR 服务 + 会议材料模块
ry-ocr/ (新)
  本地发票识别微服务 (PaddleOCR 3.x + FastAPI, 8801)
  - QR 优先: 扫到二维码即取开票时间/发票号/金额; 没扫到/格式不合法直接判非发票, 不跑 OCR
  - 配置 QR_FULL_OCR 控制快路径(false, 0.2s)还是全字段(true, 4.5s)
  - /recognize/invoice (multipart) + /recognize/invoice/by-path (本地路径, 白名单) + /recognize/text
  - is_invoice / from_qr / qr_raw / qr_error / error_code 字段
  - 12 字段发票抽取 (regex + 启发式, 左右主体识别)
  - 超时保护 (15s 单页 / 60s 总流程) + PaddleOCR 单例 + ThreadPoolExecutor

ry-api/ruoyi-business/
  - pom.xml: 加 hutool-http/json/core 5.8.27, lombok 1.18.30 (OcrClient @Slf4j 所需)
  - ocr/: OcrClient + InvoiceResult/Fields/Line + ZipExtractor + InvoiceOcrScheduler
  - oss/: OssUploader + OssConfMeta (OCR 识别后重传 OSS)
  - config/: OcrConfig + OcrExecutorConfig (后台线程池)
  - service/impl/InvoiceOcrService: 后台提交 OCR, ZIP 路径解压识别, 替换场景先清旧
  - 会议材料 CRUD 全套 (BizMeetingAuditLog/Executor/Invoice/Material/Supervisor):
    controller + service + mapper + domain + xml

ry-vue3/
  - MeetingDetail.vue (新建): 会议详情页 (含评分维度章节, 改只读)
  - Meetings.vue / OssFileUploader.vue / router / Login.vue: 适配新字段

ry-api/ruoyi-admin/
  - RuoYiApplication.java + application.yml: 启用 @Async 异步支持

_self/
  - manager_meetings.md / manager_meeting_detail.md: 文档
2026-08-22 00:23:22 +08:00
郭庆泰andClaude edfaf4e7f5 fix(detail): 删 Write 残留的 </content> </invoke> 标签 (Vite 解析报错)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 00:03:31 +08:00
郭庆泰andClaude 8ff87c6845 refactor(detail): 项目详情页改为只读, 移除所有增/删/编辑操作
按用户意图: 本页面 = 详情页 = 只读查看。

移除:
- 角色劳务: 行删除按钮 + + 增加角色按钮 + addRoleRow/removeRoleRowAt 函数
- 监督员: 行删除按钮 + + 增加监督员按钮 + openAddMonitor/confirmAddMonitor/removeMonitorAt + 候选人 dialog
- 已发布公告: 发布/刷新/删除按钮 + openUpload/submitAnnouncement/deleteAnnouncement + upload dialog
- 项目评价: 点击编辑 dialog + openScoreDialog/submitScore + score dialog
- 未使用的 state: scoreForm/scoreDims/totalScore/uploadForm/announceTypes/newMonitor/monitorCandidates/submitting

保留:
- 4 个区块只读展示 (项目信息 / 角色劳务 / 监督员 / 公告列表)
- 公告 Preview 组件 (查看附件)
- goBack / goEdit 导航 (供面包屑和后续编辑页跳转)
- loadProject / loadAnnouncements 数据加载

业务去向 (本任务范围外):
- 评分编辑 → /manager/projects/edit/:projectId (ProjectsNew.vue)
- 角色劳务 / 监督员编辑 → 同上
- 公告发布 → 后续需新增专门管理页

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 00:02:38 +08:00
郭庆泰andClaude 99b9807270 fix(detail): 评分 4 维度改走 /business/project/rate + manager_score 同步回写
P0 #1 修复: 评分之前写到 biz_project (错表), 4 维度 (scoreQuality/Speed/Coordination/Compliance) 实体无字段, mapper 无 <if>, Spring Boot Jackson 默认丢弃未知字段 — 全部失效。

改动:
- 后端 BizProjectController.rate: 同步聚合该项目所有 compliance 评分的 4 维度总分之平均, 写回 biz_project.manager_score (1 位小数, HALF_UP)。复用现有 selectList, 不动 mapper xml。
- 前端 ManagerProjectDetail.submitScore: 改调 POST /business/project/rate, body 用后端字段名 (qualityScore/responseScore/cooperationScore/complianceScore), raterRole='compliance' 跟原型"角色:合规"对齐。加 totalScore<4 校验。
- 附: _self/manager_projects_detail.md 11 章审查报告 (含本修复)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:59:20 +08:00
郭庆泰andClaude 25be0d5d89 style(detail): page-card max-width 1200px 居左
- 跟 ManagerProjectsAssign 一致, 详情/表单页统一 1200px 上限
- 默认 block 元素左对齐, 无需 margin: 0 auto

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:49:54 +08:00
郭庆泰andClaude c2030b1564 style(detail): 统一章节标题 class + 改红字提示为灰字 (对齐 ProjectsNew)
- 3 处 .section-title → .new-card-title (项目信息已用, 现在全页统一)
- 2 处 .hint-red → .hint-text (灰字 #909399, 跟 ProjectsNew 一致)
- 删 .section-title / .hint-red 冗余样式块
- 加 .hint-text 样式 (1:1 抄 ProjectsNew L378-380)
- 业务逻辑 0 改动

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:49:20 +08:00
郭庆泰andClaude 13c4bd4e76 fix(assign): 提交截止(天) 单条模式回填, 批量模式显示空
- loadSingleProject: 回填 assignForm.deadlineDays = Number(p.submitDeadlineDays || 30)
- resetAssignForm: 批量模式 deadlineDays = null (显示空), 单条默认 30
- loadBatchProjects: 保持不回填 (N 项目共用空值, 沿用初始状态)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:43:34 +08:00
郭庆泰andClaude d1c755971d docs: 加 _self/manager_projects_assign.md + manager_projects 修复记录
- manager_projects_assign.md: 新增 11 章端到端审查报告 (4 跳定位 + Entity 一致性 + 索引 + 原型对比 + 待修复 16 条)
- manager_projects.md: 修复记录表加 2026-08-20 P1/P2/P3 修复条目 (与上面 commit 一致)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 23:31:41 +08:00
郭庆泰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
郭庆泰 25cec1e404 docs(projects): 删除误标的 P0 #1 #2 + 相关错误标注
- §1.1 L47 删除公告: 简化 5 个 URL + is_published='0' → 3 个 URL
- §5.3 L164 开通单条: 删 "⚠️ 字段写错了" + "但实现不对" 标记
- §5.3 L165 删除公告: 简化 5 个 URL + is_published → 3 个 URL
- §9.1 L273-277: 删除 5 行死字段表 (noticeUrl/scheduleUrl/isPublished/publishTime/announcementType)
- §9.1 L283: 删除"修订标记"段落 + "后果"说明
- §9.1 L369: 删除"🔴 严重冗余"bullet
- §10 L430-431: 删除待修复 #1 + #2
2026-08-20 22:50:36 +08:00
郭庆泰 84f7aa56d2 docs(projects): managerScore 过滤 P0 修复同步 (88df386)
- §修复记录 加 2026-08-20 条目 (managerScore + commit SHA)
- §2 筛选项表:  未生效 → line 188 manager_score = ? (BigDecimal)
- §2 后跟的 ⚠️ 重要 bug 提示 →  已修 + 注明 selectSponsor/ExecutorList 故意不加
- §8.1 过滤功能差异表: 🐛 后端已生效
- §10 待修复 #3: 标记 ~~删除线~~ + 已修
2026-08-20 22:43:04 +08:00
郭庆泰 88df386e76 fix(projects): selectList 补 managerScore 过滤 (修 §10 #3 P0)
前端评价得分筛选 q.managerScore 之前透传到后端但 mapper 没读, 形同虚设。
在 selectList 加 <if test="managerScore != null">and manager_score = #{managerScore}</if>,
跟 INSERT/UPDATE 同款 BigDecimal null check 风格 (无需 != '')。
EXPLAIN 验证: 12 行数据走 PRIMARY Backward scan, 命中 1 行 manager_score=5。
2026-08-20 22:42:30 +08:00
郭庆泰 be1c973366 docs+chore(projects): 索引 EXPLAIN 分析 + 修正过时注释
- BizOrgMapper: selectSponsorOrgOptions/selectExecutorOrgOptions 注释
  写 "走 idx_org_user_type_name", EXPLAIN 实际命中 idx_org_type_status
  (优化器小数据下选小索引), 改为实测索引 + Using where 描述
- manager_projects.md §9.3: biz_project_assign 唯一约束状态标 
  (SHOW INDEX 实测有 uk_project_unit, doc 老版本误标 )
- manager_projects.md §9.5: 新增索引分析章节, 记录 8 个关键查询
  EXPLAIN 命中 + 已加/评估后未加的索引决策

DB 实际改动 (已落库, 无 .sql 文件):
- ADD INDEX idx_assign_exec_user_project (exec_user_id, project_id)
  on biz_project_assign — 服务机机构 EXISTS+IN covering 优化
- DROP 临时测试的 idx_org_type_id — 优化器未采纳, 33 行数据量不值
2026-08-20 22:39:34 +08:00
郭庆泰 2b69ef1c92 refactor(projects): 彻底删除 BizProject.execOrgName (废弃 @Deprecated 字段)
无外部引用 (前端/Mapper 已迁移完成), 直接清理避免 API 表面残留旧字段
2026-08-20 22:37:11 +08:00
郭庆泰 b4acd72084 docs(projects): 服务机构筛选改多选 el-select 同步
- §2 筛选项表: 服务机构行镜像支持单位 (el-select multiple+remote, execAdminUserIds, EXISTS+IN, executorOptions)
- §9 字段映射表: execOrgName 标 @Deprecated, 加 execAdminUserIds (查询参数)
2026-08-20 22:32:47 +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
郭庆泰 8d50450606 feat(projects): 服务机构筛选改 IN 精确查询
- BizProject: 加 List<Long> execAdminUserIds (多选 select IN 透传),
  execOrgName 标 @Deprecated (兼容老 API)
- BizProjectMapper: selectList 替换 3 列 OR LIKE (org_name/user_name/nick_name)
  → EXISTS + bpa.exec_user_id IN (精确, 跟 sponsorAdminUserIds 对称)
- BizOrgMapper: selectExecutorOrgOptions 加 LIMIT 5 (跟 sponsor 对齐)
2026-08-20 22:30:40 +08:00
郭庆泰 9d2ed60a32 docs: manager_projects.md 字段映射表同步
支持单位筛选 UI 切换为 el-select 多选, 文档同步:
- 控件: el-input → el-select (multiple+remote)
- v-model: q.sponsorOrgName → q.sponsorAdminUserIds (List<Long>)
- 后端 SQL: 旧 LIKE 块 → 新的 IN foreach 块
- 选项来源: 空 → /business/org/sponsorOptions (LIMIT 5)

未做:
- L145 (列表展示列) / L269 (派生字段) / L373 (派生字段列表) 提及 sponsorOrgName 不动 — 展示字段保留
- _self/manager_meeting_new.md (3 处) 提及 sponsorOrgName 不动 — 展示字段保留
2026-08-20 22:21:12 +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
郭庆泰 1b35161722 feat: 支持单位筛选改 IN 查询 (后端)
BizProject.sponsorOrgName 字段历史上同时承担「查询参数 + 列表展示」两个职责, 现拆开:
- 保留: sponsorOrgName (String), 列表展示, JOIN biz_org 派生
- 新增: sponsorAdminUserIds (List<Long>), 查询参数, IN 多个 user_id

对齐方案 1 设计 (与 DB 列 sponsor_admin_user_id 命名一致, 与 assignForm.sponsorAdminUserId 单数版对齐)。

改动:
- BizProject.java: 加 import java.util.List; 加 List<Long> sponsorAdminUserIds + getter/setter; 改 sponsorOrgName 注释 (不再当查询参数, 只展示)
- BizProjectMapper.xml L167-173: 替换 sponsorOrgName LIKE 块为 sponsorAdminUserIds IN 块 (foreach 展开)
- BizOrgMapper.xml L120: selectSponsorOrgOptions 末尾加 LIMIT 5 (前端多选下拉最多 5 条)

未做:
- 前端 manager/Projects.vue L6 el-input 还在 (下一 commit 切到 el-select multiple)
- 旧的 sponsorOrgName LIKE 块已不存在, 但前端 q.sponsorOrgName 字段也还没改 (prototype 兼容期)
2026-08-20 22:19:52 +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
郭庆泰 580410f70f docs(manager_meetings): 重写, 按 skill 标准 11 章走, 修复记录归附录 2026-08-18 23:31:09 +08:00