react_hsbc_teller 1.6.6 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,7 @@
4
4
  import React, { Component, useState } from 'react';
5
5
  import API from '../../api/api';
6
6
  import { initWebSocket, joinRoom, disconnect } from '../../common/websocket';
7
+ import { BoardOperate } from '../../common/index.esm.js';
7
8
  import './video.less'
8
9
  import Header from '../header/header.jsx'
9
10
  import Foot from '../foot/foot.jsx'
@@ -23,10 +24,11 @@ import Spin from "antd/lib/spin";
23
24
  import 'antd/lib/spin/style'
24
25
  import Select from "antd/lib/select";
25
26
  import 'antd/lib/select/style'
26
-
27
+ import styled from 'styled-components';
27
28
  import { Button } from '../../../node_modules/antd/lib/index';
28
29
  import SignMy from '../sign/signMy.jsx'
29
30
  import axios from 'axios';
31
+ import CryptoJS from "crypto-js";
30
32
  const { Option } = Select;
31
33
  const LEAVE_TYPE = {
32
34
  TELLER_EXIT: 1, // 坐席退出
@@ -42,6 +44,37 @@ let messageValue = ''
42
44
  let beautyNum = 0 // 0-关闭 1--弱 2--中 5---高
43
45
  let rateList = []
44
46
  let beautyDiv = {};
47
+ let CanvasHome = styled.div`
48
+ position: fixed;
49
+ width: 76vw;
50
+ height: 74vh;
51
+ top: 3vh;
52
+ left: 1.5vw;
53
+ z-index: ${props=>props.zIndexNum};
54
+
55
+ .canvas{
56
+ width:100%;
57
+
58
+ height:100%;
59
+ box-shadow: 0 0 5px 0 #06a;
60
+ display:none;
61
+ }
62
+ `;
63
+ const OpreateDiv = styled.div`
64
+ display: inline-block;
65
+ margin-left: 10vw;
66
+ padding: 0 6px;
67
+ height: 40px;
68
+ line-height: 40px;
69
+ border-radius: 5px;
70
+ background: #fff;
71
+ font-size: 16px;
72
+ border: #333 1px solid;
73
+ span{
74
+ margin-right:10px;
75
+ cursor:pointer;
76
+ }
77
+ `;
45
78
  function clearStreamRemain() {
46
79
  if (!(beautyDiv.beauty_canvas == null || beautyDiv.beauty_canvas == undefined)) {
47
80
  beautyDiv.beauty_canvas = null;
@@ -69,6 +102,7 @@ message.config({
69
102
  class Video extends Component {
70
103
  constructor(props) {
71
104
  super(props)
105
+ this.boardOperate = null;
72
106
  }
73
107
  cancel = axios.CancelToken.source()
74
108
  state = {
@@ -213,10 +247,18 @@ class Video extends Component {
213
247
  ],
214
248
  shareMaskState: false,
215
249
  idCardName: '',
216
- idCardNumber: ''
250
+ idCardNumber: '',
251
+ operateShow: false,
252
+ drawConfig: {
253
+ curryControl: 'pen', // 工具类型
254
+ },
255
+ zIndexNum: -1,
256
+ selectSpan: 'pen'
217
257
  };
218
258
  // eslint-disable-next-line no-undef
219
259
  test_controller = '';
260
+
261
+
220
262
  /**
221
263
  * 创建房间成功后回调后台
222
264
  * @param {JSON} data 数据类型
@@ -297,6 +339,35 @@ class Video extends Component {
297
339
 
298
340
  }
299
341
  };
342
+ decrypt(data) {
343
+ let keyStr = "le&&If?()*^%$#hA"
344
+ let iv = CryptoJS.enc.Utf8.parse("jwe232DEE?^%$eq3")
345
+ let encryptedHexStr = CryptoJS.enc.Hex.parse(data);
346
+ let content = CryptoJS.enc.Base64.stringify(encryptedHexStr);
347
+ let key = CryptoJS.enc.Utf8.parse(keyStr);
348
+ let decrypt = CryptoJS.AES.decrypt(content, key, {
349
+ iv: iv,
350
+ mode: CryptoJS.mode.CBC,
351
+ padding: CryptoJS.pad.Pkcs7,
352
+ });
353
+ return CryptoJS.enc.Utf8.stringify(decrypt).toString();
354
+ }
355
+ encrypt(data) {
356
+ let keyStr = "le&&If?()*^%$#hA"
357
+ let iv = CryptoJS.enc.Utf8.parse("jwe232DEE?^%$eq3")
358
+ let dataString = data;
359
+ if (typeof data !== "string") {
360
+ dataString = JSON.stringify(data);
361
+ }
362
+ const key = CryptoJS.enc.Utf8.parse(keyStr);
363
+ let sc = CryptoJS.enc.Utf8.parse(dataString);
364
+ let encrypted = CryptoJS.AES.encrypt(sc, key, {
365
+ iv: iv,
366
+ mode: CryptoJS.mode.CBC,
367
+ padding: CryptoJS.pad.Pkcs7,
368
+ });
369
+ return encrypted.ciphertext.toString();
370
+ }
300
371
  /**
301
372
  * 初始化获取数据
302
373
  * @param {JSON} data 数据类型
@@ -304,18 +375,13 @@ class Video extends Component {
304
375
  mpaasSig = async data => {
305
376
  console.log(data);
306
377
  try {
307
- let result = await API.mpaasSig({ account: data.account, type: data.type });
308
- console.log(result);
378
+ // let result = JSON.parse(this.decrypt(await API.mpaasSig({ ciphertext: this.encrypt({account: data.account, type: data.type})})));
379
+ let result = await API.mpaasSig({account: data.account, type: data.type});
380
+ console.log('mpaasSig',result,result.mpsSig);
309
381
  window.sessionStorage.setItem('alimpassSig', result.mpsSig);
310
382
  this.state.workSpaceId = result.workspaceId,
311
383
  this.state.appId = result.appId,
312
384
  this.state.bizName = result.bizName
313
- // const data1={
314
- // hostname: 'im.uat.dsp.hsbcfts.com.cn',
315
- // webPort: '443',
316
- // account: 'web',
317
- // openfireToken: '123'
318
- // }
319
385
  window.sessionStorage.setItem('sigData', JSON.stringify(result));
320
386
  if (data.sigType == 1) {
321
387
  this.handleEdit()
@@ -430,9 +496,9 @@ class Video extends Component {
430
496
  {
431
497
  tag: 'projectionWhiteboard',
432
498
  xPosition: 0,
433
- yPosition: 270,
434
- width: 1280,
435
- height: 720
499
+ yPosition: 175,
500
+ width: 960,
501
+ height: 540
436
502
  },
437
503
  // {
438
504
  // tag: 'VIDEO_SOURCE_SCREEN_ONE',
@@ -452,43 +518,43 @@ class Video extends Component {
452
518
  tag: 'tag1',
453
519
  xPosition: 0,
454
520
  yPosition: 0,
455
- width: 310,
456
- height: 180
521
+ width: 213,
522
+ height: 175
457
523
  },
458
524
  {
459
525
  tag: 'customer1',
460
- xPosition: 320,
526
+ xPosition: 213,
461
527
  yPosition: 0,
462
- width: 310,
463
- height: 180
528
+ width: 213,
529
+ height: 175
464
530
  },
465
531
  {
466
532
  tag: 'customer2',
467
- xPosition: 640,
533
+ xPosition: 426,
468
534
  yPosition: 0,
469
- width: 310,
470
- height: 180
535
+ width: 213,
536
+ height: 175
471
537
  },
472
538
  {
473
539
  tag: 'customer3',
474
- xPosition: 960,
540
+ xPosition: 639,
475
541
  yPosition: 0,
476
- width: 310,
477
- height: 180
542
+ width: 213,
543
+ height: 175
478
544
  },
479
545
  {
480
546
  tag: 'customer4',
481
- xPosition: 1280,
547
+ xPosition: 852,
482
548
  yPosition: 0,
483
- width: 310,
484
- height: 180
549
+ width: 213,
550
+ height: 175
485
551
  },
486
552
  {
487
553
  tag: 'customer5',
488
- xPosition: 1600,
554
+ xPosition: 1065,
489
555
  yPosition: 0,
490
- width: 310,
491
- height: 180
556
+ width: 213,
557
+ height: 175
492
558
  },
493
559
  // {
494
560
  // tag: 'customer6',
@@ -542,17 +608,25 @@ class Video extends Component {
542
608
  width: item.width,
543
609
  height: item.height
544
610
  })
545
- }) : list.push({
611
+ }) :
612
+ list.push({
546
613
  tag: 'VIDEO_SOURCE_SCREEN',
547
- xPosition: 1290,
548
- yPosition: 640,
549
- width: 630,
550
- height: 350
614
+ xPosition: 960,
615
+ yPosition: 535,
616
+ width: 320,
617
+ height: 180
551
618
  })
619
+ // list.push({
620
+ // tag: 'VIDEO_SOURCE_SCREEN_19_9',
621
+ // xPosition: 960,
622
+ // yPosition: 573,
623
+ // width: 304,
624
+ // height: 144
625
+ // })
552
626
  const filePath = 'recordId_' + new Date().valueOf();
553
627
  const recordParam = {};
554
- recordParam.width = 1920;
555
- recordParam.height = 1080;
628
+ recordParam.width = 1280;
629
+ recordParam.height = 720;
556
630
  recordParam.recordTotalStream = 0;
557
631
  recordParam.startTimeout = 10;
558
632
  recordParam.splitType = 0;
@@ -564,7 +638,7 @@ class Video extends Component {
564
638
  type: 1, // 1 为时间戳⽔印;2 为⽂字⽔印;3 为图⽚⽔印
565
639
  id: 1, // ⽔印 ID
566
640
  enable: true,
567
- xPosition: 10, // x 轴位置
641
+ xPosition: 1000, // x 轴位置
568
642
  yPosition: 10, // y 轴位置
569
643
  text: '', // ⽔印⽂字
570
644
  fontSize: 16, // 字体⼤⼩
@@ -2492,6 +2566,12 @@ class Video extends Component {
2492
2566
  this.test_controller.OnNewJoinerIn = (participant) => {
2493
2567
  console.log('新加⼊房间者', participant);
2494
2568
  this.state.isCustomer= true
2569
+ if(this.props.isOpenSound) {
2570
+ let src = autod
2571
+ let audio = new Audio(src)
2572
+ audio.play()
2573
+ }
2574
+
2495
2575
  // let src = autod
2496
2576
  // let audio = new Audio(src)
2497
2577
  // audio.play()
@@ -2879,9 +2959,13 @@ class Video extends Component {
2879
2959
  exitType
2880
2960
  ) => {
2881
2961
  console.log('退出房间者', participant, exitType)
2882
- // let src = leftMetting
2883
- // let audio = new Audio(src)
2884
- // audio.play()
2962
+ if(this.props.isOpenSound) {
2963
+ let src = leftMetting
2964
+ let audio = new Audio(src)
2965
+ audio.play()
2966
+ }
2967
+
2968
+
2885
2969
  this.appGetUsernameClick(participant).then((res)=>{
2886
2970
  console.log('退出房间者',res)
2887
2971
  let data = res? res.username ? res.username : '客户' : '客户'
@@ -3207,7 +3291,6 @@ userType:'1'
3207
3291
  this.state.analyserHeight = this.state.analyserHeight
3208
3292
  }
3209
3293
  }
3210
-
3211
3294
  this.state.OnVolumeAnalyserMap.set(sid,setInterval(
3212
3295
  this.test_controller.OnVolumeAnalyser.bind(this, sid, analyser),
3213
3296
  300
@@ -3255,6 +3338,7 @@ userType:'1'
3255
3338
  let result = await API.videoRecordCallback({
3256
3339
  activityId: this.props.businessNumber,
3257
3340
  sessionId: this.state.sessionId,
3341
+ roomId: this.state.channelId + '',
3258
3342
  type: type,
3259
3343
  status: status
3260
3344
  });
@@ -3450,7 +3534,6 @@ userType:'1'
3450
3534
 
3451
3535
  this.props.resourcePath + "/eruda.js",
3452
3536
  this.props.resourcePath + "/iconfont.js",
3453
- this.props.resourcePath + "/dialogue.css",
3454
3537
 
3455
3538
 
3456
3539
 
@@ -3804,7 +3887,7 @@ userType:'1'
3804
3887
  isModalVisibleEnd: false
3805
3888
  })
3806
3889
  };
3807
- confirmCallback=async()=>{
3890
+ confirmCallback=async(data)=>{
3808
3891
  try {
3809
3892
  let result = await API.confirmCallback({
3810
3893
  idCardName: this.state.idCardName,
@@ -3814,16 +3897,33 @@ userType:'1'
3814
3897
  idCardNumber: this.state.idCardNumber,
3815
3898
  sessionId: this.state.sessionId,
3816
3899
  });
3900
+ console.log('confirmCallback',result)
3817
3901
  if (result.code == 200) {
3818
- this.setState({
3819
- isModalVisibleFacial: false,
3820
- idCardNumber: '',
3821
- idCardName: ''
3822
- })
3902
+ console.log(data)
3903
+ if(data == 'noFace') {
3904
+ this.setState({
3905
+ isModalVisibleFacial: false,
3906
+ idCardNumber: '',
3907
+ idCardName: ''
3908
+ })
3909
+ } else {
3910
+ console.log('data')
3911
+ this.state.faceCustomerType = 1
3912
+ this.setState({
3913
+ idCardNumber: '',
3914
+ idCardName: '',
3915
+ titleModal: '人脸识别',
3916
+ // clickedFacial: true,
3917
+ facialImg: this.test_controller.TakePicture(1, undefined, undefined, this.state.customOcrSid, 'png')
3918
+ })
3919
+ }
3920
+
3823
3921
  } else {
3922
+ console.log('1')
3824
3923
  this.messageClick('保持信息失败','error')
3825
3924
  }
3826
3925
  } catch (err) {
3926
+ console.log('2')
3827
3927
  this.messageClick('保持信息失败','error')
3828
3928
  }
3829
3929
  }
@@ -4390,13 +4490,87 @@ userType:'1'
4390
4490
  // }
4391
4491
  }
4392
4492
  }
4393
-
4394
4493
  this.navigatorClick()
4494
+
4395
4495
  } else {
4396
4496
  this.messageClick('internal staff正在共享屏幕,请先关闭','error')
4397
4497
  }
4398
4498
  }
4399
4499
  }
4500
+ openCanvas(drawCanvas) {
4501
+ if (!this.boardOperate) {
4502
+ this.boardOperate = new BoardOperate(drawCanvas, {
4503
+ drawColor: "#000000",
4504
+ drawType: "pen",
4505
+ lineWidth: 5,
4506
+ fillStyle: '', // 初始背景色,若为空则透明背景
4507
+ });
4508
+ }
4509
+ }
4510
+ closeCanvas() {
4511
+ this.boardOperate.destroy();
4512
+ this.boardOperate = null;
4513
+ }
4514
+
4515
+ setTool(type) {
4516
+ const { drawConfig } = this.state;
4517
+ drawConfig.curryControl = type;
4518
+ this.boardOperate.changeWay({
4519
+ type
4520
+ });
4521
+
4522
+ this.setState({ drawConfig,selectSpan: type });
4523
+ }
4524
+
4525
+ setOpreate(type) {
4526
+ this.boardOperate[type]();
4527
+ }
4528
+ downCanvas() {
4529
+ const canvas = document.getElementById('canvas');
4530
+ const base64 = canvas.toDataURL();
4531
+
4532
+
4533
+ let img = document.createElement('img');
4534
+ img.style.position = 'fixed';
4535
+ img.style.width = '90vw';
4536
+ img.style.height = '95vh';
4537
+ img.style.top = '9vh';
4538
+ img.style.left = '5vw';
4539
+ img.src = base64;
4540
+ document.body.appendChild(img);
4541
+
4542
+ }
4543
+ graffiti=()=>{
4544
+ if(!this.state.operateShow) {
4545
+ this.setState({
4546
+ zIndexNum: 999
4547
+ })
4548
+ this.change(true)
4549
+ }
4550
+
4551
+ }
4552
+ closeGraffiti=()=>{
4553
+ this.setState({
4554
+ zIndexNum: -1
4555
+ })
4556
+ this.change(false)
4557
+ }
4558
+ change(val) {
4559
+ this.setState({ operateShow: val })
4560
+ const canvas = document.getElementById('canvas');
4561
+ if (val) {
4562
+ canvas.style.display = 'block';
4563
+ canvas.width = canvas.clientWidth;
4564
+ canvas.height = canvas.clientHeight;
4565
+ setTimeout(() => {
4566
+ this.openCanvas(canvas)
4567
+ }, 0);
4568
+ } else {
4569
+ // this.downCanvas()
4570
+ this.closeCanvas();
4571
+ canvas.style.display = 'none';
4572
+ }
4573
+ }
4400
4574
  switchSelect = (value) => {
4401
4575
  this.setState({
4402
4576
  isSelect: value,
@@ -4759,7 +4933,19 @@ userType:'1'
4759
4933
  {tabTitleList}
4760
4934
  {/* <img style={sectionStyle} src={require("../../assets/img/placeholder_bg.png").default} alt="" /> */}
4761
4935
  <div id="whiteboardDIV" style={{height: 'calc(100% - 33px)'}}>
4762
-
4936
+ <CanvasHome zIndexNum={this.state.zIndexNum} style={{width: this.state.whiteboardWidth,height: this.state.whiteboardHeight}}>
4937
+ {this.state.operateShow &&
4938
+ <OpreateDiv id="operate">
4939
+ <span style={{color: this.state.selectSpan == 'pen' ? '#1890ff' : '#333'}} onClick={() => this.setTool('pen')}>铅笔</span>
4940
+ <span style={{color: this.state.selectSpan == 'eraser' ? '#1890ff' : '#333'}} onClick={() => this.setTool('eraser')}>橡皮</span>
4941
+ <span onClick={() => this.setOpreate('undo')}>撤销</span>
4942
+ <span onClick={() => this.setOpreate('redo')}>恢复</span>
4943
+ <span onClick={() => this.setOpreate('clear')}>清除</span>
4944
+ <span onClick={() => this.closeGraffiti()}>关闭</span>
4945
+ </OpreateDiv>
4946
+ }
4947
+ <canvas id="canvas" className="canvas"></canvas>
4948
+ </CanvasHome>
4763
4949
  <div className="videoDiv" style={{ display: (this.state.isSelect == 'RMScreen' || this.state.isSelect == 'staffScreen') ? '' : 'none', }}>
4764
4950
  <div className="videoDiv">
4765
4951
  <video
@@ -5251,6 +5437,7 @@ userType:'1'
5251
5437
  switchExternal={this.switchExternal}
5252
5438
  inspection={this.inspection}
5253
5439
  beautyClick={this.beautyClick}
5440
+ graffiti={this.graffiti}
5254
5441
  ></Foot>
5255
5442
  <Modal cancelText="取消" okText="确定" visible={this.state.isModalVisible} onOk={this.handleOk}
5256
5443
  onCancel={this.handleCancel}>
@@ -5276,7 +5463,8 @@ userType:'1'
5276
5463
  <Button className="modelButtonOk" type="primary" danger onClick={this.handleOkFacial}>确定</Button>
5277
5464
  </div>,
5278
5465
  this.state.idCardName && <div key='facial'>
5279
- <Button className="modelButtonOk" type="primary" danger onClick={this.confirmCallback}>确认</Button>
5466
+ <Button className="modelButtonFaceOk" danger onClick={(e)=>this.confirmCallback('face')}>完成并发起人脸识别</Button>
5467
+ <Button className="modelButtonOk" type="primary" danger onClick={(e)=>this.confirmCallback('noFace')}>完成</Button>
5280
5468
  </div>
5281
5469
  ]}>
5282
5470
  <div className="faceBody">
@@ -5414,7 +5602,7 @@ sessionId: "",
5414
5602
  microphoneSize: 25,
5415
5603
  fontSize: '14',
5416
5604
  fontFamily: 'auto',
5417
- menus: ['BOARD','SHARE', 'FRIES', 'OCR', 'INVITE', 'PIP', 'BEAUTY'],
5605
+ menus: ['BOARD','SHARE', 'FRIES', 'OCR', 'INVITE', 'PIP', 'BEAUTY','GRAFFITI'],
5418
5606
  customLeaveRoom: '客户离开房间',
5419
5607
  meetingInfo: {
5420
5608
  title: '--',
@@ -5424,6 +5612,7 @@ sessionId: "",
5424
5612
  },
5425
5613
  isTranscribing: false,
5426
5614
  shareMask: false,
5615
+ isOpenSound: false, // true开启进出音效 false不开启
5427
5616
  internalUrl: 'https://wp-staff-gateway.wealth-platform.uat.ali.cloud.cn.hsbc/meeting-ui/OHB/CN/HSBC?chnlID=OHB&locale=zh_CN&chnlCC=CN&chnlGMC=HSBC&targetFunc=supervisorMeeting&sourceFunc=rmMeeting'
5428
5617
  }
5429
5618
  export default Video
@@ -378,6 +378,15 @@
378
378
  background: #DB0011!important;
379
379
  border-spacing: 20px!important;
380
380
  }
381
+ .modelButtonFaceOk{
382
+ width: 170px!important;
383
+ height: 40px!important;
384
+ font-size: 16px!important;
385
+ color: #333!important;
386
+ border: 1px #333 solid!important;
387
+ background: #fff!important;
388
+ border-spacing: 20px!important;
389
+ }
381
390
  .endModal{
382
391
  font-size: 16px;
383
392
  padding: 56px 30px 0px 30px;