first commit

This commit is contained in:
那些花儿
2025-07-14 08:45:13 +08:00
commit 3e86198a82
2710 changed files with 610330 additions and 0 deletions
@@ -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>
<!--#
}
#-->
@@ -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()
}
}
@@ -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>
<!--#
}
#-->
@@ -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()
}
}
@@ -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>
<!--#
}
#-->
@@ -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>
<!--#
}
#-->
@@ -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>
<!--#
}
#-->
@@ -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>
<!--#
}
#-->
@@ -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>
&emsp13; 教练:
<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="姓&emsp;&emsp;名" 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="电&emsp;&emsp;话" 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="姓&emsp;&emsp;名" 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="电&emsp;&emsp;话" 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>
<!--#
}
#-->
@@ -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>
<!--#
}
#-->
@@ -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>
<!--#
}
#-->
@@ -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>
<!--#
}
#-->
@@ -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>&nbsp;</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>
<!--#
}
#-->
@@ -0,0 +1,136 @@
let ADDRESS_DIALOG = {
template: `
<el-dialog
:append-to-body="true"
:modal-append-to-body="false"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
title="收货地址"
width="30%">
<el-form :model="formData" label-position="right"
label-suffix="" label-width="120px" ref="addForm">
<el-row :gutter="60">
<el-col :span="24">
<el-form-item :rules="{required:true,message: '请选择地址信息', trigger: 'blur'}"
label="地址信息"
prop="addressList">
<el-cascader
:options="dzOptions"
:props="{ expandTrigger: 'hover' }"
@change="handleChange"
clearable
placeholder="请选择地址信息"
style="width: 100%"
v-model="formData.addressList"></el-cascader>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
:rules="{required:true,message: '请填写您的详细地址', trigger: 'blur'}"
label="详细地址"
prop="addressDetail">
<el-input maxlength="100"
placeholder="请输入详细地址信息,如道路、门牌号、小区、楼栋号、单元等信息"
rows="3"
show-word-limit
type="textarea"
v-model="formData.addressDetail"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
:rules="{required:true,message: '请填写收货人姓名', trigger: 'blur'}"
label="收货人姓名"
prop="userName">
<el-input maxlength="11"
placeholder="请填写收货人姓名"
v-model="formData.userName"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
:rules="{required:true,message: '请填写手机号码', trigger: 'blur'}"
label="手机号码"
prop="tel">
<el-input maxlength="11" placeholder="请填写手机号码"
type="tel"
v-model="formData.tel"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button @click="doSaveUserAddress" type="primary">保存</el-button>
</span>
</el-dialog>
`,
mixins: [initTableMixins],
data() {
return {
dzOptions: chengShiList,
dialogVisible: false,
}
},
methods: {
handleChange(val) {
if (val) {
let provinceName = ""
let cityName = ""
let countyName = ""
const province = this.dzOptions.find(c => c.value === val[0])
provinceName = province.label
const city = province.children.find(p => p.value === val[1])
cityName = city.label
if (val.length === 3) {
const county = city.children.find(p => p.value === val[2])
countyName = county.label
this.$set(this.formData, "areaCode", county.value)
} else {
this.$set(this.formData, "areaCode", city.value)
}
this.$set(this.formData, "province", provinceName)
this.$set(this.formData, "city", cityName)
this.$set(this.formData, "county", countyName)
}
},
doSaveUserAddress() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const resp = await this.$axios.post("/platform/benefit/address/doSaveUserAddress", {data: JSON.stringify(this.formData)})
if (resp.code === 0) {
this.$message({
message: resp.msg,
type: 'success'
});
this.$emit("select_user_address")
this.dialogVisible = false
} else {
this.$message.error(resp.msg);
}
}
})
},
openEdit(row) {
row.addressList = []
const province = chengShiList.find(c => c.label === row.province)
row.addressList.push(province.value)
const city = province.children.find(p => p.label === row.city)
row.addressList.push(city.value)
if (row.county){
const county = city.children.find(p => p.label === row.county)
if (county) {
row.addressList.push(county.value)
}
}
this.formData = row
this.dialogVisible = true
},
}
}
<!--#include("/platform/zhgh/welfare/include/chengSh.js"){}#-->
@@ -0,0 +1,145 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<table-tool :app="this" label="收货地址">
<el-button @click="openAddress" size="small" type="primary">新增地址</el-button>
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
ref="table"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
>
<el-table-column 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"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='address'">{{row.province}} {{row.city}} {{row.county}}</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="是否默认地址" width="110px">
<template slot-scope="scope">
<el-tag size="mini" v-if="scope.row.isDefault" type="success" effect="plain"></el-tag>
<el-tag size="mini" v-else type="info" effect="plain"></el-tag>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" prop="userOnline" width="170px">
<template scope="{row}">
<el-button @click="openEdit(row)" size="mini" type="primary">修改</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="" prop="userOnline" width="170px">
<template scope="{row}">
<span v-if="row.isDefault">
<el-tag type="danger">默认地址</el-tag>
</span>
<span v-else>
<el-button @click="doDefault(row)" size="mini" type="primary">设为默认</el-button>
</span>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
</guava>
<address-dialog ref="addressDialog" @select_user_address="selectUserAddress"></address-dialog>
</div>
<script>
<!--#include("addressDialog.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
dzOptions: chengShiList,
dialogVisible: false,
tableColumns: [
{ prop: "userName", label: "收货人" },
{ prop: "address", label: "所在地区" },
{ prop: "addressDetail", label: "详细地址" },
{ prop: "tel", label: "电话" }
]
}
},
components: {
"address-dialog": ADDRESS_DIALOG
},
methods: {
selectUserAddress() {
this.pageData()
},
pageData() {
this.tableLoading = true
this.$axios.post("/platform/benefit/address/selectUserAddress", this.pageForm).then((resp) => {
this.tableLoading = false
if (resp.code === 0) {
this.tableData = resp.data
} else {
this.$message.error(resp.msg)
}
})
},
openAddress() {
this.$refs.addressDialog.dialogVisible = true
this.$refs.addressDialog.formData = {}
},
doDelete(id) {
this.$confirm("此操作将永久删除该地址, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/benefit/address/deleteAddress", { id: id })
if (resp.code === 0) {
this.doSearch()
this.$message({
type: "success",
message: resp.msg
})
} else {
this.$message.error(resp.msg)
}
})
},
openEdit(row) {
this.$refs.addressDialog.dialogVisible = true
this.$refs.addressDialog.openEdit(row)
},
async doDefault(row) {
const resp = await this.$axios.post(loc() + "/doDefault", { id: row.id })
if (resp.code === 0) {
this.doSearch()
this.$message({
type: "success",
message: resp.msg
})
} else {
this.$message.error(resp.msg)
}
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,388 @@
let BENEFIT_GOODS_FORM = {
/*language=HTML*/
template: `
<div>
<el-dialog :title="formData.id ? '编辑商品' : '新增商品'"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="60%">
<el-form :model="formData" ref="formRef" :rules="formRules"
label-width="0" class="benefitGoodsForm">
<el-descriptions border class="descriptions-form" :column="2">
<el-descriptions-item label="商品名称">
<el-form-item prop="name" label="">
<el-input maxlength="40" placeholder="商品名称" show-word-limit
v-model="formData.name"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所需积分">
<el-form-item prop="money" label="">
<el-input-number :max="9999" :precision="2" placeholder="所需积分"
v-model="formData.money"
:min="1"
style="width: 100%"></el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="发放形式">
<el-form-item prop="goodsProvideMode" label="">
<dict-select clearable code="BENEFIT_GOODS_PROVIDE_MODE"
placeholder="请选择发放形式"
v-model="formData.goodsProvideMode"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="排序">
<el-form-item prop="goodsSort" label="">
<el-input-number :max="9999" placeholder="排序"
v-model="formData.goodsSort"
:min="1"
style="width: 100%"></el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属一级分类">
<el-form-item prop="goodsCategoryOneLevelId" label="">
<el-select v-model="formData.goodsCategoryOneLevelId"
placeholder="请选择所属一级分类" style="width: 100%"
@change="goodsCategoryOneLevelChange">
<el-option
v-for="item in goodsCategoryOneLevelOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属二级分类">
<el-form-item prop="goodsCategoryTwoLevelId" label="">
<el-select v-model="formData.goodsCategoryTwoLevelId"
placeholder="请选择所属二级分类" style="width: 100%">
<el-option
v-for="item in goodsCategoryTwoLevelOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="简短描述" span="2">
<el-form-item prop="simpleDesc" label="">
<el-input maxlength="80" placeholder="简短描述" show-word-limit
v-model="formData.simpleDesc"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="商品规格"
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_POST'
||formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOPPING'">
<el-button type="primary" size="mini"
@click="goodsSpecificationsVisibleDialog = true">
点击设置商品规格
</el-button>
</el-descriptions-item>
<el-descriptions-item label="门店地址"
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOP'">
<el-button type="primary" size="mini"
@click="goodsShopAddressVisibleDialog = true">
点击设置门店地址
</el-button>
</el-descriptions-item>
<el-descriptions-item label="邮寄发放配置"
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_POST'">
<el-button type="primary" size="mini"
@click="postProvideConfigVisibleDialog=true">点击设置邮寄发放配置
</el-button>
</el-descriptions-item>
<el-descriptions-item
v-if="formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOPPING'||
formData.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOP'"></el-descriptions-item>
<el-descriptions-item label="说明描述" span="2">
<el-form-item prop="description" label="">
<text-editor v-model="formData.description"></text-editor>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="图片" span="2">
<el-form-item prop="imgUrl" label="">
<file-upload :upload_number="5" :value.sync="formData.imgUrl"
accept=".jpg,.jpeg,.png"
class="imgUrl"
upload_result_type="url"
complete_result upload_mode="drag"
upload_result_category="array"></file-upload>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="主页展示" span="2">
<el-form-item prop="isHomepage" label="">
<el-radio-group v-model="formData.isHomepage">
<el-radio-button label="true">是</el-radio-button>
<el-radio-button label="false">否</el-radio-button>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item v-if="formData.isHomepage" label="主页轮播图片" span="2">
<el-form-item prop="carouselImgUrl" label="">
<file-upload :upload_number="1" :value.sync="formData.carouselImgUrl"
accept=".jpg,.jpeg,.png"
class="imgUrl"
upload_result_type="url"
complete_result upload_mode="drag"
upload_result_category="array"></file-upload>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false">取 消</el-button>
<el-button type="primary" @click="submit">提 交</el-button>
</span>
</el-dialog>
<el-dialog title="配置商品规格"
:visible.sync="goodsSpecificationsVisibleDialog"
:close-on-click-modal="false"
width="50%">
<el-table :data="formData.benefitGoodsSpecificationsList">
<el-table-column
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="规格名称">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="规格名称"
v-model="row.name"></el-input>
</template>
</el-table-column>
<el-table-column label="所需积分" width="150px">
<template slot-scope="{row}">
<el-input-number :max="9999" placeholder="所需积分"
v-model="row.points"
:min="1"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="排序" width="150px">
<template slot-scope="{row}">
<el-input-number :max="9999" placeholder="排序"
v-model="row.specificationsSort"
:min="1"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="图片">
<template slot-scope="{row}">
<file-upload :upload_number="5" :value.sync="row.imgUrl"
accept=".jpg,.jpeg,.png"
class="imgUrl"
upload_result_type="url"
complete_result upload_mode="file"
upload_result_category="array"></file-upload>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<template slot="header" slot-scope="scope">
<el-button @click="pushBenefitGoodsSpecifications" icon="el-icon-plus"
size="mini" type="primary">
添加
</el-button>
</template>
<template slot-scope="{row,$index}">
<el-button
@click="formData.benefitGoodsSpecificationsList.splice($index, 1)"
size="mini"
type="danger">删除
</el-button>
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="goodsSpecificationsVisibleDialog = false">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="邮寄发放配置"
:visible.sync="postProvideConfigVisibleDialog"
:close-on-click-modal="false"
width="40%">
<el-form :model="postProvideConfigFormData"
label-width="110px">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item prop="choiceProvince" label="可邮寄省份">
<el-select v-model="postProvideConfigFormData.choiceProvince"
placeholder="请选择可邮寄省份" clearable filterable
@change="choiceProvinceChange" style="width: 100%">
<el-option
v-for="item in provinceOptions"
:key="item.label"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="choiceMunicipality" label="可邮寄市">
<el-select v-model="postProvideConfigFormData.choiceMunicipality"
placeholder="请选择可邮寄市" clearable filterable
style="width: 100%">
<el-option
v-for="item in municipalityOptions"
:key="item.label"
:label="item.label"
:value="item.label">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="postProvideConfigVisibleDialog = false">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="添加门店地址"
:visible.sync="goodsShopAddressVisibleDialog"
:close-on-click-modal="false"
width="50%">
<el-table :data="formData.shopAddressList">
<el-table-column
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="门店地址">
<template slot-scope="{row}">
<el-input placeholder="门店地址" v-model="row.name"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<template slot="header" slot-scope="scope">
<el-button @click="formData.shopAddressList.push({name:''})"
icon="el-icon-plus"
size="mini" type="primary">
添加
</el-button>
</template>
<template slot-scope="{row,$index}">
<el-button
@click="formData.shopAddressList.splice($index, 1)"
size="mini"
type="danger">删除
</el-button>
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="goodsShopAddressVisibleDialog = false">确 定</el-button>
</span>
</el-dialog>
</div>
`,
mixins: [initTableMixins],
data() {
return {
goodsCategoryOneLevelOptions: [],
goodsCategoryTwoLevelOptions: [],
viewData: {},
visibleDialog: false,
goodsSpecificationsVisibleDialog: false,
postProvideConfigVisibleDialog: false,
goodsShopAddressVisibleDialog: false,
provinceOptions: chengShiList,
municipalityOptions: [],
postProvideConfigFormData: { choiceProvince: "", choiceMunicipality: "" },
formRules: {
name: [{ required: true, message: "必填", trigger: "blur" }],
money: [{ required: true, message: "必填", trigger: "blur" }],
goodsCategoryOneLevelId: [{ required: true, message: "必填", trigger: "blur" }],
goodsCategoryTwoLevelId: [{ required: true, message: "必填", trigger: "blur" }],
goodsSort: [{ required: true, message: "必填", trigger: "blur" }],
goodsProvideMode: [{ required: true, message: "必填", trigger: "blur" }],
description: [{ required: true, message: "必填", trigger: "blur" }]
}
}
}, methods: {
choiceProvinceChange(val) {
this.$set(this.postProvideConfigFormData, "choiceMunicipality", "")
this.municipalityOptions = chengShiList.find(v => v.label === val)?.children
},
goodsCategoryOneLevelChange(val) {
this.$set(this.formData, "goodsCategoryTwoLevelId", "")
this.goodsCategoryTwoLevelOptions = this.goodsCategoryOneLevelOptions.find(v => v.id === val)?.children
},
pushBenefitGoodsSpecifications() {
this.formData.benefitGoodsSpecificationsList.push({
name: "",
specificationsSort: this.formData.benefitGoodsSpecificationsList.length + 1,
imgUrl: ""
})
},
async open() {
this.formData = {
status: 1,
benefitGoodsSpecificationsList: [],
shopAddressList: [],
postProvideConfig: { choiceProvince: "", choiceMunicipality: "" },
isHomepage:false
}
this.visibleDialog = true
await this.getGoodsCategoryTree()
},
async findOne(id) {
const res = await this.$axios.post("/platform/benefit/goods/findOne", { id })
if (res.code === 0) {
return res.data
}
},
async openEdit(id) {
const data = await this.findOne(id)
data.imgUrl = JSON.parse(data.imgUrl)
data.carouselImgUrl = JSON.parse(data.carouselImgUrl)
data.shopAddressList = JSON.parse(data.shopAddressList)
this.formData = data
this.postProvideConfigFormData = JSON.parse(this.formData.postProvideConfig)
this.visibleDialog = true
await this.getGoodsCategoryTree()
this.goodsCategoryTwoLevelOptions = this.goodsCategoryOneLevelOptions.find(v => v.id === this.formData.goodsCategoryOneLevelId)?.children
},
async getGoodsCategoryTree() {
const res = await this.$axios.post("/platform/benefit/goods/getGoodsCategoryTree")
this.goodsCategoryOneLevelOptions = res.data
this.goodsCategoryTwoLevelOptions = []
},
submit() {
this.$refs.formRef.validate(valid => {
if (valid) {
if (this.formData.goodsProvideMode=="GOODS_PROVIDE_MODE_SHOPPING"&&this.formData.benefitGoodsSpecificationsList.length==0){
this.$message.warning("发放形式为商城兑换的商品需要设置商品规格")
return
}
this.formData.postProvideConfig = this.postProvideConfigFormData
this.$axios.post("/platform/benefit/goods/submit", { data: JSON.stringify(this.formData) }).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
this.visibleDialog = false
this.$emit("query")
}
})
}
})
}
}
}
<!--#include("/platform/zhgh/welfare/include/chengSh.js"){}#-->
@@ -0,0 +1,127 @@
let BENEFIT_GOODS_INFO = {
/*language=HTML*/
template: `
<div>
<el-dialog title="查看商品"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="70%">
<el-form label-width="110px">
<el-descriptions :column="3" border>
<el-descriptions-item label="商品名称">{{ viewData.name }}
</el-descriptions-item>
<el-descriptions-item label="所需积分">{{ viewData.money }}
</el-descriptions-item>
<el-descriptions-item label="发放形式">
<dict-tag :options="dict.type.BENEFIT_GOODS_PROVIDE_MODE"
:value="viewData.goodsProvideMode"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="所属一级分类">
{{ viewData.goodsCategoryOneLevelName }}
</el-descriptions-item>
<el-descriptions-item label="所属二级分类">
{{ viewData.goodsCategoryTwoLevelName }}
</el-descriptions-item>
<el-descriptions-item label="排序">{{ viewData.goodsSort }}
</el-descriptions-item>
<el-descriptions-item label="简短描述" span="3">{{ viewData.simpleDesc }}
</el-descriptions-item>
<el-descriptions-item label="商品规格" span="3">
<el-table :data="viewData.benefitGoodsSpecificationsList">
<el-table-column
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="规格名称" prop="name">
</el-table-column>
<el-table-column label="图片">
<template v-slot="{row}">
<el-button @click="openImg(row.imgUrl)" size="mini"
type="primary" v-if="row.imgUrl">
点击查看图片
</el-button>
<span v-else>暂无</span>
</template>
</el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="邮寄发放配置" span="3"
v-if="viewData.goodsProvideMode==='BENEFIT_GOODS_PROVIDE_MODE_POST'">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="choiceProvince" label="可邮寄省份">
{{
viewData.postProvideConfig.choiceProvince?viewData.postProvideConfig.choiceProvince:'暂无'
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="choiceProvince" label="可邮寄市">
{{
viewData.postProvideConfig.choiceMunicipality?viewData.postProvideConfig.choiceMunicipality:'暂无'
}}
</el-form-item>
</el-col>
</el-row>
</el-descriptions-item>
<el-descriptions-item label="说明描述" span="3">
<div class="text-left" v-html="viewData.description"></div>
</el-descriptions-item>
<el-descriptions-item label="图片" span="3">
<file-preview :files="viewData.imgUrl" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item label="是否主页" span="3">
<span v-if="viewData.isHomepage">是</span>
<span v-else>否</span>
</el-descriptions-item>
<el-descriptions-item label="图片" span="3">
<file-preview :files="viewData.carouselImgUrl" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="visibleDialog = false">关闭</el-button>
</span>
</el-dialog>
<el-dialog title="查看商品"
:visible.sync="imgVisibleDialog" :close-on-click-modal="false" width="50%">
<file-preview :files="imgUrlList" complete_result></file-preview>
<span slot="footer" class="dialog-footer">
<el-button type="primary"
@click="imgVisibleDialog = false">关闭</el-button>
</span>
</el-dialog>
</div>
`,
dicts: ["BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
viewData: {},
imgUrlList: [],
visibleDialog: false,
imgVisibleDialog: false
}
},
methods: {
openImg(imgUrl) {
this.imgUrlList = imgUrl
this.imgVisibleDialog = true
},
async findOne(id) {
const res = await this.$axios.post("/platform/benefit/goods/findOne", { id })
if (res.code === 0) {
return res.data
}
},
async open(id) {
const data = await this.findOne(id)
data.imgUrl = JSON.parse(data.imgUrl)
this.viewData = data
this.postProvideConfigFormData = JSON.parse(this.viewData.postProvideConfig)
this.visibleDialog = true
}
}
}
@@ -0,0 +1,141 @@
<!--#
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"
placeholder="所属年份"
style="width: 100%"
type="year"
@change="getWelfareList"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select :clearable="true" filterable placeholder="请选择福利项目" style="width: 100%" v-model="pageForm.benefitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="商品管理">
<el-button @click="openAdd()" icon="el-icon-plus" size="mini" type="primary">新增商品</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<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"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop==='goodsProvideMode'">
<dict-tag :options="dict.type.BENEFIT_GOODS_PROVIDE_MODE" :value="row.goodsProvideMode"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<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>
</guava>
<benefit-goods-form ref="benefitGoodsForm" @query="pageData"></benefit-goods-form>
<benefit-goods-info ref="benefitGoodsInfo"></benefit-goods-info>
</div>
<script>
<!--#include("goodsForm.js"){}#-->
<!--#include("goodsInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
projectSelectOptions: [],
pageForm: {
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "name", label: "商品名称" },
{ prop: "simpleDesc", label: "简短描述" },
{ prop: "goodsCategoryOneLevelName", label: "所属一级分类" },
{ prop: "goodsCategoryTwoLevelName", label: "所属二级分类" },
{ prop: "money", label: "所需积分" },
{ prop: "goodsProvideMode", label: "发放形式" }
]
}
},
components: {
"benefit-goods-form": BENEFIT_GOODS_FORM,
"benefit-goods-info": BENEFIT_GOODS_INFO
},
methods: {
openView(row) {
this.$refs.benefitGoodsInfo.open(row.id)
},
openAdd() {
this.$refs.benefitGoodsForm.open()
},
openEdit(row) {
this.$refs.benefitGoodsForm.openEdit(row.id)
},
doDelete(row) {
this.$confirm("确定要删除【" + row.name + "】?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios
.post(loc() + "/delete", {
id: row.id
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
getWelfareList() {
this.$set(this.pageForm, "benefitId", "")
this.$axios.post("/platform/benefit/project/getBenefitList", { year: this.pageForm.year }).then((res) => {
this.projectSelectOptions = res.data
})
}
},
async created() {
this.getWelfareList()
await this.pageData()
}
})
</script>
<style>
.benefitGoodsForm .el-form-item {
margin-bottom: 5px !important;
}
</style>
<!--#
}
#-->
@@ -0,0 +1,133 @@
const BENEFIT_GOODS_CATEGORY_FORM_COMPONENT = {
/*language=HTML*/
template: `
<el-dialog :title="formData.id ? '编辑菜单' : '新增菜单'" :show-close="false" :visible.sync="visibleDialog"
:close-on-click-modal="false" width="35%">
<el-form :model="formData" ref="formRef" :rules="formRules" size="small" label-width="120px">
<el-row :gutter="60">
<el-col :span="24">
<el-form-item prop="name" label="类型名称">
<el-input maxlength="100" placeholder="类型名称" v-model="formData.name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="parentId" label="上级类型">
<el-cascader
:options="menuOptions"
:props="props"
v-model="parentMenu"
placeholder="不选择则为顶级"
clearable
style="width: 100%">
</el-cascader>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="sort" label="排序值">
<el-input-number v-model="formData.sort" controls-position="right" :min="1" :max="100">
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="icon" label="类型图标">
<file-upload
:value.sync="formData.icon"
:upload_number="1"
upload_mode="image"
upload_result_category="interval"
upload_result_type="url">
</file-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="status" label="启用状态">
<el-switch v-model="formData.status" active-color="#ff4949"
inactive-color="#13ce66"></el-switch>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false">取 消</el-button>
<el-button type="primary" @click="submit">确 定</el-button>
</span>
</el-dialog>
`,
data() {
return {
visibleDialog: false,
formData: {},
formRules: {
name: [{ required: true, message: "必填", trigger: "blur" }]
},
menuOptions: [],
parentMenu: [],
props: {
checkStrictly: true,
multiple: false,
label: "name",
value: "id"
}
}
},
methods: {
onOpen(id) {
this.visibleDialog = true
this.formData = {}
this.parentMenu = []
this.menuOptions = []
this.listFullTree()
if (id == null) {
this.formData = {}
} else {
this.detail(id)
}
},
listFullTree() {
this.$axios.post(loc() + "/getCategoryTree").then((res) => {
this.menuOptions = res.data
})
},
detail(id) {
this.$axios.post("/platform/benefit/goodsCategory/info", { id: id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.parentMenu = [res.data.parentId]
}
})
},
submit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
if (this.parentMenu) {
this.formData.parentId = this.parentMenu[this.parentMenu.length - 1] || ""
} else {
this.formData.parentId = ""
}
if (this.formData.status) {
this.formData.status = 1
} else {
this.formData.status = 0
}
const { id } = this.formData
const url = loc() + (id ? "/update" : "/save")
this.$axios
.post(url, {
benefitGoodsCategory: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("保存成功")
this.visibleDialog = false
this.$emit("refresh", this.formData.parentId)
}
})
}
})
}
}
}
@@ -0,0 +1,205 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="类型名称">
<el-input v-model="pageForm.name" clearable placeholder="请填写名称查询" style="width: 100%"></el-input>
</search-item>
<search-item label="状态">
<el-select v-model="pageForm.status" clearable placeholder="请选择状态">
<el-option value="0" label="启用"></el-option>
<el-option value="1" label="禁用"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool>
<el-button @click="$refs.basicFormRef.onOpen(null)" size="small" type="primary" icon="el-icon-plus">新建类型</el-button>
<!-- <el-button @click="$refs.sortRef.onOpen(pageForm.platform)" size="small" type="primary" icon="el-icon-sort">排序</el-button>-->
</table-tool>
<el-table
:data="tableData"
:highlight-current-row="true"
:key="tableKey"
:load="loadChild"
:expand-row-keys="expandedRowKeysRenew"
@expand-change="handleExpandChange"
ref="tableData"
style="width: 100%"
lazy
row-key="id"
>
<el-table-column align="left" header-align="left" label="类型名称" prop="name"></el-table-column>
<el-table-column align="left" header-align="left" label="类型图标">
<template slot-scope="scope">
<el-image
:preview-src-list="previewSrcList(scope.row.icon)"
lazy
:src="scope.row.icon"
style="height: 30px; width: 30px"
fit="cover"
>
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</template>
</el-table-column>
<el-table-column align="left" header-align="left" label="状态" prop="status">
<template slot-scope="scope">
<i class="fa fa-circle text-danger ml5" v-if="scope.row.status==1"></i>
<i class="fa fa-circle text-success ml5" v-if="scope.row.status==0"></i>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" header-align="center" label="操作" prop="website" width="120">
<template slot-scope="scope">
<el-dropdown @command="dropdownCommand">
<el-button 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:'enable',id:scope.row.id,name:scope.row.name,row:scope.row}" divided>
启用
</el-dropdown-item>
<el-dropdown-item :command="{type:'disable',id:scope.row.id,name:scope.row.name,row:scope.row}">禁用</el-dropdown-item>
<el-dropdown-item :command="{type:'editMenu',id:scope.row.id,name:scope.row.name}">修改</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',id:scope.row.id,name:scope.row.name}">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
<basic-form ref="basicFormRef" @refresh="loadChildByExpandedKeys"></basic-form>
</div>
<script>
<!--#include("basicForm.js"){}#-->
new Vue({
el: "#app",
components: {
"basic-form": BENEFIT_GOODS_CATEGORY_FORM_COMPONENT
// "permission-form": SYS_MENU_PERMISSION_FORM_COMPONENT,
// sort: SYS_MENU_SORT_COMPONENT,
// "quick-entry": SYS_MENU_QUICK_ENTRY_COMPONENT
},
data: function () {
return {
pageForm: {},
tableData: [],
tableKey: "",
// 保存展开状态的数组
expandedRowKeysRenew: [],
tableTreeRefreshTool: []
}
},
methods: {
doSearch() {
this.initTreeTable()
},
initTreeTable() {
this.$axios
.post("/platform/benefit/goodsCategory/child", {
pid: "",
...this.pageForm
})
.then((res) => {
if (res.code === 0) {
this.tableData = res.data
this.tableKey = +new Date()
}
})
},
loadChild: function (tree, treeNode, resolve) {
// 在之前声明的全局变量中,增加一个key为 本条数据的id,id可替换为你数据中的任意唯一值
this.tableTreeRefreshTool[tree.id] = {}
// 重要!保存resolve方法,以便后续使用
this.tableTreeRefreshTool[tree.id].resolve = resolve
// 记录展开次数,具体作用后续介绍
this.tableTreeRefreshTool[tree.id].expandCount = 0
const url = "/platform/benefit/goodsCategory/child"
this.$axios.post(url, { pid: tree.id }).then((res) => {
if (res.code === 0) {
resolve(res.data)
}
})
},
dropdownCommand(command) {
//监听下拉框事件
if ("editMenu" === command.type) {
this.$refs.basicFormRef.onOpen(command.id)
}
if ("enable" === command.type || "disable" === command.type) {
this.$axios.post("/platform/benefit/goodsCategory/" + command.type + "/" + command.id).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
if ("disable" === command.type) {
command.row.status = 1
}
if ("enable" === command.type) {
command.row.status = 0
}
}
})
}
if ("delete" === command.type) {
this.$confirm("此操作将删除 " + command.name, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/benefit/goodsCategory/doDelete/" + command.id).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.loadChildByExpandedKeys(null)
}
})
})
}
},
handleExpandChange(row, expanded) {
if ((row.parentId === "" || row.parentId == null) && !expanded) {
this.expandedRowKeysRenew = []
return
}
if (expanded) {
this.expandedRowKeysRenew.push(row.id)
} else {
const index = this.expandedRowKeysRenew.findIndex((v) => v === row.id)
this.expandedRowKeysRenew.splice(index, 1)
}
},
loadChildByExpandedKeys(parentId) {
if (this.expandedRowKeysRenew && this.expandedRowKeysRenew.length > 0) {
this.expandedRowKeysRenew.forEach((v) => {
const curr = this.tableTreeRefreshTool[v]
// api请求
this.$axios.post("/platform/benefit/goodsCategory/child", { pid: v }).then((res) => {
if (res.data.length == 0 || parentId == "") {
this.initTreeTable()
}
curr.resolve(res.data)
})
})
} else {
this.initTreeTable()
}
},
previewSrcList(url) {
const previewSrcList = [url]
return previewSrcList
}
},
created() {
this.initTreeTable()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,8 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body></body>
</html>
@@ -0,0 +1,107 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="下单时间">
<el-date-picker
style="width: 100%"
:clearable="true"
v-model="pageForm.orderTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
></el-date-picker>
</search-item>
<search-item label="商品名称">
<el-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.goodsName"
></el-input>
</search-item>
<!-- <search-item label="规格名称">
<el-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.specName"
></el-input>
</search-item>-->
</search>
</el-card>
<el-card shadow="never">
<table-tool label="商品订单管理"></table-tool>
<el-table :data="tableData" ref="table" row-key="id" v-loading="tableLoading">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="商品名称" prop="goodsName"></el-table-column>
<el-table-column label="商品规格" prop="specName"></el-table-column>
<el-table-column label="收货地址" prop="receiveAddress"></el-table-column>
<el-table-column label="下单时间" prop="orderTime"></el-table-column>
<el-table-column label="操作" width="200px">
<template slot-scope="{row}">
<el-button @click="doDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {},
tableData: [],
tableLoading: false
}
},
methods: {
doDelete(row) {
this.$confirm("确定要删除【" + row.userName + "】?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios
.post("/platform/benefit/order/deleteOrder", {
id: row.id
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
openView(row) {}
/*pageData() {
this.tableLoading = true
const pageForm = clone(this.pageForm)
this.$axios.post(loc() + "/pageData", pageForm).then((res) => {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
})
}*/
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,225 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava :edit_scroll="false" ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="所属年份">
<el-date-picker
:clearable="true"
placeholder="所属年份"
style="width: 100%"
type="year"
@change="getWelfareList"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select filterable :clearable="true" placeholder="请选择福利项目" style="width: 100%" v-model="pageForm.benefitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="福利项目">
<el-button @click="openAdd()" icon="el-icon-plus" size="mini" type="primary">新增项目</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<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"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop==='startChoiceTime'">
{{$moment(row.startChoiceTime).format("YYYY-MM-DD HH:mm")}}
</template>
<template v-slot="{row}" v-else-if="column.prop==='endChoiceTime'">
{{$moment(row.startChoiceTime).format("YYYY-MM-DD HH:mm")}}
</template>
<template v-slot="{row}" v-else-if="column.prop==='provideMode'">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE" :value="row.provideMode"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop==='signMode'">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE" :value="row.signMode"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="550px">
<template slot-scope="{row}">
<template v-if="row.isUnseal">
<el-button
@click="createBenefitUser(row)"
:loading="submitLoading"
size="mini"
type="primary"
v-if="row.benefitUserNum===0"
>
生成福利名单
</el-button>
<el-button
@click="renewBenefitUser(row,true)"
:loading="submitLoading"
size="mini"
type="primary"
v-if="row.benefitUserNum>0"
>
更新福利名单
</el-button>
<el-button
@click="renewBenefitUser(row,false)"
:loading="submitLoading"
size="mini"
type="primary"
v-if="row.benefitUserNum>0"
>
重置福利名单
</el-button>
<el-button @click="doEdit(row.id,false)" size="mini" type="danger">关闭</el-button>
</template>
<template v-if="!row.isUnseal">
<el-button @click="doEdit(row.id,true)" size="mini" type="primary">开启</el-button>
</template>
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<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>
</guava>
<benefit-project-form ref="benefitProjectForm" @query="pageData"></benefit-project-form>
<benefit-project-info ref="benefitInfo"></benefit-project-info>
</div>
<script>
<!--#include("projectForm.js"){}#-->
<!--#include("projectInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["BENEFIT_PROVIDE_MODE", "BENEFIT_SIGN_MODE"],
data() {
return {
pageForm: {
year: moment().format("YYYY")
},
projectSelectOptions: [],
tableColumns: [
{ prop: "name", label: "项目名称" },
{ prop: "festival", label: "发放节日" },
{ prop: "startChoiceTime", label: "选择开始时间" },
{ prop: "endChoiceTime", label: "选择结束时间" },
{ prop: "provideMode", label: "发放形式" },
{ prop: "signMode", label: "是否电子签字" }
]
}
},
components: {
"benefit-project-form": BENEFIT_PROJECT_FORM,
"benefit-project-info": BENEFIT_PROJECT_INFO
},
methods: {
doEdit(id, isUnseal) {
this.submitLoading = true
this.$axios.post("/platform/benefit/project/doEdit", { id, isUnseal }).then((res) => {
if (res.code === 0) {
this.$message.success("更新成功")
this.pageData()
}
this.submitLoading = false
})
},
renewBenefitUser(row, isRenew) {
this.$confirm("确定要" + (isRenew ? "更新" : "重置") + "福利名单吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.submitLoading = true
this.$axios.post("/platform/benefit/project/renewBenefitUser", { benefitId: row.id, isRenew: isRenew }).then((res) => {
if (res.code === 0) {
this.$message.success("更新成功")
this.pageData()
}
this.submitLoading = false
})
})
},
createBenefitUser(row) {
this.$confirm("确定要生成福利名单吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.submitLoading = true
this.$axios.post("/platform/benefit/project/createBenefitUser", { benefitId: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success("生成成功")
this.pageData()
this.submitLoading = false
}
})
})
},
openView(row) {
this.$refs.benefitInfo.open(row.id)
},
openEdit(row) {
this.$refs.benefitProjectForm.openEdit(row.id)
},
doDelete(row) {
this.$confirm("确定要删除【" + row.name + "】?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/benefit/project/delete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success("删除成功")
this.pageData()
}
})
})
.catch(() => {})
},
openAdd() {
this.$refs.benefitProjectForm.open()
},
getWelfareList() {
this.$set(this.pageForm, "benefitId", "")
this.$axios.post("/platform/benefit/project/getBenefitList", { year: this.pageForm.year }).then((res) => {
this.projectSelectOptions = res.data
})
}
},
async created() {
this.getWelfareList()
this.pageData()
}
})
</script>
<style>
.benefitProjectForm .el-form-item {
margin-bottom: 5px !important;
}
</style>
<!--#
}
#-->
@@ -0,0 +1,298 @@
<!--#include("../goods/goodsInfo.js"){}#-->
let BENEFIT_PROJECT_FORM = {
/*language=HTML*/
template: `
<div>
<el-dialog :title="formData.id ? '编辑项目' : '新增项目'"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="60%">
<el-form :model="formData" ref="formRef" :rules="formRules"
label-width="0" class="benefitProjectForm">
<el-descriptions border class="descriptions-form" :column="3">
<el-descriptions-item label="项目名称" span="3">
<el-form-item prop="name" label="">
<el-input maxlength="40" placeholder="项目名称" show-word-limit
v-model="formData.name"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="发放节日">
<el-form-item label="" prop="festival">
<dict-select clearable code="BENEFIT_FESTIVAL"
placeholder="请选择发放节日"
v-model="formData.festival"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="选择时间" span="2">
<el-form-item label="" prop="choiceTime">
<el-date-picker
@change="choiceTimeChange"
end-placeholder="结束时间"
range-separator="-"
start-placeholder="开始时间"
style="width: 100%"
type="datetimerange"
v-model="formData.choiceTime"
value-format="yyyy-MM-dd HH:mm:ss"
></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="是否电子签字" span="1.5">
<el-form-item label="" prop="signMode">
<el-radio-group size="medium" v-model="formData.signMode">
<el-radio-button :key="item.code" :label="item.code"
v-for="item in dict.type.BENEFIT_SIGN_MODE">
{{item.name}}
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="发放形式" span="1.5">
<el-form-item label="" prop="provideMode">
<el-radio-group size="medium" v-model="formData.provideMode"
@change="provideModeChange">
<el-radio-button :key="item.code" :label="item.code"
v-for="item in dict.type.BENEFIT_PROVIDE_MODE">
{{item.name}}
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-descriptions-item label="逾期选择时间" span="1.5">
<el-form-item label="" prop="endOverdueChoiceTime">
<el-date-picker
placeholder="逾期未选择最后选择截至时间"
style="width: 100%"
type="datetime"
v-model="formData.endOverdueChoiceTime"
value-format="yyyy-MM-dd HH:mm:ss"
></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利总积分" span="1.5">
<el-form-item label="" prop="totalMoney">
<el-input-number v-model="formData.totalMoney" :precision="2"
:max="99999" :min="1"></el-input-number>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="福利礼品" span="3"
v-if="formData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'">
<el-form-item label="" prop="giftName">
<el-input maxlength="100" placeholder="福利礼品"
suffix-icon="el-icon-present"
v-model="formData.giftName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利套餐" span="3"
v-if="formData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-cascader
@change="goodsCategoryChange"
:options="goodsCategoryOptions"
:props="goodsCategoryProps"
v-model="pageForm.goodsCategoryIds"
placeholder="选择类型查询"
clearable
style="width: 100%"
></el-cascader>
<el-table
:data="goodsTableData"
ref="goodsTable"
row-key="id"
@selection-change="handleSelectionChange"
v-loading="tableLoading">
<el-table-column
type="selection"
:reserve-selection="true"
width="55">
</el-table-column>
<el-table-column
:index="indexMethod"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="商品名称" prop="name"></el-table-column>
<el-table-column label="所属一级分类"
prop="goodsCategoryOneLevelName"></el-table-column>
<el-table-column label="所属二级分类"
prop="goodsCategoryTwoLevelName"></el-table-column>
<el-table-column label="所需积分" prop="money"></el-table-column>
<el-table-column label="发放形式" prop="goodsProvideMode">
<template v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_GOODS_PROVIDE_MODE"
:value="row.goodsProvideMode"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<template slot-scope="{row}">
<el-button @click="openViewGoods(row.id)" size="mini"
type="primary">查看
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-descriptions-item>
<el-descriptions-item label="封面图片" span="3">
<el-form-item label="" prop="cover">
<file-upload
:value.sync="formData.cover"
:upload_number="1"
upload_mode="image"
upload_result_category="interval"
upload_result_type="url"
></file-upload>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false">取 消</el-button>
<el-button type="primary" @click="submit">提 交</el-button>
</span>
</el-dialog>
<benefit-goods-info ref="benefitGoodsInfo"></benefit-goods-info>
</div>
`,
dicts: ["BENEFIT_PROVIDE_MODE", "BENEFIT_SIGN_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
mixins: [initTableMixins],
data() {
return {
visibleDialog: false,
goodsTableData: [],
goodsCategoryOptions: [],
goodsCategoryProps: {
checkStrictly: true,
multiple: false,
label: "name",
value: "id"
},
formRules: {
name: [{ required: true, message: "必填", trigger: "blur" }],
totalMoney: [{ required: true, message: "必填", trigger: "blur" }],
giftName: [{ required: true, message: "必填", trigger: "blur" }],
festival: [{ required: true, message: "必填", trigger: "blur" }]
}
}
},
components: {
"benefit-goods-info": BENEFIT_GOODS_INFO
},
methods: {
choiceTimeChange(val) {
if (val) {
this.$set(this.formData, "startChoiceTime", val[0])
this.$set(this.formData, "endChoiceTime", val[1])
}
},
submit() {
this.$refs.formRef.validate(valid => {
console.log(this.formData.benefitGoodsIds)
if (valid) {
if (this.formData.provideMode === "BENEFIT_PROVIDE_MODE_TWO" && this.formData.benefitGoodsIds && this.formData.benefitGoodsIds.length === 0) {
this.$message.error("请选择福利商品")
return
}
this.$axios.post("/platform/benefit/project/submit", {
data: JSON.stringify(this.formData),
benefitGoodsIds: this.formData.benefitGoodsIds
}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
this.visibleDialog = false
this.$emit("query")
}
})
}
})
},
provideModeChange() {
if (this.formData.provideMode === "BENEFIT_PROVIDE_MODE_TWO") {
this.pageData()
this.getCategoryTree()
}
},
handleSelectionChange(val) {
// 使用 Map 来存储唯一的 id 和对应的对象
const data = new Map(val.map(item => [item.id, item]))
// 将 Map 的值转换回数组
const newData = Array.from(data.values())
this.formData.benefitGoodsIds = newData.map(v => v.id)
},
getCategoryTree() {
this.$axios.post("/platform/benefit/project/getCategoryTree").then((res) => {
this.goodsCategoryOptions = res.data
})
},
goodsCategoryChange(val) {
this.pageForm.goodsCategoryIds = val
this.pageData()
},
pageData() {
this.pageForm.benefitId = this.formData.id
this.$axios.post("/platform/benefit/project/getGoodsTableData", { pageForm: JSON.stringify(this.pageForm) }).then((res) => {
this.tableLoading = false
this.goodsTableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
this.toggleRowSelection()
})
},
openViewGoods(id) {
this.$refs.benefitGoodsInfo.open(id)
},
async findOne(id) {
const res = await this.$axios.post("/platform/benefit/project/findOne", { id })
if (res.code === 0) {
return res.data
}
},
toggleRowSelection() {
this.formData.benefitGoodsList.forEach((v) => {
if (v.benefitId) {
const index = this.goodsTableData.findIndex((item) => item.id === v.id)
if (index !== -1) {
this.$refs.goodsTable.toggleRowSelection(this.goodsTableData[index])
}
}
})
},
async openEdit(id) {
this.visibleDialog = true
const data = await this.findOne(id)
this.formData = data
this.pageForm.isEdit = true
this.$set(this.formData, "choiceTime", [data.startChoiceTime, data.endChoiceTime])
this.pageData()
this.getCategoryTree()
this.$nextTick(() => {
this.$refs.goodsTable.clearSelection();
})
},
async open() {
this.formData = {
signMode: "BENEFIT_SIGN_MODE_ONE",
provideMode: "BENEFIT_PROVIDE_MODE_ONE",
benefitGoodsIds: []
}
this.$set(this.pageForm, "isEdit", true)
this.$set(this.pageForm, "benefitGoodsIds", [])
this.visibleDialog = true
this.$refs.goodsTable.clearSelection();
}
}
}
@@ -0,0 +1,117 @@
let BENEFIT_PROJECT_INFO = {
/*language=HTML*/
template: `
<div>
<el-dialog title="查看项目详情"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="60%">
<el-descriptions border class="descriptions-form" :column="3">
<el-descriptions-item label="项目名称" span="3">
{{viewData.name}}
</el-descriptions-item>
<el-descriptions-item label="发放节日">
<dict-tag :options="dict.type.BENEFIT_FESTIVAL"
:value="viewData.festival"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="选择时间" span="2">
{{viewData.startChoiceTime}}至{{viewData.endChoiceTime}}
</el-descriptions-item>
<el-descriptions-item label="是否电子签字" span="1.5">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE"
:value="viewData.signMode"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="发放形式" span="1.5">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE"
:value="viewData.provideMode"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="逾期选择时间" span="1.5">
{{viewData.endOverdueChoiceTime}}
</el-descriptions-item>
<el-descriptions-item label="福利总积分" span="1.5"
v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
{{viewData.totalMoney}}
</el-descriptions-item>
<el-descriptions-item label="" span="1.5"
v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'">
</el-descriptions-item>
<el-descriptions-item label="福利礼品" span="3"
v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'">
{{viewData.giftName}}
</el-descriptions-item>
<el-descriptions-item label="福利套餐" span="3"
v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-table
:data="goodsTableData"
ref="goodsTable"
row-key="id"
v-loading="tableLoading">
<el-table-column
:index="indexMethod"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column label="商品名称" prop="name"></el-table-column>
<el-table-column label="所属一级分类"
prop="goodsCategoryOneLevelName"></el-table-column>
<el-table-column label="所属二级分类"
prop="goodsCategoryTwoLevelName"></el-table-column>
<el-table-column label="所需积分" prop="money"></el-table-column>
<el-table-column label="发放形式" prop="goodsProvideMode">
<template v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_GOODS_PROVIDE_MODE"
:value="row.goodsProvideMode"></dict-tag>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-descriptions-item>
<el-descriptions-item label="封面图片" span="3">
<file-preview :files="viewData.cover"></file-preview>
</el-descriptions-item>
</el-descriptions>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false">关 闭</el-button>
</span>
</el-dialog>
</div>
`,
dicts: ["BENEFIT_FESTIVAL", "BENEFIT_SIGN_MODE", "BENEFIT_PROVIDE_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
mixins: [initTableMixins],
data() {
return {
visibleDialog: false,
goodsTableData: []
}
},
components: {},
methods: {
async findOne(id) {
const res = await this.$axios.post("/platform/benefit/project/findOne", { id })
if (res.code === 0) {
return res.data
}
},
pageData() {
this.pageForm.benefitId = this.viewData.id
this.pageForm.isEdit = false
this.$axios.post("/platform/benefit/project/getGoodsTableData", { pageForm: JSON.stringify(this.pageForm) }).then((res) => {
this.tableLoading = false
this.goodsTableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
})
},
async open(id) {
const data = await this.findOne(id)
this.viewData = data
this.pageData()
this.visibleDialog = true
}
}
}
@@ -0,0 +1,427 @@
const BUY_INFO = {
/*language=HTML*/
template: `
<el-dialog
:append-to-body="true"
:modal-append-to-body="false"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
title="收货地址"
@closed="onClose"
width="70%">
<span >
<el-steps simple :space="200" :align-center="true" :active="active" finish-status="success">
<el-step title="1.我的购物车"></el-step>
<el-step title="2.填写核对订单信息"></el-step>
<el-step title="3.成功提交订单"></el-step>
</el-steps>
</span>
<template v-if="active==1">
<div class="content shopCart">
<el-empty v-if="cartList.length==0" image="https://image30.xedaojia.net/upload/wechat/images/flash/flashcart-empty.png">
<el-button type="text" @click="dialogVisible = false">购物车空空的哦~,去看看心仪的商品吧~</el-button>
</el-empty>
<!-- table -->
<div class="table" v-else>
<el-table element-loading-text="正在为您拼命加载中..." :data="cartList" ref="multipleTable"
style="width: 100%;"
:border="false"
row-key="id"
:reserve-selection="true"
@select-all="allSelectionChange"
@select="checkSelectionChange"
@selection-change="handleSelectionChange" :close-on-click-modal="false"
:close-on-press-escape="false"
:header-cell-style="{background:'#f3f3f3',color:'#999'}">
<el-table-column prop="isChecked" type="selection" width="75" align="center" />
<el-table-column align="center" width="200" label="商品">
<template slot-scope="scope">
<img :src="scope.row.benefitGoodsSpecifications.imgUrl[0].url" class="shopImg" alt="">
</template>
</el-table-column>
<el-table-column prop="shop" align="left">
<template slot-scope="scope">
<span class="shop">{{scope.row.benefitGoods.name}}</span>
<span class="shop">{{scope.row.benefitGoodsSpecifications.name}}</span>
</template>
</el-table-column>
<el-table-column width="200" prop="count" label="价格" align="center">
<template slot-scope="scope">
<span class="count">¥{{scope.row.benefitGoodsSpecifications.points}}</span>
</template>
</el-table-column>
<el-table-column width="120" label="操作" align="center">
<template slot-scope="scope">
<el-button type="text" @click="cartDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<span v-if="cartList.length!=0" class="dialog-footer" slot="footer">
<el-card style="margin-bottom: 20px" class="box-card" shadow="never">
<div class="text item">
<span class="desc">已选择:{{cartSelectList.length}}件商品</span>
<span class="desc" style="padding-right: 10px">总价:</span><span class="cart-price">{{totalPrice}}</span>
<el-button @click="submitCart" style="margin-left: 30px;margin-right: -10px;" type="danger">去结算</el-button>
</div>
</el-card>
</span>
</template>
<template v-if="active==2">
<div style="margin: 0 auto;">
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span>收货人信息</span>
<!--<el-button style="float: right; padding: 3px 0" type="text">新增收货地址</el-button>-->
</div>
<div class="text item">
<el-descriptions v-for="(item,index) in count" :column="6" :colon="false">
<el-descriptions-item>
<el-button type="text" @click="openAddress" v-if="tableData[index].isDefault" :icon="icon"></el-button>
</el-descriptions-item>
<el-descriptions-item>
{{tableData[index].userName}}
</el-descriptions-item>
<el-descriptions-item>{{tableData[index].province}}{{tableData[index].city}}{{tableData[index].county}}</el-descriptions-item>
<el-descriptions-item style="width: 100px">
<el-tooltip class="item" effect="dark" :content="tableData[index].addressDetail" placement="top">
<div class="ellipsis" >{{tableData[index].addressDetail}}</div>
</el-tooltip>
</el-descriptions-item>
<el-descriptions-item>{{tableData[index].tel}}</el-descriptions-item>
<el-descriptions-item >
<el-button @click="doDefault(tableData[index])" v-if="!tableData[index].isDefault" type="text" style="padding-top: 0px;">设为默认地址</el-button>
</el-descriptions-item>
</el-descriptions>
</div>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span>商品信息</span>
</div>
<div class="text item">
<el-descriptions v-for="data in formData" :column="4" :colon="false">
<el-descriptions-item>
<el-image
style="width: 80px;height: 80px;line-height: 80px"
:src="data.imgUrl[0].url"
fit="cover"></el-image>
<span>{{data.goodsName}}</span>
</el-descriptions-item>
<el-descriptions-item><span style="height: 80px;line-height: 80px">{{data.name}}</span></el-descriptions-item>
<el-descriptions-item>
<el-tooltip class="item" effect="dark" :content="data.simpleDesc" placement="top">
<span class="ellipsis" style="width:300px;height: 80px;line-height: 80px">
{{data.simpleDesc}}
</span>
</el-tooltip>
</el-descriptions-item>
</el-tooltip>
<el-descriptions-item><span class="price-show" style="height: 80px;line-height: 80px">{{data.points}}</span></el-descriptions-item>
</el-descriptions>
</div>
</el-card>
</div>
<span class="dialog-footer" slot="footer">
<el-card style="background-color: #f4f4f4;margin-bottom: 20px" class="box-card" shadow="never">
<div class="text item">
<span style="padding-right: 10px">应付总额:</span><span class="price-show">{{calculateTotalPrice()}}</span>
</div>
<div class="text item" v-for="item in filterAddressIsDefault()">
<span class="desc" style="padding-right: 10px;width: 400px">寄送至:{{item.province}}{{item.city}}{{item.county}}{{item.addressDetail}}</span>
<span class="desc">收货人:{{item.userName}}{{item.tel}}</span>
</div>
</el-card>
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button @click="submit" type="danger">提交所有订单</el-button>
</span>
</template>
<template v-if="active==3">
<el-empty style="height: 500px" image="https://pc-b2b2c.pickmall.cn/static/img/pay-success.f880966f.png">
<el-button type="primary" @click="dialogVisible = false">继续逛逛</el-button>
</el-empty>
</template>
</el-dialog>
`,
data() {
return {
formData: [],
specificationsId: "",
tableData: [],
dialogVisible: false,
active: 2,
cartList: [],
cartSelectList: [],
totalPrice: 0,
icon: "el-icon-arrow-right el-icon--right",
count: 1
}
},
methods: {
onOpen(data, active) {
this.formData = data
this.dialogVisible = true
this.active = active
if (active == 1) {
this.getCart()
}
this.getAddress()
},
onClose() {
this.$emit("close_cart")
},
openAddress() {
if (this.icon == "el-icon-arrow-right el-icon--right") {
this.count = this.tableData.length
this.icon = "el-icon-arrow-down"
return
}
if (this.icon == "el-icon-arrow-down") {
this.count = 1
this.icon = "el-icon-arrow-right el-icon--right"
return
}
},
submit() {
const address = this.filterAddressIsDefault()
const cartId = []
for (let i = 0; i < this.formData.length; i++) {
if (this.formData[i].cartId != null) {
cartId.push(this.formData[i].cartId)
}
}
const benefitBuyGoodsVo = {
list: JSON.stringify(this.formData),
addressId: address[0].id,
cartId: JSON.stringify(cartId)
}
this.$axios.post("/platform/benefit/shop/buyGoodsList", benefitBuyGoodsVo).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.active = 3
} else {
this.$message.warning(res.msg)
}
})
},
getAddress() {
this.$axios.post("/platform/benefit/address/selectUserAddress", this.pageForm).then((resp) => {
this.tableLoading = false
if (resp.code === 0) {
this.tableData = resp.data
} else {
this.$message.error(resp.msg)
}
})
},
async doDefault(row) {
const resp = await this.$axios.post("/platform/benefit/address/doDefault", { id: row.id })
if (resp.code === 0) {
this.getAddress()
this.$message({
type: "success",
message: resp.msg
})
} else {
this.$message.error(resp.msg)
}
},
getCart() {
this.$axios.post("/platform/benefit/shop/getCartList").then((resp) => {
if (resp.code === 0) {
this.cartList = resp.data
this.$nextTick(() => {
this.cartList.forEach((el) => {
if (el.isChecked == true) {
this.$refs.multipleTable.toggleRowSelection(el)
}
})
})
}
})
},
filterAddressIsDefault() {
return this.tableData.filter((item) => item.isDefault === true)
},
async checkSelectionChange(selection, row) {
row.isChecked = selection.includes(row)
const resp = await this.$axios.post("/platform/benefit/shop/editCart", row)
},
handleSelectionChange(selection) {
this.cartSelectList = selection
this.totalPrice = 0
for (var i = 0; i < selection.length; i++) {
this.totalPrice += selection[i].benefitGoodsSpecifications.points
}
},
allSelectionChange(selection) {
let productIdAllList = []
this.cartList.forEach((item) => {
productIdAllList.push(item.id.toString())
})
this.$axios.post("/platform/benefit/shop/editCartList", {
ids: JSON.stringify(productIdAllList),
isChecked: selection.length > 0 ? 1 : 0
})
},
calculateTotalPrice() {
return this.formData.reduce((sum, item) => sum + item.points, 0)
},
cartDelete(id) {
this.$confirm("是否删除此商品", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/benefit/shop/deleteCart", { id: id })
if (resp.code === 0) {
this.getCart()
this.$message({
type: "success",
message: resp.msg
})
} else {
this.$message.error(resp.msg)
}
})
},
submitCart() {
const data = []
for (let i = 0; i < this.cartSelectList.length; i++) {
let cart = this.cartSelectList[i]
data.push({
goodsName: cart.benefitGoods.name,
simpleDesc: cart.benefitGoods.simpleDesc,
imgUrl: cart.benefitGoods.imgUrl,
...cart.benefitGoodsSpecifications,
cartId: cart.id
})
}
this.onOpen(data, 2)
}
},
style: /*language=CSS*/ `
.ellipsis {
white-space: nowrap; /* 不换行 */
overflow: hidden; /* 隐藏超出的内容 */
text-overflow: ellipsis; /* 用省略号表示被隐藏的部分 */
max-width: 200px; /* 设置最大宽度以限制文本的显示长度 */
}
.price-show {
font-weight: bold;
font-size: 27px;
color: #E1140A;
}
.cart-price{
font-size: 16px;
color: #e2231a;
font-family: verdana;
font-weight: 700;
}
.desc{
color: #A2A2A2;
font-size: 14px;
margin-top: 8px;
line-height: 22px;
word-break: break-all;
margin-bottom: 20px;
}
.shopCart {
.table {
position: relative;
.el-input__inner {
text-align: center;
}
.el-input-group__append {
padding: 0 15px;
}
.el-input-group__prepend {
padding: 0 15px;
}
.shopImg {
width: 100%;
height: 100px;
}
.price,
.shop {
color: #000733;
}
.count {
color: #bfa548;
}
.el-checkbox__inner {
width: 20px;
height: 20px;
border-radius: 50%;
}
.el-checkbox__inner::after {
left: 7px;
top: 3px;
}
.el-checkbox__input.is-indeterminate .el-checkbox__inner::before {
top: 7px;
}
}
}
.shopCart .table {
margin-top: 50px;
position: relative;
}
.shopCart .table .el-input__inner {
text-align: center;
}
.shopCart .table .el-input-group__append {
padding: 0 15px;
}
.shopCart .table .el-input-group__prepend {
padding: 0 15px;
}
.shopCart .table .shopImg {
width: 100%;
}
.shopCart .table .price,
.shopCart .table .shop {
color: #000733;
}
.shopCart .table .count {
color: #e2231a;
}
.shopCart .table .el-checkbox__inner {
width: 20px;
height: 20px;
border-radius: 50%;
}
.shopCart .tab le .el-checkbox__inner::after {
left: 7px;
top: 3px;
}
.shopCart .table .el-checkbox__input.is-indeterminate .el-checkbox__inner::before {
top: 7px;
}
.el-empty__image {
width: 500px;
}
`
}
@@ -0,0 +1,81 @@
const elevator = {
template: /*language=HTML*/ `
<div class="elevator">
<ul class="elevator_list">
<li class="elevator_item" @click="shopCar">
<img
src="https://m.360buyimg.com/babel/jfs/t1/252521/5/15299/714/678e5d4dFc7166e85/96370b055a4906d2.png"
class="elevator_lk_img">
<img
src="https://m.360buyimg.com/babel/jfs/t1/255662/4/13828/673/678f4166F9f84bf55/18785692eb86ecfb.png"
class="elevator_lk_hover_img">
<span>购物车</span>
</li>
</ul>
</div>
`,
methods: {
shopCar() {
this.$emit("car")
}
},
style: /*language=CSS*/ `
.elevator {
position: fixed;
bottom: 50%;
right: 0;
-ms-transform: translateY(50%);
transform: translateY(50%);
transition: transform .5s;
z-index: 100;
-webkit-box-shadow: -2px 0 30px 2px rgba(97, 105, 119, .18);
box-shadow: -2px 0 30px 2px rgba(97, 105, 119, .18);
background: #fff;
}
.elevator:hover{
cursor: pointer;
}
.elevator_list {
overflow: hidden;
}
.elevator_list .elevator_item {
position: relative;
display: flex;
flex-direction: column;
column-gap: 5px;
padding: 10px;
}
.elevator_list .elevator_item:hover {
background: red;
color: #FFFFFF;
}
.elevator_list .elevator_item img{
position: relative;
display: block;
width: 20px;
height: 20px;
fill: #333;
margin: 0 auto 3px;
transition: fill .2sease;
z-index: 3;
}
.elevator_list .elevator_item .elevator_lk_hover_img{
display: none;
}
.elevator_list .elevator_item:hover .elevator_lk_hover_img{
display: block;
}
.elevator_list .elevator_item:hover .elevator_lk_img {
display: none;
}
`
}
@@ -0,0 +1,360 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
/* 根节点 */
.content {
position: relative;
z-index: 333;
}
/* END */
/* 覆盖默认a标签样式 */
a {
text-decoration: none;
}
a:link,
a:visited {
color: #5e5e5e;
}
/* END */
/* 左侧分类菜单 */
.menu-content {
width: 244px;
height: 464px;
background-color: rgba(0, 0, 0, 0.5);
position: absolute;
top: 0;
left: 0;
padding-top: 6px;
overflow-y: auto;
}
.menu-item {
height: 64px;
line-height: 66px;
padding: 0 24px;
cursor: pointer;
}
.menu-item:hover {
background: rgba(0, 0, 0, 0.2);
/* .2 就是过渡的时间 */
transition: all 0.2s linear;
}
.menu-item span {
display: flex;
justify-content: center;
align-items: center;
color: #fff;
padding: 0 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
height: 64px;
font-size: 16px;
}
.menu-item:last-child span {
border-bottom: none;
}
.menu-item span span {
flex: 1;
}
.menu-item span .fa {
color: rgba(255, 255, 255, 0.6);
font-size: 18px;
}
/* 二级分类菜单 */
.sub-menu {
border: 1px solid #d9dde1;
background-color: #fff;
width: calc(80vw - 244px);
max-width: 430px;
height: 458px;
position: absolute;
left: 244px;
top: 0;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.hide {
display: none;
}
.inner-box {
width: 100%;
height: 100%;
overflow: auto;
}
.sub-inner-box {
width: 100%;
margin-left: 40px;
width: calc(100% - 40px);
}
.sub-inner-box .title {
color: #00ca78;
font-size: 16px;
line-height: 16px;
font-weight: bold;
margin-top: 28px;
margin-bottom: 30px;
}
.sub-inner-box .sub-row {
margin-bottom: 25px;
line-height: 25px;
}
.sub-inner-box .sub-row .bold {
font-weight: 700;
margin-right: 15px;
}
.sub-inner-box .sub-row a {
margin-right: 15px;
}
.icon-stle {
width: 17px;
height: 17px;
}
/*商品列表*/
.bottom {
margin-top: 10px;
line-height: 12px;
}
.image {
width: 100%;
display: block;
}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both;
}
.el-collapse-item__header.is-active {
padding: 16px;
font-size: 26px;
font-weight: bold;
color: #1f1f1f;
letter-spacing: -0.16px;
}
.title {
display: inline-block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 18px;
color: #242424;
font-weight: 600;
}
.el-card__header {
padding: 15px 17px;
border-bottom: 0px solid var(--border-color-lighter);
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.pro-cur-price {
display: inline-block;
margin-right: 11px;
}
.currency-sign {
font-size: 16px;
color: #e72d21;
font-weight: bold;
}
.pro-price {
font-size: 16px;
color: #e2231a;
font-weight: 600;
}
.el-collapse-item__content {
padding-bottom: 0px;
font-size: 13px;
color: var(--color-text-primary);
line-height: 1.7692307692;
}
</style>
<div id="app">
<guava ref="guava">
<template>
<elevator @car="shopCar"></elevator>
<div class="content">
<!-- 分类菜单 -->
<div class="menu-content" @mouseout="hideSubMenu">
<div class="menu-item" v-for="(item, index) in goodsCategoryList" :key="index" @mouseover="showSubMenu(index)">
<span @click="initProject(item.id)">
<span>{{item.name}}</span>
<img src="https://s1.ax1x.com/2023/04/20/p9klxA0.png" class="icon-stle" />
</span>
</div>
</div>
<!-- END -->
<!-- 二级菜单 -->
<div class="sub-menu hide" @mouseover="showSubMenu(-1)" @mouseout="hideSubMenu">
<div class="inner-box" v-show="goodsCategoryIndex == index" v-for="(item, index) in goodsCategoryList" :key="index">
<div class="sub-inner-box">
<div class="title">{{item.name}}</div>
<div class="sub-row" v-for="(child, ind) in item.children" :key="ind">
<span class="bold">
<el-link @click="initProject(child.id)" href="" target="_blank">{{child.name}}</el-link>
</span>
<el-link href="" target="_blank" v-for="(children2, ind2) in child.children" :key="ind2">{{children2.name}}</el-link>
</div>
</div>
</div>
</div>
<!-- END -->
</div>
<div>
<el-carousel height="470px" indicator-position="none">
<el-carousel-item v-for="(item,index) in items" type="card" :key="index">
<!-- <el-image style="width: 100%; height: 100%" :src="item.image" fit="scale-down"></el-image>-->
<div
@click="openGoods(item)"
:style="'background:url('+item.carouselImgUrl[0].url+') center center no-repeat'"
style="width: 100%; height: 100%"
></div>
</el-carousel-item>
</el-carousel>
</div>
<div>
<el-card
class="box-card"
v-if="category.goodsList.length>0"
v-for="(category, index) in categoryList"
:key="category"
style="width: 100%; margin-top: 10px"
>
<div slot="header" class="clearfix">
<span class="title">{{category.name}}</span>
<!--<el-button style="float: right; padding: 3px 0" type="text">操作按钮</el-button>-->
</div>
<div class="text item">
<el-row :gutter="20">
<el-col :span="6" v-for="(goods, index) in category.goodsList" :key="goods">
<div @click="openGoods(goods)">
<el-card shadow="hover">
<img v-if="goods.imgUrl.length>0" :src="goods.imgUrl[0].url" class="image" />
<el-image v-else>
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
<div style="padding-top: 10px">
<span class="title">{{goods.name}}</span>
<div class="bottom clearfix">
<div class="pro-cur-price">
<span class="currency-sign"></span>
<span class="pro-price">{{goods.money}}</span>
</div>
</div>
</div>
</el-card>
</div>
</el-col>
</el-row>
</div>
</el-card>
</div>
</template>
<template #view>
<shop-dialog ref="info" @close_car="closeCar"></shop-dialog>
</template>
</guava>
</div>
<script>
<!--#include("shopDialog.js"){}#-->
<!--#include("elevator.js"){}#-->
new Vue({
el: "#app",
components: {
"shop-dialog": SHOP_DIALOG,
elevator
},
mixins: [initTableMixins],
data() {
return {
// 当前鼠标移入的分类菜单下标
goodsCategoryIndex: 0,
// 分类菜单数据
goodsCategoryList: [],
items: [],
currentDate: new Date(),
activeNames: ["1"],
categoryList: []
}
},
methods: {
// 显示对应的二级分类菜单
showSubMenu(index) {
if (index != -1) {
this.goodsCategoryIndex = index
}
document.querySelector(".sub-menu").classList.remove("hide")
},
// 隐藏二级分类菜单
hideSubMenu() {
document.querySelector(".sub-menu").classList.add("hide")
},
//获取商品类型
initGoodsCategory() {
this.$axios.post("/platform/benefit/shop/getCategoryTree").then((res) => {
if (res.code === 0) {
this.goodsCategoryList = res.data
this.goodsCategoryList.unshift({
id: "",
name: "全部",
parentId: "",
sort: 0,
status: 0
})
}
})
},
//获取福利商品列表
initProject(id) {
this.$axios.post("/platform/benefit/shop/getGoodsListByType", { id: id }).then((res) => {
if (res.code === 0) {
this.categoryList = res.data
}
})
},
//获取轮播图
initGoodsImg() {
this.$axios.post("/platform/benefit/shop/getGoodsList").then((res) => {
if (res.code === 0) {
this.items = res.data
}
})
},
openGoods(goods) {
this.$refs.guava.view(() => {
this.$refs.info.onOpen(goods)
})
},
shopCar() {
this.$refs.guava.view(() => {
this.$refs.info.openCart()
})
},
closeCar() {
this.$refs.guava.index(() => {})
}
},
async created() {
this.initGoodsCategory()
this.initProject(null)
this.initGoodsImg()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,199 @@
<!--#include("buyInfo.js"){}#-->
const SHOP_DIALOG = {
/*language=HTML*/
template: `
<guava ref="guava">
<div style="margin: 0 auto;width: 80%;">
<el-breadcrumb style="height: 30px" separator-class="el-icon-arrow-right">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>{{formData.goodsCategoryOneLevelName}}</el-breadcrumb-item>
<el-breadcrumb-item>{{formData.goodsCategoryTwoLevelName}}</el-breadcrumb-item>
</el-breadcrumb>
<el-container style="padding-bottom: 15px">
<el-aside width="500px">
<el-carousel height="400px" :interval="5000" indicator-position="none">
<el-carousel-item v-for="(item,index) in formData.imgUrl" :key="index">
<el-image
style="height: 400px;width: 500px"
:src="item.url"
fit="cover"></el-image>
</el-carousel-item>
</el-carousel>
</el-aside>
<el-container>
<el-header>
<h1 :title="formData.name" class="title">{{formData.name}}</h1>
<div class="desc">{{formData.simpleDesc}}</div>
</el-header>
<el-main>
<el-form :model="form" ref="formRef" label-position="left" label-width="50px">
<el-form-item label="价格">
<span class="price-show">{{formData.money}}</span>
</el-form-item>
<el-form-item label="规格" v-if="formData.benefitGoodsSpecificationsList">
<div class="specs">
<el-tooltip
v-for="specifications in formData.benefitGoodsSpecificationsList"
class="item"
effect="dark"
:content="specifications.name"
placement="top">
<el-button type="danger" :plain="specificationsId==specifications.id?false:true" @click="getPoints(specifications)">
{{ specifications.name }}
</el-button>
</el-tooltip>
</div>
</el-form-item>
<el-form-item>
<el-button type="danger" @click="addCart">加入购物车</el-button>
<el-button type="warning" @click="buy">立即购买</el-button>
</el-form-item>
</el-form>
</el-main>
</el-container>
</el-container>
<el-divider></el-divider>
<el-container>
<el-main style="padding: 0px">
<el-tabs v-model="activeName">
<el-tab-pane label="商品详情" name="first">
<div v-html="formData.description">
</div>
</el-tab-pane>
</el-tabs>
</el-main>
</el-container>
</div>
<buy-info ref="buyInfo" @close_cart="closeCart"></buy-info>
</guava>
`,
data() {
return {
items: [],
formData: {},
radio3: "",
form: {},
specificationsId: "",
activeName: "first",
specifications:{}
}
},
components: {
"buy-info": BUY_INFO
},
methods: {
onOpen(goods) {
this.index = 0
this.detail(goods.id)
},
openCart() {
this.$refs.buyInfo.onOpen({},1)
},
closeCart() {
this.$refs.guava.index(() => {})
this.$emit("close_car")
},
detail(id) {
this.$axios.post("/platform/benefit/shop/findOne", { id: id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.formData.imgUrl = JSON.parse(this.formData.imgUrl)
}
})
},
getPoints(specifications) {
this.specificationsId = specifications.id
this.formData.money = specifications.points
this.specifications=specifications
this.formData.imgUrl=specifications.imgUrl
},
buy() {
if (this.specificationsId === "") {
this.$message.error("请选择商品规格")
return
}
const data = [{
goodsName: this.formData.name,
simpleDesc: this.formData.simpleDesc,
imgUrl: this.formData.imgUrl,
...this.specifications
}]
this.$refs.buyInfo.onOpen(data,2)
},
addCart(){
if (this.specificationsId === "") {
this.$message.error("请选择商品规格")
return
}
const cart={
goodsId:this.formData.id,
specificationsId:this.specificationsId
}
this.$axios.post("/platform/benefit/shop/addCart",
cart).then((res) => {
if (res.code === 0) {
this.$message.success("加入购物车成功!")
this.$refs.buyInfo.onOpen({},1)
}
})
}
},
style: /*language=CSS*/ `
.title {
font-size: 22px;
font-weight: normal;
word-wrap: break-word;
white-space: pre-wrap;
word-break: break-all;
}
.desc {
color: #A2A2A2;
font-size: 14px;
margin-top: 8px;
line-height: 22px;
word-break: break-all;
margin-bottom: 20px;
}
.price-show {
font-weight: bold;
font-size: 27px;
color: #E1140A;
}
.animated-card {
animation-name: cardAnimation;
animation-duration: 0.5s;
animation-fill-mode: both;
margin-top: 0 !important;
background-color: white;
}
.specs {
display: grid;
grid-template-columns: repeat(2, 1fr);
column-gap: 20px;
row-gap: 20px;
max-height: 300px;
overflow-y: auto;
}
.specs button.item {
margin: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
word-break: break-all;
}
`
}
@@ -0,0 +1,284 @@
<!--#
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="getWelfareList"
placeholder="所属年份"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select
:clearable="false"
@change="doSearch"
filterable
placeholder="请选择福利项目"
style="width: 100%"
v-model="pageForm.benefitId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
</el-select>
</search-item>
<search-item label="所属工会" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN','SCHOOL_UNION_WELFARE_ADMIN'])">
<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 unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="福利统计">
<el-button
@click="openExportSummary"
icon="el-icon-download"
size="small"
type="primary"
v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN','SCHOOL_UNION_WELFARE_ADMIN'])"
>
导出汇总表
</el-button>
<el-button
@click="openSelectByAdmin"
icon="el-icon-download"
size="small"
type="primary"
v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN','SCHOOL_UNION_WELFARE_ADMIN'])"
>
管理员代选择
</el-button>
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
class="vi-table"
lazy
ref="table"
row-key="id"
show-summary
style="width: 100%"
v-if="tableData&&tableData.length>0"
>
<el-table-column type="index" width="50"></el-table-column>
<el-table-column
:key="column.prop"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-if="column.isHasChildren">
<el-table-column
:key="column2.id"
:label="column2.name"
:prop="column2.name"
v-for="column2 in column.benefitGoodsSpecificationsList"
></el-table-column>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
</guava>
<el-dialog :visible.sync="selectByAdminDialogVisible" title="管理员统一选择福利" width="35%">
<el-form label-position="right" label-width="120px">
<el-form-item label="福利选项">
<el-row :gutter="10" :key="goods.id" style="margin: 10px" v-for="(goods,index) in benefitGoodsList">
<el-col :span="16">
<el-tag style="height: 40px; line-height: 40px; width: 90%">
<div style="white-space: nowrap; display: flex; justify-content: center">
<el-tooltip :content="goods.name+' '+goods.money+'积分'" placement="top">
<span style="text-overflow: ellipsis; overflow: hidden">{{goods.name}}&emsp;{{goods.money}}积分</span>
</el-tooltip>
</div>
</el-tag>
</el-col>
<el-col :span="8">
<el-input-number :min="0" style="width: 100%" v-model="goods.selectNum"></el-input-number>
</el-col>
<el-col :span="24" v-if="goods.benefitGoodsSpecificationsList&&goods.benefitGoodsSpecificationsList.length>0&&goods.selectNum>0">
<el-radio-group size="small" v-model="goods.specificationsId">
<el-radio
:key="specifications.id"
:label="specifications.id"
border
v-for="specifications in goods.benefitGoodsSpecificationsList"
>
{{specifications.name}}
</el-radio>
</el-radio-group>
</el-col>
<el-col :span="24" style="padding-top: 10px" v-if="goods.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOP'&&goods.selectNum>0">
<el-select filterable placeholder="请选择收货门店" style="width: 100%" v-model="goods.shopAddress">
<el-option :key="item.id" :label="item.name" :value="item.name" v-for="(item,index) in goods.shopAddressList"></el-option>
</el-select>
</el-col>
</el-row>
</el-form-item>
</el-form>
<el-alert class="text-primary mb10">给没有选择的福利人员统一代选择</el-alert>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="selectByAdminDialogVisible=false">取消</el-button>
<el-button @click="doSelectByAdmin" type="primary">提交</el-button>
</el-row>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
projectSelectOptions: [],
unions: [],
benefitGoodsList: [],
selectByAdminDialogVisible: false
}
},
computed: {
viewBenefitGoodsList() {
if (this.pageForm.benefitId) {
const benefitInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.benefitId)
if (benefitInfo) {
return benefitInfo.benefitGoodsList
}
return null
}
return null
},
benefitInfo() {
if (this.pageForm.benefitId) {
const benefitInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.benefitId)
if (benefitInfo) {
return benefitInfo
}
return null
}
return null
}
},
methods: {
openSelectByAdmin() {
this.benefitGoodsList = clone(this.viewBenefitGoodsList)
this.selectByAdminDialogVisible = true
},
doSelectByAdmin() {
let totalMoney = 0
const benefitGoodsList = this.benefitGoodsList.filter((b) => b.selectNum > 0)
benefitGoodsList.map((b) => {
totalMoney = totalMoney + b.selectNum * b.money
})
if (totalMoney === 0) {
this.$message.warning("请选择后再提交!")
return
}
if (totalMoney !== this.benefitInfo.totalMoney) {
this.$message.warning("本次福利积分【" + this.benefitInfo.totalMoney + "】请检查商品数量!")
return
}
let flag = false
let msg = ""
benefitGoodsList.some((b) => {
if (b.benefitGoodsSpecificationsList && b.benefitGoodsSpecificationsList.length > 0 && !b.specificationsId) {
flag = true
msg = "商品中存在未填写的规格,请检查!"
return true
}
if (b.shopAddressList && b.shopAddressList.length > 0 && !b.shopAddress) {
flag = true
msg = "商品中存在未填写的门店地址,请检查!"
return true
}
return false
})
if (flag) {
this.$message.warning(msg)
return
}
this.$confirm("请确定是否给未选择的教职工一键选择当前福利?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const loading = this.$loading({
lock: true,
text: "Loading",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)"
})
const resp = await this.$axios.post("/platform/benefit/statistics/doSetAllBenefit", {
benefitId: this.pageForm.benefitId,
benefitGoodsList: JSON.stringify(benefitGoodsList)
})
loading.close()
if (resp.code === 0) {
await this.pageData()
this.selectByAdminDialogVisible = false
this.$message.success(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
})
},
openExportSummary() {
if (!this.pageForm.benefitId) {
this.$message.warning("请选择要导出的福利")
return
}
this.$downLoad("/platform/benefit/statistics/openExportSummary", this.pageForm)
},
getWelfareList() {
this.$set(this.pageForm, "benefitId", "")
this.$axios.post("/platform/benefit/statistics/getBenefitList", { year: this.pageForm.year }).then((res) => {
this.projectSelectOptions = res.data
if (res.data && res.data.length > 0) {
this.$set(this.pageForm, "benefitId", res.data[0].id)
}
this.pageData()
})
},
async pageData() {
this.tableLoading = true
const resp = await this.$axios.post("/platform/benefit/statistics/pageData", this.pageForm)
if (resp.code === 0) {
this.tableColumns = [
{
prop: "name",
label: "所属工会",
width: "300"
}
].concat(resp.data.tableColumn)
this.tableData = resp.data.tableList
}
this.tableLoading = false
}
},
async created() {
this.getWelfareList()
this.unions = await this.$businessTool.listUnion()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,95 @@
let ADD_BENEFIT_USER_BY_SELECT = {
template: `
<div >
<el-drawer :visible.sync="benefitUserDrawer" direction="rtl" size="70%" title="">
<div style="margin: 10px">
<el-timeline>
<el-timeline-item placement="top" timestamp="">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 300px" v-model="pageForm.searchKeyword">
<el-select slot="prepend" style="width: 80px;" v-model="pageForm.searchName">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="">
<el-table :data="tableData" :size="tableSize"
@sort-change="pageOrder" class="vi-table"
ref="table" row-key="id" style="width: 100%"
v-loading="tableLoading" @selection-change="handleSelectionChange">
<el-table-column type="selection" :reserve-selection="true"></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="工号" prop="loginname" sortable width="150px"></el-table-column>
<el-table-column label="姓名" prop="username" sortable width="150px"></el-table-column>
<el-table-column label="在职状态" prop="userState" sortable width="150px"></el-table-column>
<el-table-column label="人事编制" prop="personType" sortable width="150px"></el-table-column>
<el-table-column label="所在单位" prop="unitName" show-overflow-tooltip
sortable></el-table-column>
<el-table-column label="所在工会" prop="unionName" sortable></el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-timeline-item>
</el-timeline>
<div style="display: flex;justify-content: flex-end">
<el-button type="primary" @click="benefitUserDrawer=false">关闭</el-button>
<el-button type="primary" @click="doBenefitUser">提交</el-button>
</div>
</div>
</el-drawer>
</div>
`,
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
searchName: "username"
},
selectUserIds: [],
benefitUserDrawer: false
}
},
methods: {
handleSelectionChange(val) {
this.selectUserIds = val.map(v => v.id)
},
pageData() {
this.$axios.post("/platform/benefit/user/selectNotBenefitUser", this.pageForm).then((res) => {
this.tableLoading = false
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
})
},
selectNotWelfareList(benefitId) {
this.pageForm.benefitId = benefitId
this.pageForm.searchKeyword = ""
this.pageData()
},
async doBenefitUser() {
const confirm = await this.$confirm("确定要将当前选择的人加入到当前福利名单中吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
this.$axios.post("/platform/benefit/user/doBenefitUser", {
ids: JSON.stringify(this.selectUserIds),
benefitId: this.pageForm.benefitId
}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
this.$emit("search")
this.$refs.table.clearSelection()
}
})
}
}
}
}
@@ -0,0 +1,220 @@
<!--#
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="getWelfareList"
placeholder="所属年份"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select :clearable="false" filterable placeholder="请选择福利项目" style="width: 100%" v-model="pageForm.benefitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
</el-select>
</search-item>
<search-item label="职工信息">
<el-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.searchKeyword"
>
<el-select slot="prepend" style="width: 80px" v-model="pageForm.searchName">
<el-option label="姓名" value="us.username"></el-option>
<el-option label="工号" value="us.loginname"></el-option>
</el-select>
</el-input>
</search-item>
<search-item label="所属工会">
<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-select clearable filterable multiple placeholder="请选择单位" style="width: 100%" v-model="pageForm.unitIds">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitList"></el-option>
</el-select>
</search-item>
<search-item label="人员类型:">
<dict-select clearable code="PERSON_TYPE" multiple placeholder="请选择人员类型" v-model="pageForm.personTypes"></dict-select>
</search-item>
<search-item label="在职状态:">
<dict-select clearable code="USER_STATE" multiple placeholder="请选择人员状态" v-model="pageForm.userStates"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="福利名单">
<el-button @click="openExport" icon="el-icon-download" size="small" type="primary">导出</el-button>
<el-button @click="openImport" icon="el-icon-plus" size="small" type="primary">导入</el-button>
<el-button @click="openSelectUser" icon="el-icon-plus" size="small" type="primary">选择加入</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<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"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
></el-table-column>
<el-table-column label="操作" width="100px">
<template slot-scope="{row}">
<el-button @click="doDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<el-dialog :close-on-click-modal="false" :visible.sync="importDialog" title="福利名单导入" width="50%">
<file-import
:business_id="pageForm.benefitId"
@flush="successImport"
is_show_radio
post_url="/platform/benefit/user/doImportBenefitUser"
ref="importBenefitUser"
temp_url="/platform/benefit/user/downloadImport"
></file-import>
</el-dialog>
<add_benefit_user_by_select @search="doSearch" ref="addBenefitUser"></add_benefit_user_by_select>
</div>
<script>
<!--#include("addBenefitUserBySelect.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
projectSelectOptions: [],
importDialog: false,
importLoading: false,
pageForm: {
searchName: "us.username",
year: moment().format("YYYY")
},
unitList: [],
unionList: [],
tableColumns: [
{ prop: "loginName", label: "工号" },
{ prop: "userName", label: "姓名" },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "mobile", label: "联系方式" },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true }
]
}
},
components: {
add_benefit_user_by_select: ADD_BENEFIT_USER_BY_SELECT,
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue?v=" + new Date().getTime())
},
methods: {
//导出
openExport() {
if (!this.pageForm.benefitId) {
this.$message.warning("请选择要导出的福利")
return
}
this.$downLoad("/platform/benefit/user/exportBenefitUser", this.pageForm)
},
openImport() {
this.importDialog = true
this.$refs.importBenefitUser.importData = {
fileList: [],
isFlag: false
}
this.$refs.importBenefitUser.errorInfoData = {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0
}
},
successImport() {
this.pageData()
this.importDialog = false
},
openSelectUser() {
this.$refs.addBenefitUser.benefitUserDrawer = true
this.$refs.addBenefitUser.selectNotWelfareList(this.pageForm.benefitId)
},
getWelfareList() {
this.$set(this.pageForm, "benefitId", "")
this.$axios.post("/platform/benefit/project/getBenefitList", { year: this.pageForm.year }).then((res) => {
this.projectSelectOptions = res.data
if (res.data && res.data.length > 0) {
this.$set(this.pageForm, "benefitId", res.data[0].id)
}
this.pageData()
})
},
doDelete(row) {
this.$confirm("确定要删除【" + row.userName + "】?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios
.post("/platform/benefit/user/deleteBenefitUser", {
id: row.id,
benefitId: row.benefitId
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
pageData() {
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.unitIds = JSON.stringify(pageForm.unitIds)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
this.$axios.post(loc() + "/pageData", pageForm).then((res) => {
this.tableLoading = false
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
})
}
},
async created() {
this.getWelfareList()
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,99 @@
<!--#
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"
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 label="福利名单"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<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"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-if="column.prop==='provideMode'" v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE" :value="row.provideMode"></dict-tag>
</template>
<template v-else-if="column.prop==='signMode'" v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE" :value="row.signMode"></dict-tag>
</template>
<template v-else-if="column.prop==='isChoice'" v-slot="{row}">{{row.isChoice?'已选择':'未选择'}}</template>
</el-table-column>
<el-table-column label="操作" width="120px">
<template slot-scope="{row}">
<el-button @click="openSelectionBenefit(row)" size="mini" type="primary">选择福利</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<selection-benefit @query="pageData" ref="selectionBenefitRef"></selection-benefit>
</div>
<script>
<!--#include("selectionBefit.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["BENEFIT_FESTIVAL", "BENEFIT_SIGN_MODE", "BENEFIT_PROVIDE_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
pageForm: {
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "year", label: "年度" },
{ prop: "benefitName", label: "福利名称" },
{ prop: "startChoiceTime", label: "选择开始时间" },
{ prop: "endChoiceTime", label: "选择结束时间" },
{ prop: "signMode", label: "是否电子签字" },
{ prop: "provideMode", label: "发放形式" },
{ prop: "isChoice", label: "是否选择" }
]
}
},
components: {
"selection-benefit": SELECTION_BENEFIT
},
methods: {
openSelectionBenefit(row) {
if (row.isChoice) {
this.$refs.selectionBenefitRef.openEditSelectionBenefit(row)
} else {
this.$refs.selectionBenefitRef.openSelectionBenefit(row)
}
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,474 @@
<!--#include("../goods/goodsInfo.js"){}#-->
<!--#include("../address/addressDialog.js"){}#-->
let SELECTION_BENEFIT = {
/*language=HTML*/
template: `
<div>
<el-dialog title="选择福利"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="70%">
<el-form label-suffix="" :model="formData">
<el-row :gutter="20">
<el-col :span="24">
<span
style="font-weight: bold;font-size: 20px;display: flex;justify-content: center">{{viewData.name}}</span>
</el-col>
<el-col :span="8">
<el-form-item label="福利节日">
<dict-tag :options="dict.type.BENEFIT_FESTIVAL"
:value="viewData.festival"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'">
<el-form-item label="福利礼品">
{{viewData.giftName}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否电子签字">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE"
:value="viewData.signMode"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发放形式">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE"
:value="viewData.provideMode"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="选择时间">
{{$moment(viewData.startChoiceTime).format("YYYY-MM-DD HH:mm")}}
{{$moment(viewData.endChoiceTime).format("YYYY-MM-DD HH:mm")}}
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="逾期选择时间">
<span v-if="viewData.endOverdueChoiceTime">
{{
$moment(viewData.endOverdueChoiceTime).format("YYYY-MM-DD HH:mm")
}}
</span>
<span v-else>暂无</span>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="福利总积分">
{{viewData.totalMoney}}
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="福利套餐"></el-form-item>
<el-col :span="6" v-for="(item,index) in viewData.benefitGoodsList"
:key="item.id" style="padding-bottom: 10px">
<el-card :body-style="{ padding: '10px' }">
<el-tooltip content="点击查看商品详情" placement="top">
<el-image
style="width: 100%;height: 300px"
v-if="item.imgUrl&&item.imgUrl.length>0"
:src="item.imgUrl[0].url"
fit="contain" @click="openGoods(item.id)"></el-image>
<el-image
style="width: 100%;height: 300px"
v-else
src="/assets/mobile/img/benefit/1.png"
fit="contain" @click="openGoods(item.id)"></el-image>
</el-tooltip>
<div style="padding: 14px;">
<div
style="white-space: nowrap;display: flex;padding: 5px">
<el-tooltip :content="item.simpleDesc" placement="top">
<span
style="text-overflow: ellipsis;overflow: hidden;font-weight: bold;font-size: 15px">
{{item.name}}
</span>
</el-tooltip>
</div>
<div style="padding: 5px">
<span
style="color: red;font-weight: bold;font-size: 20px">¥{{item.money}}</span>
</div>
<div style="padding: 5px">
<el-input-number :min="0" style="width: 100%"
v-model="item.selectNum"></el-input-number>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-card v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'
&&viewData.signMode==='BENEFIT_SIGN_MODE_ONE'">
<el-row :gutter="20">
<el-col :span="24">
<pc-signature v-model="formData.userSign"></pc-signature>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false">取 消</el-button>
<el-button type="primary" @click="openSubmit">提 交</el-button>
</span>
</el-dialog>
<el-dialog title="提交商品确认"
:visible.sync="submitVisibleDialog" :close-on-click-modal="false"
width="50%">
<el-form label-suffix="" :model="formData">
<el-card v-for="(goods,index) in formData.benefitGoodsList"
:key="goods.id">
<el-row :gutter="20">
<el-col :span="24">
{{goods.name}}
<span style="display: flex;justify-content: flex-end;color:red;">
x{{goods.selectNum}}
</span>
</el-col>
<el-col :span="24">
<el-radio-group v-model="goods.specificationsId" size="small"
@change="specificationsChange(goods.specificationsId,index)">
<el-radio :label="specifications.id" border
:key="specifications.id"
v-for="specifications in goods.benefitGoodsSpecificationsList">
{{specifications.name}}
</el-radio>
</el-radio-group>
</el-col>
<el-col :span="24"
v-if="goods.goodsProvideMode==='GOODS_PROVIDE_MODE_POST'"
style="padding-top: 10px">
<div v-if="!goods.receiveAddress">
<div style="display: flex; column-gap: 10px;">
<div style="flex: 1">
<el-select @change="addressChange(goods)"
filterable placeholder="请选择收货地址"
style="width: 100%"
v-model="goods.addressId">
<el-option
:key="item.id"
:label="item.name+' '+item.defaultName"
:value="item.id"
v-for="item in addressOptions">
</el-option>
</el-select>
</div>
<div>
<el-button
@click="openAddress"
type="primary">添加收货地址
</el-button>
</div>
</div>
</div>
<div v-else>
<div style="display: flex; column-gap: 10px;">
<div style="flex: 1">
<el-input :value="goods.receiveAddress"
readonly></el-input>
</div>
<div>
<el-button
@click="editAddress(index)"
type="primary">修改收货地址
</el-button>
</div>
</div>
</div>
</el-col>
<el-col :span="24"
v-if="goods.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOP'"
style="padding-top: 10px">
<el-select filterable placeholder="请选择收货门店"
style="width: 100%"
v-model="goods.shopAddress">
<el-option
:key="item.id"
:label="item.name"
:value="item.name"
v-for="(item,index) in goods.shopAddressList">
</el-option>
</el-select>
</el-col>
</el-row>
</el-card>
<el-card v-if="viewData.signMode==='BENEFIT_SIGN_MODE_ONE'">
<el-row :gutter="20">
<el-col :span="24">
<pc-signature v-model="formData.userSign"></pc-signature>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button
@click="visibleDialog = true;submitVisibleDialog = false">关闭继续选择</el-button>
<el-button type="primary" @click="submit">提 交</el-button>
</span>
</el-dialog>
<benefit-goods-info ref="benefitGoodsInfo"></benefit-goods-info>
<address-dialog ref="addressDialog"
@select_user_address="selectUserAddress"></address-dialog>
</div>
`,
store,
dicts: ["BENEFIT_FESTIVAL", "BENEFIT_SIGN_MODE", "BENEFIT_PROVIDE_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
visibleDialog: false,
submitVisibleDialog: false,
viewData: {},
formData: {},
addressOptions: [],
userSelection: []
}
},
components: {
"benefit-goods-info": BENEFIT_GOODS_INFO,
"address-dialog": ADDRESS_DIALOG
},
methods: {
specificationsChange(val, index) {
this.$set(this.formData.benefitGoodsList[index], "specificationsId", val)
this.$forceUpdate()
},
editAddress(index) {
this.$set(this.formData.benefitGoodsList[index], "addressId", "")
this.$set(this.formData.benefitGoodsList[index], "receiveAddress", "")
this.$forceUpdate()
},
submit() {
if (this.viewData.signMode === "BENEFIT_SIGN_MODE_ONE" && !this.formData.userSign) {
this.$message.warning("请签字后再提交!")
return
}
let flag = false
let msg = ""
this.formData.benefitGoodsList.some(b => {
if (b.goodsProvideMode === "GOODS_PROVIDE_MODE_POST" && !b.receiveAddress) {
flag = true
msg = "商品中存在未填写的收货地址,请检查!"
return true
}
if (b.benefitGoodsSpecificationsList && b.benefitGoodsSpecificationsList.length > 0 && !b.specificationsId) {
flag = true
msg = "商品中存在未填写的规格,请检查!"
return true
}
if (b.shopAddressList && b.shopAddressList.length > 0 && !b.shopAddress) {
flag = true
msg = "商品中存在未填写的门店地址,请检查!"
return true
}
return false
})
if (flag) {
this.$message.warning(msg)
return
}
this.$confirm("确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const benefitUserSelection = this.formData.benefitGoodsList.map(b => {
let data = {
"specificationsId": b.specificationsId,
"receiveAddress": b.receiveAddress,
"shopAddress": b.shopAddress,
"selectNum": b.selectNum,
"benefitId": this.viewData.id,
"goodsId": b.id,
"selectUserId": b.selectUserId,
"userSign": this.formData.userSign
}
return data
})
this.$axios.post("/platform/benefit/userSelection/submit", {
benefitUserSelection: JSON.stringify(benefitUserSelection),
benefitId: this.viewData.id,
userId: this.viewData.userId
}).then((res) => {
if (res.code === 0) {
this.$message.success("提交成功")
this.submitVisibleDialog = false
this.$emit("query")
}
})
})
.catch(() => {
})
},
addressChange(goods) {
const address = this.addressOptions.find(a => a.id === goods.addressId)
const { province, city, county, name, tel } = address
if (goods.postProvideConfig.choiceMunicipality && city !== goods.postProvideConfig.choiceMunicipality) {
this.$message.warning("当前福利限制只能邮寄" + goods.postProvideConfig.choiceMunicipality + "")
this.$set(goods, "addressId", "")
return
}
if (goods.postProvideConfig.choiceProvince && province !== goods.postProvideConfig.choiceProvince) {
this.$message.warning("当前福利限制只能邮寄" + goods.postProvideConfig.choiceProvince + "")
this.$set(goods, "addressId", "")
return
}
if (address) {
this.$set(goods, "receiveAddress", address.name)
}
},
openAddress() {
this.$refs.addressDialog.dialogVisible = true
this.$refs.addressDialog.formData = {}
},
/**
* isAdmin是否为管理员编辑,管理员就要查询当前传过来的userid,不是管理员就要查询当前登录用户的id
* @param isAdmin
* @returns {Promise<void>}
*/
async selectUserAddress(userId) {
const resp = await this.$axios.post("/platform/benefit/address/selectUserAddress", { userId })
resp.data.map(r => {
let defaultName = r.isDefault ? "默认地址" : ""
r.defaultName = defaultName
r.name = "收货地址:" + r.province + r.city + r.county + r.addressDetail + ",收件人:" + r.userName + ",联系方式:" + r.tel
})
this.addressOptions = resp.data
},
provideModeOneDoSubmit() {
if (!this.formData.userSign) {
this.$message.warning("请签字后再提交!")
return
}
this.$confirm("确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/benefit/userSelection/provideModeOneDoSubmit", {
userSign: this.formData.userSign,
benefitId: this.viewData.id
}).then((res) => {
if (res.code === 0) {
this.visibleDialog = false
this.$message.success("提交成功")
this.$emit("query")
}
})
})
},
openSubmit() {
if (this.viewData.provideMode === "BENEFIT_PROVIDE_MODE_ONE"
&& this.viewData.signMode === "BENEFIT_SIGN_MODE_ONE") {
//如果是统一发放并且需要签字
this.provideModeOneDoSubmit()
return
}
let totalMoney = 0
const benefitGoodsList = this.viewData.benefitGoodsList.filter(b => b.selectNum > 0)
benefitGoodsList.map(b => {
totalMoney = totalMoney + b.selectNum * b.money
})
if (totalMoney === 0) {
this.$message.warning("请选择后再提交!")
return
}
if (totalMoney !== this.viewData.totalMoney) {
this.$message.warning("本次福利积分【" + this.viewData.totalMoney + "】请检查商品数量!")
return
}
this.formData.benefitGoodsList = benefitGoodsList
this.openSubmitView()
},
openSubmitView() {
this.visibleDialog = false
setTimeout(() => {
this.submitVisibleDialog = true
}, 400)
},
openGoods(id) {
this.$refs.benefitGoodsInfo.open(id)
},
/**
* 查询单个福利
* @param id
* @returns {Promise<*>}
*/
async findOneBenefit(id) {
const res = await this.$axios.post("/platform/benefit/userSelection/findOneBenefit", { id })
if (res.code === 0) {
return res.data
}
},
/**
*查询用户选择的商品
* @param benefitId
* @param userId
* @returns {Promise<void>}
*/
async selectSelectionBenefit(benefitId, userId) {
const res = await this.$axios.post("/platform/benefit/userSelection/selectSelectionBenefit", {
benefitId,
userId
})
if (res.code === 0) {
this.userSelection = res.data
}
},
/**
* 回显用户选择的数据
* @param benefitId
* @param userId
* @returns {Promise<void>}
*/
async echoUserSelection(benefitId, userId) {
await this.selectSelectionBenefit(benefitId, userId)
//获取用户当前选择的数量
this.viewData.benefitGoodsList.map(v => {
const goods = this.userSelection.find(x => x.goodsId === v.id)
if (goods) {
v.selectNum = goods.selectNum
v.selectUserId = goods.selectUserId
v.receiveAddress = goods.receiveAddress
v.specificationsId = goods.specificationsId
v.shopAddress = goods.shopAddress
} else {
v.selectNum = 0
}
})
},
async openEditSelectionBenefit(row) {
//isAdmin是否为管理员编辑,管理员就要查询当前传过来的userid,不是管理员就要查询当前登录用户的id
const data = await this.findOneBenefit(row.benefitId)
data.userId = row.userId
this.viewData = data
await this.echoUserSelection(row.benefitId, row.userId)
await this.selectUserAddress(row.userId)
this.visibleDialog = true
},
async openSelectionBenefit(row, isAdmin) {
const data = await this.findOneBenefit(row.benefitId)
data.benefitGoodsList.map(v => {
v.selectUserId = row.userId
v.selectNum = 0
v.receiveAddress = ""
v.specificationsId = ""
})
data.userId = row.userId
this.viewData = data
await this.selectUserAddress(row.userId)
this.visibleDialog = true
}
}
}
@@ -0,0 +1,260 @@
<!--#
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="getWelfareList"
placeholder="所属年份"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select
:clearable="false"
@change="doSearch"
filterable
placeholder="请选择福利项目"
style="width: 100%"
v-model="pageForm.benefitId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
</el-select>
</search-item>
<search-item label="职工信息">
<el-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.searchKeyword"
>
<el-select slot="prepend" style="width: 80px" v-model="pageForm.searchName">
<el-option label="姓名" value="bu.username"></el-option>
<el-option label="工号" value="bu.loginname"></el-option>
</el-select>
</el-input>
</search-item>
<search-item label="所属工会">
<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-select clearable filterable multiple placeholder="请选择单位" style="width: 100%" v-model="pageForm.unitIds">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitList"></el-option>
</el-select>
</search-item>
<search-item label="人员类型:">
<dict-select clearable code="PERSON_TYPE" multiple placeholder="请选择人员类型" v-model="pageForm.personTypes"></dict-select>
</search-item>
<search-item label="在职状态:">
<dict-select clearable code="USER_STATE" multiple placeholder="请选择人员状态" v-model="pageForm.userStates"></dict-select>
</search-item>
<search-item label="福利商品" v-if="pageFormProvideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-select @change="doSearch" filterable placeholder="请选择福利商品" style="width: 100%" v-model="pageForm.goodsId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in pageFormGoodsList"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="福利名单">
<el-radio-group @change="doSearch" class="mr10" size="small" v-model="pageForm.isChoice">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="1">已选择</el-radio-button>
<el-radio-button label="0">未选择</el-radio-button>
</el-radio-group>
<el-button @click="openExport" icon="el-icon-download" size="small" type="primary">导出</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<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"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-if="column.prop==='giftName'" v-slot="{row}">
<span v-if="row.isChoice">{{row.giftList?row.giftList:row.giftName}}</span>
</template>
<template v-else-if="column.prop==='isChoice'" v-slot="{row}">
<span v-if="row.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-tag effect="dark" v-if="row.isChoice">已选择</el-tag>
<el-tag effect="dark" type="info" v-else>未选择</el-tag>
</span>
<span v-else-if="row.provideMode==='BENEFIT_PROVIDE_MODE_ONE'&&row.signMode==='BENEFIT_SIGN_MODE_ONE'">
<el-tag effect="dark" v-if="row.isChoice">已签字</el-tag>
<el-tag effect="dark" type="info" v-else>未签字</el-tag>
</span>
</template>
</el-table-column>
<el-table-column
label="收货地址"
prop="receiveAddressList"
show-overflow-tooltip
v-if="pageFormProvideMode==='BENEFIT_PROVIDE_MODE_TWO'"
></el-table-column>
<el-table-column label="签字" prop="userSign" show-overflow-tooltip v-if="pageFormSignMode==='BENEFIT_SIGN_MODE_ONE'">
<template slot-scope="{row}">
<el-image :src="row.userSign" fit="cover" style="height: 60px" v-if="row.userSign"></el-image>
<el-tag effect="dark" type="info" v-else>暂无</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<template slot-scope="{row}">
<el-button
:disabled="row.provideMode==='BENEFIT_PROVIDE_MODE_ONE'"
@click="openSelectionBenefit(row)"
size="mini"
type="primary"
>
编辑
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<selection-benefit @query="pageData" ref="selectionBenefitRef"></selection-benefit>
</div>
<script>
<!--#include("../userSelection/selectionBefit.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
computed: {
pageFormProvideMode() {
if (this.pageForm.benefitId) {
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.benefitId)
if (projectInfo) {
return projectInfo.provideMode
}
return null
}
return null
},
pageFormSignMode() {
if (this.pageForm.benefitId) {
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.benefitId)
if (projectInfo) {
return projectInfo.signMode
}
return null
}
return null
},
pageFormGoodsList() {
if (this.pageForm.benefitId) {
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.benefitId)
if (projectInfo) {
return projectInfo.benefitGoodsList
}
return null
}
return null
}
},
components: {
"selection-benefit": SELECTION_BENEFIT
},
data() {
return {
projectSelectOptions: [],
pageForm: {
searchName: "bu.username",
year: moment().format("YYYY"),
isChoice: ""
},
unitList: [],
unionList: [],
tableColumns: [
{ prop: "loginName", label: "工号" },
{ prop: "userName", label: "姓名" },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "isChoice", label: "是否选择", sortable: true },
{ prop: "giftName", label: "所选福利", sortable: true }
]
}
},
methods: {
//导出
openExport() {
if (!this.pageForm.benefitId) {
this.$message.warning("请选择要导出的福利")
return
}
this.$downLoad("/platform/benefit/userSelection/list/exportBenefitUserSelect", this.pageForm)
},
openSelectionBenefit(row) {
const isAdmin = this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN", "SCHOOL_UNION_WELFARE_ADMIN"])
if (!isAdmin) {
if (row.startChoiceTime > moment().format("YYYY-MM-DD HH:mm") || row.endChoiceTime < moment().format("YYYY-MM-DD HH:mm")) {
this.$message.warning("当前时间不在选择范围内!")
return
}
}
if (row.isChoice) {
this.$refs.selectionBenefitRef.openEditSelectionBenefit(row)
} else {
this.$refs.selectionBenefitRef.openSelectionBenefit(row)
}
},
getWelfareList() {
this.$set(this.pageForm, "benefitId", "")
this.$axios.post("/platform/benefit/project/getBenefitList", { year: this.pageForm.year }).then((res) => {
this.projectSelectOptions = res.data
if (res.data && res.data.length > 0) {
this.$set(this.pageForm, "benefitId", res.data[0].id)
}
this.pageData()
})
},
pageData() {
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.unitIds = JSON.stringify(pageForm.unitIds)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
this.$axios.post(loc() + "/pageData", pageForm).then((res) => {
this.tableLoading = false
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
})
}
},
async created() {
this.getWelfareList()
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,112 @@
<!--#
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"
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 label="我的福利"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<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"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-if="column.prop==='provideMode'" v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE" :value="row.provideMode"></dict-tag>
</template>
<template v-else-if="column.prop==='signMode'" v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE" :value="row.signMode"></dict-tag>
</template>
<template v-else-if="column.prop==='isChoice'" v-slot="{row}">
<span v-if="row.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">{{row.isChoice?'已选择':'未选择'}}</span>
<span v-else-if="row.provideMode==='BENEFIT_PROVIDE_MODE_ONE'&&row.signMode==='BENEFIT_SIGN_MODE_ONE'">
{{row.isChoice?'已签字':'未签字'}}
</span>
</template>
<template v-else-if="column.prop==='giftName'" v-slot="{row}">
<span v-if="row.isChoice">{{row.giftList?row.giftList:row.giftName}}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="120px">
<template slot-scope="{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>
</guava>
<selection-benefit-info ref="selectionBenefitInfoRef"></selection-benefit-info>
</div>
<script>
<!--#include("info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["BENEFIT_FESTIVAL", "BENEFIT_SIGN_MODE", "BENEFIT_PROVIDE_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
pageForm: {
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "year", label: "年度" },
{ prop: "benefitName", label: "福利名称" },
{ prop: "startChoiceTime", label: "选择开始时间" },
{ prop: "endChoiceTime", label: "选择结束时间" },
{ prop: "signMode", label: "是否电子签字" },
{ prop: "provideMode", label: "发放形式" },
{ prop: "giftName", label: "所选礼品" },
{ prop: "isChoice", label: "是否选择/签字" }
]
}
},
components: {
"selection-benefit-info": SELECTION_BENEFIT_INFO
},
methods: {
openView(row) {
if (!row.isChoice) {
this.$message.warning("当前福利暂未选择,请前往福利选择进行选择!")
return
}
if (row.provideMode === "BENEFIT_PROVIDE_MODE_ONE") {
this.$message.warning("当前福利为统一发放【" + row.giftName + "】")
return
}
this.$refs.selectionBenefitInfoRef.open(row.benefitId)
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,154 @@
<!--#include("../goods/goodsInfo.js"){}#-->
let SELECTION_BENEFIT_INFO = {
/*language=HTML*/
template: `
<div>
<el-dialog title="选择福利"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="70%">
<el-form label-suffix="">
<el-row :gutter="20">
<el-col :span="24">
<span
style="font-weight: bold;font-size: 20px;display: flex;justify-content: center">{{viewData.name}}</span>
</el-col>
<el-col :span="8">
<el-form-item label="福利节日">
<dict-tag :options="dict.type.BENEFIT_FESTIVAL"
:value="viewData.festival"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'">
<el-form-item label="福利礼品">
{{viewData.giftName}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否电子签字">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE"
:value="viewData.signMode"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发放形式">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE"
:value="viewData.provideMode"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="选择时间">
{{$moment(viewData.startChoiceTime).format("YYYY-MM-DD HH:mm")}}
{{$moment(viewData.endChoiceTime).format("YYYY-MM-DD HH:mm")}}
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="逾期选择时间">
<span v-if="viewData.endOverdueChoiceTime">
{{
$moment(viewData.endOverdueChoiceTime).format("YYYY-MM-DD HH:mm")
}}
</span>
<span v-else>暂无</span>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="福利总积分">
{{viewData.totalMoney}}
</el-form-item>
</el-col>
<el-col :span="24">
<el-card v-for="item in userSelection" :key="item.id">
<el-row :gutter="20">
<div @click="openGoods(item.goods.id)">
<el-col :span="2">
<el-image
style="width: 100px;height: 100px"
:src="item.goods.imgUrl[0].url"
fit="contain"
v-if="item.goods"></el-image>
</el-col>
<el-col :span="6" v-if="item.goods">
<el-tooltip :content="item.goods.name" placement="top">
<div style="cursor: pointer;color: #0a84ff"
>
{{item.goods.name}}
</div>
</el-tooltip>
</el-col>
</div>
<el-col :span="1">
x{{item.selectNum}}
</el-col>
<el-col :span="11">
<span
v-if="item.shopAddress">收货门店: {{item.shopAddress}}</span>
<span>{{item.receiveAddress}}</span>
</el-col>
<el-col :span="4">
{{item.specificationsName}}
</el-col>
</el-row>
<el-col :span="24">
</el-col>
</el-card>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false" type="primary">关 闭</el-button>
</span>
</el-dialog>
<benefit-goods-info ref="benefitGoodsInfo"></benefit-goods-info>
</div>
`,
dicts: ["BENEFIT_FESTIVAL", "BENEFIT_SIGN_MODE", "BENEFIT_PROVIDE_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
userSelection: [],
viewData: {},
visibleDialog: false
}
},
components: {
"benefit-goods-info": BENEFIT_GOODS_INFO
},
methods: {
openGoods(id) {
this.$refs.benefitGoodsInfo.open(id)
},
async findOneBenefit(id) {
const res = await this.$axios.post("/platform/benefit/userSelection/findOneBenefit", { id })
if (res.code === 0) {
this.viewData = res.data
}
},
async selectSelectionBenefit(benefitId) {
const res = await this.$axios.post("/platform/benefit/userSelection/selectSelectionBenefit", { benefitId })
if (res.code === 0) {
this.userSelection = res.data
}
},
async open(id) {
await this.selectSelectionBenefit(id)
await this.findOneBenefit(id)
this.userSelection.map(v => {
const data = this.viewData.benefitGoodsList.find(b => b.id === v.goodsId)
v.goods = data
if (v.specificationsId) {
const specifications = data.benefitGoodsSpecificationsList.find(x => x.id === v.specificationsId)
v.specificationsName = specifications.name
}
})
this.visibleDialog = true
}
}
}
@@ -0,0 +1,302 @@
<!--#
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-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入协会名称"
clearable
style="width: 100%"
v-model="pageForm.clubName"
></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="协会列表">
<el-radio-group v-model="hasJoin" @change="joinChange" size="small">
<el-radio-button :label="false">{{'可加入协会' + noJoinCount + '(入会)'}}</el-radio-button>
<el-radio-button :label="true">{{'已加入协会' + hasJoinCount + '(退会)'}}</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="协会编码" sortable prop="clubCode"></el-table-column>
<el-table-column label="协会名称" prop="clubName" show-overflow-tooltip width="200px"></el-table-column>
<el-table-column label="成立时间" prop="foundTime"></el-table-column>
<el-table-column label="会长" prop="clubLeader" show-overflow-tooltip></el-table-column>
<el-table-column label="秘书长" prop="clubSecretary" show-overflow-tooltip></el-table-column>
<!-- <el-table-column sortable label="联系人" show-overflow-tooltip prop="concatPersonName"></el-table-column>-->
<!-- <el-table-column label="联系人电话" show-overflow-tooltip prop="concatPersonMobile"></el-table-column>-->
<el-table-column sortable label="当前人数" show-overflow-tooltip prop="currentPeopleNum"></el-table-column>
<!-- <el-table-column label="在职人数" show-overflow-tooltip prop="workNum"></el-table-column>-->
<!-- <el-table-column label="退休人数" show-overflow-tooltip prop="retireNum"></el-table-column>-->
<!-- <el-table-column v-if="hasJoin === true" label="入会状态" sortable>-->
<!-- <template slot-scope="scope">-->
<!-- <el-tag size="mini" v-if="scope.row.status==1" type="primary">待协会审核</el-tag>-->
<!-- <el-tag size="mini" type="danger" v-if="scope.row.status==2">协会不通过</el-tag>-->
<!-- <el-tag size="mini" v-if="scope.row.status==3" type="primary">待校工会审核</el-tag>-->
<!-- <el-tag size="mini" type="danger" v-if="scope.row.status==4">校工会不通过</el-tag>-->
<!-- <el-tag size="mini" v-if="scope.row.status==5" type="success">审核通过</el-tag>-->
<!-- <el-tag size="mini" type="info" v-if="!scope.row.status">暂无</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column v-if="hasJoin === true" label="退会状态" sortable>-->
<!-- <template slot-scope="scope">-->
<!-- <el-tag size="mini" type="primary" v-if="scope.row.exitStatus==1">待协会审核</el-tag>-->
<!-- <el-tag size="mini" type="danger" v-if="scope.row.exitStatus==2">协会不通过</el-tag>-->
<!-- <el-tag size="mini" type="primary" v-if="scope.row.exitStatus==3">待校工会审核</el-tag>-->
<!-- <el-tag size="mini" type="danger" v-if="scope.row.exitStatus==4">校工会不通过</el-tag>-->
<!-- <el-tag size="mini" type="success" v-if="scope.row.exitStatus==5">审核通过</el-tag>-->
<!-- <el-tag size="mini" type="info" v-if="!scope.row.exitStatus">暂无</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="操作" width="250px">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="openDetail(scope.row)">查看</el-button>
<el-button size="mini" v-if="hasJoin === false" type="primary" @click="doSubmit(scope.row)">申请加入</el-button>
<!-- <el-button size="mini" v-if="hasJoin === true && scope.row.status == 1" type="danger" @click="doRevocation(scope.row.id)">-->
<!-- 撤销加入申请-->
<!-- </el-button>-->
<!-- <el-button-->
<!-- size="mini"-->
<!-- v-if="hasJoin === true && scope.row.status==5 && !scope.row.exitStatus"-->
<!-- type="primary"-->
<!-- @click="exitClub(scope.row)"-->
<!-- >-->
<!-- 申请退会-->
<!-- </el-button>-->
<!-- <el-button-->
<!-- size="mini"-->
<!-- v-if="hasJoin === true && scope.row.status!=1 && scope.row.exitStatus==1"-->
<!-- type="danger"-->
<!-- @click="cancelExitClub(scope.row.id)"-->
<!-- >-->
<!-- 撤销退会申请-->
<!-- </el-button>-->
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<el-descriptions class="margin-top" title="" :column="3" border>
<el-descriptions-item span="2">
<template slot="label">协会名称</template>
<div v-html="viewData.clubName"></div>
</el-descriptions-item>
<el-descriptions-item label="成立时间">{{viewData.foundTime}}</el-descriptions-item>
<el-descriptions-item label="协会编码">{{viewData.clubCode}}</el-descriptions-item>
<el-descriptions-item label="协会类型">{{viewData.typeName}}</el-descriptions-item>
<el-descriptions-item label="发起人">{{viewData.sponsorName}}</el-descriptions-item>
<el-descriptions-item>
<template slot="label">报名联系人</template>
{{viewData.concatPersonName}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">联系人电话</template>
{{viewData.concatPersonMobile}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">联系人邮箱</template>
{{viewData.concatPersonEmail}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">会费标准</template>
{{viewData.due}}
</el-descriptions-item>
<el-descriptions-item :span="2">
<template slot="label">当前人数</template>
{{viewData.currentPeopleNum}}
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">协会介绍</template>
<div class="text-left" v-html="viewData.introduce"></div>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">协会宗旨</template>
<div class="text-left" v-html="viewData.purpose"></div>
</el-descriptions-item>
<!--<el-descriptions-item span="1.5">
<template slot="label">QQ群二维码</template>
<file-upload
v-if="viewData.QQGroupCode && viewData.QQGroupCode.length > 0"
:files="JSON.parse(viewData.QQGroupCode)"
:view="true"
></file-upload>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">微信群二维码</template>
<file-upload
v-if="viewData.wechatGroupCode && viewData.wechatGroupCode.length > 0"
:files="JSON.parse(viewData.wechatGroupCode)"
:view="true"
></file-upload>
</el-descriptions-item>-->
<el-descriptions-item span="1.5">
<template slot="label">协会章程</template>
<file-preview :files="viewData.rulesFile" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">年度活动计划</template>
<file-preview :files="viewData.yearPlanFile" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
</template>
</guava>
</div>
<script>
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {},
data() {
return {
viewData: {},
hasJoin: false,
hasJoinCount: 0,
noJoinCount: 0,
clickRow: {}
}
},
methods: {
async doSubmit(row) {
this.$axios.post("/platform/club/join/apply/checkApplyClub", { clubId: row.id }).then((res) => {
if (res.code === 0) {
this.$store.dispatch("pjaxRoute", "/platform/club/join/apply?clubId=" + row.id)
}
})
// const { code, data, msg } = await this.$axios.post("/platform/club/applyJoin/apply/getInClubByCurUser")
// if (code !== 0) {
// this.$message.warning(msg)
// return
// }
// let str = "您还没有参加协会"
// if (data && data.length > 0) {
// str = "您已经加入了"
// data.forEach((item) => {
// str += "【" + item.clubName + "】"
// })
// }
// str += ",请确认是否申请加入【" + row.clubName + "】?"
// const confirm = await this.$confirm(str, "提示", {
// confirmButtonText: "确定",
// cancelButtonText: "取消",
// type: "warning"
// })
// if (confirm === "confirm") {
// const resp = await this.$axios.post("/platform/club/applyJoin/apply/submit", { id: row.id })
// if (resp.code === 0) {
// this.$message.success(resp.msg)
// await this.getCount()
// await this.pageData()
// } else {
// this.$message.warning(resp.msg)
// }
// }
},
async exitClub(row) {
const confirm = await this.$confirm("您确定要申请退会吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/club/applyJoin/apply/exitClub", { id: row.id })
if (resp.code === 0) {
await this.getCount()
this.pageData()
await this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
}
},
async cancelExitClub(id) {
const confirm = await this.$confirm("您确定要撤销申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/club/applyJoin/apply/cancelExitClub", { id: id })
if (resp.code === 0) {
await this.getCount()
await this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
}
},
async doRevocation(id) {
const confirm = await this.$confirm("您确认要撤销申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/club/applyJoin/apply/revocation", { id: id })
if (resp.code === 0) {
this.$message.success(resp.msg)
await this.getCount()
await this.pageData()
} else {
this.$message.warning(resp.msg)
}
}
},
async openDetail(row) {
const resp = await this.$axios.post("/platform/club/applyJoin/apply/findOne", { id: row.id })
if (resp.code === 0) {
this.viewData = resp.data
this.$refs.guava.view()
} else {
this.$message.warning(resp.msg)
}
},
joinChange(val) {
this.pageForm.hasJoin = val
this.tableData = []
this.doSearch()
},
async getCount() {
const resp = await this.$axios.post("/platform/club/applyJoin/apply/getCount")
this.hasJoinCount = resp.data.hasJoinCount
this.noJoinCount = resp.data.noJoinCount
},
pageData() {
this.pageForm.hasJoin = this.hasJoin
this.$axios.post("/platform/club/applyJoin/apply/pageData", this.pageForm).then((res) => {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
})
}
},
async created() {
await this.getCount()
await this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,213 @@
<!--#
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-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="协会:">
<el-select clearable filterable placeholder="请选择协会" v-model="pageForm.clubId">
<el-option :label="item.clubName" :value="item.id" :key="item.id" v-for="item in clubOptions"></el-option>
</el-select>
</search-item>
<search-item label="人员类型:">
<dict-select code="PERSON_TYPE" placeholder="请选择人员类型" clearable v-model="pageForm.personType"></dict-select>
</search-item>
<search-item label="人员状态:">
<dict-select clearable code="USER_STATE" placeholder="请选择人员状态" v-model="pageForm.userState"></dict-select>
</search-item>
<search-item label="所属单位:">
<el-select clearable filterable placeholder="请选择所属单位" v-model="pageForm.unitId">
<el-option :label="item.name" :value="item.id" :key="item.id" v-for="item in unitList"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="申请列表">
<el-radio-group @change="(val) => doSearch()" style="margin-right: 10px" v-model="pageForm.applyType" size="small">
<el-radio-button :label="1">申请加入</el-radio-button>
<el-radio-button :label="2">申请退会</el-radio-button>
</el-radio-group>
<el-radio-group @change="(val) => doSearch()" style="margin-right: 10px" v-model="pageForm.auditType" size="small">
<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>
<el-button @click="openPayed(true)" sizi="small" type="success" size="small">通过</el-button>
<el-button @click="openPayed(false)" sizi="small" type="danger" size="small">不通过</el-button>
</table-tool>
<el-table
:data="tableData"
@selection-change="handleSelectionChange"
@sort-change="pageOrder"
ref="multipleTable"
row-key="id"
style="width: 100%"
>
<el-table-column
:reserve-selection="true"
:selectable="(row, index) => {return row.status === 1 || row.exitStatus === 1}"
type="selection"
v-if="pageForm.auditType !== 2"
width="55"
></el-table-column>
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="协会名称" prop="clubName" show-overflow-tooltip sortable></el-table-column>
<el-table-column label="工号" prop="loginName" sortable width="100"></el-table-column>
<el-table-column label="姓名" prop="userName" sortable width="100"></el-table-column>
<el-table-column label="性别" prop="sex" sortable width="80"></el-table-column>
<el-table-column label="年龄" prop="birthday" width="60">
<template slot-scope="scope">
<span>{{getAge(scope.row)}}</span>
</template>
</el-table-column>
<el-table-column label="电话" prop="mobile" width="120"></el-table-column>
<el-table-column label="是否会员" prop="status" width="80">
<template slot-scope="scope">
<span v-if="scope.row.status != 5"></span>
<span style="color: #236eb4" v-if="scope.row.status === 5"></span>
</template>
</el-table-column>
<el-table-column label="人员类型" prop="personType" show-overflow-tooltip></el-table-column>
<el-table-column label="所属单位" prop="unitName" show-overflow-tooltip sortable></el-table-column>
<el-table-column label="申请时间" prop="joinTime" show-overflow-tooltip sortable></el-table-column>
<el-table-column v-if="pageForm.applyType === 1" label="入会状态" prop="status">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.status==1">待协会审核</el-tag>
<el-tag type="danger" v-if="scope.row.status==2">协会不通过</el-tag>
<el-tag type="primary" v-if="scope.row.status==3">待校工会审核</el-tag>
<el-tag type="danger" v-if="scope.row.status==4">校工会不通过</el-tag>
<el-tag type="success" v-if="scope.row.status==5">审核通过</el-tag>
</template>
</el-table-column>
<el-table-column v-if="pageForm.applyType === 2" label="退会状态" prop="exitStatus">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.exitStatus==1">待协会审核</el-tag>
<el-tag type="danger" v-if="scope.row.exitStatus==2">协会不通过</el-tag>
<el-tag type="primary" v-if="scope.row.exitStatus==3">待校工会审核</el-tag>
<el-tag type="danger" v-if="scope.row.exitStatus==4">校工会不通过</el-tag>
<el-tag type="success" v-if="scope.row.exitStatus==5">审核通过</el-tag>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<el-dialog :append-to-body="true" :close-on-click-modal="false" :visible.sync="payDialogVisible" title="是否缴费" width="30%">
<el-form label-width="80px">
<el-form-item label="是否缴费" prop="payed">
<el-radio :label="true" border v-model="payed">已缴费</el-radio>
<el-radio :label="false" border v-model="payed">未缴费</el-radio>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="payDialogVisible = false">取 消</el-button>
<el-button @click="doAudit" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {},
data() {
return {
unitList: [],
clubOptions: [],
multipleSelection: [],
pageForm: {
auditType: 3,
applyType: 1
},
auditResult: false,
payDialogVisible: false,
payed: false
}
},
methods: {
openPayed(flag) {
if (!this.multipleSelection.length) {
this.$message.warning("请先勾选需要进行审核的人员")
return
}
this.auditResult = flag
if (this.pageForm.applyType === 1) {
this.payDialogVisible = true
} else {
this.doAudit()
}
},
async doAudit() {
const ids = this.multipleSelection.map((v) => {
return v.id
})
const confirm = await this.$confirm("您确定要提交审核吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/club/applyJoin/clubAudit/doAudit", {
ids: JSON.stringify(ids),
auditResult: this.auditResult,
auditType: 1,
applyType: this.pageForm.applyType,
payed: this.payed
})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.multipleSelection = []
this.$refs.multipleTable.clearSelection()
this.payDialogVisible = false
this.doSearch()
} else {
this.$message.warning(resp.msg)
}
}
},
getAge(row) {
if (row.birthday === null || row.birthday === undefined) {
return
}
const birthdayTime = new Date(row.birthday).getTime()
const nowTime = new Date().getTime()
return Math.ceil((nowTime - birthdayTime) / 31536000000)
},
handleSelectionChange(val) {
this.multipleSelection = val
},
async getMyMangeClub() {
const { data } = await this.$axios.post("/platform/club/applyJoin/clubAudit/getMyMangeClub")
return data
},
pageData() {
this.pageForm.source = 1
this.$axios.post("/platform/club/applyJoin/clubAudit/pageData", this.pageForm).then((res) => {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
})
}
},
async created() {
this.unitList = await this.$businessTool.listUnit()
this.clubOptions = await this.getMyMangeClub()
await this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,158 @@
const REGISTER_INFO_COMPONENT = {
template: `
<div>
<el-tabs tab-position="top" v-model="activeName">
<el-tab-pane name="1" label="基础信息">
<div class="process-title">协会信息</div>
<el-descriptions :column="4" border class="table_fixed">
<el-descriptions-item label="协会名称">
{{viewData.clubName}}
</el-descriptions-item>
<el-descriptions-item label="成立时间">
{{ viewData.foundTime }}
</el-descriptions-item>
<el-descriptions-item label="协会编码">
{{viewData.clubCode}}
</el-descriptions-item>
<el-descriptions-item label="发起人">
{{ viewData.sponsorName }}
</el-descriptions-item>
<el-descriptions-item label="协会类型" :span="4">
{{ viewData.typeName }}
</el-descriptions-item>
<!-- <el-descriptions-item label="报名联系人">-->
<!-- {{ viewData.concatPersonName }}-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="联系人电话">-->
<!-- {{ viewData.concatPersonMobile }}-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="联系人邮箱">-->
<!-- {{ viewData.concatPersonEmail }}-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="申请时间">
{{viewData.createTime}}
</el-descriptions-item>
<el-descriptions-item :span="3" label="会费标准">
{{viewData.due}}
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">协会介绍</template>
<div class="text-left" v-html="viewData.introduce"></div>
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">活动形式</template>
<div class="text-left" v-html="viewData.purpose"></div>
</el-descriptions-item>
<!--<el-descriptions-item span="2">
<template slot="label">QQ群二维码</template>
<file-preview :files="viewData.QQGroupCode" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">微信群二维码</template>
<file-preview :files="viewData.wechatGroupCode" complete_result></file-preview>
</el-descriptions-item>-->
<el-descriptions-item span="4">
<template slot="label">申请成立报告</template>
<file-preview :files="viewData.establishReport" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">章程草案</template>
<file-preview :files="viewData.rulesFile" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">经费来源及管理办法</template>
<file-preview :files="viewData.manageFile" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">年度活动计划</template>
<file-preview :files="viewData.yearPlanFile" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">其他附件</template>
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
<!--<el-descriptions-item span="2">
<template slot="label">校工会批复附件</template>
<file-preview :files="viewData.schoolReplyFile" complete_result></file-preview>
</el-descriptions-item>-->
</el-descriptions>
</el-tab-pane>
<el-tab-pane name="2" label="成员信息">
<div class="process-title">成员信息</div>
<el-table :data="viewData.clubUser" size="small" border
:header-cell-style="{background:'#F5F5F5',color:'#606266'}">
<el-table-column label="人员身份" width="150px" prop="roleCode">
<template v-slot="scope">
<span>{{getRoleName(scope.row.roleCode)}}</span>
</template>
</el-table-column>
<el-table-column label="工号" width="150px" prop="loginName"></el-table-column>
<el-table-column label="姓名" width="150px" prop="userName"></el-table-column>
<el-table-column label="性别" width="150px" prop="sex"></el-table-column>
<el-table-column label="电话" width="150px" prop="mobile"></el-table-column>
<el-table-column label="人员状态" width="150px" prop="userState"></el-table-column>
<el-table-column label="所属单位" prop="unitName"></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="3" label="审核记录">
<template v-if="viewData.nodeTasks && viewData.nodeTasks.length > 0">
<div v-for="nodeTask in viewData.nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id">
<el-descriptions-item label="审核人">{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回重新填写</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">建议撤销</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{ task.extVariable.approvalOpinion}}</el-descriptions-item>
</el-descriptions>
</div>
</div>
</template>
<template v-else>
<el-empty description="暂无审核记录"></el-empty>
</template>
</el-tab-pane>
</el-tabs>
</div>
`,
data() {
return {
viewData: {},
activeName: "1"
}
},
methods: {
getRoleName(roleCode) {
switch (roleCode) {
case "CLUB_PRESIDENT":
return "会长"
case "CLUB_VICE_PRESIDENT":
return "副会长"
case "CLUB_SECRETARY":
return "秘书长"
case "CLUB_VICE_SECRETARY":
return "副秘书长"
case "CLUB_MEMBER":
return "会员"
default:
return ""
}
},
onOpen(id) {
this.$axios.post("/platform/club/register/common/findOne", { id: id }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
}
},
created() {}
}
@@ -0,0 +1,24 @@
const CLUB_ROLE_CONSTANT = {
CLUB_MEMBER: "CLUB_MEMBER",
CLUB_MANAGER: "CLUB_MANAGER",
CLUB_PRESIDENT: "CLUB_PRESIDENT",
CLUB_VICE_PRESIDENT: "CLUB_VICE_PRESIDENT",
CLUB_SECRETARY: "CLUB_SECRETARY",
CLUB_VICE_SECRETARY: "CLUB_VICE_SECRETARY",
getRoleName(roleCode) {
switch (roleCode) {
case CLUB_ROLE_CONSTANT.CLUB_PRESIDENT:
return "会长"
case CLUB_ROLE_CONSTANT.CLUB_VICE_PRESIDENT:
return "副会长"
case CLUB_ROLE_CONSTANT.CLUB_SECRETARY:
return "秘书长"
case CLUB_ROLE_CONSTANT.CLUB_VICE_SECRETARY:
return "副秘书长"
case CLUB_ROLE_CONSTANT.CLUB_MEMBER:
return "会员"
default:
return ""
}
}
}
@@ -0,0 +1,110 @@
const clubUserJoin = {
template:
/*language=HTML*/
`
<div>
<div>
<div class="process-title">
申请信息
</div>
<el-descriptions border>
<el-descriptions-item label="姓名">
{{viewData.userName}}
</el-descriptions-item>
<el-descriptions-item label="工号">
{{viewData.loginName}}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{viewData.sex}}
</el-descriptions-item>
<el-descriptions-item label="出生年月">
{{viewData.birthday}}
</el-descriptions-item>
<el-descriptions-item label="联系电话">
{{viewData.mobile}}
</el-descriptions-item>
<el-descriptions-item label="电子信箱">
{{viewData.email}}
</el-descriptions-item>
<el-descriptions-item label="分工会">
{{viewData.unionName}}
</el-descriptions-item>
<el-descriptions-item label="部门" :span="2">
{{viewData.unitName}}
</el-descriptions-item>
<el-descriptions-item label="职务">
{{viewData.governmentPosition}}
</el-descriptions-item>
<el-descriptions-item label="职称" :span="2">
{{viewData.technicalTitle}}
</el-descriptions-item>
<el-descriptions-item label="学历">
{{viewData.education}}
</el-descriptions-item>
<el-descriptions-item label="学位" :span="2">
{{viewData.academicDegree}}
</el-descriptions-item>
<el-descriptions-item label="同时参加其他协会情况" :span="3">
{{viewData.sameTimeJoinOtherClubSituation}}
</el-descriptions-item>
<el-descriptions-item label="文化、体育方面的活动经历、获奖情况" :span="3">
{{viewData.awardsExperience}}
</el-descriptions-item>
<el-descriptions-item label="照片" :span="3">
<img :src="viewData.avatar" alt="" style="width: 120px;height: 150px" v-if="viewData.avatar">
</el-descriptions-item>
</el-descriptions>
</div>
<div v-for="nodeTask in viewData.nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id">
<el-descriptions-item label="审核人">{{ task.actualOwnerLoginName + '-' +
task.actualOwnerUserName }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回重新填写
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝
</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{ task.extVariable.approvalOpinion}}
</el-descriptions-item>
<!-- <el-descriptions-item label="签字" :span="3">-->
<!-- <el-image :src="task.extVariable.approvalSignature"-->
<!-- v-if="task.extVariable && task.extVariable.approvalSignature"-->
<!-- class="signature-image"></el-image>-->
<!-- </el-descriptions-item>-->
</el-descriptions>
</div>
</div>
</div>
`,
data() {
return {
viewData: {},
activeName: "first",
isScrollNow: "0"
}
},
methods: {
onOpen(id) {
this.$axios.post("/platform/club/join/common/info", { id }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
}
}
}
@@ -0,0 +1,206 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card v-if="isCanApply" shadow="never">
<h5 style="text-align: center; color: #0e5996; margin-bottom: 20px">年度优秀协会申报</h5>
<el-form :model="formData" ref="form" :rules="formRules" label-width="120px" style="padding: 0 30px">
<el-row :gutter="30">
<el-col :span="8">
<el-form-item label="开始年份" prop="applyStartYear" :rules="{required: true, message: '请选择开始年份', trigger: 'blur'}">
<el-date-picker
placeholder="请选择开始年份"
:clearable="false"
style="width: 100%"
:disabled="isCanApply === false"
type="year"
v-model="formData.applyStartYear"
value-format="yyyy"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="结束年份" prop="applyEndYear" :rules="{required: true, message: '请选择结束年份', trigger: 'blur'}">
<el-date-picker
placeholder="请选择结束年份"
:clearable="false"
style="width: 100%"
:disabled="isCanApply === false"
type="year"
v-model="formData.applyEndYear"
value-format="yyyy"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="协会名称" prop="clubId" :rules="{required: true, message: '请选择协会', trigger: 'blur'}">
<el-select
v-model="formData.clubId"
placeholder="请选择协会"
filterable
clearable
style="width: 100%"
:disabled="isCanApply === false"
>
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item
label="近两年获得的集体荣誉称号"
prop="evaluateName"
:rules="{required: true, message: '请填写近两年获得的集体荣誉称号', trigger: 'blur'}"
>
<text-editor v-model="formData.evaluateName"></text-editor>
</el-form-item>
<el-form-item
label="近两年组织活动及完成情况"
prop="yearActivity"
:rules="{required: true, message: '请填写近两年年度组织活动及完成情况', trigger: 'blur'}"
>
<text-editor v-model="formData.yearActivity"></text-editor>
</el-form-item>
<el-form-item required label="附件上传" prop="files">
<file-upload
:value.sync="formData.files"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="drag"
accept=".doc,.docx,.xls,.xlsx,.pdf"
></file-upload>
</el-form-item>
</el-form>
<el-row class="mt20" justify="end" type="flex">
<el-button v-if="id !== ''" @click="doBack">返回</el-button>
<el-button :disabled="isCanApply === false" type="primary" @click="doSave">保存</el-button>
<el-button :disabled="isCanApply === false" type="primary" @click="doSubmit">提交</el-button>
</el-row>
</el-card>
<el-card v-else shadow="never">
<el-empty style="height: 88vh" description="抱歉,当前年份不能申请,考核周期:每两年考核一次,逢双数年进行考核。"></el-empty>
</el-card>
</guava>
</div>
<script>
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
let validFiles = (rule, value, callback) => {
if (!this.formData.files || this.formData.files.length === 0) {
callback(new Error("请上传附件"))
} else {
callback()
}
}
return {
id: GetQueryString("id"),
formRules: {
files: [{ validator: validFiles, trigger: ["blur", "change"] }]
},
clubList: [],
formData: {
applyStartYear: "",
applyEndYear: "",
clubId: "",
evaluateName: "",
yearActivity: ""
},
isCanApply: true
}
},
components: {},
methods: {
doBack() {
if (GetQueryString("id") !== "") {
this.$store.dispatch("pjaxRoute", "/platform/club/evaluate/mine")
}
},
doSave() {
this.$axios.post("/platform/club/evaluate/apply/doSave", { evaluate: JSON.stringify(this.formData) }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$store.dispatch("pjaxRoute", "/platform/club/evaluate/mine")
}
})
},
async doSubmit() {
const valid = await this.$refs["form"].validate()
if (valid) {
const confirm = await this.$confirm("确定要提交此申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
})
if ("confirm" === confirm) {
let data = clone(this.formData)
if (data.files) {
data.files = JSON.stringify(data.files)
}
const resp = await this.$axios.post("/platform/club/evaluate/apply/doSubmit", {
evaluate: JSON.stringify(data)
})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$store.dispatch("pjaxRoute", "/platform/club/evaluate/mine")
} else {
this.$message.warning(resp.msg)
}
}
}
},
async initData() {
this.$set(this.formData, "applyStartYear", new Date().getFullYear() - 1 + "")
this.$set(this.formData, "applyEndYear", new Date().getFullYear() + "")
const id = GetQueryString("id")
if (id) {
const resp = await this.$axios.post("/platform/club/evaluate/apply/info", { id })
if (resp.code === 0) {
this.formData = resp.data
}
}
},
//获取当前登录用户管理的协会
async getMyClubAndYearAuditPass() {
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
year: new Date().getFullYear()
})
this.clubList = resp.data
if (this.clubList) {
this.$set(this.formData, "clubId", this.clubList[0].id)
}
}
},
async created() {
const year = this.$moment().format("YYYY")
// this.isCanApply = year % 2 === 0
// if (this.isCanApply === false) {
// this.$alert("当前年份(" + year + ")不能进行年度优秀协会申报", "温馨提示", {
// confirmButtonText: "确定"
// })
// }
await this.getMyClubAndYearAuditPass()
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,187 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></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 v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.audit" @change="doSearch" size="small">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column label="年度" prop="applyTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ $moment(row.applyTime).format('YYYY') }}</span>
</template>
</el-table-column>
<el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<evaluate-info ref="evaluateInfoRef"></evaluate-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/evaluateInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {
clubId: "",
year: this.$moment().format("YYYY"),
audit: false
},
viewData: {},
clubList: [],
showApprovalForm: false
}
},
components: {
"evaluate-info": EVALUATE_INFO_COMPONENT
},
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.evaluateInfoRef.onOpen(row.id)
this.showApprovalForm = false
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.$refs.evaluateInfoRef.onOpen(row.id)
this.formData = row.approvalParam
this.showApprovalForm = true
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
async pageData() {
let form = clone(this.pageForm)
if (form.isAudit === null) {
delete form.isAudit
}
const resp = await this.$axios.post("/platform/club/evaluate/clubAudit/pageData", form)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.$message.warning(resp.msg)
}
},
//获取当前登录用户管理的协会并且年度审核通过的
async getMyClubAndYearAuditPass() {
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
year: this.pageForm.year
})
this.clubList = resp.data
}
},
async created() {
await this.getMyClubAndYearAuditPass()
await this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,85 @@
const EVALUATE_INFO_COMPONENT = {
template: `
<div>
<el-tabs tab-position="top" v-model="activeName">
<el-tab-pane name="1" label="基础信息">
<div class="process-title">基础信息</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="协会名称">
{{viewData.clubName}}
</el-descriptions-item>
<el-descriptions-item label="协会编码">
{{viewData.clubCode}}
</el-descriptions-item>
<el-descriptions-item label="协会类型">
{{viewData.typeName}}
</el-descriptions-item>
<el-descriptions-item label="成立时间">
{{viewData.foundTime}}
</el-descriptions-item>
<el-descriptions-item label="申报年份">
{{$moment(viewData.applyTime).format('YYYY')}}
</el-descriptions-item>
<el-descriptions-item label="申报时间">
{{viewData.applyTime}}
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">附件</template>
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">两年获得的集体荣誉称号</template>
<div class="text-left" v-html="viewData.evaluateName"></div>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">年度组织活动及完成情况</template>
<div class="text-left" v-html="viewData.yearActivity"></div>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane name="2" label="审核记录">
<template v-if="viewData.nodeTasks && viewData.nodeTasks.length > 0">
<div v-for="nodeTask in viewData.nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id">
<el-descriptions-item label="审核人">{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回重新填写</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">建议撤销</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{ task.extVariable.approvalOpinion}}</el-descriptions-item>
</el-descriptions>
</div>
</div>
</template>
<template v-else>
<el-empty description="暂无审核记录"></el-empty>
</template>
</el-tab-pane>
</el-tabs>
</div>
`,
data() {
return {
viewData: {},
activeName: "1"
}
},
methods: {
onOpen(id) {
this.$axios.post("/platform/club/evaluate/common/findOne", { id: id }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
}
}
}
@@ -0,0 +1,162 @@
<!--#
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"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="协会名称:">
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
</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">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ row.foundTime ? $moment(row.foundTime).format('YYYY-MM-DD') : '' }}</span>
</template>
</el-table-column>
<el-table-column label="年度" prop="applyTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ $moment(row.applyTime).format('YYYY') }}</span>
</template>
</el-table-column>
<el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="[10,40,70].includes(row.processInstanceNodeCode)" @click="openEdit(row)" size="mini" type="primary">
编辑
</el-button>
<el-button
v-if="[20].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
</el-button>
<el-button v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])" @click="deleteDo(row)" size="mini" type="danger">
删除
</el-button>
<el-button v-else-if="[10].includes(row.processInstanceNodeCode)" @click="deleteDo(row)" size="mini" type="danger">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<evaluate-info ref="evaluateInfoRef"></evaluate-info>
</template>
</guava>
</div>
<script>
<!--#include("../common/evaluateInfo.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"evaluate-info": EVALUATE_INFO_COMPONENT
},
data() {
return {
pageForm: {
clubId: "",
year: this.$moment().format("YYYY")
},
clubList: []
}
},
methods: {
openRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/club/evaluate/mine/revokeApply", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openAdd() {
this.$store.dispatch("pjaxRoute", "/platform/club/evaluate/apply")
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.evaluateInfoRef.onOpen(row.id)
})
},
openEdit(row) {
this.$store.dispatch("pjaxRoute", "/platform/club/evaluate/apply?id=" + row.id)
},
async deleteDo(row) {
const confirm = await this.$confirm("此操作将永久删除, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/club/evaluate/mine/doDelete", { id: row.id })
this.$message.success(resp.msg)
this.doSearch()
}
},
async pageData() {
const resp = await this.$axios.post("/platform/club/evaluate/mine/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 getMyClubAndYearAuditPass() {
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
year: this.pageForm.year
})
this.clubList = resp.data
}
},
async created() {
await this.getMyClubAndYearAuditPass()
await this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,188 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style></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 v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.audit" @change="doSearch" size="small">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ row.foundTime ? $moment(row.foundTime).format('YYYY-MM-DD') : '无' }}</span>
</template>
</el-table-column>
<el-table-column label="年度" prop="applyYear" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ $moment(row.applyTime).format('YYYY') }}</span>
</template>
</el-table-column>
<el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<evaluate-info ref="examineInfoRef"></evaluate-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/evaluateInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["PROCESS_INSTANCE_STATE"],
data() {
return {
pageForm: {
clubId: "",
year: this.$moment().format("YYYY"),
audit: false
},
viewData: {},
clubList: [],
showApprovalForm: false
}
},
components: {
"evaluate-info": EVALUATE_INFO_COMPONENT
},
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.showApprovalForm = false
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.formData = row.approvalParam
this.showApprovalForm = true
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
async pageData() {
let form = clone(this.pageForm)
if (form.isAudit === null) {
delete form.isAudit
}
const resp = await this.$axios.post("/platform/club/evaluate/schoolAudit/pageData", form)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.$message.warning(resp.msg)
}
},
//获取当前登录用户管理的协会并且年度审核通过的
async getMyClubAndYearAuditPass() {
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
year: this.pageForm.year
})
this.clubList = resp.data
}
},
async created() {
await this.getMyClubAndYearAuditPass()
await this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,850 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.left-span-label {
color: #236EB4;
margin: 10px 0;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div slot="header" class="clearfix">
<el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="doBack"
v-if="formData.id">返回
</el-button>
<h3 style="color: rgb(24, 103, 176);font-family: Microsoft YaHei,serif;">考核登记</h3>
</div>
<el-steps :active="registerTypeName" finish-status="success" simple>
<el-step title="基础信息"></el-step>
<el-step title="财务收支情况"></el-step>
<el-step title="年末成员名单"></el-step>
</el-steps>
<el-form v-show="registerTypeName === 0" :model="formData" ref="addForm1" :rules="formRules"
label-width="150px"
style="margin-top: 50px">
<!-- <div class="left-span-label">基础信息</div>-->
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item prop="year" label="填报年度"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-date-picker
@change="yearChange"
:disabled="formData.id ? true : false"
format="yyyy"
placeholder="选择填报年度"
style="width: 100%"
type="year"
v-model="formData.year"
value-format="yyyy">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="clubId" label="协会名称">
<el-select v-model="formData.clubId" placeholder="请选择所属协会" filterable
clearable
:disabled="formData.id !== '' && formData.id !== undefined"
@change="changeClub"
style="width: 100%">
<el-option
v-for="item in clubOptions"
:key="item.id"
:label="item.clubName"
: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 prop="foundTime" label="成立时间">-->
<!-- <el-input v-model="formData.foundTime" placeholder="请输入成立时间"-->
<!-- disabled></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item prop="due" label="会费标准">-->
<!-- <el-input v-model="formData.due" placeholder="请输入会费标准"-->
<!-- readonly></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="本年度活动开展情况" prop="yearActivity">
<!-- <el-button @click="formData.yearActivityList.push({})" icon="el-icon-plus" size="mini"-->
<!-- style="float: right;margin-bottom: 10px">-->
<!-- 添加-->
<!-- </el-button>-->
<span style="color: red">说明:非赛事活动无需填写赛事举办单位、获奖情况。</span>
<el-table
:data="formData.yearActivityList"
border
size="small"
style="width: 100%">
<el-table-column label="活动时间" prop="activityTime" width="170">
<template slot-scope="{row,$index}">
<el-form-item :prop="'yearActivityList.'+$index+'.activityTime'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<!--<el-date-picker
style="width: 100%"
placeholder="选择日期"
type="date"
v-model="row.activityTime"
value-format="yyyy-MM-dd">
</el-date-picker>-->
<el-input clearable maxlength="100" placeholder="请输入活动时间"
v-model="row.activityTime"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="活动主题/赛事名称" prop="activityName">
<template slot-scope="{row,$index}">
<el-form-item :prop="'yearActivityList.'+$index+'.activityName'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input clearable maxlength="100" placeholder="请输入名称"
v-model="row.activityName"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="活动/赛事主办单位" prop="activityUnit">
<template slot-scope="{row}">
<el-input clearable maxlength="100" placeholder="请输入主办单位"
v-model="row.activityUnit">
</el-input>
</template>
</el-table-column>
<el-table-column label="活动地点" prop="activityAddress">
<template slot-scope="{row,$index}">
<el-form-item :prop="'yearActivityList.'+$index+'.activityAddress'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input clearable maxlength="100" placeholder="请输入活动地点"
v-model="row.activityAddress"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="参加人数" prop="joinNum" width="130">
<template slot-scope="{row,$index}">
<el-form-item :prop="'yearActivityList.'+$index+'.joinNum'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input clearable maxlength="100" placeholder="请输入"
v-model="row.joinNum"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="获奖情况" prop="prize">
<template slot-scope="{row}">
<el-input clearable maxlength="100" placeholder="请输入获奖情况"
v-model="row.prize"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="80">
<template slot="header" slot-scope="scope">
<el-button size="mini" type="primary" icon="el-icon-plus"
@click="formData.yearActivityList.push({})"></el-button>
</template>
<template slot-scope="scope">
<el-button :disabled="formData.yearActivityList.length <= 1"
@click="formData.yearActivityList.splice(scope.$index,1)"
icon="el-icon-delete"
size="mini"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="is-required" label="下一年度活动计划" prop="plans">
<!-- <el-button @click="formData.plans.push({})" icon="el-icon-plus" size="mini"-->
<!-- style="float: right;margin-bottom: 10px">-->
<!-- 添加-->
<!-- </el-button>-->
<el-table
:data="formData.plans"
border
size="small"
style="width: 100%">
<el-table-column label="活动时间" prop="activityTime" width="170">
<template slot-scope="{row,$index}">
<el-form-item :prop="'plans.'+$index+'.activityTime'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<!--<el-date-picker
style="width: 100%"
placeholder="选择日期"
type="date"
v-model="row.activityTime"
value-format="yyyy-MM-dd">
</el-date-picker>-->
<el-input clearable maxlength="100" placeholder="请输入活动时间"
v-model="row.activityTime"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="活动主题/赛事名称" prop="activityName">
<template slot-scope="{row,$index}">
<el-form-item :prop="'plans.'+$index+'.activityName'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input clearable maxlength="100" placeholder="请输入名称"
v-model="row.activityName"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="活动/赛事主办单位" prop="activityUnit">
<template slot-scope="{row,$index}">
<el-form-item :prop="'plans.'+$index+'.activityUnit'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input clearable maxlength="100" placeholder="请输入主办单位"
v-model="row.activityUnit">
</el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="活动地点" prop="activityAddress">
<template slot-scope="{row,$index}">
<el-form-item :prop="'plans.'+$index+'.activityAddress'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input clearable maxlength="100" placeholder="请输入活动地点"
v-model="row.activityAddress"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" width="80">
<template slot="header" slot-scope="scope">
<el-button size="mini" type="primary" icon="el-icon-plus"
@click="formData.plans.push({})"></el-button>
</template>
<template slot-scope="scope">
<el-button :disabled="formData.plans.length<=1"
@click="formData.plans.splice(scope.$index,1)"
icon="el-icon-delete"
size="mini"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item :rules="[{required:true,message:'必填',trigger:['change','blur']}]"
class="is-required" label="工作总结"
prop="summaryFiles">
<file-upload
:value.sync="formData.summaryFiles"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="file"
accept=".doc,.docx,.xls,.xlsx,.pdf"
></file-upload>
</el-form-item>
</el-col>
</el-row>
<!-- <div class="left-span-label">协会成员变化情况</div>-->
<!-- <el-row :gutter="20" type="flex">-->
<!-- <el-col :span="24">-->
<!-- <el-form-item prop="" label="">-->
<!-- <el-table :data="formData.changeUserNum" max-height="300">-->
<!-- <el-table-column label="序号" type="index"-->
<!-- width="50"></el-table-column>-->
<!-- <el-table-column label="人员类型" prop="userState"></el-table-column>-->
<!-- <el-table-column label="年初人员" prop="yearFirstNum"></el-table-column>-->
<!-- <el-table-column label="年度增加" prop="yearAddNum"></el-table-column>-->
<!-- <el-table-column label="年度减少" prop="yearEditNum"></el-table-column>-->
<!-- <el-table-column label="年末人数" prop="thisYearNum"></el-table-column>-->
<!-- </el-table>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
</el-form>
<el-form v-show="registerTypeName===1" :model="cwsz" ref="addForm2" :rules="rules"
label-width="120px"
style="margin: 50px 0 0 0">
<div>
<el-table :data="cwsz.incomeDetailed" max-height="600">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="日期" prop="date" width="170">
<template slot-scope="{row,$index}">
<el-form-item :prop="'incomeDetailed.'+$index+'.date'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-date-picker
style="width: 100%"
placeholder="选择日期"
type="date"
v-model="row.date"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="项目内容" prop="content">
<template slot-scope="{row,$index}">
<el-form-item :prop="'incomeDetailed.'+$index+'.content'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input maxlength="15" v-model="row.content"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="收支类型" prop="incomeType" width="140">
<template slot-scope="{row,$index}">
<el-form-item label-width="0">
<el-select
@change="changeIncomeType(row)"
placeholder="请选择收支类型"
v-model="row.incomeType">
<el-option key="会费收入" label="会费收入"
value="会费收入"></el-option>
<el-option key="校工会拨款" label="校工会拨款"
value="校工会拨款"></el-option>
<el-option key="年度结余" label="年度结余"
value="年度结余"></el-option>
<el-option key="社会赞助" label="社会赞助" value="社会赞助"></el-option>
<el-option key="支出" label="支出" value="支出"></el-option>
<!-- <el-option key="其它" label="其它" value="其它"></el-option>-->
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="金额(元)" prop="money" width="120">
<template slot-scope="{row,$index}">
<el-form-item label-width="0">
<el-input type="number" v-model="row.money"></el-input>
</el-form-item>
</template>
</el-table-column>
<!-- <el-table-column label="年初余额(元)" prop="qcMoney" width="120">-->
<!-- <template slot-scope="{row,$index}">-->
<!-- <el-form-item label-width="0">-->
<!-- <el-input :disabled="$index!=0" @input="inputQcMoney(row)"-->
<!-- type="number" v-model="row.qcMoney"></el-input>-->
<!-- </el-form-item>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="收入(元)" prop="income" width="120">-->
<!-- <template slot-scope="{row,$index}">-->
<!-- <el-form-item label-width="0">-->
<!-- <el-input-->
<!-- :disabled="!['会费收入','校工会拨款','社会赞助','其它'].includes(row.incomeType)"-->
<!-- @input="inputIncome(row)"-->
<!-- maxlength="15"-->
<!-- type="number"-->
<!-- v-model="row.income"></el-input>-->
<!-- </el-form-item>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="支出(元)" prop="expend" width="120">-->
<!-- <template slot-scope="{row,$index}">-->
<!-- <el-form-item label-width="0">-->
<!-- <el-input :disabled="!['支出','其它'].includes(row.incomeType)||$index===0"-->
<!-- @input="inputExpend(row)"-->
<!-- maxlength="15"-->
<!-- type="number"-->
<!-- v-model="row.expend"></el-input>-->
<!-- </el-form-item>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="年度结余(元)" prop="qmMoney" width="120">-->
<!-- <template slot-scope="{row}">-->
<!-- <el-form-item label-width="0">-->
<!-- <el-input disabled maxlength="15"-->
<!-- type="number"-->
<!-- v-model="row.qmMoney"></el-input>-->
<!-- </el-form-item>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="备注" prop="notes">
<template slot-scope="{row}">
<el-form-item label-width="0">
<el-input v-model="row.notes"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template slot="header" slot-scope="{row,$index}">
<el-button @click="cwsz.incomeDetailed.push({})" size="mini"
type="primary">添加明细
</el-button>
</template>
<template slot-scope="{row,$index}">
<el-form-item label-width="0">
<!-- :disabled="[0,1,2].includes($index)"-->
<el-button
@click="deleteIncomeDetailed(row,$index)"
icon="el-icon-delete"
size="mini"
type="danger"
></el-button>
</el-form-item>
</template>
</el-table-column>
</el-table>
</div>
<!-- <div class="mt10">-->
<!-- <el-table :data="cwsz.incomeCensus" max-height="300">-->
<!-- <el-table-column label="去年年度结余(元)" prop="lasYearSurplus">-->
<!-- <template slot-scope="{row}">-->
<!-- <template v-if="lasYearSurplus">-->
<!-- {{row.lasYearSurplus=parseFloat(lasYearSurplus.toFixed(2))}}-->
<!-- </template>-->
<!-- <template v-else>-->
<!-- <template v-if="row.lasYearSurplus">-->
<!-- {{row.lasYearSurplus=parseFloat(row.lasYearSurplus.toFixed(2))}}-->
<!-- </template>-->
<!-- </template>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="会费收入(元)" prop="income">-->
<!-- <template slot-scope="{row}">-->
<!-- <template v-if="income">-->
<!-- {{row.income=parseFloat(income.toFixed(2))}}-->
<!-- </template>-->
<!-- <template v-else>-->
<!-- {{row.income=parseFloat(row.income.toFixed(2))}}-->
<!-- </template>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="校工会拨款(元)" prop="allocate">-->
<!-- <template slot-scope="{row}">-->
<!-- <template v-if="allocate">-->
<!-- {{row.allocate=parseFloat(allocate.toFixed(2))}}-->
<!-- </template>-->
<!-- <template v-else>-->
<!-- {{row.allocate=parseFloat(row.allocate.toFixed(2))}}-->
<!-- </template>-->
<!-- </template>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="社会赞助(元)" prop="support">-->
<!-- <template slot-scope="{row}">-->
<!-- <template v-if="row.support">-->
<!-- {{parseFloat(row.support.toFixed(2))}}-->
<!-- </template>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="年度总支出(元)" prop="totalExpend">-->
<!-- <template slot-scope="{row}">-->
<!-- <template v-if="row.totalExpend">-->
<!-- {{parseFloat(row.totalExpend.toFixed(2))}}-->
<!-- </template>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="年度结余(元)" prop="surplus">-->
<!-- <template slot-scope="{row}">-->
<!-- <template v-if="row.income+row.support+row.allocate+row.lasYearSurplus-row.totalExpend">-->
<!-- {{row.surplus=row.income+row.support+row.allocate+row.lasYearSurplus-row.totalExpend}}-->
<!-- </template>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- </el-table>-->
<!-- </div>-->
</el-form>
<el-form v-show="registerTypeName===2" ref="addForm3" :rules="rules"
label-width="120px"
style="margin: 50px 0px 0px 0px">
<el-table :data="jgUser" max-height="300">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="职务" prop="roleName">
<template slot-scope="scope">
<span v-if="scope.row.roleName">{{scope.row.roleName.replace('协会', '')}}</span>
<span v-else></span>
</template>
</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="mobile"></el-table-column>
</el-table>
</el-form>
<el-row v-if="isRegister === false" class="mt10" justify="end" type="flex">
<el-button @click="doSave" type="primary">
保存
</el-button>
<el-button type="primary"
@click="registerTypeName=registerTypeName-1"
v-show="registerTypeName!==0">上一步
</el-button>
<el-button type="primary" @click="next"
v-show="registerTypeName!=2">下一步
</el-button>
<el-button @click="doSubmit" type="primary"
v-show="registerTypeName===2">提交
</el-button>
</el-row>
<!-- <el-row v-else class="mt10" justify="center" type="flex">-->
<!-- <el-button type="info">{{formData.clubName}}当前年度已提交考核登记</el-button>-->
<!-- </el-row>-->
</el-card>
</guava>
</div>
<script>
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
id: GetQueryString("id"),
jcClubId: "",
isRegister: false,
allocate: 0,
income: 0,
lasYearSurplus: 0,
formData: {
yearActivityList: [{}],
plans: [{}]
},
jgUser: [],
cwsz: {
incomeDetailed: [],
incomeCensus: [{ income: 0, allocate: 0, support: 0, totalExpend: 0, surplus: 0 }]
},
clubOptions: [],
registerTypeName: 0,
rules: {
clubId: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
year: [{ required: true, message: "必填", trigger: ["blur", "change"] }]
}
}
},
methods: {
async getClubsByRole() {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole")
return resp.data
},
doBack() {
this.$store.dispatch("pjaxRoute", "/platform/club/examine/mine")
},
async doSave() {
this.$axios.post("/platform/club/examine/apply/doSave", {
data: JSON.stringify(this.formData),
incomeDetailed: JSON.stringify(this.cwsz.incomeDetailed),
incomeCensus: JSON.stringify(this.cwsz.incomeCensus)
}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$store.dispatch("pjaxRoute", "/platform/club/examine/mine")
}
})
},
async doSubmit() {
const confirm = await this.$confirm("确定要提交此申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
})
if ("confirm" === confirm) {
const resp = await this.$axios.post("/platform/club/examine/apply/doSubmit", {
data: JSON.stringify(this.formData),
incomeDetailed: JSON.stringify(this.cwsz.incomeDetailed),
incomeCensus: JSON.stringify(this.cwsz.incomeCensus)
})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$store.dispatch("pjaxRoute", "/platform/club/examine/mine")
} else {
this.$message.warning(resp.msg)
}
}
},
async next() {
let a = true
let b = true
this.$refs["addForm1"].validate(valid => {
if (!valid) {
a = false
}
})
this.$refs["addForm2"].validate(valid => {
if (!valid) {
b = false
}
})
if ((this.registerTypeName === 0 && a) || (this.registerTypeName === 1 && b)) {
this.jcClubId = this.formData.clubId
if (!this.formData.id && this.registerTypeName === 0) {
await this.getClubMemberMoney(this.formData.clubId)
await this.getXghBkMoney(this.formData.clubId)
await this.getLasYearSurplus(this.formData.clubId)
}
if (!this.jcClubId && !this.formData.id) {
this.cwsz.incomeDetailed = []
}
if (this.cwsz.incomeDetailed && this.cwsz.incomeDetailed.length === 0) {
this.setIncomeDetailed()
}
this.registerTypeName++
} else {
this.$message.warning("请把信息填写完整")
}
},
setIncomeDetailed() {
this.cwsz.incomeDetailed.push({
index: 0,
date: null,
content: new Date().getFullYear() - 1 + "年度结余",
incomeType: "年度结余",
qcMoney: this.lasYearSurplus
})
this.cwsz.incomeDetailed.push({
index: 1,
date: null,
content: "会费收入",
incomeType: "会费收入",
qcMoney: null,
income: this.income
})
this.cwsz.incomeDetailed.push({
index: 2,
date: null,
content: "校工会拨款",
incomeType: "校工会拨款",
qcMoney: null,
income: this.allocate
})
},
async getClubMemberMoney(id) {
const refs = await this.$axios.post("/platform/club/examine/apply/getClubMemberMoney", { clubId: id })
this.income = refs.data ? refs.data : 0
},
async getXghBkMoney(id) {
const refs = await this.$axios.post("/platform/club/examine/apply/getXghBkMoney", { clubId: id })
this.allocate = refs.data ? refs.data : 0
},
async getLasYearSurplus(id) {
const refs = await this.$axios.post("/platform/club/examine/apply/getLasYearSurplus", { clubId: id })
this.lasYearSurplus = refs.data
},
deleteIncomeDetailed(row, index) {
if (this.cwsz.incomeCensus[0].income !== 0) {
this.cwsz.incomeCensus[0].income = this.cwsz.incomeCensus[0].income - (Number(row.income) ? Number(row.income) : 0)
}
if (this.cwsz.incomeCensus[0].support !== 0) {
this.cwsz.incomeCensus[0].support = this.cwsz.incomeCensus[0].support - (Number(row.income) ? Number(row.income) : 0)
}
this.cwsz.incomeCensus[0].totalExpend = this.cwsz.incomeCensus[0].totalExpend - (Number(row.expend) ? Number(row.expend) : 0)
this.cwsz.incomeDetailed.splice(index, 1)
if (this.cwsz.incomeDetailed.length === 0) {
this.cwsz.incomeCensus = [{
income: this.income,
allocate: this.allocate,
support: 0,
totalExpend: 0,
surplus: 0
}]
}
},
changeIncomeType(row) {
if (row.incomeType === "校工会拨款") {
const incomeTypeList = this.cwsz.incomeDetailed.filter(v => v.incomeType === "校工会拨款")
let aa = 0
incomeTypeList.map(v => {
aa = aa + (Number(v.income) ? Number(v.income) : 0)
})
this.cwsz.incomeCensus[0].allocate = aa
} else if (row.incomeType === "社会赞助") {
this.$set(row, "expend", null)
this.inputExpend()
const incomeTypeList = this.cwsz.incomeDetailed.filter(v => v.incomeType === "社会赞助")
let aa = 0
incomeTypeList.map(v => {
aa = aa + (Number(v.income) ? Number(v.income) : 0)
})
this.cwsz.incomeCensus[0].support = aa
} else if (row.incomeType === "支出") {
this.$set(row, "income", null)
this.inputIncome()
const incomeTypeList = this.cwsz.incomeDetailed.filter(v => v.incomeType === "支出")
let aa = 0
incomeTypeList.map(v => {
aa = aa + (Number(v.expend) ? Number(v.expend) : 0)
})
this.cwsz.incomeCensus[0].totalExpend = aa
}
},
inputExpend(row) {
let aa = 0
this.cwsz.incomeDetailed.map(v => {
aa = aa + (Number(v.expend) ? Number(v.expend) : 0)
})
this.cwsz.incomeCensus[0].totalExpend = aa
},
inputIncome(row) {
let sr = 0
this.cwsz.incomeDetailed.map(v => {
sr = sr + (Number(v.income) ? Number(v.income) : 0)
})
this.cwsz.incomeCensus[0].income = sr
//如果从社会赞助切换到支出
if (row.incomeType === "社会赞助") {
const incomeTypeList = this.cwsz.incomeDetailed.filter(v => v.incomeType === "社会赞助")
let aa = 0
incomeTypeList.map(v => {
aa = aa + (Number(v.income) ? Number(v.income) : 0)
})
this.cwsz.incomeCensus[0].support = aa
}
if (row.incomeType === "校工会拨款") {
const incomeTypeList = this.cwsz.incomeDetailed.filter(v => v.incomeType === "校工会拨款")
let aa = 0
incomeTypeList.map(v => {
aa = aa + (Number(v.income) ? Number(v.income) : 0)
})
this.allocate = aa
}
if (row.incomeType === "会费收入") {
const incomeTypeList = this.cwsz.incomeDetailed.filter(v => v.incomeType === "会费收入")
let aa = 0
incomeTypeList.map(v => {
aa = aa + (Number(v.income) ? Number(v.income) : 0)
})
this.income = aa
}
},
inputQcMoney(row) {
this.lasYearSurplus = Number(row.qcMoney)
},
async changeClub(val) {
const club = this.clubOptions.find(v => v.id === val)
this.$set(this.formData, "due", club?.due)
if (club && club.foundTime) {
this.$set(this.formData, "foundTime", this.$moment(club?.foundTime).format("YYYY-MM-DD"))
} else {
this.$set(this.formData, "foundTime", this.$moment().format("YYYY-MM-DD"))
}
this.$set(this.formData, "clubName", club?.clubName)
// await this.getClubUserNum(val)
await this.getJgUser(val)
await this.getCount()
if (this.isRegister) {
this.$message.warning(this.formData.year + "年度已经登记,请勿重复登记")
}
this.jcClubId = ""
},
async getClubUserNum(clubId) {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubUserNum", {
clubId: clubId
})
if (resp.code !== 0) {
this.$message.warning(resp.msg)
return
}
this.$set(this.formData, "changeUserNum", resp.data)
},
async getJgUser(clubId) {
const resp = await this.$axios.post("/platform/club/examine/apply/getJgUser", {
clubId: clubId
})
this.jgUser = resp.data
},
async getClub() {
this.clubOptions = await this.getClubsByRole()
if (this.clubOptions && this.clubOptions.length > 0) {
this.$set(this.formData, "clubId", this.clubOptions[0].id)
}
await this.changeClub(this.formData.clubId)
},
async openEdit(id) {
this.clubOptions = await this.getClubsByRole()
const { data } = await this.$axios.post("/platform/club/examine/apply/info", { id: id })
// if (!data.register.yearActivityList) {
// data.register.yearActivityList = [{}]
// }
// if (!data.register.plans) {
// data.register.plans = [{}]
// }
if (!data.yearActivityList) {
data.yearActivityList = [{}]
}
if (!data.plans) {
data.plans = [{}]
}
if(data.year){
data.year = data.year.toString()
}
this.formData = data
this.$set(this.cwsz, "incomeCensus", data.incomeCensus)
this.$set(this.cwsz, "incomeDetailed", data.detailedList)
await this.getClubUserNum(this.formData.clubId)
await this.getJgUser(this.formData.clubId)
},
//获取当前年度协会有没有登记
async getCount() {
const resp = await this.$axios.post("/platform/club/examine/apply/getCount", {
id: this.formData.clubId,
year: this.formData.year
})
this.isRegister = resp.data > 0
},
async yearChange() {
await this.getCount()
if (this.isRegister) {
this.$message.warning(this.formData.year + "年度已经登记,请勿重复登记")
}
}
},
async created() {
if (this.id) {
this.openEdit(this.id)
} else {
this.$set(this.formData, "year", new Date().getFullYear() + "")
await this.getClub()
// this.getCount()
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,182 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.left-span-label {
margin: 20px 0;
}
</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 v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.audit" @change="doSearch" size="small">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<examine-info ref="examineInfoRef"></examine-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/examineInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {
clubId: "",
year: this.$moment().format("YYYY"),
audit: false
},
viewData: {},
clubList: [],
showApprovalForm: false
}
},
components: {
"examine-info": EXAMINE_INFO_COMPONENT
},
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.showApprovalForm = false
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.formData = row.approvalParam
this.showApprovalForm = true
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
async pageData() {
let form = clone(this.pageForm)
if (form.isAudit === null) {
delete form.isAudit
}
const resp = await this.$axios.post("/platform/club/examine/clubAudit/pageData", form)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.$message.warning(resp.msg)
}
},
async getMyClub() {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole")
this.clubList = resp.data
}
},
async created() {
await this.getMyClub()
await this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,145 @@
const EXAMINE_INFO_COMPONENT = {
template: `
<div>
<el-tabs tab-position="top" v-model="activeName">
<el-tab-pane name="1" label="基础信息">
<div class="process-title">基础信息</div>
<el-descriptions v-if="viewData" :column="3" border class="table_fixed">
<el-descriptions-item label="协会名称">
{{ viewData.clubName }}
</el-descriptions-item>
<el-descriptions-item label="成立时间">
{{ viewData.foundTime }}
</el-descriptions-item>
<el-descriptions-item label="会费标准">
{{ viewData.due }}
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">工作总结</template>
<file-preview :files="viewData.summaryFiles" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
<!-- <div class="process-title">协会成员变化情况</div>-->
<!-- <el-table :data="viewData.changeUserNum" max-height="300">-->
<!-- <el-table-column label="序号" type="index" width="50"></el-table-column>-->
<!-- <el-table-column label="人员类型" prop="userState"></el-table-column>-->
<!-- <el-table-column label="年初人员" prop="yearFirstNum"></el-table-column>-->
<!-- <el-table-column label="年度增加" prop="yearAddNum"></el-table-column>-->
<!-- <el-table-column label="年度减少" prop="yearEditNum"></el-table-column>-->
<!-- <el-table-column label="年末人数" prop="thisYearNum"></el-table-column>-->
<!-- </el-table>-->
</el-tab-pane>
<el-tab-pane name="2" label="本年度活动开展情况">
<div class="process-title">本年度活动开展情况</div>
<el-table :data="viewData.yearActivityList" max-height="300">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="活动时间" prop="activityTime"></el-table-column>
<el-table-column label="活动主题/赛事名称" prop="activityName" show-overflow-tooltip></el-table-column>
<el-table-column label="活动/赛事主办单位" prop="activityUnit" show-overflow-tooltip></el-table-column>
<el-table-column label="活动地点" prop="activityAddress" show-overflow-tooltip></el-table-column>
<el-table-column label="参加人数" prop="joinNum"></el-table-column>
<el-table-column label="获奖情况" prop="prize"></el-table-column>
</el-table>
<div class="process-title">下一年度活动计划</div>
<el-table :data="viewData.plans" max-height="300">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="活动时间" prop="activityTime"></el-table-column>
<el-table-column label="活动主题/赛事名称" prop="activityName" show-overflow-tooltip></el-table-column>
<el-table-column label="活动/赛事主办单位" prop="activityUnit" show-overflow-tooltip></el-table-column>
<el-table-column label="活动地点" prop="activityAddress" show-overflow-tooltip></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="3" label="财务收支情况">
<div class="process-title">财务收支情况</div>
<el-table :data="viewData.detailedList" max-height="600">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="日期" prop="date"></el-table-column>
<el-table-column label="项目内容" prop="content"></el-table-column>
<el-table-column label="收入类型" prop="incomeType"></el-table-column>
<el-table-column label="金额(元)" prop="money"></el-table-column>
<!-- <el-table-column label="年初余额" prop="qcMoney"></el-table-column>-->
<!-- <el-table-column label="收入" prop="income"></el-table-column>-->
<!-- <el-table-column label="支出" prop="expend"></el-table-column>-->
<!-- <el-table-column label="年度结余" prop="qmMoney"></el-table-column>-->
<el-table-column label="备注" prop="notes"></el-table-column>
</el-table>
<!-- <div class="process-title">统计</div>-->
<!-- <el-table v-if="viewData" :data="viewData.incomeCensus" max-height="300">-->
<!-- <el-table-column label="去年年度结余" prop="lasYearSurplus"></el-table-column>-->
<!-- <el-table-column label="会费收入" prop="income"></el-table-column>-->
<!-- <el-table-column label="校工会拨款" prop="allocate"></el-table-column>-->
<!-- <el-table-column label="社会赞助" prop="support"></el-table-column>-->
<!-- <el-table-column label="年度总支出" prop="totalExpend"></el-table-column>-->
<!-- <el-table-column label="年度结余" prop="surplus">-->
<!-- </el-table-column>-->
<!-- </el-table>-->
</el-tab-pane>
<el-tab-pane name="4" label="协会成员">
<div class="process-title">协会成员</div>
<el-table :data="viewData.jgUser">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="职务" prop="roleName"></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" show-overflow-tooltip></el-table-column>
<el-table-column label="联系电话" prop="mobile"></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="5" label="审核记录">
<template v-if="viewData.nodeTasks && viewData.nodeTasks.length > 0">
<div v-for="nodeTask in viewData.nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id">
<el-descriptions-item label="审核人">{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回重新填写</el-tag>
<el-tag type="danger" size="mini" v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">建议撤销</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{ task.extVariable.approvalOpinion}}</el-descriptions-item>
</el-descriptions>
</div>
</div>
</template>
<template v-else>
<el-empty description="暂无审核记录"></el-empty>
</template>
</el-tab-pane>
</el-tabs>
</div>
`,
data() {
return {
viewData: {},
activeName: "1"
}
},
methods: {
async onOpen(id) {
const resp = await this.$axios.post("/platform/club/examine/common/findOne", { id: id })
if (resp.code === 0) {
this.viewData = resp.data
await this.getClubUserNum(resp.data.clubId)
await this.getJgUser(resp.data.clubId)
}
},
async getClubUserNum(clubId) {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubUserNum", {
clubId: clubId
})
this.$set(this.viewData, "changeUserNum", resp.data)
},
async getJgUser(clubId) {
const respUser = await this.$axios.post("/platform/club/examine/apply/getJgUser", {
clubId: clubId
})
this.$set(this.viewData, "jgUser", respUser.data)
}
}
}
@@ -0,0 +1,168 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.left-span-label {
margin: 20px 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"
></el-date-picker>
</search-item>
<search-item label="协会名称:">
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
</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">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="[10,40,70].includes(row.processInstanceNodeCode)" @click="openEdit(row)" size="mini" type="primary">
编辑
</el-button>
<el-button
v-if="[20].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
</el-button>
<el-button v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])" @click="deleteDo(row)" size="mini" type="danger">
删除
</el-button>
<el-button v-else-if="[10].includes(row.processInstanceNodeCode)" @click="deleteDo(row)" size="mini" type="danger">
删除
</el-button>
<!--<el-button
@click="doExport(row)"
v-if="row.processInstState === $processConstant.INSTANCE_STATE.FINISHED"
size="mini"
type="primary"
>
导出
</el-button>-->
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<examine-info ref="examineInfoRef"></examine-info>
</template>
</guava>
</div>
<script>
<!--#include("../common/examineInfo.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"examine-info": EXAMINE_INFO_COMPONENT
},
data() {
return {
pageForm: {
clubId: "",
year: this.$moment().format("YYYY")
},
clubList: []
}
},
methods: {
openRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/club/examine/mine/revokeApply", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openAdd() {
this.$store.dispatch("pjaxRoute", "/platform/club/examine/apply")
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.examineInfoRef.onOpen(row.id)
})
},
openEdit(row) {
this.$store.dispatch("pjaxRoute", "/platform/club/examine/apply?id=" + row.id)
},
async deleteDo(row) {
const confirm = await this.$confirm("此操作将永久删除, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post("/platform/club/examine/mine/doDelete", { id: row.id })
this.$message.success(resp.msg)
this.doSearch()
}
},
async pageData() {
const resp = await this.$axios.post("/platform/club/examine/mine/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 getMyClub() {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole")
this.clubList = resp.data
},
doExport(row) {
this.$downLoad("/platform/club/examine/mine/exportFiles", { id: row.id })
}
},
async created() {
await this.getMyClub()
await this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,182 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.left-span-label {
margin: 20px 0;
}
</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 v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.audit" @change="doSearch" size="small">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<template slot-scope="{row}">
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<examine-info ref="examineInfoRef"></examine-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/examineInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {
clubId: "",
year: this.$moment().format("YYYY"),
audit: false
},
viewData: {},
clubList: [],
showApprovalForm: false
}
},
components: {
"examine-info": EXAMINE_INFO_COMPONENT
},
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.showApprovalForm = false
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.formData = row.approvalParam
this.showApprovalForm = true
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
async pageData() {
let form = clone(this.pageForm)
if (form.isAudit === null) {
delete form.isAudit
}
const resp = await this.$axios.post("/platform/club/examine/schoolAudit/pageData", form)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.$message.warning(resp.msg)
}
},
async getMyClub() {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole")
this.clubList = resp.data
}
},
async created() {
await this.getMyClub()
await this.pageData()
}
})
</script>
<!--#
}
#-->

Some files were not shown because too many files have changed in this diff Show More