unify-external-plugin-platform 0.0.3-79 → 0.0.3-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.
|
@@ -83178,8 +83178,8 @@ var scanner_cameravue_type_template_id_00e9072f_scoped_true_render = function re
|
|
|
83178
83178
|
};
|
|
83179
83179
|
var scanner_cameravue_type_template_id_00e9072f_scoped_true_staticRenderFns = [];
|
|
83180
83180
|
|
|
83181
|
-
;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[4]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=template&id=
|
|
83182
|
-
var
|
|
83181
|
+
;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[4]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=template&id=1d5723dd&
|
|
83182
|
+
var scanner_camera_componentvue_type_template_id_1d5723dd_render = function render() {
|
|
83183
83183
|
var _vm = this,
|
|
83184
83184
|
_c = _vm._self._c;
|
|
83185
83185
|
return _c('div', {
|
|
@@ -83313,7 +83313,7 @@ var scanner_camera_componentvue_type_template_id_74fe19f7_render = function rend
|
|
|
83313
83313
|
}
|
|
83314
83314
|
}, [_vm._v("旋转180°")])], 1)], 1) : _vm._e(), _vm._t("action")]], 2)])]);
|
|
83315
83315
|
};
|
|
83316
|
-
var
|
|
83316
|
+
var scanner_camera_componentvue_type_template_id_1d5723dd_staticRenderFns = [];
|
|
83317
83317
|
|
|
83318
83318
|
;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js
|
|
83319
83319
|
function _typeof(obj) {
|
|
@@ -84454,7 +84454,10 @@ _defineProperty(FounderPluginSocketService, "ws", void 0);
|
|
|
84454
84454
|
var UdsPluginMethodCode;
|
|
84455
84455
|
(function (UdsPluginMethodCode) {
|
|
84456
84456
|
UdsPluginMethodCode["TurnOnCamera"] = "turnOnCamera";
|
|
84457
|
+
UdsPluginMethodCode["TurnOnSubCamera"] = "turnOnSubCamera";
|
|
84458
|
+
UdsPluginMethodCode["TurnOffCamera"] = "turnOffCamera";
|
|
84457
84459
|
UdsPluginMethodCode["TakePhoto_Base64"] = "TakePhoto_Base64";
|
|
84460
|
+
UdsPluginMethodCode["ReadIDCard"] = "ReadIDCard";
|
|
84458
84461
|
})(UdsPluginMethodCode || (UdsPluginMethodCode = {}));
|
|
84459
84462
|
class UdsPluginSocketService {
|
|
84460
84463
|
static startConnect() {
|
|
@@ -84502,7 +84505,9 @@ class UdsPluginSocketService {
|
|
|
84502
84505
|
if (data.FuncName === 'ShowVideo') {
|
|
84503
84506
|
const event = new ScannerCameraRefreshPhotoEvent(data.result);
|
|
84504
84507
|
return window.dispatchEvent(event);
|
|
84505
|
-
} else if (data.FuncName === "CaptureBase64" || data.FuncName === "CaptureDualBase64"
|
|
84508
|
+
} else if (data.FuncName === "CaptureBase64" || data.FuncName === "CaptureDualBase64" || data.FuncName === "ReadIDCard"
|
|
84509
|
+
// 开启主头/副头/关闭摄像头等指令的返回值,用于结束对应的 Promise(如 StartRunSub 副头开启)
|
|
84510
|
+
|| data.FuncName === "StartRunMain" || data.FuncName === "StartRunSub" || data.FuncName === "StopVideo") {
|
|
84506
84511
|
this.requestStore.forEach(({
|
|
84507
84512
|
resolve
|
|
84508
84513
|
}) => {
|
|
@@ -84529,6 +84534,18 @@ class UdsPluginSocketService {
|
|
|
84529
84534
|
arg: 0
|
|
84530
84535
|
});
|
|
84531
84536
|
break;
|
|
84537
|
+
case UdsPluginMethodCode.TurnOnSubCamera:
|
|
84538
|
+
method = JSON.stringify({
|
|
84539
|
+
Func: "StartRunSub",
|
|
84540
|
+
arg: 0
|
|
84541
|
+
});
|
|
84542
|
+
break;
|
|
84543
|
+
case UdsPluginMethodCode.TurnOffCamera:
|
|
84544
|
+
method = JSON.stringify({
|
|
84545
|
+
Func: "StopVideo",
|
|
84546
|
+
arg: 0
|
|
84547
|
+
});
|
|
84548
|
+
break;
|
|
84532
84549
|
case UdsPluginMethodCode.TakePhoto_Base64:
|
|
84533
84550
|
this.ws.send(JSON.stringify({
|
|
84534
84551
|
Func: "SetJPGQuality",
|
|
@@ -84549,10 +84566,15 @@ class UdsPluginSocketService {
|
|
|
84549
84566
|
method = JSON.stringify({
|
|
84550
84567
|
Func: "CaptureBase64",
|
|
84551
84568
|
arg: 0
|
|
84569
|
+
}); // 0-jpg,1-bmp,2-png,3-tif格式
|
|
84570
|
+
break;
|
|
84571
|
+
case UdsPluginMethodCode.ReadIDCard:
|
|
84572
|
+
method = JSON.stringify({
|
|
84573
|
+
Func: "ReadIDCard",
|
|
84574
|
+
arg: 0
|
|
84552
84575
|
});
|
|
84553
|
-
|
|
84576
|
+
break;
|
|
84554
84577
|
}
|
|
84555
|
-
|
|
84556
84578
|
this.ws.send(method);
|
|
84557
84579
|
return new Promise((resolve, reject) => {
|
|
84558
84580
|
if (!this.requestStore) {
|
|
@@ -84570,10 +84592,103 @@ class UdsPluginSocketService {
|
|
|
84570
84592
|
static async turnOnTheCamera() {
|
|
84571
84593
|
await UdsPluginSocketService.read(UdsPluginMethodCode.TurnOnCamera);
|
|
84572
84594
|
}
|
|
84595
|
+
/**
|
|
84596
|
+
* 开启副头摄像头
|
|
84597
|
+
*/
|
|
84598
|
+
static async turnOnSubCamera() {
|
|
84599
|
+
await UdsPluginSocketService.read(UdsPluginMethodCode.TurnOnSubCamera);
|
|
84600
|
+
}
|
|
84601
|
+
/**
|
|
84602
|
+
* 关闭摄像头
|
|
84603
|
+
*/
|
|
84604
|
+
static async turnOffCamera() {
|
|
84605
|
+
await UdsPluginSocketService.read(UdsPluginMethodCode.TurnOffCamera);
|
|
84606
|
+
}
|
|
84573
84607
|
static async scanByCamera() {
|
|
84574
84608
|
const res = await UdsPluginSocketService.read(UdsPluginMethodCode.TakePhoto_Base64);
|
|
84575
84609
|
return res;
|
|
84576
84610
|
}
|
|
84611
|
+
/**
|
|
84612
|
+
* 副摄像头拍照:先确保副头摄像头已开启,再进行 base64 拍照
|
|
84613
|
+
* (CaptureBase64 以当前开启的摄像头为准,参考 UDSCamDemo:StartRunSub + CaptureBase64)
|
|
84614
|
+
* @returns {Promise<string>} 图片 base64
|
|
84615
|
+
*/
|
|
84616
|
+
static async scanBySubCamera() {
|
|
84617
|
+
await UdsPluginSocketService.turnOnSubCamera();
|
|
84618
|
+
return UdsPluginSocketService.scanByCamera();
|
|
84619
|
+
}
|
|
84620
|
+
/**
|
|
84621
|
+
* 读取二代身份证
|
|
84622
|
+
* 返回结构与其他读卡服务保持一致:{ info: {...}, headImage }
|
|
84623
|
+
* 另保留指纹、旧证件号等原始字段,便于业务使用
|
|
84624
|
+
*/
|
|
84625
|
+
static async idCardRead() {
|
|
84626
|
+
const res = await UdsPluginSocketService.read(UdsPluginMethodCode.ReadIDCard);
|
|
84627
|
+
if (!res || res === '0') {
|
|
84628
|
+
throw Error('未匹配可用的紫图读卡器');
|
|
84629
|
+
}
|
|
84630
|
+
let readData = typeof res === 'string' ? JSON.parse(res) : res;
|
|
84631
|
+
let {
|
|
84632
|
+
CardType,
|
|
84633
|
+
// S-身份证,I/Y-外国人居住证,J-港澳台通行证
|
|
84634
|
+
Name,
|
|
84635
|
+
NameENG,
|
|
84636
|
+
Sex,
|
|
84637
|
+
Nation,
|
|
84638
|
+
BirthDate,
|
|
84639
|
+
Addr,
|
|
84640
|
+
ID,
|
|
84641
|
+
OldID,
|
|
84642
|
+
Office,
|
|
84643
|
+
BeginDate,
|
|
84644
|
+
EndDate,
|
|
84645
|
+
Label,
|
|
84646
|
+
Num,
|
|
84647
|
+
HaveFinger,
|
|
84648
|
+
FingerOne,
|
|
84649
|
+
FingerTwo,
|
|
84650
|
+
HeadPic
|
|
84651
|
+
} = readData;
|
|
84652
|
+
// 证件类型转换:S-身份证(1),I/Y-外国人居住证(9),J-港澳台通行证(9)
|
|
84653
|
+
let cardType = '1';
|
|
84654
|
+
let chineseName = '';
|
|
84655
|
+
let nationality = '中国';
|
|
84656
|
+
if (CardType === 'I' || CardType === 'Y') {
|
|
84657
|
+
// 外国人居住证
|
|
84658
|
+
cardType = '9';
|
|
84659
|
+
chineseName = Name || '';
|
|
84660
|
+
nationality = Nation || '中国'; // 外国人时Nation为国家名称
|
|
84661
|
+
} else if (CardType === 'J') {
|
|
84662
|
+
// 港澳台通行证
|
|
84663
|
+
cardType = '9';
|
|
84664
|
+
}
|
|
84665
|
+
const IDCardData = {
|
|
84666
|
+
info: {
|
|
84667
|
+
cardType,
|
|
84668
|
+
name: Name || '',
|
|
84669
|
+
chineseName,
|
|
84670
|
+
englishName: NameENG || '',
|
|
84671
|
+
sex: Sex || '',
|
|
84672
|
+
birthday: BirthDate || '',
|
|
84673
|
+
address: Addr || '',
|
|
84674
|
+
cardId: ID || '',
|
|
84675
|
+
nationality,
|
|
84676
|
+
nation: cardType === '1' ? Nation || '' : '',
|
|
84677
|
+
police: Office || '',
|
|
84678
|
+
validStart: BeginDate || '',
|
|
84679
|
+
validEnd: EndDate || ''
|
|
84680
|
+
},
|
|
84681
|
+
headImage: HeadPic || '',
|
|
84682
|
+
// 原始附加信息(保留,便于业务使用)
|
|
84683
|
+
oldID: OldID || '',
|
|
84684
|
+
label: Label || '',
|
|
84685
|
+
num: Num || '',
|
|
84686
|
+
haveFinger: HaveFinger || '',
|
|
84687
|
+
fingerOne: FingerOne || '',
|
|
84688
|
+
fingerTwo: FingerTwo || ''
|
|
84689
|
+
};
|
|
84690
|
+
return IDCardData;
|
|
84691
|
+
}
|
|
84577
84692
|
}
|
|
84578
84693
|
_defineProperty(UdsPluginSocketService, "scannerCameraUrl", 'ws://127.0.0.1:8341');
|
|
84579
84694
|
_defineProperty(UdsPluginSocketService, "ws", void 0);
|
|
@@ -85255,6 +85370,721 @@ _defineProperty(HanWangPluginService, "ws", void 0);
|
|
|
85255
85370
|
_defineProperty(HanWangPluginService, "connectingPromise", new Promise((resolve, reject) => {}));
|
|
85256
85371
|
_defineProperty(HanWangPluginService, "requestStore", []);
|
|
85257
85372
|
_defineProperty(HanWangPluginService, "_isLinux", String(navigator.platform).indexOf("Linux") > -1);
|
|
85373
|
+
;// CONCATENATED MODULE: ./packages/service/external-plugins/viisan-plugin-socket.service.ts
|
|
85374
|
+
|
|
85375
|
+
|
|
85376
|
+
/**
|
|
85377
|
+
* @author: lvcy
|
|
85378
|
+
* @date: 2026-08-31
|
|
85379
|
+
* @description:维山(Viisan)高拍仪 - 通过 WebSocket 与本地服务通信,实现高拍仪拍照及读卡功能
|
|
85380
|
+
*
|
|
85381
|
+
* 通信协议说明(参考 CamSDK samples):
|
|
85382
|
+
* - WebSocket 地址:ws://127.0.0.1:9000
|
|
85383
|
+
* - 请求格式:JSON 字符串,包含 func(方法名)和 reqId(请求ID)等字段
|
|
85384
|
+
* - 响应格式:JSON 对象,result=0 表示成功,其他值表示异常(result=9 表示设备使用中)
|
|
85385
|
+
* - 拍照返回:imgBase64 数组(base64 编码的图片数据)和 mime 字段(图片类型,如 image/jpeg)
|
|
85386
|
+
* - 读卡返回:cardInfo 对象,包含姓名、性别、民族、生日、地址、身份证号、签发机关、有效期、头像照片等
|
|
85387
|
+
*/
|
|
85388
|
+
|
|
85389
|
+
/** Viisan 高拍仪方法编码 */
|
|
85390
|
+
var ViisanMethodCode;
|
|
85391
|
+
(function (ViisanMethodCode) {
|
|
85392
|
+
/** 获取摄像头设备信息(设备列表、分辨率等) */
|
|
85393
|
+
ViisanMethodCode["GetCameraInfo"] = "GetCameraInfo";
|
|
85394
|
+
/** 打开摄像头 */
|
|
85395
|
+
ViisanMethodCode["OpenCamera"] = "OpenCamera";
|
|
85396
|
+
/** 关闭摄像头 */
|
|
85397
|
+
ViisanMethodCode["CloseCamera"] = "CloseCamera";
|
|
85398
|
+
/** 设置图像算法参数(裁切方式、图像效果、补边等) */
|
|
85399
|
+
ViisanMethodCode["SetCameraImageInfo"] = "SetCameraImageInfo";
|
|
85400
|
+
/** 拍照(返回 base64 图片) */
|
|
85401
|
+
ViisanMethodCode["CameraCapture"] = "CameraCapture";
|
|
85402
|
+
/** 拍照(返回 base64 图片,用于人证比对页面) */
|
|
85403
|
+
ViisanMethodCode["CameraCaptureBase64"] = "CameraCaptureBase64";
|
|
85404
|
+
/** 获取/停止视频预览帧 */
|
|
85405
|
+
ViisanMethodCode["GetCameraVideoBuff"] = "GetCameraVideoBuff";
|
|
85406
|
+
/** 设置摄像头分辨率等参数 */
|
|
85407
|
+
ViisanMethodCode["SetCameraInfo"] = "SetCameraInfo";
|
|
85408
|
+
/** 读取二代身份证信息(通过高拍仪内置读卡器或外接读卡器) */
|
|
85409
|
+
ViisanMethodCode["ReadIDCardInfo"] = "ReadIDCardInfo";
|
|
85410
|
+
/** 人脸比对 */
|
|
85411
|
+
ViisanMethodCode["FaceMatch"] = "FaceMatch";
|
|
85412
|
+
})(ViisanMethodCode || (ViisanMethodCode = {}));
|
|
85413
|
+
/**
|
|
85414
|
+
* 裁切方式枚举
|
|
85415
|
+
* 对应 SetCameraImageInfo 的 cropType 参数
|
|
85416
|
+
*/
|
|
85417
|
+
var ViisanCropType;
|
|
85418
|
+
(function (ViisanCropType) {
|
|
85419
|
+
/** 不裁切 */
|
|
85420
|
+
ViisanCropType[ViisanCropType["None"] = 0] = "None";
|
|
85421
|
+
/** 单图裁切 */
|
|
85422
|
+
ViisanCropType[ViisanCropType["SingleImage"] = 1] = "SingleImage";
|
|
85423
|
+
/** 多图裁切 */
|
|
85424
|
+
ViisanCropType[ViisanCropType["MultiImage"] = 2] = "MultiImage";
|
|
85425
|
+
/** 曲面矫正 */
|
|
85426
|
+
ViisanCropType[ViisanCropType["CurveCorrection"] = 3] = "CurveCorrection";
|
|
85427
|
+
/** 单图桌面裁切(丹徒裁切) */
|
|
85428
|
+
ViisanCropType[ViisanCropType["SingleDesktop"] = 6] = "SingleDesktop";
|
|
85429
|
+
/** 多图桌面裁切 */
|
|
85430
|
+
ViisanCropType[ViisanCropType["MultiDesktop"] = 7] = "MultiDesktop";
|
|
85431
|
+
/** 自定义裁切 */
|
|
85432
|
+
ViisanCropType[ViisanCropType["Custom"] = 9] = "Custom";
|
|
85433
|
+
})(ViisanCropType || (ViisanCropType = {}));
|
|
85434
|
+
/**
|
|
85435
|
+
* 图像效果枚举
|
|
85436
|
+
* 对应 SetCameraImageInfo 的 imageType 参数
|
|
85437
|
+
*/
|
|
85438
|
+
var ViisanImageType;
|
|
85439
|
+
(function (ViisanImageType) {
|
|
85440
|
+
/** 彩色原色 */
|
|
85441
|
+
ViisanImageType[ViisanImageType["ColorOriginal"] = 0] = "ColorOriginal";
|
|
85442
|
+
/** 灰度图片 */
|
|
85443
|
+
ViisanImageType[ViisanImageType["Grayscale"] = 1] = "Grayscale";
|
|
85444
|
+
/** 黑白文档 */
|
|
85445
|
+
ViisanImageType[ViisanImageType["BlackWhite"] = 2] = "BlackWhite";
|
|
85446
|
+
/** 彩色文档 */
|
|
85447
|
+
ViisanImageType[ViisanImageType["ColorDocument"] = 3] = "ColorDocument";
|
|
85448
|
+
/** 红印文档 */
|
|
85449
|
+
ViisanImageType[ViisanImageType["RedStamp"] = 4] = "RedStamp";
|
|
85450
|
+
/** 蓝印文档 */
|
|
85451
|
+
ViisanImageType[ViisanImageType["BlueStamp"] = 5] = "BlueStamp";
|
|
85452
|
+
/** 彩色照片 */
|
|
85453
|
+
ViisanImageType[ViisanImageType["ColorPhoto"] = 6] = "ColorPhoto";
|
|
85454
|
+
/** 票据增强 */
|
|
85455
|
+
ViisanImageType[ViisanImageType["ReceiptEnhance"] = 7] = "ReceiptEnhance";
|
|
85456
|
+
})(ViisanImageType || (ViisanImageType = {}));
|
|
85457
|
+
/**
|
|
85458
|
+
* 补边方式枚举
|
|
85459
|
+
* 对应 SetCameraImageInfo 的 fillBorderType 参数
|
|
85460
|
+
*/
|
|
85461
|
+
var ViisanFillBorderType;
|
|
85462
|
+
(function (ViisanFillBorderType) {
|
|
85463
|
+
/** 不填充 */
|
|
85464
|
+
ViisanFillBorderType[ViisanFillBorderType["None"] = 0] = "None";
|
|
85465
|
+
/** 映射填充 */
|
|
85466
|
+
ViisanFillBorderType[ViisanFillBorderType["MapFill"] = 1] = "MapFill";
|
|
85467
|
+
/** 白色填充 */
|
|
85468
|
+
ViisanFillBorderType[ViisanFillBorderType["WhiteFill"] = 2] = "WhiteFill";
|
|
85469
|
+
/** 自动纯色填充 */
|
|
85470
|
+
ViisanFillBorderType[ViisanFillBorderType["AutoColorFill"] = 3] = "AutoColorFill";
|
|
85471
|
+
})(ViisanFillBorderType || (ViisanFillBorderType = {}));
|
|
85472
|
+
/**
|
|
85473
|
+
* 异物去除枚举
|
|
85474
|
+
* 对应 SetCameraImageInfo 的 removalForeign 参数
|
|
85475
|
+
*/
|
|
85476
|
+
var ViisanRemovalForeign;
|
|
85477
|
+
(function (ViisanRemovalForeign) {
|
|
85478
|
+
/** 无 */
|
|
85479
|
+
ViisanRemovalForeign[ViisanRemovalForeign["None"] = 0] = "None";
|
|
85480
|
+
/** 去除装订孔 */
|
|
85481
|
+
ViisanRemovalForeign[ViisanRemovalForeign["BindingHoles"] = 2] = "BindingHoles";
|
|
85482
|
+
})(ViisanRemovalForeign || (ViisanRemovalForeign = {}));
|
|
85483
|
+
/**
|
|
85484
|
+
* 旋转方式枚举
|
|
85485
|
+
* 对应 SetCameraImageInfo 的 rotate 参数
|
|
85486
|
+
*/
|
|
85487
|
+
var ViisanRotateType;
|
|
85488
|
+
(function (ViisanRotateType) {
|
|
85489
|
+
/** 不旋转 */
|
|
85490
|
+
ViisanRotateType[ViisanRotateType["None"] = 0] = "None";
|
|
85491
|
+
/** 旋转90度 */
|
|
85492
|
+
ViisanRotateType[ViisanRotateType["Rotate90"] = 90] = "Rotate90";
|
|
85493
|
+
/** 旋转180度 */
|
|
85494
|
+
ViisanRotateType[ViisanRotateType["Rotate180"] = 180] = "Rotate180";
|
|
85495
|
+
/** 旋转270度 */
|
|
85496
|
+
ViisanRotateType[ViisanRotateType["Rotate270"] = 270] = "Rotate270";
|
|
85497
|
+
})(ViisanRotateType || (ViisanRotateType = {}));
|
|
85498
|
+
/**
|
|
85499
|
+
* 维山(Viisan)高拍仪服务
|
|
85500
|
+
*
|
|
85501
|
+
* 通过 WebSocket 与 CamSDK 本地服务通信,提供高拍仪拍照功能。
|
|
85502
|
+
* 使用方式:
|
|
85503
|
+
* 1. 调用 openCamera() 打开摄像头
|
|
85504
|
+
* 2. 调用 capture() 拍照,获取 base64 图片
|
|
85505
|
+
* 3. 调用 closeCamera() 关闭摄像头
|
|
85506
|
+
*
|
|
85507
|
+
* 默认拍照参数:
|
|
85508
|
+
* - 裁切方式:单图裁切(cropType=1)
|
|
85509
|
+
* - 图像效果:彩色原色(imageType=0)
|
|
85510
|
+
* - 补边方式:不填充(fillBorderType=0)
|
|
85511
|
+
* - 异物去除:无(removalForeign=0)
|
|
85512
|
+
* - 旋转角度:不旋转(rotate=0)
|
|
85513
|
+
* - 水印:不使用
|
|
85514
|
+
*/
|
|
85515
|
+
class ViisanPluginService {
|
|
85516
|
+
/** WebSocket 连接地址(CamSDK 本地服务默认端口 9000) */
|
|
85517
|
+
|
|
85518
|
+
/** WebSocket 实例 */
|
|
85519
|
+
|
|
85520
|
+
/** 当前请求的 Promise 存储队列 */
|
|
85521
|
+
|
|
85522
|
+
/** 当前打开的设备编号 */
|
|
85523
|
+
|
|
85524
|
+
/** 主摄像头(文档摄像头,funcType=1)设备编号 */
|
|
85525
|
+
|
|
85526
|
+
/** 副摄像头(人像摄像头,funcType=2)设备编号 */
|
|
85527
|
+
|
|
85528
|
+
/** 缓存的设备信息列表 */
|
|
85529
|
+
|
|
85530
|
+
/** 请求 ID 计数器 */
|
|
85531
|
+
|
|
85532
|
+
/** 视频预览帧回调(SDK 持续推送帧时触发) */
|
|
85533
|
+
|
|
85534
|
+
/**
|
|
85535
|
+
* 生成唯一的请求 ID
|
|
85536
|
+
* @returns 当前时间戳作为请求 ID
|
|
85537
|
+
*/
|
|
85538
|
+
static generateReqId() {
|
|
85539
|
+
return new Date().getTime() + ++this.reqIdCounter;
|
|
85540
|
+
}
|
|
85541
|
+
/**
|
|
85542
|
+
* 开启 WebSocket 连接
|
|
85543
|
+
* 如果连接已存在且处于 OPEN 或 CONNECTING 状态,直接复用,不再重复创建
|
|
85544
|
+
* @returns 连接成功的 Promise
|
|
85545
|
+
*/
|
|
85546
|
+
static startConnect() {
|
|
85547
|
+
// 连接已打开或正在连接中,直接复用,避免重复建立连接
|
|
85548
|
+
if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {
|
|
85549
|
+
return Promise.resolve(true);
|
|
85550
|
+
}
|
|
85551
|
+
const ws = new WebSocket(this.webSocketUrl);
|
|
85552
|
+
let resolved;
|
|
85553
|
+
const onConnect = new Promise(resolve => {
|
|
85554
|
+
resolved = resolve;
|
|
85555
|
+
});
|
|
85556
|
+
ws.onopen = () => {
|
|
85557
|
+
resolved(true);
|
|
85558
|
+
};
|
|
85559
|
+
ws.onmessage = event => {
|
|
85560
|
+
this.handleMessage(event);
|
|
85561
|
+
};
|
|
85562
|
+
ws.onclose = () => {
|
|
85563
|
+
this.handleClose();
|
|
85564
|
+
};
|
|
85565
|
+
ws.onerror = () => {
|
|
85566
|
+
this.handleError();
|
|
85567
|
+
};
|
|
85568
|
+
this.ws = ws;
|
|
85569
|
+
return onConnect;
|
|
85570
|
+
}
|
|
85571
|
+
/**
|
|
85572
|
+
* 处理连接错误
|
|
85573
|
+
* 拒绝所有等待中的请求
|
|
85574
|
+
*/
|
|
85575
|
+
static handleError() {
|
|
85576
|
+
this.requestStore.forEach(({
|
|
85577
|
+
reject
|
|
85578
|
+
}) => {
|
|
85579
|
+
reject('handleError');
|
|
85580
|
+
});
|
|
85581
|
+
this.requestStore = [];
|
|
85582
|
+
throw Error('统一插件平台维山高拍仪功能加载失败');
|
|
85583
|
+
}
|
|
85584
|
+
/**
|
|
85585
|
+
* 处理连接关闭
|
|
85586
|
+
* 拒绝所有等待中的请求
|
|
85587
|
+
*/
|
|
85588
|
+
static handleClose() {
|
|
85589
|
+
this.requestStore.forEach(({
|
|
85590
|
+
reject
|
|
85591
|
+
}) => {
|
|
85592
|
+
reject('close');
|
|
85593
|
+
});
|
|
85594
|
+
this.requestStore = [];
|
|
85595
|
+
}
|
|
85596
|
+
/**
|
|
85597
|
+
* 处理 WebSocket 接收到的消息
|
|
85598
|
+
* 解析 JSON 响应,根据 result 字段判断是否成功
|
|
85599
|
+
* result=0 表示成功,result=9 表示设备使用中(打开摄像头时忽略)
|
|
85600
|
+
*
|
|
85601
|
+
* 视频帧消息(GetCameraVideoBuff 推送)单独路由到 previewFrameCallback,
|
|
85602
|
+
* 不进入 requestStore,避免与命令响应混淆
|
|
85603
|
+
*
|
|
85604
|
+
* @param msg WebSocket 消息事件
|
|
85605
|
+
*/
|
|
85606
|
+
static handleMessage(msg) {
|
|
85607
|
+
let data;
|
|
85608
|
+
try {
|
|
85609
|
+
data = JSON.parse(msg.data);
|
|
85610
|
+
} catch (e) {
|
|
85611
|
+
data = {
|
|
85612
|
+
result: -1,
|
|
85613
|
+
errorMsg: '消息解析失败'
|
|
85614
|
+
};
|
|
85615
|
+
}
|
|
85616
|
+
// 视频预览帧:路由到回调,不进入 requestStore
|
|
85617
|
+
if (data.func === ViisanMethodCode.GetCameraVideoBuff && data.result === 0 && data.imgBase64Str) {
|
|
85618
|
+
if (this.previewFrameCallback) {
|
|
85619
|
+
this.previewFrameCallback(data.imgBase64Str);
|
|
85620
|
+
}
|
|
85621
|
+
return;
|
|
85622
|
+
}
|
|
85623
|
+
// result != 0 且 result != 9 时,表示执行出错
|
|
85624
|
+
if (data.result !== 0 && data.result !== 9) {
|
|
85625
|
+
console.warn(`[ViisanPlugin] ${data.func} 执行失败: ${data.errorMsg}`);
|
|
85626
|
+
}
|
|
85627
|
+
// 将响应数据 resolve 给等待中的请求
|
|
85628
|
+
this.requestStore.forEach(({
|
|
85629
|
+
resolve
|
|
85630
|
+
}) => {
|
|
85631
|
+
resolve(data);
|
|
85632
|
+
});
|
|
85633
|
+
this.requestStore = [];
|
|
85634
|
+
}
|
|
85635
|
+
/**
|
|
85636
|
+
* 向 WebSocket 发送 JSON 请求
|
|
85637
|
+
*
|
|
85638
|
+
* @param func 方法名(对应 ViisanMethodCode)
|
|
85639
|
+
* @param params 附加参数(会与 func 和 reqId 合并为 JSON 发送)
|
|
85640
|
+
* @returns 服务端响应的 Promise
|
|
85641
|
+
*/
|
|
85642
|
+
static async send(func, params) {
|
|
85643
|
+
await this.startConnect();
|
|
85644
|
+
if (this.ws.readyState !== WebSocket.OPEN) {
|
|
85645
|
+
throw Error('统一插件平台维山高拍仪连接未就绪');
|
|
85646
|
+
}
|
|
85647
|
+
const reqId = this.generateReqId();
|
|
85648
|
+
const cmd = {
|
|
85649
|
+
func,
|
|
85650
|
+
reqId,
|
|
85651
|
+
...params
|
|
85652
|
+
};
|
|
85653
|
+
this.ws.send(JSON.stringify(cmd));
|
|
85654
|
+
return new Promise((resolve, reject) => {
|
|
85655
|
+
this.requestStore.push({
|
|
85656
|
+
resolve,
|
|
85657
|
+
reject
|
|
85658
|
+
});
|
|
85659
|
+
});
|
|
85660
|
+
}
|
|
85661
|
+
/**
|
|
85662
|
+
* 获取摄像头设备信息
|
|
85663
|
+
* 返回连接的所有高拍仪设备列表,同时缓存设备信息并识别主/副摄像头
|
|
85664
|
+
*
|
|
85665
|
+
* 设备功能类型(funcType):
|
|
85666
|
+
* 1 - 文档摄像头(主摄像头,用于扫描/拍照)
|
|
85667
|
+
* 2 - 人像摄像头(副摄像头,用于人脸比对)
|
|
85668
|
+
*
|
|
85669
|
+
* @returns 设备信息数组
|
|
85670
|
+
*/
|
|
85671
|
+
static async getCameraInfo() {
|
|
85672
|
+
const res = await this.send(ViisanMethodCode.GetCameraInfo);
|
|
85673
|
+
if (res.result !== 0 && res.result !== 9) {
|
|
85674
|
+
throw Error('获取摄像头设备信息失败:' + (res.errorMsg || ''));
|
|
85675
|
+
}
|
|
85676
|
+
const devInfos = res.devInfo || [];
|
|
85677
|
+
// 缓存设备信息
|
|
85678
|
+
this.cachedDevInfos = devInfos;
|
|
85679
|
+
// 识别主摄像头(funcType=1,文档摄像头)和副摄像头(funcType=2,人像摄像头)
|
|
85680
|
+
this.mainCameraDevNum = -1;
|
|
85681
|
+
this.secondaryCameraDevNum = -1;
|
|
85682
|
+
for (const dev of devInfos) {
|
|
85683
|
+
if (dev.funcType === 1 && this.mainCameraDevNum < 0) {
|
|
85684
|
+
this.mainCameraDevNum = dev.id;
|
|
85685
|
+
} else if (dev.funcType === 2 && this.secondaryCameraDevNum < 0) {
|
|
85686
|
+
this.secondaryCameraDevNum = dev.id;
|
|
85687
|
+
}
|
|
85688
|
+
}
|
|
85689
|
+
// 如果没有明确分类的设备,默认第一个为主摄像头
|
|
85690
|
+
if (this.mainCameraDevNum < 0 && devInfos.length > 0) {
|
|
85691
|
+
this.mainCameraDevNum = devInfos[0].id;
|
|
85692
|
+
}
|
|
85693
|
+
return devInfos;
|
|
85694
|
+
}
|
|
85695
|
+
/**
|
|
85696
|
+
* 确保设备信息已加载
|
|
85697
|
+
* 如果缓存为空,自动调用 getCameraInfo 获取设备列表
|
|
85698
|
+
*/
|
|
85699
|
+
static async ensureDevInfo() {
|
|
85700
|
+
if (this.cachedDevInfos.length === 0) {
|
|
85701
|
+
console.log(1111111);
|
|
85702
|
+
await this.getCameraInfo();
|
|
85703
|
+
}
|
|
85704
|
+
}
|
|
85705
|
+
/**
|
|
85706
|
+
* 打开摄像头
|
|
85707
|
+
*
|
|
85708
|
+
* @param devNum 设备编号,默认 0(第一个设备)
|
|
85709
|
+
* @param mediaNum 视频格式编号,默认 0
|
|
85710
|
+
* @param resolutionNum 分辨率编号,默认 0(使用默认分辨率)
|
|
85711
|
+
* @param fps 帧率,默认 5
|
|
85712
|
+
* @returns 打开结果
|
|
85713
|
+
*/
|
|
85714
|
+
static async openCamera(devNum = 0, mediaNum = 0, resolutionNum = 0, fps = 5) {
|
|
85715
|
+
const res = await this.send(ViisanMethodCode.OpenCamera, {
|
|
85716
|
+
devNum,
|
|
85717
|
+
mediaNum,
|
|
85718
|
+
resolutionNum,
|
|
85719
|
+
fps // 帧率
|
|
85720
|
+
});
|
|
85721
|
+
|
|
85722
|
+
if (res.result !== 0 && res.result !== 9) {
|
|
85723
|
+
throw Error('打开摄像头失败:' + (res.errorMsg || ''));
|
|
85724
|
+
}
|
|
85725
|
+
this.currentDevNum = devNum;
|
|
85726
|
+
return res;
|
|
85727
|
+
}
|
|
85728
|
+
/**
|
|
85729
|
+
* 关闭摄像头
|
|
85730
|
+
*
|
|
85731
|
+
* @param devNum 设备编号,默认使用当前打开的设备
|
|
85732
|
+
* @returns 关闭结果
|
|
85733
|
+
*/
|
|
85734
|
+
static async closeCamera(devNum) {
|
|
85735
|
+
const num = devNum !== undefined ? devNum : this.currentDevNum;
|
|
85736
|
+
if (num < 0) {
|
|
85737
|
+
return; // 没有打开的摄像头,直接返回
|
|
85738
|
+
}
|
|
85739
|
+
|
|
85740
|
+
const res = await this.send(ViisanMethodCode.CloseCamera, {
|
|
85741
|
+
devNum: num
|
|
85742
|
+
});
|
|
85743
|
+
this.currentDevNum = -1;
|
|
85744
|
+
return res;
|
|
85745
|
+
}
|
|
85746
|
+
/**
|
|
85747
|
+
* 开启摄像头(指定主摄像头或副摄像头)
|
|
85748
|
+
* 类似 eloam 的 turnOnTheCamera,自动根据 type 选择对应设备
|
|
85749
|
+
*
|
|
85750
|
+
* @param type 'main' - 主摄像头(文档摄像头,funcType=1);'vice' - 副摄像头(人像摄像头,funcType=2)
|
|
85751
|
+
*/
|
|
85752
|
+
static async turnOnTheCamera(type) {
|
|
85753
|
+
await this.ensureDevInfo();
|
|
85754
|
+
const devNum = type === 'main' ? this.mainCameraDevNum : this.secondaryCameraDevNum;
|
|
85755
|
+
if (devNum < 0) {
|
|
85756
|
+
throw Error(`未找到可用的${type === 'main' ? '主' : '副'}摄像头设备`);
|
|
85757
|
+
}
|
|
85758
|
+
// 如果当前已打开目标摄像头,无需重复操作
|
|
85759
|
+
if (this.currentDevNum === devNum) {
|
|
85760
|
+
return;
|
|
85761
|
+
}
|
|
85762
|
+
// 关闭当前已打开的摄像头(仅在不同设备间切换时)
|
|
85763
|
+
if (this.currentDevNum >= 0) {
|
|
85764
|
+
await this.closeCamera();
|
|
85765
|
+
}
|
|
85766
|
+
await this.openCamera(devNum);
|
|
85767
|
+
// 主摄像头打开后立即设置图像参数(裁边等),预览和拍照都生效
|
|
85768
|
+
if (type === 'main') {
|
|
85769
|
+
await this.setCameraImageInfo({});
|
|
85770
|
+
}
|
|
85771
|
+
}
|
|
85772
|
+
/**
|
|
85773
|
+
* 主摄像头拍照
|
|
85774
|
+
* 自动打开主摄像头(funcType=1 文档摄像头),设置图像参数后拍照
|
|
85775
|
+
* 拍照完成后自动关闭摄像头
|
|
85776
|
+
*
|
|
85777
|
+
* @param options 可选的图像参数配置(裁切、图像效果、补边等)
|
|
85778
|
+
* @returns 拍照结果 base64
|
|
85779
|
+
*/
|
|
85780
|
+
static async scanByMainCamera(options) {
|
|
85781
|
+
await this.ensureDevInfo();
|
|
85782
|
+
const devNum = this.mainCameraDevNum >= 0 ? this.mainCameraDevNum : 0;
|
|
85783
|
+
// 如果主摄像头未打开,先打开(不关闭已有连接,复用 WebSocket)
|
|
85784
|
+
if (this.currentDevNum !== devNum) {
|
|
85785
|
+
if (this.currentDevNum >= 0) {
|
|
85786
|
+
await this.closeCamera();
|
|
85787
|
+
}
|
|
85788
|
+
await this.openCamera(devNum);
|
|
85789
|
+
}
|
|
85790
|
+
// 拍照(默认裁边:单图裁切)
|
|
85791
|
+
const result = await this.capture(options);
|
|
85792
|
+
return result.imgBase64;
|
|
85793
|
+
}
|
|
85794
|
+
/**
|
|
85795
|
+
* 副摄像头拍照
|
|
85796
|
+
* 自动打开副摄像头(funcType=2 人像摄像头),拍照后关闭
|
|
85797
|
+
*
|
|
85798
|
+
* @returns 拍照结果 base64
|
|
85799
|
+
*/
|
|
85800
|
+
static async scanBySecondaryCamera() {
|
|
85801
|
+
await this.ensureDevInfo();
|
|
85802
|
+
if (this.secondaryCameraDevNum < 0) {
|
|
85803
|
+
throw Error('未找到可用的副摄像头设备');
|
|
85804
|
+
}
|
|
85805
|
+
// 如果副摄像头未打开,先打开
|
|
85806
|
+
if (this.currentDevNum !== this.secondaryCameraDevNum) {
|
|
85807
|
+
if (this.currentDevNum >= 0) {
|
|
85808
|
+
await this.closeCamera();
|
|
85809
|
+
}
|
|
85810
|
+
await this.openCamera(this.secondaryCameraDevNum);
|
|
85811
|
+
}
|
|
85812
|
+
// 副摄像头拍照使用默认参数(不裁切、彩色原色、不填充)
|
|
85813
|
+
const result = await this.capture({
|
|
85814
|
+
cropType: ViisanCropType.None,
|
|
85815
|
+
imageType: ViisanImageType.ColorOriginal,
|
|
85816
|
+
fillBorderType: ViisanFillBorderType.None
|
|
85817
|
+
});
|
|
85818
|
+
return result.imgBase64;
|
|
85819
|
+
}
|
|
85820
|
+
/**
|
|
85821
|
+
* 统一拍照方法(根据类型选择主摄像头或副摄像头)
|
|
85822
|
+
* 与 eloam 的 scanByCamera 用法一致
|
|
85823
|
+
*
|
|
85824
|
+
* @param type 'main' - 主摄像头拍照;'vice' - 副摄像头拍照
|
|
85825
|
+
* @param options 可选的图像参数配置(仅主摄像头拍照时生效)
|
|
85826
|
+
* @returns 拍照结果 base64
|
|
85827
|
+
*/
|
|
85828
|
+
static async scanByCamera(type, options) {
|
|
85829
|
+
switch (type) {
|
|
85830
|
+
case 'main':
|
|
85831
|
+
return this.scanByMainCamera(options);
|
|
85832
|
+
case 'vice':
|
|
85833
|
+
return this.scanBySecondaryCamera();
|
|
85834
|
+
default:
|
|
85835
|
+
throw Error('不支持的摄像头类型:' + type);
|
|
85836
|
+
}
|
|
85837
|
+
}
|
|
85838
|
+
/**
|
|
85839
|
+
* 停止摄像头
|
|
85840
|
+
* 与 eloam 的 stopCamera 用法一致
|
|
85841
|
+
*
|
|
85842
|
+
* @param isMain true - 停止主摄像头;false - 停止副摄像头
|
|
85843
|
+
*/
|
|
85844
|
+
static async stopCamera(isMain) {
|
|
85845
|
+
const devNum = isMain ? this.mainCameraDevNum : this.secondaryCameraDevNum;
|
|
85846
|
+
if (devNum >= 0) {
|
|
85847
|
+
await this.closeCamera(devNum);
|
|
85848
|
+
}
|
|
85849
|
+
}
|
|
85850
|
+
/**
|
|
85851
|
+
* 设置视频预览帧回调
|
|
85852
|
+
* SDK 在 startVideoPreview 后会持续推送帧数据,每帧通过回调返回
|
|
85853
|
+
*
|
|
85854
|
+
* @param callback 帧数据回调,参数为 base64 图片字符串;传 null 清除回调
|
|
85855
|
+
*/
|
|
85856
|
+
static setPreviewFrameCallback(callback) {
|
|
85857
|
+
this.previewFrameCallback = callback;
|
|
85858
|
+
}
|
|
85859
|
+
/**
|
|
85860
|
+
* 开启视频预览流
|
|
85861
|
+
* 调用后 SDK 会持续推送视频帧(通过 onTxtMessage 回调)
|
|
85862
|
+
*
|
|
85863
|
+
* @param devNum 设备编号
|
|
85864
|
+
*/
|
|
85865
|
+
static async startVideoPreview(devNum) {
|
|
85866
|
+
const num = devNum !== undefined ? devNum : this.currentDevNum;
|
|
85867
|
+
if (num < 0) {
|
|
85868
|
+
throw Error('没有已打开的摄像头,无法开启预览');
|
|
85869
|
+
}
|
|
85870
|
+
await this.send(ViisanMethodCode.GetCameraVideoBuff, {
|
|
85871
|
+
devNum: num,
|
|
85872
|
+
enable: true
|
|
85873
|
+
});
|
|
85874
|
+
}
|
|
85875
|
+
/**
|
|
85876
|
+
* 停止视频预览流
|
|
85877
|
+
*
|
|
85878
|
+
* @param devNum 设备编号
|
|
85879
|
+
*/
|
|
85880
|
+
static async stopVideoPreview(devNum) {
|
|
85881
|
+
const num = devNum !== undefined ? devNum : this.currentDevNum;
|
|
85882
|
+
if (num < 0) {
|
|
85883
|
+
return;
|
|
85884
|
+
}
|
|
85885
|
+
await this.send(ViisanMethodCode.GetCameraVideoBuff, {
|
|
85886
|
+
devNum: num,
|
|
85887
|
+
enable: false
|
|
85888
|
+
});
|
|
85889
|
+
}
|
|
85890
|
+
/**
|
|
85891
|
+
* 设置图像算法参数
|
|
85892
|
+
* 在拍照前调用,配置裁切方式、图像效果、补边等参数
|
|
85893
|
+
*
|
|
85894
|
+
* @param options 图像参数配置
|
|
85895
|
+
* @param options.cropType 裁切方式,默认 1(单图裁切)
|
|
85896
|
+
* @param options.imageType 图像效果,默认 0(彩色原色)
|
|
85897
|
+
* @param options.fillBorderType 补边方式,默认 0(不填充)
|
|
85898
|
+
* @param options.removalForeign 异物去除,默认 0(无)
|
|
85899
|
+
* @param options.rotate 旋转角度,默认 0(不旋转)
|
|
85900
|
+
* @param options.dpi 照片 DPI,默认 0(使用设备默认值)
|
|
85901
|
+
* @returns 设置结果
|
|
85902
|
+
*/
|
|
85903
|
+
static async setCameraImageInfo(options = {}) {
|
|
85904
|
+
const devNum = this.currentDevNum >= 0 ? this.currentDevNum : 0;
|
|
85905
|
+
const res = await this.send(ViisanMethodCode.SetCameraImageInfo, {
|
|
85906
|
+
devNum,
|
|
85907
|
+
// 裁切方式,默认单图裁切(裁边)
|
|
85908
|
+
cropType: options.cropType ?? ViisanCropType.SingleImage,
|
|
85909
|
+
// 图像效果,默认彩色原色
|
|
85910
|
+
imageType: options.imageType ?? ViisanImageType.ColorOriginal,
|
|
85911
|
+
// 补边方式,默认不填充
|
|
85912
|
+
fillBorderType: options.fillBorderType ?? ViisanFillBorderType.None,
|
|
85913
|
+
// 异物去除,默认无
|
|
85914
|
+
removalForeign: options.removalForeign ?? ViisanRemovalForeign.None,
|
|
85915
|
+
// 旋转角度,默认不旋转
|
|
85916
|
+
rotate: options.rotate ?? ViisanRotateType.None,
|
|
85917
|
+
// 照片 DPI,0 表示默认
|
|
85918
|
+
dpi: options.dpi ?? 0,
|
|
85919
|
+
// OCR 语言 ID,不使用 OCR 时传 0
|
|
85920
|
+
textOrientationLangId: 0
|
|
85921
|
+
});
|
|
85922
|
+
return res;
|
|
85923
|
+
}
|
|
85924
|
+
/**
|
|
85925
|
+
* 高拍仪拍照
|
|
85926
|
+
* 先设置图像参数,再执行拍照,返回 base64 格式的图片数据
|
|
85927
|
+
*
|
|
85928
|
+
* 默认参数:
|
|
85929
|
+
* - 裁切方式:单图裁切(cropType=1)
|
|
85930
|
+
* - 图像效果:彩色原色(imageType=0)
|
|
85931
|
+
* - 补边方式:不填充(fillBorderType=0)
|
|
85932
|
+
* - 不使用水印
|
|
85933
|
+
*
|
|
85934
|
+
* @param options 可选的图像参数配置,不传则使用默认参数
|
|
85935
|
+
* @returns 拍照结果,包含 imgBase64(图片 base64 数据)和 mime(图片类型)
|
|
85936
|
+
*/
|
|
85937
|
+
static async capture(options) {
|
|
85938
|
+
const devNum = this.currentDevNum >= 0 ? this.currentDevNum : 0;
|
|
85939
|
+
// 第一步:设置图像算法参数(裁切、图像效果、补边等)
|
|
85940
|
+
await this.setCameraImageInfo(options || {});
|
|
85941
|
+
// 第二步:执行拍照,mode='base64' 表示返回 base64 编码的图片
|
|
85942
|
+
const res = await this.send(ViisanMethodCode.CameraCapture, {
|
|
85943
|
+
devNum,
|
|
85944
|
+
mode: 'base64' // 返回模式:base64 编码
|
|
85945
|
+
// 不使用水印,不传 watermark 参数
|
|
85946
|
+
});
|
|
85947
|
+
|
|
85948
|
+
if (res.result !== 0) {
|
|
85949
|
+
throw Error('拍照失败:' + (res.errorMsg || ''));
|
|
85950
|
+
}
|
|
85951
|
+
// 拍照成功,返回第一张图片的 base64 数据和 mime 类型
|
|
85952
|
+
// imgBase64 是数组,一般拍照返回一张图片
|
|
85953
|
+
return {
|
|
85954
|
+
imgBase64: res.imgBase64 && res.imgBase64[0] || '',
|
|
85955
|
+
mime: res.mime || 'image/jpeg'
|
|
85956
|
+
};
|
|
85957
|
+
}
|
|
85958
|
+
/**
|
|
85959
|
+
* 便捷方法:打开摄像头并拍照
|
|
85960
|
+
* 自动完成 打开摄像头 → 设置图像参数 → 拍照 的完整流程
|
|
85961
|
+
*
|
|
85962
|
+
* @param devNum 设备编号,默认 0
|
|
85963
|
+
* @param options 可选的图像参数配置
|
|
85964
|
+
* @returns 拍照结果
|
|
85965
|
+
*/
|
|
85966
|
+
static async openAndCapture(devNum = 0, options) {
|
|
85967
|
+
// 打开摄像头
|
|
85968
|
+
await this.openCamera(devNum);
|
|
85969
|
+
// 拍照
|
|
85970
|
+
const result = await this.capture(options);
|
|
85971
|
+
return result;
|
|
85972
|
+
}
|
|
85973
|
+
/**
|
|
85974
|
+
* 读取二代身份证信息
|
|
85975
|
+
* 通过高拍仪内置读卡器或外接身份证读卡器读取身份证信息及头像照片
|
|
85976
|
+
*
|
|
85977
|
+
* 请求参数:
|
|
85978
|
+
* - func: "ReadIDCardInfo"
|
|
85979
|
+
* - idType: 0(0 表示读取二代身份证)
|
|
85980
|
+
*
|
|
85981
|
+
* 返回 cardInfo 包含字段:
|
|
85982
|
+
* - name: 姓名
|
|
85983
|
+
* - folk: 民族
|
|
85984
|
+
* - gender: 性别(男/女)
|
|
85985
|
+
* - birth: 生日(格式 yyyyMMdd)
|
|
85986
|
+
* - id: 身份证号码
|
|
85987
|
+
* - address: 住址
|
|
85988
|
+
* - issue: 签发机关
|
|
85989
|
+
* - startDate: 有效期开始(格式 yyyyMMdd)
|
|
85990
|
+
* - endDate: 有效期结束(格式 yyyyMMdd 或 "长期")
|
|
85991
|
+
* - imageBase64: 头像照片 base64
|
|
85992
|
+
* - mime: 照片 mime 类型
|
|
85993
|
+
* - fingerFeature: 指纹信息(可选)
|
|
85994
|
+
*
|
|
85995
|
+
* @returns 身份证信息,格式与其他高拍仪插件统一(info + headImage)
|
|
85996
|
+
*/
|
|
85997
|
+
static async idCardRead() {
|
|
85998
|
+
// 如果当前有摄像头打开,先关闭(读卡前需要释放设备)
|
|
85999
|
+
if (this.currentDevNum >= 0) {
|
|
86000
|
+
await this.closeCamera();
|
|
86001
|
+
}
|
|
86002
|
+
// 发送读卡请求
|
|
86003
|
+
// idType=0 表示读取二代身份证
|
|
86004
|
+
const res = await this.send(ViisanMethodCode.ReadIDCardInfo, {
|
|
86005
|
+
idType: 0
|
|
86006
|
+
});
|
|
86007
|
+
if (res.result !== 0) {
|
|
86008
|
+
throw Error('读取二代身份证失败:' + (res.errorMsg || ''));
|
|
86009
|
+
}
|
|
86010
|
+
const ci = res.cardInfo;
|
|
86011
|
+
if (!ci) {
|
|
86012
|
+
throw Error('未匹配可用的维山身份证读卡器');
|
|
86013
|
+
}
|
|
86014
|
+
// 解析身份证信息
|
|
86015
|
+
let name = (ci.name || '').trim();
|
|
86016
|
+
let sex = ci.gender || '';
|
|
86017
|
+
let nation = ci.folk || '';
|
|
86018
|
+
let birthday = ci.birth || '';
|
|
86019
|
+
let address = ci.address || '';
|
|
86020
|
+
let cardId = ci.id || '';
|
|
86021
|
+
let police = ci.issue || '';
|
|
86022
|
+
let validStart = ci.startDate || '';
|
|
86023
|
+
let validEnd = ci.endDate || '';
|
|
86024
|
+
let headImage = ci.imageBase64 || '';
|
|
86025
|
+
// 默认按普通身份证处理
|
|
86026
|
+
let cardType = '1';
|
|
86027
|
+
let chineseName = '';
|
|
86028
|
+
let englishName = '';
|
|
86029
|
+
let nationality = '中国';
|
|
86030
|
+
// 判断是否为外国人永居证(通过身份证号判断)
|
|
86031
|
+
const isForeigners = IdCardCommonUtils.isForeignersIdCard(cardId);
|
|
86032
|
+
if (isForeigners) {
|
|
86033
|
+
cardType = '9'; // 永居证
|
|
86034
|
+
chineseName = name;
|
|
86035
|
+
englishName = name;
|
|
86036
|
+
police = '中华人民共和国国家移民管理局'; // 永居证签发机关默认值
|
|
86037
|
+
nationality = nation; // 永居证民族字段实际存放的是国籍
|
|
86038
|
+
// nation 置空,永居证不读取民族
|
|
86039
|
+
}
|
|
86040
|
+
|
|
86041
|
+
const IDCardData = {
|
|
86042
|
+
info: {
|
|
86043
|
+
cardType,
|
|
86044
|
+
nationality,
|
|
86045
|
+
name: name,
|
|
86046
|
+
chineseName,
|
|
86047
|
+
englishName,
|
|
86048
|
+
sex,
|
|
86049
|
+
birthday,
|
|
86050
|
+
address,
|
|
86051
|
+
cardId,
|
|
86052
|
+
nation: isForeigners ? '' : nation,
|
|
86053
|
+
police,
|
|
86054
|
+
validStart,
|
|
86055
|
+
validEnd
|
|
86056
|
+
},
|
|
86057
|
+
headImage
|
|
86058
|
+
};
|
|
86059
|
+
console.log('[ViisanPlugin] 读取二代身份证结果 ==>', IDCardData);
|
|
86060
|
+
return IDCardData;
|
|
86061
|
+
}
|
|
86062
|
+
/**
|
|
86063
|
+
* 关闭 WebSocket 连接
|
|
86064
|
+
* 在不再需要使用高拍仪时调用,释放资源
|
|
86065
|
+
*/
|
|
86066
|
+
static disconnect() {
|
|
86067
|
+
if (this.ws) {
|
|
86068
|
+
this.ws.close();
|
|
86069
|
+
this.ws = null;
|
|
86070
|
+
}
|
|
86071
|
+
this.requestStore = [];
|
|
86072
|
+
this.currentDevNum = -1;
|
|
86073
|
+
this.mainCameraDevNum = -1;
|
|
86074
|
+
this.secondaryCameraDevNum = -1;
|
|
86075
|
+
this.cachedDevInfos = [];
|
|
86076
|
+
this.previewFrameCallback = null;
|
|
86077
|
+
}
|
|
86078
|
+
}
|
|
86079
|
+
_defineProperty(ViisanPluginService, "webSocketUrl", 'ws://127.0.0.1:9000');
|
|
86080
|
+
_defineProperty(ViisanPluginService, "ws", void 0);
|
|
86081
|
+
_defineProperty(ViisanPluginService, "requestStore", []);
|
|
86082
|
+
_defineProperty(ViisanPluginService, "currentDevNum", -1);
|
|
86083
|
+
_defineProperty(ViisanPluginService, "mainCameraDevNum", -1);
|
|
86084
|
+
_defineProperty(ViisanPluginService, "secondaryCameraDevNum", -1);
|
|
86085
|
+
_defineProperty(ViisanPluginService, "cachedDevInfos", []);
|
|
86086
|
+
_defineProperty(ViisanPluginService, "reqIdCounter", 0);
|
|
86087
|
+
_defineProperty(ViisanPluginService, "previewFrameCallback", null);
|
|
85258
86088
|
;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=script&lang=js&
|
|
85259
86089
|
|
|
85260
86090
|
|
|
@@ -85265,12 +86095,13 @@ _defineProperty(HanWangPluginService, "_isLinux", String(navigator.platform).ind
|
|
|
85265
86095
|
|
|
85266
86096
|
|
|
85267
86097
|
|
|
86098
|
+
|
|
85268
86099
|
const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
85269
86100
|
/* harmony default export */ var scanner_camera_componentvue_type_script_lang_js_ = ({
|
|
85270
86101
|
name: "scanner-camera-component",
|
|
85271
86102
|
props: {
|
|
85272
|
-
/**
|
|
85273
|
-
* 高拍仪型号 0-捷宇;3:方正高影仪;4:紫图速拍仪;5-良田;6-国产一体机;7-赞采;8-汉王高拍仪;9
|
|
86103
|
+
/**
|
|
86104
|
+
* 高拍仪型号 0-捷宇;3:方正高影仪;4:紫图速拍仪;5-良田;6-国产一体机;7-赞采;8-汉王高拍仪;9-本机摄像头拍照;10-维山高拍仪
|
|
85274
86105
|
*/
|
|
85275
86106
|
machineType: {
|
|
85276
86107
|
//
|
|
@@ -85380,6 +86211,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85380
86211
|
this.defaultVideoStream.getTracks().forEach(track => track.stop());
|
|
85381
86212
|
this.defaultVideoStream = null;
|
|
85382
86213
|
}
|
|
86214
|
+
// 清理维山高拍仪预览轮询
|
|
86215
|
+
this.stopViisanPreview();
|
|
85383
86216
|
},
|
|
85384
86217
|
methods: {
|
|
85385
86218
|
// 浏览器标签页关闭
|
|
@@ -85404,18 +86237,23 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85404
86237
|
// 汉王
|
|
85405
86238
|
await HanWangPluginService.stopCamera();
|
|
85406
86239
|
break;
|
|
86240
|
+
case 10:
|
|
86241
|
+
// 维山
|
|
86242
|
+
this.stopViisanPreview();
|
|
86243
|
+
await ViisanPluginService.stopCamera(this.camera === 0);
|
|
86244
|
+
break;
|
|
85407
86245
|
}
|
|
85408
86246
|
},
|
|
85409
|
-
/**
|
|
85410
|
-
* 切换扫描、拍照
|
|
85411
|
-
* @param val
|
|
86247
|
+
/**
|
|
86248
|
+
* 切换扫描、拍照
|
|
86249
|
+
* @param val
|
|
85412
86250
|
*/
|
|
85413
86251
|
selectChange(val) {
|
|
85414
86252
|
let handleName = val === 1 ? 'start-vice' : 'start-main';
|
|
85415
86253
|
this.handleAction(handleName);
|
|
85416
86254
|
},
|
|
85417
|
-
/**
|
|
85418
|
-
* 拍照
|
|
86255
|
+
/**
|
|
86256
|
+
* 拍照
|
|
85419
86257
|
*/
|
|
85420
86258
|
async takePictures() {
|
|
85421
86259
|
switch (this.machineType) {
|
|
@@ -85432,7 +86270,9 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85432
86270
|
}
|
|
85433
86271
|
case 4:
|
|
85434
86272
|
{
|
|
85435
|
-
|
|
86273
|
+
// 紫图速拍仪
|
|
86274
|
+
// 按当前选择的摄像头拍照:0-主头(文档),1-副头(照片)
|
|
86275
|
+
let res = this.camera === 1 ? await UdsPluginSocketService.scanBySubCamera() : await UdsPluginSocketService.scanByCamera();
|
|
85436
86276
|
this.$emit('send-scanner-result', `${BEGIN_DATA}${res}`);
|
|
85437
86277
|
break;
|
|
85438
86278
|
}
|
|
@@ -85470,10 +86310,23 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85470
86310
|
this.$emit('send-scanner-result', `${BEGIN_DATA}${res}`);
|
|
85471
86311
|
break;
|
|
85472
86312
|
}
|
|
86313
|
+
case 10:
|
|
86314
|
+
{
|
|
86315
|
+
// 维山高拍仪
|
|
86316
|
+
let type = this.camera === 0 ? 'main' : 'vice';
|
|
86317
|
+
// 帧消息已通过 callback 路由,不会干扰拍照响应,无需停止预览
|
|
86318
|
+
let res = await ViisanPluginService.scanByCamera(type);
|
|
86319
|
+
if (res) {
|
|
86320
|
+
this.$emit('send-scanner-result', `${BEGIN_DATA}${res}`);
|
|
86321
|
+
} else {
|
|
86322
|
+
this.$message.error('拍照出错,请检查设备是否连接成功');
|
|
86323
|
+
}
|
|
86324
|
+
break;
|
|
86325
|
+
}
|
|
85473
86326
|
}
|
|
85474
86327
|
},
|
|
85475
|
-
/**
|
|
85476
|
-
* 主摄像头
|
|
86328
|
+
/**
|
|
86329
|
+
* 主摄像头
|
|
85477
86330
|
*/
|
|
85478
86331
|
async handleStartMain() {
|
|
85479
86332
|
switch (this.machineType) {
|
|
@@ -85515,6 +86368,14 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85515
86368
|
// 汉王高拍仪(主)
|
|
85516
86369
|
await HanWangPluginService.turnOnTheCamera('main');
|
|
85517
86370
|
break;
|
|
86371
|
+
case 10:
|
|
86372
|
+
// 维山高拍仪(主)
|
|
86373
|
+
// 先停止之前的预览轮询
|
|
86374
|
+
this.stopViisanPreview();
|
|
86375
|
+
await ViisanPluginService.turnOnTheCamera('main');
|
|
86376
|
+
// 开启视频预览帧轮询(每 300ms 获取一帧)
|
|
86377
|
+
this.startViisanPreview();
|
|
86378
|
+
break;
|
|
85518
86379
|
}
|
|
85519
86380
|
},
|
|
85520
86381
|
async getEloamFrame() {
|
|
@@ -85526,9 +86387,28 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85526
86387
|
if (res.data.img == "") return;
|
|
85527
86388
|
this.scannerVideoSrc = `${BEGIN_DATA}${res.data.img}`;
|
|
85528
86389
|
},
|
|
85529
|
-
/**
|
|
85530
|
-
*
|
|
85531
|
-
*
|
|
86390
|
+
/**
|
|
86391
|
+
* 维山高拍仪 - 开启视频预览
|
|
86392
|
+
* 调用一次 startVideoPreview,SDK 会持续推送帧数据到回调
|
|
86393
|
+
*/
|
|
86394
|
+
startViisanPreview() {
|
|
86395
|
+
// 设置帧回调
|
|
86396
|
+
ViisanPluginService.setPreviewFrameCallback(imgBase64Str => {
|
|
86397
|
+
this.scannerVideoSrc = `${BEGIN_DATA}${imgBase64Str}`;
|
|
86398
|
+
});
|
|
86399
|
+
// 启动预览流(只调用一次)
|
|
86400
|
+
ViisanPluginService.startVideoPreview();
|
|
86401
|
+
},
|
|
86402
|
+
/**
|
|
86403
|
+
* 维山高拍仪 - 停止视频预览
|
|
86404
|
+
*/
|
|
86405
|
+
stopViisanPreview() {
|
|
86406
|
+
ViisanPluginService.setPreviewFrameCallback(null);
|
|
86407
|
+
ViisanPluginService.stopVideoPreview();
|
|
86408
|
+
},
|
|
86409
|
+
/**
|
|
86410
|
+
* 启动电脑默认摄像头
|
|
86411
|
+
* @param type 'main' 主摄像头, 'vice' 副摄像头
|
|
85532
86412
|
*/
|
|
85533
86413
|
async startDefaultCamera(type) {
|
|
85534
86414
|
await new Promise(resolve => {
|
|
@@ -85566,8 +86446,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85566
86446
|
this.loadSuccess = false;
|
|
85567
86447
|
}
|
|
85568
86448
|
},
|
|
85569
|
-
/**
|
|
85570
|
-
* 使用默认摄像头拍照
|
|
86449
|
+
/**
|
|
86450
|
+
* 使用默认摄像头拍照
|
|
85571
86451
|
*/
|
|
85572
86452
|
takeDefaultCameraPicture() {
|
|
85573
86453
|
if (!this.defaultVideoStream) {
|
|
@@ -85585,8 +86465,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85585
86465
|
const dataUrl = canvas.toDataURL('image/jpeg');
|
|
85586
86466
|
this.$emit('send-scanner-result', dataUrl);
|
|
85587
86467
|
},
|
|
85588
|
-
/**
|
|
85589
|
-
* 副摄像头
|
|
86468
|
+
/**
|
|
86469
|
+
* 副摄像头
|
|
85590
86470
|
*/
|
|
85591
86471
|
async handleStartVice() {
|
|
85592
86472
|
switch (this.machineType) {
|
|
@@ -85599,8 +86479,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85599
86479
|
await FounderPluginSocketService.turnOnTheCamera();
|
|
85600
86480
|
break;
|
|
85601
86481
|
case 4:
|
|
85602
|
-
//
|
|
85603
|
-
await UdsPluginSocketService.
|
|
86482
|
+
// 紫图速拍仪(副头)
|
|
86483
|
+
await UdsPluginSocketService.turnOnSubCamera();
|
|
85604
86484
|
break;
|
|
85605
86485
|
case 5:
|
|
85606
86486
|
// 良田
|
|
@@ -85624,6 +86504,12 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85624
86504
|
// 汉王高拍仪 副
|
|
85625
86505
|
await HanWangPluginService.turnOnTheCamera('vice');
|
|
85626
86506
|
break;
|
|
86507
|
+
case 10:
|
|
86508
|
+
// 维山高拍仪(副)
|
|
86509
|
+
this.stopViisanPreview();
|
|
86510
|
+
await ViisanPluginService.turnOnTheCamera('vice');
|
|
86511
|
+
this.startViisanPreview();
|
|
86512
|
+
break;
|
|
85627
86513
|
}
|
|
85628
86514
|
},
|
|
85629
86515
|
async takePictureMerge(type) {
|
|
@@ -85705,9 +86591,9 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85705
86591
|
break;
|
|
85706
86592
|
}
|
|
85707
86593
|
},
|
|
85708
|
-
/**
|
|
85709
|
-
* 处理旋转命令
|
|
85710
|
-
* @param command 旋转命令:rotate-left(左旋90°), rotate-right(右旋90°), rotate-180(旋转180°)
|
|
86594
|
+
/**
|
|
86595
|
+
* 处理旋转命令
|
|
86596
|
+
* @param command 旋转命令:rotate-left(左旋90°), rotate-right(右旋90°), rotate-180(旋转180°)
|
|
85711
86597
|
*/
|
|
85712
86598
|
handleRotateCommand(command) {
|
|
85713
86599
|
if (this.machineType !== 5) return; // 仅良田支持旋转
|
|
@@ -85757,8 +86643,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85757
86643
|
break;
|
|
85758
86644
|
}
|
|
85759
86645
|
},
|
|
85760
|
-
/**
|
|
85761
|
-
* 切换框选拍照模式
|
|
86646
|
+
/**
|
|
86647
|
+
* 切换框选拍照模式
|
|
85762
86648
|
*/
|
|
85763
86649
|
async toggleSelectAreaMode() {
|
|
85764
86650
|
if (this.machineType !== 5) {
|
|
@@ -85775,8 +86661,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85775
86661
|
this.isSelecting = false;
|
|
85776
86662
|
}
|
|
85777
86663
|
},
|
|
85778
|
-
/**
|
|
85779
|
-
* 校准缩放比例 - 完全参考 liangtian.html 的实现
|
|
86664
|
+
/**
|
|
86665
|
+
* 校准缩放比例 - 完全参考 liangtian.html 的实现
|
|
85780
86666
|
*/
|
|
85781
86667
|
async calibrateZoomScale() {
|
|
85782
86668
|
try {
|
|
@@ -85814,8 +86700,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85814
86700
|
this.$message.error('坐标校准失败,请重试');
|
|
85815
86701
|
}
|
|
85816
86702
|
},
|
|
85817
|
-
/**
|
|
85818
|
-
* 鼠标按下 - 开始框选
|
|
86703
|
+
/**
|
|
86704
|
+
* 鼠标按下 - 开始框选
|
|
85819
86705
|
*/
|
|
85820
86706
|
handleMouseDown(e) {
|
|
85821
86707
|
if (!this.isSelectAreaMode || this.machineType !== 5) return;
|
|
@@ -85826,8 +86712,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85826
86712
|
};
|
|
85827
86713
|
e.preventDefault();
|
|
85828
86714
|
},
|
|
85829
|
-
/**
|
|
85830
|
-
* 鼠标移动 - 更新框选框
|
|
86715
|
+
/**
|
|
86716
|
+
* 鼠标移动 - 更新框选框
|
|
85831
86717
|
*/
|
|
85832
86718
|
handleMouseMove(e) {
|
|
85833
86719
|
if (!this.isSelectAreaMode || !this.isSelecting) return;
|
|
@@ -85856,8 +86742,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85856
86742
|
};
|
|
85857
86743
|
e.preventDefault();
|
|
85858
86744
|
},
|
|
85859
|
-
/**
|
|
85860
|
-
* 鼠标松开 - 完成框选并拍照
|
|
86745
|
+
/**
|
|
86746
|
+
* 鼠标松开 - 完成框选并拍照
|
|
85861
86747
|
*/
|
|
85862
86748
|
async handleMouseUp(e) {
|
|
85863
86749
|
if (!this.isSelectAreaMode || !this.isSelecting) return;
|
|
@@ -85927,8 +86813,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85927
86813
|
this.selectBoxStyle = {};
|
|
85928
86814
|
e.preventDefault();
|
|
85929
86815
|
},
|
|
85930
|
-
/**
|
|
85931
|
-
* 鼠标离开 - 取消框选
|
|
86816
|
+
/**
|
|
86817
|
+
* 鼠标离开 - 取消框选
|
|
85932
86818
|
*/
|
|
85933
86819
|
handleMouseLeave() {
|
|
85934
86820
|
if (this.isSelectAreaMode && this.isSelecting) {
|
|
@@ -85940,10 +86826,10 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85940
86826
|
});
|
|
85941
86827
|
;// CONCATENATED MODULE: ./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=script&lang=js&
|
|
85942
86828
|
/* harmony default export */ var component_scanner_camera_componentvue_type_script_lang_js_ = (scanner_camera_componentvue_type_script_lang_js_);
|
|
85943
|
-
;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=style&index=0&id=
|
|
86829
|
+
;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=style&index=0&id=1d5723dd&prod&lang=scss&
|
|
85944
86830
|
// extracted by mini-css-extract-plugin
|
|
85945
86831
|
|
|
85946
|
-
;// CONCATENATED MODULE: ./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=style&index=0&id=
|
|
86832
|
+
;// CONCATENATED MODULE: ./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue?vue&type=style&index=0&id=1d5723dd&prod&lang=scss&
|
|
85947
86833
|
|
|
85948
86834
|
;// CONCATENATED MODULE: ./packages/scanner/scanner-camera/src/component/scanner-camera-component.vue
|
|
85949
86835
|
|
|
@@ -85956,8 +86842,8 @@ const BEGIN_DATA = 'data:image/jpg;base64,';
|
|
|
85956
86842
|
|
|
85957
86843
|
var scanner_camera_component_component = normalizeComponent(
|
|
85958
86844
|
component_scanner_camera_componentvue_type_script_lang_js_,
|
|
85959
|
-
|
|
85960
|
-
|
|
86845
|
+
scanner_camera_componentvue_type_template_id_1d5723dd_render,
|
|
86846
|
+
scanner_camera_componentvue_type_template_id_1d5723dd_staticRenderFns,
|
|
85961
86847
|
false,
|
|
85962
86848
|
null,
|
|
85963
86849
|
null,
|
|
@@ -86107,8 +86993,8 @@ scanner_camera.install = Vue => {
|
|
|
86107
86993
|
Vue.component(scanner_camera.name, scanner_camera);
|
|
86108
86994
|
};
|
|
86109
86995
|
/* harmony default export */ var scanner_scanner_camera = (scanner_camera);
|
|
86110
|
-
;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[4]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/id-card-reader/id-card-reader-button/src/id-card-reader-button.vue?vue&type=template&id=
|
|
86111
|
-
var
|
|
86996
|
+
;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[4]!./node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/id-card-reader/id-card-reader-button/src/id-card-reader-button.vue?vue&type=template&id=00babc28&scoped=true&
|
|
86997
|
+
var id_card_reader_buttonvue_type_template_id_00babc28_scoped_true_render = function render() {
|
|
86112
86998
|
var _vm = this,
|
|
86113
86999
|
_c = _vm._self._c;
|
|
86114
87000
|
return _c('div', {
|
|
@@ -86181,7 +87067,7 @@ var id_card_reader_buttonvue_type_template_id_27efe151_scoped_true_render = func
|
|
|
86181
87067
|
}
|
|
86182
87068
|
})], 2)], 1);
|
|
86183
87069
|
};
|
|
86184
|
-
var
|
|
87070
|
+
var id_card_reader_buttonvue_type_template_id_00babc28_scoped_true_staticRenderFns = [];
|
|
86185
87071
|
|
|
86186
87072
|
;// CONCATENATED MODULE: ./packages/service/external-plugins/default-plugin-socket.service.ts
|
|
86187
87073
|
|
|
@@ -89226,6 +90112,8 @@ _defineProperty(JingLunPluginService, "idCardWebSocketUrl", 'http://127.0.0.1:18
|
|
|
89226
90112
|
|
|
89227
90113
|
|
|
89228
90114
|
|
|
90115
|
+
|
|
90116
|
+
|
|
89229
90117
|
|
|
89230
90118
|
|
|
89231
90119
|
const DefaultFilePath = 'JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyh6aCkgL1N0cnVjdFRyZWVSb290IDE3IDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4vTWV0YWRhdGEgMzYgMCBSL1ZpZXdlclByZWZlcmVuY2VzIDM3IDAgUj4+DQplbmRvYmoNCjIgMCBvYmoNCjw8L1R5cGUvUGFnZXMvQ291bnQgMS9LaWRzWyAzIDAgUl0gPj4NCmVuZG9iag0KMyAwIG9iag0KPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9SZXNvdXJjZXM8PC9Gb250PDwvRjEgNSAwIFIvRjIgOSAwIFIvRjMgMTQgMCBSPj4vRXh0R1N0YXRlPDwvR1M3IDcgMCBSL0dTOCA4IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXSA+Pi9NZWRpYUJveFsgMCAwIDUyMS42NCAzNjguNTJdIC9Db250ZW50cyA0IDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdCPj4vVGFicy9TL1N0cnVjdFBhcmVudHMgMD4+DQplbmRvYmoNCjQgMCBvYmoNCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjkyPj4NCnN0cmVhbQ0KeJylkUtPQkEMhfeTzH84SyBxbqfzNCEk98ElGl0YMC6IC0KAuPBGkf8fe5ENom6c1XTanvY7g2L+tuowHhf39U0DKu5W3Q6DTXf1OB9OJqiaGu9akaH+pJQcCIGtiR4uZhMY+41WTyN0WlULrYrWgqMhj8VWKyvVhP6FTHZwZE2QzKvUzeYJuw+Rxu4Y5VM002o5wPAZi1utpqL4oBWm9zWKcn942a7WB1QS2b7NRcOwvXaC98lkJDLuuNF2dGrDOaH9hVCkokh5k3MvhciG8wUbC/QZmHcy1OZgfDhikQnE/WpfF4GBeMfCvF6OQ9lm11YlU1tzJfkmRNu0tdhCnCnwlCznuvZlarkMeXJpwjca/heNu6BJwVzz3zw/f84nOqN5cQ0KZW5kc3RyZWFtDQplbmRvYmoNCjUgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUvRjEvQmFzZUZvbnQvQkNERUVFK0RlbmdYaWFuL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciA2IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMzIvV2lkdGhzIDMwIDAgUj4+DQplbmRvYmoNCjYgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQkNERUVFK0RlbmdYaWFuL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDgxMC9EZXNjZW50IC0yMzIvQ2FwSGVpZ2h0IDgxMC9BdmdXaWR0aCA0NDcvTWF4V2lkdGggMTI5Mi9Gb250V2VpZ2h0IDQwMC9YSGVpZ2h0IDI1MC9TdGVtViA0NC9Gb250QkJveFsgLTE0MSAtMjMyIDExNTEgODEwXSAvRm9udEZpbGUyIDMxIDAgUj4+DQplbmRvYmoNCjcgMCBvYmoNCjw8L1R5cGUvRXh0R1N0YXRlL0JNL05vcm1hbC9jYSAxPj4NCmVuZG9iag0KOCAwIG9iag0KPDwvVHlwZS9FeHRHU3RhdGUvQk0vTm9ybWFsL0NBIDE+Pg0KZW5kb2JqDQo5IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UeXBlMC9CYXNlRm9udC9CQ0RGRUUrRGVuZ1hpYW4tQm9sZC9FbmNvZGluZy9JZGVudGl0eS1IL0Rlc2NlbmRhbnRGb250cyAxMCAwIFIvVG9Vbmljb2RlIDMyIDAgUj4+DQplbmRvYmoNCjEwIDAgb2JqDQpbIDExIDAgUl0gDQplbmRvYmoNCjExIDAgb2JqDQo8PC9CYXNlRm9udC9CQ0RGRUUrRGVuZ1hpYW4tQm9sZC9TdWJ0eXBlL0NJREZvbnRUeXBlMi9UeXBlL0ZvbnQvQ0lEVG9HSURNYXAvSWRlbnRpdHkvRFcgMTAwMC9DSURTeXN0ZW1JbmZvIDEyIDAgUi9Gb250RGVzY3JpcHRvciAxMyAwIFIvVyAzNCAwIFI+Pg0KZW5kb2JqDQoxMiAwIG9iag0KPDwvT3JkZXJpbmcoSWRlbnRpdHkpIC9SZWdpc3RyeShBZG9iZSkgL1N1cHBsZW1lbnQgMD4+DQplbmRvYmoNCjEzIDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0JDREZFRStEZW5nWGlhbi1Cb2xkL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDgxMC9EZXNjZW50IC0yMzIvQ2FwSGVpZ2h0IDgxMC9BdmdXaWR0aCA0NTYvTWF4V2lkdGggMTM3MC9Gb250V2VpZ2h0IDcwMC9YSGVpZ2h0IDI1MC9TdGVtViA0NS9Gb250QkJveFsgLTE3MyAtMjMyIDExOTcgODEwXSAvRm9udEZpbGUyIDMzIDAgUj4+DQplbmRvYmoNCjE0IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YzL0Jhc2VGb250L0JDREdFRStEZW5nWGlhbi1Cb2xkL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciAxNSAwIFIvRmlyc3RDaGFyIDMyL0xhc3RDaGFyIDMyL1dpZHRocyAzNSAwIFI+Pg0KZW5kb2JqDQoxNSAwIG9iag0KPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9CQ0RHRUUrRGVuZ1hpYW4tQm9sZC9GbGFncyAzMi9JdGFsaWNBbmdsZSAwL0FzY2VudCA4MTAvRGVzY2VudCAtMjMyL0NhcEhlaWdodCA4MTAvQXZnV2lkdGggNDU2L01heFdpZHRoIDEzNzAvRm9udFdlaWdodCA3MDAvWEhlaWdodCAyNTAvU3RlbVYgNDUvRm9udEJCb3hbIC0xNzMgLTIzMiAxMTk3IDgxMF0gL0ZvbnRGaWxlMiAzMyAwIFI+Pg0KZW5kb2JqDQoxNiAwIG9iag0KPDwvQXV0aG9yKP7/Zx2WMwAgVBUpIC9DcmVhdG9yKP7/AE0AaQBjAHIAbwBzAG8AZgB0AK4AIABXAG8AcgBkACAAMgAwADEAOSkgL0NyZWF0aW9uRGF0ZShEOjIwMjQwODA1MTcxNDIwKzA4JzAwJykgL01vZERhdGUoRDoyMDI0MDgwNTE3MTQyMCswOCcwMCcpIC9Qcm9kdWNlcij+/wBNAGkAYwByAG8AcwBvAGYAdACuACAAVwBvAHIAZAAgADIAMAAxADkpID4+DQplbmRvYmoNCjI1IDAgb2JqDQo8PC9U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Q2VoaUh6cmVTek5UY3prYzlkIj8+PHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iMy4xLTcwMSI+CjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiICB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iPgo8cGRmOlByb2R1Y2VyPk1pY3Jvc29mdMKuIFdvcmQgMjAxOTwvcGRmOlByb2R1Y2VyPjwvcmRmOkRlc2NyaXB0aW9uPgo8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KPGRjOmNyZWF0b3I+PHJkZjpTZXE+PHJkZjpsaT7mnJ3pmLMg5ZCVPC9yZGY6bGk+PC9yZGY6U2VxPjwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+Cjx4bXA6Q3JlYXRvclRvb2w+TWljcm9zb2Z0wq4gV29yZCAyMDE5PC94bXA6Q3JlYXRvclRvb2w+PHhtcDpDcmVhdGVEYXRlPjIwMjQtMDgtMDVUMTc6MTQ6MjArMDg6MDA8L3htcDpDcmVhdGVEYXRlPjx4bXA6TW9kaWZ5RGF0ZT4yMDI0LTA4LTA1VDE3OjE0OjIwKzA4OjAwPC94bXA6TW9kaWZ5RGF0ZT48L3JkZjpEZXNjcmlwdGlvbj4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIj4KPHhtcE1NOkRvY3VtZW50SUQ+dXVpZDo4MzY4MEUxMi1FNTNBLTRGQzItOENENi05Qzg3NTc3RjdEOEQ8L3htcE1NOkRvY3VtZW50SUQ+PHhtcE1NOkluc3RhbmNlSUQ+dXVpZDo4MzY4MEUxMi1FNTNBLTRGQzItOENENi05Qzg3NTc3RjdEOEQ8L3htcE1NOkluc3RhbmNlSUQ+PC9yZGY6RGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8L3JkZjpSREY+PC94OnhtcG1ldGE+PD94cGFja2V0IGVuZD0idyI/Pg0KZW5kc3RyZWFtDQplbmRvYmoNCjM3IDAgb2JqDQo8PC9EaXNwbGF5RG9jVGl0bGUgdHJ1ZT4+DQplbmRvYmoNCjM4IDAgb2JqDQo8PC9UeXBlL1hSZWYvU2l6ZSAzOC9XWyAxIDQgMl0gL1Jvb3QgMSAwIFIvSW5mbyAxNiAwIFIvSURbPDEyMEU2ODgzM0FFNUMyNEY4Q0Q2OUM4NzU3N0Y3RDhEPjwxMjBFNjg4MzNBRTVDMjRGOENENjlDODc1NzdGN0Q4RD5dIC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDEzMz4+DQpzdHJlYW0NCnicNc4rDsJQEIXhub19UwModoFr0rAdDEGgEUgMEo/BkJDgWQvrQDRpUobzw4j5Msm8zDzGMXiemn25wkuEQcSNSGciS6CFLbxFPoenKCL0oryJ6mLmG2xhBZRQQQ05BPgNTHy8PvyrDFJIIHpLs9Oh5iS6u1gtxX4NZ3iIoz//Aa+yEw8NCmVuZHN0cmVhbQ0KZW5kb2JqDQp4cmVmDQowIDM5DQowMDAwMDAwMDE3IDY1NTM1IGYNCjAwMDAwMDAwMTcgMDAwMDAgbg0KMDAwMDAwMDE2MyAwMDAwMCBuDQowMDAwMDAwMjE5IDAwMDAwIG4NCjAwMDAwMDA1MDggMDAwMDAgbg0KMDAwMDAwMDg3NCAwMDAwMCBuDQowMDAwMDAxMDQyIDAwMDAwIG4NCjAwMDAwMDEyODIgMDAwMDAgbg0KMDAwMDAwMTMzNSAwMDAwMCBuDQowMDAwMDAxMzg4IDAwMDAwIG4NCjAwMDAwMDE1MjUgMDAwMDAgbg0KMDAwMDAwMTU1NSAwMDAwMCBuDQowMDAwMDAxNzIxIDAwMDAwIG4NCjAwMDAwMDE3OTUgMDAwMDAgbg0KMDAwMDAwMjA0MSAwMDAwMCBuDQowMDAwMDAyMjE2IDAwMDAwIG4NCjAwMDAwMDI0NjIgMDAwMDAgbg0KMDAwMDAwMDAxOCA2NTUzNSBmDQowMDAwMDAwMDE5IDY1NTM1IGYNCjAwMDAwMDAwMjAgNjU1MzUgZg0KMDAwMDAwMDAyMSA2NTUzNSBmDQowMDAwMDAwMDIyIDY1NTM1IGYNCjAwMDAwMDAwMjMgNjU1MzUgZg0KMDAwMDAwMDAyNCA2NTUzNSBmDQowMDAwMDAwMDI1IDY1NTM1IGYNCjAwMDAwMDAwMjYgNjU1MzUgZg0KMDAwMDAwMDAyNyA2NTUzNSBmDQowMDAwMDAwMDI4IDY1NTM1IGYNCjAwMDAwMDAwMjkgNjU1MzUgZg0KMDAwMDAwMDAwMCA2NTUzNSBmDQowMDAwMDAzMTg0IDAwMDAwIG4NCjAwMDAwMDMyMTEgMDAwMDAgbg0KMDAwMDAxNTAxOSAwMDAwMCBuDQowMDAwMDE1NDA4IDAwMDAwIG4NCjAwMDAwMzEzMzMgMDAwMDAgbg0KMDAwMDAzMTM3OSAwMDAwMCBuDQowMDAwMDMxNDA2IDAwMDAwIG4NCjAwMDAwMzQ1NDkgMDAwMDAgbg0KMDAwMDAzNDU5NCAwMDAwMCBuDQp0cmFpbGVyDQo8PC9TaXplIDM5L1Jvb3QgMSAwIFIvSW5mbyAxNiAwIFIvSURbPDEyMEU2ODgzM0FFNUMyNEY4Q0Q2OUM4NzU3N0Y3RDhEPjwxMjBFNjg4MzNBRTVDMjRGOENENjlDODc1NzdGN0Q4RD5dID4+DQpzdGFydHhyZWYNCjM0OTI4DQolJUVPRg0KeHJlZg0KMCAwDQp0cmFpbGVyDQo8PC9TaXplIDM5L1Jvb3QgMSAwIFIvSW5mbyAxNiAwIFIvSURbPDEyMEU2ODgzM0FFNUMyNEY4Q0Q2OUM4NzU3N0Y3RDhEPjwxMjBFNjg4MzNBRTVDMjRGOENENjlDODc1NzdGN0Q4RD5dIC9QcmV2IDM0OTI4L1hSZWZTdG0gMzQ1OTQ+Pg0Kc3RhcnR4cmVmDQozNTg2NQ0KJSVFT0Y=';
|
|
@@ -89276,7 +90164,7 @@ const DefaultFilePath = 'JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2c
|
|
|
89276
90164
|
type: Boolean
|
|
89277
90165
|
},
|
|
89278
90166
|
/**
|
|
89279
|
-
* 读卡器:0-默认读卡器及精伦读卡器;1-丽水一体机;2-沃斯德人证交互终端;3-中正人脸识别;4-华大读卡器;5-良田;6-捷宇信息交互终端;7-太极云软/Z300;8-华视电子读卡器;9-捷宇高拍仪读卡; 10-国产客户端一体机; 11
|
|
90167
|
+
* 读卡器:0-默认读卡器及精伦读卡器;1-丽水一体机;2-沃斯德人证交互终端;3-中正人脸识别;4-华大读卡器;5-良田;6-捷宇信息交互终端;7-太极云软/Z300;8-华视电子读卡器;9-捷宇高拍仪读卡; 10-国产客户端一体机; 11-出入境读卡设备;12-普天;13-精伦;14-紫图;15-维山
|
|
89280
90168
|
* 人脸识别:0-默认人脸识别(拍照);1-丽水一体机 2-沃斯德人证交互终端;3-中正人脸识别;5-良田;6-捷宇信息交互终端;10-国产客户端一体机
|
|
89281
90169
|
* 读取社保卡:2-沃斯德人证交互终端;4-华大读卡器;5-国产客户端一体机
|
|
89282
90170
|
* 签字板:0-有为签字板;1-汉王签字板;2-沃斯德人证交互终端签字;3-捷宇信息交互终端;4-太极云软签字/P-300;5:国产客户端签字板
|
|
@@ -89454,6 +90342,16 @@ const DefaultFilePath = 'JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2c
|
|
|
89454
90342
|
idcardInfo = await JingLunPluginService.idCardRead();
|
|
89455
90343
|
this.$emit('click', idcardInfo);
|
|
89456
90344
|
break;
|
|
90345
|
+
case 14:
|
|
90346
|
+
// 紫图
|
|
90347
|
+
idcardInfo = await UdsPluginSocketService.idCardRead();
|
|
90348
|
+
this.$emit('click', idcardInfo);
|
|
90349
|
+
break;
|
|
90350
|
+
case 15:
|
|
90351
|
+
// 维山高拍仪
|
|
90352
|
+
idcardInfo = await ViisanPluginService.idCardRead();
|
|
90353
|
+
this.$emit('click', idcardInfo);
|
|
90354
|
+
break;
|
|
89457
90355
|
default:
|
|
89458
90356
|
this.$message.warning('请在首页右上角我的设备中设置读卡器选项!');
|
|
89459
90357
|
break;
|
|
@@ -89733,11 +90631,11 @@ const DefaultFilePath = 'JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2c
|
|
|
89733
90631
|
;
|
|
89734
90632
|
var id_card_reader_button_component = normalizeComponent(
|
|
89735
90633
|
src_id_card_reader_buttonvue_type_script_lang_js_,
|
|
89736
|
-
|
|
89737
|
-
|
|
90634
|
+
id_card_reader_buttonvue_type_template_id_00babc28_scoped_true_render,
|
|
90635
|
+
id_card_reader_buttonvue_type_template_id_00babc28_scoped_true_staticRenderFns,
|
|
89738
90636
|
false,
|
|
89739
90637
|
null,
|
|
89740
|
-
"
|
|
90638
|
+
"00babc28",
|
|
89741
90639
|
null
|
|
89742
90640
|
|
|
89743
90641
|
)
|