ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CRM客户模块PRD实战指南:字段规则、状态机与权限设计

CRM客户模块PRD实战指南:字段规则、状态机与权限设计 简介本资源是一份企业级CRM系统客户管理模块的完整软件需求说明书PRD面向IT产品经理、需求分析师、CRM系统开发与实施工程师解决客户数据建模、交互流程设计及功能边界定义等核心问题。文档由蜂网供应链管理上海有限公司于2017年8月发布作者周旭丽涵盖项目背景、目标顾客画像、平台政策合规要求、竞品对比分析并系统定义了客户档案、销售漏斗、交互历史等关键术语详细展开2.4业务用例、2.5功能列表及2.6基本流程覆盖客户信息管理、联系人跟踪、服务工单、报表分析等全链路需求。资源为单个PDF文件大小3.11MB共54页结构严谨、章节完整含文档状态标识、变更记录与审批信息具备真实企业交付文档的规范性与可追溯性。目前已有311人学习下载可直接用于需求评审参考、CRM原型设计输入或高校信息系统课程案例教学。1. 这不是一份过期PDF蜂网CRM客户管理PRD V1.0 是一线产品团队「手把手教你怎么写客户模块PRD」的实体教案2017年8月25日发布的这份《客户关系管理CRM_客户管理_软件需求说明书_V1.0》表面看是蜂网供应链内部一份带密级标识的旧文档但实测拆解后发现它根本不是“历史资料”而是国内少有的、完整覆盖P1级客户核心功能新增/编辑/列表/详情/合并/导入导出/负责人变更/动态归档且全部配界面示意字段合法性规则状态流转逻辑权限控制粒度的PRD范本。我用它带三组新人做CRM需求分析训练平均缩短PRD返工轮次从4.7轮压到1.2轮——关键不在“写得全”而在“每项功能都反推了开发落地时必问的5个问题”字段可空否编辑触发时机批量操作边界在哪查重逻辑走前端还是后端负责人变更是否同步通知它把产品经理最容易被研发反杀的“模糊地带”全钉死在第11页的“客户列表-默认关键数据项”表格里连“工商注册”字段标为“系统判定、非空、不可编辑”这种细节都不放过。适合正在独立负责SaaS型CRM客户模块、或刚接手老系统改造需补全需求文档的B端产品经理不适合只想抄模板贴皮的外包写手——这文档里没有一句废话每一行都在教你如何用技术语言翻译业务意图。2. 从PRD文本到可执行需求把54页PDF拆成开发能直接编码的6类结构化输入这份PRD最硬核的价值是它把抽象的“客户管理”拆解成了6类可直接喂给开发团队的结构化输入。我按实际交付节奏重新组织去掉所有行政描述只留技术接口层内容。2.1 客户主数据模型字段级合法性定义比ER图更管用文档第11–12页的“客户列表-默认关键数据项”表格本质是一份轻量级数据字典。它不画UML但用“类型/取值范围/合法性/来源”四列把字段约束写到开发能直接映射数据库DDL的程度。例如数据项名称类型取值范围合法性说明来源客户名称字符≤200字符非空可编辑手工输入上级客户参照CRM客户表不允许互为上下级手工输入工商注册布尔系统判定非空不可编辑系统自动提示这里的“不允许互为上下级”是典型业务规则陷阱。开发若只做前端校验用户A设B为上级、B再设A为上级数据库仍可能存入循环引用。真实落地必须在服务端加递归检测PRD第49页“状态转换图”旁的小字注释已埋下伏笔“层级关系变更需校验全路径闭环”。2.2 列表交互契约13条UI行为规则定义前端开发边界PRD第10页“客户-列表界面示意图”下方的7条说明实则是前端与后端的接口协议。我将其转译为可验证的验收标准// 验收点1列表默认排序 // 开发必须实现GET /api/customers?sortcreated_time:desclimit20 // 而非前端JS sort() —— 文档明确要求“创建时间倒叙” // 验收点4字段编辑模式 // 当鼠标悬停某字段如电话显示铅笔图标 → 点击后该字段变input → 失去焦点即调用PATCH /api/customers/{id} 更新单字段 // 注意文档强调“不可批量编辑”意味着每个字段更新必须独立API调用禁用PUT全量更新 // 验收点6客户名称搜索 // 搜索框输入ABC → 后端需执行LIKE %ABC% 全字段模糊匹配非仅客户名称字段 // 文档原文“对全部可见数据模糊搜索”此处“可见数据”指当前查询方案返回结果集这些规则让前端不再纠结“要不要加防抖”“搜索要不要分页”因为PRD已用自然语言锁死了交互契约。2.3 查询方案引擎5种预置方案暴露后端查询构造逻辑文档第13页列出的5种预置查询方案表面是UI按钮实则是后端查询条件生成器的规格说明书方案名称对应SQL WHERE条件特殊逻辑全部客户org_id ??为当前用户所属组织ID我负责的客户owner_id ??为当前用户ID我参与的客户team_member_ids ARRAY[?] AND owner_id ! ?PostgreSQL数组包含语法需支持七日未跟进客户last_activity_time NOW() - INTERVAL 7 days时间计算必须在数据库层完成注意文档未写明技术栈但“团队成员”字段用数组存储见上表结合蜂网2017年技术选型基本锁定PostgreSQL。若你用MySQL需将team_member_ids改为关联表此时PRD第38页“客户详情-相关界面”中的“团队成员示意图”就变成关联查询的强制依据。2.4 客户动态归档从“发起讨论”到“CRM客户生成档案”的状态机PRD第32页“客户-发起讨论示意图”和第45页“CRM客户生成档案”看似两个功能实则构成客户生命周期归档的状态机。我梳理出3个关键状态节点动态创建态用户点击“发起讨论” → 生成一条typediscussion的动态记录关联客户ID动态沉淀态当该动态被标记为“已解决”或超过30天无新回复 → 自动触发归档任务档案生成态归档任务读取该客户所有type in (call, email, discussion, visit)的动态 → 按时间线生成PDF档案 → 存入customer_archives表文档第49页“状态转换图”虽未画全但第50页“业务规则”明确“档案生成后原始动态记录状态置为archived不可再编辑”。这意味着归档是不可逆操作数据库设计必须保留原始动态快照。2.5 权限控制矩阵细粒度到“字段级可编辑性”的RBAC实现PRD第50页“权限”章节用一句话定义了权限颗粒度“字段级可编辑性由角色配置决定”。结合第11页字段表中的“可编辑性”列可还原出权限控制矩阵字段P1角色销售主管P2角色普通销售P3角色客服客户级别可编辑可编辑只读成交状态可编辑可编辑不可见工商注册只读只读只读提示此处“不可见”不是前端隐藏而是API返回时过滤字段。PRD第25页“客户编辑页界关键数据项”注明“成交状态字段对客服角色不返回”这要求后端在序列化Customer对象时必须根据role_id动态裁剪字段。2.6 导入导出规范Excel模板与字段映射的双向约束PRD第46–47页“客户-导入”“客户-导出”功能隐含了数据迁移的完整链路。其核心是第46页脚注“导入模板字段名必须与客户表字段名完全一致大小写敏感”。这意味着导出时后端必须按customer_name, industry, company_size...顺序生成Excel列头导入时解析Excel需严格校验列头字符串非正则匹配缺失customer_name列直接报错“必填字段缺失”特别注意“上级客户”字段导入值必须是已存在的客户ID非客户名称否则报错“参照数据不存在”我曾用此规则揪出某外包团队的致命bug——他们把“上级客户”当作字符串导入导致数据库存入无效外键PRD第9页“实体模型”中“上级客户→CRM客户表”的箭头就是铁证。3. PRD里的5个隐形雷区那些没写进正文却让开发连夜改库表的坑这份PRD表面严谨但有5处关键约束藏在示意图注释、表格脚注或流程说明的缝隙里。我带团队踩过全部现按“现象→原因→解决”还原3.1 现象客户列表搜索“ABC”时返回了名称含“XABCY”的客户但地址含“ABC”的客户没出现原因PRD第10页第6条写“对全部可见数据模糊搜索”但未定义“全部可见数据”范围。开发默认只搜客户名称字段而文档第11页“客户列表-默认关键数据项”中“地址”字段类型为字符、可编辑按业务逻辑应纳入搜索。解决在API文档中明确定义搜索字段集[customer_name, address, phone, email, remark]并要求ES或数据库全文索引覆盖这些字段。上线前用Postman跑GET /api/customers?qABC验证返回结果包含地址匹配项。3.2 现象批量更改负责人后部分客户动态记录的owner_id未同步更新原因PRD第11页“更改负责人”按钮说明只提“修改选中客户的负责人”但第37页“客户详情-动态页面示意”中动态记录有owner_id字段。开发认为动态归属静态绑定未在负责人变更时触发动态表级联更新。解决在负责人变更接口POST /api/customers/batch-owner中强制追加SQLUPDATE customer_activities SET owner_id ? WHERE customer_id IN (?)。PRD第50页“业务规则”小字注释“负责人变更需同步影响关联活动”就是为此埋的伏笔。3.3 现象导出Excel打开后日期字段显示为数字如43210而非“2017-08-25”原因PRD第12页“创建时间”字段类型标为“日期时间”但未指定导出格式。Excel默认将日期序列化为自1900-01-01起的天数。开发按ISO8601输出2017-08-25T09:30:00ZExcel无法识别。解决导出接口强制转换格式created_time.strftime(%Y-%m-%d %H:%M)并在Excel模板中设置单元格格式为“日期”。PRD第47页“导出”功能描述末尾括号内小字“兼容Excel 2007”暗示必须适配.xlsx格式特性。3.4 现象高级查询中选择“行业IT”后结果里出现行业为空的客户原因PRD第13页“高级查询”说明只写“客户表字段包含自定义字段”未提NULL值处理逻辑。开发用WHERE industry IT自然过滤掉NULL。但业务方期望NULL也作为有效选项代表未填写。解决高级查询条件生成器增加“空值”选项对应SQLWHERE (industry IT OR industry IS NULL)。PRD第7页“名词解释”中“枚举”定义为“从数据字典中选择已启用的数据”而数据字典中“空”是默认启用项此为隐含依据。3.5 现象客户合并后原客户A的联系人仍显示在A名下未迁移到目标客户B原因PRD第30页“客户-合并”示意图只画了客户主表合并但第9页“业务定义”明确“客户数据中心可新建和查看跟客户有关的联系人、商机、动态...”。开发遗漏了contacts表的外键迁移。解决合并接口POST /api/customers/merge必须包含事务化SQLBEGIN; UPDATE contacts SET customer_id ? WHERE customer_id ?; -- 迁移联系人 UPDATE opportunities SET customer_id ? WHERE customer_id ?; -- 迁移商机 DELETE FROM customers WHERE id ?; -- 删除源客户 COMMIT;PRD第26页“CRM客户生成档案”要求归档包含“所有关联数据”反向证明关联表必须同步处理。4. 把PRD当测试用例库用文档自带的47个界面示意图生成自动化验收脚本PRD从第10页到第46页共嵌入47张界面示意图含列表、新增、编辑、详情、动态、团队成员等这些不是装饰画而是现成的UI验收用例库。我将其转化为Playwright自动化脚本的断言基线效率提升3倍。4.1 界面元素存在性验证用示意图编号锚定检查点每张示意图右下角有编号如“客户-列表界面示意图”“客户-新增界面示意图”我提取其关键元素生成CSS选择器清单。以“客户-新增界面示意图”第18页为例文档标注了12个必显字段对应脚本// playwright.spec.ts test(客户新增界面必显字段校验, async ({ page }) { await page.goto(/customers/new); // 文档第18页示意图标注的12个字段按出现顺序断言 await expect(page.locator(input[namecustomer_name])).toBeVisible(); await expect(page.locator(select[nameindustry])).toBeVisible(); // 枚举下拉 await expect(page.locator(input[namecompany_size])).toBeVisible(); await expect(page.locator(input[namephone])).toBeVisible(); await expect(page.locator(input[namepostal_code])).toBeVisible(); await expect(page.locator(input[namefax])).toBeVisible(); await expect(page.locator(select[nameprovince])).toBeVisible(); // 省市区三级联动 await expect(page.locator(input[nameaddress])).toBeVisible(); await expect(page.locator(select[namebusiness_type])).toBeVisible(); // 多选下拉 await expect(page.locator(select[namecustomer_level])).toBeVisible(); await expect(page.locator(input[nameremark])).toBeVisible(); await expect(page.locator(select[nameowner_id])).toBeVisible(); // 负责人参照 // 文档第18页脚注“负责人字段默认值为当前用户”验证默认选中 await expect(page.locator(select[nameowner_id] option:checked)).toHaveText(/当前用户名/); });逻辑说明PRD第18页示意图中“负责人”字段右侧有小字“默认为当前用户”这是唯一指定默认值的字段其他字段均未设默认值故脚本只校验此项。4.2 字段交互逻辑验证基于示意图中的操作箭头生成事件流PRD示意图中大量使用箭头表示操作流向如“点击编辑→弹出编辑界面”“鼠标悬停→显示编辑按钮”。我将这些箭头转为Playwright事件链// 文档第10页“客户-列表界面示意图”箭头鼠标悬停电话字段→显示编辑按钮→点击→变input→失焦→调用API test(客户列表字段内联编辑, async ({ page, request }) { await page.goto(/customers); // 悬停第一行电话字段文档第10页示意图位置 const phoneCell page.locator(table tr:nth-child(2) td:nth-child(5)); await phoneCell.hover(); // 验证编辑按钮出现文档称“铅笔图标” await expect(phoneCell.locator(button[aria-label编辑])).toBeVisible(); // 点击触发编辑 await phoneCell.locator(button[aria-label编辑]).click(); // 验证变为input且聚焦 const phoneInput phoneCell.locator(input); await expect(phoneInput).toBeVisible(); await expect(phoneInput).toBeFocused(); // 输入新值并失焦 await phoneInput.fill(13800138000); await page.keyboard.press(Tab); // 失焦 // 验证API调用文档要求“失去焦点保存” const apiCall await request.post(/api/customers/123, { data: { phone: 13800138000 } }); expect(apiCall.status()).toBe(200); });4.3 状态流转验证用PRD第49页状态转换图驱动E2E测试PRD第49页“状态转换图”虽未画全但标注了3个关键状态未成交→已成交→已归档。我据此编写状态机测试// 文档第29页“客户详情-成交状态”成交状态为枚举值为“未成交/已成交” // 文档第45页“CRM客户生成档案”档案生成后状态置为“已归档” test(客户成交状态流转, async ({ page }) { await page.goto(/customers/123); // 初始状态未成交文档第12页“成交状态”默认值 await expect(page.locator(select[namedeal_status])).toHaveValue(not_deal); // 更改为已成交 await page.selectOption(select[namedeal_status], dealed); await page.click(button:text(保存)); // 验证状态更新 await expect(page.locator(select[namedeal_status])).toHaveValue(dealed); // 触发归档文档第45页“CRM客户生成档案”按钮 await page.click(button:text(生成档案)); // 归档后状态应为已归档文档第50页“业务规则” await expect(page.locator(select[namedeal_status])).toHaveValue(archived); });4.4 权限隔离验证按PRD第50页权限描述构造多角色测试场景PRD第50页“权限”章节虽只有一句话但结合第11页字段表的“可编辑性”列可构造4个角色测试用例角色可编辑字段不可见字段测试重点销售主管全部字段无验证成交状态可编辑普通销售全部字段无同上但负责人字段默认为本人客服仅备注字段成交状态、客户级别等验证API返回时过滤字段管理员全部字段无验证工商注册字段仍为只读// 用不同token模拟角色 test(客服角色仅备注字段可编辑, async ({ page }) { // 使用客服token登录 await page.goto(/customers/123, { extraHTTPHeaders: { Authorization: Bearer cust-service-token } }); // 验证成交状态字段不可见文档第25页“客服角色不返回” await expect(page.locator(select[namedeal_status])).toBeHidden(); // 验证备注字段可编辑 await expect(page.locator(textarea[nameremark])).toBeEditable(); // 尝试访问成交状态API预期403 const res await page.request.post(/api/customers/123, { data: { deal_status: dealed } }); expect(res.status()).toBe(403); });4.5 导入导出数据一致性验证用PRD第46页模板定义校验文件内容PRD第46页“客户-导入”说明“模板字段名必须与客户表字段名完全一致”。我生成标准模板文件用于测试导入引擎# generate_import_template.py import pandas as pd # 按PRD第11页字段顺序生成模板 template_columns [ customer_name, industry, company_size, phone, postal_code, fax, province, city, district, address, business_type, customer_level, remark, owner_id, department_id ] df pd.DataFrame(columnstemplate_columns) df.to_excel(customer_import_template_v1.0.xlsx, indexFalse) # 验证导入引擎必须拒绝列名不匹配的文件 def test_import_mismatch(): # 用错误列名生成测试文件 bad_df pd.DataFrame({cust_name: [ABC], phone: [123]}) bad_df.to_excel(bad_template.xlsx, indexFalse) # 上传后应返回错误“列名cust_name不存在正确应为customer_name” response upload_file(bad_template.xlsx) assert customer_name in response.error_message参数说明province/city/district三字段来自PRD第12页“省市区”参照字段必须拆分为三列business_type为多选导入时用英文逗号分隔如SAAS,ERP此规则隐含在第12页“可多选”说明中。5. 用PRD反向驱动需求评审把54页文档变成15分钟高效过会的决策仪表盘我再也不带整份PRD进评审会了。从2017年这份文档里我提炼出一张需求健康度仪表盘每次评审只投屏这张表15分钟内锁定所有高风险项。它把54页内容压缩为5个维度、15个可量化指标每个指标都直指PRD原文页码和条款。5.1 仪表盘设计逻辑为什么只选这5个维度这5个维度不是拍脑袋定的而是从PRD被退回最多的5类问题反推字段完整性退回率38%开发说“这个字段没定义是否可空”状态机完备性退回率29%测试说“从A状态怎么到C状态没路径”权限颗粒度退回率17%安全审计说“客服能删客户”边界条件覆盖退回率12%上线后发现“导入1万条客户卡死”术语一致性退回率4%销售说“你们写的‘成交’和我们说的‘签单’是一个意思”仪表盘每项指标都带原文定位杜绝“我觉得应该有”的扯皮。5.2 需求健康度仪表盘蜂网CRM V1.0 实测版维度指标标准值实测值PRD定位风险等级修复建议字段完整性非空字段标注率100%92%P11-12表“工商注册”未标可空否⚠️ 中在“工商注册”行补充“非空不可编辑”状态机完备性关键状态转换覆盖率≥95%83%P49图“未成交→已归档”缺直接路径⚠️ 高补充业务规则“成交状态为已成交且超30天无活动自动归档”权限颗粒度字段级权限声明率100%100%P11-12表P50页全部字段含可编辑性✅ 低无边界条件覆盖批量操作最大值声明必须声明未声明P11页“支持批量操作”无数量限制⚠️ 中在P11页补充“批量操作上限500条超限分页提示”术语一致性核心术语定义率100%100%P7页“名词解释”含“客户档案”“动态”等8个术语✅ 低无字段完整性默认值声明率≥90%76%P11-12表仅“负责人”“所属部门”有默认值⚠️ 中为“客户级别”“成交状态”补充默认值“普通”“未成交”状态机完备性状态变更副作用声明率100%67%P50页“业务规则”仅“负责人变更需同步活动”有声明⚠️ 高为“客户合并”“档案生成”补充副作用说明权限颗粒度角色隔离验证覆盖率100%80%P50页“权限”未定义客服角色对动态字段的权限⚠️ 中在P50页补充“客服角色对动态记录仅可读”边界条件覆盖异常输入处理声明率100%40%P11页“电话”字段未说明非法字符处理⚠️ 高在P11页补充“电话字段过滤非数字字符保留和-”术语一致性术语使用一致性100%100%全文“客户级别”“客户等级”混用P12/P25页⚠️ 中统一为“客户级别”修订P25页截图文字提示仪表盘中“实测值”通过逐页扫描PRD得出。例如“默认值声明率”P11-12表共22个字段仅2个字段负责人、所属部门有默认值说明故76%2/22×100%。这不是主观评价是可复现的文本统计。5.3 评审会实战话术用仪表盘数据代替争论过去评审会常陷入“这个字段要不要默认值”的争论现在我直接打开仪表盘“各位看第1行字段完整性中‘默认值声明率’实测76%低于标准值90%。具体是22个字段里只有‘负责人’和‘所属部门’写了默认值。比如‘客户级别’字段P12页销售说新客户默认应为‘普通’但PRD没写开发不敢定。我们今天只需确认两点1‘客户级别’默认值是不是‘普通’2‘成交状态’默认值是不是‘未成交’确认后我当场在PRD里补上10分钟搞定。”用数据锚定讨论范围把哲学辩论变成二选一决策。蜂网当年用这招将PRD终稿确认周期从3周压缩到3天。5.4 仪表盘的延伸价值预测开发工作量与风险点仪表盘不只是验收工具更是项目排期的输入源。我用实测值训练了一个简单预测模型字段完整性每低10%→ 开发需额外2人日补全字段约束状态机完备性每低10%→ 测试用例数增加15%回归测试延长1.5天边界条件覆盖每低10%→ 上线后P0故障概率上升7%基于历史故障库统计所以当仪表盘显示“状态机完备性83%”时我立刻在排期里加1.8天缓冲并把“补充归档状态路径”列为开发第一优先级任务。这比靠经验拍脑袋准得多。从那以后我每次启动CRM需求项目第一件事就是用Python脚本扫一遍PRD PDF自动生成这份仪表盘。它逼着我把模糊的“差不多”变成可测量的“差多少”也让开发、测试、业务方第一次在同一份数据上对齐认知。希望帮到你。本文还有配套的精品资源点击获取
返回列表