voice.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import { ref } from 'vue';
  2. import { Timer } from '@/utils/timer';
  3. import { ElMessage } from 'element-plus'
  4. import usePermissionStore from './permission';
  5. const useVoiceStore = defineStore('voice', () => {
  6. const usePermission = usePermissionStore();
  7. let HS_CTI = null;
  8. // 当前系统状态 - 闲 or 忙
  9. const systemState = ref(false);
  10. const telephoneNumber = ref(null);
  11. // 是否是拨打电话 true: 外呼 false: 来电
  12. const isMakingCall = ref(false);
  13. // 刚来电
  14. const callAnswered = ref(false);
  15. // 接听中
  16. const callDialing = ref(false);
  17. // 横条来电显示
  18. const noiceBarVisibleState = ref(false);
  19. // 盒子来电显示
  20. const noiceBoxVisibleState = ref(false);
  21. // 通话时长
  22. const callTime = ref('00:00:00');
  23. const timer = new Timer(callTime);
  24. // 开始时间
  25. const startTime = '';
  26. const endTime = '';
  27. const sessionId = ref(null);
  28. // 是否有拨打电话权限
  29. const isAuthPane = computed(() => usePermission.routes.findIndex(({ name }) => name === 'Console') !== -1);
  30. // 拨打电话
  31. const onMakingCall = async (phoneNum) => {
  32. if ( callAnswered.value ) {
  33. return ElMessage({
  34. message: '当前状态不允许操作,无法呼出',
  35. type: 'warning',
  36. })
  37. };
  38. if ( !systemState.value ) {
  39. return ElMessage({
  40. message: '作息状态置忙,无法呼出',
  41. type: 'warning',
  42. })
  43. }
  44. callAnswered.value = true;
  45. const { data } = await makeCall(phoneNum);
  46. sessionId.value = data;
  47. telephoneNumber.value = phoneNum;
  48. isMakingCall.value = true;
  49. noiceBarVisibleState.value = true;
  50. }
  51. // 接听电话
  52. const onCallAnswered = async () => {
  53. callDialing.value = true;
  54. callAnswered.value = true;
  55. await answer();
  56. timer.start();
  57. // TODO 这里需要补充其他逻辑
  58. }
  59. // 挂断电话
  60. const onCallDisconnected = async () => {
  61. noiceBarVisibleState.value = false;
  62. noiceBoxVisibleState.value = false;
  63. callAnswered.value = false;
  64. timer.resetTimer();
  65. // const currentTimer = timer.updateDisplay();
  66. // 挂断
  67. await bye();
  68. ElMessage({
  69. message: '通话已经结束,挂断成功',
  70. type: 'success',
  71. plain: true,
  72. })
  73. // TODO 这里需要补充其他逻辑
  74. }
  75. // 置忙
  76. const setBusy = () => {
  77. systemState.value = false;
  78. HS_CTI.setBusy().then(res => { console.log(res) });
  79. };
  80. // 置闲
  81. const setIdle = () => {
  82. systemState.value = true;
  83. HS_CTI.setIdle().then(res => { console.log(res) });
  84. }
  85. // 获取坐席状态
  86. const getAgentStatus = () => {
  87. HS_CTI.getAgentStatus().then(res => { console.log(res) })
  88. }
  89. // 主动外呼
  90. const makeCall = called => HS_CTI.makeCall({ called })
  91. // 接听电话
  92. const answer = () => {
  93. HS_CTI.answer().then(res => { console.log(res) })
  94. }
  95. // 挂断电话
  96. const bye = async () => {
  97. return await HS_CTI.serverBye().then(res => { console.log(res) })
  98. }
  99. // 卸载实例
  100. const unInit = async () => {
  101. return await HS_CTI.unInit()
  102. }
  103. // 下面开始事件监听
  104. const listenScoketEvent = (CTIEvent) => {
  105. HS_CTI.on(CTIEvent.OnAgentWorkReport, ({ workStatus, description, callId, phone }) => {
  106. console.log( "workStatus", workStatus );
  107. // 销毁实例调用签出接口成功后 - 坐席签出
  108. if ( workStatus === -1 ) {
  109. ElMessage({
  110. message: '坐席签出成功',
  111. type: 'success',
  112. plain: true,
  113. })
  114. }
  115. // 登录CTI 成功
  116. if ( workStatus === 0 ) {
  117. // ElMessage({
  118. // message: '坐席登入成功',
  119. // type: 'success',
  120. // plain: true,
  121. // })
  122. }
  123. // 登录CTI 成功
  124. if ( workStatus === 2 ) {
  125. // ElMessage({
  126. // message: '登入成功',
  127. // type: 'success',
  128. // plain: true,
  129. // })
  130. }
  131. // 调用置闲接口成功后
  132. if ( workStatus === 2 ) {
  133. // ElMessage({
  134. // message: '坐席状态变更为:置闲',
  135. // type: 'success',
  136. // plain: true,
  137. // })
  138. }
  139. // 调用置忙接口成功后
  140. if ( workStatus === 3 ) {
  141. // ElMessage({
  142. // message: '当前坐席状态:置忙',
  143. // type: 'warning',
  144. // plain: true,
  145. // })
  146. }
  147. // 座席振铃
  148. if ( workStatus === 5 ) {
  149. sessionId.value = callId;
  150. telephoneNumber.value = phone;
  151. isMakingCall.value = false;
  152. noiceBarVisibleState.value = true;
  153. ElMessage({
  154. message: '来电话了',
  155. type: 'warning',
  156. plain: true,
  157. })
  158. }
  159. // 挂断 任意一方挂断
  160. if ( workStatus === 7 ) {
  161. // ElMessage({
  162. // message: '当前坐席状态:置忙',
  163. // type: 'warning',
  164. // plain: true,
  165. // })
  166. }
  167. })
  168. }
  169. // 初始化 通话实例
  170. const HS_CTI_INSTANCE = (agent_id) => {
  171. const { Scene, getInstance, LoggerLevels , CTIEvent} = window.HS_CTI;
  172. HS_CTI = getInstance({
  173. // 业务返回的坐席outId
  174. agent_id,
  175. // 根据城市可能不一样,
  176. saas_id:'mdj',
  177. // 业务场景详见 Scene 枚举,
  178. scene: Scene.Manual,
  179. // SDK 日志等级
  180. loggerLevel: LoggerLevels.debug,
  181. // 环境变量
  182. env: 'development'
  183. })
  184. HS_CTI.init();
  185. listenScoketEvent(CTIEvent);
  186. }
  187. return {
  188. sessionId,
  189. isAuthPane,
  190. callTime,
  191. isMakingCall,
  192. onMakingCall,
  193. onCallDisconnected,
  194. onCallAnswered,
  195. callAnswered,
  196. callDialing,
  197. noiceBarVisibleState,
  198. noiceBoxVisibleState,
  199. // 电话号码
  200. telephoneNumber,
  201. // 系统状态
  202. systemState,
  203. // 通话相关
  204. HS_CTI_INSTANCE,
  205. setBusy,
  206. setIdle,
  207. unInit
  208. }
  209. })
  210. export default useVoiceStore;