Advertisement

会议OA之会议通知

阅读量:

目录

一、会议通知

二、会议反馈详情


今天与大家分享的会议OA项目中的会议通知功能,我将会议通知分割为两部分来实现,会议通知与反馈详情。

一、会议通知

1、会议通知的SQL语句编写(难点)

我们先使用函数find_in_set(id,条件)来查询出我们想要查询的那条会议的会议信息

由于不论会议是否得到反馈我们都需要查询出来,所以我们得使用左外连接,会议信息表为主表,会议反馈详情表作为从表,这样能够保证我们的数据不会丢失

复制代码
 --会议通知查询sql

    
 --查询出会议id为2的会议信息
    
 SELECT * from t_oa_meeting_info where FIND_IN_SET(2,CONCAT
    
 (canyuze,liexize,zhuchiren)) and state = 4
    
 --不管会议是否得到反馈,都要查询出来,所以选用外连接,会议信息表为主
    
 SELECT
    
    IFNULL(f.result,-1) result,t1.* 
    
 from
    
 (SELECT * from t_oa_meeting_info where FIND_IN_SET(2,CONCAT
    
 (canyuze,liexize,zhuchiren)) and state = 4)t1 
    
 left join t_oa_meeting_feedback f on t1.id = f.meetingId and personId =2
    
 ORDER BY result

2、后台编码

因为我们需要用到一个新的表会议反馈详情表t_oa_meeting_feedback,所以我们需要以该表建立一个实体类

复制代码
 package com.zking.entity;

    
  
    
 import java.io.Serializable;
    
 /** * 会议反馈表
    
  * @author Administrator
    
  * */
    
 public class MeetingFeedBack implements Serializable {
    
  
    
 	private String id;
    
 	private Long meetingId;
    
 	private Integer personType;
    
 	private Long personId;
    
 	private Integer result;
    
 	private String reason;
    
  
    
 	
    
 	private String title;
    
  
    
 	public String getTitle() {
    
 		return title;
    
 	}
    
  
    
 	public void setTitle(String title) {
    
 		this.title = title;
    
 	}
    
  
    
 	public String getId() {
    
 		return id;
    
 	}
    
  
    
 	public void setId(String id) {
    
 		this.id = id;
    
 	}
    
  
    
 	public Long getMeetingId() {
    
 		return meetingId;
    
 	}
    
  
    
 	public void setMeetingId(Long meetingId) {
    
 		this.meetingId = meetingId;
    
 	}
    
  
    
 	public Integer getPersonType() {
    
 		return personType;
    
 	}
    
  
    
 	public void setPersonType(Integer personType) {
    
 		this.personType = personType;
    
 	}
    
  
    
 	public Long getPersonId() {
    
 		return personId;
    
 	}
    
  
    
 	public void setPersonId(Long personId) {
    
 		this.personId = personId;
    
 	}
    
  
    
 	public Integer getResult() {
    
 		return result;
    
 	}
    
  
    
 	public void setResult(Integer result) {
    
 		this.result = result;
    
 	}
    
  
    
 	public String getReason() {
    
 		return reason;
    
 	}
    
  
    
 	public void setReason(String reason) {
    
 		this.reason = reason;
    
 	}
    
  
    
 	public MeetingFeedBack() {
    
 		super();
    
 		// TODO Auto-generated constructor stub
    
 	}
    
  
    
 	@Override
    
 	public String toString() {
    
 		return "MeetingFeedBack [id=" + id + ", meetingId=" + meetingId + ", personType=" + personType + ", personId="
    
 				+ personId + ", result=" + result + ", reason=" + reason + "]";
    
 	}
    
  
    
 }

Dao层

