客户、联系人、站点与服务
我们有一个简单的客户模型,在这个客户下,可以有多个联系人和多个站点、服务等。
客户是与我们有关系的公司或个人,我们向其发送发票/账单。
联系人是与客户合作的人,对于个人来说,可能与客户本人相同,是一个单独的人,但我们可能有家庭成员或其他联系人,每个联系人都有一个类型,例如账单联系人、技术联系人等,这影响我们如何处理该联系人。
站点是我们提供服务的实际位置,可以是家庭、办公室或其他地点。这使我们能够为单个客户拥有多个站点,例如,一个拥有多个办公室的客户,并知道哪些服务与哪个站点相关联。
服务是我们向客户收费的内容,可以是家庭互联网服务、移动服务,甚至是抽象服务,如租用子网或为机架提供计量电力。每项服务都与客户和站点相关联,并可以有多个相关费用。
客户还有一个活动日志 <csa_activity_log>,��是所有更改的记录,标签 <administration_tags>,属性 <administration_attributes>用于存储自定义元数据,库存项目 <administration_inventory>和财务信息,如交易 <payments_transaction>,发票 <payments_invoices>和支付方式 <basics_payment>。
一旦我们创建了客户,就可以为该客户添加服务 <csa_add_service>,这是我们向他们收费的内容。
有关创建客户的信息,请参见创建客户。
数据模型概述
OmniCRM使用围绕客户及其服务组织的关系数据模型。该模型分为以下几个重点部分。
客户核心关系
客户是中心实体,具有相关的联系人、站点和服务。
关键点:
- 一个客户可以有多个联系人(账单、技术等)
- 一个客户可以有多个站点(分支办公室、地点)
- 服务交付到站点
- 联系人可以通过链接的用户帐户拥有门户访问权限
账单与财务数据
交易和发票跟踪所有财务活动。
关键点:
- 交易可以是独立的,也可以分组到发票中
- 服务自动生成每月交易
- Stripe卡被令牌化并安全存储
- 发票将多个交易分组以进行计费
产品与配置
产品定义服务提供;配置创建实际服务。
关键点:
- 产品是模板;服务是活动实例
- 配置通过Ansible剧本创建或修改服务
- 每个配置作业都有多个事件用于跟踪进度
- 一个产品配置可以创建多个服务(捆绑)
库存系统
跟踪分配给客户的物理和虚拟资产。
关键点:
- 库存模板定义每种物品类型的结构(字段)
- 灵活的itemtext1-20字段适应不同的库存类型
- 物品可以分配给客户并链接到服务
- 存储设备配置和管理凭据
用户与安全
具有基于角色的访问控制的用户帐户。
关键点:
- 用户可以有多个角色;角色有多个权限
- 每个用户的双因素身份验证(2FA)是可选的
- 员工用户是独立的;客户用户链接到联系人
- 细粒度权限控制对资源的访问
客户列表
客户列表提供了一个可搜索、可过滤的所有客户的表格。

功能:
- 搜索 - 按名称或ID过滤客户
- 批量操作 - 选择多个客户进行批量操作
- 分页 - 浏览大量客户列表
- 快速操作 - 直接从列表中查看或删除客户
客户 - 详细信息
客户对象本身不包含太多信息,仅包含一个名称和对联系人及站点的引用。
您的具体部署可能包含额外字段或自定义,但基本客户对象非常简单。
在概述页面上还有一个图表显示客户的每用户平均收入(ARPU),这是总收入除以服务数量,并与系统中所有客户的平均ARPU进行比较。
客户状态选项根据您业务的具体需求量身定制,但通常包括活动、非活动、待处理等选项,每个选项都有不同的规则来控制客户在该状态下在系统中的行为。
删除客户只能在客户没有活动服务、未支付发票或未开票交��的情况下进行。如果客户有任何这些情况,您需要关闭活动服务并确保付款完成,然后才能删除客户,这将归档客户及所有相关数据,日后如有需要可以恢复。

