react_hsbc_teller 2.0.79 → 2.0.80
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.
- package/README.md +3 -0
- package/lib/hsbc.js +1 -1
- package/package.json +1 -1
- package/packages/pages/video/video.jsx +24 -2
- package/packages/utils/utils.js +93 -82
package/package.json
CHANGED
|
@@ -25,7 +25,7 @@ import { Button } from '../../../node_modules/antd/lib/index';
|
|
|
25
25
|
import Slider from 'antd/lib/slider';
|
|
26
26
|
import 'antd/lib/slider/style'
|
|
27
27
|
import './video.less'
|
|
28
|
-
import { compressImage, isLight, saveBase64Image, combineBase64Images } from '../../utils/utils'
|
|
28
|
+
import { compressImage, isLight, saveBase64Image, combineBase64Images, dateTime } from '../../utils/utils'
|
|
29
29
|
import Recorder from "js-audio-recorder";
|
|
30
30
|
import MyAsrController from '../../utils/asrController'
|
|
31
31
|
import Header from '../header/header.jsx'
|
|
@@ -64,7 +64,8 @@ import MultiModule from '../multiModule/multiModule'//签字、抄录
|
|
|
64
64
|
import axios from 'axios';
|
|
65
65
|
import CryptoJS from "crypto-js";
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
|
|
68
|
+
const SDK_VERISON = '2.0.80'
|
|
68
69
|
const IDtypeFront = '请客户在其设备后置摄像头下展示证件正面(如:身份证照片页面)'
|
|
69
70
|
const IDtypeBack = '请在后置摄像头下展示证件反面(如:身份证国徽页)'
|
|
70
71
|
const { Option } = Select;
|
|
@@ -2636,6 +2637,26 @@ class Video extends Component {
|
|
|
2636
2637
|
}
|
|
2637
2638
|
}
|
|
2638
2639
|
};
|
|
2640
|
+
this.test_controller.OnSignalDisconnected = () => {
|
|
2641
|
+
// 30001每次⽹络请求都会打印log,但是30001断开期间此回调只会执⾏⼀次
|
|
2642
|
+
let time = 1000 * (this.props.signalDisconnectedTime ? this.props.signalDisconnectedTime : 20)
|
|
2643
|
+
console.log('OnSignalDisconnected', this.props.signalDisconnectedTime, dateTime(), time)
|
|
2644
|
+
this.saveLog('OnSignalDisconnected, signalDisconnectedTime' + this.props.signalDisconnectedTime + 's, date=' + dateTime())
|
|
2645
|
+
this.signalDisconnectedSetTimeout = setTimeout(signalDisconnectedMethod, time);
|
|
2646
|
+
}
|
|
2647
|
+
this.test_controller.OnSignalConnected = () => {
|
|
2648
|
+
// 重连成功
|
|
2649
|
+
console.log('OnSignalConnected')
|
|
2650
|
+
this.saveLog('OnSignalConnected, signalDisconnectedTime' + this.props.signalDisconnectedTime + 's, date=' + dateTime())
|
|
2651
|
+
clearTimeout(this.signalDisconnectedSetTimeout)
|
|
2652
|
+
}
|
|
2653
|
+
const signalDisconnectedMethod = () => {
|
|
2654
|
+
console.log('OnSignalDisconnected', this.props.signalDisconnectedTime, dateTime())
|
|
2655
|
+
this.setState({
|
|
2656
|
+
transcribeErrorCode: 30001,
|
|
2657
|
+
transcribeErrorModalVisible: true
|
|
2658
|
+
})
|
|
2659
|
+
}
|
|
2639
2660
|
// 加入房间成功
|
|
2640
2661
|
this.test_controller.OnJoinRoomSucc = () => {
|
|
2641
2662
|
console.log('加入房间成功')
|
|
@@ -8193,6 +8214,7 @@ Video.defaultProps = {
|
|
|
8193
8214
|
echoCancellation: true,
|
|
8194
8215
|
noiseSuppression: true,
|
|
8195
8216
|
needPreSale: true, // 是否开启音频录制 默认true--只控制售前full
|
|
8217
|
+
signalDisconnectedTime: 20, // 网络异常断开多久后异常弹窗提示
|
|
8196
8218
|
logUrl: 'http://hsbc.cn-shanghai.log.aliyuncs.com/logstores/hsbc/track?APIVersion=0.6.0&app=meeting-ui',
|
|
8197
8219
|
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'
|
|
8198
8220
|
}
|
package/packages/utils/utils.js
CHANGED
|
@@ -1,81 +1,78 @@
|
|
|
1
1
|
function compressImage(base64, callback) {
|
|
2
2
|
var targSize = 1024 * 1024 * 1.45 //1024KB
|
|
3
3
|
if (base64.length <= targSize) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
callback(base64);
|
|
5
|
+
// console.log("直接返回")
|
|
6
|
+
return
|
|
7
7
|
}
|
|
8
8
|
var newImage = new Image();
|
|
9
9
|
newImage.src = base64;
|
|
10
|
-
console.log('压缩前'+base64.length)
|
|
10
|
+
console.log('压缩前' + base64.length)
|
|
11
11
|
newImage.setAttribute("crossOrigin", 'Anonymous'); //url为外域时需要
|
|
12
12
|
newImage.onload = function () {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
var quality = 0.95; //压缩系数0-1之间
|
|
14
|
+
var canvas = document.createElement("canvas");
|
|
15
|
+
var ctx = canvas.getContext("2d");
|
|
16
|
+
canvas.width = 720
|
|
17
|
+
canvas.height = 405
|
|
18
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
19
|
+
ctx.drawImage(newImage, 0, 0, canvas.width, canvas.height);
|
|
20
|
+
var base64 = canvas.toDataURL("image/png", quality); //压缩语句
|
|
21
|
+
// 如想确保图片压缩到自己想要的尺寸,如要求在5-10kb之间,请加以下语句,quality初始值根据情况自定
|
|
22
|
+
// console.log(base64.length + "循环1压缩" + (base64.length / 1024 > 512))
|
|
23
|
+
|
|
24
|
+
// while (base64.length > targSize) {
|
|
25
|
+
// quality -= 0.03;
|
|
26
|
+
// // console.log(base64.length + "循环压缩" + quality)
|
|
27
|
+
// base64 = canvas.toDataURL("image/png", quality);
|
|
28
|
+
// }
|
|
29
|
+
console.log('压缩后' + base64.length)
|
|
30
|
+
callback(base64); //必须通过回调函数返回,否则无法及时拿到该值
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
function debounce(fn, delay = 500) {
|
|
34
34
|
// 是闭包中的
|
|
35
35
|
let timer
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
// input事件调用的函数,相当于obj调用函数 this指向Input
|
|
38
|
-
return function() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
return function () {
|
|
39
|
+
// 这个if 判断不做也没关系,判断了(除第一次非空的情况)也就是执行从第二次开始,在延迟时间内多次触发才会走该判断
|
|
40
|
+
if (timer) { clearTimeout(timer) }
|
|
41
|
+
// 此时的箭头函数的this 和 arguments 都是从外部函数继承而来
|
|
42
|
+
// 如果用普通函数就要用词法作用域 var tshat = this var arg = arguments
|
|
43
|
+
timer = setTimeout(() => {
|
|
44
|
+
// 使得传入的回调函数的this 指向Input这个元素对象
|
|
45
|
+
// arguments是该事件的详情,可以获得该函数被调用时的所有参数,是一个event 对象(所有Dom事件都会传event对象进入)
|
|
46
|
+
// 直接使用 fn() 问题也不大
|
|
47
|
+
fn.apply(this, arguments)
|
|
48
|
+
timer = null
|
|
49
|
+
}, delay)
|
|
50
|
+
}
|
|
51
51
|
}
|
|
52
52
|
function isLight(src, sensitivity = 1) {
|
|
53
|
-
let gray = new cv.Mat()
|
|
53
|
+
let gray = new cv.Mat()
|
|
54
54
|
cv.cvtColor(src, gray, cv.COLOR_BGR2GRAY)
|
|
55
55
|
let sum = 0;
|
|
56
56
|
let avg = 0;
|
|
57
|
-
let scalar = new cv.Scalar()
|
|
57
|
+
let scalar = new cv.Scalar()
|
|
58
58
|
let ls = new Array();
|
|
59
59
|
let size = gray.rows * gray.cols;
|
|
60
60
|
for (let i = 0; i < 256; i++)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
for (let i = 0; i < gray.rows; i++)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
ls[x]++;
|
|
71
|
-
}
|
|
61
|
+
ls[i] = 0;
|
|
62
|
+
|
|
63
|
+
for (let i = 0; i < gray.rows; i++) {
|
|
64
|
+
for (let j = 0; j < gray.cols; j++) {
|
|
65
|
+
scalar = gray.ucharPtr(i, j);
|
|
66
|
+
sum += (scalar[0] - 128);
|
|
67
|
+
let x = scalar[0];
|
|
68
|
+
ls[x]++;
|
|
69
|
+
}
|
|
72
70
|
}
|
|
73
71
|
avg = sum / size;
|
|
74
72
|
let total = 0;
|
|
75
73
|
let mean = 0;
|
|
76
|
-
for (let i = 0; i < 256; i++)
|
|
77
|
-
|
|
78
|
-
total += Math.abs((i - 128) - avg) * ls[i];
|
|
74
|
+
for (let i = 0; i < 256; i++) {
|
|
75
|
+
total += Math.abs((i - 128) - avg) * ls[i];
|
|
79
76
|
}
|
|
80
77
|
mean = total / size;
|
|
81
78
|
let cast = Math.abs(avg / mean);
|
|
@@ -93,27 +90,24 @@ function isLight(src, sensitivity = 1) {
|
|
|
93
90
|
}
|
|
94
91
|
|
|
95
92
|
//std::cout << "亮度异常值:" << cast << std::endl;
|
|
96
|
-
if (cast * sensitivity > 1)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return -1;
|
|
108
|
-
}
|
|
93
|
+
if (cast * sensitivity > 1) {
|
|
94
|
+
if (avg > 0) {
|
|
95
|
+
console.log('亮度异常 过亮:')
|
|
96
|
+
//std::cout << "亮度异常 过亮" << avg << std::endl;
|
|
97
|
+
return 1;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log('亮度异常 过暗')
|
|
101
|
+
//std::cout << "亮度异常 过暗" << avg << std::endl;
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
109
104
|
}
|
|
110
|
-
else
|
|
111
|
-
{
|
|
105
|
+
else {
|
|
112
106
|
console.log('亮度正常')
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
//std::cout << "normal" << std::endl;
|
|
108
|
+
return 0;
|
|
115
109
|
}
|
|
116
|
-
|
|
110
|
+
|
|
117
111
|
}
|
|
118
112
|
|
|
119
113
|
function combineBase64Images(image1, image2, callback) {
|
|
@@ -121,33 +115,33 @@ function combineBase64Images(image1, image2, callback) {
|
|
|
121
115
|
// 创建Canvas元素
|
|
122
116
|
var canvas = document.createElement('canvas');
|
|
123
117
|
var ctx = canvas.getContext('2d');
|
|
124
|
-
|
|
118
|
+
|
|
125
119
|
// 加载第一张图片
|
|
126
120
|
var img1 = new Image();
|
|
127
|
-
img1.onload = function() {
|
|
128
|
-
|
|
121
|
+
img1.onload = function () {
|
|
122
|
+
|
|
129
123
|
// 加载第二张图片
|
|
130
124
|
var img2 = new Image();
|
|
131
|
-
img2.onload = function() {
|
|
125
|
+
img2.onload = function () {
|
|
132
126
|
|
|
133
127
|
// 设置Canvas的宽度和高度
|
|
134
128
|
const imageWidth = 1280;
|
|
135
129
|
const imageHeight = 720;
|
|
136
|
-
canvas.width = imageWidth
|
|
130
|
+
canvas.width = imageWidth; // 不压缩的话是 1280 x 720
|
|
137
131
|
canvas.height = imageHeight * 2;
|
|
138
132
|
|
|
139
133
|
console.log(img1.width, img1.height)
|
|
140
134
|
console.log(img2.width, img2.height)
|
|
141
|
-
|
|
135
|
+
|
|
142
136
|
// 绘制第一张图片
|
|
143
137
|
ctx.drawImage(img1, 0, 0, imageWidth, imageHeight);
|
|
144
138
|
// 绘制第二张图片在第一张图片下方
|
|
145
139
|
ctx.drawImage(img2, 0, imageHeight, imageWidth, imageHeight);
|
|
146
140
|
|
|
147
|
-
|
|
141
|
+
|
|
148
142
|
// 导出拼接后的图片为base64
|
|
149
143
|
var combinedImageData = canvas.toDataURL('image/png');
|
|
150
|
-
|
|
144
|
+
|
|
151
145
|
// 执行回调函数,返回base64字符串
|
|
152
146
|
callback(combinedImageData);
|
|
153
147
|
console.log(combinedImageData)
|
|
@@ -156,7 +150,7 @@ function combineBase64Images(image1, image2, callback) {
|
|
|
156
150
|
img2.src = image2;
|
|
157
151
|
};
|
|
158
152
|
img1.src = image1;
|
|
159
|
-
|
|
153
|
+
|
|
160
154
|
}
|
|
161
155
|
|
|
162
156
|
function saveBase64Image(base64Data, fileName) {
|
|
@@ -168,7 +162,7 @@ function saveBase64Image(base64Data, fileName) {
|
|
|
168
162
|
let u8arr = new Uint8Array(n);
|
|
169
163
|
|
|
170
164
|
while (n--) {
|
|
171
|
-
|
|
165
|
+
u8arr[n] = bstr.charCodeAt(n);
|
|
172
166
|
}
|
|
173
167
|
|
|
174
168
|
let blob = new Blob([u8arr], { type: mime });
|
|
@@ -189,11 +183,28 @@ function saveBase64Image(base64Data, fileName) {
|
|
|
189
183
|
document.body.removeChild(link);
|
|
190
184
|
URL.revokeObjectURL(url);
|
|
191
185
|
}
|
|
192
|
-
|
|
186
|
+
function dateTime() {
|
|
187
|
+
// 创建一个Date对象
|
|
188
|
+
const now = new Date();
|
|
189
|
+
|
|
190
|
+
// 获取年月日时分秒
|
|
191
|
+
const year = now.getFullYear();
|
|
192
|
+
const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份是从0开始的,所以要加1,并且可能需要补0
|
|
193
|
+
const day = String(now.getDate()).padStart(2, '0'); // 日期补0
|
|
194
|
+
const hours = String(now.getHours()).padStart(2, '0'); // 小时补0
|
|
195
|
+
const minutes = String(now.getMinutes()).padStart(2, '0'); // 分钟补0
|
|
196
|
+
const seconds = String(now.getSeconds()).padStart(2, '0'); // 秒数补0
|
|
197
|
+
|
|
198
|
+
// 格式化输出
|
|
199
|
+
const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
200
|
+
console.log(formattedDate);
|
|
201
|
+
return formattedDate;
|
|
202
|
+
}
|
|
193
203
|
export {
|
|
194
204
|
compressImage,
|
|
195
205
|
debounce,
|
|
196
206
|
isLight,
|
|
197
207
|
combineBase64Images,
|
|
198
|
-
saveBase64Image
|
|
208
|
+
saveBase64Image,
|
|
209
|
+
dateTime
|
|
199
210
|
}
|