merchapp/java-mall-app-shop-admin/pages/audit/shop3.vue
2025-12-01 09:11:34 +08:00

691 lines
17 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="shop-3-container">
<!-- <u-navbar
:autoBack="true"
:safeAreaInsetTop="true"
:placeholder="true"
title="资金结算信息"
>
<template slot="right">
<view class="btn-login-out" @click="loginOut">退出登录</view>
</template>
</u-navbar> -->
<navBar
title="资金结算信息"
:statusBar="true"
:border="false"
:fixed="true"
:height="'44px'"
>
<block slot="left">
<u-icon
name="arrow-left"
color="#303133"
size="20"
@click="pageBack()"
></u-icon>
</block>
<block slot="right">
<view class="btn-login-out" @click="loginOut">退出登录</view>
</block>
</navBar>
<view class="from1">
<u-form :model="form" ref="uForm" label-width="90">
<u-form-item label="" class="bankcard_item">
<u-upload
class="bankcard_upload"
@afterRead="afterRead($event, 'bankCard')"
@delete="deletePic($event, 'bankCard')"
accept="image"
:fileList="bankCardFiles"
:max-count="1"
uploadIconColor="#fe4119"
width="268"
height="125"
uploadText="点击上传银行卡正面"
:maxSize="maxSize"
@oversize="overSize"
></u-upload>
<view
v-if="bankCardFiles.length && !form.account_number"
class="retry_ocr"
@click="onBankOcrretryClick"
>
点击自动识别免填卡号
</view>
</u-form-item>
<template
v-if="(bankCardFiles.length && bankCardOcrLoaded)"
>
<u-form-item label="开户名称" required prop="account_holder_name">
<u-input
v-model="form.account_holder_name"
placeholder="请输入开户名称"
/>
</u-form-item>
<u-form-item label="银行卡号" required prop="account_number">
<u-input
type="number"
v-model="form.account_number"
placeholder="请输入银行卡号"
/>
</u-form-item>
<u-form-item
label="开户银行"
prop="branch_name"
@click="onBranchDialogOpen"
required
>
<u-input
style="pointerevents: 'none'"
class="form-input"
v-model="form.branch_name"
placeholder="请选择开户银行"
@change="onBranchBankChange"
/>
<u-icon
style="display: inline-block; margin-left: 8rpx"
name="arrow-down"
size="12"
color="aaaaaa"
></u-icon>
</u-form-item>
<view class="tips" @click="showTips = true">
搜不到我的开户银行,怎么处理
<u-icon
class="icon-tips"
name="question-circle-fill"
color="#fe4119"
size="18"
></u-icon>
</view>
</template>
</u-form>
</view>
<u-popup
:show="showBankDialog"
closeable
@open="onBranchDialogOpen"
@close="onBranchDialogClose"
>
<u-input
class="search_box"
prefixIcon="search"
v-model="branchSearchText"
placeholder="搜索开户银行关键词"
@change="onBranchBankChange"
/>
<view class="branch_list">
<template v-if="bankList.length">
<view
class="branch_list_item"
v-for="(item, index) of bankList"
:key="index"
@click="onBankSelect(item, $event)"
>
{{ item.branch_bank_name }}
</view>
</template>
<view v-else class="nodata">
<template v-if="firstBranchBankLoad">
<view class="tit">暂无法搜索到该银行支行</view>
</template>
<template v-else>
<view class="tit">数据加载中...</view>
</template>
</view>
</view>
</u-popup>
<view class="btn-content">
<view class="myui_check_text" v-if="bankCardFiles.length">
检查并确认结算证件信息无误
</view>
<u-button
text="提交审核"
color="#fe4119"
:disabled="!form.account_number"
@click="handleSubmit"
></u-button>
<u-button
text="上一步"
class="myui_btn_prev"
@click="handlePrev"
></u-button>
</view>
<u-loading-page
:loading="loading"
bgColor="rgba(0,0,0,0.5)"
fontSize="32rpx"
color="#fff"
loadingText="数据正在加载中..."
></u-loading-page>
<u-toast ref="uToast" />
<u-popup
:show="showTips"
:round="10"
:closeable="true"
:closeIconPos="'top-right'"
mode="bottom"
@close="closeTips"
@open="openTips"
>
<view class="popup-tips">
<view class="popip-tips-title">提示</view>
<view class="popip-tips-item">
如开户地为县级市或乡镇区无法搜索到,可选择相同银行的市级支行网点
</view>
<view class="popip-tips-item popip-tips-item-2">
例如中国工商银行后加所在地的县级市/乡镇名称 中国工商银行桂平市
</view>
</view>
</u-popup>
</view>
</template>
<script>
import {
GetMerchApply,
GetRestartMerchApply,
branchBankSearchApi,
} from "@/api/audit";
import { batchNoApi, imgOcrResultApi } from "../../api/upload";
import { mapState } from "vuex";
import { throttle, debounce } from "lodash";
import navBar from "@/components/uni-nav-bar/uni-nav-bar";
import { H5compressImg, getBase64Size } from "@/utils/tool.js";
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",
};
export default {
components: {
navBar,
},
data() {
return {
form: {
branch_name: "",
account_number: "",
account_holder_name: "",
},
bankCardFiles: [],
loading: false,
branchSearchText: "",
entity_type: "",
bankCardOcrLoaded: false,
firstBranchBankLoad: false,
showBankDialog: false,
branchBankDebounceFn: null,
currentBank: {},
currentBankFile: {},
bankList: [],
rules: {
branch_name: [
{
required: true,
message: "请选择银行支行",
// 可以单个或者同时写两个触发验证方式
trigger: ["change", "blur"],
},
],
account_number: [
{
required: true,
message: "请输入银行卡号",
// 可以单个或者同时写两个触发验证方式
trigger: ["change", "blur"],
},
],
account_holder_name: [
{
required: true,
message: "请输入开户名称",
// 可以单个或者同时写两个触发验证方式
trigger: ["change", "blur"],
},
],
},
limitType: ["png", "jpg", "jpeg"], //允许的图片后缀
fileMaxSize: 1 * 1024 * 1024, // 超出1M开启压缩
maxSize: 10 * 1024 * 1024, //图片最大不能超过20M
fileMinSize: 5 * 1024, // 最小为5KB
showTips: false,
};
},
computed: {
...mapState("user", ["approvalStatus"]),
},
onReady() {
this.$refs["uForm"].setRules(this.rules);
},
onShow() {},
beforeUnmount() {
this.branchBankDebounceFn?.cancel();
},
mounted() {
let auditItem = uni.getStorageSync("auditItem");
this.form.account_holder_name =
auditItem.biz_license_company || auditItem.contact_name;
this.entity_type = auditItem.entity_type || 1;
this.branchBankDebounceFn = debounce(this.getBranchBankList, 500);
},
methods: {
pageBack() {
uni.navigateBack();
},
overSize(e) {
uni.$u.toast("上传图片大小不能超过10MB!");
},
compressImage(url) {
return new Promise((reslove, reject) => {
const tempFilePath = url; //url是选中图片的路径
uni.compressImage({
src: tempFilePath,
quality: 75, //压缩的程度
success: (res) => {
reslove(res.tempFilePath); //压缩成功返回的路径
},
fail: (error) => {
console.log("压缩失败", error);
},
});
});
},
getOcrText(filePath, file, type) {
return new Promise(async (resolve, reject) => {
this.loading = true;
//#ifdef APP-PLUS
filePath = await this.compressImage(filePath);
//#endif
// 压缩图片已base64 方式上传
//#ifdef H5
filePath = await H5compressImg(filePath, 0.75);
let size = getBase64Size(filePath);
console.log("压缩后的大小为:", size);
//#endif
const batchNoRes = await batchNoApi(filePath, file, type);
const batchNo = batchNoRes.batchNo;
if (!batchNoRes) {
this.loading = false;
this.bankCardOcrLoaded = true;
reject(batchNoRes);
}
// 兼容多端的表单数据处理方式
let formDataStr;
//#ifdef H5
const formData = new FormData();
formData.append("batchNo", batchNo);
formData.append("imgType", type);
formDataStr = new URLSearchParams(formData).toString();
//#endif
//#ifdef APP-PLUS
formDataStr = `batchNo=${encodeURIComponent(
batchNo
)}&imgType=${encodeURIComponent(type)}`;
//#endif
clearTimeout(this.orcTimeout);
this.orcTimeout = setTimeout(async () => {
const imgOcrRes = await imgOcrResultApi(formDataStr);
if (imgOcrRes?.status == 200) {
this.showBankDialog = true;
resolve(imgOcrRes?.data);
} else {
uni.showToast({
title: "银行号图片上传错误,请重新上传",
icon: "error",
duration: 2000,
});
this.form = {
branch_name: "",
account_number: "",
account_holder_name: "",
};
this.bankCardFiles = [];
reject(imgOcrRes);
}
clearTimeout(this.orcTimeout);
this.loading = false;
this.bankCardOcrLoaded = true;
}, 2000);
});
},
async setFromItemWithOcr() {
var ocr = await this.getOcrText(
this.currentBankFile.path,
this.currentBankFile.file,
orcImgTypeConf.BANK_CARD
);
this.form.account_number = ocr.card_number;
this.branchSearchText = ocr.issuer;
console.log("bankCard", ocr);
},
async afterRead(event) {
var item = event.file;
const imgUrl = item.url;
const group = {
url: imgUrl,
};
this.currentBankFile = {
file: item,
path: imgUrl,
};
this.bankCardFiles.push(group);
this.setFromItemWithOcr();
},
async onBankOcrretryClick() {
this.setFromItemWithOcr();
},
deletePic(e) {
this.bankCardFiles.splice(0, 1);
this.form.account_number = "";
this.form.branch_name = "";
this.branchSearchText = "";
this.currentBank = {};
this.bankCardOcrLoaded = false;
},
async getBranchBankList(keyword) {
let res = await branchBankSearchApi({
keyword,
pageNum: 1,
pageSize: 1000 * 10,
});
this.bankList = res.data.items;
this.firstBranchBankLoad = true;
},
handlePrev() {
uni.navigateBack();
},
async handleSubmit() {
if (this.entity_type == 2 && !this.bankCardFiles.length) {
this.$refs.uToast.show({
message: "请上传银行卡正面",
type: "error",
duration: 1000,
});
return;
}
this.$refs.uForm.validate().then(async (valid) => {
if (valid) {
let auditItem = uni.getStorageSync("auditItem");
if (auditItem.login_mobile) {
auditItem.login_mobile = auditItem.login_mobile.replace(
/^\+86/,
""
);
console.log(auditItem);
}
let params = {
...this.form,
...auditItem,
...this.currentBank,
email: `${auditItem?.login_mobile}@qq.com`,
};
console.log("params", params);
if (this.approvalStatus == 2) {
params.id = uni.getStorageSync("auditId");
let res = await GetRestartMerchApply(params);
if (res && res.status == 200) {
uni.removeStorageSync("locationItem");
uni.removeStorageSync("auditItem");
uni.removeStorageSync("typeItem");
uni.removeStorageSync("auditId");
uni.navigateTo({ url: "/pages/audit/checkAudit" });
}
} else {
let res = await GetMerchApply(params);
if (res && res.status == 200) {
uni.removeStorageSync("locationItem");
uni.removeStorageSync("auditItem");
uni.removeStorageSync("typeItem");
uni.removeStorageSync("auditId");
uni.navigateTo({ url: "/pages/audit/checkAudit" });
}
}
}
});
},
onBankSelect(data) {
const { district, area, branch_bank_name, branch_bank_no, clear_no } =
data;
this.currentBank = {
bank_district: district,
bank_area: area,
bank_name: branch_bank_name,
openning_bank_code: branch_bank_no,
clearing_bank_code: clear_no,
};
this.form.branch_name = branch_bank_name;
this.showBankDialog = false;
},
onBranchDialogOpen() {
this.branchBankDebounceFn(this.branchSearchText || "广西桂平银行");
this.showBankDialog = true;
},
onBranchDialogClose() {
this.showBankDialog = false;
},
async onBranchBankChange() {
this.branchBankDebounceFn(this.branchSearchText);
},
closeTips() {
this.showTips = false;
},
openTips() {
this.showTips = true;
},
loginOut() {
this.$store.dispatch("user/LoginOut");
},
},
};
</script>
<style lang="scss" scoped>
@import "@/styles/variables.scss";
::v-deep .u-form-item__body {
padding: 0 0 20rpx;
}
::v-deep .u-upload__wrap__preview,
::v-deep .u-upload__button {
margin: 0;
}
.shop-3-container {
::v-deep .tui-dropdownlist-show {
box-shadow: 1rpx 1rpx 20rpx rgba(100, 100, 100, 0.1);
border: 1rpx solid rgba(100, 100, 100, 0.1);
overflow: visible;
.icon_close {
position: absolute;
bottom: -80rpx;
left: 50%;
transform: translateX(-50%);
}
}
::v-deep .u-popup__content__close {
top: -90rpx;
right: auto;
left: 50%;
transform: translateX(-50%);
.u-icon__icon {
color: #fff !important;
border: 5rpx solid #fff;
padding: 10rpx;
font-size: 28rpx !important;
line-height: 28rpx !important;
border-radius: 100%;
}
}
.search_box {
margin: 24rpx;
background: rgba(238, 238, 238, 0.5);
border-radius: 100rpx;
::v-deep .input-placeholder {
color: #666 !important;
}
}
.branch_list {
margin: 0 24rpx;
height: 500rpx;
overflow: auto;
background: #fff;
.branch_list_item {
font-size: 28rpx;
line-height: 28rpx;
padding: 20rpx;
border-bottom: 1rpx solid #eee;
}
.nodata {
height: 500rpx;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
font-size: 28rpx;
.tit {
color: #666;
padding-bottom: 80rpx;
}
.tips {
padding: 10rpx 20rpx;
color: #fff;
border-radius: 100rpx;
background: $base-color;
}
}
}
.u-navbar {
height: 88rpx;
}
.from1 {
padding: 24rpx 24rpx 0rpx 36rpx;
}
.btn-content {
padding: 30rpx 48rpx 88rpx;
}
.btn-submit {
border-radius: 16rpx;
background: $base-color;
color: #fff;
}
.btn-login-out {
font-size: 24rpx;
color: $base-color;
}
.bankcard_upload {
margin: auto;
align-items: center;
}
::v-deep .u-form-item__body__right {
position: relative;
}
.retry_ocr {
padding: 15rpx 24rpx;
border-radius: 100rpx;
color: #fff;
background: rgba(75, 113, 255, 0.95);
position: absolute;
top: 50%;
left: 50%;
transform: translate3d(-50%, -50%, 0);
font-size: 24rpx;
line-height: 24rpx;
}
.tips {
display: flex;
justify-content: center;
margin: 40rpx;
font-size: 28rpx;
color: #909399;
.icon-tips {
margin-left: 14rpx;
}
}
.popup-tips {
padding: 40rpx;
height: 400rpx;
.popip-tips-title {
margin: 0 20rpx 20rpx;
font-size: 40rpx;
font-weight: bold;
text-align: center;
color: #000;
}
.popip-tips-item {
margin-bottom: 40rpx;
}
.popip-tips-item-2 {
color: #909399;
font-size: 28rpx;
}
}
}
</style>