@jiangyifen
2017-10-20T08:49:19.000000Z
字数 3347
阅读 698
中间件
备注:
1)由于rsmw没有牵涉到自定义表,所以可以比较方便地采用【tenantId列】,也就是“共享表”的方案。对于有自定义表的项目,采用独立schema的方案比较适合
2)如何确定登陆用户属于哪个tenant?对于tenantId列的方案中,可以直接通过登录名确定tenant;而在非tenantId列的方案中,就需要通过域名或登陆界面的用户输入(如直接输入tenant,或用户名@tenant之类的形式)来确定tenant
增加租户前缀长度,默认设置为4
tenantPrefixLength = 4
这个长度主要是在tenant增删改查时,用于生成tenantPrefix或校验的
所有呼叫,尽早确认tenantId,tenantPerfix,并且保存到channelVariable中
手播的号码送到coreroute时,先根据sipPhone的channel里实际sipphone.name确定tenantPrefix
然后拼接到exten(也就是手播的号码)前面,判断是否内部exten。如果不是,直接把没有拼接的号码当做外部号码处理
电话从accessNumber呼入时
根据accessNumber确定tenantId
从接口发起呼叫时
直接通过接口指定的src,dst确定tenantId
IVR中拨打分机号
MyCache数据结构考虑
entity,service,controller增加tenantId
注意,这些字段要和tenantId做联合唯一(索引、页面校验)
rsmw_contact.phonenumber
rsmw_moh.name
rsmw_blacklist.phonenumber
config区分全局配置项和租户配置项
不需要增加tenantId列的表:
所有的多对多link表
rsmw_mobile_info (应当改名成sys_mobile_info)
rsmw_gateway 需要tenantId列(tenantId=0代表属于全局,而不是属于特定tenant)
datatable套路
save,update的modal页面分两部分,一部分是tenant本身的字段,另一部分用于维护tenantConfig
tenant字段
向导形式:
1)租户名称(客户公司名称,前缀由系统生成)
2)填写接入号(后台校验是否已存在)
3)填写分机数量
注意,tenantPerfix的长度需要严格根据ConfigKeys.tenantPrefixLength检查,一位不能多一位不能少
实体 | 字段 | 说明 | 类型 | 长度 | 索引 | 必填 |
---|---|---|---|---|---|---|
rsmw_tenant | id | 主键 | bigint | 20 | PK | 是 |
rsmw_tenant | name | 租户名称 | varchar | 64 | 是 | 是 |
rsmw_tenant | tenantPerfix | 租户前缀(1000~9999) | int | 11 | 唯一 | 是 |
登陆名:租户管理员的手机号+密码;手机号作为字段,保存在租户表,并做唯一性约束
在tenantManager中设置手机号;初始密码通过短信发送到手机;
看状态:sip分机状态、技能组概览、技能组详情
查话单,听录音:话单和录音、语音留言
电话会议:会议大厅、会议录音
配置:SIP分机(仅限编辑)、呼入路由、IVR、IVR语音资源、技能组、技能组提示音、电话会议、语音信箱、背景音乐、黑名单
所有可以让用户自己新增的项,都需要限制数量!!
查报表
【暂缓,需要测试多方时的cpu消耗】
电话会议界面需要单独账号登陆
操作电话会议(按开通功能,免费开放1个会议室,并只能开3分钟的会议,并在页面提示订购方式)
查电话会议录音(按开通功能)
备注:
1)由于qqd牵涉到自定义表,所以不适合采用【tenantId列】,也就是“共享表”的方案。对于有自定义表的项目,采用独立schema的方案比较适合。
2)如何确定登陆用户属于哪个tenant?对于tenantId列的方案中,可以直接通过登录名确定tenant;而在非tenantId列的方案中,就需要通过域名或登陆界面的用户输入(如直接输入tenant,或用户名@tenant之类的形式)来确定tenant。
3)qqd的表,包含一个全局库(qqd+rsmw),X个租户库(qqd_1, qqd_2, qqd_X)
参照udesk,在登陆界面输入注册时填写的域名,点击跳转(参考http://www.udesk.cn/login_notification)。登陆的indexController可以用域名来明确tenantId
[方案2]:用user_user表的uuid作为aid
这个貌似更好。就是有较大的测试量
不用动
单租户版本 的superDao需要修改成 多租户分库版本 superDaoMultitenant
相关method的定义,都在第一个参数的位置,增加Long tenantId字段
各处的loadToCache要考虑仅加载指定tenant的数据:
QqdCache里的相关map改成 Map>
原有的loadToCache需要增加tenantId参数
Init中执行的loadToCache需要for循环轮询所有tenant
单租户版本的superDao访问全局库
多租户分库版本的superDaoMultitenant访问租户库
单租户版本的congifService访问全局库
多租户分库版本的configServiceMultitenant访问租户库
单租户版本的extColumnService需要修改成多租户分库版本 extColumnServiceMultitenant
为了实现不同租户连接数据库里不同的schema,相关的DbUtil.getDbname()改成DbUtil.getDbname(Long tenantId)
SqlBuilder中如何获取TenantId?
从CommRequestParams.request获取。可以用SessionUtil.getTenantId(HttpServletRequest request)
rsmw包下的报表是用tenantId列的方案,所以需要加上where tenantId=xx
注意哪些线程与tenant有关
注意所有使用DbUtil.defaultTenantId的地方
多租户版本是否要群呼?之前许总明确提过,多租户版本不要群呼。
待定
rcc/boss,功能包括
租户的管理(租户增删改查,租期,费用,座席数量等。注意关键操作要有日志)
录音的管理
线路的配置
租户数量