复制代码
 //会议通知查询

    
 	
    
 		public List<Map<String, Object>> queryMeetingFeedBackByUserId(MeetingFeedBack back, PageBean pageBean)
    
 					throws SQLException, InstantiationException, IllegalAccessException {
    
 			String sql = "SELECT\r\n" + 
    
 					"   IFNULL(f.result,-1) result,t1.* \r\n" + 
    
 					" from\r\n" + 
    
 					" (SELECT * from t_oa_meeting_info where FIND_IN_SET(\"+back.getPersonId()+\",CONCAT\r\n" + 
    
 					" (canyuze,liexize,zhuchiren)) and state = 4)t1 \r\n" + 
    
 					" left join t_oa_meeting_feedback f on t1.id = f.meetingId and personId ="+back.getPersonId()+"\r\n" + 
    
 					" ORDER BY result";
    
 			
    
 				return super.executeQuery(sql, pageBean);
    
 			}

web层

复制代码
 //会议通知查询

    
 	public String myInfos(HttpServletRequest req, HttpServletResponse resp) {
    
 		try {
    
 			PageBean pageBean = new PageBean();
    
 			pageBean.setRequest(req);
    
 			List<Map<String, Object>> infos =  backDao.queryMeetingFeedBackByUserId(back, pageBean);
    
 			
    
 			ResponseUtil.writeJson(resp, R.ok(0, "会议通知数据查询成功" , pageBean.getTotal(), infos));
    
 		} catch (Exception e) {
    
 			e.printStackTrace();
    
 			try {
    
 				ResponseUtil.writeJson(resp, R.error(0, "会议通知数据查询失败"));
    
 			} catch (Exception e1) {
    
 				e1.printStackTrace();
    
 			}
    
 		}
    
 		return null;
    
 	}

xml配置

复制代码
 <action path="/feedback" type="com.zking.web.MeetingFeedBackAction">

    
 	</action>

3、前端编码

JSp界面

复制代码
 <%@ page language="java" contentType="text/html; charset=UTF-8"

    
     pageEncoding="UTF-8"%>
    
 <%@include file="/common/header.jsp"%>
    
 <!DOCTYPE html>
    
 <html>
    
 <head>
    
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
 <script type="text/javascript" src="${pageContext.request.contextPath }/static/js/meeting/meetingNotify.js"></script>
    
 </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="edit">是否参会</a>
    
   {{# } }}
    
 </script>
    
 </body>
    
 </html>

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选择器)
    
     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: 'meetingState', title: '会议状态', width: 120},
    
         /*{field: 'seatPic', title: '会议排座', width: 120,
    
         	templet: function(d){
    
                 if(d.seatPic==null || d.seatPic=="")
    
                 	return "尚未排座";
    
                 else
    
                 	return "<img width='120px' src='"+d.seatPic+"'/>";
    
             }
    
         },*/
    
         {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'},
    
     ]]
    
    });
    
 }
    
  
    
 //点击查询
    
 function query(){
    
 	table.reload('tb', {
    
     url: $("#ctx").val()+'/feedBack.action',     //请求地址
    
     method: 'POST',                    //请求方式,GET或者POST
    
     loading: true,                     //是否显示加载条(默认 true)
    
     page: true,                        //是否分页
    
     where: {                           //设定异步数据接口的额外参数,任意设
    
     	'methodName':'queryMeetingFeedBackByUserId',
    
     	'personId':$('#personId').val(),
    
     	'title':$('#title').val(),
    
     },  
    
     request: {                         //自定义分页请求参数名
    
         pageName: 'page', //页码的参数名称,默认:page
    
         limitName: 'rows' //每页数据量的参数名,默认:limit
    
     },
    
     done: function (res, curr, count) {
    
     	console.log(res);
    
     }
    
    });
    
 	
    
 	//工具条事件
    
 	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);
    
 	  if(layEvent === 'edit'){ //是否参会
    
 		 openLayer(row.id);
    
 	  } else {
    
 		  
    
 	  }
    
 	});
    
 }
    
  
    
  
    
 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: '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($("#ctx").val()+'/feedBack.action',params,function(rs){
    
 		if(rs.success){
    
 			layer.closeAll();
    
 			query();
    
 		}else{
    
 			layer.msg(rs.msg,{icon:5},function(){});
    
 		}
    
 	},'json');
    
 }

二、会议反馈详情

1、会议反馈详情SQL语句编写

