This commit is contained in:
zhoutianchi
2026-01-14 10:52:06 +08:00
parent 8c1f4ec05e
commit d0c8ea0223
140 changed files with 16969 additions and 11469 deletions

View File

@@ -0,0 +1,31 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="初中生" name="tab">
<AreaStaticByCZ ref="tabIndexRef" />
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup-areaStatic">
import { ref, defineAsyncComponent, nextTick } from 'vue'
const AreaStaticByCZ = defineAsyncComponent(() => import('./areaStaticByCZ.vue'))
// 状态
const activeName = ref('tab')
const tabIndexRef = ref()
// Tab 切换
const handleTabClick = (tab: any) => {
if (tab.paneName === 'tab') {
nextTick(() => {
tabIndexRef.value?.init()
})
}
}
</script>

View File

@@ -0,0 +1,152 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="el-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>
</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-form-item>
</el-form>
<div class="avue-crud">
<el-table :data="list" 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>
<chart ref="typeEchartBar" 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: {}
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.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.data.data;
this.chartOption = response.data.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();
},
}
}
</script>

View File

@@ -0,0 +1,155 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="el-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>
</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-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";
export default {
data() {
return {
dataForm: {groupId:""},
list: [],
planList:[],
indexArray: [],
dataListLoading: false,
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.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.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();
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
}
}
</script>

View File

@@ -0,0 +1,147 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="el-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>
</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-form-item>
</el-form>
<div class="avue-crud">
<el-table :data="list" 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>
</div>
</basic-container>
</div>
</template>
<script>
import {getContantByDeptStatic} from "@/api/recruit/recruitstudentsignup";
import {list} from "@/api/recruit/recruitstudentplangroup";
export default {
data() {
return {
dataForm: {groupId:""},
list: [],
planList:[],
dataListLoading: false,
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.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.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();
},
}
}
</script>

View File

@@ -0,0 +1,190 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="init()" ref="searchForm">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small" >
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="el-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>
</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-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-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";
export default {
data() {
return {
dataForm: {groupId:""},
list: [],
planList:[],
indexArray: [],
dataListLoading: false,
}
},
mounted() {
},
created () {
this.init()
},
methods: {
init(){
let _this = this;
list().then(data =>{
_this.planList = data.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.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();
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
}
}
</script>

View File

@@ -0,0 +1,40 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="按联系人统计" name="tab">
<ContanctByUserStatic ref="tabIndexRef" />
</el-tab-pane>
<el-tab-pane label="按部门统计" name="static">
<ContanctByDeptStatic ref="staticIndexRef" />
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup-contanctStatic">
import { ref, defineAsyncComponent, nextTick } from 'vue'
const ContanctByUserStatic = defineAsyncComponent(() => import('./contanctByUserStatic.vue'))
const ContanctByDeptStatic = defineAsyncComponent(() => import('./contanctByDeptStatic.vue'))
// 状态
const activeName = ref('tab')
const tabIndexRef = ref()
const staticIndexRef = ref()
// Tab 切换
const handleTabClick = (tab: any) => {
if (tab.paneName === 'tab') {
nextTick(() => {
tabIndexRef.value?.init()
})
} else {
nextTick(() => {
staticIndexRef.value?.init()
})
}
}
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,154 @@
<template>
<el-dialog
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">
<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-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:{
raidus:0,
},
dictId:"",
rules: {
raidus: [
{required: true, message: '住宿半径不能为空', trigger: ["blur", "change"]}
],
},
circleArr : [],
};
},
watch: {
'form.raidus': {
handler(newVal) {
if(newVal !='' && newVal !=undefined){
this.circle.setRadius(newVal); //设置圆形覆盖物的半径
}
}
}
},
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.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)
// 绘制圆
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;
})
}
})
}).then(data => {
}).catch(function(err) { })
}
},
};
</script>
<style scoped>
#container {
overflow: hidden;
width: 100%;
height: 700px;
margin: 0;
font-family: "微软雅黑";
}
ul li {
list-style: none;
}
</style>

View File

@@ -0,0 +1,157 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()" ref="searchForm">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable clearable placeholder="请选择招生计划" size="small"
style="width: 150px;">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="warning"
icon="el-icon-download"
size="small"
@click="handleExport()">汇总导出</el-button>
</el-form-item>
</el-form>
<el-table
:data="dataList"
border
stripe
show-summary
v-loading="dataListLoading">
<el-table-column
prop="xy"
header-align="center"
align="center"
width="120"
label="学院">
<template slot-scope="scope">
<span>{{
global.getLabelValueByPropes(deptList, scope.row.xy, {
'key': 'deptCode',
'value': 'deptName'
})
}}</span>
</template>
</el-table-column>
<el-table-column
prop="total"
header-align="center"
align="center"
label="申请人数(范围外)">
</el-table-column>
<el-table-column
prop="man"
header-align="center"
align="center"
label="男生数">
</el-table-column>
<el-table-column
prop="woman"
header-align="center"
align="center"
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'
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.data
})
},
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.data
this.dataForm.groupId=this.planList[0].id;
});
},
getTableList(groupId){
dormApplyAnalysis({"groupId":groupId}).then(response => {
this.dataList = response.data.data
})
}
}
}
</script>

View File

