# 线索管理模块迁移方案 — 06 分步实施计划(28 步) > **For agentic workers:** 按序执行,每步完成后勾选。必须先通过 `01~05` 方案审核。 > **关联:** `docs/crm-migration/step-02-frontend-copy.md`、`step-03-frontend-adapt.md`、`step-04-backend.md` --- ## Phase 0:准备与清理(步骤 1~3) ### 步骤 1:确认方案审核通过 - [ ] 阅读 `01-overview.md` ~ `05-special.md` - [ ] 与产品确认:统计页是否 Phase B - **完成标准**:评审记录或口头确认可进入编码 ### 步骤 2:清理门户已有线索前端 - [ ] 确认 `web-admin/src/views/crm/clue/` 为空或不存在 - [ ] 删除 `web-admin/src/api/crm/clue.ts`(门户适配版) - [ ] 从 `sqxp.ts` 移除线索路由(若已加回则再删) - **文件**:`web-admin/src/router/modules/sqxp.ts` ### 步骤 3:标记后端「待对照 Java 重写」 - [ ] 在 `module-status.md` 将线索标为「前端重做 / 后端待核验」 - [ ] 不删除现有 Python(可选);开发时以 `04-api-spec` 缺口表为准 - **完成标准**:团队知晓勿直接信任现后端行为 --- ## Phase 1:原版拷贝(步骤 4~6) ### 步骤 4:拷贝 Vue 页面 从 `shanxia/crm/web/src/views/crm/clue/` 拷贝至 `web-admin/src/views/crm/clue/`(含 `statistics/`)。 - [ ] 9 个 vue + README 就位 - **禁止**:改 UI、改 API ### 步骤 5:拷贝 API 与类型 - [ ] `api/crm/clue/index.ts` → `web-admin/src/api/crm/clue.ts` 或拆 `clue/index.ts` - [ ] `api/crm/clue/types.ts` → `web-admin/src/api/crm/clue/types.ts` ### 步骤 6:本地编译冒烟 - [ ] `pnpm dev` 可启动(允许路由未注册时报错仅来自菜单点击) - **完成标准**:无「模块找不到」类错误(拷贝完整性) --- ## Phase 2:前端 UI 适配(步骤 7~14) > 每步:先读原 script 逻辑,再改 template/style。参照 `ref-ui-standards.md`。 ### 步骤 7:适配 `index.vue` — 骨架与筛选 - [ ] `filter-block` / `list-toolbar` / `list-body` 类名 - [ ] 梳理本页 API 调用清单写入 PR 说明 - **文件**:`views/crm/clue/index.vue` ### 步骤 8:适配 `index.vue` — 表格与分页 - [ ] 状态列 `el-tag`;操作列 `fixed="right"` - [ ] 分页入 `list-pager-bar` ### 步骤 9:适配 `index.vue` — 工具栏与 v-auth - [ ] 按钮图标;唯一 primary - [ ] Tab 切换调用的 list/mine/toFollow API 记下参数 ### 步骤 10:适配 `form.vue` - [ ] `dialog-form-layout`、`form-grid-2` - [ ] 字典、`fetchUserOptions` ### 步骤 11:适配 `assignForm.vue` + `invalidForm.vue` - [ ] 用户列表 `@/api/admin` - [ ] 弹窗底栏 Close/Check 图标 ### 步骤 12:适配 `followForm.vue` + `convertForm.vue` - [ ] 附件上传组件门户化 - [ ] 转化原因校验与 Java 一致 ### 步骤 13:适配 `detail.vue` - [ ] 布局与 tag;跟进列表分页 - [ ] 路由 `/#/crm/clue/detail/:id` ### 步骤 14:注册路由与菜单 SQL - [ ] `sqxp.ts` 增加 CrmClue、CrmClueDetail - [ ] 执行/编写 `sys_menu` 线索菜单增量 SQL - [ ] 角色授权勾选测试账号 --- ## Phase 3:后端业务梳理(步骤 15~17)— **先于补全代码** ### 步骤 15:精读 Java `CrmClueServiceImpl` - [ ] 逐方法做 checklist(转化/分配/导入/统计) - [ ] 更新 `05-special.md` 若发现遗漏规则 ### 步骤 16:精读 Java `CrmClueFollowServiceImpl` - [ ] 确认跟进级联四字段 - [ ] 确认删除跟进是否递减 count ### 步骤 17:输出 Postman/接口用例表 - [ ] 每条 API 至少 1 正常 + 1 拒绝用例(如已转化不可删) - **产出**:`07-verify.md` 草稿或 Apifox 集合 --- ## Phase 4:后端对齐与缺口(步骤 18~25) ### 步骤 18:核验 DDL 已执行 - [ ] 执行 `incremental_crm_clue.sql` - [ ] 字典数据齐全 ### 步骤 19:对齐 CRUD `_row_to_dict` 与 Schema - [ ] 对照 Java Vo 字段 - [ ] `check_field_consistency.py` ### 步骤 20:核验已有 15 个核心路由 - [ ] list/detail/add/update/delete/assign/convert/... - [ ] 修正与 Java 不一致处(invalid 批量等) ### 步骤 21:实现跟进 detail + update - [ ] `follow/detail`、`follow/update` - [ ] CRUD + Schema + 路由 ### 步骤 22:实现 export + importTemplate + import - [ ] 参考 `crm.py` 产品/客户导出实现 openpyxl - [ ] 移植 `importClues` 校验逻辑 ### 步骤 23:实现 checkDuplicate - [ ] 手机号+公司模糊查重 ### 步骤 24:前端 API 层改 POST 路径 - [ ] `clue.ts` 全部 `/web/crm/clue/*` - [ ] 响应解包与 `customer` 模块一致 ### 步骤 25:前后端联调 MVP - [ ] 列表五 Tab - [ ] 新增→跟进→转化→客户详情可查 - [ ] 分配、无效、删除边界 --- ## Phase 5:统计与验收(步骤 26~28) ### 步骤 26:(可选 Phase B)statistics 五接口 + 统计页 - [ ] 后端 5 路由 - [ ] `statistics/index.vue` UI 适配 ### 步骤 27:整体验证 - [ ] 执行 `07-verify.md` 全清单 - [ ] `pnpm lint` / 手测核心路径 ### 步骤 28:更新状态与图谱 - [ ] `module-status.md` 标为已验证 - [ ] `./scripts/update-graph.sh frontend`(若改大量文件) --- ## 预估工时(参考) | Phase | 步数 | 人天(1 人) | |-------|------|-------------| | 0~1 拷贝 | 6 | 0.5 | | 2 前端 | 8 | 2~3 | | 3 梳理 | 3 | 1 | | 4 后端 | 8 | 2~3 | | 5 验收 | 3 | 1 | | **合计** | **28** | **6~8** |