Files
zhxg_app/pages/finance/knzzGl/apply.vue

1342 lines
41 KiB
Vue
Raw 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="knzz-gl-apply">
<!-- 选项卡容器 -->
<view class="tabs-container">
<view class="tabs-header">
<view class="tab-item" :class="{ active: activeTab === 0 }" @click="switchTab(0)">
<uni-icons type="contact" size="12" :color="activeTab === 0 ? '#409EFF' : '#666'"></uni-icons>
<text class="tab-text">基本信息</text>
</view>
<view class="tab-item" :class="{ active: activeTab === 1 }" @click="switchTab(1)">
<uni-icons type="home" size="12" :color="activeTab === 1 ? '#409EFF' : '#666'"></uni-icons>
<text class="tab-text">家庭经济情况</text>
</view>
<view class="tab-item" :class="{ active: activeTab === 2 }" @click="switchTab(2)">
<uni-icons type="compose" size="12" :color="activeTab === 2 ? '#409EFF' : '#666'"></uni-icons>
<text class="tab-text">学习情况</text>
</view>
<view class="tab-item" :class="{ active: activeTab === 3 }" @click="switchTab(3)">
<uni-icons type="chat" size="12" :color="activeTab === 3 ? '#409EFF' : '#666'"></uni-icons>
<text class="tab-text">申请理由</text>
</view>
<view class="tab-item" :class="{ active: activeTab === 4 }" @click="switchTab(4)">
<uni-icons type="document" size="12" :color="activeTab === 4 ? '#409EFF' : '#666'"></uni-icons>
<text class="tab-text">审核意见</text>
</view>
</view>
</view>
<!-- 表单内容区域 -->
<scroll-view scroll-y class="form-scroll" :style="{ height: formScrollHeight }">
<view class="form-wrapper">
<!-- 1. 基本信息标签页 -->
<view v-show="activeTab === 0" class="tab-panel">
<view class="form-card">
<view class="card-title">学生基本信息</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>学号</label>
<input v-model="formData.stuNo" placeholder="请输入学号" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>姓名</label>
<input v-model="formData.stuName" placeholder="请输入姓名" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>性别</label>
<picker mode="selector" :range="genderOptions" :range-key="'text'" v-model="formData.gender" @change="handleGenderChange" :disabled="type === 'detail'">
<view class="picker-input">
{{ formData.gender ? formData.gender : '请选择性别' }}
</view>
</picker>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>民族</label>
<input v-model="formData.mz" placeholder="请输入民族" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>政治面貌</label>
<input v-model="formData.zzmm" placeholder="请输入政治面貌" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>班级</label>
<input v-model="formData.className" placeholder="请输入班级" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>学院</label>
<input v-model="formData.deptName" placeholder="请输入学院" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>专业</label>
<input v-model="formData.majorName" placeholder="请输入专业" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>联系电话</label>
<input v-model="formData.stuPhone" placeholder="请输入联系电话" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>身份证号</label>
<input v-model="formData.idCard" placeholder="请输入身份证号" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>入学时间</label>
<input v-model="formData.inTime" placeholder="请输入入学时间" class="form-input" :disabled="type === 'detail'" ></input>
</view>
<!-- <view class="form-item">
<label class="form-label"><span class="red-tip">*</span>证件照</label>
<view class="example-body">
<uni-file-picker
@select="handlePhotoUpload"
@delete="deletePhoto"
:auto-upload="false"
limit="1"
:disabled="type === 'detail'"
mode="grid"
></uni-file-picker>
</view>
<view class="upload-tip" v-if="type !== 'detail'">支持上传jpg/png格式照片单个文件不超过5MB</view>
</view> -->
<view class="form-item">
<label class="form-label">曾获资助/奖励</label>
<textarea v-model="formData.helpHis" placeholder="请输入曾获资助或奖励情况" class="form-textarea" rows="3" :disabled="type === 'detail'" ></textarea>
</view>
</view>
</view>
<!-- 2. 家庭经济情况标签页 -->
<view v-show="activeTab === 1" class="tab-panel">
<view class="form-card">
<view class="card-title">家庭经济情况</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>家庭人口数</label>
<input v-model="formData.familyNum" placeholder="请填写家庭人口数" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>家庭月总收入</label>
<input v-model="formData.monthMoney" placeholder="请填写家庭月总收入" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>人均月收入</label>
<input v-model="formData.perMoney" placeholder="请填写人均月收入" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>收入来源</label>
<input v-model="formData.moneySrc" placeholder="请填写收入来源" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>困难类型</label>
<view class="checkbox-container">
<view class="checkbox-item" v-for="(option, index) in hardTypeOptions" :key="index" @click="type !== 'detail' && setHardType(option.value)">
<view class="custom-checkbox" :class="{ 'checkbox-checked': formData.hardType === option.value }">{{ formData.hardType === option.value ? '✓' : '' }}</view>
<text class="checkbox-text">{{ option.text }}</text>
</view>
</view>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>家庭住址</label>
<input v-model="formData.homeAddr" placeholder="请填写家庭住址" class="form-input" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>邮政编码</label>
<input v-model="formData.postCode" placeholder="请填写邮政编码" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
</view>
</view>
<!-- 3. 学习情况标签页 -->
<view v-show="activeTab === 2" class="tab-panel">
<view class="form-card">
<view class="card-title">学习情况</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>专业排名</label>
<input v-model="formData.majorRank" placeholder="请填写专业排名" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>专业人数</label>
<input v-model="formData.majorNum" placeholder="请填写专业人数" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>实行综合考评排名</label>
<view class="checkbox-container">
<view class="checkbox-item" @click="type !== 'detail' && setIsCph('是')">
<view class="custom-checkbox" :class="{ 'checkbox-checked': formData.isCph === '是' }">{{ formData.isCph === '是' ? '✓' : '' }}</view>
<text class="checkbox-text"></text>
</view>
<view class="checkbox-item" @click="type !== 'detail' && setIsCph('否')">
<view class="custom-checkbox" :class="{ 'checkbox-checked': formData.isCph === '否' }">{{ formData.isCph === '否' ? '✓' : '' }}</view>
<text class="checkbox-text"></text>
</view>
</view>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>班级排名</label>
<input v-model="formData.classRank" placeholder="请填写班级排名" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>班级人数</label>
<input v-model="formData.classNum" placeholder="请填写班级人数" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>必修课门数</label>
<input v-model="formData.bxk" placeholder="请填写必修课门数" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>及格门数</label>
<input v-model="formData.jg" placeholder="请填写及格门数" class="form-input" type="number" :disabled="type === 'detail'"></input>
</view>
</view>
</view>
<!-- 4. 申请理由标签页 -->
<view v-show="activeTab === 3" class="tab-panel">
<view class="form-card">
<view class="card-title">申请理由与承诺</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>申请理由</label>
<textarea placeholder="请输入申请理由" v-model="formData.applyReason" class="form-textarea" rows="4" :disabled="type === 'detail'"></textarea>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>证明材料</label>
<view class="upload-btn" @click="handleUpload" :class="{ 'upload-disabled': type === 'detail' }">
<text class="upload-icon">+</text>
<text>{{ type === 'detail' ? '已上传佐证材料' : '上传文件' }}</text>
</view>
<view class="file-list" v-if="affixFiles.length">
<view class="file-item" v-for="(file, index) in affixFiles" :key="index">
<text class="file-name" @click="previewImage(file.serverUrl)">{{ file.attachmentName || file.trueName }}</text>
<uni-icons type="trash-filled" size="30" @click="deleteFile(index)" v-if="type !== 'detail'" class="delete-btn"></uni-icons>
</view>
</view>
<view class="upload-tip" v-if="type !== 'detail'">1个人上学年成绩单2辅导员签字的综测排名截图</view>
<view class="upload-tip" v-if="type !== 'detail'">请上传 大小不超过 10MB 格式为 doc/docx/xls/ppt/txt/pdf/xlsx 的文件</view>
</view>
<view class="form-item">
<label class="form-label"><span class="red-tip">*</span>申请人签名</label>
<view class="sign-img" v-if="signImg">
<image :src="signImg" mode="aspectFit" style="width: 200px; height: 50px; cursor: pointer;" @click="previewImage(signImg)"></image>
<text @tap="signToggle" class="re-sign-text">重新签名</text>
</view>
<view v-else class="sign" @tap="signToggle" :class="{ 'sign-disabled': type === 'detail' }">
点击签名
</view>
</view>
</view>
</view>
<!-- 5. 审核意见标签页 -->
<view v-show="activeTab === 4" class="tab-panel">
<view class="form-card">
<view class="card-title">审核意见</view>
<!-- 辅导员审核意见 -->
<view class="approval-section">
<view class="section-title">辅导员审核意见</view>
<view class="approval-content">
<text v-if="formData.fdyCmt" class="approval-text">{{ formData.fdyCmt }}</text>
<text v-else class="no-content">暂无审核意见</text>
</view>
<view class="approval-info">
<text v-if="formData.fdyName">审核人{{ formData.fdyName }}</text>
<text v-if="formData.fdyDate">审核时间{{ formData.fdyDate }}</text>
</view>
</view>
<!-- 院系审核意见 -->
<view class="approval-section">
<view class="section-title">院系审核意见</view>
<view class="approval-content">
<text v-if="formData.xwCmt" class="approval-text">{{ formData.xwCmt }}</text>
<text v-else class="no-content">暂无审核意见</text>
</view>
<view class="approval-info">
<text v-if="formData.xwName">审核人{{ formData.xwName }}</text>
<text v-if="formData.xwDate">审核时间{{ formData.xwDate }}</text>
</view>
</view>
<!-- 学工审核意见 -->
<view class="approval-section">
<view class="section-title">学工审核意见</view>
<view class="approval-content">
<text v-if="formData.xgCmt" class="approval-text">{{ formData.xgCmt }}</text>
<text v-else class="no-content">暂无审核意见</text>
</view>
<view class="approval-info">
<text v-if="formData.xgName">审核人{{ formData.xgName }}</text>
<text v-if="formData.xgDate">审核时间{{ formData.xgDate }}</text>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
<!-- 提交按钮 -->
<view class="submit-btn-container" v-if="type !== 'detail'">
<view class="submit-btn" @click="submitForm">
<text>提交申请</text>
</view>
</view>
<!-- 签名组件 -->
<jp-signature-popup ref="jpSignature" :required="true" popup @change="uploadSign" />
</view>
</template>
<script>
import { add, doEdit, getDetail, doReApply, doApply } from '@/api/finance/knzzGl';
import { getOwnSign } from '@/api/workStudy/post';
import { getOwnKnrd, getOwnExtraInfo, getOwnInfo as getOwnStuInfo } from '@/api/finance/special';
import uploadFile from "@/plugins/upload.js"
export default {
data() {
return {
activeTab: 0,
formScrollHeight: '600px',
type: 'add',
id: '',
loading: false,
listData: null,
isReApply: false,
genderOptions: [
{ value: '男', text: '男' },
{ value: '女', text: '女' }
],
hardTypeOptions: [
{ value: '特别困难', text: '特别困难' },
{ value: '比较困难', text: '比较困难' },
{ value: '一般困难', text: '一般困难' }
],
formData: {
stuNo: '',
stuName: '',
gender: '',
mz: '',
zzmm: '',
className: '',
stuPhone: '',
idCard: '',
inTime: '',
helpHis: '',
familyNum: '',
monthMoney: '',
perMoney: '',
moneySrc: '',
hardType: '',
homeAddr: '',
postCode: '',
majorRank: '',
majorNum: '',
isCph: '否',
classRank: '',
classNum: '',
bxk: '',
jg: '',
applyReason: '',
hardFile: '',
applySign: '',
pic: '',
majorName: '',
deptName: '',
fdyCmt: '',
fdySign: '',
fdyDate: '',
fdyName: '',
xwCmt: '',
xwSign: '',
xwDate: '',
xwName: '',
xgCmt: '',
xgSign: '',
xgDate: '',
xgName: ''
},
affixFiles: [],
signImg: '',
baseUrl: uni.getStorageSync('baseUrl')
};
},
onLoad(option) {
// 接收从主页面传递过来的申请ID和类型
if (option && option.id) {
this.id = option.id;
if (option.type === 'detail') {
this.type = 'detail';
}
// 接收是否是重新提交的参数
if (option.isReApply === 'true') {
this.isReApply = true;
}
// 从本地存储获取从列表页面传递的数据
const storedItem = uni.getStorageSync('glApplyItem');
if (storedItem) {
this.listData = storedItem;
// 清除本地存储,避免数据残留
uni.removeStorageSync('glApplyItem');
}
}
this.calculateFormHeight();
this.initData();
},
onShow() {
this.calculateFormHeight();
},
methods: {
// 计算表单滚动区域高度
calculateFormHeight() {
const systemInfo = uni.getSystemInfoSync();
const navHeight = 44; // 导航栏高度
const tabsHeight = 50; // 选项卡高度
const submitBtnHeight = 60; // 提交按钮高度
const padding = 20; // 页面内边距
this.formScrollHeight = (systemInfo.windowHeight - navHeight - tabsHeight - submitBtnHeight - padding) + 'px';
},
// 初始化数据
async initData() {
this.loading = true;
try {
// 并行请求所有基础信息
const [signRes, knrdRes, stuInfoRes, extraInfoRes] = await Promise.all([
getOwnSign(),
getOwnKnrd(),
getOwnStuInfo(),
getOwnExtraInfo()
]);
// 处理签名信息
if (signRes && signRes.data) {
this.formData.applySign = signRes.data;
this.signImg = this.baseUrl + signRes.data;
}
// 处理困难认定信息
if (knrdRes && knrdRes.data) {
const knrdData = knrdRes.data;
console.log('困难认定信息:', knrdData);
// 处理家庭人口总数、家庭月总收入、人均月收入
if (knrdData.rkzs) {
this.formData.familyNum = knrdData.rkzs;
}
if (knrdData.jtnsr) {
// 计算家庭月总收入年收入除以12保留两位小数
const jtysr = parseFloat((knrdData.jtnsr / 12).toFixed(2));
this.formData.monthMoney = jtysr;
// 计算人均月收入:家庭月总收入除以家庭人口总数,保留两位小数
if (knrdData.rkzs) {
const rjysr = parseFloat((jtysr / Number(knrdData.rkzs)).toFixed(2));
this.formData.perMoney = rjysr;
}
}
// 处理困难类型
if (knrdData.xsqmyj) {
console.log('xsqmyj:', knrdData.xsqmyj);
switch (knrdData.xsqmyj) {
case '1':
this.formData.hardType = '特别困难';
break;
case '2':
this.formData.hardType = '比较困难';
break;
case '3':
this.formData.hardType = '一般困难';
break;
}
}
}
// 处理学生基本信息
if (stuInfoRes && stuInfoRes.data) {
const stuInfo = stuInfoRes.data;
console.log('学生基本信息:', stuInfo);
this.formData.stuNo = stuInfo.stuNo || this.formData.stuNo;
this.formData.stuName = stuInfo.name || this.formData.stuName;
this.formData.gender = stuInfo.gender || this.formData.gender;
// 从cphStuExtraInfo获取民族和政治面貌
if (stuInfo.cphStuExtraInfo) {
console.log('cphStuExtraInfo:', stuInfo.cphStuExtraInfo);
this.formData.mz = stuInfo.cphStuExtraInfo.mz || this.formData.mz;
this.formData.zzmm = stuInfo.cphStuExtraInfo.zzmm || this.formData.zzmm;
} else {
console.log('cphStuExtraInfo不存在');
}
// 处理班级信息
if (stuInfo.srsClass && stuInfo.srsClass.className) {
this.formData.className = stuInfo.srsClass.className;
}
this.formData.stuPhone = stuInfo.phone || this.formData.stuPhone;
this.formData.idCard = stuInfo.idCard || this.formData.idCard;
// 处理专业信息
if (stuInfo.srsMajors && stuInfo.srsMajors.majorName) {
this.formData.majorName = stuInfo.srsMajors.majorName;
}
// 处理学院信息
if (stuInfo.dept && stuInfo.dept.deptName) {
this.formData.deptName = stuInfo.dept.deptName;
}
}
// 处理额外信息
if (extraInfoRes && extraInfoRes.data) {
const extraInfo = extraInfoRes.data;
console.log('额外信息:', extraInfo);
this.formData.familyNum = extraInfo.familyNum || this.formData.familyNum;
this.formData.monthMoney = extraInfo.monthMoney || this.formData.monthMoney;
this.formData.perMoney = extraInfo.perMoney || this.formData.perMoney;
this.formData.moneySrc = extraInfo.moneySrc || this.formData.moneySrc;
// 处理困难类型
if (extraInfo.hardType) {
this.formData.hardType = extraInfo.hardType;
} else if (extraInfo.xsqmyj) {
// 处理xsqmyj字段映射到困难类型
switch (extraInfo.xsqmyj) {
case '1':
this.formData.hardType = '特别困难';
break;
case '2':
this.formData.hardType = '比较困难';
break;
case '3':
this.formData.hardType = '一般困难';
break;
}
}
// 尝试从额外信息中获取民族和政治面貌
if (extraInfo.mz) {
this.formData.mz = extraInfo.mz;
}
if (extraInfo.zzmm) {
this.formData.zzmm = extraInfo.zzmm;
}
// 处理家庭住址和邮政编码
if (extraInfo.xjtdz) {
this.formData.homeAddr = extraInfo.xjtdz;
} else if (extraInfo.hkszd) {
this.formData.homeAddr = extraInfo.hkszd;
} else if (extraInfo.hksz1 && extraInfo.hksz2 && extraInfo.hksz3) {
this.formData.homeAddr = extraInfo.hksz1 + extraInfo.hksz2 + extraInfo.hksz3;
}
if (extraInfo.jtyzbm) {
this.formData.postCode = extraInfo.jtyzbm;
} else if (extraInfo.yzbm) {
this.formData.postCode = extraInfo.yzbm;
}
// 处理证件照
if (extraInfo.whitePhoto) {
this.formData.pic = extraInfo.whitePhoto;
console.log('设置证件照:', this.formData.pic);
}
}
// 如果有申请ID获取申请详情
if (this.id) {
// 如果有从列表页面传递的数据,直接使用该数据进行回显
if (this.listData) {
this.formData = { ...this.formData, ...this.listData };
// 处理签名图片
if (this.listData.applySign) {
this.signImg = this.baseUrl + this.listData.applySign;
}
// 处理困难佐证材料
if (this.listData.hardFile) {
// 处理多个文件路径的情况
const filePaths = this.listData.hardFile.split(',');
this.affixFiles = filePaths.map(filePath => {
// 从文件路径中提取文件名
const fileName = filePath.split('/').pop();
// 构造文件信息对象
return {
attachmentName: fileName,
attachmentUrl: filePath,
serverUrl: filePath,
fileId: '',
fileSize: 0,
fileSuffix: fileName.split('.').pop().toLowerCase(),
savePath: filePath
};
});
}
} else {
// 从接口获取数据
this.getDetail();
}
}
} catch (error) {
console.error('初始化数据失败:', error);
} finally {
this.loading = false;
}
},
// 切换选项卡
switchTab(index) {
this.activeTab = index;
},
// 处理性别选择
handleGenderChange(e) {
const index = e.detail.value;
this.formData.gender = this.genderOptions[index].value;
},
// 设置困难类型
setHardType(value) {
this.formData.hardType = value;
console.log('设置困难类型:', value);
},
// 设置是否综合考评
setIsCph(value) {
this.formData.isCph = value;
},
// 获取详细信息
getDetail() {
getDetail(this.id).then(response => {
const res = response || {};
const data = res.data || {};
// 处理困难类型
let hardType = data.hardType;
if (!hardType && data.xsqmyj) {
switch (data.xsqmyj) {
case '1':
hardType = '特别困难';
break;
case '2':
hardType = '比较困难';
break;
case '3':
hardType = '一般困难';
break;
}
}
// 构建formData对象
this.formData = {
...data,
hardType: hardType
};
// 处理签名图片
if (this.formData.applySign) {
this.signImg = this.baseUrl + this.formData.applySign;
} else {
this.signImg = '';
}
// 处理困难佐证材料
if (this.formData.hardFile) {
// 处理多个文件路径的情况
const filePaths = this.formData.hardFile.split(',');
this.affixFiles = filePaths.map(filePath => {
// 从文件路径中提取文件名
const fileName = filePath.split('/').pop();
// 构造文件信息对象
return {
attachmentName: fileName,
attachmentUrl: filePath,
serverUrl: filePath,
fileId: '',
fileSize: 0,
fileSuffix: fileName.split('.').pop().toLowerCase(),
savePath: filePath
};
});
}
}).catch(error => {
console.error('获取详情失败:', error);
uni.showToast({
title: '获取详情失败',
icon: 'none'
});
});
},
// 提交表单
submitForm() {
// 表单验证
if (!this.formData.inTime) {
uni.showToast({ title: '请填写入学时间', icon: 'none' });
return;
}
if (!this.formData.helpHis) {
uni.showToast({ title: '请填写曾获奖励,没有写无', icon: 'none' });
return;
}
if (!this.formData.familyNum) {
uni.showToast({ title: '请填写家庭人口数', icon: 'none' });
return;
}
if (!this.formData.monthMoney) {
uni.showToast({ title: '请填写家庭月总收入', icon: 'none' });
return;
}
if (!this.formData.perMoney) {
uni.showToast({ title: '请填写人均月收入', icon: 'none' });
return;
}
if (!this.formData.moneySrc) {
uni.showToast({ title: '请填写收入来源', icon: 'none' });
return;
}
if (!this.formData.hardType) {
uni.showToast({ title: '请选择困难类型', icon: 'none' });
return;
}
if (!this.formData.homeAddr) {
uni.showToast({ title: '请填写家庭住址', icon: 'none' });
return;
}
if (!this.formData.postCode) {
uni.showToast({ title: '请填写邮政编码', icon: 'none' });
return;
}
if (!this.formData.majorRank) {
uni.showToast({ title: '请填写专业排名', icon: 'none' });
return;
}
if (!this.formData.majorNum) {
uni.showToast({ title: '请填写专业人数', icon: 'none' });
return;
}
if (!this.formData.bxk) {
uni.showToast({ title: '请填写必修课门数', icon: 'none' });
return;
}
if (!this.formData.jg) {
uni.showToast({ title: '请填写及格门数', icon: 'none' });
return;
}
if (!this.formData.applyReason) {
uni.showToast({ title: '请填写申请理由', icon: 'none' });
return;
}
if (!this.formData.hardFile) {
uni.showToast({ title: '请上传证明材料', icon: 'none' });
return;
}
if (!this.formData.applySign) {
uni.showToast({ title: '请上传申请人签名', icon: 'none' });
return;
}
const submitData = { ...this.formData };
if (this.id) {
if (this.isReApply) {
// 重新提交
doReApply(submitData).then(response => {
const res = response || {};
if (res.code === 200 || res.code === 0) {
uni.showToast({
title: '重新提交成功',
icon: 'success'
});
uni.navigateBack();
} else {
uni.showToast({
title: res.msg || '重新提交失败',
icon: 'none'
});
}
}).catch(error => {
console.error('重新提交失败:', error);
uni.showToast({
title: '重新提交失败',
icon: 'none'
});
});
} else {
// 修改
doEdit(submitData).then(response => {
const res = response || {};
if (res.code === 200 || res.code === 0) {
uni.showToast({
title: '修改成功',
icon: 'success'
});
uni.navigateBack();
} else {
uni.showToast({
title: res.msg || '修改失败',
icon: 'none'
});
}
}).catch(error => {
console.error('修改失败:', error);
uni.showToast({
title: '修改失败',
icon: 'none'
});
});
}
} else {
// 提交申请
doApply(submitData).then(response => {
const res = response || {};
if (res.code === 200 || res.code === 0) {
uni.showToast({
title: '提交成功',
icon: 'success'
});
uni.navigateBack();
} else {
uni.showToast({
title: res.msg || '提交失败',
icon: 'none'
});
}
}).catch(error => {
console.error('提交失败:', error);
uni.showToast({
title: '提交失败',
icon: 'none'
});
});
}
},
// 处理文件上传
handleUpload() {
// 如果是详情模式,不执行上传操作
if (this.type === 'detail') {
return;
}
// 定义affixId生成工具函数
const generateUUID = () => {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
};
uni.chooseFile({
count: 5,
extension: ['doc', 'docx', 'xls', 'ppt', 'txt', 'pdf', 'xlsx'],
success: async (chooseRes) => {
// 初始化affixId如果为空则生成唯一ID
if (!this.formData.affixId) {
this.formData.affixId = generateUUID();
}
// 遍历选择的文件,逐个上传
for (const file of chooseRes.tempFiles) {
try {
// 构造上传参数
const formDataObj = {
affixId: this.formData.affixId,
fileName: file.name,
fileSize: file.size
};
// 上传文件
console.log('准备上传文件:', file.path);
console.log('上传参数:', formDataObj);
const uploadRes = await uploadFile('/affix/upload', file.path, formDataObj);
console.log('上传结果:', uploadRes);
const result = typeof uploadRes === 'string' ? JSON.parse(uploadRes) : uploadRes;
console.log('解析结果:', result);
// 上传结果校验
if (result && result.code === 200) {
// 构造文件信息对象
const fileInfo = {
attachmentName: file.name,
trueName: file.name,
attachmentUrl: result.savePath,
serverUrl: result.savePath || '',
fileId: result.id || '',
fileSize: file.size,
fileSuffix: file.name.split('.').pop().toLowerCase(),
savePath: result.savePath
};
// 去重逻辑
const isDuplicate = this.affixFiles.some(item =>
item.attachmentName === file.name && item.fileSize === file.size
);
if (!isDuplicate) {
this.affixFiles.push(fileInfo);
// 更新hardFile字段为所有文件路径的逗号分隔字符串
this.formData.hardFile = this.affixFiles.map(item => item.savePath).join(',');
}
uni.showToast({
title: `文件 ${file.name} 上传成功`,
icon: 'success',
duration: 1500
});
} else {
// 上传失败处理
uni.showToast({
title: `文件 ${file.name} 上传失败:${result.message || '未知错误'}`,
icon: 'none',
duration: 2000
});
}
} catch (error) {
// 异常捕获
console.error(`文件 ${file.name} 上传异常:`, error);
uni.showToast({
title: `文件 ${file.name} 上传异常,请重试`,
icon: 'none',
duration: 2000
});
}
}
},
// 取消选择文件的处理
fail: (err) => {
console.error('选择文件失败:', err);
uni.showToast({
title: '选择文件失败,请重试',
icon: 'none'
});
}
});
},
// 删除文件
deleteFile(index) {
this.affixFiles.splice(index, 1);
// 更新hardFile字段为剩余文件路径的逗号分隔字符串
this.formData.hardFile = this.affixFiles.map(item => item.savePath).join(',');
},
// 预览图片
previewImage(url) {
// 检查文件类型是否为图片
const fileSuffix = url.split('.').pop().toLowerCase();
const imageSuffixes = ['jpg', 'jpeg', 'png', 'gif', 'bmp'];
if (imageSuffixes.includes(fileSuffix)) {
uni.previewImage({
urls: [url]
});
} else {
// 非图片文件,使用其他方式处理
uni.showToast({
title: '该文件类型不支持预览',
icon: 'none'
});
}
},
// 签名相关
signToggle() {
this.$refs.jpSignature.toPop();
},
// 上传签名
uploadSign(data) {
if (data) {
// 上传签名图片到后端
uploadFile('/common/upload', data).then((res) => {
const result = typeof res === 'string' ? JSON.parse(res) : res;
if (result && result.code === 200) {
this.formData.applySign = result.fileName || result.savePath;
this.signImg = result.url || (this.baseUrl + (result.fileName || result.savePath));
} else {
uni.showToast({
title: '签名上传失败,请重试',
icon: 'none'
});
}
}).catch((error) => {
console.error('签名上传异常:', error);
uni.showToast({
title: '签名上传异常,请重试',
icon: 'none'
});
});
}
},
// 处理证件照上传
handlePhotoUpload(e) {
const file = e.tempFile;
// 检查文件大小
if (file.size > 5 * 1024 * 1024) {
uni.showToast({
title: '文件大小不能超过5MB',
icon: 'none'
});
return;
}
// 检查文件类型
const fileExt = file.name.split('.').pop().toLowerCase();
if (!['jpg', 'jpeg', 'png'].includes(fileExt)) {
uni.showToast({
title: '只支持jpg/jpeg/png格式的图片',
icon: 'none'
});
return;
}
uni.showLoading({ title: '上传中...' });
uploadFile('/common/upload', file.path).then((res) => {
uni.hideLoading();
const result = typeof res === 'string' ? JSON.parse(res) : res;
if (result && result.code === 200) {
this.formData.pic = result.fileName || result.savePath;
uni.showToast({
title: '证件照上传成功',
icon: 'success'
});
} else {
uni.showToast({
title: '证件照上传失败,请重试',
icon: 'none'
});
}
}).catch((error) => {
uni.hideLoading();
console.error('证件照上传异常:', error);
uni.showToast({
title: '证件照上传异常,请重试',
icon: 'none'
});
});
},
// 删除证件照
deletePhoto() {
this.formData.pic = '';
uni.showToast({
title: '证件照已删除',
icon: 'success'
});
}
}
};
</script>
<style scoped>
.knzz-gl-apply {
background-color: #F3F4F6;
min-height: 100vh;
}
.tabs-container {
background-color: white;
position: sticky;
top: 0;
z-index: 10;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.tabs-header {
display: flex;
justify-content: space-around;
align-items: center;
height: 50px;
}
.tab-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 0 10rpx;
position: relative;
}
.tab-item.active {
color: #409EFF;
}
.tab-item.active::after {
content: '';
position: absolute;
bottom: -12rpx;
left: 20%;
width: 60%;
height: 3rpx;
background-color: #409EFF;
border-radius: 3rpx;
}
.tab-text {
margin-top: 4rpx;
font-size: 24rpx;
}
.form-scroll {
width: 100%;
}
.form-wrapper {
padding: 20rpx;
}
.tab-panel {
width: 100%;
}
.form-card {
background-color: white;
border-radius: 10rpx;
padding: 20rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
margin-bottom: 20rpx;
}
.card-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
display: block;
}
.form-item {
margin-bottom: 20rpx;
}
.form-label {
display: block;
font-size: 28rpx;
color: #606266;
margin-bottom: 10rpx;
}
.red-tip {
color: #f56c6c;
font-size: 28rpx;
margin-right: 5rpx;
}
.form-input {
width: 100%;
height: 80rpx;
border: 1rpx solid #dcdfe6;
border-radius: 10rpx;
padding: 0 20rpx;
font-size: 28rpx;
color: #303133;
background-color: #fafafa;
}
.form-textarea {
width: 100%;
min-height: 160rpx;
border: 1rpx solid #dcdfe6;
border-radius: 10rpx;
padding: 20rpx;
font-size: 28rpx;
color: #303133;
background-color: #fafafa;
resize: none;
}
.picker-input {
width: 100%;
height: 80rpx;
border: 1rpx solid #dcdfe6;
border-radius: 10rpx;
padding: 0 20rpx;
font-size: 28rpx;
color: #303133;
background-color: #fafafa;
display: flex;
align-items: center;
}
.checkbox-container {
display: flex;
gap: 40rpx;
}
.checkbox-item {
display: flex;
align-items: center;
gap: 10rpx;
}
.custom-checkbox {
width: 32rpx;
height: 32rpx;
border: 2rpx solid #dcdfe6;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: white;
}
.checkbox-checked {
background-color: #409EFF;
border-color: #409EFF;
}
.checkbox-text {
font-size: 28rpx;
color: #303133;
}
.upload-btn {
width: 100%;
height: 120rpx;
border: 2rpx dashed #dcdfe6;
border-radius: 10rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: #fafafa;
cursor: pointer;
}
.upload-icon {
font-size: 48rpx;
color: #409EFF;
margin-bottom: 10rpx;
}
.upload-disabled {
opacity: 0.6;
cursor: not-allowed;
}
.file-list {
margin-top: 20rpx;
}
.file-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10rpx 0;
border-bottom: 1rpx solid #f0f0f0;
}
.file-name {
font-size: 26rpx;
color: #409EFF;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.delete-btn {
color: #f56c6c;
}
.upload-tip {
font-size: 24rpx;
color: #909399;
margin-top: 10rpx;
}
.example-body {
margin-top: 10rpx;
}
.sign {
width: 200px;
height: 50px;
border: 1rpx solid #dcdfe6;
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #fafafa;
cursor: pointer;
font-size: 24rpx;
color: #606266;
}
.sign-disabled {
opacity: 0.6;
cursor: not-allowed;
}
.sign-img {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.re-sign-text {
margin-top: 10rpx;
font-size: 24rpx;
color: #409EFF;
cursor: pointer;
}
.approval-section {
margin-bottom: 30rpx;
.section-title {
font-size: 26rpx;
font-weight: bold;
color: #333;
margin-bottom: 15rpx;
}
.approval-content {
padding: 20rpx;
background-color: #F9F9F9;
border-radius: 10rpx;
margin-bottom: 10rpx;
transition: all 0.3s ease;
&:hover {
background-color: #F0F0F0;
}
.approval-text {
font-size: 24rpx;
color: #666;
line-height: 1.5;
white-space: pre-wrap;
}
.no-content {
font-size: 24rpx;
color: #999;
}
}
.approval-info {
display: flex;
justify-content: space-between;
font-size: 22rpx;
color: #999;
padding: 0 20rpx;
}
}
/* 提交按钮容器 */
.submit-btn-container {
position: fixed;
bottom: 0;
left: 0;
right: 0;
display: flex;
padding: 10px;
background-color: #fff;
border-top: 1px solid #e4e7ed;
z-index: 100;
}
/* 提交按钮 */
.submit-btn {
width: 100%;
height: 40px;
border-radius: 20px;
font-size: 14px;
border: none;
background-color: #409EFF;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
}
.submit-primary {
background-color: #67c23a;
}
</style>