@@ -0,0 +1,127 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<header style="font-size: 40px; text-align: center; margin-bottom: 20px;">
历年常州地区初中生分数段人数统计(本省本市初中生源)
</header>
<div class="mb15">
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
</div>
<el-table
:data="dataList"
border
stripe
v-loading="dataListLoading"
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column prop="socre" header-align="center" align="center" label="分数段" />
<el-table-column
v-for="(item, index) in headList"
:key="index"
:prop="item.year"
:label="item.year"
header-align="center"
>
<el-table-column
:prop="item.propOne"
header-align="center"
align="center"
label="人数"
/>
<el-table-column
:prop="item.propTwo"
header-align="center"
align="center"
label="占比"
/>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup-inSchoolSocreStatic">
import { ref, reactive, onMounted } from 'vue'
import { useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { inSchoolSocreStatic } from '/@/api/recruit/recruitstudentsignup'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept'
// 消息提示 hooks
const message = useMessage()
// 状态
const headList = ref<any[]>([])
const deptCodes = ref<any[]>([])
const planList = ref<any[]>([])
const dataList = ref<any[]>([])
const dataListLoading = ref(false)
const exportLoading = ref(false)
// 查询表单
const queryForm = reactive({
groupId: ''
})
// 使用 table hook 获取样式
const { tableStyle, downBlobFile } = useTable()
// 初始化
const init = async () => {
try {
const [deptResponse, planData] = await Promise.all([
getDeptListByLevelTwo(),
list()
])
deptCodes.value = deptResponse.data.data || []
planList.value = planData.data.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
getDataList()
}
} catch (error) {
console.error('初始化失败', error)
}
}
// 获取数据列表
const getDataList = async () => {
try {
dataListLoading.value = true
dataList.value = []
const response = await inSchoolSocreStatic(queryForm)
if (response.data.data && response.data.data.length > 0) {
response.data.data.forEach((e: any) => {
dataList.value.push(e.map)
})
headList.value = response.data.data[0].list || []
}
} catch (error) {
console.error('获取数据失败', error)
} finally {
dataListLoading.value = false
}
}
// 导出
const dataExportHandle = async () => {
try {
exportLoading.value = true
await downBlobFile('/recruit/recruitstudentsignup/inSchoolSocreStaticExport', queryForm, '历年常州地区初中生分数段统计.xls')
} catch (error: any) {
message.error(error.msg || '导出失败')
} finally {
exportLoading.value = false
}
}
onMounted(() => {
init()
})
</script>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,62 @@
<template>
<el-dialog :visible.sync="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>
</el-row>
<el-row v-if="status == '-1'">
<br />
<el-input type="textarea" v-model="reason" placeholder="请输入未通过的原因"></el-input>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="confirm"><span>确认</span></el-button>
<el-button @click="visible = false">取消</el-button>
</span>
</el-dialog>
</template>
<script>
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)){
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)
})
}
}
}
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,189 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable placeholder="请选择招生计划">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="学制" prop="xz">
<el-select v-model="queryForm.xz" filterable placeholder="请选择学制" clearable>
<el-option
v-for="item in majorYears"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否联院" prop="isUnion">
<el-select v-model="queryForm.isUnion" filterable placeholder="请选择是否联院" clearable>
<el-option key="0" label="否" value="0" />
<el-option key="1" label="是" value="1" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<div class="mb15">
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
</div>
<el-table
:data="dataList"
border
stripe
:row-style="changeRowColor"
v-loading="dataListLoading"
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column prop="indexNum" header-align="center" align="center" label="序号">
<template #default="scope">
{{ scope.row.indexNum }}
</template>
</el-table-column>
<el-table-column prop="deptCode" header-align="center" align="center" label="系部">
<template #default="scope">
{{ getDeptType(scope.row.deptCode) }}
</template>
</el-table-column>
<el-table-column prop="zymc" header-align="center" align="center" label="所报专业" />
<el-table-column prop="maxScore" header-align="center" align="center" label="最高分" />
<el-table-column prop="minScore" header-align="center" align="center" label="最低分" />
<el-table-column prop="avgScore" header-align="center" align="center" label="平均分" />
<el-table-column prop="majorPeopleNum" header-align="center" align="center" label="专业人数" />
<el-table-column prop="avgScoreDB" header-align="center" align="center" label="均分对比" />
</el-table>
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup-juniorlneStatic">
import { ref, reactive, onMounted } from 'vue'
import { useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { useDict } from '/@/hooks/dict'
import { juniorlneStatic } from '/@/api/recruit/recruitstudentsignup'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept'
// 消息提示 hooks
const message = useMessage()
// 字典
const { getTypeValue } = useDict()
// 引用
const searchFormRef = ref()
// 状态
const deptCodes = ref<any[]>([])
const planList = ref<any[]>([])
const dataList = ref<any[]>([])
const majorYears = ref<any[]>([])
const dataListLoading = ref(false)
const exportLoading = ref(false)
// 查询表单
const queryForm = reactive({
groupId: '',
xz: '',
isUnion: ''
})
// 使用 table hook 获取样式
const { tableStyle, downBlobFile } = useTable()
// 初始化
const init = async () => {
try {
const [deptResponse, majorYearsRes, planData] = await Promise.all([
getDeptListByLevelTwo(),
getTypeValue('basic_major_years'),
list()
])
deptCodes.value = deptResponse.data.data || []
majorYears.value = majorYearsRes.data.data || []
planList.value = planData.data.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
getDataList()
}
} catch (error) {
console.error('初始化失败', error)
}
}
// 获取数据列表
const getDataList = async () => {
try {
dataListLoading.value = true
dataList.value = []
const response = await juniorlneStatic(queryForm)
dataList.value = response.data.data || []
} catch (error) {
console.error('获取数据失败', error)
} finally {
dataListLoading.value = false
}
}
// 导出
const dataExportHandle = async () => {
try {
exportLoading.value = true
await downBlobFile('/recruit/recruitstudentsignup/juniorlneStaticExport', queryForm, '初中分数统计.xls')
} catch (error: any) {
message.error(error.msg || '导出失败')
} finally {
exportLoading.value = false
}
}
// 改变行颜色
const changeRowColor = ({ row }: { row: any }) => {
if (row.zymc === '合计') {
return {
color: 'red'
}
}
}
// 获取系部名称
const getDeptType = (type: string) => {
const dept = deptCodes.value.find((item: any) => item.deptCode === type)
return dept ? dept.deptName : ''
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置查询
const resetQuery = () => {
searchFormRef.value?.resetFields()
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
}
queryForm.xz = ''
queryForm.isUnion = ''
getDataList()
}
onMounted(() => {
init()
})
</script>

