前置条件:step-03 已完成。 实施依据:
docs/crm-migration/plans/{module}/06-steps.md中的后端实现步骤。 同步参考:ref-database-rules.md、ref-lessons-learned.md 模块方案:docs/crm-migration/plans/{module}/04-api-spec.md(API规格)、docs/crm-migration/plans/{module}/02-database.md(数据库)
先理解 Java 业务逻辑,再写 Python 代码。 每个接口先读 Java 源码(Controller → Service → Mapper),用中文写出业务逻辑说明,再编码。
写到哪一步,快照哪一步的 Java——不在方案阶段一次性拷贝整个模块。
plans/{module}/06-steps.md,找到当前步骤的「Sub-step 0 快照」清单docs/crm-migration/scripts/snapshot-java.sh {module} <files...>05-special.md,再写 Python权威源:../shanxia/crm/backend/ruoyi-modules/ruoyi-crm/。快照目录:docs/crm-migration/reference/java/。
按 ref-database-rules.md 规范:
docs/sql/backend/app/models/crm_models.py)crm_% 字典)创建 backend/app/schemas/crm/{module}.py:
Field(..., alias="camelCase") 实现命名转换backend/app/schemas/crm/product.py创建 backend/app/crud/crm/{module}.py:
_row_to_dict:ORM → camelCase dict(所有可读字段的单点真相)list_xxx:分页查询(租户隔离 + 软删除过滤 + create_time DESC)create_xxx:新增(UUID主键 + 编号生成 + 唯一校验 + 冗余字段写入)update_xxx:更新soft_delete_xxx:软删除(del_flag=1)backend/app/crud/crm/product.py在 backend/app/api/crm.py 中追加路由:
Depends(require_admin_or_super_admin) 认证| 操作 | 路径格式 | 示例 |
|---|---|---|
| 列表 | /web/crm/{module}/list |
POST,含 page/pageSize |
| 新增 | /web/crm/{module}/add |
POST |
| 编辑 | /web/crm/{module}/update |
POST |
| 删除 | /web/crm/{module}/delete |
POST |
| 详情 | /web/crm/{module}/detail |
POST |
| 下拉 | /web/crm/{module}/options |
POST |
| 导出 | /web/crm/{module}/export |
POST,返回 xlsx 流(非 JSON) |
| 导入模板 | /web/crm/{module}/importTemplate 或 /import-template |
POST,返回 xlsx 流 |
对齐 Java ExcelUtil.exportExcel + *Vo 的 @ExcelDictFormat:
backend/app/utils/crm_export_columns.py 增加 XXX_EXPORT_COLUMNS(ExportColumn(title, field, dict_type=...))。domain/vo/CrmXxxVo.java,逐字段核对 dictType(如线索 crm_clue_source、crm_clue_level)。export_rows_to_xlsx_response(db, tenant_no=..., columns=..., rows=..., filename_stem=...)。crm.py 内重复 openpyxl 表头/循环;禁止导出原始 dict code(除非该列 Java 也无 @ExcelDictFormat)。openpyxl 须在运行 venv 中安装(见 ref-lessons-learned.md §30)。参考实现:backend/app/utils/excel_export.py;已接入:线索/客户/产品/联系人/跟进/商机。
backend/app/tasks/ 中用 APScheduler 实现| 场景 | 处理方式 |
|---|---|
| 编号自动生成 | CRUD 层 create_xxx 中实现,参考 customer.py |
| 唯一性校验 | CRUD 层校验,del_flag=0 排除软删除 |
| 关联统计更新 | 新增/删除关联记录时同步更新主表 |
| 冗余字段写入 | create/update 时从主表获取写入 |
| 租户隔离 | 所有查询 WHERE 加 tenant_no |
| 数据权限 | 列表查询根据角色数据范围过滤 |
_row_to_dict 是所有可读字段的单点真相_row_to_dict 中可写字段一一对应formData 初始化必须包含 CreateBody 中的所有字段python scripts/check_field_consistency.py 验证crm_export_columns.py 声明列与 dict_type,并走 export_rows_to_xlsx_response完成后加载 step-05-verify.md。