CGL SCRM  /  modules

功能地图

17 个路由模块 / 199 条路由

功能地图

全系统的 199 个网址,按「归属哪个模块」归成 17 组。 一个模块就是一个源文件——哪个功能在哪个文件里,一眼能看到。

模块 网址数 这个模块管什么
app/routers/api/v1.py 36 给程序用的接口。老系统完全没有,这次新加的。 含对外开放接口
app/routers/manager/wechat.py 29 微信相关设置:服务号配置、菜单、素材、模板消息。
app/routers/manager/system.py 27 内容库与系统设置:文章、标签、字典、参数。
app/routers/manager/leads.py 17 线索池。谁在跟进、跟到哪一步、打了什么标签。
app/routers/manager/events.py 15 活动与报名。办一场活动、收报名、出二维码和海报。
app/routers/manager/surveys.py 12 问卷调研。建卷、改题、调选项、看答卷。
app/routers/manager/accounts.py 10 账号权限、流量来源、操作日志。
app/routers/video/h5.py 10 客户在手机上看到的页面:活动落地、报名、问卷、分享。
app/routers/manager/dashboard.py 8 后台首页那块看板,和各种统计图。
app/routers/video/qrcode.py 8 二维码图片直出。网址是老名字,故意保留。
app/routers/auth.py 6 登录、退出、改密码。
app/routers/wechat_callback.py 5 微信服务号把事件推过来的地方——客户扫码的归因就靠它。
app/main.py 4 整个程序的入口:装配好所有东西,定义体检地址。
app/routers/manager/audit.py 4 操作日志:谁在什么时候改了什么。老系统完全没有。
app/routers/manager/reports.py 4 报表与导出中心。
app/routers/mcp.py 3 给 AI 助手用的入口——AI 通过它直接读写系统。
app/routers/files.py 1 把二维码、海报这些文件读出来发给浏览器。

逐模块展开

点开任意一个模块,能看到它下面每一个网址的完整信息。

app/routers/api/v1.py 36 个网址 36 个开放接口

对外开放 API v1(原站完全没有的新功能)。

给程序用的接口。老系统完全没有,这次新加的。

方式 网址 处理函数 源码位置 这个网址干什么
GET /api/v1/events api_events api/v1.py:884 活动列表
GET /api/v1/events/{aid} api_event_detail api/v1.py:898 活动详情(含统计/表单字段/分享码)
GET /api/v1/events/{aid}/signups api_event_signups api/v1.py:953 报名名单
POST /api/v1/events/{aid}/signups api_event_signup api/v1.py:989 代客报名(写线索 + 评分 + 归因)
POST /api/v1/events/{aid}/signups/{sid}/audit api_audit_signup api/v1.py:1039 报名审核
POST /api/v1/events/{aid}/signups/{sid}/checkin api_checkin api/v1.py:1057 签到
GET /api/v1/health api_health api/v1.py:456 供 Aily / 监控探活。
GET /api/v1/leads api_leads api/v1.py:488 线索列表(分页 + 筛选)
GET /api/v1/leads/duplicates api_find_duplicates api/v1.py:787 查重(手机/邮箱/openid 三键)
GET /api/v1/leads/export.csv api_export_leads api/v1.py:801 导出线索 CSV。
POST /api/v1/leads/merge api_merge_leads api/v1.py:763 合并重复线索(新功能)
GET /api/v1/leads/{uid:int} api_lead_detail api/v1.py:517 线索详情(含标签/行为/备注/归因链)
POST /api/v1/leads/{uid:int}/behaviors api_add_behavior api/v1.py:605 写入线索行为(自动参与评分)
POST /api/v1/leads/{uid:int}/remark api_add_remark api/v1.py:708 追加跟进备注
POST /api/v1/leads/{uid:int}/status api_set_status api/v1.py:660 变更线索状态
POST /api/v1/leads/{uid:int}/tags api_set_tags api/v1.py:729 打标签 / 取消标签
GET /api/v1/meta/scopes api_scopes api/v1.py:474 列出可用 scope
GET /api/v1/qrcodes api_qrcodes api/v1.py:1235 二维码台账(新功能:原站不落档、不可统计)
POST /api/v1/qrcodes/event api_qrcode_event api/v1.py:1245 生成活动带参二维码
GET /api/v1/qrcodes/preview.png api_qrcode_preview api/v1.py:1338 内网演示 / 联调用:本地生成 PNG 直出,不产生微信归因。
POST /api/v1/qrcodes/survey api_qrcode_survey api/v1.py:1301 生成问卷带参二维码
GET /api/v1/stats/behaviors api_stats_behaviors api/v1.py:1380 行为分布
GET /api/v1/stats/channels api_stats_channels api/v1.py:1390 渠道分布
GET /api/v1/stats/funnel api_stats_funnel api/v1.py:1372 状态漏斗
GET /api/v1/stats/leaderboard api_stats_leaderboard api/v1.py:1399 顾问业绩榜 + 活动/问卷排行
GET /api/v1/stats/overview api_stats_overview api/v1.py:1354 总览指标(含环比)
GET /api/v1/stats/recent-leads api_stats_recent api/v1.py:1422 最新线索(供大屏轮播)
GET /api/v1/stats/today api_stats_today api/v1.py:1414 今日快照
GET /api/v1/stats/trend api_stats_trend api/v1.py:1363 新增线索 / 报名 / 答卷 趋势
GET /api/v1/surveys api_surveys api/v1.py:1088 问卷列表
GET /api/v1/surveys/{qid}/answers api_survey_answers api/v1.py:1195 答卷列表
POST /api/v1/surveys/{qid}/answers api_survey_answer api/v1.py:1147 提交答卷(自动评分并落线索)
GET /api/v1/surveys/{qid}/schema api_survey_schema api/v1.py:1124 问卷结构(供 H5 / 外部表单渲染)
GET /api/v1/tokens api_tokens api/v1.py:1536 Token 列表(含归属人与签发人)
POST /api/v1/tokens api_token_create api/v1.py:1544 按人签发。
DELETE /api/v1/tokens/{tid} api_token_revoke api/v1.py:1652 停用 Token(软停,记录保留)
app/routers/manager/wechat.py 29 个网址

