package com.norteksoft.mms.base.utils; import java.lang.reflect.Method; 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.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import com.fasterxml.jackson.databind.type.MapType; import com.fasterxml.jackson.databind.type.TypeFactory; import com.norteksoft.mms.form.dao.GeneralDao; 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.service.ListViewManager; import com.norteksoft.product.util.WebContextUtils; import com.norteksoft.product.web.struts2.Struts2Utils; /** * 已经被 com.norteksoft.product.util.JsonParser 替代,请更换 */ @Deprecated public class ParseJsonUtil { /** * 表单页面中有子表表格时,保存主表单时获得子表格中所有字段值并保存,此处解析字段值 * 只有一个子表时 * 解析字符串例如:[{"id":"52521","useType":"短途","deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"汤祁中的用车申请"},{"id":"76991","useType":"短途","deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"76835","useType":"短途","deptCheckResult":"张君正","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"何庆的用车申请"},{"id":"75200","useType":"短途","deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"76235","useType":"短途","deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"91716","useType":"短途","deptCheckResult":"","officeCheckResult":"","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"108380","useType":"短途","deptCheckResult":"","officeCheckResult":"","leaderCheckResult":"","isDirectAssign":"是","applicationTheme":"王滨的用车申请"}];aa=[{"a":"1","b":"2"}] * @return List<Map<String,Object>>,List存放实体对象的集合,Map<String,Object>的key为字段名称,value为字段值, */ @SuppressWarnings("unchecked") public static List<Object> getFormTableDatas(Class classObj){ String value=Struts2Utils.getParameter("subTableVals"); // String value="carUseApplication=[{\"id\":\"76235\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"91716\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"108380\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"52521\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"汤祁中的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"76991\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"112366\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"76835\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"张君正\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"何庆的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"75200\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}}]"; List<Object> list=new ArrayList<Object>(); String[] arr=value.split("="); String indexname=arr[0].split(":")[1]; String jsonString=arr[1]; if(jsonString!=null&&StringUtils.isNotEmpty(jsonString.toString())){ list= getValue(jsonString,classObj,indexname); } return list; } /** * 表单页面中有子表表格时,保存主表单时获得子表格中所有字段值并保存,此处解析字段值 * 考虑到一个表单页面可能有多个子表,所以有以下解法 * 解析字符串例如:carUseApplication=[{"id":"52521","useType":{"value":"短途","datatype":"STRING"},"deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"汤祁中的用车申请"},{"id":"76991","useType":"短途","deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"76835","useType":"短途","deptCheckResult":"张君正","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"何庆的用车申请"},{"id":"75200","useType":"短途","deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"76235","useType":"短途","deptCheckResult":"","officeCheckResult":"王滨","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"91716","useType":"短途","deptCheckResult":"","officeCheckResult":"","leaderCheckResult":"","isDirectAssign":"否","applicationTheme":"王滨的用车申请"},{"id":"108380","useType":"短途","deptCheckResult":"","officeCheckResult":"","leaderCheckResult":"","isDirectAssign":"是","applicationTheme":"王滨的用车申请"}];aa=[{"a":"1","b":"2"}] * @return Map<String,List<Map<String,Object>>> :key 为集合字段名;value为List<Map<String,Object>>,List存放实体对象的集合,Map<String,Object>的key为字段名称,value为字段值, */ @SuppressWarnings("unchecked") public static Map<String,List<Object>> getAllFormTableDatas(Class classObj){ String values=Struts2Utils.getParameter("subTableVals"); // String values="carUseApplication=[{\"id\":\"76235\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"91716\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"108380\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"52521\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"汤祁中的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"76991\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"112366\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"76835\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"张君正\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"何庆的用车申请\",\"datatype\":\"TEXT\"}},{\"id\":\"75200\",\"useType\":{\"value\":\"短途\",\"datatype\":\"TEXT\"},\"deptCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"officeCheckResult\":{\"value\":\"王滨\",\"datatype\":\"TEXT\"},\"leaderCheckResult\":{\"value\":\"\",\"datatype\":\"TEXT\"},\"isDirectAssign\":{\"value\":\"false\",\"datatype\":\"BOOLEAN\"},\"applicationTheme\":{\"value\":\"王滨的用车申请\",\"datatype\":\"TEXT\"}}]"; Map<String,List<Object>> result=new HashMap<String,List<Object>>(); String[] vals=values.split(";"); for(String valStr:vals){ String[] arr=valStr.split("="); String field=arr[0].split(":")[0]; String indexname=arr[0].split(":")[1]; String val=arr[1]; if(val!=null&&StringUtils.isNotEmpty(val.toString())){ List<Object> list=getValue(val,classObj,indexname); result.put(field, list); } } return result; } @SuppressWarnings("unchecked") private static List<Object> getValue(String jsonString,Class classObj,String indexname){ List<Object> list=new ArrayList<Object>(); GeneralDao generalDao = (GeneralDao) WebContextUtils.getBean("generalDao"); try{ ObjectMapper mapper = new ObjectMapper(); MapType mt = TypeFactory.defaultInstance().constructMapType( HashMap.class, String.class, ColunmModule.class); CollectionType ct = TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, mt); List<Map<String, ColunmModule>> objs = mapper.readValue(jsonString, ct); int index = 0; Object entity=null; for(Map<String, ColunmModule> map : objs){ index++; Object idObj=map.get("id").getValue(); if(idObj==null||StringUtils.isEmpty(idObj.toString())){ entity=classObj.newInstance(); }else{ entity=generalDao.getObject(classObj.getName(), Long.parseLong(idObj.toString())); } Set<String> fields=map.keySet(); for(String field : fields){ ColunmModule mod = map.get(field); if(!"id".equals(field)){ if(!field.contains(".")){ Object valObj=getObjectValue(mod.getValue(), mod.getDatatype(), mod.getClassname()); BeanUtils.copyProperty(entity, field, valObj); } } } //设置显示顺序 if(!indexname.equals("false")){ BeanUtils.copyProperty(entity, indexname, index); } list.add(entity); } }catch (Exception e) { } return list; } /** * 获得colModel对应的值 * @param entity * @return */ public static String getRowValue(Object entity){ String listCode=Struts2Utils.getParameter("_list_code"); ListViewManager listViewManager = (ListViewManager) WebContextUtils.getBean("listViewManager"); ListView listView=listViewManager.getListViewByCode(listCode); List<ListColumn> columns=listView.getColumns(); StringBuilder json = new StringBuilder(); json.append("{"); try { String entityId=BeanUtils.getProperty(entity, "id"); json.append("\"id\":\""); json.append(entityId); json.append("\""); for(ListColumn lc:columns){ String attributeName=lc.getTableColumn().getName(); DataType dataType=lc.getTableColumn().getDataType(); json.append(",\""); json.append(attributeName); json.append("\":\""); String atrtName = "get" + attributeName.substring(0, 1).toUpperCase()+attributeName.substring(1, attributeName.length()); Method m = entity.getClass().getMethod(atrtName); Object o = m.invoke(entity); String attributeValue=formatDate(dataType,o,lc); json.append(attributeValue); json.append("\""); } } catch (Exception e) { e.printStackTrace(); } json.append("}"); return json.toString(); } /** * 根据数据表管理中录入的日期格式格式化日期 * @param dataType * @param attributeValue * @return */ private static String formatDate(DataType dataType,Object attributeValue,ListColumn lc){ try { if(dataType==DataType.DATE){ String formatedate=packagingFormate(lc.getFormat()); if(StringUtils.isEmpty(formatedate)){ formatedate="yyyy-MM-dd"; } SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatedate); attributeValue = simpleDateFormat.format(attributeValue); }else if(dataType==DataType.TIME){ String formatedate=packagingFormate(lc.getFormat()); if(StringUtils.isEmpty(formatedate)){ formatedate="yyyy-MM-dd HH:mm:ss"; } SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatedate); attributeValue = simpleDateFormat.format(attributeValue); } } catch (Exception e) { e.printStackTrace(); } if(attributeValue!=null)return attributeValue.toString(); else return ""; } private static String packagingFormate(String formatSetting) { if("yyyy-m-d".equals(formatSetting)){ return "yyyy-MM-dd"; }else if("yyyy-m-d hh:mm:ss".equals(formatSetting)){ return "yyyy-MM-dd HH:mm:ss"; }else if("yyyy-m".equals(formatSetting)){ return "yyyy-MM"; }else if("m-d".equals(formatSetting)){ return "MM-dd"; }else if("yyyy年m月d日".equals(formatSetting)){ return "yyyy年MM月dd日"; }else if("yyyy年m月d日hh时mm分ss秒".equals(formatSetting)){ return "yyyy年MM月dd日HH时mm分ss秒"; }else if("yyyy年m月".equals(formatSetting)){ return "yyyy年MM月"; }else if("m月d日".equals(formatSetting)){ return "MM月dd日"; } return ""; } public static Object getObjectValue(String value,String datatype,String className){ try { Object valObj=value; if("DATE".equals(datatype)||"TIME".equals(datatype)){ valObj=getDate(value,datatype); }else if("REFERENCE".equals(datatype)){ if("_temporary".equals(value)){//列表管理/字段信息/对应字段列为“占位符”时的保存 valObj=null; }else{ valObj=getReferenceObject(value, className); } }else if("ENUM".equals(datatype)){ valObj=getEnum(value, className); } return valObj; } catch (Exception e) { } return null; } private static Date getDate(String value,String datatype){ try { if(value!=null){ if(datatype.equals("DATE")){ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); return df.parse(value); }else if(datatype.equals("TIME")){ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return df.parse(value); } } } catch (Exception e) { } return null; } public static Object getEnum(String value,String className){ try { if(StringUtils.isNotEmpty(className)){ Object[] objs = Class.forName(className).getEnumConstants(); for(Object obj : objs){ if(obj.toString().equals(value.toString())){ return obj; } } } }catch (Exception e) { } return null; } /** * 获得映射的实体 * @param value * @param className * @return */ private static Object getReferenceObject(String value,String className){ try { if(StringUtils.isNotEmpty(className)){ GeneralDao generalDao = (GeneralDao) WebContextUtils.getBean("generalDao"); Object entity=generalDao.getObject(className,Long.parseLong(value)); return entity; } }catch (Exception e) { } return null; } } class ColunmModule{ private String value; private String datatype; private String classname; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getDatatype() { return datatype; } public void setDatatype(String datatype) { this.datatype = datatype; } public String getClassname() { return classname; } public void setClassname(String classname) { this.classname = classname; } @Override public String toString() { return "ColunmModule [classname=" + classname + ", datatype=" + datatype + ", value=" + value + "]"; } }