package com.norteksoft.mms.base; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; 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.base.utils.view.DynamicColumnDefinition; import com.norteksoft.mms.base.utils.view.ExportData; import com.norteksoft.mms.base.utils.view.GridColumnInfo; import com.norteksoft.mms.form.dao.ListColumnDao; import com.norteksoft.mms.form.dao.ListViewDao; import com.norteksoft.mms.form.entity.DataTable; 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.DataTableManager; import com.norteksoft.mms.form.service.FormHtmlParser; import com.norteksoft.mms.form.service.ListColumnManager; import com.norteksoft.mms.module.dao.MenuDao; import com.norteksoft.mms.module.entity.Menu; import com.norteksoft.product.api.impl.WorkflowClientManager; import com.norteksoft.product.orm.Page; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.util.JsonParser; import com.norteksoft.product.util.PageUtils; import com.norteksoft.product.web.struts2.Struts2Utils; @Service @Transactional(readOnly=true) public class MmsUtil { private Log log = LogFactory.getLog(WorkflowClientManager.class); @Autowired private ListViewDao viewDao; @Autowired private ListViewDao listViewDao; @Autowired private MenuDao menuDao; @Autowired private ListColumnDao listColumnDao; @Autowired private FormHtmlParser formHtmlParser; @Autowired private DataTableManager dataTableManager; /** * 根据系统编码的集合获得列表集合 * @param sysCodes 系统编码集合 * @return */ public List<ListView> getListViews(String... sysCodes){ return viewDao.getListViewsBySystem(sysCodes); } /** * 根据列表编码获得列表 * @param code * @return */ public ListView getListViewByCode(String code){ return viewDao.getListViewByCode(code); } /** * 保存用户自定义的列表 * @param code 列表编码 * @param name 列表名称 * @param sysCode 系统编码 */ @Transactional(readOnly=false) public void saveColums(String code,String name,String tableName){ Assert.notNull(ContextUtils.getSystemCode(), "systemCode不能为null"); Assert.notNull(ContextUtils.getCompanyId(), "companyId不能为null"); Menu menu=menuDao.getRootMenuByCode(ContextUtils.getSystemCode(),ContextUtils.getCompanyId()); DataTable table=dataTableManager.getDataTableByTableName(tableName); if(menu!=null){ ListView view=listViewDao.getListViewByCode(code); if(view!=null){ view.setName(name); }else{ view=new ListView(); view.setCode(code); view.setName(name); view.setCreator(ContextUtils.getLoginName()); view.setCreatorName(ContextUtils.getUserName()); view.setCreatedTime(new Date()); view.setDataTable(table); } view.setMenuId(menu.getId()); viewDao.save(view); List<ListColumn> items=new ArrayList<ListColumn>(); List<Object> list=JsonParser.getFormTableDatas(ListColumn.class); for(Object obj:list){ ListColumn column=(ListColumn)obj; column.setCompanyId(ContextUtils.getCompanyId()); column.setListView(view); listColumnDao.save(column); items.add(column); } view.setColumns(items); } } /** * 根据列表code获得colNames和colModel * @param code */ public GridColumnInfo getGridColumnInfo(String code){ ListView listView=viewDao.getListViewByCode(code); if(listView==null){ log.debug("ListView实体不能为null"); throw new RuntimeException("ListView实体不能为null"); } List<ListColumn> columns=listView.getColumns(); GridColumnInfo gridColumnInfo=new GridColumnInfo(); StringBuilder colNames=new StringBuilder(); StringBuilder colModel=new StringBuilder(); if(columns!=null&&columns.size()>0){ colNames.append("["); colModel.append("["); int index=0; for(ListColumn column:columns){ String vs=formHtmlParser.getValueSet(column,null,null); column.setOptionSet(vs); colNames.append(getColNames(column)); if(column.getTableColumn()!=null){ colModel.append(getColModel(column)); }else{ colModel.append(getTemporaryColModel(column,index)); } index++; } if(colNames.charAt(colNames.length()-1)==','){ colNames.delete(colNames.length()-1, colNames.length()); } if(colModel.charAt(colModel.length()-1)==','){ colModel.delete(colModel.length()-1, colModel.length()); } colNames.append("]"); colModel.append("]"); gridColumnInfo.setColNames(colNames.toString()); gridColumnInfo.setColModel(colModel.toString()); } return gridColumnInfo; } private String getTemporaryColModel(ListColumn column,int index) { StringBuilder colModel=new StringBuilder(); colModel.append("{name:'_temporary"); colModel.append(index); colModel.append("',index:'_temporary"); colModel.append(index); colModel.append("'"); if(StringUtils.isNotEmpty(column.getFormat())&&column.getFormat().indexOf("func:")!=-1){ String functionName=column.getFormat().replace("func:", ""); colModel.append(",formatter:"); colModel.append(functionName); } if(StringUtils.isNotEmpty(column.getHeadStyle())){ colModel.append(",width:"); colModel.append(column.getHeadStyle()); } if(column.getSortable()){ colModel.append(",sortable:true"); }else{ colModel.append(",sortable:false"); } if(column.getVisible()){ colModel.append(",hidden:false"); }else{ colModel.append(",hidden:true"); } colModel.append("},"); return colModel.toString(); } /** * 根据列设置获得表格表体信息 * @param column * @return */ private String getColModel(ListColumn column) { StringBuilder colModel=new StringBuilder(); String columnName=column.getTableColumn().getName(); colModel.append("{name:'"); colModel.append(columnName); colModel.append("',index:'"); colModel.append(columnName); colModel.append("'"); if(StringUtils.isNotEmpty(column.getHeadStyle())){ colModel.append(",width:"); colModel.append(column.getHeadStyle()); } if(StringUtils.isNotEmpty(column.getFormat())){ String formatSet=column.getFormat(); if(formatSet.startsWith("func:")){ colModel.append(",formatter:"); colModel.append(formatSet.substring(formatSet.indexOf(":")+1, formatSet.length())); } } if(column.getEditable()){ colModel.append(",editable:true"); String editRules=getEditRules(column); if(StringUtils.isNotEmpty(editRules)){ colModel.append(",editrules:{"); colModel.append(editRules); colModel.append("}"); } } if(StringUtils.isNotEmpty(column.getValueSet())){ colModel.append(",edittype:'select'"); colModel.append(",formatter:'select'"); colModel.append(",editoptions:{value:{"); colModel.append(column.getOptionSet()); colModel.append("}}"); }else if(column.getTableColumn().getDataType().equals("BOOLEAN")){ colModel.append(",edittype:'checkbox'"); colModel.append(",formatter:formatCheckbox"); colModel.append(",unformat:unFormatCheckbox"); colModel.append(",editoptions: {value:\"true:false\"}"); }else if(column.getControlValue()!=null && column.getControlValue().equals("TEXTAREA")){ colModel.append(",edittype:'textarea'"); }else{ if(StringUtils.isNotEmpty(column.getFormat())){ packagingFormatSetting(colModel,column.getFormat()); } } if(column.getVisible()){ colModel.append(",hidden:false"); }else{ colModel.append(",hidden:true"); } colModel.append("},"); return colModel.toString(); } /** * 格式设置 * @param colModel * @param column */ private void packagingFormatSetting(StringBuilder colModel,String formatSetting) { if(formatSetting.indexOf("$#,##")!=-1){ colModel.append(",formatter:'currency'"); if(formatSetting.indexOf(".")!=-1){ colModel.append(",formatoptions:{decimalSeparator:'.', thousandsSeparator: ',', decimalPlaces: "); colModel.append(formatSetting.length()-7); colModel.append(", prefix: '$'}"); }else{ colModel.append(",formatoptions:{decimalSeparator:' ', thousandsSeparator: ',', decimalPlaces: 0, prefix: '$'}"); } }else if(formatSetting.indexOf("¥#,##")!=-1){ colModel.append(",formatter:'currency'"); if(formatSetting.indexOf(".")!=-1){ colModel.append(",formatoptions:{decimalSeparator:'.', thousandsSeparator: ',', decimalPlaces: "); colModel.append(formatSetting.length()-7); colModel.append(", prefix: '¥'}"); }else{ colModel.append(",formatoptions:{decimalSeparator:' ', thousandsSeparator: ',', decimalPlaces: 0, prefix: '¥'}"); } }else if(formatSetting.indexOf("%")!=-1){ colModel.append(",formatter:'currency'"); if(formatSetting.indexOf(".")!=-1){ colModel.append(",formatoptions:{decimalSeparator:'00.', thousandsSeparator: '', decimalPlaces: "); colModel.append(formatSetting.length()-3); colModel.append(", suffix: '%'}"); }else{ colModel.append(",formatoptions:{decimalSeparator:'00', thousandsSeparator: '', decimalPlaces: 0, prefix: '%'}"); } }else if(formatSetting.equals("yyyy-m-d")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'Y-m-d'}"); }else if(formatSetting.equals("yyyy-m-d hh:mm:ss")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'Y-m-d H:i:s'}"); }else if(formatSetting.equals("yyyy-m")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'Y-m'}"); }else if(formatSetting.equals("m-d")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'m-d'}"); }else if(formatSetting.equals("yyyy年m月d日")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'Y年m月d日'}"); }else if(formatSetting.equals("yyyy年m月d日hh时mm分ss秒")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'Y年m月d日H时i分s秒'}"); }else if(formatSetting.equals("yyyy年m月")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'Y年m月'}"); }else if(formatSetting.equals("m月d日")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'m月d日'}"); }else if(formatSetting.equals("h:mm")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'H:i'}"); }else if(formatSetting.equals("h:mm:ss")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'H:i:s'}"); }else if(formatSetting.equals("h时mm分")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'H时i分'}"); }else if(formatSetting.equals("h时mm分ss秒")){ colModel.append(",formatter:'date'"); colModel.append(",formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'H时i分s秒'}"); }else if(formatSetting.indexOf("func:")!=-1){ colModel.append(",formatter:"); colModel.append(formatSetting.replace("func:", "")); }else{ if(formatSetting.indexOf("#,##")!=-1){ colModel.append(",formatter:'number'"); if(formatSetting.indexOf(".")!=-1){ colModel.append(",formatoptions:{decimalSeparator:'.', thousandsSeparator: ',', decimalPlaces:"); colModel.append(formatSetting.length()-6); colModel.append(", defaultValue: '0.00'}"); }else{ colModel.append(",formatoptions:{decimalSeparator:' ', thousandsSeparator: ',', decimalPlaces: 0, defaultValue: '0'}"); } }else{ colModel.append(",formatter:'number'"); if(formatSetting.indexOf(".")!=-1){ colModel.append(",formatoptions:{decimalSeparator:'.', thousandsSeparator: '', decimalPlaces:"); colModel.append(formatSetting.length()-2); colModel.append(", defaultValue: '0.00'}"); }else{ colModel.append(",formatoptions:{decimalSeparator:' ', thousandsSeparator: '', decimalPlaces: 0, defaultValue: '0'}"); } } } } /** * 获得编辑规则 * @param column * @return */ @SuppressWarnings("deprecation") private String getEditRules(ListColumn column) { StringBuilder editRules=new StringBuilder(); if(StringUtils.isNotEmpty(column.getEditRules())){ editRules.append(column.getEditRules()); } if(DataType.NUMBER.equals(column.getTableColumn().getDataType())||DataType.AMOUNT.equals(column.getTableColumn().getDataType())||DataType.DOUBLE.equals(column.getTableColumn().getDataType())||DataType.FLOAT.equals(column.getTableColumn().getDataType())){ if(StringUtils.isNotEmpty(editRules.toString())){ editRules.append(","); } editRules.append("number:true"); }else if(DataType.INTEGER.equals(column.getTableColumn().getDataType())||DataType.LONG.equals(column.getTableColumn().getDataType())){ if(StringUtils.isNotEmpty(editRules.toString())){ editRules.append(","); } editRules.append("integer:true"); } return editRules.toString(); } /** * 根据列设置获得表格表头值 * @param column * @return */ private String getColNames(ListColumn column) { StringBuilder colNames=new StringBuilder(); colNames.append("'"); colNames.append(formHtmlParser.getInternation(column.getHeaderName())); colNames.append("',"); return colNames.toString(); } /** * 获得动态列的实体集合 * @return */ public Map<String,DynamicColumnDefinition> getDynamicColumnName(){ String dynamicColumns=Struts2Utils.getParameter("dynamicColumns"); return JsonParser.json2Map(String.class, DynamicColumnDefinition.class, dynamicColumns); } /** * 获得带有动态列导出数据 * @param page * @param listCode * @return */ public ExportData getDynamicColumnExportData(Page<?> page,ExportDynamicColumnValues exportDynamicColumnValues){ Assert.notNull(exportDynamicColumnValues, "ExportDynamicColumnValues不能为null"); ExportData exportData=new ExportData(); String listCode=Struts2Utils.getParameter("_list_code"); String[] dynamicColumnNames=getDynamicColumnNames(); ListColumnManager listColumnManager = (ListColumnManager) ContextUtils.getBean("listColumnManager"); List<ListColumn> columns=listColumnManager.getExportColumnsByCode(listCode); if(columns!=null&&columns.size()>0){ String rowDatas=PageUtils.pageToRowData(page, columns); List<Object> head=new ArrayList<Object>(); for(ListColumn lc:columns){ head.add(formHtmlParser.getInternation(lc.getHeaderName())); } if(dynamicColumnNames != null) for(String dcn:dynamicColumnNames){ head.add(dcn); } List<List<Object>> bodyData=getBodyData(rowDatas,columns); exportDynamicColumnValues.addValuesTo(bodyData); exportData.setHead(head); exportData.setBodyData(bodyData); exportData.setFormat(getFormatting(columns)); exportData.setDataType(getDataType(columns)); exportData.setValueSet(getValueSet(columns)); } return exportData; } /** * 获得动态列名 * @return */ public String[] getDynamicColumnNames(){ String dynamicColumnName=Struts2Utils.getParameter("_dynamic_column_name"); if(StringUtils.isNotEmpty(dynamicColumnName)){ return dynamicColumnName.split(","); }else{ return null; } } /** * 获得导出数据 * @return */ public ExportData getExportData(Page<?> page,String listCode){ ExportData exportData=new ExportData(); ListColumnManager listColumnManager = (ListColumnManager) ContextUtils.getBean("listColumnManager"); if(listColumnManager==null){ log.debug("ListColumnManager不能为null"); throw new RuntimeException("ListColumnManager不能为null"); } List<ListColumn> columns=listColumnManager.getExportColumnsByCode(listCode); if(columns!=null&&columns.size()>0){ String rowDatas=PageUtils.pageToRowData(page, columns); List<Object> head=listColumnManager.getExportHeadnameByCode(listCode); exportData.setHead(head); rowDatas=rowDatas.replaceAll("\\\\", "\\\\\\\\").replaceAll("\t", "").replaceAll("\r\n", "").replaceAll("\n", ""); exportData.setBodyData(getBodyData(rowDatas,columns)); exportData.setFormat(getFormatting(columns)); exportData.setDataType(getDataType(columns)); exportData.setValueSet(getValueSet(columns)); } return exportData; } /** * 获得每列数据表中对应的数据类型 * @param columns * @return */ private String[] getDataType(List<ListColumn> columns) { String[] dataType=new String[columns.size()]; int i=0; for(ListColumn listColumn:columns){ dataType[i]=listColumn.getTableColumn().getDataType().name(); i++; } return dataType; } private String[] getValueSet(List<ListColumn> columns) { String[] valueSet=new String[columns.size()]; int i=0; for(ListColumn listColumn:columns){ String valset=formHtmlParser.getValueSet(listColumn,null,null); valueSet[i]=valset==null?"":valset; i++; } return valueSet; } /** * 获得每列对应的格式设置 * @param columns * @return */ private String[] getFormatting(List<ListColumn> columns) { String[] formatting=new String[columns.size()]; int i=0; for(ListColumn listColumn:columns){ formatting[i]=listColumn.getFormat()==null?"":listColumn.getFormat(); i++; } return formatting; } /** * 获得表体数据 * @param rowDatas * @param columns * @param columnLength * @return */ private List<List<Object>> getBodyData(String rowDatas,List<ListColumn> columns){ List<List<Object>> bodyData=new ArrayList<List<Object>>(); MapType mt = TypeFactory.defaultInstance().constructMapType( HashMap.class, String.class, String.class); CollectionType ct = TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, mt); List<Map<String, String>> objs = JsonParser.json2Object(ct, rowDatas); Map<String, String> valueSets = new HashMap<String, String>();//保存解析第一行的值设置,避免重复解析值设置 Map<String, Map<String, String>> propMaps = new HashMap<String, Map<String, String>>();//保存解析第一行的值设置转换成的Map形式,避免重复解析值设置的json字符串 for(Map<String, String> obj : objs){ List<Object> rowData=new ArrayList<Object>(); rowData.add(obj.get("id")); for(ListColumn listColumn:columns){ String columnName=listColumn.getTableColumn().getName(); String columnValue=obj.get(columnName);//数据库中的值 if(StringUtils.isNotEmpty(listColumn.getValueSet())){ String valueSet=valueSets.get(columnName); if(StringUtils.isEmpty(valueSet)){ valueSet=formHtmlParser.getValueSet(listColumn,null,null); } if(StringUtils.isNotEmpty(valueSet)){ valueSets.put(columnName,valueSet ); Map<String, String> myPropMap = propMaps.get(columnName); if(myPropMap==null||myPropMap.size()<=0){ Map<String, String> propMap = JsonParser.json2Map(String.class, String.class, "{"+valueSet+"}"); propMaps.put(columnName, propMap); } myPropMap = propMaps.get(columnName); columnValue=myPropMap.get(columnValue);//在页面中显示的值 } } rowData.add(columnValue); } bodyData.add(rowData); } return bodyData; } /** * 根据列表code获得列名 * @param code * @return */ public String getColumnsByCode(String code){ List<ListColumn> listColumns = listColumnDao.getColumnsByViewCode(code); StringBuilder columns = new StringBuilder(); for(ListColumn lc:listColumns){ if(lc.getTableColumn()!=null){ if(StringUtils.isNotEmpty(columns.toString())){ columns.append(","); } //存在实体的数据表 ListView view = lc.getListView(); DataTable table = null; String entityName=null; if(view!=null){table=view.getDataTable();} if(table!=null)entityName=table.getEntityName(); if(StringUtils.isNotEmpty(entityName)){//存在实体 columns.append(lc.getTableColumn().getName()); }else{//自定义表 columns.append(lc.getTableColumn().getDbColumnName()); } } } return columns.toString(); } /** * 根据列表code获得导出列名 * @param code * @return */ public String getExportColumnsByCode(String code){ List<ListColumn> listColumns = listColumnDao.getExportColumnsByCode(code); StringBuilder columns = new StringBuilder(); for(ListColumn lc:listColumns){ if(lc.getTableColumn()!=null){ if(StringUtils.isNotEmpty(columns.toString())){ columns.append(","); } columns.append(lc.getTableColumn().getName()); } } return columns.toString(); } }