后台 · 微信模块。

微信相关设置:服务号配置、菜单、素材、模板消息。

方式 网址 处理函数 源码位置 这个网址干什么
GET /manager/Sendmanage/replyauto autoreply_list manager/wechat.py:462 —
POST /manager/Sendmanage/replyauto_save autoreply_save manager/wechat.py:469 —
POST /manager/System/webhook_save webhook_save manager/wechat.py:573 —
POST /manager/System/webhook_test webhook_test manager/wechat.py:616 —
GET /manager/System/webhooks webhook_list manager/wechat.py:554 —
GET /manager/TemplateMsg/template_sendlist template_list manager/wechat.py:502 —
POST /manager/TemplateMsg/template_sync template_sync manager/wechat.py:510 拉取线上模板消息列表(只读)。实测线上有 11 条。
GET /manager/WechatPost/addPost poster_new manager/wechat.py:102 新建海报模板页(复刻原站 addPost 表单:底图 + 偏移 + 尺寸)。
POST /manager/WechatPost/ajax_addposter poster_save manager/wechat.py:116 保存海报模板 —— 字段名与原站 ajax_addposter 完全一致。
POST /manager/WechatPost/deleteoneposter poster_delete manager/wechat.py:228 —
GET /manager/WechatPost/followers follower_list manager/wechat.py:279 粉丝列表(含扫码归因字段 —— 这是归因链的源头)。
POST /manager/WechatPost/material_sync material_sync manager/wechat.py:439 同步素材统计(只读)。原站 6474 图片 / 444 图文 / 29 视频。
GET /manager/WechatPost/materials material_list manager/wechat.py:407 —
GET /manager/WechatPost/menu menu_list manager/wechat.py:354 —
POST /manager/WechatPost/menu_sync menu_sync manager/wechat.py:361 从微信拉取线上菜单并落库(只读,不改线上)。
GET /manager/WechatPost/overview wechat_overview manager/wechat.py:249 微信模块总览:配置状态 + 接口能力 + 最近事件 + 粉丝/二维码统计。
POST /manager/WechatPost/preview poster_preview manager/wechat.py:164 实时预览:按给定坐标把二维码叠到底图/品牌底图上,返回 PNG(不落库)。
GET /manager/WechatPost/qrcodes qrcode_list manager/wechat.py:313 —
GET /manager/WechatPost/wechatpost_list poster_list manager/wechat.py:72 —
GET /manager/webhooks webhook_list manager/wechat.py:554 —
GET /manager/wechat wechat_overview manager/wechat.py:249 微信模块总览:配置状态 + 接口能力 + 最近事件 + 粉丝/二维码统计。
GET /manager/wechat/autoreply autoreply_list manager/wechat.py:462 —
GET /manager/wechat/followers follower_list manager/wechat.py:279 粉丝列表(含扫码归因字段 —— 这是归因链的源头)。
GET /manager/wechat/materials material_list manager/wechat.py:407 —
GET /manager/wechat/menu menu_list manager/wechat.py:354 —
GET /manager/wechat/posters poster_list manager/wechat.py:72 —
GET /manager/wechat/posters/new poster_new manager/wechat.py:102 新建海报模板页(复刻原站 addPost 表单:底图 + 偏移 + 尺寸)。
GET /manager/wechat/qrcodes qrcode_list manager/wechat.py:313 —
GET /manager/wechat/templates template_list manager/wechat.py:502 —
app/routers/manager/system.py 27 个网址

后台 · 内容与系统设置 —— 覆盖原站剩余模块。

内容库与系统设置:文章、标签、字典、参数。