View File

@@ -0,0 +1,511 @@
<!--
- Copyright (c) 2018-2025, cyweb All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- Neither the name of the pig4cloud.com developer nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-->
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<!-- 搜索表单 -->
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" style="width: 150px;">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="学院" prop="xy">
<el-select v-model="queryForm.xy" filterable clearable placeholder="请选择学院" style="width: 130px;">
<el-option
v-for="item in deptList"
:key="item.deptCode"
:label="item.deptName"
:value="item.deptCode"
/>
</el-select>
</el-form-item>
<el-form-item label="录取专业" prop="confirmedMajor">
<el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
<el-option
v-for="item in planMajorList"
:key="item.zydm"
:label="item.zymc + '(' + item.xz + '年制)'"
:value="item.zydm"
/>
</el-select>
</el-form-item>
<el-form-item label="唯一号/姓名/身份证号" prop="search">
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号" />
</el-form-item>
<el-form-item label="住宿范围" prop="isOutFw">
<el-select v-model="queryForm.isOutFw" filterable clearable placeholder="请选择住宿范围" style="width: 100px;">
<el-option
v-for="item in isOutFwList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否发送短信" prop="isSend">
<el-select v-model="queryForm.isSend" filterable clearable placeholder="请选择是否发送短信" style="width: 100px;">
<el-option
v-for="item in isSendList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select v-model="queryForm.gender" filterable clearable placeholder="请选择性别" style="width: 120px;">
<el-option
v-for="item in genderList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<div class="mb15">
<el-button
v-if="permissions.recruitStuDorm"
type="primary"
icon="Setting"
@click="setDormFW"
>
住宿范围
</el-button>
<el-button
v-if="permissions.recruitStuDorm"
type="danger"
plain
icon="Location"
class="ml10"
@click="yjOut"
>
一键判断住宿范围
</el-button>
<el-button
v-if="permissions.recruitStuDormMess"
type="danger"
plain
icon="Message"
class="ml10"
@click="yjSend"
>
批量发送短信
</el-button>
<el-button
type="warning"
plain
icon="Download"
class="ml10"
@click="handleExport"
>
名单导出
</el-button>
</div>
<!-- 表格 -->
<el-table
ref="tableRef"
:data="state.dataList"
v-loading="state.loading"
border
stripe
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="serialNumber" label="唯一号" width="100" align="center" show-overflow-tooltip />
<el-table-column prop="name" label="姓名" width="100" align="center" show-overflow-tooltip />
<el-table-column prop="gender" label="性别" width="80" align="center" show-overflow-tooltip>
<template #default="scope">
{{ getGender(scope.row.gender) }}
</template>
</el-table-column>
<el-table-column prop="idNumber" label="身份证号" width="180" align="center" show-overflow-tooltip />
<el-table-column prop="xy" label="学院" width="120" align="center" show-overflow-tooltip>
<template #default="scope">
{{ getDeptName(scope.row.xy) }}
</template>
</el-table-column>
<el-table-column prop="homeAddressDetail" label="家庭地址" align="center" show-overflow-tooltip />
<el-table-column prop="isOutFw" label="范围" width="100" align="center" show-overflow-tooltip>
<template #default="scope">
<span v-if="scope.row.isOutFw == 0">待确认</span>
<span v-if="scope.row.isOutFw == 1">范围内</span>
<span v-if="scope.row.isOutFw == 2">范围外</span>
</template>
</el-table-column>
<el-table-column prop="isSd" label="手动设置" width="100" align="center" show-overflow-tooltip>
<template #default="scope">
<span v-if="scope.row.isSd == 0">未设置</span>
<span v-if="scope.row.isSd == 1">已设置</span>
</template>
</el-table-column>
<el-table-column prop="isSend" label="发送短信" width="100" align="center" show-overflow-tooltip>
<template #default="scope">
<span v-if="scope.row.isSend == 0">未发送</span>
<span v-if="scope.row.isSend == 1">已发送</span>
</template>
</el-table-column>
<el-table-column label="操作" width="300" align="center" fixed="right">
<template #default="scope">
<el-button
v-if="permissions.recruitStuDormSd && scope.row.isOutFw != '1'"
type="success"
link
icon="CircleCheck"
@click="setFw(scope.row, 1)"
>
设为范围内
</el-button>
<el-button
v-if="permissions.recruitStuDormSd && scope.row.isOutFw != '2'"
type="warning"
link
icon="Close"
@click="setFw(scope.row, 2)"
>
设为范围外
</el-button>
<el-button
type="primary"
link
icon="Location"
@click="baiduMap(scope.row)"
>
家庭地址
</el-button>
<el-button
v-if="permissions.recruitStuDormDel"
type="danger"
link
icon="Delete"
@click="deleteHandle(scope.row.id)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-bind="state.pagination"
@current-change="currentChangeHandle"
@size-change="sizeChangeHandle"
/>
<!-- 支付二维码弹窗 -->
<el-dialog v-model="dialogFormVisible" title="支付二维码" width="800px" @close="dialogFormVisible = false">
<el-table :data="tableData" border>
<el-table-column label="唯一号" prop="serialNumber" align="center" />
<el-table-column label="姓名" prop="name" align="center" />
<el-table-column label="家长手机号" prop="parentTelOne" align="center" />
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button type="danger" icon="Search" @click="updateFS">立即查询</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>
<dorm-f-w v-if="dormFWRefVisible" ref="dormFWRef" />
<show-map v-if="baiduMapVisible" ref="baiduMapRef" />
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignupList">
import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage, useMessageBox } from '/@/hooks/message'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { fetchListStuDorm, yjOut, setFw, delFw, yjSend } from '/@/api/recruit/recruitstudentsignup'
import { getDeptList } from '/@/api/basic/basicclass'
import { list as planMajor } from '/@/api/recruit/recruitplanmajor'
// @ts-ignore
import global from '@/components/tools/commondict'
const DormFW = defineAsyncComponent(() => import('./dormFW.vue'))
const ShowMap = defineAsyncComponent(() => import('./showMap.vue'))
// 使用 Pinia store
const userInfoStore = useUserInfo()
const { userInfos } = storeToRefs(userInfoStore)
// 创建权限对象
const permissions = computed(() => {
const perms: Record<string, boolean> = {}
userInfos.value.authBtnList.forEach((perm: string) => {
perms[perm] = true
})
return perms
})
// 消息提示 hooks
const message = useMessage()
const messageBox = useMessageBox()
// 表格引用
const tableRef = ref()
const searchFormRef = ref()
const dormFWRef = ref()
const baiduMapRef = ref()
// 数据
const planList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const deptList = ref<any[]>([])
const genderList = ref([{ label: '男', value: '1' }, { label: '女', value: '2' }])
const isOutFwList = ref([{ label: '待确认', value: '0' }, { label: '范围内', value: '1' }, { label: '范围外', value: '2' }])
const isSendList = ref([{ label: '未发送', value: 0 }, { label: '已发送', value: 1 }])
// 查询表单
const queryForm = reactive({
groupId: '',
xy: '',
confirmedMajor: '',
search: '',
isOutFw: '',
isSend: null,
gender: ''
})
// 弹窗状态
const dialogFormVisible = ref(false)
const dormFWRefVisible = ref(false)
const baiduMapVisible = ref(false)
const tableData = ref<any[]>([])
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 getDeptName = (deptCode: string) => {
const item = deptList.value.find(item => item.deptCode === deptCode)
return item ? item.deptName : ''
}
// 获取性别
const getGender = (gender: string) => {
if (gender == '2') {
return '女'
}
if (gender == '1') {
return '男'
}
return ''
}
// 表格状态
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: queryForm,
pageList: async (params: any) => {
const response = await fetchListStuDorm(params)
return {
data: {
records: response.data.data.records,
total: response.data.data.total
}
}
},
createdIsNeed: false
})
// 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state)
// 初始化
const init = async () => {
try {
// 查询二级学院信息
const deptData = await getDeptList()
deptList.value = deptData.data.data || []
// 获取招生计划列表
const planData = await list()
planList.value = planData.data.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
}
getDataList()
} catch (error) {
console.error('初始化失败', error)
}
}
// 设置住宿范围
const setFw = async (row: any, type: number) => {
const title = type == 1 ? '范围内' : '范围外'
try {
await messageBox.confirm(`是否确认设置${title}?请谨慎操作`)
await setFw({ id: row.id, isOutFw: type })
message.success('操作成功')
getDataList()
} catch {
// 用户取消
}
}
// 设置住宿范围窗口
const setDormFW = () => {
dormFWRefVisible.value = true
nextTick(() => {
dormFWRef.value?.init()
})
}
// 一键判断住宿范围
const yjOut = async () => {
if (!queryForm.groupId) {
message.warning('招生计划不能为空')
return
}
try {
await messageBox.confirm('是否确认一键判断是否超出住宿范围?请谨慎操作')
await yjOut({ groupId: queryForm.groupId })
message.success('操作成功')
getDataList()
} catch {
// 用户取消
}
}
// 批量发送短信
const yjSend = async () => {
if (!queryForm.groupId) {
message.warning('招生计划不能为空')
return
}
try {
await messageBox.confirm('是否确认批量发送短信通知?请谨慎操作')
await yjSend({ groupId: queryForm.groupId })
message.success('操作成功')
getDataList()
} catch {
// 用户取消
}
}
// 百度地图
const baiduMap = (row: any) => {
baiduMapVisible.value = true
nextTick(() => {
baiduMapRef.value?.init(row)
})
}
// 导出
const handleExport = async () => {
if (!queryForm.groupId) {
message.warning('招生计划不能为空')
return
}
try {
await downBlobFile(
'/recruit/recruitstudentsignup/stuDormExport',
queryForm,
'新生住宿名单导出.xls'
)
} catch (error: any) {
message.error(error.msg || '导出失败')
}
}
// 立即查询
const updateFS = async () => {
// 这个方法需要根据实际API调整
message.info('功能待实现')
}
// 重置查询
const resetQuery = () => {
searchFormRef.value?.resetFields()
queryForm.groupId = ''
queryForm.xy = ''
queryForm.confirmedMajor = ''
queryForm.search = ''
queryForm.isOutFw = ''
queryForm.isSend = null
queryForm.gender = ''
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
}
getDataList()
}
// 删除
const deleteHandle = async (id: string) => {
try {
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
await delFw(id)
message.success('删除成功')
getDataList()
} catch {
// 用户取消
}
}
onMounted(() => {
init()
})
</script>
<style lang="scss" scoped>
</style>

