OA会议管理系统之会议通知(送审成功可查看人员是否参与会议)

news2024/12/26 3:28:19

一、前言

1.导读

 在上一次的博文中我们实现了会议审批,会议通过审批后,状态就会由原来的待审核变为待开,这时候我们就可以在我的会议下的反馈详情查看人员是否参与会议的反馈情况。这篇博客就是来了解,人员是怎么接收会议通知并反馈和我的会议模块会议怎么查看反馈情况的功能讲解!!

二、会议通知功能实现

1.功能介绍及分析

我的通知模块

         数据初始化:显示会议通知的数据,首先拿到全部的数据判断是不是待开会议和当前登陆的人的id是否在会议的参与者、列席者、主持人中存在,如果存在就显示该条数据。

        是否参会按钮:点击此按钮弹出反馈页面,其中有人员身份(拿到当前登录的rid身份进行判断如果为1,2,4那就是参会人员具有投票权,如果是3,5就是列席人员没有投票权利)、是否参会(可选择参加或是不参加)、不参会的原因(如果不参与就要必须填写)

我的会议模块

        反馈详情按钮:点击按钮将我的会议jsp页面的html代码从隐藏变为显示并且发送ajax到后端查询该条会议的反馈情况并将查询到的人进行遍历拼接到我们的html代码中。

2.功能实现

2.1.dao层编写

MeetingFeedBackDao

package com.xw.dao;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.xw.entity.MeetingFeedBack;
import com.zking.util.BaseDao;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;

/**
 * MeetingFeedBack会议反馈数据访问层的接口实现
 * 
 * @author 索隆
 *
 */
public class MeetingFeedBackDaoImpl extends BaseDao<MeetingFeedBack> implements IMeetingFeedBackDao {

	@Override
	public List<Map<String, Object>> list(MeetingFeedBack back, PageBean pageBean) throws Exception {
		String title="";
		if(StringUtils.isNotBlank(back.getTitle())) {
			title=back.getTitle();
		}
		String sql = " SELECT\r\n" + " t1.*,IFNULL(f.result,-1) result\r\n" + " FROM\r\n"
				+ " (SELECT * FROM t_oa_meeting_info where FIND_IN_SET(" + back.getPersonId()
				+ ",CONCAT(canyuze,',',liexize,',',zhuchiren))  and state=4 and title LIKE '%" + title + "%') t1\r\n"
				+ " LEFT JOIN t_oa_meeting_feedback f on t1.id=f.meetingId AND f.personId=" + back.getPersonId() +" "
				+ "  ORDER BY id DESC,result ";
		return super.executeQuery(sql, pageBean);
	}

	@Override
	public List<Map<String, Object>> queryMeetingBackByMeetingId(MeetingFeedBack back) throws Exception {
		String sql = "  select\r\n" + "t.result,GROUP_CONCAT(t.name) NAMES\r\n" + "from\r\n" + "(	select\r\n"
				+ "	 t1.name,IFNULL(f.result,-1) result\r\n" + "	FROM\r\n"
				+ "	 (SELECT * FROM t_oa_user where FIND_IN_SET(id,(select CONCAT(canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id="+back.getMeetingId()+"  and FIND_IN_SET(state,('4,5,6'))))) t1\r\n"
				+ "	 LEFT JOIN t_oa_meeting_feedback f on t1.id=f.personId and f.meetingId ="+back.getMeetingId()+") t\r\n"
				+ " GROUP BY t.result";
		return super.executeQuery(sql, null);
	}

	@Override
	public int add(MeetingFeedBack back) throws Exception {
		String sql="insert into t_oa_meeting_feedback VALUES(?,?,?,?,?,?)";
		back.setId(UUID.randomUUID().toString().replaceAll("-", ""));
		return super.executeUpdate(sql, back, new String[] {"id","meetingId","personType","personId","result","reason"});
	}

}

2.2.jsp页面编写

meetingNotify.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/common/static.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/js/meeting/meetingNotify.js"></script>
<title>会议通知</title>
</head>
<style>
body{
	margin:15px;
}
 .layui-table-cell {height: inherit;}
 .layui-layer-page .layui-layer-content {  overflow: visible !important;}
