studentList.vue 6.4 KB
<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>