master
xy 3 years ago
parent df103e7be7
commit 367f240ac3

@ -1,6 +1,6 @@
import request from "@/utils/request";
import { download } from "@/utils/downloadRequest";
import qs from "qs";
export function index(params,isLoading = true){
return request({
url:"/api/admin/recruit/index",
@ -23,8 +23,11 @@ export function save(data,isLoading = true){
return request({
url:"/api/admin/recruit/save",
method:"post",
data,
isLoading
data:qs.stringify(data),
isLoading,
headers:{
'Content-Type':'application/x-www-form-urlencoded'
}
})
}
@ -47,7 +50,7 @@ export function imports(data,isLoading = true){
}
export async function exports(params){
await download('/api/admin/recruit/export','get',params,`统招生管理-${params.year}`)
await download('/api/admin/recruit/export','get',params,`统招生管理-${params.year}.xlsx`)
}

@ -256,6 +256,8 @@ export default {
this.loading = false;
});
break;
default:
return;
}
},
getByStrkey(obj, str) {
@ -610,6 +612,11 @@ export default {
});
},
},
watch:{
tableItem(newVal){
this.checkTable = newVal.map((item) => item?.prop)
}
},
created() {
this.getTableData();
},
@ -685,7 +692,7 @@ export default {
["expand-change"]: this.expandChange,
}}
>
{this.tableFormat.map((item, index) => {
{this.tableItem.map((item, index) => {
if ($scopedSlots[item.prop]) {
return $scopedSlots[item.prop](item, index);
}

@ -20,13 +20,11 @@ const data = {
"templateType":[
{
id: 1,
value: "文本",
type:"text"
value: "文本"
},
{
id:2,
value:"年份",
type:"year"
value:"年份"
}
]
}

@ -1,6 +1,6 @@
import Cookies from 'js-cookie'
const TokenKey = 'sishitongtang_token'
const TokenKey = 'wsxy_token'
export function getToken() {
return Cookies.get(TokenKey)

@ -12,11 +12,169 @@ export default {
loading={true}
on={{
["on-visible-change"]: (e) => this.$emit("update:isShow", e),
["on-ok"]: (e) => {
this.$refs['oriElForm'].validate().then(res => {
if (res){
let fileds = []
for(let key in this.form){
let temp = {}
temp[key] = this.form[key]
fileds.push(temp)
}
this.$refs['elForm'].validate().then(res => {
Object.defineProperty(this.originalForm,'fileds',{
enumerable:true,
writable:true,
configurable:false,
value:fileds
})
save(this.originalForm).then(res => {
this.$message({
type:'success',
message:res.msg
})
this.$emit("refresh")
this.$emit("update:isShow", false)
})
})
}
})
},
}}
>
{
this.getTable()
}
<el-form
ref="oriElForm"
label-width="100px"
props={{ model: this.originalForm }}
rules={this.originalRules}
>
<el-col span={12}>
<el-form-item label="年份" prop="year">
<el-date-picker
clearable={true}
placeholder="请选择年份"
v-model={this.originalForm.year}
type="year"
value-format="yyyy"
on={{
["change"]: (e) => {
this.getTemplate();
},
}}
></el-date-picker>
</el-form-item>
</el-col>
<el-col span={12}>
<el-form-item label="省份" prop="province_id">
<el-select
clearable={true}
v-model={this.originalForm.province_id}
placeholder="请选择省份"
>
{this.province_ids.map((item) => {
return (
<el-option
value={item.id}
label={item.name}
key={item.id}
></el-option>
);
})}
</el-select>
</el-form-item>
</el-col>
<el-col span={12}>
<el-form-item label="姓名" prop="name">
<el-input
clearable={true}
v-model={this.originalForm.name}
placeholder="请输入姓名"
></el-input>
</el-form-item>
</el-col>
<el-col span={12}>
<el-form-item label="身份证号" prop="idcard">
<el-input
clearable={true}
v-model={this.originalForm.idcard}
placeholder="请输入身份证号"
></el-input>
</el-form-item>
</el-col>
<el-col span={12}>
<el-form-item label="考生号" prop="candidate_no">
<el-input
clearable={true}
v-model={this.originalForm.candidate_no}
placeholder="请输入考生号"
></el-input>
</el-form-item>
</el-col>
<el-col span={12}>
<el-form-item label="准考证号" prop="allow_no">
<el-input
clearable={true}
v-model={this.originalForm.allow_no}
placeholder="请输入准考证号"
></el-input>
</el-form-item>
</el-col>
</el-form>
<el-form
ref="elForm"
props={{ model: this.form }}
rules={this.rules}
label-width="100px"
>
{this.formInfo.map((item) => {
return (
<el-col span={12}>
<el-form-item label={item.name} prop={item.en}>
{(() => {
switch (item.type) {
case 1:
return (
<el-input
clearable={true}
placeholder={`请输入${item.name}`}
v-model={this.form[item.en]}
// style={{ width: "300px" }}
on={{
["input"]: (e) => {
this.$forceUpdate();
},
}}
></el-input>
);
case 2:
return (
<el-date-picker
placeholder="请选择"
v-model={this.form[item.en]}
type="year"
value-format="yyyy"
// style={{ width: "300px" }}
on={{
["input"]: (e) => {
this.$forceUpdate();
},
}}
></el-date-picker>
);
}
})()}
</el-form-item>
</el-col>
);
})}
</el-form>
</Modal>
);
},
@ -25,16 +183,53 @@ export default {
type: Boolean,
default: false,
},
province_ids: Array,
},
data() {
let idcardValidate = (rule, value, callback) => {
let IDRe18 =
/^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
let IDre15 =
/^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/;
if (IDre15.test(value) || IDRe18.test(value)) {
callback();
} else {
callback(new Error("身份证格式错误"));
}
};
return {
type: "",
//
formInfo: [],
form: {},
rules: {},
//
originalForm: {
year: `${2022}`,
year: `${new Date().getFullYear()}`,
province_id: "",
name: "",
idcard: "",
candidate_no: "",
allow_no: "",
},
originalRules: {
year: [{ required: true, message: "请选择年份", trigger: "blur" }],
province_id: [
{ required: true, message: "请选择省份", trigger: "blur" },
],
name: [{ required: true, message: "请填写姓名", trigger: "blur" }],
idcard: [
{ required: true, message: "请填写身份证号", trigger: "blur" },
{ validator: idcardValidate, trigger: "blur" },
],
candidate_no: [
{ required: true, message: "请填写考生号", trigger: "blur" },
],
allow_no: [
{ required: true, message: "请填写准考证号", trigger: "blur" },
],
},
slots: {},
};
},
methods: {
@ -47,22 +242,30 @@ export default {
);
if (res?.fileds) {
res?.fileds.forEach((item) => {
this.form[item.en] = "";
Object.defineProperty(this.form, item.en, {
value: "",
writable: true,
enumerable: true,
configurable: false,
});
//this.form[item.en] = "";
this.rules[item.en] = {
validator: (rule, value, callback) => {
if (!this.form[item.en]) {
callback(new Error("未填写"));
} else {
callback();
}
},
trigger: "blur",
required: true,
};
});
}
this.$forceUpdate()
this.formInfo = res?.fileds ?? [];
this.$forceUpdate();
},
getTable(){
let temp = [];
for(let key in this.form){
temp.push(
<el-input v-model={this.form[key]}></el-input>
)
}
return temp
}
},
watch: {
async isShow(newVal) {

@ -1,287 +0,0 @@
<template>
<div>
<xy-dialog
ref="dialog"
:is-show.sync="isShow"
type="form"
:title="type === 'add' ? '新增统招生' : '编辑统招生'"
:form="form"
:rules="rules"
@submit="submit"
>
<template v-slot:extraFormTop>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
年份
</div>
<div class="xy-table-item-content">
<el-date-picker
type="year"
v-model="originalForm.year"
placeholder="请选择年份"
style="width: 300px"
value-format="yyyy"
@change="getTemplate"
></el-date-picker>
</div>
</div>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
省份
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.province_id"
clearable
placeholder="请选择省份 "
style="width: 300px"
>
<el-option
v-for="item in province_ids"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
姓名
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.name"
clearable
placeholder="请输入姓名 "
style="width: 300px"
/>
</div>
</div>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
身份证号
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.idcard"
clearable
placeholder="请输入身份证号 "
style="width: 300px"
/>
</div>
</div>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
考生号
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.candidate_no"
clearable
placeholder="请输入考生号 "
style="width: 300px"
/>
</div>
</div>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
准考证号
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.allow_no"
clearable
placeholder="请输入准考证号 "
style="width: 300px"
/>
</div>
</div>
</template>
<template v-for="(val,key) in form" v-slot:[key]>
<div>{val}</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import { show as templateShow } from "@/api/unifiedRecruitment/template";
import { show, save } from "@/api/unifiedRecruitment/recruit";
export default {
props: {
province_ids: {
type: Array,
default: () => [],
},
},
data() {
let idcardValidate = (rule, value, callback) => {
let IDRe18 =
/^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
let IDre15 =
/^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/;
if (value) {
if (IDre15.test(value) || IDRe18.test(value)) {
callback();
} else {
callback(new Error("身份证格式错误"));
}
} else {
callback(new Error("请填写身份证号"));
}
};
return {
isShow: false,
id: "",
type: "",
originalForm: {
year: new Date().getFullYear() + '',
province_id: "",
name: "",
idcard: "",
candidate_no: "",
allow_no: "",
},
form:{
},
rules: {
year: [
{
required: true,
message: "请填写年份",
},
],
province_id: [
{
required: true,
message: "请填写省份",
},
],
name: [
{
required: true,
message: "请填写姓名",
},
],
idcard: [
{
validator: idcardValidate
},
],
candidate_no: [
{
required: true,
message: "请填写考生号",
},
],
allow_no: [
{
required: true,
message: "请填写准考证号",
},
],
},
};
},
methods: {
async getTemplate(){
const res = await templateShow({
year:this.originalForm.year
},true)
if(res?.fileds){
res?.fileds.forEach(item => {
Object.defineProperty(this.form,item.en,{
enumerable:true,
writable:true,
configurable:true,
value:""
})
})
}
},
async getDetail() {
const res = await show({ id: this.id }, true);
this.$integrateData(this.form, res);
},
submit() {
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;
}
}
if (this.type === "editor") {
Object.defineProperty(this.form, "id", {
value: this.id,
enumerable: true,
configurable: true,
writable: true,
});
}
save(this.form).then((res) => {
this.$successMessage(this.type, "");
this.isShow = false;
this.$emit("refresh");
});
},
},
watch: {
isShow(val) {
if (val) {
this.getTemplate()
if (this.type === "editor") {
this.getDetail();
}
} else {
this.id = "";
this.type = "";
this.$refs["dialog"].reset();
delete this.form.id;
}
},
"originalForm.year"(newVal) {
this.originalForm.year = newVal + "";
},
},
created() {
}
};
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -0,0 +1,99 @@
<template>
<div>
<Modal
title="数据导入"
width="80"
:value="isShow"
@on-visible-change="(e) => $emit('update:isShow', e)"
>
<div class="select">
<div class="select__item">
<span>年份</span>
<el-date-picker size="small" placeholder="请选择年份" v-model="select.year" value-format="yyyy" type="year" style="width: 200px;"></el-date-picker>
</div>
<div class="select__item">
<span>省份</span>
<el-select size="small" placeholder="请选择省份" v-model="select.province_id" style="width: 200px;">
<el-option v-for="item in province_ids" :value="item.id" :key="item.id" :label="item.name"></el-option>
</el-select>
</div>
<div class="select__item">
<span>更新统招进度为录取结束</span>
<el-checkbox></el-checkbox>
</div>
</div>
<div class="upload">
<el-upload
class="upload-demo"
ref="upload"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
:headers="{
'Authorization':`Bear ${getToken()}`
}"
:data="select"
:action="action"
:file-list="fileList"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button style="margin-left: 10px;" size="small" type="success" @click="$refs['upload'].submit()"></el-button>
<div slot="tip" class="el-upload__tip">支持文件格式EXCEL扩展名为 XLSXXLS</div>
</el-upload>
</div>
</Modal>
</div>
</template>
<script>
import {
getToken
} from '@/utils/auth'
export default {
props: {
isShow: {
type: Boolean,
default: false,
},
province_ids:Array
},
data() {
return {
action: `${process.env.VUE_APP_BASE_API}/api/admin/recruit/excel_analyse`,
fileList:[],
select:{
year:'',
province_id:''
}
};
},
methods: {
getToken,
},
computed: {},
watch: {},
};
</script>
<style scoped lang="scss">
.select{
display: flex;
align-items: center;
&__item{
&>span{
font-weight: 600;
padding: 0 16px;
}
}
}
.upload{
width: 30%;
margin-top: 10px;
}
</style>

@ -4,7 +4,6 @@
title="模板设置"
width="80"
:value="isShow"
:loading="true"
@on-ok="submit"
@on-visible-change="(e) => $emit('update:isShow', e)"
>
@ -139,10 +138,9 @@ export default {
customFn: (row) => {
return (
<el-input
size="mini"
disabled={this.flag.indexOf(row.name) !== -1}
v-model={row.remark}
type="textarea"
autosize={{ minRows: 2 }}
></el-input>
);
},
@ -191,7 +189,7 @@ export default {
width="160"
value={$index === this.popIndex}
>
<p>这是一段内容这是一段内容确定删除吗</p>
<p>确定删除该列</p>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text">
取消

@ -27,9 +27,7 @@
size="small"
placeholder="关键词搜索"
></el-input>
<Button type="primary" @click="$refs['xyTable'].getTableData()"
>搜索</Button
>
<Button type="primary" @click="search"></Button>
</div>
</template>
<template v-slot:create>
@ -39,6 +37,14 @@
>新建</Button
>
</template>
<template v-slot:export>
<Button type="primary" @click="downTemplate"></Button>
</template>
<template v-slot:import>
<Button type="primary" @click="isShowImportRecruitInfo = true"
>导入录取信息</Button
>
</template>
</header-content>
</slot>
</lx-header>
@ -46,8 +52,7 @@
<xy-table
ref="xyTable"
:req-opt="select"
:action="index"
:list="list"
:table-item="table"
:auths="auths_auth_mixin"
:destroy-action="destroy"
@ -66,35 +71,48 @@
ref="addRecruit"
@refresh="$refs['xyTable'].getTableData()"
></addRecruit>
<importRecruitInfo
ref="importRecruitInfo"
:province_ids="provinces"
:is-show.sync="isShowImportRecruitInfo"
></importRecruitInfo>
</div>
</template>
<script>
import { index, destroy } from "@/api/unifiedRecruitment/recruit";
import { index, destroy, exports } from "@/api/unifiedRecruitment/recruit";
import { authMixin } from "@/mixin/authMixin";
import { index as provinceIndex } from "@/api/manage/province";
import { show as templateShow } from "@/api/unifiedRecruitment/template";
import addRecruit from "./component/addRecruit.vue";
import importRecruitInfo from "./component/importRecruitInfo.vue";
export default {
mixins: [authMixin],
components: {
addRecruit,
importRecruitInfo,
},
data() {
return {
isShowImportRecruitInfo: false,
isShowAdd: false,
provinces: [],
select: {
year: "",
year: `${new Date().getFullYear()}`,
keyword: "",
page: 1,
page_size: 10,
},
table: [
list: [],
table: [],
originalTable: [
{
prop: "year",
label: "年份",
width: 100,
sortable: "custom",
},
{
prop: "name",
@ -136,6 +154,18 @@ export default {
index,
destroy,
async getList() {
let res = await index(this.select, false);
this.list = res.data.map((item) => {
let obj = {};
if (item.fileds) {
item.fileds.forEach((filed) => {
obj = { ...obj, ...filed };
});
}
return { ...item, ...obj };
});
},
async getProvinces() {
const res = await provinceIndex(
{
@ -146,10 +176,41 @@ export default {
);
this.provinces = res.data;
},
async getTemplate() {
const res = await templateShow(
{
year: this.select.year,
},
true
);
let temp =
res?.fileds?.map((item) => {
return {
prop: item.en,
label: item.name,
width: 140,
};
}) ?? [];
this.table = [...this.originalTable, ...temp];
},
async search() {
await this.getTemplate();
await this.getList();
},
downTemplate() {
exports({
year: this.select.year,
});
},
},
computed: {},
created() {
this.getProvinces();
this.getTemplate();
this.getList();
},
};
</script>

@ -19,7 +19,7 @@
省份
</div>
<div class="xy-table-item-content">
<el-select multiple value-key="province_id" v-model="form.province_list" clearable placeholder="请选择省份" style="width: 300px;" @change="provinceChange">
<el-select multiple value-key="province_id" v-model="form.province_list" clearable placeholder="请选择省份" style="width: 300px;">
<el-option v-for="item in province_lists" :key="item.id" :label="item.name" :value="{province_id:item.id}"></el-option>
</el-select>
</div>
@ -42,15 +42,18 @@
</div>
<div class="xy-table-item-content">
<el-upload
class="upload-demo"
:action="action"
:before-upload="uploadBefore"
:on-error="uploadFail"
:on-success="uploadSuccess"
multiple
:limit="5">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件且不超过500kb</div>
style="width: 300px;"
ref="upload"
multiple
:on-success="successHandle"
:before-upload="uploadBefore"
accept="application/x-rar-compressed,application/zip,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf"
:action="action"
:file-list="fileList"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button style="margin-left: 10px;" size="small" type="success" @click="$refs['upload'].submit()"></el-button>
<div slot="tip" class="el-upload__tip">支持文件格式.rar .zip .doc .docx .pdf <br>单个文件不能超过500kb</div>
</el-upload>
</div>
</div>
@ -77,7 +80,7 @@
id: '',
type: '',
action: process.env.VUE_APP_UPLOAD_API,
fileList:[],
form: {
year: "",
@ -98,23 +101,16 @@
}
},
methods: {
provinceChange(e){
console.log(e)
},
//
uploadFail(err) {
console.log(err)
},
uploadSuccess(response) {
console.log(response)
this.form.avatar = response.id
successHandle(response, file, fileList){
this.fileList = fileList
},
uploadBefore(file) {
console.log(file)
if ((file.size / 1000) > 2024) {
if ((file.size / 1000) > 500) {
this.$message({
type: 'warning',
message: '上传图片大小超过2M'
message: '上传图片大小超过500kb'
})
return false
}
@ -126,6 +122,12 @@
},
submit() {
this.form.file_ids = this.fileList.map(item => {
return {
ids:item?.response?.id
}
})
if(this.type === 'add'){
if(this.form.hasOwnProperty('id')){
delete this.form.id
@ -155,6 +157,7 @@
} else {
this.id = ''
this.type = ''
this.fileList = []
this.$refs['dialog'].reset()
delete this.form.id
}

@ -4,7 +4,7 @@
<lx-header
icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="统招进度"
text="历年分数"
>
<div slot="content"></div>
<slot>

Loading…
Cancel
Save