View File

@@ -0,0 +1,370 @@
<template>
<el-dialog
:title="title"
:close-on-click-modal="false"
:visible.sync="visible"
append-to-body
width="90%"
>
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()"
label-width="170px" size="mini">
<el-row>
<el-col :span="24">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true"
placeholder="请选择招生计划" size="small" style="width: 100%">
<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-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>
</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-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-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-option
v-for="item in planMajorList"
:key="item.zydm"
:label="item.zymc"
:value="item.zydm">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<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-option
v-for="item in planMajorList"
:key="item.zydm"
:label="item.zymc+' || '+item.xyNum"
:value="item.zydm">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<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-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-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="总费用" prop="allMoney">
<span style="color: red">{{dataForm.feeTuition+dataForm.feeAgency}}</span>
</el-form-item>
</el-col>
</el-row>
<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-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>
</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";
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:[],
deptList: [],
dialogImageUrl:"",
dialogUploadVisible:false,
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'}
]
}
}
},
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.data
//获取数据字典学费
getDictByType("tuition_fee").then(res => {
_this.tuitionFeeList = res.data.data
getObj(this.dataForm.id).then(response => {
this.dataForm = response.data.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.data;
});
//获取招生计划下的学校和分数线
scoreList({groupId:_this.dataForm.groupId}).then(data =>{
_this.schoolCodeList = data.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;
}
})
})
})
}
})
},
initData() {
let _this = this;
list().then(data => {
_this.planList = data.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) { })
}
}
}
</script>

