因为最近做的功能是修改ftl页面一些代码,来实现页面查询时必填项,默认值,日期格式化等功能,下面是简表报表配置里需要实现的功能,顺序比较乱,希望能帮助你参考一下
简表页面查询栏
1.joreportlist.ftl文件代码
<pre name="code" class="html"><!--#setting classic_compatible=true-->
<!DOCTYPE html>
<html style="height: 100%">
<head>
<title></title>
<link href="plug-in/lhgDialog/skins/default.css" rel="stylesheet" id="lhgdialoglink">
<script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="plug-in/tools/dataformat.js"></script>
<link id="easyuiTheme" rel="stylesheet" href="plug-in/easyui/themes/default/easyui.css" type="text/css">
<link rel="stylesheet" href="plug-in/easyui/themes/icon.css" type="text/css">
<link rel="stylesheet" type="text/css" href="plug-in/accordion/css/accordion.css">
<script type="text/javascript" src="plug-in/easyui/jquery.easyui.min.1.3.2.js"></script>
<script type="text/javascript" src="plug-in/easyui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="plug-in/tools/syUtil.js"></script>
<script type="text/javascript" src="plug-in/easyui/extends/datagrid-scrollview.js"></script>
<script type="text/javascript" src="plug-in/My97DatePicker/WdatePicker.js"></script>
<link href="plug-in/My97DatePicker/skin/WdatePicker.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="plug-in/tools/css/common.css" type="text/css">
<script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script>
<script type="text/javascript" src="plug-in/tools/curdtools.js"></script>
<script type="text/javascript" src="plug-in/tools/easyuiextend.js"></script>
<script type="text/javascript" src="plug-in/jquery-plugs/hftable/jquery-hftable.js"></script>
<link rel="stylesheet" href="plug-in/jquery/jquery-autocomplete/jquery.autocomplete.css" type="text/css">
<script type="text/javascript" src="plug-in/jquery/jquery-autocomplete/jquery.autocomplete.min.js"></script>
<style type='text/css'>
body{margin:0px;padding:0px;}
</style>
<script type="text/javascript">
$(function(){
<#list config_queryList as x>
<#if x['search_mode']=="group">
<#if x['field_type']=="Date" && x['data_type']=="*">
$("input[name='${x['field_name']}_begin']").attr({datatype:"*"});
$("input[name='${x['field_name']}_end']").attr({datatype:"*"});
</#if>
</#if>
<#if x['search_mode']=="single">
<#if x['field_type']=="Date" && x['data_type']=="*">
$("input[name='${x['field_name']}']").attr({datatype:"*"});
</#if>
</#if>
</#list>
$('#${config_id}List').datagrid({
idField: 'id',
title: '${config_name}',
url:'',
fit:false,
fitColumns:false,
pageSize: 100,
pagination:false,
pageList:[10,30,50,100],
singleSelect:true,
checkbox:false,
sortOrder:'asc',
rownumbers:true,
showHeader:false,
showFooter:true,
frozenColumns:[[]],
columns:[
[
]
],
onLoadSuccess:function(data){$("#${config_id}List").datagrid("clearSelections");},
onClickRow:function(rowIndex,rowData)
{rowid=rowData.id;gridname='${config_id}List';}
});
});
//打开内链
function ${config_id}Listsearch(){
<#if (config_requiredList?size>0)>
<#list config_requiredList as x>
<#if x['search_mode']=="single">
var ${x['field_name']}= $('#${config_id}Listtb').find("[name='${x['field_name']}']").val();
if(${x['field_name']}=="" || ${x['field_name']}==undefined) {
alert("${x['field_txt']} 不能为空!");
return;
}
<#else>
var ${x['field_name']}_begin= $('#${config_id}Listtb').find("[name='${x['field_name']}_begin']").val();
if(${x['field_name']}_begin=="" || ${x['field_name']}_begin==undefined) {
alert("${x['field_txt']} 开始时间不能为空!");
return;
}
var ${x['field_name']}_end= $('#${config_id}Listtb').find("[name='${x['field_name']}_end']").val();
if(${x['field_name']}_end=="" || ${x['field_name']}_end==undefined) {
alert("${x['field_txt']} 结束时间不能为空!");
return;
}
</#if>
</#list>
</#if>
$("#${config_id}Content").show();
//document.${config_id}JoRForm.action = "reportviewer?file=demos/功能演示/脚本/引入自定义脚本函数.xml";
var form = document.${config_id}JoRForm;
//alert(form.name);
//遍历指定form表单所有元素
for(var i=0;i<form.length;i++){
var element=form[i];
if(element.value==""){
//$(element).attr({disabled:"disabled"});
//console.log(element.name);
}
}
form.target = "_self";
$('#${config_id}JoRForm').submit();
}
//function dosearch(params){var jsonparams=$.parseJSON(params);$('#${config_id}List').datagrid({url:'joReportController.do?datagrid&configId=${config_id},',queryParams:jsonparams});}
//function ${config_id}Listsearchbox(value,name){var queryParams=$('#${config_id}List').datagrid('options').queryParams;queryParams[name]=value;queryParams.searchfield=name;$('#${config_id}List').datagrid('reload');}$('#${config_id}Listsearchbox').searchbox({searcher:function(value,name){${config_id}Listsearchbox(value,name);},menu:'#${config_id}Listmm',prompt:'请输入查询关键字'});
function searchReset_${config_id}(name){ $("#"+name+"tb").find(":input").val("");}
//打开外链
function ${config_id}blankLink() {
<#if (config_requiredList?size>0)>
<#list config_requiredList as x>
<#if x['search_mode']=="single">
var ${x['field_name']}= $('#${config_id}Listtb').find("[name='${x['field_name']}']").val();
if(${x['field_name']}=="" || ${x['field_name']}==undefined) {
alert("${x['field_txt']} 不能为空!");
return;
}
<#else>
var ${x['field_name']}_begin= $('#${config_id}Listtb').find("[name='${x['field_name']}_begin']").val();
if(${x['field_name']}_begin=="" || ${x['field_name']}_begin==undefined) {
alert("${x['field_txt']} 开始时间不能为空!");
return;
}
var ${x['field_name']}_end= $('#${config_id}Listtb').find("[name='${x['field_name']}_end']").val();
if(${x['field_name']}_end=="" || ${x['field_name']}_end==undefined) {
alert("${x['field_txt']} 结束时间不能为空!");
return;
}
</#if>
</#list>
</#if>
var form = document.${config_id}JoRForm;
//遍历指定form表单所有元素
for(var i=0;i<form.length;i++){
var element=form[i];
if(element.value==""){
//$(element).attr({disabled:"disabled"});
//console.log(element.name);
}
}
form.target = "_blank";
$('#${config_id}JoRForm').submit();
}
<#-- 增加下面4个script函数,http://blog.youkuaiyun.com/dandanzmc/article/details/34110767-->
function formatter_ymdh(date){
var y = date.getFullYear();
var m = date.getMonth()+1;
var d = date.getDate();
var h = date.getHours();
return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d)+' '+(h<10?('0'+h):h);
}
function parser_ymdh(s){
if (!s){
var date = new Date();
var ty = date.getFullYear();
var tm = date.getMonth()+1;
var td = date.getDate();
var th = date.getHours();
return new Date(ty,tm-1,td,th,0,0);
}
var reg=/[- ]/; //利用正则表达式分隔
var ss = (s.split(reg));
var y = parseInt(ss[0],10);
var m = parseInt(ss[1],10);
var d = parseInt(ss[2],10);
var h = parseInt(ss[3],10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d) && !isNaN(h)){
return new Date(y,m-1,d,h,0,0);
} else {
return new Date();
}
}
function formatter_month(date){
var y = date.getFullYear();
var m = date.getMonth()+1;
return y+'-'+(m<10?('0'+m):m);
/*var d = date.getDate();
return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d);*/
}
function parser_month(s){
if (!s) return new Date();
var ss = (s.split('-'));
var y = parseInt(ss[0],10);
var m = parseInt(ss[1],10);
if (!isNaN(y) && !isNaN(m)){
return new Date(y,m-1,1);
} else {
return new Date();
}
/*var d = parseInt(ss[2],10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
return new Date(y,m-1,d);
} else {
return new Date();
}
return new Date(Date.parse(date.replace(/-/g,"/")));*/
}
</script>
</head>
<body style="height: 100%">
<table width="100%" id="${config_id}List" toolbar="#${config_id}Listtb"></table>
<div id="${config_id}Listtb" style="padding:3px; height: auto">
<form id="${config_id}JoRForm" name="${config_id}JoRForm" method="post" action="reportviewer">
<div name="searchColums">
<input type="hidden" name="file" value="${config_rfile}" />
<input type="hidden" name="_all_in_one_page" value="<#if '${config_pagination}'=="Y">false<#else>true</#if>" />
<#list config_queryList as x>
<span style="display:-moz-inline-box;display:inline-block;">
<span style="<#if x['is_show']=="Y">display:-moz-inline-box;display:inline-block;<#else>display:none;</#if>width: 100px;text-align:right;text-align:right;text-overflow:ellipsis;-o-text-overflow:ellipsis; overflow: hidden;white-space:nowrap;" title="${x['field_txt']}" class="Validform_label" >${x['field_txt']}:</span>
<#if x['search_mode']=="group">
<input type="text" name="${x['field_name']}_begin" value="${x['default_va']}" <#if x['read_only']=="Y">readonly</#if>
<#if x['field_type']="Date">
class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd'})"
<#else>
<#if x['date_format']!="">
class="Wdate" <#if x['read_only']!="Y">onClick="WdatePicker({dateFmt:'${x['date_format']}'})" </#if>
</#if>
</#if> />
<span style="display:-moz-inline-box;display:inline-block;width: 8px;text-align:right;">~</span>
<input type="text" name="${x['field_name']}_end" value="${x['default_va']}" <#if x['read_only']=="Y">readonly</#if>
<#if x['field_type']="Date">
class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd'})"
<#else>
<#if x['date_format']!="">
class="Wdate" <#if x['read_only']!="Y">onClick="WdatePicker({dateFmt:'${x['date_format']}'})"
</#if>
</#if>
</#if> />
</#if>
<#if x['search_mode']=="single">
<#if (x['field_dictlist']?size >0)>
<select name = "${x['field_name']}" <span style="color:#FF0000;"><#if x['read_only']=="Y">disabled="disabled"<#else>display:none;</#if></span> WIDTH="100" style="<#if x['is_show']=="Y"><#else>display:none;</#if>width: 104px" <#if x['data_type']?length gt 0 >datatype="${x['data_type']}"</#if> >
<option value = "">---请选择---</option>
<#list x['field_dictlist'] as xd>
<span style="color:#FF0000;"><#if xd['typecode']=="${x['default_va']}">
<option value = "${xd['typecode']}" selected = "selected" >${xd['typename']}</option>
<#else>
<option value = "${xd['typecode']}" >${xd['typename']}</option>
</#if></span>
</#list>
</select>
<#elseif (x['field_replacelist']?size >0)>
<select name = "${x['field_name']}" <#if x['read_only']=="Y">disabled="disabled"<#else>display:none;</#if> WIDTH="100" style="<#if x['is_show']=="Y"><#else>display:none;</#if>width: 104px" <#if x['data_type']?length gt 0 >datatype="${x['data_type']}"</#if> >
<option value = "">---请选择---</option>
<#list x['field_replacelist'] as xd>
<#if xd['typecode']=="${x['default_va']}">
<option value = "${xd['typecode']}" selected = "selected" >${xd['typename']}</option>
<#else>
<option value = "${xd['typecode']}" >${xd['typename']}</option>
</#if>
</#list>
</select>
<#else>
<input type="text" style="width: 120px" name="${x['field_name']}" value="${x['default_va']}" <#if x['read_only']=="Y">readonly</#if>
<#if x['field_type']="Date">
class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd'})"
<#else>
<#if x['date_format']!="">class="Wdate" <#if x['read_only']!="Y">onClick="WdatePicker({dateFmt:'${x['date_format']}'})" </#if>
</#if>
</#if> />
</#if>
</#if>
</span>
</#list>
</div>
<div style="height:30px;" class="datagrid-toolbar">
<span style="float:left;" >
<a href="#" class="easyui-linkbutton" plain="true" icon="icon-putout" onclick="${config_id}blankLink();">外链方式生成和阅读报表</a>
</span>
<#if (config_queryList?size >0)>
<span style="float:right">
<a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="${config_id}Listsearch()">生成报表并阅读</a>
<a href="#" class="easyui-linkbutton" iconCls="icon-reload" onclick="searchReset_${config_id}('${config_id}List')">重置</a>
</span>
</#if>
</div>
<link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css">
<link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css">
<script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min.js"></script>
<script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype.js"></script>
<script type="text/javascript" src="plug-in/Validform/js/datatype.js"></script>
<script type="text/javascript" src="plug-in/Validform/plugin/passwordStrength/passwordStrength-min.js"></script>
<script type="text/javascript">
$(function(){
$("#${config_id}JoRForm").Validform({
tiptype:1
});
});
</script>
</form>
</div>
<div id="${config_id}Content" class="ui_loading" style="display: none; position: absolute; opacity: 1; z-index: 1; text-align:center; text-indent:0em; width: 100%; height: 50%; padding:3px;">
<span>正在生成报表哦,休息一下吧......</span>
</div>
</body>
</html>
2.JoReportDao_queryJoReportItems.sql也需要修改
<pre name="code" class="html"><!--#setting classic_compatible=true-->
<!DOCTYPE html>
<html style="height: 100%">
<head>
<title></title>
<link href="plug-in/lhgDialog/skins/default.css" rel="stylesheet" id="lhgdialoglink">
<script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="plug-in/tools/dataformat.js"></script>
<link id="easyuiTheme" rel="stylesheet" href="plug-in/easyui/themes/default/easyui.css" type="text/css">
<link rel="stylesheet" href="plug-in/easyui/themes/icon.css" type="text/css">
<link rel="stylesheet" type="text/css" href="plug-in/accordion/css/accordion.css">
<script type="text/javascript" src="plug-in/easyui/jquery.easyui.min.1.3.2.js"></script>
<script type="text/javascript" src="plug-in/easyui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="plug-in/tools/syUtil.js"></script>
<script type="text/javascript" src="plug-in/easyui/extends/datagrid-scrollview.js"></script>
<script type="text/javascript" src="plug-in/My97DatePicker/WdatePicker.js"></script>
<link href="plug-in/My97DatePicker/skin/WdatePicker.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="plug-in/tools/css/common.css" type="text/css">
<script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script>
<script type="text/javascript" src="plug-in/tools/curdtools.js"></script>
<script type="text/javascript" src="plug-in/tools/easyuiextend.js"></script>
<script type="text/javascript" src="plug-in/jquery-plugs/hftable/jquery-hftable.js"></script>
<link rel="stylesheet" href="plug-in/jquery/jquery-autocomplete/jquery.autocomplete.css" type="text/css">
<script type="text/javascript" src="plug-in/jquery/jquery-autocomplete/jquery.autocomplete.min.js"></script>
<style type='text/css'>
body{margin:0px;padding:0px;}
</style>
<script type="text/javascript">
$(function(){
<#list config_queryList as x>
<#if x['search_mode']=="group">
<#if x['field_type']=="Date" && x['data_type']=="*">
$("input[name='${x['field_name']}_begin']").attr({datatype:"*"});
$("input[name='${x['field_name']}_end']").attr({datatype:"*"});
</#if>
</#if>
<#if x['search_mode']=="single">
<#if x['field_type']=="Date" && x['data_type']=="*">
$("input[name='${x['field_name']}']").attr({datatype:"*"});
</#if>
</#if>
</#list>
$('#${config_id}List').datagrid({
idField: 'id',
title: '${config_name}',
url:'',
fit:false,
fitColumns:false,
pageSize: 100,
pagination:false,
pageList:[10,30,50,100],
singleSelect:true,
checkbox:false,
sortOrder:'asc',
rownumbers:true,
showHeader:false,
showFooter:true,
frozenColumns:[[]],
columns:[
[
]
],
onLoadSuccess:function(data){$("#${config_id}List").datagrid("clearSelections");},
onClickRow:function(rowIndex,rowData)
{rowid=rowData.id;gridname='${config_id}List';}
});
});
//打开内链
function ${config_id}Listsearch(){
<#if (config_requiredList?size>0)>
<#list config_requiredList as x>
<#if x['search_mode']=="single">
var ${x['field_name']}= $('#${config_id}Listtb').find("[name='${x['field_name']}']").val();
if(${x['field_name']}=="" || ${x['field_name']}==undefined) {
alert("${x['field_txt']} 不能为空!");
return;
}
<#else>
var ${x['field_name']}_begin= $('#${config_id}Listtb').find("[name='${x['field_name']}_begin']").val();
if(${x['field_name']}_begin=="" || ${x['field_name']}_begin==undefined) {
alert("${x['field_txt']} 开始时间不能为空!");
return;
}
var ${x['field_name']}_end= $('#${config_id}Listtb').find("[name='${x['field_name']}_end']").val();
if(${x['field_name']}_end=="" || ${x['field_name']}_end==undefined) {
alert("${x['field_txt']} 结束时间不能为空!");
return;
}
</#if>
</#list>
</#if>
$("#${config_id}Content").show();
//document.${config_id}JoRForm.action = "reportviewer?file=demos/功能演示/脚本/引入自定义脚本函数.xml";
var form = document.${config_id}JoRForm;
//alert(form.name);
//遍历指定form表单所有元素
for(var i=0;i<form.length;i++){
var element=form[i];
if(element.value==""){
//$(element).attr({disabled:"disabled"});
//console.log(element.name);
}
}
form.target = "_self";
$('#${config_id}JoRForm').submit();
}
//function dosearch(params){var jsonparams=$.parseJSON(params);$('#${config_id}List').datagrid({url:'joReportController.do?datagrid&configId=${config_id},',queryParams:jsonparams});}
//function ${config_id}Listsearchbox(value,name){var queryParams=$('#${config_id}List').datagrid('options').queryParams;queryParams[name]=value;queryParams.searchfield=name;$('#${config_id}List').datagrid('reload');}$('#${config_id}Listsearchbox').searchbox({searcher:function(value,name){${config_id}Listsearchbox(value,name);},menu:'#${config_id}Listmm',prompt:'请输入查询关键字'});
function searchReset_${config_id}(name){ $("#"+name+"tb").find(":input").val("");}
//打开外链
function ${config_id}blankLink() {
<#if (config_requiredList?size>0)>
<#list config_requiredList as x>
<#if x['search_mode']=="single">
var ${x['field_name']}= $('#${config_id}Listtb').find("[name='${x['field_name']}']").val();
if(${x['field_name']}=="" || ${x['field_name']}==undefined) {
alert("${x['field_txt']} 不能为空!");
return;
}
<#else>
var ${x['field_name']}_begin= $('#${config_id}Listtb').find("[name='${x['field_name']}_begin']").val();
if(${x['field_name']}_begin=="" || ${x['field_name']}_begin==undefined) {
alert("${x['field_txt']} 开始时间不能为空!");
return;
}
var ${x['field_name']}_end= $('#${config_id}Listtb').find("[name='${x['field_name']}_end']").val();
if(${x['field_name']}_end=="" || ${x['field_name']}_end==undefined) {
alert("${x['field_txt']} 结束时间不能为空!");
return;
}
</#if>
</#list>
</#if>
var form = document.${config_id}JoRForm;
//遍历指定form表单所有元素
for(var i=0;i<form.length;i++){
var element=form[i];
if(element.value==""){
//$(element).attr({disabled:"disabled"});
//console.log(element.name);
}
}
form.target = "_blank";
$('#${config_id}JoRForm').submit();
}
<#-- 增加下面4个script函数,http://blog.youkuaiyun.com/dandanzmc/article/details/34110767-->
function formatter_ymdh(date){
var y = date.getFullYear();
var m = date.getMonth()+1;
var d = date.getDate();
var h = date.getHours();
return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d)+' '+(h<10?('0'+h):h);
}
function parser_ymdh(s){
if (!s){
var date = new Date();
var ty = date.getFullYear();
var tm = date.getMonth()+1;
var td = date.getDate();
var th = date.getHours();
return new Date(ty,tm-1,td,th,0,0);
}
var reg=/[- ]/; //利用正则表达式分隔
var ss = (s.split(reg));
var y = parseInt(ss[0],10);
var m = parseInt(ss[1],10);
var d = parseInt(ss[2],10);
var h = parseInt(ss[3],10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d) && !isNaN(h)){
return new Date(y,m-1,d,h,0,0);
} else {
return new Date();
}
}
function formatter_month(date){
var y = date.getFullYear();
var m = date.getMonth()+1;
return y+'-'+(m<10?('0'+m):m);
/*var d = date.getDate();
return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d);*/
}
function parser_month(s){
if (!s) return new Date();
var ss = (s.split('-'));
var y = parseInt(ss[0],10);
var m = parseInt(ss[1],10);
if (!isNaN(y) && !isNaN(m)){
return new Date(y,m-1,1);
} else {
return new Date();
}
/*var d = parseInt(ss[2],10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
return new Date(y,m-1,d);
} else {
return new Date();
}
return new Date(Date.parse(date.replace(/-/g,"/")));*/
}
</script>
</head>
<body style="height: 100%">
<table width="100%" id="${config_id}List" toolbar="#${config_id}Listtb"></table>
<div id="${config_id}Listtb" style="padding:3px; height: auto">
<form id="${config_id}JoRForm" name="${config_id}JoRForm" method="post" action="reportviewer">
<div name="searchColums">
<input type="hidden" name="file" value="${config_rfile}" />
<input type="hidden" name="_all_in_one_page" value="<#if '${config_pagination}'=="Y">false<#else>true</#if>" />
<#list config_queryList as x>
<span style="display:-moz-inline-box;display:inline-block;">
<span style="<#if x['is_show']=="Y">display:-moz-inline-box;display:inline-block;<#else>display:none;</#if>width: 100px;text-align:right;text-align:right;text-overflow:ellipsis;-o-text-overflow:ellipsis; overflow: hidden;white-space:nowrap;" title="${x['field_txt']}" class="Validform_label" >${x['field_txt']}:</span>
<#if x['search_mode']=="group">
<input type="text" name="${x['field_name']}_begin" value="${x['default_va']}" <#if x['read_only']=="Y">readonly</#if>
<#if x['field_type']="Date">
class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd'})"
<#else>
<#if x['date_format']!="">
class="Wdate" <#if x['read_only']!="Y">onClick="WdatePicker({dateFmt:'${x['date_format']}'})" </#if>
</#if>
</#if> />
<span style="display:-moz-inline-box;display:inline-block;width: 8px;text-align:right;">~</span>
<input type="text" name="${x['field_name']}_end" value="${x['default_va']}" <#if x['read_only']=="Y">readonly</#if>
<#if x['field_type']="Date">
class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd'})"
<#else>
<#if x['date_format']!="">
class="Wdate" <#if x['read_only']!="Y">onClick="WdatePicker({dateFmt:'${x['date_format']}'})"
</#if>
</#if>
</#if> />
</#if>
<#if x['search_mode']=="single">
<#if (x['field_dictlist']?size >0)>
<select name = "${x['field_name']}" <span style="color:#FF0000;"><#if x['read_only']=="Y">disabled="disabled"<#else>display:none;</#if></span> WIDTH="100" style="<#if x['is_show']=="Y"><#else>display:none;</#if>width: 104px" <#if x['data_type']?length gt 0 >datatype="${x['data_type']}"</#if> >
<option value = "">---请选择---</option>
<#list x['field_dictlist'] as xd>
<span style="color:#FF0000;"><#if xd['typecode']=="${x['default_va']}">
<option value = "${xd['typecode']}" selected = "selected" >${xd['typename']}</option>
<#else>
<option value = "${xd['typecode']}" >${xd['typename']}</option>
</#if></span>
</#list>
</select>
<#elseif (x['field_replacelist']?size >0)>
<select name = "${x['field_name']}" <#if x['read_only']=="Y">disabled="disabled"<#else>display:none;</#if> WIDTH="100" style="<#if x['is_show']=="Y"><#else>display:none;</#if>width: 104px" <#if x['data_type']?length gt 0 >datatype="${x['data_type']}"</#if> >
<option value = "">---请选择---</option>
<#list x['field_replacelist'] as xd>
<#if xd['typecode']=="${x['default_va']}">
<option value = "${xd['typecode']}" selected = "selected" >${xd['typename']}</option>
<#else>
<option value = "${xd['typecode']}" >${xd['typename']}</option>
</#if>
</#list>
</select>
<#else>
<input type="text" style="width: 120px" name="${x['field_name']}" value="${x['default_va']}" <#if x['read_only']=="Y">readonly</#if>
<#if x['field_type']="Date">
class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd'})"
<#else>
<#if x['date_format']!="">class="Wdate" <#if x['read_only']!="Y">onClick="WdatePicker({dateFmt:'${x['date_format']}'})" </#if>
</#if>
</#if> />
</#if>
</#if>
</span>
</#list>
</div>
<div style="height:30px;" class="datagrid-toolbar">
<span style="float:left;" >
<a href="#" class="easyui-linkbutton" plain="true" icon="icon-putout" onclick="${config_id}blankLink();">外链方式生成和阅读报表</a>
</span>
<#if (config_queryList?size >0)>
<span style="float:right">
<a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="${config_id}Listsearch()">生成报表并阅读</a>
<a href="#" class="easyui-linkbutton" iconCls="icon-reload" onclick="searchReset_${config_id}('${config_id}List')">重置</a>
</span>
</#if>
</div>
<link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css">
<link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css">
<script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min.js"></script>
<script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype.js"></script>
<script type="text/javascript" src="plug-in/Validform/js/datatype.js"></script>
<script type="text/javascript" src="plug-in/Validform/plugin/passwordStrength/passwordStrength-min.js"></script>
<script type="text/javascript">
$(function(){
$("#${config_id}JoRForm").Validform({
tiptype:1
});
});
</script>
</form>
</div>
<div id="${config_id}Content" class="ui_loading" style="display: none; position: absolute; opacity: 1; z-index: 1; text-align:center; text-indent:0em; width: 100%; height: 50%; padding:3px;">
<span>正在生成报表哦,休息一下吧......</span>
</div>
</body>
</html>
select
ci.id as id,
ci.field_name as field_name,
ci.field_txt as field_txt,
ci.field_type as field_type,
ci.is_show as is_show,
ci.s_mode as search_mode,
ci.replace_va as replace_value,
ci.dict_code as dict_code,
ci.dict_table as dict_table,
ci.dict_text as dict_text,
ci.dict_editable as dict_editable,
ci.default_va as default_va,
ci.read_only as read_only,
ci.data_type as data_type,
ci.required as required,
ci.date_format as date_format,
ci.help_tip as help_tip,
ci.jorhead_id as joreport_head_id
from jform_jor_item ci,jform_jor_head ch
where 1=1
and ci.jorhead_id = ch.id
and ch.code = '${configId}'
order by ci.order_num asc
3.配置ftl里需要的常量JoReportConstant.java
package com.iujin.web.joreport.common;
/**
* @Title:JoReportConstant
* @description:简表动态报表常量类
* @author QQ:122693290
* @version V1.0
*/
public class JoReportConstant {
/** 抬头配置 */
public static final String MAIN= "main";
/** 明细配置*/
public static final String ITEMS= "items";
/** 配置的id*/
public static final String CONFIG_ID="config_id";
/** 配置的名称*/
public static final String CONFIG_NAME="config_name";
/** 配置的简表定义文件路径*/
public static final String CONFIG_RFILE="config_rfile";
/** 配置的是否分页*/
public static final String CONFIG_PAGINATION="config_pagination";
/** 字段列表*/
//public static final String CONFIG_FIELDLIST = "config_fieldList"; //作废liuwei
/** 查询字段*/
public static final String CONFIG_QUERYLIST ="config_queryList";
/**字典数据*/
public static final String FIELD_DICTLIST = "field_dictlist";
/**取值表达式下拉*/
public static final String FIELD_REPLACELIST = "field_replacelist";
/**系统字典表*/
public static final String SYS_DIC="t_s_type";
/**系统字典分组表*/
public static final String SYS_DICGROUP="t_s_typegroup";
/** 抬头配置-查询SQL*/
public static final String CONFIG_SQL= "cgreport_sql";
/** 字典编码/字典编码列名(后面这个在有字典表设置时作为编码所在的列表使用)*/
public static final String ITEM_DICCODE= "dict_code";
/** 字典表*/
public static final String ITEM_DICTABLE= "dict_table";
/** 字典文本列名*/
public static final String ITEM_DICTEXT= "dict_text";
/** 取值表达式*/
public static final String ITEM_REPLACE = "replace_value";
/** 明细配置-字段名*/
public static final String ITEM_FIELDNAME = "field_name";
/** 明细配置-字段类型*/
public static final String ITEM_FIELDTYPE = "field_type";
/** 明细配置-查询模式*/
public static final String ITEM_QUERYMODE = "search_mode";
/**逻辑true*/
public static final String BOOL_TRUE= "Y";
/**逻辑false*/
public static final String BOOL_FALSE= "N";
/**查询操作=*/
public static final String OP_EQ = " = ";
/**查询操作>=*/
public static final String OP_RQ = " >= ";
/**查询操作<=*/
public static final String OP_LQ = " <= ";
/**查询操作like*/
public static final String OP_LIKE = " LIKE ";
/** 明细配置-必填项*/
public static final String ITEM_REQUIRED = "required";
/** 查询字段*/
public static final String CONFIG_REQUIREDLIST ="config_requiredList";
}
4.JoReportController.java
package com.iujin.web.joreport.controller.autoreport;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.jeecgframework.core.common.controller.BaseController;
import org.jeecgframework.core.common.exception.BusinessException;
import org.jeecgframework.core.util.ContextHolderUtils;
import org.jeecgframework.core.util.StringUtil;
import org.jeecgframework.web.cgform.engine.FreemarkerHelper;
import org.jeecgframework.web.cgreport.common.CgReportConstant;
import org.jeecgframework.web.system.manager.ClientManager;
import org.jeecgframework.web.system.pojo.base.Client;
import org.jeecgframework.web.system.pojo.base.TSUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.iujin.web.joreport.common.JoReportConstant;
import com.iujin.web.joreport.exception.JoReportNotFoundException;
import com.iujin.web.joreport.service.autoreport.JoReportServiceI;
import com.iujin.web.joreport.util.JoReportQueryParamUtil;
/**
*
* @Title:JoReportController
* @description:简表动态报表展示控制器
* @author QQ:122693290
* @version V1.0
*/
@Controller
@RequestMapping("/joReportController")
public class JoReportController extends BaseController {
@Autowired
private JoReportServiceI joReportService;
/**
* 简表动态报表展现入口
* @param id 动态配置ID-code
* @param request
* @param response
*/
@SuppressWarnings("unchecked")
@RequestMapping(params = "list")
public void list(String id, HttpServletRequest request, HttpServletResponse response) {
//step.1 根据id获取该简表动态报表的配置参数
Map<String, Object> joReportMap = null;
try{
joReportMap = joReportService.queryJoReportConfig(id);
}catch (Exception e) {
throw new JoReportNotFoundException("简表动态报表配置不存在!");
}
//step.2 获取列表ftl模板路径
FreemarkerHelper viewEngine = new FreemarkerHelper();
//step.3 组合模板+数据参数,进行页面展现
loadVars(joReportMap);
//升级保留 liuwei readme-jeecg/2.50 begin
HttpSession session = ContextHolderUtils.getSession();
Client client = ClientManager.getInstance().getClient(session.getId());
if(client == null){
client = ClientManager.getInstance().getClient(
request.getParameter("sessionId"));
}
if (client != null && client.getUser()!=null ) {
TSUser u = client.getUser();
session.setAttribute("LOGINUSER_ID", u.getId()); //登录人id
session.setAttribute("LOGINUSER_USERNAME", u.getUserName()); //登录人登录名
session.setAttribute("LOGINUSER_REALNAME", u.getRealName()); //登录人显示中文名
session.setAttribute("LOGINUSER_DEPART_ID", u.getTSDepart().getId()); //登录人的所属部门id
session.setAttribute("LOGINUSER_DEPART_NAME", u.getTSDepart().getDepartname()); //登录人的所属部门中文名
//登录人的所属地市、区县、网格id
//登录人的所属地市、区县、网格中文名
//登录人的管辖地市及区县id组
}
//升级保留 liuwei readme-jeecg/2.50 end
String html = viewEngine.parseTemplate("/com/iujin/web/joreport/engine/autoreport/joreportlist.ftl", joReportMap);
try {
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-store");
PrintWriter writer = response.getWriter();
writer.println(html);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 组装模版参数
* @param joReportMap
*/
@SuppressWarnings("unchecked")
<span style="color:#FF9900;"><span style="color:#6666CC;">private void loadVars(Map<String, Object> joReportMap) {
Map mainM = (Map) joReportMap.get(JoReportConstant.MAIN);
List<Map<String,Object>> fieldList = (List<Map<String, Object>>) joReportMap.get(JoReportConstant.ITEMS);
List<Map<String,Object>> queryList = new ArrayList<Map<String,Object>>(0);
List<Map<String,Object>> requiredList = new ArrayList<Map<String,Object>>(0);
for(Map<String,Object> fl:fieldList){
fl.put(JoReportConstant.ITEM_FIELDNAME, ((String)fl.get(JoReportConstant.ITEM_FIELDNAME)).toLowerCase());
loadDic(fl,fl);
loadReplace(fl,fl); //升级保留 liuwei
queryList.add(fl);
String isRequired = (String) fl.get(JoReportConstant.ITEM_REQUIRED);
if(JoReportConstant.BOOL_TRUE.equalsIgnoreCase(isRequired)){
requiredList.add(fl);
}
}
joReportMap.put(JoReportConstant.CONFIG_ID, mainM.get("code"));
joReportMap.put(JoReportConstant.CONFIG_NAME, mainM.get("name"));
joReportMap.put(JoReportConstant.CONFIG_RFILE, mainM.get("rfile"));
joReportMap.put(JoReportConstant.CONFIG_PAGINATION, mainM.get("is_pagination"));
joReportMap.put(JoReportConstant.CONFIG_QUERYLIST, queryList);
joReportMap.put(JoReportConstant.CONFIG_REQUIREDLIST, requiredList);
}</span></span>
/**
* 装载数据字典
* @param m 要放入freemarker的数据
* @param joReportMap 读取出来的动态配置数据
*/
@SuppressWarnings("unchecked")
private void loadDic(Map m, Map<String, Object> joReportMap) {
String dict_code = (String) joReportMap.get(JoReportConstant.ITEM_DICCODE);
String dict_table = (String) joReportMap.get(JoReportConstant.ITEM_DICTABLE);
String dict_text = (String) joReportMap.get(JoReportConstant.ITEM_DICTEXT);
if(StringUtil.isEmpty(dict_code) || StringUtil.isEmpty(dict_code.trim())){
m.put(JoReportConstant.FIELD_DICTLIST, new ArrayList(0));
return;
}
if(dict_table==null || dict_table.trim().length()==0 || dict_text==null || dict_text.trim().length()==0) {
dict_table = "";
dict_text = "";
}
List<Map<String, Object>> dicDatas = queryDic(dict_code, dict_table, dict_text);
m.put(JoReportConstant.FIELD_DICTLIST, dicDatas);
}
/**
* 查询数据字典
* @param diccode 字典编码/字典编码所在列名
* @param dictable 指定作为字典表的表
* @param dictext 指定字典表的文本列名
* @return
*/
private List<Map<String, Object>> queryDic(String diccode, String dictable, String dictext) {
String dicfield = diccode;
String dictable_local = dictable;
if(StringUtil.isEmpty(dictable)) {
dictable_local = JoReportConstant.SYS_DIC;
dicfield = "TYPECODE";
dictext = "TYPENAME";
}
StringBuilder dicSql = new StringBuilder();
dicSql.append(" SELECT "+dicfield+","+dictext+" FROM");
dicSql.append(" "+dictable_local);
if(StringUtil.isEmpty(dictable)) {
dicSql.append(" "+"WHERE TYPEGROUPID = ");
dicSql.append(" "+"(SELECT ID FROM "+JoReportConstant.SYS_DICGROUP+" WHERE TYPEGROUPCODE = '"+diccode+"' )");
}
List<Map<String, Object>> dicDatas = joReportService.findForJdbc(dicSql.toString());
return dicDatas;
}
/**
* 装载取值表达式
* @param m 要放入freemarker的数据
* @param joReportMap 读取出来的动态配置数据
*/
@SuppressWarnings("unchecked")
private void loadReplace(Map m, Map<String, Object> joReportMap) {
try{
//获取取值表达式
String replace = (String) joReportMap.get(JoReportConstant.ITEM_REPLACE);
if(StringUtil.isEmpty(replace)){
m.put(JoReportConstant.FIELD_REPLACELIST, new ArrayList(0));
return;
}
List<Map<String, Object>> replaceDatas = new ArrayList(0);
String[] groups = replace.split(",");
for(String g:groups){
String[] items = g.split("_");
String v = items[0];//逻辑判断值
String txt = items[1];//要转换的文本
Map<String, Object> rvm = new HashMap<String,Object>();
rvm.put("typecode", v);
rvm.put("typename", txt);
replaceDatas.add(rvm);
}
m.put(JoReportConstant.FIELD_REPLACELIST, replaceDatas);
}catch (Exception e) {
//这里出现异常原因是因为取值表达式不正确
e.printStackTrace();
throw new BusinessException("取值表达式不正确");
}
}
}