Files
2025-07-16 15:34:34 +08:00

950 lines
25 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="detail">
<Nav :navs="navs" @change="navChange" />
<view class="form" v-if="navIndex==0">
<view class="container" style="padding-bottom: 60px;" v-if="formData!=null">
<!--学号 -->
<view class="form-item">
<text class="label">学号</text>
<text class="uni-input">{{ formData.stuNo }}</text>
</view>
<!--姓名 -->
<view class="form-item">
<text class="label">姓名</text>
<text class="uni-input">{{ formData.stuName }}</text>
</view>
<!-- 性别 -->
<view class="form-item">
<text class="label">性别</text>
<text class="uni-input">{{ formData.gender }}</text>
</view>
<!--院部 -->
<view class="form-item">
<text class="label">院部</text>
<text class="uni-input">{{ formData.departmentName }}</text>
</view>
<!--班级 -->
<view class="form-item">
<text class="label">年级</text>
<text class="uni-input">{{ formData.gradeName }}</text>
</view>
<view class="form-item">
<text class="label">班级</text>
<text class="uni-input">{{ formData.className }}</text>
</view>
<!--联系电话 -->
<view class="form-item">
<text class="label">出生日期</text>
<text class="uni-input">{{ formData.birthday }}</text>
</view>
<!--家长姓名 -->
<view class="form-item">
<text class="label">家长姓名</text>
<text class="uni-input">{{ formData.parentName }}</text>
</view>
<!--家长联系电话 -->
<view class="form-item">
<text class="label">家长联系电话</text>
<text class="uni-input">{{ formData.parentPhone }}</text>
</view>
<view class="form-item">
<text class="label">民族</text>
<text class="uni-input">{{ formData.mz }}</text>
</view>
<view class="form-item">
<text class="label">籍贯</text>
<text class="uni-input">{{ formData.jg }}</text>
</view>
<view class="form-item">
<text class="label">休学类型</text>
<text class="uni-input">{{rt_quit_type}}</text>
</view>
<view class="form-item">
<text class="label">申请原因</text>
<text class="uni-input">{{ formData.reasonApplying }}</text>
</view>
<view class="form-item">
<text class="label">辅导员联系情况</text>
<text class="uni-input">{{formData.ideologicalEducation}}</text>
</view>
<view class="form-item">
<text class="label">在校时间说明</text>
<text class="uni-input">{{formData.instructionSchoolHours}}</text>
</view>
<view class="form-item">
<text class="label">休学文号</text>
<text class="uni-input">{{formData.quitNumber}}</text>
</view>
<view class="form-item">
<text class="label">休学开始时间</text>
<text class="uni-input">{{formData.quitStartTime}}</text>
</view>
<view class="form-item">
<text class="label">休学结束时间</text>
<text class="uni-input">{{formData.quitEndTime}}</text>
</view>
<view class="form-item">
<text class="label">休学类别</text>
<text class="uni-input">{{transactionType}}</text>
</view>
<view class="form-item">
<text class="label">休学年份</text>
<text class="uni-input">{{formData.quitYear}}</text>
</view>
<view class="form-item">
<text class="label">备注</text>
<text class="uni-input">{{formData.remark}}</text>
</view>
<view class="form-item" style="height: auto;">
<text class="label">签名</text>
<view class="uni-input">
<image class="form-img" :src="ImageUrl+formData.applySignature" mode=""></image>
</view>
</view>
<view class="btns" v-if="tag==1">
<button class="turn-down" @tap="onReject" v-if="role!=='学生'">驳回</button>
<button class="return" @tap="onReturn" v-if="returnTaskList.length>0&&taskName!=='学生接收'">回退</button>
<button class="submit" @tap="onComplete">审批</button>
</view>
</view>
</view>
<view class="progress" v-if="navIndex==1">
<FlowStep :procInsId="taskForm.procInsId" :deployId="taskForm.deployId" />
</view>
<uni-popup class="popup" ref="approveDialog" type="dialog" background-color="#fff" v-if="formData!=null">
<view class="popup-content">
<view class="title">
流程审批
</view>
<scroll-view scroll-y="true" style="max-height:320px;">
<view class="content" v-if="taskName=='辅导员联系情况'">
<view class="form-item">
<label class="label"><text class="required">*</text>辅导员联系情况</label>
<textarea type="text" placeholder-class="placeholderColor" placeholder="请输入辅导员联系情况"
v-model="taskForm.ideologicalEducation" />
</view>
<view class="form-item">
<label class="label"><text class="required">*</text>在校时间说明</label>
<input type="text" placeholder-class="placeholderColor" placeholder="请输入在校时间说明"
v-model="taskForm.instructionSchoolHours" />
</view>
</view>
<view class="content" v-if="taskName=='学生教育管理科审核'">
<view class="form-item">
<label class="label"><text class="required">*</text>休学文号</label>
<input type="text" placeholder-class="placeholderColor" placeholder="请输入休学文号"
v-model="taskForm.quitNumber" />
</view>
<view class="form-item">
<label class="label"><text class="required">*</text>休学开始时间</label>
<picker @change="onQuitStartChangeTime" mode="date" :value="taskForm.quitStartTime">
<view class="uni-input">
<text
class="val">{{taskForm.quitStartTime==''?'休学开始时间':taskForm.quitStartTime}}</text>
<uni-icons type="calendar" size="25" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="form-item">
<label class="label"><text class="required">*</text>休学结束时间</label>
<picker @change="onQuitEndChangeTime" mode="date" :value="taskForm.quitEndTime">
<view class="uni-input">
<text class="val">{{taskForm.quitEndTime==''?'休学结束时间':taskForm.quitEndTime}}</text>
<uni-icons type="calendar" size="25" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="form-item">
<label class="label"><text class="required">*</text>休学类别</label>
<picker v-if="rt_categorys.length>0" range-key="dictLabel" :value="quit_category_index"
:range="rt_categorys" @change="quitCategoryChange">
<view class="uni-input">
<text
class="val">{{quit_category_index==-1?'请选择休学类别':rt_categorys[quit_category_index].dictLabel}}</text>
<uni-icons type="down" size="16" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="form-item">
<label class="label"><text class="required">*</text>休学年份</label>
<picker v-if="quitSchoolYears.length>0" @change="onQuitYearChangeTime"
:range="quitSchoolYears" :value="quitSchoolIndex" range-key="dictLabel">
<view class="uni-input">
<text
class="val">{{quitSchoolIndex==-1?'请选择休学年份':quitSchoolYears[quitSchoolIndex].dictLabel}}</text>
<uni-icons type="calendar" size="25" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="form-item">
<label class="label">休学备注</label>
<textarea v-model="taskForm.remark" type="text" placeholder-class="placeholderColor"
placeholder="请输入休学备注"></textarea>
</view>
</view>
<view class="content" v-if="taskName == '学生接收' || taskName == '辅导员接收'">
<view class="show-letter">
<view class="title">
休学证明
</view>
<view class="stu-name">
桂水电院 {{ formData.quitYear }} 休字第 {{ formData.quitNumber }}
</view>
<view class="desc">
{{ formData.stuName }},{{ formData.gender }},{{ formData.mz }},{{ formData.birthday }}出生{{ formData.jg }}{{ formData.className }}学生学号{{ formData.stuNo }}该生于个人原因-{{ formData.reasonApplying }}申请休学经学校研究同意休学时间从{{ formData.quitStartTime }}{{ formData.quitEndTime }}
</view>
<view class="bottom">
<view class="tip">
抄送教务处财务处{{ formData.departmentName }}
</view>
<view class="gaizhang">
<image
src="https://gss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D450%2C600/sign=debd0a4bb2fd5266a77e34109e28bb1d/8d5494eef01f3a297283d36e9d25bc315d607cc2.jpg"
mode="widthFix"></image>
<view class="time">
<text>学生工作处</text>
<text>{{formData.quitStartTime}}</text>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
<view class="btns">
<button type="default" @tap="onCancel">取消</button>
<button type="primary" @tap="approveDialogConfirm" :disabled="isSubmitting">确定</button>
</view>
</view>
</uni-popup>
<!-- 回退弹窗 -->
<uni-popup class="popup return-dialog" ref="returnDialog" type="dialog" background-color="#fff">
<view class="popup-content">
<view class="title">
退回流程
</view>
<view class="content">
<view class="form-item">
<label>退回节点</label>
<scroll-view scroll-y="true">
<view class="list">
<view class="item" @tap="taskDotChange(index,item)"
:class="index==taskDotIndex?'active':''" v-for="(item,index) in returnTaskList"
:key="index">
{{item.name}}
</view>
</view>
</scroll-view>
</view>
<view class="form-item">
<label><text class="required">*</text>退回意见</label>
<textarea v-model="taskForm.comment"></textarea>
</view>
</view>
<view class="btns">
<button type="default" @tap="onCancel">取消</button>
<button type="primary" @tap="returnDialogConfirm">确定</button>
</view>
</view>
</uni-popup>
<!-- 驳回弹窗 -->
<uni-popup ref="rejectDialog" type="dialog">
<uni-popup-dialog mode="input" title="驳回" v-model="inputReject" @confirm="rejectDialogConfirm"
placeholder="请输入驳回理由"></uni-popup-dialog>
</uni-popup>
</view>
</template>
<script>
import Nav from "@/components/navs/navs.vue"
import FlowStep from "@/components/flow-step/flow-step.vue"
import {
baseUrl
} from "@/config.js";
import {
getDiseaseTypeByDictValue
} from "@/utils/dict.js";
import uploadFile from "@/plugins/upload.js";
import {
getRtStuQuitSchoolByProcInsId,
updateRtStuQuitSchool
} from '@/api/rtStuQuitSchool/rtStuQuitSchool'
import {
getLeaveApplicationByProcInsId,
complete,
reject,
returnList,
returnTask,
getDisciplinaryApplicationByProcInsId,
getStuDisciplinaryRelieveByProcInsId,
updateDisciplinaryApplication
} from "@/api/task.js";
import {
getDicts
} from "@/api/system/dict/data";
import {
convertToTimestamp
} from "@/utils/time-calculation.js"
export default {
components: {
Nav,
FlowStep
},
data() {
return {
isSubmitting: false, //表单提交标志位
navs: [{
text: "表单信息",
val: 0
},
{
text: "流程跟踪",
val: 1
}
],
navIndex: 0,
taskDotIndex: 0,
returnTaskList: [], // 回退列表数据
formData: null,
rt_quit_type: "", //休学类型
rt_quit_types: [], //休学类型列表
quit_type_index: 0, //休学类型索引
rt_categorys: [], //休学类别列表
quit_category_index: -1, //休学类别索引
transactionType: "", //休学类别
ImageUrl: baseUrl,
role: uni.getStorageSync("roles"),
quitSchoolYears: [], //休学年份列表
quitSchoolIndex: -1, //休学年份列表
inputReject: "",
taskName: "", //节点名
category: "",
taskForm: {
multiple: false,
comment: '', // 意见内容
procInsId: '', // 流程实例编号
instanceId: '', // 流程实例编号
deployId: '', // 流程定义编号
taskId: '', // 流程任务编号
procDefId: '', // 流程编号
vars: '',
targetKey: '',
ideologicalEducation: "",
instructionSchoolHours: "",
quitNumber: "", //休学文号
quitStartTime: "",
quitEndTime: "",
quitYear: '', //休学年份
quitCategory: "", //休学类别
remark: '' //休学备注
},
// formDataState:false
}
},
onLoad(option) {
let query = JSON.parse(option.query);
this.taskId = query.taskId;
this.category = query.category;
this.tag = query.tag;
this.taskForm.deployId = query.deployId;
this.taskForm.instanceId = query.procInsId
this.taskForm.procInsId = query.procInsId
this.taskForm.executionId = query.executionId
this.taskForm.taskId = query.taskId
this.taskName = query.taskName
this.getRtStuQuitSchoolByProcInsId(this.taskForm.procInsId)
},
methods: {
navChange(index) {
this.navIndex = index;
},
taskDotChange(index, item) {
this.taskDotIndex = index;
this.taskForm.targetKey = item.id;
},
getRtStuQuitSchoolByProcInsId(procInsId) {
getRtStuQuitSchoolByProcInsId(procInsId).then((res) => {
this.formData = res.data;
this.get_penalty_type(this.formData.quitType);
this.get_category(this.formData.quitCategory);
if (this.tag == 1) {
this.getReturnList();
}
this.getYear();
})
},
onComplete() {
this.$refs.approveDialog.open();
},
onReturn() {
this.$refs.returnDialog.open();
},
getReturnList() {
returnList(this.taskForm).then((res) => {
this.returnTaskList = res.data
})
},
onReject() {
this.$refs.rejectDialog.open();
},
onCancel() {
this.$refs.approveDialog.close();
this.$refs.returnDialog.close();
},
//回退确认
returnDialogConfirm() {
if (this.taskForm.targetKey == "") {
this.taskForm.targetKey = this.returnTaskList[0].id;
}
if (this.taskForm.comment == "") {
uni.showToast({
title: `请填写回退意见`,
icon: "none"
});
return;
}
uni.showLoading({
title: "正在回退"
});
returnTask(this.taskForm).then((res) => {
uni.hideLoading();
uni.showToast({
title: res.msg
})
uni.navigateBack({
success: () => {
const pages = getCurrentPages();
if (pages.length > 0) {
const prevPage = pages[pages.length - 2]
if (prevPage && typeof prevPage.getList === 'function') {
prevPage.handleChange(2);
}
}
}
})
})
this.$refs.returnDialog.close();
},
approveDialogConfirm() {
let requiredFields = [];
if (this.taskName == '辅导员联系情况' && this.category == 'quitSchool') {
requiredFields = [
'ideologicalEducation',
'instructionSchoolHours'
];
} else if (this.taskName == '学生教育管理科审核' && this.category == 'quitSchool') {
requiredFields = [
'quitNumber',
'quitStartTime',
'quitEndTime',
'quitYear',
'quitCategory'
];
}
const emptyField = requiredFields.find(field => this.taskForm[field] === "");
if (emptyField) {
uni.showToast({
title: `请填写完整内容`,
icon: "none"
})
return;
}
let startTime = convertToTimestamp(this.taskForm.quitStartTime);
let endTime = convertToTimestamp(this.taskForm.quitEndTime);
if (endTime < startTime) {
uni.showToast({
title: "休学结束时间不能早于开始时间",
icon: "none",
duration: 2500
})
return;
}
uni.showLoading({
title: "正在审批"
});
console.log(this.taskForm);
this.isSubmitting = true; // 设置为正在提交
this.taskForm.comment = '同意';
complete(this.taskForm).then(res => {
if (res.code == 200) {
if (this.taskName == '辅导员联系情况' && this.category == 'quitSchool') {
this.formData.ideologicalEducation = this.taskForm.ideologicalEducation
this.formData.instructionSchoolHours = this.taskForm.instructionSchoolHours
this.updateRtStuQuitSchool()
} else if (this.taskName == '学生教育管理科审核' && this.category == 'quitSchool') {
// 学生教育管理科审核,赋值
this.formData.quitNumber = this.taskForm.quitNumber;
this.formData.quitStartTime = this.taskForm.quitStartTime;
this.formData.quitEndTime = this.taskForm.quitEndTime;
this.formData.quitType = this.taskForm.quitType;
this.formData.quitCategory = this.taskForm.quitCategory;
this.formData.quitYear = this.taskForm.quitYear;
this.formData.remark = this.taskForm.remark;
this.updateRtStuQuitSchool();
}
} else {
uni.showToast({
title: "审批成功"
});
}
uni.hideLoading();
uni.navigateBack({
success: () => {
const pages = getCurrentPages();
if (pages.length > 0) {
const prevPage = pages[pages.length - 2]
if (prevPage && typeof prevPage.getList === 'function') {
prevPage.handleChange(2);
}
}
}
})
})
},
rejectDialogConfirm() {
uni.showLoading({
title: "正在驳回"
});
let sData = {
taskId: this.taskForm.taskId,
comment: this.inputReject
}
reject(sData).then(res => {
if (res.code == 200) {
uni.showToast({
title: "已驳回"
})
uni.hideLoading();
uni.navigateBack({
success: () => {
const pages = getCurrentPages();
if (pages.length > 0) {
const prevPage = pages[pages.length - 2]
if (prevPage && typeof prevPage.getList === 'function') {
prevPage.handleChange(2);
console.log('刷新已办任务数据');
}
}
}
})
}
})
},
updateRtStuQuitSchool() {
updateRtStuQuitSchool(this.formData).then((response) => {
uni.showToast({
title: response.msg
})
})
},
//休学开始时间
onQuitStartChangeTime(e) {
this.taskForm.quitStartTime = e.detail.value;
},
//休学结束时间
onQuitEndChangeTime(e) {
this.taskForm.quitEndTime = e.detail.value;
},
//获取休学年份
getYear() {
getDicts('sys_teacher_kpi_filling_year').then(res => {
this.quitSchoolYears = res.data;
});
},
//切换休学年份
onQuitYearChangeTime(e) {
this.quitSchoolIndex = e.detail.value;
this.taskForm.quitYear = this.quitSchoolYears[e.detail.value].dictValue;
},
//获取休学类型
get_penalty_type(ty) {
getDicts('rt_quit_type').then(res => {
this.rt_quit_types = res.data;
this.rt_quit_type = getDiseaseTypeByDictValue("rt_quit_type", ty, res.data);
this.taskForm.quitType = ty;
});
},
//获取休学类别
get_category(ty) {
getDicts('rt_transaction_type').then(res => {
this.rt_categorys = res.data;
this.transactionType = getDiseaseTypeByDictValue("rt_transaction_type", ty, res.data);
});
},
//切换休学类别
quitCategoryChange(e) {
this.quit_category_index = e.detail.value;
this.taskForm.quitCategory = this.rt_categorys[e.detail.value].dictValue;
},
}
}
</script>
<style scoped lang="scss">
.detail {
padding-top: 90rpx;
.container {
display: flex;
flex-direction: column;
align-items: center;
padding: 10rpx;
.form-item {
width: 95%;
height: 80rpx;
display: flex;
align-items: center;
margin-bottom: 20rpx;
justify-content: space-between;
border-bottom: 1px solid #ededee;
}
.custom-input {
width: 100%;
}
.form-text {
width: 95%;
margin-bottom: 20rpx;
border-bottom: 1px solid #ededee;
}
.form-img {
width: 100px;
height: 100px;
margin-bottom: 20rpx;
border-bottom: 1px solid #ededee;
}
.example-body {
margin-top: 20rpx;
margin-bottom: 20rpx;
}
.txt {
margin-top: 20rpx;
}
.label {
text-align: right;
margin-right: 20rpx;
text-wrap: nowrap;
}
.select {
color: #888889;
white-space: nowrap;
/* 防止换行 */
overflow: hidden;
/* 隐藏溢出部分 */
text-overflow: ellipsis;
/* 显示省略号 */
}
.uni-input {
color: #888889;
text-align: right;
}
.btn {
width: 100%;
height: 90rpx;
display: flex;
justify-content: space-between;
position: fixed;
bottom: 20px;
left: 0;
margin: 0 auto;
}
button {
width: 30%;
background-color: #87CEFA;
color: white;
}
.form-address {
width: 100%;
display: flex;
justify-content: space-between;
}
.labelsafe {
color: red;
}
.form-canvas {
width: 95%;
height: 700rpx;
}
.tab-box {
width: 80%;
height: 100vh;
background-color: #f0f0f0;
.success-img {
width: 90%;
height: 300rpx;
}
}
.btns {
display: flex;
position: fixed;
bottom: 0;
left: 0;
right: 0;
button {
height: 50px;
line-height: 50px;
// width: 50%;
flex: 1;
border-radius: 0;
&.turn-down {
background-color: #FF3334;
}
&.return {
background-color: #FFBA00;
}
&.submit {
background-color: #0092FF;
}
}
}
}
.progress {
padding: 0 30rpx 30rpx;
.title {
font-weight: bold;
color: #202020;
display: inline-block;
font-size: 30rpx;
margin-bottom: 30rpx;
}
}
.popup {
.popup-content {
width: 90vw;
max-height: 86vh;
overflow: scroll;
// padding: 0 40rpx;
.title {
font-size: 40rpx;
font-weight: bold;
text-align: center;
margin: 20rpx 0;
}
.content {
padding: 0 40rpx;
.show-letter {
.title {
font-size: 30rpx;
text-align: left;
margin-top:40rpx;
color: #888889;
}
.stu-name {
margin-bottom: 8rpx;
color: #888889;
margin-bottom:25rpx;
}
.desc {
color: #797979;
line-height:45rpx;
}
.bottom {
.tip {
color: #888889;
font-size:26rpx;
margin-top: 20rpx;
}
.gaizhang {
text-align: right;
position: relative;
image {
width: 200rpx;
}
.time {
position: absolute;
right: 30rpx;
bottom: 55rpx;
display: flex;
flex-direction: column;
}
}
}
}
.form-item {
.required {
color: red;
margin-right: 8rpx;
}
&.download {
margin: 50rpx 0 30rpx;
display: flex;
align-items: center;
color: #4097FE;
justify-content: center;
.file-icon {
width: 50rpx;
margin-right: 20rpx;
}
text {
border-bottom: 1px solid #4097FE;
padding-bottom: 2px;
}
}
.label {
display: inline-block;
margin: 30rpx 0 20rpx;
color: #202020;
font-weight: 600;
}
input {
display: inline-block;
padding: 0 20rpx;
height: 70rpx;
}
textarea {
height: 200rpx;
padding: 10rpx;
}
.placeholderColor {
color: #D8D8D8;
}
input,
textarea {
width: 100%;
border: 1px solid #E1E1E1;
border-radius: 16rpx;
}
picker {
border: 1px solid #E1E1E1;
height: 70rpx;
line-height: 70rpx;
padding: 0 30rpx;
.uni-input {
display: flex;
color: #202020;
opacity: 0.35;
.val {
flex: 1;
}
}
}
.uni-file-picker {
/deep/ .uni-progress-bar {
background-color: transparent !important;
}
}
}
}
.btns {
display: flex;
margin-top: 80rpx;
button {
flex: 1;
border-radius: 0;
border-bottom: 0;
&:first-child {
background-color: transparent;
border: 1px solid #4097FE;
border-bottom: 0;
color: #4097FE;
}
}
}
}
}
.return-dialog {
.form-item {
label {
font-weight: bold;
display: inline-block;
margin-bottom: 10px;
}
&:last-child {
margin-top: 15px;
}
.list {
height: auto;
max-height: 200px;
display: flex;
flex-wrap: wrap;
// height: 200px;
// display: flex;
// flex-wrap: wrap;
.item {
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
&.active {
background-color: #0092FF;
color: white;
}
}
}
}
}
}
</style>