554 lines
19 KiB
Vue
554 lines
19 KiB
Vue
<template>
|
|
<div class="app-container">
|
|
<el-form ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="140px">
|
|
<el-form-item label="学号" prop="stuNo">
|
|
<el-input v-model="queryParams.stuNo" placeholder="请输入学号" clearable @keyup.enter.native="handleQuery" />
|
|
</el-form-item>
|
|
<el-form-item label="姓名" prop="stuName">
|
|
<el-input v-model="queryParams.stuName" placeholder="请输入姓名" clearable @keyup.enter.native="handleQuery" />
|
|
</el-form-item>
|
|
<el-form-item label="班级" prop="className">
|
|
<el-input v-model="queryParams.className" placeholder="请输入班级" clearable @keyup.enter.native="handleQuery" />
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<el-row :gutter="10" class="mb8">
|
|
<el-col :span="1.5">
|
|
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="manyVClick">批量审核</el-button>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
|
|
<el-table-column type="selection" width="55" align="center" />
|
|
<el-table-column label="#" align="center" prop="id" />
|
|
<el-table-column label="学年" align="center" prop="stuYearName" />
|
|
<el-table-column label="班级" align="center" prop="className" />
|
|
<el-table-column label="学号" align="center" prop="stuNo" />
|
|
<el-table-column label="姓名" align="center" prop="stuName" />
|
|
<el-table-column label="审核状态" align="center" prop="applyStatus">
|
|
<template slot-scope="scope">
|
|
<dict-tag :options="dict.type.knzz_tufa_apply_status" :value="scope.row.applyStatus" />
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
|
<template slot-scope="scope">
|
|
<el-button size="mini" type="text" icon="el-icon-view" @click="lookVClick(scope.row)">审核</el-button>
|
|
<el-button size="mini" type="text" icon="el-icon-edit" @click="openEdit(scope.row)">修改数据</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
|
|
|
|
<!-- 审核弹窗 -->
|
|
<el-dialog title="审核" :visible.sync="lookV" :fullscreen="true" :destroy-on-close="true" @close="getList">
|
|
<el-row>
|
|
<el-col :span="12">
|
|
<GlLook v-if="lookV" :form-data="lookForm" />
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<!-- 证明材料下载 -->
|
|
<el-form v-if="lookForm.hardFile" label-width="120px">
|
|
<el-form-item label="证明材料">
|
|
<el-button type="primary" size="mini" icon="el-icon-download" @click="downloadDiploma">下载文件</el-button>
|
|
</el-form-item>
|
|
<FileUpload v-model="lookForm.hardFile" />
|
|
</el-form>
|
|
<el-form label-width="200px" size="mini" class="lookForm">
|
|
<el-form-item label="是否通过">
|
|
<el-select v-model="auditRes" @change="changeAuditRes">
|
|
<el-option label="通过" value="通过" />
|
|
<el-option label="驳回" value="驳回" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="意见">
|
|
<el-input v-model="auditForm.fdyCmt" type="textarea" />
|
|
</el-form-item>
|
|
<el-form-item label="签名">
|
|
<el-upload style="display: inline;" :before-upload="boolImg" accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader" :action="upload.url" :headers="upload.headers" :show-file-list="false" :file-list="upload.fileList" :on-success="handleAvatarSuccess">
|
|
<img v-if="auditForm.fdySign" :src="baseurl + auditForm.fdySign" width="200px" height="50px" class="avatar">
|
|
<span v-else> 点击上传</span>
|
|
</el-upload>
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button type="primary" plain @click="doAudit">审核</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
<hr>
|
|
<el-timeline>
|
|
<el-timeline-item v-if="lookForm.fdyCmt && lookForm.fdyDate" :timestamp="lookForm.fdyDate" color="green" placement="top">
|
|
<el-card>
|
|
<div>
|
|
<strong>辅导员审核</strong>
|
|
<div>{{ lookForm.fdyCmt }}</div>
|
|
<img v-if="lookForm.fdySign" :src="baseurl + lookForm.fdySign" alt="辅导员签名" style="max-width:100px;margin-top:8px;">
|
|
</div>
|
|
</el-card>
|
|
</el-timeline-item>
|
|
<el-timeline-item v-if="lookForm.xwCmt && lookForm.xwDate" :timestamp="lookForm.xwDate" color="green" placement="top">
|
|
<el-card>
|
|
<div>
|
|
<strong>院系审核</strong>
|
|
<div>{{ lookForm.xwCmt }}</div>
|
|
<img v-if="lookForm.xwSign" :src="baseurl + lookForm.xwSign" alt="院系签名" style="max-width:100px;margin-top:8px;">
|
|
</div>
|
|
</el-card>
|
|
</el-timeline-item>
|
|
<el-timeline-item v-if="lookForm.xgCmt && lookForm.xgDate" :timestamp="lookForm.xgDate" color="green" placement="top">
|
|
<el-card>
|
|
<div>
|
|
<strong>学工审核</strong>
|
|
<div>{{ lookForm.xgCmt }}</div>
|
|
<img v-if="lookForm.xgSign" :src="baseurl + lookForm.xgSign" alt="学工签名" style="max-width:100px;margin-top:8px;">
|
|
</div>
|
|
</el-card>
|
|
</el-timeline-item>
|
|
</el-timeline>
|
|
</el-col>
|
|
</el-row>
|
|
</el-dialog>
|
|
|
|
<!-- 修改数据弹窗 -->
|
|
<el-dialog title="修改" :visible.sync="editV" width="900px" @close="getList">
|
|
<el-form label-width="200px" size="mini" class="lookForm">
|
|
<el-form-item label="入学时间">
|
|
<el-input v-model="editForm.inTime" />
|
|
</el-form-item>
|
|
<el-form-item label="曾获资助/奖励">
|
|
<el-input v-model="editForm.helpHis" type="textarea" />
|
|
</el-form-item>
|
|
<el-form-item label="家庭人口数">
|
|
<el-input v-model="editForm.familyNum" />
|
|
</el-form-item>
|
|
<el-form-item label="家庭月总收入">
|
|
<el-input v-model="editForm.monthMoney" />
|
|
</el-form-item>
|
|
<el-form-item label="人均月收入">
|
|
<el-input v-model="editForm.perMoney" />
|
|
</el-form-item>
|
|
<el-form-item label="收入来源">
|
|
<el-input v-model="editForm.moneySrc" />
|
|
</el-form-item>
|
|
<el-form-item label="成绩专业排名">
|
|
<el-input v-model="editForm.majorRank" />
|
|
</el-form-item>
|
|
<el-form-item label="专业人数">
|
|
<el-input v-model="editForm.majorNum" />
|
|
</el-form-item>
|
|
<el-form-item label="实行综合考评排名">
|
|
<el-radio-group v-model="editForm.isCph">
|
|
<el-radio :label="'是'">是</el-radio>
|
|
<el-radio :label="'否'">否</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
<el-form-item label="综合考评班级排名">
|
|
<el-input v-model="editForm.classRank" />
|
|
</el-form-item>
|
|
<el-form-item label="班级人数">
|
|
<el-input v-model="editForm.classNum" />
|
|
</el-form-item>
|
|
<el-form-item label="必修课门数">
|
|
<el-input v-model="editForm.bxk" />
|
|
</el-form-item>
|
|
<el-form-item label="及格门数">
|
|
<el-input v-model="editForm.jg" />
|
|
</el-form-item>
|
|
<el-form-item label="申请理由">
|
|
<el-input v-model="editForm.applyReason" type="textarea" />
|
|
</el-form-item>
|
|
<el-form-item label="证明材料">
|
|
<FileUpload v-model="editForm.hardFile" />
|
|
</el-form-item>
|
|
<el-form-item label="申请人签名">
|
|
<el-upload style="display: inline;" :before-upload="boolImg"
|
|
accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader"
|
|
:action="upload.url" :headers="upload.headers" :show-file-list="false"
|
|
:file-list="upload.fileList" :on-success="handleAvatarSuccess"
|
|
>
|
|
<img v-if="editForm.applySign" :src="baseurl + editForm.applySign" width="200px" height="50px"
|
|
class="avatar"
|
|
>
|
|
<span v-else> 点击上传</span>
|
|
</el-upload>
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button type="primary" plain @click="handleEditSave">提交修改</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-dialog>
|
|
|
|
<!-- 批量审核弹窗 -->
|
|
<el-dialog title="批量审核" :visible.sync="manyV" :destroy-on-close="true">
|
|
<el-form label-width="120px" size="mini" class="lookForm">
|
|
<el-form-item label="是否通过">
|
|
<el-select v-model="manyRes" @change="changeManyRes">
|
|
<el-option label="通过" value="通过" />
|
|
<el-option label="驳回" value="驳回" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="意见">
|
|
<el-input v-model="manyCmt" type="textarea" />
|
|
</el-form-item>
|
|
<el-form-item label="签名">
|
|
<el-upload style="display: inline;" :before-upload="boolImg" accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader" :action="upload.url" :headers="upload.headers" :show-file-list="false" :file-list="upload.fileList" :on-success="handleAvatarSuccess1">
|
|
<img v-if="manySign" :src="baseurl + manySign" width="200px" height="50px" class="avatar">
|
|
<span v-else> 点击上传</span>
|
|
</el-upload>
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button type="primary" plain @click="doMany">审核</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { boolImg, CheckImgExists, isEmpty, fullLoading } from '@/api/helpFunc'
|
|
import { getTokenKeySessionStorage as getToken } from '@/utils/auth'
|
|
|
|
import GlApply from '@/views/comprehensive/knzzGlApply/cpnt/GlApply.vue'
|
|
import GlLook from '@/views/comprehensive/knzzGlApply/cpnt/GlLook.vue'
|
|
|
|
import { listFdy as listView, doAudit, doMany, doEdit, getKnzzGlApply } from '@/api/comprehensive/knzzGlApply'
|
|
import { getOwnSign } from '@/api/workstudy/post'
|
|
|
|
export default {
|
|
name: 'GlFdy',
|
|
dicts: ['knzz_tufa_apply_status'],
|
|
components: { GlApply, GlLook },
|
|
data() {
|
|
return {
|
|
loading: true,
|
|
tableData: [],
|
|
total: 0,
|
|
queryParams: { pageNum: 1, pageSize: 10 },
|
|
|
|
lookForm: {},
|
|
lookV: false,
|
|
editMode: false,
|
|
|
|
editForm: {
|
|
id: null,
|
|
xm: '',
|
|
xh: '',
|
|
xb: '',
|
|
mz: '',
|
|
csrq: '',
|
|
zzmm: '',
|
|
rxsj: '',
|
|
jg: '',
|
|
lxdh: '',
|
|
jtdz: '',
|
|
yzbm: '',
|
|
jjlxr: '',
|
|
jjlxrdh: '',
|
|
zy: '',
|
|
bj: '',
|
|
nj: '',
|
|
xy: '',
|
|
xz: '',
|
|
xjzt: '',
|
|
sfzh: '',
|
|
yhkh: '',
|
|
khh: '',
|
|
khxm: '',
|
|
zxf: '',
|
|
xf: '',
|
|
djf: '',
|
|
cjf: '',
|
|
zcf: '',
|
|
zf: '',
|
|
pm: '',
|
|
pmbl: '',
|
|
djpm: '',
|
|
djpmbl: '',
|
|
cjpm: '',
|
|
cjpmbl: '',
|
|
zcpm: '',
|
|
zcpmbl: '',
|
|
zpm: '',
|
|
zpmbl: '',
|
|
hardFile: '',
|
|
softFile: ''
|
|
},
|
|
editV: false,
|
|
|
|
auditForm: { fdySign: '', fdyCmt: '' },
|
|
auditRes: null,
|
|
|
|
upload: {
|
|
headers: { Authorization: 'Bearer ' + getToken() },
|
|
url: process.env.VUE_APP_BASE_API + '/common/upload',
|
|
fileList: []
|
|
},
|
|
baseurl: process.env.VUE_APP_BASE_API + '/',
|
|
boolImg,
|
|
|
|
manyV: false,
|
|
ids: [],
|
|
manyStatus: null,
|
|
manyCmt: '',
|
|
manyRes: null,
|
|
manySign: '',
|
|
lookBiyeV: false,
|
|
lookBiyeUrl: ''
|
|
}
|
|
},
|
|
created() {
|
|
this.getList()
|
|
this.getOwnSign()
|
|
},
|
|
methods: {
|
|
getFileName(path) {
|
|
if (!path) return ''
|
|
return path.split('/').pop()
|
|
},
|
|
downloadDiploma() {
|
|
const raw = this.lookForm.hardFile
|
|
if (!raw) return
|
|
// 支持逗号分隔的多个文件
|
|
const files = String(raw)
|
|
.split(',')
|
|
.map((s) => s.trim())
|
|
.filter(Boolean)
|
|
|
|
const triggerDownload = (href, filename) => {
|
|
const link = document.createElement('a')
|
|
link.href = href
|
|
// 设置下载文件名(跨域时可能被浏览器忽略,但不影响触发下载/打开)
|
|
link.download = filename || ''
|
|
document.body.appendChild(link)
|
|
link.click()
|
|
document.body.removeChild(link)
|
|
}
|
|
|
|
files.forEach((file, idx) => {
|
|
const isAbsoluteUrl = /^https?:\/\//i.test(file)
|
|
const url = isAbsoluteUrl ? file : `${this.baseurl}${file}`
|
|
const name = this.getFileName(file)
|
|
// 轻微延时,避免浏览器对一次事件同时触发多个下载的限制
|
|
setTimeout(() => triggerDownload(url, name), idx * 200)
|
|
})
|
|
},
|
|
lookBiye() {
|
|
const isAbsoluteUrl = this.lookForm.hardFile.startsWith('http')
|
|
const pdfUrl = isAbsoluteUrl ? this.lookForm.hardFile : `${this.baseurl}${this.lookForm.hardFile}`
|
|
this.lookBiyeUrl = pdfUrl
|
|
this.lookBiyeV = true
|
|
},
|
|
handleQuery() {
|
|
this.queryParams.pageNum = 1
|
|
this.getList()
|
|
},
|
|
resetQuery() {
|
|
this.resetForm('queryForm')
|
|
this.handleQuery()
|
|
},
|
|
handleAvatarSuccess1(response, file, fileList) {
|
|
this.manySign = response.fileName
|
|
this.upload.fileList = []
|
|
this.$forceUpdate()
|
|
},
|
|
changeManyRes(v) {
|
|
switch (v) {
|
|
case '通过':
|
|
this.manyStatus = 2
|
|
this.manyCmt = '同意推荐该同学申请国家励志奖学金。'
|
|
break
|
|
case '驳回':
|
|
this.manyStatus = 10
|
|
this.manyCmt = '驳回,驳回原因:'
|
|
break
|
|
default:
|
|
this.manyStatus = null
|
|
this.manyCmt = ''
|
|
break
|
|
}
|
|
},
|
|
manyVClick() {
|
|
if (this.ids.length == 0) {
|
|
this.$message.info('请至少选择一条数据')
|
|
return
|
|
} else {
|
|
this.manyV = true
|
|
}
|
|
},
|
|
async doMany() {
|
|
if (isEmpty(this.manyRes)) {
|
|
this.$message.info('请选择是否通过')
|
|
return
|
|
}
|
|
if (isEmpty(this.manyCmt)) {
|
|
this.$message.info('请输入意见')
|
|
return
|
|
}
|
|
if (isEmpty(this.manySign)) {
|
|
this.$message.info('请上传签名图片')
|
|
return
|
|
}
|
|
let sdata = []
|
|
this.ids.map((x) => {
|
|
let temp = { id: x, applyStatus: this.manyStatus, fdyCmt: this.manyCmt, fdySign: this.manySign }
|
|
sdata.push(temp)
|
|
})
|
|
let loading = fullLoading(this)
|
|
let res = await doMany(sdata)
|
|
loading.close()
|
|
if (res.code == 200) {
|
|
this.$message.success(res.msg)
|
|
this.manyV = false
|
|
this.getList()
|
|
this.ids = []
|
|
}
|
|
},
|
|
handleSelectionChange(selection) {
|
|
this.ids = selection.map((item) => item.id)
|
|
},
|
|
async doNext() {
|
|
this.loading = true
|
|
let res = await listView(this.queryParams)
|
|
this.loading = false
|
|
if (res.code == 200) {
|
|
let data = [...res.rows]
|
|
if (data.length > 0) {
|
|
let row = data[0]
|
|
this.lookVClick(row)
|
|
}
|
|
}
|
|
},
|
|
async doAudit() {
|
|
let sdata = { ...this.auditForm }
|
|
if (isEmpty(sdata.applyStatus)) {
|
|
this.$message.info('请选择是否通过')
|
|
return
|
|
}
|
|
if (isEmpty(sdata.fdyCmt)) {
|
|
this.$message.info('请输入意见')
|
|
return
|
|
}
|
|
if (isEmpty(sdata.fdySign)) {
|
|
this.$message.info('请上传签名图片')
|
|
return
|
|
}
|
|
|
|
let loading = fullLoading(this)
|
|
let res = await doAudit(sdata)
|
|
loading.close()
|
|
if (res.code == 200) {
|
|
this.$message.success('审核成功')
|
|
this.lookV = false
|
|
await this.doNext()
|
|
}
|
|
},
|
|
async handleEditSave() {
|
|
const sdata = { ...this.editForm }
|
|
const loading = fullLoading(this)
|
|
const res =await doEdit(sdata)
|
|
loading.close()
|
|
if (res.code == 200) {
|
|
this.$message.success('保存成功')
|
|
if (this.editV) {
|
|
this.editForm = { ...this.editForm, ...payload }
|
|
this.editV = false
|
|
} else {
|
|
this.lookForm = { ...this.lookForm, ...payload }
|
|
}
|
|
this.getList()
|
|
} else {
|
|
this.$message.error(res.msg || '保存失败')
|
|
}
|
|
|
|
},
|
|
async getOwnSign() {
|
|
let res = await getOwnSign()
|
|
if (res.code == 200) {
|
|
let data = { ...res.data }
|
|
if (isEmpty(data.signature)) {
|
|
this.$confirm('您的签名尚未上传', '提示', {
|
|
confirmButtonText: '点我去设置',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
})
|
|
.then(() => {
|
|
this.$router.push('/user/profile')
|
|
})
|
|
.catch(() => {})
|
|
} else {
|
|
this.auditForm.fdySign = data.signature
|
|
this.manySign = data.signature
|
|
}
|
|
}
|
|
},
|
|
handleAvatarSuccess(response, file, fileList) {
|
|
this.auditForm.fdySign = response.fileName
|
|
this.upload.fileList = []
|
|
this.$forceUpdate()
|
|
},
|
|
async getList() {
|
|
this.loading = true
|
|
let res = await listView(this.queryParams)
|
|
this.loading = false
|
|
if (res.code == 200) {
|
|
this.tableData = [...res.rows]
|
|
this.total = res.total
|
|
}
|
|
},
|
|
async lookVClick(row) {
|
|
this.auditRes = null
|
|
this.lookForm = {}
|
|
this.lookForm = { ...row }
|
|
this.auditForm = { fdySign: '', fdyCmt: '' }
|
|
this.auditForm.id = row.id
|
|
await this.getOwnSign()
|
|
this.lookV = true
|
|
},
|
|
async openEdit(row) {
|
|
// 先拉取详情,保证 GlApply 在 created 中能拿到完整的 formData
|
|
const loading = fullLoading(this)
|
|
try {
|
|
const res = await getKnzzGlApply(row.id)
|
|
if (res.code === 200) {
|
|
// 直接使用后端返回的完整数据作为编辑表单数据
|
|
this.editForm = { ...res.data }
|
|
this.editV = true
|
|
} else {
|
|
this.$message.error(res.msg || '获取详情失败')
|
|
}
|
|
} catch (e) {
|
|
this.$message.error('获取详情异常,请稍后重试')
|
|
} finally {
|
|
loading.close()
|
|
}
|
|
},
|
|
changeAuditRes(v) {
|
|
switch (v) {
|
|
case '通过':
|
|
this.auditForm.applyStatus = 2
|
|
this.auditForm.fdyCmt = '同意推荐该同学申请国家励志奖学金。'
|
|
break
|
|
case '驳回':
|
|
this.auditForm.applyStatus = 10
|
|
this.auditForm.fdyCmt = '驳回:请完善信息后再申请。'
|
|
break
|
|
default:
|
|
this.auditForm.applyStatus = null
|
|
this.auditForm.fdyCmt = ''
|
|
break
|
|
}
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.lookForm {
|
|
.el-form-item {
|
|
margin-bottom: 5px;
|
|
}
|
|
}
|
|
</style> |