7d0f60a6 by lttnew

更新证书

1 parent 5f967e5c
<template>
<view>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.name" placeholder="搜索姓名" @blur="getList()" @clear="getList()">
</uni-easyinput>
</view>
<view class="indexboxre" style="height: calc(100vh - 180rpx)">
<view class="userlist">
<view class="item" v-for="n in list" :key="n.id">
<view class="w100">
<view class="status">
<text class="text-success" v-if="n.isCert == '1' ">已发送</text>
<text class="text-warning" v-else>未发送</text>
</view>
<view class="name">{{n.realName}}</view>
<view class="date">
所属团体: {{n.memName}}
</view>
<view class="flexbox mtb30">
<view>
会员有效期
<text>{{n.vaildityDate?.slice(0,10)}}</text>
</view>
<view class="w50">{{queryParams.type=='1'?'级位':'段位'}}
<text>
{{ szToHz(n.levelNew) }}{{ queryParams.type=='1'?'级':'段/品' }}
</text>
</view>
</view>
<div class="func">
<button @click="sendCert(n)">{{ ['发送证书','更新证书'][n.isCert] }}</button>
</div>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
szToHz
} from '@/common/utils.js'
import {
ref,
getCurrentInstance
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const {
proxy
} = getCurrentInstance()
const app = getApp();
const queryParams = ref({})
const list = ref([])
const total = ref(0)
const userType = ref('')
onLoad((option) => {
queryParams.value.examId = option.examId
queryParams.value.payId = option.payId
queryParams.value.type = option.type
getList()
})
function getList() {
uni.showLoading({
title: '加载中'
})
if (queryParams.value.name == '') {
delete queryParams.value.name
}
api.certStudentList(queryParams.value).then(res => {
list.value = res.rows
uni.hideLoading()
})
}
function checkCert(row){
return api.checkPersonByPersonId(row.perId).then(res => {
if (!res.data) {
uni.showModal({
title: '提示',
content:'该学员没有照片,无法生成证书!',
success: () => {}
})
return Promise.reject()
}
})
}
function sendCert(row) {
let msg
if (row.isCert == 1) {
msg = `更新`
} else {
msg = `下发`
}
checkCert(row).then(() => {
uni.showModal({
title: '提示',
content: `确定${msg}${row.realName}的证书吗`,
success: function(res) {
if (res.confirm) {
const params = [{
id: queryParams.value.payId,
children: [{
id: queryParams.value.examId,
children: [row.id]
}]
}]
api.submitCert2(params).then(res => {
uni.showToast({
title: `下发成功`
})
getList()
})
}
}
})
})
}
function handleImport() {
var arr = []
for (var n of list.value) {
if (n.checked) {
arr.push(n.perId)
}
}
if (arr.length == 0) {
uni.showToast({
title: "请选择会员",
icon: "none"
})
return
}
api.addPersonPaymentGroup({
rangeId: queryParams.value.paymentRangeId,
personIdArray: arr.join(',')
}).then(res => {
let path = `/personalVip/renew?rangeId=${res.data.rangeId}`
uni.redirectTo({
url: path
});
})
}
</script>
<style scoped lang="scss">
.indexboxre {
padding: 0 30rpx;
.tt {
font-size: 30rpx;
margin: 0 0 30rpx;
color: #4C5359;
}
position: relative;
height: calc(100vh - 280rpx);
overflow: auto;
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.name" placeholder="搜索姓名" @blur="getList()" @clear="getList()">
</uni-easyinput>
</view>
<view class="indexboxre" style="height: calc(100vh - 180rpx)">
<view class="userlist">
<view class="item" v-for="n in list" :key="n.id">
<view class="w100">
<view class="status">
<text class="text-success" v-if="n.isCert == '1'">已发送</text>
<text class="text-warning" v-else-if="n.isCert == '0'">未发送</text>
<text class="text-primary" v-else>生成中</text>
</view>
<view class="name">{{n.realName}}</view>
<view class="date">
所属团体: {{n.memName}}
</view>
<view class="flexbox mtb30">
<view>
会员有效期
<text>{{n.vaildityDate?.slice(0,10)}}</text>
</view>
<view class="w50">{{queryParams.type=='1'?'级位':'段位'}}
<text>
{{ szToHz(n.levelNew) }}{{ queryParams.type=='1'?'级':'段/品' }}
</text>
</view>
</view>
<view class="func">
<button :disabled="!(n.isCert == '0' || n.isCert == '1')" @click="sendCert(n)">{{ n.isCert == '1' ? '更新证书' : '发送证书' }}</button>
</view>
</view>
</view>
</view>
</view>
<!-- 证书操作提示弹层 -->
<uni-popup ref="certPopup" type="center" :is-mask-click="false">
<view class="cert-dialog">
<view class="cert-dialog__head">
<uni-icons type="info-filled" size="24" color="#FAAD14" />
<view class="cert-dialog__title">{{ popupTitle }}</view>
</view>
<view class="cert-dialog__content">{{ popupContent }}</view>
<view class="cert-dialog__btns">
<view
v-if="!popupIsAlert"
class="cert-dialog__btn cert-dialog__btn--cancel"
@click="onPopupCancel"
>取消</view>
<view
class="cert-dialog__btn cert-dialog__btn--sure"
@click="onPopupSure"
>{{ popupBtnText }}</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
szToHz
} from '@/common/utils.js'
import {
ref,
getCurrentInstance
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const {
proxy
} = getCurrentInstance()
const app = getApp();
const queryParams = ref({})
const list = ref([])
const total = ref(0)
const userType = ref('')
// 证书操作提示弹层
const certPopup = ref(null)
const popupTitle = ref('提示')
const popupContent = ref('')
const popupIsAlert = ref(false)
const popupBtnText = ref('确认')
let popupSure = () => {}
onLoad((option) => {
queryParams.value.examId = option.examId
queryParams.value.payId = option.payId
queryParams.value.type = option.type
getList()
})
function getList() {
uni.showLoading({
title: '加载中'
})
if (queryParams.value.name == '') {
delete queryParams.value.name
}
api.certStudentList(queryParams.value).then(res => {
list.value = res.rows
uni.hideLoading()
})
}
function checkCert(row) {
return api.checkPersonByPersonId(row.perId).then(res => {
if (!res.data) {
openCertPopup({
title: '提示',
content: '该学员没有照片,无法生成证书!',
isAlert: true,
btnText: '知道了',
sure: () => {}
})
return Promise.reject()
}
})
}
function sendCert(row) {
let msg = row.isCert == 1 ? '更新' : '下发'
checkCert(row).then(() => {
openCertPopup({
title: '提示',
content: `确定${msg}${row.realName}的证书吗`,
isAlert: false,
btnText: `确认${msg}`,
sure: () => {
const params = [{
id: queryParams.value.payId,
children: [{
id: queryParams.value.examId,
children: [row.id]
}]
}]
api.submitCert3(params).then(() => {
uni.showToast({
title: `${msg}成功`
})
getList()
})
}
})
})
}
/** 打开自定义弹层 */
function openCertPopup(opt) {
popupTitle.value = opt.title || '提示'
popupContent.value = opt.content
popupIsAlert.value = !!opt.isAlert
popupBtnText.value = opt.btnText || '确认'
popupSure = opt.sure || (() => {})
certPopup.value.open()
}
function onPopupCancel() {
certPopup.value.close()
}
function onPopupSure() {
certPopup.value.close()
popupSure()
}
function handleImport() {
var arr = []
for (var n of list.value) {
if (n.checked) {
arr.push(n.perId)
}
}
if (arr.length == 0) {
uni.showToast({
title: "请选择会员",
icon: "none"
})
return
}
api.addPersonPaymentGroup({
rangeId: queryParams.value.paymentRangeId,
personIdArray: arr.join(',')
}).then(res => {
let path = `/personalVip/renew?rangeId=${res.data.rangeId}`
uni.redirectTo({
url: path
});
})
}
</script>
<style scoped lang="scss">
.indexboxre {
padding: 0 30rpx;
.tt {
font-size: 30rpx;
margin: 0 0 30rpx;
color: #4C5359;
}
position: relative;
height: calc(100vh - 280rpx);
overflow: auto;
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
.func button[disabled] {
opacity: 0.4;
color: #999;
border-color: #ccc;
}
/* 证书操作提示弹层 */
.cert-dialog {
width: 560rpx;
background: #fff;
border-radius: 24rpx;
padding: 40rpx 32rpx 28rpx;
display: flex;
flex-direction: column;
align-items: center;
&__head {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 16rpx;
}
&__title {
font-size: 32rpx;
font-weight: 600;
color: #303133;
margin-left: 10rpx;
}
&__content {
font-size: 28rpx;
color: #606266;
line-height: 1.6;
text-align: center;
margin-bottom: 36rpx;
}
&__btns {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
}
&__btn {
flex: 1;
margin: 0 8rpx;
height: 76rpx;
line-height: 76rpx;
text-align: center;
font-size: 28rpx;
border-radius: 38rpx;
&--cancel {
background: #f4f4f5;
color: #909399;
}
&--sure {
background: #AD181F;
color: #fff;
}
&:active {
opacity: 0.85;
}
}
}
</style>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!