37a8c626 by 张猛

团体审核

1 parent 584ddc04
......@@ -500,6 +500,15 @@ export function getGroupList(params) {
})
}
// 会员审核列表
export function listNewAPI(params) {
return request({
url: `/system/certifiedNew/list`,
method: 'get',
params
})
}
// 查询
export function pickUp(data) {
return request({
......@@ -733,6 +742,22 @@ export function groupAudit(data) {
})
}
export function ztxAudit(params) {
return request({
url: `/system/certifiedNew/audit/${params.ids}?flag=${params.flag}&reason=${params.reason}`,
method: 'post',
params
})
}
export function shenAudit(params) {
return request({
url: `/system/certifiedNew/shenAudit/${params.ids}?flag=${params.flag}&reason=${params.reason}`,
method: 'post',
params
})
}
export function groupMergeApi(data) {
return request({
url: `/member/certified/merge`,
......@@ -1894,3 +1919,16 @@ export function getExamInfo(examId) {
})
}
/**
* 团体考试记录
* @param id
* @returns {*}
*/
export function GroupGetLogs(id) {
return request({
url: `/system/certifiedNew/getLogs/${id}`,
method: 'get'
})
}
......
// dev
// const baseUrl_api = 'http://192.168.1.137:8787'
const baseUrl_api = 'http://tk001.wxjylt.com/stage-api'
const baseUrl_api = 'http://192.168.1.137:8787'
// const baseUrl_api = 'http://tk001.wxjylt.com/stage-api'
const loginImage_api = 'http://tk001.wxjylt.com/stage-api'
const payUrl = 'https://wxpay.cmbc.com.cn/mobilePlatform/appserver/lcbpPay.do'
......
<template>
<view>
<view class="text-center whitebg" v-if="userType=='2'">
<view class="cardNav">
<view class="active">审核</view>
<view @click="goMerge">合并</view>
<view @click="goMergeUp">提交</view>
</view>
</view>
<!-- 团队会员审核 -->
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="appList">
<view class="vipData" v-if="userType == '1'" v-show="totalCost>0">
<view>费用合计:
<text>¥{{ totalCost.toFixed(2) }}</text>
</view>
</view>
<view class="appItem" v-for="(item,index) in list" :key="index">
<view class="status" @click="goDetail(item)">
<text v-if="item.auditStatus == 0" class="text-primary">审核中</text>
<text v-if="item.auditStatus == 1" class="text-success">审核通过</text>
<text v-if="item.auditStatus == 2" class="text-danger">审核拒绝</text>
<text v-if="item.auditStatus == 3" class="text-warning">审核撤回</text>
</view>
<view class="date">
<uni-icons type="calendar-filled" size="16" color="#AD181F"></uni-icons>
{{item.content.commitTime}} 提交
</view>
<view class="text-primary" @click="goDetail(item)" v-if="item.content?.wfCode">{{item.content?.wfCode}}
</view>
<view class="name w100 mt0" @click="goDetail(item)">
<!-- <text class="dot"></text> -->
{{item.content.certName}}
</view>
<view class="flexbox" @click="goDetail(item)">
<view v-if="userType == '3'">
所属省份
<view>{{item.content.province}}</view>
</view>
<view v-if="userType == '2'">
所属一级
<view>{{item.content.firstDeptName}}</view>
</view>
<view v-if="userType == '2'">
所属二级
<view>{{item.content.secondDeptName}}</view>
</view>
<view v-if="deptType == 1">
会员/新会员/年限
<view>{{item.content.allCount}}/<text
class="text-danger">{{item.content.newCount}}</text>/{{item.content.renewYear}}
</view>
</view>
<view v-else>
年限
<view>{{item.content.renewYear}}</view>
</view>
<view v-if="deptType == 1">
费用合计
<view> ¥{{ (item?.content?.allFee*1).toFixed(2) }}</view>
</view>
<view v-if="deptType == 1" @click.stop="viewSettleFile(item.doc)">
缴费状态
<view>
<text v-if="item.doc?.settleFlag==0" class="text-warning">已结算</text>
<text v-if="item.doc?.settleFlag==1&&item.doc.payFlag==0" class="text-success">已上传</text>
<text v-if="item.doc?.settleFlag==1&&item.doc.payFlag==1" class="text-danger">未上传</text>
</view>
</view>
</view>
<view class="func" v-if="(userType == '1'&&item.auditStatus == 0)">
<button @click="audit(item.recordId,'0')">拒绝</button>
<button @click="audit(item.recordId,'1')">同意</button>
</view>
<!-- 中跆协 -->
<view class="func" v-if="(userType == '1'&&item.auditStatus == 1&&item.canTui==1)">
<button @click="sendBack(item)">撤回</button>
</view>
<!-- 市 -->
<view class="func" v-if="userType == '3'">
<button @click="goGroupInfo(item)">机构资料</button>
<button v-if="item.auditStatus == 1&&item.isView==1&&item.content.allCount > 0"
@click="sendBack(item)">撤回</button>
<button v-if="item.auditStatus == 0" @click="audit(item.recordId,'0')">拒绝</button>
<button v-if="item.auditStatus == 0" @click="audit(item.recordId,'1')">同意</button>
</view>
<!-- 省 -->
<view class="func" v-if="userType == '2'">
<button @click="goGroupInfo(item)">机构资料</button>
<button v-if="item.auditStatus == 1" @click="sendBack(item)">撤回</button>
<button v-if="item.auditStatus == 0" @click="audit(item.recordId,'0')">拒绝</button>
<button v-if="item.auditStatus == 0" @click="audit(item.recordId,'1')">同意</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" :src="config.baseUrl_api + '/fs/static/nodata.png'"></image>
<text>暂无数据</text>
</view>
<!-- <view v-if="userType=='2'" class="block-btn-box">
<button @click="goMerge" class="btn-red-kx">前往合并 > </button>
</view> -->
</view>
<view>
<!-- 团队会员审核 -->
<uni-segmented-control :current="current" :values="navs" activeColor="#AD181F" class="whitebg" styleType="text"
@clickItem="onClickItem"></uni-segmented-control>
<view class="appList">
<view v-show="statistical.totalCost>0" class="vipData">
<view>费用合计:
<text>¥{{ statistical.totalCost.toFixed(2) }}</text>
</view>
</view>
<view v-for="(item,index) in list" :key="index" class="appItem">
<view class="status" @click="goDetail(item)">
<text v-if="item.auditStatus == 1" class="text-primary">审核中</text>
<text v-if="item.auditStatus == 2" class="text-success">审核通过</text>
<text v-if="item.auditStatus == 3" class="text-danger">审核拒绝</text>
</view>
<view class="date">
<uni-icons color="#AD181F" size="16" type="calendar-filled"></uni-icons>
{{ item.commitTime }} 提交
</view>
<view v-if="item.wfCode">{{ item?.wfCode }}
</view>
<view class="name w100 mt0" @click="goDetail(item)">
{{ item.memName }}
</view>
<view class="text" @click="goDetail(item)">
{{ item.shenMemName }}
</view>
<view class="flexbox" @click="goDetail(item)">
<view>
新会员/年限
<view>{{ item.isNew == 1 ? '是' : "否" }}
/{{ item.renewYear }}
</view>
</view>
<view>
费用合计
<view> {{ (item.allPrice * 1).toFixed(2) }}</view>
</view>
<view>
政策优惠
<view>
<text class="text-danger"> {{ item.discount ? item.discount : '--' }}</text>
</view>
</view>
<view>
付款费用
<view>
<text class="text-warning"> ¥{{ item.finalPrice }}</text>
</view>
</view>
<view>
协会信息
<view>
<text :class="{'text-danger':item.checkPass == 0 }"> {{ item.checkPass == 0 ? '异常' : '正常' }}</text>
</view>
</view>
</view>
<view class="func">
<button @click="goGroupInfo(item)">机构资料</button>
<button v-if="queryParams.auditStatus==1" @click="audit(item.id,'0')">拒绝</button>
<button v-if="queryParams.auditStatus==1" @click="audit(item.id,'1')">同意</button>
</view>
<!-- 省 -->
</view>
</view>
<view v-if="list.length==0" class="nodata">
<image :src="config.baseUrl_api + '/fs/static/nodata.png'" mode="aspectFit"></image>
<text>暂无数据</text>
</view>
<!-- <view v-if="userType=='2'" class="block-btn-box">
<button @click="goMerge" class="btn-red-kx">前往合并 > </button>
</view> -->
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
auditStatus: '0'
})
const navs = ref(['审核中', '审核通过', '审核拒绝', '撤回'])
const current = ref()
const list = ref([])
const total = ref(0)
const deptType = ref('')
const userType = ref('')
const totalCost = ref(0)
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
app.firstLoadCallback = () => {
init()
};
}
})
const app = getApp();
const queryParams = ref({
auditStatus: '1'
})
const navs = ref(['审核中', '审核通过', '审核拒绝'])
const current = ref()
const list = ref([])
const total = ref(0)
const deptType = ref('')
const userType = ref('')
const totalCost = ref(0)
const statistical = ref({})
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
// console.log(userType.value)
getList()
}
function init() {
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
// console.log(userType.value)
getList()
}
function onClickItem(e) {
console.log(e)
queryParams.value.auditStatus = e.currentIndex
getList()
}
function onClickItem(e) {
queryParams.value.auditStatus = e.currentIndex + 1
getList()
}
function getList() {
uni.showLoading({
title: '加载中',
mask: true
})
if (deptType.value == 2 || deptType.value == 3) {
// 省
queryParams.value.mergeFlag = 0
} else if (deptType.value == 1) {
queryParams.value.noEmpty = 1
} else if (deptType.value == 4 || deptType.value == 5) {
queryParams.value.noEmpty = 1
}
totalCost.value = 0
api.getGroupList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value.forEach(item => {
item.content = JSON.parse(item.content)
if(item.doc){
item.doc = JSON.parse(item.doc)
}
totalCost.value = totalCost.value + (item.content.allFee * 1)
})
total.value = res.total
})
}
async function getList() {
uni.showLoading({
title: '加载中',
mask: true
})
statistical.value = {
allCount: 0,
totalCost: 0,
renewYear: 0,
newCount: 0
}
const res = await api.listNewAPI(queryParams.value)
list.value = res.rows
for (const val of list.value) {
statistical.value.renewYear += val.renewYear
statistical.value.totalCost += val.finalPrice * 1
if (val.isNew == 1) {
statistical.value.newCount += 1
}
statistical.value.allCount += 1
}
total.value = res.total
}
function audit(recordId, flag) {
if (flag == '0') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(recordId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(recordId, flag)
}
}
})
}
}
function audit(recordId, flag) {
if (flag == '0') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function (res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(recordId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function (res) {
if (res.confirm) {
doApproval(recordId, flag)
}
}
})
}
}
function doApproval(recordId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
recordIds: []
}
obj.recordIds.push(recordId)
console.log(obj)
uni.showLoading({
title: '加载中',
mask: true
})
api.groupAudit(obj).then((res) => {
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function doApproval(recordId, flag, reason) {
let obj = {
flag: flag,
reason: reason || '',
ids: []
}
obj.ids.push(recordId)
console.log(obj)
uni.showLoading({
title: '加载中',
mask: true
})
api.ztxAudit(obj).then((res) => {
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
const auditLog = encodeURIComponent(JSON.stringify(item.auditLog))
const form = encodeURIComponent(JSON.stringify(item))
function goDetail(item) {
const form = encodeURIComponent(JSON.stringify(item))
if (userType.value == '1') {
// 查看
let path = `/group/apply/mergeUpDetail?form=${form}`
uni.navigateTo({
url: path
});
}
if (userType.value == '2' || userType.value == '3') {
// 审核记录
let path = `/group/apply/record?certId=${item.content.certId}`
uni.navigateTo({
url: path
});
}
}
if (userType.value == '1') {
// 查看
let path = `/group/apply/mergeUpDetail?form=${form}`
uni.navigateTo({
url: path
});
} else if (userType.value == '2' || userType.value == '3') {
// 审核记录
let path = `/group/apply/record?certId=${item.content.certId}`
uni.navigateTo({
url: path
});
}
}
function goMerge() {
let path = `/group/apply/merge`
uni.redirectTo({
url: path
});
}
function goMerge() {
let path = `/group/apply/merge`
uni.redirectTo({
url: path
});
}
function goMergeUp() {
let path = `/group/apply/mergeUp`
uni.redirectTo({
url: path
});
}
function goMergeUp() {
let path = `/group/apply/mergeUp`
uni.redirectTo({
url: path
});
}
function sendBack(row) {
uni.showModal({
title: '提示',
content: `确定撤回${row.content.certName}吗`,
success: function (res) {
if (res.confirm) {
api.certifiedwithDraw({
recordId: row.recordId,
reason: row.reason
}).then(res => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
}
})
}
function sendBack(row) {
uni.showModal({
title: '提示',
content: `确定撤回${row.content.certName}吗`,
success: function(res) {
if (res.confirm) {
api.certifiedwithDraw({
recordId: row.recordId,
reason: row.reason
}).then(res => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
function goGroupInfo(row) {
uni.navigateTo({
url: `/group/groupInfo?memId=${row.memId}`
})
}
}
}
})
}
function viewSettleFile(doc) {
let url
if (doc.payEvidence) {
url = JSON.parse(doc.payEvidence)[0].url || null
console.log(url)
if (url) {
showImg(url)
}
}
}
function goGroupInfo(row) {
uni.navigateTo({
url: `/group/groupInfo?memId=${row.content?.memId}`
})
}
function viewSettleFile(doc){
let url
if(doc.payEvidence){
url = JSON.parse(doc.payEvidence)[0].url || null
console.log(url)
if(url){showImg(url)}
}
}
function showImg(n) {
var str = ''
if(n.indexOf('http')==-1){
str = config.baseUrl_api + n
} else {
str = n
}
if (n.indexOf('png') > -1 || n.indexOf('jpg') > -1 || n.indexOf(
'jpeg') > -1) {
uni.previewImage({
urls: [str],
success: function(res) {
console.log('success', res)
},
fail: function(res) {
console.log('fail', res)
},
complete: function(res) {
console.log('complete', res)
}
})
} else {
goWebView(str)
}
}
function goWebView(url) {
url = url.replace("http://", "https://")
uni.showLoading({
title: '下载中'
});
uni.downloadFile({
url: url,
success: function(res) {
uni.hideLoading();
var filePath = res.tempFilePath;
uni.showLoading({
title: '正在打开'
});
uni.openDocument({
filePath: filePath,
showMenu: true,
success: function(res) {
uni.hideLoading();
},
fail: function(err) {
uni.hideLoading();
uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
}
});
},
fail: function(error) {
uni.hideLoading();
uni.showToast({
title: `下载失败`,
icon: 'none',
duration: 2000
});
}
});
}
function showImg(n) {
var str = ''
if (n.indexOf('http') == -1) {
str = config.baseUrl_api + n
} else {
str = n
}
if (n.indexOf('png') > -1 || n.indexOf('jpg') > -1 || n.indexOf(
'jpeg') > -1) {
uni.previewImage({
urls: [str],
success: function (res) {
console.log('success', res)
},
fail: function (res) {
console.log('fail', res)
},
complete: function (res) {
console.log('complete', res)
}
})
} else {
goWebView(str)
}
}
function goWebView(url) {
url = url.replace("http://", "https://")
uni.showLoading({
title: '下载中'
});
uni.downloadFile({
url: url,
success: function (res) {
uni.hideLoading();
var filePath = res.tempFilePath;
uni.showLoading({
title: '正在打开'
});
uni.openDocument({
filePath: filePath,
showMenu: true,
success: function (res) {
uni.hideLoading();
},
fail: function (err) {
uni.hideLoading();
uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
}
});
},
fail: function (error) {
uni.hideLoading();
uni.showToast({
title: `下载失败`,
icon: 'none',
duration: 2000
});
}
});
}
</script>
<style scoped>
.mt0 {
margin-top: 0 !important;
}
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
.name {
margin-bottom: 10rpx !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
</style>
\ No newline at end of file
.text {
font-size: 26rpx;
color: #999;
margin-bottom: 10rpx;
}
</style>
......
<template>
<view class="hasfixedbottom">
<view class="wBox">
<view class="tt">{{form.content?.certName}}</view>
<view>
<view class="date" v-if="form.content?.commitTime">提交日期:<text>{{ form.content?.commitTime }}</text>
</view>
<view class="date">提交单位:<text>{{ form.content?.memberName }}</text> </view>
</view>
<view class="vipData mt30" style="flex-wrap: wrap;padding: 20rpx;">
<view class="w50">
团队会员合计:
<text>{{ form.content?.allCount }}</text>
</view>
<view class="w50">
新会员合计:
<text>{{ form.content?.newCount }}</text>
</view>
<view class="w50">
年限合计:
<text>{{ form.content?.renewYear }}</text>
</view>
<view class="w50">
费用合计:
<text>{{ (form.content?.allFee*1).toFixed(2) }}</text>
</view>
</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" style="padding: 20rpx 0 0;" v-for="(n,index) in list" :key="index" @click="goGroupInfo(n)">
<view style="width: 100%">
<view class="name text-primary underLine">{{n.memberName}}</view>
<view class="date">单位类型:
<text v-if="n.deptType==2">一级协会</text>
<text v-if="n.deptType==3">直属协会</text>
<text v-if="n.deptType==4">二级协会</text>
<text v-if="n.deptType==5">三级协会</text>
<text v-if="n.deptType==6">职业性单位会员</text>
</view>
<view class="flexbox" style="background-color: rgba(244, 249, 253, 1);padding:10rpx;">
<view>
<view>
原有效期
<text>{{n.validityTime?.slice(0,10)||'-'}}</text>
</view>
<view>
提交日期
<text>{{n.commitTime?.slice(0,10)||'-'}}</text>
</view>
</view>
<view>
年限
<text>{{n.renewYear}}</text>
<view v-if="deptType==1">
会员证
<text v-if="form.content?.sendJiaoFeiFlag==1" class="text-success">已下发</text>
<text v-else class="text-warning">未下发</text>
</view>
</view>
<view>
单价
<text>¥{{n.unitPrice}}</text>
<view>总价
<text>¥{{n.allFee}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="h3-padding">审核记录</view>
<view class="wBox">
<view class="stepItem" v-for="(n,index) in auditList" :key="index">
<view class="time">{{n.handleDate||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditStatus==1" class="text-success">审核通过</text>
<text v-if="n.auditStatus==2" class="text-danger"> 审核拒绝</text>
<text v-if="n.auditStatus==0" class="text-primary"> 审核中</text>
<text v-if="n.auditStatus==3" class="text-warning">已撤回</text>
<text v-if="n.auditStatus==100" class="text-primary">审核中</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.handlerDeptName}}</view>
<view v-if="n.reason">
备注:{{n.reason||'/' }}
</view>
</view>
</view>
</view>
<!-- <view class="fixedBottom" v-if="(deptType == 1)&&form.auditStatus == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view>
<view class="fixedBottom" v-if="(deptType == 2 || deptType == 3)&&form.auditStatus == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view> -->
</view>
<view class="hasfixedbottom">
<view class="wBox">
<view class="tt">{{ form?.certName }}</view>
<view>
<view v-if="form.commitTime" class="date">提交日期:
<text>{{ form?.commitTime }}</text>
</view>
<view class="date">提交单位:
<text>{{ form?.memName }}</text>
</view>
</view>
<view class="vipData mt30" style="flex-wrap: wrap;padding: 20rpx;">
<view class="w50">
年限合计:
<text>{{ form?.renewYear }}</text>
</view>
<view class="w50">
费用合计:
<text>{{ form?.allPrice }}</text>
</view>
<view class="w50">
政策优惠:
<text>{{ form?.discount }}</text>
</view>
<view class="w50">
付款费用:
<text>{{ (form?.finalPrice * 1).toFixed(2) }}</text>
</view>
</view>
<!-- 成员 -->
<view class="userlist">
<view v-for="(n,index) in list" :key="index" class="item" style="padding: 20rpx 0 0;" @click="goGroupInfo(n)">
<view style="width: 100%">
<view class="name text-primary underLine">{{ n.memberName }}</view>
<!-- <view class="date">单位类型:-->
<!-- <text v-if="n.deptType==2">一级协会</text>-->
<!-- <text v-if="n.deptType==3">直属协会</text>-->
<!-- <text v-if="n.deptType==4">二级协会</text>-->
<!-- <text v-if="n.deptType==5">三级协会</text>-->
<!-- <text v-if="n.deptType==6">职业性单位会员</text>-->
<!-- </view>-->
<view class="flexbox" style="background-color: rgba(244, 249, 253, 1);padding:10rpx;">
<view>
<view>
原有效期
<text>{{ n.originValidityTime?.slice(0, 10) || '-' }}</text>
</view>
<view>
提交日期
<text>{{ n.commitTime?.slice(0, 10) || '-' }}</text>
</view>
</view>
<view>
年限
<text>{{ n.renewYear }}</text>
</view>
<view>
费用
<text>¥{{ n.unitPrice }}</text>
<view>总价
<text>¥{{ n.finalPrice }}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="h3-padding">审核记录</view>
<view class="wBox">
<view v-for="(n,index) in auditList" :key="index" class="stepItem">
<view class="time">{{ form.auditTime || '待审批' }}</view>
<view class="content">
<view class="status">
<text v-if="n.auditResult==1" class="text-success">审核通过</text>
<text v-if="n.auditResult!=1" class="text-danger"> 审核拒绝</text>
</view>
<view class="name">{{ n.auditDeptName }}</view>
<!-- <view class="name">{{ index + 1 }}</view>-->
<view class="deptName">{{ n.index }}</view>
<view v-if="n.auditMsg">
备注:{{ n.auditMsg || '/' }}
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
recordId: ''
})
import * as api from '@/common/api.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import {GroupGetLogs} from "@/common/api.js";
const form = ref({})
const list = ref([])
const listArr = ref([])
const id = ref()
const auditList = ref([])
const app = getApp();
const queryParams = ref({
recordId: ''
})
const feelList = ref([])
const total = ref(0)
const totalYear = ref(0)
const deptType = ref()
let rangeId = ''
onLoad((option) => {
if ('form' in option) {
form.value = JSON.parse(decodeURIComponent(option.form))
}
list.value = form.content?.certifiedSimpleList || []
listArr.value = form.content?.certifiedSimpleList || []
queryParams.value.recordId = form.value.recordId
console.log(form.value)
if (app.globalData.isLogin) {
init()
} else {
const form = ref({})
const list = ref([])
const listArr = ref([])
const id = ref()
const auditList = ref([])
app.firstLoadCallback = () => {
init()
};
}
const feelList = ref([])
const total = ref(0)
const totalYear = ref(0)
const deptType = ref()
let rangeId = ''
onLoad((option) => {
if ('form' in option) {
form.value = JSON.parse(decodeURIComponent(option.form))
list.value = [form.value]
GetLogs()
}
console.log(form.value)
//
// list.value = form.content?.certifiedSimpleList || []
// listArr.value = form.content?.certifiedSimpleList || []
// queryParams.value.recordId = form.value.recordId
// console.log(form.value)
// if (app.globalData.isLogin) {
// init()
// } else {
//
// app.firstLoadCallback = () => {
// init()
// };
// }
})
})
async function GetLogs() {
const res = await api.GroupGetLogs(form.value.id)
auditList.value = res.data
}
function init() {
deptType.value = app.globalData.deptType
getForm()
}
function init() {
deptType.value = app.globalData.deptType
getForm()
}
function getForm() {
uni.showLoading({
title: '加载中'
})
api.getDetailList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value[0].rangeId == 0 ? id.value = list.value[0].certId : id.value = list.value[0].rangeId
if (id.value) {
auditFN()
}
})
}
function getForm() {
uni.showLoading({
title: '加载中'
})
api.getDetailList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value[0].rangeId == 0 ? id.value = list.value[0].certId : id.value = list.value[0].rangeId
if (id.value) {
auditFN()
}
})
}
function auditFN() {
api.getGroupHistoryByRelateId(id.value).then(res => {
auditList.value = res.data
})
}
function auditFN() {
api.getGroupHistoryByRelateId(id.value).then(res => {
auditList.value = res.data
})
}
function audit(rangeId, flag) {
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(rangeId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(rangeId, flag)
}
}
})
}
}
function audit(rangeId, flag) {
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function (res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(rangeId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function (res) {
if (res.confirm) {
doApproval(rangeId, flag)
}
}
})
}
}
function doApproval(rangeId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
rangeIds: rangeIds
}
console.log(obj)
uni.showLoading({
title: '加载中'
})
api.mobilizeAudit(obj).then((res) => {
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
uni.navigateBack()
})
}
function goGroupInfo(row){
uni.navigateTo({
url: `/group/groupInfo?memId=${row.memId}`
})
}
</script>
function doApproval(rangeId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
rangeIds: rangeIds
}
console.log(obj)
uni.showLoading({
title: '加载中'
})
api.mobilizeAudit(obj).then((res) => {
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
uni.navigateBack()
})
}
<style scoped lang="scss">
.date {
margin-top: 10rpx;
font-size: 26rpx;
color: #999;
}
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
}
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 30rpx;
color: #AD181F;
}
}
}
function goGroupInfo(row) {
uni.navigateTo({
url: `/group/groupInfo?memId=${row.memId}`
})
}
</script>
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
<style lang="scss" scoped>
.date {
margin-top: 10rpx;
font-size: 26rpx;
color: #999;
}
view {
color: #7D8592;
margin-right: 20rpx;
}
}
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
}
.fixedBottom {
justify-content: center;
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 30rpx;
color: #AD181F;
}
}
}
button {
margin: 0 20rpx;
width: 286rpx;
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
.btn-red {
width: 286rpx;
}
}
</style>
\ No newline at end of file
.fixedBottom {
justify-content: center;
button {
margin: 0 20rpx;
width: 286rpx;
}
.btn-red {
width: 286rpx;
}
}
</style>
......
<template>
<view class="audit-page">
<!-- 顶部标签栏 -->
<view class="tab-bar">
<view
v-for="tab in tabs"
:key="tab.value"
class="tab-item"
:class="{ active: currentTab === tab.value }"
@click="onTabChange(tab.value)"
>
<text class="tab-text">{{ tab.label }}</text>
<view class="tab-indicator" v-if="currentTab === tab.value"></view>
</view>
</view>
<!-- 列表内容 -->
<scroll-view
scroll-y
class="list-content"
@scrolltolower="onLoadMore"
>
<view class="loading-wrap" v-if="loading && list.length === 0">
<uni-load-more status="loading"></uni-load-more>
</view>
<view class="empty-wrap" v-else-if="!loading && list.length === 0">
<uni-load-more status="noMore"></uni-load-more>
<view>
<!-- 团队会员审核 -->
<uni-segmented-control :current="current" :values="navs" activeColor="#AD181F" class="whitebg" styleType="text"
@clickItem="onClickItem">
</uni-segmented-control>
<view class="appList">
<view v-show="statistical.totalCost>0" class="vipData">
<view>费用合计:
<text>¥{{ statistical.totalCost.toFixed(2) }}</text>
</view>
</view>
<view class="card-list" v-else>
<view
class="card-item"
v-for="item in list"
:key="item.recordId || item.id"
@click="goDetail(item)"
>
<view class="card-header">
<text class="company-name">{{ item.memName || '-' }}</text>
<text class="status-badge" :class="getStatusClass(item.shenAuditStatus)">
{{ getStatusText(item.shenAuditStatus) }}
</text>
</view>
<view class="card-body">
<view class="info-row">
<text class="label">所属协会</text>
<text class="value">{{ item.shenMemName || '-' }}</text>
</view>
<view class="info-row">
<text class="label">会员编号</text>
<text class="value">{{ item.wfCode || '-' }}</text>
</view>
<view class="info-row">
<text class="label">认证年限</text>
<text class="value">{{ item.renewYear ? item.renewYear + '年' : '-' }}</text>
</view>
<view class="info-row">
<text class="label">付款费用</text>
<text class="value text-red">¥{{ Number(item.finalPrice || 0).toFixed(2) }}</text>
<view v-for="(item,index) in list" :key="index" class="appItem">
<view class="status" @click="goDetail(item)">
<text v-if="item.shenAuditStatus == 1" class="text-primary">审核中</text>
<text v-if="item.shenAuditStatus == 2" class="text-success">审核通过</text>
<text v-if="item.shenAuditStatus == 3" class="text-danger">审核拒绝</text>
</view>
<view class="date">
<uni-icons color="#AD181F" size="16" type="calendar-filled"></uni-icons>
{{ item.commitTime }} 提交
</view>
<view v-if="item.wfCode">{{ item?.wfCode }}
</view>
<view class="name w100 mt0" @click="goDetail(item)">
{{ item.memName }}
</view>
<view class="text" @click="goDetail(item)">
{{ item.shenMemName }}
</view>
<view class="flexbox" @click="goDetail(item)">
<view>
新会员/年限
<view>{{ item.isNew == 1 ? '是' : "否" }}
/{{ item.renewYear }}
</view>
<view class="info-row">
<text class="label">提交日期</text>
<text class="value">{{ formatDate(item.commitTime) }}</text>
</view>
<view>
费用合计
<view> {{ (item.allPrice * 1).toFixed(2) }}</view>
</view>
<view>
政策优惠
<view>
<text class="text-danger"> {{ item.discount ? item.discount : '--' }}</text>
</view>
</view>
<view class="card-footer">
<view class="tag-row">
<view class="tag" :class="item.isNew == 1 ? 'tag-new' : 'tag-renew'">
{{ item.isNew == 1 ? '新会员' : '续费' }}
</view>
<view>
付款费用
<view>
<text class="text-warning"> ¥{{ item.finalPrice }}</text>
</view>
<view class="btn-row">
<view class="btn btn-default" @click.stop="goInstitutionInfo(item)">机构资料</view>
<view class="btn btn-primary" @click.stop="goAudit(item)" v-if="item.shenAuditStatus == 1">审核</view>
</view>
<view>
协会信息
<view>
<text :class="{'text-danger':item.checkPass == 0 }"> {{ item.checkPass == 0 ? '异常' : '正常' }}</text>
</view>
</view>
</view>
<view class="func">
<button @click="goGroupInfo(item)">机构资料</button>
<button v-if="queryParams.shenAuditStatus==1" @click="audit(item.id,'0')">拒绝</button>
<button v-if="queryParams.shenAuditStatus==1" @click="audit(item.id,'1')">同意</button>
</view>
</view>
<view class="load-more-wrap" v-if="list.length > 0">
<uni-load-more :status="loadStatus"></uni-load-more>
</view>
</scroll-view>
</view>
<view v-if="list.length==0" class="nodata">
<image :src="config.baseUrl_api + '/fs/static/nodata.png'" mode="aspectFit"></image>
<text>暂无数据</text>
</view>
<!-- <view v-if="userType=='2'" class="block-btn-box">
<button @click="goMerge" class="btn-red-kx">前往合并 > </button>
</view> -->
</view>
</template>
<script setup>
import * as api from '@/common/api_exam.js'
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
const tabs = [
{ label: '全部', value: '' },
{ label: '审核中', value: '1' },
{ label: '审核通过', value: '2' },
{ label: '审核拒绝', value: '3' }
]
const currentTab = ref('')
const list = ref([])
const loading = ref(false)
const loadStatus = ref('more')
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
pageNum: 1,
pageSize: 10,
auditFlag:'1',
shenAuditStatus: '1',
mergeFlag: '0',
auditFlag: '1'
})
const navs = ref(['审核中', '审核通过', '审核拒绝'])
const current = ref()
const list = ref([])
const total = ref(0)
const userType = ref('')
const totalCost = ref(0)
const statistical = ref({})
onLoad(() => {
getList()
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function onTabChange(value) {
currentTab.value = value
list.value = []
queryParams.value.pageNum = 1
function init() {
userType.value = app.globalData.userType
// console.log(userType.value)
getList()
}
function getList() {
if (loading.value) return
loading.value = true
loadStatus.value = 'loading'
const params = {
...queryParams.value,
shenAuditStatus: currentTab.value
}
api.certifiedNewList(params).then(res => {
if (res.rows) {
if (queryParams.value.pageNum === 1) {
list.value = res.rows
} else {
list.value = [...list.value, ...res.rows]
}
loadStatus.value = res.rows.length >= queryParams.value.pageSize ? 'more' : 'noMore'
} else {
list.value = []
loadStatus.value = 'noMore'
}
}).catch(err => {
console.error('获取会员审核列表失败', err)
loadStatus.value = 'noMore'
}).finally(() => {
loading.value = false
})
}
function onLoadMore() {
if (loadStatus.value === 'noMore' || loading.value) return
queryParams.value.pageNum++
function onClickItem(e) {
queryParams.value.shenAuditStatus = e.currentIndex + 1
getList()
}
function getStatusText(status) {
const map = { 1: '审核中', 2: '审核通过', 3: '审核拒绝', 4: '已撤回' }
return map[status] || '-'
async function getList() {
uni.showLoading({
title: '加载中',
mask: true
})
statistical.value = {
allCount: 0,
totalCost: 0,
renewYear: 0,
newCount: 0
}
const res = await api.listNewAPI(queryParams.value)
list.value = res.rows
for (const val of list.value) {
statistical.value.renewYear += val.renewYear
statistical.value.totalCost += val.finalPrice * 1
if (val.isNew == 1) {
statistical.value.newCount += 1
}
statistical.value.allCount += 1
}
total.value = res.total
}
function getStatusClass(status) {
const map = {
1: 'status-warning',
2: 'status-success',
3: 'status-danger',
4: 'status-gray'
function audit(recordId, flag) {
if (flag == '0') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function (res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(recordId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function (res) {
if (res.confirm) {
doApproval(recordId, flag)
}
}
})
}
return map[status] || ''
}
function formatDate(dateStr) {
if (!dateStr) return '-'
if (typeof dateStr === 'string' && dateStr.indexOf('T') > -1) {
return dateStr.slice(0, 10)
function doApproval(recordId, flag, reason) {
let obj = {
flag: flag,
reason: reason || '',
ids: []
}
return dateStr
obj.ids.push(recordId)
console.log(obj)
uni.showLoading({
title: '加载中',
mask: true
})
api.shenAudit(obj).then((res) => {
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
const form = encodeURIComponent(JSON.stringify(item))
let path = `/group/apply/mergeUpDetail?form=${form}`
uni.navigateTo({
url: `/group/groupOrderDetail?form=${encodeURIComponent(JSON.stringify(item))}`
})
url: path
});
}
function goInstitutionInfo(item) {
function goGroupInfo(row) {
uni.navigateTo({
url: `/level/ztx/institutionInfo?memId=${item.memId}`
url: `/group/groupInfo?memId=${row.memId}`
})
}
function goAudit(item) {
uni.navigateTo({
url: `/level/ztx/memberAuditPage?type=single&ids=${item.recordId || item.id}`
})
}
</script>
<style lang="scss" scoped>
.audit-page {
min-height: 100vh;
background-color: #f5f5f5;
}
.tab-bar {
display: flex;
background-color: #fff;
padding: 0 20rpx;
position: sticky;
top: 0;
z-index: 100;
.tab-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
padding: 24rpx 0;
position: relative;
.tab-text {
font-size: 28rpx;
color: #666;
}
.tab-indicator {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 80rpx;
height: 6rpx;
background-color: #AD181F;
border-radius: 3rpx;
}
&.active {
.tab-text {
color: #AD181F;
font-weight: 600;
function showImg(n) {
var str = ''
if (n.indexOf('http') == -1) {
str = config.baseUrl_api + n
} else {
str = n
}
if (n.indexOf('png') > -1 || n.indexOf('jpg') > -1 || n.indexOf(
'jpeg') > -1) {
uni.previewImage({
urls: [str],
success: function (res) {
console.log('success', res)
},
fail: function (res) {
console.log('fail', res)
},
complete: function (res) {
console.log('complete', res)
}
}
})
} else {
goWebView(str)
}
}
.list-content {
height: calc(100vh - 100rpx);
padding: 20rpx;
box-sizing: border-box;
}
.loading-wrap,
.empty-wrap {
padding: 100rpx 0;
text-align: center;
}
.card-list {
.card-item {
background-color: #fff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
padding-bottom: 20rpx;
border-bottom: 1rpx solid #f0f0f0;
.company-name {
font-size: 32rpx;
font-weight: 600;
color: #333;
flex: 1;
margin-right: 20rpx;
}
.status-badge {
font-size: 24rpx;
padding: 6rpx 16rpx;
border-radius: 20rpx;
flex-shrink: 0;
&.status-warning {
background-color: #fff7e6;
color: #fa8c16;
}
&.status-success {
background-color: #f6ffed;
color: #52c41a;
}
&.status-danger {
background-color: #fff1f0;
color: #f5222d;
function goWebView(url) {
url = url.replace("http://", "https://")
uni.showLoading({
title: '下载中'
});
uni.downloadFile({
url: url,
success: function (res) {
uni.hideLoading();
var filePath = res.tempFilePath;
uni.showLoading({
title: '正在打开'
});
uni.openDocument({
filePath: filePath,
showMenu: true,
success: function (res) {
uni.hideLoading();
},
fail: function (err) {
uni.hideLoading();
uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
}
&.status-gray {
background-color: #f5f5f5;
color: #999;
}
}
});
},
fail: function (error) {
uni.hideLoading();
uni.showToast({
title: `下载失败`,
icon: 'none',
duration: 2000
});
}
});
}
</script>
.card-body {
.info-row {
display: flex;
justify-content: space-between;
padding: 12rpx 0;
.label {
font-size: 26rpx;
color: #999;
flex-shrink: 0;
}
.value {
font-size: 26rpx;
color: #333;
text-align: right;
flex: 1;
margin-left: 20rpx;
}
.text-red {
color: #AD181F;
}
}
}
.card-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20rpx;
padding-top: 20rpx;
border-top: 1rpx solid #f0f0f0;
.tag-row {
display: flex;
gap: 12rpx;
.tag {
font-size: 24rpx;
padding: 6rpx 16rpx;
border-radius: 20rpx;
font-weight: 500;
&.tag-new {
background-color: rgba(#AD181F, 0.1);
color: #AD181F;
}
&.tag-renew {
background-color: rgba(#999, 0.1);
color: #666;
}
}
}
.btn-row {
display: flex;
gap: 16rpx;
.btn {
font-size: 26rpx;
padding: 12rpx 24rpx;
border-radius: 8rpx;
}
<style scoped>
.mt0 {
margin-top: 0 !important;
}
.btn-default {
background-color: #f5f5f5;
color: #666;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
.btn-primary {
background-color: #AD181F;
color: #fff;
}
}
}
}
.name {
margin-bottom: 10rpx !important;
}
.load-more-wrap {
padding: 20rpx 0;
text-align: center;
.text {
font-size: 26rpx;
color: #999;
margin-bottom: 10rpx;
}
</style>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!