Files
2026-09-08 19:49:21 +08:00

407 lines
18 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div id="app" class="platform" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
type="year"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">计划名称</div>
<div class="search-item-option">
<el-input v-model="pageForm.name" placeholder="请输入计划名称" clearable></el-input>
</div>
</div>
<div v-if="window.type === 40002" class="search-item">
<div class="search-item-label">工会名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.tissueId" placeholder="请选择工会" filterable clearable
style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div v-if="window.type === 40003" class="search-item">
<div class="search-item-label">社团</div>
<div class="search-item-option">
<el-select v-model="pageForm.tissueId" placeholder="请选择社团(社团)" filterable clearable
style="width: 100%">
<el-option
v-for="item in clubList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<!-- <template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">项目名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.eventId" placeholder="请选择活动项目" filterable clearable
style="width: 100%">
<el-option
v-for="item in eventList"
:key="item.id"
:label="item.allName"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
</template>-->
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索</el-button>
<!-- <more v-model="searchMore"></more>-->
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<!--<table-tool label="计划列表" :app="this">
&lt;!&ndash;<template #func>
<el-button type="primary" icon="el-icon-edit-outline" size="small"
@click="openAdd">
创建活动计划
</el-button>
</template>&ndash;&gt;
</table-tool>-->
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column prop="year" label="年度"></el-table-column>
<el-table-column v-if="window.type === 40002" prop="unionname" label="所属工会" show-overflow-tooltip>
<template scope="{row}">
<span>{{unionList.find(x => x.id == row.tissueId) === undefined ? '' : unionList.find(x => x.id == row.tissueId).unionname}}</span>
</template>
</el-table-column>
<el-table-column v-if="window.type === 40003" prop="clubname" label="社团" show-overflow-tooltip>
<template scope="{row}">
<span>{{clubList.find(x => x.id == row.tissueId) === undefined ? '' : clubList.find(x => x.id == row.tissueId).name}}</span>
</template>
</el-table-column>
<el-table-column prop="name" label="计划名称" show-overflow-tooltip></el-table-column>
<!--<el-table-column prop="allName" label="活动项目" show-overflow-tooltip>
</el-table-column>-->
<el-table-column prop="activityTypeName" label="活动类型" show-overflow-tooltip></el-table-column>
<el-table-column prop="time" label="计划预计时间" sortable></el-table-column>
<el-table-column prop="money" label="预算费用"></el-table-column>
<!--<el-table-column prop="carryOut" label="计划状态">
<template scope="{row}">
<span v-if="row.carryOut" class="text-success">已执行</span>
<span v-if="!row.carryOut" class="text-primary">未执行</span>
</template>
</el-table-column>-->
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" width="150px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button size="mini" :loading="row.loading">
<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}">
编辑
</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 type="primary" @click="operation">确 定</el-button>
</template>
<template #edit>
<vi-title title="填写计划信息"></vi-title>
<el-form :model="formData" ref="form" :rules="formRules" label-width="100px" label-position="left"
label-suffix="" style="padding: 0 2%">
<!-- <el-form-item prop="type" label="活动类型">
<el-radio-group v-model="formData.type">
<el-radio label="2" border>分工会活动计划</el-radio>
<el-radio label="3" border>社团活动计划</el-radio>
</el-radio-group>
</el-form-item>-->
<el-form-item prop="name" label="计划名称">
<el-input maxlength="50" placeholder="请填写计划名称" v-model="formData.name"
type="text"></el-input>
</el-form-item>
<el-form-item prop="time" label="计划时间">
<el-date-picker
v-model="formData.time"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
<el-form-item prop="event" label="活动项目">
<!--<el-input maxlength="50" placeholder="请填写活动项目" v-model="formData.event"
type="text"></el-input>-->
<el-select v-model="formData.event" placeholder="请选择活动项目" filterable clearable multiple
style="width: 100%">
<el-option
v-for="item in eventList"
:key="item.id"
:label="item.allName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="content" label="计划内容" class="is-required">
<div id="content"></div>
</el-form-item>
</el-form>
</template>
<template #view>
<plan-info ref="info"></plan-info>
</template>
</guava>
</div>
<script>
let E = window.wangEditor
const editors = {}
var vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
let validContent = (rule, value, callback) => {
if (!this.formData.content || !dd3s.html2txt(this.formData.content)) {
callback(new Error('请填写计划内容'));
} else {
callback();
}
};
return {
clubList: [],
planUrl: "/platform/activity/plan",
unionList: [],
eventList: [],
flag: false,
pageForm: {
type: type,
year: new Date().getFullYear() + ''
},
formData: {
name: '',
time: '',
event: '',
content: ''
},
tableColumns: [
{prop: 'name', label: '计划名称'},
{prop: 'time', label: '计划预计时间'},
{prop: 'allName', label: '活动项目'},
{prop: 'carryOut', label: '计划状态'}
],
formRules: {
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
event: [{required: true, message: '必填', trigger: ['blur', 'change']}],
content: [{validator: validContent, trigger: ['blur', 'change']}]
},
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'plan-info': httpVueLoader('/components/activity/school/planInfo.vue'),
},
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)
}
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async openEdit(row) {
if (window.type === 40002) {
sublime.jumpPagePjax('/platform/activity/plan/addUnionPlan?id=' + row.id)
} else if (window.type === 40003) {
sublime.jumpPagePjax('/platform/activity/plan/addClubPlan?id=' + row.id)
} else if (window.type === 40001) {
sublime.jumpPagePjax('/platform/activity/plan/addSchoolPlan?id=' + row.id)
}
},
async openAdd() {
this.formData = {}
this.flag = false
this.$refs.guava.edit()
this.$nextTick(() => {
this.initEditor()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
this.formData = {
type: '40003',
name: '',
time: '',
event: '',
content: ''
}
})
},
async operation() {
let url = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["form"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
this.formData.type = this.pageForm.type
const resp = await $.post(this.planUrl + url, {
id: this.formData.id,
name: this.formData.name,
time: this.formData.time,
content: this.formData.content,
event: JSON.stringify(this.formData.event),
type: this.pageForm.type,
})
if (resp.code === 0) {
this.pageData()
this.$refs.guava.index()
this.notifySuccess(resp.msg)
} else {
this.notifyError(resp.msg)
}
loading.close()
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除该计划吗?', '提示', {type: 'warning'}).then(async () => {
const resp = await $.post(this.planUrl + "/doDelete", {id: id});
if (resp.code === 0) {
this.pageData()
this.$refs.guava.index()
this.notifySuccess(resp.msg)
} else {
this.notifyError(resp.msg)
}
})
},
initEditor() {
let keys = ['content']
keys.forEach(key => {
$("#" + key).html("")
editors[key] = new E('#' + key)
editors[key].config.onchange = (html) => {
this.formData[key] = html
}
editors[key].create()
if (this.formData[key]) {
editors[key].txt.html(this.formData[key])
}
})
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post("/platform/activity/plan/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
async getMyClub() {
return await $.post('/platform/activity/yearSummary/getMyClub')
}
},
async created() {
this.pageData()
this.eventList = await activity.getEvents()
this.unionList = await getUnions(null);
this.clubList = await getClubs()
const isAdmin = "${@shiro.hasAnyRoles('sysadmin', 'A06')}" === 'true'
if (!isAdmin) {
const selfUnion = "${@shiro.getPrincipalProperty('union').getId()}";
this.unionList = [this.unionList.find(x => x.id === selfUnion)]
const clubs = await this.getMyClub()
let clubArray = []
for (let c of Array.from(clubs)) {
const cl = this.clubList.find(x => x.id === c)
if (cl) {
clubArray.push(cl)
}
}
this.clubList = clubArray
}
}
})
</script>