方式 网址 处理函数 源码位置 这个网址干什么
GET /manager/ContentSet/content_management content_list manager/system.py:120 —
GET /manager/ContentSet/receptionset reception_set manager/system.py:159 —
GET /manager/Email_Campaign/newsend_maillist campaign_list manager/system.py:356 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。
GET /manager/GroupTemplate/grouptemplist group_template_list manager/system.py:348 —
GET /manager/Interactive/interlist interactive_list manager/system.py:325 —
GET /manager/Message_Send/message_sendlist campaign_list manager/system.py:356 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。
POST /manager/Score/rescore_all rescore_all manager/system.py:261 按新规则批量重算全部线索评分(后台任务,取前 N 条避免阻塞)。
POST /manager/Score/rule_save rule_save manager/system.py:220 —
GET /manager/Score/scorebehavior score_rules manager/system.py:207 —
GET /manager/Send_ElectronicMail/send_maillist campaign_list manager/system.py:356 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。
GET /manager/System/s_systemlist system_list manager/system.py:55 系统设置:读环境变量 + 数据库覆盖项 + 运行状态自检。
POST /manager/System/setting_save setting_save manager/system.py:88 —
GET /manager/Tag/eventtagsmart tag_list manager/system.py:165 —
POST /manager/Tag/tag_save tag_save manager/system.py:172 —
GET /manager/TemplateMsg/group_template group_template_list manager/system.py:348 —
GET /manager/WebSite/w_websitelist website_list manager/system.py:288 —
GET /manager/articles article_list manager/system.py:294 —
GET /manager/campaigns campaign_list manager/system.py:356 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。
GET /manager/content content_list manager/system.py:120 —
GET /manager/inquiries inquiry_list manager/system.py:397 —
GET /manager/inquiry/inquirylist inquiry_list manager/system.py:397 —
GET /manager/scores score_rules manager/system.py:207 —
GET /manager/system system_list manager/system.py:55 系统设置:读环境变量 + 数据库覆盖项 + 运行状态自检。
GET /manager/tags tag_list manager/system.py:165 —
GET /manager/tribune/dis_articlelist article_list manager/system.py:294 —
GET /manager/workFlow/wk_tasklist workflow_list manager/system.py:333 —
GET /manager/workflows workflow_list manager/system.py:333 —
app/routers/manager/leads.py 17 个网址

后台 · 线索池(潜客)—— MVR 核心模块。

线索池。谁在跟进、跟到哪一步、打了什么标签。

方式 网址 处理函数 源码位置 这个网址干什么
GET /manager/Leadsfunnel/leadlist lead_list manager/leads.py:84 线索列表。保留原站全部 s_* 筛选参数。
GET /manager/UserGrouping/ug_ungroupedlist ungrouped manager/leads.py:165 未分组用户(原站同名页)。
GET /manager/leads lead_list manager/leads.py:84 线索列表。保留原站全部 s_* 筛选参数。
GET /manager/leads/export export_leads manager/leads.py:521 导出线索。表头与原站 32 列一致(EXPORTABLE_FIELDS)。
GET /manager/leads/{uid:int} lead_detail manager/leads.py:193 线索详情:基本资料 + 行为时间线 + 归因 + 备注 + 标签(路径式 URL)。
POST /manager/register/ai_score ai_score manager/leads.py:471 对单条线索触发一次 AI 评分(原站完全没有这个能力)。
POST /manager/register/assign assign manager/leads.py:358 线索分配(原站无独立分配记录,本系统记 lead_assignment)。
POST /manager/register/delete delete_lead manager/leads.py:427 删除线索。默认软删(原站是物理删除,本系统改为可恢复)。
GET /manager/register/export export_leads manager/leads.py:521 导出线索。表头与原站 32 列一致(EXPORTABLE_FIELDS)。
GET /manager/register/export_fields export_fields_meta manager/leads.py:568 可选导出字段元数据(供前端勾选列)。
POST /manager/register/merge merge manager/leads.py:402 —
GET /manager/register/register_detail lead_detail_by_query manager/leads.py:208 线索详情(查询式 URL:/manager/register/register_detail?uid=)。见上一条说明。
GET /manager/register/registerlist lead_list manager/leads.py:84 线索列表。保留原站全部 s_* 筛选参数。
POST /manager/register/remark add_remark manager/leads.py:292 —
POST /manager/register/rescore rescore manager/leads.py:461 —
POST /manager/register/set_status set_status manager/leads.py:266 —
POST /manager/register/tags set_tags manager/leads.py:331 —
app/routers/manager/events.py 15 个网址

后台 · 活动与报名 —— MVR 核心模块(M3 报名 + M4 二维码海报工厂)。

活动与报名。办一场活动、收报名、出二维码和海报。

