You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

708 lines
27 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<div>
<div ref="lxHeader">
<lx-header icon="md-apps" :text="$route.meta.title" style="margin-bottom: 10px; border: 0px; margin-top: 15px">
<div slot="content">
<div class="searchwrap" style="display: flex;align-items: center;">
<div>
<div>
<el-input v-model="select.keyword" placeholder="请输入关键词"></el-input>
</div>
<div>
<el-input v-model="select.name" placeholder="请输入姓名"></el-input>
</div>
<div>
<el-input v-model="select.company_name" placeholder="请输入公司名称"></el-input>
</div>
<xy-selectors style="width:auto" @reset="resetSelect" @search="select.page=1,getList()">
<template v-slot:selected>
<div class="selected-wrap">
<div>
<el-date-picker style="width:100%" v-model="select.year"
type="year" placeholder="查询年份" value-format="yyyy" format="yyyy">
</el-date-picker>
</div>
<div>
<el-input v-model="select.course_name" placeholder="请输入课程名称"></el-input>
</div>
<div>
<el-date-picker style="width:100%" @change="changeDate" v-model="select.courses_end_date" type="date"
placeholder="课程结束日期" value-format="yyyy-MM-dd" format="yyyy-MM-dd">
</el-date-picker>
</div>
<div>
<el-select v-model="select.status" placeholder="请选择审核状态" clearable>
<el-option v-for="item in apply_status_list" :key="item.id" :label="item.value" :value="item.id">
</el-option>
</el-select>
</div>
<div>
<el-select v-model="select.course_type" placeholder="请选择课程体系" clearable>
<el-option v-for="item in courseTypeList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
<div style="width:250px">
<el-date-picker v-model="birthdayDates" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
style="width:100%" @change="changeBirthdayDates" type="daterange" range-separator="至"
start-placeholder="出生日期" end-placeholder="出生日期">
</el-date-picker>
</div>
<div>
<el-input v-model="select.mobile" placeholder="请输入手机号"></el-input>
</div>
<div>
<el-input v-model="select.school" placeholder="请输入最高毕业院校"></el-input>
</div>
<div>
<el-select style="width:100%" v-model="educationType"
@change="(e)=>{changeSelectType(e,'education')}" multiple collapse-tags placeholder="请选择学历" clearable>
<el-option v-for="item in formSelect.education" :key="item.id" :label="item.value"
:value="item.value">
</el-option>
</el-select>
</div>
<div style="width:200px">
<el-select style="width:100%" v-model="typeSelect" @change="(e)=>{changeSelectType(e,'type')}" multiple collapse-tags
placeholder="请选择个人荣誉" clearable>
<el-option v-for="item in formSelect.type" :key="item.id" :label="item.value" :value="item.value">
</el-option>
</el-select>
</div>
<div >
<el-select v-model="select.is_vip" placeholder="请选择学员身份" clearable>
<el-option v-for="item in is_vip_list" :key="item.id" :label="item.value" :value="item.id">
</el-option>
</el-select>
</div>
<!-- <div>
<el-select v-model="select.is_schoolmate" placeholder="请选择是否校友" clearable>
<el-option v-for="item in is_schoolmate_list" :key="item.id" :label="item.value" :value="item.id">
</el-option>
</el-select>
</div> -->
<div>
<el-input v-model="select.company_position" placeholder="请输入职务"></el-input>
</div>
<div>
<el-select v-model="select.company_has_share" placeholder="是否有股份" clearable>
<el-option v-for="item in shareList" :key="item.value" :label="item.value" :value="item.value">
</el-option>
</el-select>
</div>
<div>
<el-select v-model="select.company_need_fund" placeholder="是否需要融资" clearable>
<el-option v-for="item in yuanheList" :key="item.value" :label="item.value" :value="item.value">
</el-option>
</el-select>
</div>
<div style="width:250px">
<el-date-picker v-model="companyDates" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
style="width:100%" @change="changeCompanyDates" type="daterange" range-separator="至"
start-placeholder="公司成立日期" end-placeholder="公司成立日期">
</el-date-picker>
</div>
<div style="width:200px">
<el-select style="width:100%" v-model="companyArea"
multiple collapse-tags
@change="(e)=>{changeSelectType(e,'company_area')}"
placeholder="请选择所属区域" clearable>
<el-option v-for="item in formSelect.company_area" :key="item.id" :label="item.value"
:value="item.value">
</el-option>
</el-select>
</div>
<div style="width:250px">
<el-select style="width:100%" v-model="companyType"
@change="(e)=>{changeSelectType(e,'company_type')}" multiple collapse-tags
placeholder="请选择企业资质" clearable>
<el-option v-for="item in formSelect.company_type" :key="item.id" :label="item.value"
:value="item.value">
</el-option>
</el-select>
</div>
<div style="width:250px">
<el-select style="width:100%" v-model="companyIndustry" multiple collapse-tags
@change="(e)=>{changeSelectType(e,'company_industry')}" placeholder="请选择所属领域" clearable>
<el-option v-for="item in formSelect.company_industry" :key="item.id" :label="item.value"
:value="item.value">
</el-option>
<!-- <el-option v-for="item in formSelect.company_industry_detail" :key="item.id" :label="item.value"
:value="item.value">
</el-option> -->
</el-select>
</div>
<div>
<el-input v-model="select.company_tag" placeholder="请输入集团标签"></el-input>
</div>
<div>
<el-select v-model="select.has_openid" placeholder="是否绑定小程序" clearable>
<el-option v-for="item in false_or_true" :key="item.id" :label="item.value" :value="item.id">
</el-option>
</el-select>
</div>
</div>
</template>
</xy-selectors>
<div>
<el-button type="primary" size="small" @click="select.page=1,getList()">查询</el-button>
<el-button type="primary" size="small" @click="resetSelect">重置</el-button>
<el-button type="primary" size="small" @click="updateSchoolmates(0)">批量取消校友库</el-button>
</div>
</div>
</div>
</div>
</lx-header>
</div>
</div>
<div>
<xy-table :list="list" @pageIndexChange="pageIndexChange" @pageSizeChange="pageSizeChange" :showIndex="false"
@selection-change="selectionChange" :total="total" :table-item="table_item">
<template v-slot:index>
<el-table-column align='center' fixed="left" label="" width="50" header-align="center">
<template slot-scope="scope">
{{getIndex(scope.$index)}}
</template>
</el-table-column>
</template>
<template v-slot:course_list>
<el-table-column align='left' label="课程" width="380" header-align="center">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.course_signs">
<div v-if="item.course"
style="width:100%;display: flex;justify-content: space-between;align-items: center;margin-bottom:5px">
<div>
{{item.course.year?item.course.year:''}}{{item.course.type_detail.name+' | '}}{{item.course.name}}
</div>
<template v-for="state in apply_status_list">
<el-tag style="margin-left:20px" :type="state.type"
v-if="item.status===state.id">{{state.value}}</el-tag>
</template>
</div>
</div>
</template>
</el-table-column>
</template>
<template v-slot:headimgurl>
<el-table-column align='center' label="头像" width="100" header-align="center">
<template slot-scope="scope">
<el-image
v-if="scope.row.headimgurl"
style="width: 50px; height: 50px;border-radius: 100%;"
:src="scope.row.headimgurl"
:preview-src-list="[scope.row.headimgurl]">
</el-image>
</template>
</el-table-column>
</template>
<template v-slot:mobile>
<el-table-column align='center' label="联系方式" width="120" header-align="center">
<template slot-scope="scope">
{{base.maskPhoneNumber(scope.row.mobile)}}
</template>
</el-table-column>
</template>
<template v-slot:is_schoolmate>
<el-table-column align='center' label="是否校友库学员" width="120" header-align="center">
<template slot-scope="scope">
<el-tag v-if="scope.row.is_schoolmate===1" type="">是</el-tag>
<el-tag v-else type="info">否</el-tag>
</template>
</el-table-column>
</template>
<template v-slot:is_vip>
<el-table-column align='center' label="学员身份" width="120" header-align="center">
<template slot-scope="scope">
<!-- <div v-for="item in is_schoolmate_list">
<div v-if="scope.row.is_vip===item.id">{{item.value}}</div>
</div> -->
<div v-if="scope.row.is_vip===1">付费</div>
<div v-else>公益</div>
</template>
</el-table-column>
</template>
<template v-slot:is_wx>
<el-table-column align='center' label="是否绑定小程序" width="120" header-align="center">
<template slot-scope="scope">
<el-tag v-if="scope.row.openid">
</el-tag>
<el-tag v-else type="info">
</el-tag>
</template>
</el-table-column>
</template>
<template v-slot:btns>
<el-table-column align='center' label="操作" fixed="right" width="180" header-align="center">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="edit('editor',scope.row.id)">编辑</el-button>
<el-button type="primary" size="small" @click="showDetail('show',scope.row.id)">查看</el-button>
</template>
</el-table-column>
</template>
</xy-table>
</div>
<student-detail ref="studentDetail"></student-detail>
<editDetail ref="editDetail" @refresh="getList"></editDetail>
<imports ref="imports" :table-name="'users'" @refresh="getList"></imports>
</div>
</template>
<script>
import studentDetail from './components/detail.vue';
import editDetail from './components/editDetail.vue';
import myMixins from "@/mixin/selectMixin.js";
import formMixin from "@/mixin/formMixin.js";
import {
indexStudy,
updateSchoolmate
} from '@/api/student/index.js'
import imports from "@/views/component/imports.vue"
import {
index as indexTypes
} from "@/api/course/courseType.js"
export default {
mixins: [myMixins, formMixin],
components: {
studentDetail,
editDetail,
imports
},
data() {
return {
path: '',
// 多选 获取
companyDates: [],
birthdayDates: [],
companyType: [],
typeSelect: [],
educationType:[],
companyIndustry:[],
companyArea:[],
select: {
keyword: '',
name: '',
year:'',
mobile: '',
course_name: '',
company_name: '',
school: '',
start_birthday: '',
end_birthday: '',
start_company_date: '',
end_company_date: '',
company_has_share: '',
company_need_fund: '',
company_position: '',
company_area: '',
company_type: '',
company_industry: '',
company_tag: '',
is_vip: '',
is_schoolmate: 1,
courses_end_date: '',
education: '',
type: '',
status: "",
course_type: '',
has_openid:'',
page: 1,
page_size: 10,
},
courseTypeList: [],
list: [],
total: 0,
seleSchoolmates: [],
table_item: [{
type: 'selection',
width: 50,
fixed: 'left'
}, {
prop: 'index',
label: '',
align: 'center',
width: 50,
fixed: 'left'
}, {
prop: 'course_list',
label: '课程名称',
align: 'left',
}, {
prop: 'username',
label: '姓名',
align: 'center',
width: 120
}, {
prop: 'sex',
label: '性别',
align: 'center',
width: 120
}, {
prop: 'no',
label: '学号',
align: 'center',
width: 180
},{
prop: 'headimgurl',
label: '头像',
align: 'center',
width: 100
},{
prop: 'idcard',
label: '身份证号',
align: 'center',
width: 180
}, {
prop: 'mobile',
label: '联系方式',
align: 'center',
width: 120,
}, {
prop: 'birthday',
label: '出生年月',
align: 'center',
width: 120,
}, {
prop: 'email',
label: '邮箱',
align: 'center',
width: 120,
}, {
prop: 'company_name',
label: '公司名称',
align: 'left',
width: 200
}, {
prop: 'company_position',
label: '职务',
align: 'center',
width: 120,
}, {
prop: 'from',
label: '学员标签',
align: 'center',
width: 120,
}, {
prop: 'is_schoolmate',
label: '是否校友库学员',
align: 'center',
width: 120,
}, {
prop: 'is_vip',
label: '学员身份',
align: 'center',
width: 120,
},{
prop: 'is_wx',
label: '是否绑定小程序',
align: 'center',
width: 120,
}]
}
},
created() {
this.getList()
this.getCourseType()
},
methods: {
changeSelectType(e, selectName) {
if (e) {
this.select[selectName] = e.join(",")
} else {
this.select[selectName] = ''
}
},
changeCompanyDates(e) {
if (e) {
this.select.start_company_date = e[0]
this.select.end_company_date = e[1]
} else {
this.select.start_company_date = ''
this.select.end_company_date = ''
}
},
changeBirthdayDates(e) {
if (e) {
this.select.start_birthday = e[0]
this.select.end_birthday = e[1]
} else {
this.select.start_birthday = ''
this.select.end_birthday = ''
}
},
importTable(row) {
// this.$refs.imports.tableData = {
// 'data[course_id]': row.course_id,
// 'data[course_content_id]': row.id
// }
this.$refs.imports.show()
// {"course_id":15,"course_content_id":188}
},
pageIndexChange(e) {
this.select.page = e
this.getList()
},
pageSizeChange(e) {
this.select.page_size = e
this.select.page = 1
this.getList()
},
getIndex(e) {
let perSize = (this.select.page - 1) * this.select.page_size
let index = perSize + e + 1
return index
},
resetSelect() {
this.companyType = []
this.typeSelect = []
this.educationType=[]
this.companyIndustry=[]
this.companyArea=[]
this.select.keyword = ''
this.select.name = ''
this.select.year = ''
this.select.mobile = ''
this.select.company_name = ''
this.select.school = ''
this.select.company_has_share = ''
this.select.company_need_fund = ''
this.select.start_company_date = ''
this.select.start_birthday = ''
this.birthdayDates = []
this.select.end_birthday = ''
this.select.end_company_date = ''
this.companyDates = []
this.select.course_name = ''
this.select.company_position = ''
this.select.company_area = ''
this.select.company_type = ''
this.select.company_industry = ''
this.select.is_vip = ''
this.select.company_tag = ''
this.select.courses_end_date = ''
this.select.is_schoolmate = 1
this.select.education = ''
this.select.type = ''
this.select.status = ''
this.select.course_type = ''
this.select.has_openid = ''
this.select.page = 1
this.getList()
},
async getList() {
const res = await indexStudy({
page: this.select.page,
page_size: this.select.page_size,
keyword: this.select.keyword,
name: this.select.name,
year:this.select.year?this.select.year:'',
mobile: this.select.mobile,
company_name: this.select.company_name,
school: this.select.school,
start_birthday: this.select.start_birthday,
end_birthday: this.select.end_birthday,
start_company_date: this.select.start_company_date,
end_company_date: this.select.end_company_date,
course_name: this.select.course_name,
company_has_share: this.select.company_has_share,
company_need_fund: this.select.company_need_fund,
company_position: this.select.company_position,
company_area: this.select.company_area,
company_type: this.select.company_type,
company_industry: this.select.company_industry,
company_tag: this.select.company_tag,
is_vip: this.select.is_vip,
courses_end_date: this.select.courses_end_date,
is_schoolmate: this.select.is_schoolmate,
education: this.select.education,
type: this.select.type,
status: this.select.status,
has_openid:this.select.has_openid,
course_type: this.select.course_type
})
this.list = res.list.data
this.total = res.list.total
},
changeDate(e) {
if (e) {
this.select.courses_end_date = e
} else {
this.select.courses_end_date = ''
}
},
// 批量设置校友库
selectionChange(e) {
console.log(e)
this.seleSchoolmates = e
},
// 批量设置校友库
updateSchoolmates(vip) {
if (this.seleSchoolmates.length > 0) {
if (vip == 0) {
// 批量取消校友库
this.$confirm(
`确定要将选中的 ${this.seleSchoolmates.length} 名学员从校友库移除吗?`,
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
// 直接取消校友库,不加入黑名单
this.submitUpdateSchoolmates(vip, 0);
}).catch(() => {
// 用户取消操作
console.log('用户取消了操作');
});
} else {
// 批量设置为校友 - 检查黑名单状态
const blacklistedUsers = this.seleSchoolmates.filter(user => user.is_black == 1);
if (blacklistedUsers.length > 0) {
// 有黑名单学员,给出提示
const blacklistedNames = blacklistedUsers.map(user => user.username || user.name || '未知用户').join('、');
const otherUsers = this.seleSchoolmates.filter(user => user.is_black != 1);
this.$confirm(
`以下学员目前处于黑名单中,需先将其设置为非黑名单才可以加入到校友库中:\n\n${blacklistedNames}\n\n是否先将其他学员设置为校友`,
'黑名单提示',
{
confirmButtonText: '是',
cancelButtonText: '否',
type: 'warning',
dangerouslyUseHTMLString: true
}
).then(() => {
// 选择是,剔除黑名单学员后提交
if (otherUsers.length > 0) {
this.submitUpdateSchoolmates(vip, otherUsers);
} else {
this.$Message.warning('没有可设置为校友的学员');
}
}).catch(() => {
// 选择否,不执行任何操作
console.log('用户取消了操作');
});
} else {
// 没有黑名单学员,直接设置为校友
this.$confirm(
`确定要将选中的 ${this.seleSchoolmates.length} 名学员加入校友库吗?`,
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
this.submitUpdateSchoolmates(vip);
}).catch(() => {
console.log('用户取消了操作');
});
}
}
} else {
this.$Message.warning("请先选择学员")
return
}
},
// 提交更新校友库状态
submitUpdateSchoolmates(vip, users = null) {
// 如果传入了users参数使用传入的用户列表否则使用默认的seleSchoolmates
const targetUsers = users || this.seleSchoolmates;
let ids = []
targetUsers.map(item => {
ids.push(item.id)
})
updateSchoolmate({
is_schoolmate: vip,
ids: ids.join(','),
is_black: 0 // 固定设置为非黑名单
}).then(res => {
const userCount = targetUsers.length;
const operation = vip === 1 ? '加入校友库' : '从校友库移除';
if (users && users.length !== this.seleSchoolmates.length) {
// 如果有黑名单学员被剔除,显示特殊提示
this.$Message.success(`批量${operation}成功,共处理 ${userCount} 名学员(已剔除黑名单学员)`)
} else {
this.$Message.success(`批量${operation}成功`)
}
this.getList()
}).catch(error => {
this.$Message.error("批量设置失败:" + (error.message || '未知错误'))
})
},
edit(type, id) {
this.$refs.editDetail.id = id
this.$refs.editDetail.type = type
this.$refs.editDetail.isShow = true
},
showDetail(type, id) {
this.$refs.studentDetail.id = id
this.$refs.studentDetail.type = type
this.$refs.studentDetail.isShow = true
},
async getCourseType() {
const res = await indexTypes({
page: 1,
page_size: 999
})
this.courseTypeList = res.data
}
}
}
</script>
<style lang="scss" scoped>
.searchwrap {
display: flex;
align-items: center;
flex-wrap: wrap;
&>div,.selected-wrap {
display: flex;
align-items: center;
flex-wrap: wrap;
&>div {
margin-right: 10px;
margin-bottom: 10px;
width: 150px;
&:last-child {
width: auto
}
}
}
}
</style>