Browse Source

docs: 追踪「自定义检索推广到其他菜单」,不建空 ticket

产品诉求「每个菜单都应支持自定义检索」——平台能力已就绪(user_saved_view
+ SavedViewService + /api/preference/view 按 scope 分组,crm-preference 不
校验字段),无需新建模块或空 ticket,只记追踪:
- crm-preference/CONTEXT.md 自定义视图段补「责任边界」:crm-preference 只
  存/取 filter_json,翻译成查询归业务方(字段池/操作符语义在业务方,商机侧
  例=OpportunitySavedViewFilter);新菜单接入=复用契约+自备翻译器,本模块不改
- map.md Not yet specified 加追踪条目:新菜单接入三步手册 + 建带验收 ticket
  的时机(第二个真实菜单要上时) + 不提前抽共享翻译器缝(rule of three,
  现仅商机1个样本)
master
luoweijian 2 weeks ago
parent
commit
3e99a07a0e
  1. 2
      .scratch/opportunity-module/map.md
  2. 2
      crm-preference/CONTEXT.md

2
.scratch/opportunity-module/map.md

@ -90,6 +90,8 @@
- **自定义视图实现落地(票 14 传出)** — ✅ **已全部落地**:crm-preference 侧 `user_saved_view` 表 + 契约 `list/save/delete/setDefault` + Controller `/api/preference/view` + 16 单测;商机侧 `SavedViewOperator`(六操作符)+ `OpportunitySavedViewFilter`(filter_json→wrapper,字段池白名单=票 10 `OpportunityPageParam` 可筛选列)+ `PageParam.savedViewId` + ViewQueryImpl 叠加 + 12 翻译器单测(共 144 全绿)。读默认视图 = 前端调 `/view/list` 取 isDefault 项再带 viewId 调 `/page`。spin-out(本期未做,契约已预留):**多组条件**(demo「+添加更多条件」标后续迭代;本期只 1 组、组内纯 AND,需求无 OR)/ 高级公式。排序(sortField/sortDirection)**已实现**(翻译器 orderByClause,字段池白名单同条件)。
- **自定义检索推广到其他菜单(追踪锤,非物当前票)** — 平台能力已就绪、菜单无关(`user_saved_view` + `SavedViewService` + `/api/preference/view``scope_key` 分组,crm-preference 不校验字段)。产品拍板“每个菜单都应支持这种能力”,但**不自己建空 ticket**。**新菜单接入三步**(手册,已回写 crm-preference/CONTEXT.md 责任边界段):① 约定一个稳定 `scope_key`(如 `lead.list` / `customer.list`);② 在**本菜单模块**写一个 `XxxSavedViewFilter`(filter_json→本表查询,字段池白名单 = 本菜单可筛选列,参 `OpportunitySavedViewFilter`)+ 给本菜单 PageParam 加 `savedViewId` 接线;③ 前端复用 `/api/preference/view/*`,无需改 crm-preference。**建带验收 ticket 的时机** = 有明确的第二个菜单要上时(那时验收 = 该菜单 saved-view 端到端可用)。**不提前抽共享翻译器缝**(rule of three:目前只 1 个真实样本=商机,第三个菜单出现时再抽才知道缝在哪)。
- **客户关联子表的形态** — 已钉死为 **票 13**(见下 Decisions);仅“下拉选客户”数据源 + 客户联系人是否本子表冗余仍挂 **A4 客户模块(未建)** 边界(票 11 占位)。
- **商机批量操作与统计接口** — 对称线索 G1–G5(批量领取/分配/关注、列表统计卡片)。等主表 + 四视图定稿后再切成票。
- **商机相关字典项清单**(A7-3-2-6)— ✅ **14 组已种(crm-dict `DictDataInitializer`,产品录入 20260825)**:`opp_source` / `opp_type` / `bid_form` / `result_tag` / `design_config` / `pause_reason` / `pool_reason` / `project_role` / `close_reason` / `locality_type` 项目属地 / `follow_way` 跟进方式 / `survey_seq` 勘察次数 / `apply_way` 申请方式 / `customer_role` 客户角色(分组 7→21、item 97→163,45 全绿)。⚠ **`industry_code` 行业挂起**(口径冲突待产品拍板,见 Decisions「行业字典口径」)。**仅剩 1 组缺值**:`attachment_type` 商机资料类型(票09 附件分类,产品未给值)。

2
crm-preference/CONTEXT.md

@ -13,7 +13,7 @@ _Avoid_: 表格配置、字段配置、视图设置
_Avoid_: 页面 ID、菜单 key、视图类型
**自定义视图**:
用户在某菜单保存的一条**检索**(票 14,demo 0803 `oppModule` 为准),存于 `user_saved_view(user_id, scope_key, view_id, name, filter_json, sort_field, sort_direction, is_default, seq_no)`。用户级私有、按 `scope_key` 分组,与列偏好同构。`filter_json` = 条件列表 `[{field, operator, value}, …]`(本期前端只提交 1 组,契约按列表预留复合/高级公式扩展位);**字段合法性 crm-preference 不校验**(字段池归业务方,同「字段池」约定)。同 `(user_id, scope_key)` 至多一条 `is_default=1`(图钉设的默认视图)。系统**内置视图**(如商机的 最近访问/我负责的/我参与的/我关注的)**不入本表**——内置视图口径硬编码在业务方,本表只存用户自建的视图。
用户在某菜单保存的一条**检索**(票 14,demo 0803 `oppModule` 为准),存于 `user_saved_view(user_id, scope_key, view_id, name, filter_json, sort_field, sort_direction, is_default, seq_no)`。用户级私有、按 `scope_key` 分组,与列偏好同构。`filter_json` = 条件列表 `[{field, operator, value}, …]`(本期前端只提交 1 组,契约按列表预留复合/高级公式扩展位);**字段合法性 crm-preference 不校验**(字段池归业务方,同「字段池」约定)。同 `(user_id, scope_key)` 至多一条 `is_default=1`(图钉设的默认视图)。系统**内置视图**(如商机的 最近访问/我负责的/我参与的/我关注的)**不入本表**——内置视图口径硬编码在业务方,本表只存用户自建的视图。**责任边界**:crm-preference 只负责**存/取** `filter_json`;把条件**翻译成查询**(filter_json → SQL/过滤)归业务方,因字段池/操作符语义在业务方(商机侧例 = `OpportunitySavedViewFilter`)。新菜单接入 = 直接复用本契约 + 自备一个翻译器,**crm-preference 无需改动**。
_Avoid_: 内置视图落库(内置固定在业务方,本表只存用户自建)、视图=页面路由、绑死某业务模块(按 scope 通用,加 scope 即复用)
**字段池**:

Loading…
Cancel
Save