方式 网址 处理函数 源码位置 这个网址干什么
GET /manager/CustomMeeting/ctm_meetlist meeting_list manager/events.py:486 —
GET /manager/N_Event/a_event_detail event_detail_by_query manager/events.py:120 活动详情(查询式 URL:/manager/N_Event/a_event_detail?aid=)。见上一条说明。
POST /manager/N_Event/a_event_save event_save manager/events.py:157 —
GET /manager/N_Event/a_eventlist event_list manager/events.py:79 —
POST /manager/N_Event/gen_all_posters gen_all_posters manager/events.py:357 一键为全部已有分享码的顾问合成海报。
POST /manager/N_Event/gen_poster gen_poster manager/events.py:279 为单个顾问合成品牌海报(复刻 WechatPost 的服务端合成)。
POST /manager/N_Event/gen_share_qr gen_share_qr manager/events.py:225 为指定顾问(或全部活跃顾问)生成带参二维码。
GET /manager/N_Event/share_preview share_preview manager/events.py:337 顾问分享页(二维码矩阵)—— 与原站 a_event_share_er 同构。
POST /manager/N_Event/signup_audit signup_audit manager/events.py:406 —
POST /manager/N_Event/signup_checkin signup_checkin manager/events.py:428 —
GET /manager/N_Event/signups_export signups_export manager/events.py:446 导出某活动的报名名单。
GET /manager/event/eventlist event_list manager/events.py:79 —
GET /manager/events event_list manager/events.py:79 —
GET /manager/events/{aid} event_detail manager/events.py:105 活动详情(路径式 URL /manager/events/{aid})。
GET /manager/meetings meeting_list manager/events.py:486 —
app/routers/manager/surveys.py 12 个网址

后台 · 问卷调研 —— 对话式建卷 / 改题 / 选项调节。

问卷调研。建卷、改题、调选项、看答卷。

方式 网址 处理函数 源码位置 这个网址干什么
POST /manager/Surveyqst/add_question add_question manager/surveys.py:197 加题。选项用换行分隔,选项分值用逗号分隔(对话式建卷的落点)。
GET /manager/Surveyqst/answers survey_answers manager/surveys.py:323 某问卷的答卷列表。
GET /manager/Surveyqst/answers_export answers_export manager/surveys.py:363 —
POST /manager/Surveyqst/clone clone_survey manager/surveys.py:302 —
POST /manager/Surveyqst/del_question del_question manager/surveys.py:247 —
GET /manager/Surveyqst/schema.json schema_json manager/surveys.py:397 问卷结构 JSON(前后端契约,含原站 overall/surveyattr 两字段)。
POST /manager/Surveyqst/set_options set_options manager/surveys.py:266 整组替换选项 —— 「选项调节通过对话直接设置」的落点。
GET /manager/Surveyqst/survey_qstcreate_edit survey_edit_by_query manager/surveys.py:106 问卷编辑(查询式 URL:/manager/Surveyqst/survey_qstcreate_edit?qid=)。见上一条说明。
GET /manager/Surveyqst/survey_qstlist survey_list manager/surveys.py:49 —
POST /manager/Surveyqst/survey_save survey_save manager/surveys.py:143 建卷 / 改卷。表单字段名对齐原站 overall[...] 的子键名。
GET /manager/surveys survey_list manager/surveys.py:49 —
GET /manager/surveys/{qid} survey_edit manager/surveys.py:91 问卷编辑(路径式 URL /manager/surveys/{qid})。
app/routers/manager/accounts.py 10 个网址

后台 · 账号权限、流量溯源与审计。

账号权限、流量来源、操作日志。

方式 网址 处理函数 源码位置 这个网址干什么
POST /manager/Power/account_save account_save manager/accounts.py:102 新建/编辑账号。仅管理员可操作。
POST /manager/Power/kick_session kick_session manager/accounts.py:170 踢出会话(原站会话不落库,无此能力)。
GET /manager/Power/powerlist account_list manager/accounts.py:46 —
GET /manager/accounts account_list manager/accounts.py:46 —
GET /manager/business/ipc2b ipc2b manager/accounts.py:289 IPC2B 业务勾兑(原站同名页)。
GET /manager/power/businessiplist power_center manager/accounts.py:189 权限中心:角色 × 权限矩阵。
GET /manager/power/center power_center manager/accounts.py:189 权限中心:角色 × 权限矩阵。
GET /manager/power/traffic traffic_list manager/accounts.py:205 流量溯源(原站 /manager/power/businessiplist,61 条)。
GET /manager/profile profile manager/accounts.py:307 —
GET /manager/traffic traffic_list manager/accounts.py:205 流量溯源(原站 /manager/power/businessiplist,61 条)。
app/routers/video/h5.py 10 个网址

前台 H5 获客链路 —— 对齐原站路径。

客户在手机上看到的页面:活动落地、报名、问卷、分享。

方式 网址 处理函数 源码位置 这个网址干什么
GET /video/A_Event/a_event event_landing video/h5.py:115 活动报名落地页。
GET /video/A_Event/a_event_new event_landing video/h5.py:115 活动报名落地页。
GET /video/A_Event/a_event_share_er event_share_page video/h5.py:289 顾问分享页 —— 原站就是从这里拿到二维码矩阵(技能里逆向出的真入口)。
POST /video/A_Event/a_event_signup event_signup_submit video/h5.py:191 提交报名。表单字段名与原站一致(name/mobile/company/jobtitle/corpemail)。
GET /video/A_Event/signup_done signup_done video/h5.py:271 —
GET /video/Questnaire/done survey_done video/h5.py:474 —
GET /video/Questnaire/index survey_page video/h5.py:327 —
GET /video/Questnaire/questionnaire survey_page video/h5.py:327 —
POST /video/Questnaire/submit survey_submit video/h5.py:374 —
GET /video/Questnaire/survey survey_page video/h5.py:327 —
app/routers/manager/dashboard.py 8 个网址

