update: 补充改造开店法人和个人证件信息,并且支持图片内容识别功能

This commit is contained in:
mixtan 2025-06-05 14:41:26 +08:00
parent acace24d47
commit bcd2043346
2 changed files with 318 additions and 67 deletions

1
components.d.ts vendored
View File

@ -16,6 +16,7 @@ declare module 'vue' {
ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem'] ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
ElCascader: typeof import('element-plus/es')['ElCascader'] ElCascader: typeof import('element-plus/es')['ElCascader']
ElCol: typeof import('element-plus/es')['ElCol'] ElCol: typeof import('element-plus/es')['ElCol']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDialog: typeof import('element-plus/es')['ElDialog'] ElDialog: typeof import('element-plus/es')['ElDialog']
ElForm: typeof import('element-plus/es')['ElForm'] ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElFormItem: typeof import('element-plus/es')['ElFormItem']

View File

@ -32,6 +32,9 @@
disabled disabled
/> />
</el-form-item> </el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="applyFormData.email" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="经营品类" prop="biz_category"> <el-form-item label="经营品类" prop="biz_category">
<el-cascader <el-cascader
v-model="applyFormData.biz_category" v-model="applyFormData.biz_category"
@ -219,7 +222,10 @@
<el-button <el-button
type="info" type="info"
plain plain
v-if="applyFormData.biz_license_image && !applyFormData.biz_license_company" v-if="
applyFormData.biz_license_image &&
!applyFormData.biz_license_company
"
@click="handleOcrText(currentBbatchNo, 'biz_license_image')" @click="handleOcrText(currentBbatchNo, 'biz_license_image')"
>点击免填营业执照信息</el-button >点击免填营业执照信息</el-button
> >
@ -244,6 +250,16 @@
placeholder="请输入法人姓名" placeholder="请输入法人姓名"
/> />
</el-form-item> </el-form-item>
<el-form-item
label="法人手机号"
prop="legal_person_mobile"
v-if="applyFormData.biz_license_image"
>
<el-input
v-model="applyFormData.legal_person_mobile"
placeholder="请输入法人手机号"
/>
</el-form-item>
<el-form-item <el-form-item
label="注册号" label="注册号"
prop="biz_license_number" prop="biz_license_number"
@ -254,10 +270,18 @@
placeholder="请输入注册号" placeholder="请输入注册号"
/> />
</el-form-item> </el-form-item>
<!-- <el-form-item label="法人手机号" prop="legal_person_mobile"> <el-form-item
<el-input v-model="applyFormData.legal_person_mobile" placeholder="请输入法人手机号" /> label="经营范围"
</el-form-item> --> prop="biz_license_content"
v-if="applyFormData.biz_license_image"
>
<el-input
:rows="2"
type="textarea"
v-model="applyFormData.biz_license_content"
placeholder="请输入经营范围"
/>
</el-form-item>
<el-form-item <el-form-item
label="许可证类型" label="许可证类型"
prop="license_type" prop="license_type"
@ -370,8 +394,13 @@
<el-button <el-button
type="info" type="info"
plain plain
v-if="applyFormData.legal_person_id_images && !applyFormData.legal_person_id_number" v-if="
@click="handleOcrText(currentBbatchNo, 'legal_person_id_images')" applyFormData.legal_person_id_images &&
!applyFormData.legal_person_id_number
"
@click="
handleOcrText(currentBbatchNo, 'legal_person_id_images')
"
>点击免填身份证</el-button >点击免填身份证</el-button
> >
</el-form-item> </el-form-item>
@ -423,6 +452,43 @@
placeholder="请输入法人身份证号码" placeholder="请输入法人身份证号码"
/> />
</el-form-item> </el-form-item>
<el-form-item
label="身份证详细地址"
prop="legal_person_id_addr"
v-if="applyFormData.legal_person_id_images"
>
<el-input
v-model="applyFormData.legal_person_id_addr"
placeholder="请输入身份证详细地址"
/>
</el-form-item>
<el-form-item
label="身份证生效日期"
prop="legal_person_id_period_begin"
v-if="applyFormData.legal_person_id_images2"
>
<el-date-picker
v-model="applyFormData.legal_person_id_period_begin"
type="date"
placeholder="请选择有效日期"
/>
</el-form-item>
<el-form-item
label="身份证截止日期"
prop="legal_person_id_period_end"
v-if="applyFormData.legal_person_id_images2"
>
<el-radio-group v-model="legal_person_date_type">
<el-radio :label="1">长期</el-radio>
<el-radio :label="2">非长期</el-radio>
</el-radio-group>
<el-date-picker
v-if="legal_person_date_type == 2"
v-model="applyFormData.legal_person_id_period_end"
type="date"
placeholder="请选择截止日期"
/>
</el-form-item>
</div> </div>
<div v-if="applyFormData.entity_type === 2"> <div v-if="applyFormData.entity_type === 2">
<!-- 个人身份证正反面 --> <!-- 个人身份证正反面 -->
@ -513,6 +579,43 @@
placeholder="请输入个人身份证号" placeholder="请输入个人身份证号"
/> />
</el-form-item> </el-form-item>
<el-form-item
label="身份证详细地址"
prop="individual_id_number"
v-if="applyFormData.individual_id_images"
>
<el-input
v-model="applyFormData.individual_id_addr"
placeholder="请输入身份证详细地址"
/>
</el-form-item>
<el-form-item
label="身份证生效日期"
prop="individual_id_period_begin"
v-if="applyFormData.individual_id_images2"
>
<el-date-picker
v-model="applyFormData.individual_id_period_begin"
type="date"
placeholder="请选择有效日期"
/>
</el-form-item>
<el-form-item
label="身份证截止日期"
prop="individual_id_period_end"
v-if="applyFormData.individual_id_images2"
>
<el-radio-group v-model="individual_date_type">
<el-radio :label="1">长期</el-radio>
<el-radio :label="2">非长期</el-radio>
</el-radio-group>
<el-date-picker
v-if="individual_date_type == 2"
v-model="applyFormData.individual_id_period_end"
type="date"
placeholder="请选择截止日期"
/>
</el-form-item>
</div> </div>
</div> </div>
@ -544,7 +647,7 @@
<el-icon class="avatar-uploader-icon"> <el-icon class="avatar-uploader-icon">
<Plus /> <Plus />
</el-icon> </el-icon>
<div class="uploader-tips">上传银行卡<br>免填卡号</div> <div class="uploader-tips">上传银行卡<br />免填卡号</div>
</el-upload> </el-upload>
<el-button <el-button
type="info" type="info"
@ -554,7 +657,9 @@
>点击免填卡号</el-button >点击免填卡号</el-button
> >
</el-form-item> </el-form-item>
<template v-if="applyFormData.entity_type==1 || applyFormData.bank_image"> <template
v-if="applyFormData.entity_type == 1 || applyFormData.bank_image"
>
<el-form-item label="开户名称" prop="account_holder_name"> <el-form-item label="开户名称" prop="account_holder_name">
<el-input v-model="applyFormData.account_holder_name" /> <el-input v-model="applyFormData.account_holder_name" />
</el-form-item> </el-form-item>
@ -574,17 +679,13 @@
style="width: 350px" style="width: 350px"
:options="bankList2" :options="bankList2"
> >
<!-- <el-option <template #prefix>
v-for="bank in bankList2" <el-icon>
:key="bank.id" <Search />
:label="bank.branch_bank_name" </el-icon>
:value="bank.branch_bank_name" </template>
/> -->
</el-select-v2> </el-select-v2>
</el-form-item> </el-form-item>
<!-- <el-form-item label="支行名称" prop="bank_branch_name">
<el-input v-model="applyFormData.bank_branch_name" />
</el-form-item> -->
</template> </template>
</div> </div>
</el-form> </el-form>
@ -605,7 +706,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, onMounted, watch } from "vue"; import { ref, reactive, onMounted, watch } from "vue";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue"; import { Plus, Search } from "@element-plus/icons-vue";
import cityData from "../../stores/cityData"; import cityData from "../../stores/cityData";
import type { CityDataStructure } from "../../stores/cityData"; import type { CityDataStructure } from "../../stores/cityData";
@ -679,7 +780,9 @@ const bankList2 = ref([]);
let orcTimeout = 0; let orcTimeout = 0;
let currentFile = ref(null); let currentFile = ref(null);
let currentBbatchNo = ref(''); let currentBbatchNo = ref("");
let legal_person_date_type = ref(2);
let individual_date_type = ref(2);
const handleChangeBizCategory = (value) => { const handleChangeBizCategory = (value) => {
if (value && value.length === 2) { if (value && value.length === 2) {
@ -703,6 +806,7 @@ const applyFormData = reactive({
biz_license_image: "", biz_license_image: "",
biz_license_number: "", biz_license_number: "",
biz_second_category: null, biz_second_category: null,
biz_license_content: "",
city_id: null, city_id: null,
contact_name: "", contact_name: "",
county_id: null, county_id: null,
@ -712,11 +816,17 @@ const applyFormData = reactive({
individual_id_images: "", individual_id_images: "",
individual_id_images2: "", individual_id_images2: "",
individual_id_number: "", individual_id_number: "",
individual_id_addr: "",
individual_id_period_begin: "",
individual_id_period_end: "",
legal_person_id_images: "", legal_person_id_images: "",
legal_person_id_images2: "", legal_person_id_images2: "",
legal_person_id_number: "", legal_person_id_number: "",
legal_person_mobile: "", legal_person_mobile: "",
legal_person_name: "", legal_person_name: "",
legal_person_id_addr: "",
legal_person_id_period_begin: "",
legal_person_id_period_end: "",
license_image: [], license_image: [],
license_number: "", license_number: "",
license_type: "1", license_type: "1",
@ -733,6 +843,7 @@ const applyFormData = reactive({
store_area: "", store_area: "",
user_status: "", user_status: "",
bank_image: "", bank_image: "",
email: "",
}); });
const optionsPermitType = [ const optionsPermitType = [
{ {
@ -752,6 +863,13 @@ const rules = reactive({
contact_name: [ contact_name: [
{ required: true, message: "请输入联系人姓名", trigger: "blur" }, { required: true, message: "请输入联系人姓名", trigger: "blur" },
], ],
legal_person_id_addr: [
{ required: true, message: "请输入法人身份证详细地址", trigger: "blur" },
],
biz_license_content: [
{ required: true, message: "请输入经营范围内容", trigger: "blur" },
],
email: [{ required: true, message: "请输入邮箱", trigger: "blur" }],
biz_category: [ biz_category: [
{ required: true, message: "请选择经营品类", trigger: "change" }, { required: true, message: "请选择经营品类", trigger: "change" },
], ],
@ -784,13 +902,26 @@ const rules = reactive({
legal_person_mobile: [ legal_person_mobile: [
{ required: true, message: "请输入法人手机号", trigger: "blur" }, { required: true, message: "请输入法人手机号", trigger: "blur" },
], ],
legal_person_id_period_begin: [
{
required: true,
message: "请输入法人身份证开始有效日期",
trigger: "blur",
},
],
legal_person_id_period_end: [
{
required: true,
message: "请输入法人身份证截止有效日期",
trigger: "blur",
},
],
legal_person_id_number: [ legal_person_id_number: [
{ required: true, message: "请输入法人身份证号", trigger: "blur" }, { required: true, message: "请输入法人身份证号", trigger: "blur" },
], ],
biz_license_image: [ biz_license_image: [
{ required: true, message: "请上传营业执照", trigger: "change" }, { required: true, message: "请上传营业执照", trigger: "change" },
], ],
// license_image: [{ required: true, message: '', trigger: 'change' }],
legal_person_id_images: [ legal_person_id_images: [
{ required: true, message: "请上传法人身份证正面", trigger: "change" }, { required: true, message: "请上传法人身份证正面", trigger: "change" },
], ],
@ -806,6 +937,23 @@ const rules = reactive({
individual_id_images2: [ individual_id_images2: [
{ required: true, message: "请上传个人身份证反面", trigger: "change" }, { required: true, message: "请上传个人身份证反面", trigger: "change" },
], ],
individual_id_addr: [
{ required: true, message: "请输入个人身份证详细地址", trigger: "change" },
],
individual_id_period_begin: [
{
required: true,
message: "请选择个人身份证开始有效日期",
trigger: "change",
},
],
individual_id_period_end: [
{
required: true,
message: "请选择个人身份证截止有效日期",
trigger: "change",
},
],
bank_branch_name: [ bank_branch_name: [
{ required: true, message: "请选择银行", trigger: "change" }, { required: true, message: "请选择银行", trigger: "change" },
], ],
@ -818,6 +966,24 @@ const rules = reactive({
], ],
}); });
watch(legal_person_date_type, (newVal) => {
if (newVal == 1) {
applyFormData.legal_person_id_period_end = "9999-12-31";
} else {
applyFormData.legal_person_id_period_end = "";
}
formRef.value.validate("legal_person_id_period_end");
});
watch(individual_date_type, (newVal) => {
if (newVal == 1) {
applyFormData.individual_id_period_end = "9999-12-31";
} else {
applyFormData.individual_id_period_end = "";
}
formRef.value.validate("individual_id_period_end");
});
const handleMerchApply = async () => { const handleMerchApply = async () => {
console.log(2001); console.log(2001);
const { const {
@ -828,7 +994,6 @@ const handleMerchApply = async () => {
clearing_bank_code, clearing_bank_code,
account_number, account_number,
account_holder_name, account_holder_name,
biz_category,
biz_license_company, biz_license_company,
biz_license_image, biz_license_image,
biz_license_number, biz_license_number,
@ -857,6 +1022,14 @@ const handleMerchApply = async () => {
store_longitude, store_longitude,
store_name, store_name,
store_area, store_area,
biz_category,
biz_license_content,
legal_person_id_addr,
legal_person_id_period_begin,
legal_person_id_period_end,
individual_id_addr,
individual_id_period_begin,
individual_id_period_end,
} = applyFormData; } = applyFormData;
const res = await merchApply({ const res = await merchApply({
bank_name, bank_name,
@ -867,6 +1040,7 @@ const handleMerchApply = async () => {
account_number, account_number,
account_holder_name, account_holder_name,
biz_category, biz_category,
biz_license_content,
biz_license_company, biz_license_company,
biz_license_image, biz_license_image,
biz_license_number, biz_license_number,
@ -895,6 +1069,12 @@ const handleMerchApply = async () => {
store_longitude, store_longitude,
store_name, store_name,
store_area, store_area,
legal_person_id_addr,
legal_person_id_period_begin,
legal_person_id_period_end,
individual_id_addr,
individual_id_period_begin,
individual_id_period_end,
}); });
}; };
@ -904,12 +1084,12 @@ const checkForm = async () => {
}); });
if (applyFormData.entity_type == 2 && !applyFormData.bank_image) { if (applyFormData.entity_type == 2 && !applyFormData.bank_image) {
ElMessage.error("请上传银行卡") ElMessage.error("请上传银行卡");
return return;
} }
if (isValid) { if (isValid) {
handleMerchApply() handleMerchApply();
} }
}; };
@ -1127,7 +1307,7 @@ const isUploadHidden = (field: string) => {
if (field === "license_image") { if (field === "license_image") {
return applyFormData[field].length >= limit; return applyFormData[field].length >= limit;
} else { } else {
return applyFormData[field] !== "" && applyFormData[field] != null; return applyFormData[field] != "" || applyFormData[field].length != 0;
} }
}; };
@ -1183,19 +1363,72 @@ const handleOcrText = async (batchNo, imgType) => {
switch (imgType) { switch (imgType) {
case "biz_license_image": case "biz_license_image":
var res = (await getOcrText(batchNo, orcImgTypeConf.BUSINESS_LICENCE)) as any; var res = (await getOcrText(
batchNo,
orcImgTypeConf.BUSINESS_LICENCE
)) as any;
console.log("biz_license_image", res); console.log("biz_license_image", res);
applyFormData.biz_license_company = res.bizLicenseCompanyName; applyFormData.biz_license_company = res.bizLicenseCompanyName;
applyFormData.legal_person_name = res.bizLicenseOwnerName; applyFormData.legal_person_name = res.bizLicenseOwnerName;
applyFormData.biz_license_number = res.bizLicenseCreditCode; applyFormData.biz_license_number = res.bizLicenseCreditCode;
applyFormData.biz_license_content = res.bizLicenseScope;
applyFormData.account_holder_name = res.bizLicenseCompanyName; applyFormData.account_holder_name = res.bizLicenseCompanyName;
break; break;
case "legal_person_id_images": case "legal_person_id_images":
var res = (await getOcrText(batchNo, orcImgTypeConf.ID_CARD_FRONT)) as any; var res = (await getOcrText(
batchNo,
orcImgTypeConf.ID_CARD_FRONT
)) as any;
console.log("legal_person_id_images", res); console.log("legal_person_id_images", res);
applyFormData.legal_person_id_number = res.idNumber; applyFormData.legal_person_id_number = res.idNumber;
applyFormData.legal_person_id_addr = res.address;
break;
case "legal_person_id_images2":
var res = (await getOcrText(
batchNo,
orcImgTypeConf.ID_CARD_BEHIND
)) as any;
var validity = res.validity.split('-')
console.log("legal_person_id_images2", res);
applyFormData.legal_person_id_period_begin = validity[0];
if(validity[1]!='长期'){
applyFormData.legal_person_id_period_end = validity[1];
} else {
legal_person_date_type=1
applyFormData.legal_person_id_period_end = "9999-12-31"
}
break;
case "individual_id_images":
var res = (await getOcrText(
batchNo,
orcImgTypeConf.FR_ID_CARD_FRONT
)) as any;
console.log("individual_id_images", res);
applyFormData.individual_id_number = res.idNumber;
applyFormData.individual_id_addr = res.address;
break;
case "individual_id_images2":
var res = (await getOcrText(
batchNo,
orcImgTypeConf.ID_CARD_BEHIND
)) as any;
var validity = res.validity.split('-')
console.log("individual_id_images2", res);
applyFormData.individual_id_period_begin = validity[0];
if(validity[1]!='长期'){
applyFormData.individual_id_period_end = validity[1];
} else {
legal_person_date_type=1
applyFormData.individual_id_period_end = "9999-12-31"
}
break; break;
case "bank_image": case "bank_image":
var res = (await getOcrText(batchNo, orcImgTypeConf.BANK_CARD)) as any; var res = (await getOcrText(batchNo, orcImgTypeConf.BANK_CARD)) as any;
@ -1205,7 +1438,7 @@ const handleOcrText = async (batchNo, imgType) => {
} }
loading.value = false; loading.value = false;
formRef.value.validate() formRef.value.validate();
}; };
const handleUploadSuccess = async (response, file, fileList, field) => { const handleUploadSuccess = async (response, file, fileList, field) => {
@ -1224,18 +1457,33 @@ const handleUploadSuccess = async (response, file, fileList, field) => {
switch (field) { switch (field) {
case "biz_license_image": case "biz_license_image":
var res = await getBatchNo(file.raw, orcImgTypeConf.BUSINESS_LICENCE); var res = await getBatchNo(file.raw, orcImgTypeConf.BUSINESS_LICENCE);
currentBbatchNo.value = res.batchNo currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field) handleOcrText(res.batchNo, field);
break; break;
case "legal_person_id_images": case "legal_person_id_images":
var res = await getBatchNo(file.raw, orcImgTypeConf.ID_CARD_FRONT); var res = await getBatchNo(file.raw, orcImgTypeConf.ID_CARD_FRONT);
currentBbatchNo.value = res.batchNo currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field) handleOcrText(res.batchNo, field);
break;
case "legal_person_id_images2":
var res = await getBatchNo(file.raw, orcImgTypeConf.ID_CARD_BEHIND);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "individual_id_images":
var res = await getBatchNo(file.raw, orcImgTypeConf.FR_ID_CARD_FRONT);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "individual_id_images2":
var res = await getBatchNo(file.raw, orcImgTypeConf.ID_CARD_BEHIND);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break; break;
case "bank_image": case "bank_image":
var res = await getBatchNo(file.raw, orcImgTypeConf.BANK_CARD); var res = await getBatchNo(file.raw, orcImgTypeConf.BANK_CARD);
currentBbatchNo.value = res.batchNo currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field) handleOcrText(res.batchNo, field);
break; break;
} }
} else { } else {
@ -1247,38 +1495,40 @@ const handleUploadSuccess = async (response, file, fileList, field) => {
loading.value = false; loading.value = false;
} }
formRef.value.validate() formRef.value.validate();
}; };
const handleUploadError = (error, file) => { const handleUploadError = (error, file) => {
loading.value = false; loading.value = false;
ElMessage.error("文件上传失败"); ElMessage.error("文件上传失败");
}; };
const clearOtherFields = () => { const clearOtherFields = () => {
// if (applyFormData.entity_type === 1) { applyFormData.individual_id_number = "";
// // applyFormData.individual_id_images = "";
// applyFormData.individual_id_number = ""; applyFormData.individual_id_images2 = "";
// applyFormData.individual_id_images = ""; applyFormData.individual_id_addr = "";
// applyFormData.individual_id_images2 = ""; applyFormData.individual_id_period_begin = "";
// } else if (applyFormData.entity_type === 2) { applyFormData.individual_id_period_end = "";
// //
// applyFormData.license_type = "1"; applyFormData.license_type = "1";
// applyFormData.license_number = ""; applyFormData.license_number = "";
// applyFormData.biz_license_number = ""; applyFormData.license_image = [];
// applyFormData.biz_license_company = ""; applyFormData.biz_license_image = "";
// applyFormData.legal_person_name = ""; applyFormData.biz_license_number = "";
// applyFormData.legal_person_mobile = ""; applyFormData.biz_license_company = "";
// applyFormData.legal_person_id_number = ""; applyFormData.biz_license_content = "";
// applyFormData.biz_license_image = ""; applyFormData.legal_person_name = "";
// applyFormData.license_image = []; applyFormData.legal_person_mobile = "";
// applyFormData.legal_person_id_images = ""; applyFormData.legal_person_id_number = "";
// applyFormData.legal_person_id_images2 = ""; applyFormData.legal_person_id_images = "";
// } applyFormData.legal_person_id_images2 = "";
applyFormData.legal_person_id_addr = "";
applyFormData.legal_person_id_period_begin = "";
applyFormData.legal_person_id_period_end = "";
}; };
onMounted(() => { onMounted(() => {
bankListRemoteMethod();
GetStoreCategories() GetStoreCategories()
.then((res) => { .then((res) => {
if (res.code === 0 && res.status === 200) { if (res.code === 0 && res.status === 200) {