website/src/views/start/start.vue

1646 lines
49 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="signUp-container">
<!-- 步骤条 -->
<div class="steps-container">
<div class="tit" style="margin-bottom: 0">免费开店资料填写</div>
</div>
<div class="form-submit">
<el-form
:model="applyFormData"
:rules="rules"
ref="formRef"
label-width="160px"
style="max-width: 600px"
v-loading.fullscreen.lock="loading"
element-loading-text="数据加载中..."
element-loading-background="rgba(0,0,0,.75)"
>
<div class="from_box">
<div class="tit">店铺信息</div>
<!-- 第一步表单内容 -->
<el-form-item label="联系人" prop="contact_name">
<el-input
v-model="applyFormData.contact_name"
placeholder="请输入联系人姓名"
/>
</el-form-item>
<el-form-item label="联系电话" prop="login_mobile">
<el-input
v-model="applyFormData.login_mobile"
placeholder="请输入联系人电话"
disabled
/>
</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-cascader
v-model="applyFormData.biz_category"
:options="cascaderOptions"
placeholder="请选择经营品类"
:show-all-levels="false"
@change="handleChangeBizCategory"
clearable
/>
</el-form-item>
<el-form-item label="门店名称" prop="store_name">
<el-input
v-model="applyFormData.store_name"
placeholder="请输入门店名称"
/>
</el-form-item>
<el-form-item label="所在地区" prop="map_address">
<el-cascader
style="marginright: 5px"
v-model="applyFormData.map_address"
:options="cascaderOptions2"
@change="handleChange"
/>
<el-autocomplete
v-if="applyFormData.map_address"
style="width: 180px"
v-model="applyFormData.position"
placeholder="试试搜索,快速填写地址"
:fetch-suggestions="querySearch"
value-key="value"
:options="autocompleteOptions"
@select="handleSelect"
>
<template #default="{ item }">
<div class="auto-item" v-if="item">
<div>
<p>{{ item.name }}</p>
<!-- 显示名称 -->
</div>
<div>
<span>{{ item.address }}</span>
<!-- 显示地址 -->
</div>
</div>
</template>
</el-autocomplete>
</el-form-item>
<el-form-item
label="详细地址"
prop="store_address"
v-if="applyFormData.map_address"
>
<el-input
v-model="applyFormData.store_address"
placeholder="请输入详细地址"
/>
</el-form-item>
<el-form-item
:label="getLabel('front_facade_image', 1)"
prop="front_facade_image"
>
<el-upload
ref="uploadRef"
multiple
:limit="1"
list-type="picture-card"
:auto-upload="true"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'front_facade_image')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'front_facade_image'
)
"
:on-preview="handlePictureCardPreview"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{ 'upload-hidden': isUploadHidden('front_facade_image') }"
>
<el-icon class="avatar-uploader-icon">
<Plus />
</el-icon>
<div class="uploader-tips">上传门店图</div>
</el-upload>
</el-form-item>
<el-form-item
:label="getLabel('environment_image', 1)"
prop="environment_image"
>
<el-upload
ref="uploadRef"
multiple
:limit="1"
list-type="picture-card"
:auto-upload="true"
:on-preview="handlePictureCardPreview"
v-model="applyFormData.environment_image"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'environment_image')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'environment_image'
)
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{ 'upload-hidden': isUploadHidden('environment_image') }"
>
<el-icon>
<Plus />
</el-icon>
<div class="uploader-tips">上传环境图</div>
</el-upload>
</el-form-item>
</div>
<div class="from_box">
<div class="tit">营业信息</div>
<el-form-item label="主体类型" prop="entity_type">
<el-radio-group
v-model="applyFormData.entity_type"
@change="clearOtherFields"
>
<el-radio-button :value="1">企业</el-radio-button>
<el-radio-button :value="2">个人</el-radio-button>
</el-radio-group>
</el-form-item>
<div v-if="applyFormData.entity_type === 1">
<el-form-item
:label="getLabel('biz_license_image', 1)"
prop="biz_license_image"
>
<el-upload
ref="uploadRef"
multiple
:limit="1"
list-type="picture-card"
:auto-upload="true"
v-model="applyFormData.biz_license_image"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'biz_license_image')
"
:on-preview="handlePictureCardPreview"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'biz_license_image'
)
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{
'upload-hidden': isUploadHidden('biz_license_image'),
}"
>
<el-icon>
<Plus />
</el-icon>
<div class="uploader-tips">上传营业执照</div>
</el-upload>
<el-button
type="info"
plain
v-if="
applyFormData.biz_license_image &&
!applyFormData.biz_license_company
"
@click="handleOcrText(currentBbatchNo, 'biz_license_image')"
>点击免填营业执照信息</el-button
>
</el-form-item>
<el-form-item
label="公司名称"
prop="biz_license_company"
v-if="applyFormData.biz_license_image"
>
<el-input
v-model="applyFormData.biz_license_company"
placeholder="请输入公司名称"
/>
</el-form-item>
<el-form-item
label="法人姓名"
prop="legal_person_name"
v-if="applyFormData.biz_license_image"
>
<el-input
v-model="applyFormData.legal_person_name"
placeholder="请输入法人姓名"
/>
</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
label="注册号"
prop="biz_license_number"
v-if="applyFormData.biz_license_image"
>
<el-input
v-model="applyFormData.biz_license_number"
placeholder="请输入注册号"
/>
</el-form-item>
<el-form-item
label="经营范围"
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
label="许可证类型"
prop="license_type"
v-if="applyFormData.biz_license_image"
>
<el-select
v-model="applyFormData.license_type"
value-key=""
placeholder="请选择类型"
clearable
@change=""
>
<el-option
v-for="item in optionsPermitType"
:key="item.value2"
:label="item.label"
:value="item.value2"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item
:label="getLabel('license_image', 5)"
prop="license_image"
v-if="applyFormData.license_type != 1"
>
<el-upload
ref="uploadRef"
multiple
:limit="5"
list-type="picture-card"
:auto-upload="true"
v-model="applyFormData.license_image"
:on-preview="handlePictureCardPreview"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'license_image')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'license_image'
)
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{ 'upload-hidden': isUploadHidden('license_image') }"
>
<el-icon>
<Plus />
</el-icon>
<div class="uploader-tips">上传许可证</div>
</el-upload>
</el-form-item>
<el-form-item
label="许可证编号"
prop="license_number"
v-if="applyFormData.license_type != 1"
>
<el-input
v-model="applyFormData.license_number"
placeholder="请输入许可证编号"
/>
</el-form-item>
<!-- 法人身份证正反面 -->
<el-form-item
:label="getLabel('legal_person_id_images', 1)"
prop="legal_person_id_images"
>
<el-upload
ref="uploadRef"
:limit="1"
list-type="picture-card"
:auto-upload="true"
:on-preview="handlePictureCardPreview"
v-model="applyFormData.legal_person_id_images"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'legal_person_id_images')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'legal_person_id_images'
)
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{
'upload-hidden': isUploadHidden('legal_person_id_images'),
}"
>
<el-icon class="avatar-uploader-icon">
<Plus />
</el-icon>
<div class="uploader-tips">上传证件正面</div>
</el-upload>
<el-button
type="info"
plain
v-if="
applyFormData.legal_person_id_images &&
!applyFormData.legal_person_id_number
"
@click="
handleOcrText(currentBbatchNo, 'legal_person_id_images')
"
>点击免填身份证</el-button
>
</el-form-item>
<el-form-item
:label="getLabel('legal_person_id_images2', 1)"
prop="legal_person_id_images2"
>
<el-upload
ref="uploadRef"
:limit="1"
list-type="picture-card"
:auto-upload="true"
:on-preview="handlePictureCardPreview"
v-model="applyFormData.legal_person_id_images2"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'legal_person_id_images2')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'legal_person_id_images2'
)
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{
'upload-hidden': isUploadHidden('legal_person_id_images2'),
}"
>
<el-icon class="avatar-uploader-icon">
<Plus />
</el-icon>
<div class="uploader-tips">上传证件反面</div>
</el-upload>
</el-form-item>
<el-form-item
label="法人身份证号码"
prop="legal_person_id_number"
v-if="applyFormData.legal_person_id_images"
>
<el-input
v-model="applyFormData.legal_person_id_number"
placeholder="请输入法人身份证号码"
/>
</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 v-if="applyFormData.entity_type === 2">
<!-- 个人身份证正反面 -->
<el-form-item
:label="getLabel('individual_id_images', 1)"
prop="individual_id_images"
>
<el-upload
ref="uploadRef"
:limit="1"
list-type="picture-card"
:auto-upload="true"
:on-preview="handlePictureCardPreview"
v-model="applyFormData.individual_id_images"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'individual_id_images')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'individual_id_images'
)
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{
'upload-hidden': isUploadHidden('individual_id_images'),
}"
>
<el-icon class="avatar-uploader-icon">
<Plus />
</el-icon>
<div class="uploader-tips">上传证件正面</div>
</el-upload>
</el-form-item>
<el-form-item
:label="getLabel('individual_id_images2', 1)"
prop="individual_id_images2"
>
<el-upload
ref="uploadRef"
:limit="1"
list-type="picture-card"
:auto-upload="true"
:on-preview="handlePictureCardPreview"
v-model="applyFormData.individual_id_images2"
:on-remove="
(file, fileList) =>
handleRemove(file, fileList, 'individual_id_images2')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(
response,
file,
fileList,
'individual_id_images2'
)
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{
'upload-hidden': isUploadHidden('individual_id_images2'),
}"
>
<el-icon class="avatar-uploader-icon">
<Plus />
</el-icon>
<div class="uploader-tips">上传证件反面</div>
</el-upload>
</el-form-item>
<el-form-item
label="个人身份证号"
prop="individual_id_number"
v-if="applyFormData.individual_id_images"
>
<el-input
v-model="applyFormData.individual_id_number"
placeholder="请输入个人身份证号"
/>
</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 class="from_box">
<div class="tit">结算信息</div>
<el-form-item label="银行卡" prop="bank_image">
<el-upload
ref="uploadRef"
:limit="1"
list-type="picture-card"
:auto-upload="true"
:on-preview="handlePictureCardPreview"
v-model="applyFormData.bank_image"
:on-remove="
(file, fileList) => handleRemove(file, fileList, 'bank_image')
"
:on-success="
(response, file, fileList) =>
handleUploadSuccess(response, file, fileList, 'bank_image')
"
:on-error="handleUploadError"
:before-upload="beforeUpload"
:action="uploadUrl"
name="upfile"
:class="{
'upload-hidden': isUploadHidden('bank_image'),
}"
>
<el-icon class="avatar-uploader-icon">
<Plus />
</el-icon>
<div class="uploader-tips">上传银行卡<br />免填卡号</div>
</el-upload>
<el-button
type="info"
plain
v-if="applyFormData.bank_image && !applyFormData.account_number"
@click="handleOcrText(currentBbatchNo, 'bank_image')"
>点击免填卡号</el-button
>
</el-form-item>
<template
v-if="applyFormData.entity_type == 1 || applyFormData.bank_image"
>
<el-form-item label="开户名称" prop="account_holder_name">
<el-input v-model="applyFormData.account_holder_name" />
</el-form-item>
<el-form-item label="银行卡号" prop="account_number">
<el-input v-model="applyFormData.account_number" />
</el-form-item>
<el-form-item label="开户银行" prop="bank_branch_name">
<el-select-v2
clearable
filterable
remote
@change="bankListChange"
:remote-method="bankListRemoteMethod"
v-model="applyFormData.bank_branch_name"
placeholder="搜索银行名称"
placement="top-start"
style="width: 350px"
:options="bankList2"
>
<template #prefix>
<el-icon>
<Search />
</el-icon>
</template>
</el-select-v2>
</el-form-item>
</template>
</div>
</el-form>
</div>
<div class="form-button">
<el-button type="primary" @click="merchToApply" class="custom-button"
>提交审核</el-button
>
</div>
<el-dialog v-model="dialogVisible" width="max-content">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { ref, reactive, onMounted, watch } from "vue";
import { ElMessage } from "element-plus";
import { Plus, Search } from "@element-plus/icons-vue";
import cityData from "../../stores/cityData";
import type { CityDataStructure } from "../../stores/cityData";
import { useUserStore } from "@/stores/userStore";
import {
GetStoreCategories,
transformStoreCategories,
GetPostion,
GetBank,
merchApply,
GetAppDistrict,
} from "@/api/login";
import { batchNoApi, imgOcrResultApi } from "@/api/upload";
interface Bank {
id: number;
bank_name: string;
}
const orcImgTypeConf = {
FR_ID_CARD_FRONT: "FR_ID_CARD_FRONT",
FR_ID_CARD_BEHIND: "FR_ID_CARD_BEHIND",
ID_CARD_FRONT: "ID_CARD_FRONT",
ID_CARD_BEHIND: "ID_CARD_BEHIND",
BUSINESS_LICENCE: "BUSINESS_LICENCE",
BANK_CARD: "BANK_CARD",
};
const userStore = useUserStore();
const processData = () => {
const { provinceData, cityData: cityList, areaData } = cityData;
return provinceData.map((province, provinceIndex) => {
const provinceItem = {
...province,
children: cityList[provinceIndex].map((city, cityIndex) => {
const cityItem = {
...city,
};
if (areaData[provinceIndex] && areaData[provinceIndex][cityIndex]) {
cityItem.children = areaData[provinceIndex][cityIndex];
}
return cityItem;
}),
};
return provinceItem;
});
};
const active = ref(1);
const loading = ref(false);
const formRef = ref(null);
const dialogVisible = ref(false);
const dialogImageUrl = ref("");
const bankNameSearchText = ref("");
const selectedValue = ref([]);
const value = ref([]);
const cascaderOptions = ref([]);
const cascaderOptions2 = ref(processData());
const cityData2 = ref<CityDataStructure>();
const cascaderOptions3 = ref();
//hover触发选择
const cascaderProps = ref({
value: "value",
label: "label",
children: "children",
expandTrigger: "hover" as const,
});
const bankList2 = ref([]);
let orcTimeout = 0;
let currentFile = ref(null);
let currentBbatchNo = ref("");
let legal_person_date_type = ref(2);
let individual_date_type = ref(2);
const handleChangeBizCategory = (value) => {
if (value && value.length === 2) {
const [bizCategoryId, bizSecondCategoryId] = value;
applyFormData.biz_category = bizCategoryId;
applyFormData.biz_second_category = bizSecondCategoryId;
}
};
const currentBankItem = reactive(null);
const applyFormData = reactive({
bank_name: "",
bank_district: "",
bank_area: "",
openning_bank_code: "",
clearing_bank_code: "",
bank_branch_name: "",
account_number: "",
account_holder_name: "",
biz_category: null,
biz_license_company: "",
biz_license_image: "",
biz_license_number: "",
biz_second_category: null,
biz_license_content: "",
city_id: null,
contact_name: "",
county_id: null,
entity_type: 1,
environment_image: "",
front_facade_image: "",
individual_id_images: "",
individual_id_images2: "",
individual_id_number: "",
individual_id_addr: "",
individual_id_period_begin: "",
individual_id_period_end: "",
legal_person_id_images: "",
legal_person_id_images2: "",
legal_person_id_number: "",
legal_person_mobile: "",
legal_person_name: "",
legal_person_id_addr: "",
legal_person_id_period_begin: "",
legal_person_id_period_end: "",
license_image: [],
license_number: "",
license_type: "1",
login_mobile: localStorage.getItem("mobilePhone"),
province_id: null,
store_address: "",
map_address: "",
position: "",
store_latitude: null,
store_longitude: null,
store_name: "",
mapAddressLabel: "",
license_imageToString: "",
store_area: "",
user_status: "",
bank_image: "",
email: "",
});
const optionsPermitType = [
{
value2: "1",
label: "无需特殊资质",
},
{
value2: "2",
label: "需许可证资质",
},
{
value2: "3",
label: "需特许证件资质",
},
];
const rules = reactive({
contact_name: [
{ 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: [
{ required: true, message: "请选择经营品类", trigger: "change" },
],
store_name: [{ required: true, message: "请输入门店名称", trigger: "blur" }],
map_address: [
{ required: true, message: "请选择地图地址", trigger: "change" },
],
// position: [{ required: true, message: "请选择地图地址", trigger: "change" }],
store_address: [
{ required: true, message: "请输入详细地址", trigger: "blur" },
],
front_facade_image: [
{ required: true, message: "请上传门脸图", trigger: ["change", "blur"] },
],
environment_image: [
{ required: true, message: "请上传环境图", trigger: ["change", "blur"] },
],
entity_type: [{ required: true, message: "请主体类型", trigger: "change" }],
// license_type: [{ required: true, message: "请选择许可证类型", trigger: "change" }],
// license_number: [{ required: true, message: "请输入许可证编号", trigger: "blur" }],
biz_license_number: [
{ required: true, message: "请输入注册号", trigger: "blur" },
],
biz_license_company: [
{ required: true, message: "请输入公司名称", trigger: "blur" },
],
legal_person_name: [
{ required: true, message: "请输入法人姓名", trigger: "blur" },
],
legal_person_mobile: [
{ 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: [
{ required: true, message: "请输入法人身份证号", trigger: "blur" },
],
biz_license_image: [
{ required: true, message: "请上传营业执照", trigger: "change" },
],
legal_person_id_images: [
{ required: true, message: "请上传法人身份证正面", trigger: "change" },
],
legal_person_id_images2: [
{ required: true, message: "请上传法人身份证反面", trigger: "change" },
],
individual_id_number: [
{ required: true, message: "请输入个人身份证号", trigger: "blur" },
],
individual_id_images: [
{ required: true, message: "请上传个人身份证正面", trigger: "change" },
],
individual_id_images2: [
{ 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: [
{ required: true, message: "请选择银行", trigger: "change" },
],
// bank_branch_name: [{ required: true, message: '请输入支行名称', trigger: 'blur' }],
account_number: [
{ required: true, message: "请输入银行卡号", trigger: "blur" },
],
account_holder_name: [
{ required: true, message: "请输入开户名称", trigger: "blur" },
],
});
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 () => {
console.log(2001);
const {
bank_name,
bank_district,
bank_area,
openning_bank_code,
clearing_bank_code,
account_number,
account_holder_name,
biz_license_company,
biz_license_image,
biz_license_number,
biz_second_category,
city_id,
contact_name,
county_id,
entity_type,
environment_image,
front_facade_image,
individual_id_images,
individual_id_images2,
individual_id_number,
legal_person_id_images,
legal_person_id_images2,
legal_person_id_number,
legal_person_mobile,
legal_person_name,
license_image,
license_number,
license_type,
login_mobile,
province_id,
store_address,
store_latitude,
store_longitude,
store_name,
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;
const res = await merchApply({
bank_name,
bank_district,
bank_area,
openning_bank_code,
clearing_bank_code,
account_number,
account_holder_name,
biz_category,
biz_license_content,
biz_license_company,
biz_license_image,
biz_license_number,
biz_second_category,
city_id,
contact_name,
county_id,
entity_type,
environment_image,
front_facade_image,
individual_id_images,
individual_id_images2,
individual_id_number,
legal_person_id_images,
legal_person_id_images2,
legal_person_id_number,
legal_person_mobile,
legal_person_name,
license_image,
license_number,
license_type,
login_mobile,
province_id,
store_address: store_area.replace(/\//g, "") + store_address,
store_latitude,
store_longitude,
store_name,
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,
});
};
const checkForm = async () => {
const isValid = await (formRef.value as any).validate((valid) => {
return valid;
});
if (applyFormData.entity_type == 2 && !applyFormData.bank_image) {
ElMessage.error("请上传银行卡");
return;
}
if (isValid) {
handleMerchApply();
}
};
const next = () => {
if (active.value < 3) {
active.value++;
window.scrollTo({
top: 0, //回到顶部
left: 0,
behavior: "smooth",
});
}
};
const pre = () => {
if (active.value > 1) {
active.value--;
window.scrollTo({
top: 0, //回到顶部
left: 0,
behavior: "smooth",
});
}
};
const getLabel = (field: string, limit: number) => {
const labels = {
front_facade_image: "门脸图",
environment_image: "环境图",
biz_license_image: "营业执照",
license_image: "许可证",
legal_person_id_images: "法人身份证正面",
legal_person_id_images2: "法人身份证反面",
individual_id_images: "个人身份证正面",
individual_id_images2: "个人身份证反面",
};
if (field === "license_image") {
return `${labels[field]}(${applyFormData[field].length}/${limit})`;
} else {
const count = applyFormData[field] ? 1 : 0;
return `${labels[field]}(${count}/${limit})`;
}
};
const showAll = () => {
applyFormData.license_imageToString = applyFormData.license_image
.map((url) => `${url}`)
.join(",");
};
const merchToApply = async () => {
console.log("formdata", applyFormData);
// showAll();
checkForm();
};
const bankListChange = (val) => {
const item = bankList2.value.find((item) => item.value == val);
if (item) {
applyFormData.bank_name = item.label;
applyFormData.bank_district = item.district;
applyFormData.bank_area = item.area;
applyFormData.openning_bank_code = item.branch_bank_no;
applyFormData.clearing_bank_code = item.clear_no;
}
};
const bankListRemoteMethod = (val) => {
if (!val) {
bankList2.value = [];
return;
}
GetBank({
keyword: val, // 银行名称关键字,小地方支行,查不到,调整关键字范围,尝试市级银行
pageNum: 1,
pageSize: 2000,
}).then((res) => {
if (res.status == 200) {
bankList2.value = res.data.items.map((item) => {
return {
district: item.district,
area: item.area,
branch_bank_no: item.branch_bank_no,
clear_no: item.clear_no,
label: item.branch_bank_name,
value: item.branch_bank_no,
};
});
}
});
};
const handleChange = (value) => {
// 假设 cascader 的值是一个数组,格式为 [省份ID, 城市ID, 区县ID]
console.log(11, value);
if (value && value.length === 3) {
const [provinceId, cityId, countyId] = value;
applyFormData.province_id = provinceId;
applyFormData.city_id = cityId;
applyFormData.county_id = countyId;
}
const names = value.map((id, level) => {
const findName = (options, targetId) => {
for (const item of options) {
if (item.value === targetId) {
return item.label;
}
if (item.children) {
const childName = findName(item.children, targetId);
if (childName) return childName;
}
}
return "";
};
return findName(cascaderOptions2.value, id);
});
const str = names?.join("/");
applyFormData.mapAddressLabel = str;
applyFormData.store_area = str;
formRef.value.validate();
};
const autocompleteOptions = ref([]);
const querySearch = async (queryString, cb) => {
if (!queryString) {
cb([]);
return;
}
try {
const params = {
query: queryString,
region: applyFormData.mapAddressLabel,
city_limit: true,
ret_coordtype: "gcj02ll",
};
const res = await GetPostion(params);
if (res?.result?.length) {
const results = res.result
.filter((item) => "location" in item)
.map((item) => ({
value: item.name, // 确保有 value 属性
label: item.name, // 确保有 label 属性
name: item.name,
address: item.address || "", // 确保 address 属性存在
lat: item.location?.lat || "", // 确保 lat 属性存在
lng: item.location?.lng || "", // 确保 lng 属性存在
}));
cb(results);
} else {
ElMessage.error("搜索失败");
cb([]);
}
} catch (error) {
ElMessage.error("搜索失败");
cb([]);
}
};
const handleSelect = (item) => {
applyFormData.position = "";
applyFormData.store_address = item.value;
applyFormData.store_latitude = item.lat;
applyFormData.store_longitude = item.lng;
formRef.value.validate();
};
const beforeUpload = (file) => {
const isJPG = file.type === "image/jpeg";
const isPNG = file.type === "image/png";
const isLt2M = file.size / 1024 / 1024 < 2;
loading.value = true;
if (!isJPG && !isPNG) {
loading.value = false;
ElMessage.error("上传的图片必须是JPG或PNG格式");
return false;
}
if (!isLt2M) {
loading.value = false;
ElMessage.error("上传的图片大小不能超过2MB");
return false;
}
return true;
};
const uploadUrl = ref("https://mall.gpxscs.cn/mobile/shop/oss/upload");
const handleRemove = (file, fileList, field) => {
if (field === "license_image") {
const removedUrl = file.url;
applyFormData[field] = applyFormData[field].filter(
(url) => url !== removedUrl
);
} else {
applyFormData[field] = "";
}
};
const isUploadHidden = (field: string) => {
const limits = {
license_image: 5,
};
const limit = limits[field] || 1;
if (field === "license_image") {
return applyFormData[field].length >= limit;
} else {
return applyFormData[field] != "" || applyFormData[field].length != 0;
}
};
const handleExceed = (files, fileList) => {
ElMessage.warning(`最多只能上传1张图片`);
};
const handlePictureCardPreview = (uploadFile) => {
dialogImageUrl.value = uploadFile.url!;
dialogVisible.value = true;
};
const getBatchNo = async (file, type) => {
loading.value = true;
const rsp = await batchNoApi(file, type).then((res) => {
return res;
});
loading.value = false;
if (rsp.status == 200) {
return rsp?.data;
} else {
return null;
}
};
const getOcrText = async (batchNo, type) => {
return new Promise(async (resolve, reject) => {
let formData: null | FormData = new FormData();
formData.append("batchNo", batchNo);
formData.append("imgType", type);
clearTimeout(orcTimeout);
orcTimeout = setTimeout(async () => {
const imgOcrRes = await imgOcrResultApi(formData);
formData = null;
clearTimeout(orcTimeout);
if (imgOcrRes.status != 200) {
reject(imgOcrRes?.data);
} else {
resolve(imgOcrRes?.data);
}
loading.value = false;
}, 2000);
});
};
const handleOcrText = async (batchNo, imgType) => {
loading.value = true;
switch (imgType) {
case "biz_license_image":
var res = (await getOcrText(
batchNo,
orcImgTypeConf.BUSINESS_LICENCE
)) as any;
console.log("biz_license_image", res);
applyFormData.biz_license_company = res.bizLicenseCompanyName;
applyFormData.legal_person_name = res.bizLicenseOwnerName;
applyFormData.biz_license_number = res.bizLicenseCreditCode;
applyFormData.biz_license_content = res.bizLicenseScope;
applyFormData.account_holder_name = res.bizLicenseCompanyName;
break;
case "legal_person_id_images":
var res = (await getOcrText(
batchNo,
orcImgTypeConf.ID_CARD_FRONT
)) as any;
console.log("legal_person_id_images", res);
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;
case "bank_image":
var res = (await getOcrText(batchNo, orcImgTypeConf.BANK_CARD)) as any;
console.log("bank_image", res);
applyFormData.account_number = res.card_number;
break;
}
loading.value = false;
formRef.value.validate();
};
const handleUploadSuccess = async (response, file, fileList, field) => {
if (response && response.status === 200 && response.code === 0) {
if (response.data && response.data.url) {
file.url = response.data.url;
if (field === "license_image") {
applyFormData[field].push(file.url);
} else {
applyFormData[field] = file.url;
}
loading.value = false;
currentFile.value = file.raw;
switch (field) {
case "biz_license_image":
var res = await getBatchNo(file.raw, orcImgTypeConf.BUSINESS_LICENCE);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "legal_person_id_images":
var res = await getBatchNo(file.raw, orcImgTypeConf.ID_CARD_FRONT);
currentBbatchNo.value = res.batchNo;
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;
case "bank_image":
var res = await getBatchNo(file.raw, orcImgTypeConf.BANK_CARD);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
}
} else {
ElMessage.error("文件上传成功,但未返回文件 URL");
loading.value = false;
}
} else {
ElMessage.error(response.msg || "文件上传失败");
loading.value = false;
}
formRef.value.validate();
};
const handleUploadError = (error, file) => {
loading.value = false;
ElMessage.error("文件上传失败");
};
const clearOtherFields = () => {
applyFormData.individual_id_number = "";
applyFormData.individual_id_images = "";
applyFormData.individual_id_images2 = "";
applyFormData.individual_id_addr = "";
applyFormData.individual_id_period_begin = "";
applyFormData.individual_id_period_end = "";
applyFormData.license_type = "1";
applyFormData.license_number = "";
applyFormData.license_image = [];
applyFormData.biz_license_image = "";
applyFormData.biz_license_number = "";
applyFormData.biz_license_company = "";
applyFormData.biz_license_content = "";
applyFormData.legal_person_name = "";
applyFormData.legal_person_mobile = "";
applyFormData.legal_person_id_number = "";
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(() => {
GetStoreCategories()
.then((res) => {
if (res.code === 0 && res.status === 200) {
cascaderOptions.value = transformStoreCategories(res.data);
} else {
}
})
.catch((err) => {
ElMessage.error("获取店铺分类失败");
});
GetAppDistrict()
.then((res) => {
if (res.code === 0 && res.status === 200) {
cityData2.value = res.data;
console.log(cascaderOptions3.value);
} else {
ElMessage.error("获取银行失败");
}
})
.catch((err) => {
ElMessage.error("获取银行失败");
});
});
</script>
<style lang="scss" scoped>
:deep(.el-upload--picture-card),
:deep(.el-upload-list__item) {
width: 96px;
height: 96px;
text-align: center;
flex-direction: column;
color: #666;
line-height: 20px;
}
.signUp-container {
display: flex;
padding-top: 12px;
flex-direction: column;
align-items: center;
justify-content: center;
background: #eee;
.tit {
font-size: 16px;
margin-bottom: 15px;
}
.steps-container {
width: 50%;
padding: 15px;
border-radius: 5px;
background: #fff;
margin-bottom: 12px;
}
:deep(.upload-hidden .el-upload--picture-card) {
display: none;
}
.form-submit {
width: 50%;
:deep(.el-form) {
max-width: 100% !important;
}
.from_box {
width: 100%;
padding: 15px;
margin: 0 0 12px;
border-radius: 5px;
background: #fff;
}
}
.form-button {
width: 100%;
text-align: center;
padding: 20px;
background: #fff;
}
}
.auto-item {
p {
font-size: 15px;
font-weight: 900;
}
span {
font-size: 10px;
}
}
@media (max-width: 768px) {
.el-cascader-menu {
width: 120px;
min-width: 120px;
}
.signUp-container {
.steps-container {
width: 100%;
}
.form-submit {
width: 100%;
}
}
}
</style>