This commit is contained in:
guochunsi
2026-01-14 18:32:09 +08:00
parent 6055033289
commit 8166fa31e0
33 changed files with 3926 additions and 3383 deletions

View File

@@ -0,0 +1,86 @@
<template>
<el-dialog title="录取通知书" v-model="visible" width="80%" height="50%" @close="handleClose">
<div style="height: 60vh">
<iframe id="iframeid" :src="pdfPath" ref="iframeRef" frameborder="0" style="width:100%;height:100%;"></iframe>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button @click="handleConfirm" v-if="props.permissions.sureLQTZ && canConfirm" type="primary">确认已发放</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { toWord, sureLQTZ } from '/@/api/recruit/recruitstudentsignup'
export default {
name: 'AdmissionNoticeDialog',
props: {
permissions: {
type: Object,
default: () => ({})
}
},
emits: ['refresh'],
setup(props, { emit }) {
const visible = ref(false)
const pdfPath = ref('')
const currentId = ref('')
const canConfirm = ref(false)
const init = async (row) => {
currentId.value = row.id
pdfPath.value = ''
canConfirm.value = row.isBackTz == '0'
try {
const res = await toWord(row)
pdfPath.value = "/recruit/file/previewPdf?filePath=" + encodeURIComponent(res.data)
visible.value = true
} catch (error) {
ElMessage.error('加载录取通知书失败')
}
}
const handleConfirm = () => {
ElMessageBox.confirm('是否确认已打印并发放本通知书?请谨慎操作', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
return sureLQTZ({ id: currentId.value })
}).then(() => {
ElMessage.success('保存成功')
visible.value = false
emit('refresh')
}).catch(() => {
// 用户取消操作
})
}
const handleClose = () => {
visible.value = false
}
return {
visible,
pdfPath,
canConfirm,
init,
handleConfirm,
handleClose
}
}
}
</script>
<style scoped>
.dialog-footer {
text-align: right;
}
</style>

View File

@@ -0,0 +1,79 @@
<template>
<el-dialog title="延迟缴费" v-model="visible" width="300px" height="50%" @close="handleClose">
<el-date-picker
v-model="delayPayTime"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
filterable
clearable
type="datetime"
style="width: 100%"
></el-date-picker>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button @click="handleSave" type="primary">保存</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { updateInfo } from '/@/api/recruit/recruitstudentsignup'
export default {
name: 'DelayPayTimeDialog',
emits: ['refresh'],
setup(props, { emit }) {
const visible = ref(false)
const delayPayTime = ref('')
const currentId = ref('')
const init = (row) => {
delayPayTime.value = ''
currentId.value = row.id
if (row.delayPaymentTime) {
delayPayTime.value = row.delayPaymentTime
}
visible.value = true
}
const handleSave = () => {
ElMessageBox.confirm('是否确认进度延迟收费操作?请谨慎操作', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
return updateInfo({ delayPaymentTime: delayPayTime.value, id: currentId.value })
}).then(() => {
visible.value = false
ElMessage.success('延迟收费修改成功')
emit('refresh')
}).catch(() => {
// 用户取消操作
})
}
const handleClose = () => {
visible.value = false
}
return {
visible,
delayPayTime,
init,
handleSave,
handleClose
}
}
}
</script>
<style scoped>
.dialog-footer {
text-align: right;
}
</style>

View File

