first commit

This commit is contained in:
2026-09-09 09:14:28 +08:00
commit 5343198112
5199 changed files with 1052895 additions and 0 deletions
@@ -0,0 +1,362 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.v-tree-layout-left {
overflow: unset !important;
}
.v-tree-layout-left .v-tree {
width: 100%;
height: calc(100vh - 170px);
overflow-y: auto;
}
.v-tree:hover::-webkit-scrollbar {
width: 3px;
background-color: transparent;
}
.v-tree-layout-left .custom-tree-node {
width: 90%;
position: relative;
display: flex;
align-items: center;
}
.v-tree-layout-left .v-tree .v-node {
width: 100%;
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
::-webkit-scrollbar {
/*width: 3px;*/
/*background-color: transparent;*/
display: none;
}
::-webkit-scrollbar-thumb {
background-color: rgba(0, 0, 0, 0.2);
border-radius: 10px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never" style="height: calc(100vh - 70px)">
<tree-layout>
<template #tree>
<div style="padding:0 20px 20px;">
<el-input placeholder="输入关键字进行查找" v-model="filterText"></el-input>
</div>
<el-tree ref="tree" :data="treeData" class="v-tree" v-loading="treeLoading" node-key="id"
:props="defaultProps"
:default-expanded-keys="['7e3f5fcbc24f442dbb3a6cc9412e7960']" :expand-on-click-node="false"
@node-click="handleNodeClick" accordion
highlight-current :filter-node-method="filterNode">
<div class="custom-tree-node" slot-scope="{ node, data }">
<div v-if="node.level==1" style="font-size: 16px;" class="v-node"><i
class="el-icon-s-home"></i>&nbsp;
{{ data.name }}
</div>
<div v-if="node.level==2"
style="font-size: 15px" :title="data.name" class="v-node">
<i class="el-icon-star-on" v-if="checkData.name==data.name"></i>
<i class="el-icon-star-off" v-else></i>
&nbsp; {{ data.name }}
</div>
<div v-if="node.level==3"
style="font-size: 14px" :title="data.name" class="v-node">
<i class="fa fa-dot-circle-o" v-if="checkData.name==data.name"></i>
<i class="fa fa-circle-o" v-else></i>
&nbsp; {{ data.name }}
</div>
<div v-if="node.level>3"
style="font-size: 14px" :title="data.name" class="v-node">
<i class="fa fa-dot-circle-o" v-if="checkData.name==data.name"></i>
<i class="fa fa-circle-o" v-else></i>
&nbsp; {{ data.name }}
</div>
</div>
</el-tree>
</template>
<template v-if="node.level==1">
<div v-if="node.level==1" style="padding:0 10px">
<el-card shadow="never">
<div class="text-right">
<el-button size="medium" type="primary" @click="openBasicType()">
<i class="el-icon-plus"></i>
新建基础类型
</el-button>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<el-table :data="basicTypeData" height="656px">
<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 prop="name" align="center" label="名称"></el-table-column>
<el-table-column prop="code" align="center" label="代码"></el-table-column>
<el-table-column prop="note" align="center" show-overflow-tooltip
label="备注"></el-table-column>
<el-table-column align="center" label="操作" width="100px">
<template 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}"
:disabled="checkData.code==50000||checkData.code==40000">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}"
:disabled="checkData.code==50000||checkData.code==40000||checkData.code=='jcsjgl'">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="(val)=>{pageForm.pageSize = val;pageData()}"
@current-change="(val)=>{pageForm.pageNumber = val;pageData()}"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-card>
</div>
</template>
</tree-layout>
</el-card>
</guava>
<el-dialog :close-on-click-modal="false" :title="title" :visible.sync="basicTypeDialog" width="50%">
<el-form :model="formData" ref="addForm" :rules="rules" label-width="100px">
<el-row gutter="30">
<el-form-item label="上级名称" prop="name" label-width="110px">
<el-input maxlength="100" disabled :value="checkData.name"
type="text"></el-input>
</el-form-item>
<el-form-item label="基础类型名称" prop="name" label-width="110px">
<el-input maxlength="100" placeholder="请输入基础类型名称" v-model="formData.name"
type="text"></el-input>
</el-form-item>
<el-form-item label="基础类型代码" prop="code" label-width="110px">
<el-input maxlength="100" placeholder="请输入基础类型名称" v-model="formData.code"
type="text"
:disabled="checkData.code==50000||checkData.code==40000||checkData.code=='jcsjgl'"></el-input>
</el-form-item>
<el-form-item label="基础类型备注" prop="note" label-width="110px">
<el-input maxlength="100" placeholder="请输入基础类型备注" v-model="formData.note"
type="textarea"></el-input>
</el-form-item>
</el-row>
</el-form>
<div style="display: flex;justify-content:flex-end;margin-top: 30px">
<el-button type="primary" :loading="loading" @click="!formData.id?doAddType():doEditType()">提 交
</el-button>
</div>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
title: '',
checkData: {},
filterText: '',
treeData: [],
basicTypeData: [],
tableData: [],
treeLoading: true,
basicTypeDialog: false,
loading: false,
defaultProps: {
children: 'child',
label: 'name',
},
node: {
level: 1
},
options: [{
value: 'ziyuan',
label: '资源',
children: [{
value: 'axure',
label: 'Axure Components'
}]
}],
rules: {
name: [{required: true, message: '必填', trigger: ['change', 'blur']}],
code: [{required: true, message: '必填', trigger: ['change', 'blur']}],
},
}
},
components: {
'tree-layout': httpVueLoader('/components/plugins/TreeLayout.vue'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
},
},
methods: {
dropdownCommand: function (command) {
const {type, data} = command
if (type == 'edit') {
this.openEditType(data)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
pageData() {//加载机构数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
this.pageForm.parentId = this.checkData.id
$.post(loc() + "/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.basicTypeData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
filterNode(value, data, node) {
if (!value) return true;
return data.name.indexOf(value) !== -1
return false
},
async handleNodeClick(data, node) {
this.checkData = data
this.checkNode = node
console.log(this.checkData)
this.pageData()
},
async loadTree(flush) {
this.treeLoading = true
const resp = await $.post(loc() + "/getTreeData")
this.treeLoading = false
if(resp.code===0){
this.treeLoading = false
this.treeData = resp.data
}else{
this.notifyWarning(resp.msg)
}
if (flush && resp.code === 0) {
this.checkData = resp.data[0]
this.pageData();
}
},
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) {
this.loading = true
const resp = await $.post(loc() + "/doAdd", this.formData)
this.loading = false
if(resp.code===0){
this.basicTypeDialog = false
this.pageData();
this.loadTree(true)
}else{
this.notifyWarning(resp.msg)
}
}
})
},
doEditType() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
this.loading = true
const resp = await $.post(loc() + "/doEditType", this.formData)
this.loading = false
this.basicTypeDialog = false
if(resp.code===0){
this.pageData();
}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 $.post(loc() + "/doDelete", {id: id})
if(resp.code===0){
this.notifySuccess(resp.msg)
this.pageData()
this.loadTree(true)
}else{
this.notifyWarning(resp.msg)
}
}
}
});
}
},
async created() {
this.loadTree(true)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,713 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="d-search-item btn-group tool-button mr10">
<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-group>
</div>
<div class="d-search-item btn-group tool-button mr10">
<el-checkbox-group @change="doSearch" v-model="pageForm.isMenWomen">
<el-checkbox-button :key="4" :label="4">单项</el-checkbox-button>
<el-checkbox-button :key="5" :label="5">团体</el-checkbox-button>
</el-checkbox-group>
</div>
<div class="d-search-item btn-group tool-button mr10">
<el-select v-model="pageForm.group" @focus="focusGroup"
placeholder="请选择比赛组别" clearable
style="width: 100%">
<el-option
v-for="item in groupList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="d-search-item btn-group tool-button mr10">
<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>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索
</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="比赛项目列表" :app="this">
<template #label_end>
</template>
<template #func>
<el-input type="number" v-model="pageForm.age" placeholder="输入年龄算出身年"
@input="ageInput"
style="width: auto">
<template slot="prepend">年龄计算器</template>
</el-input>
<el-tag class="ml10">{{ pageForm.ageYear }}</el-tag>
<el-date-picker
class="ml10"
v-model="pageForm.ageDate"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd">
</el-date-picker>
<el-button class="ml10" type="primary" icon="el-icon-check"
@click="doAssignmentDate">统赋年龄限制
</el-button>
<el-button type="primary" icon="el-icon-edit-outline"
@click="openAdd">
创建比赛项目
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder"
ref="multipleTable"
v-loading="tableLoading" :size="tableSize" class="vi-table"
@selection-change="handleSelectionChange">
<el-table-column
:reserve-selection="true"
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:width="column.width"
:prop="column.prop" :sortable="column.sortable"
:sortable="column.sortable" show-overflow-tooltip>
<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)" v-model="row.whetherEnable"
active-color="#13ce66"
inactive-color="#ff4949"></el-switch>
</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:'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>
<vi-title title="填写比赛项目信息"></vi-title>
<el-form :model="formData" ref="form" :rules="formRules" label-width="120px"
label-suffix=":">
<el-row gutter="40">
<el-col :span="24">
<el-form-item prop="isInterest" label="是否趣味项目">
<el-checkbox v-model="formData.isInterest">
{{formData.isInterest?'是趣味':'不是趣味'}}
</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="projectCode" label="比赛项目编号">
<el-input v-model="formData.projectCode"
placeholder="请填写比赛项目编号"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="isMenWomen" label="性别">
<el-select v-model="formData.isMenWomen" placeholder="请选择男女分组"
allow-create filterable
default-first-option clearable style="width: 100%">
<el-option
v-for="item in menWomenList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="competitionCategory" label="比赛组别">
<el-select v-model="formData.competitionCategory" @focus="focusGroup"
placeholder="请选择比赛组别"
clearable style="width: 100%">
<el-option
v-for="item in groupList"
:key="item.id"
:label="item.name+'('+item.code+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="distance" label="距离">
<el-select v-model="formData.distance" @focus="focusDistance"
placeholder="请选择距离"
clearable style="width: 100%">
<el-option
v-for="item in distanceList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="exerciseType" label="运动类型">
<el-select v-model="formData.exerciseType" @focus="exerciseType"
@change="changeExercise_typeList" placeholder="请选择运动类型"
filterable
clearable style="width: 100%">
<el-option
v-for="item in exerciseTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="sports" label="运动项目">
<el-select v-model="formData.sports" placeholder="请选择具体运动项目"
clearable style="width: 100%">
<el-option
v-for="item in exerciseTypeList2"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="projectType" label="项目类型">
<el-select v-model="formData.projectType" placeholder="请选择具体运动项目"
allow-create filterable
default-first-option clearable style="width: 100%">
<el-option
v-for="item in projectTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="ageDate" label="年龄限制范围" v-if="formData.projectType==1">
<el-date-picker
style="width: 100%"
v-model="formData.ageDate"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy 年 MM 月 dd 日"
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 type="primary" @click="formData.id?doEdit():doAdd()">提 交</el-button>
</div>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
multipleSelection: [],
groupList: [],
exerciseTypeList: [],
distanceList: [],
exerciseTypeList2: [],
eventDialog: false,
loading: false,
title: "",
pageForm: {
age: 1,
ageYear: null,
activityId: null,
ageDate: null,
isMenWomen: []
},
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: '是否启用'},
],
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']}],
/* competitionCategory: [{required: true, message: '必填', trigger: ['change', 'blur']}],
distance: [{required: true, message: '必填', trigger: ['change', 'blur']}],
exerciseType: [{required: true, message: '必填', trigger: ['change', 'blur']}],
*/
},
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
methods: {
ageInput(val) {
const year = new Date().getFullYear()
this.$set(this.pageForm, "ageYear", year - val)
},
handleSelectionChange(val) {
this.multipleSelection = 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 $.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()
}
},
dropdownCommand(command) {
const {type, row} = command
if (type === 'edit') {
this.openEdit(row)
} else if (type === 'delete') {
this.doDelete(row)
}
},
openAdd() {
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
this.formData = {}
},
//查询比赛组别
async focusGroup() {
const resp = await $.post(loc() + "/focusGroup")
if(resp.code===0){
this.groupList = resp.data
}else{
this.notifyWarning(resp.msg)
}
},
//查询运动类型
async exerciseType() {
const resp = await $.post(loc() + "/exerciseType")
if(resp.code===0){
this.exerciseTypeList = resp.data
}else{
this.notifyWarning(resp.msg)
}
},
//查询距离
async focusDistance() {
const resp = await $.post(loc() + "/focusDistance")
if(resp.code===0){
this.distanceList = resp.data;
}else{
this.notifyWarning(resp.msg)
}
},
//根据运动id查询下面有哪些具体的运动项目
async changeExercise_typeList() {
const resp = await $.post(loc() + "/changeExercise_typeList", {exerciseType: this.formData.exerciseType})
if(resp.code===0){
this.exerciseTypeList2 = resp.data
}else{
this.notifyWarning(resp.msg)
}
},
doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const {data} = await $.post(loc() + "/getProjectCodeIsExist", {projectCode: this.formData.projectCode})
if (data) {
this.$message.error("编号已存在");
return
}
let allName = '';
this.menWomenList.find(v => {
if (v.id === this.formData.isMenWomen) {
allName += v.name
}
})
this.groupList.find(v => {
if (v.id === this.formData.competitionCategory) {
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 $.post(loc() + "/doAdd", this.formData)
this.loading = false
if(resp.code===0){
this.pageData();
this.$refs.guava.index()
}else{
this.notifyWarning(resp.msg)
}
}
})
},
pageData() {
sublime.showLoadingbar();
this.tabLoading = true
const pageForm = clone(this.pageForm)
pageForm.isMenWomen = JSON.stringify(pageForm.isMenWomen)
$.post(base + "/platform/activity/basic/event/pageData", pageForm, (data) => {
sublime.closeLoadingbar();
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async switchChange(data) {
this.formData = data
const resp = await $.post(loc() + "/doEdit", this.formData)
if(resp.code===0){
this.notifySuccess(resp.msg)
this.pageData()
}else{
this.notifyWarning(resp.msg)
}
},
doEdit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
if (this.formData.oldProjectCode !== this.formData.projectCode) {
const {data} = await $.post(loc() + "/getProjectCodeIsExist", {projectCode: this.formData.projectCode})
if (data) {
this.$message.error("编号已存在");
return
}
}
let allName = '';
this.menWomenList.find(v => {
if (v.id === this.formData.isMenWomen) {
allName += v.name
}
})
this.groupList.find(v => {
if (v.id === this.formData.competitionCategory) {
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 $.post(loc() + "/doEdit", this.formData)
this.loading = true
if(resp.code===0){
this.pageData();
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
}
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 $.post(loc() + "/doDelete", {id: id});
this.$set(row, "loading", false)
if(resp.code===0){
this.pageData()
}else{
this.notifyWarning(resp.msg)
}
}
}
});
}
},
async created() {
this.pageData()
this.ageInput(this.pageForm.age)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,45 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava>
<user-scope ref="userScope"></user-scope>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
}
},
components: {
'user-scope': httpVueLoader('/components/plugins/UserScope.vue?v=' + new Date().getTime()),
},
methods: {
},
mounted() {
},
async created() {
}
})
</script>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,629 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-tag {
border-radius: 50%;
height: 22px;
}
.el-transfer {
text-align: center;
}
.el-transfer-panel {
text-align: left;
width: 35%;
height: 400px;
}
.el-transfer-panel__list.is-filterable {
height: 300px;
}
.v-tree-layout-left {
overflow: unset !important;
}
.v-tree-layout-left .v-tree {
width: 100%;
height: calc(100vh - 170px);
overflow-y: auto;
}
.v-tree:hover::-webkit-scrollbar {
width: 3px;
background-color: transparent;
}
.v-tree-layout-left .custom-tree-node {
width: 90%;
position: relative;
display: flex;
align-items: center;
}
.v-tree-layout-left .v-tree .v-node {
width: 100%;
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
::-webkit-scrollbar {
/*width: 3px;*/
/*background-color: transparent;*/
display: none;
}
::-webkit-scrollbar-thumb {
background-color: rgba(0, 0, 0, 0.2);
border-radius: 10px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never" style="height: calc(100vh - 70px)">
<tree-layout >
<template #tree>
<div style="padding:0 20px 20px;">
<el-input
placeholder="输入关键字进行查找" clearable
v-model="filterText">
</el-input>
</div>
<el-tree ref="tree" :data="treeData" class="v-tree" v-loading="treeLoading" node-key="id"
:props="defaultProps"
default-expand-all :expand-on-click-node="false"
@node-click="handleNodeClick" accordion @node-expand="nodeExpand"
highlight-current :filter-node-method="filterNode">
<div class="custom-tree-node" slot-scope="{ node, data }">
<div v-if="node.level==1" style="font-size: 16px;" class="v-node"><i
class="el-icon-s-home"></i>&nbsp;
{{ data.name }}
</div>
<div v-if="node.level==2"
style="font-size: 15px" :title="data.name" class="v-node">
<i class="el-icon-star-on" v-if="checkData.name==data.name"></i>
<i class="el-icon-star-off" v-else></i>
&nbsp; {{ data.name }}
</div>
<div v-if="node.level==3"
style="font-size: 14px" :title="data.name" class="v-node">
<i class="fa fa-dot-circle-o" v-if="checkData.name==data.name"></i>
<i class="fa fa-circle-o" v-else></i>
&nbsp; {{ data.name }}
</div>
<div v-if="node.level>3"
style="font-size: 14px" :title="data.name" class="v-node">
<i class="fa fa-dot-circle-o" v-if="checkData.name==data.name"></i>
<i class="fa fa-circle-o" v-else></i>
&nbsp; {{ data.name }}
</div>
</div>
</el-tree>
</template>
<template>
<div v-if="checkNode.level===1" style="padding:0 10px">
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="单位名称" value="name"></el-option>
<el-option label="单位代码" value="unitcode"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<div class="btn-group tool-button">
<el-button icon="el-icon-plus" @click="openAdd">新建单位</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading" size="medium">
<el-table-column align="center" :key="1" header-align="center" 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" header-align="center" label="单位名称"
prop="name"></el-table-column>
<el-table-column align="center" header-align="center" label="单位代码"
prop="unitcode">
<template scope="{row}">
{{row.unitcode}}
</template>
</el-table-column>
<el-table-column label="单位等级" header-align="center" prop="unitlevel"
:show-overflow-tooltip="true" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.unitlevel==1" size="mini" type="success" round
style=" vertical-align: middle;">1级
</el-button>
<el-button v-if="scope.row.unitlevel==2" size="mini" type="warning" round
style=" vertical-align: middle;">2级
</el-button>
<el-button v-if="scope.row.unitlevel==3" size="mini" type="danger" round
style=" vertical-align: middle;">3级
</el-button>
<el-button v-if="scope.row.unitlevel>3" size="mini" type="info" round
style=" vertical-align: middle;">{{scope.row.unitlevel}}级
</el-button>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" prop="operating" label="操作"
width="200px">
<template slot-scope="{row}">
<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:'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>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<div v-if="checkNode.level===2" style="padding:0 10px">
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="userPageForm.searchKeyword"
@keyup.enter.native="doUserSearch">
<el-select v-model="userPageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doUserSearch"></el-button>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<el-tabs v-model="activeName1" type="card" @tab-click="handleClick">
<el-tab-pane label="单位人员" name="first"></el-tab-pane>
<el-tab-pane label="单位负责人" name="second"></el-tab-pane>
</el-tabs>
<el-table :data="userTableData" style="width: 100%" @sort-change="userPageOrder"
size="medium">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(userPageForm.pageNumber - 1) * userPageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="姓名"
prop="username"></el-table-column>
<el-table-column align="center" header-align="center" label="工号"
prop="loginname"></el-table-column>
<el-table-column align="center" header-align="center" label="性别"
prop="sex">
<template scope="{row:{sex}}">
<span v-if="sex">{{sex}}</span>
<span v-else>暂无</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="手机号"
prop="mobile">
<template scope="{row:{mobile}}">
<span v-if="mobile">{{mobile}}</span>
<span v-else>暂无</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="是否会员"
prop="member">
<template scope="{row:{member}}">
<span v-if="member==1" class="text-success">是</span>
<span v-else>否</span>
</template>
</el-table-column>
</el-table>
<el-row v-if="activeName1 === 'first'" class="el-pagination-container">
<el-pagination
@size-change="userPageSizeChange"
@current-change="userPageNumberChange"
:current-page="userPageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="userPageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="userPageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</div>
</template>
</tree-layout>
</el-card>
<template #edit>
<el-divider content-position="left"><span style="color: rgb(121, 187, 255)">请填写以下单位信息</span>
</el-divider>
<el-form :model="formData" ref="form" :rules="formRules" label-position="top"
label-width="120px"
style="padding: 0 30px">
<el-row gutter="30">
<el-col :span="24">
<el-form-item label="上级单位">
<el-input maxlength="100" disabled :value="checkData.name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位名称" prop="name">
<el-input maxlength="100" placeholder="请输入单位名称" v-model="formData.name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位代码" prop="unitcode">
<el-input maxlength="100" placeholder="请输入协会编码" v-model="formData.unitcode"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位简称" prop="aliasName">
<el-input maxlength="100" placeholder="请输入单位简称" v-model="formData.aliasName"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="telephone">
<el-input maxlength="100" placeholder="请输入联系电话" v-model="formData.telephone"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位邮箱" prop="email">
<el-input maxlength="100" placeholder="请输入单位邮箱" v-model="formData.email"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位网站" prop="website">
<el-input maxlength="100" placeholder="请输入单位网站" v-model="formData.website"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="单位地址" prop="address">
<el-input maxlength="100" placeholder="请输入单位地址" v-model="formData.address"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="单位介绍" prop="note">
<el-input maxlength="500" type="textarea" placeholder="请输入单位介绍"
v-model="formData.note"></el-input>
</el-form-item>
</el-col>
</el-row>
<div style="display: flex;justify-content:flex-end;margin-top: 30px">
<el-button type="primary" :loading="loading" @click="!formData.id?doAdd():doEdit()">提 交
</el-button>
</div>
</el-form>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
activeName1: 'first',
userTableData: [],
userPageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
loading: false,
filterText: '',
defaultProps: {
children: 'child',
label: 'name',
},
exKeys: ['0'],
activeName: [],
typeOptions: [],
treeLoading: true,
tabLoading: false,
formData: {},
detailData: {},
treeData: [],
tableData: [],
pageForm: {
searchName: "name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
code: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
checkNode: {level: 1},
checkData: {},
campusOptions: [],
loading: false,
}
},
components: {
'tree-layout': httpVueLoader('/components/plugins/TreeLayout.vue'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
methods: {
handleClick(tab, event) {
this.doUserSearch()
},
dropdownCommand: function (command) {
const {type, data} = command
if (type == 'view') {
} else if (type == 'edit') {
this.openEdit(data.id)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
filterNode(value, data, node) {
if (!value) return true;
return data.name.indexOf(value) !== -1
return false
},
nodeExpand(data, node, e) {
},
async handleNodeClick(data, node) {
this.checkData = data
this.checkNode = node
if (node.level === 1) {
this.doSearch()
} else if (node.level === 2) {
this.doUserSearch()
}
},
async doDelete(id) {
const confirm = await this.$confirm('确定要删除该单位吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doDelete", {id})
if(resp.code===0){
this.loadTree(false)
this.pageData()
}else{
this.notifyWarning(resp.msg)
}
}
},
doEdit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.loading = true
const resp = await $.post(loc() + "/doEdit", this.formData)
this.loading = false
if(resp.code===0){
this.loadTree(false)
this.pageData();
this.$refs.guava.index()
}else{
this.notifyWarning(resp.msg)
}
}
});
},
async openEdit(id) {
const resp = await $.get(loc() + "/findOne", {id})
if(resp.code===0){
this.formData = data
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
}else{
this.notifyWarning(resp.msg)
}
},
doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.loading = true
const resp = await $.post(loc() + "/doAdd", this.formData)
this.loading = true
if(resp.code===0){
this.loadTree(false)
this.pageData();
this.$refs.guava.index()
}else{
this.notifyWarning(resp.msg)
}
}
});
},
openAdd() {
const {id, unitlevel} = this.checkData
this.formData = {
parentId: id,
unitlevel: unitlevel + 1
}
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
this.pageForm.parentId = this.checkData.id
$.post(loc() + "/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async loadTree(flush) {
this.treeLoading = true
const {code, data, msg} = await $.get(loc() + "/getUnitTreeData")
this.treeLoading = false
if (code == 0) {
this.treeData = data
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
if (flush && code == 0) {
this.checkData = data[0]
this.pageData();
}
},
doUserSearch() {
this.tabKey = new Date().getTime()
this.userPageForm.pageNumber = 1
this.userPageData()
},
userPageOrder(column) {
this.userPageForm.pageOrderName = column.prop;
this.userPageForm.pageOrderBy = column.order;
this.userPageData();
},
userPageNumberChange(val) {
this.userPageForm.pageNumber = val;
this.userPageData();
},
userPageSizeChange(val) {
this.userPageForm.pageSize = val;
this.userPageData();
},
async userPageData() {
this.userPageForm.unitId = this.checkData.id
sublime.showLoadingbar()
const resp = await $.post(loc() + "/findPersonByUnitId", this.userPageForm)
sublime.closeLoadingbar();
if(resp.code===0){
if (this.activeName1 === 'first') {
this.userTableData = resp.data.userList.list
this.userPageForm.totalCount = resp.data.userList.totalCount;
} else {
this.userTableData = resp.data.principal
this.userPageForm.totalCount = 0;
}
}else{
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.loadTree(true)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,43 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava>
<user-data-scope
ref="userDataScope"
:group_id.sync="formData.activityGroupId"
></user-data-scope>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'user-data-scope': httpVueLoader('/components/plugins/UserDataScope.vue?v=' + new Date().getTime()),
},
computed: {
},
data() {
return {
}
},
methods: {
},
async created() {
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,31 @@
class typeUtil {
constructor() {
}
/**
* 获取全部会议类型
* @returns {Promise<*[]|*>}
*/
async getAllType() {
const resp = await $.get('/platform/activity/site/type/findAll')
if (resp.code === 0) {
resp.data.forEach(v => {
v['text'] = v['meetingTypeName']
v['value'] = v['id']
})
return resp.data
}
return []
}
async findMaxStateId() {
const resp = await $.get('/platform/activity/site/type/findMaxStateId')
if (resp.code === 0) {
return resp.data
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,109 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-popover__title {
font-size: 15px;
font-weight: bold;
}
.my-mt {
margin-top: 15px;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava">
<template>
<el-calendar>
<template slot="dateCell" slot-scope="{date, data}">
<p :class="data.isSelected ? 'is-selected' : ''">
{{ data.day.split('-').slice(1).join('-') }} {{ data.isSelected ? '✔️' : ''}}
</p>
<div v-for="item in tableData">
<div v-if="data.day.toString()==moment(item.startTime).format('YYYY-MM-DD')">
<el-popover placement="top-start" title="活动信息" width="320" trigger="hover">
<div style="font-size: 10px">
<el-row class="my-mt">
<el-col :span="5"><b>主办单位</b>:</el-col>
<el-col :span="19">{{item.unitName}}</el-col>
</el-row>
<el-row class="my-mt">
<el-col :span="5"><b>活动地址</b>:</el-col>
<el-col :span="19">{{item.address}}</el-col>
</el-row>
<el-row class="my-mt">
<el-col :span="5"><b>报名时间</b>:</el-col>
<el-col :span="19">{{moment(item.applyStartTime).format('YYYY-MM-DD HH:mm')}} 至
{{moment(item.applyEndTime).format('YYYY-MM-DD HH:mm')}}
</el-col>
</el-row>
<el-row class="my-mt">
<el-col :span="5"><b>活动时间</b>:</el-col>
<el-col :span="19">{{moment(item.startTime).format('YYYY-MM-DD HH:mm')}} 至
{{moment(item.endTime).format('YYYY-MM-DD HH:mm')}}
</el-col>
</el-row>
<el-row class="my-mt">
<el-col :span="5"><b>报名链接</b>:</el-col>
<el-col :span="19">
<el-link style="font-size: 8px" type="primary" target="_blank"
@click="djbm">
点击报名
</el-link>
</el-col>
</el-row>
</div>
<span class="text-primary" slot="reference">
{{item.name}}-(<span
v-html="activity.school.getStatus(item.close,item.applyStartTime,item.applyEndTime,item.startTime,item.endTime)"></span>)
</span>
</el-popover>
</div>
</div>
</template>
</el-calendar>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
tableKey: new Date().getTime(),
tabLoading: false,
tableData: []
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
methods: {
djbm() {
sublime.jumpPagePjax('/platform/activity/apply')
},
async getData() {
this.tabLoading = true
const resp = await $.get(loc() + "/getData")
this.tabLoading = false
if(resp.code===0){
this.tableData = resp
this.tableKey = new Date().getTime()
}else{
this.notifyWarning(resp.msg)
}
}
},
async created() {
await this.getData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,927 @@
<!--活动成绩管理 djx 2019-6-28 -->
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.dia .el-dialog__body {
padding: 10px 20px;
}
.el-step__title {
font-size: 14px;
line-height: 24px;
}
.el-step__icon {
width: 20px;
height: 20px;
}
/*.el-card__body {*/
/* padding: 10px 20px 0px;*/
/*}*/
[class*=el-col-] {
text-align: center;
margin-bottom: 8px;
}
.el-divider__text {
color: #f56c6c;
}
.bmqk .el-card__body {
padding: 10px 20px;
}
.v-0x2323544 {
text-align: center;
color: rgb(180, 180, 180);
}
.v-0x345756765 {
text-align: center;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label"></div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label"></div>
<div class="search-item-option">
<el-select v-model="pageForm.activityId" placeholder="请选择活动名称" filterable clearable
style="width: 100%" @change="getEvents">
<el-option
v-for="item in activitys"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<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 events"
:key="item.id"
:label="item.allname"
:value="item.eventid">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
<!-- <el-row type="flex" :gutter="20" align="center" class="search-card">-->
<!-- <el-col :span="7">-->
<!-- <el-date-picker-->
<!-- v-model="pageForm.year"-->
<!-- type="year"-->
<!-- value-format="yyyy" style="width: 100%"-->
<!-- placeholder="选择年">-->
<!-- </el-date-picker>-->
<!-- </el-col>-->
<!-- <el-col :span="7">-->
<!-- <el-select v-model="pageForm.activityId" placeholder="请选择活动名称" filterable clearable-->
<!-- style="width: 100%" @change="getEvents">-->
<!-- <el-option-->
<!-- v-for="item in activitys"-->
<!-- :key="item.id"-->
<!-- :label="item.name"-->
<!-- :value="item.id">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-col>-->
<!-- <el-col :span="7">-->
<!-- </el-col>-->
<!-- <el-col :span="1">-->
<!-- <div class="btn-group tool-button mt5">-->
<!-- <el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>-->
<!-- </div>-->
<!-- </el-col>-->
<!-- </el-row>-->
</el-card>
<!--表格-->
<el-card shadow="never" class="mt10">
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod"
label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template v-if="column.prop=='events'" scope="{row}">
<span>{{row.allName}}</span>
</template>
<template v-else-if="column.prop=='gameStyle'" scope="{row}">
<span>{{activity.school.gameStyle[row.gameStyle]}}</span>
</template>
<template v-else-if="column.prop=='startTime'" scope="{row}">
{{moment(row.startTime).format('YYYY-MM-DD')}} -
{{moment(row.endTime).format('YYYY-MM-DD')}}
</template>
<template v-else-if="column.prop=='state'"
scope="{row:{close,applyStartTime,applyEndTime,startTime,endTime}}">
<div v-html="activity.school.getStatus(close,applyStartTime,applyEndTime,startTime,endTime)"></div>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="220px">
<template slot-scope="scope">
<el-button @click="openView(scope)" size="mini">查看</el-button>
<el-button type="primary" @click="openCj(scope)" size="mini">
分配成绩
</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
<!--分配成绩-->
<el-dialog title="获奖设置" class="dia"
:visible.sync="tdDialogVisible" custom-class="ViewDialogClass" width="60%" top="3%">
<el-row style="text-align: right">
<el-select placeholder="请选择奖品类型" style="width: 16%" size="mini" @change="changeVal" v-model="jplx"
clearable="true" filterable="true">
<el-option label="奖品" value="奖品"></el-option>
<el-option label="现金奖赏" value="现金奖赏"></el-option>
</el-select>
<el-input size="mini" v-if="isShow" style="width: 14%" placeholder="统一设置奖品名称" v-model="jpmc"></el-input>
<el-input size="mini" style="width: 14%" placeholder="统一设置金额" v-model="money" type="number">
<template slot="append">元</template>
</el-input>
</el-row>
<el-table :data="tdTableData" size="small">
<el-table-column align="center" width="280" header-align="center" label="获奖单位" prop="unitid">
<template slot-scope="scope">
<el-select placeholder="请选择获奖单位" size="small" v-model="scope.row.unitId" style="width: 68%;"
clearable filterable>
<el-option
v-for="item in unitSel"
:key="item.id"
:label="item.unitname"
:value="item.unitid">
</el-option>
<!-- <el-option v-for="item in unitSel" :label="item.unitname" :value="item.unitId"></el-option>-->
</el-select>
<el-popover popper-class="aa"
placement="top-start"
width="280"
trigger="click"
@show="popShow(scope)">
<el-table :data="cyUser" max-height="260" size="mini">
<el-table-column width="120" property="username" label="姓名"></el-table-column>
<el-table-column width="120" property="sex" label="性别"></el-table-column>
</el-table>
<el-link v-show="cyUser!=null" slot="reference" type="primary" :underline="false"
style="margin-left: 6px;margin-bottom: 6px;">参赛人员
</el-link>
</el-popover>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="荣誉奖项" prop="mc">
<template slot-scope="scope">
<el-input size="small" v-model="scope.row.mc"></el-input>
</template>
</el-table-column>
<el-table-column v-if="isShow" align="center" header-align="center" label="奖品名称" prop="jpmc">
<template slot-scope="scope">
<el-input size="small" v-model="scope.row.jpmc"></el-input>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="金额" prop="money">
<template slot-scope="scope">
<el-input size="small" v-model="scope.row.money" type="number">
<template slot="append">元</template>
</el-input>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="60px">
<template slot-scope="scope">
<i v-if="scope.$index == 0" type="success" style="font-size: 2.8em;color:#67C23A;cursor: pointer"
@click="addRow(scope)" class="el-icon-circle-plus" circle></i>
<i v-if="scope.$index > 0" type="success" style="font-size: 2.8em;color:#f56c6c;cursor: pointer"
@click="delRow(scope)" class="el-icon-error" circle></i>
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button @click="tdDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="tdSave">保 存</el-button>
<el-button type="success" @click="tdDo">提 交</el-button>
</span>
</el-dialog>
<!--个人-->
<el-dialog title="设置活动获奖人员" class="dia"
:visible.sync="grDialogVisible" custom-class="ViewDialogClass" width="60%" top="3%">
<el-steps :active="active" align-center>
<el-step title="选择获奖人员"></el-step>
<el-step title="设置获奖信息"></el-step>
</el-steps>
<el-row style="margin-top: 20px;" v-show="active=='1'">
<div class="btn-group tool-button mt5">
<el-input style="width:180px;" size="mini" placeholder="可按姓名、教工号查询" v-model="grPageForm.searchKeyword"
clearable></el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select placeholder="请选择单位" size="mini" v-model="grPageForm.unit" style="width: 160px;"
clearable="true" filterable="true">
<el-option v-for="item in unit" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" size="mini" icon="el-icon-search" @click="doGrSearch"></el-button>
</div>
</el-row>
<el-table :data="grTableData" ref="grTable" size="small" :row-key="rowKey" @selection-change="changeFun"
v-show="active=='1'">
<el-table-column :reserve-selection="true"
@selection-change="changeFun"
type="selection"
width="40">
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(grPageForm.pageNumber - 1) * grPageForm.pageSize + 1}} </span></template>
</el-table-column>
<el-table-column align="center" header-align="center" label="教工号" prop="loginname"></el-table-column>
<el-table-column align="center" header-align="center" label="姓名" prop="username"></el-table-column>
<el-table-column align="center" header-align="center" label="性别" prop="sex"></el-table-column>
<el-table-column align="center" header-align="center" label="单位" prop="unitname"></el-table-column>
<el-table-column align="center" header-align="center" label="电话" prop="mobile"></el-table-column>
</el-table>
<el-row class="el-pagination-container" v-show="active=='1'">
<el-pagination
@size-change="grpageSizeChange"
@current-change="grpageNumberChange"
:current-page="grPageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="grPageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="grPageForm.totalCount">
</el-pagination>
</el-row>
<el-card class="box-card" v-show="active=='2'" style="margin-top: 20px">
<div slot="header" class="clearfix">
<span style="color: #ebb563">请填写以下人员的获奖信息</span>
<el-input size="mini" style="width: 20%;float: right;" placeholder="统一设置金额" v-model="money"
type="number">
<template slot="append">元</template>
</el-input>
<el-input size="mini" v-if="isShow" style="width: 20%;float: right;margin-left: 8px;margin-right: 8px;"
placeholder="统一设置奖品名称" v-model="jpmc"></el-input>
<el-select placeholder="请选择奖品类型" style="width: 20%;float: right;" size="mini" @change="changeVal"
v-model="jplx" clearable="true" filterable="true">
<el-option label="奖品" value="奖品"></el-option>
<el-option label="现金奖赏" value="现金奖赏"></el-option>
</el-select>
</div>
<el-form :model="formData" label-position="top" size="small" label-width="86px">
<el-row>
<el-col :span="3" style="background-color: #EBEEF5;color: black;font-weight: bold">姓名</el-col>
<el-col :span="3" style="background-color: #EBEEF5;color: black;font-weight: bold">性别</el-col>
<el-col :span="isShow==true?'6':'9'"
style="background-color: #EBEEF5;color: black;font-weight: bold">获奖信息
</el-col>
<el-col :span="6" v-if="isShow" style="background-color: #EBEEF5;color: black;font-weight: bold">
奖品名称
</el-col>
<el-col :span="isShow==true?'6':'9'"
style="background-color: #EBEEF5;color: black;font-weight: bold">金额
</el-col>
</el-row>
<el-row v-for="item in multipleSelection">
<el-col :span="3">
<el-lebel style="color: grey">{{item.username}}</el-lebel>
</el-col>
<el-col :span="3">
<el-lebel style="color: grey">{{item.sex}}</el-lebel>
</el-col>
<el-col :span="isShow==true?'6':'9'">
<el-input maxlength="100" placeholder="请输入获奖信息" size="mini" v-model="item.mc" style="width: 88%"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-col>
<el-col :span="6" v-if="isShow">
<el-input maxlength="100" placeholder="请输入奖品名称" size="mini" v-model="item.jpmc"
style="width: 88%" auto-complete="off" tabindex="4" type="text"></el-input>
</el-col>
<el-col :span="isShow==true?'6':'9'">
<el-input maxlength="100" placeholder="请输入金额" size="mini" v-model="item.money"
style="width: 88%" auto-complete="off" tabindex="4" type="number">
<template slot="append">元</template>
</el-input>
</el-col>
</el-row>
<el-row style="margin: 20px 0px;" v-if="multipleSelection.length==0">
<el-divider content-position="center">您还没有选择获奖人员</el-divider>
</el-row>
</el-form>
</el-card>
<span slot="footer" class="dialog-footer">
<el-button @click="grDialogVisible = false">取 消</el-button>
<el-button type="warning" @click="active = '1'" v-if="active == '2'">上一步</el-button>
<el-button type="primary" @click="active = '2'" v-if="active == '1'">下一步</el-button>
<el-button type="primary" @click="grSave" v-if="active == '2'">保 存</el-button>
<el-button type="success" @click="grjxDo" v-if="active == '2'">提 交</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
data: function () {
return {
activitys: [],
events: [],
pageForm: {//分页
pageNumber: 1,
pageSize: 10,
totalCount: 0,
searchKeyword: "",
hdlx: "",
hdxm: "",
year: new Date().getFullYear() + "",
},
tableData: [],//表格
queryHdlx: [],
queryHdxm: [],
/*团队获奖设置*/
tdDialogVisible: false,
tdTableData: [],
unitSel: [],
temp: [],
cyUser: [],
/*个人获奖设置*/
grDialogVisible: false,
grTableData: [],
grPageForm: {//分页
pageNumber: 1,
pageSize: 10,
totalCount: 0,
searchKeyword: "",
id: "",
unit: "",
},
unit: [],
multipleSelection: [],
active: "1",
formData: {},
/*查看*/
infoDialogVisible: false,
activeName: '1',
viewData: [],
bmTableData: [],
bmfs: "",
hdms: "",
hjTableData: [],
gzryListTableData: [],
jplx: "",
isShow: true,
jpmc: "",
money: "",
isshow: true,
xqactive: "1",
tableColumns: [
{prop: 'name', label: '活动名称'},
{prop: 'address', label: '活动地点'},
{prop: 'allName', label: '活动项目'},
{prop: 'gameStyle', label: '活动类型'},
{prop: 'startTime', label: '活动日期'},
{prop: 'state', label: '活动状态'},
{prop: 'applyNum', label: '已报名人数'},
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/activity/school/Info.vue'),
},
methods: {
pageData: function () {
var self = this;
sublime.showLoadingbar();//显示loading
$.post(base + "/platform/activity/school/grades/data", self.pageForm, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.tableData = data.data.hds.list;
self.pageForm.totalCount = data.data.hds.totalCount;
self.queryHdlx = data.data.hdlx;
self.unit = data.data.unit;
}
}, "json");
},
openView(data) {
this.$refs.info.getInfo(data.row.id)
this.$refs.guava.view()
},
/*分页*/
pageSizeChange: function (val) {
this.pageForm.pageSize = val;
this.pageData();
},
pageNumberChange: function (val) {
this.pageForm.pageNumber = val;
this.pageData();
},
grpageSizeChange: function (val) {
this.grPageForm.pageSize = val;
this.flag();
},
grpageNumberChange: function (val) {
this.grPageForm.pageNumber = val;
this.flag();
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
doGrSearch() {
this.flag();
},
flag() {
$.post(base + "/platform/activity/school/grades/findGrUser", this.grPageForm, (data) => {
if (data.code == 0) {
this.grTableData = data.data.list;
this.grPageForm.totalCount = data.data.totalCount;
}
}, "json");
},
changeVal: function (obj) {
var self = this;
if (obj == "现金奖赏") {
self.isShow = false;
} else if (obj == "奖品") {
self.isShow = true;
}
},
openCj: function (scope) {
var self = this;
self.jplx = "";
self.tdTableData = [{
unitId: "",
mc: "",
jpmc: "",
money: "",
}];
self.temp = scope.row;
if (scope.row.awardsMode == 2) {
$.post(base + "/platform/activity/school/grades/findUnit", {id: scope.row.id}, function (data) {
if (data.code == 0) {
self.unitSel = data.data;
}
}, "json");
setTimeout(function () {
$.post(base + "/platform/activity/school/grades/findSaveCj", {
id: scope.row.id,
eventId: scope.row.eventId
}, function (data) {
if (data.code == 0) {
if (data.data.length == 0) {
self.tdTableData = [{
unitId: "",
mc: "",
jpmc: "",
money: "",
}];
} else {
self.jplx = data.data[0].jplx;
self.tdTableData = data.data;
}
}
}, "json");
}, 200);
self.tdDialogVisible = true;
} else if (scope.row.awardsMode == 1) {
self.grPageForm.id = scope.row.id;
self.grPageForm.eventId = scope.row.eventId;
self.active = "1";
$.post(base + "/platform/activity/school/grades/findGrUser", self.grPageForm, (data) => {
if (data.code == 0) {
self.grTableData = data.data.list;
self.grPageForm.totalCount = data.data.totalCount;
self.grDialogVisible = true;
}
}, "json");
setTimeout(function () {
$.post(base + "/platform/activity/school/grades/findGrCj", {
id: scope.row.id,
eventId: scope.row.eventId
}, function (data) {
if (data.code == 0) {
if (data.data.length > 0) {
self.jplx = data.data[0].jplx;
} else {
self.jplx = "";
}
for (var i = 0; i < data.data.length; i++) {
for (var d = 0; d < self.grTableData.length; d++) {
if (data.data[i].id == self.grTableData[d].id) {
self.grTableData[d].mc = data.data[i].mc;
self.grTableData[d].jpmc = data.data[i].jpmc;
self.grTableData[d].money = data.data[i].money;
/*self.grTableData[d]=data.data[i];*/
self.$refs.grTable.toggleRowSelection(self.grTableData[d], true);
}
}
}
}
}, "json");
}, 200);
}
},
addRow: function (scope) {
var self = this;
var list = {
unitId: "",
mc: "",
jpmc: self.jpmc,
money: self.money,
};
self.tdTableData.push(list);
},
delRow: function (scope) {
var self = this;
self.tdTableData.splice(scope.$index, 1);
},
popShow: function (scope) {
var self = this;
$.post(base + "/platform/activity/school/grades/findCyRy", {
unitid: scope.row.unitId,
activityId: self.temp.id
}, function (data) {
if (data.code == 0) {
self.cyUser = data.data;
}
}, "json");
},
tdSave: function () {
var self = this;
var array = new Array();
self.tdTableData.forEach(function (obj) {
array.push({
activityId: self.temp.id,
eventId: self.temp.eventId,
mc: obj.mc,
unitId: obj.unitId,
hdms: self.temp.awardsMode,
jpmc: obj.jpmc,
money: obj.money,
jplx: self.jplx,
});
});
$.post(base + "/platform/activity/school/grades/tdDo", {
data: JSON.stringify(array),
activityId: self.temp.id,
}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.tdDialogVisible = false;
}
}, "json");
},
tdDo: function () {
var self = this;
var array = new Array();
self.tdTableData.forEach(function (obj) {
array.push({
activityId: self.temp.id,
eventId: self.temp.eventId,
mc: obj.mc,
unitId: obj.unitId,
hdms: self.temp.awardsMode,
jpmc: obj.jpmc,
money: obj.money,
jplx: self.jplx,
});
});
if (self.jplx == "" || self.jplx == null) {
self.$message({
message: "请选择奖品类型!",
type: 'warning'
});
return;
}
if (self.jplx == "奖品") {
var flag = 0;
self.tdTableData.forEach(function (obj) {
if (obj.unitId == "" || obj.mc == "" || obj.jpmc == "" || obj.money == "") {
flag = 1;
return;
}
});
if (flag == 1) {
self.$message({
message: "请填写相应的信息!",
type: 'warning'
});
return;
}
}
if (self.jplx == "现金奖赏") {
var flag = 0;
self.tdTableData.forEach(function (obj) {
if (obj.unitId == "" || obj.mc == "" || obj.money == "") {
flag = 1;
return;
}
});
if (flag == 1) {
self.$message({
message: "请填写相应的信息!",
type: 'warning'
});
return;
}
}
self.$confirm("一旦提交不可修改,确定提交吗?", "温馨提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {
const resp = await $.post("/platform/activity/school/grades/tdDo", {
grades: JSON.stringify(array),
unitid: array.unitId,
eventId: eventId
})
if (resp.code===0){
self.pageData();
self.tdDialogVisible = false;
}
}
}
});
},
grSave: function () {
var self = this;
var array = new Array();
self.multipleSelection.forEach(function (obj) {
array.push({
activityId: self.temp.id,
userId: obj.id,
mc: obj.mc,
unitId: obj.unitId,
hdms: self.temp.awardsMode,
jpmc: obj.jpmc,
money: obj.money,
jplx: self.jplx,
});
});
$.post(base + "/platform/activity/school/grades/grjxDo", {
data: JSON.stringify(array),
}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.grDialogVisible = false;
}
}, "json");
},
grjxDo: function () {
var self = this;
if (self.multipleSelection.length == 0) {
self.$message({
message: "您还没有选择获奖人员!",
type: 'error'
});
return;
}
if (self.jplx == "" || self.jplx == null) {
self.$message({
message: "请选择奖品类型!",
type: 'warning'
});
return;
}
if (self.jplx == "奖品") {
var flag = 0;
self.multipleSelection.forEach(function (obj) {
if (obj.mc == "" || obj.jpmc == "" || obj.money == "") {
flag = 1;
return;
}
});
if (flag == 1) {
self.$message({
message: "请填写相应的信息!",
type: 'warning'
});
return;
}
}
if (self.jplx == "现金奖赏") {
var flag = 0;
self.multipleSelection.forEach(function (obj) {
if (obj.mc == "" || obj.money == "") {
flag = 1;
return;
}
});
if (flag == 1) {
self.$message({
message: "请填写相应的信息!",
type: 'warning'
});
return;
}
}
var array = new Array();
self.multipleSelection.forEach(function (obj) {
array.push({
activityId: self.temp.id,
userId: obj.userid,
mc: obj.mc,
unitId: obj.unitId,
hdms: self.temp.awardsMode,
jpmc: obj.jpmc,
money: obj.money,
jplx: self.jplx,
});
});
self.$confirm("一旦提交不可修改,确定提交吗?", "温馨提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {
$.post(base + "/platform/activity/school/grades/grjxDo", {
grades: JSON.stringify(array),
}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.multipleSelection = [];
setTimeout(function () {
self.$refs.grTable.clearSelection();
}, 500)
self.grDialogVisible = false;
}
}, "json");
}
}
});
},
rowKey: function (row) {
var self = this;
return row.id;
},
changeFun: function (val) {
this.multipleSelection = val;
},
async getActivitys() {
const {data} = await $.get("/platform/activity/remind/getActivitys")
return data;
},
async getEvents() {
const resp = await $.post("/platform/activity/apply/getEvents", {activityId: this.pageForm.activityId})
this.events = resp
}
},
async created() {
this.pageData();
this.activitys = await this.getActivitys()
/*this.events = await activity.getEvents()*/
},
watch: {
"pageForm.hdlx": function (obj) {
var self = this;
if (obj != "" && obj != null && obj != "undefined") {
self.pageForm.hdxm = "";
$.post(base + "/platform/hd/xhdgl/xhdxxgl/findHdXm", {id: obj}, function (data) {
if (data.code == 0) {
self.queryHdxm = data.data;
self.pageForm.hdxm = data.data[0].id;
}
}, "json");
}
},
"jpmc": function (obj) {
var self = this;
self.tdTableData.forEach(function (value) {
value.jpmc = obj;
});
self.multipleSelection.forEach(function (value) {
value.jpmc = obj;
});
},
"money": function (obj) {
var self = this;
self.tdTableData.forEach(function (value) {
value.money = obj;
});
self.multipleSelection.forEach(function (value) {
value.money = obj;
});
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,392 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<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">年&emsp;&emsp;度</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
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>-->
<el-select v-model="pageForm.activityId" placeholder="请选择活动名称"
filterable clearable
style="width: 100%">
<el-option
v-for="item in activities"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">活动级别</div>
<div class="search-item-option">
<!-- <el-select v-model="pageForm.gameStyle" placeholder="请选择活动类型" filterable clearable
style="width: 100%">
<el-option
v-for="(k,v) in activity.school.gameStyle"
:key="v"
:label="k"
:value="v">
</el-option>
</el-select>-->
<el-select v-model="pageForm.activityLevel" placeholder="请选择活动级别"
clearable
style="width: 100%">
<el-option
v-for="item in activityTypeList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索
</el-button>
</div>
<div class="search-item" style="width: 80vw">
<div class="search-item-label">一键查询</div>
<div class="search-item-option">
<el-radio-group v-model="pageForm.query" @change="doSearch">
<el-radio-button v-for="it in queryOptions" :label="it.key"
:key="it.key">
{{it.value}}
</el-radio-button>
</el-radio-group>
</div>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="活动列表" :app="this">
<template #func>
<el-button type="primary" icon="el-icon-edit-outline" size="small"
@click="openAdd">
创建活动
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize"
class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
show-overflow-tooltip
:sortable="column.sortable">
<template v-if="column.prop=='events'" scope="{row}">
<span>{{row.allName}}</span>
</template>
<template v-else-if="column.prop=='gameStyle'" scope="{row}">
<span>{{activity.school.gameStyle[row.gameStyle]}}</span>
</template>
<template v-else-if="column.prop=='foundUnit'" scope="{row}">
<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 v-else-if="column.prop=='startTime'" scope="{row}">
{{moment(row.startTime).format('YYYY-MM-DD')}} -
{{moment(row.endTime).format('YYYY-MM-DD')}}
</template>
<template v-else-if="column.prop=='state'"
scope="{row:{close,applyStartTime,applyEndTime,startTime,endTime,isSave}}">
<div v-html="activity.school.getStatus(close,applyStartTime,applyEndTime,startTime,endTime,isSave)"></div>
</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:'sendMsg',row}">
通知
</el-dropdown-item>
<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:'export',row}">
导出名单docx
</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 type="primary" @click="doSave">保 存</el-button>
<el-button type="primary" @click="doOperate">提 交</el-button>
</template>
<template #edit>
<add-activity :form="formData" ref="activity" @flip="flip" @flush="flush"
:is_club="is_club"
:is_union="is_union" :is_sysadmin="is_sysadmin" :is_a06="is_A06"
:is_h10="is_h10"
:unionid="'${@shiro.getPrincipalProperty('unit').getUnionid()}'"></add-activity>
</template>
<template #view>
<info ref="info"></info>
</template>
<send-msg ref="sendMsg" :url="url"></send-msg>
<open-qr-code ref="openQRCode" :url="url"></open-qr-code>
</guava>
</div>
<script>
let E = window.wangEditor
const editors = {}
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
is_club: false,
is_union: false,
is_sysadmin: false,
is_A06: false,
is_h10: false,
activities: [],
unitOptions: [],
activityTypeList: [],
planList: [],
typeList: [],
types: [],
events: [],
submitDisabled: false,
formData: {
activityGroupId: null,
personType: 1,
activityLevel: 1,
gameStyle: 1,
applyWay: [2],
awardsMode: [],
combinationMethod: []
},
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},
],
pageForm: {
query: 'zero'
},
queryOptions: [
{key: 'zero', value: '全部'},
{key: 'one', value: '正在报名'},
{key: 'two', value: '报名结束'},
{key: 'three', value: '活动进行中'},
{key: 'four', value: '活动已结束'},
],
url: '',
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/activity/school/Info.vue?v=' + new Date().getTime()),
'add-activity': httpVueLoader('/components/activity/school/AddActivity.vue?v=' + new Date().getTime()),
'send-msg': httpVueLoader('/components/plugins/SendMsgByGroupId.vue'),
'open-qr-code': httpVueLoader('/components/plugins/OpenQRCode.vue'),
},
methods: {
flip() {
this.pageData()
this.$refs.guava.index()
},
flush() {
this.pageData()
},
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 === 'export') {
window.open("/platform/activity/common/export?id=" + row.id)
} else if (type === 'exportXlsx') {
location.href = "/platform/activity/common/exportXlsx?id=" + row.id
} else if (type == 'sendMsg') {
this.sendMsg(row)
} else if (type === 'openCode') {
this.openCode(row)
}
},
openCode(row) {
this.$refs.openQRCode.openCode("/mobile/activity/Sports/list/activityList?id=" + row.id + "&signUpMethod=" + row.signUpMethod)
},
sendMsg(row) {
this.url = `<a href="` + (APP_DOMAIN + "/mobile/activity/Sports/list/activityList") + `">点击参与</a>`
this.$refs.sendMsg.openDialog(row.activityGroupId)
},
openView(row) {
const {id} = row
this.$refs.guava.view()
setTimeout(() => {
this.$refs.info.getInfo(id)
}, 500)
},
async openAdd() {
this.$refs.guava.edit()
setTimeout(() => {
this.$refs.activity.openAdd()
}, 500)
},
async openEdit(row) {
const {id, applyStartTime, isSave} = row
this.formData.id = id
const now = moment().valueOf()
this.$refs.guava.edit()
setTimeout(() => {
this.$refs.activity.openEdit(row, true)
}, 500)
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除该活动吗?', '提示', {type: 'warning'}).then(async () => {
this.$set(row, "loading", true)
const resp = await $.post(loc() + "/doDelete", {id});
this.$set(row, "loading", false)
if (resp.code === 0) {
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
);
},
async getActivitys() {
const {data} = await $.get("/platform/activity/remind/getActivitys")
return data;
},
async getActivityTypeList(code) {
const {data} = await $.get("/platform/activity/basic/basic/settings/getActivityTwoLevelType", {code: code})
return data;
},
async doOperate() {
await this.$refs.activity.operate()
},
async doSave() {
this.$refs.activity.doSave()
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
$.post(loc() + "/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
},
async created() {
if ("${@shiro.hasRole('club01')}" === "true") {
this.is_club = true
}
if ("${@shiro.hasRole('H04')}" === "true") {
this.is_union = true
}
if ("${@shiro.hasRole('sysadmin')}" === "true") {
this.is_sysadmin = true
}
if ("${@shiro.hasRole('A06')}" === "true") {
this.is_A06 = true
}
if ("${@shiro.hasRole('H10')}" === "true") {
this.is_h10 = true
}
this.pageData()
this.activities = await this.getActivitys()
this.unitOptions = await getUnits(null)
this.activityTypeList = await this.getActivityTypeList("40000")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,385 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#content .w-e-toolbar, #content .w-e-text-container {
z-index: 1 !important;
}
</style>
<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 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>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="计划列表" :app="this">
<template #func>
<el-button type="primary" icon="el-icon-edit-outline" size="small"
@click="openAdd">
创建活动计划
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
show-overflow-tooltip
:sortable="column.sortable">
<template v-if="column.prop=='carryOut'" 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:'activity',row}" v-if="!row.carryOut">
创建活动
</el-dropdown-item>
<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>
<template v-if="!flag">
<el-button type="primary" @click="operation">确 定</el-button>
</template>
<template v-if="flag">
<el-button type="primary" @click="doSave">保 存</el-button>
<el-button type="primary" @click="doActivity">确 定</el-button>
</template>
</template>
<template #edit>
<template v-if="!flag">
<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="1" 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-select v-model="formData.event" placeholder="请选择活动项目" filterable 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>
<div style="float: right;margin: 20px 0">
<el-button type="primary" @click="operation">提 交</el-button>
</div>
</el-form>
</template>
<add-activity v-show="flag" :form="activityFormData" ref="activity" @flip="flip"></add-activity>
</template>
<template #view>
<plan-info ref="info"></plan-info>
</template>
</guava>
</div>
<script>
let E = window.wangEditor
const editors = {}
const 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 {
eventList: [],
flag: false,
formData: {
name: '',
time: '',
event: [],
content: ''
},
activityFormData: {
personType: 1,
activityLevel: 1,
gameStyle: 1,
applyWay: [2],
awardsMode: [],
combinationMethod: []
},
tableColumns: [
{prop: 'name', label: '计划名称'},
{prop: 'time', label: '计划时间'},
{prop: 'allName', label: '活动项目'},
{prop: 'carryOut', label: '计划状态'},
],
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
event: [{required: true, message: '必填', trigger: ['blur', 'change']}],
type: [{required: true, message: '必选', trigger: ['blur', 'change']}],
content: [{validator: validContent, trigger: ['blur', 'change']}]
},
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'add-activity': httpVueLoader('/components/activity/school/AddActivity.vue'),
'plan-info': httpVueLoader('/components/activity/school/planInfo.vue?v=1.0.0'),
},
methods: {
flip() {
this.pageData()
this.$refs.guava.index()
},
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 === 'activity') {
this.openActivity(row)
}
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
openActivity(row) {
this.flag = true
this.activityFormData = {}
this.$refs.guava.edit()
this.$nextTick(() => {
this.$refs.activity.openAdd(row)
})
},
doSave() {
this.$refs.activity.doSave()
},
doActivity() {
this.formData.id ? this.$refs.activity.doEdit() : this.$refs.activity.doAdd()
},
async openEdit(row) {
this.flag = false
const cloneRow = clone(row)
cloneRow.event = JSON.parse(cloneRow.event)
this.formData = cloneRow
this.$refs.guava.edit()
this.$nextTick(() => {
this.initEditor()
})
},
async openAdd() {
this.formData = {
type: 1
}
this.flag = false
this.$refs.guava.edit()
this.$nextTick(() => {
this.initEditor()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
this.formData = {
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
});
const resp = await $.post(loc() + url, {
id: this.formData.id,
name: this.formData.name,
time: this.formData.time,
content: this.formData.content,
event: JSON.stringify(this.formData.event)
})
loading.close()
if(resp.code===0){
this.pageData()
this.$refs.guava.index()
}else{
this.notifyWarning(resp.msg)
}
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除该计划吗?', '提示', {type: 'warning'}).then(async () => {
const resp = await $.post(loc() + "/doDelete", {id: id});
if(resp.code===0){
this.pageData()
}else{
this.notifyWarning(resp.msg)
}
})
},
initActivityEditor() {
let keys = ['athleteQualification', 'registrationMethod', 'competitionMethod', 'rewardMethod', 'precautions', 'eventNotification']
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])
}
})
},
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])
}
})
}
},
async created() {
this.pageData()
this.eventList = await activity.getEvents()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,402 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年&emsp;&emsp;度</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.year"
@change="getActivitys"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年" :clearable="false">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">活动名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.activityId" placeholder="请选择活动名称" filterable :clearable="false"
style="width: 100%" @change="actChange(pageForm.activityId)">
<el-option
v-for="item in activityList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">工会名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.unionId" placeholder="请选择工会" filterable :clearable="false"
style="width: 100%" @change="unionChange(pageForm.unionId)">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-s-order" @click="summary">汇总表</el-button>
</div>
<div class="pull-right offscreen-right" style="margin-left: auto ">
<el-button type="primary" icon="el-icon-printer" @click="print">打 印</el-button>
</div>
</div>
</el-card>
<div id=print>
<!-- <el-card shadow="never" class="mt10">
<table class="table table-bordered">
<tr>
<td colspan="11" class="text-center">
<span v-if="activityList.find(v=>v.id === pageForm.activityId)">
{{ activityList.find(v=>v.id === pageForm.activityId).name }}
({{unionName}})
</span>
</td>
</tr>
<tr>
<td></td>
<td>项目</td>
<td v-for="i in 8">
第{{i}}名
</td>
<td>备注</td>
</tr>
<tr v-for="(o,k,index) in tableDataUnionPrize['团体项目']">
<td style="vertical-align:middle" v-if="0==index"
:rowspan="Object.keys(tableDataUnionPrize['团体项目']).length">团体项目
</td>
<td>{{k}}</td>
<td v-for="i in 8">
<span v-if="o.filter(f=>f.ranking==i && f.numberOfPeople!=null) && o.filter(f=>f.ranking==i && f.numberOfPeople!=null).length>0">
{{o.filter(f=>f.ranking==i && f.numberOfPeople!=null).map(g=>g.numberOfPeople).reduce((a,b)=>a+b)}}
</span>
</td>
<td></td>
</tr>
<tr v-for="(o,k,index) in tableDataUnionPrize['男子项目']">
<td style="vertical-align:middle" v-if="0==index"
:rowspan="Object.keys(tableDataUnionPrize['男子项目']).length">男子项目
</td>
<td>{{k}}</td>
<td v-for="i in 8">
{{o.filter(f=>f.ranking==i).map(g=>g.username).join('、')}}
</td>
<td></td>
</tr>
<tr v-for="(o,k,index) in tableDataUnionPrize['女子项目']">
<td style="vertical-align:middle" dd v-if="0==index"
:rowspan="Object.keys(tableDataUnionPrize['女子项目']).length">女子项目
</td>
<td>{{k}}</td>
<td v-for="i in 8">
{{o.filter(f=>f.ranking==i).map(g=>g.username).join('、')}}
</td>
<td></td>
</tr>
<tr>
<td>合计</td>
<td></td>
<td v-for="i in 9">
{{lastSum[i]}}
</td>
</tr>
&lt;!&ndash; <tr v-for="(o,k,index) in tableDataUnionPrize['其他']">&ndash;&gt;
&lt;!&ndash; <td v-if="0==index" :rowspan="Object.keys(tableDataUnionPrize['其他']).length">其他</td>&ndash;&gt;
&lt;!&ndash; <td>{{k}}</td>&ndash;&gt;
&lt;!&ndash; <td v-for="i in 8">&ndash;&gt;
&lt;!&ndash; <span v-if="o.filter(f=>f.ranking==i && f.numberOfPeople!=null) && o.filter(f=>f.ranking==i && f.numberOfPeople!=null).length>0">&ndash;&gt;
&lt;!&ndash; {{o.filter(f=>f.ranking==i && f.numberOfPeople!=null).map(g=>g.numberOfPeople).reduce((a,b)=>a+b)}}&ndash;&gt;
&lt;!&ndash; </span>&ndash;&gt;
&lt;!&ndash; </td>&ndash;&gt;
&lt;!&ndash; <td></td>&ndash;&gt;
&lt;!&ndash; </tr>&ndash;&gt;
</table>
</el-card>-->
<el-card class="mt10" shadow="never" v-if="pageForm.activityId!=null">
<vi-title :title="unionName+'奖品名单'"></vi-title>
<template>
<table class="table table-bordered" v-if="isSummary==1">
<tr>
<td class="text-center" colspan="11">
<span v-if="activityList.find(v=>v.id === pageForm.activityId)">
{{ activityList.find(v=>v.id === pageForm.activityId).name }}
({{unionName}})
</span>
</td>
</tr>
<tr>
<td></td>
<td>项目</td>
<td v-for="i in 8">
第{{i}}名
</td>
<td>备注</td>
</tr>
<tr v-for="(o,k,index) in tableDataUnionPrize['团体项目']">
<td :rowspan="Object.keys(tableDataUnionPrize['团体项目']).length" style="vertical-align:middle"
v-if="0==index">团体项目
</td>
<td>{{k}}</td>
<td v-for="i in 8">
<span v-if="o.filter(f=>f.ranking==i && f.numberOfPeople!=null) && o.filter(f=>f.ranking==i && f.numberOfPeople!=null).length>0">
{{o.filter(f=>f.ranking==i && f.numberOfPeople!=null).map(g=>g.numberOfPeople).reduce((a,b)=>a+b)}}
</span>
</td>
<td></td>
</tr>
<tr v-for="(o,k,index) in tableDataUnionPrize['男子项目']">
<td :rowspan="Object.keys(tableDataUnionPrize['男子项目']).length" style="vertical-align:middle"
v-if="0==index">男子项目
</td>
<td>{{k}}</td>
<td v-for="i in 8">
{{o.filter(f=>f.ranking==i).map(g=>g.username).join('、')}}
</td>
<td></td>
</tr>
<tr v-for="(o,k,index) in tableDataUnionPrize['女子项目']">
<td :rowspan="Object.keys(tableDataUnionPrize['女子项目']).length" dd
style="vertical-align:middle"
v-if="0==index">女子项目
</td>
<td>{{k}}</td>
<td v-for="i in 8">
{{o.filter(f=>f.ranking==i).map(g=>g.username).join('、')}}
</td>
<td></td>
</tr>
<tr>
<td>合计</td>
<td></td>
<td v-for="i in 9">
{{lastSum[i]}}
</td>
</tr>
</table>
<el-table :data="tableData" :header-cell-style="{background:'#FAFAFA'}" @sort-change="pageOrder"
border row-key="id"
size="mini" stripe style="width: 100%"
v-if="isSummary==2" 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"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in summaryColumns"
v-if="isSummary==2">
</el-table-column>
<el-table-column align="center" header-align="center" label="签字"
show-overflow-tooltip v-if="isSummary==2"></el-table-column>
</el-table>
</template>
</el-card>
</div>
</template>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
isSummary: 1,
activityList: [],
unionList: [],
unionName: "",
pageForm: {
activityId: "",
unionId: "",
year: new Date().getFullYear() + ''
},
summaryColumns: [
{prop: 'unionname', label: '分工会'},
{prop: 'one', label: '第一名'},
{prop: 'two', label: '第二名'},
{prop: 'three', label: '第三名'},
{prop: 'four', label: '第四名'},
{prop: 'fives', label: '第五名'},
{prop: 'six', label: '第六名'},
{prop: 'seven', label: '第七名'},
{prop: 'eight', label: '第八名'},
{prop: 'totalPeople', label: '合计'},
],
tableDataUnionPrize: {},
lastSum: {}
}
},
components: {},
methods: {
getTableTdContent(d, i) {
return d.filter(v => {
if (v.isteampersonal === 1) {
if (v.ranking == i) {
console.log(v, i)
return v.username
}
} else {
if (v.ranking == i) {
return v.numberofpeople
}
}
}).map(v => {
return v.isteampersonal === 1 ? v.username : v.numberofpeople
}).toString()
},
async summary() {
if (this.activityList.length === 0) {
return
}
this.$set(this.pageForm, "unionId", null)
this.isSummary = 2
this.tableData = []
// this.pageForm.activityId = this.activityList[1].id
const {data} = await $.get(loc() + "/summary", this.pageForm)
this.$set(this, "tableData", data.score)
this.unionName = "汇总"
},
print() {
let subOutputRankPrint = document.getElementById('print');
let newContent = subOutputRankPrint.innerHTML;
let oldContent = document.body.innerHTML;
document.body.innerHTML = newContent;
window.print();
window.location.reload();
document.body.innerHTML = oldContent;
return false;
},
actChange(activityId) {
this.tableColumns = []
this.tableData = []
this.pageForm.activityId = ""
const activityData = this.activityList.find(v => v.id == activityId)
this.pageForm.activityId = activityData.id
this.getPrizes()
},
unionChange(unionId) {
this.tableColumns = []
this.tableData = []
this.pageForm.unionId = ""
this.isSummary = 1
const unionData = this.unionList.find(v => v.id == unionId)
this.pageForm.unionId = unionData.id
this.unionName = unionData.unionname
this.getPrizes()
},
async getActivitys() {
this.tableData = []
const {data} = await $.get("/platform/activity/score/statistics/getActivitys", {year: this.pageForm.year})
this.pageForm.activityId = ""
this.activityList = data
if (data && data.length > 0) {
this.pageForm.activityId = data[0].id
}
await this.getPrizes()
},
async getPrizes() {
const {data} = await $.get(loc() + "/getPrizes", this.pageForm)
this.tableDataUnionPrize = data
const lastSum = {}
for (let i = 1; i <= 8; i++) {
let sum = 0
if (!$.isEmptyObject(data['男子项目'])) {
let xm = []
for (let key in data['男子项目']) {
xm = xm.concat(data['男子项目'][key])
}
sum += xm.filter(v => v.ranking === i).length
}
if (!$.isEmptyObject(data['女子项目'])) {
let xm = []
for (let key in data['女子项目']) {
xm = xm.concat(data['女子项目'][key])
}
sum += xm.filter(v => v.ranking === i).length
}
if (!$.isEmptyObject(data['团体项目'])) {
let xm = []
for (let key in data['团体项目']) {
xm = xm.concat(data['团体项目'][key])
}
const teams = xm.filter(v => v.ranking === i).map(v => Number(v.numberOfPeople))
if (teams && teams.length > 0) {
sum += teams.reduce((a, b) => a + b)
}
}
lastSum[i] = sum
}
lastSum[9] = Object.values(lastSum).reduce((a, b) => a + b)
this.lastSum = lastSum
// if (this.pageForm.activityId == null) {
// this.tableDataUnionPrize = data
// } else {
// data.eventList.map(v => {
// v.sss = []
// data.score.map(x => {
// if (v.label === x.allname) {
// v.sss.push(x)
// }
// })
// })
// this.tableData = data.eventList
// }
},
},
async created() {
await this.getActivitys()
this.unionList = await getUnions(null)
if (this.unionList.length > 0) {
this.pageForm.unionId = this.unionList[0].id
this.unionName = this.unionList[0].unionname
}
await this.getPrizes()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,935 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.mb10 {
margin-bottom: 10px;
}
.d .el-card__header {
padding: 10px 20px;
}
.d .el-card__body {
padding: 0;
}
.search .search-item {
width: 25%;
}
.search .search-item-label {
min-width: 70px;
}
.el-row-title {
margin-bottom: 20px;
font-weight: 600;
}
</style>
<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>
<el-date-picker v-model="pageForm.year" type="year" placeholder="选择年份"
style="width: 100%" :clearable="false" value-format="yyyy"
@change="yearChange()"></el-date-picker>
</div>
<div class="search-item">
<div class="search-item-label">活动级别</div>
<div class="search-item-option">
<el-select v-model="pageForm.activityLevel" placeholder="请选择活动级别"
clearable
style="width: 100%" @change="changeLevel">
<el-option
v-for="item in activityTypeList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">活动名称</div>
<el-select v-model="pageForm.id" filterable
style="width: 100%;font-weight:bold;"
placeholder="请选择活动"
@change="getData()">
<el-option v-for="item in activities" :label="item.name"
:value="item.id"></el-option>
</el-select>
</div>
<div class="search-item">
<div class="search-item-label" v-if="pageForm.activityLevel!=='40003'">
院级工会
</div>
<div class="search-item-label" v-if="pageForm.activityLevel==='40003'">
协会名称
</div>
<div class="search-item-option">
<el-select style="width: 100%;font-weight:bold;"
v-model="pageForm.unionid"
placeholder="院级工会筛选"
filterable clearable
@change="changeVVV" @clear="changeVVV">
<el-option
v-for="item in unions"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<!--#if(!@shiro.hasRole('H04')){#-->
<div class="search-item">
<div class="search-item-label">报名状态</div>
<div class="search-item-option">
<el-radio-group v-model="pageForm.applyed">
<el-radio style="background-color: white" label="1" border>未报名
</el-radio>
<el-radio style="background-color: white" label="2" border>已报名
</el-radio>
</el-radio-group>
</div>
</div>
<!--#}#-->
<!-- <div class="search-item">
<div class="search-item-label">导入导出</div>
<div class="search-item-option">
<el-button type="primary" plain @click="openImport">导入报名人员</el-button>
<el-button @click="doExportByEnroll" plain
type="primary">导出报名信息
</el-button>
&lt;!&ndash; <el-button @click="doExportByEnroll" icon="el-icon-printer" plain size="small"
style="position: absolute;right: 0px" type="primary">导出报名信息
</el-button>&ndash;&gt;
</div>
</div>-->
</div>
</el-card>
<el-card shadow="never" class="mt10 d" style="padding: 20px">
<el-row :gutter="20" class="el-row-title" style="margin-left: 0;margin-right: 0;">
<el-col :span="2">序号</el-col>
<el-col :span="4">年度</el-col>
<el-col :span="6">
<span v-if="pageForm.activityLevel!=='40003'">分工会名称</span>
<span v-if="pageForm.activityLevel==='40003'">协会名称</span>
</el-col>
<el-col :span="6">活动名称</el-col>
<el-col :span="4">人数</el-col>
<el-col :span="2">
<!-- <el-button style="position: absolute;right: 0px" plain size="small" icon="el-icon-printer"
type="primary" @click="doExport">导 出
</el-button>-->
</el-col>
</el-row>
<el-table :data="[]" size="mini" v-if="noneData||tabLoading"
v-loading="tabLoading"></el-table>
<el-card v-else class="box-card mb10" v-for="app,tabIdx in apply" shadow="hover"
v-loading="tabLoading">
<div slot="header" class="clearfix">
<el-row :gutter="20">
<el-col :span="2">{{tabIdx + 1}}</el-col>
<el-col :span="4">{{pageForm.year}}</el-col>
<el-col :span="6">
{{isDisPlayCode?'('+app.unioncode+')':null}}{{app.unionname}}
</el-col>
<el-col :span="6">{{pageForm.activityName || '暂无'}}</el-col>
<el-col :span="2">{{app.num |money}} 人</el-col>
<el-col :span="4">
<el-button style="float: right; padding: 3px 5px"
@click="$set(app,'show',!app.show)"
type="text">{{app.show?'折叠':'展开'}}
</el-button>
</el-col>
</el-row>
</div>
<transition name="el-fade-in-linear">
<div v-show="app.show" class="text item transition-box"
style="padding: 20px 20px">
<el-timeline v-if="pageForm.applyType===1||pageForm.applyType===3">
<!-- <el-timeline-item timestamp="领队信息" placement="top" v-if="app.leader.username!=null">
<el-card shadow="never">
<el-form label-suffix=":" label-position="right" label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.leader.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.leader.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.leader.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.leader.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.leader.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="教练信息" placement="top" v-if="app.coach.username!=null">
<el-card shadow="never">
<el-form label-suffix=":" label-position="right" label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.coach.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.coach.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.coach.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.coach.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.coach.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>-->
<el-timeline-item timestamp="运动员信息" placement="top">
<el-table border stripe :data="app.apply2" size="mini"
:key="tableKey">
<el-table-column
type="index" label="序号" header-align="center"
align="center" sortable
width="100">
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width">
<template scope="{row}" v-if="column.prop=='team'">
<span v-if="row.team">{{ row.team }}</span>
<span v-if="!row.team">暂无</span>
</template>
<template scope="{row:{projectType}}"
v-else-if="column.prop=='projectType'">
{{projectType==1?'单项':'团体'}}
</template>
<!-- <template scope="{row:{divisionLevelLeadership}}"
v-else-if="column.prop=='divisionLevelLeadership'">
<span v-if="divisionLevelLeadership" class="text-primary">是</span>
<span v-else class="text-danger">否</span>
</template>-->
<template scope="{row}"
v-else-if="column.prop=='identity'">
<el-tag v-if="row.identity.includes(1)"
effect="light">运动员
</el-tag>
<el-tag v-if="row.identity.includes(2)"
type="success" effect="light">教练
</el-tag>
<el-tag v-if="row.identity.includes(3)"
type="warning" effect="light">领队
</el-tag>
<el-tag v-if="row.identity.includes(4)"
type="warning"
effect="light">处级领导
</el-tag>
<el-tag v-if="row.identity.includes(5)"
type="warning" effect="light">替补
</el-tag>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
<el-timeline v-else-if="pageForm.applyType===2">
<el-timeline-item timestamp="领队信息" placement="top"
v-if="app.leader.username!=null">
<el-card shadow="never">
<el-form label-suffix=":" label-position="right"
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.leader.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.leader.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.leader.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.leader.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.leader.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="教练信息" placement="top"
v-if="app.coach.username!=null">
<el-card shadow="never">
<el-form label-suffix=":" label-position="right"
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.coach.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.coach.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.coach.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.coach.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.coach.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="团长信息" placement="top"
v-if="app.head.username!=null">
<el-card shadow="never">
<el-form label-suffix=":" label-position="right"
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.head.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.head.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.head.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.head.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.head.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="工作人员信息" placement="top"
v-if="app.staff.username!=null">
<el-card shadow="never">
<el-form label-suffix=":" label-position="right"
label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.staff.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.staff.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.staff.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.staff.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
{{ app.staff.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="运动员信息" placement="top">
<el-row gutter="40">
<el-col :span="4">
<div class="search-item">
<div class="search-item-option">
<el-select v-model="app.eventId"
placeholder="请选择活动项目"
filterable clearable
style="width: 100%"
@change="doEvent(app)">
<el-option
v-for="item in events"
:key="item.id"
:label="item.allname"
:value="item.eventid">
</el-option>
</el-select>
</div>
</div>
</el-col>
<el-col :span="4">
<div class="search-item">
<div class="search-item-option">
<el-select v-model="app.projectType"
placeholder="请选择项目类型"
allow-create filterable
default-first-option clearable
style="width: 100%"
@change="doEventType(app)">
<el-option
v-for="item in projectTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
</el-col>
</el-row>
<el-table border stripe :data="app.apply2" size="mini"
:key="tableKey">
<el-table-column
type="index" label="序号" header-align="center"
align="center" sortable
width="100">
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
show-overflow-tooltip>
<template scope="{row}" v-if="column.prop=='team'">
<span v-if="row.team">{{ row.team }}</span>
<span v-if="!row.team">暂无</span>
</template>
<!-- <template scope="{row:{divisionLevelLeadership}}"
v-else-if="column.prop=='divisionLevelLeadership'">
<span v-if="divisionLevelLeadership" class="text-primary">是</span>
<span v-else class="text-danger">否</span>
</template>-->
<template scope="{row:{projectType}}"
v-else-if="column.prop=='projectType'">
{{projectType==1?'单项':'团体'}}
</template>
<template scope="{row}"
v-else-if="column.prop=='identity'">
<el-tag v-if="row.identity.includes(1)"
effect="light">运动员
</el-tag>
<el-tag v-if="row.identity.includes(2)"
type="success" effect="light">教练
</el-tag>
<el-tag v-if="row.identity.includes(3)"
type="warning" effect="light">领队
</el-tag>
<el-tag v-if="row.identity.includes(4)"
type="warning"
effect="light">处级领导
</el-tag>
<el-tag v-if="row.identity.includes(5)"
type="warning" effect="light">替补
</el-tag>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
</div>
</transition>
</el-card>
</el-card>
</template>
</guava>
<el-dialog
:close-on-click-modal="false"
:visible.sync="importVisible"
title="导入"
width="50%"
>
<el-timeline>
<el-timeline-item placement="top" timestamp="下载模板">
<el-card>
<el-button
@click="location.href='/platform/basics/downloadTemplate?filePath=activity/ActivityApplyUser.xlsx&fileName=导入模板.xlsx'"
icon="el-icon-download" size="medium"
style="width: 200px"
type="">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="上传文件">
<el-card>
<el-upload
:auto-upload="false"
:file-list="importData.fileList"
:limit="1"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xls','xlsx']})
}"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
name="file"
ref="upload">
<el-button icon="el-icon-upload" size="medium" style="width: 200px" type="">
选择文件
</el-button>
</el-upload>
</el-card>
</el-timeline-item>
</el-timeline>
<span class="dialog-footer" slot="footer">
<el-button :disabled="importLoading" @click="importVisible = false">取 消</el-button>
<el-button :loading="importLoading" @click="doImport" type="primary">确定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
importData: {},
importLoading: false,
importVisible: false,
events: [],
activityTypeList: [],
noneData: true,
tabLoading: true,
activities: [],
apply: [],
apply2: [],
unions: [],
rootData: [],
tableKey: '',
pageForm: {
id: '',
unionid: "",
year: new Date().getFullYear() + '',
},
tableColumns: [
{prop: 'allName', label: '项目名称', sortable: true, width: '200px'},
{prop: 'team', label: '所属队', sortable: true},
{prop: 'username', label: '姓名'},
{prop: 'loginname', label: '教工号'},
{prop: 'sex', label: '性别'},
/* {prop: 'divisionLevelLeadership', label: '是否处级领导', sortable: true},*/
{prop: 'unitname', label: '单位', sortable: true},
{prop: 'mobile', label: '电话'},
{prop: 'projectType', label: '项目类型', sortable: true},
{prop: 'identity', label: '身份', sortable: true, width: '300px'},
],
projectTypeList: [
{id: '1', name: '单项'},
{id: '2', name: '团体'},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/activity/school/Info.vue'),
},
filters: {
money(val) {
return val ? val : 0
},
str(val) {
return val ? val : '暂无'
}
},
watch: {
'pageForm.applyed': (val) => {
vue.changeVVV(val)
}
},
methods: {
doImport() {
if (!this.importData.fileList.length) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
data.append("activityId", this.pageForm.id);
});
this.importLoading = true
$.ajax({
url: loc() + "/importUserActivitys",
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
if (!data.code) {
this.notifySuccess(data.msg);
this.getData();
this.importVisible = false
} else {
this.notifyWarning(data.msg)
}
this.importLoading = false
},
error: (data) => {
this.notifyWarning(data.msg)
this.importLoading = false
}
});
},
openImport() {
this.importData = {
fileList: []
}
if (!this.pageForm.id) {
this.notifyWarning("请先选择活动名称")
return
}
this.importVisible = true;
},
doExportByEnroll() {
const {id, unionid} = this.pageForm
if (unionid === "") {
this.$notify.warning({title: '警告', message: "请选择要导出的工会"});
return
}
window.open(loc() + "/doExportByEnroll?id=" + id + "&unionId=" + unionid)
},
async changeLevel() {
await this.getNearActivity()
},
doExport() {
const {id, unionid} = this.pageForm
location.href = "/platform/activity/common/exportXlsx?id=" + id
},
async yearChange() {
this.pageForm.id = null
await this.getNearActivity()
},
changeVVV() {
if (this.pageForm.unionid) {
this.apply = this.rootData.filter(v => {
return v.id === this.pageForm.unionid
})
} else {
this.apply = JSON.parse(JSON.stringify(this.rootData))
}
if (this.pageForm.applyed === '1') {
this.apply = this.apply.filter(v => {
return v.num === 0
})
} else if (this.pageForm.applyed === '2') {
this.apply = this.apply.filter(v => {
return v.num > 0
})
}
this.tableKey = new Date().getTime()
},
async getNearActivity() {
const resp = await $.get(loc() + "/getNearActivity", {
year: this.pageForm.year,
activityLevel: this.pageForm.activityLevel
})
if (resp.code === 0) {
this.activities = resp.data
if (resp.data.length) {
this.pageForm.id = resp.data[0].id
this.getData()
} else {
this.pageForm.unionid = ""
this.unionis = []
this.pageForm.id = ""
this.noneData = true
this.tabLoading = false
}
} else {
this.notifyWarning(resp.msg)
}
},
async changeActivit() {
const resp = await $.post("/platform/activity/apply/getEvents", {activityId: this.pageForm.id})
this.events = resp
},
doEventType(app) {
const {apply, projectType} = app
if (!app.projectType) {
this.$set(app, "apply2", apply)
} else {
const arr = apply.filter(i => {
return i.projectType == projectType
})
this.$set(app, "apply2", arr)
}
},
doEvent(app) {
const {apply, eventId} = app
if (!app.eventId) {
this.$set(app, "apply2", apply)
} else {
const arr = apply.filter(i => {
return !i.unionLeader && !i.unionCoach && i.evid == eventId
})
this.$set(app, "apply2", arr)
}
},
async getData() {
this.noneData = true
this.tabLoading = true
await this.changeActivit()
const activity = this.activities.filter(v => {
return v.id === this.pageForm.id
})
this.pageForm.activityName = activity.length > 0 ? activity[0].name : null
this.pageForm.applyType = activity[0].applyType
const resp = await $.get(loc() + "/getData", this.pageForm)
this.tabLoading = false
if (resp.code === 0) {
const v = resp.data
if (v.length) {
/* if (activity[0].applyType == 2) {*/
v.forEach(x => {
const leaders = x.apply.filter(i => {
return i.unionLeader
})
x.leader = {}
if (leaders.length) {
x.leader = leaders[0]
}
const coachs = x.apply.filter(i => {
return i.unionCoach
})
x.coach = {}
if (coachs.length) {
x.coach = coachs[0]
}
const heads = x.apply.filter(i => {
return i.unionHead
})
x.head = {}
if (heads.length) {
x.head = heads[0]
}
const staffs = x.apply.filter(i => {
return i.unionStaff
})
x.staff = {}
if (staffs.length) {
x.staff = staffs[0]
}
x.apply = x.apply.filter(i => {
return !i.unionLeader && !i.unionCoach && !i.unionHead && !i.unionStaff
})
})
/*}*//* else {
v.forEach(x => {
const leaders = x.apply.filter(i => {
return i.identity.includes(3)
})
x.leader = {}
if (leaders.length) {
x.leader = leaders[0]
}
const coachs = x.apply.filter(i => {
return i.identity.includes(2)
})
x.coach = {}
if (coachs.length) {
x.coach = coachs[0]
}
x.apply = x.apply.filter(i => {
return i.identity.includes(1)
})
})
}*/
v.sort((a, b) => {
return b.num - a.num
})
this.unions = v.map(v => {
return {id: v.id, unionname: v.unionname}
})
if (this.unions.length == 1) {
this.pageForm.unionid = this.unions[0].id
}
this.rootData = JSON.parse(JSON.stringify(v))
this.rootData.forEach(x => {
x.apply2 = clone(x.apply)
})
this.noneData = false
} else {
this.unions = []
this.pageForm.unionid = ""
this.noneData = true
}
if (this.pageForm.activityLevel !== '40001' && this.rootData && this.rootData.length > 0) {
this.$set(this.rootData[0], "show", true)
}
this.apply = this.rootData
this.tableKey = new Date().getTime()
} else {
this.notifyWarning(resp.msg)
this.noneData = true
}
},
async getActivityTypeList(code) {
const {data} = await $.get("/platform/activity/basic/basic/settings/getActivityTwoLevelType", {code: code})
return data;
},
},
async created() {
await this.changeActivit()
this.activityTypeList = await this.getActivityTypeList("40000")
this.$set(this.pageForm, "activityLevel", this.activityTypeList[0].code)
await this.getNearActivity()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,318 @@
<!--#
layout("/layouts/platform.html"){
#-->
<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-input v-model="pageForm.name" placeholder="请输入活动名称" clearable></el-input>-->
<el-select v-model="pageForm.activityId" placeholder="请选择活动项目" filterable clearable
style="width: 100%">
<el-option
v-for="item in activitys"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<!--<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 events"
:key="item.id"
:label="item.allname"
:value="item.id">
</el-option>
</el-select>
</div>
</div>-->
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="活动信息" :app="this"></table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template v-if="column.prop=='events'" scope="{row}">
<span>{{row.allName}}</span>
</template>
<template v-else-if="column.prop=='gameStyle'" scope="{row}">
<span>{{activity.school.gameStyle[row.gameStyle]}}</span>
</template>
<template v-else-if="column.prop=='startTime'" scope="{row}">
{{moment(row.startTime).format('YYYY-MM-DD')}} -
{{moment(row.endTime).format('YYYY-MM-DD')}}
</template>
<template v-else-if="column.prop=='state'"
scope="{row:{close,applyStartTime,applyEndTime,startTime,endTime}}">
<div v-html="activity.school.getStatus(close,applyStartTime,applyEndTime,startTime,endTime)"></div>
</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
v-if="moment(row.applyEndTime).valueOf() >= moment().valueOf() && moment().valueOf() >= moment(row.applyStartTime).valueOf()"
:command="{type:'remind',row}">
发送提醒
</el-dropdown-item>
<el-dropdown-item :command="{type:'view',row}">
查看
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<vi-title title="发送提醒"></vi-title>
<el-divider content-position="right">
<el-button @click="sendAllRemind" type="primary" size="mini"><i class="el-icon-position"></i> 一键发送提醒
</el-button>
</el-divider>
<el-table :data="unionData" style="width: 100%;margin-bottom: 20px" row-key="id" v-loading="tableLoading"
class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column type="expand" class="info">
<template slot-scope="{row}">
<el-card class="box-card">
<el-table :data="row.users" style="width: 100%;margin-bottom: 20px" row-key="id" border
stripe :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod"
label="序号" width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in applyColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template scope="{row}" v-if="column.prop=='divisionLevelLeadership'">
<span v-if="row.divisionLevelLeadership==true" class="text-primary">是</span>
<span v-else class="text-danger">否</span>
</template>
<template scope="{row:{identity}}" v-else-if="column.prop=='identity'">
<el-tag v-if="identity==1" effect="dark">运动员</el-tag>
<el-tag v-if="identity==2" type="success" effect="dark">教练</el-tag>
<el-tag v-if="identity==3" type="warning" effect="dark">领队</el-tag>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in unionColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template scope="{row}" v-if="column.prop=='telephone'">
<span>{{row.telephone?row.telephone:'暂无'}}</span>
</template>
<template scope="{row}" v-if="column.prop=='unionleader'">
<span>{{row.unionleader?row.unionleader:'暂无'}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="150px">
<template scope="{row}">
<el-tooltip class="item" effect="dark" content="发送提醒" placement="top-start">
<el-button @click="sendRemind(row)" type="primary" size="mini"
icon="el-icon-message"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
activityId: '',
planList: [],
typeList: [],
events: [],
activitys: [],
unionData: [],
unionColumns: [
{prop: 'unionname', label: '工会名称'},
{prop: 'unionleader', label: '负责人'},
{prop: 'telephone', label: '联系方式'},
{prop: 'num', label: '已报名人数'},
],
applyColumns: [
{prop: 'username', label: '姓名'},
{prop: 'loginname', label: '工号'},
{prop: 'mobile', label: '电话'},
{prop: 'sex', label: '性别'},
{prop: 'divisionLevelLeadership', label: '是否处级领导'},
{prop: 'identity', label: '身份'}
],
tableColumns: [
{prop: 'name', label: '活动名称'},
{prop: 'address', label: '活动地点'},
{prop: 'gameStyle', label: '活动类型'},
{prop: 'startTime', label: '活动日期'},
{prop: 'state', label: '活动状态'},
{prop: 'applyNum', label: '已报名人数'},
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/activity/school/Info.vue'),
},
methods: {
dropdownCommand(command) {
const {type, row} = command
if (type === 'remind') {
this.openRemind(row)
} else if (type === 'view') {
this.openView(row)
}
},
openView(row) {
const {id} = row
this.$refs.guava.view()
setTimeout(()=>{
this.$refs.info.getInfo(id)
},500)
},
async openRemind(row) {
this.activityId = row.id
this.$refs.guava.edit()
const {data} = await $.get(loc() + "/getUnionRemind", {activityId: row.id})
this.unionData = data
},
sendRemind(row) {
if (!row.telephone) {
this.$notify.warning({title: '警告', message: '该工会联系方式为空,无法发送短信进行提醒!'});
return
}
this.$confirm("确定要发送提醒短信给【" + row.unionname + "】的负责人吗?", '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.get(loc() + "/sendRemind", {phone: row.telephone, unionname: row.unionname})
if(resp.code===0){
this.notifySuccess(resp.msg)
}else{
this.notifyWarning(resp.msg)
}
});
},
sendAllRemind() {
this.$confirm("确定发送提醒短信给所有未报名的分工会吗?", '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const loading = this.$loading({
lock: true,
text: '正在发送...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.get(loc() + "/sendAllRemind", {activityId: this.activityId})
loading.close()
if(resp.code===0){
this.notifySuccess(resp.msg)
}else{
this.notifyWarning(resp.msg)
}
});
},
async getActivitys() {
const {data} = await $.get(loc() + "/getActivitys")
return data;
},
async getEvents() {
const resp = await $.post("/platform/activity/apply/getEvents", {activityId: this.pageForm.activityId})
this.events = resp
}
},
async created() {
this.pageData()
this.activitys = await this.getActivitys()
this.planList = await activity.getSchoolActivityPlan()
this.unitOptions = await getUnits(null)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,868 @@
<!--#
layout("/layouts/platform.html"){
#-->
<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">年&emsp;&emsp;度</div>
<div class="search-item-option">
<el-date-picker
@change="yearChange"
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">活动名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.activityId" placeholder="请选择活动名称" filterable clearable
style="width: 100%" @change="doSearchS">
<el-option
v-for="item in activityList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<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%" @change="doSearchS">
<el-option
v-for="item in events"
:key="item.eventId"
:label="item.allName"
:value="item.eventId">
</el-option>
</el-select>
</div>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="项目列表" :app="this">
<template #label_end>
<!--<el-radio-group v-model="pageForm.isMenWomen" @change="doSearch"
style="margin-left: 10px">
<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-button :label="4">团体</el-radio-button>
</el-radio-group>-->
<el-checkbox-group @change="doSearch" class="mr10" 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-group>
<el-checkbox-group @change="doSearch" v-model="pageForm.isMenWomen">
<el-checkbox-button :key="4" :label="4">单项</el-checkbox-button>
<el-checkbox-button :key="5" :label="5">团体</el-checkbox-button>
</el-checkbox-group>
<div class="search-item-option">
<el-select v-model="pageForm.groupName" placeholder="请选择组别"
filterable clearable
style="width: 100%;margin-bottom: 5px;margin-left: 10px" @change="doSearch">
<el-option
v-for="item in groupList"
:key="item.id"
:label="item.name"
:value="item.name">
</el-option>
</el-select>
</div>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column prop="allName" align="center" header-align="center"
label="项目名称"></el-table-column>
<el-table-column prop="rs" align="center" header-align="center"
label="获奖数量"></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:'input',row}">
录入成绩
</el-dropdown-item>
<el-dropdown-item :command="{type:'view',row}">
查&emsp;&emsp;看
</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="openAdd" v-if="awardsMode==1">临时获奖人员添加</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</template>
<template #edit>
<template>
<vi-title title="录入成绩"></vi-title>
<el-form :model="formData" ref="addForm" label-width="120px"
label-suffix=":">
<el-row gutter="40">
<el-col :span="12">
<el-form-item prop="name" label="活动名称">
<el-input maxlength="200" disabled v-model="name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="allName" label="活动项目">
<el-input maxlength="200" disabled v-model="allName"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<div style="display: flex;margin: 20px 0">
<el-divider content-position="left">获奖名次列表</el-divider>
<div style="padding-left: 10px;padding-top: 10px;">
<el-tooltip class="item" effect="dark" content="点击添加活动人员" placement="top">
<el-button style="float: right;margin-bottom: 10px" type="primary" icon="el-icon-plus"
size="mini"
@click="openAddUser">
添加
</el-button>
</el-tooltip>
</div>
</div>
<el-table style="margin-bottom: 20px" border stripe :data="userData" size="small"
v-loading="userTabLoading">
<el-table-column
type="index" label="序号" header-align="center" align="center" width="100">
</el-table-column>
<el-table-column align="center" header-align="center"
:label="awardsMode==1?'姓名':'分工会'"
prop="id">
<template scope="{$index,row}">
<el-select v-model="row.userId" @change="(val)=>{userDetailsChange(val,row)}"
placeholder="请输入姓名" filterable clearable
style="width: 100%" size="small" v-if="awardsMode==1">
<el-option
v-for="item in userList"
:disabled="item.disabled"
:key="item.id"
:label="item.username+'('+item.loginname+')'+item.sex"
:value="item.id">
</el-option>
</el-select>
<el-select v-model="row.unionId" @change="(val)=>{unionDetailsChange(val,row)}"
placeholder="请输入分工会" filterable clearable
style="width: 100%" size="small" v-if="awardsMode==2">
<el-option
v-for="item in unionList"
:disabled="item.disabled"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="名次" prop="ranking">
<template scope="{$index,row}">
<el-select v-model="row.ranking" @change="rankingChange(row)"
placeholder="请输入名次" filterable clearable
style="width: 100%" size="small">
<el-option
v-for="item in rankingList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="积分" prop="integral">
<template scope="{row}">
<el-input-number v-model="row.integral"
type="text"></el-input-number>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="人数" prop="numberOfPeople"
v-if="awardsMode==2">
<template scope="{row}">
<el-input-number v-model="row.numberOfPeople"
type="text"></el-input-number>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="分工会" prop="unionname"
v-if="awardsMode==1">
<template scope="{row}">
<el-input v-model="row.unionname" disabled placeholder="分工会"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="150px">
<template scope="{$index,row}">
<el-button type="danger" icon="el-icon-delete" circle
@click="delUser($index,row)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</template>
</template>
<template #view>
<el-form :model="formData" ref="addForm" label-width="120px" label-suffix=":">
<el-row gutter="40">
<el-col :span="12">
<el-form-item prop="name" label="活动名称">
<el-input maxlength="200" disabled v-model="name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="allName" label="活动项目">
<el-input maxlength="200" disabled v-model="allName"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div style="display: flex;margin: 20px 0">
<el-divider content-position="left">获奖名次列表</el-divider>
</div>
<el-table style="margin-bottom: 20px" border stripe :data="viewData" size="small"
v-loading="userTabLoading">
<el-table-column
type="index" label="序号" header-align="center" align="center" width="100">
</el-table-column>
<el-table-column align="center" header-align="center"
:label="awardsMode==1?'姓名':'分工会'"
prop="id">
<template scope="{$index,row}">
<el-select v-model="row.userId" @change="(val)=>{userDetailsChange(val,row)}"
placeholder="请输入姓名" filterable clearable disabled
style="width: 100%" size="small" v-if="awardsMode==1">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.username+'('+item.loginname+')'+item.sex"
:value="item.id">
</el-option>
</el-select>
<el-select v-model="row.unionId" @change="(val)=>{unionDetailsChange(val,row)}"
placeholder="请输入分工会" filterable clearable disabled
style="width: 100%" size="small" v-if="awardsMode==2">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="名次" prop="ranking">
<template scope="{$index,row}">
<el-select v-model="row.ranking" @change="rankingChange(row)"
placeholder="请输入名次" filterable clearable disabled
style="width: 100%" size="small">
<el-option
v-for="item in rankingList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="积分" prop="integral">
<template scope="{row}">
<el-input v-model="row.integral" disabled type="text"></el-input>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="人数" prop="numberOfPeople"
v-if="awardsMode==2">
<template scope="{row}">
<el-input v-model="row.numberOfPeople" disabled type="text"></el-input>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="分工会" prop="unionname"
v-if="awardsMode==1">
<template scope="{row}">
<el-input v-model="row.unionname" disabled placeholder="分工会"
type="text"></el-input>
</template>
</el-table-column>
</el-table>
</template>
</guava>
<el-dialog
title="添加人员"
:visible.sync="dialogVisible"
width="40%"
:close-on-click-modal="false"
>
<el-form :model="formData" ref="form" :rules="formRules" label-width="100px">
<!-- <el-form-item prop="loginname" label="工&emsp;&emsp;号">
<el-input maxlength="50" placeholder="请填写工号" v-model="formData.loginname"
type="text" @blur="userBlur"></el-input>
</el-form-item>
<el-form-item prop="username" label="姓&emsp;&emsp;名">
<el-input maxlength="50" placeholder="请填写姓名" v-model="formData.username"
type="text"></el-input>
</el-form-item>-->
<el-form-item prop="mobile" label="姓名或工号">
<el-select
style="width: 100%"
v-model="formData.userid"
filterable
clearable
remote
reserve-keyword
allow-create
default-first-option
placeholder="请输入姓名或工号查找"
:remote-method="userRemoteMethod"
@change="userChange2">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="loginname" label="工&emsp;&emsp;号">
<el-input maxlength="50" placeholder="请填写工号" v-model="formData.loginname"
type="text"></el-input>
</el-form-item>
<el-form-item prop="mobile" label="电&emsp;&emsp;话">
<el-input maxlength="50" placeholder="请填写电话" v-model="formData.mobile"
type="text"></el-input>
</el-form-item>
<el-form-item prop="sex" label="性&emsp;&emsp;别">
<el-radio-group v-model="formData.sex">
<el-radio :label="'男'" border>男</el-radio>
<el-radio :label="'女'" border>女</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="unitId" label="所在单位">
<el-select v-model="formData.unitId" placeholder="请选择所在单位" clearable @change="unitChange" filterable
style="width: 100%">
<el-option
v-for="item in unitOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="unionname" label="所属工会">
<el-input disabled placeholder="所属工会" v-model="formData.unionname"
type="text"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAddUser">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
userOptions: [],
groupList: [
{value: 1, name: "甲组"},
{value: 2, name: "乙组"},
{value: 3, name: "丙组"},
{value: 4, name: "丁组"}
],
dialogVisible: false,
viewData: [],
userTabLoading: false,
awardsMode: "",
isMenWomen: "",
allName: "",
name: "",
eventId: "",
activityId: "",
userData: [],
userList: [],
userList2: [],
unionList: [],
unionList2: [],
activityList: [],
events: [],
unitOptions: [],
rankingList: [
{name: "第一名", id: 1},
{name: "第二名", id: 2},
{name: "第三名", id: 3},
{name: "第四名", id: 4},
{name: "第五名", id: 5},
{name: "第六名", id: 6},
{name: "第七名", id: 7},
{name: "第八名", id: 8}],
sexList: [{sex: "男", id: 1}, {sex: "女", id: 2}],
pageForm: {
isMenWomen: [],
year: new Date().getFullYear() + "",
},
formRules: {
unitId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
username: [{required: true, message: '必填', trigger: ['blur', 'change']}],
loginname: [{required: true, message: '必填', trigger: ['blur', 'change']}],
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
methods: {
dropdownCommand(command) {
const {type, row} = command
if (type === 'view') {
this.openView(row)
} else if (type === 'input') {
this.openInput(row)
}
},
async userRemoteMethod(query) {
if (query) {
const userData = await searchUser(query, null, null, null, null)
this.userOptions = userData
}
},
userChange2(userid) {
const aa = this.userOptions.find(v => v.id === userid)
if (aa != undefined) {
this.$set(this.formData, "username", aa.username)
this.$set(this.formData, "loginname", aa.loginname)
this.$set(this.formData, "mobile", aa.mobile)
this.$set(this.formData, "unitId", aa.unitid)
this.$set(this.formData, "unionId", aa.unionid)
this.$set(this.formData, "unionname", aa.unionname)
this.$set(this.formData, "sex", aa.sex)
} else {
this.$set(this.formData, "username", userid)
}
},
async unitChange() {
const uniotData = this.unitOptions.find(v => v.id == this.formData.unitId)
this.$set(this.formData, "unionname", uniotData.unionname)
this.$set(this.formData, "unionId", uniotData.unionid)
this.$set(this.formData, "unitname", uniotData.name)
},
async openAdd() {
this.unitOptions = await getUnits(null)
this.$set(this.formData, "activityId", this.activityId)
this.$set(this.formData, "eventId", this.eventId)
this.$set(this.formData, "awardsMode", this.awardsMode)
this.$set(this.formData, "identity", ['1'])
this.$set(this.formData, "status", 2)
this.$set(this.formData, "sex", "男")
this.dialogVisible = true
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doAddUser() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
if (this.userList.some(v => v.id === this.formData.userid)) {
this.notifyWarning("您添加的运动员已经是远动员!")
return
}
await $.post(loc() + "/doAdd", {
activityResults: JSON.stringify(this.userData),
activityId: this.activityId,
eventId: this.eventId
})
const pageForm = clone(this.formData)
pageForm.identity = JSON.stringify(this.formData.identity)
const resp = await $.post(loc() + "/doAddUser", pageForm)
if(resp.code===0){
await this.userChange()
this.userDetailsChange()
this.dialogVisible = false
}else{
this.notifyWarning(resp.msg)
}
}
})
},
async yearChange() {
this.activityList = []
this.events = []
this.$set(this.pageForm, "activityId", "")
this.$set(this.pageForm, "eventId", "")
const {data} = await $.get("/platform/activity/score/statistics/getActivitys", {year: this.pageForm.year})
this.activityList = data
if (data.length > 0) {
this.pageForm.activityId = this.activityList[0].id
}
await this.doSearchS()
},
async changeActivit() {
const resp = await $.post("/platform/activity/apply/getEvents", {activityId: this.pageForm.activityId})
this.events = resp
},
async doAdd() {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
this.userData.activityId = this.activityId
this.userData.eventId = this.eventId
const resp = await $.post(loc() + "/doAdd", {
activityResults: JSON.stringify(this.userData),
activityId: this.activityId,
eventId: this.eventId
})
loading.close()
if(resp.code===0){
this.pageData()
this.$refs.guava.index()
}else{
this.notifyWarning(resp.msg)
}
},
rankingChange() {
for (let ranking = 1; ranking <= 8; ranking++) {
let size = 0
let indexArray = [];
this.userData.forEach((v, index) => {
if (ranking == v.ranking) {
size++
indexArray.push(index)
}
})
if (size == 1) {
/*
if (this.awardsMode == 2) {
this.userData[indexArray[0]].integral = (this.calScore(ranking) / 2).toFixed(2);
console.log(this.calScore(ranking),2)
} else {
this.userData[indexArray[0]].integral = this.calScore(ranking).toFixed(2);
console.log(this.calScore(ranking),1)
}*/
this.userData[indexArray[0]].integral = this.calScore(ranking).toFixed(2);
} else {
var scoreArray = 0;
for (var i = 0; i < size; i++) {
scoreArray += this.calScore(ranking * 1 + i * 1);
}
/* if (this.awardsMode == 2) {
scoreArray = scoreArray / size / 2;
console.log(scoreArray, 2)
} else {
scoreArray = scoreArray / size;
console.log(scoreArray, 1)
}*/
scoreArray = scoreArray / size;
indexArray.forEach(v => {
this.userData[v].integral = scoreArray.toFixed(2);
})
}
}
},
calScore(ranking) {
let score;
if (ranking < 5) {// 1 2 3 4
if (ranking < 3) {//1 2
if (ranking == 1) {
score = this.awardsMode == 1 ? 9 : 9 * 2;
} else if (ranking == 2) {
score = this.awardsMode == 1 ? 7 : 7 * 2;
}
} else {//3 4
if (ranking == 3) {
score = this.awardsMode == 1 ? 6 : 6 * 2;
} else if (ranking == 4) {
score = this.awardsMode == 1 ? 5 : 5 * 2;
}
}
} else {//5 6 7 8
if (ranking < 7) {//5 6
if (ranking == 5) {
score = this.awardsMode == 1 ? 4 : 4 * 2;
} else if (ranking == 6) {
score = this.awardsMode == 1 ? 3 : 3 * 2;
}
} else {//7 8 9
if (ranking == 7) {
score = this.awardsMode == 1 ? 2 : 2 * 2;
} else if (ranking == 8) {
score = this.awardsMode == 1 ? 1 : 1 * 2;
} else if (ranking == 9) {
score = this.awardsMode == 1 ? 1 : 1 * 2;
}
}
}
return score;
},
userDetailsChange(val, row) {
const useridArr = this.userData.map(v => v.userId)
console.log(useridArr)
this.userList.forEach(v => {
v.disabled = useridArr.includes(v.id)
if (row && row.userId === v.id) {
const o = {
unionId: v.unionid,
activityId: this.activityId,
eventId: this.eventId,
isTeamPersonal: 1,
unionname: v.unionname
}
Object.assign(row, o)
}
})
console.log(this.userList)
},
async unionDetailsChange(val, row) {
let data = ''
if (row) {
const {unionId} = row
data = await $.get(loc() + "/getUnionDetails", {
activityId: this.activityId,
eventId: this.eventId,
unionId: unionId
})
}
this.$nextTick(() => {
const unionIdArr = this.userData.map(v => v.unionId)
this.unionList.forEach(v => {
v.disabled = unionIdArr.includes(v.id)
if (row && row.unionId === v.id) {
const o = {
numberOfPeople: data.data,
activityId: this.activityId,
eventId: this.eventId,
isTeamPersonal: 2
}
Object.assign(row, o)
}
})
})
},
delUser(index, row) {
this.userData.splice(index, 1)
this.userDetailsChange()
this.unionDetailsChange()
},
async getUserList() {
const {data} = await $.get(loc() + "/getUserList", {
activityId: this.activityId,
eventId: this.eventId,
isMenWomen: this.isMenWomen
})
return data;
},
async getUnionList(row) {
const {activityId, eventId} = row
const {data} = await $.get(loc() + "/getUnionList", {
activityId: activityId,
eventId: eventId
})
return data;
},
openAddUser() {
this.userData.push({})
},
async userChange() {
this.userList = await this.getUserList()
this.userList2 = this.userList
this.userData = []
const {data} = await $.get(loc() + "/getUserData", {
activityId: this.activityId,
eventId: this.eventId,
isMenWomen: this.isMenWomen
})
if (data.length > 0) {
this.userData = data
this.viewData = data
}
this.$forceUpdate();
},
async getUnionData(row) {
const {activityId, eventId} = row
const {data} = await $.get(loc() + "/getUnionData", {
activityId: activityId,
eventId: eventId
})
return data
},
async openView(row) {
this.isMenWomen = ""
this.userData = []
this.viewData = []
this.userList = []
this.awardsMode = row.awardsMode
this.name = row.name
this.allName = row.allName
this.activityId = row.activityId
this.eventId = row.eventId
if (row.awardsMode == 2) {
this.unionList = await this.getUnionList(row)
this.viewData = await this.getUnionData(row)
await this.unionDetailsChange(row)
} else {
await this.userChange()
this.userDetailsChange()
}
this.$refs.guava.view()
},
async openInput(row) {
this.isMenWomen = ""
this.userData = []
this.userList = []
this.awardsMode = row.awardsMode
this.name = row.name
this.allName = row.allName
this.activityId = row.activityId
this.eventId = row.eventId
this.isMenWomen = row.isMenWomen
if (row.awardsMode == 2) {
this.unionList = await this.getUnionList(row)
this.userData = await this.getUnionData(row)
await this.unionDetailsChange()
} else {
await this.userChange()
this.userDetailsChange()
}
this.$refs.guava.edit()
},
async getActivitys() {
const {data} = await $.get("/platform/activity/remind/getActivitys")
return data;
},
async doSearchS() {
this.doSearch()
await this.changeActivit()
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageData() {
sublime.showLoadingbar();
this.tabLoading = true
const pageForm = clone(this.pageForm)
pageForm.isMenWomen = JSON.stringify(pageForm.isMenWomen)
$.post(base + "/platform/activity/results/input/pageData", pageForm, (data) => {
sublime.closeLoadingbar();
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
},
async created() {
this.yearChange()
this.pageData()
/* this.activityList = await this.getActivitys()
if (this.activityList.length) {
this.pageForm.activityId = this.activityList[0].id
}
await this.changeActivit()
this.pageData()*/
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,151 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">活动项目:</div>
<div class="search-item-option">
<el-select v-model="pageForm.events" placeholder="请选择活动项目" filterable clearable
style="width: 100%">
<el-option
v-for="item in events"
:key="item.id"
:label="item.allName"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="活动信息" :app="this"></table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template v-if="column.prop=='identity'" scope="{row}">
<span v-if="row.identity===1">运动员</span>
<span v-if="row.identity===2">教练</span>
<span v-if="row.identity===3">领队</span>
</template>
<template v-else-if="column.prop=='events'" scope="{row}">
<span>{{row.allName}}</span>
</template>
<template v-else-if="column.prop=='gameStyle'" scope="{row}">
<span>{{activity.school.gameStyle[row.gameStyle]}}</span>
</template>
<template v-else-if="column.prop=='startTime'" scope="{row}">
{{moment(row.startTime).format('YYYY-MM-DD')}} -
{{moment(row.endTime).format('YYYY-MM-DD')}}
</template>
<template v-else-if="column.prop=='state'"
scope="{row:{close,applyStartTime,applyEndTime,startTime,endTime}}">
<div v-html="activity.school.getStatus(close,applyStartTime,applyEndTime,startTime,endTime)"></div>
</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:'pass',row}">
通过
</el-dropdown-item>
<el-dropdown-item :command="{type:'fail',row}">
不通过
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
events: [],
tableColumns: [
{prop: 'loginname', label: '申请人工号'},
{prop: 'username', label: '申请人姓名'},
{prop: 'mobile', label: '申请人电话'},
{prop: 'identity', label: '申请角色'},
{prop: 'allName', label: '活动项目'},
{prop: 'startTime', label: '活动日期'},
{prop: 'state', label: '活动状态'},
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
methods: {
dropdownCommand(command) {
const {type, row} = command
if (type === 'pass') {
this.doPassFail(row, 2)
} else if (type === 'fail') {
this.doPassFail(row, 3)
}
},
async doPassFail(row, status) {
const resp = await $.post(loc() + "/doPassFail", {id: row.id, status: status})
if(resp.code===0){
this.pageData()
}else{
this.notifyWarning(resp.msg)
}
},
},
async created() {
this.pageData()
this.events = await activity.getEvents()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,443 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#app {
/*max-height: calc(100vh - 50px);
overflow: hidden;*/
}
.query-row {
height: 70px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
/* .el-select, .el-input {
width: 80%;
}*/
.el-date-editor.el-input, .el-date-editor.el-input__inner {
width: 175px !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava"
style="width: 100%;min-height: 100%;background-color: #f0f2f5;padding: 20px;box-sizing: border-box;">
<template>
<div style="max-height: 250px">
<el-card shadow="never">
<div class="btn-group tool-button">
<el-date-picker
v-model="pageForm.year"
@change="getActivitys"
type="year"
value-format="yyyy"
placeholder="选择年" :clearable="false">
</el-date-picker>
</div>
<div class="btn-group tool-button">
<el-select v-model="pageForm.activityId" placeholder="请选择活动名称" filterable
:clearable="false" @change="activityChange" style="width: 100%">
<el-option
v-for="item in activityList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button" v-if="isUnion">
<el-select v-model="pageForm.unionname" placeholder="请选择工会" filterable clearable
@change="unionChange(pageForm.unionId)" style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.unionname"
:value="item.unionname">
</el-option>
</el-select>
</div>
<div class="pull-right offscreen-right">
<el-button type="primary" icon="el-icon-search" @click="getYear8(1)">年度男子团体总分</el-button>
<el-button type="primary" icon="el-icon-search" @click="getYear8(2)">年度女子团体总分</el-button>
<el-button type="primary" icon="el-icon-search" @click="annualResults">年度团体总分</el-button>
<el-button type="primary" icon="el-icon-printer" @click="doExcelCj" class="mr10">导出成绩excel
</el-button>
</div>
</el-card>
<el-card shadow="never" style="margin-top: 10px">
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">按活动统计:</el-col>
<el-col class="query-row-content" v-if="isSearchOptions">
<el-button
style="margin-left: 10px"
size="medium"
v-for="item in searchOptions"
:key="item.id"
:type="item.name" @click="searchClick(item.id)">{{item.name}}
</el-button>
</el-col>
<el-col class="query-row-content" v-else>
<el-button style="margin-left: 10px"
size="medium" @click="gradesClick(9)">成绩统计
</el-button>
</el-col>
<div class="pull-right offscreen-right" style="margin-left: auto">
<!--
<el-button type="primary" icon="el-icon-printer" @click="doExport8ByActivity"
v-if="[11,12].includes(isSearchOptions)&&pageForm.activityId">导出
</el-button>
<el-button type="primary" icon="el-icon-printer" @click="doGetYear8" v-else-if="isYear8">导出
</el-button>
<el-button type="primary" icon="el-icon-printer" @click="print" v-else>打 印</el-button>-->
<el-button type="primary" icon="el-icon-printer" @click="doExportByActivityStatisticsType">
导出
</el-button>
</div>
</el-row>
</el-card>
</div>
<div id=print ref="print">
<el-card shadow="never" class="mt10"
v-show="[1,2,3,4,5,9,10].includes(isSearchOptions)&&isSearchOptions">
<vi-title v-if="isSearchOptions==1" title="男子单项成绩"></vi-title>
<vi-title v-if="isSearchOptions==2" title="女子单项成绩"></vi-title>
<vi-title v-if="isSearchOptions==3" title="男子团体成绩"></vi-title>
<vi-title v-if="isSearchOptions==4" title="女子团体成绩"></vi-title>
<vi-title v-if="isSearchOptions==5" title="男女混合类成绩"></vi-title>
<vi-title v-if="isSearchOptions==9&&isSearch" title="分工会男子项目积分"></vi-title>
<vi-title v-if="isSearchOptions==9&&!isSearch" title="分工会项目成绩"></vi-title>
<vi-title v-if="isSearchOptions==10" title="分工会女子项目积分"></vi-title>
<is-male-female :form="pageForm" ref="female"></is-male-female>
</el-card>
<el-card shadow="never" class="mt10" v-show="[6,7,8].includes(isSearchOptions)&&isSearchOptions">
<vi-title v-if="isSearchOptions==6" title="男子项目前八"></vi-title>
<vi-title v-if="isSearchOptions==7" title="女子项目前八"></vi-title>
<vi-title v-if="isSearchOptions==8" title="综合类前八"></vi-title>
<el-row>
<top-eight :form="pageForm" ref="doeight"></top-eight>
</el-row>
</el-card>
<el-card shadow="never" class="mt10" v-show="[11,12].includes(isSearchOptions)&&isSearchOptions">
<vi-title v-if="isSearchOptions==11" title="分工会男子总分前八"></vi-title>
<vi-title v-if="isSearchOptions==12" title="分工会女子总分前八"></vi-title>
<score-top-eight :form="pageForm" ref="doTopEight"></score-top-eight>
</el-card>
<el-card shadow="never" class="mt10" v-show="[99].includes(isSearchOptions)">
<vi-title v-if="isSearchOptions==99" title="全年成绩"></vi-title>
<el-table :data="annualResultsTableData" style="width: 100%;height: 100%" stripe border
show-summary
:header-cell-style="{background:'#FAFAFA'}" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" size="mini" fixed ref="annualResults"
>
<el-table-column align="center" header-align="center" type="index"
label="名次"
width="80px" fixed></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in annualTableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
isMenWomen: "",
isUnion: false,
isYear8: false,
annualTableColumns: [],
annualResultsTableData: [],
annualMaxHeight: 0,
colspan: [],
eventList: [],
score: [],
titleCol: 0,
activityList: [],
events: [],
unionList: [],
units: [],
isSearch: true,
searchOptions: [],
Options: [
/* {id: 1, name: "男子单项"},
{id: 2, name: "女子单项"},
{id: 3, name: "男子团体"},
{id: 4, name: "女子团体"},
{id: 5, name: "男女混合类"},*/
{id: 9, name: "分工会男子项目积分"},
{id: 10, name: "分工会女子项目积分"},
{id: 6, name: "男子项目前八"},
{id: 7, name: "女子项目前八"},
{id: 8, name: "团体前八"},
{id: 11, name: "分工会男子总分前八"},
{id: 12, name: "分工会女子总分前八"},
],
isSearchOptions: 9,
pageForm: {
unionname: '',
activityId: "",
personTypes: [],
year: new Date().getFullYear() + "",
},
activityStatisticsType: 0//统计类型说明:1 年度男子团体总分2.年度女子团体总分3.年度团体总分4.分工会男子项目积分5.分工会女子项目积分,依次后推
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'is-male-female': httpVueLoader('/components/activity/score/isMaleFemale.vue?v=' + new Date().getTime()),
'top-eight': httpVueLoader('/components/activity/score/topEight.vue?v=' + new Date().getTime()),
'score-top-eight': httpVueLoader('/components/activity/score/scoreTopEight.vue?v=' + new Date().getTime()),
},
methods: {
async doExportByActivityStatisticsType() {
const {activityId, year} = this.pageForm
const url = "/platform/activity/statistics/export"
if (this.activityStatisticsType === 1 || this.activityStatisticsType === 2) {
window.open(url + "/getYear8?year=" + year + "&isMenWomen=" + this.isMenWomen)
} else if (this.activityStatisticsType === 3) {
window.open(url + "/getAnnualResults?year=" + year)
} else if (this.activityStatisticsType === 4 || this.activityStatisticsType === 5) {
let sex = this.activityStatisticsType === 4 ? "男" : "女"
window.open(url + "/isMaleFemale?activityId=" + activityId + "&sex=" + sex + "&awardsMode=4")
} else if (this.activityStatisticsType === 6 || this.activityStatisticsType === 7 || this.activityStatisticsType === 8) {
let sex = this.activityStatisticsType === 6 ? "男" : "女"
let awardsMode = this.activityStatisticsType === 8 ? 2 : 1
window.open(url + "/isTopEight?activityId=" + activityId + "&sex=" + sex + "&awardsMode=" + awardsMode)
} else if (this.activityStatisticsType === 9 || this.activityStatisticsType === 10) {
let sex = this.activityStatisticsType === 9 ? "男" : "女"
window.open(url + "/isScoreTopEight?activityId=" + activityId + "&sex=" + sex)
}
},
doExport8ByActivity() {
window.open(loc() + "/doExport8ByActivity?activityId=" + this.pageForm.activityId + "&isMenWomen=" + (this.isSearchOptions === 11 ? 1 : 2))
},
doExcelCj() {
const {activityId, unionname} = this.pageForm
let unionId = ''
if (unionname) {
const unionlist = clone(this.unionList)
unionId = unionlist.find(v => v.unionname === unionname).id
}
window.open(loc() + "/doExcelCj?activityId=" + activityId + "&unionId=" + unionId)
},
print() {
let subOutputRankPrint = document.getElementById('print');
let newContent = subOutputRankPrint.innerHTML;
let oldContent = document.body.innerHTML;
document.body.innerHTML = newContent;
window.print();
window.location.reload();
document.body.innerHTML = oldContent;
return false;
},
activityChange() {
const aa = this.activityList.find(v => v.id == this.pageForm.activityId)
if (aa.applyType == 1) {
this.isSearch = false
this.searchOptions = [{id: 9, name: "分工会项目成绩"}]
} else {
this.searchOptions = this.Options
}
this.searchClick(9)
},
unionChange() {
this.searchClick(9)
},
searchClick(id) {
if (id === 9) {
this.activityStatisticsType = 4
} else if (id === 10) {
this.activityStatisticsType = 5
} else if (id === 6) {
this.activityStatisticsType = 6
} else if (id === 7) {
this.activityStatisticsType = 7
} else if (id === 8) {
this.activityStatisticsType = 8
} else if (id === 11) {
this.activityStatisticsType = 9
} else if (id === 12) {
this.activityStatisticsType = 10
}
this.isSearchOptions = id
if (id <= 5 || id == 9 || id == 10) {
if (id == 1 || id == 2) {
this.isUnion = false
this.isYear8 = false
this.pageForm.sex = id == 1 ? "男" : "女"
this.pageForm.awardsMode = 1
} else if (id == 3 || id == 4) {
this.isUnion = false
this.isUnionisYear8 = false
this.pageForm.sex = id == 3 ? "男" : "女"
this.pageForm.awardsMode = 2
} else if (id == 9 || id == 10) {
this.isUnion = true
this.pageForm.sex = id == 9 ? "男" : "女"
this.pageForm.awardsMode = 4
} else {
this.pageForm.awardsMode = 3
}
this.$refs.female.isMaleFemale()
} else if (id == 6 || id == 7 || id == 8) {
if (id == 6 || id == 7) {
this.isUnion = false
this.isYear8 = false
this.pageForm.sex = id == 6 ? "男" : "女"
this.pageForm.awardsMode = 1
} else if (id == 8) {
this.pageForm.awardsMode = 2
}
this.$refs.doeight.isTopEight()
} else if (id == 11 || id == 12) {
this.pageForm.sex = id == 11 ? "男" : "女"
this.$refs.doTopEight.isScoreTopEight()
}
},
async doGetYear8() {
location.href = loc() + "/doGetYear8?year=" + this.pageForm.year + "&isMenWomen=" + this.isMenWomen
},
async getYear8(isMenWomen) {
this.activityStatisticsType = isMenWomen
this.isMenWomen = isMenWomen
this.isUnion = false
this.isYear8 = true
this.$set(this.pageForm, "activityId", null)
this.$set(this.pageForm, "unionname", null)
this.annualTableColumns = []
this.annualResultsTableData = []
const loading = this.$loading({
lock: true,
text: '数据正在查询中,请稍后...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
this.isSearchOptions = 99
const {data} = await $.get(loc() + "/getYear8", {
year: this.pageForm.year,
isMenWomen: isMenWomen
})
this.annualResultsTableData = data.score
this.annualResultsTableData = this.annualResultsTableData.sort((a, b) => b['总分'] - a['总分'])
data.label.forEach(v => {
this.annualTableColumns.push({label: v, prop: v})
})
loading.close();
},
async annualResults() {
this.activityStatisticsType = 3
this.isUnion = false
this.isYear8 = false
this.$set(this.pageForm, "activityId", null)
this.$set(this.pageForm, "unionname", null)
this.annualTableColumns = []
this.annualResultsTableData = []
const loading = this.$loading({
lock: true,
text: '数据正在查询中,请稍后...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
this.isSearchOptions = 99
const {data} = await $.get(loc() + "/getAnnualResults", {
year: this.pageForm.year
})
this.annualResultsTableData = data.score
this.annualResultsTableData = this.annualResultsTableData.sort((a, b) => b['总分'] - a['总分'])
data.label.forEach(v => {
this.annualTableColumns.push({label: v, prop: v})
})
loading.close();
},
async getActivitys() {
const {data} = await $.get(loc() + "/getActivitys", {year: this.pageForm.year})
this.pageForm = {
activityId: "",
year: this.pageForm.year
},
this.activityList = data
},
async changeActivit() {
const resp = await $.post("/platform/activity/apply/getEvents", {activityId: this.pageForm.activityId})
this.events = resp
},
},
async created() {
this.searchOptions = this.Options
this.unionList = await getUnions(null)
await this.getActivitys()
if (this.activityList.length) {
this.pageForm.activityId = this.activityList[0].id
}
setTimeout(() => {
this.searchClick(9)
}, 200)
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,602 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-date-picker v-model="pageForm.year"
type="year" value-format="yyyy" style="width: 200px" placeholder="选择年">
</el-date-picker>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 110px;">
<el-option label="场地名称" value="name"></el-option>
<el-option label="场地地址" value="address"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.siteType" placeholder="场地类型" clearable
style="width: 200px;">
<el-option v-for="item in activityTypeList" :label="item.text" :value="item.value"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button type="primary" icon="el-icon-plus" @click="openAdd">新建场地</el-button>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="tableData" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading">
<el-table-column align="center" header-align="center" 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" show-overflow-tooltip header-align="center" label="场地名称"
prop="name"></el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="排序编号"
prop="sortNum"></el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="场地地址"
prop="address"></el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="联系人"
prop="contact_person"></el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="联系方式"
prop="contact_phone"></el-table-column>
<el-table-column align="center" :show-overflow-tooltip="true" header-align="center" label="开启状态"
prop="state">
<template slot-scope="{row}">
<el-switch disabled v-model="row.state" active-color="#13ce66"
inactive-color="#ff4949"></el-switch>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="250px">
<template slot-scope="{row}">
<el-button type="primary" @click="openEdit(row.id)" size="mini">编辑</el-button>
<el-button type="danger" @click="doDelete(row)" size="mini">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<vi-title title="输入场地信息"></vi-title>
<el-form :model="formData" ref="addForm" :rules="formRules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="name" label="场地名称">
<el-input maxlength="100" placeholder="请输入场地名称" v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="address" label="场地地址">
<el-input maxlength="100" placeholder="请输入场地地址" v-model="formData.address"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="contact_person" label="联系人">
<el-input v-model="formData.contact_person" placeholder="请输入联系人" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="contact_phone" label="联系方式">
<el-input v-model="formData.contact_phone" placeholder="请输入联系方式" type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="create_username" label="创建人">
<el-input readonly v-model="formData.create_username" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="create_time" label="创建时间">
<el-input readonly v-model="formData.create_time" type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="typeId" label="场地类型">
<el-select v-model="formData.typeId" style="width: 100%" filterable
placeholder="请选择场地类型">
<el-option v-for="item in activityTypeList" :label="item.meetingTypeName"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="容纳人数" prop="maxNum">
<el-input v-model="formData.maxNum" placeholder="请输入容纳人数" type="number"></el-input>
</el-form-item>
</el-col>
<!--<el-col :span="12">
<el-form-item prop="reserveTarget" label="面向对象">
<el-radio-group v-model="formData.reserveTarget" size="medium">
<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-form-item>
</el-col>-->
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="sortNum" label="排序编号">
<el-input v-model="formData.sortNum" placeholder="请输入排序编号" type="number"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="state" label="开启状态">
<el-radio-group v-model="formData.state" size="medium">
<el-radio-button :label="true">开启</el-radio-button>
<el-radio-button :label="false">禁用</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="filterHolidays" label="排除节假日">
<el-radio-group v-model="formData.filterHolidays" size="medium">
<el-radio-button :label="true">是</el-radio-button>
<el-radio-button :label="false">否</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="sexLimit" label="性别限制">
<el-radio-group v-model="formData.sexLimit" size="medium">
<el-radio-button :label="0">不限制</el-radio-button>
<el-radio-button :label="1">男</el-radio-button>
<el-radio-button :label="2">女</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="12">
<el-form-item label="禁用时间">
<el-button type="primary" @click="openSetUpTime" size="small">点击设置禁用时间</el-button>
<span style="color: #c64120">您已设置{{ formData.notApplyTimeList ? formData.notApplyTimeList.length : 0 }}个禁用时间</span>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="场地介绍">
<text-editor v-model="formData.introduce"></text-editor>
</el-form-item>
</el-form>
<vi-title2 title="添加场次(温馨提醒:如果设置了预约时间单位,那么系统会在开始时间至结束时间范围内,按照设置的单位来拆分成多个时间段,如果未设置或者为0,则表示开始时间至结束时间是一个时间段)">
<template #func>
<el-button type="primary" @click="formData.open_hours.push({})">
添加
</el-button>
</template>
</vi-title2>
<el-table :data="formData.open_hours" border size="mini">
<el-table-column prop="weekNum" label="星期" align="center" header-align="center">
<template slot-scope="{row}">
<el-select style="width: 100%" v-model="row.weekNum" filterable placeholder="请选择星期">
<el-option label="周一" :value="1"></el-option>
<el-option label="周二" :value="2"></el-option>
<el-option label="周三" :value="3"></el-option>
<el-option label="周四" :value="4"></el-option>
<el-option label="周五" :value="5"></el-option>
<el-option label="周六" :value="6"></el-option>
<el-option label="周日" :value="0"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="start_time" label="开始时间" align="center" header-align="center">
<template slot-scope="{row}">
<el-time-select
style="width: 100%"
placeholder="开始时间"
v-model="row.start_time"
:picker-options="{ start: '00:00',step: '00:30',end: '24:00'}">
</el-time-select>
</template>
</el-table-column>
<el-table-column prop="end_time" label="结束时间" align="center" header-align="center">
<template slot-scope="{row}">
<el-time-select
style="width: 100%"
placeholder="结束时间"
v-model="row.end_time"
:picker-options="{start: '00:00',step: '00:30',end: '24:00',minTime: row.start_time }">
</el-time-select>
</template>
</el-table-column>
<el-table-column prop="timeUnit" label="预约时间单位(小时)" align="center" header-align="center">
<template slot-scope="{row}">
<el-input-number style="width: 100%" v-model="row.timeUnit" placeholder="请输入预约时间单位" :step="0.5"></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作" align="center" header-align="center" width="100px">
<template slot-scope="scope">
<el-button type="danger" icon="el-icon-delete" circle
:disabled="formData.open_hours.length==0"
@click="formData.open_hours.splice(scope.$index, 1)"></el-button>
</template>
</el-table-column>
</el-table>
<div style="float: right;margin: 20px 0">
<el-button type="primary" @click="operation">确 定</el-button>
</div>
</template>
<template #view>
</template>
</guava>
<el-dialog :close-on-click-modal="false" :visible.sync="setUpTimeDialog" title="设置时间" top="50px">
<vi-title title="选择日期"></vi-title>
<el-date-picker
@change="setUpDateChange"
placeholder="请选择一个或多个日期"
style="width: 100%"
type="dates"
v-model="formData.setUpDate"
value-format="yyyy-MM-dd">
</el-date-picker>
<vi-title title="设置禁用时间" class="mt20"></vi-title>
<el-row>
<el-time-select
:picker-options="{
start: '08:30',
step: '00:05',
end: '23:30'
}"
placeholder="开始时间"
v-model="timeOneKeySet.startTime">
</el-time-select>
<el-time-select
:picker-options="{
start: '08:30',
step: '00:05',
end: '23:30'
}"
placeholder="结束时间"
v-model="timeOneKeySet.endTime">
</el-time-select>
<el-button @click="oneKeySetStartEndTime" type="primary">一键设置开始/结束时间</el-button>
</el-row>
<el-table :data="formData.notApplyTimeList" class="mt10" max-height="520px" size="mini" @selection-change="handleSelectionChange">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column label="日期" width="200">
<template v-slot="{row}">
<i class="el-icon-time"></i>
{{moment(row.date).format('YYYY-MM-DD')}}
</template>
</el-table-column>
<el-table-column label="开始时间">
<template v-slot="{row}">
<el-time-select
size="mini"
:picker-options="pickerOptions"
placeholder="开始时间"
v-model="row.startTime">
</el-time-select>
</template>
</el-table-column>
<el-table-column label="结束时间">
<template v-slot="{row}">
<el-time-select
size="mini"
:picker-options="pickerOptions"
placeholder="结束时间"
v-model="row.endTime">
</el-time-select>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template v-slot="{row, $index}">
<el-button
size="mini"
@click="formData.notApplyTimeList.splice($index,0,{date:row.date,startTime:'',endTime:''})"
type="primary">
新增同天时段
</el-button>
<el-button size="mini" @click="removeSetUpTableRow(row,$index)" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="mt20" justify="end" type="flex">
<el-button @click="setUpTimeDialog = false">取消</el-button>
<el-button @click="doConfirmSetUpCourse" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
<!--# include("/platform/activity/includeJs/activityUtil.js"){} #-->
const activityUtil = new typeUtil()
const vue = new Vue({
el: '#app',
data() {
return {
pickerOptions: {
start: "08:30",
step: "00:05",
end: "23:30"
},
timeOneKeySet: {
startTime: "",
endTime: ""
},
activityTypeList: [],
tabKey: '',
tableLoading: false,
subDis: false,
tableData: [],
formData: {
open_hours: [{}],
sexLimit: 0,
notApplyTimeList: [],
reserveTarget: 2,
filterHolidays: false,
},
pageForm: {
searchName: "name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
year: ""
},
formRules: {
name: [{required: true, message: '请输入场地名称', trigger: ['blur', 'change']}],
address: [{required: true, message: '请输入场地地址', trigger: ['blur', 'change']}],
contact_person: [{required: true, message: '请输入联系人', trigger: ['blur', 'change']}],
contact_phone: [{required: true, message: '请输入联系方式', trigger: ['blur', 'change']}],
state: [{required: true, message: '请选择开启状态', trigger: ['blur', 'change']}],
typeId: [{required: true, message: '请选择场地类型', trigger: ['blur', 'change']}],
openWeekTime: [{required: true, message: '请选择预约时间', trigger: ['blur', 'change']}],
reserveTarget: [{required: true, message: '请选择面向对象', trigger: ['blur', 'change']}],
maxNum: [{required: true, message: '请输入容纳人数', trigger: ['blur', 'change']}],
},
setUpTimeDialog: false,
multipleSelection: [],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
methods: {
handleSelectionChange(val) {
this.multipleSelection = val
},
doConfirmSetUpCourse() {
const courseTableData = this.formData.notApplyTimeList
/*if (courseTableData.length === 0) {
this.$message.warning("请选择禁用时间")
return
}*/
if (courseTableData && courseTableData.length > 0) {
const valid = courseTableData.every(v => v.startTime && v.endTime && (v.startTime < v.endTime))
if (!valid) {
this.$message.warning("时间不完整或者有误")
return
}
this.setUpTimeDialog = false
}
},
removeSetUpTableRow(row, index) {
this.formData.notApplyTimeList.splice(index, 1)
const courseDateArray = this.formData.notApplyTimeList.map(v => moment(v.date).format("YYYY-MM-DD"))
const scdList = this.formData.setUpDate
this.formData.setUpDate = scdList.filter(v => {
return courseDateArray.includes(moment(v).format("YYYY-MM-DD"))
})
},
oneKeySetStartEndTime() {
if(this.multipleSelection.length === 0) {
this.$message.warning('请选择需要一键设置的时间')
return
}
const { startTime, endTime } = this.timeOneKeySet
this.formData.notApplyTimeList.forEach(v => {
const o = this.multipleSelection.find(o => o.date === v.date && o.startTime === v.startTime && o.endTime === v.endTime)
if(o) {
this.$set(v, "startTime", startTime)
this.$set(v, "endTime", endTime)
}
})
this.$forceUpdate()
},
setUpDateChange(val) {
if (!val) {
this.formData.notApplyTimeList = []
return
}
if (this.formData.notApplyTimeList === undefined) {
this.$set(this.formData, "notApplyTimeList", [])
}
const ctList = new Set(this.formData.notApplyTimeList.map(v => moment(v.date).format("YYYY-MM-DD")))
val.forEach(v => {
if (!ctList.has(v)) {
this.formData.notApplyTimeList.push({
date: v, time: null
})
}
})
this.formData.notApplyTimeList = this.formData.notApplyTimeList.filter(v => {
return val.includes(moment(v.date).format("YYYY-MM-DD"))
})
this.formData.notApplyTimeList.sort((a, b) => {
return Date.parse(a["date"]) - Date.parse(b["date"])
})
},
openSetUpTime() {
if(this.formData.notApplyTimeList) {
this.$set(this.formData, 'setUpDate', this.formData.notApplyTimeList.map(o => o.date))
}
this.setUpTimeDialog = true
},
doDelete(row) {
this.$confirm('此操作将删除【' + row.name + '】场地的所有信息!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" === a) {
$.post(location.href + "/doDelete", {id: row.id}, (data) => {
if (data.code === 0) {
this.$message.success(data.msg)
this.pageData();
} else {
this.$message.error(data.msg)
}
}, "json");
}
}
});
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
this.subDis = true
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const {code, data, msg} = await $.post(location.href + method, {data: JSON.stringify(this.formData)})
if (code === 0) {
this.pageData()
this.$message.success(msg);
this.$refs.guava.index()
} else {
this.$message.error(msg);
}
loading.close()
this.subDis = false
}
});
},
async findOneSite(id) {
const {data} = await $.get("/platform/activity/site/mange/findOneSite", {id: id})
return data
},
openView(row) {
this.$refs.guava.view()
},
async openEdit(id) {
this.formData = await this.findOneSite(id)
if(!this.formData.notApplyTimeList) {
this.$set(this.formData, 'notApplyTimeList', [])
}
this.$refs.guava.edit()
},
openAdd() {
this.formData = {
state: true,
open_hours: [{}],
create_username: '${@shiro.getPrincipalProperty("username")}',
create_time: moment().format('YYYY-MM-DD'),
sexLimit: '0',
notApplyTimeList: [],
reserveTarget: 2,
filterHolidays: false,
}
this.$refs.guava.edit()
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post(location.href + "/pageData", this.pageForm, (res) => {
const {code, data, msg} = res
sublime.closeLoadingbar();
this.tableLoading = false
if (code === 0) {
for (let i = 0; i < data.list.length; i++) {
data.list[i].open_hours = site.reverseRankingDate(data.list[i].open_hours)
}
this.tableData = data.list;
this.pageForm.totalCount = data.totalCount;
} else {
this.$message.error(msg);
}
}, "json");
}
},
async created() {
this.pageData();
this.activityTypeList = await activityUtil.getAllType()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,198 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-date-picker
v-model="pageForm.month" clearable value-format="yyyy-MM"
type="month"
placeholder="选择月">
</el-date-picker>
</div>
<div class="btn-group tool-button">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 110px;">
<el-option label="场地名称" value="asi.name"></el-option>
<el-option label="预约人" value="asr.reserve_person"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-select v-model="pageForm.siteType" placeholder="场地类型" clearable
style="width: 200px;">
<el-option v-for="item in activityTypeList" :label="item.text" :value="item.value"></el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="tableData" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading">
<el-table-column align="center" header-align="center" 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" sortable show-overflow-tooltip header-align="center" label="场地名称"
prop="site_name"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="预约人"
prop="reserve_person"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center" label="预约单位"
prop="reserve_person_unit"></el-table-column>
<el-table-column align="center" header-align="center" label="联系方式"
prop="reserve_person_phone"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="预约日期"
prop="concat_day"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="开始时间"
prop="start_time">
<template slot-scope="{row}">
<span>{{row.start_time}}</span>
</template>
</el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="结束时间"
prop="end_time">
<template slot-scope="{row}">
<span>{{row.end_time}}</span>
</template>
</el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="反馈意见"
prop="back_option">
<template slot-scope="{row}">
<span v-if="row.reserve_person_id === userid || role == true">{{row.back_option}}</span>
</template>
</el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="预约事由"
prop="reserve_cause"></el-table-column>
<el-table-column align="center" show-overflow-tooltip="true" header-align="center" sortable
label="预约状态" prop="state_name">
<template slot-scope="{row}">
<!--<span :style="'color:'+row.state_color">{{row.state_name}}</span>-->
<span v-if="[0].includes(row.stateaudittype)"
style="color: #e6a23c">{{row.state_name}}</span>
<span v-if="row.stateaudittype==3" style="color: #67c23a">{{row.state_name}}</span>
<span v-if="row.stateaudittype==1" style="color: #f56c6c">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="250px">
<template slot-scope="{row}">
<el-button type="primary" @click="openView(row.id)" size="mini">查看</el-button>
<el-button type="danger" @click="doDelete(row.id)"
size="mini">删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</template>
<template #view>
<reserve-info ref="reserve"></reserve-info>
</template>
</guava>
</div>
<script>
<!--# include("/platform/activity/includeJs/activityUtil.js"){} #-->
const activityUtil = new typeUtil()
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
userid: "${@shiro.getPrincipalProperty('id')}",
role: "${@shiro.hasRole('sysadmin')||@shiro.hasRole('xghng')||@shiro.hasRole('A06')}",
activityTypeList: [],
reserveViewData: {},
tableLoading: false,
tableData: [],
pageForm: {
searchName: "asi.name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
isAudit: false,
},
}
},
components: {
'reserve-info': httpVueLoader('/components/activity/site/ReserveInfo.vue?v=' + new Date().getTime()),
},
methods: {
openView(id) {
this.$refs.guava.view()
this.$refs.reserve.openView(id)
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
let form = clone(this.pageForm)
if (form.isAudit === null) {
delete form.isAudit
}
$.post(location.href + "/pageData", form, (res) => {
const {code, data, msg} = res
sublime.closeLoadingbar();
this.tableLoading = false
if (code == 0) {
this.tableData = data.list;
this.pageForm.totalCount = data.totalCount;
} else {
this.$message.error(msg);
}
}, "json");
},
async doDelete(id) {
const confirm = await this.$confirm("您确定要删除此预约吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const resp = await $.post('/platform/activity/site/reserve/doDelete', {id, op: 1})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.activityTypeList = await activityUtil.getAllType()
this.pageData();
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,782 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style xmlns="">
.text {
font-size: 14px;
}
.e-item {
margin-bottom: 10px;
}
.el-divider--horizontal {
margin: 5px 0;
}
.v-tab .el-card__header {
padding: 10px 15px;
font-weight: bold;
}
.reserve_btn {
font-size: 16px;
float: right;
padding: 3px 0
}
.is-selected {
color: #1989FA;
}
.div-Calendar {
box-sizing: border-box;
height: 100%;
}
.el-carousel__button {
background-color: #c0c4cc;
}
.el-carousel__container {
height: 240px;
}
.el-button--mini.is-circle {
padding: 5px;
font-size: 1px;
}
.slider {
position: relative;
}
.cover {
position: absolute;
height: 6px;
background-color: #409EFF;
margin: 16px 0;
z-index: 999;
}
.cover2 {
position: absolute;
height: 6px;
background-color: #E4E7ED;
margin: 16px 0;
z-index: 1000;
}
.el-slider__marks-text {
margin-top: 10px !important;
}
.el-slider__stop {
z-index: 1001;
}
.el-slider__bar {
z-index: 1000;
}
.el-slider__marks-text {
min-width: 40px !important;
}
.el-slider__button-wrapper {
display: none !important;
}
.el-calendar-day:has(.not-allow-day) {
background-color: #F5F5F5;
}
.div-Calendar p {
margin: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-select v-model="pageForm.siteType" placeholder="场地类型" clearable
style="width: 200px;">
<el-option v-for="item in activityTypeList" :label="item.text" :value="item.value"></el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-date-picker
v-model="pageForm.time" placeholder="选择月"
type="month" value-format="yyyy-MM">
</el-date-picker>
</div>
<div class="btn-group tool-button">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 105px;">
<el-option label="场地名称" value="asi.name"></el-option>
<el-option label="预约人" value="asr.reserve_person"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
</el-card>
<el-row>
<el-carousel :interval="5000" arrow="always" style="margin: 10px auto;">
<el-carousel-item v-for="index in Math.ceil(siteList.length/4)" :key="index">
<el-row :gutter="20">
<el-col v-for="item in siteList.slice((index-1)*4,index*4)" :span="6">
<el-card class="box-card" style="border-radius: 10px">
<div slot="header" class="clearfix" style="font-size: 16px;padding: 5px 0">
<span>{{item.name}}</span>
<el-button @click.stop="onReserve(item)" class="reserve_btn" type="text">预约</el-button>
</div>
<div @click="siteChange(item.id)">
<div class="text e-item">
<span style="color: gray">场地地址:</span>
{{item.address}}
</div>
<div class="text e-item">
<span style="color: gray">联&ensp;系&ensp;人:</span>
{{(item.unitname ? item.unitname : '') + ' ' + item.contact_person}}
</div>
<div class="text e-item">
<span style="color: gray">联系方式:</span>
{{item.contact_phone}}
</div>
<!--<div class="text e-item">
<span style="color: gray">面向对象:</span>
<span v-if="item.reservetarget == 1">分工会</span>
<span v-if="item.reservetarget == 2">个人</span>
<span v-if="item.reservetarget == 3">集体</span>
</div>-->
<div class="text e-item">
<span style="color: gray">场地介绍:</span>
<el-link @click="viewIntroduce(item)" type="primary" style="position: relative; top: -2px">点击查看</el-link>
</div>
</div>
</el-card>
</el-col>
</el-row>
</el-carousel-item>
</el-carousel>
<el-row class="v-tab">
<el-card class="box-card" shadow="never">
<vi-title2 title="预约列表">
<template #func>
<el-button style="float: right" type="primary" @click="siteChange()" size="mini">全部</el-button>
</template>
</vi-title2>
<el-table :data="tableData" row-key="id"
v-loading="tableLoading">
<el-table-column align="center" header-align="center" 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" sortable show-overflow-tooltip header-align="center"
label="场地名称"
prop="site_name"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="预约人"
prop="reserve_person"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="所属单位"
prop="reserve_person_unit"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="预约日期"
prop="concat_day"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="开始时间"
prop="start_time">
<template slot-scope="{row}">
<span>{{row.start_time}}</span>
</template>
</el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="结束时间"
prop="end_time">
<template slot-scope="{row}">
<span>{{row.end_time}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="联系方式"
prop="reserve_person_phone"></el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="预约事由"
prop="reserve_cause"></el-table-column>
<el-table-column align="center" show-overflow-tooltip="true" header-align="center" sortable
label="预约状态" prop="state_name">
<template slot-scope="{row}">
<!--<span :style="'color:'+row.state_color">{{row.state_name}}</span>-->
<span v-if="[0].includes(row.stateaudittype)" style="color: #e6a23c">{{row.state_name}}</span>
<span v-if="row.stateaudittype==3" style="color: #67c23a">{{row.state_name}}</span>
<span v-if="row.stateaudittype==1" style="color: #f56c6c">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right"
width="200px">
<template 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:'view',data:scope.row}">
查看
</el-dropdown-item>
<el-dropdown-item
v-if="scope.row.reserve_person_id === '${@shiro.getPrincipalProperty('id')}'"
:command="{type:'backOption',data:scope.row}">
反馈意见
</el-dropdown-item>
<!--# if(@shiro.hasRole('sysadmin')){ #-->
<el-dropdown-item
:command="{type:'delete',data:scope.row}">
删除
</el-dropdown-item>
<!--# } #-->
<el-dropdown-item
v-if="scope.row.reserve_person_id === '${@shiro.getPrincipalProperty('id')}'"
:command="{type:'cancel',data:scope.row}">
撤销预约
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</el-row>
</el-row>
</template>
<template #edit>
<el-row :gutter="20">
<el-col :span="12" :offset="6" style="text-align: center">
<div style="font-size: large;color: #303133">
您正在预约【<span style="color: #409EFF">{{infoViewData.name}}</span>】活动场地
</div>
</el-col>
</el-row>
<el-calendar v-model="reserve_time">
<template slot="dateCell" slot-scope="{date, data}">
<div :class="getDayClass(data)" @click="pushDay(data)">
<p :style="dayArray.includes(data.day) ? 'color: #246fb4' : ''">
{{ data.day.split('-').slice(1).join('-') }} {{ dayArray.includes(data.day) ? '✔️' : ''}}
</p>
<div v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('xghng')||@shiro.hasRole('A06')}"
v-for="item in reserveViewData">
<div v-if="data.day.toString() == item.reserve_day"
:style="{backgroundColor:([0].includes(item.stateaudittype)?'#FAECD9':item.reserve_state==30?'#E0F4D9':'#FEE2E2')}">
<el-row style="line-height: 20px">
<el-col :span="4" style="font-size: 10px">
<span v-if="[0].includes(item.stateaudittype)">待审</span>
<span v-if="item.stateaudittype==3">通过</span>
<span v-if="item.stateaudittype==1">拒绝</span>
</el-col>
<el-col :span="20" style="font-size: 10px">
<span>
<b>{{item.reserve_person}}</b>:{{item.start_time}}-{{item.end_time}}
</span>
</el-col>
</el-row>
</div>
</div>
</div>
</template>
</el-calendar>
<div style="text-align: right">
<el-button @click="openAdd" type="primary">下一步</el-button>
</div>
</template>
<template #view>
<reserve-info ref="reserve"></reserve-info>
</template>
</guava>
<el-dialog title="新增场地预约" class="dia" :close-on-click-modal="false" @close="diaClose" top="2%"
:visible.sync="addDialogVisible" custom-class="ViewDialogClass" width="50%">
<vi-title :title="'您已选择的预约日期为:'+ dayArray.toString()" style="margin-left: 48px"></vi-title>
<el-form :model="formData" ref="addForm" :rules="formRules" label-position="right"
label-width="100px">
<el-form-item label="预约人" prop="reserve_person">
<el-select disabled allow-create style="width: 100%" v-model="formData.reserve_person" filterable remote
value-key="id" reserve-keyword placeholder="请输入关键词" @change="userChange"
:remote-method="remoteMethod" :loading="loading">
<el-option v-for="item in restaurants" :key="item.id" :label="item.username"
:value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item label="性别" prop="sex">
<el-input readonly v-model="formData.sex" maxlength="100"
placeholder="请输入性别"></el-input>
</el-form-item>
<el-form-item label="工号" prop="loginname">
<el-input readonly v-model="formData.loginname" maxlength="100"
placeholder="请输入工号"></el-input>
</el-form-item>
<el-form-item label="所属单位" prop="reserve_person_unit">
<el-input readonly v-model="formData.reserve_person_unit" maxlength="100"
placeholder="请输入所属单位"></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="reserve_person_phone">
<el-input maxlength="11" placeholder="请输入联系电话"
v-model="formData.reserve_person_phone"></el-input>
</el-form-item>
<el-form-item label="预约时间" prop="time">
<el-select v-model="formData.time" style="width: 100%" filterable @change="timeChange"
placeholder="请选择预约时间">
<el-option v-for="item in allowTimeList"
:disabled="item.disabled === true"
:value="item.start_time + '-' + item.end_time">
<template #default>
<span v-if="item.disabled === true">
{{ item.start_time + ' - ' + item.end_time + '(' + item.tooltip + ')' }}
</span>
<span v-else>{{ item.start_time + ' - ' + item.end_time }}</span>
</template>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="预约人数" prop="joinCount">
<el-input-number
:disabled="infoViewData.reservetarget === 1 || infoViewData.reservetarget === 3"
v-model="formData.joinCount"
:min="1" :max="9999"
label="请输入预约人数"
style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item label="预约事由" prop="reserve_cause">
<el-input maxlength="1000" placeholder="请输入预约事由" autosize v-model="formData.reserve_cause"
type="textarea" :autosize="{ minRows: 4, maxRows: 6}"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeAdd">取 消</el-button>
<el-button type="primary" :disabled="subDis" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog :visible.sync="drawer" title="场地介绍" width="40%" top="3%">
<div v-html="viewData.introduce"></div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="drawer = false">确定</el-button>
</span>
</el-dialog>
</div>
<script>
<!--# include("/platform/activity/includeJs/activityUtil.js"){} #-->
const activityUtil = new typeUtil()
const vue = new Vue({
el: '#app',
data() {
return {
activityTypeList: [],
drawer: false,
siteList: [],
restaurants: [],
reserve_time: '',
infoViewData: {},
reserveViewData: {},
tableLoading: false,
addDialogVisible: false,
subDis: false,
loading: false,
tableData: [],
formData: {
start_time: '',
end_time: '',
reserve_person_phone: '',
reserve_cause: '',
time: '',
sex: "${@shiro.getPrincipalProperty('sex')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}"
},
pageForm: {
searchName: "asr.reserve_person",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
time: ''
},
userid: '',
formRules: {
reserve_person: [{required: true, message: '请填写预约人', trigger: ['blur', 'change']}],
reserve_person_unit: [{required: true, message: '请填写单位', trigger: ['blur', 'change']}],
reserve_person_phone: [{required: true, message: '请填写联系电话', trigger: ['blur', 'change']}],
start_time: [{required: true, message: '请选择预约时间', trigger: ['blur', 'change']}],
time: [{required: true, message: '请选择预约时间', trigger: ['blur', 'change']}],
joinCount: [{required: true, message: '请输入预约人数', trigger: ['blur', 'change']}],
/*reserve_cause: [{required: true, message: '请选择预约事由', trigger: ['blur', 'change']}],*/
},
dayArray: [],
allowDayList: [],
allowTimeList: [],
viewData: {},
reverseData: {},
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'reserve-info': httpVueLoader('/components/activity/site/ReserveInfo.vue?v=' + new Date().getTime()),
},
methods: {
viewIntroduce(item) {
this.viewData = item
this.drawer = true
},
diaClose() {
this.formData.time = ''
this.formData.start_time = ''
this.formData.end_time = ''
},
timeChange(o) {
this.formData.start_time = o.split('-')[0]
this.formData.end_time = o.split('-')[1]
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.userid = data.reserve_person_id;
this.openView(data)
} else if (type === 'delete') {
this.doDelete(data.id, 1)
} else if (type === 'cancel') {
this.doDelete(data.id, 2)
} else if (type === 'backOption') {
this.backOption(data)
}
},
backOption(row) {
this.$prompt('请填写反馈意见', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputValidator: (value) => {
if (value === null) {
return '反馈意见不能为空'
}
}
}).then(async ({value}) => {
const res = await $.post('/mobile/activity/site/info/backOption', {
id: row.id,
option: value
})
if (res.code === 0) {
await this.doSearch()
this.$message.success(res.msg)
} else {
this.$message.warning(res.msg)
}
}).catch(() => {
});
},
async siteChange(id) {
this.pageForm.siteId = id
this.pageData()
},
userChange(data) {
this.$set(this.formData, "reserve_person", data.username ? data.username : data)
this.$set(this.formData, "reserve_person_unit", data.unit_name)
this.$set(this.formData, "reserve_person_phone", data.mobile ? data.mobile : '')
},
remoteMethod(keywords) {
$.post(location.href + "/findUser", {keywords: keywords}, (res) => {
const {code, data, msg} = res
if (code === 0) {
this.restaurants = data;
} else {
this.restaurants = [];
this.$message.error(msg);
}
this.loading = false;
})
},
closeAdd() {
this.addDialogVisible = false
this.formData.end_time = ''
},
onReserve(data) {
if(data.reservetarget === 1 && "${@shiro.hasAnyRoles('gh01', 'H04')}" === 'false' && "${@shiro.hasRole('sysadmin')}" === 'false') {
this.$message.warning('该场地只能分工会预约')
return
}
this.reverseData = data
this.dayArray = []
this.getAllowTime()
if (data.sexlimit === 1 || data.sexlimit === 2) {
const sex = data.sexlimit === 1 ? '男' : '女'
if ("${@shiro.getPrincipalProperty('sex')}" === sex) {
this.openReserve(data)
} else {
this.$message.warning('抱歉,该场地仅限' + sex + '性会员预约')
}
} else {
this.openReserve(data)
}
},
getDayClass(data) {
const d = new Date(data.day).getDay()
let classStr = 'div-Calendar'
if(this.allowDayList.length > 0 && !this.allowDayList.includes(data.day)) {
classStr += ' not-allow-day';
}
if(this.infoViewData.openweektime) {
const openWeedTime = JSON.parse(this.infoViewData.openweektime)
if(!openWeedTime.includes(d)) {
classStr += ' not-allow-day';
}
}
if(this.infoViewData.notapplytimelist) {
const notApplyTimeList = JSON.parse(this.infoViewData.notapplytimelist)
if(notApplyTimeList.includes(data.day)) {
classStr += ' not-allow-day';
}
}
if(moment(data.day).isBefore(moment().startOf('day'))) {
classStr += ' not-allow-day';
}
return classStr
},
async pushDay(data) {
this.$nextTick(async () => {
await this.getAllowTime(moment(data.day).year(), moment(data.day).month() + 1)
})
if (this.allowDayList.length > 0 && !this.allowDayList.includes(data.day)) {
this.$message.warning(data.day + "不能预约")
return
}
if (this.infoViewData.notapplytimelist) {
const notApplyTimeList = JSON.parse(this.infoViewData.notapplytimelist)
if (notApplyTimeList.includes(data.day)) {
this.$message.warning(data.day + "不能预约")
return
}
}
if (data.day < moment(new Date()).format('YYYY-MM-DD')) {
this.$message.warning('你选择的日期已过')
return
}
if (this.dayArray.includes(data.day)) {
this.dayArray.splice(this.dayArray.indexOf(data.day), 1)
} else {
this.dayArray = []
this.dayArray.push(data.day)
this.dayArray.sort()
}
},
async openAdd() {
//查询用户点击的这一天已经被预约的时间段
if (this.dayArray && this.dayArray.length === 0) {
this.$message.warning('请选择预约日期')
return
}
this.$set(this.formData, "reserve_person", '${@shiro.getPrincipalProperty("username")}')
this.$set(this.formData, "reserve_person_unit", '${@shiro.getPrincipalProperty("unit").getName()}')
this.$set(this.formData, "reserve_person_phone", '${@shiro.getPrincipalProperty("mobile")}')
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
if(this.infoViewData.reservetarget === 1 || this.infoViewData.reservetarget === 3) {
this.$set(this.formData, "joinCount", this.infoViewData.maxnum)
} else {
this.$set(this.formData, "joinCount", 1)
}
this.allowTimeList = await this.getTimesByDay()
this.addDialogVisible = true
},
async doDelete(id, op) {
if (op === 2) {
const res = await $.post(location.href + "/isCanRollBack", {id: id});
if (res === true) {
this.$message.warning('此预约状态下不能进行撤回操作')
return
}
}
let text = op === 1 ? '删除' : '撤销'
this.$confirm("您确定要" + text + "此预约吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" === a) {
$.post(location.href + "/doDelete", {id, op}, (data) => {
if (data.code === 0) {
this.$message.success(data.msg)
this.pageData();
} else {
this.$message.warning(data.msg)
}
}, "json");
}
}
});
},
async doAdd() {
if (!this.formData.time) {
this.$message.warning('未选择预约时间')
return
}
const s = this.formData.time.split('-')[0]
const e = this.formData.time.split('-')[1]
if (moment().unix() >= moment(this.dayArray[0] + ' ' + e + ':00').unix()) {
this.$message.warning('您预约的时间段已过')
return
}
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
this.subDis = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const {code, msg} = await $.post(location.href + "/doAdd", {
data: JSON.stringify(this.formData),
days: JSON.stringify(this.dayArray)
})
if (code === 0) {
this.addDialogVisible = false
this.$message.success(msg);
this.pageData()
this.$refs.guava.index()
} else {
this.$message.warning(msg)
}
loading.close()
this.subDis = false
}
});
},
openView(row) {
this.$refs.guava.view()
const role = "${@shiro.hasRole('sysadmin')||@shiro.hasRole('xghng')||@shiro.hasRole('A06')}"
this.$refs.reserve.role = role
const backOptionShow = "${@shiro.getPrincipalProperty('id')}" === this.userid
this.$refs.reserve.backOptionShow = (role || backOptionShow)
this.$refs.reserve.openView(row.id)
},
async openReserve(data) {
this.reserveViewData = await this.findReserveInfo(data.id)
/*this.reserveViewData.forEach(item => {
item.index = 0
})*/
this.formData.site_id = data.id
this.infoViewData = data
this.$refs.guava.edit()
},
async doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
this.siteList = await this.findAllOpenSite()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post(location.href + "/pageData", this.pageForm, (res) => {
const {code, data, msg} = res
sublime.closeLoadingbar();
this.tableLoading = false
if (code === 0) {
this.tableData = data.list;
this.pageForm.totalCount = data.totalCount;
} else {
this.$message.error(msg);
}
}, "json");
},
async findReserveInfo(siteId) {
const {data} = await $.get("/platform/activity/site/reserve/findReserveInfo", {siteId})
return data;
},
async findAllOpenSite(siteId) {
const {data} = await $.get("/platform/activity/site/reserve/findAllOpenSite", {
time: this.pageForm.time,
siteId: siteId,
siteType: this.pageForm.siteType,
})
return data
},
async getAllowTime(year = null, month = null) {
const titleText = $('.el-calendar__title').text().trim().replaceAll(' ', '')
const m = moment(titleText, "YYYY年M月")
const { data } = await $.get("/platform/activity/site/reserve/getAllowTime", {
siteId: this.reverseData.id,
year: year != null ? year : m.year(),
month: month != null ? month : m.month() + 1,
})
this.allowDayList = data
},
async getTimesByDay() {
const { data } = await $.get("/platform/activity/site/reserve/getTimesByDay", {
siteId: this.reverseData.id,
day: moment(this.reserve_time).format('YYYY-MM-DD'),
})
return data
}
},
async created() {
this.activityTypeList = await activityUtil.getAllType()
this.siteList = await this.findAllOpenSite()
await this.getAllowTime()
this.pageData()
this.$nextTick(() => {
// 点击前一个月
let prevBtn = document.querySelector(
".el-calendar__button-group .el-button-group>button:nth-child(1)"
);
prevBtn.addEventListener("click", e => {
this.getAllowTime()
})
//点击下一个月
let nextBtn = document.querySelector(
".el-calendar__button-group .el-button-group>button:nth-child(3)"
);
nextBtn.addEventListener("click", () => {
this.getAllowTime()
});
//点击今天
let todayBtn = document.querySelector(
".el-calendar__button-group .el-button-group>button:nth-child(2)"
);
todayBtn.addEventListener("click", () => {
this.getAllowTime()
});
})
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,357 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-date-picker
v-model="pageForm.month" clearable value-format="yyyy-MM"
type="month"
placeholder="选择月">
</el-date-picker>
</div>
<div class="btn-group tool-button">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 110px;">
<el-option label="场地名称" value="asi.name"></el-option>
<el-option label="预约人" value="asr.reserve_person"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-select v-model="pageForm.siteType" placeholder="场地类型" clearable
style="width: 200px;">
<el-option v-for="item in activityTypeList" :label="item.text" :value="item.value"></el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-radio-group v-model="pageForm.isAudit" @change="doSearch">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<div style="text-align: right" v-if="pageForm.isAudit === false">
<el-button @click="doReview('many', false)" type="danger" size="mini">一键驳回</el-button>
<el-button @click="doReview('many', true)" type="primary" size="mini">一键通过</el-button>
</div>
<el-table :data="tableData" row-key="id" @sort-change="pageOrder"
@selection-change="handleSelectionChange"
v-loading="tableLoading">
<el-table-column v-if="pageForm.isAudit === false" type="selection" width="55"
:reserve-selection="true"></el-table-column>
<el-table-column align="center" header-align="center" 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" sortable show-overflow-tooltip header-align="center" label="场地名称"
prop="site_name"></el-table-column>
<el-table-column align="center" sortable header-align="center" label="预约人"
prop="reserve_person"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center" label="所属单位"
prop="reserve_person_unit"></el-table-column>
<el-table-column align="center" header-align="center" label="联系方式"
prop="reserve_person_phone"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="预约天数"
prop="days"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="预约日期"
prop="concat_day"></el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="开始时间"
prop="start_time">
<template slot-scope="{row}">
<span>{{row.start_time}}</span>
</template>
</el-table-column>
<el-table-column align="center" sortable show-overflow-tooltip header-align="center"
label="结束时间"
prop="end_time">
<template slot-scope="{row}">
<span>{{row.end_time}}</span>
</template>
</el-table-column>
<el-table-column align="center" show-overflow-tooltip header-align="center" label="预约事由"
prop="reserve_cause"></el-table-column>
<el-table-column align="center" show-overflow-tooltip="true" header-align="center"
label="预约状态" prop="state_name">
<template slot-scope="{row}">
<!--<span :style="'color:'+row.state_color">{{row.state_name}}</span>-->
<span v-if="[0].includes(row.stateaudittype)"
style="color: #e6a23c">{{row.state_name}}</span>
<span v-if="row.stateaudittype==3" style="color: #67c23a">{{row.state_name}}</span>
<span v-if="row.stateaudittype==1" style="color: #f56c6c">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="250px">
<template slot-scope="{row}">
<el-button type="primary" @click="userid = row.reserve_person_id; openView(row.id)" size="mini">查看
</el-button>
<el-button v-if="pageForm.isAudit === false" type="primary" @click="openReview2(row)"
size="mini">审核
</el-button>
<!--# if(@shiro.hasRole('sysadmin')||@shiro.hasRole('xgh02')){ #-->
<!--<el-button v-if="pageForm.isAudit === false" type="primary" @click="openReview(row)"
size="mini">
批示
</el-button>-->
<!--# } #-->
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</template>
<template #edit style="padding: 0 10%">
<reserve-info v-if="pageForm.isAudit === false" ref="reserve3" btn>
<template #btn>
<el-row style="margin: 40px 0;text-align: right">
<el-button type="danger" @click="doReview('one', false)">驳回</el-button>
<el-button type="primary" @click="doReview('one', true)">通过</el-button>
</el-row>
</template>
</reserve-info>
<!--<reserve-info v-if="pageForm.isAudit === false" ref="reserve2" label="主席批示" handle>
<template #handle>
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="100px">
<el-form-item label="批示信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item prop="xld_id" label="批示人">
<el-input value="${@shiro.getPrincipalProperty('username')}"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="批示时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="批示意见">
<el-input type="textarea" v-model="formData.opinion" rows="6" maxlength="500"
placeholder="请填写您的批示意见"></el-input>
</el-form-item>
</el-form>
<el-row style="margin: 40px 0;text-align: right">
<el-button type="primary" @click="doInstructions">确 定</el-button>
</el-row>
</template>
</reserve-info>-->
</template>
<template #view>
<reserve-info ref="reserve"></reserve-info>
</template>
</guava>
</div>
<script>
<!--# include("/platform/activity/includeJs/activityUtil.js"){} #-->
const activityUtil = new typeUtil()
const vue = new Vue({
el: '#app',
data() {
return {
selectTable: [],
activityTypeList: [],
reserveViewData: {},
tableLoading: false,
tableData: [],
formData: {},
pageForm: {
searchName: "asi.name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
isAudit: false,
},
formRules: {
opinion: [{required: true, message: '请填写批示意见', trigger: ['blur', 'change']}],
},
userid: '',
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'reserve-info': httpVueLoader('/components/activity/site/ReserveInfo.vue?v=' + new Date().getTime()),
},
methods: {
openView(id) {
this.$refs.guava.view()
const role = "${@shiro.hasRole('sysadmin')||@shiro.hasRole('xghng')||@shiro.hasRole('A06')}"
this.$refs.reserve.role = role
const backOptionShow = "${@shiro.getPrincipalProperty('id')}" === this.userid
this.$refs.reserve.backOptionShow = (role || backOptionShow)
this.$refs.reserve.openView(id)
},
handleSelectionChange(val) {
this.selectTable = val;
},
openReview(row) {
this.reserveViewData = row
this.formData = {
id: row.id,
state: 30,
time: moment().format('YYYY-MM-DD')
}
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
this.$nextTick(() => {
this.$refs.guava.edit()
this.$refs.reserve2.openView(row.id)
})
},
openReview2(row) {
this.reserveViewData = row
this.formData = {
id: row.id,
}
this.$nextTick(() => {
this.$refs.guava.edit()
const role = "${@shiro.hasRole('sysadmin')||@shiro.hasRole('xghng')||@shiro.hasRole('A06')}"
this.$refs.reserve3.role = role
const backOptionShow = "${@shiro.getPrincipalProperty('id')}" === row.reserve_person_id
this.$refs.reserve3.backOptionShow = (role || backOptionShow)
this.$refs.reserve3.openView(row.id)
})
},
doReview(type, state) {
let that = this
if (type === 'many' && this.selectTable.length === 0) {
this.$notify.warning({title: '警告', message: '一键审核请先在多选框中进行选择!'});
return
}
let typeText = type === 'many' ? '一键' : ''
let typeT = type === 'many' ? '这些' : '此'
let text = state ? '通过' : '驳回'
this.$prompt('您确定要' + typeText + text + typeT + '预约吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPlaceholder: '请在此填写审核意见',
inputType: 'textarea',
inputValidator: (value) => {
if (value === null) {
return '审核意见不能为空'
}
}
}).then(async ({value}) => {
let id = ''
if (type === 'one') {
id = JSON.stringify([that.formData.id])
} else {
id = JSON.stringify(this.selectTable.map(x => x.id))
}
$.post(location.href + "/doReview", {
id: id,
auditOpinion: value,
isPass: state
}, (res) => {
if (res.code === 0) {
that.$message.success(res.msg)
this.selectTable = []
that.pageData();
that.$refs.guava.index()
}
}, "json");
}).catch(() => {
});
},
doInstructions() {
$.post(location.href + "/doReview", this.formData, (res) => {
if (res.code == 0) {
this.$message.success(res.msg)
this.pageData();
this.$refs.guava.index()
}
}, "json");
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
let form = clone(this.pageForm)
if (form.isAudit === null) {
delete form.isAudit
}
$.post(location.href + "/pageData", form, (res) => {
const {code, data, msg} = res
sublime.closeLoadingbar();
this.tableLoading = false
if (code == 0) {
this.tableData = data.list;
this.pageForm.totalCount = data.totalCount;
} else {
this.$message.error(msg);
}
}, "json");
}
},
async created() {
this.activityTypeList = await activityUtil.getAllType()
this.pageData();
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,416 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.audit-userids-select .el-select__tags {
flex-wrap: unset;
overflow: auto;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">类型名称:</div>
<div class="search-item-option">
<el-input placeholder="请输入类型名称" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
</el-input>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool :app="this" label="类型列表">
<template #func>
<el-button @click="openAdd" size="small" type="primary">新增类型</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize"
@sort-change="pageOrder" class="vi-table"
row-key="id" style="width: 100%">
<el-table-column align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
min-width="50"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column label="操作">
<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>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<el-form :model="formData" :rules="formRules" label-width="80px" ref="form">
<el-form-item label="类型名称" prop="meetingTypeName">
<el-input v-model="formData.meetingTypeName" placeholder="请输入类型名称"></el-input>
</el-form-item>
<el-form-item label="模块名称" prop="moduleName">
<el-input v-model="formData.moduleName" placeholder="请输入模块名称"></el-input>
</el-form-item>
<el-form-item label="序号" prop="sortNum">
<el-input-number :max="tableData.length + 1" :min="1" :precision="0"
v-model="formData.sortNum"></el-input-number>
</el-form-item>
<el-table :data="formData.auditStateList">
<el-table-column label="节点ID" prop="stateId" width="100px">
<template slot-scope="scope">
<el-input readonly v-model="scope.row.stateId"></el-input>
</template>
</el-table-column>
<el-table-column label="审核节点名称" prop="stateName">
<template slot-scope="scope">
<el-input v-model="scope.row.stateName" placeholder="请输入审核节点名称"></el-input>
</template>
</el-table-column>
<el-table-column label="审核人" prop="selectUserId">
<template slot-scope="scope">
<el-select :remote-method="userRemoteMethod" class="audit-userids-select" filterable
multiple placeholder="请输入姓名或工号查找"
remote style="width: 100%"
v-model="scope.row.selectUserId">
<el-option :key="item.id" :label="item.username + '(' + item.loginname + ')'"
:value="item.id"
v-for="item in userList"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="筛选审核人" width="100px">
<template scope="scope">
<el-button @click="openUserSelect(scope.$index)" type="text">筛选用户</el-button>
</template>
</el-table-column>
<el-table-column label="通过下个节点" pro="afterPassStateId" width="120px">
<template slot-scope="scope">
<el-select v-model="scope.row.afterPassStateId">
<el-option :label="item"
:value="item"
v-for="item in stateIdList"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="拒绝下个节点" pro="afterRejectStateId" width="120px">
<template slot-scope="scope">
<el-select v-model="scope.row.afterRejectStateId">
<el-option :label="item"
:value="item"
v-for="item in stateIdList"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="审核类型" prop="stateAuditType" width="150px">
<template slot-scope="scope">
<el-select v-model="scope.row.stateAuditType">
<el-option :label="item.desc"
:value="item.value"
v-for="item in stateAuditTypeList"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column width="100px">
<template scope="scope" slot="header">
<el-button @click="addState"
icon="el-icon-circle-plus-outline"
size="mini"
type="primary"></el-button>
</template>
<template scope="scope">
<el-button @click="formData.auditStateList.splice(scope.$index, 1)"
icon="el-icon-delete"
size="mini"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$refs.guava.index()">取消</el-button>
<el-button @click="doConfirm" type="primary">确定</el-button>
</el-row>
</template>
</guava>
<condition :fields="fields"
:show_filter_result="true"
@confirm="cndConfirm"
ref="cnd"
v-model="cnd"></condition>
</div>
<script>
<!--# include("/platform/activity/includeJs/activityUtil.js"){} #-->
const activityUtil = new typeUtil()
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'condition': httpVueLoader('/components/plugins/ConditionStructure.vue?v=1.0.0'),
},
data() {
return {
tableColumns: [
{prop: 'meetingTypeName', label: '类型名称'},
{prop: 'moduleName', label: '模块名称'},
{prop: 'sortNum', label: '排序编号'}],
stateAuditTypeList: [],
formData: {
auditStateList: []
},
formRules: {
meetingTypeName: [{required: true, message: '请输入类型名称', trigger: ['blur', 'change']}],
moduleName: [{required: true, message: '请输入模块名称,英文命名', trigger: ['blur', 'change']}],
sortNum: [{required: true, message: '请输入排序编号', trigger: ['blur', 'change']}]
},
userList: [],
maxStateId: 0,
userSelectDialogVisible: false,
cnd: {},
fields: [],
nodeIndex: null
}
},
watch: {
async 'formData.auditStateList'(val) {
const {id} = this.formData
for (let i = 0; i < val.length; i++) {
let item = val[i]
if (id) {
if (item.isAddRow) {
//当前行是新增的第几行
const addIndex = i + 1 - val.filter(v => !v.isAddRow).length
const stateId = val[0].stateId + i * 10
const licitStateCode = await this.checkStateId(stateId, addIndex)
item['stateId'] = licitStateCode
}
} else {
item['stateId'] = this.maxStateId + (i + 1) * 10
}
}
// this.$set(this.formData,'auditStateList',val)
}
},
computed: {
dialogTitle() {
if (this.formData.id) {
return '编辑'
}
return '新增'
},
stateIdList() {
return this.formData.auditStateList.map(v => v.stateId)
}
},
methods: {
async checkStateId(stateId, stateIndex) {
const resp = await $.get(loc() + '/checkStateId', {stateId, stateIndex})
if (resp.code === 0) {
return resp.data
} else {
this.notifyError(resp.msg)
}
},
addState() {
this.formData.auditStateList.push({
stateId: this.maxStateId,
stateName: null,
selectUserId: [],
auditStateUserList: [],
afterPassStateId: null,
afterRejectStateId: null,
isAddRow: true
})
},
async pageData() {
const res = await $.post(loc() + '/pageData', this.pageForm)
if (res.code === 0) {
res.data.list.forEach(v => {
v.auditStateList.forEach(x => {
if (x.matchCnd) x.matchCnd = JSON.parse(x.matchCnd)
})
})
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount;
}
},
openAdd() {
this.formData = {
meetingName: null,
sortNum: this.tableData.length + 1,
auditStateList: [{}]
}
this.$refs.guava.edit()
},
async doConfirm() {
try {
const valid = await this.$refs['form'].validate()
if (valid) {
this.formData.auditStateList.forEach(v => {
v['auditStateUserList'] = v.selectUserId.map(x => {
return {userId: x}
})
v['matchCnd'] = JSON.stringify(v['matchCnd'])
})
const resp = await $.post(loc() + '/doHandle', {data: JSON.stringify(this.formData)})
if (resp.code === 0) {
this.$refs.guava.index()
this.notifySuccess(resp.msg)
await this.pageData()
} else {
this.notifyError(resp.msg)
}
}
} catch (e) {
}
},
async openEdit(row) {
const d = clone(row)
let u = []
d.auditStateList.forEach(v => {
v['selectUserId'] = v.auditStateUserList.map(x => x.userId)
u = u.concat(v['selectUserId'])
})
this.userList = await queryUserByIds(u)
this.formData = d
this.$refs.guava.edit()
},
async doDelete(id) {
try {
const confirm = await this.$confirm('您确定要删除吗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/delete/' + id)
if (resp.code === 0) {
this.notifySuccess(resp.msg)
await this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
} catch (e) {
console.log(e)
}
},
async userRemoteMethod(query) {
if (query) {
this.userList = await searchUser(query)
}
},
openUserSelect(node_index) {
this.nodeIndex = node_index
const node = this.formData.auditStateList[node_index]
if (node.matchCnd) {
this.cnd = node.matchCnd
console.log('......')
} else {
this.cnd = {method: "AND", conditions: [{}]}
}
this.$refs.cnd.open(false)
},
async initCndFields() {
this.cnd = {
method: "AND",
conditions: [{}],
}
/*const meet_data = await getOpenMeeting()
const meet_options = meet_data.map(v => {
return {"label": v.jdhallname, "value": v.id}
})
this.fields.push(
{label: '教代会', value: 'jdhid', type: "select", options: meet_options}
)*/
const {data: role_data} = await $.get('/platform/sys/role/getAllRoles')
const role_options = role_data.map(v => {
return {"label": v.name, "value": v.id}
})
this.fields.push(
{label: '角色', value: 'roleId', type: "select", options: role_options}
)
this.fields.push(
{label: '姓名', value: 'username', options: null}
)
},
async cndConfirm(val) {
if (val) {
const matchCnd = clone(val)
if (matchCnd.conditions && matchCnd.conditions.length > 0) {
this.formData.auditStateList[this.nodeIndex].matchCnd = matchCnd
const resp = await $.post('/platform/userFilter/findUserByCnd', {cnd: JSON.stringify(matchCnd)})
if (resp.code === 0) {
if (resp.data) {
const d = this.formData.auditStateList[this.nodeIndex]
d.matchCnd = matchCnd
d.selectUserId = [...new Set(d.selectUserId.concat(resp.data.map(v => v.id)))]
this.$set(this.formData.auditStateList, this.nodeIndex, d)
let u = []
this.formData.auditStateList.forEach(v => {
u = u.concat(v.selectUserId.map(x => x))
})
this.userList = await queryUserByIds([...new Set(u)])
}
}
console.log(resp)
}
}
}
},
async created() {
this.pageData()
this.initCndFields()
this.maxStateId = await activityUtil.findMaxStateId()
this.stateAuditTypeList = await getEnumOptions('AuditTypeEnum')
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,112 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<!--#include("/platform/activity/summary/common/addSummaryCommon.html"){}#-->
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
components: {},
data() {
return {
formData: {
files: [],
tissueId: '',
},
summaryType: [],
id: '',
clubOptions: [],
userOptions: [],
summaryFrom: '3',
}
},
methods: {
async querySqr(key) {
const data = await selectUser(key, 30)
this.userOptions = data.list
},
cancel() {
if (this.id) {
sublime.jumpPagePjax('/platform/activity/yearSummary/club')
}
},
async doHandle() {
const valid = await this.$refs['form'].validate()
if (valid) {
this.formData.userId = "${@shiro.getPrincipalProperty('id')}";
this.formData.summaryFrom = "3";
this.formData.files = JSON.stringify(this.formData.files)
const resp = await $.post('/platform/activity/yearSummary/doHandle', this.formData)
if (resp.code === 0) {
this.$notify({
title: '成功',
message: resp.msg,
type: 'success',
duration: 500,
onClose: () => {
sublime.jumpPagePjax('/platform/activity/yearSummary/club')
}
});
}
}
},
async initData() {
const id = GetQueryString("id")
this.id = id
if (id) {
const resp = await $.post('/platform/activity/yearSummary/findOne', {id})
if (resp.code === 0) {
this.formData = resp.data
this.formData.files = JSON.parse(this.formData.files)
this.userOptions = [
{
username: this.formData.username,
loginname: this.formData.loginname,
id: this.formData.userId,
}
]
}
} else {
this.formData.userId = "${@shiro.getPrincipalProperty('id')}"
this.userOptions = [
{
username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
id: "${@shiro.getPrincipalProperty('id')}",
}
]
const clubs = await $.post('/platform/activity/yearSummary/getMyClub')
this.formData.tissueId = clubs[0] === undefined ? '' : clubs[0]
}
},
},
async created() {
await this.initData()
this.summaryType = await getDictOptions('summaryType')
this.clubOptions = await getClubs()
const isAdmin = "${@shiro.hasAnyRoles('sysadmin', 'A06')}" === 'true'
if (!isAdmin) {
const clubs = await this.getMyClub()
let clubArray = []
for (let c of Array.from(clubs)) {
const cl = this.clubOptions.find(x => x.id === c)
if (cl) {
clubArray.push(cl)
}
}
this.clubOptions = clubArray
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,245 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<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
placeholder="选择年度" style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">协会(社团)</div>
<div class="search-item-option">
<el-select v-model="pageForm.tissueId" placeholder="请选择协会(社团)" style="width: 100%;">
<el-option v-for="item in unionOptions" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">总结类型</div>
<div class="search-item-option">
<el-select v-model="pageForm.summaryType" placeholder="请选择总结类型" style="width: 100%;">
<el-option v-for="item in summaryType" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column prop="year" label="年度">
</el-table-column>
<el-table-column sortable prop="name" label="协会(社团)">
</el-table-column>
<el-table-column sortable prop="typename" label="总结类型">
</el-table-column>
<el-table-column sortable prop="username" label="上传人">
</el-table-column>
<el-table-column sortable prop="ctime" label="上传时间">
</el-table-column>
<el-table-column prop="userOnline" label="操作" width="100px">
<template slot-scope="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:'view',data:scope.row}">
查看
</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-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
<template #view>
<div style="width: 80%; margin: 0 auto">
<vi-title title="总结详情"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="年度">
{{viewData.year}}
</el-descriptions-item>
<el-descriptions-item label="协会(社团)">
{{viewData.name}}
</el-descriptions-item>
<el-descriptions-item label="总结类型">
{{viewData.typename}}
</el-descriptions-item>
<el-descriptions-item label="上传人">
{{viewData.username}}
</el-descriptions-item>
<el-descriptions-item label="上传时间" :span="2">
{{viewData.ctime}}
</el-descriptions-item>
<el-descriptions-item label="附件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="JSON.parse(viewData.files)"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
</guava>
</div>
<script>
let vue = new Vue({
el: "#app",
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
data() {
return {
tableData: [],
fileList: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
summaryFrom: '3',
year: moment().format('YYYY')
},
formData: {},
summaryType: [],
unionOptions: [],
viewData: {},
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.viewData = row
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'edit') {
this.openEdit(data)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
doDelete(id) {
this.$confirm('确定要删除吗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
$.post(base + '/platform/activity/yearSummary/doDelete', {id: id}).then(res => {
if (res.code === 0) {
this.doSearch()
this.$message.success(res.msg)
}
})
}).catch(() => {
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop
this.pageForm.pageOrderBy = column.order
this.pageData()
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData()
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData()
},
pageData() {
$.post('/platform/activity/yearSummary/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
openEdit(row) {
sublime.jumpPagePjax('/platform/activity/yearSummary/addClubSummary?id=' + row.id)
},
async getMyClub() {
return await $.post('/platform/activity/yearSummary/getMyClub')
}
},
async created() {
this.unionOptions = await getClubs()
const isAdmin = "${@shiro.hasAnyRoles('sysadmin', 'A06')}" === 'true'
if (!isAdmin) {
const clubs = await this.getMyClub()
let clubArray = []
for (let c of Array.from(clubs)) {
const cl = this.unionOptions.find(x => x.id === c)
if (cl) {
clubArray.push(cl)
}
}
this.unionOptions = clubArray
}
this.summaryType = await getDictOptions('summaryType')
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,57 @@
<el-form :model="formData" label-width="120px" ref="form">
<vi-title title="年度总结"></vi-title>
<el-row :gutter="10" type="flex">
<el-col :span="24">
<el-form-item label="姓名" prop="username">
<el-select v-model="formData.userId" style="width: 100%"
filterable
remote
clearable
reserve-keyword
placeholder="输入工号或姓名查找"
:remote-method="querySqr">
<el-option v-for="o in userOptions" :label="o.username+'-'+o.loginname" :value="o.id"
:key="o.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="summaryFrom === '2'" :gutter="10" type="flex">
<el-col :span="24">
<el-form-item label="所属工会" prop="tissueId">
<el-select v-model="formData.tissueId" placeholder="请选择所属工会" style="width: 100%;">
<el-option v-for="item in unionOptions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="summaryFrom === '3'" :gutter="10" type="flex">
<el-col :span="24">
<el-form-item label="协会(社团)" prop="tissueId">
<el-select v-model="formData.tissueId" placeholder="请选择协会(社团)" style="width: 100%;">
<el-option v-for="item in clubOptions" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" type="flex">
<el-col :span="24">
<el-form-item label="总结类型" prop="summaryType" :rules="{required:true,message: '请选择总结类型', trigger: 'blur'}">
<el-select v-model="formData.summaryType" placeholder="请选择总结类型" style="width: 100%;">
<el-option v-for="item in summaryType" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" type="flex">
<el-col :span="24">
<el-form-item prop="files" label="附件上传">
<file-upload :files.sync="formData.files"></file-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="cancel">取消</el-button>
<el-button @click="doHandle" type="primary">提交</el-button>
</el-row>
@@ -0,0 +1,99 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<!--#include("/platform/activity/summary/common/addSummaryCommon.html"){}#-->
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
components: {},
data() {
return {
formData: {
files: [],
tissueId: '',
},
summaryFrom: '1',
summaryType: [],
id: '',
unionOptions: [],
userOptions: [],
}
},
methods: {
async querySqr(key) {
const data = await selectUser(key, 30)
this.userOptions = data.list
},
cancel() {
if (this.id) {
sublime.jumpPagePjax('/platform/activity/yearSummary/school')
}
},
async doHandle() {
const valid = await this.$refs['form'].validate()
if (valid) {
this.formData.userId = "${@shiro.getPrincipalProperty('id')}";
this.formData.summaryFrom = "1";
this.formData.files = JSON.stringify(this.formData.files)
const resp = await $.post('/platform/activity/yearSummary/doHandle', this.formData)
if (resp.code === 0) {
this.$notify({
title: '成功',
message: resp.msg,
type: 'success',
duration: 500,
onClose: () => {
sublime.jumpPagePjax('/platform/activity/yearSummary/school')
}
});
}
}
},
async initData() {
const id = GetQueryString("id")
this.id = id
if (id) {
const resp = await $.post('/platform/activity/yearSummary/findOne', {id})
if (resp.code === 0) {
this.formData = resp.data
this.formData.files = JSON.parse(this.formData.files)
this.userOptions = [
{
username: this.formData.username,
loginname: this.formData.loginname,
id: this.formData.userId,
}
]
}
} else {
this.formData.userId = "${@shiro.getPrincipalProperty('id')}"
this.userOptions = [
{
username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
id: "${@shiro.getPrincipalProperty('id')}",
}
]
this.formData.tissueId = "${@shiro.getPrincipalProperty('union').getId()}"
}
},
},
async created() {
await this.initData()
this.summaryType = await getDictOptions('summaryType')
this.unionOptions = await getUnions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,236 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<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
placeholder="选择年度" style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<!--<div class="search-item">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select v-model="pageForm.tissueId" placeholder="请选择所属工会" style="width: 100%;">
<el-option v-for="item in unionOptions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</div>
</div>-->
<div class="search-item">
<div class="search-item-label">总结类型</div>
<div class="search-item-option">
<el-select v-model="pageForm.summaryType" placeholder="请选择总结类型"
clearable style="width: 100%;">
<el-option v-for="item in summaryType" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column prop="year" label="年度">
</el-table-column>
<!--<el-table-column sortable prop="name" label="所属工会">
</el-table-column>-->
<el-table-column sortable prop="typename" label="总结类型">
</el-table-column>
<el-table-column sortable prop="username" label="上传人">
</el-table-column>
<el-table-column sortable prop="ctime" label="上传时间">
</el-table-column>
<el-table-column prop="userOnline" label="操作" width="100px">
<template slot-scope="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:'view',data:scope.row}">
查看
</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-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
<template #view>
<div style="width: 80%; margin: 0 auto">
<vi-title title="总结详情"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="年度">
{{viewData.year}}
</el-descriptions-item>
<!-- <el-descriptions-item label="所属工会">
{{viewData.name}}
</el-descriptions-item>-->
<el-descriptions-item label="总结类型">
{{viewData.typename}}
</el-descriptions-item>
<el-descriptions-item label="上传人">
{{viewData.username}}
</el-descriptions-item>
<el-descriptions-item label="上传时间" :span="2">
{{viewData.ctime}}
</el-descriptions-item>
<el-descriptions-item label="附件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="JSON.parse(viewData.files)"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
</guava>
</div>
<script>
let vue = new Vue({
el: "#app",
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
data() {
return {
tableData: [],
fileList: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
summaryFrom: '1',
year: moment().format('YYYY')
},
formData: {},
summaryType: [],
unionOptions: [],
viewData: {},
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.viewData = row
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'edit') {
this.openEdit(data)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
doDelete(id) {
this.$confirm('确定要删除吗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
$.post(base + '/platform/activity/yearSummary/doDelete', {id: id}).then(res => {
if (res.code === 0) {
this.doSearch()
this.$message.success(res.msg)
}
})
}).catch(() => {
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop
this.pageForm.pageOrderBy = column.order
this.pageData()
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData()
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData()
},
pageData() {
$.post('/platform/activity/yearSummary/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
openEdit(row) {
sublime.jumpPagePjax('/platform/activity/yearSummary/addSchoolSummary?id=' + row.id)
},
},
async created() {
this.unionOptions = await getUnions()
const isAdmin = "${@shiro.hasAnyRoles('sysadmin', 'A06')}" === 'true'
if (!isAdmin) {
const selfUnion = "${@shiro.getPrincipalProperty('union').getId()}";
this.unionOptions = this.unionOptions.find(x => x.id === selfUnion)
}
this.summaryType = await getDictOptions('summaryType')
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,105 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<!--#include("/platform/activity/summary/common/addSummaryCommon.html"){}#-->
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
components: {},
data() {
return {
formData: {
files: [],
tissueId: '',
},
summaryFrom: '2',
summaryType: [],
id: '',
unionOptions: [],
userOptions: [],
}
},
methods: {
async querySqr(key) {
const data = await selectUser(key, 30)
this.userOptions = data.list
},
cancel() {
if (this.id) {
sublime.jumpPagePjax('/platform/activity/yearSummary/union')
}
},
async doHandle() {
const valid = await this.$refs['form'].validate()
if (valid) {
this.formData.userId = "${@shiro.getPrincipalProperty('id')}";
this.formData.tissueId = "${@shiro.getPrincipalProperty('union').getId()}";
this.formData.summaryFrom = "2";
this.formData.files = JSON.stringify(this.formData.files)
const resp = await $.post('/platform/activity/yearSummary/doHandle', this.formData)
if (resp.code === 0) {
this.$notify({
title: '成功',
message: resp.msg,
type: 'success',
duration: 500,
onClose: () => {
sublime.jumpPagePjax('/platform/activity/yearSummary/union')
}
});
}
}
},
async initData() {
const id = GetQueryString("id")
this.id = id
if (id) {
const resp = await $.post('/platform/activity/yearSummary/findOne', {id})
if (resp.code === 0) {
this.formData = resp.data
this.formData.files = JSON.parse(this.formData.files)
this.userOptions = [
{
username: this.formData.username,
loginname: this.formData.loginname,
id: this.formData.userId,
}
]
}
} else {
this.formData.userId = "${@shiro.getPrincipalProperty('id')}"
this.userOptions = [
{
username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
id: "${@shiro.getPrincipalProperty('id')}",
}
]
this.formData.tissueId = "${@shiro.getPrincipalProperty('union').getId()}"
}
},
},
async created() {
await this.initData()
this.summaryType = await getDictOptions('summaryType')
this.unionOptions = await getUnions()
const isAdmin = "${@shiro.hasAnyRoles('sysadmin', 'A06')}" === 'true'
if (!isAdmin) {
const selfUnion = "${@shiro.getPrincipalProperty('union').getId()}";
this.unionOptions = [this.unionOptions.find(x => x.id === selfUnion)]
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,236 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<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
placeholder="选择年度" style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select v-model="pageForm.tissueId" placeholder="请选择所属工会" style="width: 100%;">
<el-option v-for="item in unionOptions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">总结类型</div>
<div class="search-item-option">
<el-select v-model="pageForm.summaryType" placeholder="请选择总结类型" style="width: 100%;">
<el-option v-for="item in summaryType" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column prop="year" label="年度">
</el-table-column>
<el-table-column sortable prop="name" label="所属工会">
</el-table-column>
<el-table-column sortable prop="typename" label="总结类型">
</el-table-column>
<el-table-column sortable prop="username" label="上传人">
</el-table-column>
<el-table-column sortable prop="ctime" label="上传时间">
</el-table-column>
<el-table-column prop="userOnline" label="操作" width="100px">
<template slot-scope="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:'view',data:scope.row}">
查看
</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-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
<template #view>
<div style="width: 80%; margin: 0 auto">
<vi-title title="总结详情"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="年度">
{{viewData.year}}
</el-descriptions-item>
<el-descriptions-item label="所属工会">
{{viewData.name}}
</el-descriptions-item>
<el-descriptions-item label="总结类型">
{{viewData.typename}}
</el-descriptions-item>
<el-descriptions-item label="上传人">
{{viewData.username}}
</el-descriptions-item>
<el-descriptions-item label="上传时间" :span="2">
{{viewData.ctime}}
</el-descriptions-item>
<el-descriptions-item label="附件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="JSON.parse(viewData.files)"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
</guava>
</div>
<script>
let vue = new Vue({
el: "#app",
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
data() {
return {
tableData: [],
fileList: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
summaryFrom: '2',
year: moment().format('YYYY')
},
formData: {},
summaryType: [],
unionOptions: [],
viewData: {},
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.viewData = row
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'edit') {
this.openEdit(data)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
doDelete(id) {
this.$confirm('确定要删除吗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
$.post(base + '/platform/activity/yearSummary/doDelete', {id: id}).then(res => {
if (res.code === 0) {
this.doSearch()
this.$message.success(res.msg)
}
})
}).catch(() => {
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop
this.pageForm.pageOrderBy = column.order
this.pageData()
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData()
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData()
},
pageData() {
$.post('/platform/activity/yearSummary/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
openEdit(row) {
sublime.jumpPagePjax('/platform/activity/yearSummary/addUnionSummary?id=' + row.id)
},
},
async created() {
this.unionOptions = await getUnions()
const isAdmin = "${@shiro.hasAnyRoles('sysadmin', 'A06')}" === 'true'
if (!isAdmin) {
const selfUnion = "${@shiro.getPrincipalProperty('union').getId()}";
this.unionOptions = [this.unionOptions.find(x => x.id === selfUnion)]
}
this.summaryType = await getDictOptions('summaryType')
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,443 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-divider {
background-color: #409EFF !important;
}
.el-divider__text {
color: #409EFF !important;
}
.el-timeline-item__timestamp {
color: #409EFF;
}
</style>
<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 class="search-item">
<div class="search-item-label">工会名称:</div>
<div class="search-item-option">
<el-select v-model="pageForm.unionId" 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 class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="活动列表" :app="this">
<template #func>
<el-button type="primary" icon="el-icon-edit-outline" size="small"
@click="openAdd">
创建活动
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template v-if="column.prop=='time'" scope="{row}">
<span>
{{moment(row.startTime).format('YYYY-MM-DD')}} - {{moment(row.endTime).format('YYYY-MM-DD')}}
</span>
</template>
<template v-else-if="column.prop=='type'" scope="{row}">
<span v-if="row.type==40001">分工会活动计划</span>
<span v-if="row.type==40003">协会(社团)活动计划</span>
<span v-if="row.type==40003">校工会活动计划</span>
</template>
<template v-else-if="column.prop=='tussueName'" scope="{row}">
<span v-if="row.type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
<span v-if="row.type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
<span v-else>暂无</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>
<!--# if(!@shiro.hasRole('A06')){ #-->
<el-dropdown-item :command="{type:'export',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="addForm" :rules="formRules" label-width="100px" label-position="left"
label-suffix=":" style="padding: 0 2%">
<el-form-item prop="name" label="活动名称">
<el-input maxlength="50" placeholder="请填写活动名称" v-model="formData.name"
type="text"></el-input>
</el-form-item>
<!--<el-row :gutter="40">
<el-col :span="12">
</el-col>
<el-col :span="12">
<el-form-item prop="type" label="活动类型">
<el-radio-group v-model="formData.type">
<el-radio label="1" border>分工会活动</el-radio>
<el-radio label="2" border>协会(社团)活动</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>-->
<el-row :gutter="40">
<el-col :span="12">
<el-form-item prop="time" label="活动时间">
<el-date-picker
style="width: 100%"
v-model="formData.time"
type="daterange"
value-format="yyyy-MM-dd"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="peopleNum" label="活动人数">
<el-input maxlength="10" placeholder="请填写活动人数" v-model="formData.peopleNum"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="40">
<el-col :span="12">
<el-form-item prop="address" label="活动地址">
<el-input maxlength="50" placeholder="请填写活动地址" v-model="formData.address"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<div style="display: flex;margin: 20px 0">
<el-divider content-position="left">活动人员列表</el-divider>
<div style="padding-left: 10px">
<el-tooltip class="item" effect="dark" content="点击添加活动人员" placement="top">
<el-button icon="el-icon-plus" circle @click="openAddUser" type="primary"></el-button>
</el-tooltip>
</div>
</div>
<el-table style="margin-bottom: 20px" border stripe :data="userData" size="small"
v-loading="userTabLoading">
<el-table-column
type="index" label="序号" header-align="center" align="center" width="100">
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in userColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="150px">
<template scope="{row}">
<el-button type="danger" icon="el-icon-delete" circle @click="delUser"></el-button>
</template>
</el-table-column>
</el-table>
<el-divider content-position="left">活动资料</el-divider>
<file-upload :files.sync="formData.files"></file-upload>
</el-form>
</template>
<template #view>
<tissue-info ref="info"></tissue-info>
</template>
</guava>
<el-dialog title="添加人员" :visible.sync="dialogVisible" width="40%">
<el-form :model="formData" ref="form" :rules="formRules" label-width="100px">
<el-form-item prop="userId" label="参加人员">
<el-select v-model="formData.tissuePersonList" placeholder="请选择参加人员"
multiple
filterable
remote
reserve-keyword
:remote-method="remoteMethod"
:loading="selectLoading"
style="width: 100%">
<el-option
v-for="item in userList"
:key="item.userId"
:label="item.userName+'-'+item.loginName+'-'+item.unitName"
:value="item.userId">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAddUser">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
selectLoading: false,
userTabLoading: false,
dialogVisible: false,
userData: [],
userList: [],
unionList: [],
formData: {
tissuePersonList: []
},
tableColumns: [
{prop: 'name', label: '活动名称'},
{prop: 'address', label: '活动地点'},
{prop: 'type', label: '活动类型'},
{prop: 'tussueName', label: '所属组织'},
{prop: 'time', label: '活动日期'},
{prop: 'peopleNum', label: '活动人数'}
],
userColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unitName', label: '所属单位'},
{prop: 'unionName', label: '所属工会'}
],
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
address: [{required: true, message: '必填', trigger: ['blur', 'change']}],
peopleNum: [{required: true, message: '必填', trigger: ['blur', 'change']}],
time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'tissue-info': httpVueLoader('/components/activity/school/tissueInfo.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)
} else if (type === 'export') {
location.href = "/platform/activity/union/info/mange/export?id=" + row.id
}
},
async remoteMethod(query) {
if (query) {
this.selectLoading = true;
const {data} = await $.post(loc() + "/findUser", {serachWord: query})
this.userList = data
this.selectLoading = false;
}
},
openAddUser() {
this.formData.tissuePersonList = []
this.dialogVisible = true
},
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.dialogVisible = false
},
delUser(row) {
this.userData.splice(this.userData.indexOf(row.userId), 1)
this.formData.tissuePersonList.splice(this.formData.tissuePersonList.indexOf(row.userId), 1)
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async openEdit(row) {
const {id} = row
const resp = await $.post(loc() + "/findOne", {id})
if(resp.code===0){
const data = resp.data
data.type = data.type + ''
data.files = JSON.parse(data.files)
data.time = [data.startTime, data.endTime]
this.userData = clone(data.tissuePersonList)
this.formData = data
}else{
this.notifyWarning(resp.msg)
}
this.$refs.guava.edit()
},
async openAdd() {
this.$refs.guava.edit()
this.userData = []
this.$nextTick(() => {
this.formData = {
name: '',
time: '',
peopleNum: '',
address: '',
files: [],
type: "40002",
tissuePersonList: []
}
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
})
},
async operation() {
let url = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const formData = JSON.parse(JSON.stringify(this.formData))
if (formData.time && formData.time.length) {
formData.startTime = formData.time[0]
formData.endTime = formData.time[1]
formData.time = undefined
}
const resp = await $.post(loc() + url, {tissue: JSON.stringify(formData),})
loading.close()
if(resp.code===0){
this.pageData()
this.$refs.guava.index()
}else{
this.notifyWarning(resp.msg)
}
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除该活动吗?', '提示', {type: 'warning'}).then(async () => {
this.$set(row, "loading", true)
const resp = await $.post(loc() + "/doDelete", {id: id});
this.$set(row, "loading", false)
if(resp.code===0){
this.pageData()
}else{
this.notifyWarning(resp.msg)
}
})
},
},
async created() {
this.pageData()
this.unionList = await getUnions(null)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,341 @@
<!--#
layout("/layouts/platform.html"){
#-->
<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 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>
<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">
<template #func>
<el-button type="primary" icon="el-icon-edit-outline" size="small"
@click="openAdd">
创建活动计划
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template v-if="column.prop=='carryOut'" scope="{row}">
<span v-if="row.carryOut" class="text-success">已执行</span>
<span v-if="!row.carryOut" class="text-primary">未执行</span>
</template>
<template v-else-if="column.prop=='type'" scope="{row}">
<span v-if="row.type==40001">分工会活动计划</span>
<span v-if="row.type==40003">协会(社团)活动计划</span>
<span v-if="row.type==40003">校工会活动计划</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>
<!--# if(!@shiro.hasRole('A06')){ #-->
<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="eventId" label="活动项目">
<el-select v-model="formData.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>
</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 = {}
const 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 {
unionList: [],
eventList: [],
flag: false,
formData: {
name: '',
time: '',
eventId: '',
content: ''
},
tableColumns: [
{prop: 'name', label: '计划名称'},
{prop: 'time', label: '计划预计时间'},
{prop: 'allName', label: '活动项目'},
{prop: 'type', 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']}],
eventId: [{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) {
this.flag = false
row.type = row.type + ''
this.formData = row
this.$refs.guava.edit()
this.$nextTick(() => {
this.initEditor()
})
},
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: '2',
name: '',
time: '',
eventId: '',
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
});
const resp = await $.post(loc() + url, {
data: JSON.stringify(this.formData),
})
loading.close()
if (resp.code === 0) {
this.pageData()
this.$refs.guava.index()
} else {
this.notifyWarning(resp.msg)
}
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除该计划吗?', '提示', {type: 'warning'}).then(async () => {
const resp = await $.post(loc() + "/doDelete", {id: id});
if(resp.code===0){
this.pageData()
}else{
this.notifyWarning(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])
}
})
}
},
async created() {
this.pageData()
this.eventList = await activity.getEvents()
this.unionList = await getUnions(null);
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,152 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<!--#include("/platform/activity/union/addPlanCommon.html"){}#-->
</el-card>
</guava>
</div>
<script>
let E = window.wangEditor
const editors = {}
const vue = new Vue({
el: '#app',
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'plan-info': httpVueLoader('/components/activity/school/planInfo.vue'),
},
data() {
let validContent = (rule, value, callback) => {
if (!this.formData.content || !dd3s.html2txt(this.formData.content)) {
callback(new Error('请填写计划内容'));
} else {
callback();
}
};
return {
activityTypeList: [],
eventList: [],
formData: {
type: '40003',
name: '',
time: '',
event: '',
content: ''
},
formRules: {
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
money: [{required: true, message: '必填', trigger: ['blur', 'change']}],
event: [{required: true, message: '必填', trigger: ['blur']}],
activityType: [{required: true, message: '必填', trigger: ['blur']}],
content: [{validator: validContent, trigger: ['blur', 'change']}]
},
id: '',
}
},
methods: {
cancel() {
if (this.id) {
sublime.jumpPagePjax('/platform/activity/plan/club')
}
},
doHandle() {
let url = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["form"].validate(async (valid) => {
if (valid) {
const resp = await $.post('/platform/activity/plan' + url, {
id: this.formData.id,
name: this.formData.name,
time: this.formData.time,
content: this.formData.content,
money: this.formData.money,
event: JSON.stringify(this.formData.event),
type: '40003',
activityType: this.formData.activityType,
})
if (resp.code === 0) {
this.$notify({
title: '成功',
message: resp.msg,
type: 'success',
duration: 500,
onClose: () => {
sublime.jumpPagePjax('/platform/activity/plan/club')
}
});
}
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
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])
}
})
},
async getEvents() {
const {code, data, msg} = await $.get("/platform/activity/common/getEvents")
return data
},
async getActivityType() {
const {code, data, msg} = await $.get("/platform/activity/common/getActivityType")
return data
},
async initData() {
const id = GetQueryString("id")
this.id = id
if (id) {
const resp = await $.post('/platform/activity/plan/findOne', {id})
if (resp.code === 0) {
const cloneRow = clone(resp.data)
cloneRow.event = JSON.parse(cloneRow.event)
this.formData = cloneRow
this.$nextTick(() => {
this.initEditor()
})
}
}
},
},
async created() {
const self = this
setTimeout(function () {
self.initEditor()
}, 100)
//this.eventList = await this.getEvents()
this.activityTypeList = await this.getActivityType()
await this.initData()
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,65 @@
<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="活动项目">
&lt;!&ndash;<el-input maxlength="50" placeholder="请填写活动项目" v-model="formData.event"
type="text"></el-input>&ndash;&gt;
<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="activityType" label="活动类型">
<el-select v-model="formData.activityType" placeholder="请选择活动类型" filterable clearable
style="width: 100%">
<el-option
v-for="item in activityTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="money" label="预算费用" class="is-required">
<el-input maxlength="50" placeholder="请填写整数或者小数" v-model="formData.money"
type="number"></el-input>
</el-form-item>
<el-form-item prop="content" label="计划内容" class="is-required">
<div id="content"></div>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="cancel">取消</el-button>
<el-button @click="doHandle" type="primary">提交</el-button>
</el-row>
@@ -0,0 +1,152 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<!--#include("/platform/activity/union/addPlanCommon.html"){}#-->
</el-card>
</guava>
</div>
<script>
let E = window.wangEditor
const editors = {}
const vue = new Vue({
el: '#app',
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'plan-info': httpVueLoader('/components/activity/school/planInfo.vue'),
},
data() {
let validContent = (rule, value, callback) => {
if (!this.formData.content || !dd3s.html2txt(this.formData.content)) {
callback(new Error('请填写计划内容'));
} else {
callback();
}
};
return {
activityTypeList: [],
eventList: [],
formData: {
type: '40001',
name: '',
time: '',
event: '',
content: ''
},
formRules: {
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
money: [{required: true, message: '必填', trigger: ['blur', 'change']}],
event: [{required: true, message: '必填', trigger: ['blur']}],
activityType: [{required: true, message: '必填', trigger: ['blur']}],
content: [{validator: validContent, trigger: ['blur', 'change']}]
},
id: '',
}
},
methods: {
cancel() {
if (this.id) {
sublime.jumpPagePjax('/platform/activity/plan/school')
}
},
doHandle() {
let url = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["form"].validate(async (valid) => {
if (valid) {
const resp = await $.post('/platform/activity/plan' + url, {
id: this.formData.id,
name: this.formData.name,
time: this.formData.time,
content: this.formData.content,
money: this.formData.money,
event: JSON.stringify(this.formData.event),
type: '40001',
activityType: this.formData.activityType,
})
if (resp.code === 0) {
this.$notify({
title: '成功',
message: resp.msg,
type: 'success',
duration: 500,
onClose: () => {
sublime.jumpPagePjax('/platform/activity/plan/school')
}
});
}
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
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])
}
})
},
async getEvents() {
const {code, data, msg} = await $.get("/platform/activity/common/getEvents")
return data
},
async getActivityType() {
const {code, data, msg} = await $.get("/platform/activity/common/getActivityType")
return data
},
async initData() {
const id = GetQueryString("id")
this.id = id
if (id) {
const resp = await $.post('/platform/activity/plan/findOne', {id})
if (resp.code === 0) {
const cloneRow = clone(resp.data)
cloneRow.event = JSON.parse(cloneRow.event)
this.formData = cloneRow
this.$nextTick(() => {
this.initEditor()
})
}
}
},
},
async created() {
const self = this
setTimeout(function () {
self.initEditor()
}, 100)
//this.eventList = await this.getEvents()
this.activityTypeList = await this.getActivityType()
await this.initData()
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,152 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<!--#include("/platform/activity/union/addPlanCommon.html"){}#-->
</el-card>
</guava>
</div>
<script>
let E = window.wangEditor
const editors = {}
const vue = new Vue({
el: '#app',
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'plan-info': httpVueLoader('/components/activity/school/planInfo.vue'),
},
data() {
let validContent = (rule, value, callback) => {
if (!this.formData.content || !dd3s.html2txt(this.formData.content)) {
callback(new Error('请填写计划内容'));
} else {
callback();
}
};
return {
activityTypeList: [],
eventList: [],
formData: {
type: '40002',
name: '',
time: '',
event: '',
content: ''
},
formRules: {
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
money: [{required: true, message: '必填', trigger: ['blur', 'change']}],
event: [{required: true, message: '必填', trigger: ['blur']}],
activityType: [{required: true, message: '必填', trigger: ['blur']}],
content: [{validator: validContent, trigger: ['blur', 'change']}]
},
id: '',
}
},
methods: {
cancel() {
if (this.id) {
sublime.jumpPagePjax('/platform/activity/plan/union')
}
},
doHandle() {
let url = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["form"].validate(async (valid) => {
if (valid) {
const resp = await $.post('/platform/activity/plan' + url, {
id: this.formData.id,
name: this.formData.name,
time: this.formData.time,
content: this.formData.content,
money: this.formData.money,
event: JSON.stringify(this.formData.event),
type: '40002',
activityType: this.formData.activityType,
})
if (resp.code === 0) {
this.$notify({
title: '成功',
message: resp.msg,
type: 'success',
duration: 500,
onClose: () => {
sublime.jumpPagePjax('/platform/activity/plan/union')
}
});
}
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
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])
}
})
},
async getEvents() {
const {code, data, msg} = await $.get("/platform/activity/common/getEvents")
return data
},
async getActivityType() {
const {code, data, msg} = await $.get("/platform/activity/common/getActivityType")
return data
},
async initData() {
const id = GetQueryString("id")
this.id = id
if (id) {
const resp = await $.post('/platform/activity/plan/findOne', {id})
if (resp.code === 0) {
const cloneRow = clone(resp.data)
cloneRow.event = JSON.parse(cloneRow.event)
this.formData = cloneRow
this.$nextTick(() => {
this.initEditor()
})
}
}
},
},
async created() {
const self = this
setTimeout(function () {
self.initEditor()
}, 100)
//this.eventList = await this.getEvents()
this.activityTypeList = await this.getActivityType()
await this.initData()
},
})
</script>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40003
</script>
<!--#include("/platform/activity/union/layoutActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40003
</script>
<!--#include("/platform/activity/union/applyActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,20 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<script>
window.type = 40003
</script>
<!--#include("/platform/activity/union/layoutAuditActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,20 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<script>
window.type = 40003
</script>
<!--#include("/platform/activity/union/layoutPlan.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40003
</script>
<!--#include("/platform/activity/union/layoutStatisticsActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,367 @@
<style>
.el-divider {
background-color: #409EFF !important;
}
.el-divider__text {
color: #409EFF !important;
}
.el-timeline-item__timestamp {
color: #409EFF;
}
</style>
<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 class="search-item" v-if="type==1">
<div class="search-item-label">工会名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.unionId" 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 class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索
</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="活动列表" :app="this">
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize"
class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:width="column.width"
show-overflow-tooltip
:sortable="column.sortable">
<template v-if="column.prop=='time'" scope="{row}">
<span>
{{moment(row.startTime).format('YYYY-MM-DD')}} - {{moment(row.endTime).format('YYYY-MM-DD')}}
</span>
</template>
<template scope="{row}" v-else-if="column.prop=='time2'">
{{row.applyStartTime}}-{{row.applyEndTime}}
</template>
<template v-else-if="column.prop=='projectTypeName'" scope="{row}">
{{row.projectTypeName}}({{row.projectTypeCode}})
</template>
<template v-else-if="column.prop=='tussueName'" scope="{row}">
<span v-if="row.type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
<span v-if="row.type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
<span v-if="row.type==40001">校工会</span>
</template>
<template v-else-if="column.prop=='state'" scope="{row}">
{{row.state===1?'未审核':row.state===2?'审核不通过':'审核通过'}}
</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}"
:disabled="row.projectTypeCode==50004">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',row}"
:disabled="row.projectTypeCode==50004">
删除
</el-dropdown-item>
<el-dropdown-item :command="{type:'sendMsg',row}">
通知
</el-dropdown-item>
<el-dropdown-item :command="{type:'openCode',row}">
二维码
</el-dropdown-item>
<!-- <el-dropdown-item :command="{type:'export',row}">
导出人员名单
</el-dropdown-item>-->
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<tissue-info ref="info"></tissue-info>
</template>
</guava>
<send-msg ref="sendMsg" :url="url"></send-msg>
<open-qr-code ref="openQRCode" :url="url"></open-qr-code>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
actvivtyUrl: "/platform/activity/info/mange",
selectLoading: false,
userTabLoading: false,
dialogVisible: false,
url: "",
userData: [],
userList: [],
unionList: [],
pageForm: {
type: type,
year: new Date().getFullYear() + ''
},
formData: {
tissuePersonList: []
},
tableColumns: [
{prop: 'name', label: '活动名称'},
{prop: 'address', label: '活动地点'},
{prop: 'projectTypeName', label: '活动项目类型'},
{prop: 'tussueName', label: '举办单位'},
{prop: 'time', label: '活动日期'},
{prop: 'time2', label: '报名日期', width: '300'},
{prop: 'applyTime', label: '创建时间', sortable: true},
{prop: 'state', label: '审核状态', sortable: true},
],
userColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unitName', label: '所属单位'},
{prop: 'unionName', label: '所属工会'}
],
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
address: [{required: true, message: '必填', trigger: ['blur', 'change']}],
peopleNum: [{required: true, message: '必填', trigger: ['blur', 'change']}],
time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'tissue-info': httpVueLoader('/components/activity/school/tissueInfo.vue'),
'send-msg': httpVueLoader('/components/plugins/SendMsgByGroupId.vue'),
'open-qr-code': httpVueLoader('/components/plugins/OpenQRCode.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)
} else if (type === 'sendMsg') {
this.sendMsg(row)
} else if (type === 'openCode') {
this.openCode(row)
} else if (type === 'export') {
location.href = "/platform/activity/info/mange/export?id=" + row.id
}
},
openCode(row) {
this.$refs.openQRCode.openCode("/mobile/activity/unionActivity/goReg?id=" + row.id + "&signUpMethod=" + row.signUpMethod)
},
sendMsg(row) {
this.url = `<a href="` + (APP_DOMAIN + "/mobile/activity/unionActivity/goReg?id=" + row.id + "&signUpMethod=" + row.signUpMethod) + `">点击参与</a>`
this.$refs.sendMsg.openDialog(row.groupId)
},
async remoteMethod(query) {
if (query) {
this.selectLoading = true;
const {data} = await $.post(this.actvivtyUrl + "/findUser", {serachWord: query})
this.userList = data
this.selectLoading = false;
}
},
openAddUser() {
this.formData.tissuePersonList = []
this.dialogVisible = true
},
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.dialogVisible = false
},
delUser(row) {
this.userData.splice(this.userData.indexOf(row.userId), 1)
this.formData.tissuePersonList.splice(this.formData.tissuePersonList.indexOf(row.userId), 1)
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async openEdit(row) {
const {id, type} = row
if (type == 40002) {
sublime.jumpPagePjax("/platform/activity/apply/union?id=" + id)
} else if (type == 40003) {
sublime.jumpPagePjax("/platform/activity/apply/club?id=" + id)
} else {
sublime.jumpPagePjax("/platform/activity/apply/school?id=" + id)
}
/*this.$refs.guava.edit()*/
},
async openAdd() {
this.$refs.guava.edit()
this.userData = []
this.$nextTick(() => {
this.formData = {
name: '',
time: '',
peopleNum: '',
address: '',
files: [],
type: "40002",
tissuePersonList: []
}
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
})
},
async operation() {
let url = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const formData = JSON.parse(JSON.stringify(this.formData))
formData.type = this.pageForm.type
if (formData.time && formData.time.length) {
formData.startTime = formData.time[0]
formData.endTime = formData.time[1]
formData.time = undefined
}
const resp = await $.post(this.actvivtyUrl + url, {tissue: JSON.stringify(formData),})
if (resp.code === 0) {
this.pageData()
this.$refs.guava.index()
this.notifySuccess(resp.msg)
} else {
this.notifyError(resp.msg)
}
} else {
this.$notify.error({title: '错误', message: '存在未填写的的必填项'});
}
});
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除该活动吗?', '提示', {type: 'warning'}).then(async () => {
this.$set(row, "loading", true)
const resp = await $.post(this.actvivtyUrl + "/doDelete", {id: id});
if (resp.code === 0) {
this.pageData()
this.$refs.guava.index()
this.notifySuccess(resp.msg)
} else {
this.notifyError(resp.msg)
}
this.$set(row, "loading", false)
})
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post("/platform/activity/info/mange/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 created() {
this.pageData()
this.unionList = await getUnions(null)
}
})
</script>
@@ -0,0 +1,281 @@
<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 class="search-item" v-if="type==40002">
<div class="search-item-label">工会名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.unionId" 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 class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索
</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="活动列表" :app="this">
<template #func>
<el-radio-group @change="doSearch" size="small" v-model="pageForm.state">
<el-radio-button :label="i.code" v-for="i in auditList">{{i.name}}
</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize"
class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable">
<template v-if="column.prop=='time'" scope="{row}">
<span>
{{moment(row.startTime).format('YYYY-MM-DD')}} - {{moment(row.endTime).format('YYYY-MM-DD')}}
</span>
</template>
<template v-else-if="column.prop=='projectTypeName'" scope="{row}">
{{row.projectTypeName}}({{row.projectTypeCode}})
</template>
<template v-else-if="column.prop=='tussueName'" scope="{row}">
<span v-if="row.type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
<span v-if="row.type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
<span v-if="row.type==40001">校工会</span>
</template>
<template v-else-if="column.prop=='state'" scope="{row}">
{{row.state===1?'未审核':row.state===2?'审核不通过':'审核通过'}}
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作" width="150px">
<template scope="{row}">
<el-button size="mini" :loading="row.loading" @click="openView(row)">
查看
</el-button>
<el-button size="mini" :loading="row.loading" type="primary"
@click="openAudit(row)"
v-if="row.state===1">
审核
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<tissue-info ref="info"></tissue-info>
</template>
<template #edit>
<tissue-info ref="editInfo" :handle="true" label="校工会审核">
<template #handle>
<el-form :model="formData" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="username" label="审核人">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.auditTime" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.auditOpinion"
rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="danger" @click="doReview(false)" :disabled="subDis"
:loading="subLoading1">拒
绝
</el-button>
<el-button type="success" @click="doReview(true)" :disabled="subDis"
:loading="subLoading2">通
过
</el-button>
</div>
</template>
</tissue-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
auditList: [{code: true, name: "已审核"}, {code: false, name: "未审核"}],
selectLoading: false,
userTabLoading: false,
dialogVisible: false,
userData: [],
userList: [],
unionList: [],
subDis: false,
subLoading1: false,
subLoading2: false,
pageForm: {
state: false,
type: type,
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},
],
userColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unitName', label: '所属单位'},
{prop: 'unionName', label: '所属工会'}
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'tissue-info': httpVueLoader('/components/activity/school/tissueInfo.vue')
},
methods: {
openAudit(row) {
this.$refs.editInfo.getInfo(row.id)
this.$refs.guava.edit()
this.formData = {
id: row.id,
username: "${@shiro.getPrincipalProperty('username')}",
auditTime: moment().format('YYYY-MM-DD'),
}
},
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/audit/doReview", this.formData)
if (resp.code === 0) {
this.pageData()
this.$refs.guava.index()
this.notifySuccess(resp.msg)
} else {
this.notifyError(resp.msg)
}
}
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post("/platform/activity/audit/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 created() {
this.unionList = await getUnions(null)
this.pageData()
}
})
</script>
@@ -0,0 +1,406 @@
<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 = {}
const 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>
@@ -0,0 +1,177 @@
<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
@change="getActivityByYearOrType"
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-select v-model="pageForm.activityId" placeholder="请选择活动" filterable
style="width: 100%">
<el-option
v-for="item in activityList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-item" v-if="type==40002||type==40001">
<div class="search-item-label">工会名称</div>
<div class="search-item-option">
<el-select v-model="pageForm.unionId" 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 class="search-item">
<div class="search-item-label">姓名/工号</div>
<div class="search-item-option">
<el-input placeholder="请输入姓名/工号" clearable
v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend"
placeholder="姓名/工号"
style="width: 80px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginanme"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="pageData">搜索
</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="人员列表" :app="this">
<template #func>
<el-button icon="el-icon-s-promotion" type="primary" @click="doExport">导出
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize"
class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
sortable>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unionList: {},
activityList: {},
pageForm: {
unionId: '',
searchName: "u.username",
type: type,
year: new Date().getFullYear() + ''
},
tableColumns: [
{prop: 'username', label: '姓名'},
{prop: 'loginname', label: '工号'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unitname', label: '所属单位'},
{prop: 'unionname', label: '所属工会'},
{prop: 'applyDateTime', label: '报名时间'}
],
}
},
methods: {
async doExport() {
const {activityId, unionId} = this.pageForm
window.open("/platform/activity/info/mange/doExportUser?id=" + activityId +
"&unionId=" + unionId)
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post("/platform/activity/user/statistics/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.notifyError(data.msg)
}
}, "json");
},
async getActivityByYearOrType() {
const resp = await $.get("/platform/activity/user/statistics/getActivityByYearOrType", {
type: this.pageForm.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)
} else {
this.$set(this.pageForm, "activityId", null)
}
this.pageData()
}
},
},
async created() {
await this.getActivityByYearOrType()
this.unionList = await getUnions(null)
}
})
</script>
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40001
</script>
<!--#include("/platform/activity/union/layoutActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40001
</script>
<!--#include("/platform/activity/union/applyActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,20 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<script>
window.type = 40001
</script>
<!--#include("/platform/activity/union/layoutPlan.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40001
</script>
<!--#include("/platform/activity/union/layoutStatisticsActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40002
</script>
<!--#include("/platform/activity/union/layoutActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40002
</script>
<!--#include("/platform/activity/union/applyActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,20 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<script>
window.type = 40002
</script>
<!--#include("/platform/activity/union/layoutAuditActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,20 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<script>
window.type = 40002
</script>
<!--#include("/platform/activity/union/layoutPlan.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.type = 40002
</script>
<!--#include("/platform/activity/union/layoutStatisticsActivity.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,609 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.left_aside {
width: 200px;
background-color: #eaecf6;
height: 500px;
}
.left_tree {
margin-top: 10px;
margin-left: 10px;
background-color: #eaecf6;
}
.note {
width: 100%;
height: 320px;
}
.el-upload input[type=file] {
display: none;
}
.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: 128px;
height: 128px;
line-height: 128px;
text-align: center;
}
.avatar {
width: 128px;
height: 128px;
display: block;
}
</style>
<link href="${base!}/assets/platform/plugins/umeditor/themes/default/css/umeditor.min.css" type="text/css"
rel="stylesheet">
<script src="${base!}/assets/platform/plugins/umeditor/umeditor.config.js"></script>
<script src="${base!}/assets/platform/plugins/umeditor/umeditor.js"></script>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<span>站点:</span>
<el-select size="medium" v-model="site.id" placeholder="请选择" @change="siteChange">
<el-option
v-for="item in sites"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-button size="medium" @click="openAdd">
<i class="ti-plus"></i>
新建文章
</el-button>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入标题" v-model="pageForm.searchKeyword" @keyup.enter.native="doSearch">
<el-button slot="append" icon="el-icon-search" @click="doSearch"></el-button>
</el-input>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="delMore" type="danger" :disabled="selectData.length==0">
<i class="el-icon-delete"></i>
删除
</el-button>
</div>
</el-row>
<el-row style="padding-top: 50px;">
<section class="el-container">
<aside class="el-aside left_aside">
<el-tree
@node-click="treeClick"
class="left_tree"
:data="channelData"
node-key="id"
:props="defaultProps">
</el-tree>
</aside>
<main class="el-main">
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item>{{site.site_name}}</el-breadcrumb-item>
<el-breadcrumb-item>{{pageForm.channelName||'所有栏目'}}</el-breadcrumb-item>
</el-breadcrumb>
<el-row style="margin-top: 5px;">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
@selection-change="handleSelectionChange"
:default-sort="{prop: 'publishAt', order: 'descending'}"
>
<el-table-column
type="selection"
width="35">
</el-table-column>
<el-table-column label="文章标题" header-align="left" prop="title"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column sortable label="发布时间" header-align="center" prop="publishAt"
width="240">
<template slot-scope="scope">
{{formatAt(scope.row.publishAt)}} - {{formatAt(scope.row.endAt)}}
</template>
</el-table-column>
<el-table-column label="发布状态" header-align="center" align="center" prop="disabled"
width="120">
<template slot-scope="scope">
<i v-if="scope.row.disabled" class="fa fa-circle text-danger ml5"></i>
<i v-if="!scope.row.disabled" class="fa fa-circle text-success ml5"></i>
</template>
</el-table-column>
<el-table-column
prop="id"
label="操作"
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:'view',id:scope.row.id}">
预览
</el-dropdown-item>
<el-dropdown-item divided
:command="{type:'enable',id:scope.row.id,row:scope.row}">
启用
</el-dropdown-item>
<el-dropdown-item :command="{type:'disable',id:scope.row.id,row:scope.row}">
禁用
</el-dropdown-item>
<el-dropdown-item divided :command="{type:'edit',id:scope.row.id}">
修改
</el-dropdown-item>
<el-dropdown-item
:command="{type:'delete',id:scope.row.id,title:scope.row.title}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</main>
</section>
</el-row>
<el-dialog
:title="dialogTitle"
:visible.sync="dialogVisible"
width="60%">
<el-form :model="formData" ref="dialogForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="title" label="文章标题">
<el-input maxlength="255" placeholder="文章标题"
v-model="formData.title"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="author" label="文章作者">
<el-input maxlength="50" placeholder="文章作者"
v-model="formData.author"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="info" label="文章简介">
<el-input type="textarea" v-model="formData.info"></el-input>
</el-form-item>
<el-form-item prop="url" label="URL">
<el-input maxlength="50" placeholder="URL"
v-model="formData.url"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="publishAt" label="发布时间">
<el-date-picker
format="yyyy-MM-dd HH:mm:ss"
value-format="timestamp"
v-model="formData.time"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
<el-form-item prop="disabled" label="发布状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</el-form-item>
<el-form-item prop="picurl" label="标题图">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handlePicSuccess(resp,file,fileList,'picurl')}">
<img v-if="formData.picurl" :src="'${AppFileDomain!}'+formData.picurl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item prop="content" label="文章内容">
<!--一个页面中不能出现两个umeditor对象,所以新建和修改用同一个dialog来做吧-->
<script type="text/plain" id="content" class="note"></script>
<!---->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> 取 消 </el-button>
<el-button type="primary" @click="doSave"> 确 定 </el-button>
</span>
</el-dialog>
<el-dialog
title="预览文章"
:visible.sync="viewDialogVisible"
width="60%">
<el-row style="text-align: center">
<h4>{{formData.title}}</h4>
</el-row>
<el-row>
<span>作者:{{formData.author}}</span>
<span>发布时间:{{formatAt(formData.publishAt)}} - {{formatAt(formData.endAt)}}</span>
</el-row>
<el-row style="margin-top: 5px !important;margin-bottom: 5px !important;border-bottom: 1px solid #DDD;">
</el-row>
<el-row>
<span v-html="formData.content"></span>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="viewDialogVisible = false"> 关 闭 </el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
var sites = [];
<!--#for(o in siteList){#-->
sites.push({value: "${o.id!}", label: "${o.site_name!}"});
<!--#}#-->
var site = {id: "", site_name: ""};
<!--#if(!isEmpty(site)){#-->
site = {id: "${site.id}", site_name: "${site.site_name}"};
<!--#}#-->
return {
dialogVisible: false,
viewDialogVisible: false,
dialogTitle: "新建文章",
sites: sites,
site: site,
selectData: [],
pageForm: {
siteId: site.id,
channelId: "",
channelName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "publishAt",
pageOrderBy: "descending"
},
channelData: [],
defaultProps: {
children: 'children',
label: 'label'
},
tableData: [],
formData: {
id: "",
},
formRules: {
title: [
{required: true, message: '标题', trigger: 'blur'}
],
info: [
{required: false, message: '请输入文章作者', trigger: 'blur'},
{min: 0, max: 500, message: '长度500个字符以内', trigger: 'blur'}
]
},
action: "add"
}
},
methods: {
siteChange: function (val) {
window.location.href = "${base}/platform/cms/article/" + val;
},
channelLoad: function () {
var self = this;
$.post(base + "/platform/cms/article/tree/" + self.site.id, {}, function (data) {
if (data.code == 0) {
self.channelData = data.data;
}
}, "json");
},
openAdd: function () {
var self = this;
if (typeof(self.pageForm.channelId) == "undefined" || self.pageForm.channelId == "" || self.pageForm.channelId == "root") {
self.$message({
message: "请在左侧选定一个栏目",
type: 'error'
});
return false;
}
self.dialogVisible = true;
self.dialogTitle = "新建文章";
self.action = "add";
self.formData = {
id: "",
author: "${@shiro.getPrincipalProperty('username')}",
time: [
moment().format("x"),
moment("2099-12-31 23:59:59").format("x")
]
};//打开新增窗口,表单先清空
if (self.$refs["dialogForm"])
self.$refs["dialogForm"].resetFields();
UM.getEditor("content");
setTimeout(function () {
UM.getEditor("content").setContent("", false);
}, 200);
},
doSave: function () {
if ("add" == this.action) {
this.doAdd();
}
if ("edit" == this.action) {
this.doEdit();
}
},
doAdd: function () {
var self = this;
var url = base + "/platform/cms/article/addDo/" + self.site.id;
self.$refs["dialogForm"].validate(function (valid) {
if (valid) {//表单验证通过
self.formData.content = UM.getEditor("content").getContent();
self.formData.siteid = self.site.id;
self.formData.channelId = self.pageForm.channelId;
self.formData.time_param = JSON.stringify(self.formData.time);
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.dialogVisible = false;
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/cms/article/editDo";
self.$refs["dialogForm"].validate(function (valid) {
if (valid) {//表单验证通过
self.formData.content = UM.getEditor("content").getContent();
self.formData.time_param = JSON.stringify(self.formData.time);
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.dialogVisible = false;
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
delMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要删除选中的 ' + ids.length + ' 条消息? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/article/delete", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
pageOrder: function (column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange: function (val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange: function (val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData: function () {//加载分页数据
var self = this;
sublime.showLoadingbar();//显示loading
$.post(base + "/platform/cms/article/data/" + self.site.id, self.pageForm, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.tableData = data.data.list;
self.pageForm.totalCount = data.data.totalCount;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
formatAt: function (val) {
if (val > 0)
return moment(val * 1000).format("YYYY-MM-DD HH:mm");
return "";
},
handleSelectionChange: function (val) {
this.selectData = val;
},
doSearch: function () {
this.pageData();
},
treeClick: function (data, node, obj) {
this.pageForm.channelId = data.id;
this.pageForm.channelName = data.name;
this.pageData();
},
handlePicSuccess: function (response, file, fileList, attrName) {
if (response.code == 0) {
// 对象属性直接赋值不会触发试图更新,采用 Vue.set 、this.$set或者Object.assign({},this.obj)创建新对象
// 或者也可以定义一个 refresh 属性 ,当数据发生改变时,该属性同时变化,也会触发视图更新
// this.formData.site_logo =response.data;
this.$set(this.formData, attrName, response.data);
} else {
this.$set(this.formData, attrName, "");
}
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("edit" == command.type) {
$.post(base + "/platform/cms/article/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.formData.time = [
self.formData.publishAt * 1000,
self.formData.endAt * 1000
];
self.dialogVisible = true;//打开编辑窗口
self.dialogTitle = "修改文章";
self.action = "edit";
UM.getEditor("content");
setTimeout(function () {
UM.getEditor("content").setContent("" + self.formData.content, false);
}, 200);
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("view" == command.type) {
$.post(base + "/platform/cms/article/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.viewDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/cms/article/" + command.type + "/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除文章: ' + command.title, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/article/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.doSearch();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
}
},
created: function () {
this.channelLoad();
this.pageData();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,542 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<span>站点:</span>
<el-select size="medium" v-model="site.id" placeholder="请选择" @change="siteChange">
<el-option
v-for="item in sites"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-button size="medium" @click="openAdd">
<i class="ti-plus"></i>
新建栏目
</el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openSort">
排序
</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :key="tableKey" :data="tableData" style="width: 100%" size="small"
:highlight-current-row="true" row-key="id" lazy
:load="loadChild">
<el-table-column label="栏目名称" header-align="center" prop="name"
width="200" :show-overflow-tooltip="true" align="left">
</el-table-column>
<el-table-column label="栏目标识" header-align="center" prop="code"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column label="URL" header-align="center" prop="url"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column label="栏目类型" header-align="center" prop="type"
:show-overflow-tooltip="true" align="center">
<template slot-scope="scope">
<i v-if="scope.row.type=='article'">文章</i>
<i v-if="scope.row.type=='photo'">相册</i>
</template>
</el-table-column>
<el-table-column label="启用状态" header-align="center" prop="disabled" align="center"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<i v-if="scope.row.disabled"
class="fa fa-circle text-danger ml5"></i>
<i v-if="!scope.row.disabled"
class="fa fa-circle text-success ml5"></i>
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" prop="id"
:show-overflow-tooltip="true" align="center" 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:'add',id:scope.row.id,name:scope.row.name}">
添加子栏目
</el-dropdown-item>
<el-dropdown-item divided
:command="{type:'enable',id:scope.row.id,name:scope.row.name,row:scope.row}">
启用
</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 divided
:command="{type:'edit',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}"
v-if="scope.row.path!='0001'">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<el-dialog
title="新建栏目"
:visible.sync="addDialogVisible"
width="50%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="siteid" label="所属站点">
<span>{{site.site_name}}</span>
</el-form-item>
<el-form-item prop="parentId" label="上级栏目" label-width="80px">
<el-cascader v-if="!isAddFromSub"
style="width: 100%"
:options="menuOptions" :props="props" v-model="parentMenu"
tabindex="1"
placeholder="不选择则为顶级"
></el-cascader>
<el-input v-if="isAddFromSub" type="text" v-model="formData.parentName" :disabled="true"></el-input>
</el-form-item>
<el-form-item prop="name" label="栏目名称">
<el-input maxlength="100" placeholder="栏目名称"
v-model="formData.name"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="code" label="栏目标识">
<el-input maxlength="100" placeholder="栏目标识"
v-model="formData.code"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="type" label="栏目类型">
<el-radio-group v-model="formData.type">
<el-radio label="article">文章</el-radio>
<el-radio label="photo">相册</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="url" label="URL">
<el-input maxlength="100" placeholder="URL"
v-model="formData.url"
auto-complete="off" tabindex="6" type="text"></el-input>
</el-form-item>
<el-form-item prop="target" label="打开方式">
<el-radio-group v-model="formData.target">
<el-radio label="_blank">新页面</el-radio>
<el-radio label="_self">本页面</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="修改栏目"
:visible.sync="editDialogVisible"
width="50%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item label="所属站点" label-width="80px">
{{formData.siteName}}
</el-form-item>
<el-form-item prop="parentId" label="上级栏目" label-width="80px">
<el-input type="text" v-model="formData.parentName" :disabled="true"></el-input>
</el-form-item>
<el-form-item prop="name" label="栏目名称">
<el-input maxlength="100" placeholder="栏目名称"
v-model="formData.name"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="code" label="栏目标识">
<el-input maxlength="100" placeholder="栏目标识"
v-model="formData.code"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="type" label="栏目类型">
<el-radio-group v-model="formData.type">
<el-radio label="article">文章</el-radio>
<el-radio label="photo">相册</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="url" label="URL">
<el-input maxlength="100" placeholder="URL"
v-model="formData.url"
auto-complete="off" tabindex="6" type="text"></el-input>
</el-form-item>
<el-form-item prop="target" label="打开方式">
<el-radio-group v-model="formData.target">
<el-radio label="_blank">新页面</el-radio>
<el-radio label="_self">本页面</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
active-color="#ff4949"
inactive-color="#13ce66">
</el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="菜单排序"
:visible.sync="sortDialogVisible"
width="50%">
<el-tree
ref="sortMenuTree"
:data="sortMenuData"
draggable
:allow-drop="sortAllowDrop"
node-key="id"
:props="defaultProps"
>
<span class="custom-tree-node" slot-scope="scope">
<span>{{ scope.node.label }}</span>
</span>
</el-tree>
<span slot="footer" class="dialog-footer">
<el-button @click="sortDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doSort">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
var sites = [];
<!--#for(o in siteList){#-->
sites.push({value: "${o.id!}", label: "${o.site_name!}"});
<!--#}#-->
var site = {id: "", site_name: ""};
<!--#if(!isEmpty(site)){#-->
site = {id: "${site.id}", site_name: "${site.site_name}"};
<!--#}#-->
return {
addDialogVisible: false,
editDialogVisible: false,
sortDialogVisible: false,
isAddFromSub: false,
sites: sites,
site: site,
tableData: [],//后台取出的数据
tableKey:"",
formData: {
id: "",
parentId: "",
parentName: "",
type: "article",
target: "_blank"
},
formRules: {
name: [
{required: true, message: '栏目名称', trigger: 'blur'}
],
code: [
{required: true, message: '栏目标识', trigger: ['blur', 'change']}
]
},
menuOptions: [],
parentMenu: [],
sortMenuData: [],
defaultProps: {
children: 'children',
label: 'label'
},
props: {
lazy: true,
checkStrictly:true,
multiple:false,
lazyLoad: function (node, resolve) {
var url = base + "/platform/cms/channel/tree/" + site.id;
$.post(url, {pid: node.value}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
}
}
}
},
methods: {
//验证动态添加行数据
validateMenu: function (rule, value, callback) {
if (value.name == '') {
callback(new Error('权限名称不能为空'));
} else if (value.permission == '') {
callback(new Error('权限标识不能为空'));
} else {
callback();
}
},
formRadioChange: function (val) {
this.formData.children = val;
if ("true" == val) {
this.formData.buttons = [{
name: '',
permission: '',
key: Date.now()
}];
} else {
this.formData.buttons = [];
}
},
formRemoveMenu: function (menu) {
var index = this.formData.buttons.indexOf(menu);
if (index !== -1) {
this.formData.buttons.splice(index, 1);
}
},
formAddMenu: function () {
this.formData.buttons.push({
name: '',
permission: '',
key: Date.now()
});
},
//排序树加载
sortMenuLoad: function () {
var self = this;
$.post(base + "/platform/cms/channel/sort/" + self.site.id, {}, function (data) {
if (data.code == 0) {
self.sortMenuData = data.data;
}
}, "json");
},
//排序树控制不可跨级拖拽
sortAllowDrop: function (moveNode, inNode, type) {
if (moveNode.data.parentId == inNode.data.parentId) {
return type == 'prev';
}
},
//打开排序功能
openSort: function () {
this.sortDialogVisible = true;
this.sortMenuLoad();
},
//递归获取所有的ID值
getTreeIds: function (ids, data) {
var self = this;
data.forEach(function (obj) {
ids.push(obj.id);
if (obj.children && obj.children.length > 0) {
self.getTreeIds(ids, obj.children);
}
});
},
//提交排序后的数据
doSort: function () {
var self = this;
var ids = [];
self.getTreeIds(ids, self.sortMenuData);
$.post(base + "/platform/cms/channel/sortDo/" + self.site.id, {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.sortDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
openAdd: function () {
var self = this;
self.isAddFromSub = false;
self.addDialogVisible = true;
self.parentMenu = [];
self.menuOptions=[];
//表单还原为初始值
self.formData = {
id: "",
parentId: "",
parentName: "",
type: "article",
target: "_blank",
};
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
var url = base + "/platform/cms/channel/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
if (!self.isAddFromSub) {//如果不是添加子菜单,则从级联选择框取父节点ID
self.formData.parentId = self.parentMenu[self.parentMenu.length - 1] || "";
}
self.formData.siteid = self.site.id;
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/cms/channel/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
initTreeTable: function () {
var self = this;
var url = base + "/platform/cms/channel/child/" + self.site.id;
$.post(url, {pid: ""}, function (data) {
if (data.code == 0) {
self.tableData = data.data;
self.tableKey=+new Date();
}
}, "json");
},
loadChild: function (tree, treeNode, resolve) {
var self = this;
var url = base + "/platform/cms/channel/child/" + self.site.id;
$.post(url, {pid: tree.id}, function (data) {
if (data.code == 0) {
resolve(data.data);
}
}, "json");
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("add" == command.type) {
self.openAdd();
self.formData.parentId = command.id;
self.formData.parentName = command.name;
self.isAddFromSub = true;
}
if ("edit" == command.type) {
$.post(base + "/platform/cms/channel/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("enable" == command.type || "disable" == command.type) {
$.post(base + "/platform/cms/channel/" + command.type + "/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
if ("disable" == command.type) {
command.row.disabled = true;
}
if ("enable" == command.type) {
command.row.disabled = false;
}
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除栏目 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/channel/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.initTreeTable();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
},
siteChange: function (val) {
window.location.href="${base}/platform/cms/channel/"+val;
}
},
created: function () {
this.initTreeTable();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,338 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-button size="medium" @click="openAdd">
<i class="ti-plus"></i>
新建分类
</el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="delMore" type="danger" :disabled="selectData.length==0">
<i class="el-icon-delete"></i>
删除
</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
@selection-change="handleSelectionChange"
:default-sort="{prop: 'opAt', order: 'descending'}"
>
<el-table-column
type="selection"
width="35">
</el-table-column>
<el-table-column label="分类名称" header-align="left" prop="name"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column label="分类标识" header-align="left" prop="code"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column sortable label="创建时间" header-align="center" align="center" prop="opAt">
<template slot-scope="scope">
{{formatAt(scope.row.opAt)}}
</template>
</el-table-column>
<el-table-column
prop="id"
label="操作"
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:'edit',id:scope.row.id}">
修改
</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-row>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
title="新建分类"
:visible.sync="addDialogVisible"
width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="分类名称">
<el-input maxlength="100" placeholder="分类名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="code" label="分类标识">
<el-input maxlength="100" placeholder="分类标识"
v-model="formData.code"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="修改分类"
:visible.sync="editDialogVisible"
width="40%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="分类名称">
<el-input maxlength="100" placeholder="分类名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="code" label="分类标识">
<el-input maxlength="100" placeholder="分类标识"
v-model="formData.code"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
selectData: [],
pageForm: {
searchName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "opAt",
pageOrderBy: "descending"
},
tableData: [],
formData: {
id: "",
},
formRules: {
name: [
{required: true, message: '分类名称', trigger: 'blur'}
],
code: [
{required: true, message: '分类标识', trigger: 'blur'}
]
},
}
},
methods: {
pageOrder: function (column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange: function (val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange: function (val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData: function () {//加载分页数据
var self = this;
sublime.showLoadingbar();//显示loading
$.post(base + "/platform/cms/link/class/data", self.pageForm, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.tableData = data.data.list;
self.pageForm.totalCount = data.data.totalCount;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
formatAt: function (val) {
if (val > 0)
return moment(val * 1000).format("YYYY-MM-DD HH:mm");
return "";
},
handleSelectionChange: function (val) {
this.selectData = val;
},
openAdd: function () {
var self = this;
self.addDialogVisible = true;
self.formData = {
id: ""
};//打开新增窗口,表单先清空
if (self.$refs["addForm"])
self.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
var url = base + "/platform/cms/link/class/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/cms/link/class/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
delMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要删除选中的 ' + ids.length + ' 条数据? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/link/class/delete", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("edit" == command.type) {
$.post(base + "/platform/cms/link/class/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除: ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/link/class/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
}
},
created: function () {
this.pageData();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,467 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-upload input[type=file] {
display: none;
}
.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: 128px;
height: 128px;
line-height: 128px;
text-align: center;
}
.avatar {
width: 128px;
height: 128px;
display: block;
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<span>分类:</span>
<el-select size="medium" v-model="pageForm.classId" placeholder="请选择" @change="change">
<el-option
v-for="item in classs"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-button size="medium" @click="openAdd">
<i class="ti-plus"></i>
新建链接
</el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="delMore" type="danger" :disabled="selectData.length==0">
<i class="el-icon-delete"></i>
删除
</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
header-align="center"
style="width: 100%"
@selection-change="handleSelectionChange"
:default-sort="{prop: 'opAt', order: 'descending'}"
>
<el-table-column
type="selection"
width="35">
</el-table-column>
<el-table-column label="链接名称" header-align="left" prop="name"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column label="链接类型" header-align="left" prop="type"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="'txt'==scope.row.type">文字</span>
<span v-if="'img'==scope.row.type">图片</span>
</template>
</el-table-column>
<el-table-column label="链接地址" header-align="left" prop="url"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column label="打开方式" header-align="left" prop="target"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column sortable label="创建时间" header-align="center" align="center" prop="opAt">
<template slot-scope="scope">
{{formatAt(scope.row.opAt)}}
</template>
</el-table-column>
<el-table-column
prop="id"
label="操作"
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:'edit',id:scope.row.id}">
修改
</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-row>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
title="新建链接"
:visible.sync="addDialogVisible"
width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="classId" label="所属分类">
<span>{{pageForm.className}}</span>
</el-form-item>
<el-form-item prop="name" label="链接名称">
<el-input maxlength="100" placeholder="链接名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="type" label="链接类型">
<el-radio-group v-model="formData.type" @change="typeChange">
<el-radio label="txt">文字</el-radio>
<el-radio label="img">图片</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="链接图片" v-if="'img'==formData.type">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'picurl')}">
<img v-if="formData.picurl" :src="'${AppFileDomain!}'+formData.picurl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item prop="url" label="链接地址">
<el-input maxlength="100" placeholder="链接地址"
v-model="formData.url"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="target" label="打开方式">
<el-radio-group v-model="formData.target">
<el-radio label="_blank">新页面</el-radio>
<el-radio label="_self">本页面</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="修改链接"
:visible.sync="editDialogVisible"
width="40%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="80px">
<el-form-item prop="name" label="链接名称">
<el-input maxlength="100" placeholder="链接名称"
v-model="formData.name"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="type" label="链接类型">
<el-radio-group v-model="formData.type" @change="typeChange">
<el-radio label="txt">文字</el-radio>
<el-radio label="img">图片</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="链接图片" v-if="'img'==formData.type">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'picurl')}">
<img v-if="formData.picurl" :src="'${AppFileDomain!}'+formData.picurl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item prop="url" label="链接地址">
<el-input maxlength="100" placeholder="链接地址"
v-model="formData.url"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="target" label="打开方式">
<el-radio-group v-model="formData.target">
<el-radio label="_blank">新页面</el-radio>
<el-radio label="_self">本页面</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
var classs = [];
<!--#for(o in list){#-->
classs.push({value: "${o.id!}", label: "${o.name!}"});
<!--#}#-->
return {
classs: classs,
addDialogVisible: false,
editDialogVisible: false,
selectData: [],
pageForm: {
searchName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "opAt",
pageOrderBy: "descending",
classId: "${classObj.id!}",
className: "${classObj.name!}"
},
tableData: [],
formData: {},
formRules: {
name: [
{required: true, message: '分类名称', trigger: 'blur'}
]
},
}
},
methods: {
pageOrder: function (column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange: function (val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange: function (val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData: function () {//加载分页数据
var self = this;
sublime.showLoadingbar();//显示loading
$.post(base + "/platform/cms/link/link/data", self.pageForm, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.tableData = data.data.list;
self.pageForm.totalCount = data.data.totalCount;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
formatAt: function (val) {
if (val > 0)
return moment(val * 1000).format("YYYY-MM-DD HH:mm");
return "";
},
handleSelectionChange: function (val) {
this.selectData = val;
},
openAdd: function () {
var self = this;
self.addDialogVisible = true;
self.formData = {
id: "",
target: "_blank",
url: "javascript:void(0);",
type: "txt",
classId: "${classObj.id!}"
};//打开新增窗口,表单先清空
if (self.$refs["addForm"])
self.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
var url = base + "/platform/cms/link/link/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/cms/link/link/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
delMore: function () {
var self = this;
if (self.selectData.length == 0) {
self.$message({
message: "请选择消息",
type: 'warning'
});
return false;
}
var ids = [];
self.selectData.forEach(function (val) {
ids.push(val.id);
});
self.$confirm('您确定要删除选中的 ' + ids.length + ' 条数据? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/link/link/delete", {ids: ids.toString()}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("edit" == command.type) {
$.post(base + "/platform/cms/link/link/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除: ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/link/link/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
},
handleLogoSuccess: function (response, file, fileList, attrName) {
if (response.code == 0) {
// 对象属性直接赋值不会触发试图更新,采用 Vue.set 、this.$set或者Object.assign({},this.obj)创建新对象
// 或者也可以定义一个 refresh 属性 ,当数据发生改变时,该属性同时变化,也会触发视图更新
this.$set(this.formData, attrName, response.data);
} else {
this.$set(this.formData, attrName, "");
}
},
typeChange: function (val) {
if ("txt" == val) {//类型变化了要清除数据
this.formData.picurl = "";
}
},
change: function (val) {
window.location.href = "${base}/platform/cms/link/link/" + val;
}
},
created: function () {
this.pageData();
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,583 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-upload input[type=file] {
display: none;
}
.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: 128px;
height: 128px;
line-height: 128px;
text-align: center;
}
.avatar {
width: 128px;
height: 128px;
display: block;
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加站点</el-button>
</div>
</el-row>
<!-- 数据表格 -->
<el-row class="el-table-container">
<el-table
:data="tableData"
@sort-change='pageOrder'
size="small"
style="width: 100%">
<el-table-column
sortable
prop="id"
label="站点编码"
width="200">
</el-table-column>
<el-table-column
prop="site_name"
label="站点名称"
width="200">
</el-table-column>
<el-table-column
prop="site_domain"
label="域名地址">
</el-table-column>
<el-table-column
prop="1"
label="操作"
width="120">
<template 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:'edit',id:scope.row.id}">
修改
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',id:scope.row.id,name:scope.row.site_name}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<!-- 弹出框 -->
<!-- 新增 -->
<el-dialog
title="新增站点"
:visible.sync="addDialogVisible"
width="50%">
<el-form :model="formData" ref="addForm" :rules="formRules" size="small" label-width="100px">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="基本信息" name="base">
<el-form-item prop="id" label="站点编码">
<el-input maxlength="100" placeholder="站点编码"
v-model="formData.id"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_name" label="站点名称">
<el-input maxlength="100" placeholder="站点名称"
v-model="formData.site_name"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_domain" label="域名地址">
<el-input placeholder="http://"
v-model="formData.site_domain"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_icp" label="备案号">
<el-input maxlength="100" placeholder="备案号"
v-model="formData.site_icp"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item label="PC版Logo">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'site_logo')}">
<img v-if="formData.site_logo" :src="'${AppFileDomain!}'+formData.site_logo" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item label="手机版Logo">
<el-upload
class="avatar-uploader"
tabindex="6"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'site_wap_logo')}">
<img v-if="formData.site_wap_logo" :src="'${AppFileDomain!}'+formData.site_wap_logo" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item prop="footer_content" label="底部信息">
<el-input maxlength="100" placeholder="底部信息"
v-model="formData.footer_content"
auto-complete="off" tabindex="7" type="textarea"></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="联系方式" name="contact">
<el-form-item prop="site_qq" label="客服QQ">
<el-input maxlength="100" placeholder="客服QQ"
v-model="formData.site_qq"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_email" label="网站邮箱">
<el-input maxlength="100" placeholder="网站邮箱"
v-model="formData.site_email"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_tel" label="客服电话">
<el-input maxlength="100" placeholder="客服电话"
v-model="formData.site_tel"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="weibo_name" label="微博名称">
<el-input maxlength="100" placeholder="微博名称"
v-model="formData.weibo_name"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="weibo_url" label="微博地址">
<el-input maxlength="100" placeholder="微博地址"
v-model="formData.weibo_url"
auto-complete="off" tabindex="5" type="text"></el-input>
</el-form-item>
<el-form-item label="微博二维码">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'weibo_qrcode')}">
<img v-if="formData.weibo_qrcode" :src="'${AppFileDomain!}'+formData.weibo_qrcode" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
<div class="el-upload__tip" slot="tip">请上传您的微博二维码</div>
</el-upload>
</el-form-item>
<el-form-item prop="wechat_name" label="微信名称">
<el-input maxlength="100" placeholder="微信名称"
v-model="formData.wechat_name"
auto-complete="off" tabindex="6" type="text"></el-input>
</el-form-item>
<el-form-item prop="wechat_id" label="微信帐号">
<el-input maxlength="100" placeholder="微信帐号"
v-model="formData.wechat_id"
auto-complete="off" tabindex="7" type="text"></el-input>
</el-form-item>
<el-form-item label="微信二维码">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'wechat_qrcode')}">
<img v-if="formData.wechat_qrcode" :src="'${AppFileDomain!}'+formData.wechat_qrcode" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
<div class="el-upload__tip" slot="tip">请上传您的微信二维码</div>
</el-upload>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="SEO优化" name="seo">
<el-form-item prop="seo_keywords" label="网页关键词">
<el-input maxlength="100" placeholder="网页关键词"
v-model="formData.seo_keywords"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="seo_description" label="网页描述">
<el-input maxlength="100" placeholder="网页描述"
v-model="formData.seo_description"
auto-complete="off" tabindex="2" type="textarea" maxlength="120"></el-input>
</el-form-item>
</el-tab-pane>
</el-tabs>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<!-- 修改 -->
<el-dialog
title="修改站点"
:visible.sync="editDialogVisible"
width="50%">
<el-form :model="formData" ref="editForm" :rules="formRules" size="small" label-width="100px">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="基本信息" name="base">
<el-form-item prop="id" label="站点编码">
<el-input maxlength="100" placeholder="站点编码"
v-model="formData.id"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_name" label="站点名称">
<el-input maxlength="100" placeholder="站点名称"
v-model="formData.site_name"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_domain" label="域名地址">
<el-input placeholder="http://"
v-model="formData.site_domain"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_icp" label="备案号">
<el-input maxlength="100" placeholder="备案号"
v-model="formData.site_icp"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item label="LOGO">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'site_logo')}">
<img v-if="formData.site_logo" :src="'${AppFileDomain!}'+formData.site_logo" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item label="手机版Logo">
<el-upload
class="avatar-uploader"
tabindex="6"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'site_wap_logo')}">
<img v-if="formData.site_wap_logo" :src="'${AppFileDomain!}'+formData.site_wap_logo" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item prop="footer_content" label="底部信息">
<el-input maxlength="100" placeholder="底部信息"
v-model="formData.footer_content"
auto-complete="off" tabindex="7" type="textarea"></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="联系方式" name="contact">
<el-form-item prop="site_qq" label="客服QQ">
<el-input maxlength="100" placeholder="客服QQ"
v-model="formData.site_qq"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_email" label="网站邮箱">
<el-input maxlength="100" placeholder="网站邮箱"
v-model="formData.site_email"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="site_tel" label="客服电话">
<el-input maxlength="100" placeholder="客服电话"
v-model="formData.site_tel"
auto-complete="off" tabindex="3" type="text"></el-input>
</el-form-item>
<el-form-item prop="weibo_name" label="微博名称">
<el-input maxlength="100" placeholder="微博名称"
v-model="formData.weibo_name"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="weibo_url" label="微博地址">
<el-input maxlength="100" placeholder="微博地址"
v-model="formData.weibo_url"
auto-complete="off" tabindex="5" type="text"></el-input>
</el-form-item>
<el-form-item label="微博二维码">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'weibo_qrcode')}">
<img v-if="formData.weibo_qrcode" :src="'${AppFileDomain!}'+formData.weibo_qrcode" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
<div class="el-upload__tip" slot="tip">请上传您的微博二维码</div>
</el-upload>
</el-form-item>
<el-form-item prop="wechat_name" label="微信名称">
<el-input maxlength="100" placeholder="微信名称"
v-model="formData.wechat_name"
auto-complete="off" tabindex="6" type="text"></el-input>
</el-form-item>
<el-form-item prop="wechat_id" label="微信帐号">
<el-input maxlength="100" placeholder="微信帐号"
v-model="formData.wechat_id"
auto-complete="off" tabindex="7" type="text"></el-input>
</el-form-item>
<el-form-item label="微信二维码">
<el-upload
class="avatar-uploader"
tabindex="5"
action="${base}/open/file/upload/image"
name="Filedata"
:show-file-list="false"
:on-success="function(resp,file,fileList){return handleLogoSuccess(resp,file,fileList,'wechat_qrcode')}">
<img v-if="formData.wechat_qrcode" :src="'${AppFileDomain!}'+formData.wechat_qrcode" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
<div class="el-upload__tip" slot="tip">请上传您的微信二维码</div>
</el-upload>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="SEO优化" name="seo">
<el-form-item prop="seo_keywords" label="网页关键词">
<el-input maxlength="100" placeholder="网页关键词"
v-model="formData.seo_keywords"
auto-complete="off" tabindex="1" type="text"></el-input>
</el-form-item>
<el-form-item prop="seo_description" label="网页描述">
<el-input maxlength="100" placeholder="网页描述"
v-model="formData.seo_description"
auto-complete="off" tabindex="2" type="textarea" maxlength="120"></el-input>
</el-form-item>
</el-tab-pane>
</el-tabs>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
addDialogVisible: false,
editDialogVisible: false,
tableData: [],
pageForm: {
siteName: "",
siteDomain: "",
pageSize: 10,
pageNumber: 1,
pageOrderName: "",
pageOrderBy: "",
totalCount: 0
},
activeName: "base",
formData: {
id: "",
site_name: "",
site_domain: "",
site_logo: ""
},
imageUrl: "",
formRules: {
id: [
{required: true, message: '请输入站点编码', trigger: 'blur'},
],
site_name: [
{required: true, message: '请输入站点名', trigger: 'blur'},
],
site_email: [
{type: "email", message: '请输入正确的邮箱地址', trigger: 'blur'},
],
seo_description: [
{max: 120, message: '描述请不要超过 120 个字符', trigger: 'blur'},
],
}
}
},
methods: {
openAdd: function () {
this.addDialogVisible = true;
this.formData = {};//打开新增窗口,表单先清空
},
doAdd: function () {
var self = this;
var url = base + "/platform/cms/site/addDo";
self.$refs["addForm"].validate(function (valid) {
if (valid) {//表单验证通过
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.addDialogVisible = false;
self.activeName = "base";
self.pageData();//重新加载分页数据
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
doEdit: function () {
var self = this;
var url = base + "/platform/cms/site/editDo";
self.$refs["editForm"].validate(function (valid) {
if (valid) {
$.post(url, self.formData, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.editDialogVisible = false;
self.activeName = "base";
self.pageData();//重新加载分页数据
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
});
},
pageOrder: function (column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange: function (val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange: function (val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
beforeImageUpload: function (file) {
},
handleLogoSuccess: function (response, file, fileList, attrName) {
if (response.code == 0) {
// 对象属性直接赋值不会触发试图更新,采用 Vue.set 、this.$set或者Object.assign({},this.obj)创建新对象
// 或者也可以定义一个 refresh 属性 ,当数据发生改变时,该属性同时变化,也会触发视图更新
// this.formData.site_logo =response.data;
this.$set(this.formData, attrName, response.data);
} else {
this.$set(this.formData, attrName, "");
}
},
pageData:function() {//加载分页数据
var self = this;
sublime.showLoadingbar();//显示loading
$.post(base + "/platform/cms/site/data", self.pageForm, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.tableData = data.data.list;
self.pageForm.totalCount = data.data.totalCount;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
dropdownCommand: function (command) {//监听下拉框事件
var self = this;
if ("edit" == command.type) {
$.post(base + "/platform/cms/site/edit/" + command.id, {}, function (data) {
if (data.code == 0) {
self.formData = data.data;//加载后台表单数据
self.editDialogVisible = true;//打开编辑窗口
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
if ("delete" == command.type) {
self.$confirm('此操作将删除站点 ' + command.name, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: function (a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/cms/site/delete/" + command.id, {}, function (data) {
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
}
}
},
created: function () {
this.pageData();
}
});
</script>
<!--#}#-->
@@ -0,0 +1,155 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 在 head 标签中添加 meta 标签,并设置 viewport-fit=cover 值 -->
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover">
<title>签字</title>
<!-- 引入样式文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.5/lib/index.css">
<link rel="stylesheet" href="https://res.wx.qq.com/open/libs/weui/2.2.0/weui.min.css">
<!-- 引入 Vue 和 Vant 的 JS 文件 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vant@2.5/lib/vant.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/1.11.0/jquery.min.js"></script>
<script src="/assets/platform/plugins/moment/moment.min.js"></script>
<script src="/assets/platform/js/signature.min.js"></script>
</head>
<style>
[v-clock] {
display: none
}
</style>
<body style="height: 100%;width: 100%">
<div v-clock id="app" style="height: 100%;width: 100%">
<van-row style="margin-top: 10vh;text-align: center">
<h3 style="color: #1989fa">提示:请在下方区域签字!</h3>
</van-row>
<van-row style="margin-top: 20px">
<canvas id="canvas" style="border: rgb(220,220,220) 1px solid"></canvas>
</van-row>
<van-row style="margin-top: 20px">
<van-col span="24" style="text-align: center">
<van-row type="flex" justify="space-around">
<van-col span="11">
<van-button @click="reset" type="default" size="large">清 空</van-button>
</van-col>
<van-col span="11">
<van-button type="info" @click="doSub" size="large" :disabled="subDis">提 交</van-button>
</van-col>
</van-row>
</van-col>
</van-row>
</div>
<script>
document.body.addEventListener('touchmove', function (e) {
e.preventDefault(); //阻止默认的处理方式(阻止下拉滑动的效果)
}, {passive: false}); //passive 参数不能省略,用来兼容ios和android
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
return '';
}
var qmoption = {
el: '#canvas',
lineWidth: 4,
lineColor: '#000',
overflow: false,
background: '#fff'
}
var qm
var
vue = new Vue({
el: "#app",
data: function () {
return {
prefix: '',
id: '',
base64: '',
subDis: false,
isNull: function (val) {
if (val === null || val === undefined || val === '') {
return true
}
return false
},
}
},
filters: {
none2str: function (value) {
if (vue.isNull(value)) {
return '暂无'
}
return value
}
},
methods: {
reset() {
qm.reset()
},
doSub() {
qm.getContentBase64(false, (val) => {
this.base64 = val
})
$.post("/signature/doSub", {
prefix: this.prefix,
id: this.id,
base64: this.base64
}, (data) => {
if (data.code == 0) {
this.$notify({
message: data.msg,
type: 'success'
});
this.subDis = true
} else {
this.$notify({
message: data.msg,
type: 'danger'
});
}
}, "json");
}
},
mounted: () => {
canvas = document.getElementById("canvas");
if (canvas.width < window.innerWidth) {
canvas.width = window.innerWidth;
}
if (canvas.height < window.innerHeight) {
canvas.height = window.innerHeight * 0.5;
}
qm = new Signature(qmoption);
qm.create();
},
created: function () {
if (this.isNull(getQueryVariable("id")) || this.isNull(getQueryVariable("prefix"))) {
this.$notify({
message: '缺少参数!',
type: 'danger'
});
this.subDis = true
}
this.id = getQueryVariable("id")
this.prefix = getQueryVariable("prefix")
}
})
</script>
</body>
</html>
@@ -0,0 +1,554 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#app {
display: flex;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
background-color: #f0f2f5;
}
.box-card {
width: calc(100% - 50px);
height: calc(100% - 50px);
position: relative;
}
.box-card .el-card__body {
height: calc(100% - 67px - 20px);
position: relative;
}
.box-card-title {
font-size: 20px;
}
.card-body {
display: flex;
justify-content: center;
height: 100%;
position: relative;
}
.card-body-center {
width: 60%;
min-width: 800px;
height: 100%;
position: relative;
}
.card-body-center-bottom {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
display: flex;
justify-content: center;
}
.card-body-center-bottom button {
margin: 0 10px;
}
.card-body-center > .el-carousel {
height: calc(100% - 120px);
position: relative;
overflow-y: hidden;
margin-top: 10px;
}
.card-body-center > .el-carousel > .el-carousel__container {
height: 100%;
}
.carousel-table-item {
display: flex;
justify-content: center;
width: 100%;
height: 100%;
padding: 10px 0;
}
.carousel-table-item-center {
height: 100%;
width: 90%;
min-width: 800px;
position: relative;
}
.carousel-table-item-center .card-body {
position: relative;
}
.checkGroup {
display: flex;
flex-direction: column;
overflow-y: scroll;
padding-right: 10px;
height: 100%;
}
.checkGroup .el-radio, .checkGroup .el-checkbox {
padding: 12px;
margin: 0 !important;
margin-top: 15px !important;
}
.checkGroup .el-checkbox__label {
width: calc(100% - 16px);
}
.carousel-table-item-relation .el-card__body {
position: relative;
height: 100%;
}
.carousel-table-item-form .el-card__body {
position: relative;
height: 100%;
overflow-y: auto;
}
</style>
<div id="app" v-cloak>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="box-card-title">DataKid</span>
</div>
<div class="card-body">
<div class="card-body-center">
<el-steps :active="active" align-center>
<el-step title="选择数据表" icon="el-icon-document-copy"></el-step>
<el-step title="选择数据列" icon="el-icon-s-unfold"></el-step>
<el-step title="数据列对应" icon="el-icon-s-operation"></el-step>
<el-step title="提交数据" icon="el-icon-upload"></el-step>
<el-step title="导入结果" icon="el-icon-bell"></el-step>
</el-steps>
<el-carousel indicator-position="none" :autoplay="false" arrow="never" ref="carousel"
direction="vertical">
<!--表选择-->
<el-carousel-item class="carousel-table-item">
<el-card class="carousel-table-item-center">
<div slot="header" class="clearfix">
<el-input style="width: 200px" v-model="tableNameKeyWord" placeholder="请输入关键字查询"
clearable></el-input>
<el-button type="primary" icon="el-icon-search" @click="tableNameSearch"></el-button>
<el-button v-if="formData.tableName" style="float: right; padding: 10px 0" type="text">
当前选中:{{formData.tableName}}
</el-button>
</div>
<el-radio-group class="checkGroup" v-model="formData.tableName">
<el-radio v-for="item in tableOptionsClone" :key="item.table_name"
:label="item.table_name" border>
{{item.table_name}}{{item.table_comment?' ( '+item.table_comment+' )':''}}<span
style="float: right;color: #F56C6C">rows: {{item.table_rows}}</span>
</el-radio>
</el-radio-group>
</el-card>
</el-carousel-item>
<!--列选择-->
<el-carousel-item class="carousel-table-item">
<el-card class="carousel-table-item-center">
<div slot="header" class="clearfix">
<el-input style="width: 200px" v-model="columnNameKeyWord" placeholder="请输入关键字查询"
clearable></el-input>
<el-button type="primary" icon="el-icon-search" @click="columnSearch"></el-button>
<el-button style="float: right; padding: 10px 0" type="text">
{{formData.tableName}}
</el-button>
</div>
<el-checkbox-group class="checkGroup" v-model="formData.columns">
<el-checkbox v-for="item in columnOptionsClone" :key="item.column_name"
:label="item.column_name" border>
{{item.column_name}}{{item.column_comment?' ( '+item.column_comment+' )':''}}<span
style="float: right;color: #F56C6C">{{item.column_type}}</span>
</el-checkbox>
</el-checkbox-group>
</el-card>
</el-carousel-item>
<!--列对应-->
<el-carousel-item style="padding: 10px" class="carousel-table-item">
<el-card style="width: 100%" class="carousel-table-item-relation">
<el-table
:data="relation" height="100%"
style="width: 100%" border size="medium">
<el-table-column
prop="column_name"
label="列名">
</el-table-column>
<el-table-column
prop="column_comment"
label="描述" show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="is_nullable"
label="可为空">
</el-table-column>
<el-table-column
prop="column_type"
label="类型">
</el-table-column>
<el-table-column
prop="column_key"
label="key">
</el-table-column>
<el-table-column min-width="200px">
<template slot="header" slot-scope="scope">
目标列
<el-popover
placement="top-start"
title="提示"
trigger="hover"
content="excel对应的表头名称,用于和表数据列对应">
<i slot="reference" class="el-icon-question"></i>
</el-popover>
</template>
<template slot-scope="{row}">
<el-input
v-model="row.relation"
size="medium"
placeholder="目标列"/>
</template>
</el-table-column>
</el-table>
</el-card>
</el-carousel-item>
<!--提交-->
<el-carousel-item style="padding: 10px" class="carousel-table-item">
<el-card style="width: 100%" class="carousel-table-item-form">
<el-form label-width="120px" :model="formData" ref="form" :rules="formRules">
<el-form-item label="&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-form-item prop="method" label="导入方式">
<el-radio-group v-model="formData.method">
<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-form-item>
<el-form-item v-if="[1,3].includes(formData.method)" prop="field" label="关键字段">
<el-select v-model="formData.field" placeholder="请选择" style="width:50%">
<el-option
v-for="item in relation"
:key="item.column_name"
:label="item.column_name"
:value="item.column_name">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="plugins" label="可选插件">
<el-checkbox-group v-model="formData.plugins">
<el-checkbox v-for="v in plugins" :label="v.name" border>{{v.description}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="文&emsp;&emsp;件" class="is-required">
<el-upload
drag
name="file"
ref="upload"
action="****"
:on-remove="handleRemove"
:on-change="handleChange"
:auto-upload="false"
:limit="1"
:file-list="fileList">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip" style="color: #F56C6C">
只能上传 xls/xlsx 文件
</div>
</el-upload>
</el-form-item>
</el-form>
</el-card>
</el-carousel-item>
<!--结果-->
<el-carousel-item style="padding: 10px">
<el-card style="width: 100%">
<div style="display: flex;justify-content: center;align-items: center;flex-direction:column ">
<el-progress type="circle" :percentage="result.success/result.total*100"
status="success"></el-progress>
<div style="font-size: 12px;color: rgb(100,100,100);margin-top: 20px">总记录数
{{result.total}} 条,成功
{{result.success}} 条!
</div>
<div style="margin-top: 5px" v-if="result.cacheKey">
<el-link type="primary" style="font-size: 12px;"
:href="loc()+'/exportErrors?cacheKey='+result.cacheKey">下载错误记录
</el-link>
</div>
</div>
</el-card>
</el-carousel-item>
</el-carousel>
<div class="card-body-center-bottom">
<el-button size="medium" @click="prev" :disabled="active==0||loading">上一步</el-button>
<el-button type="primary" size="medium" :loading="loading" @click="active<4?next():carry()">
{{active<4?'下一步':'完成'}}
</el-button>
</div>
</div>
</div>
</el-card>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
active: 0,
result: {success: 0, total: 0},
loading: false,
/*提交数据*/
/*start*/
fileList: [],
plugins: {},
formRules: {
method: [{required: true, message: '必填', trigger: ['blur', 'change']}],
field: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
/*end*/
/*列对应*/
/*start*/
relation: [],
/*end*/
/*tableColumn*/
/*start*/
columnOptions: [],
columnOptionsClone: [],
columnNameKeyWord: '',
/*end*/
/*tableName*/
/*start*/
tableNameKeyWord: '',
tableOptions: [],
tableOptionsClone: [],
cacheTableName: '',
/*end*/
formData: {
tableName: '',
columns: [],
method: 1,
plugins: [],
}
}
},
components: {},
filters: {},
methods: {
carry() {
this.formData = {
tableName: '',
columns: [],
method: 1,
plugins: [],
}
this.relation = []
this.fileList = []
this.active = 0
this.$refs.carousel.next()
},
async next() {
const {active} = this
if (active == 0) {
if (!this.formData.tableName) {
this.$notify({
title: '警告',
message: '请选择数据表',
type: 'warning'
});
return
}
if (this.cacheTableName != this.formData.tableName) {
this.loadColumn()
this.formData.columns = []
this.cacheTableName = this.formData.tableName
}
} else if (active == 1) {
if (!this.formData.columns || !this.formData.columns.length) {
this.$notify({
title: '警告',
message: '请选择数据列',
type: 'warning'
});
return
}
this.genRelation()
} else if (active == 2) {
if (this.relation.find(v => !v.relation)) {
this.$notify({
title: '警告',
message: '存在未填写的目标列',
type: 'warning'
});
return
}
} else if (active == 3) {
await this.doSubmit()
}
this.$refs.carousel.next()
this.active++
},
prev() {
this.$refs.carousel.prev()
this.active--
},
async doSubmit() {
let Break = false
this.$refs["form"].validate((valid) => {
if (!valid || !this.fileList.length) {
this.$notify({
title: '警告',
message: '存在未填写的必填项',
type: 'warning'
});
Break = true
return
}
})
if (Break) return
this.loading = true
let formData = new FormData()
for (let key in this.formData) {
formData.append(key, this.formData[key])
}
formData.append("relation", JSON.stringify(this.relation))
this.fileList.forEach((val) => {
formData.append("file", val.raw, val.raw.name);
});
const {code, data, msg} = await $.ajax({
url: loc() + "/importData",
type: "post",
data: formData,
processData: false,
contentType: false,
});
this.loading = false
if (code) {
this.$notify.error({
title: '错误',
message: msg
});
this.result = {success: 0, total: 0}
return
}
this.result = data
},
/*提交数据*/
/*start*/
handleRemove(file, fileList) {
this.fileList = fileList;
},
handleChange(file, fileList) {
const remove = () => {
for (let i = 0; i < fileList.length; i++) {
if (file == fileList[i]) {
fileList.splice(i, 1);
}
}
}
if (file.size == 0) {
this.$message.warning("您选择的是空文件!");
remove()
}
const type = ['xls', 'xlsx'].includes(file.name.split('.').pop().toLowerCase())
if (!type) {
this.$message.warning('上传文件只能是' + ['xls', 'xlsx'].map(v => v.toLowerCase()).join("/") + '格式!');
remove()
}
this.fileList = fileList;
},
async loadPlugins() {
this.plugins = await getEnumOptions("DataImportPluginHandle")
},
/*end*/
/*数据列对应*/
/*start*/
genRelation() {
this.relation = this.columnOptions.filter(v => this.formData.columns.includes(v.column_name))
},
/*end*/
/*tableName*/
/*start*/
columnSearch() {
if (!this.columnNameKeyWord) {
this.columnOptionsClone = clone(this.columnOptions)
return
}
this.columnOptionsClone = this.columnOptions.filter(v => v.column_name.toLowerCase().indexOf(this.columnNameKeyWord.toLowerCase()) != -1 || v.column_comment.toLowerCase().indexOf(this.columnNameKeyWord.toLowerCase()) != -1)
},
async loadColumn() {
const {tableName} = this.formData
const {data} = await $.get(loc() + '/columns', {tableName})
this.columnOptions = data
this.columnOptionsClone = clone(data)
},
/*end*/
/*tableName*/
/*start*/
tableNameSearch() {
if (!this.tableNameKeyWord) {
this.tableOptionsClone = clone(this.tableOptions)
return
}
this.tableOptionsClone = this.tableOptions.filter(v => v.table_name.toLowerCase().indexOf(this.tableNameKeyWord.toLowerCase()) != -1 || v.table_comment.toLowerCase().indexOf(this.tableNameKeyWord.toLowerCase()) != -1)
},
async loadTableName() {
const {data} = await $.get(loc() + '/tableNames')
this.tableOptions = data
this.tableOptionsClone = clone(data)
}
/*end*/
},
created() {
this.loadTableName()
this.loadPlugins()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,542 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#app {
width: 100%;
height: 100%;
}
.w-e-text-container {
height: 200px !important;
}
input[type="file"] {
display: none
}
.el-select-dropdown {
z-index: 99999999 !important;
}
.el-loading-mask {
z-index: 99999999 !important;
}
</style>
<style>
.v-tree-layout-left .v-tree {
width: 100%;
}
.v-tree-layout-left .custom-tree-node {
width: 90%;
position: relative;
}
.v-tree-layout-left .v-tree .v-node {
width: 100%;
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<tree-layout style="height: calc(100vh - 50px)">
<template #tree>
<div style="padding: 20px;border-right: 2px solid rgb(240,240,240);padding-bottom: 20px">
<el-input
placeholder="输入关键字进行查找"
v-model="filterText">
</el-input>
</div>
<el-tree ref="tree" :data="treeData" class="v-tree" v-loading="treeLoading" node-key="id"
:props="defaultProps"
default-expand-all :expand-on-click-node="false"
@node-click="handleNodeClick" accordion @node-expand="nodeExpand"
highlight-current :filter-node-method="filterNode">
<div class="custom-tree-node" slot-scope="{ node, data }">
<div v-if="node.level==1" style="font-size: 16px;" class="v-node"><i
class="el-icon-s-home"></i>&nbsp;
{{ data.name }}
</div>
<div v-if="node.level==2"
style="font-size: 15px" :title="data.name" class="v-node">
<i class="el-icon-star-on" v-if="checkData.name==data.name"></i>
<i class="el-icon-star-off" v-else></i>
&nbsp; {{ data.name }}
</div>
<div v-if="node.level==3"
style="font-size: 14px" :title="data.name" class="v-node">
<i class="fa fa-dot-circle-o" v-if="checkData.name==data.name"></i>
<i class="fa fa-circle-o" v-else></i>
&nbsp; {{ data.name }}
</div>
<div v-if="node.level>3"
style="font-size: 14px" :title="data.name" class="v-node">
<i class="fa fa-dot-circle-o" v-if="checkData.name==data.name"></i>
<i class="fa fa-circle-o" v-else></i>
&nbsp; {{ data.name }}
</div>
</div>
</el-tree>
</template>
<template>
<template>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="单位名称" value="name"></el-option>
<el-option label="单位代码" value="unitcode"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<div class="btn-group tool-button" v-if="checkNode.level==1">
<!--#if(@shiro.hasRole('sysadmin')){#-->
<el-button icon="el-icon-refresh" v-loading="loading"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"@click="dataUpdate">更新组织机构</el-button>
<!--#}#-->
</div>
<!-- <div class="btn-group tool-button">-->
<!-- <el-button icon="el-icon-plus" @click="openAdd">新建单位</el-button>-->
<!-- </div>-->
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading" size="medium">
<el-table-column align="center" :key="1" header-align="center" 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" header-align="center" label="单位名称"
prop="name"></el-table-column>
<el-table-column align="center" header-align="center" label="单位代码"
prop="unitcode"></el-table-column>
<el-table-column label="单位等级" header-align="center" prop="unitlevel"
:show-overflow-tooltip="true" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.unitlevel==1" size="mini" type="success" round
style=" vertical-align: middle;">1级
</el-button>
<el-button v-if="scope.row.unitlevel==2" size="mini" type="warning" round
style=" vertical-align: middle;">2级
</el-button>
<el-button v-if="scope.row.unitlevel==3" size="mini" type="danger" round
style=" vertical-align: middle;">3级
</el-button>
<el-button v-if="scope.row.unitlevel>3" size="mini" type="info" round
style=" vertical-align: middle;">{{scope.row.unitlevel}}级
</el-button>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
width="200px">
<template slot-scope="{row}">
<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:'view',data:row}">-->
<!-- 查看-->
<!-- </el-dropdown-item>-->
<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-row>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</template>
</template>
</tree-layout>
</template>
<template #edit>
<el-divider content-position="left"><span style="color: rgb(121, 187, 255)">请填写以下单位信息</span>
</el-divider>
<el-form :model="formData" ref="form" :rules="formRules" label-position="top"
label-width="120px"
style="padding: 0 30px">
<el-row gutter="30">
<el-col :span="24">
<el-form-item label="上级单位">
<el-input maxlength="100" disabled :value="checkData.name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位名称" prop="name">
<el-input maxlength="100" placeholder="请输入单位名称" v-model="formData.name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位代码" prop="unitcode">
<el-input maxlength="100" placeholder="请输入协会编码" v-model="formData.unitcode"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位简称" prop="aliasName">
<el-input maxlength="100" placeholder="请输入单位简称" v-model="formData.aliasName"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="telephone">
<el-input maxlength="100" placeholder="请输入联系电话" v-model="formData.telephone"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位邮箱" prop="email">
<el-input maxlength="100" placeholder="请输入单位邮箱" v-model="formData.email"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位网站" prop="website">
<el-input maxlength="100" placeholder="请输入单位网站" v-model="formData.website"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="单位地址" prop="address">
<el-input maxlength="100" placeholder="请输入单位地址" v-model="formData.address"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="单位介绍" prop="note">
<el-input maxlength="500" type="textarea" placeholder="请输入单位介绍"
v-model="formData.note"></el-input>
</el-form-item>
</el-col>
</el-row>
<div style="display: flex;justify-content:flex-end;margin-top: 30px">
<el-button type="primary" :loading="loading" @click="!formData.id?doAdd():doEdit()">提 交
</el-button>
</div>
</el-form>
</template>
</guava>
</div>
<script>
var E = window.wangEditor
const vue = new Vue({
el: '#app',
data() {
return {
loading: false,
filterText: '',
defaultProps: {
children: 'child',
label: 'name',
},
exKeys: ['0'],
activeName: [],
typeOptions: [],
treeLoading: true,
tabLoading: false,
formData: {},
detailData: {},
treeData: [],
tableData: [],
pageForm: {
searchName: "name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
code: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
checkNode: {level: 1},
checkData: {},
campusOptions: [],
loading: false,
}
},
components: {
'tree-layout': httpVueLoader('/components/plugins/TreeLayout.vue'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
methods: {
//单位数据更新
async dataUpdate(){
this.$confirm('您确定要更新组织机构吗, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async() => {
this.loading=true;
const resp = await $.get(loc() + "/dataUpdate")
if (resp.code == 0) {
this.loading=false;
this.$message({
message: '更新成功',
type: 'success'
});
this.pageData();
}else{
this.loading=false;
this.$message.error('更新失败');
}
}).catch(() => {
this.$message({
type: 'info',
message: '已取消更新'
});
});
},
dropdownCommand: function (command) {
const {type, data} = command
if (type == 'view') {
} else if (type == 'edit') {
this.openEdit(data.id)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
filterNode(value, data, node) {
if (!value) return true;
return data.name.indexOf(value) !== -1
return false
},
nodeExpand(data, node, e) {
},
async handleNodeClick(data, node) {
this.checkData = data
this.checkNode = node
this.doSearch()
},
doDelete(id) {
this.$confirm('确定要删除该单位吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
$.post(loc() + "/doDelete", {id}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.loadTree(false)
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
doEdit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.loading = true
const resp = await $.post(loc() + "/doEdit", this.formData)
requestLaterMsgFun(this, resp, () => {
this.loadTree(false)
this.pageData();
}, null, () => {
this.loading = false
this.$refs.guava.index()
})
}
});
},
async openEdit(id) {
const resp = await $.get(loc() + "/findOne", {id})
requestLaterFun(resp, (data) => {
this.formData = data
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
}, (data, msg) => {
this.$message({
message: msg,
type: 'error'
});
})
},
doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.loading = true
const resp = await $.post(loc() + "/doAdd", this.formData)
requestLaterMsgFun(this, resp, () => {
this.loadTree(false)
this.pageData();
}, null, () => {
this.loading = false
this.$refs.guava.index()
})
}
});
},
openAdd() {
const {id, unitlevel} = this.checkData
this.formData = {
parentId: id,
unitlevel: unitlevel + 1
}
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
}
,
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
}
,
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
}
,
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
}
,
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
this.pageForm.parentId = this.checkData.id
$.post(base + "/platform/sys/unit/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async loadTree(flush) {
this.treeLoading = true
const {code, data, msg} = await $.get("/platform/sys/unit/getUnitTreeData")
this.treeLoading = false
if (code == 0) {
this.treeData = data
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
if (flush && code == 0) {
this.checkData = data[0]
this.pageData();
}
},
},
async created() {
this.loadTree(true)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,273 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-date-picker
style="width: 150px"
v-model="pageForm.importDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="拉取日期">
</el-date-picker>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 100px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<el-row class="btn-group tool-button mt5">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 200px;" clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-row>
<div class="btn-group tool-button mt5">
<dict-select v-model="pageForm.personType" style="width: 200px" clearable placeholder="人员类型"
code="UserType"></dict-select>
</div>
<div class="btn-group tool-button mt5">
<dict-select v-model="pageForm.userState" style="width: 200px" clearable placeholder="在职状态"
code="UserState"></dict-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<!-- <div class="pull-right offscreen-right mt5">
<div class="btn-group tool-button">
<el-button type="primary" @click="transUnit2">全部设为二级单位
</el-button>
</div>
<div class="btn-group tool-button" v-show="selection.length">
<el-button icon="el-icon-delete" type="danger" :loading="delLoading" @click="doDeleteUsers">删除
</el-button>
</div>
<div class="btn-group tool-button">
<el-button type="primary" :loading="pullLoading" @click="pull">
拉取<i class="el-icon-download"></i>
</el-button>
</div>
</div>-->
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="tableData" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" ref="table" @selection-change="handleSelectionChange">
<el-table-column :reserve-selection="true"
type="selection"
width="30">
</el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="70px"></el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="姓名" prop="username" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="性别" prop="sex" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="联系电话" prop="mobile" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="出生日期" prop="birthday" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="身份证" prop="idcard" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="人员类型" prop="personType" header-align="center" sortable
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="在职状态" prop="userState" header-align="center" sortable
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="所属单位" prop="unitid" header-align="center"
align="center" show-overflow-tooltip sortable>
<template scope="{row}">
<span v-if="row.unitid"> {{row.unitname}}({{row.unitid}})</span>
</template>
</el-table-column>
<el-table-column label="拉取时间" prop="pullTime" min-width="100px" header-align="center" sortable
align="center" show-overflow-tooltip></el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
min-width="80px">
<template scope="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:'view',data:scope.row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:scope.row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<el-tabs v-model="active">
<el-tab-pane label="个人信息" name="info">
<member ref="memberInfo" source="user_source" :id="userId" view></member>
</el-tab-pane>
</el-tabs>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
active: 'info',
pullLoading: false,
pageForm: {
searchName: "username",
},
userId: "",
unions: [],
units: [],
active: 'info',
delLoading: false,
selection: [],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'mem-change-records': httpVueLoader('/components/member/MemChangeRecords.vue?v=1.0.2'),
},
methods: {
actionDropdownCommand(command) {
const {action} = command
if (action === 'transUnit2') {
this.transUnit2()
}
},
transUnit2() {
this.$confirm('是否需要将所有用户的所属单位转化为其所在的二级单位?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.post(loc() + '/transUnit2')
requestLaterMsgFun(this, resp, () => {
this.pageData()
})
})
},
async doDeleteUsers() {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.delLoading = true
const resp = await $.post(loc() + "/delete", {ids: JSON.stringify(this.selection.map(v => v.id))})
requestLaterMsgFun(this, resp, async () => {
this.$refs.table.clearSelection();
this.doSearch()
}, null, () => {
this.delLoading = false
})
})
},
handleSelectionChange(val) {
this.selection = val;
},
pull() {
this.$confirm('确定要从数据中心拉取数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.pullLoading = true
const resp = await $.post(loc() + '/pull')
requestLaterMsgFun(this, resp, () => {
this.pageData()
}, null, () => {
this.pullLoading = false
})
})
},
doDelete(userId) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const resp = await $.post(loc() + "/delete", {ids: JSON.stringify([userId])});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
})
}
}
});
},
openView(userId) {
this.active = 'info'
this.userId = userId
this.$refs.guava.view()
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data.id)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
},
async created() {
this.pageData();
this.units = await getUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,348 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 60px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
/*.query-row:not(:last-child,:first-child) {*/
/* height: 70px;*/
/*}*/
.query-row-title {
width: 100px;
}
.el-table__header-wrapper th {
padding: 5px 0 !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-row class="navbar bg-white shadow" style="margin-bottom: 5px;padding: 0px 10px;padding-bottom: 5px">
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">基础查询:</el-col>
<el-col class="query-row-content">
<div class="btn-group tool-button">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 100px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
<el-row class="btn-group tool-button">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 200px;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-row>
<div class="btn-group tool-button">
<dict-select v-model="pageForm.personType" style="width: 200px" clearable placeholder="人员类型"
code="UserType"></dict-select>
</div>
<div class="btn-group tool-button">
<dict-select v-model="pageForm.userState" style="width: 200px" clearable placeholder="在职状态"
code="UserState"></dict-select>
</div>
<div class="btn-group tool-button">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
<span style="color: red">温馨提示:自己维护数据</span>
</div>
<!-- <div class="pull-right offscreen-right">
<div class="btn-group tool-button">
<el-button slot="reference" icon="el-icon-refresh" type="primary"
@click="checkSource" :loading="updateLoading">
更新
</el-button>
</div>
</div>-->
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">异动查询:</el-col>
<el-col class="query-row-content">
<div class="btn-group tool-button">
<el-date-picker
style="width: 200px"
v-model="pageForm.changeDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="更新日期">
</el-date-picker>
</div>
<div class="btn-group tool-button">
<enum-select v-model="pageForm.changeType" value="code" label="description"
style="width: 200px"
clearable placeholder="异动类型" enum="UserChangeType"></enum-select>
</div>
<div class="btn-group tool-button">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
<el-button type="primary" @click="exportChange">导出异动人员</el-button>
</div>
</el-col>
</el-row>
</el-row>
<el-row>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :key="tableKey"
v-loading="tableLoading"
lazy
:load="load"
:tree-props="{hasChildren: 'hasHis'}"
border
>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号" width="80px"></el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="姓名" prop="username" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="性别" prop="sex" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="联系电话" prop="mobile" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<!-- <el-table-column label="出生日期" prop="birthday" header-align="center"-->
<!-- align="center" show-overflow-tooltip></el-table-column>-->
<!-- <el-table-column label="身份证" prop="idcard" header-align="center"-->
<!-- align="center" show-overflow-tooltip></el-table-column>-->
<el-table-column label="人员类型" prop="personType" header-align="center" sortable
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="在职状态" prop="userState" header-align="center" sortable
align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="所属单位" prop="unitid" header-align="center"
align="center" show-overflow-tooltip sortable>
<template scope="{row}">
<span v-if="row.unitid"> {{row.unitname}}({{row.unitid}})</span>
</template>
</el-table-column>
<el-table-column label="异动信息" header-align="center">
<el-table-column label="更新时间" prop="changeTime" min-width="100px" header-align="center" sortable
align="center" show-overflow-tooltip>
<!-- <template scope="{row:{changeTime}}">
{{changeTime?changeTime:'暂无'}}
</template>-->
</el-table-column>
<el-table-column label="异动类型" prop="changeType" header-align="center"
align="center" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: #0e78c5">{{changeType[row.changeType]}}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
min-width="80px">
<template scope="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:'view',data:scope.row}">
查看
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #view>
<el-tabs v-model="active">
<el-tab-pane label="个人信息" name="info">
<member ref="memberInfo" :source="source" :id="userId" view></member>
</el-tab-pane>
</el-tabs>
</template>
</guava>
<el-dialog
title="选择数据源"
:visible.sync="dialogVisible"
width="30%">
<el-radio-group class="checkGroup" v-model="sourceTime" style="width: 100%">
<el-row v-for="item in latelyUpdateTimes" style="margin-bottom: 10px">
<el-radio :key="item.pullTime" style="width: 100%"
:label="item.pullTime" border>
时间:{{item.pullTime}}<span
style="float: right;color: #F56C6C">rows: {{item.num}}</span>
</el-radio>
</el-row>
</el-radio-group>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" :loading="updateLoading" @click="doUpdate">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
active: 'info',
updateLoading: false,
pageForm: {
searchName: "u.username",
},
userId: "",
unions: [],
units: [],
active: 'info',
latelyUpdateTimes: [],
dialogVisible: false,
sourceTime: "",
changeType: {},
source: 'sys_user'
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'mem-change-records': httpVueLoader('/components/member/MemChangeRecords.vue?v=1.0.2'),
'enum-select': httpVueLoader('/components/plugins/EnumSelect.vue?v=1.0.0'),
},
methods: {
async load(tree, treeNode, resolve) {
const {loginname} = tree
const resp = await $.get(loc() + "/historyUsers", {loginname})
requestLaterFun(resp, (data) => {
resolve(data)
}, () => {
resolve([])
})
},
checkSource() {
if (!this.latelyUpdateTimes.length) {
this.$notify({
title: '警告',
message: '没有可供更新的数据源',
type: 'warning'
});
return
}
this.sourceTime = ''
this.dialogVisible = true
},
doUpdate() {
if (!this.sourceTime) {
this.$notify({
title: '警告',
message: '请选择数据源',
type: 'warning'
});
return
}
this.$confirm('是否确定更新用户数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.updateLoading = true
const resp = await $.post(loc() + '/update', {sourceTime: this.sourceTime})
requestLaterMsgFun(this, resp, () => {
this.tableKey = new Date().getTime()
this.pageData()
this.dialogVisible = false
}, null, () => {
this.updateLoading = false
})
})
},
openView({id, flag}) {
this.active = 'info'
this.userId = id
this.source = flag ? 'sys_user' : 'user_history'
this.$refs.guava.view()
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
}
},
async getLatelyUpdateTimes() {
const resp = await $.get(loc() + "/latelyUpdateTimes")
requestLaterFun(resp, (data) => {
this.latelyUpdateTimes = data
})
},
async getChangeType() {
const changeType = {}
const changeTypeOptions = await getEnumOptions("UserChangeType")
changeTypeOptions.forEach(v => {
changeType[v.code] = v.description
})
return changeType
},
exportChange() {
const {
searchName,
searchKeyword,
unitId,
personType,
changeDate,
userState
} = this.pageForm
window.open(loc() + '/exportChangePeo?searchName=' + searchName + '&searchKeyword=' + searchKeyword + '&unitId=' + (unitId ? unitId : '') +
'&userState=' + (userState ? userState : '') + '&personType=' + (personType ? personType : '') + '&changeDate=' + (changeDate ? changeDate : ''))
},
},
async created() {
this.pageData();
this.units = await getUnits()
this.getLatelyUpdateTimes()
this.changeType = await this.getChangeType()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,433 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.aid-dash-bord .card-label {
color: rgba(0, 0, 0, .45);
font-size: 14px;
margin-bottom: 10px;
}
.aid-dash-bord .card-value-num {
font-size: 30px;
color: rgba(0, 0, 0, .85);
}
.el-table__body-wrapper::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.el-table__body-wrapper {
scrollbar-width: none; /* firefox */
-ms-overflow-style: none; /* IE 10+ */
overflow-x: hidden;
overflow-y: auto;
}
.idx {
display: flex;
justify-content: center;
align-items: center;
color: rgba(0, 0, 0, .85);
width: 20px;
height: 20px;
border-radius: 50%;
background-color: #f0f0f0;
font-size: 12px;
}
.top-col {
background-color: white;
position: relative;
box-sizing: border-box;
padding: 20px;
width: calc((100% - (20px * 4)) / 4);
}
.top-col:not(:last-child), .center-col:not(:last-child) {
margin-right: 20px;
}
.top-col-member-number {
font-size: 30px;
color: rgba(0, 0, 0, .85);
}
.top-col-chart {
height: 80px;
width: 100%;
position: relative;
}
.center-col {
background-color: white;
position: relative;
box-sizing: border-box;
padding: 20px;
width: calc((100% - (20px * 2)) / 2);
}
.idx-rank {
color: white !important;
background-color: #314659 !important;
}
</style>
<div id="app" class="platform aid-dash-bord" v-cloak>
<guava ref="guava">
<template>
<el-row gutter="20" type="flex">
<el-col v-loading="loading.memberNumber">
<el-card shadow="never">
<div class="card-label">基金会员总数</div>
<div class="card-value">
<span class="card-value-num">{{memberNumberData.memberNum}}</span><span
class="card-value-unit"> 人</span>
</div>
</el-card>
</el-col>
<el-col v-loading="loading.memberNumberYear">
<el-card shadow="never">
<div class="card-label">今年新加入会员数</div>
<div class="card-value">
<span class="card-value-num">{{memberNumberData.memberNumberYear}}</span><span
class="card-value-unit"> 人</span>
</div>
</el-card>
</el-col>
<el-col v-loading="loading.aidMedical">
<el-card shadow="never">
<div class="card-label">医疗补助申请总数</div>
<div class="card-value">
<span class="card-value-num">{{aidMedicalData.med}}</span><span
class="card-value-unit"> 次</span>
</div>
</el-card>
</el-col>
<el-col v-loading="loading.aidMedical">
<el-card shadow="never">
<div class="card-label">重疾补助申请总数</div>
<div class="card-value">
<span class="card-value-num">{{aidMedicalData.weightMed}}</span><span
class="card-value-unit"> 次</span>
</div>
</el-card>
</el-col>
<el-col v-loading="loading.aidMedicalMoney">
<el-card shadow="never">
<div class="card-label">共计补助</div>
<div class="card-value">
<span class="card-value-num">{{aidMedicalData.Money/10000}}</span><span
class="card-value-unit"> 万元</span>
</div>
</el-card>
</el-col>
</el-row>
<el-row style="background-color: #f0f2f5;margin-top: 20px" type="flex">
<el-col class="center-col">
<div class="card-label">工会基金会员数</div>
<div style="width: 100%;height: 100px" id="unionMemberChart"></div>
<el-table :data="unionMember" style="width: 100%;margin-top: 20px"
height="calc(100vh - 160px - 300px)"
:header-cell-style="{background:'#FAFAFA'}" row-key="id">
<el-table-column label="序号" width="100px">
<template scope="{$index}">
<div class="idx idx-rank" v-if="$index<3">{{$index+1}}</div>
<div class="idx" v-else>{{$index+1}}</div>
</template>
</el-table-column>
<el-table-column prop="unioncode" header-align="center" label="基层工会" sortable
show-overflow-tooltip>
<template scope="{row}">
{{row.unionname}}({{row.unioncode}})
</template>
</el-table-column>
<el-table-column prop="value" align="center" header-align="center" label="会员人数"
width="120px" sortable
show-overflow-tooltip></el-table-column>
</el-table>
</el-col>
<el-col class="center-col">
<div class="card-label">在职状态</div>
<div style="width: 100%;height:calc(50% - 35px);box-sizing: border-box;padding: 30px 10px"
v-loading="loading.userStateMember"
id="userStateMemberChart"></div>
<div class="card-label">人员类型</div>
<div style="width: 100%;height:calc(50% - 35px);box-sizing: border-box;padding: 30px 10px"
v-loading="loading.personTypeMember"
id="personTypeMemberChart"></div>
</el-col>
</el-row>
</template>
</guava>
</div>
<script>
const chart = {
unionMemberChart: undefined,
userStateMemberChart: undefined,
personTypeMemberChart: undefined,
}
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
loading: {
unionMember: false,
memberNumberYear: false,
personTypeMember: false,
userStateMember: false,
memberNumber: false,
aidMedicalMoney: false,
},
memberNumberData: {
memberNum: '--',
memberNumberYear: '--',
},
aidMedicalData: {
med: '--',
weightMed: '--',
Money: '--',
},
unionMember: [],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0')
},
methods: {
/**
* 各工会会员数
* @returns {Promise<void>}
*/
async getUnionMember() {
this.loading.unionMember = true
const resp = await $.get(loc() + '/unionMember')
requestLaterFun(resp, ({chartData, tableData}) => {
this.loading.unionMember = false
this.unionMember = tableData
const labels = chartData.map(v => v.unionname)
const values = chartData.map(v => v.value)
if (chart.unionMemberChart) {
chart.unionMemberChart.changeData(values)
return
}
chart.unionMemberChart = new G2Plot.TinyArea('unionMemberChart', {
autoFit: true,
data: values,
smooth: true,
tooltip: {
customContent: function (i, data) {
if (labels[i]) {
return labels[i] + '- ' + data[0]?.data?.y + '人';
}
return ''
},
},
})
chart.unionMemberChart.render();
})
},
/**
* 根据在职状态查找会员数
* @returns {Promise<void>}
*/
async getUserStateMember() {
this.loading.userStateMember = true
const resp = await $.get(loc() + '/userStateMember')
requestLaterFun(resp, (data) => {
this.loading.userStateMember = false
if (chart.userStateMemberChart) {
chart.userStateMemberChart.changeData(data)
return
}
/* chart.userStateMemberChart = new G2Plot.Radar('userStateMemberChart', {*/
chart.userStateMemberChart = new G2Plot.Pie('userStateMemberChart', {
data,
/* xField: 'label',
yField: 'value',
appendPadding: [0, 10, 0, 10],*/
angleField: 'value',
colorField: 'type',
radius: 0.75,
appendPadding: 10,
label: {
type: 'spider',
labelHeight: 28,
content: '{name}\n{value}',
},
interactions: [{type: 'element-selected'}, {type: 'element-active'}],
/* meta: {
value: {
alias: '会员数量',
min: 0,
nice: true,
formatter: (v) => Number(v).toFixed(2),
},
},*/
/* xAxis: {
tickLine: null,
},
yAxis: {
label: false,
grid: {
alternateColor: 'rgba(0, 0, 0, 0.04)',
},
},
// 开启辅助点
point: {
size: 2,
},
area: {},*/
});
chart.userStateMemberChart.render();
})
},
/**
* 根据人员类型查找会员数
* @returns {Promise<void>}
*/
async getPersonTypeMember() {
this.loading.personTypeMember = true
const resp = await $.get(loc() + '/personTypeMember')
requestLaterFun(resp, (data) => {
this.loading.personTypeMember = false
if (chart.personTypeMemberChart) {
chart.personTypeMemberChart.changeData(data)
return
}
chart.personTypeMemberChart = new G2Plot.Column('personTypeMemberChart', {
data,
autoFit: true,
xField: 'label',
yField: 'value',
label: {
// 可手动配置 label 数据标签位置
position: 'middle', // 'top', 'bottom', 'middle',
// 配置样式
style: {
fill: '#FFFFFF',
opacity: 0.6,
},
},
xAxis: {
label: {
autoHide: true,
autoRotate: false,
},
},
meta: {
label: {
alias: '类型',
},
value: {
alias: '会员数',
},
},
});
chart.personTypeMemberChart.render();
})
},
/**
* 查询基金会员总数
* @returns {Promise<void>}
*/
async getAidFundMember() {
this.loading.memberNumber = true
const resp = await $.get(loc() + '/getAidFundMember')
requestLaterFun(resp, (data) => {
this.loading.memberNumber = false
this.memberNumberData.memberNum = data
})
},
/**
* 查询本年加入基金会员总数
* @returns {Promise<void>}
*/
async getAidFundMemberYear() {
this.loading.memberNumberYear = true
const resp = await $.get(loc() + '/getAidFundMemberYear')
requestLaterFun(resp, (data) => {
this.loading.memberNumberYear = false
this.memberNumberData.memberNumberYear = data
})
},
/**
* 查询med医疗补助和weightMed重疾补助
* @returns {Promise<void>}
*/
async getAidMedical() {
this.loading.aidMedical = true
const resp = await $.get(loc() + '/getAidMedical')
requestLaterFun(resp, (data) => {
this.loading.aidMedical = false
this.aidMedicalData.med = data.med
this.aidMedicalData.weightMed = data.weightmed
})
},
/**
* 查询全部补助金额
* @returns {Promise<void>}
*/
async getAidMedicalMoney() {
this.loading.aidMedicalMoney = true
const resp = await $.get(loc() + '/getAidMedicalMoney')
requestLaterFun(resp, (data) => {
this.loading.aidMedicalMoney = false
this.aidMedicalData.Money = data
})
}
},
mounted() {
this.getUnionMember()
this.getUserStateMember()
this.getPersonTypeMember()
this.getAidFundMember()
this.getAidFundMemberYear()
this.getAidMedical()
this.getAidMedicalMoney()
},
async created() {
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,279 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.v-body {
display: flex;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
background-color: #f0f2f5;
}
.v-card {
/*width: calc(100% - 50px);*/
/*height: calc(100% - 50px);*/
width: 100%;
height: 100%;
position: relative;
}
.transition-row {
width: 100%;
height: 100%;
}
.transition-item {
width: 100%;
height: 100%;
}
.demo-table-expand {
font-size: 0;
}
.demo-table-expand label {
color: #99a9bf;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" style="width: 100%;height: 100%">
<template>
<div class="v-body">
<el-card class="v-card" shadow="never">
<el-tabs v-model="activeName" @tab-click="id = '${@shiro.getPrincipalProperty('id')}'">
<el-tab-pane label="申请入会" name="first">
<div style="display: flex;width: 100%;height: 100%;align-items: center;justify-content: center;position: relative;padding: 10px">
<el-card style="width: 1000px">
<!-- <div slot="header" class="clearfix">
<h4>申请信息</h4>
</div>-->
<div>
<el-form :model="formData" ref="form" :rules="formRules" label-suffix=":"
label-width="100px">
<el-row>
<el-col span="12">
<el-form-item label="姓&emsp;&emsp;名">
<el-input disabled v-model="formData.username"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item label="工&emsp;&emsp;号">
<el-input disabled v-model="formData.loginname"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item label="性别">
<el-radio-group v-model="formData.sex">
<el-radio-button label="男"></el-radio-button>
<el-radio-button label="女"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item label="所在单位">
<el-input disabled v-model="formData.unitname"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
<!-- <el-col span="12">
<el-form-item label="基层工会">
<el-input disabled v-model="formData.unionname"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>-->
</el-row>
<el-row>
<el-col span="12">
<el-form-item label="申请时间" prop="applyTime">
<el-date-picker disabled
style="width: 100%"
v-model="formData.applyTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item label="联系方式" prop="mobile">
<el-input v-model="formData.mobile"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item label="身份证号" prop="idcard">
<el-input v-model="formData.idcard" maxlength="18"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item label="入校时间" prop="schoolTime">
<el-date-picker
style="width: 100%"
v-model="formData.schoolTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<el-radio
style="width: 70%;margin-left: 15%;color: #F56C6C"
v-model="reading" :label="true" v-if="applyInfo.label!='申请退出'">
我自愿加入湖南工商大学教职工医疗互助基金会, 同意并遵守《湖南工商大学教职工医疗互助基金管理办法》的相关规定
</el-radio>
<el-button :disabled="applyInfo.disabled"
type="primary"
@click="apply"
style="width: 70%;margin-left: 15%">
<span>{{applyInfo.label}}</span>
</el-button>
</div>
</el-card>
</div>
</el-tab-pane>
<el-tab-pane label="变更记录" name="second">
<app_record :userid="id" ref="app_record"></app_record>
</el-tab-pane>
</el-tabs>
</el-card>
</div>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
reading: false,
id: "",
formData: {
applyTime: moment().format('YYYY-MM-DD'),
id: "${@shiro.getPrincipalProperty('id')}",
username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
mobile: "${@shiro.getPrincipalProperty('mobile')}",
sex: "${@shiro.getPrincipalProperty('sex')}",
idcard: "${@shiro.getPrincipalProperty('idcard')}",
schoolTime: "${@shiro.getPrincipalProperty('schoolTime')}",
unitname: "${@shiro.getPrincipalProperty('unit')!=null?@shiro.getPrincipalProperty('unit').getName():''}",
unionname: "${@shiro.getPrincipalProperty('union')!=null?@shiro.getPrincipalProperty('union').getUnionname():''}",
},
activeName: 'first',
applyInfo: {
disabled: true,
label: '申请加入'
},
formRules: {
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
idcard: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'app_record': httpVueLoader('/components/diseaseaid/aidfund/AppRecord.vue'),
},
methods: {
apply() {
this.$refs.form.validate(async (valid) => {
if (this.formData.loginname == 2005 || this.formData.loginname == 2727){
this.$notify.warning({title: '提示', message: '暂未开放申请,如有疑问请联系校工会'});
return
}
if (valid) {
if (!this.reading && this.applyInfo.label != "申请退出") {
this.$notify.warning({title: '提示', message: '请勾选阅读须知'});
return
}
const isMember = "${@shiro.getPrincipalProperty('aidFundMember')}" === '1'
this.$confirm(this.applyInfo.label == '申请退出' ? '是否确认退出医疗互助基金会?' : '是否提交申请?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
iconClass: "el-icon-question"
}).then(async () => {
const response = await $.post(loc() + '/apply', this.formData)
AssertResponseMessage({
app: this,
response,
success: () => {
this.$set(this.applyInfo, "disabled", true)
this.canApply()
}
})
})
}
})
},
async canApply() {
const response = await $.get(loc() + '/canApply')
AssertResponse({
response,
success: ({data}) => {
this.applyInfo = data
}
})
},
},
async created() {
this.canApply()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,210 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<!-- <el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名/工号:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword" clearable="true">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询"
style="width: 100px;">
<el-option label="工号" value="us.loginname"></el-option>
<el-option label="姓名" value="us.username"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>-->
<search v-model="pageForm" @search="doSearch">
<template #before>
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.aidFundMemberJoinTime"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
</template>
</search>
<el-card shadow="never" class="mt10">
<table-tool label="人员列表" :app="this">
<template #func>
<el-button icon="el-icon-s-promotion" class="m10" type="primary" size="small"
:loading="submitLoading" plain
@click="BatchSettings">批量设置
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
ref="multipleTable"
v-loading="tableLoading" :size="tableSize" class="vi-table"
@selection-change="handleSelectionChange">
<el-table-column :reserve-selection="true"
type="selection"
:selectable='checkboxT'
width="55" disabled>
</el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod"
label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
selection: [],
unions: [],
units: [],
pageForm: {
searchName: "username",
aidFundMemberJoinTime: new Date().getFullYear() + "",
isRetirement: 1,
},
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '电话'},
{prop: 'unionname', label: '工会', sortable: true},
{prop: 'unitname', label: '单位', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
},
methods: {
checkboxT(row) {
if (row.stateId) {
/* console.log(row)
if (row.stateId == 3013 || row.stateId == 3015 || row.stateId == 3025 || (row.aidFundMemberQuitTime && row.stateId == 3030)) {
return true;
}*/
return false;
} else {
return true;
}
},
BatchSettings() {
if (!this.selection.length) {
this.$notify({
title: '警告',
message: '请先勾选需要设置的用户!',
type: 'warning'
});
return
}
this.$confirm('是否将已勾选的人员设置为基金会员?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.submitLoading = true
const resp = await $.post(loc() + "/BatchSettings", {userId: JSON.stringify(this.selection.map(v => v.id))})
requestLaterMsgFun(this, resp, () => {
this.pageData()
this.$refs.multipleTable.clearSelection();
}, null, () => {
this.submitLoading = false
})
})
},
handleSelectionChange(val) {
this.selection = val
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData();
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,389 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<search v-model="pageForm" @search="doSearch">
</search>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员" :app="this">
<template #func>
<!--#if(@shiro.hasPermission('aid.fund.manage.backup')){#-->
<el-dropdown @command="dropdownCommand">
<el-button type="primary" size="small" plain>
备份会员名单<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="year in yearOptions" v-key="year"
:command="{action:backupMember,value:year}">
{{year}}年
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!--#}#-->
<!--#if(@shiro.hasPermission('aid.fund.manage.importUserStateChangeRecords')){#-->
<el-button type="primary" plain icon="el-icon-upload2" size="small" @click="openImport"
class="ml5">
导入会员退休去世记录
</el-button>
<!--#}#-->
<!--#if(@shiro.hasPermission('aid.fund.manage.exportNewMember')){#-->
<el-button type="primary" plain icon="el-icon-download" size="small" @click="exportNewMember">
导出{{new
Date().getFullYear()}}年新会员名单
</el-button>
<!--#}#-->
<!--#if(@shiro.hasPermission('aid.fund.manage.createPayList')){#-->
<el-button :loading="createPayListLoading" type="primary" plain icon="el-icon-tickets"
size="small" @click="createPayList">
生成{{new
Date().getFullYear()+1}}年缴费名单
</el-button>
<!--#}#-->
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='aidFundMemberJoinTime'" scope="{row:{aidFundMemberJoinTime}}">
{{aidFundMemberJoinTime|date}}
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:view,value:row}">
查看
</el-dropdown-item>
<!--#if(@shiro.hasPermission('aid.fund.manage.change')){#-->
<el-dropdown-item :command="{action:memberChange,value: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="">提交</el-button>-->
</template>
<template #edit>
</template>
<template #view>
<el-tabs v-model="activeName" class="aidPay_view">
<el-tab-pane label="用户信息" :name="1">
<info ref="info" :userid="info.id"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" :name="2">
<app_record :userid="info.id" ref="app_record"></app_record>
</el-tab-pane>
<el-tab-pane label="缴费记录" :name="3">
<pay_record :userid="info.id" ref="pay_record"></pay_record>
</el-tab-pane>
</el-tabs>
</template>
</guava>
<el-dialog
title="会员变更"
:visible.sync="changeVisible"
width="40%">
<vi-title title="变更信息"></vi-title>
<el-form :model="formData" ref="form" :rules="formRules"
label-width="100px">
<el-form-item label="变更类型" prop="changeType">
<el-select v-model="formData.changeType" placeholder="请选择" style="width: 100%"
@change="changeTypeChange">
<el-option
v-for="item in changeTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<div v-if="formData.changeType==2">
<el-form-item label="变更单位" prop="changeUnit">
<el-select v-model="formData.changeUnit" @change="unitChange" placeholder="请选择" filterable
style="width: 100%">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="所属工会" prop="unionname">
<el-input
placeholder=""
v-model="formData.unionname"
disabled>
</el-input>
</el-form-item>
</div>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="changeVisible = false" :disabled="changeSubmitLoading">取 消</el-button>
<el-button type="primary" @click="memberChangeHandle" :loading="changeSubmitLoading">提 交</el-button>
</span>
</el-dialog>
<el-dialog
title="退休去世记录导入"
:visible.sync="importVisible"
:close-on-click-modal="false"
width="50%"
>
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" type="" style="width: 200px"
@click="location.href='/platform/basics/downloadTemplate?filePath=diseaseaid/aidfund/UserStateChangeTemplate.xls&fileName=会员退休去世记录.xls'"
icon="el-icon-download">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-upload
name="file"
ref="upload"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xls','xlsx']})
}"
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload" style="width: 200px">选择文件
</el-button>
</el-upload>
</el-card>
</el-timeline-item>
</el-timeline>
<span slot="footer" class="dialog-footer">
<el-button @click="importVisible = false" :disabled="importLoading">取 消</el-button>
<el-button type="primary" @click="doImport" :loading="importLoading">确定</el-button>
</span>
</el-dialog>
</div>
<script>
<!--#include("/platform/diseaseaid/common/AidFund.js"){}#-->
const getYearOptions = () => {
let year = new Date().getFullYear();
let arr = []
for (let i = year; i >= year - 3; i--) {
arr.push(i)
}
return arr
}
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data: function () {
return {
yearOptions: getYearOptions(),
createPayListLoading: false,
changeSubmitLoading: false,
units: [],
info: {},
activeName: 1,
importData: {},
importLoading: false,
importVisible: false,
changeVisible: false,
pageForm: {
searchName: 'username',
aidFundMemberJoinTime: new Date().getFullYear() + "",
},
tableColumns: commonColumns,
changeTypeOptions: [
{label: '单位变更', value: 2},
{label: '自愿退出', value: 1},
{label: '退休', value: 3},
{label: '去世', value: 4},
],
formRules: {
changeType: [{required: true, message: '请选择变更类型', trigger: ['blur', 'change']}],
changeUnit: [{required: true, message: '请选择变更单位', trigger: ['blur', 'change']}],
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'user-select': httpVueLoader('/components/plugins/UserTableSelect.vue?v=1.0.0'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
'info': httpVueLoader('/components/diseaseaid/aidfund/info.vue'),
'app_record': httpVueLoader('/components/diseaseaid/aidfund/AppRecord.vue'),
'pay_record': httpVueLoader('/components/diseaseaid/aidfund/PayRecord.vue'),
},
methods: {
backupMember(year) {
this.$confirm('您确定要备份' + year + '年的数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.doBackupLoading = true
const resp = await $.post("/platform/aidfund/historyledger/backupMember", {year})
requestLaterMsgFun(this, resp, () => {
this.pageData()
}, null, () => {
this.doBackupLoading = false
})
})
},
changeTypeChange(val) {
const userState = this.changeTypeOptions.find(v => v.value === val)
if (userState) this.formData.userState = userState.label
},
createPayList() {
this.$confirm('请确认是否生成缴费名单?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.createPayListLoading = true
const response = await $.post(loc() + "/createPayList")
AssertResponseMessage({
app: this,
response,
final: () => {
this.createPayListLoading = false
}
})
});
},
async memberChangeHandle() {
const v = await this.$refs["form"].validate()
if (!v) return
this.changeSubmitLoading = true
const response = await $.post(loc() + '/memberChange', this.formData)
AssertResponseMessage({
app: this,
response,
success: () => {
this.changeVisible = false
this.pageData()
},
final: () => {
this.changeSubmitLoading = false
}
})
},
unitChange(id) {
const unit = this.units.find(v => v.id === id)
if (unit) this.$set(this.formData, "unionname", unit.unionname)
},
memberChange({id}) {
this.formData = {id}
this.changeVisible = true
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
exportNewMember() {
location.href = loc() + '/exportNewMember'
},
view(row) {
this.activeName = 1
this.info = row
this.$refs.guava.view()
},
openImport() {
this.importData = {
fileList: []
}
this.importVisible = true;
},
doImport() {
if (!this.importData.fileList.length) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
});
this.importLoading = true
$.ajax({
url: loc() + "/importUserStateChangeRecords?year=" + this.importData.year,
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
if (!data.code) {
this.notifySuccess("导入成功!");
this.pageData();
this.importVisible = false
} else {
this.notifyWarning("导入失败")
}
this.importLoading = false
},
error: (data) => {
this.notifyWarning("导入失败")
this.importLoading = false
}
});
},
},
async created() {
this.pageData();
this.units = await getUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,174 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<search v-model="pageForm" @search="doSearch">
<template #before>
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.applyTime"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
</template>
</search>
<el-card shadow="never" class="mt10">
<table-tool label="变更列表" :app="this">
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table" @expand-change="onExpand">
<el-table-column type="expand" width="40px">
<template slot-scope="{row}">
<el-form class="demo-table-expand" v-loading="row.loading"
label-position="right" label-suffix=":" label-width="120px">
<vi-title title="基层工会审核信息"></vi-title>
<el-row :gutter="20" v-if="row.info&&row.info.unionAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.unionAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.unionAudit.auditTime|date }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.unionAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
<vi-title title="校工会审核信息"></vi-title>
<el-row :gutter="20" v-if="row.info&&row.info.fundAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.fundAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.fundAudit.auditTime|date }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.fundAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</el-form>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='isJoin'" scope="{row:{isJoin}}">
<el-tag type="success" v-if="isJoin">加入基金</el-tag>
<el-tag type="danger" v-if="!isJoin">退出基金</el-tag>
</template>
<template v-else-if="column.prop==='applyTime'" scope="{row:{applyTime}}">
<el-tag>{{applyTime|date}}</el-tag>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
pageForm: {
searchName: 'username',
applyTime: new Date().getFullYear() + "",
},
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'schoolTime', label: '入校日期', sortable: true, width: '100px'},
{prop: 'mobile', label: '电话', sortable: true, width: '100px'},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'isJoin', label: '变更类型', sortable: true},
{prop: 'applyTime', label: '变更日期', sortable: true},
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
},
methods: {
async onExpand(row, expandedRows) {
if (!expandedRows.includes(row)) {
return
}
this.$set(row, "loading", true)
const resp = await $.get("/platform/aid/fund/common/findChangeApplyInfo", {id: row.id})
requestLaterFun(resp, (data) => {
this.$set(row, "info", data)
}, () => {
this.$set(row, "info", {})
}, () => {
this.$set(row, "loading", false)
})
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,473 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.aidFund_edit {
padding-top: 20px;
padding-left: 50px;
}
.aidFund_view {
padding-top: 20px;
padding-left: 50px;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<search v-model="pageForm" @search="doSearch">
<template #before>
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.applyYear"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
</template>
</search>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表" :app="this">
<template #func>
<el-button type="primary" plain icon="el-icon-download" size="small" @click="exportMember">
导出审核名单
</el-button>
<el-radio-group class="ml5" v-model="pageForm.isAudit" @change="doSearch" size="small"
>
<el-radio-button :label="false">全部</el-radio-button>
<el-radio-button :label="true">待我审核</el-radio-button>
</el-radio-group>
<el-button class="ml5" icon="el-icon-s-promotion" type="primary" size="small" plain
@click="batchReview">批量审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table"
@selection-change="handleSelectionChange" ref="multipleTable">
<el-table-column :reserve-selection="true"
type="selection"
width="55" disabled>
</el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='stateId'" scope="{row}">
<vi-table-state :state="row"></vi-table-state>
</template>
<template scope="{row}" v-else-if="column.prop=='isJoin'">
<el-tag v-if="row.isJoin" type="success">加入基金</el-tag>
<el-tag type="danger" v-else-if="!row.isJoin">退出基金</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='source'">
<el-tag v-if="row.source==0">个人申请</el-tag>
<el-tag type="info" v-else-if="row.source==1">批量加入</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='applyTime'">
{{row.applyTime|date}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.stateId > 3020"
:command="{type:'Review',data:row}">
审核
</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="aidFund_edit">
<el-tabs v-model="aidFundName">
<el-tab-pane label="个人信息" name="1">
<info ref="info" :userid="info.userId"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" name="2">
<app_record :userid="info.userId" ref="app_record"></app_record>
</el-tab-pane>
<el-tab-pane label="分工会审核" name="3" v-if="viewData&&viewData.una">
<vi-title title="审核信息"></vi-title>
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="姓&emsp;&emsp;名">
<span>{{ viewData.una.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="auditTime" label="审核时间">
<span>{{ viewData.una.auditTime|date }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="auditOpinion" label="审核意见">
<span>{{ viewData.una.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="离退休干部处审核" name="3" v-if="viewData&&viewData.rea">
<vi-title title="审核信息"></vi-title>
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="姓&emsp;&emsp;名">
<span>{{ viewData.rea.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="auditTime" label="审核时间">
<span>{{ viewData.rea.auditTime|date }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="auditOpinion" label="审核意见">
<span>{{ viewData.rea.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="基金会审核" name="4">
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.auditTime" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">
通
过
</el-button>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<template #view>
<div class="aidFund_view">
<el-tabs v-model="aidFundName">
<el-tab-pane label="个人信息" name="1">
<info ref="info" :userid="info.userId"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" name="2">
<app_record :userid="info.userId" ref="app_record"></app_record>
</el-tab-pane>
</el-tabs>
</div>
</template>
</guava>
<el-dialog
title="批量审核"
:visible.sync="changeVisible"
width="60%">
<vi-title title="审核人员"></vi-title>
<el-form :model="formData" ref="form" :rules="formRules"
label-width="100px">
<el-table :data="selection" size="small" header-align="center" style="width: 100%">
<el-table-column prop="loginname" label="工号" header-align="center" align="center">
</el-table-column>
<el-table-column prop="username" label="姓名" header-align="center" align="center">
</el-table-column>
<el-table-column prop="sex" label="性别" header-align="center" align="center"></el-table-column>
<el-table-column prop="mobile" label="电话" header-align="center" align="center"></el-table-column>
<el-table-column prop="unitname" label="单位" header-align="center" align="center"></el-table-column>
<el-table-column prop="isJoin" label="申请类型" header-align="center" align="center">
<template scope="{row}">
<el-tag v-if="row.isJoin" type="success">加入基金</el-tag>
<el-tag type="danger" v-else-if="!row.isJoin">退出基金</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" header-align="center" align="center">
<template scope="{row}">
<span :style="'color:'+row.stateColor">{{row.stateName}}</span>
</template>
</el-table-column>
</el-table>
<vi-title title="审核意见"></vi-title>
<el-form-item prop="auditOpinion">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="changeVisible=false">返回</el-button>
<el-button type="primary" @click="doSubmit(true)" :disabled="subDis" :loading="subLoading2">
通
过
</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
selection: [],
aidFundName: "1",
viewData: {
una: {
username: ""
}
},
info: {},
unions: [],
units: [],
changeSubmitLoading: false,
changeVisible: false,
subDis: false,
subLoading1: false,
subLoading2: false,
pageForm: {
searchName: 'username',
applyYear: new Date().getFullYear() + "",
isAudit: true,
unionid: '',
union: '',
unit: '',
personType: '',
userState: ''
},
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '电话'},
{prop: 'unionname', label: '工会', sortable: true},
{prop: 'unitname', label: '单位', sortable: true},
{prop: 'isJoin', label: '申请类型', sortable: true},
{prop: 'source', label: '申请来源', sortable: true},
{prop: 'stateId', label: '状态', sortable: true},
{prop: 'applyTime', label: '申请时间', sortable: true}
],
formRules: {
auditOpinion: [{required: true, message: '请填写审核理由', trigger: ['blur', 'change']}],
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/diseaseaid/aidfund/info.vue'),
'app_record': httpVueLoader('/components/diseaseaid/aidfund/AppRecord.vue'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
},
methods: {
exportMember() {
const {applyYear, isAudit, userState, personType, union, unit} = this.pageForm
location.href = loc() + '/exportMember?applyYear=' + applyYear
+ "&isAudit=" + isAudit
+ "&userState=" + userState
+ "&personType=" + personType
+ "&union=" + union
+ "&unit=" + unit
},
handleSelectionChange(val) {
this.selection = val
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'Review') {
this.openReview(data)
}
},
batchReview() {
if (!this.selection.length) {
this.$notify({
title: '警告',
message: '请先勾选需要审核的用户!',
type: 'warning'
});
return
}
this.changeVisible = true
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
doSubmit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.subLoading2 = true
const resp = await $.post(loc() + "/doSubmits", {
id: JSON.stringify(this.selection.map(v => v.id)),
auditOpinion: this.formData.auditOpinion
})
requestLaterMsgFun(this, resp, () => {
this.pageData()
this.$refs.multipleTable.clearSelection();
}, null, () => {
this.changeVisible = false
this.subLoading2 = false
})
}
})
},
async openReview(row) {
this.info = row
const {data, code, msg} = await $.get("/platform/aid/fund/common/findOne", {id: row.id})
if (data) {
this.viewData = data
} else {
this.viewData = {}
this.$message({
message: "获取信息失败",
type: 'error'
});
}
this.formData = {
id: row.id,
username: "${@shiro.getPrincipalProperty('username')}",
auditTime: moment().format('YYYY-MM-DD'),
}
this.aidFundName = "4"
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.formData.pass = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(loc() + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
})
}
})
},
async openView(row) {
this.info = row
this.$refs.guava.view()
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
this.pageForm.date = JSON.stringify(this.pageForm.dateRange)
$.post(loc() + "/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 flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,120 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<search v-model="pageForm" @search="doSearch">
<template #before>
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.aidFundMemberJoinTime"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
</template>
</search>
<el-card shadow="never" class="mt10">
<table-tool label="历史基金会员" :app="this">
<template #func>
<!-- <el-button type="primary" plain icon="el-icon-printer" size="small" @click="backupMember">-->
<!-- 备份{{new-->
<!-- Date().getFullYear()}}年会员名单-->
<!-- </el-button>-->
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='aidFundMemberJoinTime'" scope="{row:{aidFundMemberJoinTime}}">
{{aidFundMemberJoinTime|date}}
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
doBackupLoading: false,
pageForm: {
searchName: 'username',
aidFundMemberJoinTime: new Date().getFullYear() - 1 + "",
},
tableColumns: [
{prop: 'year', label: '年度', sortable: true},
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'aidFundMemberJoinTime', label: '加入时间', sortable: true}
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
},
methods: {
async memberYear() {
const resp = await $.get(loc() + "/memberYear")
},
backupMember() {
this.$confirm('您确定要备份' + new Date().getFullYear() + '年的数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.doBackupLoading = true
const resp = await $.post(loc() + "/backupMember", {year: new Date().getFullYear() + ""})
requestLaterMsgFun(this, resp, () => {
this.pageData()
}, null, () => {
this.doBackupLoading = false
})
})
},
},
async created() {
const num = await this.memberYear()
this.pageForm.aidFundMemberJoinTime = num ? num : new Date().getFullYear() + ""
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,289 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.aidPay_view {
padding-top: 20px;
padding-left: 50px;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<search v-model="pageForm" @search="doSearch" :has_year="true"></search>
<el-card shadow="never" class="mt10">
<table-tool label="会员列表" :app="this">
<template #func>
<el-radio-group class="mr5" v-model="pageForm.isAudit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<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-dropdown>
<el-button @click="download" type="primary" plain icon="el-icon-download" size="small">导出{{pageForm.year}}名单 <i
class="el-icon-arrow-down el-icon--right"></i>
</el-button>
</el-dropdown>
<el-button type="primary" class="ml5" plain icon="el-icon-upload2" size="small"
@click="openImport">导入缴费记录
</el-button>
<el-button type="primary" class="ml5" plain icon="el-icon-delete-solid" :loading="doPayLoading"
size="small"
:disabled="tableData.length==0"
@click="doPay">清空{{pageForm.year}}年缴费名单
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='payed'" scope="{row:{payed}}">
<el-tag type="success" v-if="payed">已扣款</el-tag>
<el-tag type="info" v-else-if="!payed">未扣款</el-tag>
</template>
<template v-else-if="column.prop==='money'" scope="{row:{money}}">
<el-tag>{{money}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="180px" fixed="right">
<template 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="{action:view,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.payed" :command="{action:isPayed,value:row.id}"
:loading="isPayedLoading">
已扣款
</el-dropdown-item>
<el-dropdown-item :disabled="!row.payed" :command="{action:isPayed,value:row.id}"
:loading="isPayedLoading">
未扣款
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<el-tabs v-model="activeName" class="aidPay_view">
<el-tab-pane label="用户信息" :name="1">
<info ref="info" :userid="info.userId"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" :name="2">
<app_record :userid="info.userId" ref="app_record"></app_record>
</el-tab-pane>
<el-tab-pane label="缴费记录" :name="3">
<pay_record :userid="info.userId" ref="pay_record"></pay_record>
</el-tab-pane>
</el-tabs>
</template>
</guava>
<el-dialog
title="扣费记录导入"
:visible.sync="importVisible"
:close-on-click-modal="false"
width="50%"
>
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" type="" style="width: 200px"
@click="location.href='/platform/basics/downloadTemplate?filePath=diseaseaid/aidfund/kkmodel1.xls&fileName=扣费记录模板.xls'"
icon="el-icon-download">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-upload
name="file"
ref="upload"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xls','xlsx']})
}"
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload" style="width: 200px">选择文件
</el-button>
</el-upload>
</el-card>
</el-timeline-item>
</el-timeline>
<span slot="footer" class="dialog-footer">
<el-button @click="importVisible = false" :disabled="importLoading">取 消</el-button>
<el-button type="primary" @click="doImport" :loading="importLoading">确定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
activeName: 1,
importData: {},
info: {},
importLoading: false,
importVisible: false,
doPayLoading: false,
isPayedLoading: false,
pageForm: {
searchName: 'username',
year: new Date().getFullYear() + "",
isAudit: "1"
},
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'money', label: '缴费金额', sortable: true},
{prop: 'payed', label: '是否扣款', sortable: true}
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
'info': httpVueLoader('/components/diseaseaid/aidfund/info.vue'),
'app_record': httpVueLoader('/components/diseaseaid/aidfund/AppRecord.vue'),
'pay_record': httpVueLoader('/components/diseaseaid/aidfund/PayRecord.vue'),
},
methods: {
download() {
location.href = location.href + '/download?year=' + this.pageForm.year
},
async isPayed(id) {
this.isPayedLoading = true
const resp = await $.post(loc() + "/isPayed", {id})
requestLaterMsgFun(this, resp, () => {
this.pageData()
}, null, () => {
this.isPayedLoading = false
})
},
view(row) {
this.info = row
this.activeName = 1
this.$refs.guava.view()
},
doPay() {
if (!this.pageForm.year) {
this.notifyWarning("请先选择年度!")
return;
} else if (this.pageForm.year < (new Date().getFullYear()).toString()) {
this.notifyWarning("历史数据不能删除!")
return;
}
this.$confirm('您确定要清空' + this.pageForm.year + '年的数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.doPayLoading = true
const resp = await $.post(loc() + "/doPay", {year: this.pageForm.year})
requestLaterMsgFun(this, resp, () => {
this.pageData()
}, null, () => {
this.doPayLoading = false
})
})
},
openImport() {
this.importData = {
fileList: []
}
this.importVisible = true;
},
doImport() {
if (!this.importData.fileList.length) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
});
this.importLoading = true
$.ajax({
url: loc() + "/importUserpays",
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
if (!data.code) {
this.notifySuccess("导入成功!");
this.pageData();
this.importVisible = false
} else {
this.notifyWarning("导入失败")
}
this.importLoading = false
},
error: (data) => {
this.notifyWarning("导入失败")
this.importLoading = false
}
});
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,264 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.aidFund_edit {
padding-top: 20px;
padding-left: 50px;
}
.aidFund_view {
padding-top: 20px;
padding-left: 50px;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<search v-model="pageForm" @search="doSearch">
<template #before>
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.applyYear"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
</template>
</search>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.isAudit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<el-radio-button :label="false">全部</el-radio-button>
<el-radio-button :label="true">待我审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='stateId'" scope="{row}">
<vi-table-state :state="row"></vi-table-state>
</template>
<template scope="{row}" v-else-if="column.prop=='isJoin'">
<el-tag v-if="row.isJoin" type="success">加入基金</el-tag>
<el-tag type="danger" v-else-if="!row.isJoin">退出基金</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='source'">
<el-tag v-if="row.source==0">个人申请</el-tag>
<el-tag type="info" v-else-if="row.source==1">批量加入</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='applyTime'">
{{row.applyTime|date}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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="{action:view,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.stateId > 3010"
:command="{action:review,value:row}">
审核
</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="aidFund_edit">
<el-tabs v-model="aidFundName">
<el-tab-pane label="个人信息" name="1">
<info ref="info" :userid="info.userId"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" name="2">
<app_record :userid="info.userId" ref="app_record"></app_record>
</el-tab-pane>
<el-tab-pane label="离退休干部处审核" name="3">
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.auditTime" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="reDis" :loading="reLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="reDis" :loading="reLoading2">
通
过
</el-button>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<template #view>
<div class="aidFund_view">
<el-tabs v-model="aidFundName">
<el-tab-pane label="个人信息" name="1">
<info ref="info" :userid="info.userId"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" name="2">
<app_record :userid="info.userId" ref="app_record"></app_record>
</el-tab-pane>
</el-tabs>
</div>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
aidFundName: "1",
info: {},
reDis: false,
reLoading1: false,
reLoading2: false,
pageForm: {
searchName: 'username',
applyYear: new Date().getFullYear() + "",
isAudit: true
},
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'isJoin', label: '申请类型', sortable: true},
{prop: 'source', label: '申请来源', sortable: true},
{prop: 'stateId', label: '状态', sortable: true},
{prop: 'applyTime', label: '申请时间', sortable: true}
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/diseaseaid/aidfund/info.vue'),
'app_record': httpVueLoader('/components/diseaseaid/aidfund/AppRecord.vue'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
},
methods: {
review(row){
this.info = row
this.formData = {
id: row.id,
username: "${@shiro.getPrincipalProperty('username')}",
auditTime: moment().format('YYYY-MM-DD'),
}
this.aidFundName = "3"
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.formData.pass = flag
this.reDis = true
flag ? this.reLoading2 = true : this.reLoading1 = true
const resp = await $.post(loc() + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.reDis = false
this.reLoading1 = false
this.reLoading2 = false
})
}
})
},
view(row) {
this.info = row
this.aidFundName = "1"
this.$refs.guava.view()
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,301 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.aidFund_edit {
padding-top: 20px;
padding-left: 50px;
}
.aidFund_view {
padding-top: 20px;
padding-left: 50px;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0">
<template>
<search v-model="pageForm" @search="doSearch">
<template #before>
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.applyYear"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
</template>
</search>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.isAudit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<el-radio-button :label="false">全部</el-radio-button>
<el-radio-button :label="true">待我审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='stateId'" scope="{row}">
<vi-table-state :state="row"></vi-table-state>
</template>
<template scope="{row}" v-else-if="column.prop=='isJoin'">
<el-tag v-if="row.isJoin" type="success">加入基金</el-tag>
<el-tag type="danger" v-else-if="!row.isJoin">退出基金</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='source'">
<el-tag v-if="row.source==0">个人申请</el-tag>
<el-tag type="info" v-else-if="row.source==1">批量加入</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='applyTime'">
{{row.applyTime|date}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.stateId > 3000"
:command="{type:'Review',data:row}">
审核
</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="aidFund_edit">
<el-tabs v-model="aidFundName">
<el-tab-pane label="个人信息" name="1">
<info ref="info" :userid="info.userId"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" name="2">
<app_record :userid="info.userId" ref="app_record"></app_record>
</el-tab-pane>
<el-tab-pane label="分工会审核" name="3">
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.auditTime" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">
通
过
</el-button>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<template #view>
<div class="aidFund_view">
<el-tabs v-model="aidFundName">
<el-tab-pane label="个人信息" name="1">
<info ref="info" :userid="info.userId"></info>
</el-tab-pane>
<el-tab-pane label="变更记录" name="2">
<app_record :userid="info.userId" ref="app_record"></app_record>
</el-tab-pane>
</el-tabs>
</div>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
aidFundName: "1",
viewData: {},
info: {},
unions: [],
units: [],
subDis: false,
subLoading1: false,
subLoading2: false,
pageForm: {
searchName: 'username',
applyYear: new Date().getFullYear() + "",
isAudit: true
},
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '电话'},
{prop: 'unionname', label: '工会', sortable: true},
{prop: 'unitname', label: '单位', sortable: true},
{prop: 'isJoin', label: '申请类型', sortable: true},
{prop: 'source', label: '申请来源', sortable: true},
{prop: 'stateId', label: '状态', sortable: true},
{prop: 'applyTime', label: '申请时间', sortable: true}
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'info': httpVueLoader('/components/diseaseaid/aidfund/info.vue'),
'app_record': httpVueLoader('/components/diseaseaid/aidfund/AppRecord.vue'),
'search': httpVueLoader('/components/diseaseaid/aidfund/Search.vue?v=1.0.0'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'Review') {
this.openReview(data)
}
},
async openReview(row) {
this.info = row
this.formData = {
id: row.id,
username: "${@shiro.getPrincipalProperty('username')}",
auditTime: moment().format('YYYY-MM-DD'),
}
this.aidFundName = "3"
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.formData.pass = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(loc() + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
})
}
})
},
async openView(row) {
this.info = row
this.$refs.guava.view()
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
this.pageForm.date = JSON.stringify(this.pageForm.dateRange)
$.post(loc() + "/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 created() {
this.pageData()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,10 @@
const commonColumns = [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'aidFundMemberJoinTime', label: '加入时间', sortable: true}
]
@@ -0,0 +1,9 @@
const commonColumns = [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'user_name', label: '姓名', sortable: true},
{prop: 'unit_name', label: '所属部门', sortable: true},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'disease_diagnosis', label: '疾病诊断'},
{prop: 'type', label: '补助类型', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
]
@@ -0,0 +1,208 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 100px;">
<el-option label="名称" value="typeName"></el-option>
<el-option label="编码" value="typeCode"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-query" style="margin-left: -100px">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="类型列表" :app="this">
<template #func>
<el-button size="small" type="primary" icon="el-icon-edit" @click="openAdd">新增类型</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openEdit,value:row}">
修改
</el-dropdown-item>
<el-dropdown-item :command="{action:doDelete,value:row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<el-dialog :visible.sync="dialogVisible" :title="formData.id?'修改':'新增'" width="40%"
:close-on-click-modal="false" :before-close="handleClose">
<vi-title title="填写疾病类型"></vi-title>
<el-form :model="formData" ref="form" :rules="formRules" label-width="80px">
<el-form-item label="类型编码" prop="typeCode">
<el-input maxlength="10" placeholder="类型编码" v-model="formData.typeCode" type="text"
:disabled="isModify"></el-input>
</el-form-item>
<el-form-item label="类型名称" prop="typeName">
<el-input maxlength="50" placeholder="类型名称" v-model="formData.typeName" type="text"></el-input>
</el-form-item>
<el-form-item label="类型备注" prop="typeNotes">
<el-input maxlength="500" placeholder="类型备注" v-model="formData.typeNotes" type="textarea"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="addAndModify">提 交</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
isModify: false,
dialogVisible: false,
pageForm: {searchName: "typeName"},
tableColumns: [
{prop: 'typeName', label: '名称'},
{prop: 'typeCode', label: '编码'},
{prop: 'typeNotes', label: '备注'},
],
formRules: {
typeName: [{required: true, message: '请填写疾病类型名称', trigger: ['blur', 'change']}],
typeCode: [{required: true, message: '请填写疾病类型编码', trigger: ['blur', 'change']}],
}
}
},
methods: {
handleClose() {
this.formData = {id: '', typeName: '', typeCode: '', typeNotes: ''}
this.dialogVisible = false
},
openAdd() {
this.isModify = false
this.dialogVisible = true
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
this.formData = {id: '', typeName: '', typeCode: '', typeNotes: ''}
},
openEdit(row) {
this.isModify = true
this.dialogVisible = true
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
this.formData = row
},
addAndModify() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
let data = clone(this.formData)
const resp = await $.post(loc() + "/addAndModify", {data: JSON.stringify(data)})
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.dialogVisible = false
}, () => {
}, () => {
loading.close()
});
}
});
},
doDelete(row) {
const {id, typeName} = row
this.$confirm('此操作将删除【' + typeName + '】疾病类型!', '提示', {type: 'warning'})
.then(async () => {
const resp = await $.post(loc() + "/doDelete", {id})
requestLaterFun(resp, () => {
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
})
.catch(() => {
});
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,722 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-select {
width: 100%;
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_union="false" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表" :app="this">
<template #func>
<el-button size="small" type="primary" icon="el-icon-edit" @click="openAdd">申请医疗补助</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<!-- :disabled="!row.state_id||row.state_id<600"-->
<el-dropdown-item :disabled="row.state_id===90"
:command="{action:doExport,value:row}">
导出
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=90"
:command="{action:openEdit,value:row}">
编辑
</el-dropdown-item>
<!--# if(@shiro.hasRole('sysadmin')){ #-->
<el-dropdown-item :command="{action:openAdvancedEdit,value:row}">
高级编辑
</el-dropdown-item>
<!--# } #-->
<el-dropdown-item :disabled="row.state_id!=100 && ${@shiro.lacksRole('sysadmin')}"
:command="{action:doDelete,value:row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<vi-title title="填写补助信息"></vi-title>
<el-form :model="formData" ref="form" :rules="formRules" label-position="top"
label-suffix=":">
<el-row gutter="20">
<el-col :span="6">
<el-form-item prop="user_name" label="姓&emsp;&emsp;名">
<!--#if(!(@shiro.hasRole('sysadmin')||@shiro.hasRole('ltxgbc'))){#-->
<el-input readonly v-model="formData.user_name" type="text"></el-input>
<!--#}else{#-->
<el-select v-model="formData.user_id"
@change="userChange"
filterable
remote
reserve-keyword
placeholder="请输入工号或姓名查询"
:remote-method="remoteMethod">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.username+'-'+item.loginname+'-'+item.unitname"
:value="item.id">
</el-option>
</el-select>
<!--#}#-->
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="loginname" label="工&emsp;&emsp;号">
<!--#if(!(@shiro.hasRole('sysadmin')||@shiro.hasRole('ltxgbc'))){#-->
<el-input readonly :value="formData.loginname" type="text"></el-input>
<!--#}else{#-->
<el-input readonly v-model="formData.loginname" type="text"></el-input>
<!--#}#-->
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
<el-input readonly v-model="formData.sex" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="user_age" label="年龄(岁)">
<el-input readonly v-model.number="formData.user_age"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="unit_name" label="部&emsp;&emsp;门">
<el-input readonly v-model="formData.unit_name" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="on_job" label="在职状态">
<el-input readonly v-if="formData.on_job" value="在职" type="text"></el-input>
<el-input readonly v-else value="退休" type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="mobile" label="联系电话">
<el-input maxlength="20" placeholder="请填写联系电话" v-model="formData.mobile"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="disease_diagnosis" label="疾病诊断">
<el-input maxlength="255" placeholder="请填写疾病诊断" v-model="formData.disease_diagnosis"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="hospital" label="入住医院">
<el-input maxlength="255" placeholder="请填写入住医院" v-model="formData.hospital"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="hospital_time" label="住院时间">
<el-date-picker
style="width: 100%"
v-model="formData.hospital_time"
type="daterange"
value-format="yyyy-MM-dd"
@change="getHospitalStay"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="hospital_stay" label="住院天数">
<el-input disabled placeholder="选择住院时间后计算" v-model="formData.hospital_stay"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="bank_name" label="开户银行名称">
<el-input maxlength="255" placeholder="请填写开户银行名称" v-model="formData.bank_name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="bank_account" label="银行账号">
<el-input maxlength="20" placeholder="请填写银行账号" v-model="formData.bank_account"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="total_medical_expenses" label="本次住院医疗费总额">
<el-input-number style="width: 100%" v-model="formData.total_medical_expenses"
placeholder="请填写本次住院医疗费总额" controls-position="right" precision="2" :min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="overall_fund_payment" label="统筹基金支付总额(医保支付)">
<el-input-number style="width: 100%" v-model="formData.overall_fund_payment"
placeholder="请填写统筹基金支付总额(医保支付)" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row gutter="20">
<el-col :span="12">
<el-form-item prop="individual_pay" label="部分政策自付的个人支付">
<el-input-number style="width: 100%" v-model="formData.individual_pay"
placeholder="请填写部分政策字符的个人支付" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="overall_individual_pay" label="统筹段的个人比例自付部分">
<el-input-number style="width: 100%" v-model="formData.overall_individual_pay"
placeholder="请填写统筹段的个人比例自付部分" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
</el-row>-->
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="selfPayMoney" label="个人实际支付金额">
<el-input-number style="width: 100%" v-model="formData.selfPayMoney"
placeholder="个人实际支付金额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item prop="deductible" label="起付线自付费(门槛费)">
<el-input-number style="width: 100%" v-model="formData.deductible"
placeholder="请填写起付线自付费(门槛费)" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="materials" label="完全政策自付中内置材料和自费药费">
<el-input-number style="width: 100%" v-model="formData.materials"
placeholder="请填写完全政策自付中内置材料和自费药费" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>-->
<el-col :span="12">
<el-form-item prop="insured_amount" label="其他保险报销金额">
<el-input-number style="width: 100%" v-model="formData.insured_amount"
placeholder="请填写其他保险报销金额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="invoice_num" label="发票号码">
<el-input maxlength="50" placeholder="请填写发票号码" v-model="formData.invoice_num"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<!--<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="files_invoice" label="发&emsp;&emsp;票">
<file-upload :files.sync="formData.files_invoice" card></file-upload>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="files_medical_certificate" label="诊断书">
<file-upload :files.sync="formData.files_medical_certificate" card></file-upload>
</el-form-item>
</el-col>
</el-row>-->
<!--<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="files_medicare_settlement" label="医保结算单">
<file-upload :files.sync="formData.files_medicare_settlement" card></file-upload>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="files_summary_discharge" label="出院小结">
<file-upload :files.sync="formData.files_summary_discharge" card></file-upload>
</el-form-item>
</el-col>
</el-row>-->
<!-- <el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>-->
</el-form>
<div style="float: right;margin: 20px 0">
<template v-if="!isAdvancedEdit">
<el-button type="primary" @click="doSave()">保 存</el-button>
<!-- <el-button type="primary" @click="formData.id?doEdit():doAdd()">提 交</el-button>-->
<el-button type="primary" @click="doAdd()">提 交</el-button>
</template>
<el-button v-if="isAdvancedEdit" type="primary" @click="doAdvancedEdit()">高级修改</el-button>
</div>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + ""
},
formRules: {
disease_diagnosis: [{required: true, message: '必填', trigger: ['blur', 'change']}],
hospital: [{required: true, message: '必填', trigger: ['blur', 'change']}],
hospital_stay: [{required: true, message: '必填', trigger: ['blur', 'change']}],
hospital_time: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
total_medical_expenses: [{required: true, message: '必填', trigger: ['blur', 'change']}],
overall_fund_payment: [{required: true, message: '必填', trigger: ['blur', 'change']}],
individual_pay: [{required: true, message: '必填', trigger: ['blur', 'change']}],
overall_individual_pay: [{required: true, message: '必填', trigger: ['blur', 'change']}],
deductible: [{required: true, message: '必填', trigger: ['blur', 'change']}],
materials: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bank_name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bank_account: [{required: true, message: '必填', trigger: ['blur', 'change']}],
invoice_num: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_invoice: [{required: false, message: '必填', trigger: ['blur', 'change']}],
files_summary_discharge: [{required: false, message: '必填', trigger: ['blur', 'change']}],
files_medical_certificate: [{required: false, message: '必填', trigger: ['blur', 'change']}],
files_medicare_settlement: [{required: false, message: '必填', trigger: ['blur', 'change']}],
selfPayMoney: [{required: true, message: '必填', trigger: ['blur', 'change']}],
insured_amount: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
fundMembers: "${@shiro.getPrincipalProperty('sfjrdbjj')}" === '1',
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'user_name', label: '姓名',},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'disease_diagnosis', label: '疾病诊断'},
{prop: 'hospital', label: '入住医院'},
{prop: 'state_id', label: '申请状态', sortable: true},
],
userList: [],
isAdvancedEdit: false
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.2'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.0'),
},
methods: {
userChange(val) {
console.log(val)
const user = this.userList.find(v => v.id === val)
this.$set(this.formData, 'loginname', user.loginname)
this.$set(this.formData, 'user_name', user.username)
this.$set(this.formData, 'unit_name', user.unitname)
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'user_age', user.user_age)
this.$set(this.formData, 'on_job', user.userstate === '在职')
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'bank_account', user.bank_number)
this.$set(this.formData, 'bank_name', user.bank_number ? bankCardAttribution(user.bank_number).bankName : '')
},
async remoteMethod(query) {
const {data} = await $.get('/platform/fw/medicalAid/common/findAidUser', {query})
this.userList = data.list
},
doExport(row) {
location.href = "/platform/fw/medicalAid/common/exportDoc?id=" + row.id
},
getHospitalStay(val) {
this.$set(this.formData, "hospital_stay", moment(val[1]).diff(moment(val[0]), 'day'))
},
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doEdit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.hospital_time = formData.hospital_time.toString()
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post("/platform/fw/medicalAid/common/doEdit", {data: JSON.stringify(formData)})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
} else {
this.$notify({
title: '警告',
message: '存在未填写的必填项',
type: 'warning'
});
}
});
},
async openEdit(row) {
const {id} = row
this.formData = {}
this.$set(row, "editLoading", true)
const resp = await $.get("/platform/fw/medicalAid/common/findOne", {id})
requestLaterFun(resp, (v) => {
this.$set(row, "editLoading", false)
medicalAid.toFormData(v)
this.formData = v
this.userList.unshift({
id: v.user_id,
username: v.user_name,
loginname: v.loginname,
unitname: v.unit_name
})
this.$refs.guava.edit()
})
},
async openAdvancedEdit(row) {
this.isAdvancedEdit = true
const {id} = row
this.formData = {}
this.$set(row, "editLoading", true)
const resp = await $.get("/platform/fw/medicalAid/common/findOne", {id})
requestLaterFun(resp, (v) => {
this.$set(row, "editLoading", false)
medicalAid.toFormData(v)
this.formData = v
this.userList.unshift({
id: v.user_id,
username: v.user_name,
loginname: v.loginname,
unitname: v.unit_name
})
this.$refs.guava.edit()
})
},
async doAdvancedEdit() {
const {state_id} = this.formData
if (state_id > 300) {
const confirm = await this.$confirm('本次补助工会会计已经审核,如果有金额的变化,本记录将重新回到补助申请状态,需重新审核,请确认是否编辑?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
}
const valid = await this.$refs["form"].validate()
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.hospital_time = formData.hospital_time.toString()
const loading = this.$loading({
lock: true,
text: '正在修改...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post("/platform/fw/medicalAid/common/doAdvancedEdit", {data: JSON.stringify(formData)})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
this.isAdvancedEdit = false
}, (data, msg) => {
this.$message.error(msg);
})
} else {
this.$notify({
title: '警告',
message: '存在未填写的必填项',
type: 'warning'
});
}
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
this.$set(row, "delLoading", true)
const resp = await $.post("/platform/fw/medicalAid/common/doDelete", {id: id});
requestLaterMsgFun(vue, resp, async () => {
this.pageData()
}, () => {
}, () => {
this.$set(row, "delLoading", false)
})
}
}
});
},
async doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.sign = null
formData.hospital_time = formData.hospital_time.toString()
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(location.href + "/doAdd", {
data: JSON.stringify(formData),
sign: this.formData.sign
})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
}).catch(() => {
});
} else {
this.$notify({
title: '警告',
message: '存在未填写的必填项',
type: 'warning'
});
}
});
},
async doSave() {
const validResult = []
this.$refs['form'].validateField(['disease_diagnosis', 'hospital'], (errMsg) => {
validResult.push(errMsg)
})
if (validResult.every(v => v === '')) {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.sign = null
formData.hospital_time = formData.hospital_time.toString()
const loading = this.$loading({
lock: true,
text: '正在保存...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(location.href + "/doSave", {
data: JSON.stringify(formData),
sign: this.formData.sign
})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
} else {
this.notifyWarning('保存至少填写疾病诊断和入住医院两个信息')
}
},
openAdd() {
if ('${@shiro.getPrincipalProperty("aidFundMember")}' === '0') {
this.$confirm('您还不是基金会员,请前往基金会员管理系统申请', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
window.location.href = base + "/platform/aid/fund/apply";
}).catch(() => {
});
return
}
if (Boolean('${@shiro.hasRole("sysadmin")}' === 'true') || Boolean('${@shiro.hasRole("ltxgbc")}' === 'true')) {
this.formData = {
files: [],
hospital_time: [],
user_name: '',
sex: '',
user_age: '',
unit_name: '',
mobile: '',
bank_account: '',
loginname: '',
bank_name: '',
on_job: false,
}
} else {
this.formData = {
files: [],
hospital_time: [],
user_id: '${@shiro.getPrincipalProperty("id")}',
user_name: '${@shiro.getPrincipalProperty("username")}',
sex: '${@shiro.getPrincipalProperty("sex")}',
user_age: '${@shiro.getPrincipalProperty("birthday")}' ? moment().diff(moment('${@shiro.getPrincipalProperty("birthday")}'), 'years') : '',
unit_name: '${@shiro.getPrincipalProperty("unit").getName()}',
mobile: '${@shiro.getPrincipalProperty("mobile")}',
bank_account: '${@shiro.getPrincipalProperty("bank_number")}',
loginname: Boolean('${@shiro.hasRole("sysadmin")}' === 'true') ? '' : '${@shiro.getPrincipalProperty("loginname")}',
bank_name: '${@shiro.getPrincipalProperty("bank_number")}' ? bankCardAttribution('${@shiro.getPrincipalProperty("bank_number")}').bankName : '',
}
const zzzt = '${@shiro.getPrincipalProperty("userState")}'
if (zzzt === '在职') {
this.$set(this.formData, "on_job", true)
} else if (zzzt === '退休') {
this.$set(this.formData, "on_job", false)
}
}
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
},
async created() {
this.pageData();
console.log(Boolean('${@shiro.hasRole("sysadmin")}' === 'true') || Boolean('${@shiro.hasRole("ltxgbc")}' === 'true'))
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,522 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_union="false" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="补助列表" :app="this"></table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span v-if="row.id" :style="'color:'+row.state_color">{{row.state_name}}</span>
<span v-else style="color: #1890ff">等待办理</span>
</template>
<template v-else-if="column.prop==='apply_time'" scope="{row}">
{{row.apply_time?row.apply_time:'暂无'}}
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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 :disabled="!row.id" :command="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.id"
:command="{action:openAdd,value:row}">
办理
</el-dropdown-item>
<el-dropdown-item :disabled="!row.state_id||row.state_id<600"
:command="{action:doExport,value:row}">
导出
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<el-form :model="formData" ref="form" :rules="formRules" label-position="top"
label-suffix=":">
<vi-title title="补助信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="user_name" label="姓&emsp;&emsp;名">
<el-input disabled v-model="formData.user_name" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
<el-input disabled v-model="formData.sex" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="user_age" label="年龄(岁)">
<el-input disabled v-model.number="formData.user_age"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="unit_name" label="部&emsp;&emsp;门">
<el-input disabled v-model="formData.unit_name" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="on_job" label="在职状态">
<el-input disabled v-if="formData.on_job" value="在职" type="text"></el-input>
<el-input disabled v-else value="退休" type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="mobile" label="联系电话">
<el-input maxlength="20" placeholder="请填写联系电话" v-model="formData.mobile"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="disease_diagnosis" label="疾病诊断">
<el-input maxlength="255" placeholder="请填写疾病诊断" v-model="formData.disease_diagnosis"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="bank_name" label="开户银行名称">
<el-input maxlength="255" placeholder="请填写开户银行名称" v-model="formData.bank_name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="bank_account" label="银行账号">
<el-input maxlength="20" placeholder="请填写银行账号" v-model="formData.bank_account"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="住院医疗总费用(元)">
<el-input-number style="width: 100%" v-model="formData.total_medical_expenses"
disabled
placeholder="请填写住院医疗总费用" controls-position="right" precision="2" :min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="统筹基金支付数(元)">
<el-input-number style="width: 100%" v-model="formData.overall_fund_payment"
disabled
placeholder="请填写统筹基金支付数" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="个人实际支付金额(元)">
<el-input-number style="width: 100%" v-model="formData.selfPayMoney"
disabled
placeholder="个人实际支付金额" controls-position="right" precision="2" :min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="其他保险报销金额">
<el-input-number style="width: 100%" v-model="formData.insured_amount"
disabled
placeholder="请填写其他保险报销金额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="学校医疗补助已补助金额(元)">
<el-input-number style="width: 100%" v-model="formData.already_subsidized"
disabled
placeholder="请填写学校医疗补助已补助金额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="selfPayMoney" label="个人实际支付部分合计(元)">
<el-input-number style="width: 100%" v-model="formData.grsjzfbfhj"
placeholder="请填写个人实际支付部分合计金额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<vi-title title="办理信息"></vi-title>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="办理人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="办理时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="total_grant" label="补助金额">
<el-input-number style="width: 100%" v-model="formData.total_grant"
placeholder="请填写补助金额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
<el-form-item prop="idea" label="办理意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="primary" @click="formData.id?doEdit():doAdd()">提 交</el-button>
</div>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + ""
},
formRules: {
already_total_medical_expenses: [{required: true, message: '必填', trigger: ['blur', 'change']}],
already_overall_fund_payment: [{required: true, message: '必填', trigger: ['blur', 'change']}],
individual_pay: [{required: true, message: '必填', trigger: ['blur', 'change']}],
already_subsidized: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bank_name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bank_account: [{required: true, message: '必填', trigger: ['blur', 'change']}],
disease_diagnosis: [{required: true, message: '必填', trigger: ['blur', 'change']}],
invoice_num: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_invoice: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_summary_discharge: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_medical_certificate: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_medicare_settlement: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
addLoading: false,
fundMembers: "${@shiro.getPrincipalProperty('sfjrdbjj')}" === '1',
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名',},
{prop: 'disease_diagnosis', label: '疾病诊断'},
{prop: 'total', label: '自付总费用', sortable: true},
{prop: 'apply_time', label: '办理时间', sortable: true},
{prop: 'state_id', label: '状态', sortable: true},
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.0'),
},
methods: {
doExport(row) {
location.href = "/platform/fw/medicalAid/common/exportDoc?id=" + row.id
},
getHospitalStay(val) {
this.$set(this.formData, "hospital_stay", moment(val[1]).diff(moment(val[0]), 'day'))
},
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doEdit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post("/platform/fw/medicalAid/common/doEdit", {data: JSON.stringify(formData)})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
} else {
this.$notify({
title: '警告',
message: '存在未填写的必填项',
type: 'warning'
});
}
});
},
async openEdit(row) {
const {id} = row
this.formData = {}
this.$set(row, "editLoading", true)
const resp = await $.get("/platform/fw/medicalAid/common/findOne", {id})
requestLaterFun(resp, (v) => {
this.$set(row, "editLoading", false)
medicalAid.toFormData(v)
this.formData = v
this.$refs.guava.edit()
console.log('1111111111')
if (v.bank_account) {
this.$set(this.formData, 'bank_name', bankCardAttribution(v.bank_account).bankName)
}
})
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {
this.$set(row, "delLoading", true)
const resp = await $.post("/platform/fw/medicalAid/common/doDelete", {id: id});
requestLaterMsgFun(vue, resp, async () => {
this.pageData()
}, () => {
}, () => {
this.$set(row, "delLoading", false)
})
}
}
});
},
async doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const formData = clone(this.formData)
formData.sign = null
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(location.href + "/doAdd", {
data: JSON.stringify(formData),
sign: this.formData.sign,
idea: this.formData.idea,
total_grant: this.formData.total_grant,
})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
}).catch(() => {
});
} else {
this.$notify({
title: '警告',
message: '存在未填写的必填项',
type: 'warning'
});
}
});
},
async openAdd(row) {
console.log(row)
const {user_id, year, disease_diagnosis, total, disease_type_code, muy_id} = row
this.$set(row, "handleLoading", true)
// const {data} = await $.get(location.href + "/getAlready", {userid: user_id, year})
const {data} = await $.get(location.href + "/findApplyInfoByMuyId", {muyId: muy_id})
this.$set(row, "handleLoading", false)
data.user_age = data.birthday ? moment().diff(moment(data.birthday), 'years') : ''
data.bank_name = data.bank_account ? bankCardAttribution(data.bank_account).bankName : ''
data.disease_diagnosis = disease_diagnosis
if (data.userState === '在职') {
data.on_job = true
} else if (data.userState === '退休') {
data.on_job = false
}
//办理的信息
data.medicalaid_user_year_id = muy_id
data.disease_type_code = disease_type_code
data.username = "${@shiro.getPrincipalProperty('username')}"
data.time = moment().format('YYYY-MM-DD')
data.total_grant = this.getTotalGrant(total)
data.idea = '按照学校《教职工病伤医疗互助基金实施办法》规定,本次共补助金额为:\n' + capitalAmount(data.total_grant) + '(' + data.total_grant + ')。'
this.formData = data
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
getTotalGrant(total) {
let totalGrant = 0
const ten = 10000
const mon_1_3 = 3 * ten * 0.55
const mon_3_6 = 3 * ten * 0.60
const mon_6_9 = 3 * ten * 0.65
const mon_9_12 = 3 * ten * 0.70
const mon_12_15 = 3 * ten * 0.75
//起付线
// let money = total - 10000;
let money = total;
if (money < 0) {
return totalGrant;
}
if (money >= 15 * ten) {
totalGrant += (money - 15 * ten) * 0.80;
totalGrant += (mon_1_3 + mon_3_6 + mon_6_9 + mon_9_12 + mon_12_15);
} else if (12 * ten <= money && money < 15 * ten) {
totalGrant += (money - 12 * ten) * 0.75;
totalGrant += (mon_1_3 + mon_3_6 + mon_6_9 + mon_9_12);
} else if (9 * ten <= money && money < 12 * ten) {
totalGrant += (money - 9 * ten) * 0.70;
totalGrant += (mon_1_3 + mon_3_6 + mon_6_9);
} else if (6 * ten <= money && money < 9 * ten) {
totalGrant += (money - 6 * ten) * 0.65;
totalGrant += (mon_1_3 + mon_3_6);
} else if (3 * ten <= money && money < 6 * ten) {
totalGrant += (money - 3 * ten) * 0.60 + mon_1_3;
} else if (money < 3 * ten) {
totalGrant += money * 0.55;
}
return totalGrant.toFixed(0)
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,394 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表" :app="this">
<template #func>
<el-button size="small" type="primary" icon="el-icon-edit" @click="openAdd">申请医疗补助</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="!row.state_id||row.state_id<600"
:command="{action:doExport,value:row}">
导出
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=100"
:command="{action:openEdit,value:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=100"
:command="{action:doDelete,value:row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<vi-title title="填写补助信息"></vi-title>
<el-form :model="formData" ref="form" :rules="formRules" label-position="top"
label-suffix=":">
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="user_name" label="姓&emsp;&emsp;名">
<el-input disabled v-model="formData.user_name" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
<el-input disabled v-model="formData.sex" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="user_age" label="年龄(岁)">
<el-input disabled v-model.number="formData.user_age"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="unit_name" label="部&emsp;&emsp;门">
<el-input disabled v-model="formData.unit_name" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="on_job" label="在职状态">
<el-input disabled v-if="formData.on_job" value="在职" type="text"></el-input>
<el-input disabled v-else value="退休" type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="mobile" label="联系电话">
<el-input maxlength="20" placeholder="请填写联系电话" v-model="formData.mobile"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="disease_diagnosis" label="疾病诊断">
<el-input maxlength="255" placeholder="请填写疾病诊断" v-model="formData.disease_diagnosis"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="bank_name" label="开户银行名称">
<el-input maxlength="255" placeholder="请填写开户银行名称" v-model="formData.bank_name"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="bank_account" label="银行账号">
<el-input maxlength="20" placeholder="请填写银行账号" v-model="formData.bank_account"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="special_clinic_self_pay" label="特殊门诊个人自付部分总额">
<el-input-number style="width: 100%" v-model="formData.special_clinic_self_pay"
placeholder="请填写特殊门诊个人自付部分总额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="invoice_num" label="发票号码">
<el-input maxlength="50" placeholder="请填写发票号码" v-model="formData.invoice_num"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="files_invoice" label="发&emsp;&emsp;票">
<file-upload :files.sync="formData.files_invoice" card></file-upload>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="files_medical_certificate" label="诊断书">
<file-upload :files.sync="formData.files_medical_certificate" card></file-upload>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="files_medicare_settlement" label="医保结算单">
<file-upload :files.sync="formData.files_medicare_settlement" card></file-upload>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="files_summary_discharge" label="出院小结">
<file-upload :files.sync="formData.files_summary_discharge" card></file-upload>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="primary" @click="formData.id?doEdit():doAdd()">提 交</el-button>
</div>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + ""
},
formRules: {
special_clinic_self_pay: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bank_name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bank_account: [{required: true, message: '必填', trigger: ['blur', 'change']}],
disease_diagnosis: [{required: true, message: '必填', trigger: ['blur', 'change']}],
invoice_num: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_invoice: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_summary_discharge: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_medical_certificate: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files_medicare_settlement: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
fundMembers: "${@shiro.getPrincipalProperty('sfjrdbjj')}" === '1',
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'user_name', label: '姓名',},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'disease_diagnosis', label: '疾病诊断'},
{prop: 'state_id', label: '申请状态', sortable: true},
]
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.0'),
},
methods: {
doExport(row) {
location.href = "/platform/fw/medicalAid/common/exportDoc?id=" + row.id
},
getHospitalStay(val) {
this.$set(this.formData, "hospital_stay", moment(val[1]).diff(moment(val[0]), 'day'))
},
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doEdit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post("/platform/fw/medicalAid/common/doEdit", {data: JSON.stringify(formData)})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
}
});
},
async openEdit(row) {
const {id} = row
this.formData = {}
this.$set(row, "editLoading", true)
const resp = await $.get("/platform/fw/medicalAid/common/findOne", {id})
requestLaterFun(resp, (v) => {
this.$set(row, "editLoading", false)
medicalAid.toFormData(v)
this.formData = v
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, "delLoading", true)
const resp = await $.post("/platform/fw/medicalAid/common/doDelete", {id: id});
requestLaterMsgFun(vue, resp, async () => {
this.pageData()
}, () => {
}, () => {
this.$set(row, "delLoading", false)
})
}
}
});
},
async doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.sign = null
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(location.href + "/doAdd", {
data: JSON.stringify(formData),
sign: this.formData.sign
})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
}
});
},
async openAdd() {
this.formData = {
files: [],
hospital_time: [],
user_name: '${@shiro.getPrincipalProperty("username")}',
sex: '${@shiro.getPrincipalProperty("sex")}',
user_age: '${@shiro.getPrincipalProperty("birthday")}' ? moment().diff(moment('${@shiro.getPrincipalProperty("birthday")}'), 'years') : '',
unit_name: '${@shiro.getPrincipalProperty("unit").getName()}',
mobile: '${@shiro.getPrincipalProperty("mobile")}',
bank_account: '${@shiro.getPrincipalProperty("bank_number")}',
bank_name: '${@shiro.getPrincipalProperty("bank_number")}' ? bankCardAttribution('${@shiro.getPrincipalProperty("bank_number")}').bankName : '',
}
const zzzt = '${@shiro.getPrincipalProperty("zzzt")}'
if (zzzt == '在职') {
this.$set(this.formData, "on_job", true)
} else if (zzzt == '退休') {
this.$set(this.formData, "on_job", false)
}
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,235 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
汇总
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
.el-table td {
transition: all 5000ms !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 150px"
placeholder="选择年" @change="doSearch">
</el-date-picker>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.type" clearable placeholder="补助类型" @change="doSearch">
<el-option
v-for="item in medicalAid.med_types"
:key="item.val"
:label="item.lab"
:value="item.val">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.unitid" filterable placeholder="根据部门查询" clearable @change="doSearch">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-dropdown @command="downloadCommand">
<el-button icon="el-icon-download">导出名单 <i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in [{val:true,lab:'在职'},{val:false,lab:'退休'}]"
:command="{val:item.val}">{{item.lab}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-table :data="tableData" border stripe style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column label="姓名" prop="user_name" header-align="center" width="150px"
align="center"></el-table-column>
<el-table-column label="部门" prop="unit_name" header-align="center" sortable width="200px"
align="center"></el-table-column>
<el-table-column label="疾病诊断" prop="disease_diagnosis" header-align="center" width="300px"
align="center"></el-table-column>
<el-table-column label="住院医疗费总额" v-if="pageForm.type==1" prop="total_medical_expenses"
min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="统筹支付总额" v-if="pageForm.type==1" prop="overall_fund_payment"
min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="政策部分自付" v-if="pageForm.type==1" prop="individual_pay" header-align="center"
min-width="150px"
sortable
align="center"></el-table-column>
<el-table-column label="比例自付费" v-if="pageForm.type==1" prop="overall_individual_pay"
min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="应付起付线(门槛费)" v-if="pageForm.type==1" prop="deductible" min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="完全政策自付内置材料和自付部分" v-if="pageForm.type==1" prop="materials" min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="医疗补助已补助金额" v-if="pageForm.type===2" prop="already_subsidized"
min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="统筹支付总额" v-if="pageForm.type===2" prop="already_overall_fund_payment"
min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="住院医疗费总额" v-if="pageForm.type===2" prop="already_total_medical_expenses"
min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="特殊门诊个人自付部分总额" v-if="pageForm.type===3" prop="special_clinic_self_pay"
min-width="150px"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="补助类型" prop="type" header-align="center" sortable align="center">
<template scope="{row}">
<div v-html="medicalAid.elementType(row.type)"></div>
</template>
</el-table-column>
<el-table-column label="补助金额" prop="total_grant" min-width="120px" fixed="right"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="报销日期" prop="cashier_review_time" min-width="120px" fixed="right"
header-align="center" sortable
align="center"></el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right"
width="150px">
<template scope="{row}">
<el-button size="mini" @click="openView(row)">
查看
</el-button>
<el-button size="mini" type="primary" @click="doExport(row)">
导出
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unions: [],
tabLoading: false,
tableData: [],
pageForm: {
...getPageForm(),
searchName: "username",
year: new Date().getFullYear() + "",
type: '',
},
units: [],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
},
methods: {
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
this.units = await getUnits(this.pageForm.unionId)
},
downloadCommand(command) {
const {val} = command
location.href = location.href + '/download?year=' + this.pageForm.year + '&on_job=' + val
},
doExport(row) {
location.href = "/platform/fw/medicalAid/common/exportDoc?displayUser=true&id=" + row.id
},
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
},
async created() {
this.pageData();
this.unions = await getUnions(null)
this.units = await getUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,32 @@
<el-table-column align="center" header-align="center" label="序号" width="80px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center" min-width="80px"
show-overflow-tooltip
align="center"></el-table-column>
<el-table-column label="姓名" prop="user_name" header-align="center" min-width="80px"
show-overflow-tooltip
align="center"></el-table-column>
<el-table-column label="所属部门" prop="unit_name" sortable header-align="center" min-width="80px"
show-overflow-tooltip
align="center"></el-table-column>
<el-table-column label="申请时间" prop="apply_time" header-align="center" sortable min-width="80px"
show-overflow-tooltip
align="center"></el-table-column>
<el-table-column label="疾病诊断" prop="disease_diagnosis" header-align="center" min-width="80px"
show-overflow-tooltip
align="center"></el-table-column>
<el-table-column align="center" prop="type" header-align="center" label="补助类型" sortable
min-width="80px" show-overflow-tooltip>
<template scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column align="center" prop="state_id" header-align="center" label="申请状态" sortable
min-width="80px" show-overflow-tooltip>
<template scope="scope">
<span :style="'color:'+scope.row.state_color">{{scope.row.state_name}}</span>
</template>
</el-table-column>
@@ -0,0 +1,257 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
工会会计审核
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_type="true" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.audit" @change="doSearch" 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>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=300"
:command="{action:openReview,value:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<medical-aid-info ref="med_info2" :handle="true" label="工会会计审核" :panes="[2,3]">
<template #handle>
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="typename" label="疾病类型">
<el-input v-model="formData.typeName" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="total_grant" label="补助金额">
<el-input-number style="width: 100%" v-model="formData.total_grant"
placeholder="请填写补助金额" controls-position="right" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</medical-aid-info>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
</guava>
</div>
<script>
<!--#include("/platform/diseaseaid/common/Medical.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: commonColumns,
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + "",
audit: '3'
},
formRules: {
total_grant: [{required: true, message: '请填写补助金额', trigger: ['blur', 'change']}],
},
subDis: false,
subLoading1: false,
subLoading2: false,
}
},
components: {
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.1'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0')
},
methods: {
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.flag = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(location.href + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, null, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
this.pageData()
this.$refs.guava.index()
})
}).catch(() => {
});
}
})
},
async openReview(row) {
const {id} = row
this.$set(row, "reviewLoading", true)
const {data} = await $.get(location.href + "/getTotalGrant", {id})
let special_clinic_self_pay = data > 200 ? data : 200
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
typeName: row.typeName,
idea: '按照学校《教职工病伤医疗互助基金实施办法》规定,本次共补助金额为:\n' + capitalAmount(special_clinic_self_pay.toFixed(0)) + '(' + special_clinic_self_pay.toFixed(2) + ')。',
sign: '',
total_grant: data
}
this.$set(row, "reviewLoading", false)
this.$refs.med_info2.getInfo(id)
this.$refs.guava.edit()
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,258 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
财务出纳
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_type="true" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="列表" :app="this">
<template #label_end>
<span class="text-danger">(温馨提醒:请先选择记录,后进行财务出纳审核)</span>
</template>
<template #func>
<span class="text-primary">是否重大疾病:</span>
<el-radio-group v-model="pageForm.isDisease" size="small" class="mr10" @change="doSearch">
<el-radio-button label="1">是</el-radio-button>
<el-radio-button label="2">否</el-radio-button>
</el-radio-group>
<el-button type="primary" size="small" icon="el-icon-download" @click="doExport">导出名单
</el-button>
<el-button type="primary" size="small" slot="reference" icon="el-icon-position"
:disabled="!multipleSelection.length"
@click="openReview">财务出纳
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table"
@selection-change="handleSelectionChange">
<el-table-column type="selection" reserve-selection width="55" align="center"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
<template v-else-if="column.prop==='total_grant'" scope="{row:{total_grant}}">
<i>{{total_grant.toFixed(2)}}</i> 元
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="付款信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="付款人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="付款时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="意&emsp;&emsp;见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="primary" @click="doReview" :loading="subLoading">
提 交
</el-button>
</div>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
</guava>
</div>
<script>
<!--#include("/platform/diseaseaid/common/Medical.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'user_name', label: '姓名', sortable: true},
{prop: 'unit_name', label: '所属部门', sortable: true},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'disease_diagnosis', label: '疾病诊断'},
{prop: 'typeName', label: '疾病类型'},
{prop: 'type', label: '补助类型', sortable: true},
{prop: 'bank_name', label: '银行名称', sortable: true},
{prop: 'bank_account', label: '银行卡号', sortable: true},
{prop: 'total_grant', label: '补助金额', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
],
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + "",
},
formRules: {},
subLoading: false,
multipleSelection: [],
}
},
components: {
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.1'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0')
},
methods: {
async doReview() {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.subLoading = true
this.formData.ids = JSON.stringify(this.formData.ids)
this.formData.ordinaryList = JSON.stringify(this.formData.ordinaryList)
this.formData.majorList = JSON.stringify(this.formData.majorList)
const resp = await $.post(location.href + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, (v) => {
this.$refs.table.clearSelection();
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.subLoading = false
})
}).catch(() => {
});
},
async openReview() {
//重大疾病
let majorList = this.multipleSelection.filter(v => v.disease_type_code !== 'A' && v.type === 1)
majorList.forEach(a => {
a.apply_time = moment(a.apply_time).format('YYYY')
})
//常规疾病
let ordinaryList = this.multipleSelection.filter(v => v.disease_type_code === 'A' && v.type === 1)
ordinaryList.forEach(a => {
a.apply_time = moment(a.apply_time).format('YYYY')
})
this.formData = {
ids: this.multipleSelection.map(v => v.id),
ordinaryList: ordinaryList,
majorList: majorList,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
sign: '',
}
this.$refs.guava.edit()
},
handleSelectionChange(val) {
this.multipleSelection = val;
}
,
doExport() {
location.href = location.href + "/doExport"
}
,
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,334 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
工会主席审批
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_type="true" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.audit" @change="doSearch" 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 size="small" type="primary" class="ml10" v-if="pageForm.audit===3"
@click="openBatchAudit">批量审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column type="selection" align="center"
:selectable="(row)=>{return row.state_id===500}"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=500"
:command="{action:openReview,value:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<medical-aid-info ref="med_info2" :handle="true" label="工会主席审批" :panes="[2,3,4,5]">
<template #handle>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审批信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审批人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审批时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="typeName" label="疾病类型">
<el-input v-model="formData.typeName" disabled></el-input>
</el-form-item>
<el-form-item prop="idea" label="审批意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</medical-aid-info>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
<el-dialog title="批量审核" :visible.sync="batchAuditDialogVisible" width="60%" :close-on-click-modal="false">
<el-table :data="batchTableData" max-height="500px">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
</el-table>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="doBatchAudit(false)" type="danger" v-throttle>批量拒绝</el-button>
<el-button @click="doBatchAudit(true)" type="primary" v-throttle>批量通过</el-button>
</span>
</el-dialog>
</guava>
</div>
<script>
<!--#include("/platform/diseaseaid/common/Medical.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: commonColumns,
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + "",
audit: 3
},
formRules: {},
subDis: false,
subLoading1: false,
subLoading2: false,
batchTableData: [],
batchAuditDialogVisible: false
}
},
components: {
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.1'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0')
},
methods: {
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doReview(flag) {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.flag = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(location.href + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, null, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
this.pageData()
this.$refs.guava.index()
})
}).catch(() => {
});
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
typeName: row.typeName,
idea: '',
sign: '',
}
this.$refs.med_info2.getInfo(id)
this.$refs.guava.edit()
},
openBatchAudit() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.notifyWarning('请先勾选需要审核的记录')
return
}
this.batchTableData = selection
this.batchAuditDialogVisible = true
this.formData = {
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
idea: '',
sign: '',
}
},
async doBatchAudit(v) {
if (this.formData.idea === '') {
this.notifyWarning('请填写审核意见')
return
}
const confirm = await this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const ids = this.batchTableData.map(v => v.id)
const resp = await $.post(location.href + "/doBatchReview", {
ids: JSON.stringify(ids),
...this.formData,
flag: v
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
this.batchAuditDialogVisible = false
} else {
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,315 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
综合门诊部审核
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
.el-checkbox__label {
color: red;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_type="true" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.audit" @change="doSearch" 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>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=200"
:command="{action:openReview,value:row}">
审核
</el-dropdown-item>
<!--# if(@shiro.hasRole('sysadmin')){ #-->
<el-dropdown-item v-if="row.state_id>200"
:command="{action:openEdit,value:row}">
修改
</el-dropdown-item>
<!--# } #-->
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<medical-aid-info ref="med_info2" :handle="true" label="综合门诊部审核" :panes="[2]">
<template #handle>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="140px" :rules="formRules">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="code" label="是否属于重大疾病">
<el-select v-model="formData.code" placeholder="请选择是否属于重大疾病" style="width: 100%">
<el-option
v-for="item in diseaseTypeList"
:key="item.typeCode"
:label="item.typeName"
:value="item.typeCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
<el-form-item prop="checked" label="">
<el-checkbox v-model="formData.checked">
已仔细核对《附件》页各项申请材料
</el-checkbox>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</medical-aid-info>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
</guava>
<el-dialog :visible.sync="editMedicalTypeDialog" title="修改疾病类型" width="30%">
<el-select v-model="editMedicalTypeFormData.code" placeholder="请选择是否属于重大疾病" style="width: 100%">
<el-option
v-for="item in diseaseTypeList"
:key="item.typeCode"
:label="item.typeName"
:value="item.typeCode">
</el-option>
</el-select>
<el-row class="text-right mt15">
<el-button @click="editMedicalTypeDialog=false">取消</el-button>
<el-button @click="doEdit" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
<!--#include("/platform/diseaseaid/common/Medical.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
diseaseTypeList: [],
tableColumns: commonColumns,
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + "",
audit: '3'
},
subDis: false,
subLoading1: false,
subLoading2: false,
formRules: {code: [{required: true, message: '请选择是否属于重大疾病', trigger: ['blur', 'change']}],},
editMedicalTypeDialog: false,
editMedicalTypeFormData: {
code: '',
id: ''
}
}
},
components: {
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.1'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0')
},
methods: {
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doReview(flag) {
const valid = await this.$refs['form'].validate()
if(!valid)return
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
if (!this.formData.checked) {
this.$message({
message: '请确认已仔细核对《附件》页各项申请材料',
type: 'warning'
});
return
}
this.formData.flag = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(location.href + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, null, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
this.pageData()
this.$refs.guava.index()
})
}).catch(() => {
});
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
idea: '',
sign: '',
checked: false
}
this.$refs.med_info2.getInfo(id)
this.$refs.guava.edit()
},
openEdit(row) {
console.log(row)
this.editMedicalTypeDialog = true
this.editMedicalTypeFormData.code = row.disease_type_code
this.editMedicalTypeFormData.id = row.id
},
doEdit() {
this.$confirm('您确定要修改吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const data = await $.post(loc() + '/doEditByAdmin', this.editMedicalTypeFormData)
if (data.code === 0) {
this.$message.success(data.msg)
this.editMedicalTypeDialog = false
this.pageData()
}
}).catch(() => {
})
},
async findAllDiseaseType() {
const {data} = await $.get("/platform/fw/medicalAid/disease/type/findAll")
return data;
}
},
async created() {
this.pageData();
this.diseaseTypeList = await this.findAllDiseaseType()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,330 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
离退休干部处审核
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_type="true" :has_union="false" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.audit" @change="doSearch" 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 size="small" type="primary" class="ml10" v-if="pageForm.audit===3"
@click="openBatchAudit">批量审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column type="selection" align="center"
:selectable="(row)=>{return row.state_id===155}"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=155"
:command="{action:openReview,value:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<medical-aid-info ref="med_info2" :handle="true" label="离退休干部处审核">
<template #handle>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</medical-aid-info>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
<el-dialog title="批量审核" :visible.sync="batchAuditDialogVisible" width="60%" :close-on-click-modal="false">
<el-table :data="batchTableData" max-height="500px">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
</el-table>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="doBatchAudit(false)" type="danger" v-throttle>批量拒绝</el-button>
<el-button @click="doBatchAudit(true)" type="primary" v-throttle>批量通过</el-button>
</span>
</el-dialog>
</guava>
</div>
<script>
<!--#include("/platform/diseaseaid/common/Medical.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: commonColumns,
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + "",
audit: 3
},
formRules: {},
subDis: false,
subLoading1: false,
subLoading2: false,
batchTableData: [],
batchAuditDialogVisible: false
}
},
components: {
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.1?v=1.0.1'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0')
},
methods: {
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doReview(flag) {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.flag = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(location.href + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, null, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
this.pageData()
this.$refs.guava.index()
})
}).catch(() => {
});
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
idea: '',
sign: '',
}
this.$refs.med_info2.getInfo(id)
this.$refs.guava.edit()
},
openBatchAudit() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.notifyWarning('请先勾选需要审核的记录')
return
}
this.batchTableData = selection
this.batchAuditDialogVisible = true
this.formData = {
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
idea: '',
sign: '',
}
},
async doBatchAudit(v) {
if (this.formData.idea === '') {
this.notifyWarning('请填写审核意见')
return
}
const confirm = await this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const ids = this.batchTableData.map(v => v.id)
const resp = await $.post(location.href + "/doBatchReview", {
ids: JSON.stringify(ids),
...this.formData,
flag: v
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
this.batchAuditDialogVisible = false
} else {
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,329 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
基层工会主席审核
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_type="true" :has_union="false" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.audit" @change="doSearch" 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 size="small" type="primary" class="ml10" v-if="pageForm.audit===3"
@click="openBatchAudit">批量审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column type="selection" align="center"
:selectable="(row)=>{return row.state_id===100}"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=100"
:command="{action:openReview,value:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<medical-aid-info ref="med_info2" :handle="true" label="基层工会主席审核">
<template #handle>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</medical-aid-info>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
<el-dialog title="批量审核" :visible.sync="batchAuditDialogVisible" width="60%" :close-on-click-modal="false">
<el-table :data="batchTableData" max-height="500px">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
</el-table>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="doBatchAudit(false)" type="danger" v-throttle>批量拒绝</el-button>
<el-button @click="doBatchAudit(true)" type="primary" v-throttle>批量通过</el-button>
</span>
</el-dialog>
</guava>
</div>
<script>
<!--#include("/platform/diseaseaid/common/Medical.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: commonColumns,
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + "",
audit: 3
},
formRules: {},
subDis: false,
subLoading1: false,
subLoading2: false,
batchTableData: [],
batchAuditDialogVisible: false
}
},
components: {
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.1?v=1.0.1'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0')
},
methods: {
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doReview(flag) {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.flag = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(location.href + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, null, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
this.pageData()
this.$refs.guava.index()
})
}).catch(() => {
});
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
idea: '',
sign: '',
}
this.$refs.med_info2.getInfo(id)
this.$refs.guava.edit()
},
openBatchAudit() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.notifyWarning('请先勾选需要审核的记录')
return
}
this.batchTableData = selection
this.batchAuditDialogVisible = true
this.formData = {
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
idea: '',
sign: '',
}
},
async doBatchAudit(v) {
if (this.formData.idea === '') {
this.notifyWarning('请填写审核意见')
return
}
const confirm = await this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const ids = this.batchTableData.map(v => v.id)
const resp = await $.post(location.href + "/doBatchReview", {
ids: JSON.stringify(ids),
...this.formData,
flag: v
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
this.batchAuditDialogVisible = false
} else {
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,333 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
工会副主席审核
-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" class="platform" padding="0% 5%">
<template>
<search :page_form.sync="pageForm" :has_type="true" @search="doSearch"></search>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.audit" @change="doSearch" 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 size="small" type="primary" class="ml10" v-if="pageForm.audit===3"
@click="openBatchAudit">批量审核
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column type="selection" align="center"
:selectable="(row)=>{return row.state_id===400}"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template 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="{action:openView,value:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=400"
:command="{action:openReview,value:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<medical-aid-info ref="med_info2" :handle="true" label="工会副主席审核" :panes="[2,3,4]">
<template #handle>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="typename" label="疾病类型">
<el-input v-model="formData.typeName" disabled></el-input>
</el-form-item>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</medical-aid-info>
</template>
<template #view>
<medical-aid-info ref="med_info"></medical-aid-info>
</template>
<el-dialog title="批量审核" :visible.sync="batchAuditDialogVisible" width="60%" :close-on-click-modal="false">
<el-table :data="batchTableData" max-height="500px">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop==='type'" scope="{row:{type}}">
<div v-html="medicalAid.elementType(type)"></div>
</template>
</el-table-column>
</el-table>
<el-form :model="formData" ref="form" label-position="right" style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="idea" label="审核意见">
<el-input type="textarea" v-model="formData.idea" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="medicalAid" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="doBatchAudit(false)" type="danger" v-throttle>批量拒绝</el-button>
<el-button @click="doBatchAudit(true)" type="primary" v-throttle>批量通过</el-button>
</span>
</el-dialog>
</guava>
</div>
<script>
<!--#include("/platform/diseaseaid/common/Medical.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: commonColumns,
addDialogVisible: false,
editDialogVisible: false,
tabLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "username",
year: new Date().getFullYear() + "",
audit: 3
},
formRules: {},
subDis: false,
subLoading1: false,
subLoading2: false,
batchTableData: [],
batchAuditDialogVisible: false
}
},
components: {
'search': httpVueLoader('/components/medicalaid/MedicalAidSearch.vue?v=1.0.1'),
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'medical-aid-info': httpVueLoader('/components/medicalaid/MedicalAidInfo.vue?v=1.0.1'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0')
},
methods: {
openView(row) {
const {id} = row
this.$refs.med_info.getInfo(id)
this.$refs.guava.view()
},
async doReview(flag) {
this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.flag = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(location.href + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, null, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
this.pageData()
this.$refs.guava.index()
})
}).catch(() => {
});
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
typeName: row.typeName,
idea: '',
sign: '',
}
this.$refs.med_info2.getInfo(id)
this.$refs.guava.edit()
},
openBatchAudit() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.notifyWarning('请先勾选需要审核的记录')
return
}
this.batchTableData = selection
this.batchAuditDialogVisible = true
this.formData = {
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
idea: '',
sign: '',
}
},
async doBatchAudit(v) {
if (this.formData.idea === '') {
this.notifyWarning('请填写审核意见')
return
}
const confirm = await this.$confirm('是否确定提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const ids = this.batchTableData.map(v => v.id)
const resp = await $.post(location.href + "/doBatchReview", {
ids: JSON.stringify(ids),
...this.formData,
flag: v
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
this.batchAuditDialogVisible = false
} else {
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,237 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-input-number input {
text-align: left !important;
}
</style>
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="名称" value="name"></el-option>
<el-option label="编码" value="code"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button icon="el-icon-plus" @click="openAdd">新增类型</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" v-loading="tabLoading">
<el-table-column align="center" header-align="center" 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" header-align="center" label="名称" show-overflow-tooltip
prop="name"></el-table-column>
<el-table-column align="center" header-align="center" label="编码" show-overflow-tooltip
prop="code"></el-table-column>
<el-table-column label="金额" prop="money" header-align="center"
align="center">
<template scope="{row}">
{{row.money}} 元
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="慰问方式" show-overflow-tooltip
prop="way"></el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="180px">
<template scope="{row}">
<el-button size="mini" type="primary" :loading="row.editLoading"
@click="openEdit(row)">
编辑
</el-button>
<el-button size="mini" type="danger" :loading="row.delLoading"
@click="doDelete(row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog :visible.sync="dialogVisible" :title="formData.id?'修改':'新增'" width="40%" :close-on-click-modal="false">
<el-form :model="formData" ref="form" :rules="formRules" label-width="100px" size="medium">
<el-form-item label="类型编码" prop="code">
<el-input maxlength="20" placeholder="类型编码"
v-model="formData.code" type="text"></el-input>
</el-form-item>
<el-form-item label="类型名称" prop="name">
<el-input maxlength="50" placeholder="类型名称"
v-model="formData.name" type="text"></el-input>
</el-form-item>
<el-form-item prop="money" label="慰问费用">
<el-input-number style="width: 100%" v-model="formData.money"
placeholder="请填写慰问费用" controls-position="right" :controls="false" precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
<el-form-item label="慰问方式" prop="way">
<el-radio v-model="formData.way" label="慰问金 (A)" border>慰问金 (A)</el-radio>
<el-radio v-model="formData.way" label="提货券 (B)" border>提货券 (B)</el-radio>
<el-radio v-model="formData.way" label="慰问品 (C)" border>慰问品 (C)</el-radio>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="formData.id?doEdit():doAdd()" :loading="editLoading">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabKey: '',
multipleSelection: [],
clubOptions: [],
tabLoading: false,
dialogVisible: false,
editLoading: false,
formData: {},
tableData: [],
pageForm: {
searchName: "name",
},
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
money: [{required: true, message: '必填', trigger: ['blur', 'change']}],
way: [{required: true, message: '必填', trigger: ['blur', 'change']}],
code: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
sortDialogVisible: false,
sortMenuData: [],
defaultProps: {
children: 'children',
label: 'name'
},
}
},
methods: {
doDelete(row) {
const {id} = row
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
this.$set(row, "delLoading", true)
const {code, msg} = await $.post("/platform/condolence/type/doDelete", {id: id});
if (code == 0) {
this.$notify({
title: '成功',
message: msg,
type: 'success'
});
this.pageData()
} else {
this.$notify.error({
title: '错误',
message: msg
});
}
}
}
});
},
openAdd() {
this.formData = {}
this.dialogVisible = true
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doAdd() {
await this.submit(true)
},
async submit(add) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.editLoading = true
const {code, msg} = await $.post("/platform/condolence/type/" + (add ? "doAdd" : "doEdit"), this.formData)
this.editLoading = false
if (code == 0) {
this.$notify({
title: '成功',
message: msg,
type: 'success'
});
this.dialogVisible = false
this.pageData()
} else {
this.$notify.error({
title: '错误',
message: msg
});
}
}
})
},
async doEdit() {
await this.submit(false)
},
async openEdit(row) {
const {id} = row
this.$set(row, "editLoading", true)
const {data, code, msg} = await $.get("/platform/condolence/type/findOne", {id})
this.$set(row, "editLoading", false)
if (code == 0) {
this.formData = data
this.dialogVisible = true
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
}
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,421 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
</style>
<div id="app" v-cloak style="padding: 20px 40px">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span style="color: #409EFF;font-size: 18px">慰问申请</span>
</div>
<div>
<el-form label-width="100px">
<el-form-item label="填写申请信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
</el-form>
<el-form :model="formData" ref="form" :rules="formRules" label-width="120px" label-position="right"
label-suffix=":">
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="manager_name" label="经办人">
<el-input disabled v-model="formData.manager_name" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="apply_time" label="申请时间">
<el-input disabled v-model="formData.apply_time" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="be_user" label="被慰问人">
<el-select
style="width: 100%"
v-model="formData.be_user"
filterable
clearable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="userRemoteMethod"
:loading="userLoading"
@change="userChange">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="sex" label="慰问人性别">
<el-input disabled placeholder="输入慰问人查询" v-model="formData.sex" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="birthday" label="生&emsp;&emsp;日">
<el-input disabled placeholder="输入慰问人查询" v-model="formData.birthday" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="mobile" label="联系方式">
<el-input placeholder="请输入联系方式" v-model="formData.mobile" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="idcard" label="身份证">
<el-input disabled placeholder="输入慰问人查询" v-model="formData.idcard" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
<!--<el-col :span="12">
<el-form-item prop="bank_card" label="银行卡号">
<el-input placeholder="请填写银行卡号" v-model="formData.bank_card" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>-->
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="payee" label="收款人">
<el-select
style="width: 100%"
v-model="formData.payee"
filterable
clearable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="userPayee"
:loading="userLoading"
@change="payeeChange">
<el-option
v-for="item in userPayees"
:key="item.id"
:label="item.username+'('+item.loginname+')'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="payee_bank_number" label="收款人银行卡">
<el-input placeholder="请填写银行卡号" v-model="formData.payee_bank_number" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item label="慰问类型" prop="type">
<el-select v-model="formData.type" @change="typeChange" style="width: 100%">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="money" label="慰问金额">
<el-input-number style="width: 100%" v-model="formData.money"
placeholder="请填写慰问金额" controls-position="right" :controls="false"
precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="way" label="慰问方式">
<el-select v-model="formData.way" placeholder="请选择慰问方式" style="width: 100%" clearable>
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="occur_time" label="发生时间">
<el-date-picker value-format="yyyy-MM-dd" v-model="formData.occur_time" style="width: 100%">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="personnel" label="参加慰问人员">
<el-input maxlength="100" v-model="formData.personnel" placeholder="请填写参加慰问人员"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form label-width="100px" v-if="['慰问品 (C)'].includes(formData.way)">
<el-form-item label="购置物品及价格&emsp;" label-width="135px" class="view-header">
</el-form-item>
</el-form>
<el-row gutter="60">
<el-col :span="24" v-if="['慰问品 (C)'].includes(formData.way)">
<el-form-item label-width="0">
<el-button style="float: right;margin-bottom: 10px" icon="el-icon-plus" size="mini"
@click="formData.goods.push({name:'',price:''})">
添加
</el-button>
<el-table :data="formData.goods" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="物品名称" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品名称" v-model="row.name"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="price" label="物品价格" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品价格" v-model="row.price"
type="text" @input="blur"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" header-align="center"
width="80px"
fixed="right">
<template slot-scope="scope">
<el-button type="danger" icon="el-icon-delete" circle
:disabled="formData.goods.length==0"
@click="delNotesItem(scope)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="24">
<el-form-item prop="remark" label="备&emsp;&emsp;注">
<el-input maxlength="500" v-model="formData.remark" placeholder="请填写备注"
type="textarea" :autosize="{ minRows: 4, maxRows: 8}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-col :span="24">
<el-form-item prop="files" label="附&emsp;&emsp;件">
<file-upload :files.sync="formData.files"></file-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="condolence" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-col>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="primary" @click="doAdd()">确 定</el-button>
</div>
</div>
</el-card>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
delNotesList: [],
formData: {},
formRules: {
be_user: [{required: true, message: '必填', trigger: ['blur', 'change']}],
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
disease_type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
way: [{required: true, message: '必填', trigger: ['blur', 'change']}],
money: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bank_card: [{required: true, message: '必填', trigger: ['blur', 'change']}],
personnel: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
userLoading: false,
userOptions: [],
userPayees: [],
typeOptions: [],
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
},
methods: {
async typeChange(id) {
const {data, code, msg} = await $.get("/platform/condolence/type/findOne", {id})
if (data) {
this.$set(this.formData, "money", data.money)
this.$set(this.formData, "way", data.way)
}
},
async getUserData(userId) {
const {data} = await $.get(loc() + "/getUserData", {userId})
return data
},
async userChange() {
const userData = await this.getUserData(this.formData.be_user);
this.$set(this.formData, 'sex', userData.sex)
this.$set(this.formData, 'birthday', userData.birthday)
this.$set(this.formData, 'idcard', userData.idcard)
this.$set(this.formData, 'mobile', userData.mobile)
},
async payeeChange() {
const payeeData = await this.getUserData(this.formData.payee);
this.$set(this.formData, 'payee_bank_number', payeeData.bank_number)
},
blur() {
let num = 0
this.formData.goods.forEach(v => {
num += parseFloat(v.price)
})
this.$set(this.formData, "money", num)
},
delNotesItem(scope) {
this.delNotesList.push(scope.row.id)
this.formData.goods.splice(scope.$index, 1)
},
/* typeChange(type) {
if (type == 1) {
this.$set(this.formData, 'way', '2')
this.$set(this.formData, 'money', 200)
} else if (['2', '3', '4'].includes(type)) {
this.$set(this.formData, 'way', '2')
if (['2', '3'].includes(type)) {
this.$set(this.formData, 'money', 500)
} else if (['4'].includes(type)) {
this.$set(this.formData, 'money', 1000)
}
} else if (['5'].includes(type)) {
this.$set(this.formData, 'money', 2000)
} else if (['6'].includes(type)) {
this.$set(this.formData, 'money', 200)
}
},*/
async userPayee(query) {
if (query) {
this.userLoading = true
const arr = await this.queryUser(query)
this.userPayees = arr
this.userLoading = false
}
},
async userRemoteMethod(query) {
if (query) {
this.userLoading = true
const arr = await this.queryUser(query)
this.userOptions = arr
this.userLoading = false
}
},
async queryUser(query) {
const {data} = await $.get(loc() + "/queryUser", {query})
return data
},
flush() {
this.delNotesList = []
this.formData = {
goods: [],
manager_name: "${@shiro.getPrincipalProperty('username')}",
/* bank_card: "${@shiro.getPrincipalProperty('bank_number')}",*/
apply_time: moment().format('YYYY-MM-DD'),
}
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.files = JSON.stringify(formData.files)
formData.sign = ''
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doAdd", {
data: JSON.stringify(formData),
sign: this.formData.sign
})
closeLoadingFunc(loading, resp, async (data, msg) => {
this.$notify({
title: '成功',
message: msg,
type: 'success'
});
this.flush()
location.href = '/platform/fw/condolence'
}, (data, msg) => {
this.$notify.error({
title: '错误',
message: msg
});
})
}
})
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
},
async created() {
this.flush()
this.getTypeOptions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,344 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0% 5%">
<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
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">被慰问人:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 140px;">
<el-option label="被慰问人姓名" value="be.username"></el-option>
<el-option label="被慰问人工号" value="be.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问类型:</div>
<div class="search-item-option">
<el-select v-model="pageForm.type" placeholder="请选择慰问类型" clearable style="width: 100%;">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问方式:</div>
<div class="search-item-option">
<el-select v-model="pageForm.way" placeholder="请选择慰问方式" clearable style="width: 100%;">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="慰问列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.isAudit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id > 2060" :command="{type:'Review',data:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<info ref="info2" handle label="工会常务副主席审核">
<template #handle>
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.opinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="condolence" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</info>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabLoading: false,
userOptions: [],
formData: {},
tableData: [],
pageForm: {
searchName: "be.username",
isAudit: false,
year: new Date().getFullYear() + ""
},
formRules: {
opinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
subLoading1: false,
subLoading2: false,
unions: [],
units: [],
tableColumns: [
{prop: 'be_username', label: '被慰问人'},
{prop: 'be_loginname', label: '被慰问人工号'},
{prop: 'sqr_username', label: '申请人'},
{prop: 'be_unionname', label: '所在工会'},
{prop: 'be_unitname', label: '所在单位', },
{prop: 'type_name', label: '慰问类型', sortable: true},
{prop: 'way', label: '慰问方式', sortable: true},
{prop: 'personnel', label: '随从人员', sortable: true},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'info': httpVueLoader('/components/condolence/Info.vue'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'Review') {
this.openReview(data)
}
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
}
this.$refs.info2.getInfo(id)
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.formData.pass = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(loc() + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
})
}
})
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData();
this.getTypeOptions()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,350 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0% 5%">
<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
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">被慰问人:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 140px;">
<el-option label="被慰问人姓名" value="be.username"></el-option>
<el-option label="被慰问人工号" value="be.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问类型:</div>
<div class="search-item-option">
<el-select v-model="pageForm.type" placeholder="请选择慰问类型" clearable style="width: 100%;">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问方式:</div>
<div class="search-item-option">
<el-select v-model="pageForm.way" placeholder="请选择慰问方式" clearable style="width: 100%;">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="慰问列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.isAudit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id > 2020" :command="{type:'Review',data:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<info ref="info2" handle label="财务审核">
<template #handle>
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="money" label="慰问金额">
<el-input v-model="formData.money"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.opinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="condolence" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</info>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unions: [],
units: [],
tabLoading: false,
userOptions: [],
formData: {},
tableData: [],
pageForm: {
searchName: "be.username",
isAudit: false,
year: new Date().getFullYear() + ""
},
formRules: {
opinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
subLoading1: false,
subLoading2: false,
tableColumns: [
{prop: 'be_username', label: '被慰问人'},
{prop: 'be_loginname', label: '被慰问人工号'},
{prop: 'sqr_username', label: '申请人'},
{prop: 'be_unionname', label: '所在工会'},
{prop: 'be_unitname', label: '所在单位', },
{prop: 'type_name', label: '慰问类型', sortable: true},
{prop: 'way', label: '慰问方式', sortable: true},
{prop: 'personnel', label: '随从人员', sortable: true},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'info': httpVueLoader('/components/condolence/Info.vue'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'Review') {
this.openReview(data)
}
},
async openReview(row) {
const {id} = row
const resp = await $.get("/platform/fw/condolence/findOne", {id})
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
money: resp.data.money
}
this.$refs.info2.getInfo(id)
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.formData.pass = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(loc() + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
})
}
})
},
async openView(row) {
const {id} = row
await this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData();
this.getTypeOptions()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,619 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0% 5%">
<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
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">被慰问人:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 140px;">
<el-option label="被慰问人姓名" value="be.username"></el-option>
<el-option label="被慰问人工号" value="be.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问类型:</div>
<div class="search-item-option">
<el-select v-model="pageForm.type" placeholder="请选择慰问类型" clearable style="width: 100%;">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问方式:</div>
<div class="search-item-option">
<el-select v-model="pageForm.way" placeholder="请选择慰问方式" clearable style="width: 100%;">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表" :app="this">
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
<template v-else-if="column.prop=='shrname'" scope="{row:{shrname}}">
<span>{{shrname?shrname:'暂无'}}</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
min-width="100px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'Print',data:row}">
阅览
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=2000" :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-card>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<el-form label-width="100px">
<el-form-item label="填写申请信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
</el-form>
<el-form :model="formData" ref="form" :rules="formRules" label-width="120px" label-position="right"
label-suffix=":">
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="manager_name" label="经办人">
<el-input disabled v-model="formData.manager_name" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="apply_time" label="申请时间">
<el-input disabled v-model="formData.apply_time" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="be_user" label="被慰问人">
<el-input disabled v-model="formData.be_username" type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="sex" label="慰问人性别">
<el-input disabled placeholder="输入慰问人查询" v-model="formData.sex" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="birthday" label="生&emsp;&emsp;日">
<el-input disabled placeholder="输入慰问人查询" v-model="formData.birthday" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="mobile" label="联系方式">
<el-input placeholder="请输入联系方式" v-model="formData.mobile" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="idcard" label="身份证">
<el-input disabled placeholder="输入慰问人查询" v-model="formData.idcard" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="payee" label="收款人">
<el-input maxlength="100" disabled
v-model="formData.payee_username"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="payee_bank_number" label="收款人银行卡">
<el-input placeholder="请填写银行卡号" v-model="formData.payee_bank_number" maxlength="30"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="type" label="慰问类型">
<el-select v-model="formData.type" @change="typeChange" placeholder="请选择慰问类型"
style="width: 100%">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="occur_time" label="发生时间">
<el-date-picker value-format="yyyy-MM-dd" v-model="formData.occur_time" style="width: 100%">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="12">
<el-form-item prop="type" label="慰问方式">
<el-select v-model="formData.way" placeholder="请选择慰问方式" style="width: 100%">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="k">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="money" label="慰问金额">
<el-input-number style="width: 100%" v-model="formData.money"
placeholder="请填写慰问金额" controls-position="right" :controls="false"
precision="2"
:min="0"
:max="1000000000"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="personnel" label="参加慰问人员">
<el-input maxlength="100" v-model="formData.personnel" placeholder="请填写参加慰问人员"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form label-width="100px" v-if="['慰问品 (C)'].includes(formData.way)">
<el-form-item label="购置物品及价格&emsp;" label-width="135px" class="view-header">
</el-form-item>
</el-form>
<el-row gutter="60">
<el-col :span="24" v-if="['慰问品 (C)'].includes(formData.way)">
<el-form-item label-width="0">
<el-button style="float: right;margin-bottom: 10px" icon="el-icon-plus" size="mini"
@click="formData.goods.push({name:'',price:''})">
添加
</el-button>
<el-table :data="formData.goods" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="物品名称" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品名称" v-model="row.name"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="price" label="物品价格" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品价格" v-model="row.price"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" header-align="center"
width="80px"
fixed="right">
<template slot-scope="scope">
<el-button type="danger" icon="el-icon-delete" circle
:disabled="formData.goods.length==0"
@click="delNotesItem(scope)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<el-col :span="24">
<el-form-item prop="remark" label="备&emsp;&emsp;注">
<el-input maxlength="500" v-model="formData.remark" placeholder="请填写备注"
type="textarea" :autosize="{ minRows: 4, maxRows: 8}"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="files" label="附&emsp;&emsp;件">
<file-upload :files.sync="formData.files"></file-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="primary" @click="doEdit()">确 定</el-button>
</div>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unions: [],
units: [],
delNotesList: [],
tabLoading: false,
userLoading: false,
userOptions: [],
formData: {
goods: []
},
tableData: [],
typeOptions: [],
pageForm: {
searchName: "be.username",
year: new Date().getFullYear() + ""
},
formRules: {
be_user: [{required: true, message: '必填', trigger: ['blur', 'change']}],
type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
disease_type: [{required: true, message: '必填', trigger: ['blur', 'change']}],
way: [{required: true, message: '必填', trigger: ['blur', 'change']}],
money: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
tableColumns: [
{prop: 'be_username', label: '被慰问人'},
{prop: 'be_loginname', label: '被慰问人工号'},
{prop: 'sqr_username', label: '申请人'},
{prop: 'be_unionname', label: '所在工会',sortable: true},
{prop: 'be_unitname', label: '所在单位', sortable: true},
{prop: 'type_name', label: '慰问类型', sortable: true},
{prop: 'way', label: '慰问方式', sortable: true},
{prop: 'personnel', label: '随从人员'},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'shrname', label: '审核人', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'info': httpVueLoader('/components/condolence/Info.vue'),
},
methods: {
async typeChange(id) {
const {data, code, msg} = await $.get("/platform/condolence/type/findOne", {id})
if (data) {
this.$set(this.formData, "money", data.money)
this.$set(this.formData, "way", data.way)
}
},
delNotesItem(scope) {
this.delNotesList.push(scope.row.id)
this.formData.goods.splice(scope.$index, 1)
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'edit') {
this.openEdit(data)
} else if (type == 'delete') {
this.doDelete(data)
} else if (type == 'export') {
condolence.doExport(data.id)
} else if (type == 'Print') {
condolence.doPrint(data.id)
}
},
doExport(row) {
location.href = "/platform/fw/medicalAid/common/exportDoc?id=" + row.id
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async doEdit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.files = JSON.stringify(formData.files)
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + "/doEdit", {
data: JSON.stringify(formData),
sign: this.formData.manager_sign,
delNotesList: JSON.stringify(this.delNotesList)
})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
}
});
},
async getUserData(userId) {
const {data} = await $.get("/platform/fw/condolence/apply/getUserData", {userId})
return data
},
async userChange(be_user) {
const userData = await this.getUserData(be_user);
this.$set(this.formData, 'sex', userData.sex)
this.$set(this.formData, 'birthday', userData.birthday)
this.$set(this.formData, 'idcard', userData.idcard)
},
async openEdit(row) {
const {id} = row
this.formData = {}
this.$set(row, "editLoading", true)
const resp = await $.get(loc() + "/findOne", {id})
requestLaterFun(resp, async (v) => {
condolence.toFormData(v)
this.formData = v
await this.userChange(v.be_user)
this.$refs.guava.edit()
}, () => {
this.$notify.error({
title: '错误',
message: '获取信息失败'
});
}, () => {
this.$set(row, "editLoading", false)
})
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
this.$set(row, "delLoading", true)
const resp = await $.post(loc() + "/doDelete", {id: id});
requestLaterMsgFun(vue, resp, async () => {
this.pageData()
}, () => {
}, () => {
this.$set(row, "delLoading", false)
})
}
}
});
},
async doAdd() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.sign = null
formData.hospital_time = formData.hospital_time.toString()
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(location.href + "/doAdd", {
data: JSON.stringify(formData),
sign: this.formData.sign
})
closeLoadingFunc(loading, resp, async () => {
this.pageData()
this.$refs.guava.index()
}, (data, msg) => {
this.$message.error(msg);
})
}
});
},
openAdd() {
this.formData = {
files: [],
hospital_time: [],
user_name: '${@shiro.getPrincipalProperty("username")}',
sex: '${@shiro.getPrincipalProperty("sex")}',
user_age: moment().diff(moment('${@shiro.getPrincipalProperty("birthday")}'), 'years'),
unit_name: '${@shiro.getPrincipalProperty("unit").getName()}',
mobile: '${@shiro.getPrincipalProperty("mobile")}',
}
const zzzt = '${@shiro.getPrincipalProperty("zzzt")}'
if (zzzt == '在职') {
this.$set(this.formData, "on_job", true)
} else if (zzzt == '退休') {
this.$set(this.formData, "on_job", false)
}
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData();
this.getTypeOptions()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,265 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0% 5%">
<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
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">被慰问人:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 140px;">
<el-option label="被慰问人姓名" value="be.username"></el-option>
<el-option label="被慰问人工号" value="be.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问类型:</div>
<div class="search-item-option">
<el-select v-model="pageForm.type" placeholder="请选择慰问类型" clearable style="width: 100%;">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></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 placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问方式:</div>
<div class="search-item-option">
<el-select v-model="pageForm.way" placeholder="请选择慰问方式" clearable style="width: 100%;">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="慰问列表" :app="this"></table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item
:command="{type:'doExport',data:row}">
导出报销表
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=2080"
:command="{type:'export',data:row}">
导出备案表
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id!=2080"
:command="{type:'Print',data:row}">
打印
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabLoading: false,
tableData: [],
pageForm: {
year: new Date().getFullYear() + ""
},
unions: [],
units: [],
typeOptions: [],
tableColumns: [
{prop: 'be_username', label: '被慰问人'},
{prop: 'be_loginname', label: '被慰问人工号'},
{prop: 'sqr_username', label: '申请人'},
{prop: 'be_unionname', label: '所在工会'},
{prop: 'be_unitname', label: '所在单位',},
{prop: 'type_name', label: '慰问类型', sortable: true},
{prop: 'way', label: '慰问方式', sortable: true},
{prop: 'personnel', label: '随从人员', sortable: true},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'info': httpVueLoader('/components/condolence/Info.vue'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'doExport') {
condolence.doExport(data.id)
} else if (type == 'export') {
condolence.export(data.id)
} else if (type == 'Print') {
condolence.doPrint(data.id)
}
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData();
this.getTypeOptions()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,172 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-date-picker
v-model="pageForm.year"
type="year"
style="width: 100%"
value-format="yyyy"
:clearable="false"
placeholder="选择年"
clearable
@change="yearChange">
</el-date-picker>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.unionid" filterable placeholder="请选择工会" clearable @change="yearChange">
<el-option
v-for="item in union"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.type" placeholder="请选择慰问类型" clearable @change="yearChange">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.way" placeholder="请选择慰问方式" clearable @change="yearChange">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</div>
</el-row>
<el-col class="center-col">
<div style="width: 100%;height:calc(50% - 35px);box-sizing: border-box;padding: 30px 10px"
v-loading="loading.condolencesType"
id="condolencesTypeId"></div>
</el-col>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" width="120px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="被慰问人" prop="be_username" header-align="center"
align="center"></el-table-column>
<el-table-column label="所属工会" prop="unionname" header-align="center"
align="center"></el-table-column>
<el-table-column label="申请时间" prop="apply_time" header-align="center" sortable
align="center"></el-table-column>
<el-table-column label="慰问类型" prop="type_name" header-align="center" sortable
align="center">
</el-table-column>
<el-table-column label="慰问方式" prop="way" header-align="center"
align="center">
</el-table-column>
<el-table-column align="center" prop="state_id" header-align="center" label="申请状态" sortable>
<template scope="scope">
<span :style="'color:'+scope.row.state_color">{{scope.row.state_name}}</span>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</div>
<script>
const chart = {
condolencesTypeId: undefined
}
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabLoading: false,
union: [],
typeOptions: [],
loading: {
condolencesType: false,
},
pageForm: {
year: new Date().getFullYear() + ""
},
}
},
methods: {
yearChange() {
this.pageData()
this.getCondolencesType()
},
async getCondolencesType() {
this.loading.condolencesType = true
const resp = await $.get(loc() + '/condolencesType', this.pageForm)
requestLaterFun(resp, (data) => {
this.loading.condolencesType = false
if (chart.condolencesTypeId) {
chart.condolencesTypeId.changeData(data)
return
}
chart.condolencesTypeId = new G2Plot.Column('condolencesTypeId', {
data,
autoFit: true,
xField: 'name',
yField: 'value',
label: {
// 可手动配置 label 数据标签位置
position: 'middle', // 'top', 'bottom', 'middle',
// 配置样式
style: {
fill: '#FFFFFF',
opacity: 0.6,
},
},
xAxis: {
label: {
autoHide: true,
autoRotate: false,
},
},
meta: {
label: {
alias: '类型',
},
value: {
alias: '慰问数',
},
},
});
chart.condolencesTypeId.render();
})
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
},
async created() {
this.pageData()
this.getCondolencesType()
this.getTypeOptions()
this.union = await getUnions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,344 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0% 5%">
<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
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">被慰问人:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 140px;">
<el-option label="被慰问人姓名" value="be.username"></el-option>
<el-option label="被慰问人工号" value="be.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问类型:</div>
<div class="search-item-option">
<el-select v-model="pageForm.type" placeholder="请选择慰问类型" clearable style="width: 100%;">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问方式:</div>
<div class="search-item-option">
<el-select v-model="pageForm.way" placeholder="请选择慰问方式" clearable style="width: 100%;">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="慰问列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.isAudit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id > 2000" :command="{type:'Review',data:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<info ref="info2" handle label="基层工会主席审核">
<template #handle>
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.opinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="condolence" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</info>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unions: [],
units: [],
tabLoading: false,
userOptions: [],
formData: {},
tableData: [],
typeOptions: [],
pageForm: {
searchName: "be.username",
isAudit: false,
year: new Date().getFullYear() + ""
},
formRules: {
opinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
subLoading1: false,
subLoading2: false,
tableColumns: [
{prop: 'be_username', label: '被慰问人'},
{prop: 'be_loginname', label: '被慰问人工号'},
{prop: 'sqr_username', label: '申请人'},
{prop: 'be_unionname', label: '所在工会'},
{prop: 'be_unitname', label: '所在单位', },
{prop: 'type_name', label: '慰问类型', sortable: true},
{prop: 'way', label: '慰问方式', sortable: true},
{prop: 'personnel', label: '随从人员', sortable: true},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'info': httpVueLoader('/components/condolence/Info.vue'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'Review') {
this.openReview(data)
}
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
}
this.$refs.info2.getInfo(id)
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.formData.pass = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(loc() + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
})
}
})
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData();
this.getTypeOptions()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,343 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
input[type="file"] {
display: none
}
.el-input-number input {
text-align: left !important;
}
.el-input-number__decrease, .el-input-number__increase {
display: none;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0% 5%">
<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
v-model="pageForm.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">被慰问人:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 140px;">
<el-option label="被慰问人姓名" value="be.username"></el-option>
<el-option label="被慰问人工号" value="be.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问类型:</div>
<div class="search-item-option">
<el-select v-model="pageForm.type" placeholder="请选择慰问类型" clearable style="width: 100%;">
<el-option v-for="item in typeOptions" :value="item.id"
:label="item.name+' ('+item.code+')'"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">慰问方式:</div>
<div class="search-item-option">
<el-select v-model="pageForm.way" placeholder="请选择慰问方式" clearable style="width: 100%;">
<el-option
v-for="(v,k) in condolence.way"
:key="k"
:label="v"
:value="v">
</el-option>
</el-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="慰问列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.isAudit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='state_id'" scope="{row}">
<span :style="'color:'+row.state_color">{{row.state_name}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template 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:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :disabled="row.state_id > 2040" :command="{type:'Review',data:row}">
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
<!--#include("/layouts/pagination.html"){}#-->
</template>
<template #edit>
<info ref="info2" handle label="工会副主席审核">
<template #handle>
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.time" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.opinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="sign" label="签&emsp;&emsp;字">
<sign prefix="condolence" :qz.sync="formData.sign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" :disabled="subDis" :loading="subLoading1">拒
绝
</el-button>
<el-button type="primary" @click="doReview(true)" :disabled="subDis" :loading="subLoading2">通
过
</el-button>
</div>
</template>
</info>
</template>
<template #view>
<info ref="info"></info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabLoading: false,
userOptions: [],
formData: {},
tableData: [],
pageForm: {
searchName: "be.username",
isAudit: false,
year: new Date().getFullYear() + ""
},
formRules: {
opinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subDis: false,
subLoading1: false,
subLoading2: false,
unions: [],
units: [],
tableColumns: [
{prop: 'be_username', label: '被慰问人'},
{prop: 'be_loginname', label: '被慰问人工号'},
{prop: 'sqr_username', label: '申请人'},
{prop: 'be_unionname', label: '所在工会'},
{prop: 'be_unitname', label: '所在单位', },
{prop: 'type_name', label: '慰问类型', sortable: true},
{prop: 'way', label: '慰问方式', sortable: true},
{prop: 'personnel', label: '随从人员', sortable: true},
{prop: 'apply_time', label: '申请时间', sortable: true},
{prop: 'state_id', label: '申请状态', sortable: true},
],
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'info': httpVueLoader('/components/condolence/Info.vue'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'Review') {
this.openReview(data)
}
},
async openReview(row) {
const {id} = row
this.formData = {
id,
username: "${@shiro.getPrincipalProperty('username')}",
time: moment().format('YYYY-MM-DD'),
}
this.$refs.info2.getInfo(id)
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
async doReview(flag) {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.formData.pass = flag
this.subDis = true
flag ? this.subLoading2 = true : this.subLoading1 = true
const resp = await $.post(loc() + "/doReview", this.formData)
requestLaterMsgFun(vue, resp, () => {
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.subDis = false
this.subLoading1 = false
this.subLoading2 = false
})
}
})
},
openView(row) {
const {id} = row
this.$refs.info.getInfo(id)
this.$refs.guava.view()
},
async getTypeOptions() {
const {code, data} = await $.get("/platform/condolence/type/getAll")
if (code == 0) {
this.typeOptions = data
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData();
this.getTypeOptions()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,846 @@
<!--#
layout("/layouts/platform.html"){
#-->
<!--
大病互助基金会员变更管理
廖怡爽
-->
<style>
.dia .el-dialog__body {
padding: 5px 20px;
}
.note {
width: 100%;
height: 200px;
}
.el-radio.is-bordered.is-disabled.is-checked {
/* cursor: not-allowed; */
border-color: #409EFF;
}
.el-radio__input.is-disabled .is-checked .el-radio__inner, .el-radio__input.is-disabled.is-checked .el-radio__inner {
background-color: #409EFF;
/*border-color: #E4E7ED; */
}
.tpa {
padding: 10px;
text-align: center;
width: 12%;
color: #777;
background-color: rgb(250, 250, 250);
border: 1px solid rgb(220, 220, 220);
}
.tpb {
padding: 10px;
text-align: center;
color: #333;
width: 15%;
border: 1px solid rgb(220, 220, 220);
}
.tpc {
padding: 10px;
color: #a0a9b4;
width: 15%;
border: 1px solid rgb(220, 220, 220);
}
.el-card__body {
padding: 0;
}
.myT .has-gutter tr th {
background-color: #F5F7FA;
}
input[type=file] {
display: none;
}
</style>
<div id="app" v-cloak>
<div hidden id="username">${@shiro.getPrincipalProperty('username')}</div>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-date-picker
v-model="pageForm.jfnf"
type="year"
placeholder="选择年"
format="yyyy"
value-format="yyyy"
style="width: 130px;"
>
</el-date-picker>
</div>
<div class="btn-group tool-button mt5">
<el-select placeholder="请选择基层工会" @change="unionChange" @clear="unionChange" v-model="pageForm.fghid"
clearable="true" filterable="true"
style="width:200px;">
<el-option v-for="item in ghOptions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select v-model="pageForm.unitid" filterable="true" clearable placeholder="请选择单位">
<el-option
v-for="item in unitOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询" style="width: 100px;">
<el-option label="工号" value="loginname"></el-option>
<el-option label="姓名" value="username"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select placeholder="请选择人员类型" v-model="pageForm.rylx" clearable="true" filterable="true"
style="width:160px;">
<el-option
v-for="item in optionsrylx"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select placeholder="请选择变更类型" v-model="pageForm.bglx" clearable="true" filterable="true"
style="width:160px;">
<el-option
v-for="item in optionsbglx"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button icon="el-icon-search" @click="doSearch"
style="background-color:#409eff;color: white;"></el-button>
</div>
<!-- <div class="btn-group tool-button mt5" style="margin-bottom: 10px;">
<span style="color: grey;font-weight: bold;">基金会员退休去世变更处理: </span>
<el-button size="small" type="warning" @click="downloadmodel" >下载会员退休去世变更模板</el-button>
<el-button size="small" type="success" @click="openAdd" >上传会员退休去世记录</el-button>
</div>-->
</el-row>
<el-row class="el-table-container">
<el-table
@sort-change='pageOrder'
:data="tableData"
size="medium"
header-align="center"
style="width: 100%"
>
<el-table-column label="序号" width="90px" type="index" header-align="center" align="center">
<template scope="scope"><span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column
prop="loginname"
label="工号"
header-align="center"
align="center">
</el-table-column>
<el-table-column
prop="username"
label="姓名"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="sex"
label="性别"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="rxsj"
label="入校日期"
header-align="center"
align="center">
</el-table-column>
<el-table-column
prop="mobile"
label="电话"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="depname"
label="所属单位"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="unionname"
label="所属基层工会"
header-align="center"
align="center">
</el-table-column>
<el-table-column
prop="zzzt"
label="在职状态"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="rylx"
label="人员类型"
header-align="center"
align="center">
<template scope="scope">
<el-tag type="primary">{{scope.row.rylx}}</el-tag>
</template>
</el-table-column>
<el-table-column
label="变更类型"
header-align="center"
align="center">
<template scope="scope">
<el-tag v-if="scope.row.jllx==1">加入基金</el-tag>
<el-tag type="warning" v-if="scope.row.jllx==2">退出基金</el-tag>
</template>
</el-table-column>
<el-table-column
prop="zssj"
label="变更日期"
header-align="center"
align="center">
</el-table-column>
<!-- <el-table-column
label="操作"
header-align="center"
align="center"
width="200px"
>
<template slot-scope="scope">
<el-button type="success" size="mini" @click="openDetail(scope.row.id)">查看</el-button>
<el-button v-if="sfgl==2" type="danger" size="mini" @click="tcjj(scope.row.id)">退出大病基金</el-button>
</template>
</el-table-column>-->
</el-table>
</el-row>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
<el-dialog
class="ViewDialogClass"
title="查看详情"
:visible.sync="roleDialogVisible"
width="55%"
>
<el-collapse v-model="activeName">
<el-collapse-item title="用户信息" name="1">
<el-card>
<div>
<table style="width: 100%">
<tr style="border: 1px solid rgb(220,220,220);">
<td class="tpa">姓&emsp;&emsp;名</td>
<td class="tpb">{{roleData.user.username}}</td>
<td class="tpa">性&emsp;&emsp;别</td>
<td class="tpb">{{roleData.user.sex}}</td>
<td class="tpa">出生日期</td>
<td class="tpb">{{roleData.user.birthday}}</td>
</tr>
<tr style="border: 1px solid rgb(220,220,220);">
<td class="tpa">出生地点</td>
<td class="tpb">{{roleData.user.csdd}}</td>
<td class="tpa">民&emsp;&emsp;族</td>
<td class="tpb">{{roleData.user.mz}}</td>
<td class="tpa">政治面貌</td>
<td class="tpb">{{roleData.user.zzmc}}</td>
</tr>
<tr style="border: 1px solid rgb(220,220,220);">
<td class="tpa">工&emsp;&emsp;资</td>
<td class="tpb">{{roleData.user.gz}}</td>
<td class="tpa">职&emsp;&emsp;称</td>
<td class="tpb">{{roleData.user.zc}}</td>
<td class="tpa">联系电话</td>
<td class="tpb">{{roleData.user.mobile}}</td>
</tr>
<tr style="border: 1px solid rgb(220,220,220);">
<td class="tpa" colspan="1">所在部门</td>
<td class="tpb" colspan="1">{{roleData.user.depname}}</td>
<td class="tpa" colspan="1">所属基层工会</td>
<td class="tpb" colspan="1">{{roleData.user.unionname}}</td>
<td class="tpa" colspan="1">现任职务</td>
<td class="tpb" colspan="2">{{roleData.user.zw}}</td>
</tr>
</table>
</div>
</el-card>
</el-collapse-item>
<el-collapse-item title="申请记录" name="2">
<el-table
:data="roleData.sqjls"
size="small"
header-align="center"
style="width: 100%"
>
<!-- <el-table-column label="序号" type="index" header-align="center" align="center"></el-table-column>-->
<el-table-column
prop="sqsj"
label="申请时间"
header-align="center"
align="center"
width="100px">
</el-table-column>
<el-table-column
label="申请类型"
header-align="center"
align="center">
<template scope="scope">
<el-tag v-if="scope.row.jllx==1">加入基金</el-tag>
<el-tag type="warning" v-if="scope.row.jllx==2">退出基金</el-tag>
</template>
</el-table-column>
<el-table-column
prop="jjzt"
label="申请状态"
header-align="center"
align="center"
width="120px"
>
<template scope="scope">
<el-tag type="warning" v-if="scope.row.jjzt==1">待基层工会审核</el-tag>
<el-tag type="warning" v-if="scope.row.jjzt==2">待离退休干部处审核</el-tag>
<el-tag type="warning" v-if="scope.row.jjzt==3">待互管会审核</el-tag>
<el-tag type="danger" v-if="scope.row.jjzt==4">审核不通过</el-tag>
<el-tag type="danger" v-if="scope.row.jjzt==5">分会/离退休审核不通过</el-tag>
<el-tag type="success" v-if="scope.row.jjzt==6">互管会审核通过</el-tag>
</template>
</el-table-column>
<!-- <el-table-column
prop="jjshr"
label="分会审核人"
header-align="center"
align="center">
<template scope="scope">
<span style="color: #a0a9b4" v-if="scope.row.jjshr==''||scope.row.jjshr==null">暂无审核</span>
<span v-else>{{scope.row.jjshr}}</span>
</template>
</el-table-column>-->
<el-table-column
prop="jjshyj"
label="分会审核意见"
header-align="center"
align="center"
width="120px">
<template scope="scope">
<span style="color: #a0a9b4" v-if="scope.row.jjshyj==''||scope.row.jjshyj==null">暂无</span>
<span v-else>{{scope.row.jjshyj}}</span>
</template>
</el-table-column>
<el-table-column
prop="jjshsj"
label="分会审核时间"
header-align="center"
align="center"
width="100px">
<template scope="scope">
<span style="color: #a0a9b4" v-if="scope.row.jjshsj==''||scope.row.jjshsj==null">暂无</span>
<span v-else>{{scope.row.jjshsj}}</span>
</template>
</el-table-column>
<el-table-column
prop="hghshyj"
label="互管会审核意见"
header-align="center"
align="center"
width="120px">
<template scope="scope">
<span style="color: #a0a9b4" v-if="scope.row.hghshyj==''||scope.row.hghshyj==null">暂无</span>
<span v-else>{{scope.row.hghshyj}}</span>
</template>
</el-table-column>
<el-table-column
prop="hghshsj"
label="互管会审核时间"
header-align="center"
align="center"
width="120px">
<template scope="scope">
<span style="color: #a0a9b4" v-if="scope.row.hghshsj==''||scope.row.hghshsj==null">暂无</span>
<span v-else>{{scope.row.hghshsj}}</span>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="缴费记录" name="3">
<el-table
:data="roleData.listjf"
size="small"
header-align="center"
style="width: 100%"
>
<!-- <el-table-column label="序号" type="index" header-align="center" align="center"></el-table-column>-->
<el-table-column
prop="jfyear"
label="缴费年份"
header-align="center"
align="center"
width="100px">
</el-table-column>
<el-table-column
label="缴费金额"
header-align="center"
align="center">
<template scope="scope">
<el-tag type="danger">{{scope.row.jfje}}</el-tag>
</template>
</el-table-column>
<el-table-column
prop="sfjf"
label="是否扣款"
header-align="center"
align="center"
width="120px"
>
<template scope="scope">
<el-tag type="info" v-if="scope.row.sfjf==0">未扣款</el-tag>
<el-tag type="success" v-if="scope.row.sfjf==1">已扣款</el-tag>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
</el-collapse>
</el-collaps>
<span slot="footer" class="dialog-footer">
<el-button type="danger" @click="roleDialogVisible = false">关 闭</el-button>
</span>
</el-dialog>
<el-dialog
class="ViewDialogClass"
title="上传会员退休去世变更记录"
@close="fileList = [];delFiles = [];uploadForm:{}"
:close-on-click-modal="false"
:visible.sync="addDialogVisible"
width="60%">
<el-form :model="formData" ref="addForm" size="small" label-width="140px">
<el-row>
<div class="btn-group tool-button mt5">
<el-form-item prop="fj" label="退休/去世变更记录">
<el-upload
name="file"
ref="upload"
multiple="false"
:auto-upload="false"
class="upload-demo"
action="/platform/zgfw/dbhzjjbg/getFiles"
:data="uploadForm"
:on-success="handleSuccess"
:on-error="handleError"
:on-change="handleChange"
:on-remove="handleRemove"
:file-list="fileList">
<el-button size="small" type="primary">选取文件</el-button>
<div class="el-upload__tip" slot="tip" style="color:#F56C6C;">只能上传1个
xls/xlsx文件;必须上传模板文件!
</div>
</el-upload>
</el-form-item>
</div>
<div class="pull-right offscreen-right mt5" style="margin-right: 10px;">
<el-button type="warning" size="small" type="primary" @click="doAdd">获取文件内容</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table
:data="fileData"
size="medium"
header-align="center"
style="width: 100%"
>
<el-table-column label="序号" width="90px" type="index" header-align="center" align="center">
</el-table-column>
<el-table-column
prop="loginname"
label="工号"
header-align="center"
align="center">
</el-table-column>
<el-table-column
prop="name"
label="姓名"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="depname"
label="所属单位"
header-align="center"
align="center">
</el-table-column>
<el-table-column
prop="rylx"
label="人员类型"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="bgsj"
label="变更时间"
header-align="center"
align="center">
</el-table-column>
<el-table-column
prop="bglx"
label="变更类型"
header-align="center"
align="center">
</el-table-column>
<el-table-column
sortable
prop="sfcz"
label="是否存在"
header-align="center"
align="center">
<template scope="scope">
<el-tag type="success" v-if="scope.row.sfcz=='1'">找到数据</el-tag>
<el-tag type="danger" v-if="scope.row.rylx=='0'">数据不存在</el-tag>
</template>
</el-table-column>
<el-table-column
label="是否加入基金"
header-align="center"
align="center">
<template scope="scope">
<el-tag v-if="scope.row.sfjrjj==1">已加入</el-tag>
<el-tag type="warning" v-if="scope.row.sfjrjj==0">未加入</el-tag>
</template>
</el-table-column>
</el-table>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doplbg">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
data: function () {
var self = this
return {
ghOptions: [],
sfgl: 0,
identity: '',
activeName: ['1', '2', '3'],
roleData: {user: {}, sqjl: [], listjf: []},
unitOptions: [],
tableData: [],
fileData: [],
jrTime: [],
pageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
fghid: "",
unitid: "",
jrTime: "",
rylx: "",
bglx: "",
jfnf: moment().format('YYYY')
},
optionsrylx: [
{
value: '1',
label: '在编'
}, {
value: '2',
label: '离退休人员'
},
// {
// value: '3',
// label: '劳动服务公司'
// }, {
// value: '5',
// label: '去世人员'
// }
],
optionsbglx: [{
value: '1',
label: '加入基金'
}, {
value: '2',
label: '退出基金'
}],
roleDialogVisible: false,
addDialogVisible: false,
uploadForm: [],
fileList: [],
delFiles: [],
formData: {fileurl: ''},
}
},
methods: {
openDetail: function (id) {
var self = this;
$.get(base + "/platform/zgfw/dbhzjjyl/queryDetail", {"userid": id}, function (data) {
if (data.code == 0) {
self.roleData = data.data;//加载后台表单数据
self.roleDialogVisible = true
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json")
},
/**************************************时间格式化处理************************************/
dateFtt: function (fmt, date) { //author: meizz
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
},
doSearch: function () {
this.pageForm.pageNumber = 1;
this.pageData();
},
pageOrder: function (column) {//按字段排序
switch (column.order) {
case 'descending':
column.order = 'desc'
break
case "ascending":
column.order = 'asc'
break
}
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange: function (val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange: function (val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData: function () {//加载分页数据
var self = this;
sublime.showLoadingbar();//显示loading
if (self.jrTime) {
self.pageForm.jrTime = self.jrTime.toString();
} else {
self.pageForm.jrTime = "";
}
$.post(base + "/platform/zgfw/dbhzjjbg/data", self.pageForm, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.tableData = data.data.jj.list;
self.pageForm.totalCount = data.data.jj.totalCount;
self.sfgl = data.data.sfgl;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
openAdd: function () {
var self = this;
self.addDialogVisible = true;
self.fileData = [];
self.fileList = [];
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
},
doAdd: function () {
var self = this;
self.$refs["addForm"].validate(function (valid) {
if (valid) {
var flag = true;
for (var i in self.fileList) {
var name = self.fileList[i].name;
var testmsg = name.substring(name.lastIndexOf('.') + 1);
testmsg = testmsg.toLowerCase();
var e = testmsg === 'xls';
var f = testmsg === 'xlsx';
if (!e && !f) {
self.$message.error("您选择的文件格式不正确!请重新选择!");
flag = false
} else if (self.fileList.length > 1) {
self.$message.error("最多只能上传1个附件!");
flag = false
}
}
if (flag) {
if (self.fileList.length > 0) {
loading = true;
self.fileData = [];
self.$refs.upload.submit();
} else {
self.$message.error("请选择一个附件!");
}
}
}
});
},
//提交变更数据
doplbg: function () {//加载分页数据
var self = this;
$.post(base + "/platform/zgfw/dbhzjjbg/plbg", {"userlist": JSON.stringify(self.fileData)}, function (data) {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
self.$message({
message: data.msg,
type: 'success'
});
self.pageData();
self.addDialogVisible = false;
} else {
self.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
handleSuccess: function (response, file, fileList) {
this.$refs.upload.clearFiles();//清除已上传的列表
loading = false;
if (response.code == 1) {
this.$message({
message: response.msg,
type: "error"
});
} else {
this.fileData = response.data;
}
},
handleError: function (err, file, fileList) {
loading = false;
this.$message({
message: err.msg,
type: "error"
});
},
handleChange: function (file, filelist) {
var self = this;
self.fileList = filelist;
},
handleRemove: function (file, filelist) {
var self = this;
self.fileList = filelist;
if (typeof (file.url) === "undefined") {
} else {
console.log("增加要删除的文件:" + file.name)
self.delFiles.push({uid: file.uid, url: file.url})
}
},
//下载模板
downloadmodel: function () {
var self = this;
var url = "src/main/resources/excelTemplate/txqsmodel1.xlsx";
var name = "大病会员退休去世变更模板.xlsx";
window.location.href = base + "/platform/zgfw/dbhzjjjf/downLoad?path=" + url + "&filename=" + name;
},
async unionChange() {
if (!this.pageForm.fghid) {
this.pageForm.unitid = ''
this.unitOptions = []
}
this.unitOptions = await getUnits(this.pageForm.fghid)
},
},
created: async function () {
this.pageData();
this.ghOptions = await getUnions()
this.unitOptions = await getUnits()
}
})
</script>
<!--#
}
#-->

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