学生资助

This commit is contained in:
2025-09-29 15:06:26 +08:00
parent 2fc41315fa
commit 07832bdffa
11 changed files with 1421 additions and 103 deletions

View File

@@ -5,10 +5,10 @@
"author": "srs",
"license": "MIT",
"scripts": {
"dev": "vue-cli-service serve",
"build:prod": "vue-cli-service build",
"build:stage": "vue-cli-service build --mode staging",
"build": "NODE_OPTIONS=--max-old-space-size=4096 vite build",
"dev": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
"build:prod": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
"build:stage": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode staging",
"build": "set NODE_OPTIONS=--openssl-legacy-provider --max-old-space-size=4096 && vite build",
"preview": "node build/index.js --preview",
"lint": "eslint --ext .js,.vue src"
},

View File

@@ -104,6 +104,15 @@ export function manyLeaveAudit(data) {
})
}
// 批量驳回去向调查
export function manyLeaveReject(data) {
return request({
url: '/survey/itinerary/manyLeaveReject',
method: 'post',
data: data
})
}
export function leaveAudit(data) {
return request({
url: '/survey/itinerary/leaveAudit',

View File

@@ -81,9 +81,9 @@
<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-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:student:edit']">修改</el-button>
>修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:student:remove']">删除</el-button>
>删除</el-button>
<el-button size="mini" type="text" icon="el-icon-refresh"
@click="doInitPwdOne(scope.row)">初始化密码</el-button>
<el-button size="mini" type="text" icon="el-icon-view"
@@ -237,7 +237,7 @@
</template>
<script>
import { listOwnStu as listStudent, getStudent, delStudent, addStudent, updateStudent, getClassName, initPwd, initOnePwd } from "@/api/stuCQS/basedata/student";
import { addStudent, delStudent, getClassName, getStudent, initOnePwd, initPwd, listOwnStu as listStudent, updateStudent } from "@/api/stuCQS/basedata/student";
// import { } from "@/api/stuCQS/basedata/class";
import { getTokenKeySessionStorage } from "@/utils/auth";

View File

@@ -61,15 +61,15 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['system:student:add']">新增</el-button>
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['system:student:edit']">修改</el-button>
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['system:student:remove']">删除</el-button>
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleImport"
@@ -129,9 +129,9 @@
<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-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:student:edit']">修改</el-button>
>修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:student:remove']">删除</el-button>
>删除</el-button>
<el-button size="mini" type="text" icon="el-icon-refresh" @click="doInitPwdOne(scope.row)">初始化密码</el-button>
<el-button size="mini" type="text" icon="el-icon-view" @click="picVClick(scope.row)">查看画像</el-button>
</template>
@@ -246,7 +246,7 @@
</template>
<script>
import { listStudent, getStudent, delStudent, addStudent, updateStudent, getClassName, initPwd, initOnePwd, doDept, getStatus } from "@/api/stuCQS/basedata/student";
import { addStudent, delStudent, doDept, getClassName, getStatus, getStudent, initOnePwd, initPwd, listStudent, updateStudent } from "@/api/stuCQS/basedata/student";
import StuPic from "@/views/basedata/private/StuPic";
@@ -254,11 +254,11 @@ import StuPic from "@/views/basedata/private/StuPic";
import { listGrade } from "@/api/stuCQS/basedata/grade";
import { getDeptName } from "@/api/system/dept";
import { deptTreeSelect } from '@/api/system/user';
import Treeselect from '@riophae/vue-treeselect';
import '@riophae/vue-treeselect/dist/vue-treeselect.css';
import { deptTreeSelect } from '@/api/system/user';
import { isEmpty, fullLoading } from "@/api/helpFunc";
import { fullLoading, isEmpty } from "@/api/helpFunc";
import { getTokenKeySessionStorage as getToken } from "@/utils/auth";
export default {

View File

@@ -31,8 +31,12 @@
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.applyStatus == 1" type="text" size="mini" icon="el-icon-view"
<!-- 审核按钮已提交审核状态(1)时显示 -->
<el-button v-if="scope.row.applyStatus == 1 || scope.row.applyStatus == '1'" type="text" size="mini" icon="el-icon-view"
@click="auditVClick(scope.row)">审核</el-button>
<!-- 查看/修改按钮其他所有状态都可以查看/修改 -->
<el-button v-else type="text" size="mini" icon="el-icon-edit"
@click="auditVClick(scope.row)">查看/修改</el-button>
</template>
</el-table-column>
</el-table>
@@ -122,16 +126,16 @@
v-model="auditForm.classPost"></el-input>
</el-form-item>
<el-form-item label="获奖情况">
<el-input readonly type="textarea" :maxlength="1000"
<el-input :readonly="!editMode" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.goodHis"></el-input>
</el-form-item>
<el-form-item label="主要事迹">
<el-input readonly type="textarea" :maxlength="1000"
<el-input :readonly="!editMode" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.mainHis"></el-input>
</el-form-item>
<el-form-item label="您的审核意见">
<el-form-item label="您的审核意见" v-if="auditForm.applyStatus == 1 || auditForm.applyStatus == '1'">
<el-row>
<el-col :span="12">
<el-select @change="changeAuditStatus" placeholder="请选择审核意见"
@@ -141,15 +145,27 @@
</el-option>
</el-select>
</el-col>
<!-- 根据audius_detail_type字典的按钮显示逻辑 -->
<el-col :span="12">
<!-- 非编辑模式下显示修改按钮 -->
<el-button v-if="!editMode" @click="toggleEditMode" type="primary" size="mini" style="margin-right: 10px;">修改申请</el-button>
<!-- 编辑模式下显示保存和取消按钮 -->
<template v-if="editMode">
<el-button @click="saveEdit" type="primary" size="mini" style="margin-right: 10px;">保存修改</el-button>
<el-button @click="cancelEdit" type="default" size="mini" style="margin-right: 10px;">取消编辑</el-button>
</template>
<el-button @click="doAudit" type="success" size="mini">提交审核</el-button>
</el-col>
</el-row>
<el-input placeholder="请输入审核意见" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
<!-- 编辑模式下的输入框 -->
<el-input v-if="editMode" placeholder="请输入审核意见" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }"
v-model="doForm.fdyCmt"></el-input>
<!-- 只读模式下的输入框 -->
<el-input v-else placeholder="请输入审核意见" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }"
v-model="doForm.fdyCmt" disabled></el-input>
</el-form-item>
</el-col>
@@ -193,7 +209,7 @@
积极参与各级各类校园文化活动和社会实践活动;在各级各类活动(竞赛)中成绩突出;在就业创业方面作为优秀典型.
</li>
<!-- <li>
积极参与各级各类校园文化活动和社会实践活动;在各级各类活动(竞赛)中成绩突出;六个学期青年大学习率达98%以上;在就业创业方面作为优秀典型.
积极参与各级各类校园文化活动和社会实践活动;在各级各类活动(竞赛)中成绩突出;六个学期青年大学习率达98%以上;在就业创业方面作为优秀典型.
</li> -->
<li>
同等条件下,获得国家奖学金或国家励志奖学金等国家级奖励的毕业生应优先推荐.
@@ -249,7 +265,8 @@ import { listSelect } from "@/api/stuCQS/lake/type";
import {
fdyAudit, getStuScoreMajorRank,
listFdy,
listStuSportScore
listStuSportScore,
updateBiyeapply
} from "@/api/comprehensive/biyeapply";
import {
@@ -323,7 +340,12 @@ export default {
],
rank_data: [],
sport_data: []
sport_data: [],
// 修改功能相关变量
editMode: false,
originalGoodHis: "",
originalMainHis: ""
}
},
@@ -411,6 +433,20 @@ export default {
async auditVClick(v) {
this.auditForm = { ...v };
this.auditV = true;
this.editMode = false;
// 调试信息
console.log('auditVClick - v:', v);
console.log('auditVClick - auditForm.applyStatus:', this.auditForm.applyStatus);
console.log('auditVClick - editMode:', this.editMode);
// 如果已有审核意见则显示在doForm中
if (!isEmpty(v.fdyCmt)) {
this.doForm.fdyCmt = v.fdyCmt;
} else {
this.doForm.fdyCmt = "同意申请";
}
this.getStuScoreMajorRank(v.stuNo);
this.listStuSportScore(v.stuNo);
},
@@ -452,7 +488,51 @@ export default {
this.auditV = false;
this.$message.success(res.msg);
}
}
},
// 修改功能相关方法
toggleEditMode() {
this.editMode = true;
this.originalGoodHis = this.auditForm.goodHis;
this.originalMainHis = this.auditForm.mainHis;
},
cancelEdit() {
this.editMode = false;
this.auditForm.goodHis = this.originalGoodHis;
this.auditForm.mainHis = this.originalMainHis;
},
async saveEdit() {
if (isEmpty(this.auditForm.goodHis) && isEmpty(this.auditForm.mainHis)) {
this.$message.info("请填写获奖情况或主要事迹");
return;
}
let updateData = {
id: parseInt(this.auditForm.id),
goodHis: this.auditForm.goodHis,
mainHis: this.auditForm.mainHis
};
this.fullLoading = true;
try {
let res = await updateBiyeapply(updateData);
this.fullLoading = false;
if (res.code == 200) {
this.editMode = false;
this.getList();
this.$message.success("修改成功");
} else {
this.$message.error(res.msg || "修改失败");
}
} catch (error) {
this.fullLoading = false;
this.$message.error("修改失败");
}
},
}
}
</script>

