approval.vue 5.34 KB
<template>
  <view>
    <uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
                           styleType="text" activeColor="#AD181F"></uni-segmented-control>
			
    <!-- 段位考试审核 -->
    <view class="appList">
      <view class="appItem" v-for="item in infoList" :key="item.recordId" >
        <view @click="goDetail(item)">
          <view class="status" v-if="item.statusStr">
            <text :class="{
              'text-primary-bg':item.auditStatus=='1',
              'text-success-bg':item.status=='2',
              'text-danger-bg':item.status=='3',
              'text-warning-bg':item.status=='4'
            }">{{ item.statusStr }}</text>
          </view>
		
          <view class="date" v-if="item.status!='0'&&item.submitTime">提交时间:{{item.submitTime}}</view>
          <view class="text-primary">{{item.examCode}}</view>
		  <view class="name mt0" >{{item.name}}</view>
       <view class="flexbox" >
            <view>
              申请日期
              <view>{{item.applyTime.substring(0, 10)}}</view>
            </view>
            <view class="w50">
              考段考生数
              <view>{{item.totalNum||'--'}}</view>
            </view>
          </view>
          <view class="pp esp">申请单位:{{item.memberName}}</view>
          <view class="pp esp">考段日期:{{item.startTime.substring(0,16)}}{{item.endTime.substring(0,16)}}</view>
         
        </view>
        <view class="func" >
          <button @click="goApproval(item)" v-if="item.status=='1'">审核</button>
        </view>
        <view class="func" v-if="item.isView=='1' && item.status=='1' && item.rankStatus =='0'">
          <button @click="handleBack(item)">撤回</button>
        </view>
      </view>
    </view>

    <!-- 加载提示 & 无更多数据 -->
    <view class="load-tip" v-if="infoList.length > 0">
      <text v-if="loading">加载中...</text>
      <text v-else-if="noMore">没有更多数据了</text>
    </view>

    <view class="nodata" v-if="infoList.length==0 && !loading">
      <image mode="aspectFit" :src="config.baseUrl_api + '/fs/static/nodata.png'"></image>
      <text>暂无数据</text>
    </view>
  </view>
</template>

<script setup>
	import * as api from '@/common/api.js'
	import config from '@/config.js'
	import { ref } from 'vue'
	import { onLoad, onShow, onReachBottom } from '@dcloudio/uni-app'

	const app = getApp()

	const statusValues = ['', '1', '2', '3']
	const navs = ref(['全部', '审批中', '审批通过', '审批拒绝'])
	const current = ref(0)

	// 分页参数
	const queryParams = ref({
		auditSelectType: '2',
		rankStatus: '0',
		status: '',
		pageNum: 1,
		pageSize: 10
	})

	const infoList = ref([])
	const total = ref(0)
	const totalCost = ref(0)
	const totalNum = ref(0)
	const loading = ref(false)       // 加载状态
	const noMore = ref(false)         // 是否无更多数据

	// 页面加载
	onLoad((options) => {
		queryParams.value.type = options.type
    queryParams.value.auditSelectType = options.type
		if (options.type == '2') {
			uni.setNavigationBarTitle({ title: '段位考试审核' })
		} else if (options.type == '4') {
			uni.setNavigationBarTitle({ title: '越段考试审核' })
		}
	})

	// 页面显示
	onShow(() => {
		if (app.globalData.isLogin) {
			refreshList()
		} else {
			app.firstLoadCallback = () => { refreshList() }
		}
	})

	// 顶部切换
	function onClickItem(e) {
		current.value = e.currentIndex
		queryParams.value.status = statusValues[e.currentIndex]
		refreshList()
	}

	// 下拉刷新(重置)
	function refreshList() {
		queryParams.value.pageNum = 1
		noMore.value = false
		infoList.value = []
		getList()
	}

	// 上滑加载下一页
	onReachBottom(() => {
		if (loading.value || noMore.value) return
		queryParams.value.pageNum++
		getList()
	})

	// 获取列表
	function getList() {
		// 已无更多数据 或 正在加载,直接返回
		if (noMore.value || loading.value) return
		loading.value = true

		uni.showLoading({ title: '加载中', mask: queryParams.value.pageNum === 1 })
		totalCost.value = 0
		totalNum.value = 0

		api.examauditList(queryParams.value).then(res => {
			loading.value = false
			uni.hideLoading()

			const list = res.rows || []
			total.value = res.total || 0

			// 第一页:直接覆盖
			if (queryParams.value.pageNum === 1) {
				infoList.value = list
			} else {
				// 分页:追加
				infoList.value = [...infoList.value, ...list]
			}

			// 判断是否还有下一页
			if (list.length < queryParams.value.pageSize) {
				noMore.value = true
			}

			// 统计
			infoList.value.forEach(item => {
				totalCost.value += Number(item.price) || 0
				totalNum.value += Number(item.totalNum) || 0
			})
		}).catch(() => {
			loading.value = false
			uni.hideLoading()
		})
	}

	// 详情
	function goDetail(item) {
		uni.navigateTo({
			url: `/pages/rank/applyDetail?examId=${item.examId}&type=1`
		})
	}

	// 审核
	function goApproval(item) {
		uni.navigateTo({
			url: `/pages/rank/scoreAudit?ids=${item.examId}&pageType=1`
		})
	}
</script>

<style lang="scss" scoped>
	.stat-row {
		display: flex;
		gap: 40rpx;
		padding: 20rpx 30rpx;
		background: #fff;
		font-size: 26rpx;
		color: #666;

		.red {
			color: #C4121B;
			font-weight: 600;
		}
	}

	/* 加载提示 */
	.load-tip {
		text-align: center;
		padding: 20rpx 0;
		font-size: 26rpx;
		color: #999;
	}
</style>