first commit

This commit is contained in:
2026-09-23 09:38:39 +08:00
commit 98a8b8cace
6257 changed files with 1266718 additions and 0 deletions
@@ -0,0 +1,410 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-divider--horizontal {
margin: 5px 0;
}
</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="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 header-align="center" label="每日开放场次"
prop="count">
<template slot-scope="{row}">
<el-tooltip class="item" effect="dark" placement="right">
<div slot="content">
<div v-if="row.open_hours" v-for="item in row.open_hours">
{{item.start_time}} - {{item.end_time}}
<el-divider></el-divider>
</div>
<div v-else>暂无开放场次</div>
</div>
<el-link :underline="false" type="primary">
<i class="el-icon-view el-icon--left"></i>{{row.open_hours.length}}
</el-link>
</el-tooltip>
</template>
</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" :show-overflow-tooltip="true" header-align="center" label="是否多次预约"
prop="multiple">
<template slot-scope="{row}">
<el-switch disabled v-model="row.multiple" active-color="#13ce66"
inactive-color="#ff4949"></el-switch>
</template>
</el-table-column>
<el-table-column align="center" :show-overflow-tooltip="true" header-align="center" label="限定工作日预约"
prop="workday">
<template slot-scope="{row}">
<el-switch disabled v-model="row.workday" 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>
<div style="padding: 0 5%">
<el-form :model="formData" ref="addForm" :rules="formRules" label-width="120px">
<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="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="4">
<el-form-item prop="state" label="开启状态">
<el-switch v-model="formData.state" active-color="#13ce66" inactive-color="#ff4949">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item prop="state" label="是否多次预约">
<el-switch v-model="formData.multiple" active-color="#13ce66" inactive-color="#ff4949">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item prop="state" label="限定工作日预约">
<el-switch v-model="formData.workday" active-color="#13ce66" inactive-color="#ff4949">
</el-switch>
</el-form-item>
</el-col>
<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-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="性别限制" prop="sexLimit">
<el-radio-group size="medium" v-model="formData.sexLimit">
<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-form-item label="添加场次&emsp;" label-width="110px" class="view-header">
<el-button style="float: right;margin-bottom: 10px" icon="el-icon-plus" size="mini"
type="primary" @click="formData.open_hours.push({})">添加
</el-button>
<el-table :data="formData.open_hours" border size="mini">
<el-table-column prop="start_time" label="开始时间" align="center" header-align="center">
<template slot-scope="{row}">
<el-time-select
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
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 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>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="primary" :disabled="subDis" @click="operation">确 定</el-button>
</div>
</div>
</template>
<template #view>
</template>
</guava>
</div>
<script>
<!--# include("/platform/activity/includeJs/activityUtil.js"){} #-->
const activityUtil = new typeUtil()
const vue = new Vue({
el: '#app',
data() {
return {
activityTypeList: [],
tabKey: '',
tableLoading: false,
subDis: false,
tableData: [],
formData: {
open_hours: [{}],
sexLimit: '0'
},
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']}],
}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
},
methods: {
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)
this.$refs.guava.edit()
},
openAdd() {
this.formData = {
state: true,
multiple: true,
open_hours: [{}],
create_username: '${@shiro.getPrincipalProperty("username")}',
create_time: moment().format('YYYY-MM-DD'),
sexLimit: '0'
}
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,201 @@
<!--#
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="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="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 @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'),
},
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>
<!--#
}
#-->
File diff suppressed because it is too large Load Diff
@@ -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" @selection-change="handleSelectionChange" @sort-change="pageOrder"
row-key="id"
v-loading="tableLoading">
<el-table-column :reserve-selection="true" type="selection" v-if="pageForm.isAudit === false"
width="55"></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 style="color: #e6a23c"
v-if="[0].includes(row.stateaudittype)">{{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 @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'),
},
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,436 @@
<!--#
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">
<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>
</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"></el-input>
</el-form-item>
<el-form-item label="模块名称" prop="moduleName">
<el-input v-model="formData.moduleName"></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"></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"){} #-->
function isJson(str) {
if (typeof str == 'string') {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
}
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 findAll() {
const resp_data = await $.get(loc() + '/findAll')
if (resp_data.code === 0) {
resp_data.data.forEach(v => {
v.auditStateList.forEach(x => {
if (x.matchCnd) {
console.log(x.matchCnd)
x.matchCnd = JSON.parse(x.matchCnd)
console.log(x.matchCnd)
}
})
})
this.tableData = resp_data.data
}
},
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}
})
if (v['matchCnd']) {
const o = isJson(v['matchCnd']);
if (!o) {
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)
this.findAll()
} else {
this.notifyError(resp.msg)
}
}
} catch (e) {
}
},
async openEdit(row) {
const d = clone(row)
let u = []
const {data} = await $.post(loc() + '/findOne', {module: row.moduleName})
data.forEach(v => {
v['selectUserId'] = v.auditStateUserList.map(x => x.userId)
u = u.concat(v['selectUserId'])
})
d.auditStateList = data
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)
this.findAll()
} 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) {
if (this.cnd == null) {
if (this.cnd == null) {
this.cnd = {
method: "AND",
conditions: [{}],
}
}
} else {
try {
this.cnd = JSON.parse(node.matchCnd)
} catch (e) {
this.cnd = node.matchCnd
}
}
} 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.findAll()
this.initCndFields()
this.maxStateId = await activityUtil.findMaxStateId()
this.stateAuditTypeList = await getEnumOptions('AuditTypeEnum')
}
})
</script>
<!--#
}
#-->