website/src/views/start/start.vue
2025-06-27 14:22:54 +08:00

1856 lines
54 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="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>
<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>
<div v-if="applyFormData.entity_type === 1">
<el-form-item
:label="getLabel('biz_license_image', 1)"
prop="biz_license_image"
>
<el-upload
:ref="
(el) => {
el && (uploadRefs.biz_license_image = el);
}
"
v-model:file-list="uploadFiles.biz_license_image"
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 &&
currentBbatchNo
"
@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="
(el) => {
el && (uploadRefs.legal_person_id_images = el);
}
"
v-model:file-list="uploadFiles.legal_person_id_images"
: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 &&
currentBbatchNo
"
@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="
(el) => {
el && (uploadRefs.legal_person_id_images2 = el);
}
"
v-model:file-list="uploadFiles.legal_person_id_images2"
: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="
(el) => {
el && (uploadRefs.individual_id_images = el);
}
"
v-model:file-list="uploadFiles.individual_id_images"
: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="
(el) => {
el && (uploadRefs.individual_id_images2 = el);
}
"
v-model:file-list="uploadFiles.individual_id_images2"
: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_name"
v-if="applyFormData.individual_id_images"
>
<el-input
v-model="applyFormData.individual_id_name"
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_number"
placeholder="请输入个人身份证号"
/>
</el-form-item>
<el-form-item
label="身份证详细地址"
prop="individual_id_addr"
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="
(el) => {
el && (uploadRefs.bank_image = el);
}
"
v-model:file-list="uploadFiles.bank_image"
: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 &&
currentBbatchNo
"
@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"
placeholder="请输入开户名称"
/>
</el-form-item>
<el-form-item label="银行卡号" prop="account_number">
<el-input
v-model="applyFormData.account_number"
placeholder="请输入银行卡号"
/>
</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>
<div class="bank_name_tip">
<el-tooltip placement="top" effect="light">
<template #content>
<div class="bank_name_cont">
<p>
如开户地为县级市或乡镇区无法搜索到,可选择相同银行的市级支行网点
</p>
</div>
</template>
<el-button type="info" link>
<el-icon
color="#e6a23c"
size="14"
style="margin-right: 5px"
>
<WarningFilled /> </el-icon
>搜不到我的开户银行,怎么处理?</el-button
>
</el-tooltip>
</div>
</el-form-item>
</template>
</div>
</el-form>
</div>
<div class="form-button">
<div class="myui_check_text">检查并确认店铺信息和证件信息无误</div>
<el-button type="primary" @click="merchToApply">提交审核</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 { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus";
import { Plus, Search, WarningFilled } 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";
import { compressImage } from "@/utils/file";
import { isNumber } from "lodash";
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 router = useRouter();
const route = useRoute();
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 isLoggedIn = ref(!!userStore.token);
const active = ref(1);
const loading = ref(false);
const formRef = ref(null);
const dialogVisible = ref(false);
const dialogImageUrl = ref("");
const cascaderOptions = ref([]);
const cascaderOptions2 = ref(processData());
const cityData2 = ref<CityDataStructure>();
const cascaderOptions3 = ref();
const bankList2 = ref([]);
const uploadRefs = ref({
biz_license_image: null,
individual_id_images: null,
individual_id_images2: null,
legal_person_id_images: null,
legal_person_id_images2: null,
bank_image: null,
});
const uploadFiles = reactive({
biz_license_image: [],
individual_id_images: [],
individual_id_images2: [],
legal_person_id_images: [],
legal_person_id_images2: [],
bank_image: [],
});
let orcTimeout = 0;
let currentFile = ref(null);
let pid = ref<string|number>("");
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 applyFormData = reactive({
bank_name: "",
bank_district: "",
bank_area: "",
openning_bank_code: "",
clearing_bank_code: "",
bank_branch_name: "",
account_number: "",
account_holder_name: "",
biz_license_period_end: "9999-12-31",
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_name: "",
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: "",
biz_license_period_begin: "",
});
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_name: [
{ required: true, message: "请输入个人身份证姓名", trigger: "blur" },
],
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 as any).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 as any).validate("individual_id_period_end");
});
const handleMerchApply = async () => {
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,
individual_id_name,
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;
let ext = {};
if (isNumber(pid.value)) {
ext = {
id: pid.value,
};
}
const res = await merchApply({
...ext,
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,
individual_id_name,
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,
email: `${login_mobile}@qq.com`,
});
if (res.code == 0 && res.status == 200) {
ElMessage.success("已提交开店申请~");
setTimeout(() => {
router.push({ name: "check" });
}, 1000);
}
};
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: any = bankList2.value.find((item: any) => 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 as any).validate();
};
const autocompleteOptions = ref([]);
const querySearch = async (queryString, cb) => {
if (!queryString) {
cb([]);
return;
}
try {
const params = {
query: queryString,
region:
applyFormData.mapAddressLabel.indexOf("/") &&
applyFormData.mapAddressLabel?.split("/")[1],
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 as any).validate();
};
const beforeUpload = async (file) => {
const isJPG = file.type === "image/jpeg";
const isPNG = file.type === "image/png";
const isLarge = file.size / 1024 / 1024 < 10;
loading.value = true;
if (!isJPG && !isPNG) {
loading.value = false;
ElMessage.error("上传的图片必须是JPG或PNG格式");
return false;
}
if (!isLarge) {
loading.value = false;
ElMessage.error("上传的图片大小不能超过10MB");
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, field) => {
loading.value = true;
currentBbatchNo.value = "";
file = await compressImage(file);
const rsp = await batchNoApi(file, type)
.then((res) => {
loading.value = false;
return res;
})
.catch(() => {
loading.value = false;
const _uploadRef = uploadRefs.value[field];
if (_uploadRef) {
_uploadRef.clearFiles();
uploadFiles[field] = [];
cleanFile(field);
}
ElMessage.error("网络异常,请重试!");
});
if (rsp?.code == 0 && 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).finally(() => {
loading.value = false;
});
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;
applyFormData.biz_license_period_begin = res.bizLicenseStartTime
.replace(/年|月|日/g, "-")
.replace(/-$/g, "")
.replace(/-+/g, "-");
break;
case "legal_person_id_images":
var res = (await getOcrText(
batchNo,
orcImgTypeConf.FR_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.FR_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.value = 1;
applyFormData.legal_person_id_period_end = "9999-12-31";
}
break;
case "individual_id_images":
var res = (await getOcrText(
batchNo,
orcImgTypeConf.ID_CARD_FRONT
)) as any;
console.log("individual_id_images", res);
applyFormData.individual_id_name = res.name;
applyFormData.account_holder_name = res.name;
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.value = 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 as any).validate();
};
const cleanFile = (field) => {
if (field === "license_image") {
applyFormData[field] = [];
} else {
applyFormData[field] = "";
}
currentFile.value = null;
};
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;
}
currentFile.value = file.raw;
loading.value = false;
switch (field) {
case "biz_license_image":
var res = await getBatchNo(
file.raw,
orcImgTypeConf.BUSINESS_LICENCE,
field
);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "legal_person_id_images":
var res = await getBatchNo(
file.raw,
orcImgTypeConf.FR_ID_CARD_FRONT,
field
);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "legal_person_id_images2":
var res = await getBatchNo(
file.raw,
orcImgTypeConf.FR_ID_CARD_BEHIND,
field
);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "individual_id_images":
var res = await getBatchNo(
file.raw,
orcImgTypeConf.ID_CARD_FRONT,
field
);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "individual_id_images2":
var res = await getBatchNo(
file.raw,
orcImgTypeConf.ID_CARD_BEHIND,
field
);
currentBbatchNo.value = res.batchNo;
handleOcrText(res.batchNo, field);
break;
case "bank_image":
var res = await getBatchNo(file.raw, orcImgTypeConf.BANK_CARD, field);
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 as any).validate();
};
const handleUploadError = (error, file) => {
loading.value = false;
ElMessage.error("文件上传失败");
};
const clearOtherFields = () => {
applyFormData.individual_id_number = "";
applyFormData.individual_id_name = "";
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(() => {
if (!isLoggedIn.value) {
router.push({ name: "index" });
return;
}
const id = route.query?.id;
if (isNumber(id)) {
pid.value = id;
}
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%;
min-height: 300px;
: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;
}
}
.bank_name_tip {
display: flex;
align-items: center;
margin-left: 10px;
}
.bank_name_cont {
width: 360px;
h3 {
margin-bottom: 12px;
}
p {
font-size: 14px;
margin-bottom: 12px;
}
}
.myui_check_text {
color: #999;
padding-bottom: 10px;
text-align: center;
font-size: 14px;
}
.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%;
}
}
.bank_name_tip {
margin-left: 0px;
}
}
</style>