【分享】以起止时间为例的自定义查询条件
王多多 发布于93月前 3答/5316阅

EOVA平台内置的日期框、时间框控件,作为查询条件时,只能精确到年月日,即yyyy-MM-dd格式,如下



如果希望以yyyy-MM-dd HH:mm:ss格式进行查询,可通过自定义查询条件实现(后台SQL的自定义有两种方式:(1)覆盖 (2)追加,追加查询条件可兼容EOVA框架内部处理非自定义查询条件,更为友好,本例便是这种方式,如果你看不懂括号中的这段话,可以先忽略)


步骤1:在元数据中添加虚拟字段,即表结构中实际不存在的字段,注意红线框中的配置


如此增加“起始时间”和“结束时间”两个虚拟字段后,查询条件中便多出这两个文本框:



步骤2:配置元对象或菜单“依赖JS”,自定义JS文件内容如下

/**
 * 将以下代码保存为js文件,配置到元对象或菜单信息中的"依赖JS"
 * @version base eova 1.6
 * @author 多多
 */
$(document).ready(function() {
	// 先取到自定义查询条件输入框
	var $vstart = $("#v_start_time").children("input[type='text']");
	// 移除属性"name",即EOVA自动生成的以"query_"开头的请求名称,避免被EOVA框架处理
	$vstart.removeAttr("name");
	// 添加属性"name",即自己定义的请求名称,不要以"query_"开头,记住这个name,AOP中会用到
	$vstart.attr("name", "noquery_v_start_time");
	// 绑定点击事件为自定义格式时间控件
	$vstart.click(function(){
		WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'});
	});
	
	var $vend = $("#v_end_time").children("input[type='text']")
	$vend.removeAttr("name");
	$vend.attr("name", "noquery_v_end_time");
	$vend.click(function(){
		WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'});
	});
});


步骤3:配置元对象“业务拦截器”,拦截器Java代码如下

import com.eova.aop.AopContext;
import com.eova.aop.MetaObjectIntercept;
import com.eova.common.utils.xx;

/**
 * EOVA的内部逻辑是先根据请求构建SQL,再调用queryBefore方法
 * 所以在queryBefore方法中,无法通过改变请求参数的方式改变SQL,只能追加SQL或覆盖SQL
 * @version base eova 1.6
 * @author 多多
 */
public class WTimeIntercept extends MetaObjectIntercept {

	@Override
	public void queryBefore(AopContext ac) throws Exception {
		// 获取自定义查询条件参数值,参数名称即之前在js中重命名的名称
		String startValue = ac.ctrl.getPara("noquery_v_start_time");
		// 追加SQL条件
		if (!xx.isEmpty(startValue)) {
			ac.condition += " and date_format(reg_time,'%Y-%m-%d %H:%i:%s')>=? ";
			ac.params.add(startValue);
		}
		
		String endValue = ac.ctrl.getPara("noquery_v_end_time");
		if (!xx.isEmpty(endValue)) {
			ac.condition += " and date_format(reg_time,'%Y-%m-%d %H:%i:%s')<=? ";
			ac.params.add(endValue);
		}
	}
	
}


搞定,验证结果


水平有限,请多指教。


[沙发] Jieven
掌握了EOVA DIY的精髓,可以随心所欲的拓展系统功能!
最佳
[地板] Jieven
高段位的DIY_JS,后续系统会默认支持时分秒,但是要有这种DIY的匠心!
[地毯] Jieven
@王多多 如果有人需要指定年月,就需要自定义控件,在eova_widget表中.
然后虚拟字段控件类型选自定义的年月框
<input type="month" name="user_date" />
提交评论