站点 - 详细信息
站点是提供服务的实际位置,可以与多个服务相关联。
它们主要用于商业客户,其中一个客户可能有多个站点,例如,一个拥有多个办公室的客户。
拥有多个站点使我们能够跟踪哪些服务与哪个站点相关联,例如,如果客户为新办公室订购新服务,我们需要确保将正确的服务交付到正确的位置。这使我们能够按站点跟踪服务,并在需要时单独计费。
Google Maps集成和地理编码
每个站点都与Google Maps集成,以确保准确的地址数据和地理位置。用户界面会自动对地址进行地理编码并生成位置信息。
地址地理编码的工作原理:
在添加或编辑站点时,界面提供两种设置位置的方法:
- 地址搜索(推荐)
- 使用表单顶部的搜索栏
- 输入地址,Google Maps自动完成建议匹配
- 从下拉菜单中选择正确的地址
- 系统会自动填充:
- 站点名称 - 来自Google Maps的��点名称
- 地址行1 - 街道号码和名称
- 地址行2 - 子房产(单元/套房号码)
- 城市 - 地区
- 州/地区 - 行政区域
- 邮政编码 - 邮政编码
- 国家 - 国家名称
- 纬度和经度 - 精确坐标
- Plus代码 - 11字符的开放位置代码(例如,
8C3MFJV8+2F) - Google Maps地点ID - 唯一地点标识符
- 可拖动地图标记(手动)
- 将图钉拖动到确切位置
- 系统执行反向地理编码以从坐标获取地址
- 基于图钉位置自动填充相同字段
- 对于农村地区或地址不精确时非常有用
Plus代码生成:
Plus代码是通过使用开放位置代码库从纬度/经度自动生成的。Plus代码是一个短代码(11个字符),表示世界上任何地方的精确位置。
示例:
自动填充字段:✓ 站点名称:“123 Main Street” ✓ 地址行1:“123 Main Street” ✓ 城市:“London” ✓ 州:“Greater London” ✓ 国家:“United Kingdom” ✓ 邮政编码:“SW1A 1AA” ✓ 纬度:51.5074 ✓ 经度:-0.1278 ✓ Plus代码:“9C3XGPHC+3Q” ✓ Google地点ID:“ChIJdd4hrwug2EcRmSrV3Vo6llI”
验证要求:
在保存站点之前,系统会验证:
- 纬���和经度必须设置(通过搜索或拖动标记)
- 国家必须填充(如果未设置,则默认为
REACT_APP_DEFAULT_COUNTRY) - Plus代码必须为12个字符(11 + 1用于填充)
如果验证失败,您将看到错误:
视觉反馈:
界面显示实时反馈:
或
位置数据的使用方式
地理编码的位置数据(纬度、经度、Plus代码)在OmniCRM中用于:
1. 服务交付和安装
- 现场技术人员 - 访问Plus代码以导航到确切的站点位置
- 安装调度 - 根据地理位置分配技术人员
- 设备部署 - 确保将正确的设备交付到正确的站点
2. 故障通知
- 地理围栏警报 - 如果特定区域发生网络故障,通过纬度/经度半径查询站点
- 定向通信 - 仅向受影响的客户发送故障通知,通过
Mailjet <integrations_mailjet> - 状态页面 - 显示受影响站点的故障地图
示例:
查询:SELECT * FROM Customer_Site
WHERE distance(latitude, longitude, 51.5074, -0.1278) < 5结果:47个受影响站点 操作:向47个客户发送故障通知
3. 报告与分析
- 地理收入 - 按城市、州、地区的收入
- 服务密度地图 - 服务位置的热图
- 扩展规划 - 确定服务不足的区域
4. ���站点商业客户
- 站点管理 - 跟踪哪些服务在何处
- 单独计费 - 如有需要按站点开具发票
- 服务分配 - 在配置期间将服务链接到特定站点
农村和偏远站点
对于位于农村地区的客户,街道地址可能不存在或不准确:
- 使用地图拖动
- 放大到大致区域
- 将图钉拖动到确切的物业/建筑
- 系统为该精确位置生成Plus代码
- Plus代码共享
- 与客户共享Plus代码(例如,
8C3MFJV8+2F) - 客户可以在Google Maps中输入此代码以查看确切位置
- 现场技术人员使用Plus代码进行导航
- 与客户共享Plus代码(例如,
- 地址备注
- 使用“地址备注”字段提供额外方向
- 示例:“在红色谷仓左转,过牛栏500米”
- 备注对安装团队可见
提示
如果地址不准确,您可以将图钉拖动到正确的位置。系统将对位置进行反向地理编码,并自动填充所有地址字段。

联系人 - 详细信息
联系人是与客户相关联的人。他们可以是账单联系人、技术联系人或其他类型,每个���系人都有一个类型,这影响我们如何处理该联系人。

我们可以为单个客户拥有多个联系人,例如,一个客户有多个账单联系人,或者一个客户有多个技术联系人。
一个好的例子是一个拥有托管服务提供商的公司,处理技术方面的事情,还有一个单独的账单联系人处理财务方面的事情,或者一个家庭,每个成员都有自己的联系人,但并非所有人都被授权进行更改。
同样,我们可能只想向技术联系人发送故障通知,或者只向账单联系人发送发票,联系人类型允许我们控制这一点。
联系人类型的具体逻辑由您的业务决定,但基本思想是每个联系人都有一个类型,这影响我们如何处理他们,并且与客户相关联的每个人都是一个联系人。
联系人与Mailjet <integrations_mailjet>集成同步,使我们能够根据联系人类型、位置、每月支出或购买的服务发送定向电子邮件活动,并管理用于事务性通信的所有电子邮件模板。


