会议OA之我的审批(查询&签字)
时间:2023-01-15 03:30:00
目录
- 一、查询
-
- 1、后台
-
- 1.1 dao方法
- 1.2 web层
- 1.3 js代码
- 2、前台
-
- 2.1 jsp页面
- 2.2 效果
- 二、签字
-
- 1、后台
-
- 1.1 准备
- 1.2 实体类
- 1.3 dao方法
- 1.4 web层
- 1.5 js代码
- 1.6 xml配置
- 2、前台
-
- 2.1 jsp界面
- 2.2 效果
一、查询
1、后台
1.1 dao方法
MeetingInfoDao.java
// 我的审批 public List<Map<String,Object>> myAudit(MeetingInfo info,PageBean pageBean) throws Exception{ String sql=this.getSQL(); String title = info.getTitle(); ///按会议标题模糊查询 if(!StringUtils.isNotBlank(title)) sql =" and title like '%" title "%'"; ///ID作为审批人字段的条件 sql =" and auditor=" info.getAuditor(); ////查询待审核的会议信息 sql =" and state=2"; //按会议ID降序排序 sql =" order by a.id desc"; System.out.println(sql); return super.executeQuery(sql, pageBean); }
/pre>1.2 web层
// 我的审批 public String myAudit(HttpServletRequest req, HttpServletResponse resp) { try { PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Map<String, Object>> infos = meetingInfoDao.myAudit(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; }
1.3 js代码
let layer,table,$,form; var row; layui.use(['layer','table','jquery','form'],function(){ layer=layui.layer, table=layui.table, form=layui.form, $=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}, { field: 'endTime', title: '结束时间', width: 120}, { field: 'meetingState', title: '会议状态', width: 120}, { field: 'seatPic', title: '会议排座', width: 120, templet: function(d){ if(d.seatPic==null || d.seatPic=="") return "尚未排座"; else return "
"; } }, { field: '', title: '操作', width: 200,toolbar:'#tbar'}, ]] }); } //点击查询 function query(){ table.reload('tb', { url: $("#ctx").val()+'/info.action', //请求地址 method: 'POST', //请求方式,GET或者POST loading: true, //是否显示加载条(默认 true) page: true, //是否分页 where: { //设定异步数据接口的额外参数,任意设 'methodName':'myAudit', 'auditor':$('#auditor').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'){ //审批 } else { } }); }
2、前台
2.1 jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/common/head.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/myAudit.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="auditor" 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"> <a class="layui-btn layui-btn-xs" lay-event="edit">审批</a> </script> </body> </html>
2.2 效果
二、签字
会议签字需要拥到插件,可以去网上查找其他类型的签字
1、后台
1.1 准备
将找到的插件所要用到的文件导入到项目里
思路
1.将图片的字符串转成图片保存起来
2.将审批人的意见数据入库t_oa_meeting_audit
3.修改会议状态 t_oa_meeting_info1.2 实体类
package com.zking.entity; import java.io.Serializable; import java.util.Date; /** * 对应审批表t_oa_meeting_audit * @author cxy */ public class MeetingAudit implements Serializable { private Integer id; private Long meetingId; private String auditor; private String sign; private Date createdate; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Long getMeetingId() { return meetingId; } public void setMeetingId(Long meetingId) { this.meetingId = meetingId; } public String getAuditor() { return auditor; } public void setAuditor(String auditor) { this.auditor = auditor; } public String getSign() { return sign; } public void setSign(String sign) { this.sign = sign; } public Date getCreatedate() { return createdate; } public void setCreatedate(Date createdate) { this.createdate = createdate; } public MeetingAudit() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "MeetingAudit [id=" + id + ", meetingId=" + meetingId + ", auditor=" + auditor + ", sign=" + sign + ", createdate=" + createdate + "]"; } }
1.3 dao方法
//批处理 public int add(MeetingAudit audit) { //将审批人的意见数据入库t_oa_meeting_audit String sql1 = "insert into t_oa_meeting_audit(meetingId,auditor,sign)" + "values("+audit.getMeetingId()+","+audit.getAuditor()+","+audit.getAuditor()+",'"+audit.getSign()+"')"; //state状态有两种,审批通过即待开,审批驳回即驳回状态 boolean flag = StringUtils.isNotBlank(audit.getSign()); int state = flag ? 4 : 3; //修改会议状态 t_oa_meeting_info String sql2 = "update t_oa_meeting_info set state=? where id="+audit.getMeetingId(); //同时执行多个SQL语句,其目的在于事务的一致性,要么业务处理同时成功,或者同时失败 return 0; }
1.4 web层
package com.zking.web; import java.io.File; import java.util.Date; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.ConvertUtils; import com.zking.dao.MeetingAuditDao; import com.zking.entity.MeetingAudit; import com.zking.framework.ActionSupport; import com.zking.framework.ModelDriver; import com.zking.util.Base64ImageUtils; import com.zking.util.ImageUtils; import com.zking.util.MyDateConverter; import com.zking.util.PropertiesUtil; import com.zking.util.R; import com.zking.util.ResponseUtil; import com.zking.util.StringUtils; public class MeetingAuditAction extends ActionSupport implements ModelDriver<MeetingAudit> { private MeetingAudit audit = new MeetingAudit(); private MeetingAuditDao auditdao = new MeetingAuditDao(); @Override public MeetingAudit getModel() { //注入转换器 ConvertUtils.register(new MyDateConverter(), Date.class); return audit; } public String add(HttpServletRequest req,HttpServletResponse resp) { try { if(StringUtils.isNotBlank(audit.getSign())) { //拿到会议签字图片存放的地址 String dirPath = PropertiesUtil.getValue("dirPathSign"); //存储到数据库中地址,及浏览访问地址 String serverPath = PropertiesUtil.getValue("serverPath"); //原图 String fileName1 = UUID.randomUUID().toString().replaceAll("-", "") + ".png"; //裁剪后的图片 String fileName2 = UUID.randomUUID().toString().replaceAll("-", "") + ".png"; Base64ImageUtils.GenerateImage(audit.getSign().replaceAll("data:image/png;base64", ""), dirPath+fileName1); //将原图进行裁剪 ImageUtils.shearImg(dirPath+fileName1,dirPath+fileName2); //删掉原图 File file = new File(dirPath+fileName1); if(file.exists()) { file.delete(); audit.setSign(serverPath+fileName2); } } //影响行数 int rs = auditdao.add(audit); if(rs>0) { ResponseUtil.writeJson(resp, R.ok(200, "会议数据审批成功")); } else { ResponseUtil.writeJson(resp,R.error(0, "会议数据审批失败")); } } catch (Exception e) { e.printStackTrace(); try