package com.norteksoft.tags.grid;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;
import com.norteksoft.mms.base.utils.view.DynamicColumnDefinition;
import com.norteksoft.mms.form.entity.GroupHeader;
import com.norteksoft.mms.form.entity.ListColumn;
import com.norteksoft.mms.form.entity.ListView;
import com.norteksoft.mms.form.enumeration.DataType;
import com.norteksoft.mms.form.enumeration.OrderType;
import com.norteksoft.mms.form.enumeration.StartQuery;
import com.norteksoft.mms.form.service.FormHtmlParser;
import com.norteksoft.mms.form.service.GroupHeaderManager;
import com.norteksoft.mms.form.service.ListViewManager;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsonParser;
import com.norteksoft.product.util.freemarker.TagUtil;
import com.norteksoft.tags.search.SearchData;
public class GridTag extends TagSupport {
private static final long serialVersionUID = 1L;
private String gridId;//表单的ID
private String code;//表单编号
private String url;//表单URL
private String pageName;//数据名称
private String subGrid;//是否有子表
private List<DynamicColumnDefinition> dynamicColumn;//动态字段
private String submitForm;//查询需要的FormID
//标签开始时调用的出来方法
@Override
public int doStartTag() throws JspException {
try {
String html =readTemplate();
//将信息内容输出到JSP页面
pageContext.getOut().print(html);
} catch (Exception e) {
throw new JspException(e);
}
return Tag.EVAL_PAGE;
//跳过标签体的执行
// return SKIP_BODY;
}
private String readTemplate() throws Exception {
String webapp=((HttpServletRequest)pageContext.getRequest()).getContextPath();
String loginName=ContextUtils.getLoginName();
String userName=ContextUtils.getTrueName();
ListViewManager listViewManager = (ListViewManager) ContextUtils.getBean("listViewManager");
ListView listView=listViewManager.getListViewByCode(code);
Assert.notNull(listView,"listView不能为空");
List<ListColumn> columns=listView.getColumns();
Map<String, Object> root=new HashMap<String, Object>();
root.put("gridId", gridId);
root.put("url", url);
root.put("ctx", webapp);
root.put("_list_code", code);
FormHtmlParser formHtmlParser = (FormHtmlParser) ContextUtils.getBean("formHtmlParser");
Boolean total=false;//是否合计
Boolean mergerCell=false;//是否合并单元格
String export="false";//是否导出
if(columns!=null&&columns.size()>0){
for(ListColumn lc:columns){
lc.setInternationName(formHtmlParser.getInternation(lc.getHeaderName()));
String vs=formHtmlParser.getValueSet(lc,null,null);
lc.setOptionSet(vs);
if(lc.getTotal()){
total=true;
}
if(lc.getExportable()!=null&&lc.getExportable()){
export="true";
}
if(lc.getTableColumn()!=null){
lc.setColumnName(formHtmlParser.getColModelName(lc.getTableColumn().getName()));
mergerCell=true;
}
}
root.put("columns", columns);
}
root.put("loginName", loginName);
root.put("userName", userName);
if(pageName!=null){
root.put("pageName", pageName);
}
if(StringUtils.isNotEmpty(listView.getEditUrl())){
root.put("editurl", listView.getEditUrl());
}else{
root.put("editurl", "");
}
if(StringUtils.isNotEmpty(listView.getDragRowUrl())){
root.put("dragRowUrl", listView.getDragRowUrl());
}else{
root.put("dragRowUrl", "");
}
if(StringUtils.isNotEmpty(listView.getDeleteUrl())){
root.put("deleteUrl", listView.getDeleteUrl());
}else{
root.put("deleteUrl", "");
}
if(listView.getRowNumbers()){
root.put("rowNumbers", true);
}else{
root.put("rowNumbers", false);
}
if(StringUtils.isNotEmpty(listView.getCustomProperty())){
root.put("customProperty", listView.getCustomProperty());
}
if(subGrid!=null){
root.put("subGrid", subGrid);
}
if(listView.getRowNum()!=null){
root.put("rowNum", listView.getRowNum().toString());
}
if(listView.getRowList()!=null){
root.put("rowList", listView.getRowList());
}
if(listView.getMultiSelect()!=null&&listView.getMultiSelect()){
root.put("multiselect", "true");
}else {
root.put("multiselect", "false");
}
if(listView.getMultiboxSelectOnly()!=null&&listView.getMultiboxSelectOnly()){
root.put("multiboxSelectOnly", "true");
}else{
root.put("multiboxSelectOnly", "false");
}
if(StringUtils.isNotEmpty(listView.getDefaultSortField())){
root.put("sortname", listView.getDefaultSortField());
}else{
root.put("sortname", "");
}
if(OrderType.DESC.equals(listView.getOrderType())){
root.put("sortorder", "desc");
}else{
root.put("sortorder", "asc");
}
if(listView.getPagination()){
root.put("pagination", "true");
}
root.put("renmibi", "¥");
root.put("_year", "年");
root.put("_month", "月");
root.put("_day", "日");
root.put("_hour", "时");
root.put("_minute", "分");
root.put("_second", "秒");
root.put("frozenColumn", listView.getFrozenColumn()==null?0:listView.getFrozenColumn());
GroupHeaderManager groupHeaderManager = (GroupHeaderManager) ContextUtils.getBean("groupHeaderManager");
List<GroupHeader> groupHeaders=groupHeaderManager.getGroupHeadersByViewId(listView.getId());
if(groupHeaders !=null && groupHeaders.size()>0){
root.put("groupHeaderSign", "true");
root.put("groupHeader", groupHeaders);
}
if(dynamicColumn!=null&&dynamicColumn.size()>0){
for(DynamicColumnDefinition dfo:dynamicColumn){
formatterEnum(dfo);
if(!total){
if(dfo.getIsTotal()!=null&&dfo.getIsTotal()){
total=true;
}
}
}
root.put("dynamicColumn", dynamicColumn);
root.put("dynamicColumns", getDynamicColumns(dynamicColumn));
String colName=dynamicColumn.get(0).getName();
root.put("dynamicColumnName", colName.subSequence(0, colName.length()-1));
}
root.put("total", total);
root.put("mergerCell", mergerCell);
root.put("export", export);
String result = TagUtil.getContent(root, "grid/gridTag.ftl");
if(!StartQuery.NO_QUERY.equals(listView.getStartQuery())){
SearchData searchData = (SearchData) ContextUtils.getBean("searchData");
String searchResult = searchData.getContent(code,url,gridId,submitForm);
searchResult = "<textarea id=\"searchArea\" style=\"display: none;\" rows=\"\" cols=\"\">"+searchResult.replace("<", "<").replace(">", ">")+"</textarea>";
result+=searchResult;
if(StartQuery.CUSTOM_QUERY.equals(listView.getStartQuery())){//启用自定义查询
result+=getCustomSearchData(listView);
}
}
result+="<input id='totalable_page_id' type='hidden' value='"+listView.getTotalable()+"'/><input id='searchTotalable_page_id' type='hidden' value='"+listView.getSearchTotalable()+"'/>";
return result;
}
private String getCustomSearchData(ListView listView){
StringBuilder searchResult = new StringBuilder();
searchResult.append("<textarea style=\"display:none;\" id=\"custom_field_list\" >");
searchResult.append(getCustomSearchFields(listView));
searchResult.append("</textarea>");
searchResult.append("<input id=\"custom_search_grid_id\" value=\""+gridId+"\" type=\"hidden\" /> ");
return searchResult.toString();
}
private String getCustomSearchFields(ListView listView){
Assert.notNull(listView,"listView不能为空");
List<ListColumn> columns=listView.getColumns();
StringBuilder temp=new StringBuilder();
for(ListColumn column:columns){
if(StringUtils.isNotEmpty(column.getQuerySettingValue()) && !"NONE".equals(column.getQuerySettingValue())&& column.getTableColumn()!=null){
if(StringUtils.isNotEmpty(temp.toString())){
temp.append(",");
}
temp.append("{");
temp.append("\"enName\":");
temp.append("\""+column.getTableColumn().getName()+"\",");
temp.append("\"keyValue\":");
if(StringUtils.isNotEmpty(column.getValueSet())){
temp.append("\""+column.getOptionSet()+"\",");
}else{
temp.append("\"\",");
}
temp.append("\"propertyType\":");
temp.append("\""+column.getTableColumn().getDataType()+"\",");
temp.append("\"enumName\":");
if(column.getTableColumn().getDataType().equals(DataType.ENUM)){
temp.append("\""+column.getValueSet().replaceFirst("enumname:", "")+"\"");
}else{
temp.append("\"\"");
}
temp.append("}");
}
}
return "["+temp.toString()+"]";
}
/**
* 获得动态列,形式为{key:value,key:value,...},key表示列体name,value表示列头名称
* @param dynamicColumnDefinition2
* @return
*/
private String getDynamicColumns(List<DynamicColumnDefinition> dynamicColumnDefinitions) {
StringBuilder dynamicColumns=new StringBuilder();
dynamicColumns.append("{");
for(DynamicColumnDefinition dynamicColumnDefinition:dynamicColumnDefinitions){
dynamicColumns.append("\"");
dynamicColumns.append(dynamicColumnDefinition.getName());
dynamicColumns.append("\":");
dynamicColumns.append(JsonParser.object2Json(dynamicColumnDefinition));
dynamicColumns.append(",");
}
if(dynamicColumns.charAt(dynamicColumns.length()-1)==','){
dynamicColumns.deleteCharAt(dynamicColumns.length()-1);
}
dynamicColumns.append("}");
return dynamicColumns.toString();
}
/**
* 若该字段editoptions不为null或空字符串,
* 并且该字段的值是枚举类的全名,
* 则把该字段封装为'key':'value','key':'value','key':'value' ...形式的字符串。
* @param dfo
*/
private void formatterEnum(DynamicColumnDefinition dfo){
String editoptions=dfo.getEditoptions();
if(StringUtils.isNotEmpty(editoptions)&&DataType.ENUM.equals(dfo.getType())){
StringBuilder opitions=new StringBuilder();
try {
Object[] objs = Class.forName(editoptions).getEnumConstants();
int i=0;
for(Object obj : objs){
i++;
opitions.append("'").append(obj.toString())
.append("':'")
// .append(textProvider.getText(BeanUtils.getProperty(obj, "code")))
.append("'");
if(i<objs.length){
opitions.append(",");
}
}
} catch (Exception e) {
}
dfo.setEditoptions(opitions.toString());
}
}
//标签结束时调用的处理方法
public int doEndTag(){
//继续执行后续的JSP页面的内容
return Tag.EVAL_PAGE;
}
public String getGridId() {
return gridId;
}
public void setGridId(String gridId) {
this.gridId = gridId;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getPageName() {
return pageName;
}
public void setPageName(String pageName) {
this.pageName = pageName;
}
public String getSubGrid() {
return subGrid;
}
public void setSubGrid(String subGrid) {
this.subGrid = subGrid;
}
public List<DynamicColumnDefinition> getDynamicColumn() {
return dynamicColumn;
}
public void setDynamicColumn(List<DynamicColumnDefinition> dynamicColumn) {
this.dynamicColumn = dynamicColumn;
}
public String getSubmitForm() {
return submitForm;
}
public void setSubmitForm(String submitForm) {
this.submitForm = submitForm;
}
}