后台 · 首页看板与平台统计。

后台首页那块看板,和各种统计图。

方式 网址 处理函数 源码位置 这个网址干什么
GET /manager dashboard manager/dashboard.py:29 首页看板。原站路径 /manager/Dashboard/statisticall。
GET /manager/ dashboard manager/dashboard.py:29 首页看板。原站路径 /manager/Dashboard/statisticall。
GET /manager/ChartStatictical/chart_staticall chart_statistical manager/dashboard.py:64 平台统计(趋势 + 构成)。
GET /manager/Dashboard/statisticall dashboard manager/dashboard.py:29 首页看板。原站路径 /manager/Dashboard/statisticall。
GET /manager/dashboard dashboard manager/dashboard.py:29 首页看板。原站路径 /manager/Dashboard/statisticall。
GET /manager/health/summary health_summary manager/dashboard.py:101 系统健康摘要(JSON,供前端轮询)。
GET /manager/reports/attribution attribution_report manager/dashboard.py:85 归因报表(新功能)——扫码漏斗 + 顾问榜 + 活动归因。
GET /manager/reports/charts chart_statistical manager/dashboard.py:64 平台统计(趋势 + 构成)。
app/routers/video/qrcode.py 8 个网址

二维码直出 —— 对齐原站的公开路径。

二维码图片直出。网址是老名字,故意保留。

方式 网址 处理函数 源码位置 这个网址干什么
GET /Botch_qrcode/New_aevent/{aid:int}/{mid:int} event_qr video/qrcode.py:108 活动 × 顾问 的二维码直出(原站同名路径,匿名可访问)。
GET /Botch_qrcode/New_aevent/{aid}/{mid}.jpg event_qr video/qrcode.py:108 活动 × 顾问 的二维码直出(原站同名路径,匿名可访问)。
GET /Botch_qrcode/survey/{qid:int}/{mid:int} survey_qr video/qrcode.py:161 问卷 × 顾问 的二维码直出。语义与 event_qr 一致(必须走微信带参码), 差异只有 scene_str 里带的是 survey_id 而不是 activity_id。见 event_qr 的注释。
GET /Botch_qrcode/survey/{qid}/{mid}.jpg survey_qr video/qrcode.py:161 问卷 × 顾问 的二维码直出。语义与 event_qr 一致(必须走微信带参码), 差异只有 scene_str 里带的是 survey_id 而不是 activity_id。见 event_qr 的注释。
GET /Botch_qrcode/url.png url_qr video/qrcode.py:188 任意 URL 直出二维码(新功能)。
POST /manager/N_Event/beautify_qr_code beautify_qr video/qrcode.py:295 二维码美化(内嵌 Logo)—— 与原站同名路径,接收 image 字节流或 aid/mid。
GET /manager/N_Event/pack_download pack_download video/qrcode.py:245 批量二维码(可含海报)ZIP 下载 —— 与原站同名路径。
GET /qr/preview/{biz}/{biz_id} preview video/qrcode.py:202 二维码预览页(带下载/复制按钮,运营用)。
app/routers/auth.py 6 个网址

认证路由 —— 登录 / 登出 / 修改密码。

登录、退出、改密码。

方式 网址 处理函数 源码位置 这个网址干什么
POST /Manager/Common/newlogin login_submit auth.py:51 路径与字段名刻意复刻原站,方便老脚本/老前端平移。
GET /manager/login login_page auth.py:44 —
POST /manager/login login_post auth.py:63 —
GET /manager/logout logout auth.py:169 —
POST /manager/logout logout auth.py:169 —
POST /manager/password change_password auth.py:195 —
app/routers/wechat_callback.py 5 个网址

微信服务号事件回调 —— 扫码归因的入口(原站路径 /video/index/index)。

微信服务号把事件推过来的地方——客户扫码的归因就靠它。

方式 网址 处理函数 源码位置 这个网址干什么
GET /video/index/index wechat_verify wechat_callback.py:90 /video/index/index 的 GET —— 一条路径两种用途,按参数分流。
POST /video/index/index wechat_event wechat_callback.py:119 —
GET /wechat wechat_verify wechat_callback.py:90 /video/index/index 的 GET —— 一条路径两种用途,按参数分流。
POST /wechat wechat_event wechat_callback.py:119 —
GET /wechat/health wechat_health wechat_callback.py:259 回调链路自检(运维用,不暴露敏感值)。
app/main.py 4 个网址

CGL SCRM —— 应用入口。

整个程序的入口:装配好所有东西,定义体检地址。

