first commit
This commit is contained in:
@@ -0,0 +1,630 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch()">
|
||||
<search-item label="">
|
||||
<el-checkbox-group @change="doSearch" v-model="pageForm.isMenWomen">
|
||||
<el-checkbox-button :key="2" :label="2">男子</el-checkbox-button>
|
||||
<el-checkbox-button :key="3" :label="3">女子</el-checkbox-button>
|
||||
<el-checkbox-button :key="4" :label="4">个人</el-checkbox-button>
|
||||
<el-checkbox-button :key="5" :label="5">团体</el-checkbox-button>
|
||||
</el-checkbox-group>
|
||||
</search-item>
|
||||
|
||||
<search-item label="比赛组别">
|
||||
<el-select @focus="focusGroup" clearable placeholder="请选择比赛组别"
|
||||
style="width: 100%" v-model="pageForm.group">
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id"
|
||||
v-for="item in groupList"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="运动类型">
|
||||
<el-select
|
||||
@focus="exerciseType"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="请选择运动类型"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.events"
|
||||
>
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id"
|
||||
v-for="item in exerciseTypeList"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="比赛项目列表">
|
||||
<el-input @input="ageInput" placeholder="输入年龄算出身年" size="small"
|
||||
style="width: auto" type="number" v-model="pageForm.age">
|
||||
<template slot="prepend">年龄计算器</template>
|
||||
</el-input>
|
||||
<el-tag class="ml10">{{ pageForm.ageYear }}</el-tag>
|
||||
<el-date-picker
|
||||
class="ml10"
|
||||
end-placeholder="结束日期"
|
||||
format="yyyy 年 MM 月 dd 日"
|
||||
range-separator="-"
|
||||
size="small"
|
||||
start-placeholder="开始日期"
|
||||
type="daterange"
|
||||
v-model="pageForm.ageDate"
|
||||
value-format="yyyy-MM-dd"
|
||||
></el-date-picker>
|
||||
<el-button @click="doAssignmentDate" class="ml10" icon="el-icon-check"
|
||||
size="small" type="primary">统赋年龄限制
|
||||
</el-button>
|
||||
<el-button @click="openAdd" icon="el-icon-edit-outline" size="small"
|
||||
type="primary">创建比赛项目
|
||||
</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-table
|
||||
:data="tableData"
|
||||
:size="tableSize"
|
||||
@selection-change="handleSelectionChange"
|
||||
@sort-change="pageOrder"
|
||||
class="vi-table"
|
||||
ref="multipleTable"
|
||||
row-key="id"
|
||||
style="width: 100%; margin-bottom: 20px"
|
||||
v-loading="tableLoading"
|
||||
>
|
||||
<el-table-column :reserve-selection="true" type="selection"
|
||||
width="55"></el-table-column>
|
||||
<el-table-column
|
||||
:index="indexMethod"
|
||||
align="center"
|
||||
header-align="center"
|
||||
label="序号"
|
||||
type="index"
|
||||
width="80px"
|
||||
></el-table-column>
|
||||
<el-table-column
|
||||
:key="column.prop"
|
||||
: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=='baname'">
|
||||
<span>{{row.baname!=null?row.baname:'暂无'}}</span>
|
||||
</template>
|
||||
<template scope="{row}" v-else-if="column.prop=='diname'">
|
||||
<span>{{row.diname!=null?row.diname:'暂无'}}</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='isMenWomen'">
|
||||
<span v-if="row.isMenWomen==1">男子</span>
|
||||
<span v-if="row.isMenWomen==2">女子</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='spname'">
|
||||
<span>{{row.spname!=null?row.spname:''}}</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='projectType'">
|
||||
<span>{{row.projectType=='1'?'个人':'团体'}}</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='note'">
|
||||
<span>{{row.note!=''?row.note:'暂无'}}</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='whetherEnable'">
|
||||
<el-switch
|
||||
@change="switchChange(row)"
|
||||
active-color="#13ce66"
|
||||
inactive-color="#ff4949"
|
||||
v-model="row.whetherEnable"
|
||||
></el-switch>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" header-align="center" label="操作"
|
||||
prop="userOnline" width="150px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="openEdit(row)" size="mini" type="primary">编辑
|
||||
</el-button>
|
||||
<el-button @click="doDelete(row)" size="mini" type="danger">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<template #edit>
|
||||
<table-tool label="填写比赛项目信息"></table-tool>
|
||||
|
||||
<el-form :model="formData" :rules="formRules" label-suffix=":" label-width="120px"
|
||||
ref="form">
|
||||
<el-row :gutter="40">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="是否趣味项目" prop="isInterest">
|
||||
<el-checkbox v-model="formData.isInterest">
|
||||
{{formData.isInterest?'是趣味':'不是趣味'}}
|
||||
</el-checkbox>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="比赛项目编号" prop="projectCode">
|
||||
<el-input placeholder="请填写比赛项目编号"
|
||||
v-model="formData.projectCode"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="性别" prop="isMenWomen">
|
||||
<el-select
|
||||
allow-create
|
||||
clearable
|
||||
default-first-option
|
||||
filterable
|
||||
placeholder="请选择男女分组"
|
||||
style="width: 100%"
|
||||
v-model="formData.isMenWomen"
|
||||
>
|
||||
<el-option :key="item.id" :label="item.name"
|
||||
:value="item.id" v-for="item in menWomenList"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="比赛组别" prop="competitionCategory">
|
||||
<el-select
|
||||
@focus="focusGroup"
|
||||
clearable
|
||||
placeholder="请选择比赛组别"
|
||||
style="width: 100%"
|
||||
v-model="formData.competitionCategory"
|
||||
>
|
||||
<el-option
|
||||
:key="item.id"
|
||||
:label="item.name+'('+item.code+')'"
|
||||
:value="item.id"
|
||||
v-for="item in groupList"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="距离" prop="distance">
|
||||
<el-select @focus="focusDistance" clearable
|
||||
placeholder="请选择距离" style="width: 100%" v-model="formData.distance">
|
||||
<el-option :key="item.id" :label="item.name"
|
||||
:value="item.id" v-for="item in distanceList"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="运动类型" prop="exerciseType">
|
||||
<el-select
|
||||
@change="changeExercise_typeList"
|
||||
@focus="exerciseType"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="请选择运动类型"
|
||||
style="width: 100%"
|
||||
v-model="formData.exerciseType"
|
||||
>
|
||||
<el-option :key="item.id" :label="item.name"
|
||||
:value="item.id" v-for="item in exerciseTypeList"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="运动项目" prop="sports">
|
||||
<el-select clearable placeholder="请选择具体运动项目" style="width: 100%"
|
||||
v-model="formData.sports">
|
||||
<el-option :key="item.id" :label="item.name"
|
||||
:value="item.id" v-for="item in exerciseTypeList2"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="项目类型" prop="projectType">
|
||||
<el-select
|
||||
allow-create
|
||||
clearable
|
||||
default-first-option
|
||||
filterable
|
||||
placeholder="请选择具体运动项目"
|
||||
style="width: 100%"
|
||||
v-model="formData.projectType"
|
||||
>
|
||||
<el-option :key="item.id" :label="item.name"
|
||||
:value="item.id" v-for="item in projectTypeList"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="年龄限制范围" prop="ageDate" v-if="formData.projectType==1">
|
||||
<el-date-picker
|
||||
end-placeholder="结束日期"
|
||||
format="yyyy 年 MM 月 dd 日"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
style="width: 100%"
|
||||
type="daterange"
|
||||
v-model="formData.ageDate"
|
||||
value-format="yyyy-MM-dd"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div style="float: right; margin: 20px 0">
|
||||
<el-button @click="formData.id?doEdit():doAdd()" type="primary">提 交</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
age: 1,
|
||||
ageYear: null,
|
||||
activityId: null,
|
||||
ageDate: null,
|
||||
isMenWomen: []
|
||||
},
|
||||
|
||||
groupList: [],
|
||||
exerciseTypeList: [],
|
||||
distanceList: [],
|
||||
exerciseTypeList2: [],
|
||||
|
||||
tableColumns: [
|
||||
{ prop: "projectCode", label: "项目编号", sortable: true },
|
||||
{ prop: "allName", label: "全称", width: "200" },
|
||||
{ prop: "isMenWomen", label: "男子/女子", sortable: true },
|
||||
{ prop: "baname", label: "比赛组别", sortable: true },
|
||||
{ prop: "diname", label: "距离", sortable: true },
|
||||
{ prop: "exename", label: "运动类型", sortable: true },
|
||||
{ prop: "spname", label: "运动项目", sortable: true },
|
||||
{ prop: "projectType", label: "项目类型", sortable: true },
|
||||
{ prop: "whetherEnable", label: "是否启用" }
|
||||
],
|
||||
|
||||
multipleSelection: [],
|
||||
|
||||
projectTypeList: [
|
||||
{ id: "1", name: "个人" },
|
||||
{ id: "2", name: "团体" }
|
||||
],
|
||||
menWomenList: [
|
||||
{ id: 1, name: "男子" },
|
||||
{ id: 2, name: "女子" }
|
||||
],
|
||||
|
||||
formRules: {
|
||||
exerciseType: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
projectType: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
projectCode: [{ required: true, message: "必填", trigger: ["change", "blur"] }]
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
doAdd() {
|
||||
this.$refs["form"].validate(async (valid) => {
|
||||
if (valid) {
|
||||
const { data } = await this.$axios.post(loc() + "/getProjectCodeIsExist", { projectCode: this.formData.projectCode })
|
||||
if (data) {
|
||||
this.$message.error("编号已存在")
|
||||
return
|
||||
}
|
||||
let allName = ""
|
||||
this.groupList.find((v) => {
|
||||
if (v.id === this.formData.competitionCategory) {
|
||||
allName += v.name
|
||||
}
|
||||
})
|
||||
|
||||
this.menWomenList.find((v) => {
|
||||
if (v.id === this.formData.isMenWomen) {
|
||||
allName += v.name
|
||||
}
|
||||
})
|
||||
|
||||
this.distanceList.find((v) => {
|
||||
if (v.id === this.formData.distance) {
|
||||
allName += v.name + "米"
|
||||
}
|
||||
})
|
||||
|
||||
/* this.exerciseTypeList.find(v => {
|
||||
if (v.id === this.formData.exerciseType) {
|
||||
allName += v.name
|
||||
}
|
||||
})*/
|
||||
|
||||
this.exerciseTypeList2.find((v) => {
|
||||
if (v.id === this.formData.sports) {
|
||||
allName += v.name
|
||||
}
|
||||
})
|
||||
|
||||
/* this.projectTypeList.find(v => {
|
||||
if (v.id === this.formData.projectType) {
|
||||
allName += "(" + v.name + ")"
|
||||
}
|
||||
})*/
|
||||
|
||||
this.formData.allName = allName
|
||||
if (this.formData.ageDate && this.formData.ageDate.length > 0) {
|
||||
this.formData.startAgeDate = this.formData.ageDate[0]
|
||||
this.formData.endAgeDate = this.formData.ageDate[1]
|
||||
}
|
||||
|
||||
this.loading = true
|
||||
const resp = await this.$axios.post(loc() + "/doAdd", this.formData)
|
||||
this.loading = false
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
this.$refs.guava.index()
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
doEdit() {
|
||||
this.$refs["form"].validate(async (valid) => {
|
||||
if (valid) {
|
||||
if (this.formData.oldProjectCode !== this.formData.projectCode) {
|
||||
const { data } = await this.$axios.post(loc() + "/getProjectCodeIsExist", { projectCode: this.formData.projectCode })
|
||||
if (data) {
|
||||
this.$message.error("编号已存在")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let allName = ""
|
||||
|
||||
this.groupList.find((v) => {
|
||||
if (v.id === this.formData.competitionCategory) {
|
||||
allName += v.name
|
||||
}
|
||||
})
|
||||
|
||||
this.menWomenList.find((v) => {
|
||||
if (v.id === this.formData.isMenWomen) {
|
||||
allName += v.name
|
||||
}
|
||||
})
|
||||
|
||||
this.distanceList.find((v) => {
|
||||
if (v.id === this.formData.distance) {
|
||||
allName += v.name + "米"
|
||||
}
|
||||
})
|
||||
|
||||
/* this.exerciseTypeList.find(v => {
|
||||
if (v.id === this.formData.exerciseType) {
|
||||
allName += v.name
|
||||
}
|
||||
})*/
|
||||
|
||||
this.exerciseTypeList2.find((v) => {
|
||||
if (v.id === this.formData.sports) {
|
||||
allName += v.name
|
||||
}
|
||||
})
|
||||
|
||||
/* this.projectTypeList.find(v => {
|
||||
if (v.id === this.formData.projectType) {
|
||||
allName += "(" + v.name + ")"
|
||||
}
|
||||
})*/
|
||||
|
||||
this.formData.allName = allName
|
||||
if (this.formData.ageDate && this.formData.ageDate.length > 0) {
|
||||
this.formData.startAgeDate = this.formData.ageDate[0]
|
||||
this.formData.endAgeDate = this.formData.ageDate[1]
|
||||
}
|
||||
|
||||
this.loading = true
|
||||
const resp = await this.$axios.post(loc() + "/doEdit", this.formData)
|
||||
this.loading = true
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
this.$refs.guava.index()
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
openEdit(data) {
|
||||
this.focusGroup()
|
||||
this.exerciseType()
|
||||
this.focusDistance()
|
||||
this.formData = {
|
||||
id: data.id,
|
||||
isInterest: data.isInterest,
|
||||
competitionCategory: data.competitionCategory,
|
||||
distance: data.distance,
|
||||
exerciseType: data.exerciseType,
|
||||
sports: data.sports,
|
||||
projectType: data.projectType,
|
||||
note: data.note,
|
||||
isMenWomen: data.isMenWomen,
|
||||
projectCode: data.projectCode,
|
||||
oldProjectCode: data.projectCode,
|
||||
whetherEnable: data.whetherEnable
|
||||
}
|
||||
if (data.startAgeDate != null) {
|
||||
this.$set(this.formData, "ageDate", [data.startAgeDate, data.endAgeDate])
|
||||
}
|
||||
|
||||
this.changeExercise_typeList()
|
||||
this.$refs.guava.edit()
|
||||
},
|
||||
doDelete(row) {
|
||||
const { id } = row
|
||||
this.$confirm("确定要删除该项目吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
callback: async (a, b) => {
|
||||
if ("confirm" === a) {
|
||||
//确认后再执行
|
||||
this.$set(row, "loading", true)
|
||||
const resp = await this.$axios.post(loc() + "/doDelete", { id: id })
|
||||
this.$set(row, "loading", false)
|
||||
if (resp.code === 0) {
|
||||
this.doSearch()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
handleSelectionChange(val) {
|
||||
this.multipleSelection = val
|
||||
},
|
||||
//查询比赛组别
|
||||
async focusGroup() {
|
||||
const resp = await this.$axios.post(loc() + "/focusGroup")
|
||||
if (resp.code === 0) {
|
||||
this.groupList = resp.data
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
//查询运动类型
|
||||
async exerciseType() {
|
||||
const resp = await this.$axios.post(loc() + "/exerciseType")
|
||||
if (resp.code === 0) {
|
||||
this.exerciseTypeList = resp.data
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
//根据运动id查询下面有哪些具体的运动项目
|
||||
async changeExercise_typeList() {
|
||||
const resp = await this.$axios.post(loc() + "/changeExercise_typeList", { exerciseType: this.formData.exerciseType })
|
||||
if (resp.code === 0) {
|
||||
this.exerciseTypeList2 = resp.data
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
//查询距离
|
||||
async focusDistance() {
|
||||
const resp = await this.$axios.post(loc() + "/focusDistance")
|
||||
if (resp.code === 0) {
|
||||
this.distanceList = resp.data
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
ageInput(val) {
|
||||
const year = new Date().getFullYear()
|
||||
this.$set(this.pageForm, "ageYear", year - val)
|
||||
},
|
||||
async doAssignmentDate() {
|
||||
const aa = this.multipleSelection.map((v) => {
|
||||
if (v.isInterest) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
})
|
||||
if (aa.find((v) => v == true)) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "您勾选的列表中包含趣味项目,趣味项目暂不需要年龄限制",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
if (this.multipleSelection.length === 0) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "请先在旁边勾选需要设置的项目",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (this.pageForm.ageDate == null) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "请选择需要赋值的时间段",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
const confirm = await this.$confirm("确定要勾选的项目赋年龄限制吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
if (confirm === "confirm") {
|
||||
const data = await this.$axios.post(loc() + "/doAssignmentDate", {
|
||||
startAgeDate: this.pageForm.ageDate[0],
|
||||
endAgeDate: this.pageForm.ageDate[1],
|
||||
eventIds: JSON.stringify(this.multipleSelection.map((v) => v.id))
|
||||
})
|
||||
this.$notify.success({ title: "成功", message: data.msg })
|
||||
this.$refs.multipleTable.clearSelection()
|
||||
this.doSearch()
|
||||
}
|
||||
},
|
||||
openAdd() {
|
||||
this.$refs.guava.edit()
|
||||
if (this.$refs["form"]) {
|
||||
this.$refs["form"].resetFields()
|
||||
}
|
||||
this.formData = {}
|
||||
},
|
||||
pageData() {
|
||||
this.tabLoading = true
|
||||
const pageForm = clone(this.pageForm)
|
||||
pageForm.isMenWomen = JSON.stringify(pageForm.isMenWomen)
|
||||
this.$axios.post("/platform/activity/basic/event/pageData", pageForm).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
},
|
||||
async created() {
|
||||
this.pageData()
|
||||
this.ageInput(this.pageForm.age)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,228 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-row :gutter="10" type="flex" style="height: calc(100vh - 126px)">
|
||||
<el-col :span="5">
|
||||
<el-card shadow="never" style="height: 100%" body-style="{ height: '100%' }">
|
||||
<div style="max-height: calc(100vh - 170px); overflow-y: auto">
|
||||
<el-tree
|
||||
:data="treeData"
|
||||
:default-expanded-keys="['7e3f5fcbc24f442dbb3a6cc9412e7960']"
|
||||
:expand-on-click-node="false"
|
||||
:filter-node-method="filterNode"
|
||||
:props="{
|
||||
children: 'child',
|
||||
label: 'name'
|
||||
}"
|
||||
@node-click="treeNodeClick"
|
||||
highlight-current
|
||||
node-key="id"
|
||||
ref="treeRef"
|
||||
></el-tree>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="19">
|
||||
<el-card shadow="never" style="height: 100%">
|
||||
<table-tool>
|
||||
<el-button @click="openBasicType" size="small" type="primary">
|
||||
<i class="el-icon-plus"></i>
|
||||
新建基础类型
|
||||
</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" border size="small">
|
||||
<el-table-column label="序号" type="index" width="100px">
|
||||
<template scope="scope">
|
||||
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="名称" prop="name"></el-table-column>
|
||||
<el-table-column align="center" label="代码" prop="code"></el-table-column>
|
||||
<el-table-column align="center" label="备注" prop="note" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column align="center" label="操作" width="100px">
|
||||
<template slot-scope="{row}">
|
||||
<el-dropdown @command="dropdownCommand">
|
||||
<el-button plain size="mini">
|
||||
<i class="ti-settings"></i>
|
||||
<span class="ti-angle-down"></span>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item :command="{type:'edit',data:row}">编辑</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'delete',data:row}">删除</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<el-pagination
|
||||
:current-page="pageForm.pageNumber"
|
||||
:page-size="pageForm.pageSize"
|
||||
:page-sizes="[10, 20, 30, 50]"
|
||||
:total="pageForm.totalCount"
|
||||
@current-change="(val)=>{pageForm.pageNumber = val;pageData()}"
|
||||
@size-change="(val)=>{pageForm.pageSize = val;pageData()}"
|
||||
layout="total, sizes, prev, pager, next"
|
||||
></el-pagination>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-dialog :close-on-click-modal="false" :title="formData.id?'编辑':'新增'" :visible.sync="basicTypeDialog" width="50%">
|
||||
<el-form :model="formData" :rules="rules" label-width="100px" ref="addForm">
|
||||
<el-row :gutter="30">
|
||||
<el-form-item label="上级名称" label-width="110px" prop="name">
|
||||
<el-input :value="checkData.name" disabled maxlength="100" type="text"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="基础类型名称" label-width="110px" prop="name">
|
||||
<el-input maxlength="100" placeholder="请输入基础类型名称" type="text" v-model="formData.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="基础类型代码" label-width="110px" prop="code">
|
||||
<el-input maxlength="100" placeholder="请输入基础类型名称" type="text" v-model="formData.code"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="基础类型备注" label-width="110px" prop="note">
|
||||
<el-input maxlength="100" placeholder="请输入基础类型备注" type="textarea" v-model="formData.note"></el-input>
|
||||
</el-form-item>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div style="display: flex; justify-content: flex-end; margin-top: 30px">
|
||||
<el-button @click="!formData.id?doAddType():doEditType()" type="primary">提 交</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
filterText: null,
|
||||
treeData: [],
|
||||
|
||||
currentTreeNode: null,
|
||||
currentTreeData: null,
|
||||
|
||||
checkData: {},
|
||||
tableData: [],
|
||||
|
||||
basicTypeDialog: false,
|
||||
|
||||
rules: {
|
||||
name: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
code: [{ required: true, message: "必填", trigger: ["change", "blur"] }]
|
||||
},
|
||||
|
||||
pageForm: {
|
||||
parentId: null
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
treeNodeClick(data, node) {
|
||||
this.currentTreeData = data
|
||||
this.currentTreeNode = node
|
||||
this.checkData = data
|
||||
this.pageForm.parentId = data.id
|
||||
this.doSearch()
|
||||
},
|
||||
filterNode() {},
|
||||
|
||||
getTreeData() {
|
||||
this.$axios.post(loc() + "/tree").then((res) => {
|
||||
this.treeData = res.data
|
||||
if (this.treeData) {
|
||||
this.checkData = this.treeData[0]
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
dropdownCommand: function (command) {
|
||||
const { type, data } = command
|
||||
if (type == "edit") {
|
||||
this.openEditType(data)
|
||||
} else if (type == "delete") {
|
||||
this.doDelete(data.id)
|
||||
}
|
||||
},
|
||||
|
||||
async openBasicType() {
|
||||
const { id } = this.checkData
|
||||
this.formData = {
|
||||
parentId: id
|
||||
}
|
||||
this.basicTypeDialog = true
|
||||
if (this.$refs["addForm"]) {
|
||||
this.$refs["addForm"].resetFields()
|
||||
}
|
||||
},
|
||||
doAddType() {
|
||||
this.$refs["addForm"].validate(async (valid) => {
|
||||
if (valid) {
|
||||
const resp = await this.$axios.post(loc() + "/doAdd", this.formData)
|
||||
if (resp.code === 0) {
|
||||
this.basicTypeDialog = false
|
||||
this.doSearch()
|
||||
this.getTreeData()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
doEditType() {
|
||||
this.$refs["addForm"].validate(async (valid) => {
|
||||
if (valid) {
|
||||
const resp = await this.$axios.post(loc() + "/doEditType", this.formData)
|
||||
this.basicTypeDialog = false
|
||||
if (resp.code === 0) {
|
||||
this.doSearch()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
openEditType(row) {
|
||||
this.formData = {
|
||||
id: row.id,
|
||||
name: row.name,
|
||||
code: row.code,
|
||||
note: row.note
|
||||
}
|
||||
this.basicTypeDialog = true
|
||||
},
|
||||
doDelete(id) {
|
||||
this.$confirm("确定要删除该机构吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
callback: async (a, b) => {
|
||||
if ("confirm" == a) {
|
||||
const resp = await this.$axios.post(loc() + "/doDelete", { id: id })
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
this.getTreeData()
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
this.getTreeData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
const ACTIVITY_BASIC_BRANCH_UNION_MANAGE = {
|
||||
template: `
|
||||
<div>
|
||||
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter)">
|
||||
<div class="search">
|
||||
<div class="search-item">
|
||||
<el-input placeholder="请输入分工会名称" clearable v-model="pageForm.searchKeyword"></el-input>
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter); margin-top: 10px">
|
||||
<table-tool>
|
||||
<el-button @click="openAdd" icon="ti-plus" type="primary" style="margin-left: auto" size="small">新建临时分工会</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" border size="small" height="calc(100vh - 375px)">
|
||||
<el-table-column label="序号" type="index" :index="indexMethod" width="100px"></el-table-column>
|
||||
<el-table-column prop="name" label="工会名称"></el-table-column>
|
||||
<el-table-column prop="unionCode" label="工会编码"></el-table-column>
|
||||
<el-table-column prop="userNames" label="管理员"></el-table-column>
|
||||
<el-table-column label="操作" width="290">
|
||||
<template slot-scope="{row}">
|
||||
<el-button size="mini" @click="openAdmin(row.id)">设置管理员</el-button>
|
||||
<el-button type="primary" size="mini" @click="openEdit(row.id)">编辑</el-button>
|
||||
<el-button type="danger" size="mini" @click="doDeleteUnion(row.id,true)" v-if="row.unitnum===0">删除</el-button>
|
||||
<el-button type="danger" size="mini"
|
||||
v-if="row.unitnum>0&&row.source==='activity'"
|
||||
@click="doDeleteUnion(row.id,false)">还原单位
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
<el-dialog :title="formData.id ? '编辑分工会' : '新增分工会'" :visible.sync="dialogFormVisible" width="600px">
|
||||
<el-form :model="formData" ref="form" size="small" label-width="80px">
|
||||
<el-form-item label="工会名称">
|
||||
<el-input v-model="formData.name" maxlength="100" placeholder="工会名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="工会编码">
|
||||
<el-input v-model="formData.unionCode" maxlength="100" placeholder="工会编码"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="联系电话">
|
||||
<el-input v-model="formData.telephone" maxlength="100" placeholder="联系电话"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="校区" prop="campus">
|
||||
<el-select v-model="formData.campus" maxlength="20" placeholder="校区"></el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="doSubmit">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<el-dialog title="设置管理员" :visible.sync="dialogGlyFormVisible" width="50%">
|
||||
<div style="width: 100%;">
|
||||
<el-transfer
|
||||
:titles="['单位成员', '管理员']"
|
||||
filterable
|
||||
:props="{
|
||||
key: 'id',
|
||||
label: 'name'
|
||||
}"
|
||||
:filter-method="adminFilterMethod"
|
||||
v-model="userAdminIds"
|
||||
:data="userData">
|
||||
</el-transfer>
|
||||
</div>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogGlyFormVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="doSubmitAdmin">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
`,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
dialogFormVisible: false,
|
||||
dialogGlyFormVisible: false,
|
||||
formData: {},
|
||||
userData: [],
|
||||
userAdminIds: [],
|
||||
unionId: ""
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
pageData() {
|
||||
this.$axios.post("/platform/activity/basic/union/pageData", this.pageForm).then((res) => {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
})
|
||||
},
|
||||
openAdd() {
|
||||
this.dialogFormVisible = true
|
||||
this.$nextTick(() => {
|
||||
this.formData = {}
|
||||
})
|
||||
},
|
||||
openEdit(id) {
|
||||
this.dialogFormVisible = true
|
||||
this.$axios.post("/platform/activity/basic/union/findOne", { id }).then((res) => {
|
||||
this.formData = res.data
|
||||
})
|
||||
},
|
||||
doSubmit() {
|
||||
this.$axios.post("/platform/activity/basic/union/" + (this.formData.id ? "update" : "insert"), this.formData).then((res) => {
|
||||
this.dialogFormVisible = false
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
this.$emit("refresh", null)
|
||||
})
|
||||
},
|
||||
doDeleteUnion(id, flag) {
|
||||
let msg = flag ? "请确认是否要删除本联合工会,一旦删除相关数据将无法查询!!!" : "选择后系统将组成单位还原到所在分工会!!!"
|
||||
|
||||
this.$confirm(msg, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(() => {
|
||||
this.$axios.post("/platform/activity/basic/union/doDeleteUnion", { id, flag }).then((res) => {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
this.$emit("refresh", null)
|
||||
})
|
||||
})
|
||||
},
|
||||
adminFilterMethod(query, item) {
|
||||
return item.name.indexOf(query) > -1
|
||||
},
|
||||
openAdmin(id) {
|
||||
this.unionId = id
|
||||
this.$axios.post("/platform/activity/basic/union/getUnionAdminAndUser", { id: id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.userData = res.data.userData
|
||||
this.userAdminIds = res.data.userAdminIds
|
||||
}
|
||||
})
|
||||
this.dialogGlyFormVisible = true
|
||||
},
|
||||
doSubmitAdmin() {
|
||||
this.$axios
|
||||
.post("/platform/activity/basic/union/doSubmitAdmin", {
|
||||
unionId: this.unionId,
|
||||
userIds: JSON.stringify(this.userAdminIds)
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.doSearch()
|
||||
this.$message.success(res.msg)
|
||||
} else {
|
||||
this.$message.error(res.msg)
|
||||
}
|
||||
})
|
||||
this.dialogGlyFormVisible = false
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
}
|
||||
}
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
const ACTIVITY_BASIC_BRANCH_UNION_PART_UNIT_MANAGE = {
|
||||
template: `
|
||||
<div>
|
||||
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter); margin-top: 10px">
|
||||
<el-row type="flex" style="column-gap: 10px">
|
||||
<el-input
|
||||
placeholder="请输入内容"
|
||||
size="small"
|
||||
style="width: 400px"
|
||||
clearable
|
||||
v-model="pageForm.searchKeyword"
|
||||
@keyup.enter.native="doSearch"
|
||||
></el-input>
|
||||
<el-button type="primary" size="small" icon="el-icon-search" @click="doSearch"></el-button>
|
||||
<el-button type="primary" size="small" icon="el-icon-setting" style="margin-left: auto" @click="openAdd">设置组成单位</el-button>
|
||||
</el-row>
|
||||
</el-card>
|
||||
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter); margin-top: 10px">
|
||||
<el-table :data="tableData" border size="small">
|
||||
<el-table-column type="index" label="序号"></el-table-column>
|
||||
<el-table-column prop="unitcode" label="单位编码"></el-table-column>
|
||||
<el-table-column prop="name" label="单位名称"></el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
|
||||
<el-dialog title="设置组成单位" :visible.sync="dialogFormVisible" width="1000px" :close-on-click-modal="false">
|
||||
<el-transfer
|
||||
ref="transferRef"
|
||||
:titles="['可选二级单位', '当前成员单位']"
|
||||
filterable
|
||||
:props="{
|
||||
key: 'id',
|
||||
label: 'name'
|
||||
}"
|
||||
:filter-method="filterUnit"
|
||||
v-model="selectUnitsIds"
|
||||
:data="allUnits"
|
||||
></el-transfer>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="doSubmit">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
`,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
dialogFormVisible: false,
|
||||
selectUnitsIds: [],
|
||||
allUnits: [],
|
||||
unionId: ""
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
openAdd() {
|
||||
this.dialogFormVisible = true
|
||||
if (this.$refs.transferRef) {
|
||||
this.$refs.transferRef.clearQuery("left")
|
||||
this.$refs.transferRef.clearQuery("right")
|
||||
}
|
||||
this.$axios.post("/platform/activity/basic/union/branchUnionPartUnitTransferData", { unionId: this.unionId }).then((res) => {
|
||||
this.selectUnitsIds = res.data.selectUnitIds
|
||||
this.allUnits = res.data.allUnits
|
||||
})
|
||||
},
|
||||
|
||||
filterUnit(query, item) {
|
||||
return item.name.indexOf(query) > -1
|
||||
},
|
||||
|
||||
doSubmit() {
|
||||
this.$axios
|
||||
.post("/platform/activity/basic/union/branchUnionPartUnitSet", {
|
||||
unitIds: JSON.stringify(this.selectUnitsIds),
|
||||
unionId: this.unionId
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.dialogFormVisible = false
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
pageData(unionId) {
|
||||
if (unionId) {
|
||||
this.unionId = unionId
|
||||
}
|
||||
this.$axios
|
||||
.post("/platform/activity/basic/union/branchUnionPartUnitPageData", {
|
||||
...this.pageForm,
|
||||
unionId: this.unionId
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-row :gutter="10" type="flex" style="height: calc(100vh - 126px)">
|
||||
<el-col :span="5">
|
||||
<el-card shadow="never" style="height: 100%" body-style="{ height: '100%' }">
|
||||
<div style="max-height: calc(100vh - 160px); overflow-y: auto">
|
||||
<el-tree
|
||||
:data="treeData"
|
||||
:expand-on-click-node="false"
|
||||
:props="{
|
||||
children: 'children',
|
||||
label: 'name'
|
||||
}"
|
||||
@node-click="treeNodeClick"
|
||||
default-expand-all
|
||||
highlight-current
|
||||
ref="treeRef"
|
||||
></el-tree>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="19">
|
||||
<el-card style="height: 100%" shadow="never">
|
||||
<template v-if="currentTreeNode==null || currentTreeNode.level===1">
|
||||
<activity-basic-branch-union-manage @refresh="getTreeData()"></activity-basic-branch-union-manage>
|
||||
</template>
|
||||
<template v-if="currentTreeNode && currentTreeNode.level===2">
|
||||
<activity-basic-branch-union-part-unit-manage ref="unitManage"></activity-basic-branch-union-part-unit-manage>
|
||||
</template>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("activityBasicBranchUnionManage.js"){}#-->
|
||||
<!--#include("activityBasicBranchUnionPartUnitManage.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
treeData: [],
|
||||
currentTreeNode: null,
|
||||
currentTreeData: null
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-basic-branch-union-manage": ACTIVITY_BASIC_BRANCH_UNION_MANAGE,
|
||||
"activity-basic-branch-union-part-unit-manage": ACTIVITY_BASIC_BRANCH_UNION_PART_UNIT_MANAGE
|
||||
},
|
||||
methods: {
|
||||
treeNodeClick(data, node) {
|
||||
this.currentTreeData = data
|
||||
this.currentTreeNode = node
|
||||
if (node.level === 2) {
|
||||
setTimeout(() => {
|
||||
this.$refs.unitManage.pageData(data.id)
|
||||
}, 300)
|
||||
}
|
||||
},
|
||||
getTreeData() {
|
||||
this.$axios.post(loc() + "/tree").then((res) => {
|
||||
this.treeData = res.data
|
||||
if (this.treeData) {
|
||||
this.checkData = this.treeData[0]
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
this.getTreeData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,141 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-row :gutter="10" type="flex" style="height: calc(100vh - 126px)">
|
||||
<el-col :span="5">
|
||||
<el-card shadow="never" style="height: 100%" body-style="{ height: '100%' }">
|
||||
<div style="max-height: calc(100vh - 160px); overflow-y: auto">
|
||||
<el-tree
|
||||
:data="treeData"
|
||||
:default-expanded-keys="['1']"
|
||||
:expand-on-click-node="false"
|
||||
:props="{
|
||||
children: 'child',
|
||||
label: 'name'
|
||||
}"
|
||||
@node-click="treeNodeClick"
|
||||
highlight-current
|
||||
node-key="id"
|
||||
ref="treeRef"
|
||||
></el-tree>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="19">
|
||||
<el-card shadow="never" style="height: 100%">
|
||||
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter)">
|
||||
<div class="search">
|
||||
<div class="search-item" style="width: 25%">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入内容"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.searchKeyword"
|
||||
>
|
||||
<el-select placeholder="查询类型" slot="prepend" style="width: 110px" v-model="pageForm.searchName">
|
||||
<el-option label="单位名称" value="name"></el-option>
|
||||
<el-option label="单位代码" value="unitcode"></el-option>
|
||||
</el-select>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter)">
|
||||
<table-tool></table-tool>
|
||||
<el-table :data="tableData" height="calc(100vh - 380px)" border size="small">
|
||||
<el-table-column label="序号" type="index">
|
||||
<template scope="scope">
|
||||
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="单位名称" prop="name"></el-table-column>
|
||||
<el-table-column align="center" label="单位代码" prop="unitcode"></el-table-column>
|
||||
<el-table-column align="center" label="单位等级" prop="unitLevel">
|
||||
<template slot-scope="{row}">
|
||||
<el-button round size="mini" style="vertical-align: middle" type="success" v-if="row.unitLevel==1">1级</el-button>
|
||||
<el-button round size="mini" style="vertical-align: middle" type="warning" v-if="row.unitLevel==2">2级</el-button>
|
||||
<el-button round size="mini" style="vertical-align: middle" type="danger" v-if="row.unitLevel==3">3级</el-button>
|
||||
<el-button round size="mini" style="vertical-align: middle" type="info" v-if="row.unitLevel>3">
|
||||
{{row.unitlevel}}级
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="操作" width="100px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
searchName: "name"
|
||||
},
|
||||
treeData: [],
|
||||
currentTreeNode: null,
|
||||
currentTreeData: null
|
||||
}
|
||||
},
|
||||
components: {},
|
||||
methods: {
|
||||
async doDelete(id) {
|
||||
const confirm = await this.$confirm("确定要删除该单位吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
if (confirm === "confirm") {
|
||||
const resp = await this.$axios.post(loc() + "/doDelete", { id })
|
||||
if (resp.code === 0) {
|
||||
this.getTreeData()
|
||||
this.doSearch()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
},
|
||||
treeNodeClick(data, node) {
|
||||
this.currentTreeData = data
|
||||
this.currentTreeNode = node
|
||||
this.pageForm.parentId = data.id
|
||||
this.doSearch()
|
||||
},
|
||||
getTreeData() {
|
||||
this.$axios.post(loc() + "/tree").then((res) => {
|
||||
this.treeData = res.data
|
||||
if (this.treeData) {
|
||||
this.currentTreeData = this.treeData[0]
|
||||
}
|
||||
})
|
||||
},
|
||||
openUnit() {}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
this.getTreeData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,26 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava>
|
||||
<user-scope ref="userScope"></user-scope>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
components: {
|
||||
"user-scope": httpVueLoader("/components/module/activity/UserScope.vue?v=" + new Date().getDate())
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,26 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava>
|
||||
<user-scope-data ref="userDataScope"></user-scope-data>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
components: {
|
||||
"user-scope-data": httpVueLoader("/components/module/activity/UserDataScope.vue?v=" + new Date().getDate())
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,33 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-apply-activity :activity_type="activityType" ref="activityApply"></activity-culture-apply-activity>
|
||||
</guava>
|
||||
</div>
|
||||
<script>
|
||||
<!--#include("../../common/applyActivity.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40003
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-apply-activity": ACTIVITY_CULTURE_APPLY_ACTIVITY
|
||||
},
|
||||
methods: {},
|
||||
async created() {
|
||||
setTimeout(()=>{this.$refs.activityApply.init()},500)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,32 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-apply-user :activity_type="activityType"></activity-culture-apply-user>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/applyUser.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40003
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-apply-user": ACTIVITY_CULTURE_APPLY_USER
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,30 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<activity-culture-audit-activity :activity_type="activityType"></activity-culture-audit-activity>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/auditActivity.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40003
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-audit-activity": ACTIVITY_CULTURE_AUDIT_ACTIVITY
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,30 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<activity-culture-info-manage :activity_type="activityType"></activity-culture-info-manage>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/infoMange.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40003
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-info-manage": ACTIVITY_CULTURE_INFO_MANAGE
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-user-statistics :activity_type="activityType"></activity-culture-user-statistics>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/userStatistics.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40003
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-user-statistics": ACTIVITY_CULTURE_USER_STATISTICS
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,808 @@
|
||||
const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
|
||||
template: /*language=HTML*/ `
|
||||
<div>
|
||||
<template>
|
||||
<el-card shadow="never" style="min-height: calc(100vh - 70px);position: relative">
|
||||
<el-form :model="formData" :rules="formRules" label-suffix=":" label-width="170px"
|
||||
ref="addForm" v-loading="formLoading">
|
||||
|
||||
<el-tabs tab-position="top" v-model="activeName">
|
||||
<el-tab-pane label="活动基础信息" name="1">
|
||||
<div class="mt20">
|
||||
<el-row :gutter="40">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="活动名称" prop="name">
|
||||
<el-input maxlength="50" placeholder="请填写活动名称"
|
||||
type="text"
|
||||
v-model="formData.name"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="活动编号" prop="activityCode">
|
||||
<el-input disabled maxlength="50"
|
||||
type="text"
|
||||
v-model="formData.activityCode"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="活动项目类型" prop="projectTypeCode">
|
||||
<el-select placeholder="请选择活动类型"
|
||||
style="width: 100%;"
|
||||
v-model="formData.projectTypeCode">
|
||||
<el-option
|
||||
:key="item.id"
|
||||
:label="item.name+' ('+item.code+')'"
|
||||
:value="item.code"
|
||||
v-for="item in projectTypeList">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否用于报名" prop="isEnrollSystem">
|
||||
<el-radio-group v-model="formData.isEnrollSystem" size="small">
|
||||
<el-radio border :label="true">活动报名</el-radio>
|
||||
<el-radio border :label="false">活动管理</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="活动地址" prop="address">
|
||||
<el-input maxlength="50" placeholder="请填写活动地址"
|
||||
type="text"
|
||||
v-model="formData.address"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="联系人" prop="userId">
|
||||
<el-select :loading="selectLoading" :remote-method="remoteMethod"
|
||||
@change="userChang"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="请选择联系人"
|
||||
remote
|
||||
reserve-keyword
|
||||
style="width: 100%" v-model="formData.userId">
|
||||
<el-option
|
||||
:key="item.userId"
|
||||
:label="item.userName+'-'+item.loginName+'-'+item.unitName"
|
||||
:value="item.userId"
|
||||
v-for="item in userList">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="联系方式" prop="mobile">
|
||||
<el-input maxlength="50" placeholder="请填写联系方式"
|
||||
type="text"
|
||||
v-model="formData.mobile"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- <el-col :span="12"-->
|
||||
<!-- v-if="formData.isEnrollSystem === true">-->
|
||||
<!-- <el-form-item label="活动计划时间" prop="plannedDate">-->
|
||||
<!-- <el-date-picker-->
|
||||
<!-- @change="plannedDateChange"-->
|
||||
<!-- end-placeholder="结束日期"-->
|
||||
<!-- range-separator="-"-->
|
||||
<!-- start-placeholder="开始日期"-->
|
||||
<!-- style="width: 100%"-->
|
||||
<!-- type="daterange"-->
|
||||
<!-- v-model="formData.plannedDate" value-format="yyyy-MM-dd">-->
|
||||
<!-- </el-date-picker>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="实际活动时间" prop="time">
|
||||
<el-date-picker
|
||||
end-placeholder="结束日期"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
style="width: 100%"
|
||||
type="daterange"
|
||||
v-model="formData.time"
|
||||
value-format="yyyy-MM-dd">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
:rules="[{required:[1,2].includes(formData.signUpMethod),message:'请选择报名日期',trigger:['change','blur']}]"
|
||||
label="报名日期"
|
||||
prop="applyTime2">
|
||||
<el-date-picker
|
||||
end-placeholder="结束时间"
|
||||
range-separator="-"
|
||||
start-placeholder="开始时间"
|
||||
style="width: 100%"
|
||||
type="datetimerange"
|
||||
v-model="formData.applyTime2"
|
||||
value-format="yyyy-MM-dd HH:mm">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12" v-if="!formData.isEnrollSystem">
|
||||
<el-form-item label="活动人数" prop="peopleNum">
|
||||
<el-input
|
||||
maxlength="10"
|
||||
placeholder="请填写活动人数"
|
||||
v-model="formData.peopleNum"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="参加人员范围" prop="groupId">
|
||||
<div style="display: flex; justify-content: space-between">
|
||||
<div style="width: 99%">
|
||||
<el-select clearable filterable
|
||||
placeholder="参加人员范围"
|
||||
prop="groupId"
|
||||
style="width: 99%;"
|
||||
v-model="formData.groupId">
|
||||
<el-option :key="item.groupId"
|
||||
:label="item.groupName"
|
||||
:value="item.groupId"
|
||||
v-for="item in activityGroupList"></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div>
|
||||
<el-button
|
||||
@click="$refs.drawerUserScope.userScopeDialog = true"
|
||||
type="primary">设置
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12"
|
||||
v-if="formData.isEnrollSystem === true">
|
||||
<el-form-item label="报名方式" prop="signUpMethod">
|
||||
<el-radio-group v-model="formData.signUpMethod" size="small">
|
||||
<el-radio border :label="1">个人报名</el-radio>
|
||||
<el-radio border :label="2">组队报名</el-radio>
|
||||
<el-radio border :label="3" v-if="activity_type===40001">分工会报名
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :lg="12" :xl="12" :xs="12"
|
||||
v-if="[1,2,3].includes(formData.signUpMethod)">
|
||||
<el-form-item label="报名人数限制" prop="userNumberLimit">
|
||||
<el-radio-group v-model="formData.userNumberLimit" size="small">
|
||||
<el-radio border :label="1">总人数限制</el-radio>
|
||||
<el-radio border :label="2" v-if="activity_type===40001">分工会人数限制</el-radio>
|
||||
<el-radio border :label="null">不限制</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :lg="12" :xl="12" :xs="12"
|
||||
v-if="[2].includes(formData.signUpMethod)">
|
||||
<el-form-item label="组队人数" prop="totalUserNumberLimit">
|
||||
<el-input-number :max="2000" :min="1"
|
||||
:precision="0"
|
||||
v-model="formData.teamNum"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :lg="12" :xl="12" :xs="12"
|
||||
v-if="[1,2,3].includes(formData.signUpMethod) && formData.userNumberLimit===1">
|
||||
<el-form-item label="总人数限制" prop="totalUserNumberLimit">
|
||||
<el-input-number :max="2000"
|
||||
:min="1" :precision="0"
|
||||
v-model="formData.totalUserNumberLimit"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24"
|
||||
v-if="[1,2,3].includes(formData.signUpMethod) && formData.userNumberLimit===2">
|
||||
<el-form-item label="分工会人数限制" prop="unionUserNumberLimit">
|
||||
<table-tool label="分段设置">
|
||||
<el-button @click="unionLimitQuickSetting" size="small"
|
||||
type="primary">
|
||||
应用分段设置
|
||||
</el-button>
|
||||
</table-tool>
|
||||
<el-row :gutter="20" :key="index"
|
||||
class="mb5" v-for="(item,index) in unionUserNumCalc">
|
||||
<el-col :span="7">
|
||||
<el-input-number :min="1" :precision="0"
|
||||
:step="1" placeholder="请输入最小人数"
|
||||
style="width: 100%"
|
||||
v-model="item.startNum"></el-input-number>
|
||||
</el-col>
|
||||
<el-col :span="7">
|
||||
<el-input-number :min="1" :precision="0"
|
||||
:step="1" placeholder="请输入最大人数"
|
||||
style="width: 100%"
|
||||
v-model="item.endNum"></el-input-number>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-input-number :min="1" :precision="0"
|
||||
:step="1" placeholder="请输入限制人数"
|
||||
style="width: 100%"
|
||||
v-model="item.resultNum"></el-input-number>
|
||||
</el-col>
|
||||
<el-col :span="4" class="text-right">
|
||||
<el-button @click="unionUserNumCalc.push({})"
|
||||
icon="el-icon-plus"></el-button>
|
||||
<el-button :disabled="unionUserNumCalc.length===1"
|
||||
@click="unionUserNumCalc.splice(index,1)"
|
||||
icon="el-icon-minus"></el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row class="mt10">
|
||||
<div class="text-danger"
|
||||
v-for="(item,index) in unionUserNumCalcTips">
|
||||
<span class="mr10">({{index+1}}).</span> {{item}}
|
||||
</div>
|
||||
</el-row>
|
||||
|
||||
<table-tool class="mt20" label="比例设置">
|
||||
一键比例:
|
||||
<el-input-number :max="100"
|
||||
:min="0" :precision="0" :step="1"
|
||||
placeholder="请输入一键比例"
|
||||
size="small"
|
||||
v-model="unionUserNumOneKeyRatio"></el-input-number>
|
||||
<el-button @click="applyScaleSettings" class="ml5"
|
||||
size="small" type="primary">
|
||||
应用比例设置
|
||||
</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="formData.unionUserNumberLimit"
|
||||
max-height="500px">
|
||||
<el-table-column label="分工会"
|
||||
prop="unionname"></el-table-column>
|
||||
<el-table-column label="人数"
|
||||
prop="teacherCount"></el-table-column>
|
||||
<el-table-column label="比例(%)" prop="ratio">
|
||||
<template slot-scope="{row}">
|
||||
<el-input-number :max="100" :min="0"
|
||||
:precision="0" :step="1"
|
||||
v-model="row.ratio"></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="限制人数" prop="limitNum">
|
||||
<template slot-scope="{row}">
|
||||
<el-input-number :max="row.teacherCount"
|
||||
:min="0" :precision="0" :step="1"
|
||||
@change="calSummaryCount"
|
||||
v-model="row.limitNum"></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<el-row class="mt20" justify="end" type="flex">
|
||||
<div class="text-danger"
|
||||
style="width: 100%;font-size: 18px;display: flex;align-items: center;font-weight: bold">
|
||||
限制总人数:{{summaryCount}}人
|
||||
</div>
|
||||
|
||||
</el-row>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- <el-col :span="12" v-if="[1,2,3].includes(formData.signUpMethod)">
|
||||
<el-form-item label="是否需要签到">
|
||||
<el-radio-group @change="(val)=>{formData.needSign?initMap():null}"
|
||||
v-model="formData.needSign">
|
||||
<el-radio :label="true">需要</el-radio>
|
||||
<el-radio :label="false">不需要</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>-->
|
||||
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="活动详情" prop="activityContent">
|
||||
<text-editor v-model="formData.activityContent"></text-editor>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" v-if="formData.isEnrollSystem === false">
|
||||
<el-form-item label="活动考核内容" prop="activityExamineContent">
|
||||
<el-input
|
||||
:rows="7"
|
||||
placeholder="请输入活动考核内容"
|
||||
type="textarea"
|
||||
v-model="formData.activityExamineContent">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="报名表单" prop="formConfig">
|
||||
<custom-form-field v-model="formData.formConfig"></custom-form-field>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" v-if="formData.signUpMethod!=null">
|
||||
<el-form-item label="封面图" prop="cover">
|
||||
<file-upload :value.sync="formData.cover" accept=".jpg,.jpeg,.png"
|
||||
:upload_number="1" upload_result_category="interval"
|
||||
complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="活动费用" name="2" v-if="formData.isEnrollSystem === false">
|
||||
<table-tool label="购置物品及价格">
|
||||
<el-button @click="formData.goods.push({})"
|
||||
type="primary" size="small">添加购置物品及价格
|
||||
</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-form-item>
|
||||
<el-table :data="formData.goods" border height="200" size="mini"
|
||||
style="width: 100%">
|
||||
|
||||
<el-table-column align="center" header-align="center" label="序号" sortable
|
||||
type="index" width="100">
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="物品名称"
|
||||
prop="name">
|
||||
<template slot-scope="{row}">
|
||||
<el-input maxlength="50" placeholder="物品名称"
|
||||
type="text"
|
||||
v-model="row.name"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="预算费用"
|
||||
prop="price">
|
||||
<template slot-scope="{row}">
|
||||
<el-input maxlength="50"
|
||||
placeholder="预算费用"
|
||||
type="number" v-model="row.price"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="实际费用"
|
||||
prop="actualPrice">
|
||||
<template slot-scope="{row}">
|
||||
<el-input maxlength="50"
|
||||
placeholder="实际费用"
|
||||
type="number" v-model="row.actualPrice"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" fixed="right"
|
||||
header-align="center"
|
||||
label="操作"
|
||||
width="80px">
|
||||
<template slot-scope="scope">
|
||||
<el-button @click="formData.goods.splice(scope.$index, 1)" circle
|
||||
icon="el-icon-delete"
|
||||
type="danger"></el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-form-item>
|
||||
|
||||
<table-tool :app="this" label="附件">
|
||||
</table-tool>
|
||||
<el-row :gutter="40">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发票" prop="billFiles">
|
||||
<file-upload :value.sync="formData.billFiles" accept=".jpg,.jpeg,.png"
|
||||
upload_mode="drag"
|
||||
:upload_number="3" upload_result_category="array"
|
||||
complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="照片" prop="photoFiles">
|
||||
<file-upload :value.sync="formData.photoFiles" accept=".jpg,.jpeg,.png"
|
||||
upload_mode="drag"
|
||||
:upload_number="3" upload_result_category="array"
|
||||
complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="其他" prop="otherFiles">
|
||||
<file-upload :value.sync="formData.otherFiles" accept=".jpg,.jpeg,.png"
|
||||
upload_mode="drag"
|
||||
:upload_number="3" upload_result_category="array"
|
||||
complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="活动人员信息" name="3" v-if="formData.isEnrollSystem === false">
|
||||
<table-tool label="活动人员信息">
|
||||
<el-button @click="openAddUser" icon="el-icon-plus"
|
||||
type="primary" size="small">添加活动人员
|
||||
</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="userData" border height="500" size="small"
|
||||
stripe v-loading="userTabLoading" row-key="userId">
|
||||
<el-table-column
|
||||
label="序号" type="index"
|
||||
width="100">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:key="column.prop"
|
||||
:sortable="column.sortable"
|
||||
v-for="column in userColumns">
|
||||
</el-table-column>
|
||||
<el-table-column label="操作"
|
||||
prop="userOnline"
|
||||
width="150px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="delUser(row)" size="mini"
|
||||
type="danger">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="活动总结" name="4" v-if="formData.isEnrollSystem === false">
|
||||
<table-tool label="活动总结">
|
||||
</table-tool>
|
||||
<el-form-item label="" prop="activitySummary">
|
||||
<el-input
|
||||
:disabled="!formData.time || Date.now() < Date.parse(formData.time[1])"
|
||||
:rows="5"
|
||||
placeholder="请输入活动内容"
|
||||
type="textarea"
|
||||
v-model="formData.activitySummary">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-alert
|
||||
class="mb20"
|
||||
show-icon
|
||||
style="margin-left: 130px"
|
||||
title="活动结束后可输入活动总结"
|
||||
type="info"
|
||||
v-if="!formData.time || Date.now() < Date.parse(formData.time[1])">
|
||||
</el-alert>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
|
||||
|
||||
<div style="padding: 20px;text-align: center;">
|
||||
<el-button @click="operation" style="width: 300px" type="primary" :disabled="formLoading">
|
||||
确 定
|
||||
</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<drawer-user-scope
|
||||
@group_change="getActivityGroup"
|
||||
ref="drawerUserScope"
|
||||
:group_id.sync="formData.groupId"
|
||||
></drawer-user-scope>
|
||||
|
||||
<el-dialog :append-to-body="true" :close-on-click-modal="false" :visible.sync="userDialogVisible" title="添加人员" width="40%">
|
||||
|
||||
<el-form :model="formData" label-width="100px">
|
||||
<el-form-item label="参加人员" prop="userId">
|
||||
<el-select :loading="selectLoading" :remote-method="remoteMethod"
|
||||
filterable
|
||||
multiple
|
||||
placeholder="请选择参加人员"
|
||||
remote
|
||||
style="width: 100%"
|
||||
v-model="formData.tissuePersonList">
|
||||
<el-option
|
||||
:disabled="userData.map(v=>v.userId).includes(item.userId)"
|
||||
:key="item.userId"
|
||||
:label="item.userName+'-'+item.loginName+'-'+item.unitName"
|
||||
:value="item.userId"
|
||||
v-for="item in userList">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<span class="dialog-footer" slot="footer">
|
||||
<el-button @click="userDialogVisible = false">取 消</el-button>
|
||||
<el-button @click="doAddUser" type="primary">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
`,
|
||||
props: {
|
||||
activity_type: {
|
||||
value: { type: Object, default: "" }
|
||||
}
|
||||
},
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activeName: "1",
|
||||
pageForm: {
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
formRules: {
|
||||
groupId: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||
name: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||
type: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||
projectTypeCode: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||
address: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||
plannedDate: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||
time: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||
cover: [{ required: true, message: "必填", trigger: ["blur", "change"] }]
|
||||
},
|
||||
|
||||
projectTypeList: [],
|
||||
activityGroupList: [],
|
||||
unionUserNumCalc: [{}],
|
||||
summaryCount: 0,
|
||||
unionUserNumOneKeyRatio: null,
|
||||
tissuePersonList: [],
|
||||
|
||||
userDialogVisible: false,
|
||||
userData: [],
|
||||
userTabLoading: false,
|
||||
userList: [],
|
||||
selectLoading: false,
|
||||
|
||||
userColumns: [
|
||||
{ prop: "userName", label: "姓名" },
|
||||
{ prop: "loginName", label: "工号" },
|
||||
{ prop: "sex", label: "性别" },
|
||||
{ prop: "mobile", label: "联系方式" },
|
||||
{ prop: "unitName", label: "所属单位" },
|
||||
{ prop: "unionName", label: "所属工会" }
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue")
|
||||
},
|
||||
computed: {
|
||||
unionUserNumCalcTips() {
|
||||
return this.unionUserNumCalc.map((v) => {
|
||||
return (
|
||||
(v.startNum ? v.startNum : "?") +
|
||||
"-" +
|
||||
(v.endNum ? v.endNum : "?") +
|
||||
"人的分工会,限报" +
|
||||
(v.resultNum ? v.resultNum : "?") +
|
||||
"人"
|
||||
)
|
||||
})
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async remoteMethod(query) {
|
||||
if (query) {
|
||||
this.selectLoading = true
|
||||
const { data } = await this.$axios.post("/platform/activity/culture/applyActivity/findUser", {
|
||||
serachWord: query,
|
||||
activity_type: this.activity_type
|
||||
})
|
||||
this.userList = data
|
||||
this.selectLoading = false
|
||||
}
|
||||
},
|
||||
doAddUser() {
|
||||
this.formData.tissuePersonList = this.userList.filter((v) => this.formData.tissuePersonList.some((x) => v.userId === x))
|
||||
this.userData = this.userData.concat(this.formData.tissuePersonList)
|
||||
this.userDialogVisible = false
|
||||
},
|
||||
async delUser(row) {
|
||||
this.userData.splice(this.userData.indexOf(row.userId), 1)
|
||||
this.formData.tissuePersonList.splice(this.formData.tissuePersonList.indexOf(row.userId), 1)
|
||||
},
|
||||
openAddUser() {
|
||||
this.formData.tissuePersonList = []
|
||||
this.userDialogVisible = true
|
||||
},
|
||||
async operation() {
|
||||
if (this.formData.applyTime2 && this.formData.applyTime2.length > 0) {
|
||||
if (this.$moment(this.formData.time[0]).valueOf() <= this.$moment(this.formData.applyTime2[0]).valueOf()) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "活动时间必须晚于报名时间",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
this.$refs["addForm"].validate(async (valid) => {
|
||||
if (valid) {
|
||||
this.formLoading = true
|
||||
const formData = JSON.parse(JSON.stringify(this.formData))
|
||||
formData.activity_type = this.activity_type
|
||||
const { time, applyTime2, plannedDate } = formData
|
||||
if (applyTime2 && applyTime2.length) {
|
||||
formData.applyStartTime = applyTime2[0]
|
||||
formData.applyEndTime = applyTime2[1]
|
||||
formData.applyTime2 = null
|
||||
}
|
||||
if (time && time.length) {
|
||||
formData.startTime = formData.time[0]
|
||||
formData.endTime = formData.time[1]
|
||||
formData.time = null
|
||||
}
|
||||
if (plannedDate && plannedDate.length) {
|
||||
formData.startPlannedDate = formData.plannedDate[0]
|
||||
formData.endPlannedDate = formData.plannedDate[1]
|
||||
formData.plannedDate = null
|
||||
}
|
||||
|
||||
const resp = await this.$axios.post("/platform/activity/culture/applyActivity" + (formData.id ? "/doEdit" : "/doAdd"), {
|
||||
tissue: JSON.stringify(formData)
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
if (formData.id) {
|
||||
this.$emit("goBack")
|
||||
} else {
|
||||
if (this.activity_type === 40002) {
|
||||
pjaxReplace("/platform/activity/culture/infoManage/union")
|
||||
} else if (this.activity_type === 40003) {
|
||||
pjaxReplace("/platform/activity/culture/infoManage/club")
|
||||
} else {
|
||||
pjaxReplace("/platform/activity/culture/infoManage/school")
|
||||
}
|
||||
}
|
||||
|
||||
this.formLoading = false
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
} else {
|
||||
this.notifyWarning("存在未填写的的必填项")
|
||||
}
|
||||
})
|
||||
},
|
||||
//应用比例设置
|
||||
applyScaleSettings() {
|
||||
this.formData.unionUserNumberLimit.forEach((v) => {
|
||||
v.limitNum = parseFloat(((v.teacherCount * this.unionUserNumOneKeyRatio) / 100).toFixed(0))
|
||||
if (v.ratio) {
|
||||
v.limitNum = parseFloat(((v.teacherCount * v.ratio) / 100).toFixed(0))
|
||||
}
|
||||
})
|
||||
this.calSummaryCount()
|
||||
},
|
||||
calSummaryCount() {
|
||||
const array = this.formData.unionUserNumberLimit
|
||||
if (array) {
|
||||
this.summaryCount = array.reduce((prev, curr) => {
|
||||
const value = Number(curr.limitNum)
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr.limitNum
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
}
|
||||
},
|
||||
unionLimitQuickSetting() {
|
||||
this.unionUserNumCalc.forEach((v, i) => {
|
||||
const startNum = v.startNum
|
||||
const endNum = v.endNum
|
||||
const resultNum = v.resultNum
|
||||
if (startNum > endNum) {
|
||||
this.notifyWarning("第" + (i + 1) + "行设置错误")
|
||||
} else {
|
||||
this.formData.unionUserNumberLimit.forEach((x) => {
|
||||
if (x.teacherCount >= startNum && x.teacherCount <= endNum) {
|
||||
x.limitNum = resultNum
|
||||
}
|
||||
})
|
||||
this.calSummaryCount()
|
||||
}
|
||||
})
|
||||
},
|
||||
plannedDateChange(val) {
|
||||
this.$set(this.formData, "time", val)
|
||||
},
|
||||
userChang(id) {
|
||||
const userList = this.$refs.userData.options
|
||||
this.$set(this.formData, "mobile", id ? userList.find((v) => v.id === id).mobile : null)
|
||||
},
|
||||
async getActivityTwoLevelType(code) {
|
||||
const { data } = await this.$axios.post("/platform/activity/basic/settings/getActivityTwoLevelType", { code: code })
|
||||
return data
|
||||
},
|
||||
async getActivityGroup() {
|
||||
const { data } = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup")
|
||||
this.activityGroupList = data
|
||||
},
|
||||
async generateActivityCode() {
|
||||
const { data } = await this.$axios.post("/platform/activity/sports/common/generateActivityCode", { activity_type: this.activity_type })
|
||||
return data
|
||||
},
|
||||
async getUnionData() {
|
||||
const { data } = await this.$axios.post("/platform/activity/culture/applyActivity/getUnionData", {
|
||||
activityScopeGroupId: this.formData.groupId
|
||||
})
|
||||
return data
|
||||
},
|
||||
init(id) {
|
||||
if (id){
|
||||
this.activeName = "1"
|
||||
this.findOne(id)
|
||||
}else{
|
||||
this.formData = {
|
||||
time: [],
|
||||
applyTime2: [],
|
||||
plannedDate: [],
|
||||
goods: [],
|
||||
billFiles: [],
|
||||
photoFiles: [],
|
||||
otherFiles: [],
|
||||
tissuePersonList: [],
|
||||
unionUserNumberLimit: [],
|
||||
signUpMethod: null,
|
||||
rangerMeter: 100,
|
||||
isEnrollSystem: true,
|
||||
isPushHome: 0,
|
||||
isIntegral: false
|
||||
}
|
||||
this.generateActivityCode().then((data) => {
|
||||
this.$set(this.formData, "activityCode", data)
|
||||
})
|
||||
this.getUnionData().then((data) => {
|
||||
this.$set(this.formData, "unionUserNumberLimit", data)
|
||||
})
|
||||
}
|
||||
},
|
||||
async queryUserByIds(ids) {
|
||||
const { data } = await this.$axios.post("/platform/activity/culture/applyActivity/queryUserByIds", { ids: JSON.stringify(ids) })
|
||||
return data
|
||||
},
|
||||
async findOne(id) {
|
||||
const { data, code, msg } = await this.$axios.post("/platform/activity/culture/infoManage/findOne", { id })
|
||||
if (code === 0) {
|
||||
if (data.userId) {
|
||||
const user = await this.queryUserByIds([data.userId])
|
||||
await this.remoteMethod(user[0].loginname)
|
||||
}
|
||||
if (data.goods) data.goods = JSON.parse(data.goods)
|
||||
if (data.billFiles && data.billFiles.length > 0) data.billFiles = JSON.parse(data.billFiles)
|
||||
if (data.photoFiles && data.photoFiles.length > 0) data.photoFiles = JSON.parse(data.photoFiles)
|
||||
if (data.otherFiles && data.otherFiles.length > 0) data.otherFiles = JSON.parse(data.otherFiles)
|
||||
if (data.applyStartTime) data.applyTime2 = [data.applyStartTime, data.applyEndTime]
|
||||
if (data.startTime) data.time = [data.startTime, data.endTime]
|
||||
if (data.startPlannedDate) data.plannedDate = [data.startPlannedDate, data.endPlannedDate]
|
||||
this.userData = clone(data.tissuePersonList)
|
||||
data.unionUserNumberLimit = JSON.parse(data.unionUserNumberLimit)
|
||||
this.formData = data
|
||||
if (!this.formData.unionUserNumberLimit) {
|
||||
this.getUnionData().then((data) => {
|
||||
this.$set(this.formData, "unionUserNumberLimit", data)
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
openEdit(id) {
|
||||
this.activeName = "1"
|
||||
this.init(id)
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.getActivityTwoLevelType("50000").then((data) => {
|
||||
data.forEach((v) => {
|
||||
if (v.code !== "50004") {
|
||||
this.projectTypeList.push(v)
|
||||
}
|
||||
})
|
||||
})
|
||||
this.getActivityGroup()
|
||||
// this.init()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
<!--#include("infoActivity.js"){}#-->
|
||||
<!--#include("singleSignUp.js"){}#-->
|
||||
const ACTIVITY_CULTURE_APPLY_USER = {
|
||||
template: /*language=HTML*/ `
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="活动时间">
|
||||
<el-date-picker
|
||||
:clearable="false"
|
||||
placeholder="活动时间"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
|
||||
<search-item label="活动时间">
|
||||
<el-input clearable placeholder="请输入活动名称"
|
||||
v-model="pageForm.name"></el-input>
|
||||
</search-item>
|
||||
<search-item label="">
|
||||
<el-radio-group v-model="pageForm.state" @change="doSearch">
|
||||
<el-radio-button label="1">全部</el-radio-button>
|
||||
<el-radio-button label="2">报名中</el-radio-button>
|
||||
<el-radio-button label="3">报名已结束</el-radio-button>
|
||||
</el-radio-group>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="活动列表">
|
||||
<el-radio-group v-model="pageForm.isEnrolled" @change="doSearch" size="mini" class="ml10">
|
||||
<el-radio-button :label="false">未报名</el-radio-button>
|
||||
<el-radio-button :label="true">已报名</el-radio-button>
|
||||
</el-radio-group>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" row-key="id"
|
||||
style="width: 100%;margin-bottom: 20px">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column
|
||||
:key="column.prop"
|
||||
: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=='time'">
|
||||
{{row.startTime}} 至 {{row.endTime}}
|
||||
</template>
|
||||
<template scope="{row}" v-else-if="column.prop=='projectTypeName'">
|
||||
{{row.projectTypeName}}({{row.projectTypeCode}})
|
||||
</template>
|
||||
<template scope="{row}" v-else-if="column.prop=='tussueName'">
|
||||
<span v-if="row.activity_type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
|
||||
<span v-if="row.activity_type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
|
||||
<span v-if="row.activity_type==40001">校工会</span>
|
||||
</template>
|
||||
<template scope="{row}" v-else-if="column.prop=='countUser'">
|
||||
<el-tag size="small">{{row.countUser}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="操作"
|
||||
prop="userOnline" width="300px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="openView(row)" size="mini" type="primary">
|
||||
查看
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="!row.isEnrolled && $moment(row.applyStartTime).valueOf()<$moment().valueOf() && $moment(row.applyEndTime).valueOf()>$moment().valueOf()"
|
||||
@click="openSign(row)" size="mini" type="primary">
|
||||
报名
|
||||
</el-button>
|
||||
<el-button v-if="row.isEnrolled" @click="openSign(row)" size="mini" type="primary">
|
||||
报名情况
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<template #view>
|
||||
<activity-culture-info-activity ref="infoActivity"></activity-culture-info-activity>
|
||||
</template>
|
||||
|
||||
<single-signup ref="singleSignupRef" @refresh="doSearch"></single-signup>
|
||||
</guava>
|
||||
`,
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
props: {
|
||||
activity_type: {
|
||||
value: { type: Object, default: "" }
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
submitLoading: false,
|
||||
pageForm: {
|
||||
isEnrolled: false,
|
||||
state: 1,
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
tableColumns: [
|
||||
{ prop: "name", label: "活动名称" },
|
||||
{ prop: "address", label: "活动地点" },
|
||||
{ prop: "projectTypeName", label: "活动项目类型" },
|
||||
{ prop: "tussueName", label: "举办单位" },
|
||||
{ prop: "time", label: "活动日期" },
|
||||
{ prop: "applyStartTime", label: "报名开始时间" },
|
||||
{ prop: "applyEndTime", label: "报名结束时间" }
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-info-activity": ACTIVITY_CULTURE_INFO_ACTIVITY,
|
||||
"single-signup": singleSignUp
|
||||
},
|
||||
methods: {
|
||||
//打开报名
|
||||
async openSign(row) {
|
||||
this.$refs.singleSignupRef.onOpen(row.id)
|
||||
},
|
||||
openView(row) {
|
||||
this.$refs.guava.view(() => {
|
||||
this.$refs.infoActivity.findOne(row.id)
|
||||
})
|
||||
},
|
||||
pageData() {
|
||||
this.tableLoading = true
|
||||
this.pageForm.activity_type = this.activity_type
|
||||
this.$axios.post("/platform/activity/culture/applyUser/pageData", this.pageForm).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
}).finally(() => {
|
||||
this.tableLoading = false
|
||||
})
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.pageData()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
<!--#include("infoActivity.js"){}#-->
|
||||
const ACTIVITY_CULTURE_AUDIT_ACTIVITY = {
|
||||
template: `
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="活动时间">
|
||||
<el-date-picker
|
||||
:clearable="false"
|
||||
placeholder="活动时间"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
|
||||
<search-item label="活动时间">
|
||||
<el-input clearable placeholder="请输入活动名称"
|
||||
v-model="pageForm.name"></el-input>
|
||||
</search-item>
|
||||
|
||||
<search-item label="所属工会" v-if="activity_type===40002">
|
||||
<el-select clearable filterable placeholder="请选择工会"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.unionId">
|
||||
<el-option
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
v-for="item in unionList">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool :app="this" label="活动列表">
|
||||
<el-radio-group @change="doSearch" size="small" v-model="pageForm.state">
|
||||
<el-radio-button :key="i.code" :label="i.code" v-for="i in auditList">{{i.name}}
|
||||
</el-radio-button>
|
||||
</el-radio-group>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
|
||||
class="vi-table" row-key="id" style="width: 100%;margin-bottom: 20px"
|
||||
v-loading="tableLoading">
|
||||
|
||||
<el-table-column :index="indexMethod" align="center" header-align="center"
|
||||
label="序号" type="index"
|
||||
width="80px"></el-table-column>
|
||||
|
||||
<el-table-column
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:key="column.prop"
|
||||
:sortable="column.sortable"
|
||||
align="center"
|
||||
header-align="center"
|
||||
v-for="column in tableColumns">
|
||||
|
||||
<template scope="{row}" v-if="column.prop=='time'">
|
||||
{{$moment(row.startTime).format('YYYY-MM-DD')}} -
|
||||
{{$moment(row.endTime).format('YYYY-MM-DD')}}
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='projectTypeName'">
|
||||
{{row.projectTypeName}}({{row.projectTypeCode}})
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='tussueName'">
|
||||
<span v-if="row.activity_type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
|
||||
<span v-if="row.activity_type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
|
||||
<span v-if="row.activity_type==40001">校工会</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='state'">
|
||||
{{row.state===1?'未审核':row.state===2?'审核不通过':'审核通过'}}
|
||||
</template>
|
||||
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="操作"
|
||||
prop="userOnline" width="150px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button :loading="row.loading" @click="openView(row)" size="mini">
|
||||
查看
|
||||
</el-button>
|
||||
<el-button :loading="row.loading" @click="openAudit(row)" size="mini"
|
||||
type="primary"
|
||||
v-if="row.state===1">
|
||||
审核
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
|
||||
</template>
|
||||
<template #edit>
|
||||
<activity-culture-info-activity handle label="校工会审核" ref="editInfo">
|
||||
<template #handle>
|
||||
<el-form :model="formData" label-position="right"
|
||||
label-width="120px"
|
||||
style="padding: 20px 0">
|
||||
<el-form-item class="view-header" label="审核信息" label-width="135px">
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="审核人" prop="username">
|
||||
<el-input disabled
|
||||
v-model="formData.username"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="审核时间" prop="time">
|
||||
<el-input disabled v-model="formData.auditTime"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="审核意见" prop="idea">
|
||||
<el-input maxlength="500" placeholder="请填写您的审核意见"
|
||||
rows="4" type="textarea"
|
||||
v-model="formData.auditOpinion"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
|
||||
</el-form>
|
||||
|
||||
|
||||
<div style="float: right;margin: 20px 0">
|
||||
<el-button :disabled="subDis" @click="doReview(false)"
|
||||
type="danger">拒
|
||||
绝
|
||||
</el-button>
|
||||
<el-button :disabled="subDis" @click="doReview(true)"
|
||||
type="success">通
|
||||
过
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
</activity-culture-info-activity>
|
||||
</template>
|
||||
<template #view>
|
||||
<activity-culture-info-activity ref="infoActivity"></activity-culture-info-activity>
|
||||
</template>
|
||||
</guava>
|
||||
`,
|
||||
props: {
|
||||
activity_type: {
|
||||
value: { type: Object, default: "" }
|
||||
}
|
||||
},
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
subDis: false,
|
||||
unionList: [],
|
||||
auditList: [
|
||||
{ code: true, name: "已审核" },
|
||||
{ code: false, name: "未审核" }
|
||||
],
|
||||
pageForm: {
|
||||
state: false,
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
tableColumns: [
|
||||
{ prop: "name", label: "活动名称" },
|
||||
{ prop: "address", label: "活动地点" },
|
||||
{ prop: "projectTypeName", label: "活动项目类型" },
|
||||
{ prop: "tussueName", label: "举办单位" },
|
||||
{ prop: "time", label: "活动日期" },
|
||||
{ prop: "applyTime", label: "创建时间", sortable: true },
|
||||
{ prop: "state", label: "审核状态", sortable: true }
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-info-activity": ACTIVITY_CULTURE_INFO_ACTIVITY
|
||||
},
|
||||
methods: {
|
||||
async doReview(flag) {
|
||||
const confirm = await this.$confirm("确定要审核" + (flag ? "通过" : "拒绝") + "吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
if (confirm === "confirm") {
|
||||
this.formData.flag = flag
|
||||
this.subDis = true
|
||||
flag ? (this.subLoading2 = true) : (this.subLoading1 = true)
|
||||
const resp = await $.post("/platform/activity/culture/auditActivity/doReview", this.formData)
|
||||
if (resp.code === 0) {
|
||||
this.pageData()
|
||||
this.$refs.guava.index()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.error(resp.msg)
|
||||
}
|
||||
}
|
||||
},
|
||||
openAudit(row) {
|
||||
this.$refs.guava.edit()
|
||||
this.$refs.editInfo.findOne(row.id)
|
||||
this.formData = {
|
||||
id: row.id,
|
||||
username: this.$store.state.user.username,
|
||||
auditTime: this.$moment().format("YYYY-MM-DD")
|
||||
}
|
||||
},
|
||||
openView(row) {
|
||||
const { id } = row
|
||||
this.$refs.guava.view()
|
||||
this.$refs.infoActivity.findOne(id)
|
||||
},
|
||||
pageData() {
|
||||
this.tableLoading = true
|
||||
this.pageForm.activity_type = this.activity_type
|
||||
this.$axios.post("/platform/activity/culture/auditActivity/pageData", this.pageForm).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
})
|
||||
this.tableLoading = false
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.unionList = await this.$businessTool.listUnion()
|
||||
this.pageData()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
const ACTIVITY_CULTURE_INFO_ACTIVITY = {
|
||||
template: /*language=HTML*/ `
|
||||
<el-tabs tab-position="top" v-loading="loading" v-model="activeName">
|
||||
<el-tab-pane label="活动基础信息" name="1">
|
||||
<el-descriptions :column="3" border class="margin-top" style="margin: 10px" title="">
|
||||
<el-descriptions-item label="活动名称" span="3">
|
||||
<span class="item-center"> {{ viewData.name }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="联系人">
|
||||
<span v-if="viewData.username">
|
||||
{{ viewData.username }}
|
||||
({{ viewData.loginname }})</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="联系方式">
|
||||
{{ viewData.mobile }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动编号">
|
||||
{{ viewData.activityCode }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动编号">
|
||||
{{ viewData.projectTypeName }}({{ viewData.projectTypeCode }})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动类型" :span="2">
|
||||
{{ viewData.activity_type === 40001 ? '校工会活动' : viewData.activity_type === 40002 ? '分工会活动'
|
||||
:
|
||||
'协会/社团活动' }}
|
||||
</el-descriptions-item>
|
||||
<!-- <el-descriptions-item label="活动计划时间">-->
|
||||
<!-- {{ viewData.startPlannedDate + ' - ' + viewData.endPlannedDate }}-->
|
||||
<!-- </el-descriptions-item>-->
|
||||
<el-descriptions-item label="活动时间">
|
||||
{{ viewData.startTime + ' - ' + viewData.endTime }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="报名时间" v-if="viewData.applyStartTime">
|
||||
{{ viewData.applyStartTime + ' - ' + viewData.applyEndTime }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动人数">
|
||||
{{ viewData.peopleNum || '暂无' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动地点">
|
||||
{{ viewData.address }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="报名方式">
|
||||
<span v-if="viewData.signUpMethod===1">个人报名</span>
|
||||
<span v-else-if="viewData.signUpMethod===2">分工会报名</span>
|
||||
<span v-else-if="viewData.signUpMethod===3">组队报名</span>
|
||||
<span v-else-if="!viewData.signUpMethod">无需报名</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="是否用于报名">
|
||||
<span v-if="viewData.isEnrollSystem">活动报名</span>
|
||||
<span v-else>活动管理</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="报名人数限制" span="3" v-if="viewData.signUpMethod!=null">
|
||||
<span v-if="viewData.userNumberLimit===1">总人数限制({{
|
||||
viewData.totalUserNumberLimit
|
||||
}}人)</span>
|
||||
<span v-else-if="viewData.userNumberLimit===2">分工会人数限制</span>
|
||||
<span v-else-if="!viewData.userNumberLimit">不限制</span>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="分工会限制名额" span="3" v-if="viewData.userNumberLimit===2">
|
||||
<el-table :data="viewData.unionUserNumberLimit" border height="500" size="small"
|
||||
stripe>
|
||||
<el-table-column align="center" header-align="center" label="序号"
|
||||
type="index"
|
||||
width="100">
|
||||
</el-table-column>
|
||||
<el-table-column label="分工会名称" prop="unionname"></el-table-column>
|
||||
<el-table-column label="分工会人数" prop="teacherCount"></el-table-column>
|
||||
<el-table-column label="限制人数" prop="limitNum"></el-table-column>
|
||||
</el-table>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="封面图" span="3">
|
||||
<img :src="viewData.cover"
|
||||
class="avatar"
|
||||
style="height: 200px;width: auto" v-if="viewData.cover">
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="活动内容" span="3">
|
||||
<div v-html="viewData.activityContent"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="活动费用" name="2" v-if="!viewData.isEnrollSystem">
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="活动总结" name="3" v-if="!viewData.isEnrollSystem">
|
||||
<el-form label-width="120px" ref="form">
|
||||
<el-form-item label="活动总结" prop="activitySummary">
|
||||
{{ viewData.activitySummary }}
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="审核信息" name="4" v-if="viewData.auditId">
|
||||
<el-form label-width="120px" ref="form">
|
||||
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="审核人员:">
|
||||
{{ viewData.audit.username }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="审核时间:">
|
||||
{{ viewData.audit.auditTime }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="审核意见:">
|
||||
{{ viewData.audit.auditOpinion }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :label="label" name="999" v-if="handle">
|
||||
<slot name="handle"></slot>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
`,
|
||||
styles: [
|
||||
`
|
||||
.item-center {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
}
|
||||
`
|
||||
],
|
||||
props: {
|
||||
handle: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
label: {
|
||||
type: String,
|
||||
default: "审核"
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
userData: [],
|
||||
viewData: {},
|
||||
loading: true,
|
||||
search: "",
|
||||
tableKey: "",
|
||||
activeName: "1"
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
hasPane(name) {
|
||||
if (!this.handle) {
|
||||
return true
|
||||
}
|
||||
return this.panes.includes(name)
|
||||
},
|
||||
async findOne(id) {
|
||||
this.loading = true
|
||||
const { data } = await this.$axios.post("/platform/activity/culture/infoManage/findOne", { id })
|
||||
this.loading = false
|
||||
if (data) {
|
||||
data.billFiles = JSON.parse(data.billFiles)
|
||||
data.photoFiles = JSON.parse(data.photoFiles)
|
||||
data.otherFiles = JSON.parse(data.otherFiles)
|
||||
this.userData = clone(data.tissuePersonList)
|
||||
data.unionUserNumberLimit = JSON.parse(data.unionUserNumberLimit)
|
||||
data.location = JSON.parse(data.location)
|
||||
this.viewData = data
|
||||
this.tableKey = new Date().getTime()
|
||||
this.activeName = this.handle ? "999" : "1"
|
||||
} else {
|
||||
this.viewData = {}
|
||||
this.$notify.error({ title: "错误", message: "获取信息失败" })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <style>
|
||||
// .item-center {
|
||||
// text-align: center;
|
||||
// font-weight: 700;
|
||||
// margin-right: 110px;
|
||||
// }
|
||||
//
|
||||
// .item-center .el-form-item__content {
|
||||
// font-size: 18px;
|
||||
// }
|
||||
//
|
||||
// .el-descriptions-item__cell {
|
||||
// text-align: center !important;
|
||||
// }
|
||||
// </style>
|
||||
@@ -0,0 +1,240 @@
|
||||
<!--#include("applyActivity.js"){}#-->
|
||||
<!--#include("infoActivity.js"){}#-->
|
||||
|
||||
const ACTIVITY_CULTURE_INFO_MANAGE = {
|
||||
template: /*language=HTML*/`
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
|
||||
<search @search="doSearch">
|
||||
<search-item label="活动时间">
|
||||
<el-date-picker
|
||||
:clearable="false"
|
||||
placeholder="活动时间"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
|
||||
<search-item label="活动名称">
|
||||
<el-input clearable placeholder="请输入活动名称"
|
||||
v-model="pageForm.name"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="活动列表">
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
|
||||
class="vi-table" row-key="id" style="width: 100%;margin-bottom: 20px"
|
||||
v-loading="tableLoading">
|
||||
|
||||
<el-table-column :index="indexMethod" align="center" header-align="center"
|
||||
label="序号" type="index"
|
||||
width="80px"></el-table-column>
|
||||
|
||||
<el-table-column
|
||||
:key="column.prop"
|
||||
: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=='time2'">
|
||||
{{row.applyStartTime}}-{{row.applyEndTime}}
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='projectTypeName'">
|
||||
{{row.projectTypeName}}({{row.projectTypeCode}})
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='isUnseal'">
|
||||
<el-switch
|
||||
@change="(val)=>{activityStatusChange(row.id,row.isUnseal)}"
|
||||
active-color="#13ce66"
|
||||
inactive-color="#ff4949"
|
||||
v-model="row.isUnseal">
|
||||
</el-switch>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='tussueName'">
|
||||
<span v-if="row.activity_type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
|
||||
<span v-if="row.activity_type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
|
||||
<span v-if="row.activity_type==40001">校工会</span>
|
||||
</template>
|
||||
<template scope="{row}" v-else-if="column.prop=='state'">
|
||||
{{row.state===1?'未审核':row.state===2?'审核不通过':'审核通过'}}
|
||||
</template>
|
||||
|
||||
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" header-align="center" label="操作"
|
||||
prop="userOnline" width="150px">
|
||||
<template slot-scope="{row}">
|
||||
<el-dropdown @command="dropdownCommand">
|
||||
<el-button :loading="row.loading" size="mini">
|
||||
<i class="ti-settings"></i>
|
||||
<span class="ti-angle-down"></span>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item :command="{type:'view',row}">
|
||||
查看
|
||||
</el-dropdown-item>
|
||||
|
||||
<el-dropdown-item :command="{type:'edit',row}"
|
||||
:disabled="row.projectTypeCode==50004">
|
||||
编辑
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'delete',row}">
|
||||
删除
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'openCode',row}">
|
||||
二维码
|
||||
</el-dropdown-item>
|
||||
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<template #edit>
|
||||
<activity-culture-apply-activity
|
||||
:activity_type="activity_type" ref="applyActivity" @goBack="goBack"></activity-culture-apply-activity>
|
||||
</template>
|
||||
|
||||
<template #view>
|
||||
<activity-culture-info-activity ref="infoActivity"></activity-culture-info-activity>
|
||||
</template>
|
||||
|
||||
<el-dialog
|
||||
title="活动二维码"
|
||||
:visible.sync="codeDialogVisible"
|
||||
:close-on-click-modal="false"
|
||||
width="30%">
|
||||
<div style=" display: flex;justify-content: center;">
|
||||
<qrcode :options="{ width: 500 }" :value="url" ></qrcode>
|
||||
</div>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="codeDialogVisible = false" type="primary">关 闭</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</guava>
|
||||
`,
|
||||
props: {
|
||||
activity_type: {
|
||||
value: {type: Object, default: ""}
|
||||
}
|
||||
},
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
codeDialogVisible: false,
|
||||
pageForm: {
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
tableColumns: [
|
||||
{prop: "name", label: "活动名称"},
|
||||
{prop: "address", label: "活动地点"},
|
||||
{prop: "projectTypeName", label: "活动项目类型"},
|
||||
{prop: "tussueName", label: "举办单位"},
|
||||
{prop: "time2", label: "报名日期", width: "300"},
|
||||
{prop: "applyTime", label: "创建时间", sortable: true},
|
||||
{prop: "isUnseal", label: "是否开启"},
|
||||
{prop: "state", label: "审核状态", sortable: true}
|
||||
|
||||
],
|
||||
url: ""
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-apply-activity": ACTIVITY_CULTURE_APPLY_ACTIVITY,
|
||||
"activity-culture-info-activity": ACTIVITY_CULTURE_INFO_ACTIVITY
|
||||
},
|
||||
methods: {
|
||||
async activityStatusChange(id, isUnseal) {
|
||||
|
||||
const resp = await this.$axios.post("/platform/activity/culture/infoManage/activityStatusChange", {
|
||||
id: id,
|
||||
isUnseal: isUnseal
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.doSearch()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.error(resp.msg)
|
||||
}
|
||||
},
|
||||
dropdownCommand(command) {
|
||||
const {type, row} = command
|
||||
if (type === "view") {
|
||||
this.openView(row)
|
||||
} else if (type === "edit") {
|
||||
this.openEdit(row)
|
||||
} else if (type === "delete") {
|
||||
this.doDelete(row)
|
||||
} else if (type === "openCode") {
|
||||
this.url = location.origin + "/platform/h5/activity/culture/applyUser"
|
||||
this.codeDialogVisible = true
|
||||
} else if (type === "export") {
|
||||
location.href = "/platform/activity/info/mange/export?id=" + row.id
|
||||
}
|
||||
},
|
||||
goBack() {
|
||||
this.doSearch()
|
||||
this.$refs.guava.index()
|
||||
},
|
||||
openEdit(row) {
|
||||
this.$refs.guava.edit(() => {
|
||||
this.$refs.applyActivity.openEdit(row.id)
|
||||
})
|
||||
},
|
||||
openView(row) {
|
||||
this.$refs.guava.view(() => {
|
||||
this.$refs.infoActivity.findOne(row.id)
|
||||
})
|
||||
},
|
||||
doDelete(row) {
|
||||
const {id} = row
|
||||
this.$confirm("确定要删除该活动吗?", "提示", {type: "warning"}).then(async () => {
|
||||
this.$set(row, "loading", true)
|
||||
const resp = await this.$axios.post("/platform/activity/culture/infoManage/doDelete", {id: id})
|
||||
if (resp.code === 0) {
|
||||
this.doSearch()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.error(resp.msg)
|
||||
}
|
||||
this.$set(row, "loading", false)
|
||||
})
|
||||
},
|
||||
pageData() {
|
||||
this.tableLoading = true
|
||||
this.pageForm.activity_type = this.activity_type
|
||||
this.$axios.post("/platform/activity/culture/infoManage/pageData", this.pageForm).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
})
|
||||
this.tableLoading = false
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.pageData()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,469 @@
|
||||
const singleSignUp = {
|
||||
template: /*language=HTML*/ `
|
||||
<el-dialog title="活动报名" :visible.sync="dialogVisible" width="70%">
|
||||
<div class="process-title">活动信息</div>
|
||||
<el-descriptions :column="3" border class="margin-top" style="margin: 10px" title="">
|
||||
<el-descriptions-item label="活动名称" span="3">
|
||||
<span class="item-center"> {{ viewData.name }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="联系人">
|
||||
<span v-if="viewData.username">
|
||||
{{ viewData.username }}
|
||||
({{ viewData.loginname }})</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="联系方式">
|
||||
{{ viewData.mobile }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动编号">
|
||||
{{ viewData.activityCode }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动编号">
|
||||
{{ viewData.projectTypeName }}({{ viewData.projectTypeCode }})
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动类型" :span="2">
|
||||
{{ viewData.activity_type === 40001 ? '校工会活动' : viewData.activity_type === 40002 ? '分工会活动'
|
||||
:
|
||||
'协会/社团活动' }}
|
||||
</el-descriptions-item>
|
||||
<!-- <el-descriptions-item label="活动计划时间">-->
|
||||
<!-- {{ viewData.startPlannedDate + ' - ' + viewData.endPlannedDate }}-->
|
||||
<!-- </el-descriptions-item>-->
|
||||
<el-descriptions-item label="活动时间">
|
||||
{{ viewData.startTime + ' - ' + viewData.endTime }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="报名时间" v-if="viewData.applyStartTime">
|
||||
{{ viewData.applyStartTime + ' - ' + viewData.applyEndTime }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动人数">
|
||||
{{ viewData.peopleNum || '暂无' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="活动地点">
|
||||
{{ viewData.address }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="报名方式">
|
||||
<span v-if="viewData.signUpMethod===1">个人报名</span>
|
||||
<span v-else-if="viewData.signUpMethod===2">分工会报名</span>
|
||||
<span v-else-if="viewData.signUpMethod===3">组队报名</span>
|
||||
<span v-else-if="!viewData.signUpMethod">无需报名</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="是否用于报名">
|
||||
<span v-if="viewData.isEnrollSystem">活动报名</span>
|
||||
<span v-else>活动管理</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="报名人数限制" span="3" v-if="viewData.signUpMethod!=null">
|
||||
<span v-if="viewData.userNumberLimit===1">总人数限制({{
|
||||
viewData.totalUserNumberLimit
|
||||
}}人)</span>
|
||||
<span v-else-if="viewData.userNumberLimit===2">分工会人数限制</span>
|
||||
<span v-else-if="!viewData.userNumberLimit">不限制</span>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="分工会限制名额" span="3" v-if="viewData.userNumberLimit===2">
|
||||
<el-table :data="viewData.unionUserNumberLimit" border height="500" size="small"
|
||||
stripe>
|
||||
<el-table-column align="center" header-align="center" label="序号"
|
||||
type="index"
|
||||
width="100">
|
||||
</el-table-column>
|
||||
<el-table-column label="分工会名称" prop="unionname"></el-table-column>
|
||||
<el-table-column label="分工会人数" prop="teacherCount"></el-table-column>
|
||||
<el-table-column label="限制人数" prop="limitNum"></el-table-column>
|
||||
</el-table>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="封面图" span="3">
|
||||
<img :src="viewData.cover"
|
||||
class="avatar"
|
||||
style="height: 200px;width: auto" v-if="viewData.cover">
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="活动内容" span="3">
|
||||
<div v-html="viewData.activityContent"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<!-- 个人报名 啥也不要-->
|
||||
<div v-if="viewData.signUpMethod===1">
|
||||
<div class="process-title">个人报名信息</div>
|
||||
<el-table :data="teamUsers" class="mt10">
|
||||
<el-table-column label="序号" type="index" width="60px"></el-table-column>
|
||||
<el-table-column prop="userName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="loginName" label="工号"></el-table-column>
|
||||
<el-table-column prop="sex" label="性别"></el-table-column>
|
||||
<el-table-column prop="unitName" label="单位"></el-table-column>
|
||||
<el-table-column prop="mobile" label="手机号"></el-table-column>
|
||||
<el-table-column prop="applyUserId" label="标识">
|
||||
<template slot-scope="{row}">
|
||||
<el-tag size="mini" v-if="row.applyUserId==row.userId">
|
||||
报名人
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<!-- 组队报名-->
|
||||
<div v-else-if="viewData.signUpMethod===2">
|
||||
<div class="process-title">选择组队队友,组队人数 <span style="color: red">{{viewData.teamNum}}</span>人
|
||||
</div>
|
||||
<span v-if="!isApplyUser" class="text-primary">如需取消报名,请联系报名人。</span>
|
||||
<el-select
|
||||
v-if="isApplyUser && inApplyTime"
|
||||
v-model="searchTeammateUserId"
|
||||
filterable
|
||||
clearable
|
||||
remote
|
||||
reserve-keyword
|
||||
placeholder="请输入关键词"
|
||||
:remote-method="queryTeammate">
|
||||
<el-option
|
||||
v-for="item in teammateOptions"
|
||||
:key="item.userId"
|
||||
:label="item.userName + '(' + item.loginName + ')'"
|
||||
:value="item.userId">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-button v-if="isApplyUser && inApplyTime" class="ml5" type="primary" icon="el-icon-plus"
|
||||
@click="addTeamUser">添加
|
||||
</el-button>
|
||||
|
||||
<el-table :data="teamUsers" class="mt10">
|
||||
<el-table-column label="序号" type="index" width="60px"></el-table-column>
|
||||
<el-table-column prop="userName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="loginName" label="工号"></el-table-column>
|
||||
<el-table-column prop="sex" label="性别"></el-table-column>
|
||||
<el-table-column prop="unitName" label="单位"></el-table-column>
|
||||
<el-table-column prop="mobile" label="手机号"></el-table-column>
|
||||
<el-table-column prop="applyUserId" label="标识">
|
||||
<template slot-scope="{row}">
|
||||
<!-- v-if="scope.row.applyUserId===scope.row.userId"-->
|
||||
<el-tag size="mini" v-if="row.applyUserId==row.userId">
|
||||
报名人
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="100px"
|
||||
v-if="(isApplyUser || teamUsers.length===0) && inApplyTime">
|
||||
<template slot-scope="scope">
|
||||
<el-button type="danger" size="mini" @click="removeTeamUser(scope.$index)"
|
||||
v-if="scope.row.applyUserId!==scope.row.userId">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<!-- 分工会报名-->
|
||||
<div v-else-if="viewData.signUpMethod===3">
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 表单填写-->
|
||||
<template v-if="isCustomForm">
|
||||
<div class="process-title">填写报名信息</div>
|
||||
<form-create
|
||||
:value.sync="dynamicFormData"
|
||||
v-model="fapi"
|
||||
:rule="formCreateRule"
|
||||
:option="formCreateOption"
|
||||
></form-create>
|
||||
</template>
|
||||
|
||||
<template slot="footer">
|
||||
<el-button type="" @click="dialogVisible = false">取消</el-button>
|
||||
<!-- 报名人才有的权限 -->
|
||||
<template v-if="isApplyUser">
|
||||
<el-button v-if="!isSignUp && inApplyTime" type="primary" @click="onConfirm">确认报名</el-button>
|
||||
<el-button v-if="isSignUp && inApplyTime" type="primary" @click="onConfirmAgain">重新提交
|
||||
</el-button>
|
||||
<el-button v-if="isSignUp && inApplyTime" type="danger" @click="onCancel">取消报名</el-button>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
</el-dialog>
|
||||
`,
|
||||
store,
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
viewData: {},
|
||||
id: null,
|
||||
dynamicFormData: {},
|
||||
formCreateRule: [],
|
||||
formCreateOption: {},
|
||||
fapi: null,
|
||||
|
||||
//搜索框
|
||||
searchTeammateUserId: null,
|
||||
//搜索框选新娘
|
||||
teammateOptions: [],
|
||||
//表格用户
|
||||
teamUsers: [],
|
||||
//是否报名
|
||||
isSignUp: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
isCustomForm() {
|
||||
return this.viewData && this.viewData.formConfig != null && this.viewData.formConfig !== ""
|
||||
},
|
||||
//是否报名人
|
||||
isApplyUser() {
|
||||
if (this.teamUsers) {
|
||||
return this.teamUsers.every((v) => v.applyUserId === this.$store.state.user.id)
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
},
|
||||
//是否在活动报名时间内
|
||||
inApplyTime() {
|
||||
if (this.viewData) {
|
||||
const now = new Date().getTime()
|
||||
const start = this.$moment(this.viewData.applyStartTime).valueOf()
|
||||
const end = this.$moment(this.viewData.applyEndTime).valueOf()
|
||||
return now >= start && now <= end
|
||||
}
|
||||
return false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(id) {
|
||||
this.dialogVisible = true
|
||||
this.id = id
|
||||
this.activityInfo()
|
||||
},
|
||||
|
||||
//查询报名人员
|
||||
listTeamUser() {
|
||||
this.$axios.post("/platform/activity/culture/applyUser/listTeamUser", {activityId: this.id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.isSignUp = res.data.length > 0
|
||||
this.teamUsers = res.data
|
||||
this.defaultAddSelf()
|
||||
this.customFormInit()
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
//表单回显
|
||||
customFormInit() {
|
||||
if (this.teamUsers && this.teamUsers.length > 0) {
|
||||
const self = this.teamUsers.find((v) => v.userId === this.$store.state.user.id)
|
||||
if (self && this.isCustomForm) {
|
||||
this.dynamicFormData = self.dynamicFormData
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//组队和个人报名默认增加自己
|
||||
defaultAddSelf() {
|
||||
if (this.teamUsers.length === 0 && [1, 2].includes(this.viewData.signUpMethod)) {
|
||||
this.teamUsers.push({
|
||||
userId: this.$store.state.user.id,
|
||||
userName: this.$store.state.user.username,
|
||||
loginName: this.$store.state.user.loginname,
|
||||
sex: this.$store.state.user.sex,
|
||||
unitName: this.$store.state.user?.unit?.name,
|
||||
mobile: this.$store.state.user.mobile,
|
||||
applyUserId: this.$store.state.user.id
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
//提交报名
|
||||
async onConfirm() {
|
||||
if (this.isCustomForm && this.fapi) {
|
||||
let formValid = false
|
||||
try {
|
||||
await this.fapi.validate()
|
||||
formValid = true
|
||||
} catch (e) {
|
||||
formValid = false
|
||||
}
|
||||
if (!formValid) return
|
||||
}
|
||||
|
||||
//组队
|
||||
if (this.viewData.signUpMethod === 2) {
|
||||
//组队人数判断
|
||||
if (this.teamUsers.length === 0) {
|
||||
this.$message.warning("请添加队友后再提交!")
|
||||
return
|
||||
}
|
||||
if (this.teamUsers.length < this.viewData.teamNum) {
|
||||
this.$message.warning("您选择的人数小于" + this.viewData.teamNum + "人,请重新选择!")
|
||||
return
|
||||
}
|
||||
if (this.teamUsers.length > this.viewData.teamNum) {
|
||||
this.$message.warning("您选择的人数大于" + this.viewData.teamNum + "人,请重新选择!")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
//分工会
|
||||
if (this.viewData.signUpMethod === 3) {
|
||||
// if (this.teamUsers.length === 0) {
|
||||
// this.$message.warning("请添加报名人员后再提交!")
|
||||
// return
|
||||
// }
|
||||
// if (this.teamUsers.length > this.viewData.teamNum) {
|
||||
// this.$message.warning("您选择的人数大于" + this.viewData.teamNum + "人,请重新选择!")
|
||||
// return
|
||||
// }
|
||||
}
|
||||
|
||||
let formData = {
|
||||
activityId: this.id
|
||||
}
|
||||
if (this.isCustomForm) {
|
||||
formData.ext = JSON.stringify(this.fapi.formData())
|
||||
}
|
||||
if (this.viewData.signUpMethod === 2 || this.viewData.signUpMethod === 3) {
|
||||
formData.teamUserIds = JSON.stringify(this.teamUsers.map((v) => v.userId))
|
||||
}
|
||||
|
||||
this.$confirm("确定提交报名信息吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
this.$axios.post("/platform/activity/culture/applyUser/signUp", formData).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.dialogVisible = false
|
||||
this.$message.success(res.msg)
|
||||
this.$emit("refresh", null)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// this.fapi.validate((valid, fail) => {
|
||||
//
|
||||
// })
|
||||
},
|
||||
|
||||
//再次报名
|
||||
onConfirmAgain() {
|
||||
if (this.isCustomForm && this.fapi) {
|
||||
console.log(this.fapi.validate())
|
||||
}
|
||||
|
||||
//组队
|
||||
if (this.viewData.signUpMethod === 2) {
|
||||
//组队人数判断
|
||||
if (this.teamUsers.length === 0) {
|
||||
this.$message.warning("请添加队友后再提交!")
|
||||
return
|
||||
}
|
||||
if (this.teamUsers.length < this.viewData.teamNum) {
|
||||
this.$message.warning("您选择的人数小于" + this.viewData.teamNum + "人,请重新选择!")
|
||||
return
|
||||
}
|
||||
if (this.teamUsers.length > this.viewData.teamNum) {
|
||||
this.$message.warning("您选择的人数大于" + this.viewData.teamNum + "人,请重新选择!")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
//分工会
|
||||
if (this.viewData.signUpMethod === 3) {
|
||||
if (this.teamUsers.length === 0) {
|
||||
this.$message.warning("请添加报名人员后再提交!")
|
||||
return
|
||||
}
|
||||
if (this.teamUsers.length > this.viewData.teamNum) {
|
||||
this.$message.warning("您选择的人数大于" + this.viewData.teamNum + "人,请重新选择!")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let formData = {
|
||||
activityId: this.id,
|
||||
isAgain: true
|
||||
}
|
||||
if (this.isCustomForm) {
|
||||
formData.ext = JSON.stringify(this.fapi.formData())
|
||||
}
|
||||
if (this.viewData.signUpMethod === 2 || this.viewData.signUpMethod === 3) {
|
||||
formData.teamUserIds = JSON.stringify(this.teamUsers.map((v) => v.userId))
|
||||
}
|
||||
|
||||
this.$confirm("确定重新提交报名信息吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
this.$axios.post("/platform/activity/culture/applyUser/signUp", formData).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.dialogVisible = false
|
||||
this.$message.success(res.msg)
|
||||
this.$emit("refresh", null)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
//取消报名
|
||||
onCancel() {
|
||||
this.$confirm("确定取消报名吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
this.$axios.post("/platform/activity/culture/applyUser/cancelSignUp", {activityId: this.id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.dialogVisible = false
|
||||
this.$message.success(res.msg)
|
||||
this.$emit("refresh", null)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
//查询队友信息
|
||||
queryTeammate(val) {
|
||||
if (val) {
|
||||
this.$axios.post("/platform/activity/culture/applyUser/queryTeammate", {keyword: val}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
res.data.map(v => v.applyUserId = this.$store.state.user.id)
|
||||
this.teammateOptions = res.data
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
//添加队友
|
||||
addTeamUser() {
|
||||
if (!this.searchTeammateUserId) {
|
||||
this.$message.error("请先选择后再添加")
|
||||
return
|
||||
}
|
||||
if (this.teamUsers.some((v) => v.userId === this.searchTeammateUserId)) {
|
||||
this.$message.error("请勿重复添加")
|
||||
return
|
||||
}
|
||||
if (this.teamUsers.length >= this.viewData.teamNum) {
|
||||
this.$message.error("已满员")
|
||||
return
|
||||
}
|
||||
this.teamUsers.push(this.teammateOptions.find((v) => v.userId === this.searchTeammateUserId))
|
||||
this.searchTeammateUserId = null
|
||||
},
|
||||
|
||||
//移除队友
|
||||
removeTeamUser(index) {
|
||||
this.teamUsers.splice(index, 1)
|
||||
},
|
||||
|
||||
//活动信息
|
||||
activityInfo() {
|
||||
this.$axios.post("/platform/activity/culture/infoManage/activityInfo", {id: this.id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.viewData = res.data
|
||||
if (this.viewData.formConfig) {
|
||||
this.formCreateRule = formCreate.parseJson(this.viewData.formConfig.rule)
|
||||
this.formCreateOption = formCreate.parseJson(this.viewData.formConfig.options)
|
||||
}
|
||||
this.listTeamUser()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
const ACTIVITY_CULTURE_USER_STATISTICS = {
|
||||
template: /*language=HTML*/ `
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
|
||||
<search @search="doSearch">
|
||||
<search-item label="活动时间">
|
||||
<el-date-picker
|
||||
@change="getActivityByYearOrType"
|
||||
:clearable="false"
|
||||
placeholder="活动时间"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
|
||||
<search-item label="活动名称">
|
||||
<el-select filterable placeholder="请选择活动" style="width: 100%"
|
||||
v-model="pageForm.activityId">
|
||||
<el-option
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
v-for="item in activityList">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="工会名称" v-if="activity_type===40002||activity_type===40001">
|
||||
<el-select clearable filterable placeholder="请选择工会"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.unionId">
|
||||
<el-option
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
v-for="item in unionList">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="姓名/工号">
|
||||
<el-input @keyup.enter.native="doSearch" clearable
|
||||
placeholder="请输入姓名/工号"
|
||||
v-model="pageForm.searchKeyword">
|
||||
<el-select placeholder="姓名/工号" slot="prepend"
|
||||
style="width: 80px;"
|
||||
v-model="pageForm.searchName">
|
||||
<el-option label="姓名" value="atp.username"></el-option>
|
||||
<el-option label="工号" value="atp.loginanme"></el-option>
|
||||
</el-select>
|
||||
</el-input>
|
||||
</search-item>
|
||||
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="人员列表">
|
||||
<el-button @click="doExport" icon="el-icon-s-promotion" type="primary" size="mini">导出
|
||||
</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" row-key="id"
|
||||
style="width: 100%;" v-loading="tableLoading">
|
||||
<el-table-column :index="indexMethod" align="center" header-align="center"
|
||||
label="序号" type="index"
|
||||
fixed="left"
|
||||
width="80px"></el-table-column>
|
||||
<el-table-column
|
||||
:key="column.prop"
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
:fixed="column.fixed"
|
||||
:min-width="column.width || 180"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
v-for="column in fullTableColumns">
|
||||
<template v-if="column.type==='tableForm'" scope="{row}">
|
||||
<el-link @click="openMore(row.dynamicFormData)">点击查看</el-link>
|
||||
</template>
|
||||
<template v-else-if="column.type==='upload'" scope="{row}">
|
||||
<el-link @click="openDownload(row.dynamicFormData,column.field)">点击下载</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<dynamic-Table-form-eval ref="dynamicTableFormEvalRef"></dynamic-Table-form-eval>
|
||||
</guava>
|
||||
`,
|
||||
props: {
|
||||
activity_type: {
|
||||
value: { type: Object, default: "" }
|
||||
}
|
||||
},
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
unionList: [],
|
||||
activityList: [],
|
||||
pageForm: {
|
||||
unionId: "",
|
||||
searchName: "atp.username",
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
tableColumns: [
|
||||
{ prop: "userName", label: "姓名", width: 180, fixed: "left" },
|
||||
{ prop: "loginName", label: "工号", width: 180, fixed: "left" },
|
||||
{ prop: "sex", label: "性别", width: 70 },
|
||||
{ prop: "mobile", label: "联系方式", width: 180 },
|
||||
{ prop: "unitName", label: "所属单位", width: 200 },
|
||||
{ prop: "unionName", label: "所属工会", width: 200 },
|
||||
{ prop: "applyDateTime", label: "报名时间", width: 180 },
|
||||
{ prop: "applyUserUserName", label: "报名人", width: 180 }
|
||||
],
|
||||
dynamicTableColumns: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
fullTableColumns() {
|
||||
return this.tableColumns.concat(this.dynamicTableColumns)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getNestedValue: getNestedValue,
|
||||
|
||||
openMore(dynamicFormData) {
|
||||
const formConfig = this.activityList.find((v) => v.id === this.pageForm.activityId)?.formConfig
|
||||
this.$refs.dynamicTableFormEvalRef.onOpen(formConfig, dynamicFormData)
|
||||
},
|
||||
|
||||
openDownload(data,key){
|
||||
const jsonData = JSON.parse(data)
|
||||
const urls = jsonData[key]
|
||||
if(urls){
|
||||
this.$downLoad(urls[0])
|
||||
}
|
||||
},
|
||||
|
||||
async doExport() {
|
||||
if (!this.pageForm.activityId) {
|
||||
return
|
||||
}
|
||||
const { activityId, unionId } = this.pageForm
|
||||
this.$downLoad("/platform/activity/culture/userStatistics/doExportUser", {
|
||||
id: activityId,
|
||||
unionId: unionId
|
||||
})
|
||||
},
|
||||
pageData() {
|
||||
if (!this.pageForm.activityId) {
|
||||
return
|
||||
}
|
||||
this.$axios
|
||||
.post("/platform/activity/culture/userStatistics/dynamicTableColumns", { activityId: this.pageForm.activityId })
|
||||
.then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.dynamicTableColumns = res.data
|
||||
}
|
||||
})
|
||||
this.tableLoading = true
|
||||
this.pageForm.activity_type = this.activity_type
|
||||
this.$axios
|
||||
.post("/platform/activity/culture/userStatistics/pageData", this.pageForm)
|
||||
.then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.tableLoading = false
|
||||
})
|
||||
},
|
||||
async getActivityByYearOrType() {
|
||||
const resp = await $.get("/platform/activity/culture/userStatistics/getActivityByYearOrType", {
|
||||
activity_type: this.activity_type,
|
||||
year: this.pageForm.year
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.activityList = resp.data
|
||||
if (resp.data && resp.data.length > 0) {
|
||||
this.$set(this.pageForm, "activityId", resp.data[0].id)
|
||||
this.pageData()
|
||||
} else {
|
||||
this.$set(this.pageForm, "activityId", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
await this.getActivityByYearOrType()
|
||||
this.unionList = await this.$businessTool.listUnion()
|
||||
}
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-apply-activity :activity_type="activityType" ref="activityApply"></activity-culture-apply-activity>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/applyActivity.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40001
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-apply-activity": ACTIVITY_CULTURE_APPLY_ACTIVITY
|
||||
},
|
||||
methods: {},
|
||||
async created() {
|
||||
setTimeout(()=>{this.$refs.activityApply.init()},500)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,32 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-apply-user :activity_type="activityType"></activity-culture-apply-user>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/applyUser.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40001
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-apply-user": ACTIVITY_CULTURE_APPLY_USER
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,30 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<activity-culture-info-manage :activity_type="activityType"></activity-culture-info-manage>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/infoMange.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40001
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-info-manage": ACTIVITY_CULTURE_INFO_MANAGE
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-user-statistics :activity_type="activityType"></activity-culture-user-statistics>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/userStatistics.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40001
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-user-statistics": ACTIVITY_CULTURE_USER_STATISTICS
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-apply-activity :activity_type="activityType" ref="activityApply"></activity-culture-apply-activity>
|
||||
</guava>
|
||||
</div>
|
||||
<script>
|
||||
<!--#include("../../common/applyActivity.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40002
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-apply-activity": ACTIVITY_CULTURE_APPLY_ACTIVITY
|
||||
},
|
||||
methods: {},
|
||||
async created() {
|
||||
setTimeout(()=>{this.$refs.activityApply.init()},500)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,32 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-apply-user :activity_type="activityType"></activity-culture-apply-user>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/applyUser.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40002
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-apply-user": ACTIVITY_CULTURE_APPLY_USER
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<activity-culture-audit-activity :activity_type="activityType"></activity-culture-audit-activity>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/auditActivity.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40002
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-audit-activity": ACTIVITY_CULTURE_AUDIT_ACTIVITY
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,30 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<activity-culture-info-manage :activity_type="activityType"></activity-culture-info-manage>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/infoMange.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40002
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-info-manage": ACTIVITY_CULTURE_INFO_MANAGE
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<activity-culture-user-statistics :activity_type="activityType"></activity-culture-user-statistics>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../../common/userStatistics.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityType: 40002
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-culture-user-statistics": ACTIVITY_CULTURE_USER_STATISTICS
|
||||
},
|
||||
methods: {},
|
||||
async created() {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,251 @@
|
||||
const basicForm = {
|
||||
template: /*language=HTML*/ `
|
||||
<el-dialog :visible.sync="dialogVisible" title="基础设置">
|
||||
<div style="overflow-y: auto">
|
||||
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="150px">
|
||||
<el-form-item label="类型" prop="category">
|
||||
<el-radio-group v-model="formData.category" size="small">
|
||||
<el-radio v-for="item in dict.type.ACTIVITY_QSV_CATEGORY" :label="item.code"
|
||||
:key="item.code"
|
||||
border>
|
||||
{{item.label}}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input v-model="formData.title" placeholder="请输入标题" maxlength="50"
|
||||
show-word-limit></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="说明" prop="description">
|
||||
<text-editor v-model="formData.description" :height="150"></text-editor>
|
||||
</el-form-item>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="开始时间" prop="startTime">
|
||||
<el-date-picker v-model="formData.startTime" type="datetime" placeholder="选择日期时间"
|
||||
style="width: 100%"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="结束时间" prop="endTime">
|
||||
<el-date-picker v-model="formData.endTime" type="datetime" placeholder="选择日期时间"
|
||||
style="width: 100%"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-form-item label="参加人员范围" prop="groupId">
|
||||
<div style="display: flex;column-gap: 10px">
|
||||
<el-select clearable filterable
|
||||
placeholder="参加人员范围"
|
||||
prop="groupId"
|
||||
style="width: 99%;"
|
||||
v-model="formData.groupId">
|
||||
<el-option :key="item.groupId"
|
||||
:label="item.groupName"
|
||||
:value="item.groupId"
|
||||
v-for="item in activityGroupOptions"></el-option>
|
||||
</el-select>
|
||||
<el-button
|
||||
@click="$refs.drawerUserScope.userScopeDialog = true"
|
||||
type="primary">设置
|
||||
</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<template v-if="formData.category==='QUIZ'">
|
||||
<el-form-item label="出题模式" prop="mode">
|
||||
<span slot="label">
|
||||
出题模式
|
||||
<el-popover placement="bottom" trigger="hover">
|
||||
<div>
|
||||
<p>定时定题:例如一周答题,每天显示不同的题目,需要在题目设置显示日期。</p>
|
||||
<p>常规模式:无</p>
|
||||
</div>
|
||||
<i class="el-icon-question" slot="reference"></i>
|
||||
</el-popover>
|
||||
</span>
|
||||
<el-radio-group v-model="formData.mode" size="small">
|
||||
<el-radio v-for="item in dict.type.ACTIVITY_QSV_MODE" :label="item.code"
|
||||
:key="item.code"
|
||||
border>
|
||||
{{item.label}}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="题目顺序打乱" prop="shuffleSubject">
|
||||
<span slot="label">
|
||||
题目顺序打乱
|
||||
<el-popover placement="bottom" trigger="hover">
|
||||
<div>
|
||||
题目都是相同的,只是顺序不一致。
|
||||
</div>
|
||||
<i class="el-icon-question" slot="reference"></i>
|
||||
</el-popover>
|
||||
</span>
|
||||
<el-switch v-model="formData.shuffleSubject"></el-switch>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="题目显示模式" prop="displayMode" v-if="formData.category==='QUIZ' && formData.mode==='REGULAR'">
|
||||
<span slot="label">
|
||||
题目显示模式
|
||||
<el-popover placement="bottom" trigger="hover">
|
||||
<div>
|
||||
注:定时定题模式无需配置。
|
||||
<p>
|
||||
常规模式下配置例如:题库50题,只需抽取其中20题答题则需配置为随机抽取模式。
|
||||
</p>
|
||||
</div>
|
||||
<i class="el-icon-question" slot="reference"></i>
|
||||
</el-popover>
|
||||
</span>
|
||||
<el-radio-group v-model="formData.displayMode" size="small">
|
||||
<el-radio label="ALL" border>全部</el-radio>
|
||||
<el-radio label="RANDOM" border>随机抽取</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="单次随机抽取题数" prop="randomCount"
|
||||
v-if="formData.category==='QUIZ' && formData.mode==='REGULAR' && formData.displayMode==='RANDOM'">
|
||||
<el-input-number v-model="formData.randomCount" :min="1" :max="100"></el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="总随机抽取次数" prop="totalRandom"
|
||||
v-if="formData.category==='QUIZ' && formData.mode==='REGULAR' && formData.displayMode==='RANDOM'">
|
||||
<el-input-number v-model="formData.totalRandom" :min="1" :max="100"></el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="是否可重复答题" prop="repeatable" v-if="formData.mode==='SCHEDULED' || (formData.mode==='REGULAR' && formData.displayMode==='ALL')">
|
||||
<el-switch v-model="formData.repeatable"></el-switch>
|
||||
</el-form-item>
|
||||
|
||||
<!-- <el-form-item label="重复答题模式" prop="repeatMode" v-if="formData.repeatable">-->
|
||||
<!-- <span slot="label">-->
|
||||
<!-- 重复答题模式(作废)-->
|
||||
<!-- <el-popover placement="bottom" trigger="hover">-->
|
||||
<!-- <div>-->
|
||||
<!-- 定时定题模式下每天即用户每天可答题多次-->
|
||||
<!-- </div>-->
|
||||
<!-- <i class="el-icon-question" slot="reference"></i>-->
|
||||
<!-- </el-popover>-->
|
||||
<!-- </span>-->
|
||||
<!-- <el-radio-group v-model="formData.repeatMode" size="small">-->
|
||||
<!-- <el-radio v-for="item in dict.type.ACTIVITY_QSV_REPEAT_MODE" :label="item.code"-->
|
||||
<!-- :key="item.code" border>-->
|
||||
<!-- {{item.label}}-->
|
||||
<!-- </el-radio>-->
|
||||
<!-- </el-radio-group>-->
|
||||
<!-- </el-form-item>-->
|
||||
|
||||
<el-form-item label="最大答题次数" prop="maxAttempts" v-if="formData.repeatable && (formData.mode==='SCHEDULED' || (formData.mode==='REGULAR' && formData.displayMode==='ALL'))">
|
||||
<el-input-number v-model="formData.maxAttempts" :min="1" :max="100"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="时间限制(min)" prop="timeLimit">
|
||||
<span slot="label">
|
||||
时间限制(min)
|
||||
<el-popover placement="bottom" trigger="hover">
|
||||
<div>
|
||||
无需限制请设置为0
|
||||
</div>
|
||||
<i class="el-icon-question" slot="reference"></i>
|
||||
</el-popover>
|
||||
</span>
|
||||
|
||||
<el-input-number v-model="formData.timeLimit" :min="0" :max="100"
|
||||
placeholder="无需限制请设置为0"></el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="得分统计模式" prop="scoreMode" v-if="formData.category==='QUIZ'">
|
||||
<el-radio-group v-model="formData.scoreMode" size="small">
|
||||
<el-radio v-for="item in dict.type.ACTIVITY_QSV_SCORE_MODE" :label="item.code"
|
||||
:key="item.code" border>
|
||||
{{item.label}}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="封面" prop="cover">
|
||||
<file-upload
|
||||
:upload_number="1"
|
||||
:value.sync="formData.cover"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
complete_result
|
||||
upload_mode="image"
|
||||
upload_result_category="interval"
|
||||
></file-upload>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-form>
|
||||
</div>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="onSubmit">确 定</el-button>
|
||||
</div>
|
||||
<drawer-user-scope
|
||||
@group_change="getActivityGroup"
|
||||
ref="drawerUserScope"
|
||||
:group_id.sync="formData.groupId"
|
||||
></drawer-user-scope>
|
||||
</el-dialog>
|
||||
`,
|
||||
dicts: ["ACTIVITY_QSV_CATEGORY", "ACTIVITY_QSV_MODE", "ACTIVITY_QSV_REPEAT_MODE", "ACTIVITY_QSV_SCORE_MODE"],
|
||||
components: {
|
||||
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue")
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
formData: {},
|
||||
formRules: {
|
||||
category: [{ required: true, message: "请选择类型", trigger: "change" }],
|
||||
title: [{ required: true, message: "请输入标题", trigger: "change" }],
|
||||
startTime: [{ required: true, message: "请选择开始时间", trigger: "change" }],
|
||||
endTime: [{ required: true, message: "请选择结束时间", trigger: "change" }],
|
||||
mode: [{ required: true, message: "请选择出题模式", trigger: "change" }],
|
||||
scoreMode: [{ required: true, message: "请选择得分统计模式", trigger: "change" }]
|
||||
},
|
||||
activityGroupOptions: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(id) {
|
||||
this.dialogVisible = true
|
||||
this.getActivityGroup()
|
||||
if (id) {
|
||||
this.$axios.post("/platform/qsv/activity/findOne", { id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.formData = res.data
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.formData = {}
|
||||
}
|
||||
},
|
||||
onSubmit() {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (valid) {
|
||||
this.$axios.post("/platform/qsv/activity/save", this.formData).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.dialogVisible = false
|
||||
this.$emit("refresh", null)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
getActivityGroup() {
|
||||
this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.activityGroupOptions = res.data
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app">
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker placeholder="年度" type="year" v-model="pageForm.year" value-format="yyyy"></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="标题">
|
||||
<el-input placeholder="标题" v-model="pageForm.title" clearable></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card shadow="never">
|
||||
<table-tool>
|
||||
<el-button @click="$refs.basicFormRef.onOpen()" size="small" type="primary" class="mr5">新增</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" ref="tableRef" @sort-change="pageOrder">
|
||||
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
|
||||
<el-table-column label="标题" prop="title" sortable></el-table-column>
|
||||
<el-table-column label="类型" prop="category" sortable width="200">
|
||||
<template scope="{row}">
|
||||
<dict-tag :options="dict.type.ACTIVITY_QSV_CATEGORY" :value="row.category"></dict-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开始时间" prop="startTime" sortable></el-table-column>
|
||||
<el-table-column label="结束时间" prop="endTime" sortable></el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="300px">
|
||||
<template scope="{row}">
|
||||
<el-button size="mini" type="primary" @click="openEdit(row)">编辑</el-button>
|
||||
<el-button size="mini" type="primary" @click="openSubject(row.id)">题目设置</el-button>
|
||||
<el-button size="mini" type="danger" @click="onDelete(row.id)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #edit>
|
||||
<subject-form ref="subjectFormRef" @refresh="pageData"></subject-form>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<basic-form ref="basicFormRef" @refresh="pageData"></basic-form>
|
||||
<!-- <subject-form ref="subjectFormRef" @refresh="pageData"></subject-form>-->
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include('basicForm.js'){}#-->
|
||||
<!--#include('subjectForm.js'){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
dicts: ["ACTIVITY_QSV_CATEGORY"],
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"basic-form": basicForm,
|
||||
"subject-form": subjectForm
|
||||
},
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
methods: {
|
||||
openEdit(row) {
|
||||
this.$refs.basicFormRef.onOpen(row.id)
|
||||
},
|
||||
openSubject(id) {
|
||||
this.$refs.guava.edit()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.subjectFormRef.onOpen(id)
|
||||
})
|
||||
// this.$refs.subjectFormRef.onOpen(id)
|
||||
},
|
||||
onDelete(id) {
|
||||
this.$confirm("您确认删除吗, 是否继续?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
this.$axios.post("/platform/qsv/activity/delete", { id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success("删除成功")
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,83 @@
|
||||
const optionImg = {
|
||||
template: /*language=HTML*/ `
|
||||
<el-dialog :visible="visible" title="设置图片" append-to-body width="700px">
|
||||
<div style="background: #f7f8f9;text-align: center;border: solid 1px #d7d8d9;border-radius: 4px;">
|
||||
<el-upload
|
||||
action="/platform/sys/file/uploadDynamicReturnUrl"
|
||||
:show-file-list="false"
|
||||
:on-success="handleSuccess"
|
||||
:before-upload="beforeUpload">
|
||||
<img v-if="img" :src="img" class="avatar">
|
||||
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
|
||||
</el-upload>
|
||||
</div>
|
||||
<div style="padding: 10px 0">
|
||||
请上传图片
|
||||
</div>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="visible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="onConfirm">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
`,
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
img: null,
|
||||
ext: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(img = null, ext) {
|
||||
this.img = img
|
||||
this.ext = ext
|
||||
this.visible = true
|
||||
},
|
||||
handleSuccess(response, file, fileList) {
|
||||
console.log(response)
|
||||
console.log(file)
|
||||
console.log(fileList)
|
||||
if (response.code === 0) {
|
||||
this.img = response.data
|
||||
// this.img = "/platform/sys/file/download?id=t38dmq4beuhrupqb54prl52t4u"
|
||||
this.$message.success("图片上传成功")
|
||||
}
|
||||
},
|
||||
beforeUpload(file) {},
|
||||
onConfirm() {
|
||||
this.$emit("confirm", {
|
||||
img: this.img,
|
||||
ext: this.ext
|
||||
})
|
||||
this.visible = false
|
||||
}
|
||||
},
|
||||
style: /*language=CSS*/ `
|
||||
.avatar-uploader .el-upload {
|
||||
border: 1px dashed #d9d9d9;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.avatar-uploader .el-upload:hover {
|
||||
border-color: #409EFF;
|
||||
}
|
||||
|
||||
.avatar-uploader-icon {
|
||||
font-size: 28px;
|
||||
color: #8c939d;
|
||||
width: 178px;
|
||||
height: 178px;
|
||||
line-height: 178px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
width: 178px;
|
||||
height: 178px;
|
||||
display: block;
|
||||
}
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,494 @@
|
||||
<!--#include('optionImg.js'){}#-->
|
||||
|
||||
const subjectForm = {
|
||||
template: /*language=HTML*/ `
|
||||
<div class="subject-form-dialog">
|
||||
<el-form ref="form" :model="formData" :rules="formRules" label-width="120px">
|
||||
<div style="min-height:50vh;overflow-y: auto">
|
||||
<draggable v-model="subjects" handle=".drag-handler">
|
||||
<transition-group>
|
||||
<div v-for="(subject, subjectIndex) in subjects" :key="subject.id" class="subject-item">
|
||||
<div class="subject-header">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<i class="el-icon-rank drag-handler"></i>
|
||||
<span style="font-weight: bold; margin-right: 10px;">第 {{subjectIndex + 1}} 题</span>
|
||||
<el-input
|
||||
v-model="subject.title"
|
||||
placeholder="请输入题目"
|
||||
style="flex: 1">
|
||||
</el-input>
|
||||
</div>
|
||||
|
||||
<div class="subject-meta">
|
||||
<div>
|
||||
题目类型:
|
||||
<el-select
|
||||
v-model="subject.type"
|
||||
@change="subjectTypeChange(subject, subjectIndex)"
|
||||
placeholder="请选择题目类型"
|
||||
style="width: 200px;">
|
||||
<el-option label="单选题" value="radio">
|
||||
<i class="el-icon-circle-check subject-type-icon"></i>单选题
|
||||
</el-option>
|
||||
<el-option label="多选题" value="checkbox">
|
||||
<i class="el-icon-check subject-type-icon"></i>多选题
|
||||
</el-option>
|
||||
<el-option label="填空题" value="text" v-if="activity.category!=='QUIZ'">
|
||||
<i class="el-icon-edit subject-type-icon"></i>填空题
|
||||
</el-option>
|
||||
<!-- <el-option label="判断题" value="judge">-->
|
||||
<!-- <i class="el-icon-right subject-type-icon"></i>判断题-->
|
||||
<!-- </el-option>-->
|
||||
</el-select>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- <el-input-->
|
||||
<!-- v-model="subject.hint"-->
|
||||
<!-- placeholder="题目提示信息"-->
|
||||
<!-- style="width: 200px;">-->
|
||||
<!-- <template slot="prepend">提示</template>-->
|
||||
<!-- </el-input>-->
|
||||
|
||||
<div v-if="activity.category==='QUIZ'">
|
||||
题目分数:
|
||||
<el-input-number
|
||||
v-model="subject.score"
|
||||
:min="0"
|
||||
:max="100"
|
||||
placeholder="分数">
|
||||
<template slot="prepend">分数</template>
|
||||
</el-input-number>
|
||||
</div>
|
||||
|
||||
<div v-if="activity.category==='QUIZ' && activity.mode==='SCHEDULED'">
|
||||
显示日期:
|
||||
<el-date-picker
|
||||
v-model="subject.displayDate"
|
||||
type="date"
|
||||
placeholder="显示日期"
|
||||
format="yyyy-MM-dd"
|
||||
value-format="yyyy-MM-dd">
|
||||
</el-date-picker>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<template>
|
||||
<draggable v-model="subject.options" handle=".option-drag-handle"
|
||||
v-if="subject.type !== 'text'">
|
||||
<transition-group>
|
||||
<div v-for="(option, optionIndex) in subject.options"
|
||||
:key="option.id"
|
||||
class="option-item">
|
||||
<i class="el-icon-rank option-drag-handle"></i>
|
||||
<div class="option-content">
|
||||
<el-input
|
||||
v-model="option.text"
|
||||
:placeholder="'选项'+optionIndex + 1">
|
||||
<template slot="prepend">选项{{optionIndex + 1}}</template>
|
||||
</el-input>
|
||||
<!-- <el-input-->
|
||||
<!-- v-model="option.hint"-->
|
||||
<!-- placeholder="选项提示"-->
|
||||
<!-- style="margin-top: 5px;">-->
|
||||
<!-- </el-input>-->
|
||||
<div v-if="option.imageUrl" style="margin-top: 10px;">
|
||||
<img :src="option.imageUrl" class="image-preview" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="option-tools">
|
||||
<template v-if="activity.category!=='QUIZ'">
|
||||
<div class="option-img-box" v-if="option.imgUrl">
|
||||
<i class="el-icon-remove"
|
||||
@click="removeOptionImg(subjectIndex,optionIndex)"></i>
|
||||
<img :src="option.imgUrl" alt=""
|
||||
@click="openOptionImg(subjectIndex,optionIndex,option)">
|
||||
</div>
|
||||
<i v-if="!option.imgUrl" class="el-icon-picture-outline"
|
||||
style="font-size: 40px;cursor: pointer;" title="上传图片"
|
||||
@click="openOptionImg(subjectIndex,optionIndex,option)"></i>
|
||||
</template>
|
||||
|
||||
<el-switch
|
||||
v-if="activity.category==='QUIZ'"
|
||||
v-model="option.isCorrect"
|
||||
active-text="正确答案">
|
||||
</el-switch>
|
||||
<el-button
|
||||
type="danger"
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
@click="removeOption(subject, optionIndex)">
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</transition-group>
|
||||
</draggable>
|
||||
<div class="subject-toolbar">
|
||||
<div>
|
||||
<el-button
|
||||
v-if="subject.type !== 'text'"
|
||||
type="primary"
|
||||
icon="el-icon-plus"
|
||||
size="small"
|
||||
@click="addOption(subject)">
|
||||
添加选项
|
||||
</el-button>
|
||||
</div>
|
||||
<div>
|
||||
<el-button
|
||||
type="danger"
|
||||
icon="el-icon-delete"
|
||||
size="small"
|
||||
@click="removeSubject(subjectIndex)">
|
||||
删除题目
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- <div>-->
|
||||
<!-- <el-switch-->
|
||||
<!-- v-model="subject.required"-->
|
||||
<!-- active-text="必答题">-->
|
||||
<!-- </el-switch>-->
|
||||
<!-- <el-switch-->
|
||||
<!-- v-model="subject.showDate"-->
|
||||
<!-- class="date-visible"-->
|
||||
<!-- active-text="显示日期">-->
|
||||
<!-- </el-switch>-->
|
||||
<!-- </div>-->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="meta-info">
|
||||
<!-- 创建时间:{{ formatDate(subject.createTime) }}-->
|
||||
<!-- <el-button-->
|
||||
<!-- type="danger"-->
|
||||
<!-- icon="el-icon-delete"-->
|
||||
<!-- size="mini"-->
|
||||
<!-- style="float: right;"-->
|
||||
<!-- @click="removeSubject(index)">-->
|
||||
<!-- 删除题目-->
|
||||
<!-- </el-button>-->
|
||||
</div>
|
||||
</div>
|
||||
</transition-group>
|
||||
</draggable>
|
||||
<el-empty description="描述文字" v-if="subjects.length===0"></el-empty>
|
||||
</div>
|
||||
</el-form>
|
||||
|
||||
<div style="border-top: 1px solid var(--border-color-lighter);padding: 12px;text-align: right;">
|
||||
<!-- <el-button @click="visible = false">取消</el-button>-->
|
||||
<el-button type="primary" icon="el-icon-plus" @click="addSubject">
|
||||
添加题目
|
||||
</el-button>
|
||||
<el-button type="primary" icon="el-icon-check" @click="saveQuestionnaire">
|
||||
保存题目
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<option-img ref="optionImgRef" @confirm="onOptionImgConfirm"></option-img>
|
||||
</div>
|
||||
`,
|
||||
components: {
|
||||
'option-img': optionImg,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
id: null,
|
||||
visible: false,
|
||||
formData: {},
|
||||
subjects: [],
|
||||
previewDialogVisible: false,
|
||||
activity: {},
|
||||
formRules: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(id) {
|
||||
this.visible = true
|
||||
if (id) {
|
||||
this.id = id
|
||||
this.$axios.post("/platform/qsv/activity/findOne", {id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.activity = res.data
|
||||
}
|
||||
})
|
||||
this.$axios.post("/platform/qsv/activity/listSubjects", {activityId: id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.subjects = res.data
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
//生成随机id
|
||||
generateId() {
|
||||
return Date.now() + Math.random().toString(36).substr(2, 9)
|
||||
},
|
||||
|
||||
//添加题目
|
||||
addSubject() {
|
||||
this.subjects.push({
|
||||
id: this.generateId(),
|
||||
title: "",
|
||||
hint: "",
|
||||
type: "radio",
|
||||
score: 0,
|
||||
displayDate: "",
|
||||
options: [
|
||||
{
|
||||
id: this.generateId(),
|
||||
text: "选项1",
|
||||
hint: "",
|
||||
imgUrl: null,
|
||||
isCorrect: false
|
||||
},
|
||||
{
|
||||
id: this.generateId(),
|
||||
text: "选项2",
|
||||
hint: "",
|
||||
imgUrl: null,
|
||||
isCorrect: false
|
||||
}
|
||||
],
|
||||
})
|
||||
},
|
||||
|
||||
//题目类型切换
|
||||
subjectTypeChange(subject, subjectIndex){
|
||||
if(subject.type==='text'){
|
||||
subject.options = []
|
||||
}
|
||||
},
|
||||
|
||||
//删除题目
|
||||
removeSubject(index) {
|
||||
this.$confirm("确认删除该题目?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
.then(() => {
|
||||
this.subjects.splice(index, 1)
|
||||
this.$message.success("删除成功")
|
||||
})
|
||||
.catch(() => {
|
||||
})
|
||||
},
|
||||
|
||||
//添加选项
|
||||
addOption(subject) {
|
||||
subject.options.push({
|
||||
id: this.generateId(),
|
||||
text: "选项" + subject.options.length + 1,
|
||||
hint: "",
|
||||
imgUrl: null,
|
||||
isCorrect: false
|
||||
})
|
||||
},
|
||||
|
||||
//删除选项
|
||||
removeOption(subject, optionIndex) {
|
||||
subject.options.splice(optionIndex, 1)
|
||||
},
|
||||
|
||||
//打开选项上传图片
|
||||
openOptionImg(subjectIndex, optionIndex, option) {
|
||||
this.$refs.optionImgRef.onOpen(option.imgUrl, {
|
||||
subjectIndex,
|
||||
optionIndex
|
||||
})
|
||||
},
|
||||
|
||||
//选项图片上传成功回调
|
||||
onOptionImgConfirm({img, ext}) {
|
||||
this.$set(this.subjects[ext.subjectIndex].options[ext.optionIndex], "imgUrl", img)
|
||||
},
|
||||
|
||||
//删除选项图片
|
||||
removeOptionImg(subjectIndex, optionIndex){
|
||||
this.$set(this.subjects[subjectIndex].options[optionIndex], "imgUrl", null)
|
||||
console.log(this.subjects[subjectIndex])
|
||||
},
|
||||
|
||||
//保存
|
||||
saveQuestionnaire() {
|
||||
this.$axios
|
||||
.post("/platform/qsv/activity/saveSubjects", {
|
||||
activityId: this.id,
|
||||
subjects: JSON.stringify(this.subjects)
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.visible = false
|
||||
this.$message.success(res.msg)
|
||||
this.$emit("refresh", null)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
style: /*language=CSS*/ `
|
||||
/*.subject-form-dialog,.subject-form-dialog .el-dialog__body {*/
|
||||
/* background: rgb(248, 249, 250);*/
|
||||
/*}*/
|
||||
|
||||
.questionnaire-editor {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.editor-header {
|
||||
background: white;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.subject-item {
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
padding: 25px;
|
||||
margin-bottom: 20px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
|
||||
transition: all 0.3s ease;
|
||||
border: 1px dashed #d9d9d9;
|
||||
}
|
||||
|
||||
.subject-item:hover {
|
||||
box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.1);
|
||||
/*transform: translateY(-1px);*/
|
||||
}
|
||||
|
||||
.subject-header {
|
||||
border-bottom: 1px solid #eee;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.subject-toolbar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-top: 15px;
|
||||
padding-top: 15px;
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
|
||||
.toolbar {
|
||||
background: white;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.toolbar-btn {
|
||||
margin: 5px 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.option-item {
|
||||
background: #f8f9fa;
|
||||
border-radius: 4px;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.option-drag-handle {
|
||||
cursor: move;
|
||||
margin-right: 10px;
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
.option-content {
|
||||
flex-grow: 1;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.option-tools {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.preview-dialog {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.date-visible {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.subject-meta {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
margin-top: 15px;
|
||||
background: #f8f9fa;
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.image-preview {
|
||||
max-width: 200px;
|
||||
max-height: 200px;
|
||||
margin-top: 10px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #dcdfe6;
|
||||
}
|
||||
|
||||
.drag-handler {
|
||||
cursor: move;
|
||||
color: #909399;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.meta-info {
|
||||
color: #909399;
|
||||
font-size: 12px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.subject-type-icon {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
|
||||
.option-img-box{
|
||||
position: relative;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
cursor: pointer;
|
||||
flex-shrink: 0
|
||||
}
|
||||
|
||||
.option-img-box:hover .el-icon-remove {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.option-img-box img{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.option-img-box .el-icon-remove{
|
||||
position: absolute;
|
||||
top: -7px;
|
||||
right: -7px;
|
||||
color: red;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.option-img-box .el-icon-remove:hover{
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker
|
||||
:clearable="false"
|
||||
@change="listActivity"
|
||||
placeholder="选择年"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="问卷">
|
||||
<el-select filterable placeholder="所属问卷" style="width: 100%" @change="doSearch" v-model="pageForm.activityId">
|
||||
<el-option :label="item.title" :value="item.id" :key="item.id" v-for="item in activityOptions"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="姓名/工号">
|
||||
<el-input v-model="pageForm.searchKeyword" placeholder="姓名/工号" clearable></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会">
|
||||
<el-select placeholder="所属工会" v-model="pageForm.unionId" clearable filterable>
|
||||
<el-option v-for="item in unionOptions" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位">
|
||||
<el-select placeholder="所属单位" v-model="pageForm.unitId" clearable filterable>
|
||||
<el-option v-for="item in unitOptions" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="答题日期">
|
||||
<el-date-picker
|
||||
@change="doSearch"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.attemptDate"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="选择答题日期"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never">
|
||||
<table-tool>
|
||||
<el-button @click="exportXlsx" icon="el-icon-download" size="small" type="primary" class="mr5">导出xlsx</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" ref="tableRef" @sort-change="pageOrder">
|
||||
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
|
||||
<el-table-column label="姓名" prop="userName" sortable></el-table-column>
|
||||
<el-table-column label="工号" prop="loginName" sortable></el-table-column>
|
||||
<el-table-column label="性别" prop="sex" sortable></el-table-column>
|
||||
<el-table-column label="单位" prop="unitName" sortable></el-table-column>
|
||||
<el-table-column label="分工会" prop="unionName" sortable></el-table-column>
|
||||
<el-table-column label="联系方式" prop="mobile" sortable></el-table-column>
|
||||
<el-table-column label="答题日期" prop="attemptDate" sortable></el-table-column>
|
||||
<el-table-column label="得分" prop="totalScore" sortable></el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityOptions: [],
|
||||
unionOptions: [],
|
||||
unitOptions: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
listActivity() {
|
||||
this.$axios.post("/platform/qsv/quizRank/listQuiz", { year: this.pageForm.year }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.activityOptions = res.data
|
||||
if (this.activityOptions.length > 0) {
|
||||
this.pageForm.activityId = this.activityOptions[0].id
|
||||
this.pageData()
|
||||
} else {
|
||||
this.pageForm.activityId = null
|
||||
this.tableData = []
|
||||
this.pageForm.totalCount = 0
|
||||
this.pageForm.pageNumber = 1
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
exportXlsx() {
|
||||
this.$downLoad("/platform/qsv/quizRank/exportXlsx", this.pageForm)
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.unionOptions = await this.$businessTool.listUnion()
|
||||
this.unitOptions = await this.$businessTool.listUnit()
|
||||
this.listActivity()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,62 @@
|
||||
const answer = {
|
||||
/*language=HTML*/
|
||||
template: `
|
||||
<el-dialog title="查看答卷" :visible.sync="dialogVisible" width="50%">
|
||||
<el-row type="flex" justify="end" class="mb10">
|
||||
<el-button type="primary" size="small" icon="el-icon-download" @click="exportUserAnswerXlsx">导出xlsx</el-button>
|
||||
</el-row>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column label="序号" type="index" width="70"></el-table-column>
|
||||
<el-table-column v-for="item in tableColumns" :key="item.prop" :label="item.label" :prop="item.prop"></el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="100px">
|
||||
<template slot-scope="scope">
|
||||
<el-button type="danger" size="mini" icon="el-icon-delete" @click="onDelete(scope.row.id)"></el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
`,
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
tableColumns: [],
|
||||
tableData: [],
|
||||
activityId: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(activityId) {
|
||||
this.activityId = activityId
|
||||
this.dialogVisible = true
|
||||
this.list()
|
||||
},
|
||||
|
||||
list() {
|
||||
this.$axios.post("/platform/qsv/survey/userAnswer", { activityId: this.activityId }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableColumns = res.data.tableColumns
|
||||
this.tableData = res.data.tableData
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
onDelete(id) {
|
||||
this.$confirm("确定要删除吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
this.$axios.post("/platform/qsv/survey/deleteUserAnswer", { id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.list()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
exportUserAnswerXlsx() {
|
||||
this.$downLoad("/platform/qsv/survey/exportUserAnswerXlsx", { activityId: this.activityId })
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker
|
||||
:clearable="false"
|
||||
placeholder="选择年"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card shadow="never">
|
||||
<table-tool>
|
||||
<!-- <el-button @click="exportXlsx" icon="el-icon-download" size="small" type="primary" class="mr5">导出xlsx</el-button>-->
|
||||
</table-tool>
|
||||
<el-table :data="tableData" ref="tableRef" @sort-change="pageOrder">
|
||||
<el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
|
||||
<el-table-column label="标题" prop="title" width="120" sortable></el-table-column>
|
||||
<el-table-column label="类型" prop="category" sortable>
|
||||
<template scope="{row}">
|
||||
<dict-tag :options="dict.type.ACTIVITY_QSV_CATEGORY" :value="row.category"></dict-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开始时间" prop="startTime" sortable></el-table-column>
|
||||
<el-table-column label="结束时间" prop="endTime" sortable></el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="200px">
|
||||
<template scope="{row}">
|
||||
<el-button size="mini" type="primary" @click="$refs.reportRef.onOpen(row.id)">查看分析</el-button>
|
||||
<el-button size="mini" type="primary" @click="$refs.answerRef.onOpen(row.id)">查看答卷</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
<report ref="reportRef"></report>
|
||||
<answer ref="answerRef"></answer>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include('report.js'){}#-->
|
||||
<!--#include('answer.js'){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
dicts: ["ACTIVITY_QSV_CATEGORY"],
|
||||
components: { report, answer },
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
methods: {
|
||||
exportXlsx() {
|
||||
this.$axios.post("/platform/qsv/survey/exportXlsx", this.pageForm)
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,101 @@
|
||||
const report = {
|
||||
/*language=HTML*/
|
||||
template: `
|
||||
<el-dialog title="分析报告" :visible.sync="dialogVisible" width="50%">
|
||||
<div v-for="(subject,subjectIndex) in subjects" class="subject">
|
||||
<div>
|
||||
<div class="title">
|
||||
第{{subjectIndex+1}}题: {{subject.title}}
|
||||
<span class="type" v-if="subject.type==='text'">[填空题]</span>
|
||||
<span class="type" v-else-if="subject.type==='radio'">[单选题]</span>
|
||||
<span class="type" v-else-if="subject.type==='text'">[多选题]</span>
|
||||
</div>
|
||||
|
||||
<div v-if="subject.type==='text'">
|
||||
{{subject.texts.join('、')}}
|
||||
</div>
|
||||
|
||||
<div v-else-if="subject.type==='radio' || subject.type==='checkbox'">
|
||||
<el-table :data="subject.options" size="small">
|
||||
<el-table-column label="选项" prop="text"></el-table-column>
|
||||
<el-table-column label="小计" prop="selectCount" width="100"></el-table-column>
|
||||
<el-table-column label="比例" width="500">
|
||||
<template slot-scope="scope">
|
||||
<el-progress
|
||||
:percentage="Math.round(scope.row.selectCount / subject.selectTotal * 100)"></el-progress>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="详情" width="100px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button type="text" @click="openDetail(subject.id,row.id)">详情</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<el-dialog title="选择详情" :visible.sync="optionVisible" width="50%" append-to-body>
|
||||
<el-table :data="optionUsers" size="small">
|
||||
<el-table-column label="姓名" prop="userName"></el-table-column>
|
||||
<el-table-column label="工号" prop="loginName"></el-table-column>
|
||||
<el-table-column label="单位" prop="unitName"></el-table-column>
|
||||
<el-table-column label="分工会" prop="unionName"></el-table-column>
|
||||
<el-table-column label="选择时间" prop="attemptDate"></el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
</el-dialog>
|
||||
`,
|
||||
dicts: ["ACTIVITY_QSV_CATEGORY"],
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
activityId: null,
|
||||
report: null,
|
||||
subjects: [],
|
||||
optionVisible: false,
|
||||
optionUsers: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(activityId) {
|
||||
this.dialogVisible = true
|
||||
this.activityId = activityId
|
||||
this.$axios.post("/platform/qsv/survey/report", { activityId }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.subjects = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
openDetail(subjectId, optionId) {
|
||||
console.log(subjectId)
|
||||
console.log(optionId)
|
||||
this.$axios
|
||||
.post("/platform/qsv/survey/selectOptionUsers", {
|
||||
activityId: this.activityId,
|
||||
subjectId,
|
||||
optionId
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.optionVisible = true
|
||||
this.optionUsers = res.data
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
style: /*language=CSS*/ `
|
||||
.subject{
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.subject .title{
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.subject .type{
|
||||
color: #a6a6a6;
|
||||
margin-left: 10px;
|
||||
}
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,685 @@
|
||||
//分组
|
||||
const groupBy = (list, fn) => {
|
||||
const groups = {}
|
||||
list.forEach(function (o) {
|
||||
const group = JSON.stringify(fn(o))
|
||||
groups[group] = groups[group] || []
|
||||
groups[group].push(o)
|
||||
})
|
||||
|
||||
return Object.keys(groups).map(function (group) {
|
||||
return groups[group]
|
||||
})
|
||||
}
|
||||
var ACTIVITY_SPORTS_APPLY_USER = {
|
||||
template: `
|
||||
<div style="margin: 20px">
|
||||
<el-tabs tab-position="top" v-model="activeName">
|
||||
<el-tab-pane :label="activityTableData.allName" name="1">
|
||||
<el-card>
|
||||
<el-transfer
|
||||
:data="leftApplyUserList"
|
||||
:filter-method="filterMethod"
|
||||
:props="{key: 'id',label: 'name'}"
|
||||
:titles="['可报人员名单', '当前选择']"
|
||||
filterable
|
||||
ref="transfer"
|
||||
v-model="rightApplyUserList">
|
||||
<template #right-footer>
|
||||
<div class="transfer">
|
||||
<el-select :clearable="false"
|
||||
@change="flushApplyUser(applyUserList)"
|
||||
placeholder="队伍"
|
||||
size="small"
|
||||
v-if="activityTableData.eveProjectType=='2'"
|
||||
v-model="applyFromData.teamId">
|
||||
<el-option
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
v-for="item in teamList">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-button @click="applyUser" icon="el-icon-plus"
|
||||
size="small"
|
||||
type="primary">
|
||||
参加比赛
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-transfer>
|
||||
|
||||
<!-- 个人项目-->
|
||||
<template v-if="activityTableData.eveProjectType==='1'">
|
||||
<div style="display: flex;margin: 20px 0">
|
||||
<el-divider content-position="left">
|
||||
单项报名人数最多{{activityTableData.athleteMaxNum}}
|
||||
人,该队已有{{applyUserTableData.length}}
|
||||
名成员,还可报名{{activityTableData.athleteMaxNum-applyUserTableData.length}}
|
||||
人
|
||||
。
|
||||
</el-divider>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 团体项目-->
|
||||
<template v-if="activityTableData.eveProjectType==='2'">
|
||||
<!-- 如果是只需要报领队 -->
|
||||
<div style="display: flex;margin: 20px 0;align-items: center;"
|
||||
v-if="activityTableData.isLeader">
|
||||
<el-divider content-position="left">每支队伍最少运动员人数
|
||||
{{activityTableData.restrictMaxNum}} 人,最多
|
||||
{{activityTableData.restrictMaxNum}} 人,该队运动员已有
|
||||
{{activityTableData.athleteMaxNum}} 名成员,还可报名
|
||||
{{activityTableData.restrictMaxNum-applyUserTableData.filter(v=>v.identity.includes('1')).length}}
|
||||
人。
|
||||
</el-divider>
|
||||
</div>
|
||||
<!--如果是正常报名-->
|
||||
<template v-if="!activityTableData.isLeader">
|
||||
<div style="display: flex;margin: 20px 0;align-items: center;">
|
||||
<el-divider content-position="left">每支队伍最多
|
||||
{{activityTableData.restrictMaxNum}}
|
||||
人,其中领队{{activityTableData.leanderNum}}人,
|
||||
教练{{activityTableData.coachNum}}人,
|
||||
运动员必须设置{{activityTableData.athleteMaxNum}}人,
|
||||
替补{{activityTableData.substituteNum}}人。
|
||||
男运动员最少{{activityTableData.restrictBoyNum?activityTableData.restrictBoyNum:'0'}}人,
|
||||
女运动员最少{{activityTableData.restrictGirlNum?activityTableData.restrictGirlNum:'0'}}人【该队运动员已有
|
||||
{{applyUserTableData.filter(v=>v.identity.includes('1')).length}}
|
||||
人,还可报名
|
||||
{{activityTableData.athleteMaxNum-applyUserTableData.filter(v=>v.identity.includes('1')).length}}人;
|
||||
替补还可以报{{activityTableData.substituteNum-applyUserTableData.filter(v=>v.identity.includes('5')).length}}人(非必需)】
|
||||
</el-divider>
|
||||
</div>
|
||||
<el-button @click="setUserRole('4')"
|
||||
icon="el-icon-check"
|
||||
plain
|
||||
size="small" type="primary"
|
||||
v-if="activityTableData.deputyDirectorNum>0">
|
||||
设置处级领导
|
||||
</el-button>
|
||||
<el-button @click="setUserRole('3')" icon="el-icon-check" plain
|
||||
size="small"
|
||||
type="primary"
|
||||
v-if="activityTableData.leanderNum>0">设置领队
|
||||
</el-button>
|
||||
<el-button @click="setUserRole('2')" icon="el-icon-check" plain
|
||||
size="small" type="primary"
|
||||
v-if="activityTableData.coachNum>0">
|
||||
设置教练
|
||||
</el-button>
|
||||
|
||||
<el-button @click="setUserRole('5')" icon="el-icon-check"
|
||||
plain
|
||||
size="small" type="primary"
|
||||
v-if="activityTableData.substituteNum>0">
|
||||
设置替补
|
||||
</el-button>
|
||||
|
||||
<el-dropdown @command="changeTeam"
|
||||
v-if="activityTableData.eveProjectType==2&&teamList.length>1">
|
||||
<el-button size="small" type="primary">
|
||||
修改小队<i class="el-icon-arrow-down el-icon--right"></i>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item :command="{item}"
|
||||
:key="item.id" v-for="item in teamList">
|
||||
{{item.name}}
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
|
||||
</template>
|
||||
|
||||
<el-table :data="applyUserTableData"
|
||||
@selection-change="handleSelectionChange" border
|
||||
class="mt10" ref="multipleTable"
|
||||
row-key="id" size="small"
|
||||
stripe
|
||||
v-loading="applyUserTabLoading">
|
||||
|
||||
<el-table-column :reserve-selection="true"
|
||||
align="center" header-align="center"
|
||||
type="selection"
|
||||
width="55">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="序号"
|
||||
type="index"
|
||||
width="80">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="所属队"
|
||||
prop="team" width="80">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="姓名"
|
||||
prop="username" width="130">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="教工号"
|
||||
prop="loginname" width="130">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="单位"
|
||||
prop="unitname"
|
||||
sortable>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="性别"
|
||||
prop="sex" width="80">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="年龄"
|
||||
prop="age" width="80">
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center" header-align="center" label="身份"
|
||||
prop="identity" width="300px">
|
||||
<template scope="{$index,row}">
|
||||
<el-tag :disable-transitions="false"
|
||||
@close="delApplyUser($index,row,'4')"
|
||||
closable
|
||||
effect="light"
|
||||
type="info"
|
||||
v-if="row.identity.includes('4')">处级领导
|
||||
</el-tag>
|
||||
<el-tag :disable-transitions="false"
|
||||
@close="delApplyUser($index,row,'3')"
|
||||
closable
|
||||
effect="light"
|
||||
type="warning"
|
||||
v-if="row.identity.includes('3')">领队
|
||||
</el-tag>
|
||||
<el-tag :disable-transitions="false"
|
||||
@close="delApplyUser($index,row,'2')"
|
||||
closable
|
||||
effect="light"
|
||||
type="success"
|
||||
v-if="row.identity.includes('2')">教练
|
||||
</el-tag>
|
||||
<el-tag :disable-transitions="false"
|
||||
@close="delApplyUser($index,row,'1')"
|
||||
closable
|
||||
effect="light"
|
||||
v-if="row.identity.includes('1')">运动员
|
||||
</el-tag>
|
||||
<el-tag :disable-transitions="false"
|
||||
@close="delApplyUser($index,row,'5')"
|
||||
closable
|
||||
effect="light"
|
||||
type="danger"
|
||||
v-if="row.identity.includes('5')">替补
|
||||
</el-tag>
|
||||
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
</el-card>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
`,
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activeName: "1",
|
||||
eventName: "",
|
||||
activityTableData: {},
|
||||
activityData: {},
|
||||
eventList: [],
|
||||
eventData: {},
|
||||
teamList: [],
|
||||
|
||||
applyFromData: {},
|
||||
leftApplyUserList: [],
|
||||
rightApplyUserList: [],
|
||||
applyUserTableData: [],
|
||||
//全部报名的人
|
||||
applyUserList: [],
|
||||
|
||||
applyUserTabLoading: false,
|
||||
selection: [],
|
||||
//全部可报名的人员
|
||||
userList: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async openUniteApply(data) {
|
||||
this.activityTableData = data
|
||||
//固定模式
|
||||
if (data.applyUserModel === 1) {
|
||||
//单一赛还是综合赛
|
||||
if ([1, 2].includes(data.applyType) && !data.isLeader) {
|
||||
this.activityTableData.restrictMaxNum = data.athletesMaxNum + data.coachNum + data.leanderNum + data.substituteNum
|
||||
this.activityTableData.athleteMaxNum = data.athletesMaxNum
|
||||
} else {
|
||||
//如果只报领队
|
||||
this.activityTableData.athleteMaxNum = data.leanderNum
|
||||
}
|
||||
} else {
|
||||
//分配模式
|
||||
if (data.applyType === 1) {
|
||||
this.activityTableData.restrictMaxNum = data.athletesMaxNum + data.coachNum + data.leanderNum + data.substituteNum
|
||||
this.activityTableData.athleteMaxNum = data.athletesMaxNum
|
||||
} else {
|
||||
if (data.unionLimit) {
|
||||
data.unionLimit = JSON.parse(data.unionLimit)
|
||||
const unionLimit = data.unionLimit.find((v) => v.id === data.unionId)
|
||||
this.activityTableData.athleteMaxNum = unionLimit.limitCount
|
||||
} else {
|
||||
this.activityTableData.athleteMaxNum = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
this.uniteApplyReset()
|
||||
const pageForm = {
|
||||
activityId: data.activityId,
|
||||
eventId: data.eventId,
|
||||
schoolEventId: data.id,
|
||||
projectType: data.projectType,
|
||||
startAgeDate: data.startAgeDate,
|
||||
endAgeDate: data.endAgeDate,
|
||||
unionId: data.unionId
|
||||
}
|
||||
const resp = await this.$axios.post("/platform/activity/apply/getUniteApplyInfo", {
|
||||
data: JSON.stringify(pageForm),
|
||||
isMenWomenTwo: data.isMenWomen
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
const { users, awardsModeT, awardsModeG, team, activity, getEvent } = resp.data
|
||||
this.activityData = activity
|
||||
this.eventData = getEvent
|
||||
this.teamList = team
|
||||
if (this.teamList && this.teamList.length > 0) {
|
||||
this.applyFromData.teamName = this.teamList[0].name
|
||||
this.applyFromData.teamId = this.teamList[0].id
|
||||
} else {
|
||||
this.applyFromData.teamName = "运动员"
|
||||
}
|
||||
|
||||
if (users) {
|
||||
this.userList = users
|
||||
this.leftApplyUserList = users.map((user) => {
|
||||
return this.getTransProp(user)
|
||||
})
|
||||
}
|
||||
|
||||
if (awardsModeG.length > 0) {
|
||||
this.applyUserList = awardsModeG
|
||||
}
|
||||
if (awardsModeT.length > 0) {
|
||||
this.applyUserList = awardsModeT
|
||||
}
|
||||
this.flushApplyUser(this.applyUserList)
|
||||
this.sortApplyUserTableData()
|
||||
}
|
||||
},
|
||||
async doApplyUser(flag) {
|
||||
let msgFlag = true
|
||||
let message = null
|
||||
|
||||
if (flag) {
|
||||
const { athletesMaxNum, restrictGirlNum, restrictBoyNum, leanderNum, coachNum, deputyDirectorNum, substituteNum, projectType } =
|
||||
this.eventData
|
||||
|
||||
const applyUserList = clone(this.applyUserList)
|
||||
const teamApplyData = groupBy(applyUserList, (v) => {
|
||||
return v.teamId
|
||||
})
|
||||
|
||||
if (this.applyUserList.length === 0) {
|
||||
this.$notify.warning({
|
||||
title: "警告",
|
||||
message: "每支队伍最少运动员人数" + this.activityTableData.athleteMaxNum + "人"
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (projectType !== "1") {
|
||||
for (let i = 0; i < teamApplyData.length; i++) {
|
||||
const teamName = teamApplyData[i][0].team
|
||||
if (deputyDirectorNum > 0 && teamApplyData[i].filter((v) => v.divisionLevelLeadership).length > deputyDirectorNum) {
|
||||
msgFlag = false
|
||||
message = teamName + "处级领导应设置" + deputyDirectorNum + "人"
|
||||
break
|
||||
}
|
||||
//领队
|
||||
const ldNum = teamApplyData[i].filter((v) => v.identity.includes("3")).length
|
||||
if (leanderNum > 0 && (ldNum > leanderNum || ldNum === 0)) {
|
||||
msgFlag = false
|
||||
message = teamName + "领队应设置" + leanderNum + "人"
|
||||
break
|
||||
}
|
||||
//教练
|
||||
const jlNum = teamApplyData[i].filter((v) => v.identity.includes("2")).length
|
||||
if (coachNum > 0 && (jlNum > coachNum || jlNum === 0)) {
|
||||
msgFlag = false
|
||||
message = teamName + "教练应设置" + coachNum + "人"
|
||||
break
|
||||
}
|
||||
//运动员
|
||||
const ydyNum = teamApplyData[i].filter((v) => v.identity.includes("1")).length
|
||||
if (athletesMaxNum > 0 && (ydyNum > athletesMaxNum || ydyNum < athletesMaxNum)) {
|
||||
msgFlag = false
|
||||
message = teamName + "运动员应设置" + athletesMaxNum + "人"
|
||||
break
|
||||
}
|
||||
if (teamApplyData[i].filter((v) => v.identity.includes("5")).length > substituteNum) {
|
||||
msgFlag = false
|
||||
message = teamName + "替补最多设置" + substituteNum + "人"
|
||||
break
|
||||
}
|
||||
const womanYdyNum = teamApplyData[i].filter((v) => v.sex === "女" && v.identity.includes("1")).length
|
||||
if (restrictGirlNum > 0 && womanYdyNum < restrictGirlNum) {
|
||||
msgFlag = false
|
||||
message = teamName + "女运动员至少设置" + restrictGirlNum + "人"
|
||||
break
|
||||
}
|
||||
const manYdyNum = teamApplyData[i].filter((v) => v.sex === "女" && v.identity.includes("1")).length
|
||||
if (restrictBoyNum > 0 && manYdyNum < restrictBoyNum) {
|
||||
msgFlag = false
|
||||
message = teamName + "男运动员至少设置" + restrictBoyNum + "人"
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!msgFlag && !this.activityTableData.isLeader) {
|
||||
this.$notify.warning({ title: "警告", message: message })
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let msg = "确定要提交报名人员吗?"
|
||||
if (!flag) {
|
||||
msg = "确定要保存吗?"
|
||||
}
|
||||
const confirm = await this.$confirm(msg, "提示", { type: "warning" })
|
||||
if (confirm === "confirm") {
|
||||
const loading = this.$loading({
|
||||
lock: true,
|
||||
text: "正在提交...",
|
||||
spinner: "el-icon-loading",
|
||||
background: "rgba(0,0,0,.45)"
|
||||
})
|
||||
const resp = await this.$axios.post(loc() + "/doApplyUser", {
|
||||
pass: flag,
|
||||
activityId: this.activityTableData.activityId,
|
||||
unionId: this.activityTableData.unionId,
|
||||
eventId: this.eventData.eventId,
|
||||
data: JSON.stringify(this.applyUserList)
|
||||
})
|
||||
loading.close()
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.$emit("flip")
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
}
|
||||
},
|
||||
//点击添加运动员操作
|
||||
async applyUser() {
|
||||
const { isManGirlNum, restrictGirlNum, restrictBoyNum } = this.eventData
|
||||
|
||||
if (!this.rightApplyUserList.length) {
|
||||
this.$notify.warning({ title: "警告", message: "请在右侧列表中选择人员" })
|
||||
return
|
||||
}
|
||||
|
||||
//如果是单项
|
||||
if (this.activityTableData.eveProjectType === '1') {
|
||||
if (this.applyUserTableData.length + this.rightApplyUserList.length > this.activityTableData.athleteMaxNum) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "最多人数为" + this.activityTableData.athleteMaxNum + "人,已有" + this.applyUserTableData.length + "人",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
} else {
|
||||
//判断运动员是否超员
|
||||
const app = this.applyUserTableData.filter((v) => {
|
||||
return v.identity.includes("1") && v.teamId === this.applyFromData.teamId
|
||||
})
|
||||
if (app.length + this.rightApplyUserList.length > this.activityTableData.restrictMaxNum) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "每队最多人数为" + this.activityTableData.restrictMaxNum + "人,您已勾选" + this.rightApplyUserList.length + "人",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (
|
||||
restrictBoyNum === 0 &&
|
||||
this.rightApplyUserList.filter((v) => v.sex === "男").length > 0 &&
|
||||
this.activityTableData.isLeader === false &&
|
||||
isManGirlNum === false
|
||||
) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "该项目暂不支持男性运动员报名",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (
|
||||
restrictGirlNum === 0 &&
|
||||
this.rightApplyUserList.filter((v) => v.sex === "女").length > 0 &&
|
||||
this.isLeader === false &&
|
||||
isManGirlNum === false
|
||||
) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "该项目暂不支持女性运动员报名",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
const resp = await this.$axios.post(loc() + "/getActivityData", { activityId: this.activityData.id })
|
||||
const aa = resp.data.filter((v) => {
|
||||
return this.rightApplyUserList.includes(v.userId)
|
||||
})
|
||||
const groupData = groupBy(aa, (v) => {
|
||||
return v.userId
|
||||
})
|
||||
const cc = groupData.filter((v) => {
|
||||
if (v.length >= this.eventData.restrictRegNumber) return v
|
||||
})
|
||||
|
||||
//从全部人员里找出右边框选择的人
|
||||
const arr = this.userList.filter((v) => {
|
||||
return this.rightApplyUserList.includes(v.id)
|
||||
})
|
||||
//表格的人员
|
||||
arr.forEach((v) => {
|
||||
const data = {
|
||||
id: null,
|
||||
loginname: v.loginname,
|
||||
username: v.username,
|
||||
age: v.age,
|
||||
birthday: v.birthday,
|
||||
unitId: v.unitid,
|
||||
unionId: v.unionId,
|
||||
unitname: v.unitname,
|
||||
userId: v.id,
|
||||
mobile: v.mobile,
|
||||
sex: v.sex,
|
||||
awardsMode: this.activityTableData.eveProjectType,
|
||||
activityId: this.activityData.id,
|
||||
teamId: this.applyFromData.teamId,
|
||||
team: this.applyFromData.teamName,
|
||||
identity: ["1"],
|
||||
eventId: this.eventData.eventId
|
||||
}
|
||||
//然后把每一个人加到全部报名的字段中
|
||||
this.applyUserList.push(data)
|
||||
|
||||
//如果是单项判断每个人可以报几项
|
||||
if (this.eventData.restrictRegNumber >= 0 && this.activityTableData.eveProjectType === '1') {
|
||||
cc.forEach((z) => {
|
||||
if (z[0]) {
|
||||
const index = this.applyUserList.findIndex((x) => x.userId === z[0].userId && x.id === null)
|
||||
if (index > -1) {
|
||||
this.applyUserList.splice(index, 1)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
//如果是单项判断每个人可以报几项
|
||||
if (this.eventData.restrictRegNumber >= 0 && this.activityTableData.eveProjectType === '1') {
|
||||
const usernames = cc.map((v) => v[0].username).join(",")
|
||||
if (usernames) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: usernames + "已报" + this.eventData.restrictRegNumber + "项",
|
||||
type: "warning"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
this.flushApplyUser(this.applyUserList)
|
||||
this.$refs.transfer.clearQuery("right")
|
||||
this.$refs.transfer.clearQuery("left")
|
||||
this.leftApplyUserList = this.leftApplyUserList.filter((v) => {
|
||||
return !this.applyUserTableData.map((v) => v.userId).includes(v.id)
|
||||
})
|
||||
this.rightApplyUserList = []
|
||||
this.sortApplyUserTableData()
|
||||
},
|
||||
//勾选左边的框设置角色
|
||||
setUserRole(num) {
|
||||
if (!this.selection.length) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "请先勾选需要设置的用户!",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
this.selection.forEach((v) => {
|
||||
//如果是替补的话
|
||||
if (num === "5") {
|
||||
v.identity = []
|
||||
}
|
||||
v.identity.unshift(num)
|
||||
})
|
||||
|
||||
this.$refs.multipleTable.clearSelection()
|
||||
},
|
||||
changeTeam(command) {
|
||||
const { item } = command
|
||||
if (!this.selection.length) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "请先勾选需要设置的用户!",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
const teamName = this.teamList.find((v) => v.id === item.id).name
|
||||
if (this.selection[0].teamId === item.id) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "您选择的老师在" + this.selection[0].team + "无法更改!",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
this.selection.map((v) => {
|
||||
v.teamId = item.id
|
||||
v.team = teamName
|
||||
})
|
||||
this.selection.forEach((x) => {
|
||||
let index = this.applyUserTableData.findIndex((v) => v.userId === x.userId)
|
||||
this.applyUserTableData.splice(index, 1)
|
||||
})
|
||||
|
||||
this.$refs.multipleTable.clearSelection()
|
||||
},
|
||||
async findUserOne(id) {
|
||||
const { data } = await this.$axios.post(loc() + "/findUserOne", { id })
|
||||
return data
|
||||
},
|
||||
async delApplyUser(index, row, num) {
|
||||
//如果角色只有一个了
|
||||
|
||||
if (row.identity.length === 1) {
|
||||
const user = this.userList.find((v) => v.id === row.userId)
|
||||
if (user) {
|
||||
this.leftApplyUserList.push(this.getTransProp(user))
|
||||
} else {
|
||||
if (row.userId) {
|
||||
const u = await this.findUserOne(row.userId)
|
||||
this.userList.push(u)
|
||||
this.leftApplyUserList.push(this.getTransProp(u))
|
||||
}
|
||||
}
|
||||
this.applyUserList = this.applyUserList.filter((v) => v.userId !== row.userId)
|
||||
this.applyUserTableData.splice(index, 1)
|
||||
} else {
|
||||
row.identity.splice(row.identity.indexOf(num), 1)
|
||||
}
|
||||
},
|
||||
handleSelectionChange(val) {
|
||||
this.selection = val
|
||||
},
|
||||
filterMethod(query, item) {
|
||||
return item.name.indexOf(query) > -1
|
||||
},
|
||||
//排序表格里的数据
|
||||
sortApplyUserTableData() {
|
||||
this.applyUserTableData.sort((a, b) => {
|
||||
return b.identity - a.identity
|
||||
})
|
||||
},
|
||||
//找出当前选择队伍运动员,并给下面的选择框赋值
|
||||
flushApplyUser(applyUserList) {
|
||||
this.applyUserTabLoading = true
|
||||
if (this.applyFromData.teamId) {
|
||||
this.applyUserTableData = applyUserList.filter((v) => {
|
||||
return v.teamId === this.applyFromData.teamId
|
||||
})
|
||||
} else {
|
||||
this.applyUserTableData = applyUserList
|
||||
}
|
||||
this.applyUserTabLoading = false
|
||||
},
|
||||
getTransProp(user) {
|
||||
return {
|
||||
id: user.id,
|
||||
name: user.username + "(" + (user.sex ? user.sex : "") + "-" + user.loginname + ")"
|
||||
}
|
||||
},
|
||||
uniteApplyReset() {
|
||||
this.teamList = []
|
||||
this.eventData = {}
|
||||
this.activityData = {}
|
||||
this.applyFromData = {}
|
||||
this.leftApplyUserList = []
|
||||
this.rightApplyUserList = []
|
||||
this.applyUserList = []
|
||||
this.applyUserTableData = []
|
||||
this.userList = []
|
||||
}
|
||||
},
|
||||
async created() {}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
var ACTIVITY_SPORTS_DELETE_USER = {
|
||||
template: `
|
||||
<el-card shadow="never">
|
||||
<div style="margin-bottom: 10px;display: flex;justify-content: flex-end">
|
||||
<el-button :loading="submitLoading" @click="joinMemberFamily('')" icon="el-icon-close"
|
||||
size="small"
|
||||
type="primary">批量删除
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table :data="tableData" :size="tableSize" @selection-change="handleSelectionChange"
|
||||
@sort-change="pageOrder"ref="multipleTable" class="vi-table" row-key="id" style="width: 100%;"
|
||||
v-loading="tableLoading">
|
||||
<el-table-column :reserve-selection="true"
|
||||
type="selection"
|
||||
width="55">
|
||||
</el-table-column>
|
||||
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号"
|
||||
type="index"
|
||||
width="80px"></el-table-column>
|
||||
|
||||
<el-table-column
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:key="column.prop"
|
||||
:sortable="column.sortable"
|
||||
align="center"
|
||||
header-align="center"
|
||||
v-for="column in tableColumns">
|
||||
|
||||
<template v-slot="{row}" v-if="column.prop=='name'">
|
||||
<span v-if="row.name">{{ row.name }}</span>
|
||||
<span v-if="!row.name">运动员</span>
|
||||
</template>
|
||||
|
||||
<template v-slot="{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-column align="center" header-align="center" label="操作" prop="userOnline"
|
||||
width="150px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="joinMemberFamily(row.id)" circle icon="el-icon-delete"
|
||||
type="danger"></el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
`,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
rowData: {},
|
||||
selection: [],
|
||||
tableColumns: [
|
||||
{ prop: "name", label: "所属小队" },
|
||||
{ prop: "username", label: "姓名" },
|
||||
{ prop: "loginname", label: "工号" },
|
||||
{ prop: "mobile", label: "电话" },
|
||||
{ prop: "sex", label: "性别" },
|
||||
{ prop: "identity", label: "身份", sortable: true },
|
||||
{ prop: "allName", label: "报名项目" }
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleSelectionChange(val) {
|
||||
this.selection = val
|
||||
},
|
||||
openDelete(data) {
|
||||
this.rowData = data
|
||||
this.applyPageData()
|
||||
},
|
||||
applyPageData() {
|
||||
this.tableLoading = true
|
||||
this.pageForm.activityId = this.rowData.activityId
|
||||
this.pageForm.eventId = this.rowData.eventId
|
||||
this.pageForm.unionId = this.rowData.unionId
|
||||
this.$axios.post(loc() + "/applyPageData", this.pageForm).then(data => {
|
||||
console.log(data)
|
||||
this.tableLoading = false
|
||||
if (data.code === 0) {
|
||||
this.tableData = data.data.list
|
||||
this.pageForm.totalCount = data.data.totalCount
|
||||
} else {
|
||||
this.$message.error(data.msg)
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
joinMemberFamily(id) {
|
||||
if (!id && !this.selection.length) {
|
||||
this.$notify({
|
||||
title: "警告",
|
||||
message: "请先勾选需要删除的用户!",
|
||||
type: "warning"
|
||||
})
|
||||
return
|
||||
}
|
||||
this.$confirm("是否将已勾选的人员删除?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(async () => {
|
||||
this.submitLoading = true
|
||||
let ids = []
|
||||
if (id) {
|
||||
ids.push(id)
|
||||
} else {
|
||||
ids = this.selection.map((v) => v.id)
|
||||
}
|
||||
const resp = await this.$axios.post(loc() + "/joinMemberFamily", {
|
||||
ids: JSON.stringify(ids)
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.applyPageData()
|
||||
this.$emit("flush")
|
||||
this.$message.success(resp.msg)
|
||||
this.$refs.multipleTable.clearSelection()
|
||||
} else {
|
||||
this.$message.error(resp.msg)
|
||||
}
|
||||
this.submitLoading = false
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,574 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.text {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.e-item {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.el-carousel__button {
|
||||
background-color: #c0c4cc;
|
||||
}
|
||||
|
||||
.el-carousel__container {
|
||||
height: 250px !important;
|
||||
}
|
||||
</style>
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="activityInfoData">
|
||||
<search-item label="">
|
||||
<el-date-picker
|
||||
@change="activityInfoData"
|
||||
placeholder="选择年"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
|
||||
<search-item label="">
|
||||
<el-radio-group @change="activityInfoData" v-model="pageForm.isActivity">
|
||||
<el-radio-button :label="1">全部</el-radio-button>
|
||||
<el-radio-button :label="2">报名中</el-radio-button>
|
||||
<el-radio-button :label="3">已结束</el-radio-button>
|
||||
</el-radio-group>
|
||||
</search-item>
|
||||
<search-item label=""
|
||||
v-if="$auth.hasRole('SYSADMIN')||$auth.hasRole('SCHOOL_UNION_ADMIN')">
|
||||
<el-select
|
||||
@change="doSearch"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="报名所属分工会"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.unionId"
|
||||
>
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id"
|
||||
v-for="item in unionOptions"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-row class="el-table-container">
|
||||
<el-carousel :interval="5000" arrow="always" style="margin: 10px auto">
|
||||
<el-carousel-item :key="index"
|
||||
v-for="index in Math.ceil(activityList.length/4)">
|
||||
<el-row :gutter="20">
|
||||
<el-col :key="item.id" :span="6"
|
||||
v-for="item in activityList.slice((index-1)*4,index*4)">
|
||||
<el-card
|
||||
:class="'box-card '+(item.id===pageForm.activityId?'activeCard':'')"
|
||||
style="border-radius: 10px">
|
||||
<div @click="openApply(item)" class="clearfix" slot="header"
|
||||
style="font-size: 16px; padding: 5px 0">
|
||||
<el-tooltip :content="item.NAME" class="item" effect="dark"
|
||||
placement="top-start">
|
||||
<span v-if="item.NAME.length<=10">{{item.NAME}}</span>
|
||||
<span v-else>{{item.NAME.substr(0,10)}}...</span>
|
||||
</el-tooltip>
|
||||
<el-button @click="openApply(item)"
|
||||
style="float: right; padding: 3px 0" type="text">
|
||||
请选择活动报名
|
||||
</el-button>
|
||||
</div>
|
||||
<div @click="openApply(item)">
|
||||
<div class="text e-item">
|
||||
<span style="color: gray">活动类型:</span>
|
||||
|
||||
<span v-if="item.gameStyle===1">{{item.activityLevelName}}</span>
|
||||
<el-tag
|
||||
effect="dark"
|
||||
style="border-radius: 50%; float: right"
|
||||
type="danger"
|
||||
v-if="$moment(item.applyEndTime).valueOf() <$moment().valueOf()"
|
||||
>
|
||||
报名结束
|
||||
</el-tag>
|
||||
<el-tag
|
||||
effect="dark"
|
||||
style="border-radius: 50%; float: right"
|
||||
type="success"
|
||||
v-else-if="$moment().valueOf()>$moment(item.applyStartTime).valueOf()
|
||||
&&$moment().valueOf()<$moment(item.applyEndTime).valueOf()"
|
||||
>
|
||||
报名中
|
||||
</el-tag>
|
||||
<el-tag
|
||||
effect="dark"
|
||||
style="border-radius: 50%; float: right"
|
||||
type="danger"
|
||||
v-else-if="$moment().valueOf()<$moment(item.applyEndTime).valueOf()"
|
||||
>
|
||||
报名未开始
|
||||
</el-tag>
|
||||
</div>
|
||||
<div class="text e-item">
|
||||
<span style="color: gray">活动地址:</span>
|
||||
{{item.address}}
|
||||
</div>
|
||||
<div class="text e-item">
|
||||
<span style="color: gray">报名时间:</span>
|
||||
{{$moment(item.applyStartTime).format('YYYY/MM/DD HH:mm')}}
|
||||
至 {{$moment(item.applyEndTime).format('YYYY/MM/DD HH:mm')}}
|
||||
</div>
|
||||
<div class="text item">
|
||||
<span style="color: gray">活动时间:</span>
|
||||
{{$moment(item.startTime).format('YYYY/MM/DD HH:mm')}}
|
||||
至 {{$moment(item.endTime).format('YYYY/MM/DD HH:mm')}}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
</el-row>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="活动项目信息">
|
||||
<div class="search-item-option">
|
||||
<el-select
|
||||
@change="doSearch"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="请选择组别"
|
||||
style="width: 100%; margin-bottom: 5px; margin-left: 10px"
|
||||
v-if="unionLeaderCoach"
|
||||
v-model="pageForm.groupName"
|
||||
>
|
||||
<el-option :key="item.id" :label="item.name" :value="item.name"
|
||||
v-for="item in groupList"></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
|
||||
<div class="search-item-option">
|
||||
<el-select
|
||||
@change="doSearch"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="请选择活动项目"
|
||||
style="width: 100%; margin-bottom: 5px; margin-left: 10px"
|
||||
v-if="unionLeaderCoach"
|
||||
v-model="pageForm.eventId"
|
||||
>
|
||||
<el-option :key="item.eventId" :label="item.allName"
|
||||
:value="item.eventId" v-for="item in eventList"></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="mr10 ml20" v-if="unionLeaderCoach">
|
||||
领队:
|
||||
<span style="color: #419bf8">{{leaderData.username?leaderData.username:'暂无'}}</span>
|
||||
  教练:
|
||||
<span
|
||||
style="color: #419bf8">{{coachData.username ?coachData.username:'暂无'}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<el-button @click="openLeaderCoach" size="medium" type="primary"
|
||||
v-if="unionLeaderCoach">设置领队/教练
|
||||
</el-button>
|
||||
</div>
|
||||
</table-tool>
|
||||
<el-table
|
||||
:data="tableData"
|
||||
:size="tableSize"
|
||||
@sort-change="pageOrder"
|
||||
class="vi-table"
|
||||
row-key="id"
|
||||
style="width: 100%; margin-bottom: 20px"
|
||||
v-loading="tableLoading"
|
||||
>
|
||||
<el-table-column
|
||||
:index="indexMethod"
|
||||
align="center"
|
||||
header-align="center"
|
||||
label="序号"
|
||||
type="index"
|
||||
width="80px"
|
||||
></el-table-column>
|
||||
|
||||
<el-table-column
|
||||
:key="column.prop"
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
v-for="column in tableColumns"
|
||||
>
|
||||
<template scope="{row}" v-if="column.prop=='projectType'">
|
||||
<span v-if="row.eveProjectType==1">单项</span>
|
||||
<span v-else-if="row.eveProjectType==2">团体</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='applyNum'">
|
||||
<span v-if="row.successUserApply>0&&row.applyType!==3">{{ row.successUserApply }}人</span>
|
||||
<span
|
||||
v-else-if="JSON.parse(row.applyWay).length===2&&row.applyWay.includes(1)">
|
||||
{{row.totalApplyNum}}人</span>
|
||||
<span v-else-if="row.totalApplyNum>0&&row.applyType===3">{{ row.totalApplyNum }}人</span>
|
||||
<span v-else>0人</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='apply_num_bc'">
|
||||
<span v-if="row.apply_num_bc>0">已保存({{row.apply_num_bc}})人</span>
|
||||
<span v-else>暂无已保存人数</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" header-align="center" label="报名操作"
|
||||
width="300px">
|
||||
<template scope="{row}">
|
||||
<el-button :loading="row.loading" @click="openUniteApply(row)"
|
||||
size="mini" type="primary"
|
||||
v-if="row.applyWay.includes(2)">
|
||||
项目报名
|
||||
</el-button>
|
||||
<el-button
|
||||
:loading="row.loading"
|
||||
@click="doDelete(row)"
|
||||
size="mini"
|
||||
type="danger"
|
||||
>
|
||||
删除报名人员
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
</template>
|
||||
|
||||
<template #edit_func>
|
||||
<el-button @click="doApplied(false)" type="primary">保 存</el-button>
|
||||
<el-button @click="doApplied(true)" type="primary">提 交</el-button>
|
||||
</template>
|
||||
<template #edit>
|
||||
<activity-sports-apply-user @flip="flip"
|
||||
ref="activityApplyUser"></activity-sports-apply-user>
|
||||
</template>
|
||||
|
||||
<template #public>
|
||||
<activity-sports-delete-user @flip="flip"
|
||||
ref="activityDeleteUser"></activity-sports-delete-user>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-dialog :visible.sync="dialogLeaderCoach" title="添加领队/教练" width="60%">
|
||||
<el-form :model="headData" :rules="formRules" label-width="100px" ref="form"
|
||||
v-loading="formLoading">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<table-tool label="填写领队信息"></table-tool>
|
||||
<el-form-item label="姓  名" prop="userId">
|
||||
<user-select
|
||||
:option_label_func="(item)=>{return item.username + item.loginname}"
|
||||
@change="changeLeader"
|
||||
api="/platform/activity/apply/getUserUnion"
|
||||
api_input_key_name="query"
|
||||
ref="userData"
|
||||
style="width: 100%"
|
||||
v-model="leaderData.userId"
|
||||
></user-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="所在单位" prop="unitId">
|
||||
<el-select clearable filterable placeholder="请选择所在单位" style="width: 100%"
|
||||
v-model="leaderData.unitId">
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id"
|
||||
v-for="item in unitOptions"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电  话" prop="mobile">
|
||||
<el-input maxlength="50" placeholder="请填写电话" type="text"
|
||||
v-model="leaderData.mobile"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<table-tool label="填写教练信息"></table-tool>
|
||||
<el-form-item label="姓  名" prop="userId">
|
||||
<user-select
|
||||
:option_label_func="(item)=>{return item.username + item.loginname}"
|
||||
@change="changeCoach"
|
||||
api="/platform/activity/apply/getUserUnion"
|
||||
api_input_key_name="query"
|
||||
style="width: 100%"
|
||||
ref="userData2"
|
||||
v-model="coachData.userId"
|
||||
></user-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="所在单位" prop="unitId">
|
||||
<el-select clearable filterable placeholder="请选择所在单位" style="width: 100%"
|
||||
v-model="coachData.unitId">
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id"
|
||||
v-for="item in unitOptions"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电  话" prop="mobile">
|
||||
<el-input maxlength="50" placeholder="请填写电话" type="text"
|
||||
v-model="coachData.mobile"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<span class="dialog-footer" slot="footer">
|
||||
<el-button @click="dialogLeaderCoach = false">取 消</el-button>
|
||||
<el-button @click="doLeaderCoach" type="primary">确 认</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog
|
||||
title="活动通知"
|
||||
:visible.sync="activityNoticeDialog"
|
||||
width="50%"
|
||||
>
|
||||
<div style="margin: 10px; ">
|
||||
<div style="height: 500px; overflow: auto;"
|
||||
v-html="activityData.eventNotification"></div>
|
||||
</div>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="activityNoticeDialog = false">关 闭</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("applyUser.js"){}#-->
|
||||
<!--#include("deleteUser.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
unionLeaderCoach: false,
|
||||
activityList: [],
|
||||
pageForm: {
|
||||
isMenWomen: [],
|
||||
isActivity: "2",
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
activityData: {},
|
||||
leaderData: {},
|
||||
coachData: {},
|
||||
headData: {},
|
||||
staffData: {},
|
||||
groupList: [],
|
||||
eventList: [],
|
||||
tableColumns: [
|
||||
{prop: "allName", label: "项目名称"},
|
||||
{prop: "projectType", label: "项目类型"},
|
||||
{prop: "applyNum", label: "已报名人数"},
|
||||
{prop: "apply_num_bc", label: "暂保存人数"}
|
||||
],
|
||||
unionOptions: [],
|
||||
|
||||
dialogLeaderCoach: false,
|
||||
userOptions: [],
|
||||
userLoading: false,
|
||||
unitOptions: [],
|
||||
activityNoticeDialog: false
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"activity-sports-apply-user": ACTIVITY_SPORTS_APPLY_USER,
|
||||
"activity-sports-delete-user": ACTIVITY_SPORTS_DELETE_USER
|
||||
},
|
||||
methods: {
|
||||
changeLeader(id) {
|
||||
if (id) {
|
||||
const userList = this.$refs.userData.options
|
||||
const user = userList.find((v) => v.id === id)
|
||||
this.$set(this.leaderData, "userId", id)
|
||||
this.$set(this.leaderData, "loginname", user.loginname)
|
||||
this.$set(this.leaderData, "username", user.username)
|
||||
this.$set(this.leaderData, "unitId", user.unitId)
|
||||
this.$set(this.leaderData, "sex", user.sex)
|
||||
this.$set(this.leaderData, "mobile", user.mobile)
|
||||
this.$set(this.leaderData, "unionLeader", true)
|
||||
this.$set(this.leaderData, "unionId", user.unionId)
|
||||
this.$set(this.leaderData, "identity", ["3"])
|
||||
this.$set(this.leaderData, "status", 0)
|
||||
this.$set(this.leaderData, "awardsMode", 2)
|
||||
this.$set(this.leaderData, "activityId", this.activityData.id)
|
||||
}
|
||||
},
|
||||
changeCoach(id) {
|
||||
if (id) {
|
||||
const userList = this.$refs.userData2.options
|
||||
const user = userList.find((v) => v.id === id)
|
||||
this.$set(this.coachData, "userId", id)
|
||||
this.$set(this.coachData, "loginname", user.loginname)
|
||||
this.$set(this.coachData, "username", user.username)
|
||||
this.$set(this.coachData, "unitId", user.unitId)
|
||||
this.$set(this.coachData, "sex", user.sex)
|
||||
this.$set(this.coachData, "mobile", user.mobile)
|
||||
this.$set(this.coachData, "unionCoach", true)
|
||||
this.$set(this.coachData, "unionId", user.unionId)
|
||||
this.$set(this.coachData, "identity", ["2"])
|
||||
this.$set(this.coachData, "status", 0)
|
||||
this.$set(this.coachData, "awardsMode", 2)
|
||||
this.$set(this.coachData, "activityId", this.activityData.id)
|
||||
}
|
||||
},
|
||||
async doLeaderCoach() {
|
||||
this.formLoading = true
|
||||
let data = []
|
||||
if (this.coachData.userId) {
|
||||
data.push(this.coachData)
|
||||
}
|
||||
if (this.leaderData.userId) {
|
||||
data.push(this.leaderData)
|
||||
}
|
||||
const resp = await this.$axios.post(loc() + "/doLeaderCoach", {
|
||||
data: JSON.stringify(data),
|
||||
activityId: this.activityData.id,
|
||||
unionId: this.pageForm.unionId
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
await this.getUnionCoachLeaderHead()
|
||||
this.dialogLeaderCoach = false
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
this.formLoading = false
|
||||
},
|
||||
async openLeaderCoach() {
|
||||
this.leaderData = {}
|
||||
this.coachData = {}
|
||||
if (this.leaderData || this.coachData) {
|
||||
await this.getUnionCoachLeaderHead()
|
||||
|
||||
}
|
||||
this.dialogLeaderCoach = true
|
||||
setTimeout(async () => {
|
||||
if (this.leaderData.loginname) {
|
||||
await this.$refs.userData.selectUser(this.leaderData.loginname)
|
||||
}
|
||||
if (this.coachData.loginname) {
|
||||
await this.$refs.userData2.selectUser(this.coachData.loginname)
|
||||
}
|
||||
}, 500)
|
||||
},
|
||||
async activityInfoData() {
|
||||
const resp = await this.$axios.post(loc() + "/activityData", this.pageForm)
|
||||
if (resp.code === 0) {
|
||||
this.activityList = resp.data
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
async focusGroup() {
|
||||
const resp = await this.$axios.post("/platform/activity/basic/event/focusGroup")
|
||||
if (resp.code === 0) {
|
||||
this.groupList = resp.data
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
async openApply(item) {
|
||||
this.$set(this.pageForm, "isMenWomen", 1)
|
||||
this.activityData = item
|
||||
this.pageForm.activityId = item.id
|
||||
if (item.applyType === 2) {
|
||||
await this.getUnionCoachLeaderHead()
|
||||
this.unionLeaderCoach = true
|
||||
} else {
|
||||
this.unionLeaderCoach = false
|
||||
}
|
||||
|
||||
this.pageData()
|
||||
|
||||
await this.changeActivity()
|
||||
this.activityNoticeDialog = true
|
||||
},
|
||||
|
||||
async getUnionCoachLeaderHead() {
|
||||
this.leaderData = {}
|
||||
this.coachData = {}
|
||||
this.headData = {}
|
||||
this.staffData = {}
|
||||
const resp = await this.$axios.post(loc() + "/getUnionCoachLeaderHead", {activityId: this.pageForm.activityId})
|
||||
const {unionCoach, unionLeader, unionHead, unionStaff, userOptions} = resp.data
|
||||
if (unionCoach) {
|
||||
this.coachData = unionCoach
|
||||
}
|
||||
if (unionLeader) {
|
||||
this.leaderData = unionLeader
|
||||
}
|
||||
if (unionHead) {
|
||||
this.headData = unionHead
|
||||
}
|
||||
if (unionStaff) {
|
||||
this.staffData = unionStaff
|
||||
}
|
||||
|
||||
this.userOptions = userOptions
|
||||
},
|
||||
async changeActivity() {
|
||||
const resp = await this.$axios.post("/platform/activity/apply/getEvents", {activityId: this.pageForm.activityId})
|
||||
this.eventList = resp.data
|
||||
},
|
||||
pageData() {
|
||||
this.tabLoading = true
|
||||
const pageForm = clone(this.pageForm)
|
||||
pageForm.isMenWomen = JSON.stringify(pageForm.isMenWomen)
|
||||
this.$axios.post("/platform/activity/apply/pageData", {data: JSON.stringify(pageForm)}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async openUniteApply(data) {
|
||||
const now = moment().valueOf()
|
||||
if (now < moment(data.applyStartTime).valueOf() || now > moment(data.applyEndTime).valueOf()) {
|
||||
this.notifyWarning("此活动不在报名时间内")
|
||||
return
|
||||
}
|
||||
const union = this.$store.state.user.union
|
||||
data.unionId = this.pageForm.unionId ? this.pageForm.unionId : union.id
|
||||
this.$refs.guava.edit(() => {
|
||||
this.$refs.activityApplyUser.openUniteApply(data)
|
||||
})
|
||||
},
|
||||
doApplied(flag) {
|
||||
this.$refs.activityApplyUser.doApplyUser(flag)
|
||||
},
|
||||
doDelete(data) {
|
||||
const union = this.$store.state.user.union
|
||||
data.unionId = this.pageForm.unionId ? this.pageForm.unionId : union.id
|
||||
this.$refs.guava.public(() => {
|
||||
this.$refs.activityDeleteUser.openDelete(data)
|
||||
})
|
||||
},
|
||||
flip() {
|
||||
this.doSearch()
|
||||
this.$refs.guava.index()
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
await this.activityInfoData()
|
||||
this.unitOptions = await this.$businessTool.listUnit()
|
||||
this.unionOptions = await this.$businessTool.listUnion()
|
||||
await this.focusGroup()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,235 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="activityInfoData">
|
||||
<search-item label="">
|
||||
<el-date-picker
|
||||
@change="activityInfoData"
|
||||
placeholder="选择年"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动状态">
|
||||
<el-radio-group @change="activityInfoData" v-model="pageForm.isActivity">
|
||||
<el-radio-button :label="1">全部</el-radio-button>
|
||||
<el-radio-button :label="2">报名中</el-radio-button>
|
||||
<el-radio-button :label="3">已结束</el-radio-button>
|
||||
</el-radio-group>
|
||||
</search-item>
|
||||
<search-item label="报名状态">
|
||||
<el-radio-group @change="activityInfoData" v-model="pageForm.applyStatus">
|
||||
<el-radio-button :label="1">未报名</el-radio-button>
|
||||
<el-radio-button :label="2">已报名</el-radio-button>
|
||||
</el-radio-group>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<el-table
|
||||
:data="activityList"
|
||||
:size="tableSize"
|
||||
class="vi-table"
|
||||
row-key="id"
|
||||
style="width: 100%; margin-bottom: 20px"
|
||||
v-loading="tableLoading"
|
||||
>
|
||||
<el-table-column
|
||||
:index="indexMethod"
|
||||
align="center"
|
||||
header-align="center"
|
||||
label="序号"
|
||||
type="index"
|
||||
width="80px"
|
||||
></el-table-column>
|
||||
<el-table-column label="活动名称" prop="NAME"></el-table-column>
|
||||
<el-table-column label="报名开始时间" prop="applyStartTime"></el-table-column>
|
||||
<el-table-column label="报名结束时间" prop="applyEndTime"></el-table-column>
|
||||
<el-table-column label="活动状态">
|
||||
<template slot-scope="{row}">
|
||||
<el-tag
|
||||
effect="dark"
|
||||
type="danger"
|
||||
v-if="$moment(row.applyEndTime).valueOf() <$moment().valueOf()"
|
||||
>
|
||||
报名结束
|
||||
</el-tag>
|
||||
<el-tag
|
||||
effect="dark"
|
||||
type="success"
|
||||
v-else-if="$moment().valueOf()>$moment(row.applyStartTime).valueOf()
|
||||
&&$moment().valueOf()<$moment(row.applyEndTime).valueOf()"
|
||||
>
|
||||
报名中
|
||||
</el-tag>
|
||||
<el-tag
|
||||
effect="dark"
|
||||
type="danger"
|
||||
v-else-if="$moment().valueOf()<$moment(row.applyEndTime).valueOf()"
|
||||
>
|
||||
报名未开始
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="openView(row)"
|
||||
size="mini" type="primary">
|
||||
查看
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
</el-table>
|
||||
|
||||
</el-card>
|
||||
|
||||
</template>
|
||||
|
||||
<template #edit>
|
||||
<el-table
|
||||
:data="tableData"
|
||||
:size="tableSize"
|
||||
class="vi-table"
|
||||
row-key="id"
|
||||
style="width: 100%; margin-bottom: 20px"
|
||||
v-loading="tableLoading"
|
||||
>
|
||||
<el-table-column
|
||||
:index="indexMethod"
|
||||
align="center"
|
||||
header-align="center"
|
||||
label="序号"
|
||||
type="index"
|
||||
width="80px"
|
||||
></el-table-column>
|
||||
<el-table-column label="项目名称" prop="allName"></el-table-column>
|
||||
<el-table-column label="可报队数">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.eveProjectType=='2'">
|
||||
{{ row.restrictTotalTeam }}队
|
||||
</span>
|
||||
<span v-else>单项不限制</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="每队可报人数">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.athletesMaxNum<=99">
|
||||
{{ row.athletesMaxNum }}人
|
||||
</span>
|
||||
<span v-else>无限制</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已报名总人数">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.successUserApply>0&&row.applyType!==3">{{ row.successUserApply }}人</span>
|
||||
<span
|
||||
v-else-if="JSON.parse(row.applyWay).length===2&&row.applyWay.includes(1)">
|
||||
{{row.totalApplyNum}}人</span>
|
||||
<span v-else-if="row.totalApplyNum>0&&row.applyType===3">{{ row.totalApplyNum }}人</span>
|
||||
<span v-else>0人</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="已报名人员">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.userApplyNames">
|
||||
{{ row.userApplyNames}}</span>
|
||||
<span v-else>暂无</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="报名状态">
|
||||
<template slot-scope="{row}">
|
||||
<el-tag type="primary" v-if="row.status===1">待审核</el-tag>
|
||||
<el-tag type="success" v-else-if="row.status===2">已成功报名</el-tag>
|
||||
<el-tag type="danger" v-else-if="row.status===3">审核不通过</el-tag>
|
||||
<span v-else>暂未报名</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
</guava>
|
||||
|
||||
<el-dialog
|
||||
:visible.sync="activityNoticeDialog"
|
||||
title="活动通知"
|
||||
width="50%"
|
||||
>
|
||||
<div style="margin: 10px; ">
|
||||
<div style="height: 500px; overflow: auto;"
|
||||
v-html="activityData.eventNotification"></div>
|
||||
</div>
|
||||
<span class="dialog-footer" slot="footer">
|
||||
<el-button @click="activityNoticeDialog = false">关 闭</el-button>
|
||||
<el-button @click="openApplyUser" type="primary">项目详情</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const vue = new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityList: [],
|
||||
pageForm: {
|
||||
isActivity: 2,
|
||||
applyStatus: 2,
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
activityData: {},
|
||||
activityNoticeDialog: false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async activityInfoData() {
|
||||
const resp = await this.$axios.post(loc() + "/activityData", this.pageForm)
|
||||
if (resp.code === 0) {
|
||||
this.activityList = resp.data
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
openView(row) {
|
||||
this.activityData = row
|
||||
this.activityNoticeDialog = true
|
||||
},
|
||||
openApplyUser() {
|
||||
this.pageData()
|
||||
this.activityNoticeDialog = false
|
||||
this.$refs.guava.edit()
|
||||
},
|
||||
pageData() {
|
||||
this.tabLoading = true
|
||||
const pageForm = clone(this.pageForm)
|
||||
pageForm.activityId = this.activityData.id
|
||||
this.$axios.post(loc() + "/pageData", { data: JSON.stringify(pageForm) }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
await this.activityInfoData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,237 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker
|
||||
placeholder="选择年"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
|
||||
<search-item label="活动名称">
|
||||
<el-input clearable placeholder="请输入活动名称" v-model="pageForm.name"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="活动列表">
|
||||
<el-button @click="openAdd" icon="el-icon-edit-outline" size="small" type="primary">创建活动</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-table
|
||||
:data="tableData"
|
||||
:size="tableSize"
|
||||
@sort-change="pageOrder"
|
||||
class="vi-table"
|
||||
row-key="id"
|
||||
style="width: 100%; margin-bottom: 20px"
|
||||
>
|
||||
<el-table-column
|
||||
:index="indexMethod"
|
||||
align="center"
|
||||
header-align="center"
|
||||
label="序号"
|
||||
type="index"
|
||||
width="80px"
|
||||
></el-table-column>
|
||||
|
||||
<el-table-column
|
||||
:key="column.prop"
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
v-for="column in tableColumns"
|
||||
>
|
||||
<template scope="{row}" v-if="column.prop=='events'">
|
||||
<span>{{row.allName}}</span>
|
||||
</template>
|
||||
<template scope="{row}" v-else-if="column.prop=='foundUnit'">
|
||||
<span v-if="row.activityLevel===40001">校工会</span>
|
||||
<span v-if="row.activityLevel===40002">{{row.unionname}}</span>
|
||||
<span v-if="row.activityLevel===40003">{{row.clubName}}</span>
|
||||
</template>
|
||||
|
||||
<template scope="{row}" v-else-if="column.prop=='startTime'">
|
||||
{{$moment(row.startTime).format('YYYY-MM-DD')}} - {{$moment(row.endTime).format('YYYY-MM-DD')}}
|
||||
</template>
|
||||
|
||||
<template scope="{row:{close,applyStartTime,applyEndTime,startTime,endTime,isSave}}" v-else-if="column.prop=='state'">
|
||||
<div v-html="getStatus(close,applyStartTime,applyEndTime,startTime,endTime,isSave)"></div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" header-align="center" label="操作" prop="userOnline" width="150px">
|
||||
<template slot-scope="{row}">
|
||||
<el-dropdown @command="dropdownCommand">
|
||||
<el-button :loading="row.loading" size="mini">
|
||||
<i class="ti-settings"></i>
|
||||
<span class="ti-angle-down"></span>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<!-- <el-dropdown-item :command="{type:'openCode',row}">二维码</el-dropdown-item>-->
|
||||
<el-dropdown-item :command="{type:'view',row}">查看</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'exportXlsx',row}">导出名单</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'edit',row}">编辑</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'delete',row}">删除</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<template #edit_func>
|
||||
<el-button @click="doSave" type="primary">保 存</el-button>
|
||||
<el-button @click="doOperate" type="primary">提 交</el-button>
|
||||
</template>
|
||||
<template #edit>
|
||||
<add-activity
|
||||
:is_a06="$auth.hasRole('SCHOOL_UNION_ADMIN')"
|
||||
:is_club="$auth.hasRole('CLUB_PRESIDENT')"
|
||||
:is_sysadmin="$auth.hasRole('SYSADMIN')"
|
||||
:unionid="user.union.id"
|
||||
@flip="flip"
|
||||
@flush="flush"
|
||||
ref="addActivity"
|
||||
></add-activity>
|
||||
</template>
|
||||
|
||||
<template #view>
|
||||
<info-manage-info ref="infoActivity"></info-manage-info>
|
||||
</template>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
<!--#include("info.js"){}#-->
|
||||
<!--#include("addActivity.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
user: null,
|
||||
pageForm: {
|
||||
year: this.$moment().format("YYYY") + ""
|
||||
},
|
||||
tableColumns: [
|
||||
{ prop: "name", label: "活动名称" },
|
||||
{ prop: "activityCode", label: "活动编号", sortable: true },
|
||||
{ prop: "address", label: "活动地点" },
|
||||
{ prop: "foundUnit", label: "创建单位", sortable: true },
|
||||
{ prop: "activityLevelName", label: "活动级别", sortable: true },
|
||||
{ prop: "startTime", label: "活动日期", sortable: true },
|
||||
{ prop: "state", label: "活动状态", sortable: true },
|
||||
{ prop: "applyNum", label: "已报名人数", sortable: true },
|
||||
{ prop: "foundDate", label: "创建时间", sortable: true }
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"info-manage-info": ACTIVITY_SPORTS_INFO,
|
||||
"add-activity": ACTIVITY_SPORTS_ADD_ACTIVITY
|
||||
},
|
||||
methods: {
|
||||
dropdownCommand(command) {
|
||||
const { type, row } = command
|
||||
if (type === "view") {
|
||||
this.openView(row)
|
||||
} else if (type === "edit") {
|
||||
this.openEdit(row)
|
||||
} else if (type === "delete") {
|
||||
this.doDelete(row)
|
||||
} else if (type === "exportXlsx") {
|
||||
window.open("/platform/activity/sports/info/mange/exportXlsx?id=" + row.id)
|
||||
}
|
||||
},
|
||||
openView(row) {
|
||||
const { id } = row
|
||||
this.$refs.guava.view(() => {
|
||||
this.$refs.infoActivity.getInfo(id)
|
||||
})
|
||||
},
|
||||
openEdit(row) {
|
||||
this.formData.id = row.id
|
||||
this.$refs.guava.edit(() => {
|
||||
this.$refs.addActivity.openEdit(row, true)
|
||||
})
|
||||
},
|
||||
doDelete(row) {
|
||||
const { id } = row
|
||||
this.$confirm("确定要删除该活动吗?", "提示", { type: "warning" }).then(async () => {
|
||||
this.$set(row, "loading", true)
|
||||
const resp = await this.$axios.post(loc() + "/doDelete", { id })
|
||||
this.$set(row, "loading", false)
|
||||
if (resp.code === 0) {
|
||||
this.doSearch()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
})
|
||||
},
|
||||
async doOperate() {
|
||||
await this.$refs.addActivity.operate()
|
||||
},
|
||||
async doSave() {
|
||||
this.$refs.addActivity.doSave()
|
||||
},
|
||||
flip() {
|
||||
this.doSearch()
|
||||
this.$refs.guava.index()
|
||||
},
|
||||
flush() {
|
||||
this.doSearch()
|
||||
},
|
||||
openAdd() {
|
||||
this.$refs.guava.edit(() => {
|
||||
this.$refs.addActivity.openAdd()
|
||||
})
|
||||
},
|
||||
getStatus(close, applyStartTime, applyEndTime, startTime, endTime) {
|
||||
if (close) {
|
||||
return `<span class="text-danger">活动已关闭</span>`
|
||||
}
|
||||
const now = moment().valueOf()
|
||||
|
||||
if (now < moment(applyStartTime).valueOf()) {
|
||||
return `<span class="text-info">未开始报名</span>`
|
||||
} else if (moment(applyStartTime).valueOf() <= now && now <= moment(applyEndTime).valueOf()) {
|
||||
return `<span class="text-success">活动报名中</span>`
|
||||
} else if (moment(applyEndTime).valueOf() < now && now < moment(startTime).valueOf()) {
|
||||
return `<span class="text-info">报名已结束</span>`
|
||||
} else if (moment(startTime).valueOf() < now && now < moment(endTime).valueOf()) {
|
||||
return `<span class="text-primary">活动进行中</span>`
|
||||
} else if (moment(endTime).valueOf() < now) {
|
||||
return `<span class="text-danger">活动已结束</span>`
|
||||
}
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.user = this.$store.state.user
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,255 @@
|
||||
var ACTIVITY_SPORTS_INFO = {
|
||||
template: `
|
||||
<el-tabs class="activity_view" tab-position="top" v-loading="loading" v-model="activeName">
|
||||
<el-tab-pane label="活动信息" name="1">
|
||||
<el-form label-position="left" label-suffix=":" style="padding: 20px 0">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="24">
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="活动名称">
|
||||
{{ viewData.name | str }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="活动地址">
|
||||
{{ viewData.address | str }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="报名日期">
|
||||
{{ viewData.applyStartTime }} - {{ viewData.applyEndTime }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="活动时间">
|
||||
{{ viewData.startTime }} - {{ viewData.endTime }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="主办单位">
|
||||
{{ viewData.unitSponsorName | str }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="承办单位">
|
||||
{{ viewData.undertakeUnitName | str }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="协办单位">
|
||||
{{ viewData.unitJointlyName | str }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8">
|
||||
<el-form-item label="竞赛方式">
|
||||
<span v-if="viewData.gameStyle===1">竞赛类</span>
|
||||
<span v-if="viewData.gameStyle===2">非竞赛类</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8">
|
||||
<el-form-item label="经费预算">
|
||||
{{ viewData.funding | money }} 元
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8">
|
||||
<el-form-item label="报名方式">
|
||||
<span>{{ viewData.applyWay.map(v => applyWay[v]).join('、') }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<template v-if="viewData.gameStyle===1&&!viewData.applyWay.includes(3)">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="运动员资格 ">
|
||||
<div v-html="viewData.athleteQualification"></div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="报名方法 ">
|
||||
<div v-html="viewData.registrationMethod"></div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="竞赛方法 ">
|
||||
<div v-html="viewData.competitionMethod"></div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="奖励方法 ">
|
||||
<div v-html="viewData.rewardMethod"></div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="注意事项 ">
|
||||
<div v-html="viewData.precautions"></div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</template>
|
||||
|
||||
<template v-if="viewData.applyWay.includes(3)">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="活动通知 ">
|
||||
<div v-html="viewData.eventNotification"></div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</template>
|
||||
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane label="项目信息" name="2" v-if="!viewData.applyWay.includes(3)">
|
||||
<el-form style="margin-top: 20px">
|
||||
<el-card class="box-card mb10" shadow="hover" v-for="app in viewData.events" :key="app.id">
|
||||
<div class="clearfix" slot="header">
|
||||
<span>{{ app.allName }}</span>
|
||||
<el-button @click="$set(app,'show',!app.show)"
|
||||
style="float: right; padding: 3px 5px"
|
||||
type="text">{{ app.show ? '折叠' : '展开' }}
|
||||
</el-button>
|
||||
</div>
|
||||
<transition name="el-fade-in-linear">
|
||||
<div class="text item transition-box" style="padding: 20px 20px"
|
||||
v-show="app.show">
|
||||
<el-form label-position="left" label-suffix=":" style="padding: 20px 0">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="比赛模式">
|
||||
<span v-if="app.projectType==1">单项</span>
|
||||
<span v-else-if="app.projectType==2">团体</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
|
||||
<el-form-item label="每队最多人数">
|
||||
{{
|
||||
app.athletesMaxNum + app.leanderNum + app.coachNum +
|
||||
app.substituteNum | money
|
||||
}} 人
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8" v-if="app.projectType==2">
|
||||
<el-form-item label="最多创建几队 ">
|
||||
{{ app.restrictTotalTeam | money }} 队
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8" v-if="app.projectType==1">
|
||||
<el-form-item label="运动员最多人数 ">
|
||||
{{ app.athletesMaxNum | money }} 人
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8" v-if="app.projectType==2">
|
||||
<el-form-item label="领队人数 ">
|
||||
{{ app.leanderNum | money }} 人
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8" v-if="app.projectType==2">
|
||||
<el-form-item label="教练人数">
|
||||
{{ app.coachNum | money }} 人
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- <el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
|
||||
<el-form-item label="副处长(级)以上最少人数">
|
||||
{{ app.deputyDirectorNum | money }} 人
|
||||
</el-form-item>
|
||||
</el-col>-->
|
||||
|
||||
<el-col :span="8" v-if="app.projectType==2">
|
||||
<el-form-item label="男队人数 ">
|
||||
{{ app.restrictBoyNum | money }} 人
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8" v-if="app.projectType==2">
|
||||
<el-form-item label="女队人数 ">
|
||||
{{ app.restrictGirlNum | money }} 人
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8" v-if="app.projectType==2">
|
||||
<el-form-item label="替补人员最少人数 ">
|
||||
{{ app.substituteNum | money }} 人
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
</transition>
|
||||
</el-card>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
`,
|
||||
data() {
|
||||
return {
|
||||
loading: true,
|
||||
units: [],
|
||||
activeName: "1",
|
||||
viewData: { awardsMode: [], applyWay: [], combinationMethod: [] },
|
||||
applyWay: {
|
||||
1: "个人报名",
|
||||
2: "分工会报名",
|
||||
3: "小程序报名"
|
||||
}
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
money(val) {
|
||||
return val ? val : 0
|
||||
},
|
||||
str(val) {
|
||||
return val ? val : "暂无"
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async getUnitName(arr) {
|
||||
/* const clubs = await getClubs()
|
||||
const unitClubs = this.units.concat(clubs)*/
|
||||
let brr = []
|
||||
arr.forEach((a) => {
|
||||
const unit = this.units.find((v) => {
|
||||
return v.id === a
|
||||
})
|
||||
if (unit) {
|
||||
brr.push(unit.name)
|
||||
}
|
||||
})
|
||||
return brr.join(",")
|
||||
},
|
||||
async getInfo(id) {
|
||||
this.loading = true
|
||||
const { data } = await this.$axios.post("/platform/activity/sports/common/findOne", { id })
|
||||
this.loading = false
|
||||
|
||||
if (data) {
|
||||
data.unitSponsorName = await this.getUnitName(JSON.parse(data.unitSponsor))
|
||||
data.undertakeUnitName = await this.getUnitName(JSON.parse(data.undertakeUnit))
|
||||
data.unitJointlyName = await this.getUnitName(JSON.parse(data.unitJointly))
|
||||
data.applyWay = JSON.parse(data.applyWay)
|
||||
|
||||
this.viewData = data
|
||||
this.tableKey = new Date().getTime()
|
||||
} else {
|
||||
this.viewData = {}
|
||||
this.$message({ message: "获取信息失败", type: "error" })
|
||||
}
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.units = await this.$businessTool.listUnit()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,513 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="活动年份">
|
||||
<el-date-picker
|
||||
:clearable="false"
|
||||
@change="getActivityByYear"
|
||||
placeholder="选择年"
|
||||
style="width: 100%"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
|
||||
<search-item label="活动级别">
|
||||
<el-select
|
||||
@change="getActivityByYear"
|
||||
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>
|
||||
</search-item>
|
||||
|
||||
<search-item label="活动名称">
|
||||
<el-select filterable placeholder="请选择活动"
|
||||
style="width: 100%; font-weight: bold" v-model="pageForm.id">
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id"
|
||||
v-for="item in activityList"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="院级工会">
|
||||
<el-select
|
||||
@change="unionIdChange"
|
||||
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>
|
||||
</search-item>
|
||||
|
||||
<search-item label="报名状态">
|
||||
<el-select
|
||||
@change="unionIdChange"
|
||||
filterable
|
||||
placeholder="请选择活动"
|
||||
style="width: 100%; font-weight: bold"
|
||||
v-model="pageForm.isApplyUser"
|
||||
>
|
||||
<el-option label="全部" value="1"></el-option>
|
||||
<el-option label="未报名" value="2"></el-option>
|
||||
<el-option label="已报名" value="3"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<el-table :data="tableData" row-key="id" style="width: 100%">
|
||||
<el-table-column type="expand">
|
||||
<template slot-scope="{row}">
|
||||
<el-timeline>
|
||||
<el-timeline-item placement="top" timestamp="领队信息"
|
||||
v-if="row.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="姓名">{{ row.leader.username
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="性别">{{ row.leader.sex }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="工号">{{ row.leader.loginname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="电话">{{ row.leader.mobile
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="单位">{{ row.leader.unitname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</el-timeline-item>
|
||||
<el-timeline-item placement="top" timestamp="教练信息"
|
||||
v-if="row.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="姓名">{{ row.coach.username
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="性别">{{ row.coach.sex }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="工号">{{ row.coach.loginname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="电话">{{ row.coach.mobile
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="单位">{{ row.coach.unitname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</el-timeline-item>
|
||||
<el-timeline-item placement="top" timestamp="团长信息"
|
||||
v-if="row.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="姓名">{{ row.head.username
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="性别">{{ row.head.sex }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="工号">{{ row.head.loginname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="电话">{{ row.head.mobile }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="单位">{{ row.head.unitname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</el-timeline-item>
|
||||
<el-timeline-item placement="top" timestamp="工作人员信息"
|
||||
v-if="row.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="姓名">{{ row.staff.username
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="性别">{{ row.staff.sex }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="工号">{{ row.staff.loginname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="电话">{{ row.staff.mobile
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="单位">{{ row.staff.unitname
|
||||
}}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</el-timeline-item>
|
||||
<el-timeline-item placement="top" timestamp="运动员信息">
|
||||
<div style="display: flex; justify-content: flex-end">
|
||||
<el-select
|
||||
@change="doEvent(row)"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="请选择活动项目"
|
||||
style="width: 30%"
|
||||
v-model="row.eventId"
|
||||
>
|
||||
<el-option :key="item.id" :label="item.allName"
|
||||
:value="item.eventId"
|
||||
v-for="item in events"></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
|
||||
<el-table :data="row.apply2" border row-key="id" size="mini"
|
||||
stripe>
|
||||
<el-table-column
|
||||
align="center"
|
||||
header-align="center"
|
||||
label="序号"
|
||||
sortable
|
||||
type="index"
|
||||
width="100"
|
||||
></el-table-column>
|
||||
|
||||
<el-table-column
|
||||
:key="column.prop"
|
||||
: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:{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>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="年度" prop="year">
|
||||
<template>{{pageForm.year}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="分工会名称"
|
||||
prop="unionname"></el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="活动名称"
|
||||
prop="activityName">
|
||||
<template>{{pageForm.activityName}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="人数"
|
||||
prop="num"></el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="操作">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="doExportXlsx(row)" size="mini" type="primary">导出
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
</template>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityList: [],
|
||||
activityTypeList: [],
|
||||
unions: [],
|
||||
rootData: [],
|
||||
|
||||
noneData: false,
|
||||
tabLoading: false,
|
||||
events: [],
|
||||
|
||||
pageForm: {
|
||||
id: "",
|
||||
unionid: "",
|
||||
isApplyUser: "1",
|
||||
year: new Date().getFullYear() + ""
|
||||
},
|
||||
tableColumns: [
|
||||
{ prop: "allName", label: "项目名称", sortable: true, width: "200" },
|
||||
{ prop: "team", label: "所属队", sortable: true, width: "100" },
|
||||
{ prop: "username", label: "姓名", width: "100" },
|
||||
{ prop: "loginname", label: "教工号", width: "100" },
|
||||
{ prop: "sex", label: "性别", width: "80" },
|
||||
{ prop: "unitname", label: "单位", sortable: true },
|
||||
{ prop: "mobile", label: "电话", width: "100" },
|
||||
{ prop: "projectType", label: "项目类型", sortable: true, width: "80" },
|
||||
{ prop: "identity", label: "身份", sortable: true, width: "200" }
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
doExportXlsx(row) {
|
||||
this.$downLoad("/platform/activity/sports/info/mange/exportXlsx", {
|
||||
id: this.pageForm.id,
|
||||
unionId: row.id
|
||||
})
|
||||
},
|
||||
unionIdChange() {
|
||||
const tableData = clone(this.rootData)
|
||||
setTimeout(()=>{
|
||||
if (this.pageForm.unionid) {
|
||||
if (this.pageForm.isApplyUser === "1") {
|
||||
this.tableData = tableData.filter(v => v.id === this.pageForm.unionid)
|
||||
} else if (this.pageForm.isApplyUser === "2") {
|
||||
this.tableData = tableData.filter(v => v.num === 0 && v.id === this.pageForm.unionid)
|
||||
} else if (this.pageForm.isApplyUser === "3") {
|
||||
this.tableData = tableData.filter(v => v.num > 0 && v.id === this.pageForm.unionid)
|
||||
}
|
||||
} else {
|
||||
if (this.pageForm.isApplyUser === "1") {
|
||||
this.tableData = tableData
|
||||
} else if (this.pageForm.isApplyUser === "2") {
|
||||
this.tableData = tableData.filter(v => v.num === 0)
|
||||
} else if (this.pageForm.isApplyUser === "3") {
|
||||
this.tableData = tableData.filter(v => v.num > 0)
|
||||
}
|
||||
}
|
||||
},500)
|
||||
},
|
||||
doEvent(row) {
|
||||
const { apply, eventId } = row
|
||||
|
||||
if (!eventId) {
|
||||
this.$set(row, "apply2", apply)
|
||||
} else {
|
||||
const arr = apply.filter((i) => {
|
||||
return !i.unionLeader && !i.unionCoach && i.evid === eventId
|
||||
})
|
||||
this.$set(row, "apply2", arr)
|
||||
}
|
||||
},
|
||||
async getActivityTypeList(code) {
|
||||
const { data } = await this.$axios.post("/platform/activity/basic/settings/getActivityTwoLevelType", { code: code })
|
||||
return data
|
||||
},
|
||||
async getActivityByYear() {
|
||||
const resp = await this.$axios.post(loc() + "/getActivityByYear", {
|
||||
year: this.pageForm.year,
|
||||
activityLevel: this.pageForm.activityLevel
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.activityList = resp.data
|
||||
if (resp.data.length) {
|
||||
this.pageForm.id = resp.data[0].id
|
||||
await this.pageData()
|
||||
} else {
|
||||
this.pageForm.unionid = ""
|
||||
this.unionis = []
|
||||
this.pageForm.id = ""
|
||||
this.noneData = true
|
||||
this.tabLoading = false
|
||||
}
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
}
|
||||
},
|
||||
async getEventsByActivityId() {
|
||||
const resp = await this.$axios.post("/platform/activity/apply/getEvents", { activityId: this.pageForm.id })
|
||||
this.events = resp.data
|
||||
},
|
||||
async pageData() {
|
||||
this.noneData = true
|
||||
this.tabLoading = true
|
||||
|
||||
const activity = this.activityList.filter((v) => {
|
||||
return v.id === this.pageForm.id
|
||||
})
|
||||
await this.getEventsByActivityId()
|
||||
this.pageForm.activityName = activity.length > 0 ? activity[0].name : null
|
||||
this.pageForm.applyType = activity[0].applyType
|
||||
|
||||
const resp = await this.$axios.post(loc() + "/pageData", 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
|
||||
})
|
||||
})
|
||||
|
||||
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.tableData && this.tableData.length > 0) {
|
||||
// this.$set(this.tableData[0], "show", true)
|
||||
}
|
||||
this.unionIdChange()
|
||||
this.tableData = this.rootData
|
||||
} else {
|
||||
this.notifyWarning(resp.msg)
|
||||
this.noneData = true
|
||||
}
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.activityTypeList = await this.getActivityTypeList("40000")
|
||||
this.$set(this.pageForm, "activityLevel", this.activityTypeList[0].code)
|
||||
await this.getActivityByYear()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+633
@@ -0,0 +1,633 @@
|
||||
<el-form :model="formData" label-width="130px" ref="form">
|
||||
<div class="left-span-label">活动信息</div>
|
||||
<el-row :gutter="20" type="flex" v-if="fromEdit !== 'edit'">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否沿用之前活动" prop="use">
|
||||
<el-radio-group v-model="use">
|
||||
<el-radio :label="true">沿用之前活动</el-radio>
|
||||
<el-radio :label="false">不沿用之前活动</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12" v-if="use">
|
||||
<el-form-item label="往期活动" prop="historicalAct">
|
||||
<el-select v-model="historicalAct" placeholder="请选择往期活动" style="width: 100%" @change="historicalActChange">
|
||||
<el-option v-for="item in historicalActList" :key="item.id" :label="item.activityName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" type="flex">
|
||||
<el-col :span="12">
|
||||
<el-form-item :rules="{required:true,message: '请输入活动名称', trigger: 'blur'}" label="活动名称" prop="activityName">
|
||||
<el-input maxlength="50" v-model="formData.activityName" placeholder="请输入活动名称"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item :label="trainType + '通知'" prop="notice">
|
||||
<el-radio-group v-model="formData.notice" size="small">
|
||||
<el-radio :label="true" border>通知</el-radio>
|
||||
<el-radio :label="false" border>不通知</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20" type="flex">
|
||||
<el-col :span="12">
|
||||
<el-form-item :rules="{required:true,message: '请选择起止时间', trigger: 'blur'}" label="活动时间" prop="activityTime">
|
||||
<el-date-picker
|
||||
:picker-options="pickerOptions"
|
||||
end-placeholder="结束日期"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
style="width: 100%"
|
||||
type="datetimerange"
|
||||
v-model="formData.activityTime"
|
||||
value-format="yyyy-MM-dd HH:mm"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item :rules="{required:true,message: '请选择起止时间', trigger: 'blur'}" label="报名时间" prop="activitySignTime">
|
||||
<el-date-picker
|
||||
:disabled="false"
|
||||
end-placeholder="结束日期"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
style="width: 100%"
|
||||
type="datetimerange"
|
||||
v-model="formData.activitySignTime"
|
||||
value-format="yyyy-MM-dd HH:mm"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" type="flex">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="面向对象" prop="joinCnd">
|
||||
<div style="display: flex; justify-content: space-between">
|
||||
<div style="width: 99%">
|
||||
<el-select
|
||||
@change="changeActivity"
|
||||
clearable
|
||||
filterable
|
||||
placeholder="请选择可报名人员范围"
|
||||
style="width: 99%"
|
||||
v-model="formData.activityGroupId"
|
||||
>
|
||||
<el-option
|
||||
:key="item.groupId"
|
||||
:label="item.groupName"
|
||||
:value="item.groupId"
|
||||
v-for="item in activityGroupList"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div>
|
||||
<el-button @click="$refs.drawerUserScope.userScopeDialog = true" type="primary">设置</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<!--<el-button @click="$refs.joinCnd.open()" icon="el-icon-s-operation" size="small">打开</el-button>-->
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="活动类型" prop="trainType" :rules="{required:true,message: '请选择活动类型', trigger: 'blur'}">
|
||||
<el-select @change="typeChange" filterable placeholder="请选择活动类型" style="width: 100%" v-model="formData.trainType">
|
||||
<el-option :label="item.name" :value="item.code" :key="item.code" v-for="item in trainTypeList"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-form-item :rules="{required:true,message: '请输入活动介绍', trigger: 'blur'}" label="活动介绍" prop="introduce">
|
||||
<text-editor v-model="formData.introduce"></text-editor>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="封面图片" prop="cover" :rules="{required:true,message: '请上传活动移动端封面图片', trigger: 'blur'}">
|
||||
<el-col :span="12">
|
||||
<file-upload
|
||||
:upload_number="1"
|
||||
:value.sync="formData.cover"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
complete_result
|
||||
upload_mode="image"
|
||||
upload_result_category="interval"
|
||||
></file-upload>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="微信群二维码" prop="wechat">
|
||||
<file-upload
|
||||
:upload_number="1"
|
||||
:value.sync="formData.wechat"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
complete_result
|
||||
upload_mode="image"
|
||||
upload_result_category="interval"
|
||||
></file-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-form-item>
|
||||
|
||||
<div class="left-span-label" style="display: flex; justify-content: space-between; align-items: center">
|
||||
<div>{{trainType + '信息(温馨提示:如不需要人数限制,下方人数框填写0或者不填)'}}</div>
|
||||
<div>
|
||||
<el-button @click="addCourse" size="mini" type="primary">添加{{ trainType }}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<el-table :data="formData.courseList">
|
||||
<el-table-column label="序号" prop="orderNum" width="100px">
|
||||
<template v-slot="{row}">
|
||||
<el-input-number
|
||||
v-model="row.orderNum"
|
||||
@change="courseOrderNumChange"
|
||||
:min="1"
|
||||
:max="formData.courseList.length"
|
||||
:step="1"
|
||||
step-strictly
|
||||
:precision="0"
|
||||
controls-position="right"
|
||||
style="width: 76px"
|
||||
size="small"
|
||||
label="序号"
|
||||
></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column :label="trainType + '名称'" prop="courseName">
|
||||
<template v-slot="{row}">
|
||||
<el-input size="small" v-model="row.courseName" :placeholder="'请输入' + trainType + '名称'"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="类型" prop="courseType" sortable>
|
||||
<template v-slot="{row}">
|
||||
<el-select size="small" v-model="row.courseType" @change="(val) => {courseTypeChange(val, row)}">
|
||||
<el-option :label="c.lxname" :value="c.id" :key="c.id" v-for="c in courseTypeList"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column :label="trainType + '人数'" prop="coursePeopleNumber" width="110px">
|
||||
<template v-slot="{row}">
|
||||
<el-input-number
|
||||
:controls="false"
|
||||
:max="9999"
|
||||
size="small"
|
||||
:min="0"
|
||||
:precision="0"
|
||||
step-strictly
|
||||
style="max-width: 80px"
|
||||
@change="(c, o) => validNumber(row, null)"
|
||||
v-model="row.coursePeopleNumber"
|
||||
placeholder="请输入人数"
|
||||
></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="预留名额" prop="courseReservedNumber" width="110px">
|
||||
<template v-slot="{row}">
|
||||
<el-input-number
|
||||
:controls="false"
|
||||
:max="1000"
|
||||
:min="0"
|
||||
size="small"
|
||||
:precision="0"
|
||||
step-strictly
|
||||
style="max-width: 80px"
|
||||
@change="(c, o) => validNumber(row, o)"
|
||||
v-model="row.courseReservedNumber"
|
||||
placeholder="请输入预留名额"
|
||||
></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="校区" prop="campus">
|
||||
<template v-slot="{row}">
|
||||
<el-select size="small" v-model="row.campus" style="width: 100%">
|
||||
<el-option :label="item.name" :value="item.name" :key="item.code" v-for="item in campusList"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column :label="trainType + '地点'" prop="courseLocation">
|
||||
<template v-slot="{row}">
|
||||
<el-input size="small" v-model="row.courseLocation" :placeholder="'请输入' + trainType + '地点'"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column :label="trainType + '负责人'" prop="courseInstructor">
|
||||
<template v-slot="{row}">
|
||||
<el-input size="small" v-model="row.courseInstructor" :placeholder="'请输入' + trainType + '负责人'"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="分类标识" prop="assort">
|
||||
<template v-slot="{row}">
|
||||
<el-input size="small" v-model="row.assort" placeholder="请输入分类标识"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column :label="trainType + '时间'">
|
||||
<template v-slot="scope">
|
||||
<el-button @click="openSetUpCourseTime(scope.$index)" type="text">设置{{ trainType }}时间</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作" width="200">
|
||||
<template v-slot="scope">
|
||||
<el-button @click="openMoreInfo(scope, scope.$index)" size="mini" type="primary">自定义设置</el-button>
|
||||
<el-button @click="removeTableCourse(scope.$index)" size="mini" type="danger">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div class="left-span-label">个人报名数量限制</div>
|
||||
<el-form-item label="报名数量限制" prop="cover">
|
||||
<el-radio-group v-model="formData.restrictLimit" size="small">
|
||||
<el-radio border :label="1">无限制</el-radio>
|
||||
<el-radio border :label="2">按类型限制</el-radio>
|
||||
<el-radio border :label="3">按活动限制</el-radio>
|
||||
</el-radio-group>
|
||||
<div calss="limit_div">
|
||||
<div v-if="formData.restrictLimit === 1" style="color: #c64120; font-size: 12px">注:无限制指对报名的个数不做任何限制</div>
|
||||
<div v-if="formData.restrictLimit === 2" style="color: #c64120; font-size: 12px">
|
||||
<div>
|
||||
<el-button @click="setSignUpCondition" size="mini" type="primary">设置报名限制</el-button>
|
||||
<span style="color: #c64120; font-size: 12px">注:按类型限制指对每个类型下的个数进行限制</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="formData.restrictLimit === 3">
|
||||
<div>
|
||||
<el-input-number v-model="formData.limitNum" :min="1" :max="100" size="mini" label="限制报名个数"></el-input-number>
|
||||
<span style="color: #c64120; font-size: 12px">注:按活动限制指只能报{{formData.limitNum}}个,不与类型关联</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-row class="mt10" justify="end" type="flex">
|
||||
<el-button v-if="activityId !== ''" @click="doBack">返回</el-button>
|
||||
<el-button @click="doHandle(false)" type="primary">保存</el-button>
|
||||
<el-button @click="doHandle(true)" type="primary">提交</el-button>
|
||||
</el-row>
|
||||
|
||||
<el-dialog :close-on-click-modal="false" :visible.sync="setUpCourseDialog" title="设置时间">
|
||||
<div style="color: red; margin-bottom: 10px">温馨提示:有人员报名后,禁止修改下列时间,如有修改,请联系管理员</div>
|
||||
<div class="left-span-label">选择日期</div>
|
||||
<el-date-picker
|
||||
v-if="formData.courseList && formData.courseList[courseIndex]"
|
||||
:picker-options="setUpCoursePickerOptions"
|
||||
@change="setUpCourseDataChange"
|
||||
placeholder="选择一个或多个日期"
|
||||
style="width: 100%"
|
||||
type="dates"
|
||||
v-model="formData.courseList[courseIndex].setUpCourseData"
|
||||
value-format="yyyy-MM-dd"
|
||||
></el-date-picker>
|
||||
<div class="left-span-label">{{'设置' + trainType + '时间'}}</div>
|
||||
<el-row style="margin-bottom: 10px">
|
||||
<el-time-select
|
||||
:picker-options="{
|
||||
start: '08:30',
|
||||
step: '00:05',
|
||||
end: '23:30'
|
||||
}"
|
||||
placeholder="开始时间"
|
||||
size="mini"
|
||||
v-model="courseTimeOneKeySet.startTime"
|
||||
></el-time-select>
|
||||
<el-time-select
|
||||
:picker-options="{
|
||||
start: '08:30',
|
||||
step: '00:05',
|
||||
end: '23:30'
|
||||
}"
|
||||
placeholder="结束时间"
|
||||
size="mini"
|
||||
v-model="courseTimeOneKeySet.endTime"
|
||||
></el-time-select>
|
||||
<el-button @click="oneKeySetStartEndTime" size="mini" type="primary">一键设置开始/结束时间</el-button>
|
||||
</el-row>
|
||||
|
||||
<el-table v-if="formData.courseList && formData.courseList[courseIndex]" :data="formData.courseList[courseIndex].courseTimeList">
|
||||
<el-table-column label="日期">
|
||||
<template v-slot="{row}">
|
||||
<i class="el-icon-time"></i>
|
||||
{{$moment(row.courseDate).format('YYYY-MM-DD')}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开始时间">
|
||||
<template v-slot="{row}">
|
||||
<el-time-select
|
||||
:picker-options="{
|
||||
start: '08:30',
|
||||
step: '00:05',
|
||||
end: '23:30'
|
||||
}"
|
||||
placeholder="开始时间"
|
||||
style="width: 100%"
|
||||
v-model="row.courseStartTime"
|
||||
></el-time-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="结束时间">
|
||||
<template v-slot="{row}">
|
||||
<el-time-select
|
||||
:picker-options="{
|
||||
start: '08:30',
|
||||
step: '00:05',
|
||||
end: '23:30'
|
||||
}"
|
||||
placeholder="结束时间"
|
||||
style="width: 100%"
|
||||
v-model="row.courseEndTime"
|
||||
></el-time-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200">
|
||||
<template v-slot="{row,$index}">
|
||||
<el-button
|
||||
@click="formData.courseList[courseIndex].courseTimeList.splice($index,0,{courseDate:row.courseDate,courseStartTime:'',courseEndTime:''})"
|
||||
size="small"
|
||||
>
|
||||
新增同天时段
|
||||
</el-button>
|
||||
<el-button @click="removeSetUpTableCourseRow(row,$index)" size="small" type="danger">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-row class="mt20" justify="end" type="flex">
|
||||
<el-button v-if="fromEdit === 'edit'" @click="cancel">取消</el-button>
|
||||
<el-button @click="doConfirmSetUpCourse" type="primary">确定</el-button>
|
||||
</el-row>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :close-on-click-modal="false" :visible.sync="mapDialog" title="位置信息" :append-to-body="true">
|
||||
<map-container v-if="mapDialog" :position.sync="formData.courseList[mapIndex].courseLocationCoordinates"></map-container>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="mapDialog = false">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :close-on-click-modal="false" :visible.sync="signUpDialog" title="设置报名限制">
|
||||
<el-table :data="formData.typeLimits">
|
||||
<el-table-column prop="code" label="类型编码"></el-table-column>
|
||||
<el-table-column prop="lxname" label="类型名称"></el-table-column>
|
||||
<el-table-column label="限制个数" width="500">
|
||||
<template v-slot="scope">
|
||||
<span>限制个数</span>
|
||||
<span style="color: #c64120; font-size: 12px">注:值为空或者为0则表示此类型不限制报名个数</span>
|
||||
</template>
|
||||
<template v-slot="{row}">
|
||||
<el-input-number size="small" v-model="row.limitNum" :min="0"></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-row class="mt20" justify="end" type="flex">
|
||||
<el-button @click="cancelLimitNum">取消</el-button>
|
||||
<el-button @click="doLimitNum" type="primary">确定</el-button>
|
||||
</el-row>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :close-on-click-modal="false" :visible.sync="setUpUnionLimitDialog" title="分工会人数限制" top="50px">
|
||||
<div class="left-span-label" style="display: flex; justify-content: space-between; align-items: center">
|
||||
<div>分段设置</div>
|
||||
<div>
|
||||
<el-button size="small" type="primary" @click="unionLimitQuickSetting">应用分段设置</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<el-row v-for="(item,index) in unionUserNumCalc" :key="index" :gutter="20" class="mb5">
|
||||
<el-col :span="7">
|
||||
<el-input-number
|
||||
v-model="item.startNum"
|
||||
:precision="0"
|
||||
:step="1"
|
||||
:min="1"
|
||||
placeholder="请输入最小人数"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-col>
|
||||
<el-col :span="7">
|
||||
<el-input-number
|
||||
v-model="item.endNum"
|
||||
:precision="0"
|
||||
:step="1"
|
||||
:min="1"
|
||||
placeholder="请输入最大人数"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-input-number
|
||||
v-model="item.resultNum"
|
||||
:precision="0"
|
||||
:step="1"
|
||||
:min="1"
|
||||
placeholder="请输入限制人数"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-col>
|
||||
<el-col :span="4" class="text-right">
|
||||
<el-button icon="el-icon-plus" @click="unionUserNumCalc.push({})"></el-button>
|
||||
<el-button icon="el-icon-minus" @click="unionUserNumCalc.splice(index,1)" :disabled="unionUserNumCalc.length===1"></el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row class="mt10">
|
||||
<div v-for="(item,index) in unionUserNumCalcTips" class="text-danger">
|
||||
<span class="mr10">({{index+1}}).</span>
|
||||
{{item}}
|
||||
</div>
|
||||
</el-row>
|
||||
|
||||
<div class="left-span-label" style="display: flex; justify-content: space-between; align-items: center">
|
||||
<div>比例设置</div>
|
||||
<div>
|
||||
一键比例:
|
||||
<el-input-number
|
||||
v-model="unionUserNumOneKeyRatio"
|
||||
:precision="0"
|
||||
:step="1"
|
||||
:min="0"
|
||||
placeholder="请输入一键比例"
|
||||
size="small"
|
||||
:max="100"
|
||||
></el-input-number>
|
||||
<el-button size="small" type="primary" @click="applyScaleSettings" class="ml5">应用比例设置</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<el-table :data="formData.courseList[unionLimitIndex].unionLimit" max-height="500px">
|
||||
<el-table-column prop="name" label="分工会"></el-table-column>
|
||||
<el-table-column prop="teacherCount" label="人数"></el-table-column>
|
||||
<el-table-column prop="ratio" label="比例(%)">
|
||||
<template v-slot="{row}">
|
||||
<el-input-number v-model="row.ratio" :precision="0" :step="1" :min="0" :max="100"></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="limitCount" label="限制人数">
|
||||
<template v-slot="{row}">
|
||||
<el-input-number
|
||||
v-model="row.limitCount"
|
||||
:precision="0"
|
||||
:step="1"
|
||||
:min="0"
|
||||
:max="row.teacherCount"
|
||||
@change="calSummaryCount"
|
||||
></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<el-row class="mt20" justify="end" type="flex">
|
||||
<div class="text-danger" style="width: 100%; font-size: 18px; display: flex; align-items: center; font-weight: bold">
|
||||
限制总人数:{{summaryCount}}人
|
||||
</div>
|
||||
<el-button @click="clearUnionLimit" type="danger">清空分工会人数限制</el-button>
|
||||
<el-button @click="setUpUnionLimitDialog=false">取消</el-button>
|
||||
<el-button @click="doConfirmSetUpUnionLimit" type="primary">确定</el-button>
|
||||
</el-row>
|
||||
</el-dialog>
|
||||
|
||||
<el-drawer title="自定义设置" size="50%" class="my-drawer" :visible.sync="moreInfoDrawer">
|
||||
<el-row :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>分工会人数限制</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-button @click="openSetUpUnionLimit(moreInfoIndex)" type="primary" size="small">设置分工会人数限制</el-button>
|
||||
<span
|
||||
v-if="formData.courseList[moreInfoIndex].unionLimit && formData.courseList[moreInfoIndex].unionLimit.length > 0"
|
||||
class="text-success"
|
||||
>
|
||||
已设置
|
||||
</span>
|
||||
<span v-else class="text-danger">未设置</span>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!--<el-row :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>报名人员范围</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-button @click="openSetUpUserScope(moreInfoIndex)" type="primary" size="small">设置报名人员范围</el-button>
|
||||
</el-col>
|
||||
</el-row>-->
|
||||
|
||||
<el-row :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>承办工会</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-select v-model="formData.courseList[moreInfoIndex].hostUnionId" placeholder="请选择承办工会" style="width: 100%">
|
||||
<el-option :label="item.name" :value="item.id" :key="item.id" v-for="item in unionList"></el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>对内报名时间</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-date-picker
|
||||
placeholder="请选择对内报名时间"
|
||||
style="width: 100%"
|
||||
type="datetime"
|
||||
v-model="formData.courseList[moreInfoIndex].interTime"
|
||||
format="yyyy-MM-dd HH:mm"
|
||||
value-format="yyyy-MM-dd HH:mm"
|
||||
></el-date-picker>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>是否签到</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-radio-group v-model="formData.courseList[moreInfoIndex].isMobileSign" size="small">
|
||||
<el-radio border :label="true">签到</el-radio>
|
||||
<el-radio border :label="false">不签到</el-radio>
|
||||
</el-radio-group>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row v-if="formData.courseList[moreInfoIndex].isMobileSign === true" :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>签到方式</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-radio-group v-model="formData.courseList[moreInfoIndex].signType" size="small">
|
||||
<el-radio border :label="1">扫描二维码</el-radio>
|
||||
<el-radio border :label="2">被扫</el-radio>
|
||||
<el-radio border :label="3">GPS定位签到</el-radio>
|
||||
</el-radio-group>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row
|
||||
v-if="formData.courseList[moreInfoIndex].isMobileSign === true
|
||||
&& formData.courseList[moreInfoIndex].signType == 3"
|
||||
:gutter="50"
|
||||
type="flex"
|
||||
>
|
||||
<el-col :span="4">
|
||||
<span>地点坐标</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-button @click="openMap(moreInfoIndex)" type="primary" size="small">设置签到点</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>是否领取礼品</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-radio-group v-model="formData.courseList[moreInfoIndex].isReceiveGift" size="small">
|
||||
<el-radio border :label="true">领取</el-radio>
|
||||
<el-radio border :label="false">不领取</el-radio>
|
||||
</el-radio-group>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row v-if="formData.courseList[moreInfoIndex].isReceiveGift === true" :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>领取方式</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-radio-group v-model="formData.courseList[moreInfoIndex].giftType" size="small">
|
||||
<el-radio border :label="1">扫描二维码</el-radio>
|
||||
<el-radio border :label="2">面对面确认</el-radio>
|
||||
</el-radio-group>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="50" type="flex">
|
||||
<el-col :span="4">
|
||||
<span>预留名额方式</span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-radio-group
|
||||
v-model="formData.courseList[moreInfoIndex].reserveMode"
|
||||
size="small"
|
||||
:disabled="formData.courseList[moreInfoIndex].isBringFamily === true"
|
||||
>
|
||||
<el-radio border :label="1">报名人员减少模式</el-radio>
|
||||
<el-radio border :label="2">候补模式</el-radio>
|
||||
</el-radio-group>
|
||||
<span v-if="formData.courseList[moreInfoIndex].isBringFamily === true" class="text-danger" style="margin-left: 6px">
|
||||
温馨提醒:{{formData.courseList[moreInfoIndex].courseName}}为携带家属,只支持报名人员减少模式
|
||||
</span>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div style="text-align: right">
|
||||
<el-button @click="moreInfoDrawer = false">取 消</el-button>
|
||||
<el-button type="primary" @click="moreInfoDrawer = false">保 存</el-button>
|
||||
</div>
|
||||
</el-drawer>
|
||||
|
||||
<drawer-user-scope @group_change="getActivityGroup" ref="drawerUserScope" :group_id.sync="formData.activityGroupId"></drawer-user-scope>
|
||||
@@ -0,0 +1,663 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.el-row--flex {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.el-drawer__body {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.my-drawer .el-col-4 {
|
||||
text-align: right;
|
||||
}
|
||||
.my-drawer .el-row {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<!--#include("/platform/zhgh/activity/trainSingUp/add/include_activity_edit.html"){}#-->
|
||||
</el-card>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let pointX = "${AppMapCenterPointX!}"
|
||||
let pointY = "${AppMapCenterPointY!}"
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
components: {
|
||||
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue"),
|
||||
"map-container": httpVueLoader("/components/plugins/mapContainer/MapContainer.vue?v=1.0.1")
|
||||
},
|
||||
data() {
|
||||
const that = this
|
||||
return {
|
||||
use: false,
|
||||
historicalActList: [],
|
||||
historicalAct: "",
|
||||
unionList: [],
|
||||
trainType: "培训班",
|
||||
trainTypeList: [],
|
||||
fromEdit: "",
|
||||
formData: {
|
||||
notice: false,
|
||||
courseList: [
|
||||
{ orderNum: 1, courseName: "", courseTimeList: [], isMobileSign: false, isReceiveGift: false, reserveMode: 1 },
|
||||
{ orderNum: 2, courseName: "", courseTimeList: [], isMobileSign: false, isReceiveGift: false, reserveMode: 1 }
|
||||
],
|
||||
conditionStructure: {
|
||||
method: "AND",
|
||||
conditions: [{}]
|
||||
},
|
||||
restrictLimit: 1,
|
||||
limitNum: 1,
|
||||
typeLimits: []
|
||||
},
|
||||
pickerOptions: {
|
||||
disabledDate(time) {
|
||||
return time.getTime() < Date.now() - 24 * 60 * 60 * 1000
|
||||
}
|
||||
},
|
||||
setUpCoursePickerOptions: {
|
||||
disabledDate(time) {
|
||||
return (
|
||||
time.getTime() < Date.parse(that.$moment(that.formData.activityTime[0]).format("YYYY-MM-DD") + " 00:00:00") ||
|
||||
time.getTime() > Date.parse(that.$moment(that.formData.activityTime[1]).format("YYYY-MM-DD") + " 00:00:00")
|
||||
)
|
||||
}
|
||||
},
|
||||
courseIndex: 0,
|
||||
setUpCourseDialog: false,
|
||||
unionLimitIndex: 0,
|
||||
setUpUnionLimitDialog: false,
|
||||
viewMapDialog: false,
|
||||
mapDialog: false,
|
||||
courseTypeList: [],
|
||||
campusList: [],
|
||||
courseTimeOneKeySet: {
|
||||
startTime: "",
|
||||
endTime: ""
|
||||
},
|
||||
conditionStructure: {
|
||||
method: "AND",
|
||||
conditions: [{}]
|
||||
},
|
||||
fields: [],
|
||||
activityGroupList: [],
|
||||
signUpDialog: false,
|
||||
|
||||
userScopeIndex: 0,
|
||||
|
||||
unionUserNumCalc: [{}],
|
||||
unionUserNumOneKeyRatio: null,
|
||||
|
||||
summaryCount: 0,
|
||||
|
||||
moreInfoDrawer: false,
|
||||
moreInfoRow: {},
|
||||
moreInfoIndex: 0,
|
||||
placeSearchComponent: null,
|
||||
addressValue: "",
|
||||
|
||||
mapIndex: 0,
|
||||
activityId: GetQueryString("id")
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
unionUserNumCalcTips() {
|
||||
return this.unionUserNumCalc.map((v) => {
|
||||
return (
|
||||
(v.startNum ? v.startNum : "?") +
|
||||
"-" +
|
||||
(v.endNum ? v.endNum : "?") +
|
||||
"人的分工会,限报" +
|
||||
(v.resultNum ? v.resultNum : "?") +
|
||||
"人"
|
||||
)
|
||||
})
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
courseTypeChange(val, row) {
|
||||
const courseType = this.courseTypeList.find((o) => o.id === val)
|
||||
if (courseType.isBringFamily === true) {
|
||||
this.$set(row, "isBringFamily", true)
|
||||
} else {
|
||||
this.$set(row, "isBringFamily", false)
|
||||
}
|
||||
row.reserveMode = 1
|
||||
},
|
||||
openMoreInfo(row, index) {
|
||||
this.moreInfoRow = row
|
||||
this.moreInfoIndex = index
|
||||
this.moreInfoDrawer = true
|
||||
},
|
||||
openSetUpUserScope(index) {
|
||||
const id = GetQueryString("id")
|
||||
if (
|
||||
id &&
|
||||
this.formData.courseList[index].conditionStructure &&
|
||||
this.formData.courseList[index].conditionStructure.conditions.length > 0
|
||||
) {
|
||||
this.conditionStructure = this.formData.courseList[index].conditionStructure
|
||||
} else {
|
||||
this.conditionStructure = {
|
||||
method: "AND",
|
||||
conditions: [{}]
|
||||
}
|
||||
}
|
||||
this.userScopeIndex = index
|
||||
this.$refs.joinCnd.open()
|
||||
},
|
||||
cancel() {
|
||||
this.$store.dispatch("pjaxRoute", "/platform/trainSingUp/manage/activity")
|
||||
},
|
||||
changeActivity(val) {
|
||||
if (val) {
|
||||
const group = this.activityGroupList.find((v) => v.groupId === val)
|
||||
this.$set(this.formData, "activityGroupName", group.groupName)
|
||||
} else {
|
||||
this.$set(this.formData, "activityGroupName", "全部教职工")
|
||||
}
|
||||
},
|
||||
//添加培训班
|
||||
addCourse() {
|
||||
this.formData.courseList.push({ courseTimeList: [], isMobileSign: false, isReceiveGift: false, reserveMode: 1 })
|
||||
},
|
||||
//删除培训班
|
||||
async removeTableCourse(index) {
|
||||
const confirm = await this.$confirm(
|
||||
"请确认是否删除此" + this.trainType + "?如果该" + this.trainType + "已有报名人员,会随之一起删除!确定吗?",
|
||||
"提示",
|
||||
{
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}
|
||||
)
|
||||
if (confirm) {
|
||||
this.formData.courseList.splice(index, 1)
|
||||
}
|
||||
},
|
||||
//培训日期change
|
||||
setUpCourseDataChange(val) {
|
||||
if (!val) {
|
||||
this.formData.courseList[this.courseIndex].courseTimeList = []
|
||||
return
|
||||
}
|
||||
//培训时间日期Set
|
||||
if (this.formData.courseList[this.courseIndex].courseTimeList === undefined) {
|
||||
this.$set(this.formData.courseList[this.courseIndex], "courseTimeList", [])
|
||||
}
|
||||
const ctList = new Set(
|
||||
this.formData.courseList[this.courseIndex].courseTimeList.map((v) => this.$moment(v.courseDate).format("YYYY-MM-DD"))
|
||||
)
|
||||
val.forEach((v) => {
|
||||
if (!ctList.has(v)) {
|
||||
this.formData.courseList[this.courseIndex].courseTimeList.push({
|
||||
courseDate: v,
|
||||
courseTime: null
|
||||
})
|
||||
}
|
||||
})
|
||||
this.formData.courseList[this.courseIndex].courseTimeList = this.formData.courseList[this.courseIndex].courseTimeList.filter((v) => {
|
||||
return val.includes(this.$moment(v.courseDate).format("YYYY-MM-DD"))
|
||||
})
|
||||
this.formData.courseList[this.courseIndex].courseTimeList.sort((a, b) => {
|
||||
return Date.parse(a["courseDate"]) - Date.parse(b["courseDate"])
|
||||
})
|
||||
},
|
||||
//设置课程时间确定
|
||||
doConfirmSetUpCourse() {
|
||||
const courseTableData = this.formData.courseList[this.courseIndex].courseTimeList
|
||||
if (courseTableData.length === 0) {
|
||||
this.$message.warning("请填写培训时间!")
|
||||
return
|
||||
}
|
||||
if (courseTableData && courseTableData.length > 0) {
|
||||
const valid = courseTableData.every((v) => v.courseStartTime && v.courseEndTime && v.courseStartTime < v.courseEndTime)
|
||||
if (!valid) {
|
||||
this.$message.warning("时间填写不完整或者有误!")
|
||||
return
|
||||
}
|
||||
this.setUpCourseDialog = false
|
||||
}
|
||||
},
|
||||
//打开设置课程时间
|
||||
openSetUpCourseTime(index) {
|
||||
if (!this.formData.activityTime || this.formData.activityTime.length === 0) {
|
||||
this.$message.warning("请先设置活动起止时间")
|
||||
return
|
||||
}
|
||||
this.courseIndex = index
|
||||
this.setUpCourseDialog = true
|
||||
},
|
||||
//打开设置分工会人数限制
|
||||
async openSetUpUnionLimit(index) {
|
||||
this.unionLimitIndex = index
|
||||
this.setUpUnionLimitDialog = true
|
||||
if (
|
||||
!this.formData.courseList[this.unionLimitIndex].unionLimit ||
|
||||
this.formData.courseList[this.unionLimitIndex].unionLimit.length === 0
|
||||
) {
|
||||
const resp = await this.$axios.get("/platform/trainSingUp/manage/activity/getUnionLimit", {
|
||||
activityScopeId: this.formData.activityGroupId
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.$set(this.formData.courseList[this.unionLimitIndex], "unionLimit", resp.data)
|
||||
}
|
||||
}
|
||||
this.summaryCount = this.formData.courseList[this.unionLimitIndex].unionLimit.reduce((prev, curr) => {
|
||||
const value = Number(curr.limitCount)
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr.limitCount
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
},
|
||||
unionLimitQuickSetting() {
|
||||
this.unionUserNumCalc.forEach((v, i) => {
|
||||
const startNum = v.startNum
|
||||
const endNum = v.endNum
|
||||
const resultNum = v.resultNum
|
||||
if (startNum > endNum) {
|
||||
this.$message.warning("第" + (i + 1) + "行设置错误")
|
||||
} else {
|
||||
this.formData.courseList[this.unionLimitIndex].unionLimit.forEach((x) => {
|
||||
if (x.teacherCount >= startNum && x.teacherCount <= endNum) {
|
||||
x.limitCount = resultNum
|
||||
}
|
||||
})
|
||||
this.calSummaryCount()
|
||||
}
|
||||
})
|
||||
},
|
||||
doConfirmSetUpUnionLimit() {
|
||||
this.setUpUnionLimitDialog = false
|
||||
/*if (this.formData.courseList[this.unionLimitIndex].unionLimit) {
|
||||
const totalLimit = this.formData.courseList[this.unionLimitIndex].unionLimit.map(v => v.limitCount).reduce((a, b) => a + b)
|
||||
console.log(totalLimit)
|
||||
this.formData.courseList[this.unionLimitIndex].coursePeopleNumber = totalLimit
|
||||
}*/
|
||||
},
|
||||
//应用比例设置
|
||||
applyScaleSettings() {
|
||||
this.formData.courseList[this.unionLimitIndex].unionLimit.forEach((v) => {
|
||||
v.limitCount = parseFloat(((v.teacherCount * this.unionUserNumOneKeyRatio) / 100).toFixed(0))
|
||||
if (v.ratio) {
|
||||
v.limitCount = parseFloat(((v.teacherCount * v.ratio) / 100).toFixed(0))
|
||||
}
|
||||
})
|
||||
this.calSummaryCount()
|
||||
},
|
||||
async clearUnionLimit() {
|
||||
const confirm = await this.$confirm("确定要清空分工会人数限制吗, 是否继续?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
if ("confirm" === confirm) {
|
||||
this.formData.courseList[this.unionLimitIndex].unionLimit = []
|
||||
this.unionUserNumOneKeyRatio = null
|
||||
this.unionUserNumCalc = [{}]
|
||||
this.setUpUnionLimitDialog = false
|
||||
}
|
||||
},
|
||||
openMap(index) {
|
||||
this.mapIndex = index
|
||||
this.mapDialog = true
|
||||
},
|
||||
//删除一行培训时间记录
|
||||
removeSetUpTableCourseRow(row, index) {
|
||||
this.formData.courseList[this.courseIndex].courseTimeList.splice(index, 1)
|
||||
//培训时间列表日期数组
|
||||
const courseDateArray = this.formData.courseList[this.courseIndex].courseTimeList.map((v) =>
|
||||
this.$moment(v.courseDate).format("YYYY-MM-DD")
|
||||
)
|
||||
//选择课程日期数组
|
||||
const scdList = this.formData.courseList[this.courseIndex].setUpCourseData
|
||||
|
||||
this.formData.courseList[this.courseIndex].setUpCourseData = scdList.filter((v) => {
|
||||
return courseDateArray.includes(this.$moment(v).format("YYYY-MM-DD"))
|
||||
})
|
||||
},
|
||||
courseOrderNumChange() {
|
||||
this.formData.courseList = this.formData.courseList.sort((a, b) => a.orderNum - b.orderNum)
|
||||
},
|
||||
//提交
|
||||
async doHandle(flag) {
|
||||
if (flag === false) {
|
||||
let valid = false
|
||||
this.$refs.form.validateField("activityName", (errMsg) => {
|
||||
valid = errMsg === ""
|
||||
})
|
||||
if (!valid) {
|
||||
this.$message.warning("请输入活动名称")
|
||||
return
|
||||
}
|
||||
} else {
|
||||
const valid = await this.$refs["form"].validate()
|
||||
if (!valid) {
|
||||
this.$message.warning("存在必填项未填写")
|
||||
return
|
||||
}
|
||||
const courseValid = this.formData.courseList.some((v, i) => {
|
||||
const basicValid = v.courseName && v.campus && v.courseLocation && v.courseInstructor && v.courseType
|
||||
const timeValid =
|
||||
v.courseTimeList.length > 0 &&
|
||||
v.courseTimeList.every((x) => {
|
||||
return x.courseStartTime && x.courseEndTime && x.courseStartTime < x.courseEndTime
|
||||
})
|
||||
|
||||
if (!timeValid) {
|
||||
this.$message.warning("第" + (i + 1) + "行" + this.trainType + "时间填写有误,请核查!")
|
||||
return true
|
||||
}
|
||||
if (!basicValid) {
|
||||
this.$message.warning("第" + (i + 1) + "行" + this.trainType + "信息填写有误,请核查!")
|
||||
return true
|
||||
}
|
||||
if (
|
||||
v.isMobileSign === true &&
|
||||
v.signType === 3 &&
|
||||
(v.courseLocationCoordinates === undefined || v.courseLocationCoordinates.length < 2)
|
||||
) {
|
||||
this.$message.warning("第" + (i + 1) + "行" + this.trainType + "地点坐标填写有误,请核查!")
|
||||
return true
|
||||
}
|
||||
if (v.isMobileSign === true && v.signType === 3 && (v.signType === "" || v.signType === undefined)) {
|
||||
this.$message.warning("第" + (i + 1) + "行" + this.trainType + "签到方式填写有误,请核查!")
|
||||
return true
|
||||
}
|
||||
if (v.isReceiveGift === true && (v.giftType === "" || v.giftType === undefined)) {
|
||||
this.$message.warning("第" + (i + 1) + "行" + this.trainType + "领取方式填写有误,请核查!")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
if (courseValid) {
|
||||
return
|
||||
}
|
||||
if (this.formData.restrictLimit === 2) {
|
||||
if (this.formData.typeLimits.length === 0) {
|
||||
this.$message.warning("请设置报名限制!")
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
const cloneData = clone(this.formData)
|
||||
|
||||
//cloneData.conditionStructure.conditions = cloneData.conditionStructure.conditions.filter(v => v.field && v.fieldObj && v.operational && v.value)
|
||||
|
||||
cloneData.activitySignUpStartTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[0] : null
|
||||
cloneData.activitySignUpEndTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[1] : null
|
||||
cloneData.activityStartTime = cloneData.activityTime !== undefined ? cloneData.activityTime[0] : null
|
||||
cloneData.activityEndTime = cloneData.activityTime !== undefined ? cloneData.activityTime[1] : null
|
||||
if (cloneData.activityStartTime !== undefined && cloneData.activityStartTime !== null) {
|
||||
cloneData.year = new Date(cloneData.activityStartTime).getFullYear()
|
||||
}
|
||||
|
||||
/*const limitNumArray = []
|
||||
this.formData.typeLimits.forEach(item => {
|
||||
limitNumArray.push({
|
||||
typeId: item.id,
|
||||
limitNum: item.limitNum
|
||||
})
|
||||
})*/
|
||||
const limitNumArray = []
|
||||
this.formData.typeLimits.forEach((item) => {
|
||||
if (item.typeId === "" || item.typeId === undefined) {
|
||||
limitNumArray.push({
|
||||
typeId: item.id,
|
||||
limitNum: item.limitNum
|
||||
})
|
||||
} else {
|
||||
limitNumArray.push(item)
|
||||
}
|
||||
})
|
||||
cloneData.typeLimits = limitNumArray
|
||||
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/manage/activity/doHandle", { data: JSON.stringify(cloneData) })
|
||||
if (resp.code === 0) {
|
||||
const message = this.$message.success(resp.msg)
|
||||
setTimeout(() => {
|
||||
this.$store.dispatch("pjaxRoute", "/platform/trainSingUp/manage/activity")
|
||||
message.close()
|
||||
}, 500)
|
||||
}
|
||||
},
|
||||
async initData() {
|
||||
const id = GetQueryString("id")
|
||||
if (id) {
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/manage/activity/findOne", { id: id })
|
||||
if (resp.code === 0) {
|
||||
this.formData = resp.data
|
||||
const type = this.trainTypeList.find((o) => o.code === this.formData.trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
|
||||
this.formData.courseList.forEach((item) => {
|
||||
const type = this.courseTypeList.find((o) => o.id === item.courseType)
|
||||
if (type !== null && type !== undefined) {
|
||||
if (type.isBringFamily === true) {
|
||||
this.$set(item, "isBringFamily", true)
|
||||
item.reserveMode = 1
|
||||
} else {
|
||||
this.$set(item, "isBringFamily", false)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
} else {
|
||||
}
|
||||
},
|
||||
oneKeySetStartEndTime() {
|
||||
const { startTime, endTime } = this.courseTimeOneKeySet
|
||||
this.formData.courseList[this.courseIndex].courseTimeList.forEach((v) => {
|
||||
this.$set(v, "courseStartTime", startTime)
|
||||
this.$set(v, "courseEndTime", endTime)
|
||||
// if (!v.courseStartTime) {
|
||||
// v.courseStartTime = startTime
|
||||
// }
|
||||
// if (!v.courseEndTime) {
|
||||
// v.courseEndTime = endTime
|
||||
// }
|
||||
})
|
||||
this.$forceUpdate()
|
||||
},
|
||||
doBack() {
|
||||
if (GetQueryString("id") !== "") {
|
||||
this.$store.dispatch("pjaxRoute", "/platform/trainSingUp/manage/activity")
|
||||
}
|
||||
},
|
||||
async validNumber(row, old) {
|
||||
if (GetQueryString("id") === "") {
|
||||
if (row.courseReservedNumber > row.coursePeopleNumber && row.reserveMode === 1) {
|
||||
this.$alert("预留人数不能大于" + this.trainType + "人数!", "提示", {
|
||||
confirmButtonText: "确定"
|
||||
})
|
||||
row.courseReservedNumber = 0
|
||||
}
|
||||
} else {
|
||||
const registerUserCount = await this.getRegisterUserCount(row.id)
|
||||
if (row.courseReservedNumber + registerUserCount > row.coursePeopleNumber) {
|
||||
if (row.reserveMode === 1) {
|
||||
let num = row.coursePeopleNumber - registerUserCount
|
||||
let str =
|
||||
"您设置的" +
|
||||
this.trainType +
|
||||
"人数为" +
|
||||
row.coursePeopleNumber +
|
||||
"人,当前报名人数为" +
|
||||
registerUserCount +
|
||||
"人,预留名额上限为" +
|
||||
num +
|
||||
"人!"
|
||||
this.$alert(str, "提示", {
|
||||
confirmButtonText: "确定"
|
||||
})
|
||||
row.courseReservedNumber = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
//获取培训班报名人数
|
||||
async getRegisterUserCount(courseId) {
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/manage/activity/getRegisterUserCount", { courseId })
|
||||
return resp.code === 0 ? resp.data : 0
|
||||
},
|
||||
setSignUpCondition() {
|
||||
if (this.formData.courseList !== undefined && this.formData.courseList.length > 0) {
|
||||
const courseValid = this.formData.courseList.some((item, index) => {
|
||||
if (item.courseType === undefined) {
|
||||
this.$message.warning("请在" + (index + 1) + "行" + this.trainType + "信息中选择类型!")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
if (courseValid) {
|
||||
return
|
||||
}
|
||||
|
||||
const array = [...new Set(this.formData.courseList.map((o) => o.courseType))]
|
||||
const typeArray = clone([...this.courseTypeList].filter((x) => array.some((y) => x.id === y)))
|
||||
const arr = []
|
||||
typeArray.forEach((item) => {
|
||||
const t = this.formData.typeLimits.find((o) => o.typeId === item.id)
|
||||
if (t) {
|
||||
const type = this.courseTypeList.find((o) => o.id === t.typeId)
|
||||
t.code = type.code
|
||||
t.lxname = type.lxname
|
||||
arr.push(t)
|
||||
} else {
|
||||
item.limitNum = 0
|
||||
arr.push(item)
|
||||
}
|
||||
})
|
||||
this.formData.typeLimits = arr
|
||||
|
||||
/*if (GetQueryString("id") === '' || this.formData.typeLimits.length === 0) {
|
||||
const array = [...new Set(this.formData.courseList.map(o => o.courseType))]
|
||||
this.formData.typeLimits = clone([...this.courseTypeList].filter(x => array.some(y => x.id === y)))
|
||||
} else {
|
||||
this.formData.typeLimits.forEach(item => {
|
||||
const type = this.courseTypeList.find(o => o.id === item.typeId)
|
||||
item.code = type.code
|
||||
item.lxname = type.lxname
|
||||
})
|
||||
}*/
|
||||
this.signUpDialog = true
|
||||
} else {
|
||||
this.$message.warning("请在" + this.trainType + "信息中选择类型!")
|
||||
}
|
||||
},
|
||||
doLimitNum() {
|
||||
/* const courseValid = this.formData.typeLimits.some((item, index) => {
|
||||
if(item.limitNum === 0) {
|
||||
this.$notify({title: '警告', type: 'warning', message: '第'+ (index + 1) +'行限制个数不能为0!'});
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
if(courseValid) {
|
||||
return
|
||||
}*/
|
||||
this.signUpDialog = false
|
||||
},
|
||||
cancelLimitNum() {
|
||||
//this.formData.typeLimits.forEach(item => item.limitNum = 0)
|
||||
this.signUpDialog = false
|
||||
},
|
||||
async getAllType() {
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/manage/type/getAllType", {})
|
||||
return resp.data
|
||||
},
|
||||
calSummaryCount() {
|
||||
const array = this.formData.courseList[this.unionLimitIndex].unionLimit
|
||||
if (array) {
|
||||
this.summaryCount = array.reduce((prev, curr) => {
|
||||
const value = Number(curr.limitCount)
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr.limitCount
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
}
|
||||
},
|
||||
typeChange(val) {
|
||||
const type = this.trainTypeList.find((o) => o.code === val)
|
||||
this.trainType = type ? type.name : ""
|
||||
},
|
||||
async getHistoricalActList() {
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/manage/activity/getHistoricalActList", {})
|
||||
return resp.data
|
||||
},
|
||||
async historicalActChange(val) {
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/manage/activity/findOne", { id: val })
|
||||
if (resp.code === 0) {
|
||||
this.formData = resp.data
|
||||
const type = this.trainTypeList.find((o) => o.code === this.formData.trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
|
||||
this.formData.courseList.forEach((item) => {
|
||||
const type = this.courseTypeList.find((o) => o.id === item.courseType)
|
||||
if (type.isBringFamily === true) {
|
||||
this.$set(item, "isBringFamily", true)
|
||||
item.reserveMode = 1
|
||||
} else {
|
||||
this.$set(item, "isBringFamily", false)
|
||||
}
|
||||
})
|
||||
this.formData.id = ""
|
||||
}
|
||||
},
|
||||
async getActivityGroup() {
|
||||
const { data } = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup")
|
||||
return data
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.unionList = await this.$businessTool.listUnion()
|
||||
this.courseTypeList = await this.getAllType()
|
||||
this.$businessTool.getDictOptions("TRAIN_SIGNUP_TYPE").then((data) => {
|
||||
this.trainTypeList = data
|
||||
})
|
||||
await this.initData()
|
||||
this.activityGroupList = await this.getActivityGroup()
|
||||
this.$businessTool.getDictOptions("CAMPUS").then((data) => {
|
||||
this.campusList = data
|
||||
})
|
||||
this.historicalActList = await this.getHistoricalActList()
|
||||
},
|
||||
watch: {
|
||||
"formData.restrictLimit"(val) {
|
||||
if (GetQueryString("id") === "") {
|
||||
this.formData.limitNum = val === 3 ? 1 : ""
|
||||
}
|
||||
},
|
||||
"formData.activityGroupId": {
|
||||
async handler(newVal, oldVal) {
|
||||
this.activityGroupList = await this.getActivityGroup()
|
||||
this.$refs.drawerUserScope.userScopeDialog = false
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
conditionStructure(val) {
|
||||
this.formData.courseList[this.userScopeIndex].conditionStructure = val
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,598 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
<style>
|
||||
.text {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.e-item {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.reserve_btn {
|
||||
font-size: 15px;
|
||||
float: right;
|
||||
padding: 3px 0;
|
||||
}
|
||||
|
||||
.el-carousel__button {
|
||||
background-color: #c0c4cc;
|
||||
}
|
||||
|
||||
.el-carousel__container {
|
||||
height: 260px;
|
||||
}
|
||||
|
||||
.el-button--mini.is-circle {
|
||||
padding: 5px;
|
||||
font-size: 1px;
|
||||
}
|
||||
|
||||
.slider {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.el-slider__marks-text {
|
||||
min-width: 40px !important;
|
||||
}
|
||||
|
||||
.el-slider__button-wrapper {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
input[type="file"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.el-input-number input {
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
.el-input-number__decrease,
|
||||
.el-input-number__increase {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.el-transfer-panel {
|
||||
text-align: left;
|
||||
width: calc(50% - 91px);
|
||||
height: 53vh;
|
||||
}
|
||||
|
||||
.el-transfer-panel__list.is-filterable {
|
||||
height: calc(50vh - 110px);
|
||||
}
|
||||
|
||||
.transfer {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
align-items: center;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.transfer .el-checkbox {
|
||||
display: inline-block !important;
|
||||
margin: 0 10px !important;
|
||||
}
|
||||
|
||||
.activeCard {
|
||||
border: 1px solid #409eff;
|
||||
}
|
||||
|
||||
.el-table-container {
|
||||
padding-top: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度:">
|
||||
<el-date-picker
|
||||
placeholder="选择年度"
|
||||
type="year"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
@change="activityData"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动状态:" style="width: 340px">
|
||||
<el-radio-group v-model="pageForm.activityType" @change="activityData">
|
||||
<el-radio-button :label="1">全部</el-radio-button>
|
||||
<el-radio-button :label="2">报名中</el-radio-button>
|
||||
<el-radio-button :label="3">已结束</el-radio-button>
|
||||
</el-radio-group>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-row class="el-table-container">
|
||||
<el-carousel v-if="activityList.length > 0" :interval="5000" arrow="always" style="margin: 10px auto">
|
||||
<el-carousel-item v-for="index in Math.ceil(activityList.length/4)" :key="index">
|
||||
<el-row :gutter="20">
|
||||
<el-col v-for="(item, i) in activityList.slice((index-1)*4,index*4)" :key="i" :span="6">
|
||||
<el-card
|
||||
@click="openApply(item)"
|
||||
:class="'box-card '+(item.id===pageForm.activityId?'activeCard':'')"
|
||||
style="border-radius: 10px"
|
||||
>
|
||||
<div slot="header" class="clearfix" style="width: 100%; word-break: break-all; white-space: pre-wrap">
|
||||
<div>{{item.activityName}}</div>
|
||||
<!--<el-button @click="openApply(item)" class="reserve_btn" type="text">请选择活动报名</el-button>-->
|
||||
</div>
|
||||
<div @click="openApply(item)">
|
||||
<div class="text e-item" style="display: flex; justify-content: space-between">
|
||||
<div>
|
||||
<div class="text e-item">
|
||||
<span style="color: gray">活动性质:</span>
|
||||
<span>{{item.trainType}}</span>
|
||||
</div>
|
||||
<div class="text e-item">
|
||||
<span style="color: gray">报名时间:</span>
|
||||
<span>
|
||||
{{$moment(item.activitySignUpStartTime) .format('MM/DD HH:mm')}} 至
|
||||
{{$moment(item.activitySignUpEndTime).format('MM/DD HH:mm')}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="text item">
|
||||
<span style="color: gray">活动时间:</span>
|
||||
<span>
|
||||
{{$moment(item.activityStartTime).format('MM/DD HH:mm')}} 至
|
||||
{{$moment(item.activityEndTime).format('MM/DD HH:mm')}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<!-- <span style="color: gray">活动类型:</span>
|
||||
<span>{{item.activityMode == 1 ? '校工会' : '分工会'}}</span>-->
|
||||
<el-tag
|
||||
type="danger"
|
||||
effect="dark"
|
||||
style="border-radius: 50%"
|
||||
v-if="$moment(item.activitySignUpEndTime).valueOf() < $moment().valueOf()"
|
||||
>
|
||||
报名结束
|
||||
</el-tag>
|
||||
<el-tag
|
||||
type="success"
|
||||
effect="dark"
|
||||
style="border-radius: 50%"
|
||||
v-else-if="$moment().valueOf()>$moment(item.activitySignUpStartTime).valueOf()&&$moment().valueOf()<$moment(item.activitySignUpEndTime).valueOf()"
|
||||
>
|
||||
报名中
|
||||
</el-tag>
|
||||
<el-tag
|
||||
type="danger"
|
||||
effect="dark"
|
||||
style="border-radius: 50%"
|
||||
v-else-if="$moment().valueOf()<$moment(item.activitySignUpEndTime).valueOf()"
|
||||
>
|
||||
报名未开始
|
||||
</el-tag>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
<el-empty v-else description="暂无数据"></el-empty>
|
||||
</el-row>
|
||||
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool :label="trainType + '信息'">
|
||||
<template #label_end>
|
||||
<div class="search-item-option">
|
||||
<el-select
|
||||
v-model="pageForm.courseTypeId"
|
||||
:placeholder="'请选择' + trainType + '类型'"
|
||||
filterable
|
||||
clearable
|
||||
style="width: 100%; margin-bottom: 5px; margin-left: 10px"
|
||||
@change="doSearch"
|
||||
>
|
||||
<el-option v-for="item in courseTypeList" :key="item.id" :label="item.lxname" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
</template>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" row-key="id" @sort-change="pageOrder" v-loading="tableLoading">
|
||||
<el-table-column type="index" :index="indexMethod" label="序号" width="80px"></el-table-column>
|
||||
<el-table-column
|
||||
v-for="(column, index) in tableColumns"
|
||||
:key="column.prop"
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template v-slot="{row}" v-if="column.prop=='courseLocationCoordinates'">
|
||||
<el-button style="padding: 0" @click="openViewMap(row.courseLocationCoordinates)" type="text">
|
||||
{{row.courseLocation}}
|
||||
</el-button>
|
||||
</template>
|
||||
|
||||
<template v-slot="{row}" v-else-if="column.prop=='courseTime'">
|
||||
<el-button style="padding: 0" @click="openViewCourseTime(row.id)" type="text">点击查看{{trainType}}时间</el-button>
|
||||
</template>
|
||||
|
||||
<template v-slot="{row}" v-else-if="column.prop=='applyNum'">
|
||||
<span v-html="calcSignUpCount(row)"></span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column align="center" label="操作" width="150px">
|
||||
<template v-slot="scope">
|
||||
<el-button v-if="!scope.row.isSign" type="primary" size="mini" @click="doApply(scope.row)">我要报名</el-button>
|
||||
<el-button v-else type="danger" size="mini" @click="doCancel(scope.row)">取消报名</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<template #edit>
|
||||
<el-form :model="formData" ref="form" label-width="120px">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="姓名" prop="username">
|
||||
<el-input readonly v-model="formData.username"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="工号" prop="loginname">
|
||||
<el-input readonly v-model="formData.loginname"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="所在单位" prop="unitName">
|
||||
<el-input readonly v-model="formData.unitName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="所属工会" prop="unionName">
|
||||
<el-input readonly v-model="formData.unionName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="性别" prop="sex">
|
||||
<el-input readonly v-model="formData.sex"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="联系方式" prop="mobile">
|
||||
<el-input v-model="formData.mobile"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item
|
||||
v-for="(column, index) in formData.trainMobileSignColumnList"
|
||||
:prop="'trainMobileSignColumnList.' + index + '.columnValue'"
|
||||
:label="column.columnName"
|
||||
:key="column.columnCode"
|
||||
:rules="{ required: column.isRequired,
|
||||
message: (['SELECT', 'FILE'].includes(column.columnFormType) ? '请选择' : '请填写') + column.columnName,
|
||||
trigger: 'blur'}"
|
||||
>
|
||||
<!--文本框-->
|
||||
<template v-if="!['SELECT'].includes(column.columnFormType) && ['VARCHAR','TEXT','INT'].includes(column.columnType)">
|
||||
<el-input
|
||||
v-model="column.columnValue"
|
||||
:placeholder="'请填写' + column.columnName"
|
||||
:type="['INT'].includes(column.columnType) ? 'number' : ''"
|
||||
></el-input>
|
||||
</template>
|
||||
<!--选择框-->
|
||||
<template v-else-if="['SELECT'].includes(column.columnFormType) && ['VARCHAR','TEXT','INT'].includes(column.columnType)">
|
||||
<el-select v-model="column.columnValue" :placeholder="'请选择' + column.columnName" style="width: 100%">
|
||||
<el-option v-for="item in column.selectValues" :key="item" :label="item" :value="item"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
<!--时间框-->
|
||||
<template v-else-if="['DATE', 'DATETIME'].includes(column.columnType)">
|
||||
<el-date-picker
|
||||
style="width: 100%"
|
||||
v-model="column.columnValue"
|
||||
:type="column.columnType === 'DATE' ? 'date' : 'datetime'"
|
||||
:placeholder="'请选择' + column.columnName"
|
||||
:value-format="column.columnType === 'DATE' ? 'yyyy-MM-dd' : 'yyyy-MM-dd HH:mm:ss'"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<!--文件-->
|
||||
<template v-else-if="['JSON'].includes(column.columnType)">
|
||||
<file-upload :files.sync="column.columnValue" :max="column.fileNumber" :type="column.fileType"></file-upload>
|
||||
</template>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<el-row type="flex" justify="end">
|
||||
<el-button type="primary" @click="doSubmit">提交</el-button>
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
<el-dialog :visible.sync="courseTimeListDialog" :title="trainType + '时间'" width="60%" append-to-body>
|
||||
<el-table :data="courseTimeList">
|
||||
<el-table-column label="日期" prop="courseDate">
|
||||
<template v-slot="{row}">{{$moment(row.courseDate).format('YYYY-MM-DD')}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开始时间" prop="courseStartTime">
|
||||
<template v-slot="{row}">{{$moment(row.courseStartTime).format('HH:mm')}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="结束时间" prop="courseEndTime">
|
||||
<template v-slot="{row}">{{$moment(row.courseEndTime).format('HH:mm')}}</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :visible.sync="viewMapDialog" title="地点" width="60%">
|
||||
<div id="viewMap" style="width: 100%; height: 500px"></div>
|
||||
</el-dialog>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let viewMarker = null
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
trainSignUpActivity: {},
|
||||
pageForm: {
|
||||
year: this.$moment().format("YYYY"),
|
||||
activityType: "2"
|
||||
},
|
||||
activityList: [],
|
||||
courseTypeList: [],
|
||||
tableColumns: [
|
||||
/* {prop: 'name', label: '活动名称'},*/
|
||||
{ prop: "courseName", label: "名称" },
|
||||
{ prop: "lxname", label: "类型" },
|
||||
{ prop: "coursePeopleNumber", label: "总人数" },
|
||||
{ prop: "courseLocationCoordinates", label: "地点" },
|
||||
{ prop: "courseInstructor", label: "联系人" },
|
||||
{ prop: "courseTime", label: "时间" },
|
||||
{ prop: "applyNum", label: "已报名人数" }
|
||||
],
|
||||
viewMapDialog: false,
|
||||
courseTimeListDialog: false,
|
||||
courseTimeList: [],
|
||||
formData: {},
|
||||
formRules: {
|
||||
mobile: [{ required: true, message: "必填", trigger: ["blur", "change"] }]
|
||||
},
|
||||
choose: {},
|
||||
trainType: "培训班"
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async doCancel(row) {
|
||||
this.$confirm("您确定要取消吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(async () => {
|
||||
const resp = await this.$axios.post("/platform/mobile/trainSignUpActivity/cancelSignUp", {
|
||||
activityId: row.activityId,
|
||||
courseId: row.id
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
await this.pageData()
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
})
|
||||
},
|
||||
calcSignUpCount(o) {
|
||||
if (o.reserveMode === 2) {
|
||||
let lave = 0
|
||||
let lave2 = 0
|
||||
if (o.hasRegisterNum < o.coursePeopleNumber) {
|
||||
lave = o.coursePeopleNumber - o.hasRegisterNum
|
||||
lave2 = o.courseReservedNumber
|
||||
} else {
|
||||
lave = 0
|
||||
lave2 = o.coursePeopleNumber + o.courseReservedNumber - o.hasRegisterNum
|
||||
}
|
||||
let str =
|
||||
"<span style='color: red'>余" +
|
||||
lave +
|
||||
"</span>/" +
|
||||
o.coursePeopleNumber +
|
||||
"人" +
|
||||
",<span style='color: red'>候补余" +
|
||||
lave2 +
|
||||
"</span>/" +
|
||||
o.courseReservedNumber +
|
||||
"人"
|
||||
return str
|
||||
} else {
|
||||
if (o.coursePeopleNumber === 0) {
|
||||
return "<span style='color: red'>已报" + o.hasRegisterNum + "</span>/不限"
|
||||
} else {
|
||||
let lave = o.coursePeopleNumber - (o.hasRegisterNum + o.courseReservedNumber)
|
||||
return "<span style='color: red'>余" + lave + "</span>/" + o.coursePeopleNumber + "人"
|
||||
}
|
||||
}
|
||||
},
|
||||
async doSubmit() {
|
||||
//获取家属是多少人
|
||||
let per = 0
|
||||
this.formData.trainMobileSignColumnList.forEach((item) => {
|
||||
if (item.columnCode === "xdqsrs") {
|
||||
per += Number(item.columnValue)
|
||||
}
|
||||
})
|
||||
const res = await this.$axios.post("/platform/mobile/trainSignUpActivity/validateSignUp", {
|
||||
courseId: this.choose.id,
|
||||
currentFamilyNumber: per
|
||||
})
|
||||
if (res.code !== 0) {
|
||||
this.$message.warning(res.msg)
|
||||
return
|
||||
}
|
||||
this.$refs["form"].validate((valid) => {
|
||||
if (valid) {
|
||||
this.$confirm("您确定要提交吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(async () => {
|
||||
const mobileColumnsValue = this.formData.trainMobileSignColumnList.map((v) => {
|
||||
return {
|
||||
columnName: v.columnName,
|
||||
columnValue: v.columnValue,
|
||||
columnCode: v.columnCode,
|
||||
columnFormType: v.columnFormType
|
||||
}
|
||||
})
|
||||
this.formData.mobileColumnsValue = JSON.stringify(mobileColumnsValue)
|
||||
const resp = await this.$axios.post("/platform/mobile/trainSignUpActivity/doSignUp", this.formData)
|
||||
if (resp.code === 0) {
|
||||
await this.pageData()
|
||||
this.$message.success(resp.msg)
|
||||
this.$refs.guava.index()
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
async getScopeUser(activityGroupId) {
|
||||
const resp = await this.$axios.post("/platform/activity/basic/scope/getScopeUser", { activityGroupId: activityGroupId })
|
||||
return resp.data
|
||||
},
|
||||
async doApply(row) {
|
||||
this.choose = row
|
||||
const o = this.courseTypeList.find((v) => v.id === row.courseType)
|
||||
const data = this.trainSignUpActivity
|
||||
const now = this.$moment().valueOf()
|
||||
if (now < this.$moment(data.activitySignUpStartTime).valueOf() || now > this.$moment(data.activitySignUpEndTime).valueOf()) {
|
||||
this.$message.warning("此活动不在报名时间内")
|
||||
return
|
||||
}
|
||||
const scopeUser = await this.getScopeUser(data.activityGroupId)
|
||||
if (scopeUser === 0) {
|
||||
this.$message.warning("您不在活动报名范围内")
|
||||
return
|
||||
}
|
||||
const res = await this.$axios.post("/platform/mobile/trainSignUpActivity/validateSignUp", {
|
||||
courseId: row.id
|
||||
})
|
||||
if (res.code !== 0) {
|
||||
this.$message.warning(res.msg)
|
||||
if (res.code !== 3) {
|
||||
return
|
||||
}
|
||||
}
|
||||
this.formData = {
|
||||
activityId: data.id,
|
||||
courseId: row.id,
|
||||
username: this.$store.state.user.username,
|
||||
loginname: this.$store.state.user.loginname,
|
||||
unionName: this.$store.state.user.union.name,
|
||||
unitName: this.$store.state.user.unit.name,
|
||||
sex: this.$store.state.user.sex,
|
||||
mobile: this.$store.state.user.mobile,
|
||||
trainMobileSignColumnList: o.trainMobileSignColumnList
|
||||
}
|
||||
this.formData.trainMobileSignColumnList.forEach((item) => {
|
||||
item.columnValue = ""
|
||||
})
|
||||
this.$refs.guava.edit()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.form.clearValidate()
|
||||
})
|
||||
},
|
||||
openViewMap(point) {
|
||||
if (!Array.isArray(point)) {
|
||||
this.$message.warning("没有设置点位,无法通过地图查看")
|
||||
return
|
||||
}
|
||||
this.viewMapDialog = true
|
||||
this.$nextTick(() => {
|
||||
viewMap = new AMap.Map("viewMap", {
|
||||
resizeEnable: true,
|
||||
center: point,
|
||||
zoom: 16
|
||||
})
|
||||
if (viewMarker) {
|
||||
viewMap.remove(viewMarker)
|
||||
}
|
||||
viewMarker = new AMap.Marker({
|
||||
position: point,
|
||||
offset: new AMap.Pixel(-13, -30)
|
||||
})
|
||||
viewMap.add(viewMarker)
|
||||
viewMap.setFitView(null, false, [150, 60, 100, 60])
|
||||
})
|
||||
},
|
||||
async openApply(item) {
|
||||
this.trainSignUpActivity = {}
|
||||
this.trainSignUpActivity = item
|
||||
this.pageForm.activityId = item.id
|
||||
this.trainType = item.trainType
|
||||
await this.pageData()
|
||||
},
|
||||
async getCourseTypeList() {
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/manage/type/getAllType")
|
||||
if (resp.code === 0) {
|
||||
this.courseTypeList = resp.data
|
||||
}
|
||||
},
|
||||
async activityData() {
|
||||
const resp = await this.$axios.post(loc() + "/activityData", this.pageForm)
|
||||
if (resp.code === 0) {
|
||||
this.activityList = resp.data
|
||||
if (this.activityList.length > 0) {
|
||||
await this.openApply(this.activityList[0])
|
||||
}
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
async pageData() {
|
||||
const resp = await this.$axios.post(loc() + "/pageData", this.pageForm)
|
||||
if (resp.code === 0) {
|
||||
this.tableData = resp.data.list
|
||||
this.pageForm.totalCount = resp.data.totalCount
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
async openViewCourseTime(id) {
|
||||
const resp = await this.$axios.post(loc() + "/getCourseTime", { id: id })
|
||||
this.courseTimeList = resp.data
|
||||
this.courseTimeListDialog = true
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
await this.activityData()
|
||||
await this.getCourseTypeList()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
<el-tabs>
|
||||
<el-tab-pane label="基础信息">
|
||||
<el-descriptions :column="2" border class="table_fixed">
|
||||
<el-descriptions-item :span="2" label="活动名称">{{viewData.activityName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="年度">{{viewData.year}}</el-descriptions-item>
|
||||
<el-descriptions-item label="创建时间">{{$moment(viewData.createdAt).format('YYYY-MM-DD HH:mm:ss')}}</el-descriptions-item>
|
||||
<el-descriptions-item label="活动开始时间">{{viewData.activityStartTime}}</el-descriptions-item>
|
||||
<el-descriptions-item label="活动结束时间">{{viewData.activityEndTime}}</el-descriptions-item>
|
||||
<el-descriptions-item label="报名开始时间">{{viewData.activitySignUpStartTime}}</el-descriptions-item>
|
||||
<el-descriptions-item label="报名结束时间">{{viewData.activitySignUpEndTime}}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :label="trainType + '信息'">
|
||||
<el-table :data="viewData.courseList">
|
||||
<el-table-column :label="trainType + '名称'" prop="courseName"></el-table-column>
|
||||
<el-table-column label="类型" prop="courseTypeName"></el-table-column>
|
||||
<el-table-column label="人数" prop="coursePeopleNumber"></el-table-column>
|
||||
<el-table-column label="预留名额" prop="courseReservedNumber"></el-table-column>
|
||||
<el-table-column label="地点" prop="courseLocation">
|
||||
<template v-slot="{row}">
|
||||
<el-button @click="openViewMap(row.courseLocationCoordinates)" type="text">{{row.courseLocation}}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="校区" prop="campus">
|
||||
<template v-slot="scope">
|
||||
<dict-tag :options="dict.type.CAMPUS" :value="scope.row.campus"></dict-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="负责人" prop="courseInstructor"></el-table-column>
|
||||
<el-table-column label="上课时间" prop="courseTimeList" width="200px">
|
||||
<template v-slot="{row}">
|
||||
<el-button @click="openViewCourseTime(row.courseTimeList)" type="text" type="text">点击查看课程时间</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
<el-dialog :visible.sync="courseTimeListDialog" :title="trainType + '时间'" width="60%" append-to-body>
|
||||
<el-table :data="courseTimeList">
|
||||
<el-table-column label="日期" prop="courseDate">
|
||||
<template v-slot="{row}">{{$moment(row.courseDate).format('YYYY-MM-DD')}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开始时间" prop="courseStartTime"></el-table-column>
|
||||
<el-table-column label="结束时间" prop="courseEndTime"></el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :visible.sync="viewMapDialog" title="地点" width="60%">
|
||||
<div id="viewMap" style="width: 100%; height: 500px"></div>
|
||||
</el-dialog>
|
||||
@@ -0,0 +1,340 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
<style>
|
||||
.table_fixed {
|
||||
table-layout: fixed !important;
|
||||
}
|
||||
|
||||
.map-search {
|
||||
margin-bottom: 1rem;
|
||||
border-radius: 0.25rem;
|
||||
position: absolute;
|
||||
top: 1rem;
|
||||
background-color: white;
|
||||
width: auto;
|
||||
min-width: 22rem;
|
||||
border-width: 0;
|
||||
right: 1rem;
|
||||
box-shadow: 0 2px 6px 0 rgba(114, 124, 245, 0.5);
|
||||
}
|
||||
.map-search .input-item {
|
||||
position: relative;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 3rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度:">
|
||||
<el-date-picker
|
||||
placeholder="选择年度"
|
||||
type="year"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动名称:">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入内容"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.activityName"
|
||||
></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="活动列表">
|
||||
<el-button @click="openAdd" size="small" type="primary">新建活动</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
show-overflow-tooltip
|
||||
v-for="(column, index) in tableColumns"
|
||||
:key="index"
|
||||
>
|
||||
<template v-slot="{row}" v-if="column.prop==='isDisabled'">
|
||||
<el-switch
|
||||
:active-value="false"
|
||||
:inactive-value="true"
|
||||
@change="(val)=>{activityStatusChange(row.notice,val,row.id)}"
|
||||
active-color="#13ce66"
|
||||
inactive-color="#ff4949"
|
||||
v-model="row.isDisabled"
|
||||
></el-switch>
|
||||
</template>
|
||||
<template v-slot="{row:{createdAt}}" v-else-if="column.prop==='createdAt'">
|
||||
{{$moment(createdAt).format('YYYY-MM-DD HH:mm:ss')}}
|
||||
</template>
|
||||
<template v-slot="{row}" v-else-if="column.prop==='notice'">
|
||||
<el-switch
|
||||
:active-value="true"
|
||||
:inactive-value="false"
|
||||
@change="(val)=>{activityNoticeChange(row.isDisabled,val,row.id)}"
|
||||
active-color="#13ce66"
|
||||
inactive-color="#ff4949"
|
||||
v-model="row.notice"
|
||||
></el-switch>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="150px">
|
||||
<template v-slot="{row}">
|
||||
<el-dropdown>
|
||||
<el-button plain size="mini">
|
||||
<i class="ti-settings"></i>
|
||||
<span class="ti-angle-down"></span>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item @click.native="openCode(row.id)">活动二维码</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="makeCode(row)">签到二维码</el-dropdown-item>
|
||||
<!--<el-dropdown-item @click.native="sendMsg(row)">通知</el-dropdown-item>-->
|
||||
<el-dropdown-item @click.native="openView(row)">查看</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="openEdit(row)">编辑</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="deleteDo(row)">删除</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<!--#include("/platform/zhgh/activity/trainSingUp/manage/include_activity_view.html"){}#-->
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-dialog :close-on-click-modal="false" :visible.sync="courseDialog" :title="trainType + '列表'" top="50px">
|
||||
<el-table :data="clickRow.courseList">
|
||||
<el-table-column :label="trainType + '名称'" prop="courseName"></el-table-column>
|
||||
<el-table-column label="校区" prop="campus">
|
||||
<template v-slot="scope">
|
||||
<dict-tag :options="dict.type.CAMPUS" :value="scope.row.campus"></dict-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否签到" prop="isMobileSign">
|
||||
<template v-slot="{row}">
|
||||
<span v-if="row.isMobileSign === true">签到</span>
|
||||
<span v-else>不签到</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="签到方式" prop="signType">
|
||||
<template v-slot="{row}">
|
||||
<span v-if="row.signType === 1">扫描二维码</span>
|
||||
<span v-else-if="row.signType === 2">被扫</span>
|
||||
<span v-else-if="row.signType === 3">GPS定位签到</span>
|
||||
<span v-else>暂无签到方式</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否领取礼品" prop="isReceiveGift">
|
||||
<template v-slot="{row}">
|
||||
<span v-if="row.isReceiveGift === true">领取</span>
|
||||
<span v-else>不领取</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="领取方式" prop="giftType">
|
||||
<template v-slot="{row}">
|
||||
<span v-if="row.giftType === 1">扫描二维码</span>
|
||||
<span v-else-if="row.giftType === 2">面对面确认</span>
|
||||
<span v-else>暂无领取方式</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="260">
|
||||
<template v-slot="{row}">
|
||||
<el-button v-if="row.signType === 1" @click="makeCourseCode(row)" size="mini" type="primary">生成二维码</el-button>
|
||||
<el-button v-else size="mini" type="text">该{{trainType}}的签到方式不支持生成二维码</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
<!--<send-msg ref="sendMsg" :url="url"></send-msg>-->
|
||||
<!--<open-qr-code ref="openQRCode" :url="url"></open-qr-code>-->
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let viewMap = null
|
||||
let viewMarker = null
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
dicts: ["CAMPUS"],
|
||||
data() {
|
||||
const that = this
|
||||
return {
|
||||
url: "",
|
||||
courseDialog: false,
|
||||
trainType: "",
|
||||
trainTypeList: [],
|
||||
campusList: [],
|
||||
tableColumns: [
|
||||
{ label: "活动名称", prop: "activityName" },
|
||||
{ label: "年度", prop: "year" },
|
||||
{ label: "开始时间", prop: "activityStartTime" },
|
||||
{ label: "结束时间", prop: "activityEndTime" },
|
||||
{ label: "是否开启", prop: "isDisabled" },
|
||||
{ label: "是否通知", prop: "notice" },
|
||||
{ label: "创建时间", prop: "createdAt" }
|
||||
],
|
||||
viewData: {},
|
||||
mapDialog: false,
|
||||
mapIndex: 0,
|
||||
courseTimeListDialog: false,
|
||||
courseTimeList: [],
|
||||
viewMapDialog: false,
|
||||
clickRow: {}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
/*"open-qr-code": httpVueLoader("/components/plugins/OpenQRCode.vue"),
|
||||
"send-msg": httpVueLoader("/components/plugins/SendMsgByGroupId.vue")*/
|
||||
},
|
||||
methods: {
|
||||
sendMsg(row) {
|
||||
this.url = `<a href="` + (APP_DOMAIN + "/platform/mobile/trainSignUpActivity/trainList") + `">点击参与</a>`
|
||||
this.$refs.sendMsg.openDialog(row.activityGroupId)
|
||||
},
|
||||
openCode(id) {
|
||||
this.$refs.openQRCode.openCode("/platform/mobile/trainSignUpActivity/trainList")
|
||||
},
|
||||
makeCode(row) {
|
||||
this.clickRow = row
|
||||
const type = this.trainTypeList.find((o) => o.code === row.trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
this.courseDialog = true
|
||||
},
|
||||
makeCourseCode(row) {
|
||||
const o = {
|
||||
courseId: row.id
|
||||
}
|
||||
// 生成二维码的 base64 编码
|
||||
const content = jrQrcode.getQrBase64(JSON.stringify(o))
|
||||
let image = new Image()
|
||||
image.src = content
|
||||
let viewer = new Viewer(image)
|
||||
viewer.show()
|
||||
},
|
||||
openAdd() {
|
||||
this.$store.dispatch("pjaxRoute", "/platform/trainSingUp/manage/activity/add")
|
||||
},
|
||||
//活动状态改变
|
||||
async activityStatusChange(notice, val, id) {
|
||||
const resp = await this.$axios.post(loc() + "/activityStatusChange", { notice: notice, isDisabled: val, id })
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
async activityNoticeChange(isDisabled, val, id) {
|
||||
const resp = await this.$axios.post(loc() + "/activityStatusChange", { isDisabled: isDisabled, notice: val, id })
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
async openEdit(row) {
|
||||
this.$store.dispatch("pjaxRoute", "/platform/trainSingUp/manage/activity/add?id=" + row.id + "&fromEdit=edit")
|
||||
},
|
||||
async deleteDo(row) {
|
||||
const confirm = await this.$confirm("此操作将永久删除, 是否继续?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
if (confirm === "confirm") {
|
||||
const resp = await this.$axios.post(loc() + "/doDelete", { id: row.id })
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
},
|
||||
async openView(row) {
|
||||
const { id } = row
|
||||
const resp = await this.$axios.post(loc() + "/findOne", { id: id })
|
||||
if (resp.code === 0) {
|
||||
let cloneData = clone(resp.data)
|
||||
cloneData.campusList = new Set(cloneData.courseList.map((v) => v.campus))
|
||||
this.viewData = cloneData
|
||||
const type = this.trainTypeList.find((o) => o.code === cloneData.trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
this.$refs["guava"].view()
|
||||
}
|
||||
},
|
||||
openViewMap(point) {
|
||||
if (!Array.isArray(point)) {
|
||||
this.$message.warning("没有设置点位,无法通过地图查看")
|
||||
return
|
||||
}
|
||||
this.viewMapDialog = true
|
||||
this.$nextTick(() => {
|
||||
viewMap = new AMap.Map("viewMap", {
|
||||
resizeEnable: true,
|
||||
center: point,
|
||||
zoom: 16
|
||||
})
|
||||
if (viewMarker) {
|
||||
viewMap.remove(viewMarker)
|
||||
}
|
||||
viewMarker = new AMap.Marker({
|
||||
position: point,
|
||||
offset: new AMap.Pixel(-13, -30)
|
||||
})
|
||||
viewMap.add(viewMarker)
|
||||
viewMap.setFitView(null, false, [150, 60, 100, 60])
|
||||
})
|
||||
},
|
||||
getAddress(position) {
|
||||
// if (!geocoder) {
|
||||
// geocoder = new AMap.Geocoder({
|
||||
// city: "010", //城市设为北京,默认:“全国”
|
||||
// radius: 1000 //范围,默认:500
|
||||
// });
|
||||
// }
|
||||
// geocoder.getAddress(position, (status, result) => {
|
||||
// if (status === 'complete' && result.regeocode) {
|
||||
// const address = result.regeocode.formattedAddress
|
||||
// this.formData.courseList[this.mapIndex].location = address
|
||||
// } else {
|
||||
// log.error('根据经纬度查询地址失败')
|
||||
// }
|
||||
// })
|
||||
},
|
||||
openViewCourseTime(courseTimeList) {
|
||||
this.courseTimeList = courseTimeList
|
||||
this.courseTimeListDialog = true
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.pageData()
|
||||
this.$businessTool.getDictOptions("TRAIN_SIGNUP_TYPE").then((data) => {
|
||||
this.trainTypeList = data
|
||||
})
|
||||
this.$businessTool.getDictOptions("CAMPUS").then((data) => {
|
||||
this.campusList = data
|
||||
})
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
<el-tabs>
|
||||
<el-tab-pane label="报名人员">
|
||||
<el-table :data="registerUserTableData" :size="tableSize" class="mt20">
|
||||
<el-table-column
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
v-for="(column, index) in registerUserTableColumns"
|
||||
:key="index"
|
||||
>
|
||||
<template v-slot="{row}" v-if="column.prop === 'state'">
|
||||
<span class="text-success" v-if="row.state === 1">正常报名</span>
|
||||
<span class="text-warning" v-else-if="row.state === 2">候补报名</span>
|
||||
<span class="text-success" v-else-if="row.state === 3">正常报名(候补)</span>
|
||||
<span class="text-info" v-else-if="row.state === 4">无效报名(缺席)</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="签到情况" v-if="clickRow.isMobileSign === true">
|
||||
<!-- <el-timeline>-->
|
||||
<!-- <el-timeline-item-->
|
||||
<!-- :color="item.length>0 && Date.now() > Date.parse(item[0].courseStartTime) ? '#0bbd87' :''"-->
|
||||
<!-- :key="key"-->
|
||||
<!-- :timestamp="key"-->
|
||||
<!-- placement="top"-->
|
||||
<!-- v-for="(item, key) in userSignInfo">-->
|
||||
<!-- <el-table :data="item">-->
|
||||
<!-- <el-table-column label="姓名" prop="username"></el-table-column>-->
|
||||
<!-- <el-table-column label="一卡通号" prop="loginname"></el-table-column>-->
|
||||
<!-- <el-table-column label="是否签到" prop="isAttend"></el-table-column>-->
|
||||
<!-- <el-table-column label="签到时间" prop="attendTime"></el-table-column>-->
|
||||
<!-- </el-table>-->
|
||||
<!-- </el-timeline-item>-->
|
||||
<!-- </el-timeline>-->
|
||||
|
||||
<el-tabs style="height: 600px" tab-position="left" class="mt20">
|
||||
<el-tab-pane v-for="(item, key) in userSignInfo" :key="key">
|
||||
<span slot="label">
|
||||
<i class="el-icon-date"></i>
|
||||
{{key}}
|
||||
</span>
|
||||
<el-table :data="item" style="max-height: 600px; overflow-y: auto">
|
||||
<el-table-column label="姓名" prop="username"></el-table-column>
|
||||
<el-table-column label="工号" prop="loginname"></el-table-column>
|
||||
<el-table-column label="是否签到" prop="isAttend">
|
||||
<template v-slot="{row}">
|
||||
<template v-if="Date.now() < Date.parse(row.courseStartTime)">
|
||||
<span class="text-default">未开始</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span class="text-success" v-if="row.isAttend">已签到</span>
|
||||
<span class="text-warning" v-else>未签到</span>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="签到时间" prop="attendTime"></el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
@@ -0,0 +1,168 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.el-icon-arrow-left,
|
||||
.el-icon-arrow-right {
|
||||
font-size: 28px;
|
||||
font-weight: bolder;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度:">
|
||||
<el-date-picker
|
||||
placeholder="选择年度"
|
||||
type="year"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动名称:">
|
||||
<el-select @change="activityChange" style="width: 100%" v-model="pageForm.activityId">
|
||||
<el-option :label="item.activityName" :value="item.id" v-for="item in activityList" :key="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool :label="trainType">
|
||||
<el-button type="primary" size="small" @click="exportSignUser" :disabled="!pageForm.activityId">导出报名人员</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column :label="trainType" prop="courseName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="类型" prop="courseType" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column :label="trainType + '地点'" prop="courseLocation" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="负责人" prop="courseInstructor" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="最多报名人数" prop="coursePeopleNumber" sortable align="center" header-align="center" show-overflow-tooltip>
|
||||
<template v-slot="{row}">
|
||||
<span v-if="row.reserveMode === 1">{{row.coursePeopleNumber}}</span>
|
||||
<span v-if="row.reserveMode === 2">{{row.coursePeopleNumber + row.courseReservedNumber}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="限制报名人数" prop="coursePeopleNumber" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="预留人数" prop="courseReservedNumber" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="已报名人数" prop="registerNum" sortable show-overflow-tooltip>
|
||||
<template v-slot="{row}">
|
||||
<el-link v-if="row.reserveMode === 1" @click="openView(row)" type="primary">
|
||||
{{row.registerNum + row.courseReservedNumber}}
|
||||
</el-link>
|
||||
<el-link v-if="row.reserveMode === 2" @click="openView(row)" type="primary">{{row.registerNum}}</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200px">
|
||||
<template v-slot="{row}">
|
||||
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
|
||||
<el-button @click="openSign(row)" size="mini" v-if="row.interTime" :type="row.openOtherUnion === true ? 'danger' : 'primary'">
|
||||
{{row.openOtherUnion === true ? '关闭报名' : '开放报名'}}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<!--#include("/platform/zhgh/activity/trainSingUp/statistics/include_view.html"){}#-->
|
||||
</template>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityList: [],
|
||||
pageForm: {
|
||||
year: new Date().getFullYear().toString(),
|
||||
activityId: null
|
||||
},
|
||||
tableColumns: [
|
||||
{ label: "培训班", prop: "courseName" },
|
||||
{ label: "类型", prop: "courseType", sortable: true },
|
||||
{ label: "地点", prop: "courseLocation" },
|
||||
{ label: "教师", prop: "courseInstructor", sortable: true },
|
||||
{ label: "最多报名人数", prop: "coursePeopleNumber", sortable: true },
|
||||
{ label: "已报名人数", prop: "registerNum", sortable: true }
|
||||
],
|
||||
registerUserTableData: [],
|
||||
registerUserTableColumns: [
|
||||
{ label: "姓名", prop: "username" },
|
||||
{ label: "一卡通号", prop: "loginname" },
|
||||
{ label: "单位", prop: "unitName" },
|
||||
{ label: "分工会", prop: "unionName" },
|
||||
{ label: "联系方式", prop: "mobile" },
|
||||
{ label: "报名时间", prop: "signUpTime" },
|
||||
{ label: "报名状态", prop: "state" }
|
||||
],
|
||||
userSignInfo: {},
|
||||
trainType: "培训班",
|
||||
trainTypeList: [],
|
||||
clickRow: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async openSign(row) {
|
||||
const resp = await this.$axios.post(loc() + "/signChange", { courseId: row.id, openOtherUnion: !row.openOtherUnion })
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
activityChange(val) {
|
||||
const activity = this.activityList.find((o) => o.id === val)
|
||||
const type = this.trainTypeList.find((o) => o.code === activity.trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
},
|
||||
exportSignUser() {
|
||||
this.$downLoad(loc() + "/exportSignUser", { activityId: this.pageForm.activityId })
|
||||
},
|
||||
async yearChange() {
|
||||
this.pageForm.activityId = null
|
||||
await this.getActivityList()
|
||||
await this.doSearch()
|
||||
},
|
||||
async getActivityList() {
|
||||
const resp = await this.$axios.post(loc() + "/activityList", { year: this.pageForm.year })
|
||||
this.activityList = resp.data
|
||||
if (this.activityList && this.activityList.length > 0) {
|
||||
this.pageForm.activityId = this.activityList[0].id
|
||||
const type = this.trainTypeList.find((o) => o.code === this.activityList[0].trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
}
|
||||
},
|
||||
async initData() {
|
||||
await this.getActivityList()
|
||||
},
|
||||
async openView(row) {
|
||||
this.clickRow = row
|
||||
this.$refs.guava.view()
|
||||
const resp_register = await this.$axios.post(loc() + "/registerUserList", { courseId: row.id })
|
||||
this.registerUserTableData = resp_register.data
|
||||
const resp_signInfo = await this.$axios.post(loc() + "/getSignInfo", { courseId: row.id })
|
||||
this.userSignInfo = resp_signInfo.data
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.$businessTool.getDictOptions("TRAIN_SIGNUP_TYPE").then((data) => {
|
||||
this.trainTypeList = data
|
||||
})
|
||||
await this.initData()
|
||||
await this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
<el-form ref="paramForm" :rules="paramFormRules" :model="clickRow" label-width="80px">
|
||||
<template v-if="['SELECT'].includes(clickRow.columnFormType)">
|
||||
<el-form-item label="选项列表" prop="selectValues">
|
||||
<el-select
|
||||
v-model="clickRow.selectValues"
|
||||
multiple
|
||||
style="width: 100%"
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
placeholder="请选择选项列表(如无数据时,需手动输入选项进行添加)"
|
||||
>
|
||||
<el-option v-for="item in clickRow.columnOptions" :label="item" :value="item" :key="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<template v-if="['RADIO'].includes(clickRow.columnFormType)">
|
||||
<el-form-item label="选项列表" prop="selectValues">
|
||||
<el-select
|
||||
v-model="clickRow.selectValues"
|
||||
multiple
|
||||
style="width: 100%"
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
placeholder="请选择选项列表(如无数据时,需手动输入选项进行添加)"
|
||||
>
|
||||
<el-option v-for="item in clickRow.columnOptions" :label="item" :value="item" :key="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<template v-if="['FILE'].includes(clickRow.columnFormType)">
|
||||
<el-form-item label="文件类型" prop="fileType">
|
||||
<el-select v-model="clickRow.fileType" multiple style="width: 100%" filterable placeholder="请选择文件类型">
|
||||
<el-option label="jpg" value="jpg"></el-option>
|
||||
<el-option label="png" value="png"></el-option>
|
||||
<el-option label="jpeg" value="jpeg"></el-option>
|
||||
<el-option label="doc" value="doc"></el-option>
|
||||
<el-option label="docx" value="docx"></el-option>
|
||||
<el-option label="xlsx" value="xlsx"></el-option>
|
||||
<el-option label="pdf" value="pdf"></el-option>
|
||||
<el-option label="mp3" value="mp3"></el-option>
|
||||
<el-option label="mp4" value="mp4"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="文件个数" prop="fileNumber">
|
||||
<el-input-number v-model="clickRow.fileNumber" :min="1" :max="10" placeholder="请输入文件个数" style="width: 100%"></el-input-number>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-form>
|
||||
|
||||
<div style="float: right; margin: 20px 0">
|
||||
<el-button @click="detailedParamsVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="doDetailParams">确 定</el-button>
|
||||
</div>
|
||||
@@ -0,0 +1,423 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.el-row--flex.is-justify-space-between {
|
||||
justify-content: left;
|
||||
}
|
||||
.el-drawer__body {
|
||||
padding: 0px 30px 0px 10px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="类型名称:">
|
||||
<el-input clearable placeholder="请输入类型名称" v-model="pageForm.lxname"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" class="mt20">
|
||||
<table-tool label="申请列表">
|
||||
<el-button type="primary" size="small" @click="openAdd">
|
||||
<i class="ti-plus"></i>
|
||||
新增类型
|
||||
</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
|
||||
<el-table-column label="序号" width="70" type="index">
|
||||
<template v-slot="scope">
|
||||
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="类型编码" prop="code" sortable></el-table-column>
|
||||
<el-table-column label="类型名称" prop="lxname"></el-table-column>
|
||||
<el-table-column label="操作" width="150px">
|
||||
<template v-slot="scope">
|
||||
<el-dropdown @command="dropdownCommand">
|
||||
<el-button plain size="mini">
|
||||
<i class="ti-settings"></i>
|
||||
<span class="ti-angle-down"></span>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item :command="{type:'top',data:scope.row}" v-if="scope.row.xh!==1">上移</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'edit',data:scope.row}">编辑</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'delete',data:scope.row}">删除</el-dropdown-item>
|
||||
<el-dropdown-item :command="{type:'bottom',data:scope.row}" v-if="scope.row.xh!==pageForm.totalCount">
|
||||
下移
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<template #edit>
|
||||
<div class="left-span-label">基础信息</div>
|
||||
<el-form label-width="120px" :model="formData" ref="addForm" :rules="rules">
|
||||
<el-form-item prop="code" label="类型编码">
|
||||
<el-input v-model="formData.code" placeholder="请输入类型编码"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="lxname" label="类型名称">
|
||||
<el-input v-model="formData.lxname" placeholder="请输入类型名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="isBringFamily" label="是否携带家属">
|
||||
<el-radio-group v-model="formData.isBringFamily" @input="isBringFamilyInput">
|
||||
<el-radio :label="true" border>携带</el-radio>
|
||||
<el-radio :label="false" border>不携带</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="formData.isBringFamily === true" prop="isAddFamily" label="家属纳入总人数">
|
||||
<el-radio-group v-model="formData.isAddFamily">
|
||||
<el-radio :label="true" border>纳入</el-radio>
|
||||
<el-radio :label="false" border>不纳入</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="left-span-label" style="display: flex; justify-content: space-between; align-items: center">
|
||||
<div>
|
||||
报名填写字段
|
||||
<span style="color: #c64120; margin-left: 10px">
|
||||
注:移动端报名时字段的显示顺序会按照下面表格中的序号进行排列、字段编码不能重复
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
<el-button
|
||||
@click="formData.trainMobileSignColumnList.push({isRequired: false})"
|
||||
size="small"
|
||||
type="primary"
|
||||
style="margin-left: 10px"
|
||||
>
|
||||
添加
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<el-table :data="formData.trainMobileSignColumnList">
|
||||
<el-table-column label="序号" prop="columnIndex">
|
||||
<template v-slot="{row}">
|
||||
<el-input-number v-model="row.columnIndex" placeholder="请输入序号"></el-input-number>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="字段名称" prop="columnName">
|
||||
<template v-slot="{row}">
|
||||
<el-input
|
||||
v-model="row.columnName"
|
||||
placeholder="请输入字段名称"
|
||||
:disabled="formData.isBringFamily === true && row.columnCode === 'xdqsrs'"
|
||||
></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="字段编码" prop="columnCode">
|
||||
<template v-slot="{row}">
|
||||
<el-input
|
||||
v-model="row.columnCode"
|
||||
placeholder="请输入字段编码"
|
||||
:disabled="formData.isBringFamily === true && row.columnCode === 'xdqsrs'"
|
||||
></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="控件类型" prop="columnFormType">
|
||||
<template v-slot="{row, $index}">
|
||||
<el-select
|
||||
filterable
|
||||
v-model="row.columnFormType"
|
||||
@change="(val) => {columnFormTypeChange(val, $index)}"
|
||||
:disabled="formData.isBringFamily === true && row.columnCode === 'xdqsrs'"
|
||||
placeholder="请选择控件类型"
|
||||
>
|
||||
<el-option v-for="item in columnFormTypeList" :label="item.description" :value="item.code" :key="item.code"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="字段类型" prop="columnType">
|
||||
<template v-slot="{row}">
|
||||
<el-select
|
||||
filterable
|
||||
placeholder="请选择字段类型"
|
||||
v-model="row.columnType"
|
||||
:disabled="row.isDisabled || (formData.isBringFamily === true && row.columnCode === 'xdqsrs')"
|
||||
>
|
||||
<el-option v-for="item in columnTypeOptions" :label="item" :value="item" :key="item"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="是否必填" prop="isRequired" sortable>
|
||||
<template v-slot="{row}">
|
||||
<el-switch
|
||||
v-model="row.isRequired"
|
||||
active-color="#13ce66"
|
||||
inactive-color="#ff4949"
|
||||
:disabled="formData.isBringFamily === true && row.columnCode === 'xdqsrs'"
|
||||
:active-value="true"
|
||||
:inactive-value="false"
|
||||
active-text="是"
|
||||
inactive-text="否"
|
||||
></el-switch>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作">
|
||||
<template v-slot="{row, $index}">
|
||||
<el-button
|
||||
@click="openDetailedParams(row, $index)"
|
||||
:disabled="!['SELECT', 'RADIO', 'FILE'].includes(row.columnFormType)"
|
||||
size="mini"
|
||||
type="primary"
|
||||
>
|
||||
设置详细参数
|
||||
</el-button>
|
||||
<el-button
|
||||
@click="formData.trainMobileSignColumnList.splice($index, 1)"
|
||||
:disabled="formData.isBringFamily === true && row.columnCode === 'xdqsrs'"
|
||||
size="mini"
|
||||
type="danger"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div style="float: right; margin: 20px 0">
|
||||
<el-button @click="$refs.guava.index()">取 消</el-button>
|
||||
<el-button type="primary" @click="doHandle">确 定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-drawer :visible.sync="detailedParamsVisible" size="40%">
|
||||
<template #title>
|
||||
<div class="left-span-label">设置详细参数</div>
|
||||
</template>
|
||||
<!--#include("/platform/zhgh/activity/trainSingUp/type/include_signUp_edit.html"){}#-->
|
||||
</el-drawer>
|
||||
</div>
|
||||
<script>
|
||||
const vue = new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
form: {},
|
||||
detailedParamsVisible: false,
|
||||
pageForm: {
|
||||
pageNumber: 1,
|
||||
pageSize: 10,
|
||||
totalCount: 0,
|
||||
lxname: ""
|
||||
},
|
||||
formData: {
|
||||
trainMobileSignColumnList: [{ isRequired: false }],
|
||||
isBringFamily: false,
|
||||
isAddFamily: null
|
||||
},
|
||||
rules: {
|
||||
lxname: [{ required: true, message: "请输入类型名称", trigger: ["change", "blur"] }],
|
||||
code: [{ required: true, message: "请输入类型编码", trigger: ["change", "blur"] }],
|
||||
isBringFamily: [{ required: true, message: "请选择是否携带家属", trigger: ["blur", "change"] }],
|
||||
isAddFamily: [{ required: true, message: "请选择家属是否纳入总人数", trigger: ["blur", "change"] }]
|
||||
},
|
||||
tableData: [],
|
||||
columnTypeOptions: [],
|
||||
columnFormTypeList: [],
|
||||
clickRow: {},
|
||||
paramFormRules: {
|
||||
selectValues: [{ required: true, message: "请选择选项列表", trigger: ["blur"] }],
|
||||
fileType: [{ required: true, message: "请选择文件类型", trigger: ["blur"] }],
|
||||
fileNumber: [{ required: true, message: "请输入文件个数", trigger: ["blur", "change"] }]
|
||||
},
|
||||
choose: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
isBringFamilyInput(o) {
|
||||
this.$set(this.formData, "isAddFamily", o === true ? false : null)
|
||||
if (o === true) {
|
||||
this.formData.trainMobileSignColumnList.unshift({
|
||||
columnName: "携带亲属人数",
|
||||
columnCode: "xdqsrs",
|
||||
columnFormType: "INPUT",
|
||||
columnType: "INT",
|
||||
isRequired: true
|
||||
})
|
||||
} else {
|
||||
this.formData.trainMobileSignColumnList.forEach((item, index) => {
|
||||
if (item.columnCode === "xdqsrs" && this.formData.isBringFamily === false) {
|
||||
this.formData.trainMobileSignColumnList.splice(index, 1)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
columnFormTypeChange(val, index) {
|
||||
if (val === "FILE") {
|
||||
this.formData.trainMobileSignColumnList[index].columnType = "JSON"
|
||||
this.formData.trainMobileSignColumnList[index].isDisabled = true
|
||||
} else {
|
||||
this.formData.trainMobileSignColumnList[index].columnType = ""
|
||||
this.formData.trainMobileSignColumnList[index].isDisabled = false
|
||||
}
|
||||
},
|
||||
doHandle() {
|
||||
if (this.choose.id) {
|
||||
this.doEdit()
|
||||
} else {
|
||||
this.doAdd()
|
||||
}
|
||||
},
|
||||
async doDetailParams() {
|
||||
const isValid = await this.$refs["paramForm"].validate()
|
||||
if (isValid) {
|
||||
this.detailedParamsVisible = false
|
||||
}
|
||||
},
|
||||
openDetailedParams(row, index) {
|
||||
this.clickRow = row
|
||||
this.detailedParamsVisible = true
|
||||
if (this.$refs["paramForm"]) this.$refs["paramForm"].clearValidate()
|
||||
},
|
||||
dropdownCommand(command) {
|
||||
const { type, data } = command
|
||||
if (type == "top") {
|
||||
this.rowChange(data, false)
|
||||
} else if (type == "edit") {
|
||||
this.openEdit(data)
|
||||
} else if (type == "delete") {
|
||||
this.doDelete(data.id)
|
||||
} else if (type == "bottom") {
|
||||
this.rowChange(data, true)
|
||||
}
|
||||
},
|
||||
async rowChange(row, toDown) {
|
||||
await this.$axios.post(loc() + "/xhChange", { id: row.id, xh: row.xh, toDown }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
},
|
||||
openAdd() {
|
||||
this.choose = {}
|
||||
this.formData = {
|
||||
trainMobileSignColumnList: [{ isRequired: false }],
|
||||
isBringFamily: false
|
||||
}
|
||||
this.$refs.guava.edit()
|
||||
if (this.$refs["addForm"]) this.$refs["addForm"].resetFields()
|
||||
},
|
||||
async doAdd() {
|
||||
this.$refs["addForm"].validate((valid) => {
|
||||
if (valid) {
|
||||
const newListLength = new Set(this.formData.trainMobileSignColumnList.map((item) => item.columnCode)).size
|
||||
const listLength = this.formData.trainMobileSignColumnList.length
|
||||
if (listLength > newListLength) {
|
||||
this.$notify.warning({ title: "警告", message: "字段编码不能重复!" })
|
||||
return
|
||||
}
|
||||
const cloneData = clone(this.formData)
|
||||
this.$axios.post(loc() + "/doAdd", { data: JSON.stringify(cloneData) }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.pageData()
|
||||
this.$refs.guava.index()
|
||||
this.$message.success(res.msg)
|
||||
} else {
|
||||
this.$message.error(res.msg)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
pageData() {
|
||||
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
}
|
||||
})
|
||||
},
|
||||
doSearch() {
|
||||
this.pageForm.pageNumber = 1
|
||||
this.pageData()
|
||||
},
|
||||
pageNumberChange(val) {
|
||||
this.pageForm.pageNumber = val
|
||||
this.pageData()
|
||||
},
|
||||
openEdit(obj) {
|
||||
this.choose = obj
|
||||
this.formData = JSON.parse(JSON.stringify(obj))
|
||||
this.formData.trainMobileSignColumnList.forEach((item) => {
|
||||
item.isDisabled = item.columnFormType === "FILE"
|
||||
})
|
||||
this.$refs.guava.edit()
|
||||
},
|
||||
doEdit() {
|
||||
this.$refs["addForm"].validate((valid) => {
|
||||
if (valid) {
|
||||
const newListLength = new Set(this.formData.trainMobileSignColumnList.map((item) => item.columnCode)).size
|
||||
const listLength = this.formData.trainMobileSignColumnList.length
|
||||
if (listLength > newListLength) {
|
||||
this.$notify.warning({ title: "警告", message: "字段编码不能重复!" })
|
||||
return
|
||||
}
|
||||
const cloneData = clone(this.formData)
|
||||
cloneData.trainMobileSignColumnList = JSON.stringify(cloneData.trainMobileSignColumnList)
|
||||
this.$axios.post(loc() + "/doEdit", cloneData).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.pageData()
|
||||
this.$refs.guava.index()
|
||||
this.$message.success(res.msg)
|
||||
} else {
|
||||
this.$message.error(res.msg)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
doDelete(id) {
|
||||
this.$confirm("此操作将删除类型,确认删除吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
.then(() => {
|
||||
this.$axios.post(loc() + "/doDelete", { id: id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.doSearch()
|
||||
this.$message.success(res.msg)
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => {})
|
||||
},
|
||||
async getColTypeOptions() {
|
||||
const resp = await this.$axios.get(loc() + "/getColumnType")
|
||||
this.columnTypeOptions = resp.data
|
||||
},
|
||||
async getEnumOptions() {
|
||||
const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: "ColumnFormTypeEnum" })
|
||||
return resp.data
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
await this.getColTypeOptions()
|
||||
this.columnFormTypeList = await this.getEnumOptions()
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,341 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.adjustDialog .el-radio__label {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.adjustDialog .el-dialog__body {
|
||||
max-height: 600px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度:">
|
||||
<el-date-picker
|
||||
placeholder="选择年度"
|
||||
type="year"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动名称:">
|
||||
<el-select @change="activityChange" style="width: 100%" v-model="pageForm.activityId">
|
||||
<el-option :label="item.activityName" :value="item.id" v-for="item in activityList" :key="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool label="人员调整"></table-tool>
|
||||
<el-table :data="tableData" :size="tableSize">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column :label="trainType" prop="courseName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="类型" prop="courseType" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column :label="trainType + '地点'" prop="courseLocation" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column
|
||||
:label="trainType === '培训班' ? '讲师' : '负责人'"
|
||||
prop="courseInstructor"
|
||||
sortable
|
||||
show-overflow-tooltip
|
||||
></el-table-column>
|
||||
<el-table-column label="最多报名人数" prop="coursePeopleNumber" sortable show-overflow-tooltip>
|
||||
<template v-slot="{row}">
|
||||
<span v-if="row.reserveMode === 1">{{row.coursePeopleNumber}}</span>
|
||||
<span v-if="row.reserveMode === 2">{{row.coursePeopleNumber + row.courseReservedNumber}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="限制报名人数" prop="coursePeopleNumber" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="预留人数" prop="courseReservedNumber" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="已报名人数" prop="registerNum" sortable show-overflow-tooltip>
|
||||
<template v-slot="{row}">
|
||||
<el-link v-if="row.reserveMode === 1" @click="openView(row)" type="primary">
|
||||
{{row.registerNum + row.courseReservedNumber}}
|
||||
</el-link>
|
||||
<el-link v-if="row.reserveMode === 2" @click="openView(row)" type="primary">{{row.registerNum}}</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作" width="150px">
|
||||
<template v-slot="{row}">
|
||||
<el-button @click="openView(row)" size="mini" type="primary">调整</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<div class="left-span-label">{{ registerCourse.courseName + '报名人员' }}</div>
|
||||
<div>
|
||||
<search @search="registerSearch">
|
||||
<search-item label="姓名/工号:">
|
||||
<el-input v-model="registerForm.searchKeyword" placeholder="请输入内容"></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会:">
|
||||
<el-select v-model="registerForm.unionId" clearable filterable placeholder="请选择院级工会" @change="getUnitList()">
|
||||
<el-option v-for="item in unionList" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位:">
|
||||
<el-select v-model="registerForm.unitId" clearable filterable placeholder="请选择单位">
|
||||
<el-option v-for="item in unitList" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</div>
|
||||
<el-table :data="registerUserTableData" :size="tableSize" class="mt15">
|
||||
<el-table-column
|
||||
:label="column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
v-for="(column, index) in registerUserTableColumns"
|
||||
:key="index"
|
||||
>
|
||||
<template v-slot="{row}" v-if="column.prop === 'state'">
|
||||
<span class="text-success" v-if="row.state === 1">正常报名</span>
|
||||
<span class="text-warning" v-else-if="row.state === 2">候补报名</span>
|
||||
<span class="text-success" v-else-if="row.state === 3">正常报名(候补)</span>
|
||||
<span class="text-info" v-else-if="row.state === 4">无效报名(缺席)</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="150px">
|
||||
<template v-slot="{row}">
|
||||
<el-button @click="adjust(row)" size="mini" type="primary">修改</el-button>
|
||||
<el-button @click="deleteSignUser(row)" size="mini" type="danger">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-dialog title="人员调整" top="6vh" class="adjustDialog" :close-on-click-modal="false" :visible.sync="adjustDialogVisible" width="40%">
|
||||
<span style="color: #c33714">注:如单选为灰色选择不了,则表示对应的{{ trainType }}人数已满!</span>
|
||||
<el-table :data="courseList">
|
||||
<el-table-column label="单选" width="160">
|
||||
<template v-slot="{row}">
|
||||
<el-radio
|
||||
:label="row.id"
|
||||
@change.native="getCurrentRow(row)"
|
||||
:disabled="(row.courseReservedNumber + row.registerNum) >= row.coursePeopleNumber"
|
||||
v-model="afterAdjustCourse"
|
||||
></el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
:label="trainType + '列表'"
|
||||
prop="courseName"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
></el-table-column>
|
||||
<el-table-column label="最多报名人数" prop="coursePeopleNumber" align="center" header-align="center"></el-table-column>
|
||||
<el-table-column label="预留名额" prop="courseReservedNumber" align="center" header-align="center"></el-table-column>
|
||||
<el-table-column label="已报名人数" prop="registerNum" align="center" header-align="center"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="adjustDialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="doAdjust">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
trainType: "培训班",
|
||||
trainTypeList: [],
|
||||
afterAdjustCourse: "",
|
||||
adjustDialogVisible: false,
|
||||
unionList: [],
|
||||
unitList: [],
|
||||
registerForm: {
|
||||
unionId: "",
|
||||
unitId: ""
|
||||
},
|
||||
activityList: [],
|
||||
pageForm: {
|
||||
year: new Date().getFullYear().toString(),
|
||||
activityId: null
|
||||
},
|
||||
tableColumns: [
|
||||
{ label: "培训班", prop: "courseName" },
|
||||
{ label: "类型", prop: "courseType", sortable: true },
|
||||
{ label: "地点", prop: "courseLocation" },
|
||||
{ label: "教师", prop: "courseInstructor", sortable: true },
|
||||
{ label: "最多报名人数", prop: "coursePeopleNumber", sortable: true },
|
||||
{ label: "已报名人数", prop: "registerNum", sortable: true }
|
||||
],
|
||||
registerUserTableData: [],
|
||||
registerUserTableColumns: [
|
||||
{ label: "姓名", prop: "username" },
|
||||
{ label: "一卡通号", prop: "loginname" },
|
||||
{ label: "单位", prop: "unitName" },
|
||||
{ label: "分工会", prop: "unionName" },
|
||||
{ label: "联系方式", prop: "mobile" },
|
||||
{ label: "报名时间", prop: "signUpTime" },
|
||||
{ label: "报名状态", prop: "state" }
|
||||
],
|
||||
registerCourse: {},
|
||||
courseList: [],
|
||||
userInfo: {},
|
||||
chooseRow: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
activityChange(val) {
|
||||
const activity = this.activityList.find((o) => o.id === val)
|
||||
const type = this.trainTypeList.find((o) => o.code === activity.trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
},
|
||||
getCurrentRow(row) {
|
||||
this.chooseRow = row
|
||||
},
|
||||
async doAdjust() {
|
||||
if (!this.afterAdjustCourse) {
|
||||
this.$message.warning("请选择要调整的" + this.trainType + "!")
|
||||
return
|
||||
}
|
||||
this.$confirm(
|
||||
"您确定要将" +
|
||||
"<span style='color: red'>" +
|
||||
this.userInfo.username +
|
||||
"</span>" +
|
||||
"的报名信息调整到" +
|
||||
"<span style='color: red'>" +
|
||||
this.chooseRow.courseName +
|
||||
"</span>" +
|
||||
"中吗?",
|
||||
"提示",
|
||||
{
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
dangerouslyUseHTMLString: true
|
||||
}
|
||||
)
|
||||
.then(async () => {
|
||||
const loading = this.$loading({
|
||||
lock: true,
|
||||
text: "努力调整中,感谢您的耐心等待。。。",
|
||||
spinner: "el-icon-loading",
|
||||
background: "rgba(0, 0, 0, 0.7)"
|
||||
})
|
||||
const resp = await this.$axios.post(loc() + "/adjust", {
|
||||
activityId: this.pageForm.activityId,
|
||||
oldCourseId: this.registerCourse.id,
|
||||
newCourseId: this.afterAdjustCourse,
|
||||
userId: this.userInfo.userId
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.$refs.guava.index()
|
||||
this.adjustDialogVisible = false
|
||||
this.doSearch()
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
loading.close()
|
||||
})
|
||||
.catch(() => {})
|
||||
},
|
||||
adjust(o) {
|
||||
this.userInfo = o
|
||||
this.afterAdjustCourse = ""
|
||||
this.getCourse(this.pageForm.activityId)
|
||||
this.adjustDialogVisible = true
|
||||
},
|
||||
deleteSignUser(o) {
|
||||
this.$confirm("您确定要删除" + "<span style='color: red'>" + o.username + "</span>" + "的报名信息吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
dangerouslyUseHTMLString: true
|
||||
})
|
||||
.then(async () => {
|
||||
const resp = await this.$axios.post(loc() + "/deleteSignUser", {
|
||||
activityId: this.pageForm.activityId,
|
||||
courseId: this.registerCourse.id,
|
||||
userId: o.userId
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
await this.registerSearch()
|
||||
this.doSearch()
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
})
|
||||
.catch(() => {})
|
||||
},
|
||||
async registerSearch() {
|
||||
this.registerForm.courseId = this.registerCourse.id
|
||||
const resp_register = await $.get(loc() + "/registerUserList", this.registerForm)
|
||||
this.registerUserTableData = resp_register.data
|
||||
},
|
||||
async getUnitList() {
|
||||
this.registerForm.unitId = ""
|
||||
this.unitList = await this.$businessTool.listUnit(this.registerForm.unionId)
|
||||
},
|
||||
async yearChange() {
|
||||
this.pageForm.activityId = null
|
||||
await this.getActivityList()
|
||||
await this.doSearch()
|
||||
},
|
||||
async getActivityList() {
|
||||
const resp = await this.$axios.post(loc() + "/activityList", { year: this.pageForm.year })
|
||||
this.activityList = resp.data
|
||||
if (this.activityList && this.activityList.length > 0) {
|
||||
this.pageForm.activityId = this.activityList[0].id
|
||||
const type = this.trainTypeList.find((o) => o.code === this.activityList[0].trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
}
|
||||
},
|
||||
async initData() {
|
||||
await this.getActivityList()
|
||||
this.unionList = await this.$businessTool.listUnion()
|
||||
},
|
||||
async openView(o) {
|
||||
this.registerCourse = o
|
||||
this.registerForm.courseId = o.id
|
||||
this.$refs.guava.view()
|
||||
const resp_register = await this.$axios.post(loc() + "/registerUserList", this.registerForm)
|
||||
this.registerUserTableData = resp_register.data
|
||||
},
|
||||
async getCourse(val) {
|
||||
const { data } = await this.$axios.post(loc() + "/getCourse", { activityId: val })
|
||||
this.courseList = data
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.$businessTool.getDictOptions("TRAIN_SIGNUP_TYPE").then((data) => {
|
||||
this.trainTypeList = data
|
||||
})
|
||||
await this.initData()
|
||||
await this.pageData()
|
||||
},
|
||||
watch: {
|
||||
"pageForm.activityId"(val) {
|
||||
this.getCourse(val)
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,264 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度:">
|
||||
<el-date-picker
|
||||
placeholder="选择年度"
|
||||
type="year"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动名称:">
|
||||
<el-select @change="activityChange" style="width: 100%" v-model="pageForm.activityId">
|
||||
<el-option :label="item.activityName" :value="item.id" v-for="item in activityList" :key="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item :label="trainType + ':'">
|
||||
<el-select @change="courseChange" :placeholder="'请选择' + trainType" style="width: 100%" v-model="pageForm.courseId">
|
||||
<el-option :label="item.courseName" :value="item.id" v-for="item in courseList" :key="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="人员信息:">
|
||||
<el-input clearable placeholder="输入姓名或者工号搜索" v-model="pageForm.userKeyWord"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool ref="tool" :label="trainType + '(温馨提示:如需补充人员,请在上面选择具体的' + trainType + ')'">
|
||||
<el-button @click="openReserve" type="primary" v-if="reserveMode === 2" size="small">补充人员</el-button>
|
||||
<el-button @click="exportSignPerson" type="primary" size="small">导出签到名单</el-button>
|
||||
<el-button @click="exportGiftPerson" type="primary" size="small">导出领取名单</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column
|
||||
:label="column.prop === 'courseNames' ? trainType : column.label"
|
||||
:prop="column.prop"
|
||||
:sortable="column.sortable"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
v-if="(column.prop !== 'state' && column.prop !== 'absentCount') || (reserveMode === 2 && column.prop === 'state' && column.prop !== 'absentCount')
|
||||
|| (column.prop === 'absentCount' && course.isMobileSign === true)"
|
||||
v-for="(column,index) in tableColumns"
|
||||
:key="index"
|
||||
>
|
||||
<template v-slot="{row}" v-if="column.prop==='isDisabled'">
|
||||
<span class="text-danger" v-if="row.isDisabled">是</span>
|
||||
<span class="text-success" v-else>否</span>
|
||||
</template>
|
||||
<template v-slot="{row}" v-else-if="column.prop==='state'">
|
||||
<span class="text-success" v-if="row.state === 1">正常报名</span>
|
||||
<span class="text-warning" v-else-if="row.state === 2">候补报名</span>
|
||||
<span class="text-success" v-else-if="row.state === 3">正常报名(候补)</span>
|
||||
<span class="text-info" v-else-if="row.state === 4">无效报名(缺席)</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="150px">
|
||||
<template v-slot="{row}">
|
||||
<el-button @click="handleUser(row.userId)" size="mini" type="danger" v-if="!row.isDisabled">拉黑</el-button>
|
||||
<el-button @click="handleUser(row.userId)" size="mini" type="success" v-if="row.isDisabled">解封</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<!--#include("/platform/zhgh/activity/trainSingUp/statistics/include_view.html"){}#-->
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-dialog title="补充人员" :visible.sync="reserveDialogVisible" width="55%" top="3%">
|
||||
<vi-title title="以下为候补人员,已为您按照报名时间降序排列"></vi-title>
|
||||
<el-table :data="reserveTableData" ref="multipleTable" @selection-change="handleSelectionChange">
|
||||
<el-table-column :selectable="(row, index) => {return row.state === 2}" type="selection" width="55"></el-table-column>
|
||||
<el-table-column prop="username" label="姓名"></el-table-column>
|
||||
<el-table-column prop="loginname" label="工号"></el-table-column>
|
||||
<el-table-column prop="mobile" label="联系方式"></el-table-column>
|
||||
<el-table-column prop="unitname" label="单位"></el-table-column>
|
||||
<el-table-column prop="unionname" label="工会"></el-table-column>
|
||||
<el-table-column prop="signUpTime" label="报名时间"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="reserveDialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="reserveDo">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
reserveDialogVisible: false,
|
||||
reserveTableData: [],
|
||||
activityList: [],
|
||||
pageForm: {
|
||||
year: new Date().getFullYear().toString(),
|
||||
activityId: null
|
||||
},
|
||||
tableColumns: [
|
||||
{ label: "姓名", prop: "username" },
|
||||
{ label: "工号", prop: "loginname" },
|
||||
{ label: "联系方式", prop: "mobile" },
|
||||
{ label: "单位", prop: "unitName", sortable: true },
|
||||
{ label: "分工会", prop: "unionName", sortable: true },
|
||||
{ label: "课程", prop: "courseNames", sortable: true },
|
||||
{ label: "缺席次数", prop: "absentCount" },
|
||||
{ label: "是否黑名单", prop: "isDisabled", sortable: true }
|
||||
],
|
||||
registerUserTableData: [],
|
||||
registerUserTableColumns: [
|
||||
{ label: "姓名", prop: "username" },
|
||||
{ label: "工号", prop: "loginname" },
|
||||
{ label: "联系方式", prop: "mobile" },
|
||||
{ label: "单位", prop: "unitname" },
|
||||
{ label: "分工会", prop: "unionname" },
|
||||
{ label: "课程次数", prop: "tourseTotal" },
|
||||
{ label: "缺席次数", prop: "absentCount" },
|
||||
{ label: "是否黑名单", prop: "isDisabled" }
|
||||
],
|
||||
userSignInfo: {},
|
||||
trainType: "培训班",
|
||||
trainTypeList: [],
|
||||
courseList: [],
|
||||
course: {},
|
||||
reserveMode: 1,
|
||||
multipleSelection: [],
|
||||
clickRow: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleSelectionChange(val) {
|
||||
this.multipleSelection = val
|
||||
},
|
||||
async openReserve() {
|
||||
const activity = this.activityList.find((o) => o.id === this.pageForm.activityId)
|
||||
if (this.$moment().unix() < this.$moment(activity.activityEndTime).unix()) {
|
||||
this.$alert("此活动还未结束,无法补充", "提示", {
|
||||
confirmButtonText: "确定"
|
||||
})
|
||||
return
|
||||
}
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/userManage/getReserveUser", { courseId: this.course.id })
|
||||
this.reserveTableData = resp.data
|
||||
this.reserveDialogVisible = true
|
||||
},
|
||||
reserveDo() {
|
||||
if (this.multipleSelection.length === 0) {
|
||||
this.$message.warning("请先在左侧多选框中选择要补充的人员")
|
||||
return
|
||||
}
|
||||
this.$confirm("您选择了" + this.multipleSelection.length + "位教职工,确定要进行补充操作吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
.then(async () => {
|
||||
const ids = this.multipleSelection.map((o) => o.userId)
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/userManage/reserveSingUp", {
|
||||
ids: JSON.stringify(ids),
|
||||
courseId: this.course.id
|
||||
})
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
this.multipleSelection = []
|
||||
this.$refs.multipleTable.clearSelection()
|
||||
this.reserveDialogVisible = false
|
||||
}
|
||||
})
|
||||
.catch(() => {})
|
||||
},
|
||||
courseChange(val) {
|
||||
const course = this.courseList.find((o) => o.id === val)
|
||||
this.course = course
|
||||
this.reserveMode = course.reserveMode
|
||||
if (this.reserveMode === 2) {
|
||||
this.tableColumns.push({ label: "报名状态", prop: "state", sortable: true })
|
||||
} else {
|
||||
const o = this.tableColumns.find((o) => o.label === "报名状态")
|
||||
if (o !== null && o !== undefined) {
|
||||
this.tableColumns.splice(this.tableColumns.length - 1, 1)
|
||||
}
|
||||
}
|
||||
this.$refs.tool.app = this
|
||||
this.doSearch()
|
||||
},
|
||||
exportSignPerson() {
|
||||
this.exportPro(loc() + "/exportSignPerson", { activityId: this.pageForm.activityId })
|
||||
},
|
||||
exportGiftPerson() {
|
||||
this.exportPro(loc() + "/exportGiftPerson", { activityId: this.pageForm.activityId })
|
||||
},
|
||||
exportPro(url, param) {
|
||||
if (param.activityId === null) {
|
||||
this.$message.warning("请选择活动")
|
||||
return
|
||||
}
|
||||
this.$downLoad(url, param)
|
||||
},
|
||||
async activityChange(val) {
|
||||
const activity = this.activityList.find((o) => o.id === val)
|
||||
const type = this.trainTypeList.find((o) => o.code === activity.trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
const resp = await this.$axios.post(loc() + "/getCourseByActivityId", { activityId: val })
|
||||
this.courseList = resp.data
|
||||
this.pageForm.courseId = ""
|
||||
},
|
||||
async handleUser(userId) {
|
||||
const resp = await $.post(loc() + "/doHandleUser", { userId })
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
},
|
||||
async yearChange() {
|
||||
this.pageForm.activityId = null
|
||||
await this.getActivityList()
|
||||
await this.doSearch()
|
||||
},
|
||||
async getActivityList() {
|
||||
const resp = await this.$axios.post("/platform/trainSingUp/statistics/activity/activityList", { year: this.pageForm.year })
|
||||
this.activityList = resp.data
|
||||
if (this.activityList && this.activityList.length > 0) {
|
||||
this.pageForm.activityId = this.activityList[0].id
|
||||
const type = this.trainTypeList.find((o) => o.code === this.activityList[0].trainType)
|
||||
this.trainType = type ? type.name : "培训班"
|
||||
await this.activityChange(this.activityList[0].id)
|
||||
}
|
||||
},
|
||||
async initData() {
|
||||
await this.getActivityList()
|
||||
},
|
||||
async openView(userId) {
|
||||
this.$refs.guava.view()
|
||||
// const resp_register = await $.get(loc() + '/registerUserList', {courseId})
|
||||
// this.registerUserTableData = resp_register.data
|
||||
// const resp_signInfo = await $.get(loc() + '/getSignInfo', {courseId})
|
||||
// this.userSignInfo = resp_signInfo.data
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.$businessTool.getDictOptions("TRAIN_SIGNUP_TYPE").then((data) => {
|
||||
this.trainTypeList = data
|
||||
})
|
||||
await this.initData()
|
||||
await this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,43 @@
|
||||
const AU_INFO_TEMPLATE = {
|
||||
template: /*language=HTML*/ `
|
||||
<el-dialog title="查看" :visible.sync="dialogFormVisible" width="1000px" :close-on-click-modal="false">
|
||||
<el-descriptions :column="3" border>
|
||||
<el-descriptions-item label="姓名">{{viewData.userName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="单位">{{viewData.unitName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="分工会">{{viewData.unionName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="作品名称">{{viewData.name}}</el-descriptions-item>
|
||||
<el-descriptions-item label="活动主题">{{viewData.activityName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="主题类型">{{viewData.subjectName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="作品类型" :span="2">{{viewData.worksName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="作品描述" :span="3">{{viewData.description}}</el-descriptions-item>
|
||||
<el-descriptions-item label="作品附件" :span="3">
|
||||
<template slot="label">作品附件</template>
|
||||
<file-preview complete_result :files="viewData.files"></file-preview>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-dialog>
|
||||
`,
|
||||
data() {
|
||||
return {
|
||||
dialogFormVisible: false,
|
||||
viewData: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(id) {
|
||||
if (!id) {
|
||||
return
|
||||
}
|
||||
this.dialogFormVisible = true
|
||||
this.$axios.post("/platform/activity/worksCollection/common/findOne", { id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.viewData = res.data
|
||||
try {
|
||||
this.viewData.files = JSON.parse(this.viewData.files)
|
||||
} catch (err) {}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,514 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style></style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker placeholder="按年度查询" type="year" v-model="pageForm.year"
|
||||
value-format="yyyy"></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动主题">
|
||||
<el-input clearable placeholder="请输入内容" v-model="pageForm.searchKeyword"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never">
|
||||
<table-tool label="活动列表">
|
||||
<el-button size="mini" type="primary" icon="el-icon-plus" @click="openAdd">创建活动</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%" row-key="id">
|
||||
<el-table-column label="序号" type="index" width="60px" :index="indexMethod"></el-table-column>
|
||||
<el-table-column label="主题" prop="name"></el-table-column>
|
||||
<el-table-column label="创建人" prop="userName"></el-table-column>
|
||||
<el-table-column label="创建时间" prop="createdAt">
|
||||
<template scope="scope">
|
||||
<span>{{$moment(scope.row.createdAt).format('YYYY-MM-DD')}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="活动时间" prop="startDateTime">
|
||||
<template scope="scope">
|
||||
<span>{{scope.row.startDateTime}} -- {{scope.row.endDateTime}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="enable" label="开启状态">
|
||||
<template scope="scope">
|
||||
<el-switch
|
||||
v-model="scope.row.enable"
|
||||
active-color="#13ce66"
|
||||
inactive-color="#ff4949"
|
||||
@change="(val)=>{enableChange(val,scope.row.id)}"
|
||||
></el-switch>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="300">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="primary" @click="sendNotice(scope.row.id)">发送通知</el-button>
|
||||
<el-button size="mini" type="primary" @click="openEdit(scope.row.id)">编辑</el-button>
|
||||
<el-button size="mini" type="danger" @click="doDelete(scope.row.id)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<template #edit>
|
||||
<el-form :model="formData" ref="formRef" label-width="130px" :rules="formRules">
|
||||
<el-form-item label="活动主题" prop="name">
|
||||
<el-input placeholder="请输入活动主题" v-model="formData.name" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="活动时间" prop="activityTime">
|
||||
<el-date-picker
|
||||
:default-time="['00:00:00']"
|
||||
end-placeholder="结束时间"
|
||||
start-placeholder="开始时间"
|
||||
style="width: 100%"
|
||||
type="datetimerange"
|
||||
v-model="formData.activityTime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="点赞时间" prop="nbTime">
|
||||
<el-date-picker
|
||||
:default-time="['00:00:00']"
|
||||
end-placeholder="结束时间"
|
||||
start-placeholder="开始时间"
|
||||
style="width: 100%"
|
||||
type="datetimerange"
|
||||
v-model="formData.nbTime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="每人每日点赞次数" prop="nbCount">
|
||||
<el-input-number
|
||||
:min="0"
|
||||
placeholder="请输入每人每日点赞次数"
|
||||
style="width: 100%"
|
||||
v-model="formData.nbCount"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-form-item label="主题类型" prop="subjectTypes">
|
||||
<el-row class="pb5" v-for="(type,index) in formData.subjectTypes" :key="type.id">
|
||||
<el-col :span="20">
|
||||
<el-input placeholder="请输入名称" v-model="type.typeName"></el-input>
|
||||
</el-col>
|
||||
<el-col :span="2" style="text-align: center">
|
||||
<el-button @click="addType(index)" icon="el-icon-plus" type="primary"></el-button>
|
||||
</el-col>
|
||||
<el-col :span="2" style="text-align: center">
|
||||
<el-button
|
||||
:disabled="index == 0"
|
||||
@click="formData.subjectTypes.splice(index,1)"
|
||||
icon="el-icon-delete"
|
||||
type="danger"
|
||||
></el-button>
|
||||
</el-col>
|
||||
<el-col class="pt5 pb5">
|
||||
<el-row class="pb5" v-for="(worksType,worksIndex) in type.worksTypes" :key="worksType.id">
|
||||
<el-col :span="18">
|
||||
<el-col :span="4">
|
||||
<span class="el-form-item__label" v-if="worksIndex === 0">作品类型</span>
|
||||
<span v-else> </span>
|
||||
</el-col>
|
||||
<el-col :span="20">
|
||||
<el-input placeholder="请输入名称" v-model="worksType.worksTypeName"></el-input>
|
||||
</el-col>
|
||||
</el-col>
|
||||
<el-col :span="2" style="text-align: center">
|
||||
<el-button @click="openSetting(worksType)" icon="el-icon-s-tools"
|
||||
type="primary"></el-button>
|
||||
</el-col>
|
||||
<el-col :span="2" style="text-align: center">
|
||||
<el-button @click="addWorksType(type, worksIndex)" icon="el-icon-plus"
|
||||
type="primary"></el-button>
|
||||
</el-col>
|
||||
<el-col :span="2" style="text-align: center">
|
||||
<el-button @click="type.worksTypes.splice(worksIndex, 1)" icon="el-icon-delete"
|
||||
type="danger"></el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form-item>
|
||||
<el-form-item label="面向对象" prop="joinCnd">
|
||||
<div style="display: flex; justify-content: space-between">
|
||||
<div style="width: 99%">
|
||||
<el-select clearable filterable placeholder="请选择参加人员范围" style="width: 99%"
|
||||
v-model="formData.activityGroupId">
|
||||
<el-option
|
||||
:label="item.groupName"
|
||||
:value="item.groupId"
|
||||
v-for="item in activityGroupList"
|
||||
:key="item.groupId"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div>
|
||||
<el-button @click="$refs.drawerUserScope.userScopeDialog = true" type="primary">设置
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="活动内容" prop="content">
|
||||
<text-editor v-model="formData.content"></text-editor>
|
||||
</el-form-item>
|
||||
<!--<el-form-item label="活动介绍" prop="introduce">
|
||||
<text-editor v-model="formData.introduce"></text-editor>
|
||||
</el-form-item>
|
||||
<el-form-item label="奖励方式" prop="rewardMethod">
|
||||
<text-editor v-model="formData.rewardMethod"></text-editor>
|
||||
</el-form-item>-->
|
||||
<el-form-item label="活动封面">
|
||||
<file-upload
|
||||
:upload_number="1"
|
||||
:value.sync="formData.cover"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
complete_result
|
||||
upload_mode="image"
|
||||
upload_result_category="interval"
|
||||
></file-upload>
|
||||
</el-form-item>
|
||||
<el-form-item label="配色" prop="activityColor">
|
||||
<el-color-picker v-model="formData.activityColor" show-alpha></el-color-picker>
|
||||
</el-form-item>
|
||||
<el-form-item prop="enable" label="状态">
|
||||
<el-radio-group v-model="formData.enable" size="small">
|
||||
<el-radio :label="true" border>开启</el-radio>
|
||||
<el-radio :label="false" border>关闭</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-row class="mt20" justify="end" type="flex">
|
||||
<el-button @click="close">取消</el-button>
|
||||
<el-button type="primary" v-if="formData.isSubmit!=true" plain @click="doSave">保存</el-button>
|
||||
<el-button type="primary" @click="doSubmit">确定</el-button>
|
||||
</el-row>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<drawer-user-scope :group_id.sync="formData.activityGroupId" @group_change="getActivityGroup"
|
||||
ref="drawerUserScope"></drawer-user-scope>
|
||||
|
||||
<el-dialog :close-on-click-modal="false" :visible.sync="settingDialogVisible" title="更多设置" top="4%" width="40%">
|
||||
<el-form :model="currentWorksType" label-width="160px" size="small">
|
||||
<el-form-item label="作品介绍最多字数">
|
||||
<el-input-number :max="10000" :min="1" style="width: 100%"
|
||||
v-model="currentWorksType.maxWordCount"></el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="允许上传的文件类型" prop="allowFileTypes">
|
||||
<el-checkbox-group v-model="currentWorksType.allowFileTypes">
|
||||
<el-checkbox key="jpg" label="jpg">jpg</el-checkbox>
|
||||
<el-checkbox key="jpeg" label="jpeg">jpeg</el-checkbox>
|
||||
<el-checkbox key="png" label="png">png</el-checkbox>
|
||||
<el-checkbox key="mp3" label="mp3">mp3</el-checkbox>
|
||||
<el-checkbox key="mp4" label="mp4">mp4</el-checkbox>
|
||||
<el-checkbox key="docx" label="docx">docx</el-checkbox>
|
||||
<el-checkbox key="xlsx" label="xlsx">xlsx</el-checkbox>
|
||||
<el-checkbox key="pdf" label="pdf">pdf</el-checkbox>
|
||||
<el-checkbox key="zip" label="zip">zip</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="允许上传的文件数量" prop="allowFileNum">
|
||||
<el-input-number :max="10000" :min="1" style="width: 100%"
|
||||
v-model="currentWorksType.allowFileNum"></el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="单个文件大小(kb)" prop="allowSingleFileSize">
|
||||
<el-input-number :min="1" style="width: 100%"
|
||||
v-model="currentWorksType.allowSingleFileSize"></el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="总文件大小(kb)" prop="allowTotalFileSize">
|
||||
<el-input-number :min="1" style="width: 100%"
|
||||
v-model="currentWorksType.allowTotalFileSize"></el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<!-- <div class="left-span-label">上传图片设置</div>-->
|
||||
|
||||
<!-- <el-form-item label="是否上传图片">-->
|
||||
<!-- <el-radio :label="true" border v-model="currentWorksType.isUploadPhoto">上传</el-radio>-->
|
||||
<!-- <el-radio :label="false" border v-model="currentWorksType.isUploadPhoto">不上传</el-radio>-->
|
||||
<!-- </el-form-item>-->
|
||||
|
||||
<!-- <template v-if="currentWorksType.isUploadPhoto === true">-->
|
||||
<!-- <el-form-item label="上传图片数量">-->
|
||||
<!-- <el-input-number :max="5" :min="1" style="width: 100%" v-model="currentWorksType.photoNum"></el-input-number>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item label="上传图片格式">-->
|
||||
<!-- <el-checkbox-group v-model="currentWorksType.photoType">-->
|
||||
<!-- <el-checkbox border key="jpg" label="jpg">jpg</el-checkbox>-->
|
||||
<!-- <el-checkbox border key="png" label="png">png</el-checkbox>-->
|
||||
<!-- <el-checkbox border key="jpeg" label="jpeg">jpeg</el-checkbox>-->
|
||||
<!-- </el-checkbox-group>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item label="每张图片大小">-->
|
||||
<!-- <el-input placeholder="请填写每张图片大小" type="number" v-model="currentWorksType.photoSize">-->
|
||||
<!-- <template slot="append">Mb</template>-->
|
||||
<!-- </el-input>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </template>-->
|
||||
|
||||
<!-- <div class="left-span-label">上传音/视频、文档设置</div>-->
|
||||
|
||||
<!-- <el-form-item label="是否上传音/视频、文档">-->
|
||||
<!-- <el-radio :label="true" border v-model="currentWorksType.isUploadOther">上传</el-radio>-->
|
||||
<!-- <el-radio :label="false" border v-model="currentWorksType.isUploadOther">不上传</el-radio>-->
|
||||
<!-- </el-form-item>-->
|
||||
|
||||
<!-- <template v-if="currentWorksType.isUploadOther === true">-->
|
||||
<!-- <el-form-item label="文件上传数量">-->
|
||||
<!-- <el-input-number :max="5" :min="1" style="width: 100%" v-model="currentWorksType.otherFileNum"></el-input-number>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item label="上传文件格式">-->
|
||||
<!-- <el-checkbox-group v-model="currentWorksType.otherType">-->
|
||||
<!-- <el-checkbox key="mp3" label="mp3">mp3</el-checkbox>-->
|
||||
<!-- <el-checkbox key="mp4" label="mp4">mp4</el-checkbox>-->
|
||||
<!-- <el-checkbox key="docx" label="docx">docx</el-checkbox>-->
|
||||
<!-- <el-checkbox key="xlsx" label="xlsx">xlsx</el-checkbox>-->
|
||||
<!-- <el-checkbox key="pdf" label="pdf">pdf</el-checkbox>-->
|
||||
<!-- </el-checkbox-group>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item label="每个文件大小">-->
|
||||
<!-- <el-input placeholder="请填写每个文件大小" type="number" v-model="currentWorksType.otherSize">-->
|
||||
<!-- <template slot="append">Mb</template>-->
|
||||
<!-- </el-input>-->
|
||||
<!-- </el-form-item>-->
|
||||
</template>
|
||||
</el-form>
|
||||
|
||||
<el-row class="mt20" justify="end" type="flex">
|
||||
<el-button @click="settingDialogVisible=false">取消</el-button>
|
||||
<el-button @click="settingDialogVisible = false" type="primary">确定</el-button>
|
||||
</el-row>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
activityGroupList: [],
|
||||
dialogFormVisible: false,
|
||||
formRules: {
|
||||
name: [{required: true, message: "必填", trigger: ["change", "blur"]}],
|
||||
activityTime: [{required: true, message: "必填", trigger: ["change", "blur"]}],
|
||||
content: [{required: true, message: "必填", trigger: ["change", "blur"]}],
|
||||
subjectTypes: [{required: true, message: "必填", trigger: ["change", "blur"]}],
|
||||
enable: [{required: true, message: "必填", trigger: ["change", "blur"]}]
|
||||
},
|
||||
currentWorksType: {
|
||||
allowFileTypes: [],
|
||||
},
|
||||
settingDialogVisible: false,
|
||||
colorList: ["#081776", "#31cab1", "#e54242", "#ff8939", "#ffb712", "#1dc47b", "#4495f7", "#ff5e8b", "#5d6e7f"],
|
||||
pageForm: {
|
||||
activityTime: []
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue")
|
||||
},
|
||||
watch: {
|
||||
"formData.activityGroupId": {
|
||||
async handler(newVal, oldVal) {
|
||||
this.activityGroupList = await this.getActivityGroup()
|
||||
this.userScopeDialog = false
|
||||
},
|
||||
deep: true
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async getActivityGroup() {
|
||||
const {data} = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup")
|
||||
return data
|
||||
},
|
||||
addType(index) {
|
||||
let item = {}
|
||||
this.initData(item)
|
||||
this.formData.subjectTypes.splice(index + 1, 0, {worksTypes: [item]})
|
||||
},
|
||||
openSetting(worksType) {
|
||||
this.currentWorksType = worksType
|
||||
this.settingDialogVisible = true
|
||||
},
|
||||
addWorksType(type, worksIndex) {
|
||||
let item = {}
|
||||
this.initData(item)
|
||||
type.worksTypes.splice(worksIndex + 1, 0, item)
|
||||
},
|
||||
initData(worksType) {
|
||||
this.$set(worksType, "maxWordCount", worksType.maxWordCount ? worksType.maxWordCount : 100)
|
||||
this.$set(worksType, "isUploadPhoto", worksType.isUploadPhoto ? worksType.isUploadPhoto : false)
|
||||
this.$set(worksType, "photoType", worksType.photoType ? worksType.photoType : ["jpg"])
|
||||
this.$set(worksType, "photoNum", worksType.photoNum ? worksType.photoNum : 1)
|
||||
this.$set(worksType, "photoSize", worksType.photoSize ? worksType.photoSize : 2)
|
||||
|
||||
this.$set(worksType, "isUploadOther", worksType.isUploadOther ? worksType.isUploadOther : false)
|
||||
this.$set(worksType, "otherType", worksType.otherType ? worksType.otherType : ["mp4", "docx"])
|
||||
this.$set(worksType, "otherFileNum", worksType.otherFileNum ? worksType.otherFileNum : 1)
|
||||
this.$set(worksType, "otherSize", worksType.otherSize ? worksType.otherSize : 2)
|
||||
|
||||
this.$set(worksType, "allowFileTypes", worksType.allowFileTypes ? worksType.allowFileTypes : [])
|
||||
},
|
||||
openAdd() {
|
||||
this.$refs.guava.edit()
|
||||
this.$nextTick(() => {
|
||||
this.formData = {
|
||||
nbCount: 0,
|
||||
activityColor: this.colorList[0],
|
||||
subjectTypes: [{worksTypes: [{}]}],
|
||||
enable: true
|
||||
}
|
||||
this.initData(this.formData.subjectTypes[0].worksTypes[0])
|
||||
})
|
||||
},
|
||||
async openEdit(id) {
|
||||
const resp = await this.$axios.post(loc() + "/findOne", {id})
|
||||
this.formData = resp.data
|
||||
this.$set(this.formData, "activityTime", [this.formData.startDateTime, this.formData.endDateTime])
|
||||
// this.formData.activityTime = [this.formData.startDateTime, this.formData.endDateTime]
|
||||
if (this.formData.nbStartDateTime && this.formData.nbEndDateTime) {
|
||||
// this.formData.nbTime = [this.formData.nbStartDateTime, this.formData.nbEndDateTime]
|
||||
this.$set(this.formData, "nbTime", [this.formData.nbStartDateTime, this.formData.nbEndDateTime])
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.$refs.guava.edit()
|
||||
})
|
||||
},
|
||||
close() {
|
||||
this.$refs.guava.index()
|
||||
},
|
||||
doSubmit() {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (valid) {
|
||||
this.formData.startDateTime = this.formData.activityTime[0]
|
||||
this.formData.endDateTime = this.formData.activityTime[1]
|
||||
this.formData.nbStartDateTime = this.formData.nbTime[0]
|
||||
this.formData.nbEndDateTime = this.formData.nbTime[1]
|
||||
this.formData.type = "1"
|
||||
let loading = this.$loading({
|
||||
lock: true,
|
||||
text: "数据正在提交中,请稍后...",
|
||||
spinner: "el-icon-loading",
|
||||
background: "rgba(0, 0, 0, 0.7)"
|
||||
})
|
||||
this.$axios.post(loc() + (this.formData.id ? "/update" : "/insert"), {data: JSON.stringify(this.formData)}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
this.$refs.guava.index()
|
||||
} else {
|
||||
this.$message.warning(res.msg)
|
||||
}
|
||||
loading.close()
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
doSave() {
|
||||
this.formData.startDateTime = this.formData.activityTime[0]
|
||||
this.formData.endDateTime = this.formData.activityTime[1]
|
||||
this.formData.nbStartDateTime = this.formData.nbTime[0]
|
||||
this.formData.nbEndDateTime = this.formData.nbTime[1]
|
||||
this.formData.type = "1"
|
||||
let loading = this.$loading({
|
||||
lock: true,
|
||||
text: "数据正在保存中,请稍后...",
|
||||
spinner: "el-icon-loading",
|
||||
background: "rgba(0, 0, 0, 0.7)"
|
||||
})
|
||||
this.$axios.post("/platform/activity/worksCollection/manage" + (this.formData.id ? "/update" : "/insert"), {data: JSON.stringify(this.formData)}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
this.$refs.guava.index()
|
||||
} else {
|
||||
this.$message.warning(res.msg)
|
||||
}
|
||||
loading.close()
|
||||
})
|
||||
},
|
||||
doDelete(id) {
|
||||
this.$confirm("您确定要删除吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(() => {
|
||||
this.$axios.post(loc() + "/delete", {id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
enableChange(enable, id) {
|
||||
this.$axios.post(loc() + "/enableChange", {id, enable}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
//发送通知
|
||||
sendNotice(id) {
|
||||
this.$confirm("您确定要发送通知吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(() => {
|
||||
const loading = this.$loading({
|
||||
lock: true,
|
||||
text: '发送中',
|
||||
spinner: 'el-icon-loading',
|
||||
background: 'rgba(0, 0, 0, 0.7)'
|
||||
});
|
||||
this.$axios.post("/platform/activity/worksCollection/manage/sendNotice", {id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
}
|
||||
}).finally(() => {
|
||||
loading.close()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
},
|
||||
async created() {
|
||||
this.activityGroupList = await this.getActivityGroup()
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,176 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker
|
||||
placeholder="按年度查询"
|
||||
type="year"
|
||||
style="width: 100%"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
@change="listActivity"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动主题">
|
||||
<el-select clearable placeholder="请选择活动主题" v-model="pageForm.activityId" @change="activityChange">
|
||||
<el-option v-for="item in activityOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="主题类型">
|
||||
<el-select clearable placeholder="请选择主题类型" v-model="pageForm.subjectId" @change="subjectChange" style="width: 100%">
|
||||
<el-option v-for="item in subjectTypesOptions" :key="item.id" :label="item.typeName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="作品类型">
|
||||
<el-select clearable placeholder="请选择主题作品类型" v-model="pageForm.worksId" style="width: 100%">
|
||||
<el-option v-for="item in worksTypeOptions" :key="item.id" :label="item.worksTypeName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="工号/姓名">
|
||||
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入内容"></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会">
|
||||
<el-select clearable filterable placeholder="分工会" v-model="pageForm.unionId" @change="pageForm.unitId=null;listUnit();">
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unionOptions"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位">
|
||||
<el-select clearable filterable placeholder="提案单位" v-model="pageForm.unitId">
|
||||
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitOptions"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never">
|
||||
<table-tool label="作品列表">
|
||||
<el-button size="small" type="primary" @click="exportExcel">导出Excel</el-button>
|
||||
<el-button size="small" type="primary" @click="exportWorks">导出作品</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%" row-key="id">
|
||||
<el-table-column label="序号" type="index" width="60px" :index="indexMethod"></el-table-column>
|
||||
<el-table-column label="活动主题" prop="activityName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="作品名称" prop="name" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="主题类型" prop="subjectName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="作品类型" prop="worksName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="姓名" prop="userName"></el-table-column>
|
||||
<el-table-column label="工号" prop="loginName"></el-table-column>
|
||||
<el-table-column label="单位" prop="unitName"></el-table-column>
|
||||
<el-table-column label="分工会" prop="unionName"></el-table-column>
|
||||
<el-table-column label="上传时间" prop="createdAt">
|
||||
<template scope="scope">
|
||||
<span>{{$moment(scope.row.createdAt).format( 'YYYY-MM-DD')}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="primary" @click="$refs.auInfoRef.onOpen(scope.row.id)">查看</el-button>
|
||||
<el-button size="mini" type="danger" @click="doDelete(scope.row.id)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<au-info ref="auInfoRef"></au-info>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("../common/info.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"au-info": AU_INFO_TEMPLATE
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
year: new Date().getFullYear().toString(),
|
||||
activityId: null
|
||||
},
|
||||
activityOptions: [],
|
||||
subjectTypesOptions: [],
|
||||
worksTypeOptions: [],
|
||||
unionOptions: [],
|
||||
unitOptions: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
typeOptions() {
|
||||
if (this.pageForm.activityId) {
|
||||
return this.activityOptions.find((v) => v.id === this.pageForm.activityId)?.subjectTypes
|
||||
}
|
||||
return []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
exportExcel() {
|
||||
this.$downLoad(loc() + "/exportExcel", this.pageForm)
|
||||
},
|
||||
exportWorks() {
|
||||
this.$downLoad(loc() + "/exportWorks", this.pageForm)
|
||||
},
|
||||
doDelete(id) {
|
||||
this.$confirm("您确定要删除吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(() => {
|
||||
this.$axios.post(loc() + "/delete", { id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
listActivity() {
|
||||
this.$axios.post("/platform/activity/worksCollection/common/listActivity").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.activityOptions = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
activityChange(value) {
|
||||
this.$set(this.pageForm, "subjectId", null)
|
||||
this.$set(this.pageForm, "worksId", null)
|
||||
this.$axios.post("/platform/activity/worksCollection/common/getSubjectTypes", { activityId: value }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.subjectTypesOptions = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
async subjectChange(value) {
|
||||
this.$set(this.pageForm, "worksId", null)
|
||||
const resp = await this.$axios.post("/platform/activity/worksCollection/common/getWorksTypes", { subjectId: value })
|
||||
if (resp.code === 0) {
|
||||
this.worksTypeOptions = resp.data
|
||||
}
|
||||
},
|
||||
listUnion() {
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
},
|
||||
listUnit() {
|
||||
this.$businessTool.listUnit(this.pageForm.unionId).then((res) => (this.unitOptions = res))
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.listActivity()
|
||||
this.pageData()
|
||||
this.listUnion()
|
||||
this.listUnit()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,175 @@
|
||||
const AU_FORM_TEMPLATE = {
|
||||
template: /*language=HTML*/ `
|
||||
<el-dialog :title="formData.id ? '编辑':'新增'" :visible.sync="dialogFormVisible" width="60%"
|
||||
:close-on-click-modal="false">
|
||||
<el-form :model="formData" ref="formRef" size="small" label-width="80px" :rules="formRules">
|
||||
<el-form-item label="活动主题" prop="activityId">
|
||||
<el-select clearable placeholder="请输入内容" v-model="formData.activityId" @change="activityChange"
|
||||
style="width: 100%">
|
||||
<el-option v-for="item in activityOptions" :key="item.id" :label="item.name"
|
||||
:value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="主题类型" prop="subjectId">
|
||||
<el-select clearable placeholder="请选择主题类型" v-model="formData.subjectId"
|
||||
@change="subjectChange" style="width: 100%">
|
||||
<el-option v-for="item in subjectTypesOptions" :key="item.id" :label="item.typeName"
|
||||
:value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="作品类型" prop="worksId">
|
||||
<el-select clearable placeholder="请选择主题作品类型" v-model="formData.worksId" style="width: 100%"
|
||||
@change="worksTypeChange">
|
||||
<el-option v-for="item in worksTypeOptions" :key="item.id" :label="item.worksTypeName"
|
||||
:value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="作品名称" prop="name">
|
||||
<el-input v-model="formData.name" clearable placeholder="请输入作品名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="作品描述" prop="description">
|
||||
<el-input v-model="formData.description" type="textarea" :autosize="{ minRows: 2, maxRows: 4}"
|
||||
clearable placeholder="请输入作品描述"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="附件" prop="files">
|
||||
<file-upload
|
||||
:value.sync="formData.files"
|
||||
:upload_number="chooseWorksType && chooseWorksType.allowFileNum"
|
||||
upload_mode="drag"
|
||||
upload_result_category="array"
|
||||
complete_result
|
||||
:accept="fileAccept"
|
||||
></file-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="doSubmit">提 交</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
`,
|
||||
data() {
|
||||
return {
|
||||
dialogFormVisible: false,
|
||||
formData: {},
|
||||
formRules: {
|
||||
activityId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
subjectId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
worksId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
name: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
description: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
|
||||
files: [{ required: true, message: "必填", trigger: ["change", "blur"] }]
|
||||
},
|
||||
activityOptions: [],
|
||||
subjectTypesOptions: [],
|
||||
worksTypeOptions: [],
|
||||
|
||||
chooseWorksType: {},
|
||||
upload_text: "",
|
||||
fileAccept: null
|
||||
}
|
||||
},
|
||||
computed: {},
|
||||
methods: {
|
||||
worksTypeChange(val) {
|
||||
this.chooseWorksType = this.worksTypeOptions.find((o) => o.id === val)
|
||||
this.fileUploadNum = this.chooseWorksType.allowFileNum
|
||||
if (this.chooseWorksType.allowFileTypes && this.chooseWorksType.allowFileTypes.length > 0) {
|
||||
const allowFileTypes = this.chooseWorksType.allowFileTypes.join(",")
|
||||
this.upload_text = "请上传<span style='color: red'>" + allowFileTypes + "</span>格式的文件"
|
||||
this.fileAccept = this.chooseWorksType.allowFileTypes.map((item) => "." + item).join(",")
|
||||
} else {
|
||||
this.upload_text = ""
|
||||
}
|
||||
},
|
||||
onOpen(id) {
|
||||
this.dialogFormVisible = true
|
||||
if (id) {
|
||||
this.$axios.post(loc() + "/findOne", { id }).then(async (res) => {
|
||||
if (res.code === 0) {
|
||||
this.formData = res.data
|
||||
this.activityChange(this.formData.activityId)
|
||||
await this.subjectChange(this.formData.subjectId)
|
||||
this.worksTypeChange(this.formData.worksId)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.$nextTick(() => {
|
||||
this.formData = {
|
||||
subjectTypes: []
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
// getFileExtension(filename) {
|
||||
// // 使用正则表达式匹配文件后缀
|
||||
// const match = filename.match(/\.(\w+)$/)
|
||||
// if (match) {
|
||||
// // 如果匹配成功,返回第一个捕获组,即文件后缀名
|
||||
// return match[1]
|
||||
// } else {
|
||||
// // 如果没有匹配到,返回空字符串
|
||||
// return ""
|
||||
// }
|
||||
// },
|
||||
doSubmit() {
|
||||
// if (
|
||||
// this.formData.files &&
|
||||
// this.formData.files.length > 0 &&
|
||||
// this.chooseWorksType.allowFileTypes &&
|
||||
// this.chooseWorksType.allowFileTypes.length > 0
|
||||
// ) {
|
||||
// for (let i = 1; i <= this.formData.files.length; i++) {
|
||||
// const file = this.formData.files[i - 1]
|
||||
// const suffixName = this.getFileExtension(file.name)
|
||||
// if (!this.chooseWorksType.allowFileTypes.includes(suffixName)) {
|
||||
// this.$message.warning("此次活动不支持上传" + suffixName + "格式的文件")
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
this.$confirm("您确定要提交吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (valid) {
|
||||
this.$axios.post(loc() + (this.formData.id ? "/update" : "/insert"), { data: JSON.stringify(this.formData) }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.dialogFormVisible = false
|
||||
this.$message.success(res.msg)
|
||||
this.$emit("refresh")
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
listActivity() {
|
||||
this.$axios.post("/platform/activity/worksCollection/upload/listPerMissionActivity").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.activityOptions = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
activityChange(value) {
|
||||
this.$axios.post("/platform/activity/worksCollection/common/getSubjectTypes", { activityId: value }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.subjectTypesOptions = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
async subjectChange(value) {
|
||||
const resp = await this.$axios.post("/platform/activity/worksCollection/common/getWorksTypes", { subjectId: value })
|
||||
if (resp.code === 0) {
|
||||
this.worksTypeOptions = resp.data
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.listActivity()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker
|
||||
placeholder="按年度查询"
|
||||
type="year"
|
||||
v-model="pageForm.year"
|
||||
value-format="yyyy"
|
||||
@change="listActivity"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动主题">
|
||||
<el-select clearable placeholder="请选择活动主题" v-model="pageForm.activityId" @change="activityChange">
|
||||
<el-option v-for="item in activityOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="主题类型">
|
||||
<el-select clearable placeholder="请选择主题类型" v-model="pageForm.subjectId" @change="subjectChange" style="width: 100%">
|
||||
<el-option v-for="item in subjectTypesOptions" :key="item.id" :label="item.typeName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="作品类型">
|
||||
<el-select clearable placeholder="请选择主题作品类型" v-model="pageForm.worksId" style="width: 100%" @change="worksTypeChange">
|
||||
<el-option v-for="item in worksTypeOptions" :key="item.id" :label="item.worksTypeName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" label="作品列表">
|
||||
<table-tool>
|
||||
<el-button size="mini" type="primary" icon="el-icon-plus" @click="$refs.auFormRef.onOpen()">上传作品</el-button>
|
||||
</table-tool>
|
||||
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%" row-key="id">
|
||||
<el-table-column label="序号" type="index" width="60px" :index="indexMethod"></el-table-column>
|
||||
<el-table-column label="活动主题" prop="name" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="作品名称" prop="name" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="主题类型" prop="subjectName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="作品类型" prop="worksName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="姓名" prop="userName"></el-table-column>
|
||||
<el-table-column label="工号" prop="loginName"></el-table-column>
|
||||
<el-table-column label="单位" prop="unitName"></el-table-column>
|
||||
<el-table-column label="分工会" prop="unionName"></el-table-column>
|
||||
<el-table-column label="上传时间" prop="createdAt">
|
||||
<template scope="scope">
|
||||
<span>{{$moment(scope.row.createdAt).format('YYYY-MM-DD')}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="300">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="primary" @click="$refs.auInfoRef.onOpen(scope.row.id)">查看</el-button>
|
||||
<el-button size="mini" type="primary" @click="$refs.auFormRef.onOpen(scope.row.id)">编辑</el-button>
|
||||
<el-button size="mini" type="danger" @click="doDelete(scope.row.id)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<au-form ref="auFormRef" @refresh="doSearch"></au-form>
|
||||
|
||||
<au-info ref="auInfoRef"></au-info>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
<!--#include("auForm.js"){}#-->
|
||||
<!--#include("../common/info.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"au-form": AU_FORM_TEMPLATE,
|
||||
"au-info": AU_INFO_TEMPLATE
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
year: new Date().getFullYear().toString(),
|
||||
activityId: null
|
||||
},
|
||||
activityOptions: [],
|
||||
subjectTypesOptions: [],
|
||||
worksTypeOptions: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
typeOptions() {
|
||||
if (this.pageForm.activityId) {
|
||||
return this.activityOptions.find((v) => v.id === this.pageForm.activityId)?.subjectTypes
|
||||
}
|
||||
return []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
doDelete(id) {
|
||||
this.$confirm("您确定要删除吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(() => {
|
||||
this.$axios.post(loc() + "/delete", { id }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
listActivity() {
|
||||
this.$axios.post("/platform/activity/worksCollection/upload/listPerMissionActivity").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.activityOptions = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
activityChange(value) {
|
||||
this.$set(this.pageForm, "subjectId", null)
|
||||
this.$set(this.pageForm, "worksId", null)
|
||||
this.$axios.post("/platform/activity/worksCollection/common/getSubjectTypes", { activityId: value }).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.subjectTypesOptions = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
async subjectChange(value) {
|
||||
this.$set(this.pageForm, "worksId", null)
|
||||
const resp = await this.$axios.post("/platform/activity/worksCollection/common/getWorksTypes", { subjectId: value })
|
||||
if (resp.code === 0) {
|
||||
this.worksTypeOptions = resp.data
|
||||
}
|
||||
},
|
||||
|
||||
worksTypeChange(val) {
|
||||
console.log(val)
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.listActivity()
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
Reference in New Issue
Block a user