luoweijian
|
319539282b
|
feat(opportunity): 票09 步5 行业回显改查 industry 分组一级 code (Q7)
- fillDictNames industry_code 分组(从不存在) → industry 两级树分组; 商机存/查一级 code
- 测试 mock industry_code/it → industry/gov(政府机关), 断言回显政府机关
- crm-dict/lead/opportunity 全回归绿 (dict 51 / lead 116 / opportunity 152)
|
2 weeks ago |
luoweijian
|
8ddc54143c
|
feat(rule): 票15 全局默认阶段模板兜底 seed(StageTemplateInitializer)
植入一条全公司通用发布中默认阶段模板作转商机阶段落位兜底:
客户圈定→关系摸排→资料采集→方案卡→已转项目(引用 opp_stage 字典 01-05),
末节点已转项目固定(is_fixed=1,票06契约)。对称方案卡 SchemeFieldDefInitializer
兜底范式,幂等按 code 判存(含已停用不复活)。零 A4/零字典改动。crm-rule 131 全绿。
|
2 weeks ago |
luoweijian
|
68b62e6e33
|
feat(dict): 票09 步4 industry 重种两级树 60 项 + 种子对内置项权威(剪除旧8)
- ItemSeed 加 parentCode (兼容旧6参构造); upsertItem 按 parentCode 同组解析 parentId (一级先入库故可查到)
- run 增 pruneStaleBuiltinItems: 种子对 builtin 项权威, 不在种子的旧内置项连 ref_count 一并剪除; 用户项(builtin=false)绝不触碰 (US-41)
- industry 8旧扁平项(manufacturing/it/...) → 全系统通用两级树 9一级+51二级 (产品 20260825 全树)
- 测试: 首装/幂等 168→220, 用户跳过 130→182; 加 industry 树结构断言(9一级/51二级); removedFromSeed 语义翻转为剪除 + 新增用户项不剪除测试; 51 全绿
|
2 weeks ago |
luoweijian
|
08d95df19a
|
feat(dict): 票09 步3 DictQueryService 加 listTree/listChildren 树形读
- listTree(groupCode): 复用扁平启用列表内存组两级树, 一级为根带 children(仅启用子项), 不新建缓存key (Q4)
- listChildren(groupCode, parentCode): 取一级项直接启用子项, 父不存在返空
- DictItemDTO 加 children (仅 listTree 填充); getItem/listEnabledItems 扁平接口不变, 现存消费方零改动
- 测试助手 newChildItem; 新增2测试 listTree_twoLevel/listChildren_byParentCode; 50 全绿 (+2)
|
2 weeks ago |
luoweijian
|
94effd1ce5
|
feat(dict): 票09 步2 字典项两级树父子校验+删除拦截+子项随父停用
- saveItem 父项校验 (Q2): parentId 非空须同组+父为一级(parentId=null)+禁自引用, 父不存在63012/跨组或超两级63001
- doDeleteItem 拦截 (Q3-b): 删一级项若有存活子项则拒 (对齐删分组需组内无项)
- enrich effectiveSelectable 回溯父状态 (Q3-a): 二级项父停用则不可选, 批量取父状态无N+1
- 新增3测试: 父子校验/删除拦截/子随父停用; 48 全绿 (+3)
|
2 weeks ago |
luoweijian
|
d0856e18a0
|
feat(dict): 票09 步1 DictItem 加 parent_id 两级树字段
- DictItem + DictItemDTO 加 parentId (nullable, 顶层=null, 二级指向同组一级)
- H2 测试 schema dict_item 加 parent_id 列
- grill 拍板结论写入票 Answer 并 resolved (Q1两级封顶/Q2父子约束/Q3停用连带+删除拦截/Q4 getItem不变+listTree/Q5无存量直接覆盖/Q6客户到二级商机到一级/Q7商机存一级)
- 45 全绿 (纯加字段, 无行为变更)
|
2 weeks ago |
luoweijian
|
610081c4e2
|
docs(map): 省市地区 TODO 划掉,实为已修的契约丢字段 bug
|
2 weeks ago |
luoweijian
|
e4e4cc2347
|
fix(opportunity): 转商机契约补省市两级地区,修丢字段脏数据
根因:转商机命令 CreateOpportunityCmd 只带单个 regionCode,而源头线索与
目的地商机主表都存 provinceCode+cityCode 两级(均 not null)。命令丢了一
级信息,商机侧被迫两列同填一个 code → 省份列存市/区 code,列表区划回显错。
这是命令契约丢信息,非缺拆分算法(两级值源头本就都有)。
修(补契约字段,非拆分):
- CreateOpportunityCmd:regionCode → provinceCode + cityCode
- ConvertOpportunityParam:同拆两字段(转商机弹窗地区选择器本就省市两级)
- LeadServiceImpl:必填校验拆两字段 + 组装 cmd 透传 param 的省/市
- OpportunityCreationPortImpl:分别 set 两列,删同填占位与「省市拆分待专票」TODO
- 单测:断言省/市两级分别落库(110000/110100);既有 LeadServiceImplTest 同步拆
mvn -pl crm-opportunity -am test 152 全绿 + crm-lead 116 全绿。
|
2 weeks ago |
luoweijian
|
33efce85f9
|
docs(dict): 立票 09 字典项两级树形能力 (DictItem 加 parent_id)
- 行业改全系统通用两级树 (产品 20260825), 商机选一级, 需扩 crm-dict 模型
- 票列 7 个待 grill 不变式: 层级上限/父子约束/停用删除级联/树形查询API/存量安全/客户侧选几级/商机落库形态
- 附产品给定行业全树 (9 一级 + 全二级) 待拍板后种
- opportunity map.md 同步: industry 挂起改为已立票
|
2 weeks ago |
luoweijian
|
042401c57b
|
feat(opportunity): 票11/12/13 线索转商机新建端口实现 + ADR-0029 技术债
实现 crm-lead 的 outbound port OpportunityCreationPort(此前定义未实现,
根因是 crm-opportunity 未依赖 crm-lead):
- OpportunityCreationPortImpl(同库同事务,ADR-0020):
· 票12 source_lead_id 唯一性预检(应用层友好报错 + DB uk 并发最终防线,
DuplicateKeyException 转译为 OpportunityCreationException)
· 票11 建商机主表:初始推进中(2) + 落归属/来源快照 + claimTime
· 票13 customerId 非空 → 建 is_primary_intended=1 主要意向客户子表 +
刷主表冗余 primary_customer_id/name(走法甲:customerId 可空则跳过,
不倒退现有自由文本转商机)
- 5 单测:唯一性命中/带客户建子表刷冗余/无客户跳过/初始态快照/并发uk转译
- crm-opportunity/pom.xml 依赖 crm-lead
- ADR-0029 记技术债:下游反向依赖上游,埋循环依赖雷(crm-lead 将来读商机即死循环),
当前同库单体阶段可接受,触发条件出现时改抽共享 port 契约模块并 supersede
省市 TODO:cmd 单 regionCode → 主表 province/city 两列 not null,暂同填占位,
待省市拆分专票。mvn -pl crm-opportunity -am test 152 全绿。
|
2 weeks ago |
luoweijian
|
cd7dadec3a
|
feat(dict): 种 attachment_type 商机资料类型 (产品录入 20260825)
- attachment_type 5 项: 现场资料/涉及清单图纸/客户需求资料/招投标相关资料/其他 (票09 附件分类)
- 分组 21→22, item 163→168; 种子测试断言同步, 全绿
行业树形仍挂起: 路② (DictItem 加 parent_id 建两级树) = crm-dict 基础模型扩展, 待立 spec 票 + grill 拍板不变式后单独 implement
|
2 weeks ago |
luoweijian
|
0e4449d75b
|
feat(lead): 票11 转商机契约加 customerId(可空占位,待A4收紧必填)
票11 步骤1-2 契约变更(走法甲:customerId 暂可空,不倒退现有自由文本转商机):
- CreateOpportunityCmd 新增 customerId(Long,暂可空);intendedCustomer 降为
客户名快照,与 customerId 并存(引用+快照,同票13走法)
- ConvertOpportunityParam 新增 customerId(前端下拉选客户得到;A4 下拉未就绪
前前端传 null)
- LeadServiceImpl 组装 cmd 时透传 param.getCustomerId()
A4 客户下拉就绪后把 customerId 收紧为必填(终态契约,一处校验)。
mvn -pl crm-lead -am test 116 全绿。
|
2 weeks ago |
luoweijian
|
3e99a07a0e
|
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个样本)
|
2 weeks ago |
luoweijian
|
1e453a1b92
|
docs(map): 票14 spin-out 措辞纠偏 + 排序标已实现
- spin-out 去掉误导性 AND/OR:本期只 1 组条件、组内纯 AND,需求无 OR;
真正 spin-out = 多组条件(demo「+添加更多条件」后续迭代)+ 高级公式
- sortField 排序从 spin-out 移出,标 ✅ 已实现(底稿定义2漏项已补)
|
2 weeks ago |
luoweijian
|
911511d8f5
|
feat(opportunity): 票14 自定义视图排序接线(补底稿定义2漏项)
底稿 issues/14 定义2 把「排序字段+方向」列为自定义视图组成部分,实体/DTO
已存 sortField/sortDirection,但上一版查询未接排序(列表恒按 createTime)。补齐:
- OpportunitySavedViewFilter.orderByClause(field,direction):字段走同一字段池
白名单→主表列名,方向只认 asc/desc(大小写无关,其余/空→DESC);字段不在池/空→null
- ViewQueryImpl.applySavedView 返回排序片段,pageOpportunities 有则
wrapper.last(ORDER BY ...) 替代默认 createTime 倒序,无则回落默认;
RECENT 路径为时间序不接排序(时间序优先)
- 移除不再直接引用的 SavedView import
- 补 3 排序单测(asc/desc默认/未知字段回落)
mvn -pl crm-opportunity -am test 147 全绿。
|
2 weeks ago |
luoweijian
|
8c44433ce4
|
docs(opportunity): 字典清单更新 14 组已种, 仅剩 attachment_type 缺值 + 行业挂起
|
2 weeks ago |
luoweijian
|
e083071da6
|
feat(dict): 再种 5 个商机子表字典分组 (产品录入 20260825)
新增分组 (契约 code 对齐实体字段):
- locality_type 项目属地 (本地项目/异地项目, 主表 Opportunity.localityType 必填)
- follow_way 跟进方式 (5 项, OpportunityFollow.followWay)
- survey_seq 勘察次数 (第一/二/三次+三次以上封顶, OpportunitySiteSurvey.surveySeq)
- apply_way 申请方式 (工单申请/线下申请, OpportunitySiteSurvey.applyWay)
- customer_role 客户角色 (6 项, OpportunityCustomer.customerRole)
分组 16→21, item 144→163 (+19); 种子测试断言同步, 45 全绿
仍缺: attachment_type 商机资料类型 (未给值); industry_code 挂起待产品
|
2 weeks ago |
luoweijian
|
a0a87bcffc
|
docs(map): 票14 收尾,商机侧自定义视图接线完成,标 ✅ 已落
进度表 票14 → ✅ 已落(内置六视图硬编码 + crm-preference 自定义视图平台
能力 + 商机侧 filter_json→查询翻译);Not yet specified 段票14传出标全部
落地,剩 spin-out(多组条件复合/高级公式/sortField 入库级排序,契约已预留)。
|
2 weeks ago |
luoweijian
|
3e55fa34be
|
feat(opportunity): 票14 商机侧自定义视图接线(filter_json→查询过滤)
销售机会工作区消费 crm-preference 自定义视图,收尾票 14:
- SavedViewOperator 枚举:六操作符 eq/ne/contains/notContains/isEmpty/
isNotEmpty(demo 0803 customMatches),未知 code → null
- OpportunitySavedViewFilter:把 SavedViewCondition 列表翻译成
LambdaQueryWrapper<Opportunity> 片段;字段池白名单=票10可筛选列
(字段→主表列名映射),未知字段/操作符/空值静默跳过,杜绝列名注入;
多条件 AND 叠加(本期 demo 1 组,契约按列表预留复合)
- OpportunityPageParam 新增 savedViewId;ViewQueryImpl 注入
SavedViewService+翻译器,savedViewId 非空时读当前用户 opportunity.sales
scope 该视图条件,翻译后 AND 叠在 viewType 数据集之上(含 RECENT 路径)
进入工作区读默认视图 = 前端调 /api/preference/view/list 取 isDefault 项,
再带其 viewId 调 /page(无需商机侧新端点)。mvn -pl crm-opportunity -am test
144 全绿(原 132 + 12 翻译器)。
|
2 weeks ago |
luoweijian
|
7f200aa6c6
|
docs(opportunity): 记录字典种子现状 + 行业口径待产品拍板留痕
- 字典清单: 9 组已种 (opp_source/opp_type/bid_form/result_tag/design_config/pause_reason/pool_reason/project_role/close_reason)
- Decisions 加坑: industry_code 行业口径冲突 (现有 industry 8项 vs 产品给的26项细分类型), 路A/B未拍, 挂起不落
- 仍缺值待补: locality_type(主表必填优先)/follow_way/attachment_type/apply_way/survey_seq/customer_role
|
2 weeks ago |
luoweijian
|
d68aa067e2
|
feat(dict): 初始化 9 个商机字典分组种子 (产品录入 20260825)
新增分组 (契约 code 对齐 PRD §10/票 09/票 01):
- opp_source 商机来源 (线索转入/线下挖掘/客户转介绍)
- opp_type 商机类型 (新建/改造/升级)
- bid_form 招标形式 (ZC政采/GC工程/BC EPC总分包/YB邀标)
- result_tag 跟进结果标签 (8 项)
- design_config 设计配置 (6 项, 方案卡字段选项集)
- pause_reason 暂缓原因 (6 项)
- pool_reason 进入公海原因 (5 项)
- project_role 商机项目角色 (6 项, OpportunityTeam.projectRole)
- close_reason 关闭原因 (6 项)
item code = 分组前缀_序号 (同构 OPP_STAGE_0x, 避免中文项英译歧义), 47 项
分组 7→16, item 97→144; 种子测试断言同步更新, 45 全绿
|
2 weeks ago |
luoweijian
|
8a078932ad
|
docs(opportunity): 票10 读侧回显收尾, 进度表标 ✅ 已落 (132 全绿)
|
2 weeks ago |
luoweijian
|
a7af0ac8ca
|
feat(opportunity): 票10 读侧回显当前/下一节点名 (依 crm-rule 阶段模板)
- 注入 IOpportunityStageTemplateService
- fillStageNodeNames: current_stage_id → getNodeById 取当前节点
- 下一节点 = 同版本 (node.templateId) 按 seqNo 升序的下一节点, 末节点→空
- 节点展示名 = customNodeName 优先, 空则带入 opp_stage 字典名 (票06口径)
- 批量: distinct stageId/templateId/dictCode 去重取值, 无 N+1
- 新增当前+下一节点名 / 末节点无下一 两测试, 132 全绿
|
2 weeks ago |
luoweijian
|
65fc1c5ffb
|
feat(opportunity): 票10 读侧回显字典/部门/区划名 (对称 crm-lead)
- 注入 DictQueryService/ISysDeptService/ISysRegionService
- fillDictNames: opp_source/industry_code 按 (groupCode,code) 批量查名 (PRD §10 契约)
- fillDeptNames: owner_dept_id → SysDept.deptName
- fillRegionNames: province_code/city_code → SysRegion.name
- DTO 仅 oppSourceName/industryName 有 Name 位, oppType/bidForm/localityType 无位不填
- 新增回显名测试, 130 全绿
|
2 weeks ago |
luoweijian
|
50c4e16520
|
feat(preference): 票14 自定义视图 Controller 接线 /api/preference/view
SavedViewController(与列偏好同处 /api/preference 前缀,挂 /view 子路径):
- GET /list 列出当前用户某 scope 视图(按 seqNo)
- POST /save 保存(@RequestBody SavedView;viewId 空=新建/非空=编辑)
- POST /delete 删除
- POST /set-default 图钉设默认(单值互斥)
userId 从 SecurityContext,不接受前端传入;scope 由业务方约定(商机本期
opportunity.sales);内置视图不走本接口。mvn -pl crm-preference test 16 全绿。
|
2 weeks ago |
luoweijian
|
d110fd7546
|
feat(preference): 票14 自定义视图服务 list/save/delete/setDefault + 单测
SavedViewService 契约(平台级第二种偏好,与列偏好并列):
- list:按 seqNo 升序返回该用户此 scope 视图,解析 filter_json
- save:upsert;viewId 空=新建(生成 viewId+末尾 seqNo),非空=覆盖编辑;
isDefault=true 先清同 scope 其他默认(单值互斥)
- delete:按 (user,scope,viewId) 物理删
- setDefault:图钉,先清其他再置该条;视图不存在静默返回
crm-preference 不校验字段池合法性(归业务方)。9 用例覆盖 list/新建/编辑/
默认互斥/删/setDefault/静默/任意字段。mvn -pl crm-preference test 16 全绿。
|
2 weeks ago |
luoweijian
|
5f7c293752
|
feat(preference): 票14 自定义视图实体+Mapper骨架+DTO
crm-preference 平台级第二种偏好 user_saved_view(与列偏好并列):
- UserSavedView 实体:user_id/scope_key/view_id/name/filter_json/sort_field
/sort_direction/is_default/seq_no + 创建/更新时间;uk(user,scope,view_id)
- UserSavedViewMapper:BaseMapper CRUD 骨架
- SavedView / SavedViewCondition DTO(record):视图值对象 + 单条检索条件
(字段+操作符+值),crm-preference 不校验字段合法性(字段池归业务方)
票14 定义2/3;对齐 CONTEXT.md 已冻结契约。mvn -pl crm-preference test 全绿。
|
2 weeks ago |
luoweijian
|
6e36082e90
|
docs(opportunity): map.md 票 10 查询层主体落地(六视图/计算列/RECENT/Controller),剩字典名+节点名回显
|
2 weeks ago |
luoweijian
|
67b0490b12
|
feat(opportunity): 票 10 RECENT view_log 排序 + 商机查询 Controller
- RECENT 视图独立路径 pageRecent:按 opportunity_view_log.last_view_time
倒序取上限 50(票 10 P2-2),再 ORDER BY FIELD 回主表保序;空 view_log 直接
返回空页不查主表;公共筛选抽 applyCommonFilters 供 RECENT/其它视图复用
- OpportunityQueryController /api/opportunity/page:六视图分页薄适配层,
@DataScope 自动注入,tags 按销售机会/管理/公海页面入口实挂
测试补 RECENT 保序 + 空 view_log 短路。crm-opportunity 128→129 全绿。
|
2 weeks ago |
luoweijian
|
3d4834c26c
|
feat(opportunity): 票 10 §二数值计算列(节点停留/最近跟进/方案卡状态/预算)
fillDisplayFields 扩展四项计算列(批量 join,无 N+1):
- 节点停留天数 = 今 − stage_history 中 to_stage_id=current_stage_id 的最新
operate_time(进当前节点日期,取最新那条迁入记录)
- 最近跟进 = 该商机最新 opportunity_follow.follow_time
- 方案卡状态/预算 = 主要意向客户(customer.is_primary_intended=1)的 customerId
对应那张 scheme_card 的 card_status/scheme_budget(一客户一卡取值唯一,
非主客户卡不命中);无主客户卡→两列空
测试验证取最新逻辑 + 主客户卡命中 + 非主卡排除。字典/部门/区划名 + 节点名
(依赖 crm-rule 模板)+ Controller 仍 TODO。crm-opportunity 127→128 全绿。
|
2 weeks ago |
luoweijian
|
101ee399cc
|
feat(opportunity): 票 10 六视图 filter + 分页查询层
OpportunityViewQuery 接口 + impl:六视图数据集 filter(MINE owner /
PARTICIPATED team 存活行且非负责人 / FOLLOWED focus / RECENT view_log /
PUBLIC_POOL status=1且owner空 / MANAGE @DataScope兜底)+ 公共筛选(字段池)
+ keyword(名称/甲方/主客户名)+ 分页 + followed 回显。
计算列 join(节点停留/最近跟进/方案卡状态/预算/入池前节点)+ 字典/部门/区划名
回显标 TODO 留后续步骤。ArgumentCaptor 验证各 viewType 的 WHERE 片段。
crm-opportunity 121→127 全绿。
|
2 weeks ago |
luoweijian
|
29baf93a70
|
feat(opportunity): 票 10 读侧骨架(ViewType 枚举 + PageParam + DTO)
四视图查询层骨架(对称 crm-lead LeadViewQuery,一步到位用票 14 最终视图族):
- OpportunityViewType 六视图:RECENT/MINE/PARTICIPATED/FOLLOWED/MANAGE/
PUBLIC_POOL,fromValue 空/非法回落 MINE(票 14 默认视图口径)
- OpportunityPageParam:viewType + 可筛选列字段池(票 14 确认点 3)
- OpportunityDTO:主表字段 + 出参回显(字典/部门/区划名)+ 票 10 §二计算列
占位(节点停留/最近跟进/方案卡状态/方案预算/是否关注/入池前节点)
计算列聚合 + ViewQuery filter + Controller 待续。crm-opportunity 117→121 全绿。
|
2 weeks ago |
luoweijian
|
9e811dae97
|
docs(opportunity): map.md 更新票 10/14 进度(视图数据源底座已落,查询层待开工)
|
2 weeks ago |
luoweijian
|
ba75e8f79a
|
feat(opportunity): 视图数据源三表结构落地(团队成员/关注/最近访问,票 10/14 底座)
票 10/14 四视图查询的数据底座(PRD §7.8/§7.9/§1.3):
- opportunity_team 团队成员(软删+delete_key,participated 视图 + E9 移交):
project_role 纯回显标签(字典) + permission 行级权限档(TeamMemberPermission
只读/可写跟进/可推进节点/读写,与角色单独配);UNIQUE(opp,user,delete_key)
- opportunity_focus 关注(轻量物理删,followed 视图):UNIQUE(opp,user),
纯收藏夹不入 oplog,对齐 lead_follow 风格
- opportunity_view_log 最近访问(轻量 upsert,recent 视图):UNIQUE(user,opp)
天然去重,last_view_time 倒序,后台 Job 裁剪
四实体+Mapper骨架+TeamMemberPermission枚举+冒烟测试(表绑定/列映射/逻辑删差异)。
crm-opportunity 111→117 全绿。
|
2 weeks ago |
luoweijian
|
cf70b1c6d2
|
docs(opportunity): map.md 补实现进度追踪表(07/09/08 结构落地,前沿交接)
spec 已冻结、进入 /implement 阶段:结构层全部落地(主表+状态机+
三族规则+六子表)。剩余票 10/14 可独立开工(读侧/偏好大票,不卡 A4),
票 02/11/12/13 读写入口卡 A4 客户模块挂起。
|
2 weeks ago |
luoweijian
|
73797fcd10
|
feat(opportunity): 票 08 现场勘察子表结构落地(§7.3)
OpportunitySiteSurvey 实体 + Mapper 骨架(对齐票 03/09 粒度):
- 一商机多条保留历史、无状态机、不绑阶段(自由记录)
- 必填 surveyDate/engineerUserId/applyWay/surveySeq,选填 applyNo/surveyDesc
- 主要工程师引用 crm-auth SysUser(可跨部门选人,≠操作人),联系方式反查不冗余存
- 附件复用统一附件表 biz_type=SITE_SURVEY(票 09)
- 无唯一约束 → BaseEntity 逻辑删,不加 delete_key
测试:OpportunitySiteSurveyMapperTest,crm-opportunity 108→111 全绿。
接线待后续:勘察读写 Service/Controller、crm-dict 申请方式/勘察次数分组
|
2 weeks ago |
luoweijian
|
825cb2cf9a
|
feat(opportunity): 票 09 子表族结构落地(跟进/附件/工作计划/操作日志)
§7.4–7.7 四张表实体 + Mapper 骨架(对齐票 03 粒度,只落结构不接线):
- OpportunityFollow 跟进记录:无草稿态,软删+delete_key,支持删除不回退锚点,本期不做编辑
- OpportunityAttachment 统一附件表:biz_type+biz_id 定位(AttachmentBizType 枚举
OPP/FOLLOW_UP/SITE_SURVEY/SCHEME_CARD),文件本体走 crm-file,软删+delete_key;
是票 07/08 的附件契约落点
- OpportunityWorkPlan 工作计划:结构 only,plan_status 0/1,精确态枚举与联动归 A1X
- OpportunityOplog 操作日志:字段级审计,双维度 OplogKind(FIELD_CHANGE/ROW_ADD/
ROW_DELETE)+ OplogLogType(7 类,SYSTEM_INTERNAL 记库不显),只增不删无 delete_key,
带 biz_ref + snapshotJson
测试:OpportunityChildTablesMapperTest(表绑定+列映射+逻辑删)+ EnumTest(值域),
crm-opportunity 100→108 全绿。CONTEXT/底稿落地记录回填。
接线待后续:跟进/附件读写 Service/Controller、统一审计切面写 oplog、
last_valid_follow_time 联动、crm-dict 跟进方式/结果标签/资料类型分组
|
2 weeks ago |
luoweijian
|
f7e06f699f
|
feat(opportunity): 票 07 方案卡运行时收尾 + V-CONFIG 三族版本机制抽公共
方案卡(票 07):
- 创建改手动选模板版本(PRD §7.2/L499 不自动匹配),候选=发布中且适用范围
命中负责人部门(专用∪通用),空则前端置灰;新增 listSelectableTemplates 下拉数据
- DTO 收敛:删 SchemeCardSaveDTO,统一双向 SchemeCardDTO(ADR-0017 Route A),
values→valuesJson 隐式表单绑定;StageController 同步改齐 SwitchStageDTO
- 软删对齐 §7:新建卡 delete_key=0
V-CONFIG 抽公共(票 05/06/07 同族):
- 新增 VersionedConfigSupport 基类,收敛 minor 版本号顺延/编码顺延/纯状态迁移;
三 ServiceImpl 继承,领域校验与子表替换仍各票自持
- 种子字段库 SchemeFieldDefInitializer:16 项系统字段 + 全公司通用兜底模板
(OPP_SCHEME_TPL_01,幂等键=编码含已停用,停用后重启不复活)
CONTEXT/ADR/PRD spec 回填 + 错别字修正(兑底→兜底)
测试:crm-rule 129 + crm-opportunity 100 全绿
|
2 weeks ago |
luoweijian
|
33d6e50741
|
Merge branch 'master' of http://8.148.234.146:3001/luoweijian/crm-backend-matt
|
2 weeks ago |
luoweijian
|
01372d682c
|
docs(opportunity): 票 05 spec 回填(PRD §7.10 幂等批次键具体化 + crm-rule CONTEXT 升级通用规则域/商机规则子域三词汇 + opportunity CONTEXT 落地记录与三项已知缺口登记)
|
2 weeks ago |
luoweijian
|
cddabf32df
|
feat(opportunity): 票 05 维护 Job 先提醒后回收落地(单 @Scheduled 提醒-回收串行 + 待发通知落库 + code-review 修正:常量替换/状态迁移去重/空集守卫 + 清理误入临时日志)
|
2 weeks ago |
luoweijian
|
30f8e48161
|
commit
|
2 weeks ago |
luoweijian
|
01900ca76a
|
feat(opportunity): 票 06 商机阶段模板 + 阶段运行时落地(轴2)
- crm-rule:阶段模板 V-CONFIG 版本状态机(头表/适用部门/阶段节点三实体 + 草稿三分支/发布顶替/默认顶替/复制/停用/仅草稿可删),固定节点「已转项目」系统规范化(入参拒绝伪造、末位补唯一),节点字典引用校验(仅「商机阶段」分组启用项可新增引用,票01 定稿方向引入 crm-dict 依赖),绑定匹配(部门专用优先/多命中取最近创建/默认兜底),错误码 64013-64017,权限种子仅菜单
- crm-opportunity:opportunity_stage_history 快照 + 阶段自由切换(CAS 锚 current_stage_id、仅推进中可切 66005、固定节点/跨版本禁切 66006)、三态进度/历史查询端点;转项目端口 E8 成功后联动驱动固定节点(系统身份 0L、幂等、缺固定节点告警跳过)
- crm-dict:新增「商机阶段」字典分组种子(OPP_STAGE_01..05)及初始化测试断言同步
- 测试:阶段模板状态机 41 用例 + 阶段运行时 17 用例 + ConvertPort 联动断言;全反应器 662 用例绿
|
2 weeks ago |
luoweijian
|
95d7f968dc
|
commit
|
2 weeks ago |
luoweijian
|
133892c837
|
docs(opportunity): 票 04 spec 回填(PRD CAS 两级口径/日志分工/E7 锚点规格空白 + CONTEXT 落地记录)
|
2 weeks ago |
luoweijian
|
97dac33a6a
|
feat(opportunity): 票 04 归属流转状态机落地(E1-E10 状态机 + CAS 乐观锁 + status_history 快照 + 转项目 inbound 端口)
|
2 weeks ago |
luoweijian
|
ecc3c49636
|
feat(opportunity): 票 03 商机主表落地(Opportunity 实体 + 5 态枚举 + Mapper 骨架)
TDD 三切片(红→绿各一轮,19 测试全绿):
- OpportunityStatus:轴 1 归属流转 5 态枚举(1待领取/2推进中/3暂缓中/4已关闭/5已转项目),
implements HasValueEnum<Integer>;只钉值域,迁移逻辑归票 04
- Opportunity:主表实体(票 03 三簇 + Amendment 1),同构 crm-lead/Lead 写法
* 簇 A 业务字段 12 列(含 project_amount decimal(14,2) 选填,Amendment 1)
* 簇 B 归属三层(owner_user_id/owner_dept_id/origin_dept_id)+ 两轴落点
(opp_status/current_stage_id/stage_template_id+版本号冗余)+ 来源快照 4 列
+ 单计时器 claim_time/last_valid_follow_time
* C3 主客户冗余快照 2 列、暂缓附加 4 列落主表(E4 写/E5 清空)
* 乐观锁 @Version version=0(切主客户票 13 / 状态 CAS 票 04 复用,接线归后续票)
* @DataScope(module=opportunity, owner_user_id, owner_dept_id)——module 已在
crm-auth DataInitializer 预注册,不触发 ADR-0006 启动拒绝
* 索引:UNIQUE(source_lead_id) + (owner_user_id,opp_status) + (owner_dept_id,opp_status)
* 不建:pool_id/dept_id/recycle_deadline/expected_deal_date(票 05/10 定稿排除)
- OpportunityMapper:骨架 extends CrmBaseMapper(同构 LeadMapper)
- 模块装配:根 pom modules/dependencyManagement + crm-app 聚合依赖
- CONTEXT.md 待细化小节勾销主表项
边界守住:子表归 07/08/09,customerId 契约归 11,关联客户表归 13,均未触碰。
验证:全量 BOM 扫描 0 命中;全反应堆 clean test 9 模块 SUCCESS。
|
2 weeks ago |
luoweijian
|
9a9d6a3270
|
docs(opportunity): 商机域 spec 定稿收尾(grill 补拍 20260821 回填 PRD/map/待确认清单 + OCR 存档)
- PRD V1.0 冻结态补拍:origin_dept_id、E8/E9/E10 迁移细化、切主客户一致性、待发通知表、
子表软删复用键 delete_key 约定等 grill 拍板内容
- 实现期回填两处一致性修正(票 03 code-review Spec 轴发现):
* §2.2 owner_name_snapshot varchar(100)→varchar(64)(对齐票 03 B1「对称 lead」,lead 即 64)
* §2.2 补登 version 乐观锁行(§7.1/§3.4 已引用但字段表漏登)
- 方案卡模板 OCR 原始存档(1787558225260_*.png + ocr-scheme-card/doc_0.md)
|
2 weeks ago |
luoweijian
|
d768080ed7
|
commit
|
2 weeks ago |
luoweijian
|
bb2dad7b58
|
commit
|
2 weeks ago |