方式 网址 处理函数 源码位置 这个网址干什么
GET / root app/main.py:395 —
GET /favicon.ico favicon app/main.py:402 —
GET /healthz healthz app/main.py:313 —
GET /readyz readyz app/main.py:330 —
app/routers/manager/audit.py 4 个网址

后台 · 操作审计 —— 原站完全缺失的能力。

操作日志:谁在什么时候改了什么。老系统完全没有。

方式 网址 处理函数 源码位置 这个网址干什么
GET /manager/System/audit_export audit_export manager/audit.py:85 —
GET /manager/System/audit_log audit_view manager/audit.py:38 操作审计日志(新功能)。
GET /manager/audit audit_view manager/audit.py:38 操作审计日志(新功能)。
GET /manager/audit/target audit_target manager/audit.py:114 某个对象的操作时间线。
app/routers/manager/reports.py 4 个网址

后台 · 报表与导出中心。

报表与导出中心。

方式 网址 处理函数 源码位置 这个网址干什么
GET /manager/reports reports_home manager/reports.py:29 报表中心首页。
GET /manager/reports/api.json reports_json manager/reports.py:115 报表数据 JSON(供前端图表复用)。
GET /manager/reports/attribution_export attribution_export manager/reports.py:131 归因明细导出(每条扫码事件的解析结果)。
GET /manager/reports/summary_export summary_export manager/reports.py:48 汇总报表导出(多 sheet CSV → 单 CSV,含 5 个板块)。
app/routers/mcp.py 3 个网址

MCP(Model Context Protocol)服务端 —— 让 WorkBuddy / 豆包 / Claude 直接对话 CGL SCRM。

给 AI 助手用的入口——AI 通过它直接读写系统。

方式 网址 处理函数 源码位置 这个网址干什么
DELETE /mcp mcp_delete mcp.py:783 会话终止。无状态实现无需清理,回 204 让客户端收尾干净。
GET /mcp mcp_get mcp.py:773 规范里 GET 是「服务端主动推送流」。我们不做推送,明确 405,别让客户端挂住。
POST /mcp mcp_post mcp.py:711 MCP Streamable HTTP 端点。
app/routers/files.py 1 个网址

文件出站:把台账里的资产从当前后端读出来吐给浏览器。

把二维码、海报这些文件读出来发给浏览器。

方式 网址 处理函数 源码位置 这个网址干什么
GET /files/{key:path} serve_file files.py:90 按 key 出图。匿名可访问 —— 与原有的静态目录语义一致。

服务层有什么(业务逻辑在哪)

上面那些网址只是「入口」。真正的规则写在 app/services/ 下的 15 个模块里。

app/services/ai_scoring.py 8 个功能点 661 行

线索 AI 智能评分服务。

功能说明源码行
resolve_config 从全局配置读取 LLM 连接参数;不可用时返回 None(并记录原因)。 130
is_available 外部(脚本/集成方)判断当前是否具备 AI 打分能力。 165
build_profile 把一条 Lead 的真实字段整理成给模型看的画像字典。 196
normalize 把模型给的 dict 规范化为 ScoringResult。 371
evaluate_profile 对画像字典打分。任何异常都被吞掉并记日志,失败返回 None。 553
score_lead 对一条 Lead 打分(便捷封装)。失败返回 None,不写库。 613
persist_result 把打分结果写到线索的 AI 字段上(不 commit,由调用方控制事务)。 626
score_and_store 打分 + 落库(便捷封装)。 639
app/services/attribution_match.py 7 个功能点 802 行

顾问归因匹配引擎 —— 把 lead 的自由文本「顾问名」映射回 manager_user。

功能说明源码行
to_half_width 全角 → 半角。 246
normalize_key 归一化成一个用于「判等」的 key。 267
strip_role_suffix 剥掉尾部的职位/称谓后缀,并去掉括号备注。 285
split_candidates 把复合串拆成多个候选。 306
classify_non_person 判断候选串是否不可能是人名,返回 (是否非人名, 原因)。 346
build_consultants 把 manager_user 行(ORM 对象或 dict)投影成 ConsultantInfo。 755
load_aliases 读取人工别名表 JSON({"别名": manager_id | 姓名 | 顾问号})。 782
app/services/attribution_service.py 12 个功能点 749 行

扫码归因服务 —— 「替代 iSupport」的技术核心。

功能说明源码行
strip_qrscene 去掉 qrscene_ 前缀,得到纯场景值。 93
parse_scene_str 解析场景值,兼容三种写法。 99
build_scene_str 按 iSupport 的 12 段格式构造 scene_str。 162
record_raw_event 写原始事件流水(无论是否解析出归因)。 239
handle_event 处理 subscribe / SCAN 事件,落归因流水并回填线索。 277
resolve_consultant 按场景值里的顾问号取顾问账号(两段式,顺序不可交换)。 399
apply_attribution_to_lead 把解析出的归因写到线索上。 453
timeline 某线索的归因时间线。 558
funnel 归因漏斗(新功能):扫码 → 关注 → 留资 → 有效线索。 586
consultant_ranking 顾问归因排行(新功能):谁带来的扫码 / 线索最多。 624
activity_attribution 活动归因汇总(新功能):哪个活动带来的线索最多。 682
backfill_unmatched 把「先关注后报名」的悬空归因事件补挂到线索上。 722
app/services/audit_service.py 7 个功能点 216 行

