621 lines
20 KiB
TypeScript
621 lines
20 KiB
TypeScript
import { Component, OnInit, ViewChild } from '@angular/core';
|
||
import { apiConf } from '@conf/api.conf';
|
||
import { cacheConf } from '@conf/cache.conf';
|
||
import { SFComponent, SFUISchema, SFSchema, SFUploadWidgetSchema, SFDateWidgetSchema } from '@delon/form';
|
||
import { _HttpClient } from '@delon/theme';
|
||
import { EACacheService, EAEnvironmentService } from '@shared';
|
||
import { NzModalRef } from 'ng-zorro-antd/modal';
|
||
import { NzUploadFile } from 'ng-zorro-antd/upload';
|
||
import { Observable, Observer, of } from 'rxjs';
|
||
import { map } from 'rxjs/operators';
|
||
import { UsermanageService } from '../../../services/usercenter.service';
|
||
|
||
|
||
@Component({
|
||
selector: 'app-car-add-driver',
|
||
templateUrl: './add-driver.component.html',
|
||
styleUrls: ['./add-driver.component.less']
|
||
})
|
||
export class CarSettleAddDriverComponent implements OnInit {
|
||
@ViewChild('sf', { static: false }) sf!: SFComponent;
|
||
@ViewChild('sf1', { static: false }) sf1!: SFComponent;
|
||
@ViewChild('sf2', { static: false }) sf2!: SFComponent;
|
||
record: any = {};
|
||
i: any;
|
||
ui: SFUISchema = {};
|
||
schema: SFSchema = {};
|
||
schema1: SFSchema = {};
|
||
schema2: SFSchema = {};
|
||
showCardFlag = false;
|
||
showJopFlag = false;
|
||
detailData: any = {
|
||
identityInfoDTO: {},
|
||
userDriverLicenseDTO: {},
|
||
userPracticeSeniorityDTO: {}
|
||
};
|
||
companyData: any = {};
|
||
constructor(
|
||
private modal: NzModalRef,
|
||
public service: UsermanageService,
|
||
private envSrv: EAEnvironmentService,
|
||
private eaCacheSrv: EACacheService,
|
||
) { }
|
||
|
||
ngOnInit(): void {
|
||
this.companyData = this.eaCacheSrv.get(cacheConf.env)
|
||
this.initSF()
|
||
}
|
||
initSF() {
|
||
this.schema = {
|
||
properties: {
|
||
titleA: {
|
||
title: '司机信息(必填)',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'text',
|
||
},
|
||
default: '照片上传后会自动识别文字并填充下列内容栏'
|
||
},
|
||
mobile: {
|
||
title: '手机号',
|
||
type: 'string',
|
||
format: 'mobile',
|
||
maxLength: 11,
|
||
ui: {
|
||
widget: '',
|
||
},
|
||
},
|
||
showName: {
|
||
title: '身份证照片',
|
||
type: 'string',
|
||
readOnly: true,
|
||
ui: {
|
||
widget: 'textarea',
|
||
borderless:true,
|
||
showRequired: true,
|
||
},
|
||
default: '请上传身份证原件的高清照片,若上传复印件,则需加盖公司印章及法人签字;上传后系统会自动识别并填写',
|
||
},
|
||
tipsA: {
|
||
title: '',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'custom',
|
||
offsetControl: 6,
|
||
},
|
||
},
|
||
certificatePhotoFrontWatermark: {
|
||
type: 'string',
|
||
title: '',
|
||
ui: {
|
||
offsetControl: 6,
|
||
action: apiConf.fileUpload,
|
||
fileType: 'image/png,image/jpeg,image/jpg,image/gif',
|
||
limit: 1,
|
||
limitFileCount: 1,
|
||
resReName: 'data.fullFileWatermarkPath',
|
||
urlReName: 'data.fullFileWatermarkPath',
|
||
widget: 'upload',
|
||
descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M',
|
||
data: {
|
||
appId: this.envSrv.env.appId,
|
||
},
|
||
name: 'multipartFile',
|
||
multiple: false,
|
||
listType: 'picture-card',
|
||
change: (args: any) => {
|
||
if (args.type === 'success') {
|
||
console.log(args.file.response.data.fullFilePath)
|
||
this.detailData.certificatePhotoFront = args.file.response.data.fullFilePath
|
||
this.checkIdCard(args.file.response.data.fullFilePath, 'front', 0);
|
||
}
|
||
},
|
||
beforeUpload: (file: any, _fileList: any) => {
|
||
return new Observable((observer: Observer<boolean>) => {
|
||
const isLt2M = file.size / 1024 / 1024 < 2;
|
||
if (!isLt2M) {
|
||
this.service.msgSrv.warning('图片大小超过2M!');
|
||
observer.complete();
|
||
return;
|
||
}
|
||
observer.next(isLt2M);
|
||
observer.complete();
|
||
});
|
||
},
|
||
// previewFile: (file: NzUploadFile) => of(file.url),
|
||
}
|
||
},
|
||
tipsB: {
|
||
title: '',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'custom',
|
||
offsetControl: 6,
|
||
},
|
||
},
|
||
certificatePhotoBackWatermark: {
|
||
type: 'string',
|
||
title: '',
|
||
ui: {
|
||
offsetControl: 6,
|
||
action: apiConf.fileUpload,
|
||
fileType: 'image/png,image/jpeg,image/jpg,image/gif',
|
||
limit: 1,
|
||
limitFileCount: 1,
|
||
resReName: 'data.fullFileWatermarkPath',
|
||
urlReName: 'data.fullFileWatermarkPath',
|
||
widget: 'upload',
|
||
descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过2M',
|
||
data: {
|
||
appId: this.envSrv.env.appId,
|
||
},
|
||
name: 'multipartFile',
|
||
multiple: false,
|
||
listType: 'picture-card',
|
||
change: (args: any) => {
|
||
if (args.type === 'success') {
|
||
this.detailData.certificatePhotoBack = args.file.response.data.fullFilePath
|
||
this.checkIdCard(args.file.response.data.fullFilePath, 'back', 0);
|
||
}
|
||
},
|
||
beforeUpload: (file: any, _fileList: any) => {
|
||
return new Observable((observer: Observer<boolean>) => {
|
||
const isLt2M = file.size / 1024 / 1024 < 2;
|
||
if (!isLt2M) {
|
||
this.service.msgSrv.warning('图片大小超过2M!');
|
||
observer.complete();
|
||
return;
|
||
}
|
||
observer.next(isLt2M);
|
||
observer.complete();
|
||
});
|
||
},
|
||
// previewFile: (file: NzUploadFile) => of(file.url),
|
||
}
|
||
},
|
||
name: {
|
||
title: '姓名',
|
||
type: 'string',
|
||
maxLength: 32,
|
||
ui: {
|
||
widget: '',
|
||
placeholder: '请输入姓名',
|
||
},
|
||
},
|
||
certificateNumber: {
|
||
title: '身份证号',
|
||
type: 'string',
|
||
format: 'id-card',
|
||
minLength: 1,
|
||
maxLength: 18,
|
||
ui: {
|
||
widget: '',
|
||
placeholder: '请输入法定代表人证件号',
|
||
errors: {
|
||
required: '请输入18位身份证号码',
|
||
},
|
||
},
|
||
},
|
||
bankCardNo: {
|
||
title: '银行卡号',
|
||
type: 'string',
|
||
maxLength: 18,
|
||
ui: {
|
||
widget: '',
|
||
placeholder: '请输入银行卡号',
|
||
// change: (val: any) =>{
|
||
// const value = val.replace(/\D/g,'')
|
||
// this.sf.setValue('/bankCardNo', value)
|
||
// },
|
||
},
|
||
default: ''
|
||
},
|
||
bankName: {
|
||
title: '开户行',
|
||
type: 'string',
|
||
ui: {
|
||
widget: '',
|
||
},
|
||
default: ''
|
||
},
|
||
},
|
||
required: [
|
||
'certificatePhotoFrontWatermark',
|
||
'certificatePhotoBackWatermark',
|
||
'name',
|
||
'certificateNumber',
|
||
'bankCardNo'
|
||
],
|
||
};
|
||
this.schema1 = {
|
||
properties: {
|
||
titleB: {
|
||
title: '驾驶证信息(必填)',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'text',
|
||
},
|
||
default: '照片上传后会自动识别文字并填充下列内容栏'
|
||
},
|
||
certificatePhotoWatermark: {
|
||
type: 'string',
|
||
title: '驾驶证照片',
|
||
ui: {
|
||
action: apiConf.fileUpload,
|
||
fileType: 'image/png,image/jpeg,image/jpg,image/gif',
|
||
limit: 1,
|
||
limitFileCount: 1,
|
||
resReName: 'data.fullFileWatermarkPath',
|
||
urlReName: 'data.fullFileWatermarkPath',
|
||
widget: 'upload',
|
||
descriptionI18n: '请上传驾驶证照片,支持JPG、PNG格式,文件小于5M。照片信息缺失、拼凑、过度PS、模糊不清,都不会通过审核。',
|
||
data: {
|
||
appId: this.envSrv.env.appId,
|
||
},
|
||
name: 'multipartFile',
|
||
multiple: false,
|
||
listType: 'picture-card',
|
||
change: (args: any) => {
|
||
if (args.type === 'success') {
|
||
this.detailData.userDriverLicenseDTO.certificatePhoto = args.file.response.data.fullFilePath
|
||
this.checkDriverCard(args.file.response.data.fullFilePath, 'front', 0);
|
||
} else {
|
||
this.detailData.userDriverLicenseDTO.certificatePhoto = ''
|
||
}
|
||
},
|
||
beforeUpload: (file: any, _fileList: any) => {
|
||
return new Observable((observer: Observer<boolean>) => {
|
||
const isLt4M = file.size / 1024 / 1024 < 4;
|
||
if (!isLt4M) {
|
||
this.service.msgSrv.warning('图片大小超过4M!');
|
||
observer.complete();
|
||
return;
|
||
}
|
||
observer.next(isLt4M);
|
||
observer.complete();
|
||
});
|
||
},
|
||
// previewFile: (file: NzUploadFile) => of(file.url),
|
||
}
|
||
},
|
||
licenseNo: {
|
||
title: '驾驶证号',
|
||
type: 'string',
|
||
ui: {
|
||
// widget: 'text',
|
||
placeholder: '请输入',
|
||
},
|
||
// default: this.ar.snapshot.queryParams.licenseNo
|
||
},
|
||
driverModel: {
|
||
title: '准驾车型',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'select',
|
||
mode: 'multiple',
|
||
containsAllLabel: false,
|
||
placeholder: '请选择准驾车型',
|
||
asyncData: () =>
|
||
this.service.request(this.service.$api_getDictValue, { dictKey: 'driverModel' }).pipe(
|
||
map((data) => {
|
||
return data.map((m: any) => {
|
||
return { label: m.label, value: m.label };
|
||
});
|
||
}),
|
||
),
|
||
},
|
||
},
|
||
validStartTime: {
|
||
title: '有效期起',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'date',
|
||
format: 'yyyy-MM-dd',
|
||
placeholder: '请选择',
|
||
errors: {
|
||
required: '请选择起始日期',
|
||
},
|
||
change: (i) => { },
|
||
} as SFDateWidgetSchema,
|
||
},
|
||
validEndTime: {
|
||
title: '有效期止',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'date',
|
||
format: 'yyyy-MM-dd',
|
||
placeholder: '请选择',
|
||
errors: {
|
||
required: '请选择终止日期',
|
||
},
|
||
change: (i) => { },
|
||
} as SFDateWidgetSchema,
|
||
},
|
||
signingOrganization: {
|
||
title: '签发机关',
|
||
type: 'string',
|
||
maxLength: 30,
|
||
ui: {
|
||
// widget: this.detailData.commitFlag !== 0 ? 'text' : '',
|
||
placeholder: '请输入',
|
||
},
|
||
},
|
||
},
|
||
required: [
|
||
'certificatePhotoWatermark',
|
||
'licenseNo',
|
||
'driverModel',
|
||
'validStartTime',
|
||
'validEndTime',
|
||
],
|
||
};
|
||
this.schema2 = {
|
||
properties: {
|
||
titleC: {
|
||
title: '从业资格证(选填)',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'text',
|
||
},
|
||
default: '照片上传后会自动识别文字并填充下列内容栏',
|
||
},
|
||
certificatePhotoWatermark: {
|
||
type: 'string',
|
||
title: '',
|
||
ui: {
|
||
offsetControl: 6,
|
||
action: apiConf.fileUpload,
|
||
fileType: 'image/png,image/jpeg,image/jpg,image/gif',
|
||
limit: 1,
|
||
limitFileCount: 1,
|
||
resReName: 'data.fullFileWatermarkPath',
|
||
urlReName: 'data.fullFileWatermarkPath',
|
||
widget: 'upload',
|
||
descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M',
|
||
data: {
|
||
appId: this.envSrv.env.appId,
|
||
},
|
||
name: 'multipartFile',
|
||
multiple: false,
|
||
listType: 'picture-card',
|
||
change: (args: any) => {
|
||
if (args.type === 'success') {
|
||
this.detailData.userPracticeSeniorityDTO.certificatePhoto = args.file.response.data.fullFilePath
|
||
this.checkQualificationCertificate(args.file.response.data.fullFilePath);
|
||
} else {
|
||
this.detailData.userPracticeSeniorityDTO.certificatePhoto = ''
|
||
}
|
||
},
|
||
beforeUpload: (file: any, _fileList: any) => {
|
||
return new Observable((observer: Observer<boolean>) => {
|
||
const isLt2M = file.size / 1024 / 1024 < 2;
|
||
if (!isLt2M) {
|
||
this.service.msgSrv.warning('图片大小超过2M!');
|
||
observer.complete();
|
||
return;
|
||
}
|
||
observer.next(isLt2M);
|
||
observer.complete();
|
||
});
|
||
},
|
||
// previewFile: (file: NzUploadFile) => of(file.url),
|
||
}
|
||
},
|
||
licenseNo: {
|
||
title: '从业资格证号',
|
||
type: 'string',
|
||
maxLength: 30,
|
||
ui: {
|
||
// widget: this.detailData.commitFlag !== 0 ? 'text' : '',
|
||
placeholder: '请输入',
|
||
},
|
||
},
|
||
regionCode: {
|
||
title: '签发省份',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'select',
|
||
placeholder: '请选择',
|
||
asyncData: () => this.getProvinceData(),
|
||
} as SFDateWidgetSchema,
|
||
},
|
||
validStartTime: {
|
||
title: '发证日期',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'date',
|
||
format: 'yyyy-MM-dd',
|
||
placeholder: '请选择',
|
||
errors: {
|
||
required: '请选择起始日期',
|
||
},
|
||
change: (i) => { },
|
||
} as SFDateWidgetSchema,
|
||
},
|
||
validEndTime: {
|
||
title: '有效期止',
|
||
type: 'string',
|
||
ui: {
|
||
widget: 'date',
|
||
format: 'yyyy-MM-dd',
|
||
placeholder: '请选择',
|
||
errors: {
|
||
required: '请选择终止日期',
|
||
},
|
||
change: (i) => { },
|
||
} as SFDateWidgetSchema,
|
||
},
|
||
},
|
||
required: [
|
||
|
||
],
|
||
};
|
||
this.ui = {
|
||
'*': {
|
||
spanLabelFixed: 180,
|
||
grid: { span: 24 },
|
||
width: 700,
|
||
},
|
||
$title1: {
|
||
spanLabelFixed: 0,
|
||
},
|
||
$title2: {
|
||
spanLabelFixed: 0,
|
||
},
|
||
$title3: {
|
||
spanLabelFixed: 0,
|
||
},
|
||
$title4: {
|
||
spanLabelFixed: 0,
|
||
},
|
||
$enterpriseRegistrationTime: {
|
||
width: 680,
|
||
},
|
||
$operatingEndTime: {
|
||
grid: { span: 9 },
|
||
},
|
||
$dateType: {
|
||
grid: { span: 4 },
|
||
},
|
||
$validEndTime: {
|
||
grid: { span: 9 },
|
||
},
|
||
$dateType01: {
|
||
grid: { span: 4 },
|
||
},
|
||
$registrationCapital: {
|
||
grid: { span: 12 },
|
||
},
|
||
$unit: {
|
||
spanLabelFixed: 20,
|
||
grid: { span: 3 },
|
||
},
|
||
};
|
||
}
|
||
getProvinceData() {
|
||
return this.service.request(this.service.$api_getRegionByCode, { regionCode: '' }).pipe(
|
||
map(res => {
|
||
const result: any = []
|
||
if (res) {
|
||
res.map((m: any) => {
|
||
const item = { label: m.name, value: m.regionCode }
|
||
result.push(item)
|
||
});
|
||
}
|
||
return result
|
||
})
|
||
);
|
||
}
|
||
checkIdCard(imgurl: any, side: any, type: any) {
|
||
// 识别身份证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证
|
||
const params = {
|
||
idCardUrl: imgurl,
|
||
side,
|
||
};
|
||
this.service.request(this.service.$api_checkIdCard, params).subscribe((res) => {
|
||
if (res) {
|
||
if (type === 0) {
|
||
// 法定代表人身份证
|
||
if (side === 'front') {
|
||
// 正面
|
||
this.sf.setValue('/name', res.name);
|
||
this.sf.setValue('/certificateNumber', res.number);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
checkQualificationCertificate(imgurl: any) {
|
||
// 识别从业资格证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证
|
||
const params = {
|
||
qualificationCertificateUrl: imgurl,
|
||
};
|
||
this.service.request(this.service.$api_recognizeQualificationCertificate, params).subscribe((res) => {
|
||
if (res) {
|
||
this.sf.setValue('/licenseNo', res.continuingEducationInfo);
|
||
//this.sf.setValue('/validStartTime', res.continuingEducationInfo);
|
||
}
|
||
});
|
||
}
|
||
|
||
checkDriverCard(imgurl: any, side: any, type: any) {
|
||
// 识别身份证 参数side:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证
|
||
const params = {
|
||
driverLicenseUrl: imgurl,
|
||
side,
|
||
};
|
||
this.service.request(this.service.$api_recognizeDriverLicense, params).subscribe((res) => {
|
||
if (res) {
|
||
if (type === 0) {
|
||
// 法定代表人身份证
|
||
if (side === 'front') {
|
||
// 正面
|
||
this.sf1.setValue('/licenseNo', res.number);
|
||
this.sf1.setValue('/driverModel', [(res.classType).toUpperCase()]);
|
||
this.sf1.setValue('/validStartTime', res.validFrom);
|
||
this.sf1.setValue('/validEndTime', res.validTo);
|
||
this.sf1.setValue('/signingOrganization', res.issuingAuthority);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
close(): void {
|
||
this.modal.destroy();
|
||
}
|
||
showExample(){
|
||
this.showCardFlag = !this.showCardFlag
|
||
}
|
||
showJopExample(){
|
||
this.showJopFlag = !this.showJopFlag
|
||
}
|
||
submitForm(){
|
||
const items: any = this.sf.value
|
||
items.certificatePhotoFrontWatermark = this.sf.value?.certificatePhotoFrontWatermark.data.fullFilePath
|
||
items.certificatePhotoBackWatermark = this.sf.value?.certificatePhotoBackWatermark.data.fullFilePath
|
||
const items2: any = this.sf1.value
|
||
items2.certificatePhotoWatermark = this.sf1.value?.certificatePhotoWatermark.data.fullFilePath
|
||
const items3: any = this.sf2.value
|
||
items3.certificatePhotoWatermark = this.sf2.value?.certificatePhotoWatermark.data.fullFilePath
|
||
const params:any = {
|
||
source: 2,
|
||
mobile: this.sf.value.mobile,
|
||
bankCardNo: this.sf.value.bankCardNo,
|
||
bankName: this.sf.value.bankName,
|
||
identityInfoDTO:{
|
||
...items,
|
||
certificatePhotoFront: this.detailData.certificatePhotoFront,
|
||
certificatePhotoBack: this.detailData.certificatePhotoBack,
|
||
},
|
||
userDriverLicenseDTO: {
|
||
...items2,
|
||
certificatePhoto: this.detailData.userDriverLicenseDTO.certificatePhoto,
|
||
},
|
||
userPracticeSeniorityDTO: {
|
||
...items3,
|
||
certificatePhoto: this.detailData.userPracticeSeniorityDTO.certificatePhoto,
|
||
},
|
||
};
|
||
if(params.userPracticeSeniorityDTO.certificatePhoto === '' || params.userPracticeSeniorityDTO.certificatePhotoWatermark === '') {
|
||
delete params.userPracticeSeniorityDTO.certificatePhotoWatermark
|
||
delete params.userPracticeSeniorityDTO.certificatePhoto
|
||
}
|
||
params.userDriverLicenseDTO.driverModel = params.userDriverLicenseDTO.driverModel.join(',')
|
||
delete params.identityInfoDTO.showName;
|
||
delete params.identityInfoDTO.titleA;
|
||
delete params.userDriverLicenseDTO.titleB;
|
||
delete params.userPracticeSeniorityDTO.titleC;
|
||
delete params.userDriverLicenseDTO.tipsA;
|
||
delete params.userPracticeSeniorityDTO.tipsC;
|
||
if(JSON.stringify(params.userPracticeSeniorityDTO) === '{}') {
|
||
params.userPracticeSeniorityDTO = null
|
||
}
|
||
this.service.request(this.service.$api_enterpriseVehicleSave, params).subscribe(res => {
|
||
if(res){
|
||
this.service.msgSrv.success('添加成功')
|
||
this.modal.close(true)
|
||
}
|
||
})
|
||
}
|
||
}
|