新增商户入驻审批,开通交易审批

This commit is contained in:
weipengfei 2023-09-19 14:14:10 +08:00
parent b3c7e61b24
commit d24b2ff3a3
5 changed files with 470 additions and 146 deletions

24
api/approve.js Normal file
View File

@ -0,0 +1,24 @@
import oahttp from "@/utils/oahttp.js";
/**
* 审批类型
*/
export const approveTypes = (data) => oahttp.get('/approve/approveType', data)
/**
* 审批列表
*/
export const approveLists = (data) => oahttp.get('/approve/lists', data)
/**
* 审批详情
*/
export const approveDetails = (data) => oahttp.post('/approve/detail', data)
/**
* 审批
*/
export const approveAudit = (data) => oahttp.post('/approve/audit', data)

View File

@ -3,9 +3,9 @@
<view class="nav_bar">
<view class="left">
<image src="../../static/img/company/company.png"></image>
<view>爱读蛋糕</view>
<view>{{extend.company_name}}</view>
</view>
<view class="right" @click="navTo(`/subpkg/merchantDetails/merchantDetails?id=${id=1}`)">
<view class="right" @click="navTo(`/subpkg/merchantDetails/merchantDetails?id=${id=datas.id}&name=${datas.name}`)">
<text>查看</text>
<u-icon name="arrow-right" size="12" color="#fff"></u-icon>
</view>
@ -13,39 +13,38 @@
<view class="body">
<view class="b_item name">
<view class="text">
<view>商户姓名:</view>
<view>某moods v你的伤口v技能大赛空军第三空间</view>
<view>审核类型:</view>
<view>{{datas.name}}</view>
</view>
<view class="type">
<text v-if="true" style="color: #ff7c32;">审核</text>
<text v-else-if="true" style="color: #47be62;">已通过</text>
<text v-else style="color: #FF0000;">未通过</text>
<text v-if="datas.check_status==1" style="color: #ff7c32;">审核</text>
<text v-else-if="datas.check_status==2" style="color: #47be62;">已通过</text>
<text v-else-if="datas.check_status==3" style="color: #FF0000;">未通过</text>
</view>
</view>
<view class="b_item">
<view>商户分类:</view>
<view>商超</view>
<view>{{datas.category_name}}</view>
</view>
<view class="b_item">
<view>店铺:</view>
<view>分类</view>
<view>店铺:</view>
<view>{{datas.type_name}}</view>
</view>
<view class="b_item">
<view>镇街店铺:</view>
<view>店铺</view>
<view>店铺名称:</view>
<view>{{datas.mer_name}}</view>
</view>
<view class="b_item">
<view>联系方式:</view>
<view>1999999999</view>
<view>{{extend.master_phone}}</view>
</view>
<view class="b_item">
<view>申请时间:</view>
<view>2023-09-09</view>
<view>{{datas.create_time}}</view>
</view>
<view class="img">
<image src="../../uni_modules/guyue-updater/assets/bg1.png"></image>
<image src="../../uni_modules/guyue-updater/assets/bg1.png"></image>
<image src="../../uni_modules/guyue-updater/assets/bg1.png"></image>
<u-line></u-line>
<view class="img" style="padding-top: 16rpx;">
<image v-for="(item, index) in extend.qualification" :key="`img`+index" :src="item"></image>
</view>
</view>
</view>
@ -54,11 +53,27 @@
<script>
export default {
name: "merchantAudit",
props: {
datas:{
type: Object,
default: ()=>{
return {};
}
}
},
data() {
return {
extend: {}
};
},
mounted() {
try{
this.extend = this.$props.datas?.extend;
this.extend.qualification?this.extend.qualification=JSON.parse(this.extend.qualification):this.extend.qualification=[];
}catch(e){
//TODO handle the exception
}
},
methods:{
navTo (url) {
if (url) {

View File

@ -4,16 +4,23 @@
<u-tabs :list="tabLists" @click="changeCurrent" lineColor='white' :scrollable="false" lineWidth='20'
inactiveStyle='color:white' activeStyle="color:white"></u-tabs>
</u-sticky>
<!-- <u-empty icon="/static/img/empty/data.png"></u-empty> -->
<u-tabs style="background-color: #fff;" :list="typeTabLists" @click="changeTypeCurrent" lineColor='#0022C7' lineWidth='40'
inactiveStyle='color:#0022C7' activeStyle="color:#0022C7"></u-tabs>
<view class="p_list">
<merchantAudit></merchantAudit>
<block v-for="(item,index) in list" :key="index">
<merchantAudit :datas="item"></merchantAudit>
</block>
</view>
<!-- <u-loadmore :status="status" :loading-text="loadingText" :loadmore-text="loadmoreText" :nomore-text="nomoreText" /> -->
<u-empty v-if="list.length==0&&loadConfig.status=='nomore'" icon="/static/img/empty/data.png"></u-empty>
<u-loadmore v-else :status="loadConfig.status" :loading-text="loadConfig.loadingText"
:loadmore-text="loadConfig.loadmoreText" :nomore-text="loadConfig.nomoreText" />
</view>
</template>
<script>
import { Toast } from '@/libs/uniApi.js'
import { approveLists, approveTypes } from "@/api/approve.js"
import merchantAudit from '@/components/merchantAudit/merchantAudit.vue'
export default {
components: {
@ -24,23 +31,85 @@
tabLists: [{
name: '全部',
}, {
name: '待审批',
name: '审核中',
}, {
name: '已通过'
}, {
name: '未通过'
}, ],
typeTabLists: [],
current: 0,
typeCurrent: 0,
check_status: 0,
list: [],
loadConfig: {
page: 1,
limit: 15,
lastpage: '',
loadingText: '努力加载中',
loadmoreText: '轻轻上拉',
nomoreText: '我也是有底线的~~',
status: 'loadmore'
},
}
},
onLoad() {
this.initType();
this.initList();
},
onShow() {
},
async onPullDownRefresh() {
await this.initList();
this.$u.sleep(200).then(()=>{
uni.stopPullDownRefresh();
})
},
onReachBottom() {
this.loadList();
},
methods: {
async initType(){
let res = await approveTypes();
res.data.forEach((item)=>{
this.typeTabLists.push({
id: item.id,
name: item.title
})
})
},
async initList(){
this.loadConfig.page = 1;
this.loadConfig.status = "loadmore";
this.list = [];
await this.loadList();
},
async loadList(){
if (this.loadConfig.status == "nomore") return;
this.loadConfig.status = "loading";
let query = {
type: this.check_status,
page: this.loadConfig.page,
limit: this.loadConfig.limit
}
this.current?query.check_status=this.current:null;
let res = await approveLists(query);
this.loadConfig.status = "loadmore"
if (res.data.lists.length < this.loadConfig.limit) {
this.loadConfig.status = "nomore"
} else {
this.loadConfig.page++;
}
this.list = [...this.list, ...res.data?.lists];
},
changeCurrent(e) {
this.current = e.index;
this.initList();
},
changeTypeCurrent(e) {
this.typeCurrent = e.index;
this.check_status = e.id;
this.initList();
},
},
}

BIN
static/icons/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -5,27 +5,61 @@
<view class="nav_bar">
<view class="left">
<image src="../../static/img/company/company.png"></image>
<view>爱读蛋糕</view>
<view>{{extend.company_name}}</view>
</view>
</view>
<view class="body">
<view class="b_item name">
<view class="text"><view>商户分类:</view> <view>商超</view></view>
<view class="text">
<view>审核类型:</view>
<view>{{formData.name}}</view>
</view>
<view class="type">
<text v-if="true" style="color: #ff7c32;">未审核</text>
<text v-else-if="true" style="color: #47be62;">已通过</text>
<text v-else style="color: #FF0000;">未通过</text>
<text v-if="formData.check_status==1" style="color: #ff7c32;">审核</text>
<text v-else-if="formData.check_status==2" style="color: #47be62;">已通过</text>
<text v-else-if="formData.check_status==3" style="color: #FF0000;">未通过</text>
</view>
</view>
<view class="b_item"><view>商户分类:</view> <view>商超</view></view>
<view class="b_item"><view>店铺类型:</view> <view>镇街店铺</view></view>
<view class="b_item"><view>申请时间:</view> <view>1999999999</view></view>
<view class="b_item"><view>联系方式:</view> <view>2023-09-18 14:00:01</view></view>
<view class="b_item"><view>店铺所在地:</view> <view>泸州市江阳区通滩镇通滩社区</view></view>
<view class="b_item"><view>详细地址:</view> <view>泸州市江阳区通滩镇通滩社区龙南路125号</view></view>
<view class="b_item"><view>公司名称:</view> <view>2023-09-09</view></view>
<view class="b_item"><view>法人姓名:</view> <view>2023-09-09</view></view>
<view class="b_item"><view>社会代码:</view> <view>1515616516516516516565465</view></view>
<view class="b_item">
<view>商户分类:</view>
<view>{{formData.category_name}}</view>
</view>
<view class="b_item">
<view>店铺类型:</view>
<view>{{formData.type_name}}</view>
</view>
<view class="b_item">
<view>店铺名称:</view>
<view>{{formData.mer_name}}</view>
</view>
<view class="b_item">
<view>申请时间:</view>
<view>{{formData.create_time}}</view>
</view>
<view class="b_item">
<view>联系方式:</view>
<view>{{extend.master_phone}}</view>
</view>
<!-- <view class="b_item">
<view>店铺所在地:</view>
<view>泸州市江阳区通滩镇通滩社区</view>
</view> -->
<view class="b_item">
<view>详细地址:</view>
<view>{{extend.address}}</view>
</view>
<view class="b_item">
<view>公司名称:</view>
<view>{{extend.company_name}}</view>
</view>
<view class="b_item">
<view>法人姓名:</view>
<view>{{extend.master_name}}</view>
</view>
<view class="b_item">
<view>社会代码:</view>
<view>{{extend.organization_code}}</view>
</view>
</view>
</view>
<view class="card">
@ -36,134 +70,316 @@
</view>
</view>
<view class="body">
<image @click="priview('../../uni_modules/guyue-updater/assets/bg1.png')" src="../../uni_modules/guyue-updater/assets/bg1.png"></image>
<view style="border-top: 1px dashed #0022c7;margin: 28rpx 0;"></view>
<image @click="priview('../../uni_modules/guyue-updater/assets/bg1.png')" src="../../uni_modules/guyue-updater/assets/bg1.png"></image>
<block v-for="(item, index) in extend.qualification">
<image @click="priview(item)"
:src="item"></image>
<view v-if="index<extend.qualification.length-1" style="border-top: 1px dashed #0022c7;margin: 28rpx 0;"></view>
</block>
</view>
</view>
</view>
<button class="btn">通过</button>
<button class="btn" style="background-color: #fff;color: #0122c7;">拒绝</button>
<block v-if="formData.check_status!=2&&formData.check_status!=3&&true">
<button class="btn" @click="tipShow = true">通过</button>
<button class="btn" @click="modalShow = true" style="background-color: #fff;color: #0122c7;">拒绝</button>
</block>
<block v-else-if="formData.check_status==3">
<view class="refuse">
未通过原因: {{formData.remark}}
</view>
</block>
<u-popup :show="modalShow" :round="13" mode="center">
<view class="popup">
<view class="header">
<text>请输入拒绝原因</text>
<image @click="modalShow=false" src="../../static/icons/close.png"></image>
</view>
<u--form labelPosition="left" :model="formData" :rules="rules" ref="uForm">
<u-form-item prop="remark">
<u-textarea class="textarea" v-model="formData.remark" placeholder="请输入拒绝原因" type="textarea"
height="100"></u-textarea>
</u-form-item>
</u--form>
<view class="p_btn">
<view></view>
<view class="right_btn">
<button class="cal" @click="modalShow=false">取消</button>
<button class="pri" @click="$u.throttle(noPass, 1500)">确认</button>
</view>
</view>
</view>
</u-popup>
<u-modal :show="tipShow" title="提示" content='确认信息无误再通过' closeOnClickOverlay showCancelButton @close="tipShow=false"
@cancel="tipShow=false" @confirm="$u.throttle(pass, 1500)"></u-modal>
</view>
</template>
<script>
export default {
data() {
return {
}
},
onLoad() {},
onShow() {},
methods: {
priview(url) {
uni.previewImage({
urls: [url],
longPressActions: {
itemList: ['保存图片'],
success: function(data) {
if (data.tapIndex === 0) {
uni.saveImageToPhotosAlbum({
filePath: url,
success: function() {
uni.showToast({
title: '保存成功',
icon: 'success'
})
},
fail: function() {
uni.showToast({
title: '保存失败',
icon: 'none'
})
}
})
}
}
}
})
import { Toast } from '../../libs/uniApi'
import { approveAudit, approveDetails } from "@/api/approve.js"
export default {
data() {
return {
modalShow: false,
tipShow: false,
formData: {
id: '',
remark: ''
},
extend: {
},
rules: {
remark: {
type: 'string',
required: true,
message: '请输入原因',
trigger: ['blur', 'change']
}
}
}
},
},
onPullDownRefresh() {
onLoad(options) {
this.formData.id = +options.id;
options.name ? uni.setNavigationBarTitle({
title: options.name
}) : null;
this.initData();
},
onShow() {},
methods: {
async initData() {
try {
let res = await approveDetails({
id: this.formData.id
});
this.formData = res.data;
this.extend = this.formData?.extend;
this.extend.qualification ? this.extend.qualification = JSON.parse(this.extend.qualification) : this.extend
.qualification = []
} catch (e) {
//TODO handle the exception
}
},
async pass() {
// check_status 2,3
await approveAudit({
id: this.formData.id,
check_status: 2
})
this.tipShow = false;
this.$nextTick(() => {
Toast('已通过');
})
},
async noPass() {
await this.$refs.uForm.validate();
await approveAudit({
id: this.formData.id,
check_status: 3,
remark: this.formData.remark
})
this.modalShow = false;
this.$nextTick(() => {
Toast('已拒绝');
})
},
priview(url) {
uni.previewImage({
urls: [url],
longPressActions: {
itemList: ['保存图片'],
success: function(data) {
if (data.tapIndex === 0) {
uni.saveImageToPhotosAlbum({
filePath: url,
success: function() {
uni.showToast({
title: '保存成功',
icon: 'success'
})
},
fail: function() {
uni.showToast({
title: '保存失败',
icon: 'none'
})
}
})
}
}
}
})
},
},
onPullDownRefresh() {
uni.stopPullDownRefresh()
}
}
</script>
<style lang="scss">
.p_list{
padding-top: 28rpx;
.card{
margin: 0 auto;
margin-bottom: 28rpx;
width: 694rpx;
background-color: #fff;
border-radius: 26rpx;
overflow: hidden;
.nav_bar{
background-color: #0122c7;
padding: 28rpx;
color: #fff;
display: flex;
justify-content: space-between;
align-items: center;
.left{
display: flex;
font-size: 32rpx;
image{
width: 40rpx;
height: 40rpx;
margin-right: 16rpx;
}
}
.right{
display: flex;
font-size: 28rpx;
align-items: center;
}
}
.body{
font-size: 28rpx;
padding: 28rpx;
.b_item{
padding-bottom: 16rpx;
display: flex;
view:nth-child(1){
flex-shrink: 0;
padding-right: 10rpx;
}
}
.name{
.p_list {
padding-top: 28rpx;
.card {
margin: 0 auto;
margin-bottom: 28rpx;
width: 694rpx;
background-color: #fff;
border-radius: 26rpx;
overflow: hidden;
.nav_bar {
background-color: #0122c7;
padding: 28rpx;
color: #fff;
display: flex;
justify-content: space-between;
.text{
flex: 1;
align-items: center;
.left {
display: flex;
view:nth-child(1){
font-size: 32rpx;
image {
width: 40rpx;
height: 40rpx;
margin-right: 16rpx;
}
}
.right {
display: flex;
font-size: 28rpx;
align-items: center;
}
}
.body {
font-size: 28rpx;
padding: 28rpx;
.b_item {
padding-bottom: 16rpx;
display: flex;
view:nth-child(1) {
flex-shrink: 0;
padding-right: 10rpx;
}
}
.name {
display: flex;
justify-content: space-between;
.text {
flex: 1;
display: flex;
view:nth-child(1) {
flex-shrink: 0;
}
}
.type {
flex-shrink: 0;
}
}
.type{
flex-shrink: 0;
image {
width: 638rpx;
height: 400rpx;
}
}
image{
width: 638rpx;
height: 400rpx;
}
}
}
}
.btn{
width: 694rpx;
height: 100rpx;
margin: 28rpx auto;
background-color: #0122c7;
border: 1rpx solid #0122c7;
color: #fff;
display: flex;
justify-content: center;
align-items: center;
}
</style>
.btn {
width: 694rpx;
height: 100rpx;
margin: 28rpx auto;
background-color: #0122c7;
border: 1rpx solid #0122c7;
color: #fff;
display: flex;
justify-content: center;
align-items: center;
}
.popup {
width: 694rpx;
border-radius: 26rpx;
background-color: #fff;
overflow: hidden;
.header {
text-align: center;
background-color: #0122c7;
color: #fff;
font-size: 32rpx;
height: 100rpx;
line-height: 100rpx;
position: relative;
image {
width: 50rpx;
height: 50rpx;
position: absolute;
right: 28rpx;
top: 50%;
transform: translate(0, -50%);
}
}
.textarea {
margin: 0 28rpx;
margin-top: 8rpx;
padding: 28rpx;
background-color: #f4f4f4;
font-size: 32rpx !important;
border-radius: 26rpx;
}
.p_btn {
margin: 28rpx;
display: flex;
justify-content: space-between;
.right_btn {
display: flex;
align-items: center;
.cal {
width: 150rpx;
font-size: 30rpx;
height: 86rpx;
line-height: 86rpx;
border-radius: 43rpx;
font-size: 30rpx;
}
.pri {
background-color: #0122c7;
color: #fff;
width: 238rpx;
height: 86rpx;
line-height: 86rpx;
border-radius: 43rpx;
font-size: 30rpx;
}
}
}
}
.refuse{
width: 694rpx;
padding: 28rpx;
margin: 0 auto;
margin-bottom: 28rpx;
border-radius: 26rpx;
// border: 1px solid #ff7c32;
background-color: rgba(#ff7c32, 0.2);
color: #ff7c32;
}
</style>