OA项目之我的会议(查询会议排座送审)

news2024/9/9 7:29:29

目录

会议查询

会议排座

会议送审


思路:

  • 关键性会议SQL的编写
  • 后台实现
  • 前台实现

会议查询

MeetingInfoDao.java

//	通用的会议查询SQL语句,包含会议信息表数据,主持人姓名、审批人姓名、会议状态
	private String getSQL() {
		return "SELECT a.id,a.title,a.content,a.canyuze,a.liexize,a.zhuchiren,b.`name`,a.location\r\n" + 
				",DATE_FORMAT(a.startTime,'%Y-%m-%d %H:%i:%s') as startTime\r\n" + 
				",DATE_FORMAT(a.endTime,'%Y-%m-%d %H:%i:%s') as endTime\r\n" + 
				",a.state\r\n" + 
				",(case a.state\r\n" + 
				"when 0 then '取消会议'\r\n" + 
				"when 1 then '新建'\r\n" + 
				"when 2 then '待审核'\r\n" + 
				"when 3 then '驳回'\r\n" + 
				"when 4 then '待开'\r\n" + 
				"when 5 then '进行中'\r\n" + 
				"when 6 then '开启投票'\r\n" + 
				"else '结束会' end\r\n" + 
				") as meetingState\r\n" + 
				",a.seatPic,a.remark,a.auditor,c.`name` as auditorName\r\n" + 
				"FROM t_oa_meeting_info a\r\n" + 
				"inner join t_oa_user b on a.zhuchiren = b.id\r\n" + 
				"left JOIN t_oa_user c on a.auditor = c.id where 1=1 ";
	}
	
//	我的会议
	public List<Map<String, Object>> myInfos(MeetingInfo info, PageBean pageBean) throws Exception {
		String sql = getSQL();
		String title = info.getTitle();
		if(StringUtils.isNotBlank(title)) {
			sql += " and title like '%"+title+"%'";
		}
		//根据当前登陆用户ID作为主持人字段的条件
		sql+=" and zhuchiren="+info.getZhuchiren();
		//按照会议ID降序排序
		sql+=" order by a.id desc";
		System.out.println(sql);
		return super.executeQuery(sql, pageBean);
	}

MeetingInfoAction.java

