luoweijian
|
49cbab687c
|
docs(opportunity): 拆票15/16 并回写 map(票15 已落 resolved)
票15 全局默认阶段模板兜底 seed 已实现落地;票16 转商机同步事务补齐
(阶段落位+初始日志+团队成员)blocked by 15 现已解除,待开工。
|
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
|
33efce85f9
|
docs(dict): 立票 09 字典项两级树形能力 (DictItem 加 parent_id)
- 行业改全系统通用两级树 (产品 20260825), 商机选一级, 需扩 crm-dict 模型
- 票列 7 个待 grill 不变式: 层级上限/父子约束/停用删除级联/树形查询API/存量安全/客户侧选几级/商机落库形态
- 附产品给定行业全树 (9 一级 + 全二级) 待拍板后种
- opportunity map.md 同步: industry 挂起改为已立票
|
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
|
8c44433ce4
|
docs(opportunity): 字典清单更新 14 组已种, 仅剩 attachment_type 缺值 + 行业挂起
|
2 weeks ago |
luoweijian
|
a0a87bcffc
|
docs(map): 票14 收尾,商机侧自定义视图接线完成,标 ✅ 已落
进度表 票14 → ✅ 已落(内置六视图硬编码 + crm-preference 自定义视图平台
能力 + 商机侧 filter_json→查询翻译);Not yet specified 段票14传出标全部
落地,剩 spin-out(多组条件复合/高级公式/sortField 入库级排序,契约已预留)。
|
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
|
8a078932ad
|
docs(opportunity): 票10 读侧回显收尾, 进度表标 ✅ 已落 (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
|
6e36082e90
|
docs(opportunity): map.md 票 10 查询层主体落地(六视图/计算列/RECENT/Controller),剩字典名+节点名回显
|
2 weeks ago |
luoweijian
|
9e811dae97
|
docs(opportunity): map.md 更新票 10/14 进度(视图数据源底座已落,查询层待开工)
|
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
|
01372d682c
|
docs(opportunity): 票 05 spec 回填(PRD §7.10 幂等批次键具体化 + crm-rule CONTEXT 升级通用规则域/商机规则子域三词汇 + opportunity CONTEXT 落地记录与三项已知缺口登记)
|
2 weeks ago |
luoweijian
|
30f8e48161
|
commit
|
2 weeks ago |
luoweijian
|
133892c837
|
docs(opportunity): 票 04 spec 回填(PRD CAS 两级口径/日志分工/E7 锚点规格空白 + CONTEXT 落地记录)
|
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
|
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
|
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
|
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 |
luoweijian
|
0dc2da99d5
|
commit
|
4 weeks ago |
luoweijian
|
51b7e2a749
|
feat(auth,dict,base): extract PermissionSeeder seam to replace shadow entities (ADR-0016)
- Add PermissionSeeder interface + PermissionModuleDescriptor/ButtonSeed records in crm-base
- Implement PermissionSeederImpl in crm-auth with find-or-create idempotent seeding
- Refactor DataInitializer to use seam (3 seedModule calls) + @Order(1)
- Refactor DictPermissionInitializer to use seam (1 seedModule call) + @Order(10)
- Delete 6 shadow entity/mapper files from crm-dict (SysMenuSeed, SysRoleSeed, SysRoleMenuSeed + mappers)
- Rewrite DictPermissionInitializerTest to mock PermissionSeeder (no more H2 auth tables)
- Add PermissionSeederImplTest (H2 integration test covering idempotency, catalog sharing, role-not-found)
- Add ADR-0016 documenting the decision, rationale, alternatives, and consequences
- Create crm-base/CONTEXT.md with PermissionSeeder domain glossary
- Update CONTEXT-MAP.md to link crm-base/CONTEXT.md
Eliminates schema leakage: crm-dict no longer knows sys_menu's physical schema.
Runtime dependency accepted: crm-dict needs crm-auth's PermissionSeederImpl at runtime (via crm-app classpath aggregation).
|
4 weeks ago |
luoweijian
|
3d55eeb196
|
feat(dict): data dictionary module — two-level flat model, CRUD/default/cache/permission/seed (ADR-0015)
- 4 tables (dict_group/dict_item/dict_group_default/dict_ref_count), delete_key soft-delete reuse
- DictGroup/DictItem full CRUD + force-delete + status toggle + enabled-list
- DictReferenceService: increment/decrement/batchApply/isReferenced, same-tx ref_count, no cache
- DictQueryService: Caffeine 10s cache + 2s negative cache for empty results, group.status join
- Default item: INSERT ON DUPLICATE KEY UPDATE, hibernate on group disable, auto-restore
- Permission seeds: 10 perm codes → sys_menu tree, bound to ROLE_ADMIN, no crm-auth import
- Built-in dict initializer: idempotent upsert, builtin=false never touched (US-41), value not overwritten
- 48 tests pass; full project compiles
|
1 month ago |
luoweijian
|
50f79a884d
|
commit
|
1 month ago |
luoweijian
|
3499353b28
|
feat(file): thumbnail preview - async generation + sync fallback, PDFBox/LibreOffice renderers, retry (ADR-0013)
|
1 month ago |