学生资助、学生奖惩等内容提交

This commit is contained in:
2025-12-03 09:55:58 +08:00
parent a5c6980bdd
commit aa83bf8b94
26 changed files with 2288 additions and 1411 deletions

View File

@@ -202,3 +202,11 @@ export function updateSignature(data) {
data: data
})
}
export function updateSqly(data) {
return request({
url: '/comprehensive/zxj/apply/updateSqly',
method: 'post',
data: data
})
}

View File

@@ -1,7 +1,7 @@
<template>
<div>
<template v-for="(item, index) in options">
<template v-if="values.includes(item.value)">
<template v-if="values.includes(String(item.value).trim())">
<span
v-if="item.raw.listClass == 'default' || item.raw.listClass == ''"
:key="item.value"
@@ -20,6 +20,7 @@
</el-tag>
</template>
</template>
</div>
</template>
@@ -36,7 +37,9 @@ export default {
computed: {
values() {
if (this.value !== null && typeof this.value !== 'undefined') {
return Array.isArray(this.value) ? this.value : [String(this.value)]
return Array.isArray(this.value)
? this.value.map(v => String(v).trim())
: [String(this.value).trim()]
} else {
return []
}
@@ -48,4 +51,4 @@ export default {
.el-tag + .el-tag {
margin-left: 10px;
}
</style>
</style>

View File

@@ -325,14 +325,51 @@ export default {
return new Promise((resolve, reject) => {
reader.onload = (e) => {
let data = e.target.result
let workbook = XLSX.read(data, { //手动转化
type: 'binary'
let workbook = XLSX.read(data, {
type: 'array'
})
//获取json格式的Excel数据
let jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[workbook
.SheetNames[0]], {
defval: 'null' //单元格为空时的默认值
let ws = workbook.Sheets[workbook.SheetNames[0]]
let jsonData = XLSX.utils.sheet_to_json(ws, {
defval: '',
raw: false
})
const toDateString = (v) => {
const pad = (n) => (n < 10 ? '0' + n : '' + n)
const serialToDate = (s) => {
const epoch = Date.UTC(1899, 11, 30)
const day = Math.floor(s)
const ms = Math.round((s - day) * 86400000)
return new Date(epoch + day * 86400000 + ms)
}
if (v === null || v === undefined) return ''
if (typeof v === 'number') {
const d = serialToDate(v)
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
}
if (Object.prototype.toString.call(v) === '[object Date]') {
const d = v
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
}
if (typeof v === 'string') {
const s = v.replace(/\./g, '/').trim()
let m = s.match(/^(\d{4})[\/-](\d{1,2})[\/-](\d{1,2})$/)
if (m) return `${m[1]}-${pad(parseInt(m[2]))}-${pad(parseInt(m[3]))}`
m = s.match(/^(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})$/)
if (m) {
const y = m[3].length === 2 ? 2000 + parseInt(m[3]) : parseInt(m[3])
return `${y}-${pad(parseInt(m[1]))}-${pad(parseInt(m[2]))}`
}
return s
}
return ''
}
jsonData = jsonData.map(r => ({
...r,
'学生个人申请时间': toDateString(r['学生个人申请时间']),
'辅导员审核时间': toDateString(r['辅导员审核时间']),
'系书记审核时间': toDateString(r['系书记审核时间']),
'学院审核时间': toDateString(r['学院审核时间'])
}))
resolve(jsonData)
}
})

View File

@@ -69,7 +69,7 @@
<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">
<el-upload style="display: inline;" :before-upload="boolImg" :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>
@@ -178,7 +178,7 @@
<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"
:file-list="upload.fileList" :on-success="handleEditSignSuccess"
>
<img v-if="editForm.applySign" :src="baseurl + editForm.applySign" width="200px" height="50px"
class="avatar"
@@ -225,7 +225,7 @@ 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 { listFdy as listView, doAudit, doMany, doEdit, getKnzzGlApply, updateKnzzGlApply } from '@/api/comprehensive/knzzGlApply'
import { getOwnSign } from '@/api/workstudy/post'
export default {
@@ -243,6 +243,8 @@ export default {
lookV: false,
editMode: false,
originalApplySign: null,
editForm: {
id: null,
xm: '',
@@ -464,10 +466,12 @@ export default {
sdata.hardType = sdata.hardType[0] || ''
}
const loading = fullLoading(this)
const res =await doEdit(sdata)
const api = sdata.applySign !== this.originalApplySign ? updateKnzzGlApply : doEdit
const res = await api(sdata)
loading.close()
if (res.code == 200) {
this.$message.success('保存成功')
this.originalApplySign = sdata.applySign || null
this.editV = false
this.getList()
} else {
@@ -535,6 +539,7 @@ export default {
} else {
this.editForm.hardType = ''
}
this.originalApplySign = this.editForm.applySign || null
this.editV = true
} else {
this.$message.error(res.msg || '获取详情失败')
@@ -561,6 +566,16 @@ export default {
break
}
},
handleEditSignSuccess(response, file, fileList) {
// 确保属性响应式存在
if (!Object.prototype.hasOwnProperty.call(this.editForm, 'applySign')) {
this.$set(this.editForm, 'applySign', response.fileName)
} else {
this.editForm.applySign = response.fileName
}
this.upload.fileList = []
this.$forceUpdate()
},
},
}
</script>

View File

@@ -21,9 +21,7 @@
</el-form-item>
<el-form-item label="审核状态" prop="applyStatus">
<el-select v-model="queryParams.applyStatus" placeholder="请选择审核状态" clearable>
<el-option v-for="dict in dict.type.knzz_tufa_apply_status" :key="dict.value" :label="dict.label"
:value="dict.value"
/>
<el-option v-for="dict in statusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@@ -46,12 +44,15 @@
<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" />
<dict-tag :options="statusOptions" :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>
<!-- 撤回按钮applyStatus 不等于 1 时显示 -->
<el-button v-if="scope.row.applyStatus != 1" size="mini" type="text" icon="el-icon-refresh-left"
@click="handleRevoke(scope.row)">撤回</el-button>
</template>
</el-table-column>
</el-table>
@@ -138,7 +139,7 @@ import * as XLSX from 'xlsx' // 引入 xlsx 库
import TufaApply from '@/views/comprehensive/knzzTufaApply/cpnt/TufaApply.vue'
import TufaLook from '@/views/comprehensive/knzzTufaApply/cpnt/TufaLook.vue'
import { listFdyAll as listView } from '@/api/comprehensive/knzzTufaApply'
import { listFdyAll as listView, doEdit } from '@/api/comprehensive/knzzTufaApply'
export default {
@@ -234,6 +235,34 @@ export default {
this.lookV = true
},
// 撤回到“已提交审核”applyStatus=1
async handleRevoke(row) {
try {
await this.$confirm('确定撤回该申请至“已提交审核”状态吗?', '提示', { type: 'warning' })
} catch (e) {
return
}
const loading = this.$loading({ lock: true, text: '撤回中…' })
try {
const payload = { id: row.id, applyStatus: 1 }
const res = await doEdit(payload)
if (res.code === 200) {
this.$message.success('撤回成功,状态已变更为:已提交审核')
const idx = this.tableData.findIndex(x => x.id === row.id)
if (idx !== -1) {
this.$set(this.tableData[idx], 'applyStatus', 1)
}
this.getList()
} else {
this.$message.error(res.msg || '撤回失败')
}
} catch (err) {
this.$message.error(`撤回失败:${err?.message || '网络错误'}`)
} finally {
loading.close && loading.close()
}
},
/** 导出按钮操作 */
handleExport() {
this.download('comprehensive/knzzTufaApply/exportFdyAll', {
@@ -241,6 +270,20 @@ export default {
}, `user_${new Date().getTime()}.xlsx`)
},
}
,computed:{
statusOptions(){
const opts = (this.dict && this.dict.type && this.dict.type.knzz_tufa_apply_status) || []
if (opts && opts.length) return opts
return [
{ label: '已提交审核', value: '1', raw: { listClass: 'warning', cssClass: '' } },
{ label: '辅导员通过', value: '2', raw: { listClass: 'success', cssClass: '' } },
{ label: '院系通过', value: '3', raw: { listClass: 'success', cssClass: '' } },
{ label: '学工通过', value: '4', raw: { listClass: 'success', cssClass: '' } },
{ label: '校领导通过', value: '5', raw: { listClass: 'success', cssClass: '' } },
{ label: '驳回', value: '10', raw: { listClass: 'danger', cssClass: '' } },
]
}
}
}
</script>
@@ -250,4 +293,4 @@ export default {
margin-bottom: 5px;
}
}
</style>
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -5,14 +5,10 @@
<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-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-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>
@@ -33,19 +29,19 @@
<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" />
<dict-tag :options="statusOptions" :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"
/>
<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>
@@ -65,13 +61,11 @@
</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"
>
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>
@@ -81,42 +75,36 @@
</el-form>
<hr>
<el-timeline>
<el-timeline-item v-if="lookForm.fdyCmt && lookForm.fdyDate" :timestamp="lookForm.fdyDate"
color="green" placement="top"
>
<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;"
>
<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.deptCmt && lookForm.deptDate" :timestamp="lookForm.deptDate"
color="green" placement="top"
>
<el-timeline-item v-if="lookForm.deptCmt && lookForm.deptDate" :timestamp="lookForm.deptDate" color="green"
placement="top">
<el-card>
<div>
<strong>院系审核</strong>
<div>{{ lookForm.deptCmt }}</div>
<img v-if="lookForm.deptSign" :src="baseurl +lookForm.deptSign" alt="院系签名"
style="max-width:100px;margin-top:8px;"
>
<img v-if="lookForm.deptSign" :src="baseurl + lookForm.deptSign" 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-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;"
>
<img v-if="lookForm.xgSign" :src="baseurl + lookForm.xgSign" alt="学校签名"
style="max-width:100px;margin-top:8px;">
</div>
</el-card>
</el-timeline-item>
@@ -137,6 +125,70 @@
</el-dialog>
<el-dialog title="修改数据" :visible.sync="editV" width="800px" :destroy-on-close="true" @close="getList">
<el-form label-width="120px" size="mini">
<el-form-item label="学号">
<el-input v-model="editForm.stuNo" disabled />
</el-form-item>
<el-form-item label="姓名">
<el-input v-model="editForm.stuName" disabled />
</el-form-item>
<el-form-item label="曾获资助/奖励">
<el-input v-model="editForm.helpHis" type="textarea" placeholder="无则填无" />
</el-form-item>
<el-form-item label="农行卡号">
<el-input v-model="editForm.bankCard" placeholder="请输入" />
</el-form-item>
<el-form-item label="家庭户口">
<el-radio-group v-model="editForm.jthk">
<el-radio label="城镇">城镇</el-radio>
<el-radio label="农村">农村</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="困难程度">
<el-radio-group v-model="editForm.hardCondition">
<el-radio label="特别困难">特别困难</el-radio>
<el-radio label="比较困难">比较困难</el-radio>
<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.yearMoney" placeholder="请输入" />
</el-form-item>
<el-form-item label="人均月收入">
<el-input v-model="editForm.monthMoney" placeholder="请输入" />
</el-form-item>
<el-form-item label="收入来源">
<el-input v-model="editForm.moneySource" placeholder="请输入" />
</el-form-item>
<el-form-item label="家庭详细地址">
<el-input v-model="editForm.familyAddr" placeholder="请输入" />
</el-form-item>
<el-form-item label="邮政编码">
<el-input v-model="editForm.postCode" placeholder="请输入" />
</el-form-item>
<el-form-item label="申请理由(100-150字)">
<el-input v-model="editForm.applyReason" type="textarea" placeholder="请输入" />
</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="editSignSuccess">
<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="困难佐证材料">
<FileUpload v-model="editForm.hardFile" />
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="submitEdit">保存修改</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="是否通过">
@@ -149,11 +201,9 @@
<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"
>
<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>
@@ -171,250 +221,342 @@
</template>
<script>
import { boolImg, CheckImgExists, isEmpty, fullLoading } from '@/api/helpFunc'
import { boolImg, fullLoading, isEmpty } from '@/api/helpFunc'
import { getTokenKeySessionStorage as getToken } from '@/utils/auth'
import FileUpload from '@/components/FileUpload/index.vue'
import TufaApply from '@/views/comprehensive/knzzTufaApply/cpnt/TufaApply.vue'
import TufaLook from '@/views/comprehensive/knzzTufaApply/cpnt/TufaLook.vue'
import { listFdy as listView, doAudit, doMany } from '@/api/comprehensive/knzzTufaApply'
import { doAudit, doMany, doEdit, listFdy as listView } from '@/api/comprehensive/knzzTufaApply'
import { getOwnSign } from '@/api/workstudy/post'
export default {
name: 'TufaFdy',
dicts: ['knzz_tufa_apply_status'],
components: {
TufaApply,
TufaLook
},
data() {
return {
loading: true,
tableData: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
name: 'TufaFdy',
dicts: ['knzz_tufa_apply_status'],
components: {
TufaApply,
TufaLook,
FileUpload
},
data() {
return {
loading: true,
tableData: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
},
},
lookForm: {},
lookV: false,
lookForm: {},
lookV: false,
auditForm: {
fdySign: '',
fdyCmt: ''
},
auditRes: null,
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,
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: '',
}
},
created() {
this.getList()
this.getOwnSign()
},
methods: {
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 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
},
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
}
}
manyV: false,
ids: [],
manyStatus: null,
manyCmt: '',
manyRes: null,
manySign: '',
editV: false,
editForm: {
id: null,
stuNo: '',
stuName: '',
helpHis: '',
bankCard: '',
jthk: '',
hardCondition: '',
yearMoney: '',
monthMoney: '',
moneySource: '',
familyAddr: '',
postCode: '',
applyReason: '',
applySign: '',
hardFile: ''
},
}
}, computed: {
statusOptions() {
const opts = (this.dict && this.dict.type && this.dict.type.knzz_tufa_apply_status) || []
if (opts && opts.length) return opts
return [
{ label: '已提交审核', value: '1', raw: { listClass: 'warning', cssClass: '' } },
{ label: '辅导员通过', value: '2', raw: { listClass: 'success', cssClass: '' } },
{ label: '院系通过', value: '3', raw: { listClass: 'success', cssClass: '' } },
{ label: '学工通过', value: '4', raw: { listClass: 'success', cssClass: '' } },
{ label: '校领导通过', value: '5', raw: { listClass: 'success', cssClass: '' } },
{ label: '驳回', value: '10', raw: { listClass: 'danger', cssClass: '' } },
]
}
},
created() {
this.getList()
this.getOwnSign()
},
methods: {
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 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
},
openEdit(row) {
this.editForm = {
id: row.id,
stuNo: row.stuNo || '',
stuName: row.stuName || '',
helpHis: row.helpHis || '',
bankCard: row.bankCard || '',
jthk: row.jthk || '',
hardCondition: row.hardCondition || '',
yearMoney: row.yearMoney || '',
monthMoney: row.monthMoney || '',
moneySource: row.moneySource || '',
familyAddr: row.familyAddr || '',
postCode: row.postCode || '',
applyReason: row.applyReason || '',
applySign: row.applySign || '',
hardFile: row.hardFile || ''
}
this.editV = true
},
editSignSuccess(response) {
this.editForm.applySign = response.fileName
this.upload.fileList = []
this.$forceUpdate()
},
async submitEdit() {
const s = { ...this.editForm }
if (!s.id) {
this.$message.error('缺少ID')
return
}
if (!s.helpHis) { this.$message.info('请填写曾获资助/奖励'); return }
if (!s.bankCard) { this.$message.info('请填写农行卡号'); return }
if (!s.jthk) { this.$message.info('请选择家庭户口'); return }
if (!s.hardCondition) { this.$message.info('请选择困难程度'); return }
if (!s.yearMoney) { this.$message.info('请填写年收入'); return }
if (!s.monthMoney) { this.$message.info('请填写月收入'); return }
if (!s.moneySource) { this.$message.info('请填写收入来源'); return }
if (!s.familyAddr) { this.$message.info('请填写家庭详细地址'); return }
if (!s.postCode) { this.$message.info('请填写邮政编码'); return }
if (!s.applyReason || s.applyReason.length < 100 || s.applyReason.length > 150) {
this.$message.info('申请理由字数需在100-150字之间'); return
}
if (!s.applySign) { this.$message.info('请上传申请人签名'); return }
if (!s.hardFile) { this.$message.info('请上传困难证明材料'); return }
const loading = fullLoading(this)
const res = await doEdit(s)
loading.close()
if (res.code === 200) {
this.$message.success('已保存')
this.editV = false
this.getList()
} else {
this.$message.error(res.msg || '保存失败')
}
},
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;
}
.el-form-item {
margin-bottom: 5px;
}
}
</style>
</style>

View File

@@ -5,25 +5,18 @@
<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-input v-model="queryParams.stuName" placeholder="请输入姓名" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="学院" prop="deptName">
<el-input v-model="queryParams.deptName" placeholder="请输入学院" clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.deptName" 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-input v-model="queryParams.className" placeholder="请输入班级" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="审核状态" prop="applyStatus">
<el-select v-model="queryParams.applyStatus" placeholder="请选择审核状态" clearable>
<el-option v-for="dict in dict.type.knzz_tufa_apply_status" :key="dict.value" :label="dict.label"
:value="dict.value"
/>
:value="dict.value" />
</el-select>
</el-form-item>
@@ -33,9 +26,7 @@
</el-form-item>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini"
@click="handleExport"
>导出execl</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出execl</el-button>
</el-col>
</el-row>
</el-form>
@@ -53,13 +44,15 @@
<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>
<!-- 撤回按钮applyStatus 不等于 1 时显示 -->
<el-button v-if="scope.row.applyStatus != 1" size="mini" type="text" icon="el-icon-refresh-left"
@click="handleRevoke(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"
/>
<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>
@@ -70,60 +63,43 @@
<!-- 中职毕业证下载 -->
<el-form v-if="lookForm.diplomaCertificate" label-width="120px">
<el-form-item label="中职毕业证">
<el-button type="primary" size="mini" icon="el-icon-download" @click="downloadDiploma">下载毕业证
</el-button>
<el-button type="primary" size="mini" icon="el-icon-view" @click="lookBiye">预览毕业证
</el-button>
<el-dialog :visible.sync="lookBiyeV" :destroy-on-close="true" append-to-body>
<span slot="title">中职毕业证预览</span>
<iframe v-if="lookBiyeUrl" :src="lookBiyeUrl" style="width: 100%; height: 80vh;"
frameborder="0"
/>
</el-dialog>
<el-button type="primary" size="mini" icon="el-icon-download" @click="downloadDiploma">下载文件</el-button>
</el-form-item>
<FileUpload v-model="lookForm.diplomaCertificate" />
</el-form>
<el-button v-print="printContent">打印</el-button>
<hr>
<el-timeline>
<el-timeline-item v-if="lookForm.fdyCmt && lookForm.fdyDate" :timestamp="lookForm.fdyDate"
color="green" placement="top"
>
<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;"
>
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-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;"
>
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-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;"
>
style="max-width:100px;margin-top:8px;">
</div>
</el-card>
</el-timeline-item>
@@ -146,137 +122,175 @@ import { getTokenKeySessionStorage as getToken } from '@/utils/auth'
import TufaApply from '@/views/comprehensive/knzzZsgApply/cpnt/TufaApply.vue'
import TufaLook from '@/views/comprehensive/knzzZsgApply/cpnt/TufaLook.vue'
import { listFdyAll as listView, doAudit } from '@/api/comprehensive/knzzZsgApply'
import { listFdyAll as listView, doAudit, doEdit } from '@/api/comprehensive/knzzZsgApply'
import { getOwnSign } from '@/api/workstudy/post'
export default {
name: 'TufaFdy',
dicts: ['knzz_tufa_apply_status'],
components: {
TufaApply,
TufaLook
},
data() {
return {
loading: true,
tableData: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
name: 'TufaFdy',
dicts: ['knzz_tufa_apply_status'],
components: {
TufaApply,
TufaLook
},
data() {
return {
loading: true,
tableData: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
},
},
lookForm: {},
lookV: false,
lookForm: {},
lookV: false,
upload: {
headers: { Authorization: 'Bearer ' + getToken() },
url: process.env.VUE_APP_BASE_API + '/common/upload',
fileList: []
},
baseurl: process.env.VUE_APP_BASE_API + '/',
boolImg,
upload: {
headers: { Authorization: 'Bearer ' + getToken() },
url: process.env.VUE_APP_BASE_API + '/common/upload',
fileList: []
},
baseurl: process.env.VUE_APP_BASE_API + '/',
boolImg,
printContent: {
id: 'printDiv',
extraCss: '',
extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
previewBeforeOpenCallback() {
console.log('正在加载预览窗口')
},
previewOpenCallback() {
console.log('已经加载完预览窗口')
},
beforeOpenCallback(vue) {
vue.printLoading = true
console.log('打开之前')
},
openCallback(vue) {
vue.printLoading = false
console.log('执行了打印')
},
closeCallback() {
console.log('关闭了打印工具')
},
clickMounted(vue) {
console.log('点击了打印按钮')
}
},
lookBiyeV: false,
lookBiyeUrl: ''
printContent: {
id: 'printDiv',
extraCss: '',
extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
previewBeforeOpenCallback() {
console.log('正在加载预览窗口')
},
previewOpenCallback() {
console.log('已经加载完预览窗口')
},
beforeOpenCallback(vue) {
vue.printLoading = true
console.log('打开之前')
},
openCallback(vue) {
vue.printLoading = false
console.log('执行了打印')
},
closeCallback() {
console.log('关闭了打印工具')
},
clickMounted(vue) {
console.log('点击了打印按钮')
}
},
created() {
this.getList()
},
methods: {
lookBiye() {
const isAbsoluteUrl = this.lookForm.diplomaCertificate.startsWith('http')
const pdfUrl = isAbsoluteUrl
? this.lookForm.diplomaCertificate
: `${this.baseurl}${this.lookForm.diplomaCertificate}`
this.lookBiyeUrl = pdfUrl
this.lookBiyeV = true
},
getFileName(path) {
if (!path) return ''
return path.split('/').pop()
},
downloadDiploma() {
if (!this.lookForm.diplomaCertificate) return
const isAbsoluteUrl = this.lookForm.diplomaCertificate.startsWith('http')
const pdfUrl = isAbsoluteUrl
? this.lookForm.diplomaCertificate
: `${this.baseurl}${this.lookForm.diplomaCertificate}`
const link = document.createElement('a')
link.href = pdfUrl
link.download = this.getFileName(this.lookForm.diplomaCertificate)
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
},
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
resetQuery() {
this.resetForm('queryForm')
this.handleQuery()
},
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.lookForm = {}
this.lookForm = { ...row }
this.lookV = true
},
/** 导出按钮操作 */
handleExport() {
this.download('/comprehensive/knzzZsgApply/export', {
...this.queryParams
}, `apply_${new Date().getTime()}.xlsx`)
}
lookBiyeV: false,
lookBiyeUrl: ''
}
},
created() {
this.getList()
},
methods: {
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.diplomaCertificate.startsWith('http')
const pdfUrl = isAbsoluteUrl
? this.lookForm.diplomaCertificate
: `${this.baseurl}${this.lookForm.diplomaCertificate}`
this.lookBiyeUrl = pdfUrl
this.lookBiyeV = true
},
getFileName(path) {
if (!path) return ''
return path.split('/').pop()
},
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
resetQuery() {
this.resetForm('queryForm')
this.handleQuery()
},
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.lookForm = {}
this.lookForm = { ...row }
this.lookV = true
},
// 撤回到“已提交审核”applyStatus=1
async handleRevoke(row) {
try {
await this.$confirm('确定撤回该申请至“已提交审核”状态吗?', '提示', { type: 'warning' })
} catch (e) {
return
}
const loading = this.$loading({ lock: true, text: '撤回中…' })
try {
const payload = { id: row.id, applyStatus: 1 }
const res = await doEdit(payload)
if (res.code === 200) {
this.$message.success('撤回成功,状态已变更为:已提交审核')
this.getList()
} else {
this.$message.error(res.msg || '撤回失败')
}
} catch (err) {
this.$message.error(`撤回失败:${err?.message || '网络错误'}`)
} finally {
loading.close && loading.close()
}
},
/** 导出按钮操作 */
handleExport() {
this.download('/comprehensive/knzzZsgApply/export', {
...this.queryParams
}, `apply_${new Date().getTime()}.xlsx`)
}
}
}
</script>
<style scoped lang="scss">
.lookForm {
.el-form-item {
margin-bottom: 5px;
}
.el-form-item {
margin-bottom: 5px;
}
}
</style>