// 我的会议
	public String myInfos(HttpServletRequest req, HttpServletResponse resp) {
		try {
			PageBean pageBean = new PageBean();
			pageBean.setRequest(req);
			List<Map<String, Object>> infos = meetingInfoDao.myInfos(info, 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;
	}

myMeeting.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%@ include file="/common/head.jsp" %>
<title>Insert title here</title>
<style>
.layui-inline {
	margin-top: 20px;
}
.seatPicDiv {
	height: 180px;
}
.seatPic:active {
	height: 360px;
}

.layui-layer-page .layui-layer-content {
	/* 解决送审对话框中人员选择下拉框不能完全显示问题 */
	overflow: visible;!important
}
</style>

</head>
<body>

    <!-- 查询条件 -->
	<div class="layui-inline">
	  <label class="layui-form-label">标题:</label>
	  <div class="layui-input-block">
	    <input type="text" name="title" id="title" placeholder="会议标题" class="layui-input">
	  </div>
	</div>
	<div class="layui-inline">
	  <button class="layui-btn" id="queryMeetingInfo"><i class="layui-icon layui-icon-search"></i>查询</button>
	</div>
  	
	<!-- 用户信息表格 -->
	<table class="layui-hide" id="meetingInfoTable" lay-filter="meetingInfoTable"></table>
	
	<!-- 使用了layui自定义语法,当会议不能送审或排座时将按钮显示为禁用状态 -->
	<script type="text/html" id="toolbar">
	   {{# if(d.state==1 || d.state==3){ }}
       <button class="layui-btn layui-btn-sm" lay-event="seat">排座</button>
       <button class="layui-btn layui-btn-sm" lay-event="send">送审</button>
       {{# } else{ }}
	   <button class="layui-btn layui-btn-sm layui-btn-disabled" lay-event="seat">排座</button>
       <button class="layui-btn layui-btn-sm layui-btn-disabled" lay-event="send">送审</button>
       {{# } }}
       <button class="layui-btn layui-btn-sm" lay-event="feedback">反馈</button>
	</script>
	
	<!-- 送审对话框内容 -->
	<div id="auditDiv" style="display:none;">
		<form style="margin:20px 15px;" class="layui-form layui-form-pane" id="sendAudit" lay-filter="sendAudit">
			<div class="layui-inline">
			   <label class="layui-form-label">送审人</label>
			   <div class="layui-input-inline">
			      <select name="auditPerson" xm-select="auditPerson" xm-select-radio>
			        <option value="" disabled="disabled">--请选择--</option>
      			</select>
			   </div>
			   <div class="layui-input-inline">
			     <!-- <button id="btn_auditor" class="layui-btn" lay-filter="sendAudit">送审</button> -->
			     <button type="button" id="sendAudit" lay-submit lay-filter="sendAudit" class="layui-btn layui-btn-normal">送审</button>
			   </div>
			</div>
		</form>
	</div>
	
</body>
</html>

myMeeting.js

<script>
let table=null;
let $ = null;
var row = null;
let formSelects = null;
let form = null;
let layer = null;

layui.use(['table','jquery','formSelects','form','layer'], function(){
  table = layui.table;
  $ = layui.jquery;
  formSelects = layui.formSelects;
  form = layui.form;
  layer = layui.layer;
  
  loadMeetingInfo();
  
  //查询我的会议信息
  $("#queryMeetingInfo").click(function() {
	  
	  loadMeetingInfo();
  });
  
  //对表格的功能按钮增加事件监听,如排座,送审,反馈按钮
  table.on('tool(meetingInfoTable)', function(obj) {
	  
	  //排座
	  if(obj.event == 'seat') {
		  //对于新建或驳回状态的会议可以执行排座
		  if(obj.data.state == 1 || obj.data.state == 3) {
			  openSeatPic(obj.data.id);
		  } else {
			  layer.msg("对于审核通过,结束,取消,进行中等状态的会议不能再执行排座")
		  }
	  }
	  
	  //送审
	  if(obj.event == 'send') {
		  if(obj.data.seatPic) {
			  //对于新建或驳回状态的会议可以送审
			  if(obj.data.state == 1 || obj.data.state == 3) {
				  openSendAudit(obj.data.id);
			  } else {
				  layer.msg("对于审核通过,结束,取消,进行中等状态的会议不能执行送审");
			  }
		  } else {
			  layer.msg("未进行排座不能送审");
		  }
	  }
	  
	  //查看反馈
	  if(obj.event == 'feedback') {
		  openFeedbackInfo(obj.data);
	  }
	  
  });
  
});


function openFeedbackInfo(data) {
	
	let ignore = [0,1,2,3];
	if(ignore.indexOf(data.state) >= 0) {
		layer.msg("对于新建、驳回、取消、待审状态下的会议,不用查看反馈");
		return;
	}
	
	debugger;
	
	layer.open({
        type: 2,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title:'反馈详情',
        area: ['600px', '650px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: ctx+'/jsp/meeting/meetingFeedback.jsp?meetingId=' + data.id,
        btn:['关闭'],
        yes:function(index,layero){
        	layer.closeAll();
        }
    });
}

// 打开送审的对话框,执行送审
function openSendAudit(id) {
	
	let index = layer.open({
        type: 1,  //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title: '送审',
        area: ['660px', '200px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: $("#auditDiv")     //送审对应的div
   	});
	
	//初始化送审人员选择下拉列表的数据
	formSelects.data('auditPerson', 'server', {
	    url: ctx + '/meetinginfoAction.action?methodName=listMeetingMember'
	});
	
	//添加送审按钮的监听事件,发送ajax请求执行送审
	form.on('submit(sendAudit)', function(data) {
		console.log(data);
		data.field["id"] = id;
		console.log(data);
		
		$.ajax({
			url: ctx + '/meetinginfoAction.action?methodName=sendAudit',
			data: data.field,
			type: 'post',
			dataType: 'json',
			success: function(resp) {
				layer.msg(resp.msg);
				layer.close(index);
				//送审成功,更新我的会议列表
				loadMeetingInfo();
			}
		})
	});
}


//会议排座
function openSeatPic(id) {
	  row = null;
	  layer.open({
	       type: 2,  //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
	       title: '会议排座',
	       area: ['660px', '350px'],   //宽高
	       skin: 'layui-layer-rim',    //样式类名
	       content: ctx+'/jsp/meeting/seatPic.jsp?id='+id
	  });
};

//查询会议信息
function loadMeetingInfo() {
	
	

	
	table.render({
	    elem: '#meetingInfoTable',
	    url: ctx + '/meetinginfoAction.action?methodName=listMeetingInfo',
	    cols: [[
	      {field:'id', width:60, title: 'ID'},
	      {field:'title', width:180, title: '会议标题', sort: true},
	      {field:'location', width:180, title: '会议地点', sort: true},
	      {field:'startTime', width:160, title: '开始时间'},
	      {field:'endTime', width:160, title: '结束时间'},
	      {field:'meetingState', width:180, title: '会议状态'},
	      
	      //显示排座图片
	      {field: 'seatPic', title: '会议排座', width: 180,
		    	templet:function(d){
		    		if(null==d.seatPic)
		    			return "尚未排座";
		    		else
		    			return "<img height='180px' src='"+d.seatPic+"'/>";
		    	}
		  },
		  
	      {field: '', title: '操作', width: 250, toolbar:'#toolbar'}
	    ]],
	    page: true,
	    request: {
	    	pageName: 'page',
	    	limitName: 'rows'
	    },
	    method: 'post',
	    where: {
	    	title: $("#title").val()
	    },
	    loading: true,
	  });
}
</script>

会议排座

思路

  • 会议排座插件介绍
  • 会议排座功能开发
  • 送审功能开发

 MeetingInfoDao.java

//	根据会议ID更新会议的排座图片
	public int updateSeatPicById(MeetingInfo info) throws Exception {
		String sql="update t_oa_meeting_info set seatPic=? where id=?";
		return super.executeUpdate(sql, info, new String[] {"seatPic","id"});
	}
	
	//	根据会议ID查询相关用户
	public List<User> queryUserByMeetingId(Long meetingId) throws Exception{
		String sql="select * from t_oa_user where FIND_IN_SET(id,"
				+ "(select concat(canyuze,',',liexize,',',zhuchiren) "
				+ "from t_oa_meeting_info where id="+meetingId+"))";
		return super.executeQuery(sql, User.class, null);
	}

MeetingInfoAction.java

/**
	 * 保存排座图片到服务器的指定目录,并更新相关会议信息的排座图片字段
	 * @param req
	 * @param resp
	 */
	public void addArrangeSeat(HttpServletRequest req, HttpServletResponse resp) {
		
		try {
			String fName = UUID.randomUUID().toString().replace("-", "").concat(".jpg");
			String path = "D:\\temp\\images\\seatPic\\uploads\\" + fName;
			String base64Image = meetinginfo.getSeatPic().replace("data:image/png;base64,", "");
			//生成图片
			Base64ImageUtils.GenerateImage(base64Image, path);
			
			//更新会议信息表中的排座信息,需要设置tomcat的设置增加一个扩展web模块
			meetinginfo.setSeatPic("/uploads/"+fName);
			service.updateSeatPicById(meetinginfo);
			CommonUtil.sendResponse(0, "排座成功", resp);
		} catch (Exception e) {
			e.printStackTrace();
			CommonUtil.sendResponse(-1, "排座失败", resp);
		}
		
	}

resource.properties

String path = "D:\\temp\\images\\seatPic\\uploads\\" + fName;

在tomcat中需要配置图片映射关系  

 myMeeting.js

<script>
let table=null;
let $ = null;
var row = null;
let formSelects = null;
let form = null;
let layer = null;

layui.use(['table','jquery','formSelects','form','layer'], function(){
  table = layui.table;
  $ = layui.jquery;
  formSelects = layui.formSelects;
  form = layui.form;
  layer = layui.layer;
  
  loadMeetingInfo();
  
  //查询我的会议信息
  $("#queryMeetingInfo").click(function() {
	  
	  loadMeetingInfo();
  });
  
  //对表格的功能按钮增加事件监听,如排座,送审,反馈按钮
  table.on('tool(meetingInfoTable)', function(obj) {
	  
	  //排座
	  if(obj.event == 'seat') {
		  //对于新建或驳回状态的会议可以执行排座
		  if(obj.data.state == 1 || obj.data.state == 3) {
			  openSeatPic(obj.data.id);
		  } else {
			  layer.msg("对于审核通过,结束,取消,进行中等状态的会议不能再执行排座")
		  }
	  }
	  
	  //送审
	  if(obj.event == 'send') {
		  if(obj.data.seatPic) {
			  //对于新建或驳回状态的会议可以送审
			  if(obj.data.state == 1 || obj.data.state == 3) {
				  openSendAudit(obj.data.id);
			  } else {
				  layer.msg("对于审核通过,结束,取消,进行中等状态的会议不能执行送审");
			  }
		  } else {
			  layer.msg("未进行排座不能送审");
		  }
	  }
	  
	  //查看反馈
	  if(obj.event == 'feedback') {
		  openFeedbackInfo(obj.data);
	  }
	  
  });
  
});


function openFeedbackInfo(data) {
	
	let ignore = [0,1,2,3];
	if(ignore.indexOf(data.state) >= 0) {
		layer.msg("对于新建、驳回、取消、待审状态下的会议,不用查看反馈");
		return;
	}
	
	debugger;
	
	layer.open({
        type: 2,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title:'反馈详情',
        area: ['600px', '650px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: ctx+'/jsp/meeting/meetingFeedback.jsp?meetingId=' + data.id,
        btn:['关闭'],
        yes:function(index,layero){
        	layer.closeAll();
        }
    });
}

// 打开送审的对话框,执行送审
function openSendAudit(id) {
	
	let index = layer.open({
        type: 1,  //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title: '送审',
        area: ['660px', '200px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: $("#auditDiv")     //送审对应的div
   	});
	
	//初始化送审人员选择下拉列表的数据
	formSelects.data('auditPerson', 'server', {
	    url: ctx + '/meetinginfoAction.action?methodName=listMeetingMember'
	});
	
	//添加送审按钮的监听事件,发送ajax请求执行送审
	form.on('submit(sendAudit)', function(data) {
		console.log(data);
		data.field["id"] = id;
		console.log(data);
		
		$.ajax({
			url: ctx + '/meetinginfoAction.action?methodName=sendAudit',
			data: data.field,
			type: 'post',
			dataType: 'json',
			success: function(resp) {
				layer.msg(resp.msg);
				layer.close(index);
				//送审成功,更新我的会议列表
				loadMeetingInfo();
			}
		})
	});
}


//会议排座
function openSeatPic(id) {
	  row = null;
	  layer.open({
	       type: 2,  //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
	       title: '会议排座',
	       area: ['660px', '350px'],   //宽高
	       skin: 'layui-layer-rim',    //样式类名
	       content: ctx+'/jsp/meeting/seatPic.jsp?id='+id
	  });
};

//查询会议信息
function loadMeetingInfo() {
	
	

	
	table.render({
	    elem: '#meetingInfoTable',
	    url: ctx + '/meetinginfoAction.action?methodName=listMeetingInfo',
	    cols: [[
	      {field:'id', width:60, title: 'ID'},
	      {field:'title', width:180, title: '会议标题', sort: true},
	      {field:'location', width:180, title: '会议地点', sort: true},
	      {field:'startTime', width:160, title: '开始时间'},
	      {field:'endTime', width:160, title: '结束时间'},
	      {field:'meetingState', width:180, title: '会议状态'},
	      
	      //显示排座图片
	      {field: 'seatPic', title: '会议排座', width: 180,
		    	templet:function(d){
		    		if(null==d.seatPic)
		    			return "尚未排座";
		    		else
		    			return "<img height='180px' src='"+d.seatPic+"'/>";
		    	}
		  },
		  
	      {field: '', title: '操作', width: 250, toolbar:'#toolbar'}
	    ]],
	    page: true,
	    request: {
	    	pageName: 'page',
	    	limitName: 'rows'
	    },
	    method: 'post',
	    where: {
	    	title: $("#title").val()
	    },
	    loading: true,
	  });
}
</script>

seatPic.jsp

注:添加jQuery、html2canvas相关插件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<base href="${pageContext.request.contextPath }/"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="js/layui/css/layui.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="js/layui/layui.js"></script>
<script type="text/javascript" src="js/html2canvas/html2canvas.js"></script>
<title>会议座位安排</title>
</head>
<style type="text/css">
* {
	padding: 0;
	margin: 0;
}

		
body {
	width: 100%;
	height: 100%;
	/* background: red; */
}


.tips {
	/* position: absolute; */
	background: #eee;
	display: inline-block;
	height: 60px;
	/* width: 60px; */
	line-height: 60px;
	text-align: center;
	margin: 5px;
	padding: 0 10px;
}

.add {
	position: fixed;
	right: 10px;
	top: 10px;
	display:inline;
}

#tu {
	width: 100%;
	height: 100%;
	/* background: lightblue; */
	/*background: url('u=3318199716,2583790385&fm=26&gp=0.jpg');*/
}
.layui-input{
	height:30px;
}
</style>
<body id="screen_body">
    <div id="tu"></div>
    <!-- 下面不要使用layui的表单行内模式,会导致canvas的toDataURL()数据为 data:, -->
	<div class="add">
		<div style="display:inline-block;">
			<input id="dan_input" type="text" value="" class="layui-input">
		</div>
		<div style="display:inline-block;">
			<button onclick="return addDanMu()" class="layui-btn layui-btn-sm">添加座位</button><input id="jie_input" type="button" class="layui-btn layui-btn-sm" value='生成排座'>
		</div>
	</div>
</body>
<script type="text/javascript">
var $id = function(id) {
	return document.getElementById(id);
}
//会议排座拖拽
var dragF = {
	locked: false,
	lastObj: undefined,
	drag: function(obj) {
		$id(obj).onmousedown = function(e) {
			var e = e ? e : window.event;
			if (!window.event) {
				e.preventDefault();
			} /* 阻止标注<a href='/site/js-5791-1.html' target='_blank'><u>浏览器</u></a>下拖动a,img的默认事件 */
			dragF.locked = true;
			$id(obj).style.position = "absolute";
			$id(obj).style.zIndex = "100";
			if (dragF.lastObj && dragF.lastObj != $id(obj)) { /* 多元素拖动需要恢复上次元素状态 */
				dragF.lastObj.style.zIndex = "1";
			}

			dragF.lastObj = $id(obj);
			var tempX = $id(obj).offsetLeft;
			var tempY = $id(obj).offsetTop;

			dragF.x = e.clientX;
			dragF.y = e.clientY;
			document.onmousemove = function(e) {
				var e = e ? e : window.event;
				if (dragF.locked == false) return false;
				$id(obj).style.left = tempX + e.clientX - dragF.x + "px";
				$id(obj).style.top = tempY + e.clientY - dragF.y + "px";
				if (window.event) {
					e.returnValue = false;
				} /* 阻止ie下a,img的默认事件 */

			}

			document.onmouseup = function() {
				dragF.locked = false;
			}
		}
	}
}
</script>

<script type="text/javascript">
var layer;
layui.use(['layer'],function(){
	layer=layui.layer;

	//TODO 初始化会议排座:根据会议ID获取参会的所有人员的名字(主持人+参会人+列席人)
	arrangeSeat();
	
	//绘制会议排座图片
	$("#jie_input").on("click", function(event) {
		$('.add').hide();
		event.preventDefault();
		html2canvas(document.getElementById("screen_body")).then(function(canvas) {
			var dataUrl = canvas.toDataURL();
			//console.log(dataUrl);
			var param = {};
			param['seatPic'] = dataUrl;
			param['id'] = '${param.id}';
			//console.log(param);
			
			//TODO 此处需要完成会议排座图片上传操作
			$.ajax({
				url: 'meetinginfoAction.action?methodName=addArrangeSeat',
				data: param,
				type: 'post',
				dataType: 'json',
				success: function(resp) {
					layer.msg(resp.msg);
					if(resp.code == 0) {
						//先得到当前iframe层的索引
						var index = parent.layer.getFrameIndex(window.name); 
						//再执行关闭
						parent.layer.close(index);
						//调用父窗口的查询方法更新数据
						parent.loadMeetingInfo();
					}
				}
			})
		});
	});
});


//初始化排座人员信息
function arrangeSeat() {
	$.ajax({
		url: "meetinginfoAction.action?methodName=listMeetingMemberById",
		data: {
			id: '${param.id}'
		},
		type: 'get',
		dataType: 'json',
		success: function(resp) {
			//console.log(resp);
			$.each(resp.data, function(i,v) {
				$("#dan_input").val(v.name);
				addDanMu();
			});
		}
	});
}

//添加会议排座
function addDanMu() {
	var dan = document.getElementById("dan_input").value;
	if (dan == "") {
		alert("请输入你要排座的人员")
		return false;
	} else {
		document.getElementById("dan_input").value = ""; //清空 弹幕输入框
		var node = document.createElement("DIV"); // <div>
		var tipsArr = document.getElementsByClassName('tips');
		var i;
		if (tipsArr.length == 0) {
			i = 1
		} else {

			i = parseInt(tipsArr[tipsArr.length - 1].id.substr(4)) + 1;
		}
		node.setAttribute("class", "tips");
		node.setAttribute("id", "tips" + i);
		node.setAttribute("onmouseover", "dragF.drag('tips" + i + "');");
		var textnode = document.createTextNode(dan); // 创建个 文本节点, 将用户输入的弹幕,存入 创建的 元素节点 <p>  中
		node.appendChild(textnode);

		document.getElementById("tu").appendChild(node);
		return true;
	}
}

	</script>
</html>











会议送审

MeetingInfoDao.java

//	根据会议ID更新会议的审批人(送审)
	@Override
	public void updateMeetingState(Meetinginfo meetingInfo) {
		String sql = "update t_oa_meeting_info set state = ? where id = ?";
		DbTemplate.update(sql, new Object[] {meetingInfo.getState(), meetingInfo.getId()});
	}

MeetingInfoAction.java

/**
	 * 会议送审,能够送审的前提是该会议已经排座,否则不能送审,此外
	 * 对于审核通过,结束,取消,进行中等状态的会议不能执行送审
	 * @param rep
	 * @param resp
	 */
	public void sendAudit(HttpServletRequest rep, HttpServletResponse resp) {
		
		try {
			service.sendAudit(meetinginfo);
			CommonUtil.sendResponse(0, "送审成功", resp);
		} catch (Exception e) {
			e.printStackTrace();
			CommonUtil.sendResponse(-1, "送审失败", resp);
		}
		
	}

myMeeting.js

<script>
let table=null;
let $ = null;
var row = null;
let formSelects = null;
let form = null;
let layer = null;

layui.use(['table','jquery','formSelects','form','layer'], function(){
  table = layui.table;
  $ = layui.jquery;
  formSelects = layui.formSelects;
  form = layui.form;
  layer = layui.layer;
  
  loadMeetingInfo();
  
  //查询我的会议信息
  $("#queryMeetingInfo").click(function() {
	  
	  loadMeetingInfo();
  });
  
  //对表格的功能按钮增加事件监听,如排座,送审,反馈按钮
  table.on('tool(meetingInfoTable)', function(obj) {
	  
	  //排座
	  if(obj.event == 'seat') {
		  //对于新建或驳回状态的会议可以执行排座
		  if(obj.data.state == 1 || obj.data.state == 3) {
			  openSeatPic(obj.data.id);
		  } else {
			  layer.msg("对于审核通过,结束,取消,进行中等状态的会议不能再执行排座")
		  }
	  }
	  
	  //送审
	  if(obj.event == 'send') {
		  if(obj.data.seatPic) {
			  //对于新建或驳回状态的会议可以送审
			  if(obj.data.state == 1 || obj.data.state == 3) {
				  openSendAudit(obj.data.id);
			  } else {
				  layer.msg("对于审核通过,结束,取消,进行中等状态的会议不能执行送审");
			  }
		  } else {
			  layer.msg("未进行排座不能送审");
		  }
	  }
	  
	  //查看反馈
	  if(obj.event == 'feedback') {
		  openFeedbackInfo(obj.data);
	  }
	  
  });
  
});


function openFeedbackInfo(data) {
	
	let ignore = [0,1,2,3];
	if(ignore.indexOf(data.state) >= 0) {
		layer.msg("对于新建、驳回、取消、待审状态下的会议,不用查看反馈");
		return;
	}
	
	debugger;
	
	layer.open({
        type: 2,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title:'反馈详情',
        area: ['600px', '650px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: ctx+'/jsp/meeting/meetingFeedback.jsp?meetingId=' + data.id,
        btn:['关闭'],
        yes:function(index,layero){
        	layer.closeAll();
        }
    });
}

// 打开送审的对话框,执行送审
function openSendAudit(id) {
	
	let index = layer.open({
        type: 1,  //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title: '送审',
        area: ['660px', '200px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: $("#auditDiv")     //送审对应的div
   	});
	
	//初始化送审人员选择下拉列表的数据
	formSelects.data('auditPerson', 'server', {
	    url: ctx + '/meetinginfoAction.action?methodName=listMeetingMember'
	});
	
	//添加送审按钮的监听事件,发送ajax请求执行送审
	form.on('submit(sendAudit)', function(data) {
		console.log(data);
		data.field["id"] = id;
		console.log(data);
		
		$.ajax({
			url: ctx + '/meetinginfoAction.action?methodName=sendAudit',
			data: data.field,
			type: 'post',
			dataType: 'json',
			success: function(resp) {
				layer.msg(resp.msg);
				layer.close(index);
				//送审成功,更新我的会议列表
				loadMeetingInfo();
			}
		})
	});
}


//会议排座
function openSeatPic(id) {
	  row = null;
	  layer.open({
	       type: 2,  //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
	       title: '会议排座',
	       area: ['660px', '350px'],   //宽高
	       skin: 'layui-layer-rim',    //样式类名
	       content: ctx+'/jsp/meeting/seatPic.jsp?id='+id
	  });
};

//查询会议信息
function loadMeetingInfo() {
	
	

	
	table.render({
	    elem: '#meetingInfoTable',
	    url: ctx + '/meetinginfoAction.action?methodName=listMeetingInfo',
	    cols: [[
	      {field:'id', width:60, title: 'ID'},
	      {field:'title', width:180, title: '会议标题', sort: true},
	      {field:'location', width:180, title: '会议地点', sort: true},
	      {field:'startTime', width:160, title: '开始时间'},
	      {field:'endTime', width:160, title: '结束时间'},
	      {field:'meetingState', width:180, title: '会议状态'},
	      
	      //显示排座图片
	      {field: 'seatPic', title: '会议排座', width: 180,
		    	templet:function(d){
		    		if(null==d.seatPic)
		    			return "尚未排座";
		    		else
		    			return "<img height='180px' src='"+d.seatPic+"'/>";
		    	}
		  },
		  
	      {field: '', title: '操作', width: 250, toolbar:'#toolbar'}
	    ]],
	    page: true,
	    request: {
	    	pageName: 'page',
	    	limitName: 'rows'
	    },
	    method: 'post',
	    where: {
	    	title: $("#title").val()
	    },
	    loading: true,
	  });
}
</script>

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

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

相关文章

android:新建工程文件介绍

一、前言当我们新建一个app时会呈现出固定的工程文件&#xff0c;这篇文章介绍新建工程里的文件。 二、介绍 Structure:就是你选择哪个页面就会显示那个页面的结构&#xff0c;就比如说我选择的是MainActivity他就会显示这个页面所使用的方法。 1-2&#xff1a;是android自动生…

【ESP32】解决接串口助手时,无法启动问题

本文主要记录ESP32正常烧录程序后&#xff0c;接上串口助手就无法启动&#xff0c;报错 waiting for download&#xff0c;拔掉串口助手后&#xff0c;程序可以正常启动 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的…

小程序隐私保护授权处理方式之弹窗组件

欢迎点击关注-前端面试进阶指南&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 小程序隐私保护授权弹窗组件 调用wx.getUserProfile进行授权时&#xff0c;返回错误信息&#xff1a;{errMsg: “getUserProfile:fail api scope is…

nvm和volta对node版本控制的区别

前言——我们做前端开发的都会需要node.js环境&#xff0c;我们直接安装指定的版本可以么&#xff1f;可以&#xff0c;只不过在需要换版本的时候还得卸载重新装。那有工具可以帮助我们不用卸载就更改node版本么&#xff1f;有啊&#xff0c;nvm就可以。那又有没有什么工具不用…

高忆管理:沪指震荡微涨,半导体板块走强,卫星导航概念拉升

30日早盘&#xff0c;A股两市维持震动格式。到午间收盘&#xff0c;沪指涨0.06%报3137.72点&#xff0c;深成指涨0.33%&#xff0c;创业板指涨0.12%&#xff0c;两市合计成交6424亿元。北向资金净流出8.82亿元。盘面上&#xff0c;半导体、纺织机械、元器件、通信设备、软件服务…

1.网络空间搜素引擎

网络空间搜素引擎 地址 &#xff1a;shodan.io 简介 &#xff1a; 这句话还是有点东西得 。 区别&#xff1a; 平常得搜素引擎主要搜网页&#xff0c;shadan可以搜所以带有ip地址的设备。使用 &#xff1a; 1.提供官方api 2.可以去淘宝15元买个初级会员 3.过滤器查看官方…

C# Dapper 操作Oracle数据库

nuget安装内容 1.配置连接字符串 OracleConnectionString这个可用 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","…

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 目录 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 模型描述 M…

基于Googlenet深度学习网络的螺丝瑕疵检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…

python爬虫关于ip代理池的获取和随机生成

前言 在进行爬虫开发时&#xff0c;代理IP池是一个非常重要的概念。代理IP池是指一个包含多个可用代理IP的集合&#xff0c;这些代理IP可以用来绕过网站的防爬虫策略&#xff0c;从而提高爬取数据的成功率。 在本文中&#xff0c;我们将介绍如何获取代理IP池&#xff0c;并且随…

统一使用某一个包管理工具,比如yarn pnpm

原因&#xff1a;前端每个人的习性不一样&#xff0c;有人用npm 有人用yarn等包管理工具&#xff0c;混合下载插件容易出bug&#xff0c;就用个小工具锁住就行了&#xff0c;只能使用yarn或者pnpm反向下载依赖和下载插件。不然就报错 1.在项目主目录下创建preinstall.js // 如…

直播预告!生鲜与零售商品识别系统产业实践与部署详解

生鲜零售作为民生消费的重要一环&#xff0c;在促进行业新消费升级的进程中有着至关重要的作用。在超市等无人零售场景中&#xff0c;目前结算方式主要有以下几种&#xff1a; 但是以上几种方法存在如下缺点&#xff1a; 条形码方式&#xff1a;对于成品包装的商品较为成熟&…

MindSponge分子动力学模拟——软件架构(2023.08)

技术背景 在前面一篇文章中&#xff0c;我们介绍了MindSponge的两种不同的安装与使用方法&#xff0c;让大家能够上手使用。这篇文章主要讲解MindSponge的软件架构&#xff0c;并且协同mindscience仓库讲解一下二者的区别。 整体架构 首先我们来了解一下MindSponge独立仓库的软…

day28 异常

to{}catch{} try{}catch{}的流传输 try {fis new FileInputStream("file-APP\\fos.txt");fos new FileOutputStream("fos.txt");int a ;while ((a fis.read())! -1){fos.write(a);}System.out.println(a); } catch (IOException e) {e.printStackTrace()…

ECharts图表动态修改series显示隐藏

文章目录 1、前言2、思路3、实现 1、前言 最近做的大数据平台&#xff0c;里面很多部分用到了ECharts&#xff0c;其中有个功能&#xff0c;要求将图表分组&#xff0c;根据用户选择的组&#xff0c;来确定ECharts要显示那些线条和柱子&#xff0c;也就是动态的显示option.seri…

习题练习 C语言(暑期第三弹)

自我小提升&#xff01; 前言一、存储地址二、逗号表达式三、除自身以外数组的乘积四、字节与二进制五、符号计算六、不用加减乘除做加法七、unsigned判断八、移位计算九、sizeof宏十、移位计算十一、移位计算十二、优先级判断十三、单词倒排总结 前言 重要的事说三遍&#xf…

仓储24代电子标签操作指导

服务器使用 服务器环境需求 数据库&#xff1a;Mysql5.7 Java环境&#xff1a;jdk1.8 软件容器&#xff1a; Tomcat8.5/9.0 软件部署步骤 mysql5.7, 创建db_wms数据库并导入原始数据库文件 安装jdk1.8, 配置java环境变量 下载tomca8.0, 部署wms.war到tomcat, 并启动tomc…

一体化智能可观测平台助力车企数智化转型

8月24日&#xff0c;博睿数据主办的《"车程ONE里&#xff0c;万事大吉" - 可观测性在汽车行业的应用与发展网络分享会》开播&#xff0c;邀请了博睿数据全国汽车行业负责人吴伟硕和博睿数据资深技术专家向涛做客直播间&#xff0c;分享汽车企业数字化转型的故事&…

恒运资本:华为Mate 60 Pro突然发售拉动半导体股,中芯国际等开盘涨超5%

8月30日&#xff0c;受华为突然发售Mate 60 Pro手机影响&#xff0c;A股开盘后半导体板块迅速拉升&#xff0c;伟测科技、美芯晟涨超10%&#xff0c;利扬芯片、唯捷创芯、芯动联科、中芯世界、华虹公司等涨超5%。 恒运资本平台&#xff08;百度搜索恒运资本&#xff09;是深圳…

QT生成可执行文件

有时候为方便在没有QT电脑上执行程序&#xff0c;需要生成可执行文件 1.在计算机任意英文路径下新建一个文件夹。本文在F:\QTproject\hisiupdate下创建了test文件夹。将QT工程运行Release生成的build-update-MinGW-Release文件夹下Release下.exe文件拷贝到新建的test文件夹下。…