View File

@@ -0,0 +1,389 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<header style="font-size: 40px; text-align: center; margin-bottom: 20px;">
招生地区分布统计(本省本市普通招生自主招生)
</header>
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
<el-form-item label="是否联院" prop="isUnion">
<el-select v-model="queryForm.isUnion" filterable placeholder="请选择是否联院">
<el-option
v-for="item in isUnionList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<div class="mb15">
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
</div>
<el-table
:data="dataList"
border
stripe
:span-method="objectSpanMethod"
v-loading="dataListLoading"
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column
prop="year"
header-align="center"
align="center"
label="年份">
</el-table-column>
<el-table-column
prop="type"
header-align="center"
align="center"
label="类别">
</el-table-column>
<el-table-column
prop="peopleNum"
header-align="center"
align="center"
label="招生总数">
</el-table-column>
<el-table-column
prop="peopleRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="天宁区">
<el-table-column
prop="tnNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="tnRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="新北区">
<el-table-column
prop="xbNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="xbRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="武进区">
<el-table-column
prop="wjNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="wjRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="钟楼区">
<el-table-column
prop="zlNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="zlRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="金坛">
<el-table-column
prop="jtNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="jtRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="溧阳">
<el-table-column
prop="lyNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="lyRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="武进区(含 戚墅堰)">
<el-table-column
prop="wjjNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="wjjRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="经开区">
<el-table-column
prop="jkqNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="jkqRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="市辖区">
<el-table-column
prop="cityNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="cityRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="本省外市">
<el-table-column
prop="bswNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="bswRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
<el-table-column
prop=""
header-align="center"
align="center"
label="外省">
<el-table-column
prop="wsNum"
header-align="center"
align="center"
label="人数">
</el-table-column>
<el-table-column
prop="wsRate"
header-align="center"
align="center"
label="占比">
</el-table-column>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup-schoolAreaStatic">
import { ref, reactive, onMounted } from 'vue'
import { useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { schoolAreaStatic } from '/@/api/recruit/recruitstudentsignup'
// 消息提示 hooks
const message = useMessage()
// 引用
const searchFormRef = ref()
// 状态
const isUnionList = [
{ value: '0', label: '否' },
{ value: '1', label: '是' }
]
const dataList = ref<any[]>([])
const indexArray = ref<number[]>([])
const dataListLoading = ref(false)
const exportLoading = ref(false)
// 查询表单
const queryForm = reactive({
isUnion: '0'
})
// 使用 table hook 获取样式
const { tableStyle, downBlobFile } = useTable()
// 初始化
const init = () => {
queryForm.isUnion = '0'
getDataList()
}
// 获取行数
const getRows = (rowIndex: number, name: string) => {
let count = 0
for (let i = rowIndex; i < dataList.value.length; i++) {
if (dataList.value[i].year === name) {
count++
} else {
break
}
}
return count
}
// 合并单元格方法
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
if (columnIndex === 0) {
if (indexArray.value.includes(rowIndex)) {
const rowCount = getRows(rowIndex, row.year)
return {
rowspan: rowCount,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
}
// 获取数据列表
const getDataList = async () => {
try {
dataListLoading.value = true
dataList.value = []
indexArray.value = []
const response = await schoolAreaStatic(queryForm)
dataList.value = response.data.data || []
// 计算合并单元格的索引
let count = 0
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
indexArray.value.push(rowIndex)
count = getRows(rowIndex, dataList.value[rowIndex].year)
rowIndex += count
}
} catch (error) {
console.error('获取数据失败', error)
} finally {
dataListLoading.value = false
}
}
// 导出
const dataExportHandle = async () => {
try {
exportLoading.value = true
await downBlobFile(
'/recruit/recruitstudentsignup/schoolAreaStaticExport',
queryForm,
'招生地区分布统计(本省本市、普通招生、自主招生).xls'
)
} catch (error: any) {
message.error(error.msg || '导出失败')
} finally {
exportLoading.value = false
}
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置查询
const resetQuery = () => {
searchFormRef.value?.resetFields()
queryForm.isUnion = '0'
getDataList()
}
onMounted(() => {
init()
})
</script>

View File

@@ -0,0 +1,175 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable placeholder="请选择招生计划">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<div class="mb15">
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
</div>
<el-table
:data="dataList"
border
stripe
v-loading="dataListLoading"
:summary-method="getSummaries"
show-summary
:row-style="changeRowColor"
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column align="center" header-align="center" prop="schoolName" 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>
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup-schoolStatic">
import { ref, reactive, onMounted } from 'vue'
import { useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { getSchoolStatic } from '/@/api/recruit/recruitstudentsignup'
import { list } from '/@/api/recruit/recruitstudentplangroup'
// 消息提示 hooks
const message = useMessage()
// 引用
const searchFormRef = ref()
// 状态
const dataList = ref<any[]>([])
const planList = ref<any[]>([])
const indexArray = ref<any[]>([])
const dataListLoading = ref(false)
const exportLoading = ref(false)
// 查询表单
const queryForm = reactive({
groupId: ''
})
// 使用 table hook 获取样式
const { tableStyle, downBlobFile } = useTable()
// 初始化
const init = async () => {
try {
const data = await list()
planList.value = data.data.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
getDataList()
}
} catch (error) {
console.error('初始化失败', error)
}
}
// 获取数据列表
const getDataList = async () => {
try {
dataListLoading.value = true
dataList.value = []
indexArray.value = []
const response = await getSchoolStatic(queryForm)
dataList.value = response.data.data || []
} catch (error) {
console.error('获取数据失败', error)
} finally {
dataListLoading.value = false
}
}
// 导出
const dataExportHandle = async () => {
try {
exportLoading.value = true
await downBlobFile('/recruit/recruitstudentsignup/getSchoolStaticExport', queryForm, '按学校导出.xls')
} catch (error: any) {
message.error(error.msg || '导出失败')
} finally {
exportLoading.value = false
}
}
// 改变行颜色
const changeRowColor = ({ row }: { row: any }) => {
const specialSchools = [
'智能装备学院',
'智能制造学院',
'信息服务学院',
'交通运输学院',
'医药康养学院',
'招生就业处'
]
if (specialSchools.includes(row.schoolName)) {
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 === 1) {
const values = data.map((item: any) => Number(item[column.property]))
if (!values.every((value: any) => isNaN(value))) {
sums[index] = values.reduce((prev: number, curr: any) => {
const value = Number(curr)
if (!isNaN(value)) {
return prev + curr
} else {
return prev
}
}, 0) / 2
} else {
sums[index] = '--'
}
} else {
sums[index] = '--'
}
})
return sums
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置查询
const resetQuery = () => {
searchFormRef.value?.resetFields()
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
}
getDataList()
}
onMounted(() => {
init()
})
</script>

View File

@@ -0,0 +1,151 @@
<template>
<el-dialog
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">
<el-form-item label="家庭地址" prop="homeAddressDetail">
<el-input v-model="form.homeAddressDetail" style="width: 100%"></el-input>
</el-form-item>
</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: [],
};
},
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.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('您选择的地址没有解析到结果!');
}
}, '北京市')
})
})
});
},
// 表单提交
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) {
})
}
},
};
</script>
<style scoped>
#container2 {
overflow: hidden;
width: 100%;
height: 700px;
margin: 0;
font-family: "微软雅黑";
}
ul li {
list-style: none;
}
</style>

