Files

505 lines
12 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.

<!--
@name: index
@author: kahu4
@date: 2024-01-17 11:12
@description申请分销商
@update: 2024-01-17 11:12
-->
<script setup>
import Header from '@/components/Header/index.vue'
import AddressSelect from '@/components/AddressSelect/index.vue'
import { useScroll } from "@/hooks/useScroll";
import { onLoad, onPageScroll, onShow } from "@dcloudio/uni-app";
import { useMainStore } from "@/store/store";
import { storeToRefs } from "pinia";
import { nextTick, ref } from "vue";
import { distributionAudit, distributionError } from "@/utils/images";
import { useJump } from "@/hooks/useJump";
import { useInterface } from "@/hooks/useInterface";
import { applyDistribution, checkIsDistribution, updateApply } from "@/api/distribution";
import { useRouter } from "@/hooks/useRouter";
import { getDictByType } from "@/api/global";
import { distributionAgreementUrl } from "@/api/auth";
const {scrollTop} = useScroll()
onPageScroll(() => {
})
const {goDistribution} = useJump()
const {getParams} = useRouter()
const mainStore = useMainStore();
const {user, areaList} = storeToRefs(mainStore);
const {goWebview, goHome} = useJump();
const {push} = useRouter();
const {toast} = useInterface()
// ======================== 表单 ===================================
const showPrivacy = ref(true)
/**
* 设置隐私协议模块是否可见
* 解决键盘弹起fixed内容上顶问题
* @param flag
*/
function setShowPrivacy(flag) {
nextTick(() => {
showPrivacy.value = flag
})
}
const userCheckData = ref({
status: null,
refuse: '',
realName: '',
levelName: '',
superiorName: '',
addUpWages: 0,
refuseAmount: 0,
amount: 0
})
const subLoading = ref(false)
const form = ref({
realName: '',
address: '',
reason: '',
superiorIdP1: undefined
})
function verify() {
// 校验表单
if (agreementFlag.value.length <= 0) {
toast({title: '请先阅读并勾选协议'})
return false
}
if (!form.value.realName) {
toast({title: '请输入真实姓名'})
return false
}
if (!form.value.address) {
toast({title: '请选择真实地址'})
return false
}
return true
}
async function handleSubmit() {
if (subLoading.value) return
if (!verify()) return
try {
subLoading.value = true
if (!isUpdate.value) {
await applyDistribution(form.value)
} else {
await updateApply(form.value)
isUpdate.value = false
}
await doCheckIsDistribution()
} finally {
subLoading.value = false
}
}
/**
* 检查当前用户是否是分销商
* @returns {Promise<void>}
*/
async function doCheckIsDistribution() {
userCheckData.value = await checkIsDistribution();
if (userCheckData.value.status === 1 && !isUpdate.value) {
goDistribution({}, true)
}
return userCheckData.value
}
/**
* 再次申请
*/
function applyForAgain() {
form.value = {
...form.value,
...{
realName: '',
address: '',
reason: ''
}
}
userCheckData.value = {
status: null,
refuse: '',
realName: '',
levelName: '',
superiorName: '',
addUpWages: 0,
refuseAmount: 0,
amount: 0
}
}
// ======================== 地址相关 ================================
const addressPickerRef = ref()
const defaultSelect = ref([0, 0, 0])
function handleChooseAddress() {
addressPickerRef.value.open(isUpdate.value ? form.value.address : '')
}
function handleConfirmAddress(values) {
form.value.address = values.reduce((pre, now, index) => {
if (index === 0) {
pre = now.name
} else {
pre = pre + '-' + now.name
}
return pre
}, '');
}
const agreementFlag = ref([]) // length > 0就是勾选了
/**
* 阅读分销协议
*/
async function readAgreement() {
push({url: '/pages/webview/index'}, {data: {src: distributionAgreementUrl}})
}
const showFlag = ref(false)
onShow(async () => {
showFlag.value = false
if (isUpdate.value) {
const data = await doCheckIsDistribution()
form.value.realName = data.realName
form.value.address = data.address
// form.value.address =
form.value.reason = data.reason
} else {
await doCheckIsDistribution()
}
showFlag.value = true
})
const isUpdate = ref(false)
onLoad(async (options) => {
const params = getParams(options);
// 是否是更新
isUpdate.value = (params && params.update) || false
// 有上级ID处理上级ID
form.value.superiorIdP1 = (params && params.id) || undefined;
})
</script>
<template>
<view
class="apply-for"
v-if="user">
<Header
:scroll-top="scrollTop"
system-bar-area-bg="#fff"
header-area-bg="#fff">申请分销商
</Header>
<view class="inner">
<view class="bg"></view>
<!-- userinfo -->
<view class="userinfo flex flex-column flex-ai__center flex-jc__center">
<image :src="user.avatar" />
<text class="username">{{ userCheckData.realName || user.nickname }}</text>
</view>
<!-- card -->
<view
class="apply-card"
v-if="showFlag">
<!-- form -->
<view
v-if="userCheckData.status === null || isUpdate"
class="form">
<view class="row">
<text class="label">
真实姓名
</text>
<div class="right">
<input
:adjust-position="false"
v-model="form.realName"
type="text"
placeholder="请输入真实姓名"
@focus="setShowPrivacy(false)"
@blur="setShowPrivacy(true)" />
</div>
</view>
<view class="row">
<text class="label">
现居城市
</text>
<div
class="right flex flex-jc__sb flex-ai__center"
@click="handleChooseAddress">
<text
class="placeholder"
v-if="!form.address">
请选择省
</text>
<text
class="placeholder"
v-else>
{{ form.address }}
</text>
<u-icon name="arrow-right" />
</div>
</view>
<view class="row">
<text class="label">
申请原因
</text>
<div class="right">
<input
:adjust-position="false"
@focus="setShowPrivacy(false)"
@blur="setShowPrivacy(true)"
v-model="form.reason"
type="text"
placeholder="请输入申请原因" />
</div>
</view>
<view
class="submit"
:class="{'hide-box':!showPrivacy}">
<view class="tips">提交成功后我们将会在1-3个工作日内给您回复</view>
<view
class="button animation-button"
@click="handleSubmit">提交审核
</view>
<view class="agreement tips flex flex-ai__center">
<u-checkbox-group
activeColor="#ed6d47"
shape="circle"
v-model="agreementFlag"
>
<u-checkbox
name=""
/>
</u-checkbox-group>
勾选代表同意
<text
class="primary-color"
@click="readAgreement">分销协议
</text>
</view>
</view>
</view>
<!-- state success -->
<view
class="state"
v-if="userCheckData.status === 0 && !isUpdate">
<image :src="distributionAudit" />
<view class="title">申请提交成功请耐心等待...</view>
<view
class="btn"
@click="goHome">继续逛逛
</view>
</view>
<!-- state error -->
<view
class="state"
v-if="userCheckData.status === 2 && !isUpdate">
<image :src="distributionError" />
<view class="title">不好意思商家拒绝了您的申请...</view>
<view class="sub-title">拒绝理由{{ userCheckData.refuse }}</view>
<view class="flex flex-jc__center flex-ai__center">
<view
class="btn line-btn"
@click="applyForAgain">
再次申请
</view>
<view
class="btn"
@click="goHome">
继续逛逛
</view>
</view>
</view>
<!-- state 清退 -->
<view
class="state"
v-if="userCheckData.status === -1 && !isUpdate">
<image :src="distributionError" />
<view class="title">您已被清退请重新申请</view>
<view class="sub-title">{{ userCheckData.refuse }}</view>
<view class="flex flex-jc__center flex-ai__center">
<view
class="btn line-btn"
@click="applyForAgain">
再次申请
</view>
<view
class="btn"
@click="goHome">
继续逛逛
</view>
</view>
</view>
</view>
</view>
<AddressSelect
ref="addressPickerRef"
v-model:default-value="defaultSelect"
@confirm="handleConfirmAddress" />
</view>
</template>
<style
scoped
lang="scss">
.apply-for {
width: 100%;
position: relative;
.header {
position: relative;
}
.inner {
position: relative;
.bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
aspect-ratio: 750/460;
background: #333333;
z-index: 0;
}
.userinfo {
position: relative;
z-index: 1;
width: 100%;
@include usePadding(0, 72);
image {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
border: 4rpx solid #fff;
}
.username {
color: #fff;
font-size: 34rpx;
margin-top: 30rpx;
font-weight: bold;
}
}
.apply-card {
position: relative;
z-index: 1;
background: #f6f6f6;
border-radius: 30rpx;
@include usePadding(34, 34);
.form {
width: 100%;
background: #fff;
@include usePadding(32, 0);
border-radius: 30rpx;
.row {
@include useFlex(flex-start, center);
.label {
font-size: 28rpx;
margin-right: 24rpx;
}
.right {
@include usePadding(0, 32);
border-bottom: 1rpx solid #f6f6f6;
flex-grow: 1;
.placeholder {
color: #808080;
}
}
}
.submit {
width: 80%;
position: fixed;
bottom: 50rpx;
@include useFlex(center, center, column);
.tips {
color: $tips-color;
font-size: 24rpx;
}
.button {
width: 100%;
margin-top: 30rpx;
height: 80rpx;
@include useFlex(center, center);
border-radius: 15rpx;
}
.agreement {
margin-top: 30rpx;
}
}
}
.state {
width: 100%;
@include useFlex(center, center, column);
@include usePadding(0, 50);
image {
width: 170rpx;
height: 170rpx;
}
.title {
font-size: 28rpx;
margin-bottom: 12rpx;
}
.sub-title {
font-size: 24rpx;
margin-bottom: 32rpx;
color: $tips-color
}
.btn {
width: 230rpx;
height: 80rpx;
background: #333333;
color: #fff;
@include useFlex(center, center, column);
border-radius: 15rpx;
margin: 30rpx 15rpx;
}
.line-btn {
background: #fff;
border: 1rpx solid #333333;
color: #333;
box-sizing: border-box;
}
}
}
}
}
.hide-box {
bottom: -500rpx !important;
}
</style>