jiuyiUniapp/jiuyi2/pages/shop/settle.vue

616 lines
15 KiB
Vue

<script setup>
/**
* 商家入驻
* 进入页面获取最新的数据 如果发生变化 同步用户信息
* 1 待申请 显示入驻须知 是否缴纳押金
* 2 已申请/待审核 已缴纳押金并且提交表单
* 3 审核驳回 可选择取消押金 或 修改表单内容继续提交审核
* 4 审核成功 已成为商家 可选择取消商家身份 拿回押金 修改店铺信息重新提交审核
*/
import {
ref,
reactive,
computed,
getCurrentInstance,
} from 'vue';
import {
onLoad,
onReady,
} from '@dcloudio/uni-app';
// vuex
import {
useStore
} from 'vuex'
//
import api from '@/api/index.js';
// 工具库
import util from '@/common/js/util.js'
// 选择省市区
import regionSelection from '@/components/public/regionSelection/regionSelection.vue';
// 二级密码验证
import payPwd from '@/components/mine/payPwd.vue'
//
const store = useStore()
const {
proxy
} = getCurrentInstance();
// 表单
const form = reactive({
rectangleLogo: '',
qualificationPicture: [],
idCardFront: '',
idCardBack: '',
})
// 当前模式 code 0待缴纳1待申请2待审核3已通过4已拒绝 form表单
const mode = reactive({
code: 0,
})
// 文本内容
const content = ref({})
// 字典列表
const dictList = reactive([])
// 选择下标分类
const dictIndex = ref('')
// 二级密码回调
const pwdCb = ref('')
// 用户信息
const userinfo = computed(() => store.state.userinfo)
// 系统配置
const config = computed(() => store.state.config)
onLoad(() => {
// 获取商家入驻状态
getShopStatus()
})
onReady(() => {
// 测试缴纳接口
// callPwd('depositsPay')
})
// 获取表单信息
function getForm() {
Promise.all([getDetail(), getDict()]).then(rs => {
// 获取详情
const detail = rs[0]
// 获取字典分类
const dict = rs[1]
if (!detail) return
form.id = detail.id
form.rectangleLogo = detail.rectangleLogo
form.qualificationPicture = detail.qualificationPicture.split(',')
form.idCardFront = detail.idCardFront
form.idCardBack = detail.idCardBack
form.name = detail.name
form.phone = detail.phone
form.addressDetail = detail.addressDetail
form.categoryId = detail.categoryId
form.province = detail.province
form.city = detail.city
form.district = detail.district
// 赋值
dictIndex.value = dict.findIndex(item => item.id == detail.categoryId)
})
}
// 获取申请信息
function getDetail() {
return new Promise((resolve, reject) => {
api.shop.getStoreDetail().then(rs => {
if (rs.code == 200) {
resolve(rs.data)
return
}
util.alert({
showCancel: false,
content: rs.msg,
})
})
})
}
// 切换模式code
function handleModeCode(code) {
// 模式
mode.code = code
switch (code) {
case 0:
// 获取文章
getarticle()
break;
case 1:
// 获取文章
getarticle()
break;
case 'form':
// 获取表单信息
getForm()
break;
}
}
// 获取字典分类
function getDict() {
return new Promise((resolve, reject) => {
api.shop.categoryAll({}).then(rs => {
if (rs.code == 200) {
resolve(rs.data)
dictList.length = 0
dictList.push(...rs.data)
resolve()
return
}
util.alert({
showCancel: false,
content: rs.msg,
})
})
})
}
// 获取商家入驻状态
function getShopStatus() {
api.shop.getShopStatus().then(rs => {
if (rs.code == 200) {
Object.assign(mode, rs.data)
handleModeCode(mode.code)
return
}
util.alert({
showCancel: false,
content: rs.msg,
})
})
}
// 商家缴纳押金
function depositsPay() {
api.shop.depositsPay().then(rs => {
if (rs.code == 200) {
// 修改状态 变为已缴纳
mode.code = 1
return
}
util.alert({
showCancel: false,
content: rs.msg,
})
})
}
// 获取文章
function getarticle() {
api.getArticle({
query: {
agreementId: 4,
},
}).then(rs => {
if (rs.code == 200) {
content.value = rs.data
return
}
util.alert({
showCancel: false,
content: rs.msg,
})
})
}
/**
* 上传图片
* @param {String} key 键值
* @param {String} type 类型 1单 2多
*/
function uploadImg(key, type) {
util.upload_image({
value: form[key],
success: rs => {
switch (type) {
case 1:
form[key] = rs.value
break
case 2:
form[key].push(rs.value)
break
}
},
})
}
/**
* 移除文件
* @param {Number} index 下标
* @param {String} key 键
*/
function removeMedia(index, key) {
util.alert({
content: '确认删除?',
}).then(rs => {
if (rs.confirm) form[key].splice(index, 1)
})
}
/**
* 选择省市区
* @param {Object} ev
*/
function handleRegion(ev) {
console.log('handleRegion', ev)
form.province = ev.province.regionName
form.city = ev.city.regionName
form.district = ev.area.regionName
}
/**
* 切换产品分类
* @param {Object} ev 默认事件
*/
function handleDict(ev) {
if (!ev || typeof ev.detail.value === 'undefined') {
console.error('Invalid event object or missing value');
return
}
const index = ev.detail.value;
if (index === dictIndex.value) return;
if (index >= 0 && index < dictList.length) {
dictIndex.value = index;
form.categoryId = dictList[index].id;
} else {
console.error('Invalid index:', index);
}
}
// 商家入驻
function handleSubmit() {
const data = {
...form
}
console.log('data', data)
// 验证必填项
if (!data.rectangleLogo) {
util.alert('商家头像不能为空')
return
}
if (!data.name) {
util.alert('商家名称不能为空')
return
}
if (!data.phone) {
util.alert('联系方式不能为空')
return
}
if (!data.province) {
util.alert('产品所在地不能为空')
return
}
if (!data.categoryId) {
util.alert('产品类别不能为空')
return
}
if (!data.qualificationPicture[0]) {
util.alert('营业执照不能为空')
return
}
if (!data.idCardFront) {
util.alert('身份证正面不能为空')
return
}
if (!data.idCardBack) {
util.alert('身份证反面不能为空')
return
}
// 营业执照
data.qualificationPicture = data.qualificationPicture.join(',')
api.shop.application({
data: data,
}).then(rs => {
if (rs.code === 200) {
util.alert({
content: '资料已申请,请等待后台审核',
showCancel: false,
}).then(rs => {
uni.navigateBack()
})
} else {
util.alert({
content: rs.msg,
showCancel: false,
})
}
})
}
// 退出缴纳押金
function outDepositsPayAlt() {
util.alert({
content: '确认缴纳押金并放弃商家身份?',
}).then(rs => {
if (!rs.confirm) return
// 调用二级密码
callPwd('outDepositsPay')
})
}
// 商家退出押金
function outDepositsPay() {
// 商家退出押金
api.shop.outDepositsPay().then(rs => {
if (rs.code == 200) {
// 修改状态 变为待缴纳
handleModeCode(0)
return
}
util.alert({
showCancel: false,
content: rs.msg,
})
})
}
/**
* 调用二级密码
* @param {Object} key 后续方法key
*/
function callPwd(key) {
util.isAuth({
success: () => {
pwdCb.value = {
// 缴纳押金
'depositsPay': depositsPay,
// 取消押金并退出商家身份
'outDepositsPay': outDepositsPay,
} [key]
console.log('pwdCb', pwdCb.value)
// 拉起弹窗
proxy.$refs.payPwdRef.open()
}
})
}
// 二级密码验证
function handlePayPwd() {
// 执行二级密码确认回调
pwdCb.value()
}
</script>
<template>
<!-- 须知 -->
<template v-if="[0,1].includes(mode.code)">
<view class="app">
<view class="notice oh mtb30 mlr30 plr30 ptb20 bfff br20">
<view class="title tac f34 c333 b">商家入驻须知</view>
<view class="content mtb50">
<rich-text :nodes="content.content"></rich-text>
</view>
</view>
<view class="tac c666 f28">继续即代表同意《商家入驻须知》</view>
<view class="fill" style="height: 160rpx;" />
<view class="footer plr30 bfff shadow">
<!-- 未缴纳押金 -->
<template v-if="mode.code == 0">
<view class="btn black" @click="callPwd('depositsPay')">缴纳押金</view>
</template>
<template v-else>
<view class="rows">
<view class="btn cancel plr30" @click="outDepositsPayAlt">退回押金</view>
<view class="btn colourful f1" @click="handleModeCode('form')">申请入驻</view>
</view>
</template>
</view>
</view>
</template>
<!-- 待审核 -->
<template v-else-if="mode.code == 2">
<view class="app">
<view class="result ver">
<uni-icons type="checkbox-filled" color="#20D200" size="160rpx" />
<view class="title mtb30 f34">申请中</view>
<view class="value f30">
<text class="c333">提交成功,请等待后台审核</text>
</view>
</view>
<view class="fill" style="height: 160rpx;"></view>
<view class="footer rows plr30 bfff shadow">
<view class="btn cancel f1" @click="outDepositsPayAlt">取消申请并退回押金</view>
</view>
</view>
</template>
<!-- 审核驳回 -->
<template v-else-if="mode.code == 4">
<view class="app">
<view class="result ver">
<uni-icons type="clear" color="#ff0000" size="160rpx" />
<view class="title mtb30 f34">审核驳回</view>
<view class="value f30">
<text class="c666">驳回原因:</text>
<text class="c333">{{mode.msg}}</text>
</view>
<view class="reject mtb30 c666 f28">
<view>驳回结果异议? 可在个人中心-设置里面联系我们</view>
</view>
</view>
<view class="fill" style="height: 160rpx;"></view>
<view class="footer rows plr30 bfff shadow">
<view class="btn cancel plr30" @click="outDepositsPayAlt">退回押金</view>
<view class="btn colourful f1" @click="handleModeCode('form')">修改信息</view>
</view>
</view>
</template>
<!-- 申请成功 -->
<template v-else-if="mode.code == 3">
<view class="app">
<view class="result ver">
<uni-icons type="checkbox-filled" color="#20D200" size="160rpx" />
<view class="title mtb30 f34">恭喜您,您已成为商家</view>
</view>
<view class="fill" style="height: 160rpx;"></view>
<view class="footer plr30 bfff shadow">
<view class="btn cancel plr30" @click="outDepositsPayAlt">退回押金并放弃商家身份</view>
</view>
</view>
</template>
<!-- 表单申请 -->
<template v-else-if="mode.code == 'form'">
<view class="appbw plr30">
<!-- 头像 -->
<view class="avatarBox ver mt50">
<view class="avatar oh pr wh220 br20" @click="uploadImg('rectangleLogo',1)">
<image class="img br20" :src="form.rectangleLogo" mode="aspectFill" v-if="form.rectangleLogo" />
<view class="pfull fmid" v-else>
<uni-icons type="plusempty" color="#999" size="80rpx" />
</view>
</view>
<view class="name mt20 c666 f24">店铺头像</view>
</view>
<!-- 表单 -->
<view class="form mt60 c333 f32">
<view class="title f36">我的资料</view>
<view class="item rows ptb20">
<view class="key c666">店铺名称</view>
<view class="value f1 ml20 tar">
<input v-model="form.name" type="text" placeholder="请输入店铺名称" />
</view>
</view>
<view class="item rows ptb20">
<view class="key c666">联系方式</view>
<view class="value f1 ml20 tar">
<input v-model="form.phone" type="number" placeholder="请输入联系方式" />
</view>
</view>
<view class="item rows ptb20" @click="$refs.regionSelectionRef.open()">
<view class="key c666">产品所在地</view>
<view class="value f1 ml20 tar">
<!-- 省市区选择 -->
<regionSelection ref="regionSelectionRef" :province="form.province" :city="form.city"
:area="form.district" @change="handleRegion" />
</view>
</view>
<view class="item rows ptb20">
<view class="key c666">详细所在地</view>
<view class="value f1 ml20 tar">
<input v-model="form.addressDetail" type="text" placeholder="请选择产品所在地" />
</view>
</view>
<view class="item ptb20">
<picker :range="dictList" range-key="name" :vlaue="dictIndex" @change="handleDict">
<view class="rows">
<view class="key c666">产品类别</view>
<view class="value f1 ml20 tar">
<text class="placeholderStyle" v-if="dictIndex === ''">请选择产品类别</text>
<text v-else>{{dictList[dictIndex].name}}</text>
</view>
</view>
</picker>
</view>
<view class="item ptb20">
<view class="key c666">营业执照</view>
<view class="value imgList f1 mt20 tar">
<view class="imgs wh200" v-for="(item, index) in form.qualificationPicture" :key="index">
<image class="img br10" :src="item" mode="aspectFill" />
<view class="close" @click="removeMedia(index,'qualificationPicture')">
<uni-icons type="clear" size="50rpx" color="#f00" />
</view>
</view>
<view class="upload imgs fmid wh200 br10" @click="uploadImg('qualificationPicture',2)">
<uni-icons type="plusempty" color="#E8E8E8" size="80rpx" />
</view>
</view>
</view>
<view class="item ptb20">
<view class="key c666">身份证正面</view>
<view class="value imgList f1 mt20 tar">
<view class="imgs wh200" v-if="form.idCardFront" @click="uploadImg('idCardFront',1)">
<image class="img br10" :src="form.idCardFront" mode="aspectFill" />
</view>
<view class="upload imgs fmid wh200 br10" v-else @click="uploadImg('idCardFront',1)">
<uni-icons type="plusempty" color="#E8E8E8" size="80rpx" />
</view>
</view>
</view>
<view class="item ptb20">
<view class="key c666">身份证反面</view>
<view class="value imgList f1 mt20 tar">
<view class="imgs wh200" v-if="form.idCardBack" @click="uploadImg('idCardBack',1)">
<image class="img br10" :src="form.idCardBack" mode="aspectFill" />
</view>
<view class="upload imgs fmid wh200 br10" v-else @click="uploadImg('idCardBack',1)">
<uni-icons type="plusempty" color="#E8E8E8" size="80rpx" />
</view>
</view>
</view>
</view>
<view class="fill" style="height: 150rpx;"></view>
</view>
<view class="footer plr30 bfff shadow">
<view class="rows">
<view class="btn cancel plr30" @click="outDepositsPayAlt">退回押金</view>
<view class="btn colourful f1" @click="handleSubmit">申请入驻</view>
</view>
</view>
</template>
<!-- 二级密码 -->
<payPwd ref="payPwdRef" :check="true" :price="config.DEPOSIT_ALLOCATION" @confirm="handlePayPwd" />
</template>
<style lang="scss">
.img {
width: 100%;
height: 100%;
}
// 头像
.avatar {
background-color: #F6F8FE;
}
// 上传
.upload {
background-color: #f4f4ff;
}
// 审核结果
.result {
margin-top: 30rpx;
padding: 50rpx 0;
background-color: #fff;
}
// 发布
.menu {
.line {
padding: 20rpx 10rpx;
&+.line {
border-top: 2rpx solid #eee;
}
}
}
</style>