郭庆泰
|
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 |
|