</style>
<body>
<!-- 搜索栏 -->
<div class="layui-form-item" style="margin:15px 0px;">
  <div class="layui-inline">
    <label class="layui-form-label">会议标题</label>
    <div class="layui-input-inline">
      <input type="hidden" id="personId" value="${user.id }"/>
      <input type="text" id="title" autocomplete="off" class="layui-input">
    </div>
  </div>
  <div class="layui-inline">
    <button id="btn_search" type="button" class="layui-btn"><i class="layui-icon layui-icon-search"></i> 查询</button>
  </div>
</div>
<!-- 数据表格 -->
<table id="tb" lay-filter="tb" class="layui-table" style="margin-top:-15px"></table>

<script type="text/html" id="tbar">
  {{# if(d.result==-1){ }}
  <a class="layui-btn layui-btn-xs" lay-event="edits">是否参会</a>
  {{# } }}
</script>
</body>
</html>









meetingNotify.js

//--------------------------------------------------会议通知------------------------------------------------------
let layer,table,$,form,test;
var row;
layui.use(['layer','table','jquery','form','test'],function(){
	layer=layui.layer,
	table=layui.table,
	form=layui.form,
	test=layui.test,
	$=layui.jquery;
	
	initTable();
	
	//查询事件
	$('#btn_search').click(function(){
		query();
	});
	
});

//初始化数据表格(我的审批)
function initTable(){
	table.render({          //执行渲染
        elem: '#tb',   //指定原始表格元素选择器(推荐id选择器)
        url : 'MeetingFeedBack.action',
		title : '会议通知',
		where : { //设定异步数据接口的额外参数,任意设
			'methodName':'queryMeetingFeedBackByUserId',
        	'title':$('#title').val(),
		},
        height: 400,         //自定义高度
        loading: false,      //是否显示加载条(默认 true)
        cols: [[             //设置表头
            {field: 'id', title: '会议编号', width: 90},
            {field: 'title', title: '会议标题', width: 120},
            {field: 'location', title: '会议地点', width: 140},
            {field: 'startTime', title: '开始时间', width: 120,
            	templet:function(d){
            		return test.toDate(new Date(d.startTime));
            	}
            },
            {field: 'endTime', title: '结束时间', width: 120,
            	templet:function(d){
            		return test.toDate(new Date(d.endTime));
            	}
            },
         
            {field: 'result', title: '反馈状态', width: 120,
            	templet: function(d){
                    if(d.result==1)
                    	return "参会";
                    else if(d.result==2)
                    	return "缺席";
                    else
                    	return "未读";
                }
            },
            {field: '', title: '操作', width: 200,toolbar:'#tbar'},
        ]],
		page : true
   });
	
	//工具条事件
	table.on('tool(tb)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
		  row = obj.data; //获得当前行数据
		  var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
		  var tr = obj.tr; //获得当前行 tr 的 DOM 对象(如果有的话)
		//console.log("反馈"+row);
		//console.log("反馈"+layEvent);
		  if(layEvent === 'edits'){ //审批
			  openLayer(row.id)
		  } 
		});
}

//点击查询
function query(){
	table.reload('tb', {
        url:'MeetingFeedBack.action',     //请求地址
        method: 'POST',                    //请求方式,GET或者POST
        loading: true,                     //是否显示加载条(默认 true)
        page: true,                        //是否分页
        where: {                           //设定异步数据接口的额外参数,任意设
        	'methodName':'queryMeetingFeedBackByUserId',
        	'title':$('#title').val(),
        },  
        request: {                         //自定义分页请求参数名
            pageName: 'page', //页码的参数名称,默认:page
            limitName: 'rows' //每页数据量的参数名,默认:limit
        },
        done: function (res, curr, count) {
        	console.log(res);
        }
   });
	
}


function openLayer(id){
    layer.open({
        type: 2,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title: '会议反馈',                   //对话框标题
        area: ['660px', '400px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: '../../Layui/jsp/meeting/addFeedBack.jsp?id='+id,                //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
        btn:['会议反馈','关闭'],
        yes:function(index,layero){
        	//layer.msg('保存');
        	//调用子页面中提供的getData方法,快速获取子页面的form表单数据
            let data= $(layero).find("iframe")[0].contentWindow.getData();
            addMeetingFeedBack(data);
        },
        btn2:function(){
        	layer.closeAll();
        }
    });
}

// 对会议通知进行 参会/不参会的反馈
function addMeetingFeedBack(params){
	params['methodName']="add";
	console.log(params);
	$.post('MeetingFeedBack.action',params,function(rs){
		if(rs.success){
			layer.closeAll();
			query();
		}else{
			layer.msg(rs.msg,{icon:5},function(){});
		}
	},'json');
}

addFeedBack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="/common/static.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/js/meeting/addFeedBack.js"></script>

<title>反馈页面</title>
</head>
<style>
body {
	margin: 5px;
}
</style>
<body>
	<div style="padding: 10px;">
		<form class="layui-form layui-form-pane" lay-filter="back">
			<!-- <div class="layui-form-item">
		    <button type="submit" class="layui-btn" lay-submit="" lay-filter="meeting">立即提交</button>
		    <button id="reset" type="reset" class="layui-btn layui-btn-primary">重置</button>
  		</div> -->
			<input type="hidden" name="meetingId" value="${param.id }" /> <input
				type="hidden" name="personId" value="${sessionScope.user.id }" />
			<div class="layui-form-item">
				<label class="layui-form-label">人员类型</label>
				<div class="layui-input-block">
					<select id="personType" name="personType">
						<c:if test="${user.rid == 1 || user.rid == 2 || user.rid == 4}">
							<option value="1" selected>参会人员</option>
						</c:if>
						<c:if test="${user.rid == 3 || user.rid == 5}">
							<option value="2" selected>列席人员</option>
						</c:if>
					</select>
				</div>
			</div>
			<div class="layui-form-item">
				<label class="layui-form-label">反馈结果</label>
				<div class="layui-input-block">
					<select id="result" name="result">
						<option value="">请选择反馈结果</option>
						<option value="1">参加</option>
						<option value="2">不参加</option>
					</select>
				</div>
			</div>
			<div class="layui-form-item layui-form-text" id="textareadiv">
				<label class="layui-form-label">如果不参与会议的请填写原因(参会无需填写)</label>
				<div class="layui-input-block">
					<textarea placeholder="请输入内容" name="reason" class="layui-textarea"></textarea>
				</div>
			</div>
		</form>
	</div>
	
</body>
</html>

addFeedBack.js

//---------会议通知反馈-------------------
let form, $, resultSelect, reasonInput;
layui.use(['form', 'jquery'], function() {
    form = layui.form;
    $ = layui.jquery;
    
   
});


function getData() {
	return form.val('back');
}

2.3.Web层编写

MeetingFeedBackAction

package com.xw.web;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.xw.biz.IMeetingFeedBackBiz;
import com.xw.biz.MeetingFeedBackBizImpl;
import com.xw.entity.MeetingFeedBack;
import com.xw.entity.User;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;
import com.zking.util.PageBean;
import com.zking.util.R;
import com.zking.util.ResponseUtil;
import com.zking.util.StringUtils;

/**会议反馈
 * @author 索隆
 *
 */
public class MeetingFeedBackAction extends ActionSupport implements ModelDriver<MeetingFeedBack>{
	private MeetingFeedBack meetingFeedBack=new MeetingFeedBack();
	private IMeetingFeedBackBiz imbd=new MeetingFeedBackBizImpl();
	
	
	
	/**
	 * 初始化会议通知数据
	 * 
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	public void queryMeetingFeedBackByUserId(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		// 初始化PageBean
		PageBean pageBean = new PageBean();
		pageBean.setRequest(req);

		// 获取当前登陆的用户id
		HttpSession session = req.getSession();
		User user = (User) session.getAttribute("user");
		if (user != null) {
			meetingFeedBack.setPersonId(user.getId());
		}
		
		// 初始化数据
		List<Map<String, Object>> list = imbd.list(meetingFeedBack, pageBean);
		// 利用R工具类制造出符合要求的json格式数据
		ResponseUtil.writeJson(resp, R.ok(0, "查询成功", pageBean.getTotal(), list));
	}
	
	
	
	/**
	 * 新增反馈信息
	 * 
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	public void add(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		
		
		// 调用新增的方法
		int n  = imbd.add(meetingFeedBack);
		// 利用R工具类制造出符合要求的json格式数据
		if (n > 0) {
			// 反馈成功
			ResponseUtil.writeJson(resp, R.ok(0, "反馈成功"));
		} else {
			// 反馈失败
			ResponseUtil.writeJson(resp, R.error(1, "反馈失败"));
		}
	}
	
	
	/**
	 * 反馈信息的数据加载
	 * 
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	public void queryMeetingBackByMeetingId(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		
		// 初始化数据
		List<Map<String, Object>> list = imbd.queryMeetingBackByMeetingId(meetingFeedBack);
		// 利用R工具类制造出符合要求的json格式数据
		ResponseUtil.writeJson(resp, R.ok(0, "查询成功", list));
	}
	
	
	
	
	

	@Override
	public MeetingFeedBack getModel() {
		return meetingFeedBack;
	}

}

温馨提示:

注意配置我们的MVC哦!!

3.案例展示

 

到这里我的分享就结束了,欢迎到评论区探讨交流!!

如果觉得有用的话还请点个赞吧 ♥  ♥

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/840089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

介绍Keithley2602A双通道系统数字电源

吉时利Keithley2602A双通道系统数字电源 主要特点及优点 &#xff08;131///4587//6435&#xff09; 一个紧凑的单元中综合了如下功能&#xff1a;精密电压源、高精度电流源、数字多用表、任意波形发生器、电压或电流脉冲发生器、电子负载以及触发控制器 代码后向兼容2600系列…

如何在 Android 上恢复已删除的视频|快速找回丢失的记忆

想知道是否有任何成功的方法可以从 Android 手机中检索已删除的视频&#xff1f;好吧&#xff0c;本指南将向您展示分步说明&#xff0c;让您轻松从手机中找回丢失的视频文件&#xff01; 您是否不小心从 Android 智能手机中删除了珍贵的生日视频&#xff1f;难道是无处可寻吗…

PyTorch中加载模型权重 A匹配B|A不匹配B

在做深度学习项目时&#xff0c;从头训练一个模型是需要大量时间和算力的&#xff0c;我们通常采用加载预训练权重的方法&#xff0c;而我们往往面临以下几种情况&#xff1a; 未修改网络&#xff0c;A与B一致 很简单&#xff0c;直接.load_state_dict() net ANet(num_cla…

Vector - CAPL - 诊断模块函数(发送及流控制帧)

目录 CanTpSendData - 诊断数据的发送 代码示例 CanTpGetHWSTmin & CanTpSetHWSTmin - 获取和设置硬件STMin的值 代码示例 CanTpSetSTminReduction - 将STmin设置需要的值 代码示例 CanTpGetBlockSize & CanTpSetBlockSize 代码示例 CanTpGetSTmin & Can…

一文学透设计模式

设计模式是什么&#xff1f; 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案&#xff0c;代表了解决一些问题的最佳实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 说白了&#xff0c;设计模式对于软件开发人员来说就…

一百四十四、Kettle——Linux上安装的kettle8.2连接MySQL数据库

一、目的 在Linux上安装好kettle&#xff0c;然后用kettle连接MySQL数据库 注意&#xff1a;kettle版本是8.2 二、实施步骤 &#xff08;一&#xff09;到kettle安装目录下启动Linux的kettle服务 # cd /opt/install/data-integration/ # ./spoon.sh &#xff08;二&#x…

【前端】搭建Vue3框架

目录 一、搭建准备二、node.js安装1、下载并安装2、配置默认安装目录和缓存日志目录①、创建默认安装目录和缓存日志目录&#xff08;我的node.js目录在D盘&#xff0c;所以直接在node.js文件夹下创建&#xff09;②、执行命令&#xff0c;配置默认安装目录和缓存日志目录到刚才…

OpenMesh 网格简化算法(基于边长度)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 网格简化的算法有很多种,基于边结构进行简化的方法便是其中一种方式。此类算法主要关注于它们如何选择要收缩的边,并且似乎都是为流形表面设计的,尽管边缘收缩也可以用于非流形表面,但往往会存在变形较大的问题…

2023-08-05 LeetCode每日一题(合并两个有序链表)

2023-08-05每日一题 一、题目编号 21. 合并两个有序链表二、题目链接 点击跳转到题目位置 三、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1&#xff1a; 示例2&#xff1a; 示例3&#xff1a; …

AcWing 372. 棋盘覆盖(二分图匈牙利算法)

输入样例&#xff1a; 8 0输出样例&#xff1a; 32 解析&#xff1a; n为100&#xff0c;状压肯定爆。 将每个骨牌看成二分图的一个匹配&#xff0c;即查找二分图的一个最大匹配&#xff0c;匈牙利算法。 #include<bits/stdc.h> using namespace std; const int N105…

漫画 | TCP/IP之大明邮差

后记&#xff1a; 1973年&#xff0c;卡恩与瑟夫开发出了网络中最核心的两个协议&#xff1a;TCP协议和IP协议&#xff0c;随后为了验证两个协议的可用性&#xff0c;他们做了一个实验&#xff0c;在多个异构网络中进行数据传输&#xff0c;数据包在经过近10万公里的旅程后到达…

合并果子C++详解

题目描述 在一个果园里&#xff0c;多多已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并&#xff0c;多多可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。可以看出&#xff0c;…

Golang之路---04 并发编程——信道/通道

信道/通道 如果说 goroutine 是 Go语言程序的并发体的话&#xff0c;那么 channel&#xff08;信道&#xff09; 就是 它们之间的通信机制。channel&#xff0c;是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道&#xff0c;我把他叫做信道&#xff0c;也有人将…

MIT 6.824 -- MapReduce -- 01

MIT 6.824 -- MapReduce -- 01 引言抽象和实现可扩展性可用性(容错性)一致性MapReduceMap函数和Reduce函数疑问 课程b站视频地址: MIT 6.824 Distributed Systems Spring 2020 分布式系统 推荐伴读读物: 极客时间 – 大数据经典论文解读DDIA – 数据密集型应用大数据相关论文…

kagNet:对常识推理的知识感知图网络 8.4+8.5

这里写目录标题 摘要介绍概述问题陈述推理流程 模式图基础概念识别模式图构造概念网通过寻找路径来匹配子图基于KG嵌入的路径修剪 知识感知图网络图卷积网络&#xff08;GCN&#xff09;关系路径编码分层注意机制 实验数据集和使用步骤比较方法KAGNET是实施细节性能比较和分析I…

Redis实战(5)——Redis实现消息队列

消息队列&#xff0c;顾名思义&#xff0c;就是一个存放消息的队列。最简单的消息队列包含3个角色 生产者&#xff1a;将消息存入队列中队列&#xff1a;存放和管理消息消费者&#xff1a; 将消息从队列中取出来并做业务处理 R e d i s 提供了三种实现消息队列的方式&#x…

【力扣每日一题】2023.8.5 合并两个有序链表

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们两个有序的链表&#xff0c;要我们保持升序的状态合并它们。 我们可以马上想要把两个链表都遍历一遍&#xff0c;把所有节点的…

AI抠图使用指南:Stable Diffusion WebUI Rembg实用技巧

抠图是图像处理工具的一项必备能力&#xff0c;可以用在重绘、重组、更换背景等场景。最近我一直在探索 Stable Diffusion WebUI 的各项能力&#xff0c;那么 SD WebUI 的抠图能力表现如何呢&#xff1f;这篇文章就给大家分享一下。 安装插件 作为一个生成式AI&#xff0c;SD…

aardio:用 WebView 模仿 mdict 界面

aardio&#xff1a;用 WebView 模仿 mdict 界面 import win.ui; /*DSG{{*/ mainForm win.form(text"aardio2";right889;bottom467) mainForm.add( button{cls"button";text"go";left335;top22;right399;bottom41;z2}; button2{cls"button…

基于以太网的煤矿电力监控系统的设计与应用 安科瑞 许敏

摘 要&#xff1a;针对传统煤矿电力监控系统通讯网络性能较差、无法实现准确故障定位及报警、不具备数据交互功能等问题&#xff0c;结合分布式网络及GPS授时技术设计了一套基于工业以太网及RS485总线架构的煤矿电力监控系统&#xff0c;可实现对井下供电网络及设备的远程监控…