@@ -0,0 +1,131 @@
<template>
<el-dialog title="支付二维码" v-model="visible" width="800px" height="80%" @close="handleClose">
<el-table :data="tableData" border>
<el-table-column label="唯一号" prop="serialNumber" align="center"></el-table-column>
<el-table-column label="姓名" prop="name" align="center"></el-table-column>
<el-table-column label="家长手机号" prop="parentTelOne" align="center"></el-table-column>
<el-table-column label="操作" prop="" align="center">
<template #default>
<el-button @click="handleUpdateFS" icon="el-icon-search" type="danger" size="small">立即查询</el-button>
</template>
</el-table-column>
</el-table>
<div style="padding-top: 20px;">
<div id="payQrcode1" style="display: inline-block;">
{{ payQrcode1Msg }}
</div>
<vue-qr :text="payQrcode1" :size="200" v-if="showPrise1" style="display: inline-block"></vue-qr>
<div id="payQrcode2" style="display: inline-block">
{{ payQrcode2Msg }}
</div>
<vue-qr :text="payQrcode2" :size="200" v-if="showPrise2" style="display: inline-block"></vue-qr>
<div id="payQrcode3" style="display: inline-block">
{{ payQrcode3Msg }}
</div>
<vue-qr :text="payQrcode3" :size="200" v-if="showPrise3" style="display: inline-block"></vue-qr>
</div>
<span style="color: red;padding-top: 20px;">** 此界面为查询学生缴款二维码如有收不到微信推送或手机号填错的可直接在此扫码支付支付成功后请手动点击"立即查询"按钮查询该生的缴费情况;因财政收费系统有一定的滞后性如点击"立即查询"后任显示未交费请稍后再继续查询或重新点击"立即查询"按钮 **</span>
</el-dialog>
</template>
<script>
import { ref } from 'vue'
import { ElNotification } from 'element-plus'
import { updateFs } from '/@/api/finance/financenormalstu'
export default {
name: 'PayQrcodeDialog',
emits: ['refresh'],
setup(props, { emit }) {
const visible = ref(false)
const tableData = ref([])
const payQrcode1 = ref('')
const showPrise1 = ref(false)
const payQrcode1Msg = ref('')
const payQrcode2 = ref('')
const payQrcode2Msg = ref('')
const showPrise2 = ref(false)
const payQrcode3 = ref('')
const payQrcode3Msg = ref('')
const showPrise3 = ref(false)
const init = (row) => {
showPrise1.value = false
showPrise2.value = false
showPrise3.value = false
// 置空
payQrcode1.value = ''
payQrcode2.value = ''
payQrcode3.value = ''
if (row.clfPayCode == '' || row.clfPayCode == undefined) {
payQrcode1Msg.value = ''
showPrise1.value = false
} else {
payQrcode1Msg.value = '材料费、代办费'
showPrise1.value = true
payQrcode1.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.clfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
if (row.xfPayCode == '' || row.xfPayCode == undefined) {
payQrcode2Msg.value = ''
showPrise2.value = false
} else {
payQrcode2Msg.value = '学费'
showPrise2.value = true
payQrcode2.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.xfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
if (row.zdbPayCode == '' || row.zdbPayCode == undefined) {
payQrcode3Msg.value = ''
showPrise3.value = false
} else {
payQrcode3Msg.value = '中德班学费'
showPrise3.value = true
payQrcode3.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.zdbPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
tableData.value = []
tableData.value.push(row)
visible.value = true
}
const handleUpdateFS = () => {
if (tableData.value.length === 0) return
updateFs({ "serialNumber": tableData.value[0].serialNumber.substring(1, tableData.value[0].serialNumber.length) }).then(() => {
ElNotification.success('已提交查询请求请等待1分钟后重新查询')
visible.value = false
emit('refresh')
})
}
const handleClose = () => {
visible.value = false
}
return {
visible,
tableData,
payQrcode1,
showPrise1,
payQrcode1Msg,
payQrcode2,
showPrise2,
payQrcode2Msg,
payQrcode3,
showPrise3,
payQrcode3Msg,
init,
handleUpdateFS,
handleClose
}
}
}
</script>
<style scoped>
</style>

View File

@@ -1,9 +1,9 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small">
<el-option
v-for="item in planList"
:key="item.id"
@@ -14,139 +14,156 @@
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" size="small"
@click="handleFilter()">查询
<el-button icon="Search" type="primary" size="small"
@click="handleFilter">查询
</el-button>
<el-button icon="el-icon-delete" type="normal" plain size="small"
@click="resetForm('searchForm')">清空
<el-button icon="Delete" type="default" plain size="small"
@click="resetForm">清空
</el-button>
</el-form-item>
</el-form>
<el-form>
<el-form-item>
<el-button icon="el-icon-download" type="warning" size="small" @click="dataExportHandle()">导出</el-button>
<el-button icon="Download" type="warning" size="small" @click="dataExportHandle">导出</el-button>
</el-form-item>
</el-form>
<div class="avue-crud">
<el-table :data="list" border stripe v-loading="dataListLoading"
:summary-method="getSummaries" show-summary
<el-table :data="dataList" border stripe v-loading="dataListLoading"
:summary-method="getSummaries" show-summary
>
<el-table-column align="center" header-align="center" prop="provinceName" label="省市" />
<el-table-column align="center" header-align="center" prop="peopleNum" label="人数" />
<el-table-column align="center" header-align="center" prop="peopleRate" label="占比" />
<el-table-column align="center" header-align="center" prop="provinceName" label="省市" />
<el-table-column align="center" header-align="center" prop="peopleNum" label="人数" />
<el-table-column align="center" header-align="center" prop="peopleRate" label="占比" />
</el-table>
<chart ref="typeEchartBar" style="width:100%;margin-top:80px" :options="chartOption" theme="macarons" ></chart>
<chart ref="typeEchartBarRef" style="width:100%;margin-top:80px" :options="chartOption" theme="macarons"></chart>
</div>
</basic-container>
</div>
</template>
<script>
import {getAreaStatic} from "@/api/recruit/recruitstudentsignup";
import {list} from "@/api/recruit/recruitstudentplangroup";
require('echarts/lib/chart/bar');
require('echarts/lib/chart/line');
export default {
data() {
return {
dataForm: {groupId:""},
list: [],
planList:[],
dataListLoading: false,
chartOption: {}
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import axios from 'axios'
import { getAreaStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
// 响应式数据
const dataForm = reactive({
groupId: "",
degreeOfEducation: ""
})
const dataList = ref<any[]>([])
const planList = ref<any[]>([])
const dataListLoading = ref(false)
const chartOption = ref<any>({})
const searchFormRef = ref()
const typeEchartBarRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.data
_this.dataForm.groupId=_this.planList[0].id;
this.getDataList();
});
},
getDataList(){
this.list = [];
this.indexArray=[];
this.dataForm.degreeOfEducation='1';
getAreaStatic(this.dataForm).then(response =>{
this.list = response.data;
this.chartOption = response.data.option
})
},
exportExcel: function(form,url) {
return axios({ // 用axios发送post请求
method: 'post',
url: url, // 请求地址
data: form, // 参数
responseType: 'blob', // 表明返回服务器返回的数据类型
headers: {
'Content-Type': 'application/json'
}
})
},
/**
* 导出表格
*/
dataExportHandle() {
this.exportLoading = true
this.exportExcel(this.dataForm,'/recruit/recruitstudentsignup/getAreaStaticExport').then(res => { // 处理返回的文件流
console.log(res)
const blob = new Blob([res.data]);
const fileName = '按地区导出.xls';
const elink = document.createElement('a');
elink.download = fileName;
elink.style.display = 'none';
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href); // 释放URL 对象
document.body.removeChild(elink);
})
},
getSummaries(param) {
const { columns, data } = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计'
} else if (index != 0 ) {
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value) ) {
let value = prev + curr;
return value
} else {
return prev
}
}, 0);
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
},
handleFilter(){
this.getDataList();
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
}
getDataList()
})
}
// 获取数据列表
const getDataList = () => {
dataList.value = []
dataForm.degreeOfEducation = '1'
dataListLoading.value = true
getAreaStatic(dataForm).then((response: any) => {
dataList.value = response.data
chartOption.value = response.data.option
dataListLoading.value = false
}).catch(() => {
dataListLoading.value = false
})
}
// 导出Excel
const exportExcel = (form: any, url: string) => {
return axios({
method: 'post',
url: url,
data: form,
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
})
}
// 导出表格
const dataExportHandle = () => {
exportExcel(dataForm, '/recruit/recruitstudentsignup/getAreaStaticExport').then((res: any) => {
const blob = new Blob([res.data])
const fileName = '按地区导出.xls'
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {
// 错误处理
})
}
// 表格汇总
const getSummaries = (param: any) => {
const { columns, data } = param
const sums: any[] = []
columns.forEach((column: any, index: number) => {
if (index === 0) {
sums[index] = '总计'
} else if (index !== 0) {
const values = data.map((item: any) => Number(item[column.property]))
if (!values.every((value: number) => isNaN(value))) {
sums[index] = values.reduce((prev: number, curr: number) => {
const numValue = Number(curr)
if (!isNaN(numValue)) {
return prev + numValue
} else {
return prev
}
}, 0)
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置表单
const resetForm = () => {
searchFormRef.value?.resetFields()
}
// 组件挂载时初始化
onMounted(() => {
init()
})
</script>
<style scoped>
.avue-crud {
margin-top: 20px;
}
</style>

View File

@@ -1,9 +1,9 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small">
<el-option
v-for="item in planList"
:key="item.id"
@@ -14,142 +14,164 @@
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" size="small"
@click="handleFilter()">查询
<el-button icon="Search" type="primary" size="small"
@click="handleFilter">查询
</el-button>
<el-button icon="el-icon-delete" type="normal" plain size="small"
@click="resetForm('searchForm')">清空
<el-button icon="Delete" type="default" plain size="small"
@click="resetForm">清空
</el-button>
</el-form-item>
</el-form>
<div class="avue-crud">
<el-table :data="list" border stripe :span-method="objectSpanMethod" v-loading="dataListLoading"
:summary-method="getSummaries" show-summary :row-style="changeRowColor"
<el-table :data="dataList" border stripe :span-method="objectSpanMethod" v-loading="dataListLoading"
:summary-method="getSummaries" show-summary :row-style="changeRowColor"
>
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
</el-table>
</div>
</basic-container>
</div>
</template>
<script>
import {getContantByUserStatic} from "@/api/recruit/recruitstudentsignup";
import {list} from "@/api/recruit/recruitstudentplangroup";
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { getContantByUserStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
export default {
data() {
return {
dataForm: {groupId:""},
list: [],
planList:[],
indexArray: [],
dataListLoading: false,
// 响应式数据
const dataForm = reactive({
groupId: ""
})
const dataList = ref<any[]>([])
const planList = ref<any[]>([])
const indexArray = ref<number[]>([])
const dataListLoading = ref(false)
const searchFormRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.data
_this.dataForm.groupId=_this.planList[0].id;
this.getDataList();
});
},
getDataList(){
this.list = [];
this.indexArray=[];
getContantByUserStatic(this.dataForm).then(response =>{
this.list = response.data;
let count = 0
for (let rowIndex = 0; rowIndex < this.list.length; ) {
this.indexArray.push(rowIndex)
count = this.getRows(rowIndex, this.list[rowIndex].deptName)
rowIndex += count
}
})
},
changeRowColor ({ row }) {
if (row.contantName === "小记") { // 变颜色的条件
return {
color: "red"
}
}
},
getSummaries(param) {
const { columns, data } = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计'
} else if (index != 0 && index !=1) {
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value) ) {
let value = prev + curr;
return value
} else {
return prev
}
}, 0)/2;
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
let rowCount = 0
if (this.indexArray.includes(rowIndex)) {
rowCount = this.getRows(rowIndex, row.deptName)
return {
rowspan: rowCount,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
},
getRows(rowIndex, name) {
let count = 0
for (let i = rowIndex; i < this.list.length; i++) {
if (this.list[i].deptName === name) {
count++
} else {
break
}
}
return count
},
handleFilter(){
this.getDataList();
},
getDataList()
})
}
resetForm(formName) {
this.$refs[formName].resetFields();
},
// 获取数据列表
const getDataList = () => {
dataList.value = []
indexArray.value = []
dataListLoading.value = true
getContantByUserStatic(dataForm).then((response: any) => {
dataList.value = response.data
let count = 0
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
indexArray.value.push(rowIndex)
count = getRows(rowIndex, dataList.value[rowIndex].deptName)
rowIndex += count
}
dataListLoading.value = false
}).catch(() => {
dataListLoading.value = false
})
}
// 改变行颜色
const changeRowColor = ({ row }: any) => {
if (row.contantName === "小记") {
return {
color: "red"
}
}
}
// 表格汇总
const getSummaries = (param: any) => {
const { columns, data } = param
const sums: any[] = []
columns.forEach((column: any, index: number) => {
if (index === 0) {
sums[index] = '总计'
} else if (index !== 0 && index !== 1) {
const values = data.map((item: any) => Number(item[column.property]))
if (!values.every((value: number) => isNaN(value))) {
sums[index] = values.reduce((prev: number, curr: number) => {
const numValue = Number(curr)
if (!isNaN(numValue)) {
return prev + numValue
} else {
return prev
}
}, 0) / 2
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
}
// 合并单元格
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
if (columnIndex === 0) {
let rowCount = 0
if (indexArray.value.includes(rowIndex)) {
rowCount = getRows(rowIndex, row.deptName)
return {
rowspan: rowCount,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
}
// 获取行数
const getRows = (rowIndex: number, name: string) => {
let count = 0
for (let i = rowIndex; i < dataList.value.length; i++) {
if (dataList.value[i].deptName === name) {
count++
} else {
break
}
}
return count
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置表单
const resetForm = () => {
searchFormRef.value?.resetFields()
}
// 组件挂载时初始化
onMounted(() => {
init()
})
</script>
<style scoped>
.avue-crud {
margin-top: 20px;
}
</style>

View File

@@ -1,9 +1,9 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small">
<el-option
v-for="item in planList"
:key="item.id"
@@ -14,134 +14,149 @@
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" size="small"
@click="handleFilter()">查询
<el-button icon="Search" type="primary" size="small"
@click="handleFilter">查询
</el-button>
<el-button icon="el-icon-delete" type="normal" plain size="small"
@click="resetForm('searchForm')">清空
<el-button icon="Delete" type="default" plain size="small"
@click="resetForm">清空
</el-button>
</el-form-item>
</el-form>
<el-form>
<el-form-item>
<el-button icon="el-icon-download" type="warning" size="small" @click="dataExportHandle()">导出</el-button>
<el-button icon="Download" type="warning" size="small" @click="dataExportHandle">导出</el-button>
</el-form-item>
</el-form>
<div class="avue-crud">
<el-table :data="list" border stripe v-loading="dataListLoading"
:summary-method="getSummaries" show-summary
<el-table :data="dataList" border stripe v-loading="dataListLoading"
:summary-method="getSummaries" show-summary
>
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
<el-table-column align="center" header-align="center" prop="allNum" label="合计" />
<el-table-column align="center" header-align="center" prop="schoolNum" label="学校推荐" />
<el-table-column align="center" header-align="center" prop="contantNum" label="联系人" />
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
<el-table-column align="center" header-align="center" prop="allNum" label="合计" />
<el-table-column align="center" header-align="center" prop="schoolNum" label="学校推荐" />
<el-table-column align="center" header-align="center" prop="contantNum" label="联系人" />
</el-table>
</div>
</basic-container>
</div>
</template>
<script>
import {getContantByDeptStatic} from "@/api/recruit/recruitstudentsignup";
import {list} from "@/api/recruit/recruitstudentplangroup";
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import axios from 'axios'
import { getContantByDeptStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
export default {
data() {
return {
dataForm: {groupId:""},
list: [],
planList:[],
dataListLoading: false,
// 响应式数据
const dataForm = reactive({
groupId: ""
})
const dataList = ref<any[]>([])
const planList = ref<any[]>([])
const dataListLoading = ref(false)
const searchFormRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.data
_this.dataForm.groupId=_this.planList[0].id;
this.getDataList();
});
},
getDataList(){
this.list = [];
this.indexArray=[];
getContantByDeptStatic(this.dataForm).then(response =>{
this.list = response.data;
})
},
exportExcel: function(form,url) {
return axios({ // 用axios发送post请求
method: 'post',
url: url, // 请求地址
data: form, // 参数
responseType: 'blob', // 表明返回服务器返回的数据类型
headers: {
'Content-Type': 'application/json'
}
})
},
/**
* 导出表格
*/
dataExportHandle() {
this.exportLoading = true
this.exportExcel(this.dataForm,'/recruit/recruitstudentsignup/getContantByDeptStaticExport').then(res => { // 处理返回的文件流
console.log(res)
const blob = new Blob([res.data]);
const fileName = '按部门导出.xls';
const elink = document.createElement('a');
elink.download = fileName;
elink.style.display = 'none';
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href); // 释放URL 对象
document.body.removeChild(elink);
})
},
getSummaries(param) {
const { columns, data } = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计'
} else if (index != 0) {
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value) ) {
let value = prev + curr;
return value
} else {
return prev
}
}, 0);
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
},
handleFilter(){
this.getDataList();
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
}
getDataList()
})
}
// 获取数据列表
const getDataList = () => {
dataList.value = []
dataListLoading.value = true
getContantByDeptStatic(dataForm).then((response: any) => {
dataList.value = response.data
dataListLoading.value = false
}).catch(() => {
dataListLoading.value = false
})
}
// 导出Excel
const exportExcel = (form: any, url: string) => {
return axios({
method: 'post',
url: url,
data: form,
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
})
}
// 导出表格
const dataExportHandle = () => {
exportExcel(dataForm, '/recruit/recruitstudentsignup/getContantByDeptStaticExport').then((res: any) => {
const blob = new Blob([res.data])
const fileName = '按部门导出.xls'
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {
// 错误处理
})
}
// 表格汇总
const getSummaries = (param: any) => {
const { columns, data } = param
const sums: any[] = []
columns.forEach((column: any, index: number) => {
if (index === 0) {
sums[index] = '总计'
} else if (index !== 0) {
const values = data.map((item: any) => Number(item[column.property]))
if (!values.every((value: number) => isNaN(value))) {
sums[index] = values.reduce((prev: number, curr: number) => {
const numValue = Number(curr)
if (!isNaN(numValue)) {
return prev + numValue
} else {
return prev
}
}, 0)
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置表单
const resetForm = () => {
searchFormRef.value?.resetFields()
}
// 组件挂载时初始化
onMounted(() => {
init()
})
</script>
<style scoped>
.avue-crud {
margin-top: 20px;
}
</style>

View File

@@ -1,9 +1,9 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small">
<el-option
v-for="item in planList"
:key="item.id"
@@ -14,177 +14,201 @@
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" size="small"
@click="handleFilter()">查询
<el-button icon="Search" type="primary" size="small"
@click="handleFilter">查询
</el-button>
<el-button icon="el-icon-delete" type="normal" plain size="small"
@click="resetForm('searchForm')">清空
<el-button icon="Delete" type="default" plain size="small"
@click="resetForm">清空
</el-button>
</el-form-item>
</el-form>
<el-form>
<el-form-item>
<el-button icon="el-icon-download" type="warning" size="small" @click="dataExportHandle()">导出</el-button>
<el-button icon="Download" type="warning" size="small" @click="dataExportHandle">导出</el-button>
</el-form-item>
</el-form>
<div class="avue-crud">
<el-table :data="list" border stripe :span-method="objectSpanMethod" v-loading="dataListLoading"
:summary-method="getSummaries" show-summary :row-style="changeRowColor"
<el-table :data="dataList" border stripe :span-method="objectSpanMethod" v-loading="dataListLoading"
:summary-method="getSummaries" show-summary :row-style="changeRowColor"
>
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
</el-table>
</div>
</basic-container>
</div>
</template>
<script>
import {getContantByUserStatic} from "@/api/recruit/recruitstudentsignup";
import {list} from "@/api/recruit/recruitstudentplangroup";
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import axios from 'axios'
import { getContantByUserStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
export default {
data() {
return {
dataForm: {groupId:""},
list: [],
planList:[],
indexArray: [],
dataListLoading: false,
// 响应式数据
const dataForm = reactive({
groupId: ""
})
const dataList = ref<any[]>([])
const planList = ref<any[]>([])
const indexArray = ref<number[]>([])
const dataListLoading = ref(false)
const searchFormRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.data
_this.dataForm.groupId=_this.planList[0].id;
this.getDataList();
});
},
getDataList(){
this.list = [];
this.indexArray=[];
getContantByUserStatic(this.dataForm).then(response =>{
this.list = response.data;
let count = 0
for (let rowIndex = 0; rowIndex < this.list.length; ) {
this.indexArray.push(rowIndex)
count = this.getRows(rowIndex, this.list[rowIndex].deptName)
rowIndex += count
}
})
},
exportExcel: function(form,url) {
return axios({ // 用axios发送post请求
method: 'post',
url: url, // 请求地址
data: form, // 参数
responseType: 'blob', // 表明返回服务器返回的数据类型
headers: {
'Content-Type': 'application/json'
}
})
},
/**
* 导出表格
*/
dataExportHandle() {
this.exportLoading = true
this.exportExcel(this.dataForm,'/recruit/recruitstudentsignup/getContantByUserStaticExport').then(res => { // 处理返回的文件流
console.log(res)
const blob = new Blob([res.data]);
const fileName = '按联系人导出.xls';
const elink = document.createElement('a');
elink.download = fileName;
elink.style.display = 'none';
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href); // 释放URL 对象
document.body.removeChild(elink);
})
},
changeRowColor ({ row }) {
if (row.contantName === "小记") { // 变颜色的条件
return {
color: "red"
}
}
},
getSummaries(param) {
const { columns, data } = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计'
} else if (index != 0 && index !=1) {
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value) ) {
let value = prev + curr;
return value
} else {
return prev
}
}, 0)/2;
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
let rowCount = 0
if (this.indexArray.includes(rowIndex)) {
rowCount = this.getRows(rowIndex, row.deptName)
return {
rowspan: rowCount,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
},
getRows(rowIndex, name) {
let count = 0
for (let i = rowIndex; i < this.list.length; i++) {
if (this.list[i].deptName === name) {
count++
} else {
break
}
}
return count
},
handleFilter(){
this.getDataList();
},
getDataList()
})
}
resetForm(formName) {
this.$refs[formName].resetFields();
},
// 获取数据列表
const getDataList = () => {
dataList.value = []
indexArray.value = []
dataListLoading.value = true
getContantByUserStatic(dataForm).then((response: any) => {
dataList.value = response.data
let count = 0
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
indexArray.value.push(rowIndex)
count = getRows(rowIndex, dataList.value[rowIndex].deptName)
rowIndex += count
}
dataListLoading.value = false
}).catch(() => {
dataListLoading.value = false
})
}
// 导出Excel
const exportExcel = (form: any, url: string) => {
return axios({
method: 'post',
url: url,
data: form,
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
})
}
// 导出表格
const dataExportHandle = () => {
exportExcel(dataForm, '/recruit/recruitstudentsignup/getContantByUserStaticExport').then((res: any) => {
const blob = new Blob([res.data])
const fileName = '按联系人导出.xls'
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {
// 错误处理
})
}
// 改变行颜色
const changeRowColor = ({ row }: any) => {
if (row.contantName === "小记") {
return {
color: "red"
}
}
}
// 表格汇总
const getSummaries = (param: any) => {
const { columns, data } = param
const sums: any[] = []
columns.forEach((column: any, index: number) => {
if (index === 0) {
sums[index] = '总计'
} else if (index !== 0 && index !== 1) {
const values = data.map((item: any) => Number(item[column.property]))
if (!values.every((value: number) => isNaN(value))) {
sums[index] = values.reduce((prev: number, curr: number) => {
const numValue = Number(curr)
if (!isNaN(numValue)) {
return prev + numValue
} else {
return prev
}
}, 0) / 2
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
}
// 合并单元格
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
if (columnIndex === 0) {
let rowCount = 0
if (indexArray.value.includes(rowIndex)) {
rowCount = getRows(rowIndex, row.deptName)
return {
rowspan: rowCount,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
}
// 获取行数
const getRows = (rowIndex: number, name: string) => {
let count = 0
for (let i = rowIndex; i < dataList.value.length; i++) {
if (dataList.value[i].deptName === name) {
count++
} else {
break
}
}
return count
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置表单
const resetForm = () => {
searchFormRef.value?.resetFields()
}
// 组件挂载时初始化
onMounted(() => {
init()
})
</script>
<style scoped>
.avue-crud {
margin-top: 20px;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -3,143 +3,141 @@
title="请设置住宿范围"
append-to-body
:close-on-click-modal="false"
:visible.sync="visible"
width="90%" heigth="90%"
>
<div style="height: 100%;width:100%">
<el-form :model="form" :rules="rules" ref="form" label-width="120px"
class="demo-ruleForm">
v-model="visible"
width="90%">
<div style="height: 100%;width:100%">
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px"
class="demo-ruleForm">
<el-form-item label="住宿半径(米)" prop="raidus">
<el-input-number v-model="form.raidus" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item label="住宿半径(米)" prop="raidus">
<el-input-number v-model="form.raidus" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-form>
<div id="container"></div>
</div>
<span slot="footer" class="dialog-footer">
</el-form>
<div id="container"></div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="dataFormSubmit">确定</el-button>
<el-button @click="visible = false">取消</el-button>
</span>
</div>
</template>
</el-dialog>
</template>
<script>
import {BMPGL, changeMajor} from "@/api/recruit/recruitstudentsignup";
import {putItemObj} from "@/api/admin/dict";
import {getTypeValue} from "@/api/admin/dict";
export default {
data() {
return {
ak: "V0ooaf2RZyEGOkD8UzZB3gvw7pCb0Kx7", // 百度的地图密钥
visible:false,
canSubmit:false,
circleShow:false,
circle:"",
// 地址信息
address: null,
center: { lng: 0, lat: 0 },
form:{
raidus:0,
},
dictId:"",
rules: {
raidus: [
{required: true, message: '住宿半径不能为空', trigger: ["blur", "change"]}
],
},
circleArr : [],
<script setup lang="ts">
import { ref, reactive, watch, nextTick } from 'vue'
import { useMessage, useMessageBox } from '/@/hooks/message'
import { BMPGL } from "@/api/recruit/recruitstudentsignup"
import { putItemObj } from "@/api/admin/dict"
import { getTypeValue } from "@/api/admin/dict"
};
},
watch: {
'form.raidus': {
handler(newVal) {
if(newVal !='' && newVal !=undefined){
this.circle.setRadius(newVal); //设置圆形覆盖物的半径
// 消息提示 hooks
const message = useMessage()
const messageBox = useMessageBox()
// 表单引用
const formRef = ref()
// 响应式数据
const ak = "V0ooaf2RZyEGOkD8UzZB3gvw7pCb0Kx7" // 百度的地图密钥
const visible = ref(false)
const canSubmit = ref(false)
const circleShow = ref(false)
const circle = ref<any>(null)
// 地址信息
const address = ref(null)
const center = reactive({ lng: 0, lat: 0 })
const dictId = ref("")
const circleArr = ref<any[]>([])
const form = reactive({
raidus: 0,
})
const rules = {
raidus: [
{ required: true, message: '住宿半径不能为空', trigger: ["blur", "change"] }
],
}
// 监听半径变化
watch(() => form.raidus, (newVal) => {
if (newVal != '' && newVal != undefined && circle.value) {
circle.value.setRadius(newVal) // 设置圆形覆盖物的半径
}
})
// 初始化
const init = () => {
visible.value = true
canSubmit.value = true
circleShow.value = true
nextTick(() => {
getTypeValue("dorm_jw").then((data: any) => {
const arr = data.data
arr.forEach((e: any) => {
if (e.label == 'bj') {
form.raidus = e.value
dictId.value = e.id
} else if (e.label == 'lng') {
center.lng = e.value
} else if (e.label == 'lat') {
center.lat = e.value
}
}
}
},
methods: {
init(){
let _this = this;
this.visible = true;
this.canSubmit = true;
this.circleShow = true;
this.$nextTick(() => {
getTypeValue("dorm_jw").then(data=>{
let arr = data.data;
arr.forEach(e=>{
if(e.label=='bj'){
_this.form.raidus=e.value;
_this.dictId = e.id;
}else if(e.label=='lng'){
_this.center.lng=e.value;
}else if(e.label=='lat'){
_this.center.lat=e.value;
}
});
BMPGL(_this.ak).then((BMapGL) => {
// 创建地图实例
let map = new BMapGL.Map("container");
// 创建点坐标 axios => res 获取的初始化定位坐标
let point = new BMapGL.Point(_this.center.lng, _this.center.lat)
// 初始化地图,设置中心点坐标和地图级别
map.centerAndZoom(point, 13)
//开启鼠标滚轮缩放
map.enableScrollWheelZoom(true)
})
BMPGL(ak).then((BMapGL: any) => {
// 创建地图实例
const map = new BMapGL.Map("container")
// 创建点坐标
const point = new BMapGL.Point(center.lng, center.lat)
// 初始化地图,设置中心点坐标和地图级别
map.centerAndZoom(point, 13)
// 开启鼠标滚轮缩放
map.enableScrollWheelZoom(true)
// 绘制圆
this.circle = new BMapGL.Circle(new BMapGL.Point(_this.center.lng, _this.center.lat), this.form.raidus, {
strokeColor: 'blue',
strokeWeight: 2,
strokeOpacity: 0.5,
enableEditing:false
});
map.addOverlay(this.circle);
})
})
});
},
// 表单提交
dataFormSubmit() {
let _this = this;
this.$confirm("是否确认保存住宿半径" , '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
_this.$refs['form'].validate((valid) => {
if (valid) {
_this.canSubmit = false;
putItemObj({id:_this.dictId,value:_this.form.raidus}).then(() => {
_this.$message({
showClose: true,
message: '修改成功',
type: 'success'
})
_this.visible = false
_this.canSubmit = true;
})
}
// 绘制圆
circle.value = new BMapGL.Circle(new BMapGL.Point(center.lng, center.lat), form.raidus, {
strokeColor: 'blue',
strokeWeight: 2,
strokeOpacity: 0.5,
enableEditing: false
})
}).then(data => {
map.addOverlay(circle.value)
})
})
})
}
}).catch(function(err) { })
}
},
};
// 表单提交
const dataFormSubmit = async () => {
try {
await messageBox.confirm('是否确认保存住宿半径')
formRef.value?.validate((valid: boolean) => {
if (valid) {
canSubmit.value = false
putItemObj({ id: dictId.value, value: form.raidus }).then(() => {
message.success('修改成功')
visible.value = false
canSubmit.value = true
}).catch(() => {
canSubmit.value = true
})
}
})
} catch {
// 用户取消
}
}
// 暴露方法给父组件
defineExpose({
init
})
</script>
<style scoped>
<style scoped>
#container {
overflow: hidden;
width: 100%;
@@ -147,8 +145,12 @@ export default {
margin: 0;
font-family: "微软雅黑";
}
ul li {
list-style: none;
}
.dialog-footer {
text-align: right;
}
</style>

View File

@@ -1,8 +1,7 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()" ref="searchForm">
<el-form :inline="true" :model="dataForm" @keyup.enter="getDataList" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable clearable placeholder="请选择招生计划" size="small"
style="width: 150px;">
@@ -16,9 +15,9 @@
</el-form-item>
<el-form-item>
<el-button type="warning"
icon="el-icon-download"
icon="Download"
size="small"
@click="handleExport()">汇总导出</el-button>
@click="handleExport">汇总导出</el-button>
</el-form-item>
</el-form>
<el-table
@@ -34,7 +33,7 @@
align="center"
width="120"
label="学院">
<template slot-scope="scope">
<template #default="scope">
<span>{{
global.getLabelValueByPropes(deptList, scope.row.xy, {
'key': 'deptCode',
@@ -62,96 +61,113 @@
label="女生数">
</el-table-column>
</el-table>
</basic-container>
</div>
</template>
<script>
import {mapGetters} from 'vuex'
import {getDeptList} from "@/api/basic/basicclass";
import {dormApplyAnalysis} from "@/api/recruit/recruitstudentsignup";
import {list} from '@/api/recruit/recruitstudentplangroup'
<script setup lang="ts">
import { ref, reactive, watch, onMounted } from 'vue'
import axios from 'axios'
import { getDeptList } from "@/api/basic/basicclass"
import { dormApplyAnalysis } from "@/api/recruit/recruitstudentsignup"
import { list } from '@/api/recruit/recruitstudentplangroup'
// @ts-ignore
import global from '@/components/tools/commondict'
export default {
data() {
return {
deptList: [],
dataList: [],
planList: [],
dataListLoading: false,
global:global,
dataForm: {
groupId: ''
},
}
},
components: {},
created() {
this.initDept()
this.initPlanGroup()
},
watch:{
"dataForm.groupId":{
handler(val){
this.getTableList(val)
}
}
},
computed: {
...mapGetters(['permissions'])
},
methods: {
initDept() {
getDeptList().then(data => {
this.deptList = data.data
})
// 响应式数据
const deptList = ref<any[]>([])
const dataList = ref<any[]>([])
const planList = ref<any[]>([])
const dataListLoading = ref(false)
const searchFormRef = ref()
},
exportExcel: function(form,url) {
return axios({ // 用axios发送post请求
method: 'post',
url: url, // 请求地址
data: form, // 参数
responseType: 'blob', // 表明返回服务器返回的数据类型
headers: {
'Content-Type': 'application/json'
}
})
},
handleExport(){
this.exportExcel(this.dataForm,'/recruit/recruitstudentsignup/dormApplyAnalysisExport').then(res => { // 处理返回的文件流
const blob = new Blob([res.data]);
const elink = document.createElement('a');
elink.download = "新生住宿申请汇总.xls";
elink.style.display = 'none';
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href); // 释放URL 对象
document.body.removeChild(elink);
}).catch(function(err){
})
},
initPlanGroup(){
list().then(data =>{
this.planList = data.data
this.dataForm.groupId=this.planList[0].id;
});
},
getTableList(groupId){
dormApplyAnalysis({"groupId":groupId}).then(response => {
this.dataList = response.data
})
const dataForm = reactive({
groupId: ''
})
// 监听 groupId 变化
watch(() => dataForm.groupId, (val) => {
if (val) {
getTableList(val)
}
})
// 初始化部门列表
const initDept = () => {
getDeptList().then((data: any) => {
deptList.value = data.data
})
}
// 导出Excel
const exportExcel = (form: any, url: string) => {
return axios({
method: 'post',
url: url,
data: form,
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
})
}
// 导出处理
const handleExport = () => {
exportExcel(dataForm, '/recruit/recruitstudentsignup/dormApplyAnalysisExport').then((res: any) => {
const blob = new Blob([res.data])
const elink = document.createElement('a')
elink.download = "新生住宿申请汇总.xls"
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {
// 错误处理
})
}
// 初始化招生计划
const initPlanGroup = () => {
list().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
}
})
}
// 获取表格数据
const getTableList = (groupId: string) => {
dataListLoading.value = true
dormApplyAnalysis({ "groupId": groupId }).then((response: any) => {
dataList.value = response.data
dataListLoading.value = false
}).catch(() => {
dataListLoading.value = false
})
}
// 获取数据列表
const getDataList = () => {
if (dataForm.groupId) {
getTableList(dataForm.groupId)
}
}
// 组件挂载时初始化
onMounted(() => {
initDept()
initPlanGroup()
})
</script>
<style scoped>
.mod-config {
padding: 20px;
}
</style>

View File

@@ -1,7 +1,7 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()" ref="searchForm">
<el-form :inline="true" :model="dataForm" @keyup.enter="getDataList()" ref="searchForm">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable clearable placeholder="请选择招生计划" size="small"
@change="chanMajor" style="width: 150px;">
@@ -233,7 +233,7 @@
<el-select v-model="dataForm.interview" filterable clearable placeholder="请选择面试结果" size="small"
style="width: 120px;">
<el-option
v-for="item in global.INTERVIEW_DIC"
v-for="item in interviewDicList"
:key="item.value"
:label="item.label"
:value="item.value">
@@ -245,7 +245,7 @@
<el-select v-model="dataForm.zlsh" filterable clearable placeholder="请选择资料审核状态" size="small"
style="width: 120px;">
<el-option
v-for="item in global.ZLSH"
v-for="item in zlshList"
:key="item.value"
:label="item.label"
:value="item.value">
@@ -301,7 +301,7 @@
header-align="center"
align="center"
label="操作">
<template slot-scope="scope">
<template #default="scope">
<el-button type="text" size="small" icon="el-icon-view" @click="addOrUpdateHandle(scope.row.id,0)">查看
</el-button>
<el-button v-if="permissions.recruit_recruitstudentsignup_edit" type="text" size="small"
@@ -377,7 +377,7 @@
align="left"
width="250"
label="资料检测">
<template slot-scope="scope">
<template #default="scope">
<div v-if="scope.row.isOut=='0'">
<span >资料审核状态:</span>
<span style="color: #b4bccc" v-if="scope.row.zlsh=='0'">未填写</span>
@@ -400,29 +400,24 @@
header-align="center"
align="left"
label="录取专业">
<template slot-scope="scope">
<template #default="scope">
<span>录取状态:</span>
<span v-if="scope.row.auditStatus==0"
style="color: orange">{{ global.getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
style="color: orange">{{ getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
<span v-if="scope.row.auditStatus==20"
style="color: green">{{ global.getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
style="color: green">{{ getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
<span v-if="scope.row.auditStatus==-20"
style="color: red">{{ global.getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
style="color: red">{{ getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
<br/>
<div v-if="scope.row.auditStatus==20">
录取专业:
{{
global.getLabelValueByPropes2(planMajorList, scope.row.confirmedMajor, {
'key': 'zydm',
'value': 'zymc'
})
}} <br/>
{{ getMajorLabelWithYears(planMajorList, scope.row.confirmedMajor, { key: 'zydm', value: 'zymc' }) }}<br/>
</div>
<div v-if="scope.row.auditStatus==20">
录取时间:{{ dateFormat(scope.row.auditTime, "yyyy-MM-dd HH:mm:ss") }}
</div>
<div v-if="scope.row.degreeOfEducation == '3'">
面试结果:{{ global.getLabelValue(global.INTERVIEW_DIC, scope.row.interview) }}
面试结果:{{ getLabelValue(interviewDicList, scope.row.interview) }}
<span v-if="scope.row.interview == '-1' && scope.row.interviewReason"
style="color: #ff9900">({{ scope.row.interviewReason }})</span>
</div>
@@ -446,13 +441,10 @@
width="120"
label="学院(经办人)">
<template slot-scope="scope">
<span v-if="scope.row.auditStatus==20">{{
global.getLabelValueByPropes(deptList, scope.row.xy, {
'key': 'deptCode',
'value': 'deptName'
})
}}</span> <br/>
<template #default="scope">
<span v-if="scope.row.auditStatus==20">
{{ getLabelValueByProps(deptList, scope.row.xy, { key: 'deptCode', value: 'deptName' }) }}
</span> <br/>
<span v-if="scope.row.auditStatus==20">
({{scope.row.auditorName}})
</span>
@@ -466,7 +458,7 @@
align="center"
width="90"
label="缴费状态">
<template slot-scope="scope">
<template #default="scope">
{{ getStatus(scope.row.paiedOffline) }}
</template>
</el-table-column>
@@ -476,7 +468,7 @@
align="center"
width="90"
label="推送状态">
<template slot-scope="scope">
<template #default="scope">
<span v-if="scope.row.pushed==0" style="color: red">{{ getPushed(scope.row.pushed) }}</span>
<span v-if="scope.row.pushed==1" style="color: green">{{ getPushed(scope.row.pushed) }}</span>
</template>
@@ -504,61 +496,15 @@
<update v-if="updateVisible" ref="update" @refreshDataList="getDataList"></update>
<el-dialog title="支付二维码" :visible.sync="dialogFormVisible" width="800px" height="80%"
@close="dialogFormVisible=false">
<el-table :data="tableData" border>
<el-table-column label="唯一号" prop="serialNumber" align="center"></el-table-column>
<el-table-column label="姓名" prop="name" align="center"></el-table-column>
<el-table-column label="家长手机号" prop="parentTelOne" align="center"></el-table-column>
<el-table-column label="操作" prop="" align="center">
<template slot-scope="scope">
<el-button @click="updateFS()" icon="el-icon-search" type="danger" size="small">立即查询</el-button>
</template>
</el-table-column>
</el-table>
<div style="padding-top: 20px;">
<div id="payQrcode1" style="display: inline-block;">
{{ payQrcode1Msg }}
</div>
<vue-qr :text="payQrcode1" :size="200" v-if="showPrise1" style="display: inline-block"></vue-qr>
<!-- 支付二维码弹窗 -->
<pay-qrcode-dialog ref="payQrcodeDialogRef" @refresh="getDataList"></pay-qrcode-dialog>
<div id="payQrcode2" style="display: inline-block">
{{ payQrcode2Msg }}
</div>
<vue-qr :text="payQrcode2" :size="200" v-if="showPrise2" style="display: inline-block"></vue-qr>
<div id="payQrcode3" style="display: inline-block">
{{ payQrcode3Msg }}
</div>
<vue-qr :text="payQrcode3" :size="200" v-if="showPrise3" style="display: inline-block"></vue-qr>
</div>
<span style="color: red;padding-top: 20px;">** 此界面为查询学生缴款二维码,如有收不到微信推送,或手机号填错的,可直接在此扫码支付,支付成功后,请手动点击"立即查询"按钮,查询该生的缴费情况;因财政收费系统有一定的滞后性,如点击"立即查询"后任显示未交费,请稍后再继续查询,或重新点击"立即查询"按钮 **</span>
</el-dialog>
<el-dialog title="延迟缴费" :visible.sync="delayPayTimeVisible" width="300px" height="50%"
@close="delayPayTimeVisible=false">
<el-date-picker v-model="delayPayTime" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
filterable clearable type="datetime"></el-date-picker>
<div slot="footer" class="dialog-footer">
<el-button @click="delayPayTimeVisible=false">关 闭</el-button>
<el-button @click="updateInfo" type="primary">保存</el-button>
</div>
</el-dialog>
<!-- 延迟缴费弹窗 -->
<delay-pay-time-dialog ref="delayPayTimeDialogRef" @refresh="getDataList"></delay-pay-time-dialog>
<el-dialog title="录取通知书" :visible.sync="lqtzsVisible" width="80%" height="50%"
@close="lqtzsVisible=false">
<div style="height: 60vh">
<iframe id="iframeid" :src="pdfPath" ref="iframe" frameborder="0" style="width:100%;height:100%;"></iframe>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="lqtzsVisible=false">关 闭</el-button>
<el-button @click="suerLQTZ" v-if="permissions.sureLQTZ && lqtzsShow" type="primary">确认已发放</el-button>
</div>
</el-dialog>
<!-- 录取通知书弹窗 -->
<admission-notice-dialog ref="admissionNoticeDialogRef" :permissions="permissions" @refresh="getDataList"></admission-notice-dialog>
<dorm-f-w v-if="dormFWRefVisible" ref="dormFWRef"></dorm-f-w>
<show-map v-if="baiduMapVisible" ref="baiduMapRef"></show-map>
@@ -568,41 +514,41 @@
</template>
<script>
import {list} from '@/api/recruit/recruitstudentplangroup'
import {list} from '/@/api/recruit/recruitstudentplangroup'
import {
delObj,
exportZip,
fetchList,
leaveSchool,
rePush,
updateInfo,
yjOut,
toWord,
sureLQTZ,
oneClassAndStuNo,
tbStuWork,
sendImg,
pushCity
} from '@/api/recruit/recruitstudentsignup'
} from '/@/api/recruit/recruitstudentsignup'
import {defineAsyncComponent} from 'vue'
// import {formatDate} from "element-ui/src/utils/date-util";
import global from '@/components/tools/commondict'
import {getDeptList} from "@/api/basic/basicclass";
import {list as planMajor} from "@/api/recruit/recruitplanmajor";
import {getTypeValue} from "@/api/admin/dict";
import {getUserListByRole} from "@/api/admin/user";
import {ROLE_CODE} from "@/config/global";
import {updateFs} from "@/api/finance/financenormalstu";
import {showLoading, hideLoading} from '@/api/asset/loading';
import {queryTeacherBaseByNo} from "@/api/professional/teacherbase";
// import global from '@/components/tools/commondict' // global 已废弃
import { getLabelValue, getLabelValueByProps, getMajorLabelWithYears } from '/@/utils/dictLabel'
import {getDeptList} from "/@/api/basic/basicclass";
import {list as planMajor} from "/@/api/recruit/recruitplanmajor";
import {getTypeValue, getDictsByTypes} from "/@/api/admin/dict";
import {getUserListByRole} from "/@/api/admin/user";
import {ROLE_CODE} from "/@/config/global";
import {showLoading, hideLoading} from "/@/api/asset/loading";
import {queryTeacherBaseByNo} from "/@/api/professional/teacherbase";
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
const MajorChange = defineAsyncComponent(() => import('./majorChange.vue'))
const Update = defineAsyncComponent(() => import('./update.vue'))
const DormFW = defineAsyncComponent(() => import('./dormFW.vue'))
const ShowMap = defineAsyncComponent(() => import('./showMap.vue'))
const InterviewForm = defineAsyncComponent(() => import('@/views/recruit/recruitstudentsignup/interviewForm.vue'))
const InterviewForm = defineAsyncComponent(() => import('/@/views/recruit/recruitstudentsignup/interviewForm.vue'))
const PayQrcodeDialog = defineAsyncComponent(() => import('./PayQrcodeDialog.vue'))
const DelayPayTimeDialog = defineAsyncComponent(() => import('./DelayPayTimeDialog.vue'))
const AdmissionNoticeDialog = defineAsyncComponent(() => import('./AdmissionNoticeDialog.vue'))
export default {
data() {
@@ -630,11 +576,9 @@ export default {
cityExamType: ""
},
id: "",
pdfPath: "",
delayPayTime: "",
auditorList: [],
isBackTzList: [{label: "未发放", value: "0"}, {label: "已发放", value: "1"}],
paystatusList: [{label: "已缴费", value: "10"}, {label: "未缴费", value: "0"}, {label: "部分缴费", value: "5"}],
paystatusList: [],
global: global,
planList: [],
eduList: [],
@@ -645,34 +589,22 @@ export default {
pushedList: [{label: "未推送", value: "0"}, {label: "已推送", value: "1"}],
isOutFwList: [{label: "待确认", value: "0"}, {label: "范围内", value: "1"}, {label: "范围外", value: "2"}],
isOutList: [{label: "学校", value: "0"}, {label: "市平台", value: "1"}],
interviewDicList: [],
zlshList: [],
deptList: [],
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
lqtzsShow: false,
dataListLoading: false,
addOrUpdateVisible: false,
majorChangeVisible: false,
lqtzsVisible: false,
updateVisible: false,
startDatePicker: this.beginDate(),
endDatePicker: this.processDate(),
payQrcode1: "",
showPrise1: false,
payQrcode1Msg: "",
payQrcode2: "",
payQrcode2Msg: "",
showPrise2: false,
payQrcode3: "",
payQrcode3Msg: "",
showPrise3: false,
dialogFormVisible: false,
delayPayTimeVisible: false,
dormFWRefVisible: false,
baiduMapVisible: false,
tableData: [],
teacherList:[]
}
},
@@ -682,7 +614,10 @@ export default {
MajorChange,
Update,
DormFW,
ShowMap
ShowMap,
PayQrcodeDialog,
DelayPayTimeDialog,
AdmissionNoticeDialog
},
created() {
this.init();
@@ -690,6 +625,9 @@ export default {
computed: {
},
methods: {
getLabelValue,
getLabelValueByProps,
getMajorLabelWithYears,
dateFormat(date, format) {
// return formatDate(date, format)
},
@@ -921,6 +859,12 @@ export default {
getTypeValue('finance_student_source').then(res => {
this.eduList = res.data
})
// 批量获取字典数据:面试结果、资料审核状态、缴费状态
getDictsByTypes(['interview_dic', 'recruit_zlsh', 'recruit_pay_status']).then((res) => {
this.interviewDicList = res.data.interview_dic || []
this.zlshList = res.data.recruit_zlsh || []
this.paystatusList = res.data.recruit_pay_status || []
})
//所有经办人
getUserListByRole(ROLE_CODE.ROLE_RECRUIT_SECOND).then(res => {
this.auditorList = res.data;
@@ -1057,17 +1001,9 @@ export default {
}
},
lqtz(row) {
this.id = row.id;
this.pdfPath = "";
if (row.isBackTz == '0') {
this.lqtzsShow = true;
} else {
this.lqtzsShow = false;
}
toWord(row).then(res => {
this.pdfPath = "/recruit/file/previewPdf?filePath=" + encodeURIComponent(res.data);
this.lqtzsVisible = true;
});
this.$nextTick(() => {
this.$refs.admissionNoticeDialogRef?.init(row)
})
},
infoTable(row) {
window.open("printRecruitedStu.html?appId=" + row.id);
@@ -1085,20 +1021,6 @@ export default {
this.getDataList()
})
},
suerLQTZ() {
let _this = this;
this.$confirm('是否确认已打印并发放本通知书?请谨慎操作', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
return sureLQTZ({id: _this.id})
}).then(data => {
this.$message.success('保存成功')
this.lqtzsVisible = false;
this.getDataList()
})
},
rePush(row) {
this.$confirm('是否确认重新推送本条数据?请谨慎操作', '提示', {
confirmButtonText: '确定',
@@ -1112,77 +1034,14 @@ export default {
})
},
delayPayTimeSet(row) {
this.delayPayTime = '';
this.id = row.id;
if (row.delayPaymentTime) {
this.delayPayTime = row.delayPaymentTime;
}
this.delayPayTimeVisible = true;
},
updateInfo() {
let _this = this;
this.$confirm('是否确认进度延迟收费操作?请谨慎操作', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
return updateInfo({delayPaymentTime: _this.delayPayTime, id: _this.id})
}).then(data => {
this.delayPayTimeVisible = false;
this.$message.success('延迟收费修改成功')
this.getDataList()
this.$nextTick(() => {
this.$refs.delayPayTimeDialogRef?.init(row)
})
},
updateFS() {
updateFs({"serialNumber": this.tableData[0].serialNumber.substring(1, this.tableData[0].serialNumber.length)}).then(res => {
this.$notify.success('已提交查询请求请等待1分钟后重新查询')
this.dialogFormVisible = false
this.getDataList()
});
},
showPayCode(row) {
this.showPrise1 = false;
this.showPrise2 = false;
this.showPrise3 = false;
//置空
this.payQrcode1 = "";
this.payQrcode2 = "";
this.payQrcode3 = "";
if (row.clfPayCode == "" || row.clfPayCode == undefined) {
this.payQrcode1Msg = ""
this.showPrise1 = false;
} else {
this.payQrcode1Msg = "材料费、代办费";
this.showPrise1 = true;
this.payQrcode1 = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.clfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400';
}
if (row.xfPayCode == "" || row.xfPayCode == undefined) {
this.payQrcode2Msg = ""
this.showPrise2 = false;
} else {
this.payQrcode2Msg = "学费";
this.showPrise2 = true;
this.payQrcode2 = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.xfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400';
}
if (row.zdbPayCode == "" || row.zdbPayCode == undefined) {
this.payQrcode3Msg = ""
this.showPrise3 = false;
} else {
this.payQrcode3Msg = "中德班学费";
this.showPrise3 = true;
this.payQrcode3 = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.zdbPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400';
}
this.tableData = [];
this.tableData.push(row);
this.dialogFormVisible = true;
this.$nextTick(() => {
this.$refs.payQrcodeDialogRef?.init(row)
})
},
interviewForm(row) {
this.$refs.interviewFormRef.init(row)

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog :visible.sync="visible" width="60%" :title="`面试审核(${row.name})`">
<el-dialog v-model="visible" width="60%" :title="`面试审核(${row.name})`">
<el-row>
<el-radio v-model="status" label="1">通过</el-radio>
<el-radio v-model="status" label="-1">未通过</el-radio>
@@ -9,54 +9,68 @@
<el-input type="textarea" v-model="reason" placeholder="请输入未通过的原因"></el-input>
</el-row>
<span slot="footer" class="dialog-footer">
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="confirm"><span>确认</span></el-button>
<el-button @click="visible = false">取消</el-button>
</span>
</div>
</template>
</el-dialog>
</template>
<script>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { useMessage } from '/@/hooks/message'
// @ts-ignore
import global from "@/components/tools/commondict"
import {interview} from "@/api/recruit/recruitstudentsignup";
export default {
name: "interviewForm",
data:function() {
return {
visible: false,
row:{},
status: '1',
reason:''
}
},
methods:{
init(row){
this.visible = true
this.row = row
this.status = row.interview
this.reason = row.interviewReason
},
confirm(){
if(!this.status || (this.status == '-1' && !this.reason)){
import { interview } from "@/api/recruit/recruitstudentsignup"
global.showWarningInfo(this,"请选择通过还是未通过,未通过请输入原因",2000)
return
}else{
interview({"id":this.row.id,"interview":this.status,"interviewReason":this.reason}).then(resp=>{
global.showSuccessInfo(this,"操作成功",2000)
this.visible = false
this.$emit('refresh')
}).catch(e =>{
global.showWarningInfo(this,"操作失败",2000)
})
// 消息提示 hooks
const message = useMessage()
}
}
// Emits
const emit = defineEmits<{
(e: 'refresh'): void
}>()
// 响应式数据
const visible = ref(false)
const row = reactive<any>({})
const status = ref('1')
const reason = ref('')
// 初始化
const init = (rowData: any) => {
visible.value = true
Object.assign(row, rowData)
status.value = rowData.interview || '1'
reason.value = rowData.interviewReason || ''
}
// 确认
const confirm = () => {
if (!status.value || (status.value == '-1' && !reason.value)) {
message.warning('请选择通过还是未通过,未通过请输入原因')
return
} else {
interview({ "id": row.id, "interview": status.value, "interviewReason": reason.value }).then(() => {
message.success('操作成功')
visible.value = false
emit('refresh')
}).catch(() => {
message.error('操作失败')
})
}
}
// 暴露方法给父组件
defineExpose({
init
})
</script>
<style scoped>
.dialog-footer {
text-align: right;
}
</style>

View File

@@ -2,16 +2,15 @@
<el-dialog
:title="title"
:close-on-click-modal="false"
:visible.sync="visible"
v-model="visible"
append-to-body
width="90%"
>
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()"
label-width="170px" size="mini">
width="90%">
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit"
label-width="170px" size="small">
<el-row>
<el-col :span="24">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true"
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id"
placeholder="请选择招生计划" size="small" style="width: 100%">
<el-option
v-for="item in planList"
@@ -22,33 +21,32 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="姓名" prop="name" >
<el-input type="text" v-model="dataForm.name" :disabled="type==1 ? false : true"></el-input>
<el-form-item label="姓名" prop="name">
<el-input type="text" v-model="dataForm.name" :disabled="type != 1"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="身份证号" prop="idNumber">
<el-input type="text" v-model="dataForm.idNumber" :disabled="type==2 ? false : true"></el-input>
<el-input type="text" v-model="dataForm.idNumber" :disabled="type != 2"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="成绩折算分" prop="correctedScore">
<el-input-number v-model="dataForm.correctedScore" controls-position="right" :min="0" :max="999" :step-strictly="true"style="width:100%;" ></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-col :span="24">
<el-form-item label="成绩折算分" prop="correctedScore">
<el-input-number v-model="dataForm.correctedScore" controls-position="right" :min="0" :max="999" :step-strictly="true" style="width: 100%;"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="原录取专业" prop="confirmedMajor">
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="" size="small" style="width: 100%" :disabled="type==1 ? false : true" @change="changeM(dataForm.confirmedMajor)">
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="" size="small" style="width: 100%" :disabled="type != 1" @change="changeM(dataForm.confirmedMajor)">
<el-option
v-for="item in planMajorList"
:key="item.zydm"
@@ -62,7 +60,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="新录取专业" prop="newConfirmedMajor">
<el-select v-model="dataForm.newConfirmedMajor" filterable placeholder="" size="small" style="width: 100%" @change="changeCM(dataForm.newConfirmedMajor)">
<el-select v-model="dataForm.newConfirmedMajor" filterable placeholder="" size="small" style="width: 100%" @change="changeCM(dataForm.newConfirmedMajor)">
<el-option
v-for="item in planMajorList"
:key="item.zydm"
@@ -77,17 +75,17 @@
<el-row>
<el-col :span="6">
<el-form-item label="学费" prop="feeTuition">
<el-input-number v-model="dataForm.feeTuition" controls-position="right" :min="0" :max="999999" :step-strictly="true" style="width:100%;" :disabled="type==2?false:true"></el-input-number>
<el-input-number v-model="dataForm.feeTuition" controls-position="right" :min="0" :max="999999" :step-strictly="true" style="width:100%;" :disabled="type == 2"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="代办费" prop="feeAgency">
<el-input-number v-model="dataForm.feeAgency" controls-position="right" :min="0" :max="999999" :step-strictly="true" style="width:100%;" :disabled="type==2?false:true"></el-input-number>
<el-input-number v-model="dataForm.feeAgency" controls-position="right" :min="0" :max="999999" :step-strictly="true" style="width:100%;" :disabled="type == 2"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="总费用" prop="allMoney">
<span style="color: red">{{dataForm.feeTuition+dataForm.feeAgency}}</span>
<span style="color: red">{{ dataForm.feeTuition + dataForm.feeAgency }}</span>
</el-form-item>
</el-col>
</el-row>
@@ -95,276 +93,295 @@
<el-row>
<el-col :span="24">
<el-form-item label="审核备注" prop="auditRemarks">
<el-input type="textarea" v-model="dataForm.auditRemarks" placeholder="审核备注" :rows="2" ></el-input>
<el-input type="textarea" v-model="dataForm.auditRemarks" placeholder="审核备注" :rows="2"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer" >
<el-button @click="visible = false">取消</el-button>
<el-button type="success" @click="dataFormSubmit()" v-if="canSubmit">确认修改</el-button>
</span>
<template #footer>
<div class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="success" @click="dataFormSubmit" v-if="canSubmit">确认修改</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
import {getObj,changeMajor} from '@/api/recruit/recruitstudentsignup'
import {list} from "@/api/recruit/recruitstudentplangroup";
import {listByEdu} from "@/api/recruit/recruitplanmajor";
import {getDictByType} from "@/api/contract/contract";
import {list as scoreList} from "@/api/recruit/recruitstudentplancorrectscoreconfig";
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue'
import { ElNotification } from 'element-plus'
import { useMessageBox } from '/@/hooks/message'
import { getObj, changeMajor } from '@/api/recruit/recruitstudentsignup'
import { list } from "@/api/recruit/recruitstudentplangroup"
import { listByEdu } from "@/api/recruit/recruitplanmajor"
import { getDictByType } from "@/api/contract/contract"
import { list as scoreList } from "@/api/recruit/recruitstudentplancorrectscoreconfig"
// 消息提示 hooks
const messageBox = useMessageBox()
export default {
data() {
return {
visible: false,
canSubmit: false,
title: "",
eduList: [],
type:null,
dataForm: {
id: "",
groupId: "",
name: "",
oldName: "",
gender: "",
nationality: "",
degreeOfEducation: "",
isLeagueMember: "",
schoolOfGraduation: "",
isAccommodation: "",
examRegistrationNumbers: "",
isMinimumLivingSecurity: "",
score: "",
postcode: "",
residenceType: "",
correctedScore: "",
placeScore: "",
schoolFrom: "",
idNumber: "",
residenceProvince: "",
residenceCity: "",
residenceArea: "",
residenceDetail: "",
homeAddressProvince: "",
homeAddressCity: "",
homeAddressArea: "",
homeAddressDetail: "",
parentName: "",
parentTelOne: "",
parentTelTwo: "",
selfTel: "",
wishMajorOne: "",
wishMajorTwo: "",
wishMajorThree: "",
confirmedMajor: "",
sevenMajor:"",
sixMajor:"",
fiveMajor:"",
fourMajor: "",
threeMajor: "",
twoMajor: "",
feeContribute: 0,
scorePhoto: "",
graPic: "",
yyPic: "",
housePic: "",
sbPic: "",
contactName: "",
oldSerialNumber: "",
colorDiscrimination: "",
nutrition: "",
height: "",
weight: "",
pastMedicalHistory: "",
eyesightLeft: "",
eyesightRight: "",
correctEyesightLeft: "",
correctEyesightRight: "",
remarks: "",
auditRemarks: "",
serialNumber: "",
auditStatus:"",
schoolCode:"",
newConfirmedMajor: "",
householdPic:""
},
disabled: false,
schoolFromList:[{label:"本省外市",value:"1"},{label:"外省外市",value:"2"}],
planList: [],
planMajorList:[],
// Emits
const emit = defineEmits<{
(e: 'refreshDataList'): void
}>()
deptList: [],
// 表单引用
const dataFormRef = ref()
dialogImageUrl:"",
dialogUploadVisible:false,
// 响应式数据
const visible = ref(false)
const canSubmit = ref(false)
const title = ref("")
const type = ref<number | null>(null)
const planList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const agencyFeeList = ref<any[]>([])
const tuitionFeeList = ref<any[]>([])
const schoolCodeList = ref<any[]>([])
const dataForm = reactive({
id: "",
groupId: "",
name: "",
oldName: "",
gender: "",
nationality: "",
degreeOfEducation: "",
isLeagueMember: "",
schoolOfGraduation: "",
isAccommodation: "",
examRegistrationNumbers: "",
isMinimumLivingSecurity: "",
score: "",
postcode: "",
residenceType: "",
correctedScore: null as number | null,
placeScore: "",
schoolFrom: "",
idNumber: "",
residenceProvince: "",
residenceCity: "",
residenceArea: "",
residenceDetail: "",
homeAddressProvince: "",
homeAddressCity: "",
homeAddressArea: "",
homeAddressDetail: "",
parentName: "",
parentTelOne: "",
parentTelTwo: "",
selfTel: "",
wishMajorOne: "",
wishMajorTwo: "",
wishMajorThree: "",
confirmedMajor: "",
sevenMajor: "",
sixMajor: "",
fiveMajor: "",
fourMajor: "",
threeMajor: "",
twoMajor: "",
feeContribute: 0,
scorePhoto: "",
graPic: "",
yyPic: "",
housePic: "",
sbPic: "",
contactName: "",
oldSerialNumber: "",
colorDiscrimination: "",
nutrition: "",
height: "",
weight: "",
pastMedicalHistory: "",
eyesightLeft: "",
eyesightRight: "",
correctEyesightLeft: "",
correctEyesightRight: "",
remarks: "",
auditRemarks: "",
serialNumber: "",
auditStatus: "",
schoolCode: "",
newConfirmedMajor: "",
householdPic: "",
feeTuition: 0,
feeAgency: 0
})
dataRule: {
groupId: [
{required: true, message: '招生计划不能为空', trigger: 'change'}
],
name: [
{required: true, message: '姓名不能为空', trigger: 'change'}
],
idNumber: [
{required: true, message: '身份证不能为空', trigger: 'change'}
],
correctedScore: [
{required: true, message: '成绩折算分不能为空', trigger: 'change'}
],
confirmedMajor:[
{required: true, message: '原录取专业不能为空', trigger: 'change'}
],
newConfirmedMajor:[
{required: true, message: '新录取专业不能为空', trigger: 'change'}
]
const dataRule = {
groupId: [
{ required: true, message: '招生计划不能为空', trigger: 'change' }
],
name: [
{ required: true, message: '姓名不能为空', trigger: 'change' }
],
idNumber: [
{ required: true, message: '身份证不能为空', trigger: 'change' }
],
correctedScore: [
{ required: true, message: '成绩折算分不能为空', trigger: 'change' }
],
confirmedMajor: [
{ required: true, message: '原录取专业不能为空', trigger: 'change' }
],
newConfirmedMajor: [
{ required: true, message: '新录取专业不能为空', trigger: 'change' }
]
}
// 初始化数据
const initData = () => {
list().then((data: any) => {
planList.value = data.data
})
}
// 改变新专业
const changeCM = (id: string) => {
if (id) {
let flag = false
planMajorList.value.forEach((e: any) => {
if (dataForm.newConfirmedMajor == e.zydm && e.isZd == "1" && String(dataForm.degreeOfEducation) == "1") {
flag = true
}
}
},
created() {
},
methods: {
init(id) {
let _this = this;
this.dataForm.id = id || null;
this.visible = true;
this.canSubmit = true;
this.initData();
this.isShow = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
if (this.dataForm.id) {
//获取数据字典代办费
getDictByType("agency_fee").then(res => {
_this.agencyFeeList = res.data
//获取数据字典学费
getDictByType("tuition_fee").then(res => {
_this.tuitionFeeList = res.data
getObj(this.dataForm.id).then(response => {
this.dataForm = response.data
this.title = this.dataForm.serialNumber
//获取文化程度对应的专业
this.planMajorList=[];
this.agencyFeeList.forEach(e=>{
if(this.dataForm.degreeOfEducation == e.label){
this.dataForm.feeAgency = e.value;
}
});
this.tuitionFeeList.forEach(e=>{
if(this.dataForm.degreeOfEducation == e.label && (this.dataForm.degreeOfEducation !=1) ){
this.dataForm.feeTuition = e.value;
}
});
listByEdu({groupId: this.dataForm.groupId,degreeOfEducation:this.dataForm.degreeOfEducation}).then(e=>{
_this.planMajorList = e.data;
});
//获取招生计划下的学校和分数线
scoreList({groupId:_this.dataForm.groupId}).then(data =>{
_this.schoolCodeList = data.data;
});
if ("1" == this.dataForm.degreeOfEducation) {
this.title = "C" + this.title;
} else if ("2" == this.dataForm.degreeOfEducation) {
this.title = "G" + this.title;
} else if ("3" == this.dataForm.degreeOfEducation) {
this.title = "J" + this.title;
}
if("-20" == this.dataForm.auditStatus){
this.title ="未录取 "+this.title;
}else if("0" == this.dataForm.auditStatus){
this.title ="待审核 "+this.title;
}else if("20" == this.dataForm.auditStatus){
this.title ="已录取 "+this.title;
}
})
})
})
})
if (String(dataForm.degreeOfEducation) == "1") {
dataForm.feeTuition = 0
tuitionFeeList.value.forEach((e: any) => {
if (e.label == "0" && flag) {
dataForm.feeTuition = e.value
}
})
},
initData() {
let _this = this;
list().then(data => {
_this.planList = data.data
});
},
changeCM(id){
if(id){
let _this = this;
let flag = false;
_this.planMajorList.forEach(e=>{
if(_this.dataForm.newConfirmedMajor == e.zydm && e.isZd=="1" &&_this.dataForm.degreeOfEducation==1){
flag = true;
}
});
if(_this.dataForm.degreeOfEducation==1){
_this.dataForm.feeTuition=0;
_this.tuitionFeeList.forEach(e=>{
if(e.label=="0" && flag){
_this.dataForm.feeTuition = e.value;
}
});
}
}
},
changeM(id){
if(id){
let _this = this;
let flag = false;
_this.dataForm.confirmedMajor = id;
//是初中生并且是中德班
_this.planMajorList.forEach(e=>{
if(_this.dataForm.confirmedMajor == e.zydm && e.isZd=="1" &&_this.dataForm.degreeOfEducation==1){
flag = true;
}
});
if(_this.dataForm.degreeOfEducation==1){
_this.dataForm.feeTuition=0;
_this.tuitionFeeList.forEach(e=>{
if(e.label=="0" && flag){
_this.dataForm.feeTuition = e.value;
}
});
}
}
},
// 表单提交
dataFormSubmit() {
let _this = this;
let title = "确认调整录取专业么?";
if(this.dataForm.confirmedMajor == this.dataForm.newConfirmedMajor){
_this.$notify.error('新专业不能和原专业相同');
return
}
this.$confirm(title , '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
_this.$refs['dataForm'].validate((valid) => {
if (valid) {
_this.canSubmit = false;
if (_this.dataForm.id) {
changeMajor(_this.dataForm).then(data => {
_this.$notify.success('操作成功')
_this.visible = false
_this.$emit('refreshDataList')
}).catch(() => {
_this.canSubmit = true;
});
}
}
})
}).then(data => {
}).catch(function(err) { })
}
}
}
// 改变原专业
const changeM = (id: string) => {
if (id) {
dataForm.confirmedMajor = id
// 是初中生并且是中德班
let flag = false
planMajorList.value.forEach((e: any) => {
if (dataForm.confirmedMajor == e.zydm && e.isZd == "1" && String(dataForm.degreeOfEducation) == "1") {
flag = true
}
})
if (String(dataForm.degreeOfEducation) == "1") {
dataForm.feeTuition = 0
tuitionFeeList.value.forEach((e: any) => {
if (e.label == "0" && flag) {
dataForm.feeTuition = e.value
}
})
}
}
}
// 表单提交
const dataFormSubmit = async () => {
const titleText = "确认调整录取专业么?"
if (dataForm.confirmedMajor == dataForm.newConfirmedMajor) {
ElNotification.error({
title: '错误',
message: '新专业不能和原专业相同'
})
return
}
try {
await messageBox.confirm(titleText)
dataFormRef.value?.validate((valid: boolean) => {
if (valid) {
canSubmit.value = false
if (dataForm.id) {
changeMajor(dataForm).then(() => {
ElNotification.success({
title: '成功',
message: '操作成功'
})
visible.value = false
emit('refreshDataList')
}).catch(() => {
canSubmit.value = true
})
}
}
})
} catch {
// 用户取消
}
}
// 初始化方法
const init = (id: string | null) => {
dataForm.id = id || ""
visible.value = true
canSubmit.value = true
initData()
nextTick(() => {
dataFormRef.value?.resetFields()
if (dataForm.id) {
// 获取数据字典代办费
getDictByType("agency_fee").then((res: any) => {
agencyFeeList.value = res.data
// 获取数据字典学费
getDictByType("tuition_fee").then((res: any) => {
tuitionFeeList.value = res.data
getObj(dataForm.id).then((response: any) => {
Object.assign(dataForm, response.data)
title.value = dataForm.serialNumber
// 获取文化程度对应的专业
planMajorList.value = []
agencyFeeList.value.forEach((e: any) => {
if (String(dataForm.degreeOfEducation) == String(e.label)) {
dataForm.feeAgency = e.value
}
})
tuitionFeeList.value.forEach((e: any) => {
if (String(dataForm.degreeOfEducation) == String(e.label) && (String(dataForm.degreeOfEducation) != "1")) {
dataForm.feeTuition = e.value
}
})
listByEdu({ groupId: dataForm.groupId, degreeOfEducation: dataForm.degreeOfEducation }).then((e: any) => {
planMajorList.value = e.data
})
// 获取招生计划下的学校和分数线
scoreList({ groupId: dataForm.groupId }).then((data: any) => {
schoolCodeList.value = data.data
})
if ("1" == dataForm.degreeOfEducation) {
title.value = "C" + title.value
} else if ("2" == dataForm.degreeOfEducation) {
title.value = "G" + title.value
} else if ("3" == dataForm.degreeOfEducation) {
title.value = "J" + title.value
}
if ("-20" == dataForm.auditStatus) {
title.value = "未录取 " + title.value
} else if ("0" == dataForm.auditStatus) {
title.value = "待审核 " + title.value
} else if ("20" == dataForm.auditStatus) {
title.value = "已录取 " + title.value
}
})
})
})
}
})
}
// 暴露方法给父组件
defineExpose({
init
})
</script>
<style scoped>
.dialog-footer {
text-align: right;
}
</style>

View File

@@ -3,11 +3,10 @@
title="家庭地址地图选点"
append-to-body
:close-on-click-modal="false"
:visible.sync="visible"
width="90%" heigth="90%"
>
v-model="visible"
width="90%">
<div style="height: 100%;width:100%">
<el-form :model="form" :rules="rules" ref="form" label-width="120px"
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px"
class="demo-ruleForm">
<el-form-item label="家庭地址" prop="homeAddressDetail">
@@ -17,125 +16,93 @@
</el-form>
<div id="container2"></div>
</div>
<!-- <span slot="footer" class="dialog-footer">-->
<!-- <el-button type="primary" @click="dataFormSubmit">确定</el-button>-->
<!-- <el-button @click="visible = false">取消</el-button>-->
<!-- </span>-->
</el-dialog>
</template>
<script>
import {BMPGL, changeMajor} from "@/api/recruit/recruitstudentsignup";
import {putItemObj} from "@/api/admin/dict";
import {getTypeValue} from "@/api/admin/dict";
export default {
data() {
return {
ak: "V0ooaf2RZyEGOkD8UzZB3gvw7pCb0Kx7", // 百度的地图密钥
visible: false,
canSubmit: false,
circleShow: false,
circle: "",
// 地址信息
address: null,
center: {lng: 0, lat: 0},
form: {
id: "",
homeAddressDetail: "",
},
dictId: "",
rules: {
homeAddressDetail: [
{required: true, message: '家庭地址不能为空', trigger: ["blur", "change"]}
],
},
circleArr: [],
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue'
import { BMPGL } from "@/api/recruit/recruitstudentsignup"
import { getTypeValue } from "@/api/admin/dict"
};
},
watch: {},
methods: {
init(row) {
let _this = this;
this.visible = true;
this.canSubmit = true;
this.circleShow = true;
this.form.id = row.id;
this.form.homeAddressDetail = row.homeAddressDetail;
this.$nextTick(() => {
getTypeValue("dorm_jw").then(data => {
let arr = data.data;
arr.forEach(e => {
if (e.label == 'bj') {
_this.form.raidus = e.value;
_this.dictId = e.id;
} else if (e.label == 'lng') {
_this.center.lng = e.value;
} else if (e.label == 'lat') {
_this.center.lat = e.value;
}
});
BMPGL(_this.ak).then((BMapGL) => {
// 创建地图实例
let map = new BMapGL.Map("container2");
// 创建点坐标 axios => res 获取的初始化定位坐标
let point = new BMapGL.Point(_this.center.lng, _this.center.lat)
// 初始化地图,设置中心点坐标和地图级别
map.centerAndZoom(point, 13)
//开启鼠标滚轮缩放
map.enableScrollWheelZoom(true)
//创建地址解析器实例
var myGeo = new BMapGL.Geocoder();
myGeo.getPoint(_this.form.homeAddressDetail, function(point){
if(point){
map.centerAndZoom(point, 16);
map.addOverlay(new BMapGL.Marker(point, {title: _this.form.homeAddressDetail}))
}else{
alert('您选择的地址没有解析到结果!');
}
}, '北京市')
// 表单引用
const formRef = ref()
})
})
// 响应式数据
const ak = "V0ooaf2RZyEGOkD8UzZB3gvw7pCb0Kx7" // 百度的地图密钥
const visible = ref(false)
const canSubmit = ref(false)
const circleShow = ref(false)
const circle = ref<any>(null)
// 地址信息
const address = ref(null)
const center = reactive({ lng: 0, lat: 0 })
const dictId = ref("")
const circleArr = ref<any[]>([])
});
const form = reactive({
id: "",
homeAddressDetail: "",
raidus: 0
})
const rules = {
homeAddressDetail: [
{ required: true, message: '家庭地址不能为空', trigger: ["blur", "change"] }
],
}
},
// 表单提交
dataFormSubmit() {
let _this = this;
this.$confirm("是否确认保存住宿半径", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
_this.$refs['form'].validate((valid) => {
if (valid) {
_this.canSubmit = false;
putItemObj({id: _this.dictId, value: _this.form.raidus}).then(() => {
_this.$message({
showClose: true,
message: '修改成功',
type: 'success'
})
_this.visible = false
_this.canSubmit = true;
})
}
})
}).then(data => {
}).catch(function (err) {
// 初始化
const init = (row: any) => {
visible.value = true
canSubmit.value = true
circleShow.value = true
form.id = row.id
form.homeAddressDetail = row.homeAddressDetail
nextTick(() => {
getTypeValue("dorm_jw").then((data: any) => {
const arr = data.data
arr.forEach((e: any) => {
if (e.label == 'bj') {
form.raidus = e.value
dictId.value = e.id
} else if (e.label == 'lng') {
center.lng = e.value
} else if (e.label == 'lat') {
center.lat = e.value
}
})
}
},
};
</script>
<style scoped>
BMPGL(ak).then((BMapGL: any) => {
// 创建地图实例
const map = new BMapGL.Map("container2")
// 创建点坐标
const point = new BMapGL.Point(center.lng, center.lat)
// 初始化地图,设置中心点坐标和地图级别
map.centerAndZoom(point, 13)
// 开启鼠标滚轮缩放
map.enableScrollWheelZoom(true)
// 创建地址解析器实例
const myGeo = new BMapGL.Geocoder()
myGeo.getPoint(form.homeAddressDetail, function (point: any) {
if (point) {
map.centerAndZoom(point, 16)
map.addOverlay(new BMapGL.Marker(point, { title: form.homeAddressDetail }))
} else {
alert('您选择的地址没有解析到结果!')
}
}, '北京市')
})
})
})
}
// 暴露方法给父组件
defineExpose({
init
})
</script>
<style scoped>
#container2 {
overflow: hidden;
width: 100%;
@@ -147,5 +114,4 @@ export default {
ul li {
list-style: none;
}
</style>

View File

@@ -8,36 +8,24 @@
<el-tab-pane label="申请汇总" name="second">
<DormAnalysis></DormAnalysis>
</el-tab-pane>
</el-tabs>
</basic-container>
</div>
</template>
<script>
<script setup lang="ts">
import { ref } from 'vue'
import { defineAsyncComponent } from 'vue'
const List = defineAsyncComponent(() => import('./list.vue'))
const DormAnalysis = defineAsyncComponent(() => import('./dorm_analysis.vue'))
import {mapGetters} from 'vuex'
import List from './list.vue'
import DormAnalysis from './dorm_analysis.vue'
export default {
data () {
return {
activeName: 'first'
}
},
components: {
List,DormAnalysis
},
created () {
},
computed: {
...mapGetters(['permissions'])
},
methods: {}
}
// 响应式数据
const activeName = ref('first')
</script>
<style scoped>
.mod-config {
padding: 20px;
}
</style>

File diff suppressed because it is too large Load Diff