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 |
luoweijian
|
6583863b49
|
commit
|
2 weeks ago |
luoweijian
|
3d0699df6f
|
commit
|
3 weeks ago |
luoweijian
|
f11b840c3e
|
commit
|
3 weeks ago |
luoweijian
|
162ecbf9d2
|
commit
|
3 weeks ago |
luoweijian
|
e4b2a320ea
|
feat: 钉钉组织同步端点 + 管理员角色配置接口——dt-java 部门树/HTTP listbypage 用户幂等同步,dt_dept_id 与 account 作幂等键,负责人反写不映射角色(frontend-integration 票据 03)
|
3 weeks ago |
luoweijian
|
ea212fa8b6
|
feat: 字典种子对齐蓝湖原型——lead_source 改渠道 38 项并新增 brand/product/scene(frontend-integration 票据 02)
|
3 weeks ago |
luoweijian
|
a644f8db13
|
feat: 行政区划全量种子导入——RegionDataInitializer 幂等导入国标三级 3432 行(frontend-integration 票据 01)
|
3 weeks ago |
luoweijian
|
56d8abcdc3
|
feat: 权限码全集下发——/me 增加 permCodes 与 perms→denyBehavior 映射(auth-perms-01)
|
3 weeks ago |
luoweijian
|
2a67fd9be8
|
commit
|
3 weeks ago |
luoweijian
|
1d6c9c6d7a
|
commit
|
3 weeks ago |
luoweijian
|
fa476b4766
|
feat: 单端在线登录(顶号)——每 (用户, 端类型) 至多一个活会话
按 .scratch/single-device-login spec(票 01-07)落地:
- 会话反向索引 session:{userId}:{clientType}->jti(token 键为真相、索引为线索,
反查必验证、脏索引自愈),与 token 键 TTL 对齐并跟随滑动续期
- login/dingtalk 增可选 clientType(默认 pc、大小写不敏感、非法值 61016);
检测到设备在线不签正式 token,返回 61013 + 短命 preLoginToken(带 data 不抛异常)
- 新增 login/dingtalk/confirm:GETDEL 消费 preLoginToken(拿到即烧)-> 踢旧会话
(埋 kicked 标记 + 删旧 token)-> 签新 token 覆写索引;失效统一 61014
- 被顶设备下次请求:filter 埋 ATTR_KICKED_OFFLINE -> commence 输出 401 + 61015
- 登出改 CAS 删索引(Lua 脚本,防误删已被顶号覆写的新索引)
- crm-base Result 增 fail(code, msg, data) 重载;错误码 61013-61016 登记 README
- 存量会话(无 clientType)与老前端(不传 clientType)路径完全兼容;JWT 不变
- 测试:TokenServiceTest 18 / FilterTest 4 / HandlersTest 3 / AuthServiceImplTest +5,
crm-auth 183 全过,全仓 8 模块 BUILD SUCCESS
|
3 weeks ago |
luoweijian
|
dfd1fc6f01
|
commit
|
3 weeks ago |
luoweijian
|
70b53de34c
|
commit
|
3 weeks ago |
luoweijian
|
3277f701de
|
commit
|
3 weeks ago |
luoweijian
|
b345c4dc7b
|
commit
|
3 weeks ago |
luoweijian
|
54aa290c89
|
commit
|
4 weeks ago |
luoweijian
|
4a4b31d8e1
|
commit
|
4 weeks ago |
luoweijian
|
78aa9748e4
|
feat: 数据权限按业务模块可配(ADR-0018)
将数据权限从「单一全局档位」改造为「按业务模块分别配置档位」:
- 新增 sys_data_scope_module 注册表 + sys_role_data_scope 角色×模块档位表
- @DataScope 注解新增必填 module 属性,启动时校验 code 在注册表中存在
- DataVisibility 持有 Map<String, DataScopeLevel> 替代单个 level
- DataVisibilityContext.currentScope(moduleCode) 加参数取该模块的 scope
- DataScopeInterceptor 顺序调换:先找表→查注解→取该模块 scope→注入 WHERE
- PermissionResolverImpl 查 sys_role_data_scope 按 module_code 分组取最宽
- 删除 SysRole.dataScope 列 + 删除 DataScopeEnum.CUSTOM(5)
- RoleController saveOrUpdate 用 moduleScopes JSON 替代 dataScope
- 新增 GET /api/data-scope/modules 端点
- saveRoleWithScopes 原子事务(角色保存+范围全量替换同提交同回滚)
- DataScopeModuleController 返回 DTO 不泄露 BaseEntity 审计字段
- 一次性迁移 SQL 脚本(单事务,CROSS JOIN 旧值,DROP 旧列)
- DataInitializer 初始化 4 个内置模块 + ADMIN 每模块 ALL 档位
- 全量测试通过:crm-base 80 tests + crm-auth 153 tests
|
4 weeks ago |
luoweijian
|
96230913ae
|
refactor: SystemController IO to DTOs (ADR-0017 ticket 07)
- new DeptDTO (extends BaseDTO, children tree, fromEntity/toEntity)
- new AssignDeptDTO (plain POJO, no key semantics)
- rename UserStatsVO -> UserStatsDTO
- menuTree returns List<ResourceNodeDTO>; PermissionResolver.visibleMenuTree maps entity->DTO before tree build
- deptTree returns List<DeptDTO>; saveDept takes DeptDTO; assignUserDepts takes AssignDeptDTO
- userPage drops @RequestBody -> form binding (aligns with documented form-urlencoded convention)
- sync role-management doc RoleDetailVO -> RoleDTO
- DataScopeIntegrationTest updated for ResourceNodeDTO
|
4 weeks ago |
luoweijian
|
ef7ad8e368
|
refactor: RoleController IO to RoleDTO/RoleParam, sink paging into service (ADR-0017 ticket 06)
- rename RoleDetailVO -> RoleDTO extending BaseDTO, add toEntity()
- new RoleParam extends BaseParam; page() now uses PageConverter (size clamp + orderBy anti-injection), fixing pagination bypass
- saveOrUpdate 6 @RequestParam -> RoleDTO; detail returns RoleDTO
- add PageConverterTest covering size clamp + orderBy injection guard
|
4 weeks ago |
luoweijian
|
f989b566cc
|
refactor: rename ResourceNode to ResourceNodeDTO extending BaseDTO (ADR-0017 ticket 05)
|
4 weeks ago |
luoweijian
|
e888aeeb42
|
chore: mark tickets 02/03/04 as resolved (InitBinder + Dict IO)
|
4 weeks ago |
luoweijian
|
0b4c4d2bbb
|
refactor: align dict tests with DTO return types (ADR-0017 tickets 03/04)
|
4 weeks ago |
luoweijian
|
1a9cf36785
|
chore: stop tracking build artifacts (target/, .idea/, test-output.txt)
|
4 weeks ago |
luoweijian
|
a542e48f86
|
commit
|
4 weeks ago |
luoweijian
|
b50002f47f
|
commit
|
4 weeks ago |
luoweijian
|
80bc06304c
|
chore: mark ticket 01 as resolved (BaseDTO refactor complete)
|
4 weeks ago |
luoweijian
|
ae103a1f1c
|
refactor: BaseDTO 重构为 abstract 基类 + IBaseService 清理死代码 (ADR-0017 ticket 01)
- BaseDTO 改为 abstract,仅保留 id/createTime/updateTime(均加 @JsonInclude NON_NULL)
- 移除 creatorId/updaterId/deleted 字段及默认值——防止出参侧泄露
- 移除泛型 toEntity(Supplier) 方法——转换方法下沉到各 DTO 类
- IBaseService 删除 saveDTO/updateDTO 死代码(零调用方)
- BeanCopyUtils javadoc 同步更新(移除 BaseDTO.toEntity 引用)
- README §3/§4/§10 同步更新 BaseDTO 和 IBaseService 说明
- 修复 ResourceController/RoleController 预存 UTF-8 BOM 问题
- 新增 ADR-0017、spec.md、7 个 implementation tickets
Refs: ADR-0017, .scratch/controller-io-conventions/
|
4 weeks ago |