先查询出某条会议所有参与人员(参与者、列席者、主持人)的id(会议信息表中),再连接用户表根据id拿到参与人员的名字。再连接反馈表,拿到对应的反馈情况(未读、参加、不参加),最后根据反馈情况进行分组处理,引用到了函数GROUP_CONCAT

复制代码
 select

    
 t.result,GROUP_CONCAT(t.name) names
    
 from
    
 (select
    
 t1.name,IFNULL(f.result,-1)result
    
 from
    
 (SELECT * from t_oa_user where FIND_IN_SET(id,(SELECT CONCAT
    
 (canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id = 12))) t1
    
  
    
 left JOIN t_oa_meeting_feedback f on t1.id = f.personId and f.meetingId = 12) t
    
 GROUP BY t.result

2、后台编码

Dao层

复制代码
  //会议反馈

    
 		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"});
    
 		}

Web层

复制代码
 public String add(HttpServletRequest req, HttpServletResponse resp) {

    
 		try {
    
 //			rs是sql语句执行的影响行数
    
 			int rs = backDao.add(back);
    
 			if(rs > 0) {
    
 				ResponseUtil.writeJson(resp, R.ok(200, "会议信息数据新增成功"));
    
 			}else {
    
 				ResponseUtil.writeJson(resp, R.error(0, "会议信息数据新增失败"));
    
 			}
    
 			
    
 		} catch (Exception e) {
    
 			e.printStackTrace();
    
 			try {
    
 				ResponseUtil.writeJson(resp, R.error(0, "会议信息数据新增失败"));
    
 			} catch (Exception e1) {
    
 				e1.printStackTrace();
    
 			}
    
 		}
    
 		return null;
    
 	}

前台编码

复制代码
 <%@ page language="java" contentType="text/html; charset=UTF-8"

    
     pageEncoding="UTF-8"%>
    
 <%@include file="/common/header.jsp"%>
    
 <!DOCTYPE html>
    
 <html>
    
 <head>
    
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
 <script type="text/javascript" src="${pageContext.request.contextPath }/static/js/meeting/addFeedBack.js"></script>
    
 </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">
    
             <option value="">请选择人员类型</option>
    
             <option value="1">参会</option>
    
             <option value="2">列席</option>
    
 			</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">
    
 		    <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>

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选择器)
    
     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: 'meetingState', title: '会议状态', width: 120},
    
         /*{field: 'seatPic', title: '会议排座', width: 120,
    
         	templet: function(d){
    
                 if(d.seatPic==null || d.seatPic=="")
    
                 	return "尚未排座";
    
                 else
    
                 	return "<img width='120px' src='"+d.seatPic+"'/>";
    
             }
    
         },*/
    
         {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'},
    
     ]]
    
    });
    
 }
    
  
    
 //点击查询
    
 function query(){
    
 	table.reload('tb', {
    
     url: $("#ctx").val()+'/feedBack.action',     //请求地址
    
     method: 'POST',                    //请求方式,GET或者POST
    
     loading: true,                     //是否显示加载条(默认 true)
    
     page: true,                        //是否分页
    
     where: {                           //设定异步数据接口的额外参数,任意设
    
     	'methodName':'queryMeetingFeedBackByUserId',
    
     	'personId':$('#personId').val(),
    
     	'title':$('#title').val(),
    
     },  
    
     request: {                         //自定义分页请求参数名
    
         pageName: 'page', //页码的参数名称,默认:page
    
         limitName: 'rows' //每页数据量的参数名,默认:limit
    
     },
    
     done: function (res, curr, count) {
    
     	console.log(res);
    
     }
    
    });
    
 	
    
 	//工具条事件
    
 	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);
    
 	  if(layEvent === 'edit'){ //是否参会
    
 		 openLayer(row.id);
    
 	  } else {
    
 		  
    
 	  }
    
 	});
    
 }
    
  
    
  
    
 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: '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($("#ctx").val()+'/feedBack.action',params,function(rs){
    
 		if(rs.success){
    
 			layer.closeAll();
    
 			query();
    
 		}else{
    
 			layer.msg(rs.msg,{icon:5},function(){});
    
 		}
    
 	},'json');
    
 }

全部评论 (0)

还没有任何评论哟~