examList.vue 12.4 KB
<template>
  <div>
    <el-dialog
      v-model="show" title="" :close-on-click-modal="true" width="85%"
      align-center
    >
      <el-form
        v-show="showSearch" ref="queryRef" size="small" :model="queryParams" :inline="true"
        label-position="top"
      >
        <el-row style="width: 100%;">
          <el-col :span="5">
            <el-form-item :label="queryParams.type=='1'?'考级名称':'考段名称'" prop="name">
              <el-input
                v-model="queryParams.name"
                :placeholder="queryParams.type=='1'?'请输入考级名称':'请输入考段名称'"
                clearable
                style="width: 214px;"
                @keyup.enter="handleQuery"
              />
            </el-form-item>
          </el-col>
          <el-col :span="5">
            <el-form-item label="证书是否发送" prop="certStatus">
              <el-select v-model="queryParams.certStatus" style="width: 214px;" clearable placeholder="" @change="handleQuery">
                <el-option label="全部" value="" />
                <el-option label="已发放" value="2" />
                <el-option label="部分发放" value="1" />
                <el-option label="未发放" value="0" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="5">
            <el-form-item label="申请单位" prop="memberName">
              <el-input
                v-model="queryParams.memberName"
                style="width: 214px;"
                placeholder="请输入申请单位"
                clearable
                @keyup.enter="handleQuery"
              />
            </el-form-item>
          </el-col>
          <el-col :span="5">
            <el-form-item :label="queryParams.type=='1'?'考级考官':'考段考官'" prop="examiner">
              <el-input
                v-model="queryParams.examiner"
                placeholder="请输入考官"
                clearable
                style="width: 214px;"
                @keyup.enter="handleQuery"
              />
            </el-form-item>
          </el-col>
          <el-col :span="10" :hidden="showCollect">
            <el-form-item label="申请时间" prop="applyTimeRange">
              <el-date-picker
                v-model="queryParams.applyTimeRange"
                clearable
                type="daterange"
                range-separator="至"
                start-placeholder="开始时间"
                end-placeholder="结束时间"
                value-format="YYYY-MM-DD"
                style="width: 460px;"
                @change="handleQuery"
              />
            </el-form-item>
          </el-col>
          <el-col :span="10" :hidden="showCollect">
            <el-form-item label="证书发送日期" prop="certTimeRange">
              <el-date-picker
                v-model="queryParams.certTimeRange"
                clearable
                type="daterange"
                range-separator="至"
                start-placeholder="开始时间"
                end-placeholder="结束时间"
                value-format="YYYY-MM-DD"
                style="width: 460px;"
                @change="handleQuery"
              />
            </el-form-item>
          </el-col>
          <div class="po-r-btns">
            <el-button size="small" type="primary" @click="handleQuery">搜索</el-button>
            <el-button size="small" @click="resetQuery">重置</el-button>
            <el-button
              v-if="showCollect" size="small" type="primary" link icon="ArrowDown"
              @click="showCollect=!showCollect"
            >展开</el-button>
            <el-button
              v-else size="small" type="primary" link icon="ArrowUp"
              @click="showCollect=!showCollect"
            >收起</el-button>
          </div>

        </el-row>
      </el-form>
      <el-row v-if="deptType=='1'" justify="space-between">
        <div>
          <el-button
            size="small"
            type="primary"
            :disabled="multiple"
            @click="handleSendAll"
          >批量发送证书</el-button>
          <el-button
            size="small"
            type="success"
            :disabled="multiple"
            @click="handleDownloadAll"
          >批量下载证书</el-button>
          <!--          <el-button size="small" type="warning" @click="handleExport">导出</el-button>-->
        </div>
      </el-row>
      <el-table
        v-loading="loading" border :data="infoList" class="mt20"
        @selection-change="handleSelectionChange"
      >
        <el-table-column v-if="deptType=='1'" type="selection" width="55" align="center" :selectable="selectable" />
        <el-table-column type="index" width="55" align="center" label="序号" />
        <el-table-column label="缴费编号" align="center" prop="examCode" min-width="200" :show-overflow-tooltip="true" />
        <el-table-column :label="queryParams.type=='1'?'考级名称':'考段名称'" align="center" prop="name" min-width="220" :show-overflow-tooltip="true" />
        <el-table-column label="申请单位" align="center" prop="memberName" min-width="100" :show-overflow-tooltip="true" />
        <el-table-column label="申请日期" align="center" prop="applyTime" min-width="100">
          <template #default="scope">
            <span>{{ parseTime(scope.row.applyTime, '{y}-{m}-{d}') }}</span>
          </template>
        </el-table-column>
        <el-table-column :label="queryParams.type=='1'?'考级开始日期':'考段开始日期'" align="center" prop="startTime" min-width="110">
          <template #default="scope">
            <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
          </template>
        </el-table-column>
        <el-table-column :label="queryParams.type=='1'?'考级结束日期':'考段结束日期'" align="center" prop="endTime" min-width="110">
          <template #default="scope">
            <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span>
          </template>
        </el-table-column>
        <el-table-column :label="queryParams.type=='1'?'考级地点':'考段地点' " align="center" prop="memberName" min-width="120" :show-overflow-tooltip="true" />
        <el-table-column :label="queryParams.type=='1'?'考级考官':'考段考官'" align="center" prop="examinerNames" min-width="100" :show-overflow-tooltip="true" />
        <el-table-column :label="queryParams.type=='1'?'考级考生数':'考段考生数'" align="center" prop="totalNum" :show-overflow-tooltip="true" min-width="100" />
        <el-table-column min-width="110" :label="queryParams.type=='1'?'考级通过人数':'考段通过人数'" align="center" prop="pass" />
        <el-table-column label="已发证书" min-width="90" align="center" prop="hasCerts" />
        <el-table-column label="待发证书" min-width="90" align="center" prop="noCerts" />
        <el-table-column label="提交日期" min-width="100" align="center" prop="submitTime">
          <template #default="scope">
            <span>{{ parseTime(scope.row.submitTime, '{y}-{m}-{d}') }}</span>
          </template>
        </el-table-column>
        <el-table-column label="证书是否已发" min-width="110" align="center" prop="hasCerts">
          <template #default="scope">
            <span>{{ scope.row.isCert=='9'?'正在生成': statusArr[scope.row.isCert] }}</span>
          </template>
        </el-table-column>
        <el-table-column label="证书发送时间" min-width="110" align="center" prop="certTime">
          <template #default="scope">
            <span>{{ parseTime(scope.row.certTime, '{y}-{m}-{d}') }}</span>
          </template>
        </el-table-column>
        <el-table-column :width="deptType=='1'?200:150" label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <div v-if="deptType=='1'">
              <el-button type="primary" @click="handleCert(scope.row)">查看</el-button>
              <el-button :disabled="scope.row.isCert == '2'" color="#13B5B1" style="--el-color-black:#fff;" @click="handleSend(scope.row)">一键生成</el-button>
            </div>
            <div v-else>
              <el-button type="primary" @click="handleCert(scope.row)">查看</el-button>
              <!--              <el-button v-show="scope.row.isCert != '0'" type="primary" @click="downCertByExam(scope.row)">下载</el-button>-->
            </div>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        v-show="total>0"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        :total="total"
        @pagination="getList"
      />

    </el-dialog>
    <studentView ref="studentRef" @send-cert="sendCert" />
  </div>
