first commit

This commit is contained in:
2026-09-08 19:49:21 +08:00
commit ebffbab428
7320 changed files with 1477614 additions and 0 deletions
@@ -0,0 +1,959 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.mb10 {
margin-bottom: 10px;
}
.d .el-card__header {
padding: 10px 20px;
}
.d .el-card__body {
padding: 0;
}
.search .search-item {
width: calc((100% - 0px) / 4);
}
.search .search-item-label {
/*min-width: 70px;*/
}
.el-row-title {
margin-bottom: 20px;
font-weight: 600;
}
</style>
<div class="platform" id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">活动年份</div>
<el-date-picker :clearable="false" @change="yearChange()" placeholder="选择年份"
style="width: 100%" type="year" v-model="pageForm.year"
value-format="yyyy"></el-date-picker>
</div>
<div class="search-item">
<div class="search-item-label">活动级别</div>
<div class="search-item-option">
<el-select @change="changeLevel" clearable
placeholder="请选择活动级别"
style="width: 100%" v-model="pageForm.activityLevel">
<el-option
:key="item.code"
:label="item.name"
:value="item.code"
v-for="item in activityTypeList">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">活动名称</div>
<el-select @change="getData()" filterable
placeholder="请选择活动"
style="width: 100%;font-weight:bold;"
v-model="pageForm.id">
<el-option :label="item.name" :value="item.id"
v-for="item in activities"></el-option>
</el-select>
</div>
<div class="search-item">
<div class="search-item-label" v-if="pageForm.activityLevel!=='40003'">
院级工会
</div>
<div class="search-item-label" v-if="pageForm.activityLevel==='40003'">
社团名称
</div>
<div class="search-item-option">
<el-select @change="changeVVV"
@clear="changeVVV"
clearable
filterable placeholder="院级工会筛选"
style="width: 100%;font-weight:bold;" v-model="pageForm.unionid">
<el-option
:key="item.id"
:label="item.unionname"
:value="item.id"
v-for="item in unions">
</el-option>
</el-select>
</div>
</div>
<!--#if(!@shiro.hasRole('H04') || !@shiro.hasRole('ghzl')){#-->
<div class="search-item">
<div class="search-item-label">报名状态</div>
<div class="search-item-option">
<el-radio-group size="medium" v-model="pageForm.applyed">
<el-radio border label="1" style="background-color: white">未报名
</el-radio>
<el-radio border label="2" style="background-color: white">已报名
</el-radio>
</el-radio-group>
</div>
</div>
<!--#}#-->
<!-- <div class="search-item">
<div class="search-item-label">导入导出</div>
<div class="search-item-option">
<el-button type="primary" plain @click="openImport">导入报名人员</el-button>
<el-button @click="doExportByEnroll" plain
type="primary">导出报名信息
</el-button>
&lt;!&ndash; <el-button @click="doExportByEnroll" icon="el-icon-printer" plain size="small"
style="position: absolute;right: 0px" type="primary">导出报名信息
</el-button>&ndash;&gt;
</div>
</div>-->
</div>
</el-card>
<el-card class="mt10 d" shadow="never" style="padding: 20px">
<vi-title2 title="报名列表">
<template #func>
<!--#if(@shiro.hasRole('sysadmin')){#-->
<el-button @click="exportUnionNum" size="small" type="primary">导出分工会报名人数
</el-button>
<el-button @click="exportUnionUser" size="small" type="primary">导出报名人员名单
</el-button>
<!--#}#-->
<!--#if(@shiro.hasRole('ghzl')){#-->
<el-button @click="exportUnionUser" size="small" type="primary">导出报名人员名单
</el-button>
<!--#}#-->
</template>
</vi-title2>
<el-row :gutter="20" class="el-row-title" style="margin-left: 0;margin-right: 0;">
<el-col :span="2">序号</el-col>
<el-col :span="4">年度</el-col>
<el-col :span="6">
<span v-if="pageForm.activityLevel!=='40003'">分工会名称</span>
<span v-if="pageForm.activityLevel==='40003'">社团名称</span>
</el-col>
<el-col :span="6">活动名称</el-col>
<el-col :span="4">人数</el-col>
<el-col :span="2">
<!-- <el-button style="position: absolute;right: 0px" plain size="small" icon="el-icon-printer"
type="primary" @click="doExport">导 出
</el-button>-->
</el-col>
</el-row>
<el-table :data="[]" size="mini" v-if="noneData||tabLoading"
v-loading="tabLoading"></el-table>
<el-card class="box-card mb10" shadow="hover" v-else v-for="app,tabIdx in apply"
v-loading="tabLoading">
<div class="clearfix" slot="header">
<el-row :gutter="20">
<el-col :span="2">{{tabIdx + 1}}</el-col>
<el-col :span="4">{{pageForm.year}}</el-col>
<el-col :span="6">
{{isDisPlayCode?''+app.unioncode+'':null}}{{app.unionname}}
</el-col>
<el-col :span="6">{{pageForm.activityName || '暂无'}}</el-col>
<el-col :span="2">{{app.num |money}} 人</el-col>
<el-col :span="4">
<el-button @click="$set(app,'show',!app.show)"
style="float: right; padding: 3px 5px"
type="text">{{app.show?'折叠':'展开'}}
</el-button>
</el-col>
</el-row>
</div>
<transition name="el-fade-in-linear">
<div class="text item transition-box" style="padding: 20px 20px"
v-show="app.show">
<el-timeline v-if="pageForm.applyType===1||pageForm.applyType===3">
<!-- <el-timeline-item timestamp="领队信息" placement="top" v-if="app.leader.username!=null">
<el-card shadow="never">
<el-form label-suffix="" label-position="right" label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.leader.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.leader.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.leader.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.leader.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.leader.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="教练信息" placement="top" v-if="app.coach.username!=null">
<el-card shadow="never">
<el-form label-suffix="" label-position="right" label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.coach.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.coach.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.coach.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.coach.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.coach.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>-->
<el-timeline-item placement="top" timestamp="教职工信息">
<el-table :data="app.apply2" :key="tableKey" border size="mini"
stripe>
<el-table-column
align="center" header-align="center" label="序号"
sortable type="index"
width="100">
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='team'">
<span v-if="row.team">{{ row.team }}</span>
<span v-if="!row.team">暂无</span>
</template>
<template scope="{row:{projectType}}"
v-else-if="column.prop=='projectType'">
{{projectType==1?'单项':'团体'}}
</template>
<!-- <template scope="{row:{divisionLevelLeadership}}"
v-else-if="column.prop=='divisionLevelLeadership'">
<span v-if="divisionLevelLeadership" class="text-primary">是</span>
<span v-else class="text-danger">否</span>
</template>-->
<template scope="{row}"
v-else-if="column.prop=='identity'">
<el-tag effect="light"
v-if="row.identity.includes(1)">运动员
</el-tag>
<el-tag effect="light"
type="success" v-if="row.identity.includes(2)">教练
</el-tag>
<el-tag effect="light"
type="warning" v-if="row.identity.includes(3)">领队
</el-tag>
<el-tag effect="light"
type="warning"
v-if="row.identity.includes(4)">处级领导
</el-tag>
<el-tag effect="light"
type="warning" v-if="row.identity.includes(5)">替补
</el-tag>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
<el-timeline v-else-if="pageForm.applyType===2">
<el-timeline-item placement="top" timestamp="领队信息"
v-if="app.leader.username!=null">
<el-card shadow="never">
<el-form label-position="right" label-suffix=""
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.leader.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.leader.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.leader.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.leader.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.leader.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="教练信息"
v-if="app.coach.username!=null">
<el-card shadow="never">
<el-form label-position="right" label-suffix=""
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.coach.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.coach.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.coach.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.coach.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.coach.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="团长信息"
v-if="app.head.username!=null">
<el-card shadow="never">
<el-form label-position="right" label-suffix=""
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.head.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.head.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.head.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.head.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.head.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="工作人员信息"
v-if="app.staff.username!=null">
<el-card shadow="never">
<el-form label-position="right" label-suffix=""
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.staff.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.staff.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.staff.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.staff.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.staff.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="教职工信息">
<el-row gutter="40">
<el-col :span="4">
<div class="search-item">
<div class="search-item-option">
<el-select @change="doEvent(app)"
clearable
filterable placeholder="请选择活动项目"
style="width: 100%"
v-model="app.eventId">
<el-option
:key="item.id"
:label="item.allName"
:value="item.eventId"
v-for="item in events">
</el-option>
</el-select>
</div>
</div>
</el-col>
<el-col :span="4">
<div class="search-item">
<div class="search-item-option">
<el-select @change="doEventType(app)"
allow-create
clearable default-first-option
filterable placeholder="请选择项目类型"
style="width: 100%"
v-model="app.projectType">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in projectTypeList">
</el-option>
</el-select>
</div>
</div>
</el-col>
</el-row>
<el-table :data="app.apply2" :key="tableKey" border class="mt10"
size="mini"
stripe>
<el-table-column
align="center" header-align="center" label="序号"
sortable type="index"
width="100">
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='team'">
<span v-if="row.team">{{ row.team }}</span>
<span v-if="!row.team">暂无</span>
</template>
<!-- <template scope="{row:{divisionLevelLeadership}}"
v-else-if="column.prop=='divisionLevelLeadership'">
<span v-if="divisionLevelLeadership" class="text-primary">是</span>
<span v-else class="text-danger">否</span>
</template>-->
<template scope="{row:{projectType}}"
v-else-if="column.prop=='projectType'">
{{projectType==1?'单项':'团体'}}
</template>
<template scope="{row}"
v-else-if="column.prop=='identity'">
<el-tag effect="light"
v-if="row.identity.includes(1)">运动员
</el-tag>
<el-tag effect="light"
type="success" v-if="row.identity.includes(2)">教练
</el-tag>
<el-tag effect="light"
type="warning" v-if="row.identity.includes(3)">领队
</el-tag>
<el-tag effect="light"
type="warning"
v-if="row.identity.includes(4)">处级领导
</el-tag>
<el-tag effect="light"
type="warning" v-if="row.identity.includes(5)">替补
</el-tag>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
</div>
</transition>
</el-card>
</el-card>
</template>
</guava>
<el-dialog
:close-on-click-modal="false"
:visible.sync="importVisible"
title="导入"
width="50%"
>
<el-timeline>
<el-timeline-item placement="top" timestamp="下载模板">
<el-card>
<el-button
@click="location.href='/platform/basics/downloadTemplate?filePath=activity/ActivityApplyUser.xlsx&fileName=导入模板.xlsx'"
icon="el-icon-download" size="medium"
style="width: 200px"
type="">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="上传文件">
<el-card>
<el-upload
:auto-upload="false"
:file-list="importData.fileList"
:limit="1"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xls','xlsx']})
}"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
name="file"
ref="upload">
<el-button icon="el-icon-upload" size="medium" style="width: 200px" type="">
选择文件
</el-button>
</el-upload>
</el-card>
</el-timeline-item>
</el-timeline>
<span class="dialog-footer" slot="footer">
<el-button :disabled="importLoading" @click="importVisible = false">取 消</el-button>
<el-button :loading="importLoading" @click="doImport" type="primary">确定</el-button>
</span>
</el-dialog>
</div>
<script>
var vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
importData: {},
importLoading: false,
importVisible: false,
events: [],
activityTypeList: [],
noneData: true,
tabLoading: true,
activities: [],
apply: [],
apply2: [],
unions: [],
rootData: [],
tableKey: '',
pageForm: {
id: '',
unionid: '',
year: new Date().getFullYear() + '',
},
tableColumns: [
{prop: 'allName', label: '项目名称', sortable: true, width: '200px'},
// {prop: 'team', label: '所属队', sortable: true},
{prop: 'username', label: '姓名'},
{prop: 'loginname', label: '教工号'},
{prop: 'sex', label: '性别'},
/* {prop: 'divisionLevelLeadership', label: '是否处级领导', sortable: true},*/
{prop: 'unitname', label: '单位', sortable: true},
{prop: 'mobile', label: '电话'},
// {prop: 'projectType', label: '项目类型', sortable: true},
// {prop: 'identity', label: '身份', sortable: true, width: '300px'},
// {prop: 'notes', label: '备注'},
{prop: 'campus', label: '参加地点'},
],
projectTypeList: [
{id: '1', name: '单项'},
{id: '2', name: '团体'},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/activity/school/Info.vue'),
},
filters: {
money(val) {
return val ? val : 0
},
str(val) {
return val ? val : '暂无'
}
},
watch: {
'pageForm.applyed': (val) => {
vue.changeVVV(val)
}
},
methods: {
exportUnionNum() {
window.open(loc() + '/exportUnionNum?activityId=' + this.pageForm.id + '&activityLevel=' + this.pageForm.activityLevel)
},
exportUnionUser() {
window.open("/platform/activity/common/exportXlsx?id=" + this.pageForm.id + '&unionId=' + this.pageForm.unionid)
// window.open("/platform/activity/common/exportXlsx2?id=" + this.pageForm.id+'&unionId='+this.pageForm.unionid)
},
doImport() {
if (!this.importData.fileList.length) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
data.append("activityId", this.pageForm.id);
});
this.importLoading = true
$.ajax({
url: loc() + "/importUserActivitys",
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
if (!data.code) {
this.notifySuccess(data.msg);
this.getData();
this.importVisible = false
} else {
this.notifyWarning(data.msg)
}
this.importLoading = false
},
error: (data) => {
this.notifyWarning(data.msg)
this.importLoading = false
}
});
},
openImport() {
this.importData = {
fileList: []
}
if (!this.pageForm.id) {
this.notifyWarning("请先选择活动名称")
return
}
this.importVisible = true;
},
doExportByEnroll() {
const {id, unionid} = this.pageForm
if (unionid === "") {
this.$notify.warning({title: '警告', message: "请选择要导出的工会"});
return
}
window.open(loc() + "/doExportByEnroll?id=" + id + "&unionId=" + unionid)
},
async changeLevel() {
await this.getNearActivity()
},
doExport() {
const {id, unionid} = this.pageForm
location.href = "/platform/activity/common/exportXlsx?id=" + id
},
async yearChange() {
this.pageForm.id = null
await this.getNearActivity()
},
changeVVV() {
if (this.pageForm.unionid) {
this.apply = this.rootData.filter(v => {
return v.id === this.pageForm.unionid
})
} else {
this.apply = JSON.parse(JSON.stringify(this.rootData))
}
if (this.pageForm.applyed === '1') {
this.apply = this.apply.filter(v => {
return v.num === 0
})
} else if (this.pageForm.applyed === '2') {
this.apply = this.apply.filter(v => {
return v.num > 0
})
}
this.tableKey = new Date().getTime()
},
async getNearActivity() {
const resp = await $.get(loc() + "/getNearActivity", {
year: this.pageForm.year,
activityLevel: this.pageForm.activityLevel
})
if (resp.code === 0) {
this.activities = resp.data
if (resp.data.length) {
this.pageForm.id = resp.data[0].id
this.getData()
} else {
this.pageForm.unionid = ""
this.unionis = []
this.pageForm.id = ""
this.noneData = true
this.tabLoading = false
}
} else {
this.notifyWarning(resp.msg)
}
},
async changeActivit() {
const resp = await $.post("/platform/activity/apply/getEvents", {activityId: this.pageForm.id})
this.events = resp
},
doEventType(app) {
const {apply, projectType} = app
if (!app.projectType) {
this.$set(app, "apply2", apply)
} else {
const arr = apply.filter(i => {
return i.projectType == projectType
})
this.$set(app, "apply2", arr)
}
},
doEvent(app) {
const {apply, eventId} = app
if (!app.eventId) {
this.$set(app, "apply2", apply)
} else {
const arr = apply.filter(i => {
return !i.unionLeader && !i.unionCoach && i.evid == eventId
})
this.$set(app, "apply2", arr)
}
},
async getData() {
this.noneData = true
this.tabLoading = true
await this.changeActivit()
const activity = this.activities.filter(v => {
return v.id === this.pageForm.id
})
this.pageForm.activityName = activity.length > 0 ? activity[0].name : null
this.pageForm.applyType = activity[0].applyType
const resp = await $.get(loc() + "/getData", this.pageForm)
this.tabLoading = false
if (resp.code === 0) {
const v = resp.data
if (v.length) {
/* if (activity[0].applyType == 2) {*/
v.forEach(x => {
const leaders = x.apply.filter(i => {
return i.unionLeader
})
x.leader = {}
if (leaders.length) {
x.leader = leaders[0]
}
const coachs = x.apply.filter(i => {
return i.unionCoach
})
x.coach = {}
if (coachs.length) {
x.coach = coachs[0]
}
const heads = x.apply.filter(i => {
return i.unionHead
})
x.head = {}
if (heads.length) {
x.head = heads[0]
}
const staffs = x.apply.filter(i => {
return i.unionStaff
})
x.staff = {}
if (staffs.length) {
x.staff = staffs[0]
}
x.apply = x.apply.filter(i => {
return !i.unionLeader && !i.unionCoach && !i.unionHead && !i.unionStaff
})
})
/*}*//* else {
v.forEach(x => {
const leaders = x.apply.filter(i => {
return i.identity.includes(3)
})
x.leader = {}
if (leaders.length) {
x.leader = leaders[0]
}
const coachs = x.apply.filter(i => {
return i.identity.includes(2)
})
x.coach = {}
if (coachs.length) {
x.coach = coachs[0]
}
x.apply = x.apply.filter(i => {
return i.identity.includes(1)
})
})
}*/
v.sort((a, b) => {
return b.num - a.num
})
this.unions = v.map(v => {
return {id: v.id, unionname: v.unionname}
})
if (this.unions.length == 1) {
this.pageForm.unionid = this.unions[0].id
}
this.rootData = JSON.parse(JSON.stringify(v))
this.rootData.forEach(x => {
x.apply2 = clone(x.apply)
})
this.noneData = false
} else {
this.unions = []
this.pageForm.unionid = ""
this.noneData = true
}
if (this.pageForm.activityLevel !== '40001' && this.rootData && this.rootData.length > 0) {
this.$set(this.rootData[0], "show", true)
}
this.apply = this.rootData
this.tableKey = new Date().getTime()
} else {
this.notifyWarning(resp.msg)
this.noneData = true
}
},
async getActivityTypeList(code) {
const {data} = await $.get("/platform/activity/basic/basic/settings/getActivityTwoLevelType", {code: code})
return data;
},
},
async created() {
await this.changeActivit()
this.activityTypeList = await this.getActivityTypeList("40000")
this.$set(this.pageForm, "activityLevel", this.activityTypeList[0].code)
await this.getNearActivity()
}
})
</script>
<!--#
}
#-->