View File

@@ -0,0 +1,176 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<div class="mb15">
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="handleExport">导出</el-button>
</div>
<el-table
:data="state.dataList"
border
stripe
height="700px"
v-loading="state.loading"
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column width="150" prop="deptCode" header-align="center" align="center" label="学院">
<template #default="scope">
{{ global.getLabelValueByPropes(deptList, scope.row.deptCode, { key: 'deptCode', value: 'deptName' }) }}
</template>
</el-table-column>
<el-table-column width="150" prop="zydm" header-align="center" align="center" label="专业代码" />
<el-table-column prop="zymc" header-align="center" align="center" label="专业名称" />
<el-table-column width="80" prop="scoreLine" header-align="center" align="center" label="分数线" />
<el-table-column width="80" prop="planNum" header-align="center" align="center" label="计划总数" />
<el-table-column width="80" prop="recruitmentNum" header-align="center" align="center" label="拟招人数" />
<el-table-column width="80" prop="hasNum" header-align="center" align="center" label="已招人数" />
<el-table-column width="80" prop="boyNum" header-align="center" align="center" label="已招(男)" />
<el-table-column width="80" prop="girlNum" header-align="center" align="center" label="已招(女)" />
<el-table-column width="80" prop="cityFrom" header-align="center" align="center" label="市平台" />
<el-table-column width="80" prop="schoolFrom" header-align="center" align="center" label="校平台" />
<el-table-column width="80" prop="xyNum" header-align="center" align="center" label="剩余人数" />
</el-table>
</div>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup-static">
import { ref, reactive, onMounted } from 'vue'
import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { useDict } from '/@/hooks/dict'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { fetchListByStatic, list as planMajor } from '/@/api/recruit/recruitplanmajor'
import { getDeptList } from '/@/api/basic/basicclass'
// @ts-ignore
import global from '/@/components/tools/commondict.vue'
// 消息提示 hooks
const message = useMessage()
// 字典
const { getTypeValue } = useDict()
// 引用
const searchFormRef = ref()
// 状态
const planList = ref<any[]>([])
const eduList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const deptList = ref<any[]>([])
const exportLoading = ref(false)
// 查询表单
const queryForm = reactive({
groupId: '',
auditStatus: 20
})
// 表格状态
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: queryForm,
pageList: async (params: any) => {
const response = await fetchListByStatic(params)
return {
data: {
records: response.data.data || [],
total: response.data.data?.length || 0
}
}
},
createdIsNeed: false
})
// 使用 table hook
const { getDataList, tableStyle, downBlobFile } = useTable(state)
// 初始化
const init = async () => {
try {
// 查询二级学院信息
const deptData = await getDeptList()
deptList.value = deptData.data.data || []
deptList.value.push({ deptCode: '小计(高中/职技校)', deptName: '小计(高中/职技校)' })
deptList.value.push({ deptCode: '小计(初中)', deptName: '小计(初中)' })
deptList.value.push({ deptCode: '小计(初中_联院大专)', deptName: '小计(初中_联院大专)' })
deptList.value.push({ deptCode: '合计', deptName: '合计' })
// 获取招生计划列表
const planData = await list()
planList.value = planData.data.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
getDataList()
chanMajor()
}
// 获取字典数据
const eduRes = await getTypeValue('education_type')
eduList.value = eduRes.data.data || []
} catch (error) {
console.error('初始化失败', error)
}
}
// 导出
const handleExport = async () => {
try {
exportLoading.value = true
await downBlobFile('/recruit/recruitplanmajor/exportExcel', queryForm, '招生统计.xls')
} catch (error: any) {
message.error(error.msg || '导出失败')
} finally {
exportLoading.value = false
}
}
// 切换专业
const chanMajor = async () => {
try {
planMajorList.value = []
if (queryForm.groupId) {
const data = await planMajor({ groupId: queryForm.groupId })
planMajorList.value = data.data.data || []
}
} catch (error) {
console.error('获取专业列表失败', error)
}
}
// 查询
const handleFilter = () => {
getDataList()
}
// 重置查询
const resetQuery = () => {
searchFormRef.value?.resetFields()
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
}
getDataList()
}
onMounted(() => {
init()
})
</script>

