金易联技术方案


  • administrators

    1.系统架构及主要模块说明

    1.1主要模块说明

    金易联整体方案包含的主要模块有:基础通讯平台、验证中心、关系链、平台API、工单系统、派单规则、积分规则、敏感词、知识库、客户信息、员工信息、产品中心、统一网关、金易联管理后台、Android员工端、iOS员工端、小程序客户端、机器人框架。主要模块逐一介绍如下:

    (1)基础通讯平台,提供私聊、加密私聊、群聊、加密群聊、群管理等技术通讯能力,并开放相应的REST API。
    (2)验证中心,提供登入、登出验证功能。其中,金易联本身不包含用户账号系统,针对用户账号密码或者Token的验证,金易联提供标准的验证接口协议,由具体机构实现,验证中心在用户登陆时,通过调用具体机构实现的账户验证接口完成用户身份的确认。
    (3)关系链,负责基础通讯平台的好友关系管理,包括邀请、接受、拒绝、删除好友等功能。
    (4)平台API,基于基础通讯平台及其他服务模块提供的API,提供更加丰富、高级的API,供终端和服务端使用。比如,批量操作群成员等。
    (5)工单系统,管理咨询工单、留言工单、知识库工单等各种类型工单,包括派单、接单等功能。
    (6)派单规则,管理支持工单系统的各种派单规则的增删改查及上下架,派单规则决定一个工单应该派发给哪些用户,比如一个咨询工单应该先派给最近的营业部客服人员,再到同城营业部的客服人员,再到全国营业部的客服人员,最后到专项小组等。
    (7)积分规则,管理计算员工处理工单情况的积分计算规则,服务于员工激励。
    (8)敏感词,管理敏感词的增删改查及上下架,用于识别工单、聊天、知识库等是否涉及敏感词的合规场景。
    (9)知识库,供机构录入各种业务知识,支持客服和投顾在服务客户的过程中随时搜索知识库,即时解答客户的业务问题。
    (10)客户信息,客户信息管理系统,提供单条、批量客户信息导入接口供机构灌入客户信息,员工在服务客户时,能直接从聊天窗口顶部看到客户的身份、持仓、盈亏等信息。
    (11)员工信息,员工信息管理系统,提供单条、批量员工信息导入接口供机构灌入员工信息,客户在向员工咨询时,能直接从聊天窗口顶部看到员工的职位、营业部、执业编号等资质信息。
    (12)统一网关,对所有从终端访问金易联后台的请求进行鉴权、流控、路由等操作。
    (13)金易联管理后台,提供一个PC上的Web版管理终端,对知识库、敏感词、产品中心、积分规则、派单规则、人员等进行可视化管理操作。
    (14)Android员工端,提供给员工使用的Android版APP。
    (15)iOS员工端,提供给员工使用的iOS版APP。
    (16)小程序客户端,提供给客户使用的小程序版APP。
    (17)机器人开发框架,一个用于开发机器人程序的后台开发框架,开发者只需关注机器人业务逻辑。本质上,一个运行的机器人程序可以认为是机器人使用的终端,正如普通用户使用Android/iOS/小程序终端一样。金易联方案中的机器人有:智能客服,自动解答客户的业务问题,出现解答不了的情况时,客户端可以留言或者转人工客服;通知助手,将员工对客户留言问题的回复及时通知给客户;合规助手,当员工在服务客户的过程中,将聊天内容出现敏感词的情况通知给具体的合规管理人员。

    1.2系统架构

    金易联整体系统架构图,如下所示:

    0_1590629076738_93526759-e919-4689-8194-7ba9bdf6450d-image.png

    2.系统监控方案

    2.1监控方案技术架构

    金易联监控方案采用到的技术和工具主要包括:Docker、Rancher、Prometheus、Grafana,及自研发。整体技术架构如下所示:

    2.2监控范围

    2.2.1机器层面的监控

    对机器内存、CPU、存储的使用率、磁盘的读写速度、网络吞吐拥塞、建立的tcp连接数、文件描述符可用量等方面进行监控,如下图所示:

    0_1590629478471_60b9c00c-0287-4c29-a540-f1b588dfe297-image.png

    2.2.2容器层面的监控

    监控容器健康状态、内存、CPU、网络吞吐等,侧重于容器本身的指标,如下图所示:

    0_1590629496979_33f3d6a1-a4de-49fc-8f9c-e2bf5daa56d0-image.png

    2.2.3服务层面的监控

    主要涵盖:服务是否存活、可用;服务运行期间开放出来各种定制化的指标如连接数、时延、线程数、并发数(覆盖当前和平均水平)、集群服务的节点健康状况、主从节点数等;支持大多数主流关系型数据库、NOSQL存储,以及消息系统的监控,如Postgres、Mysql、Oracle、MongoDB、Redis、ElasticSearch、Memcached、kafka、Nats等。如下图所示为MongDB:

    0_1590629525144_30a0f935-efe8-43ff-a549-a32a5852c831-image.png

    2.2.4业务API层面的监控

    以最终用户的视角,定时探测业务API,监控HTTP请求响应状态码和延时,如下图所示:

    0_1590629551890_8186f241-467d-4c8d-a1be-5f06e3d2cec7-image.png

    2.2.5统一监控

    提供一个统一的页面展示当前所有可能运行异常的服务,便于运维人员了解整体服务的健康状况。如下图所示,可确认当前服务整体运行无异常:

    0_1590629577255_45403ec9-d531-4978-b000-3a06150273e7-image.png

    2.3告警

    监控指标统一汇集到prometheus后,根据配置到prometheus中的告警策略,产生告警,最终通过配置告警渠道发送出去。告警渠道支持短信、Finchat、企业微信,及其他开放消息推送接口的方式。此外,告警自动或手动恢复后还会发送恢复通知。具体如下图所示:

    0_1590629596596_c0030bc0-f67a-4217-be85-74ee111626d2-image.png

    3.系统灾备及扩容方案

    3.1灾备方案

    金易联灾备方案包括服务灾备和存储灾备。

    3.1.1服务灾备

    金易联整体架构遵循微服务的设计原则,每个服务职责单一、无状态,支持多实例高可用部署,任一实例出现问题均不会影响该服务的可用性。

    3.1.2存储灾备

    金易联使用到的存储有:MongoDB、Postgres、Minio、Redis,具体的灾备方案分别如下:
    (1)MongoDB,采用至少三个节点的副本集方式部署;
    (2)Postgres,采用至少一主一从的主从方式部署;
    (3)Minio,用于文件存储,采用至少2个实例规模的集群方式部署;
    (4)Redis,用于缓存,数据的允许数据丢失,采用一主一从部署。

    3.2扩容方案

    金易联扩容方案包括服务扩容和存储扩容。

    3.2.1服务扩容

    金易联整体架构遵循微服务的设计原则,每个服务职责单一、无状态,支持动态水平伸缩,通过Rancher API或者管理界面操作,可以秒级动态增加服务实例个数,应对线上访问量的增加

    3.2.2存储扩容

    金易联使用到的存储有:MongoDB、Postgres、Minio、Redis,具体的扩容方案分别如下:
    (1)MongoDB,结合当前访问和存储规模及增长趋势,综合采用启动MongoDB自动分片功能、增加MongoDB集群节点数量、读写分离、基于业务层面分片(分库、分表、多集群)等一或多种方法进行扩容;

    (2)Postgres,结合当前访问和存储规模及增长趋势,综合采用增加从节点数量、读写分离、数据归档、基于业务层面分片(分库、分表、多集群)等一或多种方法进行扩容;

    (3)Minio,结合当前访问和存储规模及增长趋势,综合采用增加集群节点数量、数据归档、基于业务层面分片(多集群)等一或多种方法进行扩容;

    (4)Redis,用于缓存,扩容必要性不大,确实需要的话,可以采用根据键值Hash分片的集群方式部署。

    4.系统部署手册

    4.1部署基础环境

    在部署服务之前,需要每台机器都安装Docker以及Docker Compose,目前支持1.12.6,1.13.1,17.03.2三个版本。

    4.1.1安装Docker

    安装docker17.03的脚本
    curl https://releases.rancher.com/install-docker/17.03.sh | sh
    

    4.2部署Rancher平台

    目前金易联的所有后台服务都是通过Rancher的方式来部署。所以在部署金易联之前,需要先准备足够的机器,需要把每台机器加入到Rancher的环境管理中。

    4.2.1Rancher集群模式部署
    在高可用(HA)的模式下部署运行Rancher Server,需要暴露一个额外的端口,添加额外的参数到启动命令中,并且运行一个外部的负载均衡。

    HA部署需求:

    因为版本升级架构改变,Rancher 2.x目前有两种HA安装方法:

    1.RKE HA

    这种HA安装方法基于RKE部署K8S集群和Rancher HA,此方法支持2.0.8以及之前的版本。

    2.Helm HA

    这种方法通过RKE部署K8S集群,再通过Helm去安装Rancher HA。此方法支持2.0.8以后的版本。

    具体的安装方法可以参考Rancher的官方网站:
    https://www.cnrancher.com/docs/rancher/v2.x/cn/installation/server-installation/ha-install/helm-rancher/

    4.3部署数据库服务

    金易联整套后台服务需要用到的数据库服务包括Postgres、MongoDB、Redis等数据库服务。

    4.3.1部署数据存储基础服务

    数据存储基础服务包括Postgres数据库服务,Mongo数据库服务,Minio对象存储服务。
    Postgres提供主从复制,Postgres的主从复制流程如下:

    0_1590629688131_45268479-6804-4540-8ced-64b92a477ff0-image.png

    图 1 Postgres主从模式

    在部署Postgres时,需要先准备2台物理机器,2台机器的物理硬盘要尽可能的大些。在1台机器上设置label:“finochat.pg-master=yes”, 在另外1台机器上设置label:“finochat.pg-slave=yes”。凡泰提供Postgres主从之间的复制采用异步复制的方式。

    MongoDB提供的是Replica Sets模式(副本集)。MongoDB官方目前已不推荐使用主从模式,取而代之的是副本集模式。副本集其实是一种互为主从的关系,可理解为主主模式。副本集将数据复制,多份保存,不同服务器保存同一份数据,在出现故障时自动切换。副本集比传统的Master-Slave主从复制有改进的地方就是它可以进行故障的自动转移,如果我们停掉副本集的一个成员,那么剩余的成员会再自动选举为一个成员,作为主库。

    0_1590629718764_e141c3a7-ed07-47e9-b0ee-2b41d6dae1a1-image.png

    图 2 Mongo副本集模式

    在部署MongoDB时,需要先准备三台机器,在每台机器上设置label: “mongo.env=yes”,用于调度MongoDB服务。(备注:三台机器部署MongoDB服务)。
    Storage的catalog提供了Postgres和Minio这两个基础服务。Mongo-cluster的catalog提供了MongoDB的存储服务。在设置完主机的调度标签后,接下来我们开始部署基础的数据库存储服务。

    在Rancher的管理界面中点击catalog中选择“storage”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出storage服务的具体配置信息:
    0_1590629749779_67d84625-3f92-40db-95a9-0a6294df5321-image.png
    图 3 storage服务catalog

    storage的配置参数可以保持默认提供的即可,点击“Launch”进行部署。storage服务部署成功后,可以看到如下的服务列表:
    0_1590629774082_eedcd159-720b-4b34-a350-30184a3d5a7c-image.png
    图 4 storage服务列表
    storage的服务启动之后,只是拉起了postgres和minio的存储服务,接下来把mongo的服务加入到storage的namespace,点击“Launch”进行部署。
    0_1590629800092_ff8bd057-de0e-4ba4-8589-7cbb04b5f860-image.png
    图 5 mongo服务

    至此,基础的存储服务已经部署好了。

    4.3.2部署Redis

    Redis数据库主要提供一个缓存数据功能,Chat 服务中会使用Redis进行热点数据的缓存,接下来说明如何部署一套Redis集群服务。

    在Rancher的管理界面中点击catalog中选择“redis-cluster”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Redis cluster服务的具体配置信息:
    0_1590629881296_33216f4e-6b6b-4d0f-af6f-b9d6590d938b-image.png
    图 6 redis服务catalog

    Redis的配置参数可以根据默认的即可,点击“Launch”进行部署。Redis服务部署成功后,可以看到如下的服务列表:
    0_1590629903724_ca42a73b-5890-4241-a1e4-fd16a38638a6-image.png
    图 7 redis服务列表

    4.4部署Kafka服务

    Kafka作为消息队列的中间件服务,FinChat聊天服务基于Kafka作为消息总线,而Kafka依赖于Zookeeper存储Broker、主题和分区等元数据信息。

    在部署zookeeper和Kafka之前,需要先对主机设置调度标签。在三台要署kafka的机器上添加label: “zookeeper.env=yes” 和 “kafka.env=yes”,用于调度Kafka 和Zookeeper服务。
    在Rancher的管理界面中点击Catalog Apps 中选择“zookeeper”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Zookeeper的集群配置信息:
    0_1590630551284_68895646-5779-4238-8c64-07c917d4affb-image.png
    图 8 zookeeper服务catalog

    Zookeeper的Catalog默认提供的是3个节点的集群,默认的数据存储是挂载到“/mnt/data/dendrite/zookeeper”的文件夹下,如果需要修改挂载的路径,可以根据实际情况进行配置,点击“Launch”进行部署。

    0_1590630575634_712a25c8-c039-444e-b3a3-d861f1f45e17-image.png
    图 9 zookeeper服务详细列表

    zookeeper服务部署成功后,接下来可以开始部署Kafka集群。在Rancher的管理界面中点击Catalog Apps 中选择“kafka”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Kafka的集群配置信息:
    0_1591061085086_c110137e-487d-4548-a3b8-118efb39b10a-image.png
    图 10 kafka服务catalog

    需要特别注意的是,Kafka这里配置了连接Zookeeper 的服务地址,这里通过Rancher 的ServiceName.StackName:Port方式进行访问,默认情况下,部署的是zookeeper的stack名称,点击“Launch”进行部署。Kafka服务部署成功后,可以看到如下的详细列表:
    0_1591061113259_83c82938-18a1-416c-befe-b5798d837e36-image.png
    图 11 kafka服务详细列表

    4.5部署金易联基础服务

    金易联基础服务主要是提供聊天相关的平台级功能,作为整个金易联的服务总线。在部署之前,需要先准备好server的域名,以及苹果推送服务的APNs证书文件。准备若干台服务器(具体数量和部署规模相关),用来部署金易联基础服务,其中至少一台要有访问外网的权限,用于苹果消息推送。

    在Rancher的管理界面中点击Catalog Apps中选择“chat”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Chat服务的具体配置信息:
    0_1591061135747_990862aa-6a99-4def-a1a3-42d8307b23b2-image.png
    图 12 IM内核 catalog

    chat涉及的配置参数比较多,具体各个参数的含义如下:

    catalog配置说明

    1. Broker Nodes: Kafka的Broker节点配置信息
    2. DB URI: Postgres数据库链接地址字符串
    3. CACHE RUI: Redis数据库连接字符串
    4. DOMAIN NAME: IM的域名信息
    5. FED CERT: 配置的证书文件,保持默认即可;
    6. private key: 
    7. upload url: 员工端类型,使用1来表示员工端
    8. download url: 客户端类型,使用2来表示客户端
    9. thumbnail: 获取头像缩略图的URL
    10. as_id: AS服务的App Id 
    11. as_url: AS服务的URL地址,指向AS服务的地址,保持默认值即可
    12. as_token: AS服务的Token,需要跟Platform的msg-bridge的as_token保持一致;
    13. hs_token: HomeServer的Token信息,需要跟Platform的msg-bridge的token保持一致;
    14. sender_localpart: 匹配过滤Sender的信息,@*.表示接收所有的用户消息;
    15. as_namespace_users: 需要过滤的某个用户的信息,AS默认接收所有的消息;
    16. as_namespace_alias: 需要过滤的某个房间的别名信息,默认不填;
    17. as_namespace_rooms: 需要过滤的房间的信息,默认不填
    

    确认上述的配置信息准确无误后,点击“Launch”进行部署。chat服务部署成功后,可以看到如下的详细列表:
    0_1591061164515_951d78f7-d2f6-4edf-b86a-0c4aefb7e3a4-image.png
    图 13 chat服务详细列表

    网关服务提供FinChat的所有访问入口,该服务主要提供服务的路由、路由配置初始化和一个可视化的管理面板,查看当前gateway的路由配置信息。

    在Rancher的管理界面中点击Catalog Apps中选择“gateway”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出gateway服务的具体配置信息:
    0_1591061189103_88e9437f-890f-47dd-92ea-95007a6b2b62-image.png
    图 14 网关服务catalog

    确认上述的配置信息准确无误后,点击“Launch”进行部署。服务部署成功后,可以看到如下详细的列表:
    0_1591061217891_582d7953-7072-4344-8697-1fc86af36c59-image.png
    图 15 gateway 服务列表

    gateway服务部署成功后,接下来继续部署platform相关的服务。在Rancher的管理界面中点击Catalog Apps中选择“platform”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出platform服务的具体配置信息:
    0_1591061247243_67bc1511-eccd-4c7f-b3f9-ddf16ae12a50-image.png
    图 16 platform服务catalog

    需要注意的是这里AS token 和HomeServer Token 以及Id需要和chat 的Stack中的配置信息保持一致,否则msg-bridge无法收到HomeServer 推送过来的消息。确认上述的配置信息准确无误后,点击“Launch”进行部署。服务部署成功后,可以看到如下详细的服务列表:
    0_1591061270113_ab1e7c39-3f30-423a-a64a-6e7919d262c4-image.png
    图 17 platform服务详细列表

    在platform服务部署成功后,接下来继续部署Auth服务,该服务主要是对接客户的登录认证。

    在Rancher的管理界面中点击Catalog Apps中选择“auth”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出auth服务的具体配置信息:
    0_1591061290295_36e097ac-0cda-43d8-8d57-2b1383658fb8-image.png
    图 18 auth服务catalog
    确认上述的配置信息准确无误后,点击“Launch”进行部署。Auth服务部署成功后,可以看到如下的详细信息:
    0_1591061318267_5a5dac49-b97f-4c26-8425-ded3dbcf0f8e-image.png
    图 19 auth服务详细列表
    部署完auth服务之后,接下来继续部署adapter服务,该服务主要用于对接用户登录认证的适配。

    在Rancher的管理界面中点击Catalog Apps中选择“adapter”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.2”版本,选择后会弹出adapter服务的具体配置信息:
    0_1591150878242_4eace05c-6116-4fea-88fe-49183e541542-image.png
    图 20 adapter服务catalog

    上述小程序的APP_ID和APP_SECRET需要根据实际的使用情况进行配置。确认上述的配置信息准确无误后,点击“Launch”进行部署。

    4.6部署金易联业务服务

    金易联业务服务主要用于智能客服、系统派单、工单管理、知识库管理和搜索、敏感词管理等。

    在Rancher的管理界面中点击catalog中选择“swan”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,如果当前模板版本有更新的版本,则选择最新的版本,选择后会弹出服务的具体配置信息:
    0_1591150921351_e96f3eba-d9da-42e1-a210-3abe244aea71-image.png
    图 21 工单系统catalog

    检查相关的配置信息,确认准确无误后,点击“Launch”进行服务的部署。在工单系统服务部署成功后,即可看到如下的服务列表,具体如下:
    0_1591150941562_871f570b-14be-4ed5-8376-a9ad595da274-image.png
    图 22 swan服务列表

    金易联业务服务涉及的参数进行相关的说明:

    1. max_advisory: 咨询工单最大未处理数, 默认值1000
    2. knowledge_static_prefix: 知识库静态页面地址,主要修改域名部分
    3. tag_text_url: 智能标签服务调用地址
    4. mongo_domain: 数据库域名信息,使用rancher的service-name.stack-name方式
    5. mongo_auth: mongo数据库密码
    6. knowledge_port: 知识库搜索端口,保持默认值;
    7. detall_url: 知识库详情前缀,保持默认值
    8. assist_id: 智能助理账号id,根据实际情况进行变更
    9. assist_password: 智能助理密码,根据实际情况填写
    10. customer_id智: 能客服账号id
    11. customer_port: 智能客服接口端口,保持默认值即可
    12. customer_password: 智能客服密码
    13. bots_init: 机器人注册信息,用户客户初次登录添加对应的机器人账号;
    14. minaAppID: 小程序的AppID;
    15. avatar_url: 机器人初始化头像地址;
    

    4.7部署监控

    整套监控方案包括:

    (1)cadvisor: 提供容器监控服务,该服务会占用宿主机的18080端口,每台宿主机都需要部署该服务;
    (2)node-exporter: 宿主机监控服务,该服务会占用宿主机的9100端口,每台宿主机都需要部署该服务;
    (3)grafana: 监控展示面板;
    (4)prometheus: 监控数据存储;
    (5)alertmanager: 监控告警管理中心;
    (6)alert-webhook: 监控告警通知服务;
    (7)api-porber: API探测服务;
    在了解了整套监控方案后,根据我们提供的catalog来部署一套监控服务。在部署监控服务之前,需要在部署该监控服务的宿主机上添加以下两个label: “monitor.grafana=finochat”,“monitor.prometheus=finochat”。
    在Rancher的管理界面中点击catalog中选择“monitor”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择 1.0.0版本,选择后会弹出监控服务的具体配置信息:
    0_1591150969917_2c778cb2-35bc-45a5-920b-9e055b0588c7-image.png
    图 23监控配置详情

    上述变量配置中,每个变量的具体含义如下:

    catalog配置说明

    1. app: 用于设置机器的label,使用默认值即可
    2. admin password: 设置grafana的admin用户密码
    3. db path: 指定配置文件路径,不同机构的grafana面板配置不同
    4. prometheus config file: 设置promethues收集监控数据的配置文件,不同机构的监控指标不同
    5. alarm bot userid: 报警机器人id
    6. environment: 作为监控信息的机构环境名称
    7. api host: 设置api探针监控进行服务探测的api地址
    8. auth userid: api探测使用的用户id(去除finochat前后缀)
    9. auth fcid: api探测使用的用户id
    10. auth app token: api探测使用的用户token
    11. auth app type: api探测使用的app type
    12. auth login type: api探测使用的用户登陆方式
    

    在部署时,主要确认下“alarm bot userid”账号是否存在可用。信息确认无误以后,点击 “Launch”进行部署。部署成功后,在Rancher上看到每个服务的状态都为active,具体如下:
    0_1591150991668_76b7af78-9e33-4351-81a2-34b0f8455bf3-image.png
    图 24监控服务详情

    服务正常运行后,可以登录到grafana查看监控面板,看看数据是否正常。grafana默认密码为:fino123456

    5.机构对接指南

    金易联与机构的对接方式有两种:(1)金易联提供标准的接口供机构调用;(2)金易联提供所需要接口的协议,由机构调用实现。金易联按照第一种方式对接机构的模块三个:客户信息、员工信息、产品中心;按照第二种方式对接机构的模块有两个:验证中心、关系链。以下为每个模块的对接接口详情:

    5.1客户信息

    5.1.1导入一个客户

    HTTP POST
    /api/v1/swan/customer/retail
    请求的body是:

    field type
    retailId string 客户的fcid,不允许大写字母。形如:@retail_xxxx:domain 必填
    name string 客户名字 必填
    gender string 性别,默认为空字符串,F:女 M:男 可选
    avatar string 头像url 可选
    phone string 手机号 可选
    email string 电子邮箱 可选
    type int 客户类型。1:VIP 2:增量 3:存量 默认值0:未知 可选
    level int 账户级别 0:游客 1:注册账户 2:交易账户 可选
    from string 客户来源,由机构设置 可选
    address string 客户地址 可选
    department string 客户所属营业部。填营业部名字即可 可选
    fundCode string 资金账户 可选(如果是交易账户,此为必填项)

    profile json 客户画像,由机构设置。默认为: {riskLevel: 0, investmentVariety: 0, investmentPeriod: 0} 可选
    advisers jsonarray 签约投顾。形式为:{typeId:"" , typeName: "", staffId: ""} 可选
    visitingCard jsonarray 客户名片,这里是机构自定义样式和内容。是一个二维数组,其中value是内容;ratio占布局的百分比;align代表对齐方式,取值是0,1和2,分别代表居左,居中和居右形如:[[{"value": "", "ratio": 10, align: 0}, {}],[{}]] 可选
    openAccount bool 是否开户 可选
    signRisk bool 是否签风险协议书 可选
    rightsAll json 已开通业务。形如:{"shA": "1", "shB": "1"} 可选

    5.1.2批量导入客户

    HTTP POST
    /api/v1/swan/customer/retail/_bulk
    请求的body是:
    {
    "docs": [{}, {}] // 客户信息的数组,客户信息和单个客户导入一样
    }

    5.1.3以Excel方式批量导入客户

    通过管理后台页面的批量导入按钮将Excel文件上传(Excel模版可以在管理页面下载)。

    5.2员工信息

    5.2.1导入一个员工

    HTTP POST
    /api/v1/swan/manager/staff
    请求的body是:
    field type
    userId string 员工的fcid,不允许大写字母。形如:@staff_xxxx:domain 必填
    name string 员工的名字 必填
    phone string 手机号 可选
    mail string 邮箱 可选
    power bool 是否有接单权限,默认是true 可选
    notice json 抢单,派单的通知。rush是抢单,dispatch是派单,默认是{rush: true, dispatch: true} 可选
    avatar string 头像地址 可选
    jobTitle string 职位 可选
    practiceNum string 编号 可选
    expiryDate number 过期时间 可选
    salesDepartment string 营业部 可选
    hotline string 投诉电话 可选
    online bool 是否在线,默认是false 可选
    group [string] 所属分组,值是所属的组的ID 可选
    role string 角色,主要用于数据的权限 可选
    visitingCard [json] 员工名片,这里是机构自定义样式和内容。是一个二维数组,其中value是内容;ratio占布局的百分比;align代表对齐方式,取值是0,1和2,分别代表居左,居中和居右形如:[[{"value": "", "ratio": 10, align: 0}, {}],[{}]] 可选
    others json 保留字段,机构可在这里添加更多自定义的字段 可选

    5.2.2批量导入员工

    HTTP POST
    /api/v1/swan/manager/staff/_bulk
    请求body是:
    {
    "docs": [{}, {}] // 员工信息的数组,员工信息和导入单个员工一样
    }

    5.2.3以Excel方式批量导入员工

    通过管理后台页面的批量导入按钮将Excel文件上传(Excel模版可以在管理页面下载)。

    5.3产品中心

    5.3.1新增一个产品

    HTTP POST
    /api/v1/swan/product/fund
    请求的body是:
    field type
    code string 产品代码 必填
    parentCode string 母产品代码 可选
    name string 名字 必填
    shortName string 简称 可选
    pinyin string 拼音 可选
    riskLevel int 风险等级(0:低 1:中低 2:中 3:中高 4:高)字典表,是可配置的 必填
    investmentPeriod int 投资期限(0:短期 1:中期 2:长期)字典表,是可配置的 必填
    investmentVariety int 投资种类(0:股票 1:期货 2:国债 3:基金 4:信托)字典表,是可配置的 必填
    type int 产品类型(0:大集合 1:小集合 2:定向 3:专项 4:保本固定收益凭证 5:保本浮动收益凭证 6:非保本固定收益凭证 7:PE)字典表,是可配置的 必填
    style int 投资风格(0:混合 1: 单一)字典表,是可配置的 必填
    establishmentDate 时间戳 成立日期 必填
    managementPeriod int 管理期限 必填
    firstPurchase double 首次购买金额 必填
    additionalPurchase double 追加购买金额 必填
    performanceBenchmark double 业绩比较基准 必填
    expirationDate 时间戳 产品到期日期 必填
    updateNote string 数据更新备注 可选
    publishDate 时间戳 发行时间 必填
    promotion bool 是否推荐产品 可选
    author string 更新人 必填
    cumulativeRate string 累计收益(可对接机构系统获取) 可选
    unitNetValue string 单位净值(可对接机构系统获取) 可选
    dailyGain string 日收益(可对接机构系统获取) 可选
    annualIncrease string 年收益(可对接机构系统获取) 可选
    dividendInfo string 分红方式(可对接机构系统获取) 可选
    riskFlag bool 高风险标志(可对接机构系统获取) 可选
    firstPurchaseFlag bool 首次购买限制(可对接机构系统获取) 可选
    assets jsonarray 产品资产构成(可对接机构系统获取)。例如:[{type: "股票", rate: "80" , money: "8.63"}] type是类型,rate是占比,money是金额,以万元为单位 可选

    5.3.2批量新增产品

    HTTP POST
    /api/v1/swan/product/fund/_bulk
    请求的body是:
    {
    "docs": [{}, {}] // 产品的数组,产品信息和新增单个产品一样
    }

    5.3.3以Excel方式批量新增产品

    通过管理后台页面的批量导入按钮将Excel文件上传(Excel模版可以在管理页面下载)。

    5.4验证中心

    机构需要根据金易联提供的协议实现一个接口用于登录认证,由金易联调用。客户和员工的认证共同调用这个接口,但是其POST的请求体和返回的结果有稍许区别。
    5.4.1客户登陆验证
    HTTP POST
    /api/v1/provider/login
    请求的body:
    field type
    appType string RETAIL 必填
    loginType string 登录类型,pwd,token或sms 必填
    userId string FinoChat ID或客户ID,loginType为pwd时提供 可选
    password string 密码(loginType为pwd时提供) 可选
    token string 令牌(loginType为token时提供) 可选
    mobile string 手机号(loginType为sms时提供) 可选
    verification string 验证码(loginType为sms时提供) 可选
    accountType string 账户类型,可选device(游客)或register(注册账户) 必填
    deviceId string 设备ID(移动设备唯一ID) 可选
    机构需返回如下格式的数据:

    {
        "userId": "",                // 用户的ID
        "data":{                     // 机构自定义返回的字段
            "account_type": "",      
            "level": "",
            "id": "",
            "loginType": ""
        }
    }
    

    5.4.2员工登陆验证

    HTTP POST
    /api/v1/provider/login
    请求的body:
    field type
    appType string STAFF 必填
    loginType string 登录类型,pwd,token或sms 必填
    userId string FinoChat ID或客户ID,loginType为pwd时提供 可选
    password string 密码(loginType为pwd时提供) 可选
    token string 令牌(loginType为token时提供) 可选
    mobile string 手机号(loginType为sms时提供) 可选
    verification string 验证码(loginType为sms时提供) 可选
    accountType string 账户类型,可选device(游客)或register(注册账户) 可选
    deviceId string 设备ID(移动设备唯一ID) 可选
    机构需返回如下格式的数据:

    {
        "userId": "",                // 用户的ID
        "data":{                     // 机构自定义返回的字段
            "account_type": "",      
            "level": "",
            "id": "",
            "loginType": ""
        }
    }
    

    5.5关系链

    5.5.1获取用户通讯录列表
    HTTP GET
    /api/v1/fsc/users/:fcid/contacts
    field type
    fcid string finochat ID 必填
    机构需返回如下格式的数据:

    [
         {
             "type": "customer",
             "onclick": "fold",       // 折叠展开
             "icon": "http://xxx.png",
             "name": "我的客户",
             "submenu": {
                 "name": "客户管理",
                 "icon": "http://xxx.png",
                 "url": "http://localhost/x.html"
             }
         },
         {
             "type": "securities",
             "onclick": "window",     // 新建窗口并展示数据
             "icon": "http://xxx.png",
             "name": "行业通讯录"
         },
         {
             "type": "branches",
             "icon": "http://xxx.png",
             "onclick": "href",       // 跳转到H5页面
             "url": "http://localhost/x.html",
             "name": "我的组织"
         }
    ]
    

    5.5.2获取通讯录结构

    HTTP GET
    /api/v1/fsc/users/:fcid/contacts/:contactType
    field type
    fcid string finochat ID 必填
    contactType string 通讯录类型(customer, securities, branches等) 必填

    机构需返回如下格式的数据:

    {
         "branches": [                // 若无数据,返回空数组
             {
                 "id": "branch_1",    // 全局唯一id
                 "onclick": "fold",   // 折叠展开 
                 "icon": "http://xxx.png",
                 "name": "凡泰极客"
             },
             {
                 "id": "branch_2",    // 全局唯一id
                 "onclick": "window", // 新建窗口并展示数据 
                 "icon": "http://xxx.png",
                 "name": "测试中心"
             },
             {
                 "id": "branch_3",    // 全局唯一id
                 "onclick": "href",   // 跳转到H5页面
                 "url": "http://localhost/x.html",
                 "icon": "http://xxx.png",
                 "name": "研发中心"
             },
             {
                 "id": "branch_4",   // 全局唯一id
                 "onclick": "room",   // 跳转到聊天房间
                 "roomId": "!QWEdeg1345dFFEF:finolabs.club",
                 "icon": "http://xxx.png",
                 "name": "测试中心"
             }
         ],
         "users": [{                  // 若无数据,返回空数组
             "fcid": "@alice:finogeeks.club",
             "state": 0,              // 用户状态,0表示正常
             "name": "爱丽丝",
             "avatar": ""
         }]
    }
    

    5.5.3获取通讯详情

    HTTP GET
    /api/v1/fsc/users/:fcid/contacts/:contactType/:id
    Field Type Description
    fcid String Finochat ID 必填
    contactType String 通讯录类型 必填
    id String 分支结构ID 必填
    机构需返回如下格式的数据:

    {
         "branches": [{
             "id": "branch_3",
             "onclick": "fold",
             "icon": "http://xxx.png",
             "name": "研发中心"
         }],
         "users": [{
             "fcid": "@alice:finogeeks.club",
             "state": 0,              // 用户状态,0表示正常
             "name": "爱丽丝",
             "avatar": ""
         }]
    }
    

    5.5.4搜索用户

    HTTP GET
    /api/v1/fsc/local/search?arg=xxx&contactType=branches&myid=xxx
    Field Type Description
    arg String 搜索参数 必填
    contactType String branches搜索员工,customer搜索客户,可选字段 可选
    contactId String 部门ID,可选字段 可选
    myid String 接口调用方的Finochat ID,可选字段 可选

    机构需返回如下格式数据:

    [
       {
           "fcid": "@alice:finogeeks.club",
           "name": "爱丽丝",
           "avatar": ""
       }
    ]
    

    6.运维及应急手册
    见于附件:《服务日常运维手册.xlsx》