View File

@@ -5,14 +5,10 @@
<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-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-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>
@@ -24,9 +20,7 @@
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="manyVClick">批量通过</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini"
@click="handleExport"
>导出execl</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出execl</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
@@ -44,16 +38,13 @@
<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="editVClick(scope.row)"
>修改学生填写的信息</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="editVClick(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"
/>
<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>
@@ -62,7 +53,7 @@
</el-col>
<el-col :span="12">
<!-- 中职毕业证下载 -->
<el-form v-if="lookForm.diplomaCertificate" label-width="120px">
<!-- <el-form v-if="lookForm.diplomaCertificate" label-width="120px">
<el-form-item label="中职毕业证">
<el-button type="primary" size="mini" icon="el-icon-download" @click="downloadDiploma">下载毕业证
</el-button>
@@ -72,12 +63,18 @@
<el-dialog :visible.sync="lookBiyeV" :destroy-on-close="true" append-to-body>
<span slot="title">中职毕业证预览</span>
<iframe v-if="lookBiyeUrl" :src="lookBiyeUrl" style="width: 100%; height: 80vh;"
frameborder="0"
/>
<iframe v-if="lookBiyeUrl" :src="lookBiyeUrl" style="width: 100%; height: 80vh;" frameborder="0" />
</el-dialog>
</el-form-item>
</el-form>
-->
<!-- 证明材料下载 -->
<el-form v-if="lookForm.diplomaCertificate" 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.diplomaCertificate" />
</el-form>
<el-form label-width="200px" size="mini" class="lookForm">
<el-form-item label="是否通过">
@@ -91,13 +88,11 @@
</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"
>
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>
@@ -107,42 +102,36 @@
</el-form>
<hr>
<el-timeline>
<el-timeline-item v-if="lookForm.fdyCmt && lookForm.fdyDate" :timestamp="lookForm.fdyDate"
color="green" placement="top"
>
<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;"
>
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-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;"
>
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-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;"
>
style="max-width:100px;margin-top:8px;">
</div>
</el-card>
</el-timeline-item>
@@ -165,11 +154,9 @@
<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"
>
<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>
@@ -219,12 +206,9 @@
<el-form-item label="申请理由">
<p style="line-height:18pt; margin:0pt; orphans:0; text-align:justify; widows:0">
<span style="font-family:仿宋; font-size:12pt">本人基于如下第</span><span
style="font-family:仿宋; font-size:12pt;"
>
<input v-model="editForm.applyReasonNum" style="width: 40px;" type="text"
class="underline-input" placeholder="请输入"
>
<span style="font-family:仿宋; font-size:12pt">本人基于如下第</span><span style="font-family:仿宋; font-size:12pt;">
<input v-model="editForm.applyReasonNum" style="width: 40px;" type="text" class="underline-input"
placeholder="请输入">
</span><span style="font-family:仿宋; font-size:12pt">种原因,符合学费补助申请条件,特提出申请,请审核.</span>
</p>
<p style="line-height:18pt; margin:0pt; orphans:0; text-align:justify; widows:0">
@@ -256,6 +240,15 @@
<el-form-item label="申请理由补充说明(填写)">
<el-input v-model="editForm.applyExtraReason" 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="handleEditSignSuccess">
<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="doEdit">提交修改</el-button>
</el-form-item>
@@ -278,353 +271,390 @@ import { listFdy as listView, doAudit, doMany, fdyEdit as doEdit } from '@/api/c
import { getOwnSign } from '@/api/workstudy/post'
export default {
name: 'TufaFdy',
dicts: ['knzz_tufa_apply_status'],
components: {
TufaApply,
TufaLook
},
data() {
return {
loading: true,
tableData: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
name: 'TufaFdy',
dicts: ['knzz_tufa_apply_status'],
components: {
TufaApply,
TufaLook
},
data() {
return {
loading: true,
tableData: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
},
},
lookForm: {},
lookV: false,
lookForm: {},
lookV: false,
auditForm: {
fdySign: '',
fdyCmt: ''
},
auditRes: null,
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,
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: '',
manyV: false,
ids: [],
manyStatus: null,
manyCmt: '',
manyRes: null,
manySign: '',
editForm: {},
editV: false,
editForm: {},
editV: false,
lookBiyeV: false,
lookBiyeUrl: ''
}
},
created() {
this.getList()
this.getOwnSign()
},
methods: {
lookBiye() {
const isAbsoluteUrl = this.lookForm.diplomaCertificate.startsWith('http')
const pdfUrl = isAbsoluteUrl
? this.lookForm.diplomaCertificate
: `${this.baseurl}${this.lookForm.diplomaCertificate}`
this.lookBiyeUrl = pdfUrl
this.lookBiyeV = true
},
changeApplyReason(v) {
if (v != '1.监测对象家庭学生(脱贫不稳定家庭学生、边缘易致贫家庭学生、突发严重困难家庭学生):') {
this.editForm.applyReason1 = ''
}
},
async doEdit() {
let sdata = { ...this.editForm }
if (isEmpty(sdata.inTime)) {
this.$message.info('请填写入学时间')
return false
}
if (isEmpty(sdata.stuPhone)) {
this.$message.info('请填写联系电话')
return false
}
if (isEmpty(sdata.bankCard)) {
this.$message.info('请填写银行卡号')
return false
}
if (isEmpty(sdata.bankAddr)) {
this.$message.info('请填写开户行')
return false
}
if (isEmpty(sdata.zzxx)) {
this.$message.info('请填写就读中职学校')
return false
}
if (isEmpty(sdata.familyNum)) {
this.$message.info('请填写家庭人口数')
return false
}
if (isEmpty(sdata.monthMoney)) {
this.$message.info('请填写家庭月收入')
return false
}
if (isEmpty(sdata.perMoney)) {
this.$message.info('请填写人均月收入')
return false
}
if (isEmpty(sdata.moneySrc)) {
this.$message.info('请填写收入来源')
return false
}
if (isEmpty(sdata.applyReasonNum)) {
this.$message.info('请填写申请理由序号')
return false
}
if (isEmpty(sdata.applyReason)) {
this.$message.info('请填写申请理由')
return false
}
if (isEmpty(sdata.diplomaCertificate)) {
this.$message.info('请上传中职毕业证pdf')
return false
}
if (sdata.applyReason && sdata.applyReason.indexOf('1.监测对象家庭学生') === 0 && isEmpty(sdata.applyReason1)) {
this.$message.info('请选择监测对象家庭学生的风险情况')
return false
}
if (isEmpty(sdata.applySign)) {
this.$message.info('请上传申请人签名')
return false
}
let loading = fullLoading(this)
let res = await doEdit(sdata)
loading.close()
if (res.code == 200) {
this.$message.success('修改成功')
this.editV = false
this.getList()
}
},
editVClick(row) {
console.log(row)
this.editForm = {}
this.editForm = { ...row }
this.editV = 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)
},
getFileName(path) {
if (!path) return ''
return path.split('/').pop()
},
downloadDiploma() {
if (!this.lookForm.diplomaCertificate) return
const isAbsoluteUrl = this.lookForm.diplomaCertificate.startsWith('http')
const pdfUrl = isAbsoluteUrl
? this.lookForm.diplomaCertificate
: `${this.baseurl}${this.lookForm.diplomaCertificate}`
const link = document.createElement('a')
link.href = pdfUrl
link.download = this.getFileName(this.lookForm.diplomaCertificate)
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
},
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 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
},
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
}
},
/** 导出按钮操作 */
handleExport() {
this.download('/comprehensive/knzzZsgApply/export', {
...this.queryParams
}, `apply_${new Date().getTime()}.xlsx`)
}
lookBiyeV: false,
lookBiyeUrl: ''
}
},
created() {
this.getList()
this.getOwnSign()
},
methods: {
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)
})
},
handleEditSignSuccess(response, file, fileList) {
// 确保属性响应式存在
if (!Object.prototype.hasOwnProperty.call(this.editForm, 'applySign')) {
this.$set(this.editForm, 'applySign', response.fileName)
} else {
this.editForm.applySign = response.fileName
}
this.upload.fileList = []
this.$forceUpdate()
},
lookBiye() {
const isAbsoluteUrl = this.lookForm.diplomaCertificate.startsWith('http')
const pdfUrl = isAbsoluteUrl
? this.lookForm.diplomaCertificate
: `${this.baseurl}${this.lookForm.diplomaCertificate}`
this.lookBiyeUrl = pdfUrl
this.lookBiyeV = true
},
changeApplyReason(v) {
if (v != '1.监测对象家庭学生(脱贫不稳定家庭学生、边缘易致贫家庭学生、突发严重困难家庭学生):') {
this.editForm.applyReason1 = ''
}
},
async doEdit() {
let sdata = { ...this.editForm }
if (isEmpty(sdata.inTime)) {
this.$message.info('请填写入学时间')
return false
}
if (isEmpty(sdata.stuPhone)) {
this.$message.info('请填写联系电话')
return false
}
if (isEmpty(sdata.bankCard)) {
this.$message.info('请填写银行卡号')
return false
}
if (isEmpty(sdata.bankAddr)) {
this.$message.info('请填写开户行')
return false
}
if (isEmpty(sdata.zzxx)) {
this.$message.info('请填写就读中职学校')
return false
}
if (isEmpty(sdata.familyNum)) {
this.$message.info('请填写家庭人口数')
return false
}
if (isEmpty(sdata.monthMoney)) {
this.$message.info('请填写家庭月收入')
return false
}
if (isEmpty(sdata.perMoney)) {
this.$message.info('请填写人均月收入')
return false
}
if (isEmpty(sdata.moneySrc)) {
this.$message.info('请填写收入来源')
return false
}
if (isEmpty(sdata.applyReasonNum)) {
this.$message.info('请填写申请理由序号')
return false
}
if (isEmpty(sdata.applyReason)) {
this.$message.info('请填写申请理由')
return false
}
if (isEmpty(sdata.diplomaCertificate)) {
this.$message.info('请上传中职毕业证pdf')
return false
}
if (sdata.applyReason && sdata.applyReason.indexOf('1.监测对象家庭学生') === 0 && isEmpty(sdata.applyReason1)) {
this.$message.info('请选择监测对象家庭学生的风险情况')
return false
}
if (isEmpty(sdata.applySign)) {
this.$message.info('请上传申请人签名')
return false
}
let loading = fullLoading(this)
let res = await doEdit(sdata)
loading.close()
if (res.code == 200) {
this.$message.success('修改成功')
this.editV = false
this.getList()
}
},
editVClick(row) {
console.log(row)
this.editForm = {}
this.editForm = { ...row }
this.editV = 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)
},
getFileName(path) {
if (!path) return ''
return path.split('/').pop()
},
downloadDiploma() {
if (!this.lookForm.diplomaCertificate) return
const isAbsoluteUrl = this.lookForm.diplomaCertificate.startsWith('http')
const pdfUrl = isAbsoluteUrl
? this.lookForm.diplomaCertificate
: `${this.baseurl}${this.lookForm.diplomaCertificate}`
const link = document.createElement('a')
link.href = pdfUrl
link.download = this.getFileName(this.lookForm.diplomaCertificate)
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
},
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 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
},
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
}
},
/** 导出按钮操作 */
handleExport() {
this.download('/comprehensive/knzzZsgApply/export', {
...this.queryParams
}, `apply_${new Date().getTime()}.xlsx`)
}
}
}
</script>
<style scoped lang="scss">
.lookForm {
.el-form-item {
margin-bottom: 5px;
}
.el-form-item {
margin-bottom: 5px;
}
}
</style>