审计服务 —— 全量操作留痕。

功能说明源码行
redact 递归脱敏。 34
record — 57
diff 只留变化字段,避免审计表被全量快照撑爆。 103
query — 114
timeline_of — 163
export — 174
purge 按保留期清理(默认一年)。 203
app/services/event_service.py 18 个功能点 710 行

活动服务 —— 活动 CRUD / 报名(含归因)/ 审核 / 签到 / 二维码与海报工厂。

功能说明源码行
normalize_audit 把任何历史表示收敛成 '0'/'1'/'2'。 57
audit_int audit_status → API 契约用的整数 0/1/2。 66
create_event — 104
get_by_slug — 136
list_events — 142
public_events 前台/H5 可见的活动列表(已发布且未结束)。 161
reject_reason 报名准入判据。返回 None 表示可以报名,否则返回拒绝原因。 249
signup 报名。重复报名默认拒绝(同 aid + mobile 唯一)。 273
audit_signup — 352
checkin — 367
signups_of — 394
ensure_share — 417
generate_share_qr 为一条分享记录生成 原始码 + 美化码(内嵌 CGL Logo)。 458
shares_of — 514
resolve_event 按 aid 取活动:先当内部主键,找不到再回退 legacy_aid(原站 aid)。 522
build_poster_zip 批量出码(可选含海报),打包成 ZIP。 569
stats — 687
fields_of — 707
app/services/lead_service.py 26 个功能点 884 行

线索服务 —— 潜客池的核心领域逻辑。

功能说明源码行
build_conditions 把 LeadFilters 翻成 SQLAlchemy 条件列表。 207
distinct_options 取某个 s_* 下拉在本库现有数据里出现过的值(升序)。 305
search_select_options SEARCH_SELECT_FIELDS 全部 15 个下拉的 {值: 文案}。 324
query_leads 返回 (当前页线索, 总数)。 338
find_duplicates 按 手机 / 邮箱 / openid 三键查重(任一命中即返回)。 382
normalize_email — 403
normalize_mobile — 407
compute_dedup_key 行为去重键:同一线索对同一目标重复触发只算一次分。 411
merge_leads 把 merged_ids 并入 primary。保留最早注册时间、最全字段、累加行为分。 417
grade_of — 503
rule_grade 规则分该写进 ai_grade 的等级;AI 已评过就返回 None(不要覆盖)。 510
add_behavior 记录一次行为并累加评分。dedup=True 时同一 dedup_key 只计一次。 531
rescore 按 score_rule 表重算总分(后台改了分值规则后调用)。 595
set_status 状态流转。合法值见 LeadsStatus(1 未跟进 / 2 已拒绝 / 4 跟进中 / 6 转化成功 / 7 无效线索)。 626
attach_tags — 663
detach_tag — 680
tags_of — 691
remarks_of 读取某条线索的跟进备注。 700
add_remark 新增跟进备注。 722
export_rows 返回 (表头, 数据行)。表头顺序 = 原站 EXPORTABLE_FIELDS。 761
export_csv — 786
export_xlsx — 799
status_counts — 835
grade_counts — 847
top_industries — 856
behavior_summary — 867
app/services/objstore.py 1 个功能点 248 行

S3 兼容对象存储客户端(零依赖,只用 httpx + 标准库)。

功能说明源码行
list_buckets 列出账号下的桶(用于确认 bucket 名)。 232
app/services/poster_service.py 7 个功能点 460 行

海报合成服务 —— 1:1 复刻 iSupport「微信海报 WechatPost」的服务端合成行为。

功能说明源码行
resolve_font_path 返回实际会被用上的那个字体文件;返回 None 表示只能用 PIL 位图字体。 62
reset_font_cache — 102
compose 按坐标把二维码叠到底图上,返回成品。 202
compose_from_bytes 字节进 / 字节出,供 HTTP 层直接调用。 296
brand_poster 生成一张 CGL 品牌底图(无需外部素材)。 354
hero_default_qr_box 返回 brand_poster 里预留给二维码的左上角坐标(与白卡对齐)。 432
build_brand_poster 一步到位:品牌底图 + 二维码 → PNG。 438
app/services/qrcode_service.py 15 个功能点 476 行

二维码服务 —— 对齐 iSupport 的三条通路 + 本地生成兜底。

