From 3e99a07a0e0124d5ea0a5786dd39fb762a64326d Mon Sep 17 00:00:00 2001 From: luoweijian <1329394916@qq.com> Date: Tue, 25 Aug 2026 14:58:02 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=BF=BD=E8=B8=AA=E3=80=8C=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A3=80=E7=B4=A2=E6=8E=A8=E5=B9=BF=E5=88=B0?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E8=8F=9C=E5=8D=95=E3=80=8D=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=BB=BA=E7=A9=BA=20ticket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 产品诉求「每个菜单都应支持自定义检索」——平台能力已就绪(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个样本) --- .scratch/opportunity-module/map.md | 2 ++ crm-preference/CONTEXT.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.scratch/opportunity-module/map.md b/.scratch/opportunity-module/map.md index d52caae..057ff2b 100644 --- a/.scratch/opportunity-module/map.md +++ b/.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 附件分类,产品未给值)。 diff --git a/crm-preference/CONTEXT.md b/crm-preference/CONTEXT.md index e83cc0a..be3dade 100644 --- a/crm-preference/CONTEXT.md +++ b/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 即复用) **字段池**: