8.8 KiB
8.8 KiB
公海池模块迁移方案 — 06 分步实施计划
步骤 1:清理现有不符合规范的代码
目标
删除现有 shanxia2.0 中公海池相关的不规范代码,为重新移植做准备。
具体任务
- 删除前端:
web-admin/src/views/crm/customer/pool/目录 - 删除前端:
web-admin/src/api/crm/poolRule.ts - 清理前端:
web-admin/src/api/crm/customer.ts中的公海池 API 函数 - 删除后端:
backend/app/crud/crm/customer_pool.py - 删除后端:
backend/app/crud/crm/pool_rule.py - 删除后端:
backend/app/schemas/crm/customer_pool.py - 删除后端:
backend/app/schemas/crm/pool_rule.py - 清理后端:
backend/app/models/crm_models.py中的 CrmCustomerPool 和 CrmCustomerPoolRule - 清理后端:
backend/app/api/crm.py中的公海池相关路由 - 删除后端:
backend/app/tasks/customer_pool.py
涉及文件
- 上述所有文件
完成标准
- 所有公海池相关代码已删除
- 后端能正常启动(无 import 错误)
预计代码量
- 删除约 800 行
步骤 2:前端拷贝 — 公海池列表页
目标
从原 CRM 拷贝 pool/index.vue 到 shanxia2.0,保留完整功能。
具体任务
- 拷贝
shanxia/crm/web/src/views/crm/pool/index.vue→web-admin/src/views/crm/customer/pool/index.vue - 不做任何修改,先保留原版代码
涉及文件
web-admin/src/views/crm/customer/pool/index.vue(新建)
完成标准
- 文件已拷贝,内容与原 CRM 一致
步骤 3:前端拷贝 — 领取/分配弹窗
目标
拷贝 claimDialog 和 assignDialog 到 shanxia2.0。
具体任务
- 拷贝
claimDialog.vue→ClaimDialog.vue - 拷贝
assignDialog.vue→AssignDialog.vue
涉及文件
web-admin/src/views/crm/customer/pool/components/ClaimDialog.vue(新建)web-admin/src/views/crm/customer/pool/components/AssignDialog.vue(新建)
完成标准
- 两个弹窗文件已拷贝
步骤 4:前端适配 — pool/index.vue script 部分
目标
逐行审阅并适配 pool/index.vue 的 <script> 部分。
具体任务
- 移除
getCurrentInstance()/proxy,改用直接 API 调用 - 替换
proxy?.useDict('xxx')→dictStore.getOptions('xxx') - 替换
proxy?.$modal.msgSuccess→ElMessage.success - 移除手动 import(Element Plus 自动导入)
- 替换 API 调用:
request({ url, method })→request.post(url, data) - 创建
web-admin/src/api/crm/pool.ts统一公海池 API
涉及文件
web-admin/src/views/crm/customer/pool/index.vueweb-admin/src/api/crm/pool.ts(新建)
完成标准
- 无 proxy/getCurrentInstance 残留
- 无手动 Element Plus import
- API 调用使用 shanxia2.0 风格
步骤 5:前端适配 — pool/index.vue template + style
目标
适配模板和样式为 Fresh Mint 风格。
具体任务
- 替换
<el-card>布局 →page-container+panel布局 - 替换
<right-toolbar>→list-toolbar - 替换
<dict-tag>→<el-tag>+ dictStore - 添加模块标题竖线样式(
title-bar-heading) - 弹窗适配:
label-width→label-position="top",添加dialog-form-layout - 替换 UnoCSS 类 → SCSS/Tailwind
- 添加
<el-icon>到所有按钮
涉及文件
web-admin/src/views/crm/customer/pool/index.vue
完成标准
- 无 el-card / right-toolbar / dict-tag 残留
- 按钮 icon 齐全
- 弹窗符合 dialog-form-layout 标准
步骤 6:前端适配 — ClaimDialog 和 AssignDialog
目标
适配两个弹窗组件。
具体任务
- 移除 proxy/getCurrentInstance
- 替换消息提示为 ElMessage
- 弹窗样式适配(label-position="top",icon 按钮)
- AssignDialog 中
listUserAPI 替换为 shanxia2.0 的用户列表 API
完成标准
- 弹窗功能完整,符合 UI 规范
步骤 7:前端新增 — 规则管理页面
目标
新建公海池规则管理页面(原 CRM 无前端,shanxia2.0 新增)。
具体任务
- 新建
views/crm/customer/pool/RuleIndex.vue(参考标准列表模板unit/index.vue) - 新建
views/crm/customer/pool/components/RuleDialog.vue(新增/编辑弹窗) - 在
api/crm/pool.ts中添加规则管理 API 函数 - 在
router/modules/sqxp.ts中添加规则管理路由
涉及文件
web-admin/src/views/crm/customer/pool/RuleIndex.vue(新建)web-admin/src/views/crm/customer/pool/components/RuleDialog.vue(新建)web-admin/src/api/crm/pool.tsweb-admin/src/router/modules/sqxp.ts
完成标准
- 规则 CRUD 页面可正常渲染
- 路由已配置
步骤 8:后端 DDL + Model
目标
创建正确的 DDL 和 SQLAlchemy Model。
具体任务
- 创建增量 SQL 脚本
docs/sql/incremental_crm_customer_pool.sql - 修正
crm_models.py中的 CrmCustomerPool(字段名回归 sx.sql) - 修正
crm_models.py中的 CrmCustomerPoolRule(字段名/类型/值回归 sx.sql)
涉及文件
docs/sql/incremental_crm_customer_pool.sql(新建)backend/app/models/crm_models.py
完成标准
- DDL 与 sx.sql 业务字段一致
- Model 字段与 DDL 一一对应
- 7 项公共字段适配正确
步骤 9:后端 Schema
目标
创建 Pydantic v2 Schema,字段名回归。
具体任务
- 重写
schemas/crm/customer_pool.py:字段用fromUserId,toUserId,reason,createByName - 重写
schemas/crm/pool_rule.py:字段用poolName,timeoutDays,sort,ruleType(no_follow/no_deal),status(enable/disable)
完成标准
- Schema 字段名与 DDL 字段 camelCase 一致
- 校验规则与 Java Bo 一致
步骤 10:后端 CRUD — 操作记录
目标
重写 crud/crm/customer_pool.py。
具体任务
_row_to_dict:字段名回归(fromUserId, toUserId, reason, createByName)list_pool_records:按 create_time DESCcreate_pool_record:写入操作记录get_pool_record:按 ID 查询
完成标准
- CRUD 函数与 API 规格对应
步骤 11:后端 CRUD — 规则管理 + 定时任务
目标
重写 crud/crm/pool_rule.py 和 tasks/customer_pool.py。
具体任务
- pool_rule CRUD:list/add/update/delete/toggle/execute
- execute_pool_rules:按 no_follow/no_deal 规则类型执行回收
- 定时任务:check_protect_period_expired + remind_protect_expiring
完成标准
- 规则 CRUD 完整
- 执行逻辑与 Java 一致(no_follow/no_deal 分支)
步骤 12:后端 API 路由
目标
在 api/crm.py 中添加公海池相关路由。
具体任务
- 公海池客户列表:
/customer/pool/list - 操作记录:
/customer/pool/record/list,/customer/pool/record/detail - 规则管理:
/customer/pool/rule/list|detail|add|update|delete|updateStatus|execute - 领取/分配/放入:复用客户管理路由
完成标准
- 路由与 API 规格一一对应
- 前端 API URL 与后端路由匹配
步骤 13:字典数据导入
目标
将公海池相关字典从 sx.sql 导入 shanxia2.0。
具体任务
- 检查 sx.sql 中
sys_dict_data是否有crm_pool_*字典 - 如有,导出 INSERT 语句到增量 SQL 脚本
- 如没有,根据 Java Bo 注解创建字典数据
完成标准
- 字典值与原 CRM 一致
步骤 14:整体验证
目标
端到端验证所有公海池功能。
验证清单
- 页面正常渲染,无控制台错误
- 公海池客户列表加载正常
- 搜索筛选功能正常
- 统计信息显示正确
- 领取功能正常
- 分配功能正常
- 放入公海功能正常(从客户管理操作)
- 规则 CRUD 功能正常
- 规则启停功能正常
- 列设置功能正常
- UI 规范合规(见 07-verify.md)
参考
- 验证清单详见
07-verify.md
步骤汇总
| 步骤 | 类型 | 目标 | 涉及文件 | 预计代码量 |
|---|---|---|---|---|
| 1 | 清理 | 删除不规范代码 | 10+ 文件 | -800行 |
| 2 | 前端拷贝 | 拷贝 pool/index.vue | 1 文件 | ~350行 |
| 3 | 前端拷贝 | 拷贝弹窗组件 | 2 文件 | ~200行 |
| 4 | 前端适配 | script 部分适配 | 2 文件 | ~100行改动 |
| 5 | 前端适配 | template/style 适配 | 1 文件 | ~150行改动 |
| 6 | 前端适配 | 弹窗适配 | 2 文件 | ~60行改动 |
| 7 | 前端新增 | 规则管理页面 | 3 文件 | ~400行 |
| 8 | 后端 | DDL + Model | 2 文件 | ~120行 |
| 9 | 后端 | Schema | 2 文件 | ~120行 |
| 10 | 后端 | 操作记录 CRUD | 1 文件 | ~100行 |
| 11 | 后端 | 规则 CRUD + 任务 | 2 文件 | ~250行 |
| 12 | 后端 | API 路由 | 1 文件 | ~200行 |
| 13 | 数据 | 字典导入 | 1 文件 | ~20行 |
| 14 | 验证 | 整体验证 | — | — |
| 合计 | ~1170行 |