View File

@@ -0,0 +1,43 @@
<template>
<div class="mod-config">
<basic-container>
<el-tabs v-model="activeName">
<el-tab-pane label="申请列表" name="first">
<List></List>
</el-tab-pane>
<el-tab-pane label="申请汇总" name="second">
<DormAnalysis></DormAnalysis>
</el-tab-pane>
</el-tabs>
</basic-container>
</div>
</template>
<script>
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: {}
}
</script>

View File

@@ -0,0 +1,577 @@
<template>
<el-dialog
:title="title"
:close-on-click-modal="false"
:visible.sync="visible"
append-to-body
width="90%"
>
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()"
label-width="170px" size="mini">
<el-row>
<el-col :span="24">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true"
placeholder="请选择招生计划" size="small" style="width: 100%">
<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-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>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="联系人" prop="contactName" >
<el-select v-model="dataForm.contactName" filterable clearable placeholder="" size="small" style="width: 100%" :disabled="!(permissions.recruit_recruitprestudent_dj_sure || dataForm.auditStatus != '20')">
<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-row>
<el-row >
<el-col :span="8">
<el-form-item label="成绩单" prop="scorePhoto">
<el-upload
action="/recruit/file/uploadAttachment"
list-type="picture-card"
name="file"
:headers="headers"
:limit="1"
:data="uploadData"
:file-list="fileList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="removeHandler"
:http-request="httpRequest"
:on-success="uploadSuccess">
<i class="el-icon-plus" style="width: 100px;height: 100px;"></i>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="毕业证" prop="graPic">
<el-upload
action="/recruit/file/uploadAttachment"
list-type="picture-card"
name="file"
:headers="headers"
:limit="1"
:data="uploadData"
:file-list="graPicList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="remove2Handler"
:http-request="httpRequest"
:on-success="upload2Success">
<i class="el-icon-plus" style="width: 100px;height: 100px;"></i>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在常营业执照" prop="yyPic">
<el-upload
action="/recruit/file/uploadAttachment"
list-type="picture-card"
name="file"
:headers="headers"
:limit="1"
:data="uploadData"
:file-list="yyPicList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="remove3Handler"
:http-request="httpRequest"
:on-success="upload3Success">
<i class="el-icon-plus" style="width: 100px;height: 100px;"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row >
<el-col :span="8">
<el-form-item label="在常租赁合同/房产证明" prop="housePic">
<el-upload
action="/recruit/file/uploadAttachment"
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">
<i class="el-icon-plus" style="width: 100px;height: 100px;"></i>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在常就业社保证明" prop="sbPic" >
<el-upload
action="/recruit/file/uploadAttachment"
list-type="picture-card"
name="file"
:headers="headers"
:limit="1"
:data="uploadData"
:file-list="sbPicList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="remove5Handler"
:http-request="httpRequest"
:on-success="upload5Success">
<i class="el-icon-plus" style="width: 100px;height: 100px;"></i>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="户口本" prop="householdPic" >
<el-upload
action="/recruit/file/uploadAttachment"
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">
<i class="el-icon-plus" style="width: 100px;height: 100px;"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="材料审核意见" prop="zlshRemark" >
<el-input v-model="dataForm.zlshRemark" placeholder="请输入审核意见" type="textarea" :rows="2" style=" width: 80%;text-align:center;margin-top: 10px "></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="primary" @click="dataFormSubmit('1')" v-if="canSubmit">保存</el-button>
<el-button type="success" @click="dataFormSubmit('2')" v-if="canSubmit">通过</el-button>
<el-button type="danger" @click="dataFormSubmit('3')" v-if="canSubmit">驳回</el-button>
</span>
<el-dialog title="图片预览" :visible.sync="dialogUploadVisible" append-to-body>
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</el-dialog>
</template>
<script>
import {getObj, updateInfo} from '@/api/recruit/recruitstudentsignup'
import {list} from "@/api/recruit/recruitstudentplangroup";
import {queryAllTeacher} from "@/api/professional/teacherbase";
import store from "@/store";
import {mapGetters} from "vuex";
export default {
data() {
return {
uploadData:{
},
visible: false,
canSubmit: false,
title: "",
contactNameflag:false,
form:{
attachment:'',
graPic:"",
yyPic:"",
housePic:"",
sbPic:"",
hkPic:""
},
fileList: [],
graPicList:[],
yyPicList:[],
houseList:[],
sbPicList:[],
hkPicList:[],
fileReader: '',
type:null,
contactNameList:[],
dataForm: {
id: "",
zlshRemark:"",
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,
planList: [],
deptList: [],
dialogImageUrl:"",
dialogUploadVisible:false,
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'}
]
}
}
},
created() {
},
mounted: function() {
if (!window.FileReader) {
console.error('Your browser does not support FileReader API!')
}
this.fileReader = new FileReader()
},
computed: {
...mapGetters(['permissions']),
headers() {
return {
"Authorization": 'Bearer ' + store.getters.access_token
}
}
},
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) {
getObj(this.dataForm.id).then(response => {
this.fileList=[];
this.graPicList=[];
this.yyPicList=[];
this.houseList=[];
this.sbPicList=[];
this.hkPicList=[];
this.dataForm = response.data.data
this.title = this.dataForm.serialNumber
if(this.dataForm.scorePhoto !=''){
let obj={url:this.dataForm.scorePhoto,name:""};
this.fileList.push(obj);
}
if(this.dataForm.graPic !=''){
let obj2 ={url:this.dataForm.graPic,name:""};
this.graPicList.push(obj2);
}
if(this.dataForm.yyPic !=''){
let obj3 ={url:this.dataForm.yyPic,name:""};
this.yyPicList.push(obj3);
}
if(this.dataForm.housePic !=''){
let arr = this.dataForm.housePic.split(",");
arr.forEach(e=>{
this.houseList.push({url:e});
});
}
if(this.dataForm.sbPic !=''){
let obj4 ={url:this.dataForm.sbPic,name:""};
this.sbPicList.push(obj4);
}
if(this.dataForm.householdPic !=''){
let arr2 = this.dataForm.householdPic.split(",");
arr2.forEach(e=>{
this.hkPicList.push({url:e});
});
}
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;
}
this.contactNameflag= false;
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;
this.contactNameflag= true;
}
})
}
})
},
beforeUpload (file) {
const isLt5M = file.size < 10 * 1024 * 1024
if (!isLt5M) {
alert('文件大小不能超过10M')
return false
}
},
//图片预览
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogUploadVisible = true;
},
handlePicCardPreview(file) {
this.dialogImageUrl = file;
this.dialogUploadVisible = true;
},
removeHandler (file, fileList) {
let index = this.fileList.indexOf(file.key)
this.fileList.splice(index, 1)
this.form.attachment=""
this.dataForm.scorePhoto="";
},
remove2Handler(file, fileList) {
let index = this.graPicList.indexOf(file.key)
this.graPicList.splice(index, 1)
this.form.graPic=""
this.dataForm.graPic=""
},
remove3Handler(file, fileList) {
let index = this.yyPicList.indexOf(file.key)
this.yyPicList.splice(index, 1)
this.form.yyPic=""
this.dataForm.yyPic=""
},
remove4Handler(file, fileList) {
let arr = [];
let strArr=[];
this.houseList.forEach(e=>{
if(e.url != file.url){
arr.push(e);
strArr.push(e.url);
}
})
this.houseList=arr;
this.dataForm.housePic=strArr.join(",");
},
remove5Handler(file, fileList) {
alert(file.key);
let index = this.sbPicList.indexOf(file.key)
this.sbPicList.splice(index, 1)
this.form.sbPic=""
this.dataForm.sbPic="";
},
remove6Handler(file, fileList) {
let arr = [];
let strArr=[];
this.hkPicList.forEach(e=>{
if(e.url != file.url){
arr.push(e);
strArr.push(e.url);
}
})
this.hkPicList=arr;
this.dataForm.householdPic=strArr.join(",");
},
httpRequest (options) {
let _that = this;
let file = options.file
let filename = file.name
if (file) {
this.fileReader.readAsDataURL(file)
}
this.fileReader.onload = () => {
let base64Str = this.fileReader.result
let config = {
url: '/recruit/file/uploadAttachment',
method: 'post',
data: {
base64Str: base64Str.split(',')[1]
},
timeout: 10000,
onUploadProgress: function (progressEvent) {
progressEvent.percent = progressEvent.loaded / progressEvent.total * 100
options.onProgress(progressEvent, file)
},
}
axios(config)
.then(res => {
options.onSuccess(res, file)
})
.catch(err => {
options.onError(err)
})
}
},
uploadSuccess (res, file, fileList) {
this.form.attachment = res.data.fileUrl;
this.fileList[0] = this.form.attachment;
this.dataForm.scorePhoto = this.form.attachment;
},
upload2Success (res, file, fileList) {
this.form.graPic = res.data.fileUrl;
this.graPicList[0] = this.form.graPic;
this.dataForm.graPic = this.form.graPic;
},
upload3Success (res, file, fileList) {
this.form.yyPic = res.data.fileUrl;
this.yyPicList[0] = this.form.yyPic;
this.dataForm.yyPic = this.form.yyPic;
},
upload4Success (res, file, fileList) {
this.form.housePic = res.data.fileUrl;
this.houseList.push({url:this.form.housePic});
let arr =[];
this.houseList.forEach(e=>{
arr.push(e.url);
})
this.dataForm.housePic = arr.join(",");
},
upload5Success (res, file, fileList) {
this.form.sbPic = res.data.fileUrl;
this.sbPicList.push(this.form.sbPic);
this.dataForm.sbPic = this.sbPicList.join(",");
},
upload6Success(res, file, fileList) {
this.form.hkPic = res.data.fileUrl;
this.hkPicList.push({url:this.form.hkPic});
let arr =[];
this.hkPicList.forEach(e=>{
arr.push(e.url);
})
this.dataForm.householdPic = arr.join(",");
},
initData() {
let _this = this;
list().then(data => {
_this.planList = data.data.data
});
//联系人(教职工)
queryAllTeacher().then(res =>{
_this.contactNameList = res.data.data
});
},
// 表单提交
dataFormSubmit(type) {
let _this = this;
if(this.dataForm.zlshRemark=='' && type=='3'){
_this.$notify.error('请填写驳回理由')
return
}
_this.dataForm.zlsh=type;
updateInfo(_this.dataForm).then(data => {
_this.$notify.success('操作成功')
_this.visible = false
_this.$emit('refreshDataList')
}).catch(() => {
_this.canSubmit = true;
});
}
}
}
</script>