View File

@@ -41,6 +41,7 @@
<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 v-if="scope.row.applyStatus != 1" size="mini" type="text" icon="el-icon-refresh-left" @click="handleRevoke(scope.row)">撤回</el-button>
</template>
</el-table-column>
</el-table>
@@ -121,7 +122,7 @@ import {getTokenKeySessionStorage as getToken} from '@/utils/auth'
import TufaApply from '@/views/comprehensive/knzzZzqApply/cpnt/TufaApply.vue'
import TufaLook from '@/views/comprehensive/knzzZzqApply/cpnt/TufaLook.vue'
import {listFdyAll as listView, doAudit} from '@/api/comprehensive/knzzZzqApply'
import {listFdyAll as listView, doEdit} from '@/api/comprehensive/knzzZzqApply'
import {getOwnSign} from '@/api/workstudy/post'
@@ -212,6 +213,29 @@ export default {
this.lookV = true
},
// 撤回到“已提交审核”applyStatus=1
async handleRevoke(row) {
try {
await this.$confirm('确定撤回该申请至“已提交审核”状态吗?', '提示', { type: 'warning' })
} catch (e) {
return
}
const loading = this.$loading({ lock: true, text: '撤回中…' })
try {
const payload = { id: row.id, applyStatus: 1 }
const res = await doEdit(payload)
if (res.code === 200) {
this.$message.success('撤回成功,状态已变更为:已提交审核')
this.getList()
} else {
this.$message.error(res.msg || '撤回失败')
}
} catch (err) {
this.$message.error(`撤回失败:${err?.message || '网络错误'}`)
} finally {
loading.close && loading.close()
}
},
/** 导出按钮操作 */
handleExport() {
this.download('/comprehensive/knzzZzqApply/export', {

View File

@@ -42,6 +42,7 @@
<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>
@@ -164,7 +165,58 @@
</el-dialog>
</div>
<!-- 修改数据弹窗 -->
<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.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.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.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.applyReason" type="textarea" />
</el-form-item>
<el-form-item label="申请材料">
<FileUpload v-model="editForm.applyFile" />
</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="handleEditSignSuccess">
<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>
</div>
</template>
<script>
@@ -175,7 +227,7 @@ import {getTokenKeySessionStorage as getToken} from '@/utils/auth'
import TufaApply from '@/views/comprehensive/knzzZzqApply/cpnt/TufaApply.vue'
import TufaLook from '@/views/comprehensive/knzzZzqApply/cpnt/TufaLook.vue'
import {listFdy as listView, doAudit, doMany} from '@/api/comprehensive/knzzZzqApply'
import {listFdy as listView, doAudit, doMany, doEdit, getKnzzZzqApply, updateKnzzZzqApply} from '@/api/comprehensive/knzzZzqApply'
import {getOwnSign} from '@/api/workstudy/post'
@@ -199,6 +251,23 @@ export default {
lookForm: {},
lookV: false,
editV: false,
editForm: {
id: null,
inTime: '',
helpHis: '',
majorRank: '',
majorNum: '',
isCph: '',
bxk: '',
jg: '',
classRank: '',
classNum: '',
applyReason: '',
applyFile: '',
applySign: ''
},
originalEditForm: {},
auditForm: {
fdySign: '',
@@ -388,6 +457,47 @@ export default {
this.lookV = true
},
async openEdit(row) {
const loading = fullLoading(this)
try {
const res = await getKnzzZzqApply(row.id)
if (res.code === 200) {
this.editForm = { ...res.data }
this.originalEditForm = { ...res.data }
this.editV = true
} else {
this.$message.error(res.msg || '获取详情失败')
}
} catch (e) {
this.$message.error('获取详情异常,请稍后重试')
} finally {
loading.close()
}
},
handleEditSignSuccess(response, file, fileList) {
this.editForm.applySign = response.fileName
this.upload.fileList = []
this.$forceUpdate()
},
async handleEditSave() {
const sdata = { ...this.editForm }
const loading = fullLoading(this)
try {
const res = await doEdit(sdata)
if (res.code == 200) {
this.$message.success('保存成功')
this.editV = false
this.getList()
} else {
this.$message.error(res.msg || '保存失败')
}
} catch (e) {
this.$message.error('保存异常,请稍后重试')
} finally {
loading.close()
}
},
changeAuditRes(v) {
switch (v) {
case '通过':

View File

@@ -325,14 +325,51 @@ export default {
return new Promise((resolve, reject) => {
reader.onload = (e) => {
let data = e.target.result
let workbook = XLSX.read(data, { //手动转化
type: 'binary'
let workbook = XLSX.read(data, {
type: 'array'
})
//获取json格式的Excel数据
let jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[workbook
.SheetNames[0]], {
defval: 'null' //单元格为空时的默认值
let ws = workbook.Sheets[workbook.SheetNames[0]]
let jsonData = XLSX.utils.sheet_to_json(ws, {
defval: '',
raw: false
})
const toDateString = (v) => {
const pad = (n) => (n < 10 ? '0' + n : '' + n)
const serialToDate = (s) => {
const epoch = Date.UTC(1899, 11, 30)
const day = Math.floor(s)
const ms = Math.round((s - day) * 86400000)
return new Date(epoch + day * 86400000 + ms)
}
if (v === null || v === undefined) return ''
if (typeof v === 'number') {
const d = serialToDate(v)
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
}
if (Object.prototype.toString.call(v) === '[object Date]') {
const d = v
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
}
if (typeof v === 'string') {
const s = v.replace(/\./g, '/').trim()
let m = s.match(/^(\d{4})[\/-](\d{1,2})[\/-](\d{1,2})$/)
if (m) return `${m[1]}-${pad(parseInt(m[2]))}-${pad(parseInt(m[3]))}`
m = s.match(/^(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})$/)
if (m) {
const y = m[3].length === 2 ? 2000 + parseInt(m[3]) : parseInt(m[3])
return `${y}-${pad(parseInt(m[1]))}-${pad(parseInt(m[2]))}`
}
return s
}
return ''
}
jsonData = jsonData.map(r => ({
...r,
'学生个人申请时间': toDateString(r['学生个人申请时间']),
'辅导员审核时间': toDateString(r['辅导员审核时间']),
'系书记审核时间': toDateString(r['系书记审核时间']),
'学院审核时间': toDateString(r['学院审核时间'])
}))
resolve(jsonData)
}
})

View File

@@ -16,6 +16,15 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="流程发起人" prop="startUserName">
<el-input
v-model="queryParams.startUserName"
placeholder="请输入发起人姓名"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
v-model="queryParams.startTime"
@@ -85,13 +94,11 @@
:show-overflow-tooltip="true"
/>
<el-table-column label="任务节点" align="center" prop="taskName" />
<!-- <el-table-column label="流程发起人" align="center">
<el-table-column label="流程发起人" align="center">
<template slot-scope="scope">
<label
>{{ scope.row.startUserName }} <el-tag type="info" size="mini">{{ scope.row.startDeptName }}</el-tag></label
>
<label>{{ scope.row.startUserName }} <el-tag type="info" size="mini">{{ scope.row.startDeptName }}</el-tag></label>
</template>
</el-table-column> -->
</el-table-column>
<el-table-column
label="接收时间"
align="center"
@@ -184,6 +191,7 @@ export default {
pageNum: 1,
pageSize: 10,
name: null,
startUserName: null,
category: null,
key: null,
tenantId: null,

View File

@@ -38,7 +38,7 @@
</el-form>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-col :span="1.5">
<el-button
type="primary"
plain
@@ -60,7 +60,7 @@
v-hasPermi="['system:deployment:remove']"
>删除</el-button
>
</el-col> -->
</el-col>
<right-toolbar
:show-search.sync="showSearch"
@queryTable="getList"

View File

@@ -4,6 +4,9 @@
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable size="small" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="流程发起人" prop="startUserName">
<el-input v-model="queryParams.startUserName" placeholder="请输入发起人姓名" clearable size="small" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="开始时间" prop="deployTime">
<el-date-picker v-model="queryParams.deployTime" clearable size="small" type="date" value-format="yyyy-MM-dd" placeholder="选择时间" />
</el-form-item>
@@ -78,6 +81,7 @@ export default {
pageNum: 1,
pageSize: 10,
name: null,
startUserName: null,
category: null,
},
// 表单参数

View File

@@ -287,8 +287,9 @@
<tr>
<td colspan="6" style="padding:0px;">
<!-- 动态表格打印时隐藏 -->
<el-table style="width:100%" :data="formData.jtcyObj" width="100%" :border="true"
align="center" element-loading-text="数据加载中..."
align="center" element-loading-text="数据加载中..." class="family-table-dynamic"
>
<el-table-column label="姓名" header-align="center">
<template slot-scope="{ row, $index }">
@@ -394,9 +395,47 @@
</template>
</el-table-column>
</el-table>
<div style="padding:10px;">
<el-button v-if="!xsEditDisable" type="text" @click="handleAddRow">新增一行</el-button>
</div>
<!-- 静态表格打印时显示 -->
<table class="family-table-static" style="width:100%; border-collapse: collapse; display:none;">
<colgroup>
<col style="width: 120px">
<col style="width: 50px">
<col style="width: 80px">
<col style="width: 340px">
<col style="width: 150px">
<col style="width: 120px">
<col style="width: 120px">
<col style="width: 100px">
</colgroup>
<thead>
<tr style="background-color: #f5f5f5;">
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">姓名</th>
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">年龄</th>
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">与本人关系</th>
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">学习或工作单位</th>
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">联系电话</th>
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">职业</th>
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">年收入</th>
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">健康状况</th>
</tr>
</thead>
<tbody>
<tr v-for="(row, index) in formData.jtcyObj" :key="index">
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.xm }}</td>
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.nl }}</td>
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.gx }}</td>
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.dw }}</td>
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.lxdh }}</td>
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.zy }}</td>
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.nsr }}</td>
<td style="border: 1px solid #000; padding: 8px; text-align: center;">{{ row.jkzk }}</td>
</tr>
<tr v-if="!formData.jtcyObj || formData.jtcyObj.length === 0">
<td colspan="8" style="border: 1px solid #000; padding: 8px; text-align: center;">暂无家庭成员信息</td>
</tr>
</tbody>
</table>
<el-button v-if="!xsEditDisable" style="margin: 10px;" type="text" @click="handleAddRow">新增一行</el-button>
</td>
</tr>
<!-- 申请理由 -->
@@ -715,7 +754,7 @@
<div id="print">
<table v-loading="tableLoading" class="full-width">
<table v-loading="tableLoading" class="full-width" style="margin-left:30px;">
<tr>
<td colspan="6" style="border:0px">
<h1>广西水利电力职业技术学院</h1>
@@ -904,61 +943,69 @@
<el-table style="width:100%" :data="formData.jtcyObj" width="100%" :border="true"
align="center" element-loading-text="数据加载中..."
>
<el-table-column label="姓名" header-align="center" min-width="120">
<el-table-column label="姓名" header-align="center" min-width="100">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].xm'" :rules="rules">
<el-input v-model="row.xm" :disabled="xsEditDisable" placeholder="请输入姓名" />
{{row.xm}}
<!-- <el-input v-model="row.xm" :disabled="xsEditDisable" placeholder="请输入姓名" /> -->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="年龄" header-align="center" min-width="60">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].nl'" :rules="rules">
<el-input v-model="row.nl" :disabled="xsEditDisable" placeholder="年龄" />
{{row.nl}}
<!-- <el-input v-model="row.nl" :disabled="xsEditDisable" placeholder="年龄" /> -->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="与本人关系" header-align="center" min-width="120">
<el-table-column label="与本人关系" header-align="center" min-width="80">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].gx'" :rules="rules">
<el-input v-model="row.gx" :disabled="xsEditDisable" placeholder="与本人关系" />
{{row.gx}}
<!-- <el-input v-model="row.gx" :disabled="xsEditDisable" placeholder="与本人关系" /> -->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="学习或工作单位" header-align="center" min-width="210">
<el-table-column label="学习或工作单位" header-align="center" min-width="300">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].dw'" :rules="rules">
<el-input v-model="row.dw" :disabled="xsEditDisable" placeholder="学习或工作单位" />
{{row.dw}}
<!-- <el-input v-model="row.dw" :disabled="xsEditDisable" placeholder="学习或工作单位" /> -->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="联系电话" header-align="center" min-width="150">
<el-table-column label="联系电话" header-align="center" min-width="120">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].lxdh'" :rules="rules">
<el-input v-model="row.lxdh" :disabled="xsEditDisable" placeholder="联系电话" />
{{row.lxdh}}
<!-- <el-input v-model="row.lxdh" :disabled="xsEditDisable" placeholder="联系电话" /> -->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="职业" header-align="center" min-width="120">
<el-table-column label="职业" header-align="center" min-width="100">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].zy'" :rules="rules">
<el-input v-model="row.zy" :disabled="xsEditDisable" placeholder="职业" />
{{row.zy}}
<!-- <el-input v-model="row.zy" :disabled="xsEditDisable" placeholder="职业" /> -->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="年收入" header-align="center" min-width="120">
<el-table-column label="年收入" header-align="center" min-width="100">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].nsr'" :rules="rules">
<el-input v-model="row.nsr" :disabled="xsEditDisable" placeholder="年收入" />
{{row.nsr}}
<!-- <el-input v-model="row.nsr" :disabled="xsEditDisable" placeholder="年收入" /> -->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="健康状况" header-align="center" min-width="100">
<el-table-column label="健康状况" header-align="center" min-width="90">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].jkzk'" :rules="rules">
<el-input v-model="row.jkzk" :disabled="xsEditDisable" placeholder="健康状况" />
{{row.jkzk}}
<!-- <el-input v-model="row.jkzk" :disabled="xsEditDisable" placeholder="健康状况" /> -->
</el-form-item>
</template>
</el-table-column>
@@ -969,9 +1016,7 @@
</el-table-column>
</el-table>
<div style="padding:10px;">
<el-button v-if="!xsEditDisable" type="text" @click="handleAddRow">新增一行</el-button>
</div>
<el-button v-if="!xsEditDisable" style="margin: 10px;" type="text" @click="handleAddRow">新增一行</el-button>
</td>
</tr>
@@ -1090,10 +1135,10 @@
</div>
<div class="newsign">
<span>
<img v-if="formData.xxqm" :src="baseurl + formData.xxqm" class="signature-img">
<!-- <img v-if="formData.xxqm" :src="baseurl + formData.xxqm" class="signature-img"> -->
</span>
<span style="width:150px;">
<span> {{ formData.xxmc }}</span>
<!-- <span> {{ formData.xxmc }}</span> -->
<!-- <span> {{ formData.xxgh }}</span><br> -->
<span>{{ this.formData.deptTime }}</span>
</span>
@@ -2362,8 +2407,9 @@ td {
}
:deep(.el-input.is-disabled .el-input__inner ){
background-color: #fff;
color: #000;
background-color: #fff !important;
color: #000 !important;
cursor: text !important;
}
.list .item span {
@@ -2521,4 +2567,61 @@ body {
}
/*去除页眉页脚*/
/* 打印时的样式控制 */
@media print {
/* 隐藏动态表格 */
.family-table-dynamic {
display: none !important;
}
/* 显示静态表格 */
.family-table-static {
display: table !important;
}
/* 确保静态表格边框清晰 */
.family-table-static td,
.family-table-static th {
border: 1px solid #000 !important;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}
/* 屏幕显示时隐藏静态表格 */
@media screen {
.family-table-static {
display: none !important;
}
}
/* 家庭成员表格样式调整 - 更具体的选择器 */
:deep(.el-table .el-input.is-disabled .el-input__inner),
:deep(.el-table .el-form-item.is-disabled .el-input__inner) {
background-color: #fff !important;
color: #000 !important;
cursor: text !important;
border-color: #dcdfe6 !important;
}
/* 确保表格中的文本是黑色 */
:deep(.el-table .cell),
:deep(.el-table .el-form-item__content),
:deep(.el-table .el-input__inner) {
color: #000 !important;
}
/* 表格输入框样式 */
:deep(.el-table input.el-input__inner) {
color: #000 !important;
background-color: #fff !important;
}
/* 覆盖所有禁用状态的样式 */
:deep(.el-table .is-disabled .el-input__inner) {
background-color: #fff !important;
color: #000 !important;
border-color: #dcdfe6 !important;
}
</style>

View File

@@ -239,7 +239,7 @@
<tr>
<td colspan="6" style="padding:0px;">
<el-table
<el-table class="family-table"
style="width:100%"
:data="formData.jtcyObj"
width="100%"
@@ -273,7 +273,7 @@
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].dw'" :rules="rules">
<el-input v-model="row.dw" :disabled="xsEditDisable" placeholder="学习或工作单位" />
<div class="print-only">{{ row.dw }}</div>
</el-form-item>
</template>
</el-table-column>
@@ -372,7 +372,7 @@
<!-- 班级意见 -->
<tr>
<td class="table-label">班级意见</td>
<td class="table-input" style="text-align:left;" colspan="5">
<td class="table-input school-opinion" style="text-align:left;" colspan="5">
<div tyle="display: flex; justify-content: space-between;">
<div>
@@ -690,19 +690,27 @@ export default {
//打印
printobj:{
id: 'apply',
popTitle: '打印', // 打印配置页上方标题
extraHead: '', //最上方的头部文字附加在head标签上的额外标签,使用逗号分隔
preview: '', // 是否启动预览模式默认是false开启预览模式可以先预览后打印
previewTitle: '', // 打印预览的标题(开启预览模式后出现),
previewPrintBtnLabel: '', // 打印预览的标题的下方按钮文本,点击可进入打印(开启预览模式后出现)
zIndex: '', // 预览的窗口的z-index默认是 20002此值要高一些这涉及到预览模式是否显示在最上面
previewBeforeOpenCallback() {}, //预览窗口打开之前的callback开启预览模式调用
previewOpenCallback() {}, // 预览窗口打开之后的callback开启预览模式调用
popTitle: '打印',
extraHead: '<style>@media print{ #apply .newSign img.signature-img{display:inline!important;} #apply .newSign .signature-tip{display:inline!important;} #apply .newSign > div:first-child span{display:inline!important;} #apply .school-opinion img.signature-img{display:none!important;} #apply .school-opinion .signature-tip{display:none!important;} #apply .school-opinion .newSign > div:first-child{display:none!important;} }</style>',
preview: '',
previewTitle: '',
previewPrintBtnLabel: '',
zIndex: '',
previewBeforeOpenCallback() {},
previewOpenCallback() {},
beforeOpenCallback() {
}, // 开启打印前的回调事件
openCallback() {}, // 调用打印之后的回调事件
closeCallback() {}, //关闭打印的回调事件(无法确定点击的是确认还是取消)
const op = document.querySelector('#apply .school-opinion');
if(op){
const img = op.querySelector('img.signature-img');
if(img){ img.style.display = 'none'; }
const tip = op.querySelector('.signature-tip');
if(tip){ tip.style.display = 'none'; }
const nameDiv = op.querySelector('.newSign > div:first-child');
if(nameDiv){ nameDiv.style.display = 'none'; }
}
},
openCallback() {},
closeCallback() {},
url: '',
standard: '',
extraCss: '',
@@ -1271,6 +1279,7 @@ export default {
width: 240px;
padding: 8px 4px;
}
.print-only{ display:none; }
.table-input>>>.el-input__inner{
padding-right: 0;
}
@@ -1321,6 +1330,36 @@ export default {
border-width: 0px;
}
/* 打印专用:家庭成员情况与困难认定一致 */
@media print {
#apply /deep/ .family-table{ width:100% !important; box-sizing:border-box; }
#apply>>>.family-table{ width:100% !important; box-sizing:border-box; }
#apply /deep/ .family-table .el-table__cell{ background:#fff !important; color:#000 !important; font-size:16px; overflow:visible !important; text-overflow:clip !important; }
#apply>>>.family-table .el-table__cell{ background:#fff !important; color:#000 !important; font-size:16px; overflow:visible !important; text-overflow:clip !important; }
#apply /deep/ .family-table th.el-table__cell{ background:#fff !important; color:#000 !important; }
#apply>>>.family-table th.el-table__cell{ background:#fff !important; color:#000 !important; }
#apply /deep/ .family-table .el-input__inner{ width:100% !important; padding:0 6px !important; border:0 !important; box-shadow:none !important; background:#fff !important; color:#000 !important; white-space:nowrap !important; }
#apply>>>.family-table .el-input__inner{ width:100% !important; padding:0 6px !important; border:0 !important; box-shadow:none !important; background:#fff !important; color:#000 !important; white-space:nowrap !important; }
/* 学习或工作单位:打印纯文本自动换行 */
#apply /deep/ .family-table td:nth-child(4) .el-input{ display:none !important; }
#apply /deep/ .family-table td:nth-child(4) .print-only{ display:block !important; white-space:normal !important; word-break:break-word !important; line-height:1.6; }
#apply>>>.family-table td:nth-child(4) .el-input{ display:none !important; }
#apply>>>.family-table td:nth-child(4) .print-only{ display:block !important; white-space:normal !important; word-break:break-word !important; line-height:1.6; }
/* 列宽分配与右侧边框修复 */
#apply /deep/ .family-table colgroup col:nth-child(1){ width:100px !important; min-width:100px !important; }
#apply /deep/ .family-table colgroup col:nth-child(2){ width:60px !important; min-width:60px !important; }
#apply /deep/ .family-table colgroup col:nth-child(3){ width:110px !important; min-width:110px !important; }
#apply /deep/ .family-table colgroup col:nth-child(4){ width:280px !important; min-width:280px !important; }
#apply /deep/ .family-table colgroup col:nth-child(5){ width:180px !important; min-width:180px !important; }
#apply /deep/ .family-table colgroup col:nth-child(6){ width:90px !important; min-width:90px !important; }
#apply /deep/ .family-table colgroup col:nth-child(7){ width:100px !important; min-width:100px !important; }
#apply /deep/ .family-table colgroup col:nth-child(8){ width:90px !important; min-width:90px !important; }
#apply>>>.family-table .el-table__header-wrapper th:last-child{ border-right:1px solid #000 !important; }
#apply>>>.family-table .el-table__body-wrapper td:last-child{ border-right:1px solid #000 !important; }
}
/* 表单样式统一 */
/deep/ .el-form-item{
margin-bottom: 0;
@@ -1451,4 +1490,4 @@ export default {
line-height: 17px;
color: red;
}
</style>
</style>

View File

@@ -94,24 +94,46 @@
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<!-- <template slot-scope="scope">
<el-button type="primary" icon="el-icon-edit" plain @click="handleUpdate(scope.row)"
size="small">编辑</el-button>
<el-button type="primary" icon="el-icon-edit" plain @click="handleUpdate(scope.row)"
size="small">编辑</el-button>
</template> -->
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">详情</el-button>
<el-button v-if="scope.row.step >= 3 " size="mini" type="text" icon="el-icon-delete" @click="handleRevoke(scope.row)">撤回</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="openEditSqly(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
class="edit-reason-dialog"
title="修改申请信息"
:visible.sync="editReasonVisible"
width="700px"
:close-on-click-modal="false"
append-to-body
>
<el-form :model="editReasonForm" label-width="160px">
<el-form-item label="具体时间、内容及涉及金额等情况">
<el-input class="with-border" v-model="editReasonForm.tfsj" type="textarea" :rows="4" placeholder="请输入具体时间、内容及涉及金额等情况" />
</el-form-item>
<el-form-item label="申请理由">
<el-input class="with-border" v-model="editReasonForm.sqly" type="textarea" :rows="6" placeholder="请输入申请理由" />
</el-form-item>
</el-form>
<div slot="footer">
<el-button @click="editReasonVisible=false">取消</el-button>
<el-button type="primary" :loading="editReasonLoading" @click="submitEditSqly">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {list} from '@/api/stuYear/index'
import { fdyRevoke } from '@/api/zxj/poverty/apply'
import { addApply, delApply, listFdy as listApply, updateApply } from '@/api/zxj/poverty/applyjl'
import { fdyRevoke, fdySave } from '@/api/zxj/poverty/apply'
import { addApply, delApply, listFdy as listApply, getApply } from '@/api/zxj/poverty/applyjl'
export default {
name: 'Apply',
data() {
@@ -153,6 +175,9 @@ export default {
title: '',
// 是否显示弹出层
open: false,
editReasonVisible: false,
editReasonLoading: false,
editReasonForm: { id: null, sqly: '', tfsj: '' },
// 查询参数
queryParams: {
pageNum: 1,
@@ -363,6 +388,49 @@ export default {
})
.catch(() => {})
},
openEditSqly(row) {
// 先使用列表行数据进行预填充,确保立即可见
this.editReasonForm = {
id: row.id,
sqly: (row.sqly || ''),
tfsj: (row.tfsj2 || row.tfsj || '')
}
this.editReasonVisible = true
// 再异步获取详细数据进行刷新
this.editReasonLoading = true
getApply(row.id).then(res => {
const data = res && res.data ? res.data : {}
this._fullApplyData = data
this.editReasonForm = {
id: data.id || row.id,
sqly: (data.sqly || this.editReasonForm.sqly || ''),
tfsj: (data.tfsj2 || data.tfsj || this.editReasonForm.tfsj || '')
}
this.editReasonLoading = false
}).catch(() => { this.editReasonLoading = false })
},
submitEditSqly() {
const payload = { id: this.editReasonForm.id, sqly: this.editReasonForm.sqly, tfsj2: this.editReasonForm.tfsj }
this.editReasonLoading = true
fdySave(payload)
.then((res) => {
this.editReasonLoading = false
const ok = !res || (res.code !== 500)
if (ok) {
this.editReasonVisible = false
this.$message.success('已更新申请理由')
this.getList()
} else {
const msg = res.msg || '操作失败'
this.$message.error(msg)
}
})
.catch((err) => {
this.editReasonLoading = false
const msg = (err && err.message) || '操作失败'
this.$message.error(msg)
})
},
/** 导出按钮操作 */
handleExport() {
this.download(
@@ -376,3 +444,8 @@ export default {
},
}
</script>
<style scoped>
.edit-reason-dialog >>> .el-textarea__inner { border: 1px solid #dcdfe6 !important; box-shadow: none !important; border-radius: 4px; }
.edit-reason-dialog >>> .with-border .el-textarea__inner { border: 1px solid #606266 !important; }
.edit-reason-dialog >>> .el-input__inner { border: 1px solid #dcdfe6 !important; }
</style>

View File

@@ -335,7 +335,7 @@
<div style="display: flex;align-items: center;">
<el-form-item prop="jtnsr">
<el-input v-model="income" type="number" placeholder="自动计算家庭年收入" disabled />
<el-input v-model="income" type="number" placeholder="自动计算家庭年收入" />
</el-form-item>
</div>
@@ -344,7 +344,7 @@
<td colspan="3">
<div style="display: flex;align-items: center;">
<el-form-item prop="rjnsr">
<el-input v-model="capita" type="number" placeholder="自动计算人均年收入" disabled />
<el-input v-model="capita" type="number" placeholder="自动计算人均年收入" />
</el-form-item>
</div>
@@ -782,7 +782,7 @@
</tr>
<tr>
<td style="padding:0px;" colspan="6">
<el-table :data="formData.jtcyObj" border style="width:100%" :row-class-name="handelIndex">
<el-table class="family-table" :data="formData.jtcyObj" border style="width:100%" :row-class-name="handelIndex">
<el-table-column prop="xm" label="姓名" align="center">
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].xm'" :rules="rules">
@@ -808,6 +808,7 @@
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].dw'">
<el-input v-model="row.dw" placeholder="工作(学习)单位" :disabled="formData.step > 2" />
<div class="print-only">{{ row.dw }}</div>
</el-form-item>
</template>
</el-table-column>
@@ -1048,7 +1049,7 @@
<!-- 学校认定意见 -->
<tr style="height:250px">
<td class="table-label">学校认定意见</td>
<td class="table-input" style="text-align:left;" colspan="5">
<td class="table-input school-opinion" style="text-align:left;" colspan="5">
<div tyle="display: flex; justify-content: space-between;">
<div>
经审查,本学年该同学
@@ -1061,7 +1062,6 @@
</div>
<div style="display: flex; justify-content: flex-end;margin-right: 10px;gap:10px;margin-top:66px;">
<span>
<img v-if="formData.xsqm" :src="baseurl+formData.xsqm" class="signature-img">
<span v-else class="signature-tip">签名</span>
@@ -1323,17 +1323,81 @@ import {mz_list} from '@/api/helpFunc'
printobj:{
id: 'print',
popTitle: '打印', // 打印配置页上方标题
extraHead: '', //最上方的头部文字,附加在head标签上的额外标签,使用逗号分隔
extraHead: '<style>@media print{ #print .school-opinion img.signature-img{display:none!important;} #print .school-opinion .signature-tip{display:none!important;} #print .school-opinion .newSign > div:first-child{display:none!important;} #print .school-opinion span > img.signature-img{display:none!important;} }</style>', //最上方的头部文字,附加在head标签上的额外标签,使用逗号分隔
preview: '', // 是否启动预览模式,默认是false(开启预览模式,可以先预览后打印)
previewTitle: '', // 打印预览的标题(开启预览模式出现),
previewTitle: '', // 打印预览的标题(开启预览模式出现),
previewPrintBtnLabel: '', // 打印预览的标题的下方按钮文本,点击可进入打印(开启预览模式后出现)
zIndex: '', // 预览的窗口的z-index,默认是 20002(此值要高一些,这涉及到预览模式是否显示在最上面)
previewBeforeOpenCallback() {}, //预览窗口打开之前的callback(开启预览模式调用)
previewOpenCallback() {}, // 预览窗口打开之后的callback(开启预览模式调用)
beforeOpenCallback() {
// 在打印前隐藏学校认定意见的签名和审核人信息,但保留日期
setTimeout(() => {
// 找到学校认定意见的区域
const schoolOpinion = document.querySelector('#print .school-opinion');
if (schoolOpinion) {
// 隐藏签名图片
const signatureImg = schoolOpinion.querySelector('img.signature-img');
if (signatureImg) {
signatureImg.style.display = 'none';
}
// 隐藏签名提示文字
const signatureTip = schoolOpinion.querySelector('.signature-tip');
if (signatureTip) {
signatureTip.style.display = 'none';
}
// 找到.newSign区域但只隐藏第一个div姓名保留第二个div日期
const newSignDiv = schoolOpinion.querySelector('.newSign');
if (newSignDiv) {
// 隐藏第一个div包含姓名
const nameDiv = newSignDiv.querySelector('div:first-child');
if (nameDiv) {
nameDiv.style.display = 'none';
}
// 保留第二个div包含日期不隐藏
// const dateDiv = newSignDiv.querySelector('div:last-child');
// dateDiv 保持显示
}
// 隐藏包含签名图片的span
const signatureSpan = schoolOpinion.querySelector('span > img.signature-img');
if (signatureSpan && signatureSpan.parentElement) {
signatureSpan.parentElement.style.display = 'none';
}
}
}, 100);
}, // 开启打印前的回调事件
openCallback() {}, // 调用打印之后的回调事件
openCallback() {
// 打印完成后恢复显示(只恢复我们隐藏的元素,不恢复日期)
setTimeout(() => {
const schoolOpinion = document.querySelector('#print .school-opinion');
if (schoolOpinion) {
// 只恢复签名图片
const signatureImg = schoolOpinion.querySelector('img.signature-img');
if (signatureImg) {
signatureImg.style.display = '';
}
// 只恢复签名提示文字
const signatureTip = schoolOpinion.querySelector('.signature-tip');
if (signatureTip) {
signatureTip.style.display = '';
}
// 只恢复姓名divnewSign中的第一个div
const nameDiv = schoolOpinion.querySelector('.newSign > div:first-child');
if (nameDiv) {
nameDiv.style.display = '';
}
// 注意:不恢复.newSign的display因为日期还在里面
// 只恢复我们具体隐藏的元素
}
}, 1000);
}, // 调用打印之后的回调事件
closeCallback() {}, //关闭打印的回调事件(无法确定点击的是确认还是取消)
url: '',
standard: '',
@@ -2723,6 +2787,7 @@ overflow: hidden;
justify-content: center;
align-content: center;
}
.print-only{ display: none; }
.reject /deep/ .el-input__inner{
border-width: 1px;
padding-left: 15px;
@@ -2734,7 +2799,7 @@ overflow: hidden;
}
#print{
text-align: left;
padding: 30px 60px 0px 40px ;
padding: 30px 30px 0px 30px ;
}
#print th{
padding: 2px;
@@ -2805,6 +2870,52 @@ overflow: hidden;
#print /deep/ .el-table td.el-table__cell{
border-bottom: 1px solid #000!important;
}
#print /deep/ .family-table .el-table__cell{
background-color: #fff !important;
color: #000 !important;
font-size: 16px;
}
#print /deep/ .family-table th.el-table__cell{
background-color: #fff !important;
color: #000 !important;
}
#print /deep/ .family-table .el-input.is-disabled .el-input__inner{
background-color: #fff !important;
color: #000 !important;
font-size: 16px;
}
@media print {
#print{ padding: 20px 20px 0 20px; }
#print /deep/ .family-table{ width: 100% !important; box-sizing: border-box; }
#print /deep/ .family-table .el-table__cell{
overflow: visible !important;
text-overflow: clip !important;
}
#print /deep/ .family-table .el-input__inner{
width: 100% !important;
padding: 0 6px !important;
border: 0 !important;
box-shadow: none !important;
background: #fff !important;
color: #000 !important;
white-space: nowrap !important;
overflow: visible !important;
text-overflow: clip !important;
}
#print /deep/ .family-table td:nth-child(4) .el-input{ display: none !important; }
#print /deep/ .family-table td:nth-child(4) .print-only{ display: block !important; white-space: normal !important; word-break: break-word !important; line-height: 1.6; }
#print /deep/ .family-table colgroup col:nth-child(1){ width: 100px !important; min-width: 100px !important; }
#print /deep/ .family-table colgroup col:nth-child(2){ width: 60px !important; min-width: 60px !important; }
#print /deep/ .family-table colgroup col:nth-child(3){ width: 90px !important; min-width: 90px !important; }
#print /deep/ .family-table colgroup col:nth-child(4){ width: 280px !important; min-width: 280px !important; }
#print /deep/ .family-table colgroup col:nth-child(5){ width: 180px !important; min-width: 180px !important; }
#print /deep/ .family-table colgroup col:nth-child(6){ width: 80px !important; min-width: 80px !important; }
#print /deep/ .family-table colgroup col:nth-child(7){ width: 90px !important; min-width: 90px !important; }
#print /deep/ .family-table colgroup col:nth-child(8){ width: 80px !important; min-width: 80px !important; }
#print /deep/ .family-table .el-table__header-wrapper th:last-child{ border-right: 1px solid #000 !important; }
#print /deep/ .family-table .el-table__body-wrapper td:last-child{ border-right: 1px solid #000 !important; }
#print /deep/ .family-table .el-table__body td:nth-child(4) .el-input__inner{ white-space: normal !important; }
}
.split{
height: 50px;
color: #fff;

View File

@@ -341,7 +341,7 @@
<tr>
<td class="table-label">家庭成员情况</td>
<td colspan="7" style="padding:0px;">
<el-table
<el-table class="family-table"
style="width:100%"
:data="formData.jtcyObj"
width="100%"
@@ -375,6 +375,7 @@
<template slot-scope="{ row, $index }">
<el-form-item label-width="0px" :prop="'jtcyObj[' + $index +'].dw'" :rules="rules">
<el-input v-model="row.dw" placeholder="学习或工作单位" />
<div class="print-only">{{ row.dw }}</div>
</el-form-item>
</template>
@@ -962,14 +963,46 @@ export default {
flex-direction: row;
justify-content: space-between;
}
.class-info div span{
.class-info div span{
line-height: 25px;
}
.print-only{ display:none; }
/* 输入样式统一 */
/deep/ .el-input__inner{
border-width: 0px;
}
/* 打印专用:家庭成员情况与困难认定一致 */
@media print {
#apply /deep/ .family-table{ width:100% !important; box-sizing:border-box; }
#apply>>>.family-table{ width:100% !important; box-sizing:border-box; }
#apply /deep/ .family-table .el-table__cell{ background:#fff !important; color:#000 !important; font-size:16px; overflow:visible !important; text-overflow:clip !important; }
#apply>>>.family-table .el-table__cell{ background:#fff !important; color:#000 !important; font-size:16px; overflow:visible !important; text-overflow:clip !important; }
#apply /deep/ .family-table th.el-table__cell{ background:#fff !important; color:#000 !important; }
#apply>>>.family-table th.el-table__cell{ background:#fff !important; color:#000 !important; }
#apply /deep/ .family-table .el-input__inner{ width:100% !important; padding:0 6px !important; border:0 !important; box-shadow:none !important; background:#fff !important; color:#000 !important; white-space:nowrap !important; }
#apply>>>.family-table .el-input__inner{ width:100% !important; padding:0 6px !important; border:0 !important; box-shadow:none !important; background:#fff !important; color:#000 !important; white-space:nowrap !important; }
/* 学习或工作单位:打印纯文本自动换行 */
#apply /deep/ .family-table td:nth-child(4) .el-input{ display:none !important; }
#apply /deep/ .family-table td:nth-child(4) .print-only{ display:block !important; white-space:normal !important; word-break:break-word !important; line-height:1.6; }
#apply>>>.family-table td:nth-child(4) .el-input{ display:none !important; }
#apply>>>.family-table td:nth-child(4) .print-only{ display:block !important; white-space:normal !important; word-break:break-word !important; line-height:1.6; }
/* 列宽分配与右侧边框修复 */
#apply /deep/ .family-table colgroup col:nth-child(1){ width:100px !important; min-width:100px !important; }
#apply /deep/ .family-table colgroup col:nth-child(2){ width:60px !important; min-width:60px !important; }
#apply /deep/ .family-table colgroup col:nth-child(3){ width:110px !important; min-width:110px !important; }
#apply /deep/ .family-table colgroup col:nth-child(4){ width:280px !important; min-width:280px !important; }
#apply /deep/ .family-table colgroup col:nth-child(5){ width:180px !important; min-width:180px !important; }
#apply /deep/ .family-table colgroup col:nth-child(6){ width:90px !important; min-width:90px !important; }
#apply /deep/ .family-table colgroup col:nth-child(7){ width:100px !important; min-width:100px !important; }
#apply /deep/ .family-table colgroup col:nth-child(8){ width:90px !important; min-width:90px !important; }
#apply>>>.family-table .el-table__header-wrapper th:last-child{ border-right:1px solid #000 !important; }
#apply>>>.family-table .el-table__body-wrapper td:last-child{ border-right:1px solid #000 !important; }
}
/* 表单样式统一 */
/deep/ .el-form-item{
margin-bottom: 0;
@@ -1080,4 +1113,4 @@ export default {
padding: 10px;
}
</style>
</style>

View File

@@ -621,7 +621,7 @@
<tr>
<td class="table-label">家庭成员情况</td>
<td colspan="7" style="padding: 0px">
<el-table
<el-table class="family-table"
style="width: 100%"
:data="formData.jtcyObj"
width="100%"
@@ -698,6 +698,7 @@
v-model="row.dw"
placeholder="学习或工作单位"
/>
<div class="print-only">{{ row.dw }}</div>
</el-form-item>
</template>
</el-table-column>
@@ -1166,6 +1167,7 @@ export default {
border-radius: 3px;
transition: 0.2s;
}
.print-only{ display:none; }
.source {
text-align: center;
}
@@ -1241,6 +1243,37 @@ td {
/deep/ .el-input__inner {
border-width: 0px;
}
/* 打印专用样式:统一为困难认定效果 */
@media print {
#apply /deep/ .family-table{ width:100% !important; box-sizing:border-box; }
#apply>>>.family-table{ width:100% !important; box-sizing:border-box; }
#apply /deep/ .family-table .el-table__cell{ background:#fff !important; color:#000 !important; font-size:16px; overflow:visible !important; text-overflow:clip !important; }
#apply>>>.family-table .el-table__cell{ background:#fff !important; color:#000 !important; font-size:16px; overflow:visible !important; text-overflow:clip !important; }
#apply /deep/ .family-table th.el-table__cell{ background:#fff !important; color:#000 !important; }
#apply>>>.family-table th.el-table__cell{ background:#fff !important; color:#000 !important; }
#apply /deep/ .family-table .el-input__inner{ width:100% !important; padding:0 6px !important; border:0 !important; box-shadow:none !important; background:#fff !important; color:#000 !important; white-space:nowrap !important; }
#apply>>>.family-table .el-input__inner{ width:100% !important; padding:0 6px !important; border:0 !important; box-shadow:none !important; background:#fff !important; color:#000 !important; white-space:nowrap !important; }
/* 学习或工作单位:打印纯文本自动换行 */
#apply /deep/ .family-table td:nth-child(4) .el-input{ display:none !important; }
#apply /deep/ .family-table td:nth-child(4) .print-only{ display:block !important; white-space:normal !important; word-break:break-word !important; line-height:1.6; }
#apply>>>.family-table td:nth-child(4) .el-input{ display:none !important; }
#apply>>>.family-table td:nth-child(4) .print-only{ display:block !important; white-space:normal !important; word-break:break-word !important; line-height:1.6; }
/* 列宽分配与右侧边框修复 */
#apply /deep/ .family-table colgroup col:nth-child(1){ width:100px !important; min-width:100px !important; }
#apply /deep/ .family-table colgroup col:nth-child(2){ width:60px !important; min-width:60px !important; }
#apply /deep/ .family-table colgroup col:nth-child(3){ width:110px !important; min-width:110px !important; }
#apply /deep/ .family-table colgroup col:nth-child(4){ width:280px !important; min-width:280px !important; }
#apply /deep/ .family-table colgroup col:nth-child(5){ width:180px !important; min-width:180px !important; }
#apply /deep/ .family-table colgroup col:nth-child(6){ width:90px !important; min-width:90px !important; }
#apply /deep/ .family-table colgroup col:nth-child(7){ width:100px !important; min-width:100px !important; }
#apply /deep/ .family-table colgroup col:nth-child(8){ width:90px !important; min-width:90px !important; }
#apply>>>.family-table .el-table__header-wrapper th:last-child{ border-right:1px solid #000 !important; }
#apply>>>.family-table .el-table__body-wrapper td:last-child{ border-right:1px solid #000 !important; }
}
/* 表单样式统一 */
/deep/ .el-form-item {
margin-bottom: 0;

View File

@@ -210,6 +210,13 @@
@click="handleDelete(scope.row)"
v-hasPermi="['system:record:remove']"
>删除</el-button> -->
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="openEditSqly(scope.row)"
>修改申请理由</el-button>
</template>
</el-table-column>
</el-table>
@@ -920,13 +927,32 @@
<el-button @click="cancel">关闭</el-button>
</div>
</el-dialog>
<el-dialog
class="edit-reason-dialog"
title="修改申请理由"
:visible.sync="editReasonVisible"
width="600px"
:close-on-click-modal="false"
append-to-body
>
<el-form :model="editReasonForm" label-width="90px">
<el-form-item label="申请理由">
<el-input class="with-border" v-model="editReasonForm.sqly" type="textarea" :rows="6" placeholder="请输入申请理由" />
</el-form-item>
</el-form>
<div slot="footer">
<el-button @click="editReasonVisible=false">取消</el-button>
<el-button type="primary" :loading="editReasonLoading" @click="submitEditSqly">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {list} from '@/api/stuYear/index'
import { listFdyView } from '@/api/zxj/record'
import { revoke } from '@/api/zxj/apply'
import { revoke, updateApply, getApply, updateSqly } from '@/api/zxj/apply'
import { listRecord } from '@/api/zxj/record'
export default {
name: 'Record',
@@ -968,6 +994,9 @@ export default {
title: '',
// 是否显示弹出层
open: false,
editReasonVisible: false,
editReasonLoading: false,
editReasonForm: { id: null, sqly: '' },
// 查询参数
queryParams: {
pageNum: 1,
@@ -983,7 +1012,7 @@ export default {
printobj: {
id: 'apply',
popTitle: '打印', // 打印配置页上方标题
extraHead: '', //最上方的头部文字附加在head标签上的额外标签,使用逗号分隔
extraHead: '<style>@media print{ #apply .signature{display:none!important;} #apply .signature img{display:none!important;} }</style>', //最上方的头部文字附加在head标签上的额外标签,使用逗号分隔
preview: '', // 是否启动预览模式默认是false开启预览模式可以先预览后打印
previewTitle: '', // 打印预览的标题(开启预览模式后出现),
previewPrintBtnLabel: '', // 打印预览的标题的下方按钮文本,点击可进入打印(开启预览模式后出现)
@@ -1144,6 +1173,42 @@ export default {
})
.catch(() => {})
},
openEditSqly(row) {
this.editReasonLoading = true
getApply(row.id).then(res => {
const data = res.data || {}
this.editReasonForm = {
id: data.id,
sqly: data.sqly || ''
}
// 备份完整对象用于提交
this._fullApplyData = data
this.editReasonVisible = true
this.editReasonLoading = false
}).catch(() => { this.editReasonLoading = false })
},
submitEditSqly() {
const payload = { id: this.editReasonForm.id, sqly: this.editReasonForm.sqly }
this.editReasonLoading = true
updateSqly(payload)
.then((res) => {
this.editReasonLoading = false
const ok = res && res.code !== 500
if (ok) {
this.editReasonVisible = false
this.$modal && this.$modal.msgSuccess ? this.$modal.msgSuccess('已更新申请理由') : this.$message.success('已更新申请理由')
this.getList()
} else {
const msg = (res && res.msg) || '操作失败'
this.$message.error(msg)
}
})
.catch((err) => {
this.editReasonLoading = false
const msg = (err && err.message) || '操作失败'
this.$message.error(msg)
})
},
/** 修改按钮操作 */
handleDetail(row) {
const nid = row.id || this.ids
@@ -1249,6 +1314,10 @@ td {
.bj >>> .el-input .el-input__inner {
width: 255px;
}
@media print {
#apply .signature { display: none !important; }
#apply .signature img { display: none !important; }
}
.class-info >>> .el-input__inner {
padding: 0px 10px;
text-align: right;
@@ -1406,3 +1475,16 @@ td {
border-width: 1px;
}
</style>
.edit-reason-dialog >>> .el-textarea__inner {
border: 1px solid #dcdfe6 !important;
box-shadow: none !important;
border-radius: 4px;
}
.edit-reason-dialog >>> .el-input__inner {
border: 1px solid #dcdfe6 !important;
box-shadow: none !important;
border-radius: 4px;
}
.edit-reason-dialog >>> .with-border .el-textarea__inner {
border: 1px solid #606266 !important;
}

View File

@@ -189,7 +189,7 @@
</el-form-item>
<el-form-item label="服务学生人次" prop="stuNumber">
<!-- <el-input v-model="form.stuNumber" placeholder="请输入服务学生人次" /> -->
<el-input-number v-model="form.stuNumber" :min="1" :max="200" label="请输入服务学生人次" style="width: 100%" />
<el-input-number v-model="form.stuNumber" :min="1" label="请输入服务学生人次" style="width: 100%" />
</el-form-item>
<el-form-item label="活动照片" prop="activityPhoto">
<image-upload v-model="form.activityPhoto" />
@@ -198,7 +198,7 @@
<Affix v-model="form.activityPackage" @input="handleAffix" />
</el-form-item>
</el-form>
<div v-if="title === '审核' || title === '添加一站式社区模块:社区建设' || title === '修改'" slot="footer" class="dialog-footer">
<div v-if="title === '审核' || title === '添加社区建设' || title === '修改'" slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
@@ -407,7 +407,7 @@ export default {
handleAdd() {
this.reset()
this.open = true
this.title = '添加一站式社区模块:社区建设'
this.title = '添加社区建设'
// 延迟验证规则的生效
this.$nextTick(() => {

View File

@@ -43,6 +43,9 @@
<el-button type="text" size="mini" icon="el-icon-view"
@click="auditVClick(scope.row)"
>查看详情</el-button>
<el-button v-if="scope.row.applyStatus !== '1'" type="text" size="mini" icon="el-icon-refresh-left"
@click="handleRevoke(scope.row)"
>撤回</el-button>
</template>
</el-table-column>
</el-table>
@@ -273,7 +276,7 @@ import {
import { listOwnClass } from '@/api/stuCQS/info-fill/stu_eva_task'
import { listAllYear as listYear } from '@/api/stuCQS/basedata/year'
import { listSelect } from '@/api/stuCQS/lake/type'
import { listFdyAll, fdyAudit, fdyExport } from '@/api/stuCQS/lake/apply'
import { listFdyAll, fdyAudit, fdyExport, updateLakeapply } from '@/api/stuCQS/lake/apply'
import * as XLSX from 'xlsx'
import { workbook2blob, openDownloadDialog } from '@/api/helpFunc'
@@ -535,6 +538,30 @@ export default {
this.auditForm = { ...v }
this.auditV = true
},
async handleRevoke(row) {
this.$confirm('确定要撤回该申请吗?撤回后申请状态将变为"已提交待辅导员审核"', '撤回确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.loading = true
try {
let res = await updateLakeapply({ id: row.id, applyStatus: '1' })
this.loading = false
if (res.code == 200) {
this.$message.success('撤回成功')
this.getList()
} else {
this.$message.error(res.msg || '撤回失败')
}
} catch (error) {
this.loading = false
this.$message.error('撤回失败,请稍后重试')
}
}).catch(() => {
this.$message.info('已取消撤回')
})
},
async countStuIam() {
let stuNo = this.auditForm.stuNo
let res = await countStuIam(stuNo)
@@ -620,4 +647,4 @@ export default {
margin-bottom: 0px;
}
}
</style>
</style>

View File

@@ -100,6 +100,9 @@
/>
</el-select>
</el-form-item>
<el-form-item label="职称" prop="professionalTitle" style="margin-left: 80px;">
<el-input v-model="form.professionalTitle" placeholder="请输入职称" />
</el-form-item>
<br>
<el-form-item label="参加工作时间" prop="joinWorkHours">
<el-input v-model="form.joinWorkHours" placeholder="请输入参加工作时间" />
@@ -125,62 +128,14 @@
<el-input v-model="form.email" placeholder="请输入电子邮箱" />
</el-form-item>
<el-divider content-position="center">带班情况</el-divider>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-plus" size="mini"
@click="handleAddSysTeacherTakeclass"
>添加</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" icon="el-icon-delete" size="mini"
@click="handleDeleteSysTeacherTakeclass"
>删除</el-button>
</el-col>
</el-row>
<el-table ref="sysTeacherTakeclass" :data="sysTeacherTakeclassList"
:row-class-name="rowSysTeacherTakeclassIndex" @selection-change="handleSysTeacherTakeclassSelectionChange"
:row-class-name="rowSysTeacherTakeclassIndex"
>
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="序号" align="center" prop="index" width="50" />
<el-table-column label="带班学院" prop="college" width="150">
<template slot-scope="scope">
<el-select v-model="scope.row.college" placeholder="请选择带班学院"
@change="getGrade(scope.row)"
>
<el-option v-for="item in collegeList" :key="item.label" :label="item.label"
:value="item.label"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="带班年级" prop="grade" width="150">
<template slot-scope="scope">
<el-select v-model="scope.row.grade" :disabled="scope.row.setGrade"
placeholder="请选择带班年级" @change="getClass(scope.row)"
>
<el-option v-for="item in gradeList" :label="item.gradeName"
:value="item.gradeName"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="带班班级" prop="classteam" width="150">
<template slot-scope="scope">
<el-select v-model="scope.row.classteam" :disabled="scope.row.setClass"
placeholder="请选择带班班级"
>
<el-option v-for="item in classList" :label="item.className"
:value="item.className"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="带班人数" prop="number" width="150">
<template slot-scope="scope">
<el-input v-model="scope.row.number" placeholder="请输入带班人数" />
</template>
</el-table-column>
<el-table-column label="序号" align="center" prop="index" width="60" />
<el-table-column label="学院" prop="deptName" width="180" />
<el-table-column label="专业" prop="majorName" width="200" />
<el-table-column label="班级" prop="className" width="200" />
<el-table-column label="总人数" prop="stuCount" width="120" />
</el-table>
</el-form>
@@ -278,7 +233,7 @@ import {
delAchievementcheck
} from '@/api/teacher/achievementcheck'
//获取学院、年级、班级信息
import { listClass, getClass, delClass, addClass, updateClass, getMajorsName } from '@/api/stuCQS/basedata/class'
import { listClass, getClass, delClass, addClass, updateClass, getMajorsName, listOwnClass } from '@/api/stuCQS/basedata/class'
import { listGrade, getGrade, queryGrade } from '@/api/stuCQS/basedata/grade'
import { getDeptName } from '@/api/system/dept'
export default {
@@ -454,6 +409,7 @@ export default {
level2units: null,
serviceHours: null,
jobNature: null,
professionalTitle: null,
joinWorkHours: null,
highestEducation: null,
educated: null,
@@ -466,33 +422,8 @@ export default {
},
// 表单参数
form: {},
// 表单校验
rules: {
teacherId: [{ validator: validateAwardTime, trigger: 'blur' }],
name: [{ validator: validateAwardTime, trigger: 'blur' }],
gender: [{ validator: validateAwardTime, trigger: 'blur' }],
birthday: [{ validator: validateAwardTime, trigger: 'blur' }],
nation: [{ validator: validateAwardTime, trigger: 'blur' }],
photo: [{ validator: validateAwardTime, trigger: 'blur' }],
political: [{ validator: validateAwardTime, trigger: 'blur' }],
wechat: [{ validator: validateWechat, trigger: 'blur' }],
address: [{ validator: validateAwardTime, trigger: 'blur' }],
identity: [{ validator: validateIdentity, trigger: 'blur' }],
qqnumber: [{ validator: validateQqnumber, trigger: 'blur' }],
marriage: [{ validator: validateAwardTime, trigger: 'blur' }],
anotherDuties: [{ validator: validateAwardTime, trigger: 'blur' }],
level2units: [{ validator: validateAwardTime, trigger: 'blur' }],
serviceHours: [{ validator: validateAwardTime, trigger: 'blur' }],
jobNature: [{ validator: validateAwardTime, trigger: 'blur' }],
joinWorkHours: [{ validator: validateAwardTime, trigger: 'blur' }],
highestEducation: [{ validator: validateAwardTime, trigger: 'blur' }],
educated: [{ validator: validateAwardTime, trigger: 'blur' }],
study: [{ validator: validateAwardTime, trigger: 'blur' }],
lastestEducation: [{ validator: validateAwardTime, trigger: 'blur' }],
awardingInstitutions: [{ validator: validateAwardTime, trigger: 'blur' }],
email: [{ validator: validateAwardTime, trigger: 'blur' }],
phone: [{ validator: validatePhone, trigger: 'blur' }],
},
// 表单校验(已按要求取消非必填校验)
rules: {},
collegeList: [],//学院列表
gradeList: [],//年级列表
classList: [],//班级列表
@@ -501,6 +432,7 @@ export default {
created() {
this.getList()
this.getUser()
this.getOwnClassList()
},
methods: {
/** 查询basicMessage列表 */
@@ -524,6 +456,19 @@ export default {
this.loading = false
})
},
// 从“我的班级”拉取带班信息列表
async getOwnClassList() {
try {
const res = await listOwnClass()
if (res && res.code === 200) {
this.sysTeacherTakeclassList = Array.isArray(res.rows)
? res.rows
: (Array.isArray(res.data) ? res.data : [])
}
} catch (e) {
// 忽略错误,保持页面可用
}
},
// 取消按钮
cancel() {
this.open = false
@@ -548,6 +493,7 @@ export default {
level2units: null,
serviceHours: null,
jobNature: null,
professionalTitle: null,
joinWorkHours: null,
highestEducation: null,
educated: null,
@@ -588,7 +534,6 @@ export default {
const teacherId = row.teacherId || this.ids
getBasicmessage(teacherId).then(response => {
this.form = response.data
this.sysTeacherTakeclassList = response.data.sysTeacherTakeclassList
this.open = true
this.title = '修改基础信息'
})
@@ -696,7 +641,6 @@ export default {
getBasicmessage(teacherIds).then(response => {
if (response.data != undefined) {
this.form = response.data
this.sysTeacherTakeclassList = response.data.sysTeacherTakeclassList
this.open = true
this.title = '修改基础信息'
} else {

View File

@@ -285,7 +285,7 @@
<el-option :label="'特别困难'" :value="'特别困难'" />
<el-option :label="'比较困难'" :value="'比较困难'" />
<el-option :label="'一般困难'" :value="'一般困难'" />
<el-option :label="'困难'" :value="'困难'" />
<el-option :label="'非家庭经济困难'" :value="'非家庭经济困难'" />
</el-select>
</el-form-item>
<el-form-item label="岗位名称">