package com.norteksoft.product.util; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; import com.norteksoft.mms.base.DynamicColumnValues; import com.norteksoft.mms.base.MmsUtil; import com.norteksoft.mms.base.TotalColumnValues; import com.norteksoft.mms.base.utils.view.DynamicColumnDefinition; import com.norteksoft.mms.form.entity.ListColumn; import com.norteksoft.mms.form.entity.ListView; import com.norteksoft.mms.form.entity.TableColumn; import com.norteksoft.mms.form.enumeration.DataType; import com.norteksoft.mms.form.enumeration.TotalType; import com.norteksoft.mms.form.service.FormHtmlParser; import com.norteksoft.mms.form.service.ListViewManager; import com.norteksoft.product.orm.Page; import com.norteksoft.product.web.struts2.Struts2Utils; public class PageUtils { public static String pageToJson(Page<?> page,String listCode){ StringBuilder json = new StringBuilder(); json.append("{\"page\":\""); json.append(page.getPageNo()); json.append("\",\"total\":"); json.append(page.getTotalPages()); json.append(",\"records\":\""); json.append(page.getTotalCount()); ListViewManager listViewManager = (ListViewManager) ContextUtils.getBean("listViewManager"); ListView listView=listViewManager.getListViewByCode(listCode); List<ListColumn> columns=listView.getColumns(); FormHtmlParser formHtmlParser = (FormHtmlParser) ContextUtils.getBean("formHtmlParser"); String footerDatas=""; footerDatas=formHtmlParser.getFooterDatas(page.getResult(),columns,false); if(StringUtils.isNotEmpty(footerDatas)){ json.append("\",\"userdata\":"); json.append(footerDatas); }else{ json.append("\""); } json.append(",\"rows\":"); json.append(pageToRowData(page,columns)); json.append("}"); return json.toString(); } public static String pageToJson(Page<?> page){ String listCode=Struts2Utils.getParameter("_list_code"); String json=""; if(StringUtils.isEmpty(listCode)){ json=customPageToJson(page); }else{ json=pageToJson(page, listCode); } return disposeSpecialCharacter(json); } public static String disposeSpecialCharacter(String json){ json=json.replaceAll("\\\\", "\\\\\\\\").replaceAll("\r", ""); if(json.contains("\r\n")){ json=json.replaceAll("\r\n", "\\\\n"); }else if(json.contains("\n")){ json=json.replaceAll("\n", "\\\\n"); } json=json.replaceAll("\t", ""); return json.replaceAll("_@_#", "\\\\\""); } private static String customPageToJson(Page<?> page){ StringBuilder json = new StringBuilder(); json.append("{\"page\":\""); json.append(page.getPageNo()); json.append("\",\"total\":"); json.append(page.getTotalPages()); json.append(",\"records\":\""); json.append(page.getTotalCount()); json.append("\",\"rows\":"); json.append(JsonParser.object2Json(page.getResult())).append("}"); return json.toString(); } public static String pageToRowData(Page<?> page,List<ListColumn> columns){ StringBuilder json = new StringBuilder(); FormHtmlParser formHtmlParser = (FormHtmlParser) ContextUtils.getBean("formHtmlParser"); json.append("["); for(Object obj:page.getResult()){ String str=obj.getClass().getName(); if(str.indexOf("[")==0){ json.append(formHtmlParser.getScriptArray(obj,columns)); }else{ json.append(formHtmlParser.getScriptObject(obj,columns)); } json.append(","); } if(page.getResult().size()>0){ json=json.replace(json.length()-1,json.length(), ""); } json.append("]"); return json.toString(); } /** * 合计所有页 * @param page * @param totalColumnValues * @return */ public static String PageToJson(Page<?> page,TotalColumnValues totalColumnValues){ String listCode=Struts2Utils.getParameter("_list_code"); StringBuilder json = new StringBuilder(); json.append("{\"page\":\""); json.append(page.getPageNo()); json.append("\",\"total\":"); json.append(page.getTotalPages()); json.append(",\"records\":\""); json.append(page.getTotalCount()); json.append("\",\"rows\":"); FormHtmlParser formHtmlParser = (FormHtmlParser) ContextUtils.getBean("formHtmlParser"); ListViewManager listViewManager = (ListViewManager) ContextUtils.getBean("listViewManager"); ListView listView=listViewManager.getListViewByCode(listCode); List<ListColumn> columns=listView.getColumns(); json.append(pageToRowData(page,columns)); if(TotalType.ALL_PAGE.equals(listView.getTotalType())){//合计所有页 List<String> result=new ArrayList<String>(); StringBuilder footerDatas=new StringBuilder(); int i=0; String totalStr=""; for(ListColumn col: columns){//统计所有的合计列 if(col.getTotal()){//如果该列需要合计 if(i==0){//第一列需要合计 totalStr="first"; } if(i>0&&StringUtils.isEmpty(totalStr)){ totalStr=",\""+columns.get(i-1).getTableColumn().getName()+"\":\""+formHtmlParser.getLocal("grid.total")+"\""; } TableColumn tc=col.getTableColumn(); result.add(tc.getName()); } i++; } if(result!=null && result.size()>0){ Map<String,Object> totalValues=totalColumnValues.getValues(result);//追加合计列的值 for(String columnName:result){ if(StringUtils.isNotEmpty(footerDatas.toString())){ footerDatas.append(","); } footerDatas.append("\""); footerDatas.append(columnName); footerDatas.append("\":"); footerDatas.append("\""); footerDatas.append(totalValues.get(columnName)==null?"0":totalValues.get(columnName)); footerDatas.append("\""); } if(StringUtils.isNotEmpty(totalStr) && !"first".equals(totalStr)){ footerDatas.append(totalStr); } if(StringUtils.isNotEmpty(footerDatas.toString())){ json.append(",\"userdata\":"); json.append("{"); json.append(footerDatas); json.append("}"); } } }else{//合计当前页 String footerDatas=""; footerDatas=formHtmlParser.getFooterDatas(page.getResult(),columns,false); if(StringUtils.isNotEmpty(footerDatas)){ json.append(",\"userdata\":"); json.append(footerDatas); } } json.append("}"); return disposeSpecialCharacter(json.toString()); } public static String dynamicPageToJson(Page<?> page,DynamicColumnValues dynamicColumnValues){ String listCode=Struts2Utils.getParameter("_list_code"); StringBuilder json = new StringBuilder(); json.append("{\"page\":\""); json.append(page.getPageNo()); json.append("\",\"total\":"); json.append(page.getTotalPages()); json.append(",\"records\":\""); json.append(page.getTotalCount()); json.append("\",\"rows\":"); ListViewManager listViewManager = (ListViewManager) ContextUtils.getBean("listViewManager"); ListView listView=listViewManager.getListViewByCode(listCode); List<ListColumn> columns=listView.getColumns(); List<Map<String,Object>> result=new ArrayList<Map<String,Object>>(); try{ if(page!=null && page.getResult()!=null && page.getResult().size()>0){ for(Object obj:page.getResult()){ result.add(getRowData(obj,columns)); } dynamicColumnValues.addValuesTo(result); //JSONArray jsonarray=JSONArray.fromObject(result); //json.append(jsonarray); json.append(JsonParser.object2Json(result)); //获得合计行 FormHtmlParser formHtmlParser = (FormHtmlParser) ContextUtils.getBean("formHtmlParser"); String footerDatas=formHtmlParser.getFooterDatas(page.getResult(),columns,false); StringBuilder footers=new StringBuilder(footerDatas); String dynFooterData=getdynamicColumnFooterDatas(result); if(StringUtils.isNotEmpty(footers.toString())||StringUtils.isNotEmpty(dynFooterData.toString())){ //如果合计的值不为空 json.append(",\"userdata\":"); if(StringUtils.isNotEmpty(dynFooterData.toString())){ if(StringUtils.isNotEmpty(footers.toString())){ if(footers.charAt(footers.length()-1)=='}'){ //动态列有合计时,删除了footer的一个大括号(后面记得要补上) footers.deleteCharAt(footers.length()-1); } footers.append(","); }else{ footers.append("{"); String colName=getTotalNameCol(columns); if(StringUtils.isNotEmpty(colName)){ footers.append("\"").append(colName) .append("\":\"").append(formHtmlParser.getLocal("grid.total")).append("\","); } } } footers.append(dynFooterData); json.append(footers); //动态列有合计时,需要补上一个大括号 if(StringUtils.isNotEmpty(dynFooterData.toString())){ json.append("}"); } } }else{ json.append("[]"); } json.append("}"); }catch (Exception e) { e.printStackTrace(); } return disposeSpecialCharacter(json.toString()); } private static String getTotalNameCol(List<ListColumn> columns){ for(int i=columns.size()-1;i>0;i--){ ListColumn col=columns.get(i); if(col.getVisible()!=null&&col.getVisible()&&col.getTableColumn()!=null&&col.getTableColumn().getDataType()==DataType.TEXT){ return col.getTableColumn().getName(); } } return null; } private static String getdynamicColumnFooterDatas(List<Map<String,Object>> result){ StringBuilder dynColfooterData=new StringBuilder(); MmsUtil mmsUtil = (MmsUtil) ContextUtils.getBean("mmsUtil"); Map<String,DynamicColumnDefinition> dynamicColumns=mmsUtil.getDynamicColumnName(); Set<String> dynamicColumnNames=dynamicColumns.keySet(); for(String key:dynamicColumnNames){ DynamicColumnDefinition dyColDef=dynamicColumns.get(key); if((dyColDef.getIsTotal()!=null&&dyColDef.getIsTotal())&&isNumber(dyColDef)){ Long totalInt=0l;//整数时的“和” Double totalFloat=0d;//小数时的"和" for(Map<String,Object> m:result){ Object val=m.get(key); if(val!=null){ if(isInt(dyColDef)){ totalInt=totalInt+Integer.parseInt(val.toString()); }else if(isFloat(dyColDef)){ totalFloat=totalFloat+Double.parseDouble(val.toString()); } } } if(isInt(dyColDef)){ dynColfooterData.append("\"") .append(key) .append("\":\"") .append(totalInt) .append("\","); }else if(isFloat(dyColDef)){ dynColfooterData.append("\"") .append(key) .append("\":\"") .append(totalFloat) .append("\","); } } } if(dynColfooterData.length()>0&&dynColfooterData.charAt(dynColfooterData.length()-1)==','){ dynColfooterData.deleteCharAt(dynColfooterData.length()-1); } return dynColfooterData.toString(); } private static boolean isNumber(DynamicColumnDefinition dyColDef){ return dyColDef.getType()!=null&&(dyColDef.getType()==DataType.AMOUNT||dyColDef.getType()==DataType.NUMBER||dyColDef.getType()==DataType.INTEGER||dyColDef.getType()==DataType.LONG||dyColDef.getType()==DataType.DOUBLE||dyColDef.getType()==DataType.FLOAT); } private static boolean isInt(DynamicColumnDefinition dyColDef){ return dyColDef.getType()!=null&&(dyColDef.getType()==DataType.NUMBER||dyColDef.getType()==DataType.INTEGER||dyColDef.getType()==DataType.LONG); } private static boolean isFloat(DynamicColumnDefinition dyColDef){ return dyColDef.getType()!=null&&(dyColDef.getType()==DataType.AMOUNT||dyColDef.getType()==DataType.DOUBLE||dyColDef.getType()==DataType.FLOAT); } /** * 根据mms列表管理中录入的列值获得行数据 * @param object * @param columns * @return */ private static Map<String,Object> getRowData(Object object,List<ListColumn> columns){ Map<String,Object> entityMap=new HashMap<String, Object>(); String str=object.getClass().getName(); if(str.indexOf("[")==0){//数组 entityMap=packagingColumn("array",object,columns); }else{//实体 entityMap=packagingColumn("entity",object,columns); } return entityMap; } private static Map<String,Object> packagingColumn(String type,Object object,List<ListColumn> columns){ Map<String,Object> entityMap=new HashMap<String, Object>(); try { if("entity".equals(type)){ Object id=BeanUtils.getProperty(object, "id"); entityMap.put("id", id); } int i=0; for(ListColumn col: columns){ TableColumn tc=col.getTableColumn(); if(tc.getDataType()!=DataType.COLLECTION){ String colName=tc.getName(); Object val=null; if("entity".equals(type)){ if(!colName.contains("$")){ if(colName.contains(".")){ String refname=colName.split("\\.")[0];//映射实体名称 Object obj=BeanUtils.getProperty(object, refname); if(obj!=null){ val=BeanUtils.getProperty(object, colName); } }else{ val=BeanUtils.getProperty(object, colName); } } } if("array".equals(type)){ val=((Object[])object)[i]; i++; } if(val!=null){ if(tc.getDataType()==DataType.DATE){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = simpleDateFormat.parse(val.toString()); val=simpleDateFormat.format(date); }else if(tc.getDataType()==DataType.TIME){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Date date = simpleDateFormat.parse(val.toString()); val=simpleDateFormat.format(date); }else if(tc.getDataType()==DataType.AMOUNT||tc.getDataType()==DataType.DOUBLE){ NumberFormat nf=new DecimalFormat("#.##"); Double d=Double.valueOf(val.toString()); val=nf.format(d); }else if(tc.getDataType()==DataType.FLOAT){ NumberFormat nf=new DecimalFormat("#.##"); Float f=Float.valueOf(val.toString()); val=nf.format(f); }else if("entity".equals(type)&&tc.getDataType()==DataType.REFERENCE){ val=BeanUtils.getProperty(object, colName+".id"); } } entityMap.put(colName, val); } } } catch (Exception e) { throw new RuntimeException(e); } return entityMap; } // public static void main(String[] args) { // System.out.println(String[].class.getName()); // System.out.println(Object[].class.getName()); // // System.out.println(com.norteksoft.product.orm.Page.class.getName()); // } public static String getMethodName(String valueKey){ String start=StringUtils.upperCase(valueKey.substring(0,1)); String other=valueKey.substring(1,valueKey.length()); return "get"+start+other; } }