</template>

<script setup name="Level_Cert">
import { getCurrentInstance, reactive } from '@vue/runtime-core'
import { computed, ref, toRefs } from 'vue'
import { parseTime } from '@/utils/ruoyi'
import { getExamListByPayId, submitCert } from '@/api/exam/cert'
import StudentView from './studentList.vue'
import { useRouter } from 'vue-router'
import _ from 'lodash'
import useUserStore from '@/store/modules/user'

const { proxy } = getCurrentInstance()
const router = useRouter()
const deptType = computed(() => useUserStore().deptType)
const emit = defineEmits(['sendCert'])

const show = ref(false)
const showCollect = ref(true)
const infoList = ref([])
const loading = ref(true)
const showSearch = ref(true)
const multiple = ref(true)
const total = ref(0)
let ids = []
const batchList = ref([])
const statusArr = ['未发放', '部分发放', '已发放']

const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    name: undefined,
    memberName: undefined,
    examiner: undefined,
    applyTimeRange: undefined,
    certTimeRange: undefined,
    certStatus: undefined
    // type: '1'
  }
})
const { queryParams } = toRefs(data)


/** 查询考级信息列表 */
function getList() {
  loading.value = true
  getExamListByPayId(queryParams.value).then(response => {
    infoList.value = response.rows
    total.value = response.total
    loading.value = false
  })
}

function selectable(row) {
  return row.certStatus != '9'
}

function sendCert() {
  getList()
  emit('sendCert')
}

/** 搜索按钮操作 */
function handleQuery() {
  queryParams.value.pageNum = 1
  getList()
}

// 多选框选中数据
function handleSelectionChange(selection) {
  ids = selection.map(item => item.examId)
  multiple.value = !selection.length
  batchList.value = [...selection]
}

/** 重置按钮操作 */
function resetQuery() {
  proxy.resetForm('queryRef')
  handleQuery()
}

/**
 * 一键发送
 */

function handleSend(row) {
  proxy.$modal.confirm(`确定一键下发 ${row.name} 的证书?`)
    .then(() => {
      const params = [{
        id: queryParams.value.payId,
        children: [{
          id: row.examId
        }]
      }]
      submitCert(params).then(() => {
        proxy.$modal.msgSuccess('下发成功')
        getList()
        emit('sendCert')
      })
    })
}

function handleSendAll() {
  proxy.$modal.confirm(queryParams.value.type == '1' ? `确定下发选中考级的证书?` : `确定下发选中考段的证书?`)
    .then(() => {
      const params = [{
        id: queryParams.value.payId,
        children: []
      }]
      _.each(ids, (id) => {
        params[0].children.push({
          id: id
        })
      })

      submitCert(params).then(() => {
        proxy.$modal.msgSuccess('下发成功')
        getList()
        emit('sendCert')
      })
    })
}

/**
 * 学生列表
 */
function handleCert(row) {
  row.payId = queryParams.value.payId
  proxy.$refs['studentRef'].open(row, queryParams.value.type)
}


function handleExport() {
  proxy.download('/exam/payment/certsList/export', {
    ...queryParams.value
  }, `考试证书${new Date().getTime()}.xlsx`)
}

function handleDownloadAll() {
  if (ids.length <= 0) return proxy.msgError('请选择人员')
  const flag = batchList.value.some(item => {
    if (item.isCert != 2) {
      return proxy.$message.warning(`考级名称为”${item.name}“的数据项未发放证书!`)
    }
  })
  if (flag) return

  const routerData = router.resolve({
    path: '/download',
    query: {
      arr: ids,
      type: 'examCertByExamIds'
    }
  })
  window.open(routerData.href, '_blank')
}

function open(params, flag) {
  queryParams.value.payId = params.payId
  queryParams.value.type = flag
  show.value = true
  getList()
}

defineExpose({
  open
})

</script>

<style lang="scss" scoped >

</style>