unis_crm/.workbuddy/memory/2026-09-08.md

22 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 2026-09-08 只读复检(未改代码)
- 用户要求只检查不动代码。后端已重启(运行的是当日12:10编译的最新代码IDE加载target/classes)。
- 复检结论9/3 报告的严重问题均未修复:
1. X-User-Id 伪造身份仍可复现(普通用户带 X-User-Id:19 拿到管理员 profile
2. /sys/api/admin 的 wecom-app-config(secret明文)/report-reminder-config/dashboard-analytics-config 普通用户仍可读
3. JWT 默认密钥 change-me-please-change-me-32bytes 仍在(application.yml + application-prod.yml 第53/51行)
4. 参数缺失仍返回 500仅补了 404 NoResourceFoundException 的 handler
5. CORS 仍反射任意 Origin + Allow-Credentials:true
- 新增改动9/3后工作区未提交57文件/约5.7k行ExpansionServiceImpl +566 行新增渠道↔CRM 互转(moveChannelToCrm/moveCrmToChannel结构合理有归属校验+关联迁移+事务)Opportunity OMS 反写阶段 normalizeStageValue、S5已签约同步Work 日报正文 stripCrmEditorBody前端 auth.ts/Expansion.tsx 等大改
- 单测仍 113 个 2 失败ExpansionServiceImplTest 渠道重名校验 vs 联系人必填校验顺序与9/3相同根因测试改过仍不过
- 前端 tsc --noEmit 通过
- 核心读接口全 200互转/跟进等对不存在 id 错误处理正确
- 测试账号 token 存 /tmp/crm_tokens2.env9/8新登录原9/3 token已过期/被刷新)
## 9/8 追加:商机名称查重功能只读复查(未改代码)
- 用户新增"商机名称查重"请求复查。检查期间用户仍在改代码并反复编译target 14:11→14:15→14:16 更新最终磁盘版XML selectDuplicateOpportunities 去掉了 select distinct曾有一版 `select distinct + order by coalesce(updated_at...)` 在 PG 必报 InvalidColumnReferencepsycopg2 直连 202 库实测复现DTO 重构为 OpportunityDuplicateCheckDTO.Item 内嵌类(OpportunityDuplicateItemDTO 已删)Mapper/Service/Controller 全部配套。
- 功能形态Controller /api/opportunities/duplicate-check(name, excludeId?, excludeStageCodes?) → Service 全表同名精确匹配(去空格+upper归档剔除excludeId/排除阶段支持) → 前端提交时才查,命中弹窗"仍然新增"可继续(软提示),编辑不查重。
- 实证(运行实例):单值 excludeStageCodes=L 正常;**excludeStageCodes 传≥2 个值(或逗号分隔) 接口 500**overview 同病),前端 URLSearchParams 会逐个 append → 当前字典只有 1 个丢单阶段(L-已丢单) 所以线上不触发;字典一旦有 ≥2 个丢单/放弃阶段即致查重 500 且前端 catch 吞错放行(静默失效)。dashboard cardKeys 多值 200 排除 Spring 绑定问题 → 疑在商机 SQL/MyBatis foreach 路径,未拿到堆栈(无落盘日志)。
- 其余发现:查重 SQL 无 userId/可见性过滤(对照列表/详情均带 visibility)→ 全库同名探测+返回他人商机明细(越权读取/泄露,中高);后端 create/update 无唯一校验、表无唯一约束,"仍然新增"按钮无 submitting 防抖,双击可并发建两条同名(2233 即在测试中被创建);编辑可改名但不查重且 excludeId 参数前端从不传(功能未闭环);查重谓词函数包裹列无索引(量级小暂可);规范化只去空格+ASCII大写全角字符/NBSP 可绕过。
- 环境疑点:运行实例数据(id 2228/2229/2230/2231/2233 等)与 application.yml 指向的 192.168.124.202/unis_crm_dev 不一致(该库实为 2228/2229/2232) → IDE 运行配置数据源被覆盖(profile/env)测试库≠配置文件库发版前需核对。psycopg2-binary 已装入 ~/.workbuddy/binaries/python/envs/default202 库 postgres/unis@123 只读排查用)