Files
school-developer/src/views/recruit/recruitstudentsignup/detaiform.vue
zhoutianchi bad8ca8357 1
2026-02-26 18:36:33 +08:00

1695 lines
59 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>
<el-dialog
:title="title"
:close-on-click-modal="false"
v-model="visible"
append-to-body
width="90%"
>
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" label-width="120px">
<el-tabs v-model="activeTab">
<el-tab-pane label="基本信息" name="basic">
<!-- 基本信息 -->
<div class="form-section">
<div class="section-title">基本信息</div>
<el-row :gutter="20" >
<el-col :span="6">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable :disabled="dataForm.id !== ''"
placeholder="请选择招生计划">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="姓名" prop="name" >
<el-input type="text" v-model="dataForm.name" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="曾用名" prop="oldName">
<el-input type="text" v-model="dataForm.oldName" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="民族" prop="nationality">
<el-select v-model="dataForm.nationality" filterable placeholder="请选择民族" :disabled="!isEdit">
<el-option
v-for="item in nationalityList"
:key="item.nationCode"
:label="item.nationName"
:value="item.nationName">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="证件类型" prop="idCardType">
<el-radio-group v-model="dataForm.idCardType" :disabled="!isEdit" @change="handleIdCardTypeChange">
<el-radio v-for="item in idCardTypeList" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="身份证号" prop="idNumber">
<el-input
v-model="dataForm.idNumber"
placeholder="身份证号"
maxlength="20"
v-input-filter="'idcard'"
:disabled="!isEdit">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="性别" prop="gender" :required="isGenderRequired">
<el-radio-group v-model="dataForm.gender" :disabled="!isEdit || dataForm.idCardType=='0'">
<el-radio v-for="item in sexy" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否团员" prop="isLeagueMember">
<el-select v-model="dataForm.isLeagueMember" filterable clearable placeholder="请选择是否团员" :disabled="!isEdit">
<el-option
v-for="item in yes_no_type"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否住宿" prop="isAccommodation">
<el-select v-model="dataForm.isAccommodation" filterable clearable placeholder="请选择是否住宿" :disabled="!isEdit">
<el-option
v-for="item in yes_no_type"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="18">
<el-form-item label="毕业学校" prop="schoolOfGraduation">
<el-input type="text" v-model="dataForm.schoolOfGraduation" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" >
<el-col :span="6">
<el-form-item label="准考证号" prop="examRegistrationNumbers">
<el-input
v-model="dataForm.examRegistrationNumbers"
placeholder="准考证号"
maxlength="20"
:disabled="!isEdit"
v-input-filter="'alphanumeric'">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="文化程度" prop="degreeOfEducation">
<el-select v-model="dataForm.degreeOfEducation" filterable placeholder="请选择文化程度" :disabled="!isEdit" @change="changeEducation">
<el-option
v-for="item in eduList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="成绩" prop="score">
<el-input-number
controls-position="right"
v-model="dataForm.score"
placeholder="成绩"
:min="0"
:max="1000"
:disabled="!isEdit"
@change="calculateCorrectedScore">
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="户口性质" prop="residenceType">
<el-select v-model="dataForm.residenceType" filterable clearable placeholder="请选择户口性质" :disabled="!isEdit">
<el-option
v-for="item in residenceTypeList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 证件信息 -->
<el-row v-if="dataForm.degreeOfEducation=='1'" :gutter="20" >
<el-col :span="6">
<el-form-item label="学校归属地" prop="schoolArea">
<el-select v-model="dataForm.schoolArea" filterable placeholder="请选择学校归属地" :disabled="!isEdit" @change="changeFrom">
<el-option
v-for="item in schoolFromList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-if="(dataForm.degreeOfEducation) && (dataForm.schoolArea=='2')" :span="6">
<el-form-item label="学校所在省市" prop="jsOtherCity">
<el-select v-model="dataForm.jsOtherCity" filterable placeholder="请选择学校所在省市"
:disabled="!isEdit" @change="changeSchoolCode">
<el-option
v-for="item in schoolCodeList"
:key="item.regionId"
:label="item.regionName"
:value="item.regionId">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-if="(dataForm.degreeOfEducation) && (dataForm.schoolArea=='3')" :span="6">
<el-form-item label="外省" prop="otherProvince">
<el-select v-model="dataForm.otherProvince" filterable placeholder="请选择学校所在省市"
:disabled="!isEdit" @change="changeSchoolCode">
<el-option
v-for="item in areaHomeProvinceList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="当地总分" prop="fullScore">
<el-input-number
controls-position="right"
v-model="dataForm.fullScore"
:min="0"
:max="1000"
:disabled="isShow"
@change="changePlaceScore">
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="成绩折算分" prop="correctedScore">
<el-input-number
controls-position="right"
v-model="dataForm.correctedScore"
:min="0"
:max="1000"
disabled>
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<!-- 户口所在地 -->
<el-row :gutter="20" >
<el-col :span="12">
<el-form-item label="户口所在地" prop="residenceProvince">
<div class="address-group">
<el-select v-model="dataForm.residenceProvince" filterable clearable placeholder="省" class="address-select" :disabled="!isEdit" @change="changeR(1)">
<el-option
v-for="item in areaProvinceList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
<span class="address-separator">-</span>
<el-select v-model="dataForm.residenceCity" filterable clearable placeholder="市" class="address-select" :disabled="!isEdit" @change="changeR(2)">
<el-option
v-for="item in areaCityList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
<span class="address-separator">-</span>
<el-select v-model="dataForm.residenceArea" filterable clearable placeholder="区/县" class="address-select" :disabled="!isEdit">
<el-option
v-for="item in areaAreaList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="户口详细地址" prop="residenceDetail">
<el-input type="text" v-model="dataForm.residenceDetail" placeholder="请输入详细地址" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 家庭地址 -->
<el-row :gutter="20" >
<el-col :span="12">
<el-form-item label="家庭地址" prop="homeAddressProvince">
<div class="address-group">
<el-select v-model="dataForm.homeAddressProvince" filterable clearable placeholder="省" class="address-select" :disabled="!isEdit" @change="changeH(1)">
<el-option
v-for="item in areaHomeProvinceList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
<span class="address-separator">-</span>
<el-select v-model="dataForm.homeAddressCity" filterable clearable placeholder="市" class="address-select" :disabled="!isEdit" @change="changeH(2)">
<el-option
v-for="item in areaHomeCityList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
<span class="address-separator">-</span>
<el-select v-model="dataForm.homeAddressArea" filterable clearable placeholder="区/县" class="address-select" :disabled="!isEdit">
<el-option
v-for="item in areaHomeAreaList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="家庭详细地址" prop="homeAddressDetail">
<el-input type="text" v-model="dataForm.homeAddressDetail" placeholder="请输入详细地址" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" >
<el-col :span="6">
<el-form-item label="家长姓名" prop="parentName">
<el-input type="text" v-model="dataForm.parentName" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="家长手机" prop="parentTelOne">
<el-input
v-model="dataForm.parentTelOne"
type="tel"
placeholder="家长手机"
maxlength="11"
:disabled="!isEdit"
v-input-filter="'number'">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="家长固话" prop="parentTelTwo">
<el-input
v-model="dataForm.parentTelTwo"
placeholder="家长固话"
maxlength="20"
:disabled="!isEdit"
v-input-filter="'tel'">
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="本人联系电话" prop="selfTel">
<el-input
v-model="dataForm.selfTel"
type="tel"
placeholder="本人联系电话"
maxlength="11"
:disabled="!isEdit"
v-input-filter="'number'">
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 专业信息 -->
<div class="form-section">
<div class="section-title">专业信息</div>
<el-row v-if="dataForm.id" :gutter="20" >
<el-col :span="8">
<el-form-item label="拟报专业1" prop="wishMajorOne">
<el-select v-model="dataForm.wishMajorOne" filterable clearable placeholder="请选择专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="拟报专业2" prop="wishMajorTwo">
<el-select v-model="dataForm.wishMajorTwo" filterable clearable placeholder="请选择专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="拟报专业3" prop="wishMajorThree">
<el-select v-model="dataForm.wishMajorThree" filterable clearable placeholder="请选择专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" >
<el-col :span="24">
<el-form-item label="录取专业" prop="confirmedMajor">
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="" :disabled="!isEdit" @change="changeConfirmedMajor(dataForm.confirmedMajor)">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName+' || '+item.xyNum"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="isEdit" :gutter="20" >
<el-col :span="8" v-if="twoMajorList.length>0">
<el-form-item label="两年制专业" prop="twoMajor" >
<el-select v-model="dataForm.twoMajor" filterable clearable placeholder="" @change="changeConfirmedMajor(dataForm.twoMajor)">
<el-option
v-for="item in twoMajorList"
:key="item.majorCode"
:label="item.majorName+' || '+item.xyNum"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8" v-if="threeMajorList.length>0">
<el-form-item label="三年制专业" prop="threeMajor" v-if="threeMajorList.length>0">
<el-select v-model="dataForm.threeMajor" filterable clearable placeholder="" @change="changeConfirmedMajor(dataForm.threeMajor)">
<el-option
v-for="item in threeMajorList"
:key="item.majorCode"
:label="item.majorName+' || '+item.xyNum"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8" v-if="fourMajorList.length>0">
<el-form-item label="四年制专业" prop="fourMajor" >
<el-select v-model="dataForm.fourMajor" filterable clearable placeholder="" @change="changeConfirmedMajor(dataForm.fourMajor)">
<el-option
v-for="item in fourMajorList"
:key="item.majorCode"
:label="item.majorName+' || '+item.xyNum"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8" v-if="fiveMajorList.length>0">
<el-form-item label="五年制专业" prop="fiveMajor" >
<el-select v-model="dataForm.fiveMajor" filterable clearable placeholder="" @change="changeConfirmedMajor(dataForm.fiveMajor)">
<el-option
v-for="item in fiveMajorList"
:key="item.majorCode"
:label="item.majorName+' || '+item.xyNum"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8" v-if="sixMajorList.length>0">
<el-form-item label="六年制专业" prop="sixMajor">
<el-select v-model="dataForm.sixMajor" filterable clearable placeholder="" @change="changeConfirmedMajor(dataForm.sixMajor)">
<el-option
v-for="item in sixMajorList"
:key="item.majorCode"
:label="item.majorName+' || '+item.xyNum"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8" v-if="sevenMajorList.length>0">
<el-form-item label="七年制专业" prop="sevenMajor">
<el-select v-model="dataForm.sevenMajor" filterable clearable placeholder="" @change="changeConfirmedMajor(dataForm.sevenMajor)">
<el-option
v-for="item in sevenMajorList"
:key="item.majorCode"
:label="item.majorName+' || '+item.xyNum"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 费用信息 -->
<el-row :gutter="20" >
<el-col :span="8">
<el-form-item label="学费" prop="feeTuition">
<el-input-number v-model="dataForm.feeTuition" controls-position="right" :min="0" :max="999999" :step-strictly="true" disabled></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="代办费" prop="feeAgency">
<el-input-number v-model="dataForm.feeAgency" controls-position="right" :min="0" :max="999999" :step-strictly="true" disabled></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="总费用" prop="allMoney">
<span class="total-fee">{{Number(dataForm.feeTuition)+Number(dataForm.feeAgency)}}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 其他信息 -->
<el-row :gutter="20" >
<el-col :span="8">
<el-form-item label="联系人" prop="contactName">
<el-select v-model="dataForm.contactName" filterable clearable placeholder="请选择联系人" :disabled="!isEdit">
<el-option
v-for="item in contactNameList"
:key="item.teacherNo"
:label="item.realName+'-'+item.deptCode"
:value="item.teacherNo">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="辨色力" prop="colorDiscrimination">
<el-select v-model="dataForm.colorDiscrimination" filterable clearable placeholder="请选择辨色力" :disabled="!isEdit">
<el-option
v-for="item in color_discrimination"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" >
<el-col :span="12">
<el-form-item label="既往病史" prop="pastMedicalHistory">
<el-input type="textarea" v-model="dataForm.pastMedicalHistory" placeholder="请输入既往病史" :rows="2" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remarks">
<el-input type="textarea" v-model="dataForm.remarks" placeholder="备注" :rows="2" :disabled="!isEdit"></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-tab-pane>
<el-tab-pane label="附件材料" name="attachment">
<!-- 附件材料 -->
<el-row :gutter="20" >
<el-col :span="6">
<el-form-item label="成绩单" prop="scorePhoto">
<el-upload
:action="uploadUrl"
class="avatar-uploader"
name="file"
:headers="headers"
:data="uploadData"
:show-file-list="false"
:before-upload="beforeUpload"
:http-request="httpRequest"
:on-success="uploadSuccess">
<div v-if="dataForm.scorePhoto" class="avatar-wrapper">
<img :src="baseUrl + dataForm.scorePhoto" class="avatar"/>
</div>
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="毕业证" prop="graPic">
<el-upload
:action="uploadUrl"
class="avatar-uploader"
name="file"
:headers="headers"
:data="uploadData"
:show-file-list="false"
:before-upload="beforeUpload"
:http-request="httpRequest"
:on-success="upload2Success">
<div v-if="dataForm.graPic" class="avatar-wrapper">
<img :src="baseUrl + dataForm.graPic" class="avatar"/>
</div>
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="在常营业执照" prop="yyPic">
<el-upload
:action="uploadUrl"
class="avatar-uploader"
name="file"
:headers="headers"
:data="uploadData"
:show-file-list="false"
:before-upload="beforeUpload"
:http-request="httpRequest"
:on-success="upload3Success">
<div v-if="dataForm.yyPic" class="avatar-wrapper">
<img :src="baseUrl + dataForm.yyPic" class="avatar"/>
</div>
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="在常社保证明" prop="sbPic">
<el-upload
:action="uploadUrl"
class="avatar-uploader"
name="file"
:headers="headers"
:data="uploadData"
:show-file-list="false"
:before-upload="beforeUpload"
:http-request="httpRequest"
:on-success="upload5Success">
<div v-if="dataForm.sbPic" class="avatar-wrapper">
<img :src="baseUrl + dataForm.sbPic" class="avatar"/>
</div>
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" >
<el-col>
<el-form-item label="在常租赁合同/房产证明" prop="housePic">
<el-upload
:action="uploadUrl"
list-type="picture-card"
name="file"
:headers="headers"
:limit="5"
:data="uploadData"
:file-list="houseList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="remove4Handler"
:http-request="httpRequest"
:on-success="upload4Success">
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
<template #tip>
<div>最多上传5张</div>
</template>
</el-upload>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="户口本" prop="householdPic">
<el-upload
:action="uploadUrl"
list-type="picture-card"
name="file"
:headers="headers"
:limit="5"
:data="uploadData"
:file-list="hkPicList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="remove6Handler"
:http-request="httpRequest"
:on-success="upload6Success">
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
<template #tip>
<div>最多上传5张</div>
</template>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</el-form>
<template #footer v-if="isEdit">
<div class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataFormSubmit('0')" v-if="hasAuth('recruit_recruitstudentsignup_add') && canSubmit&&!dataForm.id">保存并送审</el-button>
<el-button type="primary" @click="dataFormSubmit('0')" v-if="hasAuth('recruit_recruitstudentsignup_edit') && canSubmit&&dataForm.id">保存</el-button>
<el-button type="success" icon="CircleCheck" @click="dataFormSubmit('20',false)" v-if="hasAuth('signup_info_exam') && canSubmit&&dataForm.id">确认录取</el-button>
<el-button type="warning" icon="CircleCheck" @click="dataFormSubmit('20',true)" v-if="hasAuth('signup_pass_force') && canSubmit&&dataForm.id">强制录取</el-button>
<el-button type="danger" icon="CircleClose" @click="dataFormSubmit('-20',false)" v-if="hasAuth('signup_info_exam') && canSubmit&&dataForm.id">驳回</el-button>
</div>
</template>
<el-dialog title="图片预览" v-model="dialogUploadVisible" append-to-body>
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick, watch, computed, onMounted } from 'vue'
import { ElNotification } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import { useAuth } from '/@/hooks/auth'
import { useMessage, useMessageBox } from '/@/hooks/message'
import { Session } from '/@/utils/storage'
import axios from 'axios'
import { getObj, putObj, addObj ,makeCorrectScore} from '/@/api/recruit/recruitstudentsignup'
import { getList } from "/@/api/recruit/recruitstudentplangroup"
import { listByEdu } from "/@/api/recruit/recruitstudentplan"
import { getDictsByTypes } from "/@/api/admin/dict"
import { useDict } from '/@/hooks/dict'
import { areaList, areaSonList } from "/@/api/recruit/recruitstudentschool"
import { list as scoreList } from "/@/api/recruit/recruitstudentplancorrectscoreconfig"
import { queryAllTeacher } from "/@/api/professional/professionaluser/teacherbase"
import { getNationalList } from "/@/api/basic/basicnation"
import { verifyAdmissionNumber, verifyPhone } from '/@/utils/toolsValidate'
import { AUDIT_STATUS_LIST, getStatusConfig } from '/@/config/global'
const { hasAuth } = useAuth()
const message = useMessage()
const messageBox = useMessageBox()
// Emits
const emit = defineEmits<{
(e: 'refreshDataList'): void
}>()
// 表单引用
const dataFormRef = ref()
const baseUrl = import.meta.env.VITE_API_URL
const uploadUrl = baseUrl + '/recruit/file/uploadAttachment'
// 响应式数据
const visible = ref(false)
const canSubmit = ref(false)
const title = ref("")
const activeTab = ref('basic')
// 上传相关
const uploadData = reactive({})
const houseList = ref<any[]>([])
const hkPicList = ref<any[]>([])
const fileReader = ref<FileReader | null>(null)
const dialogImageUrl = ref("")
const dialogUploadVisible = ref(false)
// 请求头
const headers = computed(() => {
return {
"Authorization": 'Bearer ' + Session.getToken()
}
})
// 字典数据 是否 性别 辨色力
const { yes_no_type, sexy, color_discrimination } = useDict('yes_no_type', 'sexy', 'color_discrimination')
const eduList = ref<any[]>([])
const type = ref<number | null>(null)
const isShow = ref(false)
const isEdit = ref(false)
// 性别是否必填(证件类型不是身份证时必填)
const isGenderRequired = computed(() => dataForm.idCardType !== '0')
// 录取状态
const auditStatusList = AUDIT_STATUS_LIST
// 户口性质
const residenceTypeList = ref<any[]>([])
const schoolCodeList = ref<any[]>([])
const contactNameList = ref<any[]>([])
const planList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const areaProvinceList = ref<any[]>([])
const areaCityList = ref<any[]>([])
const areaAreaList = ref<any[]>([])
const areaHomeProvinceList = ref<any[]>([])
const areaHomeCityList = ref<any[]>([])
const areaHomeAreaList = ref<any[]>([])
const sevenMajorList = ref<any[]>([])
const sixMajorList = ref<any[]>([])
const fiveMajorList = ref<any[]>([])
const fourMajorList = ref<any[]>([])
const threeMajorList = ref<any[]>([])
const twoMajorList = ref<any[]>([])
const agencyFeeList = ref<any[]>([])
const tuitionFeeList = ref<any[]>([])
const schoolFromList = ref<any[]>([])
const nationalityList = ref<any[]>([])
const idCardTypeList = ref<any[]>([])
const dataForm = reactive({
id: "",
groupId: "",
name: "",
oldName: "",
gender: "",
nationality: "",
degreeOfEducation: "",
isLeagueMember: "",
schoolOfGraduation: "",
isAccommodation: "",
examRegistrationNumbers: "",
isMinimumLivingSecurity: "",
score: "",
postcode: "",
residenceType: "",
correctedScore: 0,
fullScore: "",
schoolArea: "",
idNumber: "",
residenceProvince: "",
residenceCity: "",
residenceArea: "",
residenceDetail: "",
homeAddressProvince: "",
homeAddressCity: "",
homeAddressArea: "",
homeAddressDetail: "",
parentName: "",
parentTelOne: "",
parentTelTwo: "",
selfTel: "",
wishMajorOne: "",
wishMajorTwo: "",
wishMajorThree: "",
confirmedMajor: "",
sevenMajor:"",
sixMajor:"",
fiveMajor:"",
fourMajor: "",
threeMajor: "",
twoMajor: "",
feeTuition: 0,
feeAgency: 0,
feeContribute: 0,
scorePhoto: "",
graPic: "",
yyPic: "",
housePic: "",
sbPic: "",
contactName: "",
oldSerialNumber: "",
colorDiscrimination: "",
nutrition: "",
height: "",
weight: "",
pastMedicalHistory: "",
eyesightLeft: "",
eyesightRight: "",
correctEyesightLeft: "",
correctEyesightRight: "",
remarks: "",
auditRemarks: "",
serialNumber: "",
auditStatus:"",
jsOtherCity:"",
householdPic:"",
otherProvince:"",
idCardType:"0",
scorePhotoList: [] as string[],
graPicList: [] as string[],
yyPicList: [] as string[],
housePicList: [] as string[],
sbPicList: [] as string[],
householdPicList: [] as string[]
})
const dataRule = reactive({
groupId: [
{required: true, message: '招生计划不能为空', trigger: 'change'}
],
name: [
{required: true, message: '姓名不能为空', trigger: 'change'}
],
gender: [
{
validator: (rule: any, value: any, callback: any) => {
// 如果证件类型是身份证,性别可以不填(后台会根据身份证号自动获取)
if (dataForm.idCardType === '0') {
callback()
} else if (!value) {
callback(new Error('性别不能为空'))
} else {
callback()
}
},
trigger: 'change'
}
],
nationality: [
{required: true, message: '民族不能为空', trigger: 'change'}
],
degreeOfEducation: [
{required: true, message: '文化程度不能为空', trigger: 'change'}
],
isLeagueMember: [
{required: true, message: '是否团员不能为空', trigger: 'change'}
],
schoolOfGraduation: [
{required: true, message: '毕业学校不能为空', trigger: 'change'}
],
isAccommodation: [
{required: true, message: '是否住宿不能为空', trigger: 'change'}
],
residenceType: [
{required: true, message: '户口性质不能为空', trigger: 'change'}
],
idCardType: [
{required: true, message: '证件类型不能为空', trigger: 'change'}
],
idNumber: [
{required: true, message: '身份证不能为空', trigger: 'change'}
],
examRegistrationNumbers: [
{required: true, message: '准考证号不能为空', trigger: 'change'},
{
validator: (rule: any, value: any, callback: any) => {
if (value && !verifyAdmissionNumber(value)) {
callback(new Error('请输入正确的准考证号'))
} else {
callback()
}
},
trigger: 'blur'
}
],
score: [] as any[],
fullScore: [] as any[],
jsOtherCity: [] as any[],
otherProvince: [] as any[],
residenceProvince: [
{required: true, message: '户口所在地不能为空', trigger: 'change'}
],
residenceCity: [
{required: true, message: '户口所在地不能为空', trigger: 'change'}
],
residenceArea: [
{required: true, message: '户口所在地不能为空', trigger: 'change'}
],
residenceDetail: [
{required: true, message: '户口所在地不能为空', trigger: 'change'}
],
homeAddressProvince: [
{required: true, message: '家庭地址不能为空', trigger: 'change'}
],
homeAddressCity: [
{required: true, message: '家庭地址不能为空', trigger: 'change'}
],
homeAddressArea: [
{required: true, message: '家庭地址不能为空', trigger: 'change'}
],
homeAddressDetail: [
{required: true, message: '家庭地址不能为空', trigger: 'change'}
],
parentName: [
{required: true, message: '家长姓名不能为空', trigger: 'change'}
],
parentTelOne: [
{required: true, message: '家长手机不能为空', trigger: 'change'},
{
validator: (rule: any, value: any, callback: any) => {
if (value && !verifyPhone(value)) {
callback(new Error('请输入正确的手机号码'))
} else {
callback()
}
},
trigger: 'blur'
}
],
contactName: [
{required: true, message: '联系人不能为空', trigger: 'change'}
],
colorDiscrimination: [
{required: true, message: '辨色力不能为空', trigger: 'change'}
],
correctedScore:[
{required: true, message: '折算分不能为空', trigger: 'change'}
]
})
// 初始化 FileReader
onMounted(() => {
if (!window.FileReader) {
message.error('您的浏览器不支持 FileReader API!')
} else {
fileReader.value = new FileReader()
}
})
// 上传前验证
const beforeUpload = (file: File) => {
const isLt5M = file.size < 10 * 1024 * 1024
if (!isLt5M) {
message.error('文件大小不能超过10M')
return false
}
return true
}
// 图片预览
const handlePictureCardPreview = (file: any) => {
dialogImageUrl.value = file.url
dialogUploadVisible.value = true
}
// 通用移除文件处理(多文件)
const handleRemoveMultiple = (fileList: any[], dataFormField: string) => {
return (file: any) => {
const arr: any[] = []
const strArr: string[] = []
const dataFormObj = dataForm as any
fileList.forEach((e: any) => {
if (e.url != file.url) {
arr.push(e)
// 保存时使用原始路径
strArr.push(e.originalUrl || (e.url.startsWith(baseUrl) ? e.url.substring(baseUrl.length) : e.url))
}
})
fileList.splice(0, fileList.length, ...arr)
dataFormObj[dataFormField] = strArr.join(",")
}
}
// 移除文件处理(多图上传)
const remove4Handler = handleRemoveMultiple(houseList.value, 'housePic')
const remove6Handler = handleRemoveMultiple(hkPicList.value, 'householdPic')
// 自定义上传请求
const httpRequest = (options: any) => {
const file = options.file
if (file && fileReader.value) {
fileReader.value.readAsDataURL(file)
fileReader.value.onload = () => {
const base64Str = fileReader.value?.result as string
const config = {
url: uploadUrl,
method: 'post',
headers: headers.value,
data: {
base64Str: base64Str.split(',')[1]
},
timeout: 10000,
onUploadProgress: function (progressEvent: any) {
progressEvent.percent = progressEvent.loaded / progressEvent.total * 100
options.onProgress(progressEvent, file)
},
}
axios(config)
.then((res: any) => {
options.onSuccess(res, file)
})
.catch((err: any) => {
options.onError(err)
})
}
}
}
// 通用上传成功回调(单文件 - avatar模式
const handleUploadSuccess = (dataFormField: string) => {
return (res: any) => {
const fileUrl = res.data.fileUrl
const dataFormObj = dataForm as any
dataFormObj[dataFormField] = fileUrl
}
}
// 通用上传成功回调(多文件)
const handleUploadSuccessMultiple = (fileList: any[], dataFormField: string) => {
return (res: any) => {
const fileUrl = res.data.fileUrl // 后端返回的原始路径
const dataFormObj = dataForm as any
// 添加到文件列表,显示时添加 baseUrl 前缀,同时保存原始路径用于提交
fileList.push({ url: baseUrl + fileUrl, name: '', originalUrl: fileUrl })
// 保存时使用原始路径
const arr: string[] = []
fileList.forEach((e: any) => {
// 优先使用保存的原始路径,如果没有则从 url 中提取
arr.push(e.originalUrl || (e.url.startsWith(baseUrl) ? e.url.substring(baseUrl.length) : e.url))
})
dataFormObj[dataFormField] = arr.join(",")
}
}
// 上传成功回调
const uploadSuccess = handleUploadSuccess('scorePhoto')
const upload2Success = handleUploadSuccess('graPic')
const upload3Success = handleUploadSuccess('yyPic')
const upload4Success = handleUploadSuccessMultiple(houseList.value, 'housePic')
const upload5Success = handleUploadSuccess('sbPic')
const upload6Success = handleUploadSuccessMultiple(hkPicList.value, 'householdPic')
// 初始化
const init = (id: string | null, typeParam: number, groupId?: string) => {
dataForm.id = id || ""
type.value = typeParam
isEdit.value = typeParam == 1 ? true : false
visible.value = true
canSubmit.value = true
initData()
isShow.value = true
nextTick(() => {
dataFormRef.value?.resetFields()
// 新增时,如果传入了 groupId设置到表单中
if (!id && groupId) {
dataForm.groupId = groupId
}
// 初始化地区数据
areaProvinceList.value = []
areaCityList.value = []
areaAreaList.value = []
// 家庭地址数据
areaHomeProvinceList.value = []
areaHomeCityList.value = []
areaHomeAreaList.value = []
// 批量获取数据字典(新增和编辑都需要) 文化程度 学费 代办费 户口性质 学校归属地
getDictsByTypes(['id_type','finance_student_source', 'agency_fee', 'tuition_fee','house_hold_properties','recruit_school_form']).then((res: any) => {
idCardTypeList.value = res.data.id_type || []
eduList.value = res.data.finance_student_source || []
agencyFeeList.value = res.data.agency_fee || []
tuitionFeeList.value = res.data.tuition_fee || []
residenceTypeList.value = res.data.house_hold_properties || []
schoolFromList.value = res.data.recruit_school_form || []
// 加载地区数据(新增和编辑都需要)
areaList({ type: 0 }).then((data: any) => {
const areas = data.data
// 加载省级数据
areas.forEach((e: any) => {
if (e.parentId == '1') {
areaProvinceList.value.push(e)
areaHomeProvinceList.value.push(e)
}
})
})
if (dataForm.id) {
// 编辑模式:获取表单数据
getObj(dataForm.id).then((response: any) => {
Object.assign(dataForm, response.data)
// 清空多图上传的列表
houseList.value = []
hkPicList.value = []
// 初始化多图上传列表
if (dataForm.housePic && dataForm.housePic != '') {
const arr = dataForm.housePic.split(",").filter((item: string) => item && item.trim())
arr.forEach((e: string) => {
// 保存原始路径,显示时添加 baseUrl 前缀
houseList.value.push({ url: baseUrl + e, name: '', originalUrl: e })
})
}
// 户口本
if (dataForm.householdPic && dataForm.householdPic != '') {
const arr = dataForm.householdPic.split(",").filter((item: string) => item && item.trim())
arr.forEach((e: string) => {
// 保存原始路径,显示时添加 baseUrl 前缀
hkPicList.value.push({ url: baseUrl + e, name: '', originalUrl: e })
})
}
title.value = dataForm.serialNumber
// 获取文化程度对应的专业
// 根据学历获取代办费(从字典获取)
agencyFeeList.value.forEach((e: any) => {
if (dataForm.degreeOfEducation == e.label) {
dataForm.feeAgency = e.value
}
})
// 加载专业列表并分组
loadMajorListAndGroup()
// 获取招生计划下的学校所在城市(本省外市)
scoreList({ groupId: dataForm.groupId }).then((data: any) => {
schoolCodeList.value = data.data
})
// 根据已有数据加载市区数据
if (dataForm.residenceProvince) {
areaSonList({ code: dataForm.residenceProvince }).then((data: any) => {
areaCityList.value = data.data
if (dataForm.residenceCity) {
areaSonList({ code: dataForm.residenceCity }).then((data: any) => {
areaAreaList.value = data.data
})
}
})
}
if (dataForm.homeAddressProvince) {
areaSonList({ code: dataForm.homeAddressProvince }).then((data: any) => {
areaHomeCityList.value = data.data
if (dataForm.homeAddressCity) {
areaSonList({ code: dataForm.homeAddressCity }).then((data: any) => {
areaHomeAreaList.value = data.data
})
}
})
}
// 根据文化程度添加前缀:初中(C)、高中(G)、技职校(J)
const educationPrefixMap: Record<string, string> = {
'1': 'C', // 初中
'2': 'G', // 高中
'3': 'J' // 技职校
}
const prefix = educationPrefixMap[String(dataForm.degreeOfEducation)]
if (prefix) {
title.value = prefix + title.value
}
// 从字典数据获取录取状态标签
const auditStatusConfig = getStatusConfig(auditStatusList, dataForm.auditStatus)
if (auditStatusConfig && auditStatusConfig.label) {
title.value = auditStatusConfig.label + " " + title.value
}
})
} else {
// 新增模式:设置默认标题
title.value = "新增报名信息"
}
})
})
}
// 证件类型变化处理
const handleIdCardTypeChange = () => {
// 如果选择身份证,清空性别字段(后台会根据身份证号自动获取)
if (dataForm.idCardType === '0') {
dataForm.gender = ''
}
}
// 加载专业列表并分组
const loadMajorListAndGroup = () => {
// 清空专业列表
planMajorList.value = []
twoMajorList.value = []
threeMajorList.value = []
fiveMajorList.value = []
sixMajorList.value = []
sevenMajorList.value = []
fourMajorList.value = []
// 根据学历获取专业
listByEdu({ groupId: dataForm.groupId, degreeOfEducation: dataForm.degreeOfEducation }).then((e: any) => {
planMajorList.value = e.data
// 如果是初中生,则根据折算分匹配录取专业
getGzAuditChange()
// 根据年制分组
planMajorList.value.forEach((item: any) => {
if (item.learnYear == '2') {
twoMajorList.value.push(item)
} else if (item.learnYear == '3') {
threeMajorList.value.push(item)
} else if (item.learnYear == '4') {
fourMajorList.value.push(item)
} else if (item.learnYear == '5') {
fiveMajorList.value.push(item)
} else if (item.learnYear == '6') {
sixMajorList.value.push(item)
} else if (item.learnYear == '7') {
sevenMajorList.value.push(item)
}
})
// 如果已有录取专业,根据文化程度和专业更新学费
if (dataForm.confirmedMajor) {
updateTuitionByMajorAndEducation()
}
})
}
const changeEducation = () => {
// 清空拟报专业 录取专业 学费和代办费
dataForm.wishMajorOne = ""
dataForm.wishMajorTwo = ""
dataForm.wishMajorThree = ""
dataForm.confirmedMajor = ""
dataForm.twoMajor = ""
dataForm.threeMajor = ""
dataForm.fourMajor = ""
dataForm.fiveMajor = ""
dataForm.sixMajor = ""
dataForm.sevenMajor = ""
dataForm.feeTuition = 0
dataForm.feeAgency = 0
// 重新根据学历获取代办费(从字典获取)
agencyFeeList.value.forEach((e: any) => {
if (dataForm.degreeOfEducation == e.label) {
dataForm.feeAgency = e.value
}
})
// 加载专业列表并分组
loadMajorListAndGroup()
}
const initData = () => {
// 联系人(教职工)
queryAllTeacher().then((res: any) => {
contactNameList.value = res.data
})
// 获取招生计划列表
getList().then((data: any) => {
planList.value = data.data
})
// 获取民族列表
getNationalList().then((res: any) => {
nationalityList.value = res.data
})
}
const changeFrom = () => {
dataForm.fullScore = ""
dataForm.correctedScore = 0
if (dataForm.schoolArea == "2") {
isShow.value = true
} else {
isShow.value = false
}
}
const changeSchoolCode = () => {
dataForm.fullScore = ""
schoolCodeList.value.forEach((e: any) => {
if (e.regionId == dataForm.jsOtherCity) {
dataForm.fullScore = e.fullScore
}
})
if (dataForm.fullScore == "" && dataForm.schoolArea != "3") {
ElNotification.error({
title: '错误',
message: '当前省市未匹配到分数线,请检查'
})
return
}
dataForm.correctedScore = 0
calculateCorrectedScore()
}
const changePlaceScore = () => {
calculateCorrectedScore()
}
const getGzAuditChange = () => {
// 如果是初中生 需要根据折算分匹配录取专业
if (dataForm.degreeOfEducation == "1") {
if (isEdit.value && (dataForm.confirmedMajor == undefined || dataForm.confirmedMajor == "")) {
// 根据折算分匹配录取专业
planMajorList.value.forEach((e: any) => {
if (e.majorCode == dataForm.wishMajorOne && (parseFloat(e.xyNum) > 0)) {
dataForm.confirmedMajor = dataForm.wishMajorOne
}
})
if (dataForm.confirmedMajor) {
planMajorList.value.forEach((e: any) => {
if (e.majorCode == dataForm.wishMajorTwo && (parseFloat(e.xyNum) > 0)) {
dataForm.confirmedMajor = dataForm.wishMajorOne
}
})
}
if (dataForm.confirmedMajor) {
planMajorList.value.forEach((e: any) => {
if (e.majorCode == dataForm.wishMajorThree && (parseFloat(e.xyNum) > 0)) {
dataForm.confirmedMajor = dataForm.wishMajorOne
}
})
}
}
}
}
// 计算成绩折算分
const calculateCorrectedScore = () => {
// 验证必要字段是否存在
const hasFullScore = dataForm.fullScore != undefined && dataForm.fullScore != ""
const hasSchoolArea = dataForm.schoolArea != undefined && dataForm.schoolArea != ""
// 验证外省或学校所在省市至少有一个存在
const hasLocation = (dataForm.schoolArea === '2' && dataForm.jsOtherCity) ||
(dataForm.schoolArea === '3' && dataForm.otherProvince)
// 只有成绩、当地总分、学校归属地、外省/学校所在省市都存在时才能计算
if (!hasFullScore || !hasSchoolArea || !hasLocation) {
return
}
dataForm.confirmedMajor = ""
// 调用后端接口计算折算分
makeCorrectScore({
groupId: dataForm.groupId,
schoolArea: dataForm.schoolArea,
jsOtherCity: dataForm.jsOtherCity,
otherProvince: dataForm.otherProvince,
fullScore: dataForm.fullScore,
score: dataForm.score,
degreeOfEducation: dataForm.degreeOfEducation
}).then(res => {
if (res.code !== 0) {
return
}
dataForm.correctedScore = res.data
// 根据折算分匹配录取专业按志愿顺序专业1 -> 专业2 -> 专业3
const matchMajorByScore = (majorCode: string) => {
return planMajorList.value.find((major: any) =>
dataForm.correctedScore >= major.scoreLine &&
major.majorCode == majorCode &&
parseFloat(major.xyNum) > 0
)
}
// 按志愿顺序匹配专业
const matchedMajor = matchMajorByScore(dataForm.wishMajorOne) ||
matchMajorByScore(dataForm.wishMajorTwo) ||
matchMajorByScore(dataForm.wishMajorThree)
if (matchedMajor) {
dataForm.confirmedMajor = matchedMajor.majorCode
changeConfirmedMajor(dataForm.confirmedMajor)
}
})
}
const changeR = (changeType: number) => {
let code = ""
// 清空区数据
areaAreaList.value = []
dataForm.residenceArea = ""
if (changeType == 1) {
// 选择省份时,清空市和区数据
code = dataForm.residenceProvince
areaCityList.value = []
dataForm.residenceCity = ""
} else {
// 选择市时
code = dataForm.residenceCity
}
// 获取市或区数据
areaSonList({ code: code }).then((data: any) => {
if (changeType == 1) {
areaCityList.value = data.data
} else {
areaAreaList.value = data.data
}
})
}
const changeH = (changeType: number) => {
let code = ""
areaHomeAreaList.value = []
dataForm.homeAddressArea = ""
if (changeType == 1) {
code = dataForm.homeAddressProvince
areaHomeCityList.value = []
dataForm.homeAddressCity = ""
} else {
code = dataForm.homeAddressCity
}
areaSonList({ code: code }).then((data: any) => {
if (changeType == 1) {
areaHomeCityList.value = data.data
} else {
areaHomeAreaList.value = data.data
}
})
}
// 改变录取专业
const changeConfirmedMajor = (id: string) => {
if (id) {
dataForm.confirmedMajor = id
// 根据文化程度和录取专业更新学费
updateTuitionByMajorAndEducation()
}
}
// 根据文化程度和录取专业更新学费
const updateTuitionByMajorAndEducation = () => {
if (!dataForm.confirmedMajor || !dataForm.degreeOfEducation) {
return
}
// 查找选中的专业
const selectedMajor = planMajorList.value.find((major: any) => major.majorCode === dataForm.confirmedMajor)
if (!selectedMajor) {
return
}
// 根据文化程度选择对应的学费字段
// '1' = 初中 -> czFee
// '2' = 高中 -> gzFee
// '3' = 技职校 -> jzxFee
if (dataForm.degreeOfEducation === '1' && selectedMajor.czFee !== undefined && selectedMajor.czFee !== null) {
dataForm.feeTuition = selectedMajor.czFee
} else if (dataForm.degreeOfEducation === '2' && selectedMajor.gzFee !== undefined && selectedMajor.gzFee !== null) {
dataForm.feeTuition = selectedMajor.gzFee
} else if (dataForm.degreeOfEducation === '3' && selectedMajor.jzxFee !== undefined && selectedMajor.jzxFee !== null) {
dataForm.feeTuition = selectedMajor.jzxFee
}
}
// 表单提交
const dataFormSubmit = (state: string,force:any) => {
dataForm.auditStatus = state
let submitTitle = "确认通过该学生的报名申请么?"
// 新增模式
if (!dataForm.id) {
submitTitle = "确认保存并提交该学生的报名信息么?"
} else {
// 编辑模式
if (state == "-20") {
submitTitle = "确认驳回该学生的报名申请么?"
}
}
// 清空相关验证规则
dataRule.score = []
dataRule.fullScore = []
dataRule.jsOtherCity = []
dataRule.otherProvince = []
if (dataForm.degreeOfEducation == '1') {
dataRule.score = [
{required: true, message: '初中生报名请填写成绩', trigger: 'change'}
]
if(dataForm.schoolArea){
if(dataForm.schoolArea == '3'){
// 外省外市
dataRule.fullScore = [
{required: true, message: '外地初中生报名请填写当地总分', trigger: 'change'}
]
dataRule.otherProvince = [
{required: true, message: '初中生请选择学校归属地和所在省市', trigger: 'change'}
]
}
if(dataForm.schoolArea == '2'){
// 本省外市
dataRule.jsOtherCity = [
{required: true, message: '初中生请选择学校归属地和所在省市', trigger: 'change'}
]
}
}
}
// 先进行表单验证,验证成功后再弹出确认框
dataFormRef.value?.validate((valid: boolean) => {
if (!valid) {
return
}
// 表单验证通过,弹出确认框
messageBox.confirm(submitTitle).then(() => {
canSubmit.value = false
if (dataForm.id) {
// 编辑模式
dataForm.force=force
putObj(dataForm).then(() => {
message.success('操作成功')
visible.value = false
emit('refreshDataList')
}).finally(() => {
canSubmit.value = true
})
} else {
// 新增模式
addObj(dataForm).then(() => {
message.success('新增成功')
visible.value = false
emit('refreshDataList')
}).finally(() => {
canSubmit.value = true
})
}
}).catch(() => {
// 用户取消
})
})
}
// 监听招生计划变化(新增模式下需要加载分数线数据)
watch(() => dataForm.groupId, (newVal) => {
if (newVal && !dataForm.id) {
// 新增模式下,加载招生计划对应的分数线数据
scoreList({ groupId: newVal }).then((data: any) => {
schoolCodeList.value = data.data
})
}
})
// 暴露方法给父组件
defineExpose({
init
})
</script>
<style lang="scss" scoped>
.avatar-uploader {
:deep(.el-upload) {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
width: 148px;
height: 148px;
&:hover {
border-color: var(--el-color-primary);
}
}
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 148px;
height: 148px;
line-height: 148px;
text-align: center;
}
.avatar-wrapper {
width: 148px;
height: 148px;
.avatar {
width: 148px;
height: 148px;
display: block;
object-fit: cover;
cursor: pointer;
}
}
// 总费用样式
.total-fee {
color: #f56c6c;
font-weight: 600;
font-size: 16px;
}
// 表单布局优化
.el-form {
// 覆盖全局样式:每行的最后一个表单项也需要间距
.el-row .el-form-item:last-child {
margin-bottom: 18px !important;
}
// 只有整个表单的最后一个表单项才不需要底部间距
.el-row:last-of-type .el-form-item:last-child {
margin-bottom: 0 !important;
}
}
// 表单模块样式
.form-section {
margin-bottom: 24px;
padding: 20px;
background: #fafbfc;
border-radius: 8px;
border: 1px solid #ebeef5;
&:last-child {
margin-bottom: 0;
}
.section-title {
font-size: 15px;
font-weight: 600;
color: #303133;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 2px solid #e4e7ed;
}
}
// 地址组样式 - 省市区紧凑排列,用分隔符连接
.address-group {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
:deep(.address-select) {
flex: 1 1 0;
min-width: 0px;
width: 0; // 让 flex: 1 生效
}
.address-separator {
color: #909399;
font-size: 14px;
font-weight: 500;
flex-shrink: 0;
padding: 0 4px;
}
}
</style>