功能说明源码行
invite_url 活动邀请落地页 URL(二维码编码的目标)。 64
survey_url 问卷作答页 URL(二维码编码的目标)。 74
original_qr_path 原站的单码路径(保持兼容,便于老链接继续可用)。 88
is_seed_ticket — 109
count_seed_tickets 统计台账里 dev 种子码的行数(生产期望恒为 0)。 113
generate_local — 151
generate_local_bytes — 158
beautify 在二维码中心叠加 CGL Logo。 193
create_wechat_qr 创建微信带参二维码并取图。 239
create_for_event 为活动 × 顾问 生成带参二维码,并落 wechat_qrcode 台账。 267
create_for_survey 为问卷 × 顾问 生成带参二维码。 319
pack_zip 把多张二维码打成 ZIP。 379
read_zip_names 读 ZIP 内文件名(自动处理原站的 GBK 名)。 397
generate_for_url 本地生成二维码(不依赖微信)。用于测试 / 内网演示。 418
qr_stats 二维码台账概览(新功能:原站二维码即时生成、不留档,无法统计)。 455
app/services/stats_service.py 10 个功能点 325 行

看板统计服务 —— 实时聚合(原站没有这块,属新功能)。

功能说明源码行
overview 顶部指标卡。 26
lead_trend 按天的新增线索 / 报名 / 关注趋势。 76
status_funnel 线索状态分布(原站 leadsstatus 为 1/2/4/6/7,非连续)。 114
behavior_breakdown — 132
channel_breakdown 渠道对比:新增线索 / 报名 / 高分线索。 147
consultant_leaderboard 顾问榜:新客 / 报名 / 高分客。 177
event_ranking — 219
survey_ranking — 242
today_snapshot 今日实时(供首页)。 262
recent_leads — 303
app/services/storage_service.py 18 个功能点 451 行

统一文件存储服务:本机磁盘 / 腾讯云 COS / Cloudflare R2。

功能说明源码行
sha256_bytes — 55
sha256_file — 59
guess_content_type — 67
backend 当前生效的后端名(同时写进 file_asset.storage)。 85
reset_client 测试用:丢弃缓存的客户端(改了配置后必须调用)。 139
public_url 文件对外的可访问 URL(会被写进数据库,必须长期有效)。 150
save_bytes 保存字节并登记台账。dedup=True 时相同内容只落一份(靠 sha256 命中)。 166
save_text — 235
copy_in — 239
abs_path_of 仅本地后端可用。对象存储没有本地路径 —— 用 :func:read_asset。 264
resolve_local 把「表里存的相对路径」还原成绝对路径(只对本地后端有意义)。 271
read_stored 按「先本地、后对象存储」读一个已存路径的内容;读不到返回 None。 289
read_asset 读台账里的资产内容(后端无关)。 331
exists — 336
delete_asset 删除文件。默认只减引用计数,计数归零才真正删物理文件。 374
cleanup_orphans 回收引用计数为 0 的孤儿文件。 384
usage 存储用量概览。本地走文件系统统计,对象存储以台账为准 (列桶要遍历全部对象,.env 里的 R2 密钥可能连 ListBucket 都没有权限, 真去调和台账的差异属于运维巡检,不该由业务接口承担)。 415
reset_root 测试用:清空本地存储。 446
app/services/survey_service.py 15 个功能点 641 行

问卷构建服务 —— 对话式建卷 / 改题 / 删题。

功能说明源码行
create_survey — 149
assert_mutable — 174
update_survey — 182
delete_survey — 196
clone_survey 复制问卷(含全部题目与选项)。原站无此能力,属新功能。 214
add_question — 324
make_contact_module 建「联系人组件」(asstype=1)—— 每题卷限一个。 389
list_questions — 436
options_of — 446
update_question — 454
delete_question — 473
replace_options 整组替换选项 —— 对应「问卷的选项调节都可以通过对话直接设置」。 486
reorder — 543
render_schema 把问卷渲染成前端可用的 JSON(供 H5 作答页)。 557
score_answer 按题目/选项分值算分。返回 (总分, {question_id: 得分})。 618
app/services/webhook_service.py 10 个功能点 296 行

Webhook 服务 —— 把系统内事件实时推给外部(飞书 / 企微 / 自建 CRM / Aily)。

功能说明源码行
sign — 72
verify — 79
active_endpoints — 95
payload_envelope — 111
deliver_one — 128
dispatch 向所有订阅该事件的端点投递。失败按 retry 次数重试(退避)。 194
retry_delivery 手动重投一条失败记录(同步版,供后台按钮用)。 224
delivery_stats — 259
mask_endpoint — 288
now_iso — 295
app/services/wechat_crypto.py 6 个功能点 201 行

微信消息加解密(兼容模式 / 安全模式)。

功能说明源码行
calc_signature 微信服务器校验签名。 33
check_signature — 39
encrypt_message AES 加密,返回 base64 密文。 74
decrypt_message AES 解密,返回 (明文, appid)。 84
build_encrypted_reply 构造安全模式下的加密回复报文。 120
open_message 把「可能是明文、也可能是密文」的报文统一解成明文 XML。 154
app/services/wechat_service.py 2 个功能点 479 行

微信服务号 API 客户端(服务层)。

功能说明源码行
get_client — 470
reset_client — 477