ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CRM业务规范落地指南:集团客户管理与CM-IMS鉴权实战解析

CRM业务规范落地指南:集团客户管理与CM-IMS鉴权实战解析 简介在企业级CRM系统建设与改造中业务规范修订文档往往被当作存档文件却忽视了其作为系统设计蓝本的价值。从集团客户资料管理、组织架构建模到批量成员导入导出再到CM-IMS域内SUB ID、IMPI、IMPU标识生成与HA1鉴权算法这些核心技术点决定了系统能否支撑复杂的运营商级业务。本文从CRM领域的基础概念出发拆解虚用户设计、字段级变更日志、编码规则与鉴权计算等工程实践帮助产品经理与研发人员理解如何将业务规范转化为可落地的数据模型和接口逻辑并给出常见问题排查与测试用例设计思路适用于运营商及企业级CRM系统的规划与优化场景。1. 一份CRM业务规范修订PDF它不是文档是系统改造的蓝本做CRM系统的都清楚业务规范修订稿是最容易被当成“存档文件”的资源——下载后翻两页就丢进文件夹吃灰。这份《对CRM业务规范的修订.pdf》不一样它把集团客户资料管理、集团成员管理、资源生成管理三块硬骨头拆成了可直接落地的功能要求和业务要素精细到每个字段、每条生成规则。对产品经理来说它是画原型时的功能清单对研发来说它是建表、写接口的需求说明书对测试来说它是设计用例的边界参考。如果你是做运营商或企业级CRM的这份资源值得下载后逐条对照自己的系统过一遍——尤其是CM-IMS用户的标识生成和鉴权信息计算那块规则给到了公式级别照抄就能用。2. 集团客户资料管理从虚用户设计到组织架构建模2.1 集团管理员为何要做成“虚用户”规范里有个很关键的设计集团管理员作为一个虚用户定义在用户实体中创建CM-IMS集团的同时在用户表增加一个虚用户建立集团与虚用户的对应关系。初次看容易忽略但这条决定了整个权限体系的走向。为什么不能直接用一个真实用户账号当管理员原因有二一是集团管理员是跟着集团走的集团销户或变更管理员身份要能自动失效二是集团管理员的服务标识直接绑定集团编号等于把“管理身份”和“被管理对象”硬性关联避免出现一个人管多个集团导致权限串扰。具体落地时虚用户的生成规则需要固化-- 创建集团时生成虚用户示例Oracle风格 INSERT INTO t_user ( user_id, -- 系统生成格式如 VU 集团编码 user_type, -- 固定为 GROUP_ADMIN service_id, -- 取集团编码如 CM-IMS88888 service_pwd, -- 初始为集团管理员密码密文存储 status, -- ACTIVE created_time ) SELECT VU || group_code, GROUP_ADMIN, group_code, encrypt_pwd(?), ACTIVE, SYSDATE FROM t_group_info WHERE group_code ?;这段SQL的逻辑是虚用户ID由“VU集团编码”规则拼接服务ID直接取集团编号服务密码用加密函数存储。注意group_code字段必须唯一否则虚用户会重复创建权限就会乱。参数说明里最容易被忽略的是服务密码的更新链路——集团管理员密码在CRM侧修改后必须同步更新user表里对应虚用户的服务密码否则用户在IMS域认证时会一直失败。很多系统就是在这里翻车密码改了CRM侧没同步虚用户表。2.2 组织架构树跨省、跨法人怎么建模规范要求支持集团内部组织结构的维护分支机构或部门可能跨区、跨省、跨地市甚至是不同法人。这意味着组织架构表不能简单地设计成“上级ID”字段得考虑多级、跨地域的树状结构。常规做法是维护一张组织节点表每个节点记录自身信息、上级节点ID、归属地域编码另外单独建一张关系表处理“法人”维度CREATE TABLE t_group_org ( org_id VARCHAR2(32) PRIMARY KEY, -- 组织节点ID group_id VARCHAR2(32), -- 所属集团编码 org_name VARCHAR2(128), -- 部门/分支机构名称 parent_org_id VARCHAR2(32), -- 上级节点ID根节点为NULL region_code VARCHAR2(16), -- 归属地市/区县编码 legal_entity_flag CHAR(1), -- 是否独立法人Y/N org_level NUMBER(2), -- 层级从1开始 sort_no NUMBER(4), -- 同级排序号 status CHAR(1) -- 有效/失效 ); CREATE INDEX idx_org_parent ON t_group_org(parent_org_id); CREATE INDEX idx_org_group ON t_group_org(group_id);实测中递归查询这个树的深度一般控制在5层以内超过就用Oracle的CONNECT BY或MySQL 8.0的WITH RECURSIVE都能扛住。这个设计的关键点是org_level字段——很多团队会忽略直接用parent_org_id递归算层级结果跨法人场景下同一层级的节点可能归属不同法人按层级权限管控时容易漏。实测建议初始化时就把层级算好写死查询时少一次递归。2.3 资料变更历史的“软删除”策略规范第5条要求保留集团客户资料变更历史支持回溯查询。很多系统是建一张全量快照表每次变更前复制旧记录。这种方式能回溯但空间膨胀得厉害。更好的做法是“字段级变更日志 关键节点快照”双轨字段级日志记录哪个字段、从什么值改成什么值、操作人、操作时间。关键节点快照集团建档、销户、重要资料联系人、决策人变更时拍一张完整快照。CREATE TABLE t_group_change_log ( log_id NUMBER PRIMARY KEY, group_id VARCHAR2(32), field_name VARCHAR2(64), -- 变更字段如 group_addr old_value CLOB, -- 旧值CLOB防止长文本溢出 new_value CLOB, -- 新值 operator_id VARCHAR2(32), -- 操作人 change_time DATE ); -- 查询某字段变更历史 SELECT * FROM t_group_change_log WHERE group_id ? AND field_name group_addr ORDER BY change_time DESC;这里有个注意点快照表和日志表要分库或分表因为快照数据量大日志表写入频繁混在一起会让归档和清理都变得麻烦。我们的实践中快照表按月分表日志表按季度清理一次。3. 集团成员管理批量操作、码号兼容与关键成员画像3.1 成员与集团关系的“双写”机制规范要求提供集团客户含跨区与成员间关系的建立、解除、修改、查询。这里最容易踩坑的是跨区集团成员的归属问题——一个成员可能同时属于多个集团或者从A集团的普通成员变成B集团的关键成员。建议把“成员基础档案”和“成员-集团关系”拆成两张表基础档案只存一次关系表存成员与集团的关联。关系表要包含角色字段因为关键成员和普通成员的业务待遇完全不同CREATE TABLE t_member_group_rel ( rel_id NUMBER PRIMARY KEY, group_id VARCHAR2(32), -- 集团编码 member_id VARCHAR2(32), -- 成员标识 member_role VARCHAR2(16), -- KEY_PERSON / NORMAL relation_type VARCHAR2(16), -- 隶属 / 兼职 / 历史 start_date DATE, end_date DATE, status CHAR(1) ); CREATE INDEX idx_rel_group ON t_member_group_rel(group_id, status);批量导入时一定要先做“关系唯一性校验”——同一成员在同一集团同一时间段内只能有一条有效关系否则后续查询成员所属集团时会出现多值报表全错。3.2 批量导入导出编码与码号格式校验规范要求支持集团成员批量导入导出这个功能听上去简单但实际做起来全是细节。首先是码号格式成员码号信息需支持移动及固定铁通号码。导入时如果只做长度校验固定号码如0755-XXXXXXXX会被拒掉。正确做法是分移动号码段和固定号码段分别校验import re def validate_phone(phone): 移动号码段 固定号码段分别校验 mobile_pattern r^1[3-9]\d{9}$ fixed_pattern r^0\d{2,3}-?\d{7,8}$ if re.match(mobile_pattern, phone): return MOBILE elif re.match(fixed_pattern, phone): return FIXED else: raise ValueError(f无效码号: {phone})其次是Excel导入时的编码问题。实测中很多团队用Pandas读Excel后直接写库中文列名在Linux服务器上会因编码问题导致列错位。我们的做法是模板固定列顺序代码里按列索引取值不依赖Excel表头的中文名称。批量导出同样有坑导出文件生成后文件名包含集团名称时要做好URL编码否则浏览器下载时中文名乱码。3.3 关键成员社会关系一张被低估的“标签表”规范要求支持集团关键成员社会关系管理关系类别夫妻、父子、兄弟、姐妹、母女等、成员姓名、证件类型、证件号码、爱好、职位、单位等。这张表的价值不在管理本身而在后续的客户画像和营销触达。例如某集团关键领导的社会关系里显示其配偶在某竞争运营商工作这个信息对维系策略有直接影响——不能把赠品寄到其家庭住址。落地时建议把社会关系做成灵活的KV结构因为关系类型会扩展比如后续加“校友”“战友”CREATE TABLE t_member_social_rel ( rel_id NUMBER PRIMARY KEY, member_id VARCHAR2(32), rel_type VARCHAR2(16), -- 夫妻/父子/兄弟等 rel_name VARCHAR2(64), -- 对方姓名 rel_phone VARCHAR2(32), -- 对方联系电话 rel_position VARCHAR2(128), -- 对方职位/单位 rel_hobby VARCHAR2(256), -- 爱好标签逗号分隔 max_visit_cnt NUMBER(4), -- 访问次数冗余字段加速前端展示 update_time DATE );要特别注意这张表是敏感数据。规范里第8条提到关键资料授权管理社会关系数据一定要纳入字段级权限控制不能随集团客户资料的主查询一起返回否则容易引发合规问题。4. CM-IMS资源生成编码规则与鉴权算法的落地实现4.1 三类标识的生成规则规范里对CM-IMS用户的标识生成给出了非常明细的规则这在整个PDF里技术含量最高也是最值得逐字对照的部分。SUB ID签约身份标识由CRM资源生成模块生成20位随机码保证在同一IMS域内唯一。这个随机码用Java UUID去尾或用SecureRandom生成数字串都可以但一定要做唯一性校验——数据库加唯一索引是必须的再配合应用层查重。IMPI用户私有标识格式为“用户名IMS.归属省名缩写.chinamobile.com”。对于使用ISIM卡的用户用户名是10位随机数对于不使用ISIM卡的用户固定或移动终端IMPI由CRM根据SIP URI导出——去掉sip:前缀保留后面的字符。IMPU用户公有标识分配2个一个是TEL URI一个是SIP URI。TEL URI采用全球格式SIP URI根据TEL URI生成固定/移动终端接入格式为“sip:86xxxIMS.归属省名缩写.chinamobile.com”无卡PC客户端接入格式为“sip:86xxx_sIMS.归属省名缩写.chinamobile.com”——注意用户名部分要加“_s”后缀。4.2 HA1与Realm的计算逻辑这是鉴权信息生成的关键。规范明确HA1根据用户IMPI、password和realm通过哈希计算所得realm为全省统一域名格式为“IMS.归属省名缩写.chinamobile.com”password可采用现有客服密码或互联网密码。标准做法是用MD5的HA1算法和SIP Digest鉴权一致import java.security.MessageDigest; public class ImsAuthUtil { /** * 计算IMS鉴权HA1值 * param impi 私有用户标识如 8ims.bj.chinamobile.com * param password 服务密码或互联网密码 * param realm 域如 ims.bj.chinamobile.com */ public static String calcHa1(String impi, String password, String realm) throws Exception { String data impi : realm : password; MessageDigest md MessageDigest.getInstance(MD5); byte[] digest md.digest(data.getBytes(UTF-8)); StringBuilder sb new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString(); } public static void main(String[] args) throws Exception { String impi 8ims.bj.chinamobile.com; String realm ims.bj.chinamobile.com; String pwd 888888; System.out.println(HA1 calcHa1(impi, pwd, realm)); } }这段代码的逻辑是把IMPI、realm、password三段用冒号拼接然后做MD5输出32位小写十六进制串。注意拼接顺序不能错——IMPI在前、realm居中、password最后这是SIP Digest的标准要求。参数说明里有个容易翻车的地方如果password里包含特殊字符如、#拼接时不会冲突因为分段是靠冒号但同样password在前端传输时要做URL编码否则“#”会被当作锚点截断。4.3 三种接入场景的标识组合规范里给了三种接入场景我用表格来梳理避免看走眼终端类型码号分配策略SUB IDIMPUIMPI固定终端铁通固定码号分配TEL URI和SIP URI各一个20位随机码TEL URI为固定码号SIP URI用户名部分为固定码号的全球格式通过SIP URI格式的IMPU导出签约IMS的CS手机一号通手机上无需配置IMS码号20位随机码TEL URI为手机国际格式SIP URI为用户名部分为MSISDN全球格式分配唯一IMPI通过SIP URI导出无卡PC客户端可新分配或绑定已有手机号20位随机码新分配码号则分配TEL URI绑定码号不分配SIP URI用户名部分为全球格式加“_s”后缀分配唯一IMPI通过SIP URI导出这张表是实测时常拿来对照的。有个细节PC客户端场景下绑定码号时TEL URI不再分配但绑定关系要在资源生成模块里留痕——不然用户投诉“我绑了手机号怎么打不通IMS电话”时排查链路会断。IP多媒体子系统用户的资源生成功能要求支持单个和批量生成并提供日志记录。日志至少包含SUB ID、IMPI、IMPU、HA1的生成时间、操作人、请求批次号和生成结果。这个日志在用户投诉“IMS无法注册”时是排查的第一入口。5. 业务规范落地的常见问题排查5.1 集团虚用户创建后IMS域登录一直失败现象集团管理员在IMS侧注册时提示“用户名或密码错误”但在CRM侧查虚用户状态是正常的。原因最常见的是虚用户生成时服务密码没有做同步——CRM侧管理员改了密码但user表里的service_pwd没有跟着更新。还有一个隐蔽原因虚用户的服务ID写的是集团编号但IMPI生成时用户名部分导错了字段导致注册请求带过去的IMPI和HSS里存的IMPI对不上。解决改完管理员密码后强制触发一次密码同步任务更新虚用户表的service_pwd。同时检查user表的service_id是不是集团编号原文不要加前缀后缀。5.2 批量导入成员时固定号码被误拒现象导入Excel后系统提示“码号格式不正确”用移动号码测试正常固定号码如010-XXXXXXX必失败。原因校验逻辑只认移动号码段没有区分固定号码的区号格式。很多团队的校验函数是网上复制的一段正则只覆盖1开头的手机号。解决按规范“集团成员码号信息需提供对移动及固定的支持”的要求补上固定号码校验分支区号匹配0开头号码部分7到8位。导入失败时给出具体行号和错误原因不要让用户对着几百行Excel自己找问题。5.3 HA1计算中文密码时与HSS不匹配现象密码中包含中文时IMS注册返回401抓包发现HA1和HSS侧存的都不一样。原因HA1计算时字符串拼接用了平台默认编码如GBK而HSS侧用的是UTF-8同样字符串得到的MD5完全不同。这是最典型的“本地测试通过、联调必翻车”的坑。解决统一在HA1计算前对IMPI、realm、password三个字段分别做UTF-8编码转换再拼接计算。写个单测用例用固定中文密码、固定IMPI和realm断言输出固定HA1值联调时拿这个值去和HSS侧比对立刻能定位是哪边的编码问题。5.4 集团组织结构调整后客户经理看不到新部门现象集团客户从A地市迁到B地市后B地市的客户经理无法查询该集团及其成员A地市也看不到了。原因集团客户的地市归属字段修改后组织架构树里各级节点的region_code没有同步更新导致按地域授权的查询条件过滤掉了该集团。解决调整集团归属时触发器级联更新t_group_org表下所有节点的region_code并且同步刷新“客户经理-集团”的分配关系。规范里明确“客户经理可以分级、分层、分地域对不同层次的集团客户资料查询和维护”这个字段不同步权限就会卡死。5.5 批量导出大集团成员时文件生成超时现象一个集团5万成员导出时接口等待超过30秒前端直接报超时。原因查询逻辑没分页一次性加载全量成员到内存再加社会关系表关联查询慢查询直接把数据库拖死。解决导出任务拆成两步先异步生成文件到OSS或本地磁盘生成期间前端轮询任务状态查询分页拉取每页500条循环写入CSV。导出的sheet里社会关系字段按成员ID做二次批量查询不要用N1方式循环查库。5.6 SUB ID重复导致HSS主键冲突现象偶尔有用户开通IMS后注册失败后台报HSS数据冲突。原因SUB ID虽然是20位随机码“随机”不等于“唯一”并发下小概率重复数据库没有加唯一索引时问题会被吞掉。解决在t_subscriber表对SUB ID加唯一索引生成时捕抓唯一约束冲突冲突后重新生成再插入最多重试3次。同时日志里记录冲突次数如果一周内冲突超过5次就要检查随机数生成器的种子是否异常。6. 把规范变成测试用例从业务要素反推验证清单拿到这份规范最高效的用法不是直接动手改代码而是先把它变成一张可执行的验证清单。我们从每章的业务要素里抽关键字段反推设计测试用例这样无论是自测还是交接给测试团队都有据可依。集团客户资料管理的测试必查点验证点输入/操作预期结果建档必填校验不填集团地址提交建档提示“集团地址必填”虚用户生成创建CM-IMS集团用户表新增VU开头的虚用户服务ID集团编号组织架构层级创建5级部门结构递归查询返回完整树每级region_code正确变更回溯修改集团联系人变更日志表新增一条记录old_value里有原联系人授权控制普通坐席查询集团决策人手机号提示“无权限查看该字段”集团成员管理的测试必查点验证点输入/操作预期结果批量导入上传含固定号码的Excel固定号码导入成功不误拒关系唯一性同一成员在同一集团导入两次第二次导入提示“关系已存在跳过”批量导出5万成员导出异步任务生成文件下载成功后内容分页无损社会关系增删改添加“父子”关系记录入库且该字段不在普通查询返回中跨区集团查询按省份维度查询成员返回该省所有相关集团的成员不重复资源生成的测试必查点验证点输入/操作预期结果SUB ID唯一性并发生成1000个SUB ID无一重复数据库唯一索引无冲突IMPI导出固定终端SIP URI生成IMPI去掉sip:前缀格式正确PC客户端SIP URI绑定已有手机号生成SIP URI用户名部分为全球格式加“_s”后缀HA1计算中文密码固定入参输出固定32位MD5与HSS侧一致批量生成日志批量生成500个用户日志表记录每个用户的生成时间与操作人把这套清单跑完基本就能确认这份规范有没有真正落到系统里。除了测试用例规范里的“业务要素”部分可以直接当作接口字段定义和数据库建表依据。例如“集团联系人信息联系人姓名、联系人电话”建表时就直接对应联系人姓名字段、联系人电话字段。“集团支付方式实报实销、限额报销、限额补助、个人付费”适合用编码表维护前端下拉展示后端存code不要直接存中文。这里有个比较隐蔽的细节规范提到“潜在集团客户包括可能成为中国移动服务对象的集团客户和竞争对手的集团客户等”意味着建档时来源渠道字段要区分“自拓客户”和“竞争客户”后续营销策略会完全不同——对竞争客户不能按普通客户的标准推送政策否则容易引发投诉。我从这份规范里学到的一个重要习惯就是每一份业务规范修订稿最先动笔的不是设计文档而是一张“字段到字段”的对照表——规范里的每个业务要素对应哪个表哪个字段数据类型是什么必填与否。这张表一旦拉通后续的设计、开发、测试全部环节都会被它串联起来不会再出现“开发说需求不明确、测试说文档有歧义”的来回拉扯。那以后我每次拿到类似的规范修订稿都强制自己先花半天时间把这张表拉出来宁可在前期多花点时间也好过后期改动时在代码里找字段。希望这份资源的拆解思路也能帮到你落地时少走几段弯路。本文还有配套的精品资源点击获取
返回列表