911 lines
30 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>
<view class="container">
<!-- 顶部进度条红底胶囊三段 -->
<view class="step-bar">
<view class="step-pill" :class="{ active: currentTab >= 1 }">填写信息</view>
<view class="step-pill" :class="{ active: currentTab >= 4 }">提交审核</view>
<view class="step-pill" :class="{ active: currentTab >= 5 }">入驻成功</view>
</view>
<!-- Tab 切换 -->
<view class="tab-bar">
<view class="tab-item" :class="{ active: currentTab === 1 }" @click="switchTab(1)">基本信息</view>
<view class="tab-item" :class="{ active: currentTab === 2 }" @click="switchTab(2)">资质信息</view>
<view class="tab-item" :class="{ active: currentTab === 3 }" @click="switchTab(3)">结算信息</view>
</view>
<!-- ============ Tab 1: 基本信息 ============ -->
<view v-show="currentTab === 1">
<!-- 文本字段 -->
<view class="form-card">
<view class="field">
<view class="field-label"><text class="star">*</text>门店名称</view>
<view class="field-input">
<input type="text" v-model="store_name" placeholder="需与门牌照名称一致" />
</view>
</view>
<view class="field">
<view class="field-label"><text class="star">*</text>所在地区</view>
<view class="field-input" @click="openRegion">
<view class="field-value" :class="{ placeholder: !regionLabel }">
{{ regionLabel || '请选择省/市/区' }}
</view>
<u-icon name="arrow-right" color="#C8C8C8" size="24"></u-icon>
</view>
</view>
<view class="field">
<view class="field-label"><text class="star">*</text>详细地址</view>
<view class="field-input">
<input type="text" v-model="address" placeholder="请输入详细地址" />
</view>
</view>
<view class="field">
<view class="field-label"><text class="star">*</text>商家类目</view>
<view class="field-input" @click="openClassify">
<view class="field-value" :class="{ placeholder: !confirmClassify.cate_name }">
{{ confirmClassify.cate_name || '选择经营品类' }}
</view>
<u-icon name="arrow-right" color="#C8C8C8" size="24"></u-icon>
</view>
</view>
<view class="field">
<view class="field-label"><text class="star">*</text>营业状态</view>
<view class="field-input" @click="showBizStatus = true">
<view class="field-value" :class="{ placeholder: !bizStatusLabel }">
{{ bizStatusLabel || '选择营业状态' }}
</view>
<u-icon name="arrow-right" color="#C8C8C8" size="24"></u-icon>
</view>
</view>
<view class="field">
<view class="field-label"><text class="star">*</text>联系人</view>
<view class="field-input">
<input type="text" v-model="contact_name" placeholder="请输入联系人姓名" />
</view>
</view>
<view class="field">
<view class="field-label"><text class="star">*</text>手机号</view>
<view class="field-input">
<input type="number" v-model="contact_phone" placeholder="请输入联系方式" maxlength="11" />
</view>
</view>
</view>
<!-- 店内环境 -->
<view class="form-card">
<view class="upload-section">
<view class="upload-title">
<text class="star">*</text>店内环境<text class="count">({{ imgList3.length }}/3张)</text>
</view>
<u-upload :fileList="imgList3" @afterRead="afterReadImg2" @delete="deletePic2" name="2" :maxCount="3" multiple>
<view class="upload-add">
<view class="upload-add-icon">+</view>
<text>{{ imgList3.length }}/3</text>
</view>
</u-upload>
</view>
</view>
<!-- 门头环境 -->
<view class="form-card">
<view class="upload-section">
<view class="upload-title">
<text class="star">*</text>门头环境<text class="count">({{ imgList.length }}/3张)</text>
</view>
<u-upload :fileList="imgList" @afterRead="afterReadImg" @delete="deletePic" name="1" :maxCount="3" multiple>
<view class="upload-add">
<view class="upload-add-icon">+</view>
<text>{{ imgList.length }}/3</text>
</view>
</u-upload>
</view>
</view>
<!-- 红色提示框 -->
<view class="tip-box">
<view class="tip-icon">!</view>
<view class="tip-content">
<view class="tip-title">门店信息要求</view>
<view class="tip-item">· 门店名称需与门店招牌上的名称一致</view>
<view class="tip-item">· 门店品类需与门店主要经营范围的分类一致</view>
<view class="tip-item">· 门店地址需与门店实际经营地址一致</view>
</view>
</view>
</view>
<!-- Tab 2: 资质信息 -->
<view v-show="currentTab === 2">
<view class="Msg">
<view class="row" v-if="enterType === 'enterprise'">
<view class="row_label">统一社会信用代码<text class="red">*</text></view>
<view class="row_con">
<input type="text" v-model="credit_code" placeholder="请输入统一社会信用代码">
</view>
</view>
<view class="row" v-if="enterType === 'enterprise'">
<view class="row_label">法人姓名<text class="red">*</text></view>
<view class="row_con">
<input type="text" v-model="legal_person" placeholder="请输入法人姓名">
</view>
</view>
<view class="row" v-if="enterType === 'enterprise'">
<view class="row_label">法人身份证号<text class="red">*</text></view>
<view class="row_con nonebor">
<input type="text" v-model="legal_id_card" placeholder="请输入法人身份证号">
</view>
</view>
</view>
<view class="Msg mt">
<view class="row2">
<view class="row_label">营业执照<text class="red">*</text></view>
<view class="row_con2">
<u-upload :fileList="imgList5" @afterRead="afterReadImg3" @delete="deletePic3" name="1" :maxCount="1">
<view class="imgCon">
<image src="https://static.hshuishang.com/property-img-file/com_imageImg.png" mode="widthFix"></image>
上传图片
</view>
</u-upload>
<view class="example-link" @click="showExample('license')">查看示例</view>
</view>
</view>
<view class="row2 mt2">
<view class="row_label">{{ enterType === 'enterprise' ? '法人身份证正面' : '身份证正面' }}<text class="red">*</text></view>
<view class="row_con2">
<u-upload :fileList="idCardFrontList" @afterRead="afterReadIdFront" @delete="deleteIdFront" name="1" :maxCount="1">
<view class="imgCon">
<image src="https://static.hshuishang.com/property-img-file/com_imageImg.png" mode="widthFix"></image>
上传图片
</view>
</u-upload>
<view class="example-link" @click="showExample('idcard')">查看示例</view>
</view>
</view>
<view class="row2 mt2">
<view class="row_label">{{ enterType === 'enterprise' ? '法人身份证反面' : '身份证反面' }}<text class="red">*</text></view>
<view class="row_con2">
<u-upload :fileList="idCardBackList" @afterRead="afterReadIdBack" @delete="deleteIdBack" name="1" :maxCount="1">
<view class="imgCon">
<image src="https://static.hshuishang.com/property-img-file/com_imageImg.png" mode="widthFix"></image>
上传图片
</view>
</u-upload>
</view>
</view>
</view>
<view class="btn-group">
<view class="prevBtn" @click="currentTab = 1">上一步</view>
<view class="nextBtn" @click="nextTab(3)">下一步</view>
</view>
</view>
<!-- Tab 3: 结算信息 -->
<view v-show="currentTab === 3">
<view class="Msg">
<template v-if="enterType === 'personal'">
<view class="row">
<view class="row_label">开户人姓名</view>
<view class="row_con">
<input type="text" v-model="account_name" placeholder="请输入开户人姓名">
</view>
</view>
<view class="row">
<view class="row_label">银行卡号</view>
<view class="row_con">
<input type="text" v-model="bank_card" placeholder="请输入银行卡号">
</view>
</view>
<view class="row">
<view class="row_label">开户银行</view>
<view class="row_con">
<input type="text" v-model="bank_name" placeholder="请输入开户银行">
</view>
</view>
<view class="row">
<view class="row_label">开户支行</view>
<view class="row_con nonebor">
<input type="text" v-model="bank_branch" placeholder="请输入开户支行">
</view>
</view>
</template>
<template v-else>
<view class="row">
<view class="row_label">企业开户名称</view>
<view class="row_con">
<input type="text" v-model="account_name" placeholder="请输入企业开户名称">
</view>
</view>
<view class="row">
<view class="row_label">对公银行账号</view>
<view class="row_con">
<input type="text" v-model="bank_card" placeholder="请输入对公银行账号">
</view>
</view>
<view class="row">
<view class="row_label">开户银行</view>
<view class="row_con">
<input type="text" v-model="bank_name" placeholder="请输入开户银行">
</view>
</view>
<view class="row">
<view class="row_label">开户支行</view>
<view class="row_con nonebor">
<input type="text" v-model="bank_branch" placeholder="请输入开户支行">
</view>
</view>
</template>
</view>
<!-- 协议勾选 -->
<view class="agreement">
<view class="agreement-check" @click="agreeProtocol = !agreeProtocol">
<u-icon :name="agreeProtocol ? 'checkmark-circle-fill' : 'checkmark-circle'" :color="agreeProtocol ? '#FF370B' : '#ccc'" size="36"></u-icon>
</view>
<view class="agreement-text">
我已阅读并同意<text class="agreement-link" @click.stop="viewProtocol">商家入驻协议</text>
</view>
</view>
<view class="btn-group">
<view class="prevBtn" @click="currentTab = 2">上一步</view>
<view class="nextBtn" @click="submit">提交入驻</view>
</view>
</view>
<!-- 所在地区弹层多列联动 -->
<view class="popup-mask" v-if="showRegion" @click.self="showRegion = false">
<view class="popup-sheet">
<view class="popup-header">
<text class="pop-cancel" @click="showRegion = false">取消</text>
<text class="pop-title">所在地区</text>
<text class="pop-confirm" @click="confirmRegion">确定</text>
</view>
<view class="popup-body" style="height: 50vh;">
<scroll-view class="popup-col" scroll-y>
<view v-for="item in pro" :key="item.ad_code"
class="popup-col-item" :class="{ selected: tempProv.ad_code === item.ad_code }"
@click="tapProv(item)">
<text>{{ item.ad_name }}</text>
<text class="check" v-if="tempProv.ad_code === item.ad_code"></text>
</view>
</scroll-view>
<scroll-view class="popup-col" scroll-y>
<view v-for="item in city" :key="item.ad_code"
class="popup-col-item" :class="{ selected: tempCity.ad_code === item.ad_code }"
@click="tapCity(item)">
<text>{{ item.short_name }}</text>
<text class="check" v-if="tempCity.ad_code === item.ad_code"></text>
</view>
</scroll-view>
<scroll-view class="popup-col" scroll-y>
<view v-for="item in buss" :key="item.ad_code"
class="popup-col-item" :class="{ selected: tempBuss.ad_code === item.ad_code }"
@click="tapBuss(item)">
<text>{{ item.short_name }}</text>
<text class="check" v-if="tempBuss.ad_code === item.ad_code"></text>
</view>
</scroll-view>
</view>
</view>
</view>
<!-- 类目选择弹层多选示意 + 搜索框 -->
<view class="popup-mask" v-if="showClassifyPop" @click.self="showClassifyPop = false">
<view class="popup-sheet">
<view class="popup-header">
<text class="pop-cancel" @click="showClassifyPop = false">取消</text>
<text class="pop-title">选择类目</text>
<text class="pop-confirm" @click="confirmClassifyPop">确定</text>
</view>
<view class="popup-search">
<u-icon name="search" color="#B7B7B7" size="28"></u-icon>
<text>搜索类目</text>
</view>
<scroll-view class="popup-list" scroll-y style="max-height: 50vh;">
<view v-for="item in classify" :key="item.id"
class="popup-list-item" :class="{ selected: tempClassify.id === item.id }"
@click="tempClassify = item">
{{ item.cate_name }}
</view>
</scroll-view>
</view>
</view>
<!-- 营业状态弹层 -->
<view class="popup-mask" v-if="showBizStatus" @click.self="showBizStatus = false">
<view class="popup-sheet">
<view class="popup-header">
<text class="pop-cancel" @click="showBizStatus = false">取消</text>
<text class="pop-title">营业状态</text>
<text class="pop-confirm" @click="showBizStatus = false">确定</text>
</view>
<view class="popup-list">
<view v-for="opt in bizStatusList" :key="opt.value"
class="popup-list-item" :class="{ selected: bizStatus === opt.value }"
@click="selectBizStatus(opt)">
{{ opt.label }}
</view>
</view>
</view>
</view>
<!-- 底部固定按钮 Tab1 显示其余 tab 沿用各自原按钮暂未改造 -->
<view class="bottom-bar" v-if="currentTab === 1">
<view class="btn-primary" @click="nextTab(2)">下一步</view>
</view>
</view>
</template>
<script>
import {
apiArr
} from '../../../api/v2local';
import { apiArr as MapApi } from '../../../api/area';
import {
isPhone,
picUrl,
request,
upload,
NavgateTo
} from '../../../utils';
import { signPrivateView } from '../../../utils/uploadOSS.js';
export default {
data() {
return {
picUrl,
currentTab: 1,
enterType: 'personal',
area: "",
confirmCity: "",
confirmArea: "",
confirmBusiness: "",
imgList: [],
imgList2: [],
imgList3: [],
imgList4: [],
imgList5: [],
imgList6: [],
// 身份证照片
idCardFrontList: [],
idCardFrontPath: [],
idCardBackList: [],
idCardBackPath: [],
contact_name: "",
contact_phone: "",
bank_card: "",
bank_name: "",
bank_branch: "",
account_name: "",
store_name: "",
address: "",
// 企业入驻额外字段
credit_code: "",
legal_person: "",
legal_id_card: "",
confirmProv: "",
confirmCity: "",
confirmBusiness: "",
confirmClassify: "",
pro: [],
show: false,
city: [],
show2: false,
buss: [],
show3: false,
classify: [],
show4: false,
itemObj: {},
agreeProtocol: false,
// 新版弹层相关
showRegion: false,
showClassifyPop: false,
showBizStatus: false,
tempProv: {},
tempCity: {},
tempBuss: {},
tempClassify: {},
bizStatus: 0, // 1 营业中 2 即将开业 3 休息中
bizStatusList: [
{ value: 1, label: '营业中' },
{ value: 2, label: '即将开业' },
{ value: 3, label: '休息中' },
],
}
},
computed: {
regionLabel() {
const a = this.confirmProv && this.confirmProv.ad_name
const b = this.confirmCity && this.confirmCity.short_name
const c = this.confirmBusiness && this.confirmBusiness.short_name
if (!a) return ''
return [a, b, c].filter(Boolean).join('/')
},
bizStatusLabel() {
const opt = this.bizStatusList.find(o => o.value === this.bizStatus)
return opt ? opt.label : ''
},
},
methods: {
// ===== 新版弹层交互 =====
async openRegion() {
if (!this.pro || !this.pro.length) await this.getPro()
this.tempProv = this.confirmProv && this.confirmProv.ad_code ? this.confirmProv : {}
this.tempCity = this.confirmCity && this.confirmCity.ad_code ? this.confirmCity : {}
this.tempBuss = this.confirmBusiness && this.confirmBusiness.ad_code ? this.confirmBusiness : {}
if (this.tempProv.ad_code) await this.getCity(this.tempProv.ad_code)
if (this.tempCity.ad_code) await this.getBuss(this.tempCity.ad_code)
this.showRegion = true
},
async tapProv(item) {
this.tempProv = item
this.tempCity = {}
this.tempBuss = {}
this.city = []
this.buss = []
await this.getCity(item.ad_code)
},
async tapCity(item) {
this.tempCity = item
this.tempBuss = {}
this.buss = []
await this.getBuss(item.ad_code)
},
tapBuss(item) {
this.tempBuss = item
},
confirmRegion() {
if (!this.tempProv.ad_code) {
uni.showToast({ title: '请选择省', icon: 'none' }); return
}
if (!this.tempCity.ad_code) {
uni.showToast({ title: '请选择市', icon: 'none' }); return
}
if (!this.tempBuss.ad_code) {
uni.showToast({ title: '请选择区', icon: 'none' }); return
}
this.confirmProv = this.tempProv
this.confirmCity = this.tempCity
this.confirmBusiness = this.tempBuss
this.showRegion = false
},
async openClassify() {
if (!this.classify || !this.classify.length) await this.getClassify()
this.tempClassify = this.confirmClassify && this.confirmClassify.id ? this.confirmClassify : {}
this.showClassifyPop = true
},
confirmClassifyPop() {
if (!this.tempClassify.id) {
uni.showToast({ title: '请选择类目', icon: 'none' }); return
}
this.confirmClassify = this.tempClassify
this.showClassifyPop = false
},
selectBizStatus(opt) {
this.bizStatus = opt.value
this.showBizStatus = false
},
switchTab(tab) {
// 点击 Tab 切换时需要校验前面的 Tab
if (tab > this.currentTab) {
if (this.currentTab === 1 && !this.validateTab1()) return;
if (tab === 3 && !this.validateTab2()) return;
}
this.currentTab = tab;
uni.pageScrollTo({ scrollTop: 0, duration: 200 });
},
nextTab(tab) {
if (tab === 2) {
if (!this.validateTab1()) return;
}
if (tab === 3) {
if (!this.validateTab2()) return;
}
this.currentTab = tab;
uni.pageScrollTo({ scrollTop: 0, duration: 200 });
},
validateTab1() {
// 基本信息校验
if (!this.store_name) { uni.showToast({ title: '请输入门店名称', icon: 'none' }); return false; }
if (!this.confirmProv.ad_code) { uni.showToast({ title: '请选择所在省', icon: 'none' }); return false; }
if (!this.confirmCity.ad_code) { uni.showToast({ title: '请选择所在市', icon: 'none' }); return false; }
if (!this.confirmBusiness.ad_code) { uni.showToast({ title: '请选择所在区', icon: 'none' }); return false; }
if (!this.address) { uni.showToast({ title: '请输入详细地址', icon: 'none' }); return false; }
if (!this.contact_name) { uni.showToast({ title: '请输入联系人姓名', icon: 'none' }); return false; }
if (!this.contact_phone) { uni.showToast({ title: '请输入联系人手机号', icon: 'none' }); return false; }
if (!isPhone(this.contact_phone)) { uni.showToast({ title: '联系人手机号格式不正确', icon: 'none' }); return false; }
if (!this.confirmClassify.id) { uni.showToast({ title: '请选择商家分类', icon: 'none' }); return false; }
return true;
},
validateTab2() {
// 资质信息校验
if (this.enterType === 'enterprise') {
if (!this.credit_code) { uni.showToast({ title: '请输入统一社会信用代码', icon: 'none' }); return false; }
if (!/^[0-9A-HJ-NPQRTUWXY]{18}$/.test(this.credit_code.toUpperCase())) {
uni.showToast({ title: '统一社会信用代码格式不正确18位', icon: 'none' });
return false;
}
if (!this.legal_person) { uni.showToast({ title: '请输入法人姓名', icon: 'none' }); return false; }
if (!this.legal_id_card) { uni.showToast({ title: '请输入法人身份证号', icon: 'none' }); return false; }
if (!/(^\d{15}$)|(^\d{17}([0-9X])$)/.test(this.legal_id_card.toUpperCase())) {
uni.showToast({ title: '法人身份证号格式不正确', icon: 'none' });
return false;
}
}
if (!this.imgList6.length) { uni.showToast({ title: '请上传营业执照', icon: 'none' }); return false; }
if (!this.idCardFrontPath.length) { uni.showToast({ title: '请上传身份证正面照片', icon: 'none' }); return false; }
if (!this.idCardBackPath.length) { uni.showToast({ title: '请上传身份证反面照片', icon: 'none' }); return false; }
return true;
},
validateTab3() {
// 结算信息校验(个人 / 企业都需要银行四要素)
if (!this.account_name) {
uni.showToast({
title: this.enterType === 'enterprise' ? '请输入企业开户名称' : '请输入开户人姓名',
icon: 'none'
});
return false;
}
if (!this.bank_card) {
uni.showToast({
title: this.enterType === 'enterprise' ? '请输入对公银行账号' : '请输入银行卡号',
icon: 'none'
});
return false;
}
if (!/^\d{15,20}$/.test(this.bank_card)) {
uni.showToast({ title: '银行账号格式不正确15-20位数字', icon: 'none' });
return false;
}
if (!this.bank_name) { uni.showToast({ title: '请输入开户银行', icon: 'none' }); return false; }
if (!this.bank_branch) { uni.showToast({ title: '请输入开户支行', icon: 'none' }); return false; }
return true;
},
showExample(type) {
// 跳转到资质示例页
NavgateTo('/packages/shopEnter/example/index?type=' + type);
},
// 身份证正面上传(私密 bucket不能直链回显
afterReadIdFront(e) {
const files = Array.isArray(e.file) ? e.file : [e.file]
files.forEach(item => {
upload(item.url, res => {
// 私密文件:上传 UI 用本地预览path 单独保存供提交
this.idCardFrontList.push({ url: item.url })
this.idCardFrontPath.push(res.data.path)
}, 'merchant_private')
})
},
deleteIdFront(e) {
this.idCardFrontList.splice(e.index, 1);
this.idCardFrontPath.splice(e.index, 1);
},
// 身份证反面上传(私密 bucket
afterReadIdBack(e) {
const files = Array.isArray(e.file) ? e.file : [e.file]
files.forEach(item => {
upload(item.url, res => {
this.idCardBackList.push({ url: item.url })
this.idCardBackPath.push(res.data.path)
}, 'merchant_private')
})
},
deleteIdBack(e) {
this.idCardBackList.splice(e.index, 1);
this.idCardBackPath.splice(e.index, 1);
},
// 根据ad_code解析省市区信息
parseAdCode(adCode) {
if (!adCode) return;
// 提取省级ad_code前2位
const provinceCode = adCode.toString().substring(0, 2) + '0000';
// 提取市级ad_code前4位
const cityCode = adCode.toString().substring(0, 4) + '00';
// 区县级ad_code完整6位
const districtCode = adCode.toString();
// 查找省份信息
const province = this.pro.find(item => item.ad_code == provinceCode);
if (province) {
this.confirmProv = province;
// 获取对应城市列表并查找城市信息
this.getCity(provinceCode).then(() => {
const city = this.city.find(item => item.ad_code == cityCode);
if (city) {
this.confirmCity = city;
// 获取对应区县列表并查找区县信息
this.getBuss(cityCode).then(() => {
const district = this.buss.find(item => item.ad_code == districtCode);
if (district) {
this.confirmBusiness = district;
}
});
}
});
}
},
cancelBuss() {
this.show3 = false;
},
clickBuss(e) {
this.show3 = false;
this.confirmBusiness = e.value[0]
},
cancelCity() {
this.show2 = false;
},
clickCity(e) {
this.show2 = false;
this.getBuss(e.value[0].ad_code)
this.confirmCity = e.value[0]
},
cancelPro() {
this.show = false;
},
clickPro(e) {
this.show = false;
this.getCity(e.value[0].ad_code)
this.confirmProv = e.value[0]
},
cancelClassify() {
this.show4 = false;
},
clickClassify(e) {
this.show4 = false;
this.confirmClassify = e.value[0]
},
chooseCity() {
this.show = true;
},
chooseCity2() {
this.show2 = true;
},
chooseCity3() {
this.show3 = true;
},
chooseClassify() {
this.show4 = true;
},
afterReadImg(e) {
e.file.forEach(item => {
upload(item.url, res => {
this.imgList.push({ url: this.picUrl + res.data.path })
this.imgList2.push(res.data.path)
})
})
},
deletePic(e) {
this.imgList.splice(e.index, 1);
this.imgList2.splice(e.index, 1);
},
afterReadImg2(e) {
e.file.forEach(item => {
upload(item.url, res => {
this.imgList3.push({ url: this.picUrl + res.data.path })
this.imgList4.push(res.data.path)
})
})
},
afterReadImg3(e) {
// 营业执照(私密 bucket
const files = Array.isArray(e.file) ? e.file : [e.file]
files.forEach(item => {
upload(item.url, res => {
this.imgList5.push({ url: item.url })
this.imgList6.push(res.data.path)
}, 'merchant_private')
})
},
deletePic2(e) {
this.imgList3.splice(e.index, 1);
this.imgList4.splice(e.index, 1);
},
deletePic3(e) {
this.imgList5.splice(e.index, 1);
this.imgList6.splice(e.index, 1);
},
viewProtocol() {
// 查看商家入驻协议
uni.showModal({
title: '商家入驻协议',
content: '本协议是您与平台之间关于商家入驻服务的法律协议。入驻后您需遵守平台规则,按时提供商品或服务,保证信息真实有效。平台有权对违规商家进行处罚。',
showCancel: false,
confirmText: '我知道了'
});
},
// 给私密 bucket 中的多张图批量签名 URL写到目标 fileList
async signPrivatePaths(paths, listKey) {
if (!paths || !paths.length) {
this[listKey] = []
return
}
const result = []
for (const p of paths) {
try {
const r = await signPrivateView(p)
result.push({ url: r.url })
} catch (e) {
console.error('签发私密 URL 失败:', p, e)
result.push({ url: '' })
}
}
this[listKey] = result
},
submit() {
let that = this
if (!that.validateTab3()) return;
if (!that.agreeProtocol) {
uni.showToast({ title: '请先阅读并同意商家入驻协议', icon: 'none' });
return;
}
let interior_photo = that.imgList4.join(",")
let facade_photo = that.imgList2.join(",")
let license_photo = that.imgList6.join(",")
let id_card_front = that.idCardFrontPath.join(",")
let id_card_back = that.idCardBackPath.join(",")
let params = {
enter_type: that.enterType === 'enterprise' ? 2 : 1,
contact_name: that.contact_name,
phone: that.contact_phone,
bank_card: that.bank_card,
bank_name: that.bank_name,
bank_branch: that.bank_branch,
account_name: that.account_name,
merchant_name: that.store_name,
address: that.address,
ad_code: that.confirmBusiness.ad_code,
facade_photo,
interior_photo,
license_photo,
id_card_front,
id_card_back,
merchant_cate_id: that.confirmClassify.id,
}
if (that.enterType === 'enterprise') {
params.credit_code = that.credit_code;
params.legal_person = that.legal_person;
params.legal_id_card = that.legal_id_card;
params.account_type = 2;
} else {
params.account_type = 1;
}
request(apiArr.createStore, "POST", params).then(res => {
// 提交成功后用最新表单 + 服务端返回拼一个 itemObj 给 auditStatus 页用
const newItem = {
...params,
id: res && res.id,
status: 1,
create_time: new Date().toLocaleString('sv-SE').replace('T', ' '),
handle_time: '',
merchant_code: '',
remark: ''
}
NavgateTo("../auditStatus/index?itemObj=" + encodeURIComponent(JSON.stringify(newItem)))
}).catch(res => {
const msg = res && res.message ? res.message : '提交失败,请稍后重试'
if (msg.includes("agent_nil")) {
uni.showModal({
title: '提交失败',
content: '未找到对应的代理商信息,请联系平台',
showCancel: false
})
return
}
// 其余后端校验错误统一弹窗,避免被吞
uni.showModal({
title: '提交失败',
content: msg,
showCancel: false
})
})
},
// 省市区
getPro() {
return request(MapApi.getArea, "POST", {}, {}, false).then(res => {
this.pro = res.rows
})
},
getCity(e) {
return request(MapApi.getArea, "POST", {
parent_ad_code: e
}, {}, false).then(res => {
this.city = res.rows
})
},
getBuss(e) {
return request(MapApi.getArea, "POST", {
parent_ad_code: e
}, {}, false).then(res => {
this.buss = res.rows
})
},
getClassify() {
const params = {
is_shop: 1,
}
return request(apiArr.getMerChantCateList, "POST", params, {}, false).then(res => {
this.classify = res.rows
})
},
},
onLoad(options) {
// 获取入驻类型
if (options.enterType) {
this.enterType = options.enterType;
}
// 先执行数据获取方法
Promise.all([this.getPro(), this.getClassify()]).then(() => {
// 数据获取完成后再进行赋值操作(编辑回显)
if (options.itemObj) {
this.itemObj = JSON.parse(options.itemObj)
this.store_name = this.itemObj.merchant_name
this.address = this.itemObj.address
this.contact_name = this.itemObj.contact_name
this.contact_phone = this.itemObj.phone
this.confirmClassify = this.classify.find(item => item.id == this.itemObj.merchant_cate_id)
this.bank_card = this.itemObj.bank_card
this.bank_name = this.itemObj.bank_name || ''
this.bank_branch = this.itemObj.bank_branch || ''
this.account_name = this.itemObj.account_name || ''
this.credit_code = this.itemObj.credit_code || ''
this.legal_person = this.itemObj.legal_person || ''
this.legal_id_card = this.itemObj.legal_id_card || ''
// 入驻类型回显
if (this.itemObj.enter_type === 2) {
this.enterType = 'enterprise';
}
// 解析ad_code回显省市区
if (this.itemObj.ad_code) {
this.parseAdCode(this.itemObj.ad_code);
}
this.imgList = this.itemObj.facade_photo ? this.itemObj.facade_photo.split(",").map(item => ({ url: this.picUrl + item })) : []
this.imgList2 = this.itemObj.facade_photo ? this.itemObj.facade_photo.split(",") : []
this.imgList3 = this.itemObj.interior_photo ? this.itemObj.interior_photo.split(",").map(item => ({ url: this.picUrl + item })) : []
this.imgList4 = this.itemObj.interior_photo ? this.itemObj.interior_photo.split(",") : []
// 营业执照、身份证 —— 私密 bucket需要签名 URL 才能回显
this.imgList6 = this.itemObj.license_photo?.split(",").filter(Boolean) || []
this.idCardFrontPath = this.itemObj.id_card_front ? this.itemObj.id_card_front.split(",").filter(Boolean) : []
this.idCardBackPath = this.itemObj.id_card_back ? this.itemObj.id_card_back.split(",").filter(Boolean) : []
this.signPrivatePaths(this.imgList6, 'imgList5')
this.signPrivatePaths(this.idCardFrontPath, 'idCardFrontList')
this.signPrivatePaths(this.idCardBackPath, 'idCardBackList')
}
})
}
}
</script>
<style>
@import url("./index.css");
</style>