first commit

This commit is contained in:
2026-09-08 19:49:21 +08:00
commit ebffbab428
7320 changed files with 1477614 additions and 0 deletions
@@ -0,0 +1,229 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.cus_icon {
font-size: 34px;
cursor: pointer;
}
.el-icon-circle-plus {
color: #236eb4;
}
.el-icon-remove {
color: #f56c6c;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<template #header>
<h3 style="color: #1867b0">发起会议</h3>
</template>
<el-tabs type="card" v-model="activeName">
<el-tab-pane label="会议基础信息" name="first">
<template>
<vi-title title="会议基础信息"></vi-title>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="会议名称" prop="meetingName">
<el-input placeholder="请填写会议名称" type="text"
v-model.trim="formData.meetingName"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="会议地点" prop="meetingAddress">
<el-input placeholder="请填写会议地点" type="text"
v-model.trim="formData.meetingAddress"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="会议类型" prop="typeId">
<el-select filterable placeholder="请选择会议类型" style="width: 100%"
v-model="formData.typeId">
<el-option :label="item.meetingTypeName" :value="item.id"
v-for="item in meetingTypeList"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="会议时间" prop="meetingTime">
<el-date-picker end-placeholder="结束日期"
format="yyyy-MM-dd"
range-separator="至" start-placeholder="开始日期" style="width: 100%"
type="daterange"
v-model="formData.meetingTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="formData.isMsgNotify === '1' ? '6' : '12'">
<el-form-item label="是否消息通知" prop="isMsgNotify">
<el-radio border label="1" size="medium" v-model="formData.isMsgNotify">
</el-radio>
<el-radio border label="2" size="medium" v-model="formData.isMsgNotify">
</el-radio>
</el-form-item>
</el-col>
<el-col :span="6" v-if="formData.isMsgNotify === '1'">
<el-form-item label="发送方式" prop="sendType">
<el-checkbox-group size="medium" v-model="formData.sendType">
<el-checkbox border label="msg">短信发送</el-checkbox>
<el-checkbox border label="WeChat">微信发送</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否可以请假" prop="isCanLeave">
<el-radio border label="yes" size="medium" v-model="formData.isCanLeave">允许
</el-radio>
<el-radio border label="no" size="medium" v-model="formData.isCanLeave">不允许
</el-radio>
</el-form-item>
</el-col>
<el-col :span="6" v-if="formData.isCanLeave === 'yes'">
<el-form-item label="请假截止时间" prop="leaveDeadline">
<el-date-picker format="yyyy-MM-dd" placeholder="请选择日期" style="width: 100%"
type="date"
v-model="formData.leaveDeadline"
value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex" v-if="formData.isMsgNotify === '1'">
<el-col :span="24">
<el-form-item label="消息内容" prop="msgContent">
<el-input :rows="4" placeholder="请输入消息内容" type="textarea"
v-model="formData.msgContent"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="24">
<el-form-item label="会议描述" prop="meetingDescribe">
<el-input :rows="4" placeholder="请输入会议描述" type="textarea"
v-model="formData.meetingDescribe"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
</el-tab-pane>
<el-tab-pane label="参与人员信息" name="second">
<template>
<vi-title title="参与人员信息"></vi-title>
<el-table :data="userTableData" style="width: 100%; margin-bottom: 20px">
<el-table-column label="用户名" prop="stateName"></el-table-column>
<el-table-column label="姓名" prop="reviewer"></el-table-column>
<el-table-column label="性别" prop="reviewer"></el-table-column>
<el-table-column label="所属单位" prop="reviewer"></el-table-column>
<el-table-column label="院级工会" prop="reviewer"></el-table-column>
</el-table>
</template>
</el-tab-pane>
</el-tabs>
<el-row justify="end" style="margin-top: 20px" type="flex">
<el-button @click="doSubmit" type="primary">提交</el-button>
</el-row>
</el-card>
</guava>
</div>
<script>
<!--# include("/platform/meeting/includeJs/meetingUtil.js"){} #-->
const meetUtil = new meetingUtil()
var vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
meetingTypeList: [],
activeName: 'first',
formData: {isMsgNotify: '2', sendType: [], isCanLeave: 'no'},
userTableData: [],
tableData: [{stateName: '', auditStateUserList: []}],
formRules: {
meetingName: [{required: true, message: '请填写会议名称', trigger: ['blur', 'change']}],
meetingAddress: [{required: true, message: '请填写会议地点', trigger: ['blur', 'change']}],
typeId: [{required: true, message: '请选择会议类型', trigger: ['blur', 'change']}],
meetingTime: [{required: true, message: '请选择会议时间', trigger: ['blur', 'change']}],
sendType: [{required: true, message: '请选择发送方式', trigger: ['blur', 'change']}],
msgContent: [{required: true, message: '请填写消息内容', trigger: ['blur', 'change']}],
leaveDeadline: [{required: true, message: '请选择请假截止时间', trigger: ['blur', 'change']}],
},
userList: [],
}
},
methods: {
async doSubmit() {
const valid = await this.$refs["addForm"].validate()
if (valid) {
if (this.formData.isCanLeave === 'yes') {
for (const [index, item] of this.tableData.entries()) {
if (item.stateName === '' || item.stateName === undefined) {
this.$notify({title: '警告', message: '第' + (index + 1) + '条审核节点名称不能为空', type: 'warning'})
return
}
if (item.auditStateUserList.length === 0) {
console.log(item.auditStateUserList)
this.$notify({title: '警告', message: '第' + (index + 1) + '条审核人不能为空', type: 'warning'})
return
}
}
}
//开始提交
const submitFormData = clone(this.formData)
submitFormData.startTime = this.formData.meetingTime && this.formData.meetingTime.length > 0 ? this.formData.meetingTime[0] : ''
submitFormData.endTime = this.formData.meetingTime && this.formData.meetingTime.length > 1 ? this.formData.meetingTime[1] : ''
delete submitFormData.meetingTime
submitFormData.meetingUserList = this.userTableData
const {code} = await $.post(loc() + "/doAdd", {
meetingInfo: JSON.stringify(submitFormData)
})
if (code === 0) {
this.$notify({title: '成功', message: '提交成功', type: 'success'})
}
}
},
},
async created() {
this.meetingTypeList = await meetUtil.getAllMeetingType()
},
watch: {
'tableData': {
handler: function (newValue, oldValue) {
},
deep: true,
}
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,422 @@
<!--#
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>
<vi-title title="基础信息"></vi-title>
<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>
<vi-title title="审核节点信息(温馨提醒:如审核节点没有限制,审核节点类型不选即可)"></vi-title>
<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="auditAfterType" width="150px">
<template slot-scope="scope">
<el-select v-model="scope.row.auditAfterType" clearable>
<el-option :label="item.desc"
:value="item.value"
v-for="item in customAuditTypeList"></el-option>
</el-select>
</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/meeting/includeJs/meetingUtil.js"){} #-->
const meetUtil = new meetingUtil()
var 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: [],
customAuditTypeList: [],
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: null,
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) {
x.matchCnd = JSON.parse(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}
})
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 = []
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)
this.findAll()
} else {
this.notifyError(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.findAll()
this.initCndFields()
this.maxStateId = await meetUtil.findMaxStateId()
this.stateAuditTypeList = await getEnumOptions('AuditTypeEnum')
this.customAuditTypeList = await getEnumOptions('CustomAuditTypeEnum')
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,40 @@
// const meetingUtil = {
//
//
//
// async getMeetingType(){
// $.get()
// }
//
// }
class meetingUtil {
constructor() {
}
/**
* 获取全部会议类型
* @returns {Promise<*[]|*>}
*/
async getAllMeetingType() {
const resp = await $.get('/platform/meeting/basic/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/meeting/basic/type/findMaxStateId')
if (resp.code === 0) {
return resp.data
}
}
}
@@ -0,0 +1,139 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<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-input clearable
placeholder="可输入会议名称、地点进行查询"
v-model="pageForm.searchKeyword"></el-input>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="会议信息">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='isCanLeave'">
<span class="text-muted" v-if="row.isCanLeave==null">未设置</span>
<span class="text-success" v-if="row.isCanLeave==true"></span>
<span class="text-danger" v-if="row.isCanLeave==false"></span>
</template>
</el-table-column>
<el-table-column label="操作" width="300px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini">查看</el-button>
<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>
</guava>
</div>
<script>
<!--# include("/platform/meeting/includeJs/meetingUtil.js"){} #-->
const meetUtil = new meetingUtil()
window['vue'] = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
hold: false,
tableColumns: [
{prop: 'meetingName', label: '会议名称', sortable: true},
{prop: 'meetingTypeName', label: '会议类型', sortable: true},
{prop: 'startTime', label: '会议时间', sortable: true},
/*{prop: 'endTime', label: '结束时间', sortable: true},*/
{prop: 'location', label: '会议地点', sortable: true},
{prop: 'isCanLeave', label: '能否请假', sortable: true},
],
pageForm: {
year: new Date().getFullYear().toString()
},
meetingTypeList: []
}
},
methods: {
openView(row) {
const {id, notifyId, hold} = row
window.location.href = '/platform/meeting/manage/createMeeting?notifyId=' + notifyId + "&hold=" + true + "&id=" + id
},
openEdit(row) {
const {id, notifyId, hold} = row
window.location.href = '/platform/meeting/manage/createMeeting?notifyId=' + notifyId + "&hold=" + false + "&id=" + id
},
async doDelete(id) {
try {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/doDelete', {id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
}
}
} catch (e) {
console.log(e)
}
}
},
async created() {
this.meetingTypeList = await meetUtil.getAllMeetingType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,263 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<template #header>
<el-row type="flex">
<el-col :span="12" v-if="id">
<el-button @click="location.replace('/platform/meeting/manage')"
icon="el-icon-back"
style="font-size: 16px" type="text">返回
</el-button>
</el-col>
<el-col :span="12" class="text-right">
<h3 style="color: rgb(24, 103, 176);">{{h3Title}}</h3>
</el-col>
</el-row>
</template>
<!--<template #header>
<h3 style="color: #1867b0">发起会议</h3>
</template>-->
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<vi-title title="会议基础信息"></vi-title>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="会议名称" prop="meetingName">
<el-input :disabled="hold" @input="meetingNameInput"
placeholder="请填写会议名称" type="text"
v-model.trim="formData.meetingName"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="会议地点" prop="location">
<el-input :disabled="hold" placeholder="请填写会议地点"
type="text" v-model.trim="formData.location"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="12">
<el-form-item label="会议类型" prop="typeId">
<el-select :disabled="hold" filterable placeholder="请选择会议类型"
style="width: 100%" v-model="formData.typeId">
<el-option :label="item.meetingTypeName" :value="item.id"
v-for="item in meetingTypeList"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<!--<el-form-item label="会议时间" prop="meetingTime">
<el-date-picker end-placeholder="结束日期"
format="yyyy-MM-dd HH:mm:ss"
range-separator="至" start-placeholder="开始日期"
style="width: 100%"
:disabled="hold"
type="datetimerange"
v-model="formData.meetingTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>-->
<el-form-item label="会议时间" prop="meetTime">
<el-date-picker :disabled="hold"
format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择会议时间"
style="width: 100%"
type="datetime"
v-model="formData.meetTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="8">
<el-form-item label="是否可以请假" prop="isCanLeave">
<el-radio :disabled="hold" :label="true" border size="medium" v-model="formData.isCanLeave">
允许
</el-radio>
<el-radio :disabled="hold" :label="false" border size="medium"
v-model="formData.isCanLeave">不允许
</el-radio>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="是否多次签到">
<el-checkbox v-model="formData.manySign"></el-checkbox>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.isCanLeave">
<el-form-item label="请假截止时间" prop="leaveDeadline">
<el-date-picker :disabled="hold" format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择日期" style="width: 100%"
type="datetime"
v-model="formData.leaveDeadline"
value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex">
<el-col :span="24">
<el-form-item label="会议描述" prop="meetingDescription">
<el-input :disabled="hold" :rows="4" maxlength="400" placeholder="请输入会议描述"
type="textarea" v-model="formData.meetingDescription"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" type="flex" v-show="formData.manySign">
<el-col :span="24">
<el-form-item label="场次">
<!--# include("/platform/meeting/manage/add_time_period.html"){} #-->
</el-form-item>
</el-col>
</el-row>
<!--# include("/platform/meeting/manage/add_users.html"){} #-->
</el-form>
<el-row justify="end" style="margin-top: 20px" type="flex" v-if="!hold">
<el-button @click="doSubmit" type="primary">提交</el-button>
</el-row>
</el-card>
</guava>
</div>
<script>
<!--# include("/platform/meeting/includeJs/meetingUtil.js"){} #-->
const meetUtil = new meetingUtil()
var vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'msg-notify': httpVueLoader('/components/msgNotify/msgNotify.vue'),
},
data() {
const that = this
return {
h3Title: "发起会议",
id: "",
notify_id: "",
hold: false,
meetingTypeList: [],
formData: {
isCanLeave: false,
meetingTimePeriods: [{timePeriodName: '', startTime: '', endTime: ''}],
sendTypes: [],
meetingTime: [],
meetTime: '',
},
pickerOptions: {
disabledDate(time) {
return (
moment(time.getTime()).format("YYYY-MM-DD HH:mm:ss") > that.formData.meetingTime[1] || moment(time.getTime()).format("YYYY-MM-DD HH:mm:ss") < that.formData.meetingTime[0]
);
}
},
formRules: {
meetingName: [{required: true, message: '请填写会议名称', trigger: ['blur', 'change']}],
location: [{required: true, message: '请填写会议地点', trigger: ['blur', 'change']}],
typeId: [{required: true, message: '请选择会议类型', trigger: ['blur', 'change']}],
meetingTime: [{required: true, message: '请选择会议时间', trigger: ['blur', 'change']}],
meetTime: [{required: true, message: '请选择会议时间', trigger: ['blur', 'change']}],
sendType: [{required: true, message: '请选择发送方式', trigger: ['blur', 'change']}],
msgContent: [{required: true, message: '请填写消息内容', trigger: ['blur', 'change']}],
leaveDeadline: [{required: true, message: '请选择请假截止时间', trigger: ['blur', 'change']}],
isCanLeave: [{required: true, message: '请选择', trigger: ['blur', 'change']}],
},
msgData: {
type: "",
sendTypes: []
}
}
},
methods: {
meetingNameInput(val) {
this.$set(this.msgData, "title", val)
this.formData.meetingTimePeriods[0].timePeriodName = val
},
async doSubmit() {
const valid = await this.$refs["addForm"].validate()
if (valid) {
const submitFormData = clone(this.formData)
submitFormData.startTime = this.formData.meetingTime && this.formData.meetingTime.length > 0 ? this.formData.meetingTime[0] : ''
submitFormData.endTime = this.formData.meetingTime && this.formData.meetingTime.length > 1 ? this.formData.meetingTime[1] : ''
if (this.msgData.sendTypes.length > 0) {
const confirm = await this.$confirm('下一步需要到消息管理系统中择机发送短信通知', '提示', {
confirmButtonText: '确定',
showCancelButton: false,
type: 'warning'
})
}
const resp = await $.post("/platform/meeting/manage" + (this.formData.id ? "/doEdit" : "/doAdd"), {
meetingInfo: JSON.stringify(submitFormData),
msgNotify: JSON.stringify(this.msgData),
users: JSON.stringify(this.msgData.users.length > 0 ? this.msgData.users.map(v => v.id) : this.msgData.users),
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
sublime.jumpPagePjax('/platform/meeting/manage')
}
}
},
async findOne(id) {
const {data} = await $.post("/platform/meeting/manage/findOne", {id})
data.meetingTime = [data.startTime, data.endTime]
data.meetTime = data.startTime
this.formData = data
}
},
async created() {
this.meetingTypeList = await meetUtil.getAllMeetingType()
this.id = GetQueryString("id")
this.notify_id = GetQueryString("notifyId")
if (this.id) {
this.hold = GetQueryString("hold")
this.findOne(this.id)
this.h3Title = this.hold === "true" ? "查看会议" : "编辑会议"
this.hold = this.hold !== 'false'
}
},
watch: {
'formData.meetingTime'(val) {
if (val) {
this.formData.meetingTimePeriods[0].startTime = val[0]
this.formData.meetingTimePeriods[0].endTime = val[1]
}
},
'formData.meetTime'(val) {
if (val) {
//结束时间往后加30分钟
const endTime = moment(val).add(30, 'm').format('YYYY-MM-DD HH:mm:ss')
this.formData.meetingTime = [val, endTime]
}
}
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,49 @@
<!-- 会议时间段 -->
<el-table :data="formData.meetingTimePeriods" border style="width: 100%">
<el-table-column label="名称" prop="timePeriodName">
<template slot-scope="scope">
<el-input :disabled="hold" maxlength="20" v-model="scope.row.timePeriodName"></el-input>
</template>
</el-table-column>
<el-table-column label="开始时间" prop="startTime" sortable>
<template slot-scope="scope">
<el-date-picker
:disabled="hold"
:picker-options="pickerOptions"
placeholder="选择开始时间"
type="datetime"
v-model="scope.row.startTime"
value-format="yyyy-MM-dd HH:mm">
</el-date-picker>
</template>
</el-table-column>
<el-table-column label="结束时间" prop="endTime">
<template slot-scope="scope">
<el-date-picker
:disabled="hold"
:picker-options="pickerOptions"
placeholder="选择结束时间"
type="datetime"
v-model="scope.row.endTime"
value-format="yyyy-MM-dd HH:mm">
</el-date-picker>
</template>
</el-table-column>
<el-table-column width="100px">
<template scope="scope" slot="header">
<el-button :disabled="hold"
@click="formData.meetingTimePeriods.push({timePeriodName:null,startTime:null,endTime:null})"
icon="el-icon-circle-plus-outline"
size="small"
type="primary"></el-button>
</template>
<template scope="scope">
<el-button :disabled="hold"
@click="formData.meetingTimePeriods.splice(scope.$index, 1)"
icon="el-icon-delete"
size="small"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
@@ -0,0 +1,3 @@
<vi-title title="参与人员信息"></vi-title>
<msg-notify :hold="hold" :notify_id="notify_id" :title_disabled="true" v-model="msgData"></msg-notify>
@@ -0,0 +1,128 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<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="选择年份"
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-input clearable
placeholder="可输入会议名称、地点进行查询"
v-model="pageForm.searchKeyword"></el-input>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="会议信息">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='isCanLeave'">
<span class="text-muted" v-if="row.isCanLeave==null">未设置</span>
<span class="text-success" v-if="row.isCanLeave==true"></span>
<span class="text-danger" v-if="row.isCanLeave==false"></span>
</template>
</el-table-column>
<el-table-column label="操作" width="200px">
<template scope="{row}">
<el-button 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>
</guava>
</div>
<script>
<!--# include("/platform/meeting/includeJs/meetingUtil.js"){} #-->
const meetUtil = new meetingUtil()
window['vue'] = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'meetingName', label: '会议名称', sortable: true},
{prop: 'meetingTypeName', label: '会议类型', sortable: true},
{prop: 'startTime', label: '开始时间', sortable: true},
{prop: 'endTime', label: '结束时间', sortable: true},
{prop: 'location', label: '会议地点', sortable: true},
{prop: 'isCanLeave', label: '能否请假', sortable: true},
],
pageForm: {
year: new Date().getFullYear().toString()
},
meetingTypeList: []
}
},
methods: {
async doDelete(id) {
try {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await $.post(loc() + '/doDelete', {id: id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
}
}
} catch (e) {
console.log(e)
}
}
},
async created() {
this.meetingTypeList = await meetUtil.getAllMeetingType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,377 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.qrcode {
min-width: 240px;
text-align: center;
display: flex;
flex-direction: column;
}
.real-data {
display: flex;
flex-wrap: wrap;
}
.real-data .data-card {
border-radius: 10px;
width: calc((100% - 80px) / 4);
min-width: 100px;
/*height: 150px;*/
/*min-height: 100px;*/
/*max-height: 150px;*/
/*background: #3CB371;*/
/*background: #000;*/
background-image: linear-gradient(141deg, #9fb8ad 0%, #1fc8db 51%, #2cb5e8 75%);
margin: 10px 0 10px 20px;
padding: 10px;
color: #ffffff;
display: flex;
flex-direction: column;
position: relative;
}
.real-data .data-card .data-card-title {
font-size: 20px;
max-width: 100%;
text-overflow: ellipsis;
word-break: keep-all;
white-space: nowrap;
overflow: hidden;
flex: 1;
position: absolute;
}
.real-data .data-card .data-card-num {
font-size: 90px;
flex: auto;
display: flex;
justify-content: center;
align-items: center;
}
.real-data .data-card .flow-border {
position: absolute;
display: block;
}
.timePeriod_card {
border-top: 5px solid #106898;
}
.timePeriod_card .el-form-item {
margin-bottom: 0 !important;
}
img {
height: 100% !important;
width: 100%;
}
.operation {
position: fixed;
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: 1111;
}
</style>
<div id="app" v-cloak>
<guava ref="guava" v-model="guavaIndex">
<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-input clearable
placeholder="可输入会议名称、地点进行查询"
v-model="pageForm.searchKeyword"></el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">会议类型:</div>
<div class="search-item-option">
<el-select clearable style="width: 100%" v-model="pageForm.typeId">
<el-option :label="item.meetingTypeName"
:value="item.id"
v-for="item in meetingTypeList"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="会议信息">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center"
header-align="center" ref="meetingTable">
<el-table-column type="expand">
<template scope="scope">
<el-row :gutter="20" justify="start" style="flex-wrap: wrap" type="flex"
v-if="scope.row.timePeriods && scope.row.timePeriods.length>0">
<el-col :xl="5" v-for="tp in scope.row.timePeriods">
<el-card class="mb10 timePeriod_card" shadow="hover">
<el-form label-width="80px">
<el-form-item label="名称">{{tp.timePeriodName}}</el-form-item>
<el-form-item label="会议时间">{{tp.startTime}}</el-form-item>
<!--<el-form-item label="结束时间">{{tp.endTime}}</el-form-item>-->
</el-form>
<el-row justify="space-around"
style="border-top: 1px solid #ebeef5;padding: 20px 0 0 0"
type="flex">
<el-button @click="exportSignature(tp.id)" size="medium" type="text">
导出签字表
</el-button>
<el-button @click="title = tp.timePeriodName; openOnline(tp.id,scope.row.id)"
size="medium" type="text">
扫描二维码
</el-button>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row v-else>
<el-empty description="没有时间段"></el-empty>
</el-row>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='isCanLeave'">
<span class="text-muted" v-if="row.isCanLeave==null">未设置</span>
<span class="text-success" v-if="row.isCanLeave==true"></span>
<span class="text-danger" v-if="row.isCanLeave==false"></span>
</template>
</el-table-column>
<el-table-column label="操作" width="200px">
<template scope="{row}">
<el-button @click="toggleRowTimePeriod(row)" size="mini" type="primary">展开</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<template #view>
<div style="min-width: 500px;height: 100%;position: relative">
<el-row type="flex">
<el-col :span="4" class="qrcode">
<div @click="downLoadQrCode" title="点击二维码可下载">
<qrcode :value="qrCodeUrl" ref="qrCode"
tag="img"></qrcode>
</div>
</el-col>
<el-col :span="20" class="real-data">
<template v-for="rd of realTimeData">
<div class="data-card">
<div class="data-card-title">
{{rd.label}}
</div>
<div class="data-card-num">
<count-to :end-val="rd.value"
:start-val="getLastValue(rd.key)"></count-to>
</div>
</div>
</template>
</el-col>
</el-row>
<!-- <el-row class="mt20">-->
<el-table :data="userData" :max-height="signTableHeight" class="mt20" ref="signTable">
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="单位" prop="unitname"></el-table-column>
<el-table-column label="签到时间" prop="signInDateTime"></el-table-column>
<el-table-column label="签到名次">
<template scope="scope">
{{userData.length - scope.$index}}
</template>
</el-table-column>
</el-table>
<!-- </el-row>-->
</div>
</template>
</guava>
</div>
<script>
<!--# include("/platform/meeting/includeJs/meetingUtil.js"){} #-->
const meetUtil = new meetingUtil()
let pollingInterval = null
const intervalTime = 3500
window['vue'] = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
title: '',
tableColumns: [
{prop: 'meetingName', label: '会议名称', sortable: true},
{prop: 'meetingTypeName', label: '会议类型', sortable: true},
{prop: 'startTime', label: '会议时间', sortable: true},
/*{prop: 'endTime', label: '结束时间', sortable: true},*/
{prop: 'location', label: '会议地点', sortable: true},
{prop: 'isCanLeave', label: '能否请假', sortable: true},
],
pageForm: {
year: new Date().getFullYear().toString()
},
meetingTypeList: [],
lastTimeData: [],
realTimeData: [],
userData: [],
meetingId: null,
timePeriodId: null,
qrcodeVisible: false,
qrCodeUrl: null,
signTableHeight: 600
}
},
watch: {
guavaIndex(val) {
if (val === 'index') {
this.toggleFullScreen()
}
}
},
methods: {
//导出签字表
exportSignature(timePeriodId) {
window.open(loc() + '/exportSignature/' + timePeriodId)
},
//打开在线
async openOnline(timePeriodId, meetingId) {
this.meetingId = meetingId
this.timePeriodId = timePeriodId
this.$refs.guava.view()
this.toggleFullScreen()
this.calcSignTableHeight()
this.generateQrCodeUrl(timePeriodId, meetingId)
this.stopInterval()
pollingInterval = this.startPolling(this.getRealTimeData)
},
calcSignTableHeight() {
this.$nextTick(() => {
setTimeout(() => {
console.log(window.innerHeight)
const offsetTop = this.$refs.signTable.$el.offsetTop
const th = window.innerHeight - 54 - 40 - offsetTop
console.log(th)
this.$set(this, 'signTableHeight', th)
})
})
},
async generateQrCodeUrl(tpId, meetingId) {
const resp = await $.get(loc() + '/generateQrCodeUrl', {tpId, meetingId})
if (resp.code === 0) {
this.qrCodeUrl = resp.data
} else {
this.notifyError(resp.msg)
}
},
async getRealTimeData() {
this.lastTimeData = clone(this.realTimeData)
const resp = await $.get(loc() + '/getRealTimeData/' + this.timePeriodId)
if (resp.code === 0) {
this.lastTimeData = clone(this.realTimeData)
this.$set(this, 'realTimeData', resp.data.countData)
//去重
let ud = clone(this.userData)
ud.unshift(...resp.data.userData)
let uMap = new Map()
for (let u of ud) {
if (!uMap.has(u.loginname)) {
uMap.set(u.loginname, u)
}
}
this.$set(this, 'userData', [...uMap.values()])
} else {
}
},
startPolling(func) {
this.lastTimeData = []
this.realTimeData = []
this.userData = []
func()
return setInterval(func, intervalTime)
},
stopInterval() {
if (pollingInterval) {
clearInterval(pollingInterval)
}
},
getLastValue(key) {
if (this.lastTimeData && this.lastTimeData.length > 0) {
return this.lastTimeData.find(v => v.key === key).value
} else {
return 0
}
},
downLoadQrCode() {
if (this.$refs['qrCode']) {
const src = this.$refs['qrCode'].$el.currentSrc
const aEle = document.createElement('a')
aEle.setAttribute("download", '签到二维码')
aEle.setAttribute("href", src)
aEle.click()
}
},
toggleRowTimePeriod(row) {
this.$refs['meetingTable'].toggleRowExpansion(row)
}
},
async created() {
this.meetingTypeList = await meetUtil.getAllMeetingType()
this.pageData()
// this.openOnline('2bb2b18a053b4c8ca00e27d30e8f4573')
},
beforeDestroy() {
this.stopInterval()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,300 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.timeTable {
color: red;
}
</style>
<div id="app" v-cloak>
<guava>
<template>
<el-card class="mt10" shadow="never">
<div class="btn-group tool-button mr10">
<el-date-picker @change="getMeetingList(pageForm.meetingTime)" clearable
end-placeholder="结束日期"
range-separator="-"
start-placeholder="开始日期"
type="daterange"
v-model="pageForm.meetingTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</div>
<div class="btn-group tool-button mr10">
<el-select @change="doSearch" clearable
filterable="true"
placeholder="请输入会议名称"
style="width: 100%;" v-model="pageForm.meetingId">
<el-option :label="item.meetingName" :value="item.id" v-for="item in meetingList"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mr10">
<el-select @change="doSearch" clearable placeholder="请选择会议类型" v-model="pageForm.typeId">
<el-option :label="item.meetingTypeName"
:value="item.id"
v-for="item in meetingTypeList"></el-option>
</el-select>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="会议时间段列表">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize"
@sort-change="pageOrder"
row-key="id">
<el-table-column label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column type="expand">
<template scope="{row}">
<el-table :data="row.meetingTimeData" :header-cell-style="{color:'#1867b0'}" row-key="id">
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in timeTableColumns">
<template scope="{row}" v-if="column.prop==='total'">
<el-link @click="openView(row,'total')" type="primary">{{row.total}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop==='signJoinNum'">
<el-link @click="openView(row,'signJoinNum')" type="primary">
{{row.signJoinNum}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop==='notJoinNum'">
<el-link @click="openView(row,'notJoinNum')" type="primary">{{row.notJoinNum}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop==='notJoinNullNum'">
<el-link @click="openView(row,'notJoinNullNum')" type="primary">
{{row.notJoinNullNum}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop==='proportionNum'">
{{proportionNum(row.joinNum,row.total)}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作">
<template scope="{row}">
<el-button @click="exportUser(row)" size="mini" type="primary">导出人员</el-button>
</template>
</el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns">
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<el-dialog :close-on-click-modal="false" :visible.sync="dialogTableVisible" title="人数详情">
<div class="btn-group tool-button mr10">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 100%"
v-model="pageFormUser.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 80px;"
v-model="pageFormUser.searchName">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mr10"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}">
<el-select @change="flushUnits" @clear="flushUnits" clearable="true"
filterable="true"
placeholder="所属工会" style="width: 100%;"
v-model="pageFormUser.unionId">
<el-option :label="item.unionname" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</div>
<div class="btn-group tool-button mr10">
<el-select clearable="true" filterable="true" placeholder="所属单位"
style="width: 100%;"
v-model="pageFormUser.unitId">
<el-option :label="item.name" :value="item.id" v-for="item in units"></el-option>
</el-select>
</div>
<div class="btn-group tool-button ">
<el-button @click="doSearchUser" icon="el-icon-search" type="primary">搜索</el-button>
</div>
<el-table :data="userTableData" :row-key="(row)=>{row.id}"
:size="tableSize">
<el-table-column label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageFormUser.pageNumber - 1) * pageFormUser.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column label="用户名" prop="loginName"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="所属单位" prop="unitName"></el-table-column>
<el-table-column label="院级工会" prop="unionName"></el-table-column>
</el-table>
<el-pagination
:current-page="pageFormUser.pageNumber"
:page-size="pageFormUser.pageSize"
:page-sizes="[5,10, 20, 30, 50]"
:total="pageFormUser.totalCount"
@current-change="pageNumberUserChange"
@size-change="pageSizeUserChange"
layout="total, sizes, prev, pager, next">
</el-pagination>
</el-dialog>
</guava>
</div>
<script>
<!--# include("/platform/meeting/includeJs/meetingUtil.js"){} #-->
const meetUtil = new meetingUtil()
window.vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
meetingTypeList: [],
unions: [],
units: [],
pageFormUser: {
searchName: "u.username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
meetingTimeData: {},
meetingNumType: "",
userTableData: [],
meetingList: [],
dialogTableVisible: false,
oldSignNum: 0,
newSignNum: 0,
timeTableColumns: [
{prop: 'timePeriodName', label: '时间段名称'},
{prop: 'startTime', label: '会议时间'},
/*{prop: 'endTime', label: '结束时间'},*/
{prop: 'total', label: '应到人数'},
{prop: 'signJoinNum', label: '实到人数'},
{prop: 'notJoinNum', label: '请假人数'},
{prop: 'notJoinNullNum', label: '未到人数'},
{prop: 'proportionNum', label: '人数比例'},
],
tableColumns: [
{prop: 'meetingName', label: '会议名称'},
{prop: 'meetingTypeName', label: '会议类型'},
{prop: 'startTime', label: '会议时间'},
/*{prop: 'endTime', label: '结束时间'},*/
{prop: 'leaveDeadline', label: '请假截至时间'},
]
}
},
methods: {
proportionNum(joinNum, total) {
console.log(joinNum, total)
return ((joinNum ? joinNum : 0) / total * 100).toFixed(2) + "%"
},
exportUser(row) {
window.open(loc() + '/exportUser?id=' + row.id + "&meetingId=" + row.meetingId)
},
doSearchUser() {
this.pageFormUser.pageNumber = 1
this.getUserData(this.meetingTimeData, this.meetingNumType)
},
pageNumberUserChange(val) {
this.pageFormUser.pageNumber = val;
this.getUserData(this.meetingTimeData, this.meetingNumType)
},
pageSizeUserChange(val) {
this.pageFormUser.pageSize = val;
this.getUserData(this.meetingTimeData, this.meetingNumType)
},
async getMeetingList(meetingTime) {
const {data} = await $.post(loc() + "/getMeetingList", {meetingTime: JSON.stringify(meetingTime)})
this.meetingList = data
/*if (this.meetingList.length > 0) {
this.$set(this.pageForm, "meetingId", this.meetingList[0].id)
this.pageData()
}*/
},
async openView(row, type) {
this.meetingTimeData = row
this.meetingNumType = type
await this.getUserData(row, type)
this.unions = await getUnions(null)
await this.flushUnits()
this.dialogTableVisible = true
},
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 getUserData(row, type) {
const {id, meetingId} = row
console.log(row)
const pageForm = clone(this.pageFormUser)
pageForm.id = id
pageForm.meetingId = meetingId
pageForm.type = type
const resp = await $.post(loc() + "/getUserData", pageForm)
if (resp.code === 0) {
this.userTableData = resp.data.list
this.pageFormUser.totalCount = resp.data.totalCount
}
},
},
async created() {
this.meetingTypeList = await meetUtil.getAllMeetingType()
let format = moment().add(-1, 'year').format('YYYY-MM-DD HH:mm:ss');
let format1 = moment().format('YYYY-MM-DD HH:mm:ss');
this.$set(this.pageForm, "meetingTime", [format, format1])
await this.getMeetingList(this.pageForm.meetingTime)
await this.pageData()
}
})
</script>
<!--#
}
#-->