Index: forgon-core/src/main/java/com/forgon/log/dwr/table/LogTableManager.java =================================================================== diff -u -r16404 -r17561 --- forgon-core/src/main/java/com/forgon/log/dwr/table/LogTableManager.java (.../LogTableManager.java) (revision 16404) +++ forgon-core/src/main/java/com/forgon/log/dwr/table/LogTableManager.java (.../LogTableManager.java) (revision 17561) @@ -6,6 +6,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.log.helper.LogQueryHelper; import org.apache.commons.lang.StringUtils; import com.forgon.component.grid.GridManager; @@ -19,6 +21,12 @@ private LogManager appLogManager; private GridManager gridManager; + private static DateQueryAdapter dateQueryAdapter; + + public static void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + LogTableManager.dateQueryAdapter = dateQueryAdapter; + } + public void setLogTable(LogTable logTable) { this.logTable = logTable; } @@ -61,7 +69,11 @@ } public String findLogs(Map> parameterMap){ - return gridManager.renderGrid(parameterMap, Log.class.getSimpleName(), null,null); + Map sqlWhereParamMap = gridManager.getParamFromView(parameterMap); + StringBuilder sqlBuilder = new StringBuilder(" where 1 = 1 "); + LogQueryHelper logQueryHelper = LogQueryHelper.getInstance().setDateQueryAdapter(dateQueryAdapter); + logQueryHelper.createFilterSql(sqlWhereParamMap, sqlBuilder); + return gridManager.renderGrid(parameterMap, Log.class.getSimpleName(), sqlBuilder.toString(), new String[]{}); } public void log(String model, String fun, String details) { Index: ssts-web/src/main/webapp/log/loggrid.jsp =================================================================== diff -u -r12331 -r17561 --- ssts-web/src/main/webapp/log/loggrid.jsp (.../loggrid.jsp) (revision 12331) +++ ssts-web/src/main/webapp/log/loggrid.jsp (.../loggrid.jsp) (revision 17561) @@ -1,19 +1,32 @@ <%@ page contentType="text/html; charset=UTF-8"%> -<%@ include file="/common/taglibs.jsp"%> - - - +<%@ include file="/common/taglibs.jsp"%> +<%--<%@ include file="/common/includeExtJsAndCss.jsp"%>--%> +<%@ include file="/common/include_Ext2_Css.jsp"%> +<%@ include file="/common/include_Ext2_Js.jsp"%> + + + ${title } - + <%@ include file="/common/loading.jsp"%> + + -<%@ include file="/common/includeExtJsAndCss.jsp"%> - - + + +
+ + + + + + +
+ \ No newline at end of file Index: forgon-core/src/main/java/com/forgon/log/helper/LogQueryHelper.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/log/helper/LogQueryHelper.java (revision 0) +++ forgon-core/src/main/java/com/forgon/log/helper/LogQueryHelper.java (revision 17561) @@ -0,0 +1,130 @@ +package com.forgon.log.helper; + +import com.forgon.databaseadapter.service.DateQueryAdapter; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.log4j.Logger; + +import java.sql.Date; +import java.util.Map; + +/** + * @author zhonghaowen + * @apiNote + * @since 2017-03-30 + */ +public class LogQueryHelper { + + private volatile static LogQueryHelper ourInstance; + + private DateQueryAdapter dateQueryAdapter; + + protected Logger logger = Logger.getLogger(this.getClass()); + + public static LogQueryHelper getInstance() { + if (ourInstance == null) { + synchronized (LogQueryHelper.class) { + if (ourInstance == null) { + ourInstance = new LogQueryHelper(); + } + } + } + return ourInstance; + } + + public LogQueryHelper setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + return ourInstance; + } + + private LogQueryHelper() { + } + + /** + * 根据dwr传进来的参数创建对应的sql查询条件 + * + * @param sqlWhereParamMap dwr传过来的参数 + * @param sqlBuilder sql + */ + public void createFilterSql(Map sqlWhereParamMap, StringBuilder sqlBuilder) { + this.createModelSql(sqlWhereParamMap, sqlBuilder); + this.createUserNameSql(sqlWhereParamMap, sqlBuilder); + this.createOperationDescriptionSql(sqlWhereParamMap, sqlBuilder); + this.createTimeSql(sqlWhereParamMap, sqlBuilder); + this.createOperationTypeSql(sqlWhereParamMap, sqlBuilder); + logger.debug(sqlBuilder); + } + + /** + * 创建功能模块过滤sql + * + * @param sqlWhereParamMap dwr传过来的参数 + * @param sqlBuilder sql + */ + private void createModelSql(Map sqlWhereParamMap, StringBuilder sqlBuilder) { + String model = MapUtils.getString(sqlWhereParamMap, "model", null); + if (StringUtils.isNotBlank(model)) { + sqlBuilder.append(" and po.model = '").append(model).append("'"); + } + } + + /** + * 创建用户名字过滤sql + * + * @param sqlWhereParamMap dwr传过来的参数 + * @param sqlBuilder sql + */ + private void createUserNameSql(Map sqlWhereParamMap, StringBuilder sqlBuilder) { + String userName = MapUtils.getString(sqlWhereParamMap, "userName", null); + if (StringUtils.isNotBlank(userName)) { + sqlBuilder.append(" and po.username like '%").append(userName).append("%'"); + } + } + + /** + * 创建操作描述过滤sql + * + * @param sqlWhereParamMap dwr传过来的参数 + * @param sqlBuilder sql + */ + private void createOperationDescriptionSql(Map sqlWhereParamMap, StringBuilder sqlBuilder) { + String operationDescription = MapUtils.getString(sqlWhereParamMap, "operationDescription", null); + if (StringUtils.isNotBlank(operationDescription)) { + sqlBuilder.append(" and po.operationDescription like '%").append(operationDescription).append("%'"); + } + } + + /** + * 创建操作类型过滤sql + * + * @param sqlWhereParamMap dwr传过来的参数 + * @param sqlBuilder sql + */ + private void createOperationTypeSql(Map sqlWhereParamMap, StringBuilder sqlBuilder) { + String operationType = MapUtils.getString(sqlWhereParamMap, "operationType", null); + if (StringUtils.isNotBlank(operationType)) { + sqlBuilder.append(" and po.operationType like '%").append(operationType).append("%'"); + } + } + + /** + * 创建时间过滤sql + * + * @param sqlWhereParamMap dwr传过来的参数 + * @param sqlBuilder sql + */ + private void createTimeSql(Map sqlWhereParamMap, StringBuilder sqlBuilder) { + String startTime = MapUtils.getString(sqlWhereParamMap, "startTime", null); + String endTime = MapUtils.getString(sqlWhereParamMap, "endTime", null); + if (StringUtils.isNotBlank(startTime)) { + String start = dateQueryAdapter.dateAdapter(new Date(Long.parseLong(startTime))); + sqlBuilder.append(String.format(" and po.logDateTime >= %s ", start)); + } + if (StringUtils.isNotBlank(endTime)) { + String end = dateQueryAdapter.dateAdapter(DateUtils.addMinutes(new Date(Long.parseLong(endTime)), 1)); + sqlBuilder.append(String.format(" and po.logDateTime < %s ", end)); + } + + } +} Index: ssts-web/src/main/webapp/js/forgonDateSetting.js =================================================================== diff -u --- ssts-web/src/main/webapp/js/forgonDateSetting.js (revision 0) +++ ssts-web/src/main/webapp/js/forgonDateSetting.js (revision 17561) @@ -0,0 +1,56 @@ +/** + * 日期类,用来封装一些对日期的操作 + */ +var forgonDateSetting = (function () { + + //日期对象 + var dateObj = {}; + + //extJs对象 + var ext; + + var forgonDateSettingFactory = function () { + this.getDateObj = function () { + return dateObj; + } + } + + //初始化extJs对象 + dateObj.init = function (extObj) { + ext = extObj; + } + + /** + * 根据开始时间和结束时间来校验,如果校验成功则把这两个时间设置给dateObj + * @param startDateId 开始时间的id + * @param endDateId 结束时间的id + * @returns {boolean} + */ + dateObj.checkAndGetDateObj = function (startDateId, endDateId) { + var startDate = ext.getCmp(startDateId).getValue(); + var endDate = ext.getCmp(endDateId).getValue(); + var value1 = Date.parse(startDate); + var value2 = Date.parse(endDate); + if (value1 > value2) { + ext.Msg.alert('警告', '开始日期不能大于结束日期!'); + return false; + } + value1 = value1 ? value1 : ''; + value2 = value2 ? value2 : ''; + this.setStartDateAndEndDate(value1, value2); + return true; + } + + /** + * 设置开始时间和结束时间 + * @param startDate 开始时间 + * @param endDate 结束时间 + */ + dateObj.setStartDateAndEndDate = function (startDate, endDate) { + dateObj['startDate'] = startDate; + dateObj['endDate'] = endDate; + } + + return new forgonDateSettingFactory(); + +})(); \ No newline at end of file Index: forgon-core/src/main/java/com/forgon/log/model/Log.java =================================================================== diff -u -r17550 -r17561 --- forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 17550) +++ forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 17561) @@ -6,7 +6,9 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Index; import javax.persistence.Lob; +import javax.persistence.Table; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -15,6 +17,9 @@ @Entity @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +@Table(name = "Log",indexes = { + @Index(columnList = "logDateTime", name = "logDateTime_index"),@Index(columnList = "model", name = "model_index") +}) public class Log { public static final String LOG_TYPE_LOGIN = "用户登录"; Index: ssts-web/src/main/webapp/common/include_Ext2_Js.jsp =================================================================== diff -u -r17176 -r17561 --- ssts-web/src/main/webapp/common/include_Ext2_Js.jsp (.../include_Ext2_Js.jsp) (revision 17176) +++ ssts-web/src/main/webapp/common/include_Ext2_Js.jsp (.../include_Ext2_Js.jsp) (revision 17561) @@ -57,4 +57,14 @@ //alert('enableFileSystemObject='+enableFileSystemObject) //覆盖extJs2的占位图片路径 Ext.BLANK_IMAGE_URL = WWWROOT + '/ext/resources/images/default/s.gif'; +//修复ExtJs2非ie浏览器日期控件显示不正常 +Ext.override(Ext.menu.DateMenu, { + render : function() { + Ext.menu.DateMenu.superclass.render.call(this); + if (Ext.isGecko || Ext.isSafari || Ext.isChrome) { + this.picker.el.dom.childNodes[0].style.width = '178px'; + this.picker.el.dom.style.width = '178px'; + } + } +}); Index: ssts-web/src/main/webapp/log/logForm.jsp =================================================================== diff -u -r12331 -r17561 --- ssts-web/src/main/webapp/log/logForm.jsp (.../logForm.jsp) (revision 12331) +++ ssts-web/src/main/webapp/log/logForm.jsp (.../logForm.jsp) (revision 17561) @@ -73,8 +73,9 @@ - Index: ssts-web/src/main/webapp/log/loggrid.js =================================================================== diff -u -r16949 -r17561 --- ssts-web/src/main/webapp/log/loggrid.js (.../loggrid.js) (revision 16949) +++ ssts-web/src/main/webapp/log/loggrid.js (.../loggrid.js) (revision 17561) @@ -1,4 +1,7 @@ var entityName = "日志"; +var grid; +var dateObj = forgonDateSetting.getDateObj(); +dateObj.init(Ext); function delChosenLog(grid){ var logIds = grid.getSelectedValues('id', ';'); @@ -20,7 +23,81 @@ alert("全部记录已删除!"); } } - + +/** + * 查询事件 + */ +function loadResult() { + var model = Ext.getCmp('model').getValue(); + var userName = Ext.getCmp('userName').getValue(); + var operationType = Ext.getCmp('operationType').getValue(); + var operationDescription = Ext.getCmp('operationDescription').getValue(); + if (dateObj.checkAndGetDateObj('startDate', 'endDate')){ + document.getElementById('parm_s_startTime').value = dateObj.startDate; + document.getElementById('parm_s_endTime').value = dateObj.endDate; + } + document.getElementById('parm_s_model').value = model; + document.getElementById('parm_s_userName').value = userName; + document.getElementById('parm_s_operationType').value = operationType; + //操作描述 + document.getElementById('parm_s_operationDescription').value = operationDescription; + grid.dwrReload(); +} + +/** + * 重置搜索条件 + */ +function resetSearchCondition() { + Ext.getCmp('userName').setValue(''); + Ext.getCmp('operationDescription').setValue(''); + Ext.getCmp('operationType').setValue(''); + Ext.getCmp('startDate').setValue(''); + Ext.getCmp('endDate').setValue(''); + document.getElementById('parm_s_startTime').value = ''; + document.getElementById('parm_s_endTime').value = ''; +} + +/** + * 创建日期的控件 + * @param idAndName 日期控件的id和name + * @param fieldLabel 日期控件的标签 + * @returns + */ +function createDatePart(idAndName, fieldLabel) { + return { + xtype: 'datefieldWithMin', + fieldLabel: fieldLabel, + name: idAndName, + id: idAndName, + readOnly: false, + editable: false, + format: 'Y-m-d H:i', + width: 130 + } +} + +/** + * 创建textfield的控件 + * @param idAndName textfield控件的id和name + * @param width textfield控件的宽度 + * @returns + */ +function createTextfield(idAndName, width) { + return { + xtype: 'textfield', + name: idAndName, + id: idAndName, + width: width ? width : 130, + listeners : { + specialkey : function(field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { + loadResult(); + } + } + } + } +} + Ext.onReady(function(){ Ext.QuickTips.init(); //Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); @@ -46,22 +123,20 @@ var columns = [ //{header: "ID", width: 50, sortable: true,resizable: true, menuDisabled: false, dataIndex: 'id'}, - {header: "日期", width: 70, renderer : gotoPage,dataIndex: 'logDate'}, - {header: "时间", width: 70, dataIndex: 'logTime'}, + {header: "日期", width: 140, renderer : gotoPage,dataIndex: 'logDateTime'}, {header: "用户ID", width: 70, dataIndex: 'userId'}, {header: "用户姓名", width: 70, dataIndex: 'username'}, {header: "用户IP", width: 100, dataIndex: 'userIP'}, {header: "SessionID", width: 200, dataIndex: 'sessionID',hidden:true}, {header: "功能模块", width: 70, align:'center', dataIndex: 'model'}, - {header: "操作类型", width: 70, align:'center', dataIndex: 'operationType',renderer:actionType}, + {header: "操作类型", width: 110, align:'center', dataIndex: 'operationType',renderer:actionType}, {id:'operationDescription',header: "操作描述", width: 100, align:'left', dataIndex: 'operationDescription',sortable: false} ]; var readerDetail = [ {name: 'id'}, - {name: 'logDate'}, - {name: 'logTime'}, + {name: 'logDateTime'}, {name: 'userId'}, {name: 'userIP'}, {name: 'sessionID'}, @@ -80,39 +155,129 @@ {type: 'string', dataIndex: 'username'}, {type: 'string', dataIndex: 'operationType'}, {type: 'string', dataIndex: 'operationDescription'}, - {type: 'string', dataIndex: 'logDate'}, - {type: 'string', dataIndex: 'logTime'} + {type: 'string', dataIndex: 'logDateTime'} ]}); - - var tbar= [{ - text:'全部删除', - tooltip:'删除所有'+entityName, - iconCls:'btn_remove', - handler:function(){delAllLog(grid);} - }, '-', { - text:'删除', - tooltip:'删除选择'+entityName, - iconCls:'btn_remove', - handler:function (){ - delChosenLog(grid); - grid.dwrReload(); + + var modelStore = new Ext.data.SimpleStore({ + fields: ['value'], + data: [ + ['发货'] + ,['申请模块'] + ,['申请单'] + ,['回收模块'] + ,['清洗模块'] + ,['装配模块'] + ,['审核模块'] + ,['灭菌装载模块'] + ,['审核模块或者灭菌装载或者灭菌模块'] + ,['审核模块或者灭菌装载模块'] + ,['一次性物品'] + ,['灭菌模块'] + ,['发货模块'] + ,['使用记录模块'] + ,['基础数据'] + ,['干预模块'] + ,['一次性物品回写'] + ,['器械包定义'] + ,['丢失报损模块'] + ,['借物管理模块'] + ,['签收模块'] + ] + } + ); + + var deletePart = { + text:'删除', + tooltip:'删除选择' + entityName, + iconCls:'btn_remove', + handler:function (){ + delChosenLog(grid); + grid.dwrReload(); + } + } + var deleteAllPart = { + text:'全部删除', + tooltip:'删除所有' + entityName, + iconCls:'btn_remove', + handler: function(){ + delAllLog(grid); + } + }; + var modelPart = { + xtype: 'combo', + fieldLabel: '功能模块', + width: 130, + listWidth: 150, + id: 'model', + name: 'model', + valueField: 'value', + displayField: 'value', + allowBlank: false, + editable: false, + value: '发货', + store: modelStore, + forceSelection: true, + mode: 'local', + triggerAction: 'all', + listeners: { + select: function (combo, record, index) { } - }]; + }, + anchor: '100%' + }; + var startDatePart = createDatePart('startDate', '开始日期'); + var endDatePart = createDatePart('endDate', '结束日期'); + var userNamePart = createTextfield('userName', 80); + var operationType = createTextfield('operationType'); + var operationDescriptionPart = createTextfield('operationDescription'); + var queryButton = { + text: '查询', + tooltip: '查询', + iconCls: 'icon_search', + handler: function(){ + loadResult(grid); + } + }; + var resetButton = { + tooltip: '清空搜索条件', + text: '清空', + iconCls: 'icon_set', + handler: resetSearchCondition + }; + + var tbar= [ + deleteAllPart, + '-', + deletePart, + {text: '功能模块:'}, + modelPart, + {text: '开始日期:'}, + startDatePart, + {text: '结束日期:'}, + endDatePart, + {text: '用户姓名:'}, + userNamePart, + {text: '操作描述:'}, + operationDescriptionPart, + {text: '操作类型:'}, + operationType, + queryButton, + resetButton + ]; var dwrCallParams = null; //所有grid之外的参数用这个方法传入,返回的是Map> Ext.ux.ForgonPageGrid.prototype.getGridParameterMap = function(){ - }; - var grid = new Ext.ux.ForgonPageGrid( - {title:entityName+'列表',tbar:tbar,pageSize:30, + grid = new Ext.ux.ForgonPageGrid( + {title:entityName+'列表',tbar:tbar,pageSize:30,id : 'logGrid', defaultSortField:'id',defaultSortDirection:'DESC', isCheckboxSelectionModel:true, isShowRowNumber:true, rememberSelected:false, - //isShowSearchField:false, + isShowSearchField:false, layout:'fit', plugins: filters, columns: columns,autoExpandColumn: 'operationDescription',frame:false}, readerDetail,
日期时间 -    + + + <%--  --%>