View File

@@ -113,24 +113,28 @@
</el-form-item>
<el-form-item class="look-form-item" label="身份证号">
<el-input readonly v-model="auditForm.idCard"></el-input>
<el-input :readonly="!editMode" v-model="auditForm.idCard"></el-input>
</el-form-item>
<el-form-item class="look-form-item" label="农行卡号">
<el-input readonly v-model="auditForm.bankCard"></el-input>
<el-input :readonly="!editMode" v-model="auditForm.bankCard"></el-input>
</el-form-item>
<el-form-item class="look-form-item" label="开户行">
<el-input readonly v-model="auditForm.bankAddr"></el-input>
<el-input :readonly="!editMode" v-model="auditForm.bankAddr"></el-input>
</el-form-item>
<el-form-item class="look-form-item" label="所获奖励">
<el-input readonly type="textarea" :autosize="{ minRows: 2, maxRows: 20 }"
<el-input v-if="editMode" type="textarea" :autosize="{ minRows: 2, maxRows: 20 }"
v-model="auditForm.goodHis"></el-input>
<el-input v-else readonly type="textarea" :autosize="{ minRows: 2, maxRows: 20 }"
v-model="auditForm.goodHis"></el-input>
</el-form-item>
<el-form-item class="look-form-item" label="主要事迹">
<el-input readonly type="textarea" :autosize="{ minRows: 2, maxRows: 20 }"
<el-input v-if="editMode" type="textarea" :autosize="{ minRows: 2, maxRows: 20 }"
v-model="auditForm.mainHis"></el-input>
<el-input v-else readonly type="textarea" :autosize="{ minRows: 2, maxRows: 20 }"
v-model="auditForm.mainHis"></el-input>
</el-form-item>
@@ -140,19 +144,29 @@
<el-form-item label="您的审核意见">
<el-row>
<el-col :span="12">
<el-select @change="changeAuditStatus" placeholder="请选择审核意见" style="width: 200px;"
<el-col :span="6">
<el-select @change="changeAuditStatus" placeholder="请选择审核意见" style="width: 150px;"
v-model="doForm.applyStatus" size="mini">
<el-option v-for="(v, i) in status_list" :key="i" :label="v.label" :value="v.value">
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-button @click="doAudit" size="mini">提交审核</el-button>
<el-col :span="18">
<!-- 编辑模式下的按钮 -->
<template v-if="editMode">
<el-button @click="saveEdit" type="success" size="mini">保存修改</el-button>
<el-button @click="cancelEdit" size="mini" style="margin-left: 10px;">取消编辑</el-button>
</template>
<!-- 非编辑模式下的按钮 -->
<template v-else>
<el-button @click="toggleEditMode" type="primary" size="mini">修改申请</el-button>
<el-button @click="doAudit" type="success" size="mini" style="margin-left: 10px;">提交审核</el-button>
</template>
</el-col>
</el-row>
<el-input placeholder="请输入审核意见" type="textarea" :maxlength="1000" :autosize="{ minRows: 10, maxRows: 10 }"
<!-- 只在非编辑模式下显示审核意见 -->
<el-input v-if="!editMode" placeholder="请输入审核意见" type="textarea" :maxlength="1000" :autosize="{ minRows: 10, maxRows: 10 }"
class="auditForm-input" v-model="doForm.fdyCmt"></el-input>
</el-form-item>
</el-form>
@@ -162,7 +176,7 @@
<script>
import { fullLoading, isEmpty } from '@/api/helpFunc';
import { doAudit, listFdy } from '@/api/stuCQS/good-class/newClassGoodApply';
import { doAudit, listFdy, updateNewClassGoodApply } from '@/api/stuCQS/good-class/newClassGoodApply';
import { listAllYear as listYear } from '@/api/stuCQS/basedata/year';
@@ -185,6 +199,7 @@ export default {
tableData: [],
auditV: false,
editMode: false,
status_list: [
{
@@ -205,6 +220,8 @@ export default {
fdyCmt: "同意申请"
},
auditForm: {},
originalMainHis: '',
originalGoodHis: '',
year_list: [],
@@ -293,8 +310,63 @@ export default {
this.auditForm = { ...val }
this.auditForm.applyStatus = '2'
this.auditForm.fdyCmt = '同意申请。'
this.editMode = false
this.originalMainHis = val.mainHis
this.originalGoodHis = val.goodHis
this.originalIdCard = val.idCard
this.originalBankCard = val.bankCard
this.originalBankAddr = val.bankAddr
this.auditV = true
},
toggleEditMode() {
this.editMode = true
this.originalMainHis = this.auditForm.mainHis
this.originalGoodHis = this.auditForm.goodHis
this.originalIdCard = this.auditForm.idCard
this.originalBankCard = this.auditForm.bankCard
this.originalBankAddr = this.auditForm.bankAddr
},
async saveEdit() {
try {
let loading = fullLoading(this)
// 只传递需要更新的字段,不传递状态相关字段
let updateData = {
id: this.auditForm.id,
mainHis: this.auditForm.mainHis,
goodHis: this.auditForm.goodHis,
idCard: this.auditForm.idCard,
bankCard: this.auditForm.bankCard,
bankAddr: this.auditForm.bankAddr,
// 保留其他必要的基础字段,但不包含审核状态
classId: this.auditForm.classId,
className: this.auditForm.className,
stuNum: this.auditForm.stuNum,
applyYear: this.auditForm.applyYear
}
let res = await updateNewClassGoodApply(updateData)
loading.close()
if (res.code == 200) {
this.editMode = false
this.$message.success('修改已保存')
// 刷新列表数据
this.getList()
} else {
this.$message.error(res.msg || '保存失败')
}
} catch (error) {
this.$message.error('保存失败,请重试')
console.error('保存修改失败:', error)
}
},
cancelEdit() {
this.auditForm.mainHis = this.originalMainHis
this.auditForm.goodHis = this.originalGoodHis
this.auditForm.idCard = this.originalIdCard
this.auditForm.bankCard = this.originalBankCard
this.auditForm.bankAddr = this.originalBankAddr
this.editMode = false
this.$message.info('已取消编辑')
},
async listYear() {
let res = await listYear()
if (res.code == 200) {

View File

@@ -40,7 +40,7 @@
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
<el-dialog title="申请" :visible.sync="auditV" fullscreen :append-to-body="true">
<el-dialog :title="editMode ? '申请 (编辑模式)' : '申请'" :visible.sync="auditV" fullscreen :append-to-body="true">
<el-steps :active="getStep(auditForm)">
<el-step title="学生提交申请" description=""></el-step>
@@ -90,7 +90,7 @@
</el-step>
</el-steps>
<hr />
<el-form class="detail" label-width="160px">
<el-form ref="auditForm" :model="editMode ? editForm : auditForm" label-width="160px">
<el-row>
<div style="display: flex;">
<el-col :span="12" style="margin-right: 50px;">
@@ -107,37 +107,41 @@
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.zzmm"></el-input>
</el-form-item>
<!--
<el-form-item v-if="!isEmpty(auditForm.youthPercent)" label="青年大学习学习率">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.youthPercent"></el-input>
</el-form-item> -->
<el-form-item v-if="!isEmpty(auditForm.classtwoSure)" label="第二课堂学分认定">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.classtwoSure"></el-input>
</el-form-item>
<el-form-item label="职务">
<el-input readonly size="mini" class="auditForm-input"
<el-input v-if="!editMode" readonly size="mini" class="auditForm-input"
v-model="auditForm.classPost"></el-input>
<el-input v-else size="mini" v-model="editForm.classPost" placeholder="请输入职务"></el-input>
</el-form-item>
<el-form-item v-if="!isEmpty(auditForm.bankCard)" label="中国农业银行银行卡号">
<el-input readonly size="mini" class="auditForm-input"
<el-input v-if="!editMode" readonly size="mini" class="auditForm-input"
v-model="auditForm.bankCard"></el-input>
<el-input v-else size="mini" v-model="editForm.bankCard" placeholder="请输入银行卡号"></el-input>
</el-form-item>
<el-form-item v-if="!isEmpty(auditForm.bankAddr)" label="开户行">
<el-input readonly size="mini" class="auditForm-input"
<el-input v-if="!editMode" readonly size="mini" class="auditForm-input"
v-model="auditForm.bankAddr"></el-input>
<el-input v-else size="mini" v-model="editForm.bankAddr" placeholder="请输入开户行"></el-input>
</el-form-item>
<el-form-item label="获奖情况">
<el-input readonly type="textarea" :maxlength="1000"
<el-input v-if="!editMode" readonly type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.goodHis"></el-input>
<el-input v-else type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" v-model="editForm.goodHis"
placeholder="请输入获奖情况"></el-input>
</el-form-item>
<el-form-item label="主要事迹">
<el-input readonly type="textarea" :maxlength="1000"
<el-input v-if="!editMode" readonly type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.mainHis"></el-input>
<el-input v-else type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" v-model="editForm.mainHis"
placeholder="请输入主要事迹"></el-input>
</el-form-item>
<el-form-item label="您的审核意见">
<el-row>
@@ -149,9 +153,11 @@
</el-radio-group>
</el-col>
<el-col :span="12">
<el-button @click="doAudit" size="mini">提交审核</el-button>
<el-button @click="toggleEditMode" v-if="!editMode" size="mini" type="primary" plain>修改申请</el-button>
<el-button @click="saveEdit" v-else size="mini" type="success">保存修改</el-button>
<el-button @click="cancelEdit" v-if="editMode" size="mini">取消编辑</el-button>
<el-button @click="doAudit" size="mini" type="primary">提交审核</el-button>
</el-col>
</el-row>
<el-input placeholder="请输入审核意见" type="textarea" :maxlength="1000"
@@ -185,13 +191,13 @@
<ol>
<h3>学业奖学金</h3>
<li>
一等奖学金:平均学分绩班级排名前3%,学年综合素质测评班级排名前50%;
一等奖学金平均学分绩班级排名前3%学年综合素质测评班级排名前50%
</li>
<li>
二等奖学金:平均学分绩级排名前6%,学年综合素质测评班级排名前50%;
二等奖学金平均学分绩级排名前6%学年综合素质测评班级排名前50%
</li>
<li>
三等奖学金:平均学分绩班级排名前9%,学年综合素质测评班级排名前50%
三等奖学金平均学分绩班级排名前9%学年综合素质测评班级排名前50%
</li>
</ol>
@@ -201,20 +207,19 @@
<ol>
<h3>三好学生</h3>
<li>
劳全面发展,平时注重道德修养,勤俭节约,弘扬正能量,树立良好形象.
劳全面发展平时注重道德修养勤俭节约弘扬正能量树立良好形象
</li>
<li>
以身作则,为人表率,具有较强的集体观念和集体荣誉感.热心为同学服务,待人诚恳谦虚有礼貌.
以身作则为人表率具有较强的集体观念和集体荣誉感热心为同学服务待人诚恳谦虚有礼貌
</li>
<li>
积极参加学校开展的第二课堂活动,第二课堂成绩单学分认定为优秀.在各级各类活动(竞赛)中成绩突出.
积极参加学校开展的第二课堂活动第二课堂成绩单学分认定为优秀在各级各类活动竞赛中成绩突出
</li>
<li>
积极参加体育锻炼及其他文体活动,身体健康,体能考核成绩为良好及以上.(体测成绩80分以上)
积极参加体育锻炼及其他文体活动身体健康体能考核成绩为良好及以上(体测成绩80分以上)
</li>
<li>
参评学年各科平均学分绩75分以上(含75分),考查课"中等"及以上,平均学分绩班级排名前30%,学年综合素质测评班级排名前30%
<!-- ,学年青年大学习学习率达100%. -->
参评学年各科平均学分绩75分以上含75分考查课中等及以上平均学分绩班级排名前30%学年综合素质测评班级排名前30%
</li>
</ol>
</div>
@@ -223,27 +228,25 @@
<ol>
<h3>优秀学生干部</h3>
<li>
关心集体,吃苦在前,以身作则,能起到模范带头作用.
关心集体吃苦在前以身作则能起到模范带头作用
</li>
<li>
具有较强的工作能力和组织能力,工作认真负责,责任心强,团结同学,热心为同学服务,工作效果好.社会实践工作取得较好成绩,在学生中有较高威信.
具有较强的工作能力和组织能力工作认真负责责任心强团结同学热心为同学服务工作效果好社会实践工作取得较好成绩在学生中有较高威信
</li>
<li>
积极参加学校开展的第二课堂活动,第二课堂成绩单学分认定为优秀.在各级各类活动(竞赛)中成绩突出.
积极参加学校开展的第二课堂活动第二课堂成绩单学分认定为优秀在各级各类活动竞赛中成绩突出
</li>
<li>
积极参加体育锻炼及其他文体活动,身体健康,体能考核成绩为良好及以上.
积极参加体育锻炼及其他文体活动身体健康体能考核成绩为良好及以上
</li>
<li>
参评学年各科平均学分绩为70分以上(含70分),平均学分绩班级排名前40%,学年综合素质测评班级排名前50%
<!-- ,学年青年大学习学习率达100%. -->
参评学年各科平均学分绩为70分以上含70分平均学分绩班级排名前40%学年综合素质测评班级排名前50%
</li>
<span @click="lookMore"
style="text-decoration: underline;color: lightskyblue;cursor: pointer;">查看更多</span>
</ol>
</div>
</el-drawer>
@@ -319,7 +322,7 @@
<el-option v-for="(v, i) in class_list" :key="i" clearable :value="v.classId"
:label="v.className"></el-option>
</el-select>
<div style="font-size: small;margin: 10px 0 10px 10px; color: red;">*学年奖项是必选项,班级不选就默认导出全部.</div>
<div style="font-size: small;margin: 10px 0 10px 10px; color: red;">*学年奖项是必选项班级不选就默认导出全部</div>
<el-button @click="doExport">导出</el-button>
</el-dialog>
@@ -331,18 +334,24 @@
</div>
</template>
<script>
import { listAllYear as listYear } from "@/api/stuCQS/basedata/year";
import { updateGoodapply } from "@/api/stuCQS/good/apply";
import {
listFdyAudit, lookDetail, listStuScoreClassRank, listStuYearCourseScore, countStuPass, countStuIam, fdyAudit
, fdyExport, applyStatus
applyStatus,
countStuIam,
countStuPass,
fdyAudit,
fdyExport,
listFdyAudit,
listStuScoreClassRank, listStuYearCourseScore,
lookDetail
} from "@/api/stuCQS/good/audit";
import { listOwnClass } from "@/api/stuCQS/info-fill/stu_eva_task";
import { listAllYear as listYear } from "@/api/stuCQS/basedata/year";
import * as XLSX from 'xlsx';
import { workbook2blob, openDownloadDialog, file2Xce } from "@/api/helpFunc";
import lodash from "lodash";
import { isEmpty, groupBy } from "@/api/helpFunc";
import { groupBy, isEmpty, openDownloadDialog, workbook2blob } from "@/api/helpFunc";
import MoreDetail from '@/views/stuCQS/good/MoreDetail.vue';
import lodash from "lodash";
import * as XLSX from 'xlsx';
export default {
@@ -423,6 +432,16 @@ export default {
lookNeedV: false,
lookMoreV: false,
editMode: false,
editForm: {
applyId: null,
classPost: "",
bankCard: "",
bankAddr: "",
goodHis: "",
mainHis: ""
}
}
},
created() {
@@ -430,6 +449,17 @@ export default {
this.listAllStuYear();
this.getList();
},
watch: {
// 监听editForm的变化
editForm: {
handler(newVal, oldVal) {
console.log('editForm发生变化:', newVal);
console.log('旧值:', oldVal);
},
deep: true,
immediate: true
}
},
methods: {
getStepStatus(data) {
if ((data.includes('同意') && !data.includes('不同意')) || data.includes('通过') || (data.includes('符合') && !data.includes('不符合'))) {
@@ -622,17 +652,27 @@ export default {
this.handleQuery();
},
async auditVClick(v) {
let id = v.applyId;
let id = v.applyId || v.id; // 尝试获取applyId或id
console.log('提取的id:', id);
if (!id) {
this.$message.error('无法获取申请ID');
return;
}
this.fullLoading = true;
let res = await lookDetail(id);
this.fullLoading = false;
if (res.code == 200) {
if (!isEmpty(res.data.material)) {
this.material_list = res.data.material.split(",");
} else {
this.material_list = [];
}
this.auditForm = res.data;
console.log('auditForm赋值后:', this.auditForm); // 调试用
this.auditV = true;
}
//
@@ -724,6 +764,66 @@ export default {
this.auditV = false;
this.$message.success(res.msg);
}
},
toggleEditMode() {
if (!this.editMode) {
// 确保我们能获取到申请ID
const applyId = this.auditForm.applyId || this.auditForm.id;
this.editForm = {
id: applyId,
classPost: this.auditForm.classPost || '',
bankCard: this.auditForm.bankCard || '',
bankAddr: this.auditForm.bankAddr || '',
goodHis: this.auditForm.goodHis || '',
mainHis: this.auditForm.mainHis || ''
};
console.log('初始化后的editForm数据:', this.editForm);
this.editMode = true;
} else {
this.editMode = false;
}
},
cancelEdit() {
this.editMode = false;
// 重置编辑表单
this.editForm = {
applyId: null,
classPost: "",
bankCard: "",
bankAddr: "",
goodHis: "",
mainHis: ""
};
},
async saveEdit() {
try {
// 验证必填字段
this.fullLoading = true;
// 尝试像工作示例那样直接发送整个表单对象
const submitData = { ...this.editForm };
// 尝试直接发送数据,不使用包装对象
const res = await updateGoodapply(submitData);
this.fullLoading = false;
if (res.code === 200) {
this.$message.success('修改成功');
// 更新审核表单数据
Object.assign(this.auditForm, this.editForm);
this.editMode = false;
// 重新加载数据
this.getList();
} else {
this.$message.error(res.msg || '修改失败');
}
} catch (error) {
this.fullLoading = false;
console.error('修改失败错误:', error);
this.$message.error('修改失败:' + (error.message || '未知错误'));
}
}
}
}

View File

@@ -129,20 +129,30 @@
v-model="auditForm.classPost"></el-input>
</el-form-item>
<el-form-item v-if="!isEmpty(auditForm.bankCard)" label="中国农业银行银行卡号">
<el-input readonly size="mini" class="auditForm-input"
<el-input v-if="editMode" size="mini" class="auditForm-input"
v-model="auditForm.bankCard"></el-input>
<el-input v-else readonly size="mini" class="auditForm-input"
v-model="auditForm.bankCard"></el-input>
</el-form-item>
<el-form-item v-if="!isEmpty(auditForm.bankAddr)" label="开户行">
<el-input readonly size="mini" class="auditForm-input"
<el-input v-if="editMode" size="mini" class="auditForm-input"
v-model="auditForm.bankAddr"></el-input>
<el-input v-else readonly size="mini" class="auditForm-input"
v-model="auditForm.bankAddr"></el-input>
</el-form-item>
<el-form-item label="获奖情况">
<el-input readonly type="textarea" :maxlength="1000"
<el-input v-if="editMode" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.goodHis"></el-input>
<el-input v-else readonly type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.goodHis"></el-input>
</el-form-item>
<el-form-item label="主要事迹">
<el-input readonly type="textarea" :maxlength="1000"
<el-input v-if="editMode" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.mainHis"></el-input>
<el-input v-else readonly type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.mainHis"></el-input>
</el-form-item>
@@ -157,14 +167,27 @@
</el-select>
</el-col>
<el-col :span="12">
<!-- 非编辑模式下显示修改按钮 -->
<el-button v-if="!editMode" @click="toggleEditMode" type="primary" size="mini" style="margin-right: 10px;">修改申请</el-button>
<!-- 编辑模式下显示保存和取消按钮 -->
<template v-if="editMode">
<el-button @click="saveEdit" type="primary" size="mini" style="margin-right: 10px;">保存修改</el-button>
<el-button @click="cancelEdit" type="default" size="mini" style="margin-right: 10px;">取消编辑</el-button>
</template>
<el-button @click="doAudit" type="success" size="mini">提交审核</el-button>
</el-col>
</el-row>
<el-input placeholder="请输入审核意见" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="doForm.fdyComment"></el-input>
<!-- 编辑模式下的输入框 -->
<el-input v-if="editMode" placeholder="请输入审核意见" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }"
v-model="doForm.fdyComment"></el-input>
<!-- 只读模式下的输入框 -->
<el-input v-else placeholder="请输入审核意见" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }"
v-model="doForm.fdyComment" disabled></el-input>
</el-form-item>
</el-col>
@@ -205,7 +228,7 @@
<li>
技能之星:
<ol>
<li>技能或创新创业比赛成绩优异积极参技能训练技能比赛或创新创业类比赛在省部级及以上举办的技能类创新创业类比赛中获得三等奖及以上或在市厅级举办的技能类创新创业类比赛中获得二等奖及以上或在校级组织的技能类创新创业类比赛中获得一等奖及以上
<li>技能或创新创业比赛成绩优异积极参技能训练技能比赛或创新创业类比赛在省部级及以上举办的技能类创新创业类比赛中获得三等奖及以上或在市厅级举办的技能类创新创业类比赛中获得二等奖及以上或在校级组织的技能类创新创业类比赛中获得一等奖及以上
</li>
<li>专业技能成绩优良在本专业技能考核中成绩突出学年平均学分绩在专业排名前30%</li>
<li>专业技能突出取得与专业相关的资格资质证书专利排名前五或者在专业技能某个方面特别突出者优先考虑</li>
@@ -214,7 +237,7 @@
<li>
励志之星:
<ol>
<li>在评选学年中被认定为家庭经济困难学生自立自强热爱生活吃苦耐劳勇于拼搏乐观向上有突出的励志事迹能够激励他人影响他人在同学中认可度高
<li>在评选学年中被认定为家庭经济困难学生自立自强热爱生活吃苦耐劳勇于拼搏 optimistic向上有突出的励志事迹能够激励他人影响他人在同学中认可度高
</li>
<li>在专业学习勤工俭学社会实践科技创新励志感恩创新创业公益服务等方面取得突出成绩</li>
<li>学业成绩优良学年平均学分绩在专业排名前30%获得校级及以上先进个人项目表彰</li>
@@ -318,7 +341,7 @@
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 { listFdy, fdyAudit } from "@/api/stuCQS/lake/apply";
import { listFdy, fdyAudit, updateLakeapply } from "@/api/stuCQS/lake/apply";
import {
listStuScoreClassRank, listStuYearCourseScore, countStuPass, countStuIam, applyStatus
@@ -383,6 +406,10 @@ export default {
fdyComment: "同意申请"
},
// 编辑模式相关状态
editMode: false,
originalComment: "", // 保存原始审核意见,用于取消编辑时恢复
class_list: [],
year_list: [],
@@ -413,6 +440,56 @@ export default {
this.getList();
},
methods: {
// 切换编辑模式
toggleEditMode() {
if (!this.editMode) {
// 进入编辑模式
this.editMode = true;
// 保存当前审核意见作为原始值
this.originalComment = this.doForm.fdyComment;
} else {
this.editMode = false;
}
},
// 取消编辑
cancelEdit() {
// 退出编辑模式
this.editMode = false;
// 恢复原始审核意见
this.doForm.fdyComment = this.originalComment;
},
// 保存编辑
async saveEdit() {
try {
this.fullLoading = true;
const res = await updateLakeapply({
id: this.auditForm.id,
fdyComment: this.doForm.fdyComment,
bankCard: this.auditForm.bankCard,
bankAddr: this.auditForm.bankAddr,
goodHis: this.auditForm.goodHis,
mainHis: this.auditForm.mainHis
});
this.fullLoading = false;
if (res.code === 200) {
this.$message.success('保存成功');
// 更新当前显示的审核信息
this.auditForm.fdyComment = this.doForm.fdyComment;
// 保存成功后退出编辑模式
this.editMode = false;
this.originalComment = this.doForm.fdyComment;
} else {
this.$message.error(res.msg || '保存失败');
}
} catch (error) {
this.fullLoading = false;
console.error('保存失败:', error);
this.$message.error('保存失败,请重试');
}
},
getStepStatus(data) {
if ((data.includes('同意') && !data.includes('不同意')) || data.includes('通过') || (data.includes('符合') && !data.includes('不符合'))) {
return 'success';
@@ -490,6 +567,31 @@ export default {
async auditVClick(v) {
this.auditForm = { ...v };
this.auditV = true;
// 重置编辑状态
this.editMode = false;
// 如果已有辅导员审核意见,则加载到编辑框中
if (!isEmpty(this.auditForm.fdyComment)) {
this.doForm.fdyComment = this.auditForm.fdyComment;
this.originalComment = this.auditForm.fdyComment; // 保存原始内容
// 根据审核意见内容推断审核状态
if (this.auditForm.fdyComment.includes('同意') || this.auditForm.fdyComment.includes('通过')) {
this.doForm.applyStatus = 2;
} else if (this.auditForm.fdyComment.includes('填写有误') || this.auditForm.fdyComment.includes('重新提交')) {
this.doForm.applyStatus = 10;
} else if (this.auditForm.fdyComment.includes('拒绝')) {
this.doForm.applyStatus = 11;
}
} else {
// 重置表单
this.doForm = {
id: null,
applyStatus: null,
fdyComment: "同意申请"
};
this.originalComment = "同意申请"; // 保存原始内容
}
this.myScoreVClick()
},
async countStuIam() {
@@ -577,6 +679,39 @@ export default {
this.auditV = false;
this.$message.success(res.msg);
}
},
async saveDraft() {
if (isEmpty(this.doForm.fdyComment)) {
this.$message.info("请填写审核意见后再保存");
return;
}
let sdata = {
id: parseInt(this.auditForm.id),
fdyComment: this.doForm.fdyComment,
// 保存草稿时不改变申请状态,只保存审核意见
applyStatus: this.auditForm.applyStatus
};
this.fullLoading = true;
try {
let res = await updateLakeapply(sdata);
this.fullLoading = false;
if (res.code == 200) {
this.$message.success("草稿保存成功");
// 更新当前显示的审核信息
this.auditForm.fdyComment = this.doForm.fdyComment;
// 保存成功后退出编辑模式
this.editMode = false;
this.originalComment = this.doForm.fdyComment; // 更新原始内容
} else {
this.$message.error(res.msg || "保存失败");
}
} catch (error) {
this.fullLoading = false;
this.$message.error("保存失败,请重试");
console.error("保存草稿失败:", error);
}
}
}
}

View File

@@ -129,7 +129,8 @@
<el-tab-pane label="预计离校" name="second">
数据更新时间:{{ new Date().toLocaleString() }}<el-button @click="exportWillLeave">导出</el-button>
<el-table id="willLeaveTable" v-if="lookLeaveV" :border="true" :data="willLeaveList"
:span-method="objectSpanMethod1">
:span-method="objectSpanMethod1" :show-summary="true" :summary-method="getSummaries"
sum-text="总计">
<el-table-column label="学院" align="center" prop="dept_name" width="180" />
<el-table-column label="学生数" align="center" prop="stu_num" />
<el-table-column label="详细学院" align="center" prop="more_dept_name" width="180" />
@@ -484,6 +485,43 @@ export default {
}
}
},
getSummaries(param) {
const { columns, data } = param;
const sums = [];
// 过滤掉已有的总计行(合计、里建、长堽)
const filteredData = data.filter(item =>
item.dept_name !== '合计' &&
item.dept_name !== '里建' &&
item.dept_name !== '长堽'
);
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计';
return;
}
if (index === 2) {
sums[index] = '';
return;
}
const values = filteredData.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
} else {
sums[index] = '';
}
});
return sums;
},
async listReturnRes1() {
this.returnFields = [];
this.returnLoading = true;

View File

@@ -29,6 +29,10 @@
<el-button type="success" icon="el-icon-edit" size="mini" :disabled="multiple" plain
@click="manyAudit">批量审核通过</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" icon="el-icon-close" size="mini" :disabled="multiple" plain
@click="manyReject">批量驳回</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-view" size="mini" plain @click="lookVClick">查看离校填写情况</el-button>
</el-col>
@@ -74,6 +78,7 @@
<el-option label="通过" value="2"></el-option>
<el-option label="打回" value="10"></el-option>
</el-select>
<el-button @click="saveEdit" type="primary">编辑保存</el-button>
<el-button @click="doAudit" type="success">审核</el-button>
</el-form-item>
<el-form-item label="主题">
@@ -97,42 +102,69 @@
readonly />
</el-form-item>
<el-form-item label="联系电话">
<el-input v-model="form.phone" readonly />
<el-input v-model="form.phone" />
</el-form-item>
<el-form-item label="紧急联系人">
<el-input v-model="form.emergencyContact" readonly />
<el-input v-model="form.emergencyContact" />
</el-form-item>
<el-form-item label="紧急联系人电话">
<el-input v-model="form.emergencyContactPhone" readonly />
<el-input v-model="form.emergencyContactPhone" />
</el-form-item>
<el-form-item label="家长姓名">
<el-input v-model="form.famName" readonly />
<el-input v-model="form.famName" />
</el-form-item>
<el-form-item label="家长电话">
<el-input v-model="form.famPhone" readonly />
<el-input v-model="form.famPhone" />
</el-form-item>
<el-form-item label="家长是否知晓">
<el-input v-model="form.famKnow" readonly />
<el-select v-model="form.famKnow" placeholder="请选择家长是否知晓">
<el-option label="是" value="是" />
<el-option label="否" value="否" />
</el-select>
</el-form-item>
<el-form-item label="是否离校">
<el-input :value="form.isLeave == '1' ? '是' : '否'" readonly />
</el-form-item>
<el-form-item label="预计离校时间" v-if="form.isLeave == '1'">
<el-input :value="form.willLeaveTime" readonly />
<el-date-picker
v-model="form.willLeaveTime"
type="datetime"
placeholder="选择预计离校时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label="去向地" v-if="form.isLeave == '1' && !isEmpty(form.willAddr)">
<el-input :value="form.willAddr" readonly />
<el-form-item label="去向地" v-if="form.isLeave == '1'">
<el-input v-model="form.willAddr" placeholder="请输入去向地" />
</el-form-item>
<el-form-item label="预计返校时间" v-if="form.isLeave == '1'">
<el-date-picker
v-model="form.scheduledReturnTime"
type="datetime"
placeholder="选择预计返校时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label="预计留校时间" v-if="form.isLeave == '0'">
<el-input :value="form.willStayTime" readonly />
<el-date-picker
v-model="form.willStayTime"
type="datetime"
placeholder="选择预计留校时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label="留校事由" v-if="form.isLeave == '0'">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" :value="form.stayReason"
readonly />
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" v-model="form.stayReason" />
</el-form-item>
</el-form>
@@ -155,7 +187,14 @@
<el-input v-model="lookParams.name" placeholder="请输入姓名" clearable />
</el-form-item>
<el-form-item label="班级" prop="className">
<el-input v-model="queryParams.className" placeholder="请输入班级" clearable />
<el-input v-model="lookParams.className" placeholder="请输入班级" clearable />
</el-form-item>
<el-form-item label="是否填写" prop="isFilled">
<el-select v-model="lookParams.isFilled" placeholder="请选择是否填写" clearable>
<el-option label="全部" :value="null" />
<el-option label="已填写" :value="1" />
<el-option label="未填写" :value="0" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="lookQuery">搜索</el-button>
@@ -192,7 +231,8 @@
</el-form-item>
</el-form>
数据更新时间:{{ new Date().toLocaleString() }}<el-button @click="exportWillLeave">导出</el-button>
<el-table id="willLeaveTable" v-if="willV" :border="true" :data="willList">
<el-table id="willLeaveTable" v-if="willV" :border="true" :data="willList"
:show-summary="true" :summary-method="getSummaries" sum-text="总计">
<el-table-column label="班级" align="center" prop="class_name" width="180" />
<el-table-column label="学生数" align="center" prop="stu_num" />
<el-table-column label="提交数" align="center" prop="submit_num" />
@@ -222,12 +262,14 @@
<FdyAll v-if="lookWillLeaveV" />
</el-dialog>
</div>
</template>
<script>
import { isEmpty, fullLoading } from "@/api/helpFunc";
import { listFdy as listView, leaveAudit, manyLeaveAudit, listFdyStuLeave, sendFdyStuLeaveMsg, countFdyClassWillLeave } from "@/api/survey/itinerary";
import { listFdy as listView, leaveAudit, manyLeaveAudit, manyLeaveReject, listFdyStuLeave, sendFdyStuLeaveMsg, countFdyClassWillLeave, updateItinerary } from "@/api/survey/itinerary";
import { listAllSurvey } from "@/api/survey/survey";
import XLSX from 'xlsx';
@@ -306,6 +348,8 @@ export default {
lookParams: {
pageNum: 1,
pageSize: 10,
className: null,
isFilled: null,
},
lookTotal: 0,
lookList: [],
@@ -404,6 +448,30 @@ export default {
this.willList = [...data];
}
},
getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
} else {
sums[index] = '';
}
});
return sums;
},
async sendMsg() {
let sdata = { ...this.lookParams };
@@ -423,6 +491,8 @@ export default {
this.$message.info("请选择去向调查");
return;
}
// 重置页码为1避免fromIndex > toIndex错误
this.lookParams.pageNum = 1;
let loading = fullLoading(this);
let res = await listFdyStuLeave(this.lookParams);
loading.close();
@@ -460,6 +530,34 @@ export default {
}
});
},
// 批量驳回
manyReject() {
let sdata = [...this.ids];
if (isEmpty(sdata)) {
this.$message.info("请选择要驳回的记录");
return;
}
this.$confirm('是否批量驳回选中的记录?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
let loading = fullLoading(this);
try {
let res = await manyLeaveReject(sdata);
loading.close();
if (res.code == 200) {
this.$message.success(res.msg);
this.getList();
} else {
this.$message.error(res.msg || '驳回失败');
}
} catch (error) {
loading.close();
this.$message.error('驳回失败:' + error.message);
}
});
},
async doAudit() {
let sdata = { ...this.auditForm };
console.log(sdata);
@@ -477,6 +575,42 @@ export default {
this.getList();
}
},
async saveEdit() {
try {
let loading = fullLoading(this);
// 准备要更新的数据
const updateData = {
returnSchoolId: this.form.returnSchoolId,
phone: this.form.phone,
emergencyContact: this.form.emergencyContact,
emergencyContactPhone: this.form.emergencyContactPhone,
famName: this.form.famName,
famPhone: this.form.famPhone,
famKnow: this.form.famKnow,
willLeaveTime: this.form.willLeaveTime,
willAddr: this.form.willAddr,
scheduledReturnTime: this.form.scheduledReturnTime,
willStayTime: this.form.willStayTime,
stayReason: this.form.stayReason
};
// 调用更新API
let res = await updateItinerary(updateData);
loading.close();
if (res.code == 200) {
this.$message.success('编辑保存成功!');
// 刷新列表数据
this.getList();
} else {
this.$message.error(res.msg || '编辑保存失败');
}
} catch (error) {
loading.close();
this.$message.error('编辑保存失败:' + error.message);
}
},
getList() {
this.loading = true;

750
temp_original.vue Normal file
View File

@@ -0,0 +1,750 @@
<template>
<div class="app-container" v-loading.fullscreen.lock="fullLoading">
<el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" label-width="68px">
<el-form-item label="学号" prop="stuNo">
<el-input v-model="queryParams.stuNo" placeholder="请输入学号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="学生姓名" prop="stuName">
<el-input v-model="queryParams.stuName" placeholder="请输入学生姓名" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="奖项" prop="code">
<el-select v-model="queryParams.code">
<el-option v-for="(v, i) in code_list" :key="i" clearable :value="v.code"
:label="v.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="table_data">
<el-table-column label="奖项" prop="typeName" align="center" />
<el-table-column label="学生" prop="stuName" align="center" />
<el-table-column label="学号" prop="stuNo" align="center" />
<el-table-column label="提交时间" prop="createTime" align="center" />
<el-table-column label="申请状态" align="center">
<template slot-scope="scope">
<dict-tag :options="dict.type.audius_detail_type" :value="scope.row.applyStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.applyStatus == 1" type="text" size="mini" icon="el-icon-view"
@click="auditVClick(scope.row)">审核</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
<el-dialog title="申请" :visible.sync="auditV" fullscreen :append-to-body="true">
<el-steps :active="getStep(auditForm)">
<el-step title="学生提交申请" description=""></el-step>
<el-step title="辅导员审核"
:status="isEmpty(auditForm.fdyComment) ? 'wait' : getStepStatus(auditForm.fdyComment)">
<template slot="description">
<div>
{{ isEmpty(auditForm.fdyNoName) ? '' : auditForm.fdyNoName }}
</div>
<div>
{{ isEmpty(auditForm.fdyComment) ? '' : auditForm.fdyComment }}
</div>
<div>
{{ isEmpty(auditForm.fdyTime) ? '' : auditForm.fdyTime }}
</div>
</template>
</el-step>
<el-step title="学院审核"
:status="isEmpty(auditForm.deptComment) ? 'wait' : getStepStatus(auditForm.deptComment)">
<template slot="description">
<div>
{{ isEmpty(auditForm.deptNoName) ? '' : auditForm.deptNoName }}
</div>
<div>
{{ isEmpty(auditForm.deptComment) ? '' : auditForm.deptComment }}
</div>
<div>
{{ isEmpty(auditForm.deptTime) ? '' : auditForm.deptTime }}
</div>
</template>
</el-step>
<el-step title="学工审核"
:status="isEmpty(auditForm.finalComment) ? 'wait' : getStepStatus(auditForm.finalComment)">
<template slot="description">
<div>
{{ isEmpty(auditForm.finalNoName) ? '' : auditForm.finalNoName }}
</div>
<div>
{{ isEmpty(auditForm.finalComment) ? '' : auditForm.finalComment }}
</div>
<div>
{{ isEmpty(auditForm.finalTime) ? '' : auditForm.finalTime }}
</div>
</template>
</el-step>
</el-steps>
<hr />
<el-form class="detail" label-width="160px">
<el-row>
<div style="display: flex;">
<el-col :span="12" style="margin-right: 50px;">
<el-form-item label="班级">
<el-input readonly size="mini" v-model="auditForm.className"
class="auditForm-input"></el-input>
</el-form-item>
<el-form-item label="姓名">
<el-input readonly size="mini" v-model="auditForm.stuName"
class="auditForm-input"></el-input>
</el-form-item>
<el-form-item label="政治面貌">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.zzmm"></el-input>
</el-form-item>
<!--
<el-form-item v-if="!isEmpty(auditForm.youthPercent)" label="青年大学习学习率">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.youthPercent"></el-input>
</el-form-item> -->
<el-form-item v-if="!isEmpty(auditForm.classtwoSure)" label="第二课堂学分认定">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.classtwoSure"></el-input>
</el-form-item>
<el-form-item label="职务">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.classPost"></el-input>
</el-form-item>
<el-form-item v-if="!isEmpty(auditForm.bankCard)" label="中国农业银行银行卡号">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.bankCard"></el-input>
</el-form-item>
<el-form-item v-if="!isEmpty(auditForm.bankAddr)" label="开户行">
<el-input readonly size="mini" class="auditForm-input"
v-model="auditForm.bankAddr"></el-input>
</el-form-item>
<el-form-item label="获奖情况">
<el-input readonly type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.goodHis"></el-input>
</el-form-item>
<el-form-item label="主要事迹">
<el-input readonly type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="auditForm.mainHis"></el-input>
</el-form-item>
<el-form-item label="您的审核意见">
<el-row>
<el-col :span="12">
<el-radio-group v-model="doForm.status">
<el-radio :label="10">驳回</el-radio>
<el-radio :label="11">拒绝</el-radio>
<el-radio :label="6">通过</el-radio>
</el-radio-group>
</el-col>
<el-col :span="12">
<el-button @click="doAudit" size="mini">提交审核</el-button>
</el-col>
</el-row>
<el-input placeholder="请输入审核意见" type="textarea" :maxlength="1000"
:autosize="{ minRows: 10, maxRows: 10 }" class="auditForm-input"
v-model="doForm.common"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<div>
<el-row>
<el-col :span="4">
<span style="font-weight: bolder;">该生申请奖项:</span>
</el-col>
<el-col :span="8">
<span style="color: red; font-weight: bolder;">
{{ auditForm.typeName }}
</span>
</el-col>
<el-col :span="6">
<el-button @click="lookNeedV = true;" size="mini">查看评优要求</el-button>
</el-col>
</el-row>
</div>
<el-drawer :modal="false" size="50%" title="评优要求" :visible.sync="lookNeedV" direction="ltr"
:append-to-body="true">
<div class="sign">
<ol>
<h3>学业奖学金</h3>
<li>
一等奖学金平均学分绩班级排名前3%学年综合素质测评班级排名前50%
</li>
<li>
二等奖学金平均学分绩级排名前6%学年综合素质测评班级排名前50%
</li>
<li>
三等奖学金平均学分绩班级排名前9%学年综合素质测评班级排名前50%
</li>
</ol>
</div>
<div class="sign">
<ol>
<h3>三好学生</h3>
<li>
劳全面发展平时注重道德修养勤俭节约弘扬正能量树立良好形象
</li>
<li>
以身作则为人表率具有较强的集体观念和集体荣誉感热心为同学服务待人诚恳谦虚有礼貌
</li>
<li>
积极参加学校开展的第二课堂活动第二课堂成绩单学分认定为优秀在各级各类活动竞赛中成绩突出
</li>
<li>
积极参加体育锻炼及其他文体活动身体健康体能考核成绩为良好及以上(体测成绩80分以上)
</li>
<li>
参评学年各科平均学分绩75分以上含75分考查课中等及以上平均学分绩班级排名前30%学年综合素质测评班级排名前30%
<!-- 学年青年大学习学习率达100% -->
</li>
</ol>
</div>
<div class="sign">
<ol>
<h3>优秀学生干部</h3>
<li>
关心集体吃苦在前以身作则能起到模范带头作用
</li>
<li>
具有较强的工作能力和组织能力工作认真负责责任心强团结同学热心为同学服务工作效果好社会实践工作取得较好成绩在学生中有较高威信
</li>
<li>
积极参加学校开展的第二课堂活动第二课堂成绩单学分认定为优秀在各级各类活动竞赛中成绩突出
</li>
<li>
积极参加体育锻炼及其他文体活动身体健康体能考核成绩为良好及以上
</li>
<li>
参评学年各科平均学分绩为70分以上含70分平均学分绩班级排名前40%学年综合素质测评班级排名前50%
<!-- 学年青年大学习学习率达100% -->
</li>
<span @click="lookMore"
style="text-decoration: underline;color: lightskyblue;cursor: pointer;">查看更多</span>
</ol>
</div>
</el-drawer>
<el-table :data="score_list">
<el-table-column label="学年" prop="stuYearName" align="center" />
<el-table-column label="平均学分绩" prop="stuScore" align="center" />
<el-table-column label="综合素质总成绩" prop="cphScore" align="center" />
<el-table-column label="体测成绩" prop="sportScore" align="center" />
<el-table-column label="平均学分绩班级排名" align="center">
<template slot-scope="scope">
{{ scope.row.stuClassRank + '/' + scope.row.classCount }}
</template>
</el-table-column>
<el-table-column label="综合素质总成绩班级排名" align="center">
<template slot-scope="scope">
{{ scope.row.cphClassRank + '/' + scope.row.classCount }}
</template>
</el-table-column>
<el-table-column label="平均学分绩班级排名百分比" align="center">
<template slot-scope="scope">
{{ Math.round(scope.row.stuClassRank / scope.row.classCount * 10000) / 100 + "%"
}}
</template>
</el-table-column>
<el-table-column label="学年综合素质测评班级排名百分比" align="center">
<template slot-scope="scope">
{{ Math.round(scope.row.cphClassRank / scope.row.classCount * 10000) / 100 + "%"
}}
</template>
</el-table-column>
</el-table>
<el-table :data="count_list">
<el-table-column label="学年" prop="stuYearName" align="center" />
<el-table-column label="课程总门数" prop="courseCount" align="center" />
<el-table-column label="通过门数" prop="passCount" align="center" />
<el-table-column label="未通过门数" prop="unpassCount" align="center" />
</el-table>
<el-row>
<el-col :span="12" v-for="(v, i) in course_list" :key="i">
<el-table :header-row-style="{ padding: '0' }" :data="v.value"
:row-style="{ height: '0' }" :cell-style="{ padding: '0' }">
<el-table-column :label="v.name" align="center">
<el-table-column label="课程" prop="courseName" align="center" />
<el-table-column label="成绩" prop="courseScore" align="center" />
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-col>
</div>
</el-row>
</el-form>
</el-dialog>
<el-dialog title="导出奖项审核结果" :visible.sync="exportV" width="500px">
<el-select placeholder="请选择学年" v-model="exportForm.stuYearId">
<el-option v-for="(v, i) in year_list" :key="i" clearable :value="v.id"
:label="v.stuYearName"></el-option>
</el-select>
<el-select placeholder="请选择奖项" v-model="exportForm.typeName">
<el-option v-for="(v, i) in code_list" :key="i" clearable :value="v.code" :label="v.name"></el-option>
</el-select>
<el-select style="width: 442px;" placeholder="请选择班级" v-model="exportForm.classId">
<el-option v-for="(v, i) in class_list" :key="i" clearable :value="v.classId"
:label="v.className"></el-option>
</el-select>
<div style="font-size: small;margin: 10px 0 10px 10px; color: red;">*学年奖项是必选项班级不选就默认导出全部</div>
<el-button @click="doExport">导出</el-button>
</el-dialog>
<el-dialog :visible.sync="lookMoreV" :append-to-body="true">
<MoreDetail></MoreDetail>
</el-dialog>
</div>
</template>
<script>
import {
listFdyAudit, lookDetail, listStuScoreClassRank, listStuYearCourseScore, countStuPass, countStuIam, fdyAudit
, fdyExport, applyStatus
} from "@/api/stuCQS/good/audit";
import { listOwnClass } from "@/api/stuCQS/info-fill/stu_eva_task";
import { listAllYear as listYear } from "@/api/stuCQS/basedata/year";
import * as XLSX from 'xlsx';
import { workbook2blob, openDownloadDialog, file2Xce } from "@/api/helpFunc";
import lodash from "lodash";
import { isEmpty, groupBy } from "@/api/helpFunc";
import MoreDetail from '@/views/stuCQS/good/MoreDetail.vue';
export default {
name: "fdy-audit",
dicts: ['audius_detail_type'],
components: {
MoreDetail
},
data() {
return {
applyStatus,
code_list: [
{
name: "学业奖学金",
code: "XYJXJ"
},
{
name: "三好学生",
code: "SHXS"
},
{
name: "优秀学生干部",
code: "YXXSGB"
}
],
isEmpty,
fullLoading: false,
loading: false,
table_data: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
code: null,
status: null,
stuNo: "",
stuName: ""
},
auditV: false,
auditForm: {},
material_list: [],
score_list: [],
myScoreV: false,
course_list: [],
courseParams: {
pageNum: 1,
pageSize: 10
},
courseTotal: 0,
course_loading: false,
count_list: [],
iamV: false,
iam_count: [],
doForm: {
auditId: null,
status: null,
common: ""
},
exportForm: {
typeName: null,
classId: null,
stuYearId: null
},
exportV: false,
class_list: [],
year_list: [],
lookNeedV: false,
lookMoreV: false,
}
},
created() {
this.listOwnClass();
this.listAllStuYear();
this.getList();
},
methods: {
getStepStatus(data) {
if ((data.includes('同意') && !data.includes('不同意')) || data.includes('通过') || (data.includes('符合') && !data.includes('不符合'))) {
return 'success';
} else {
return 'error';
}
},
getStep(data) {
if (!isEmpty(data.finalComment)) {
return 4;
} else if (!isEmpty(data.deptComment)) {
return 3;
} else if (!isEmpty(data.fdyComment)) {
return 2;
} else {
return 1;
}
},
lookMore() {
this.lookMoreV = true
window.open('http://zhxg.gxsdxy.cn/file/pypxnotify.pdf')
},
async listAllStuYear() {
let res = await listYear();
if (res.code == 200) {
this.year_list = [...res.data];
}
},
async listOwnClass() {
let res = await listOwnClass();
if (res.code == 200) {
this.class_list = [...res.data];
}
},
async doExport() {
let sdata = { ...this.exportForm };
if (isEmpty(sdata.stuYearId)) {
this.$message.info("请选择学年");
return;
}
if (isEmpty(sdata.typeName)) {
this.$message.info("请选择奖项");
return;
}
this.loading = true;
let res = await fdyExport(sdata);
this.loading = false;
if (res.code == 200) {
let data = res.data;
let fileName = "";
let fileHeader = [];
let fileHeaderZh = {};
let fileCol = [];
switch (sdata.typeName) {
case "XYJXJ":
fileHeader = ['stuYearName', 'deptName', 'majorName', 'className', 'stuNo', 'stuName', 'typeName', 'applyStatus', 'bankCard', 'bankAddr', 'importTime', 'teacherName'];
fileHeaderZh = {
'stuYearName': "学年",
"deptName": "学院",
"majorName": "专业",
"className": "班级",
"stuNo": "学号",
"stuName": "姓名",
"typeName": "奖项",
"applyStatus": "审核状态",
"bankCard": "银行卡号",
"bankAddr": "开户行",
"importTime": "导出时间",
'teacherName': "辅导员"
};
fileCol = [
{ wch: 15 },
{ wch: 40 },
{ wch: 40 },
{ wch: 40 },
{ wch: 10 },
{ wch: 10 },
{ wch: 15 },
{ wch: 20 },
{ wch: 40 },
{ wch: 40 },
{ wch: 40 },
{ wch: 40 }
];
fileName = "学业奖学金名单";
break;
case "SHXS":
fileHeader = ['stuYearName', 'deptName', 'majorName', 'className', 'stuNo', 'stuName', 'typeName', 'applyStatus', 'importTime', 'teacherName'];
fileHeaderZh = {
'stuYearName': "学年",
"deptName": "学院",
"majorName": "专业",
"className": "班级",
"stuNo": "学号",
"stuName": "姓名",
"typeName": "奖项",
"applyStatus": "审核状态",
"importTime": "导出时间",
'teacherName': "辅导员"
};
fileCol = [
{ wch: 15 },
{ wch: 40 },
{ wch: 40 },
{ wch: 40 },
{ wch: 10 },
{ wch: 10 },
{ wch: 15 },
{ wch: 15 },
{ wch: 40 },
{ wch: 40 }
];
fileName = "优秀学生干部名单";
break;
case "YXXSGB":
fileHeader = ['stuYearName', 'deptName', 'majorName', 'className', 'stuNo', 'stuName', 'typeName', 'applyStatus', 'importTime', 'teacherName'];
fileHeaderZh = {
'stuYearName': "学年",
"deptName": "学院",
"majorName": "专业",
"className": "班级",
"stuNo": "学号",
"stuName": "姓名",
"typeName": "奖项",
"applyStatus": "审核状态",
"importTime": "导出时间",
'teacherName': "辅导员"
};
fileCol = [
{ wch: 15 },
{ wch: 40 },
{ wch: 40 },
{ wch: 40 },
{ wch: 10 },
{ wch: 10 },
{ wch: 15 },
{ wch: 15 },
{ wch: 40 },
{ wch: 40 }
];
fileName = "学业奖学金名单";
break;
}
const arrayWithHeader = [fileHeaderZh, ...data];
var sheet1 = XLSX.utils.json_to_sheet(arrayWithHeader,
{
header: fileHeader,
skipHeader: true
});
sheet1["!cols"] = fileCol;
// 创建一个新的空的workbook
var wb = XLSX.utils.book_new();
// 为每一个工作簿设置名称并添加到workbookexcel表
XLSX.utils.book_append_sheet(wb, sheet1, fileName);
const workbookBlob = workbook2blob(wb); // 辅助函数workbook2blob
// 下载文档并添加文件名称
openDownloadDialog(workbookBlob, fileName + ".xlsx"); // 辅助函数openDownloadDialog
} else {
this.$message.info("出错啦,刷新试试");
}
},
async exportVClick() {
this.exportV = true;
},
async getList() {
this.loading = true;
let res = await listFdyAudit(this.queryParams);
this.loading = false;
if (res.code == 200) {
this.table_data = [...res.rows];
this.total = res.total;
}
},
/** 搜索按钮操作 */
handleQuery() {
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
async auditVClick(v) {
let id = v.applyId;
this.fullLoading = true;
let res = await lookDetail(id);
this.fullLoading = false;
if (res.code == 200) {
if (!isEmpty(res.data.material)) {
this.material_list = res.data.material.split(",");
} else {
this.material_list = [];
}
this.auditForm = res.data;
this.auditV = true;
}
//
this.myScoreVClick()
//this.iamVClick()
},
async countStuIam() {
let stuNo = this.auditForm.stuNo;
let res = await countStuIam(stuNo);
if (res.code == 200) {
this.iam_count = res.data;
}
},
async countStuPass() {
let stuNo = this.auditForm.stuNo;
let res = await countStuPass(stuNo);
if (res.code == 200) {
this.count_list = [...res.data];
}
},
async listStuYearCourseScore() {
let stuNo = this.auditForm.stuNo;
this.course_loading = true;
let res = await listStuYearCourseScore(stuNo, this.courseParams);
this.course_loading = false;
if (res.code == 200) {
let groupdata = groupBy([...res.rows], x => {
return x.termName;
});
let temp = [];
for (let i in groupdata) {
let needAddTemp = {};
needAddTemp.name = i.replace(/\"/g, "");
needAddTemp.value = groupdata[i];
temp.push(needAddTemp);
}
this.course_list = [...temp];
this.courseTotal = res.total;
}
},
async listStuScoreClassRank() {
let stuNo = this.auditForm.stuNo;
let res = await listStuScoreClassRank(stuNo);
if (res.code == 200) {
this.score_list = lodash.cloneDeep(res.data);
}
},
iamVClick() {
this.countStuIam();
this.countStuPass();
this.listStuScoreClassRank();
this.listStuYearCourseScore();
this.iamV = true;
},
myScoreVClick() {
this.countStuPass();
this.listStuScoreClassRank();
this.listStuYearCourseScore();
this.myScoreV = true;
},
async doAudit() {
let sdata = { ...this.doForm };
if (isEmpty(sdata.status)) {
this.$message.info("请选择是否通过");
return;
}
if (isEmpty(sdata.common)) {
this.$message.info("请填写审核意见");
return;
}
sdata.auditId = parseInt(this.auditForm.auditId);
this.fullLoading = true;
let res = await fdyAudit(sdata);
this.fullLoading = false;
if (res.code == 200) {
this.getList();
this.auditForm = {};
this.doForm = {
auditId: null,
status: null,
common: ""
};
this.auditV = false;
this.$message.success(res.msg);
}
}
}
}
</script>
<style lang="scss" scoped>
.addForm-input {
width: 400px;
}
.detail {
.el-form-item {
margin-bottom: 0px;
}
}
.sign {
width: 100%;
border: 1px solid rgb(163, 211, 255);
font-size: small;
margin-bottom: 10px;
border-radius: 2px;
}
</style>