package com.ycsoft.report.query.key.Impl; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.ycsoft.commons.exception.ReportException; import com.ycsoft.commons.helper.CollectionHelper; import com.ycsoft.commons.helper.JsonHelper; import com.ycsoft.commons.helper.StringHelper; import com.ycsoft.report.bean.RepKeyCon; import com.ycsoft.report.commons.ReportConstants; import com.ycsoft.report.commons.SystemConfig; import com.ycsoft.report.dao.keycon.QueryKeyValueDao; import com.ycsoft.report.dto.RepKeyDto; import com.ycsoft.report.query.datarole.DataControl; import com.ycsoft.report.query.key.QueryKey; public class QueryKeyImpl implements QueryKey { /** * */ private static final long serialVersionUID = 3971240963271361561L; /** * 获得一张报表(sql中含有的及其父key)需要使用的查询条件 */ public List<RepKeyDto> getQueryKeyList(String sql) throws ReportException { Map<String, RepKeyDto> querykeymap =new HashMap<String,RepKeyDto>(); //是否存在子key的判断map Map<String,String> hassonmap=new HashMap<String,String>(); List<RepKeyDto> querykeylist=new ArrayList<RepKeyDto>(); try { //获取sql中定义的keymap,keylist List<RepKeyCon> conlist = SystemConfig.getConList(); for (RepKeyCon key : conlist) { if (sql.indexOf(key.getKey()) >= 0) { RepKeyDto keydto = new RepKeyDto(); keydto.setKey(key.getKey()); keydto.setName(key.getName()); keydto.setFkey(key.getFkey()); keydto.setHtmlcode(key.getHtmlcode()); keydto.setType(key.getType()); keydto.setDatabase(key.getDatabase()); keydto.setIsnull(key.getIsnull()); querykeymap.put(keydto.getKey(), keydto); if(StringHelper.isNotEmpty(keydto.getFkey()) &&keydto.getType().equals(ReportConstants.keytype_cascade)) hassonmap.put(keydto.getFkey(), keydto.getFkey()); querykeylist.add(keydto); } } //系统定义的全部key_con_map Map<String, RepKeyCon> conmap = SystemConfig.getConMap(); for (RepKeyDto key : querykeylist) { //父级不为空,且父级不存在sql定义中 //反向取父级查询条件 RepKeyDto sonkey=key; RepKeyDto fkeydto=null; //反向取级联父级条件条件定义,一直往上级推导查询条件 while ((fkeydto=this.findFkey(sonkey, querykeymap))!=null){ querykeymap.put(fkeydto.getKey(), fkeydto); if(StringHelper.isNotEmpty(fkeydto.getFkey()) &&fkeydto.getType().equals(ReportConstants.keytype_cascade)){ hassonmap.put(fkeydto.getFkey(), fkeydto.getFkey()); } sonkey=fkeydto; } } querykeylist.clear(); //排序 for (RepKeyCon key : conlist) { if (querykeymap.containsKey(key.getKey())) querykeylist.add(querykeymap.get(key.getKey())); } //更新son标志 for(RepKeyDto k:querykeylist) if(hassonmap.containsKey(k.getKey())) k.setSonkey(true); return querykeylist; } catch (ReportException e) { throw e; }catch (Exception e) { throw new ReportException("系统错误",e); } } /** * 并对的父子关系的datefield,textfiedl组件类型的条件组装到同一行 */ public List<RepKeyDto> getQueryKeySameLineList(String sql) throws ReportException { Map<String, RepKeyDto> querykeymap =new HashMap<String,RepKeyDto>(); //是否存在子key的判断map Map<String,String> hassonmap=new HashMap<String,String>(); List<RepKeyDto> querykeylist=new ArrayList<RepKeyDto>(); try { //获取sql中定义的keymap,keylist List<RepKeyCon> conlist = SystemConfig.getConList(); for (RepKeyCon key : conlist) { if (sql.indexOf(key.getKey()) >= 0) { RepKeyDto keydto = new RepKeyDto(); keydto.setKey(key.getKey()); keydto.setName(key.getName()); keydto.setFkey(key.getFkey()); keydto.setHtmlcode(key.getHtmlcode()); keydto.setType(key.getType()); keydto.setDatabase(key.getDatabase()); keydto.setIsnull(key.getIsnull()); querykeymap.put(keydto.getKey(), keydto); if(StringHelper.isNotEmpty(keydto.getFkey()) &&keydto.getType().equals(ReportConstants.keytype_cascade)) hassonmap.put(keydto.getFkey(), keydto.getFkey()); querykeylist.add(keydto); } } for (RepKeyDto key : querykeylist) { RepKeyDto sonkey=key; RepKeyDto fkeydto=null; //反向取级联父级条件条件定义,一直往上级推导查询条件 while ((fkeydto=this.findFkey(sonkey, querykeymap))!=null){ querykeymap.put(fkeydto.getKey(), fkeydto); if(StringHelper.isNotEmpty(fkeydto.getFkey()) &&fkeydto.getType().equals(ReportConstants.keytype_cascade)){ hassonmap.put(fkeydto.getFkey(), fkeydto.getFkey()); } sonkey=fkeydto; } //非级联查询条件,把父子查询条件装载到同一行 if(!key.getType().equals(ReportConstants.keytype_cascade) &&querykeymap.containsKey(key.getFkey())){ querykeymap.get(key.getFkey()).setSamelinekey(key); querykeymap.remove(key.getKey()); } } querykeylist.clear(); //排序 for (RepKeyCon key : conlist) { if (querykeymap.containsKey(key.getKey())) querykeylist.add(querykeymap.get(key.getKey())); } //更新son标志 for(RepKeyDto k:querykeylist) if(hassonmap.containsKey(k.getKey())) k.setSonkey(true); return querykeylist; } catch (ReportException e) { throw e; }catch (Exception e) { throw new ReportException("系统错误",e); } } /** * 反向取级联父级条件条件定义 * @param key * @param querykeymap * @return * @throws ReportException */ private RepKeyDto findFkey(RepKeyDto key,Map<String, RepKeyDto> querykeymap) throws ReportException{ //反向取级联父级条件条件定义 //父级不为空,且父级不存在sql定义中 if (StringHelper.isNotEmpty(key.getFkey()) &&key.getType().equals(ReportConstants.keytype_cascade) && !querykeymap.containsKey(key.getFkey())) { RepKeyDto keydto = new RepKeyDto(); RepKeyCon fkeydto=SystemConfig.getConMap().get(key.getFkey()); if(fkeydto==null) throw new ReportException("rep_key_con.key="+key.getKey()+" 记录的 fkey 未定义"); keydto.setKey(fkeydto.getKey()); keydto.setName(fkeydto.getName()); keydto.setFkey(fkeydto.getFkey()); keydto.setHtmlcode(fkeydto.getHtmlcode()); keydto.setType(fkeydto.getType()); keydto.setDatabase(fkeydto.getDatabase()); keydto.setIsnull(fkeydto.getIsnull()); return keydto; } return null; } /** * 对象转换成map,然后转换成json,然后ZipUtil压缩字符串 * 把\u0027替换成' * 如果长度超过3500个则压缩处理 */ public String toString(List<? extends ConKeyValue> keydtolist) throws ReportException { try { if(keydtolist==null||keydtolist.size()==0) return ""; Map<String,String> keyvaluemap=new HashMap<String,String>(); for(ConKeyValue dto:keydtolist) keyvaluemap.put(dto.getKey(), dto.getValue()==null?"":dto.getValue()); String json= JsonHelper.fromObject(keyvaluemap).replaceAll("\\\\u0027", "'"); //如果json长度大于2000,则启用过滤null if(json.length()>2000){ Map<String,String> nonullmap=new HashMap<String,String>(); for(String key: keyvaluemap.keySet()){ String value=keyvaluemap.get(key); if(value!=null&&!"".equals(value)) nonullmap.put(key, value); } if(nonullmap.size()==0) return ""; json=JsonHelper.fromObject(nonullmap).replaceAll("\\\\u0027", "'"); } /** * 当json长度还是超过某个值,执行压缩 * rep_query_log增加标记,表示被压缩。 *if(json.length()>3000) * json=ZipUtil.compress(json); **/ return json; } catch (Exception e) { throw new ReportException("系统错误",e); } } /** * ZipUtil解压字符串,然后转换成map * @param json * @return * @throws ReportException */ public Map<String,String> toValueMap(String json) throws ReportException{ try { Map<String,String> keyvaluemap=new HashMap<String,String>(); if(StringHelper.isEmpty(json)) return keyvaluemap; keyvaluemap=JsonHelper.toMap(json); return keyvaluemap; } catch (IOException e) { throw new ReportException(e); } catch (Exception e) { throw new ReportException(e); } } /** * 把indexComponent转化成tree顺序 * 参数key为树根 */ public List<RepKeyDto> translateToTree(List<RepKeyDto> keydtolist,String key) throws ReportException { try { List<RepKeyDto> tree=new ArrayList<RepKeyDto>(); if(keydtolist==null) return tree; //sql定义中存在的条件map Map<String,RepKeyDto> keydtomap=CollectionHelper.converToMapSingle(keydtolist, "key"); if(StringHelper.isEmpty(key)){ for(RepKeyCon con:SystemConfig.getConTree()){ if(keydtomap.containsKey(con.getKey())&&StringHelper.isNotEmpty(con.getDatabase())) tree.add(keydtomap.get(con.getKey())); } } else{ //定义 以传入key为除根的keytreemap Map<String,RepKeyDto> keytreemap=new HashMap<String,RepKeyDto>(); for(RepKeyCon con:SystemConfig.getConTree()){ if(con.getKey().equals(key)){ //设置树根key keytreemap.put(key, keydtomap.get(key)); }else{ // 当 条件 以传入key为除根的keytreemap中存在,且存在sql定义的 if(keytreemap.containsKey(con.getFkey())&&keydtomap.containsKey(con.getKey())){ keytreemap.put(con.getKey(), keydtomap.get(con.getKey())); tree.add(keydtomap.get(con.getKey())); } } } } return tree; } catch (Exception e) { throw new ReportException(e); } } /** * 获得一个查询条件的取值 * @throws ReportException */ public List<QueryKeyValue> getKeyValue(String key, String fkey_value, String countyid) throws ReportException { if(dataControl.isControl(key)){ List<QueryKeyValue> list=new ArrayList<QueryKeyValue>(); if(StringHelper.isNotEmpty(fkey_value)&&dataControl.isDataRightTypeControl(key)){ List<QueryKeyValue> temp_list=queryKeyValueDao.fineList(countyid, key, fkey_value); Map<String,String> checkMap=new HashMap<String,String>(); for(QueryKeyValue vo: dataControl.getControlValues(key)) checkMap.put(vo.getId(), vo.getId()); for(QueryKeyValue vo:temp_list) if(checkMap.containsKey(vo.getId())) list.add(vo); }else{ list=dataControl.getControlValues(key); } return list; }else{ return queryKeyValueDao.fineList(countyid, key, fkey_value); } } /** * 检查页面回传的查询条件取值,判断键值有无权限如此取值 * @param keyvalues * @throws ReportException */ public void checkKeyValueList(List<ConKeyValue> keyvalues) throws ReportException { if(keyvalues==null||keyvalues.size()==0) return; for(ConKeyValue vo:keyvalues){ if((vo.getValue()==null||vo.getValue().equals("")) &&dataControl.isControl(vo.getKey())){ StringBuilder value=new StringBuilder(); List<QueryKeyValue> list=dataControl.getControlValues(vo.getKey()); for(int i=0;i<list.size();i++){ if(i>0) value.append("','").append(list.get(i).getId()); else value.append(list.get(i).getId()); } vo.setValue(value.toString()); } } } private DataControl dataControl; private QueryKeyValueDao queryKeyValueDao; public DataControl getDataControl() { return dataControl; } public void setDataControl(DataControl dataControl) { this.dataControl = dataControl; } public QueryKeyValueDao getQueryKeyValueDao() { return queryKeyValueDao; } public void setQueryKeyValueDao(QueryKeyValueDao queryKeyValueDao) { this.queryKeyValueDao = queryKeyValueDao; } }