package com.yc.action.tree;
|
|
import com.google.gson.Gson;
|
import com.yc.action.BaseAction;
|
import com.yc.action.grid.GridUtils;
|
import com.yc.factory.FactoryBean;
|
import com.yc.multiData.SpObserver;
|
import com.yc.service.commons.SqlQueryIfc;
|
import com.yc.service.tree.TreeJson;
|
import com.yc.utils.EncodeUtil;
|
import com.yc.utils.SessionKey;
|
import org.apache.commons.lang.StringUtils;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.io.PrintWriter;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
*
|
* 3类型树显示
|
*/
|
@Controller
|
public class Tree_3 extends BaseAction{
|
int depth=0;
|
@RequestMapping("/treeList.do")
|
public void addNode(HttpServletRequest request,HttpServletResponse response) throws IOException{
|
|
//rowid
|
String rowid = request.getParameter("rid");
|
//层次
|
depth = request.getParameter("depth")!=null?Integer.valueOf(request.getParameter("depth")==null?"0":request.getParameter("depth")):0;
|
//如果有值表示获得节点信息否则 获得节点集合
|
String getInfo = request.getParameter("info");
|
String query = request.getParameter("query");
|
|
//"t110202";
|
String treeformidTable = request.getParameter("treeformid");
|
//"110202";
|
String formid = request.getParameter("formid");
|
//"areaid";
|
String nodeid = request.getParameter("nodeid");//primayKey
|
String separatedst = " ";
|
//"areaname";
|
String displayfield = request.getParameter("displayfield");
|
//过滤条件;
|
String filter = request.getParameter("filter");
|
//过滤条件;
|
String orderby = request.getParameter("orderby");
|
Map<String, Object> temp;
|
String KEY=";";
|
//处理当displayfield不包括nodeid时,需要把nodeid增加进去,以便作为查询字段
|
if(!(KEY+displayfield.toLowerCase()+KEY).contains(KEY+nodeid.toLowerCase()+KEY)){
|
displayfield+=";"+nodeid;
|
}
|
String[] showFields =displayfield.split(";");
|
StringBuilder sb = new StringBuilder();
|
String NULL="null";
|
String sql ;
|
//增加数据组权限
|
com.yc.action.grid.GTGrid grid=(com.yc.action.grid.GTGrid)FactoryBean.getBean("GTGrid");
|
String dataStr=grid.getDataGroupInfo(Integer.parseInt(formid),request.getSession().getAttribute(com.yc.utils.SessionKey.USERCODE)+"",0,request.getSession());
|
if(dataStr==null||NULL.equalsIgnoreCase(dataStr)){ dataStr="";}
|
if(filter==null||NULL.equalsIgnoreCase(filter)||"".equalsIgnoreCase(filter)) {
|
filter = "";
|
}else {
|
filter = " and (" + filter + ") ";
|
}
|
if(orderby==null||NULL.equalsIgnoreCase(orderby)||"".equalsIgnoreCase(orderby)) {
|
orderby = "";
|
}else {
|
//把app传过来的升降序在这里处理
|
String[] str=orderby.split("@P@");
|
if(str.length>1) {
|
String[] des=str[1].split(",");
|
//为了好处理而加
|
String tmp=str[0].replaceAll(",", "#")+"#";
|
for(int i=0;i<des.length;i++) {
|
if(i==des.length-1)
|
tmp=tmp.replaceFirst("#","0".equals(des[i])?" asc ":" desc ");
|
else
|
tmp=tmp.replaceFirst("#","0".equals(des[i])?" asc, ":" desc, ");
|
}
|
orderby=" order by "+tmp;
|
}else {
|
orderby=" order by "+orderby;
|
}
|
}
|
dataStr=filter+dataStr;
|
SqlQueryIfc sqlQueryIfc = (SqlQueryIfc)FactoryBean.getBean("SqlQueryImpl");
|
|
List<Map<String,Object>> list = null;
|
|
try{
|
SpObserver.setDBtoInstance("_"+request.getSession().getAttribute(SessionKey.DATA_BASE_ID));
|
//rowid==null表示第一级节点
|
String q="";
|
if(! StringUtils.isBlank(query)) {
|
if(query.indexOf("%2B")!=-1){
|
//base64编码中包含+ / 等符号 所以要进行处理
|
query = query.replace("%2B", "+");
|
}if(query.indexOf("%2F")!=-1){
|
query = query.replace("%2F", "/");
|
}
|
byte [] bs = query.getBytes("utf-8");
|
if(EncodeUtil.isArrayByteBase64(bs)){
|
query = EncodeUtil.base64Decode(query);
|
query = query.replace("@~","%");
|
}
|
if(query.indexOf("@G@")==0){
|
|
query = query.replace("@G@", "");
|
}
|
if(query.indexOf("@G@")>0){
|
|
query = query.replace("@G@", " and ");
|
}
|
q=" and ("+query+")";
|
}
|
if (StringUtils.isBlank(rowid) ) {
|
sql = "select rowid,treecontrol,isnull(parentrowid,'') as parentrowid,"+displayfield.replaceAll(";", ",")+","
|
+" case when exists(select top 1 1 from "+treeformidTable+" a where a.parentrowid="+treeformidTable+".rowid "+dataStr+orderby+" ) then '1' else '' end as "
|
+ "haschild from "+treeformidTable+" where ("+treeformidTable+".parentrowid ='' or "+treeformidTable+".parentrowid "
|
+ "is null or not exists (select 1 from "+treeformidTable+" c where "+treeformidTable+".parentrowid = c.rowid "+dataStr+q+") ) "+dataStr+q+orderby;
|
/*int tempIndex=0;
|
if(query.toLowerCase().indexOf(nodeid)>0){//表示有值传过来,需要去掉(b.parentrowid ='' or b.parentrowid is null or not exists (select 1 from v110709 c where b.parentrowid = c.rowid )
|
sql=sql
|
.replace("("+treeformidTable+".parentrowid ='' or "+treeformidTable+".parentrowid is null or not exists (select 1 from "+treeformidTable+" c where "+treeformidTable+".parentrowid = c.rowid "+dataStr+q+" ) )"," 1=1 ")
|
+" and "+query;
|
}else{
|
tempIndex = sql.indexOf(" "+treeformidTable+" where")+(treeformidTable.length()+7);
|
sql = sql.substring(0,tempIndex)+" "+query+" and " + sql.substring(tempIndex,sql.length());
|
tempIndex = sql.indexOf("a.parentrowid="+treeformidTable+".rowid")+(treeformidTable.length()+20);
|
sql = sql.substring(0,tempIndex)+" and("+query+")" + sql.substring(tempIndex,sql.length());
|
tempIndex = sql.lastIndexOf(")");
|
sql = sql.substring(0,tempIndex)+" and "+query+ sql.substring(tempIndex,sql.length());
|
}*/
|
list =sqlQueryIfc.queryForList(com.yc.utils.FileUtil.prossSessionInfo(request,sql));
|
}
|
|
else if(!StringUtils.isBlank(rowid) && StringUtils.isBlank(getInfo)){//获得下级节点
|
sql = "select rowid,treecontrol,isnull(parentrowid,'') as parentrowid,"+displayfield.replaceAll(";", ",")+","
|
+" case when exists(select top 1 1 from "+treeformidTable+" a where a.parentrowid="+treeformidTable+".rowid "+dataStr+orderby+" ) then '1' else '' end as "
|
+ " haschild from "+treeformidTable+" where "+treeformidTable+".parentrowid = ? "+dataStr+q+orderby;
|
list =sqlQueryIfc.queryForList(com.yc.utils.FileUtil.prossSessionInfo(request,sql),rowid);
|
}else{//获得节点信息
|
if(rowid==null)return;
|
sql = "select * from "+treeformidTable+" where "+(StringUtils.isBlank(nodeid)?"rowid":nodeid)+"=?";
|
try{
|
temp = sqlQueryIfc.queryForMap(sql,rowid);
|
|
this.printJson(response, GridUtils.toJson(temp));
|
return;
|
}catch(Exception e){
|
this.printJson(response, e.getMessage());
|
return;
|
}
|
}
|
}catch (Exception ex){
|
this.printJson(response, ex.getMessage());
|
return;
|
}finally{
|
SpObserver.setDBtoInstance();
|
}
|
if(StringUtils.isBlank(sql))return;
|
|
sb.append("[");
|
for(int i=0;i<list.size();i++){
|
temp = list.get(i);
|
spellInfo(sb,nodeid,separatedst,showFields,temp);
|
}
|
if(list.size()>0)
|
sb=new StringBuilder(sb.substring(0,sb.length()-1));
|
sb.append("]");
|
response.setCharacterEncoding("UTF-8");
|
PrintWriter out=response.getWriter();
|
out.write(sb.toString());
|
out.flush();
|
}
|
public TreeJson fromJson(String json){
|
Gson gson = new Gson();
|
// return gson.fromJson(json.replace("&", "&").replace("<", "<").replace(">", ">"), new com.google.gson.reflect.TypeToken<TreeJson>() {
|
// }.getType() );
|
return gson.fromJson(json, new com.google.gson.reflect.TypeToken<TreeJson>() {
|
}.getType() );
|
}
|
|
void spellInfo(StringBuilder sb,String primaryKey,String separatedst,String [] showFields,Map<String,Object> temp){
|
sb.append("{\"id\":\"").append(temp.get("rowid"))
|
.append("\",\"nodeid\":\"").append(primaryKey)
|
.append("\",\"collapsed\":").append(false)
|
.append(",\"depth\":").append(depth+1)
|
.append(",\"treecon\":\"").append(temp.get("treecontrol"))
|
.append("\",\"text\":\"");
|
for(int j=0;j<showFields.length;j++){
|
sb.append(temp.get(showFields[j])==null?"": String.valueOf(temp.get(showFields[j])).replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", ""))
|
.append((j+1)==showFields.length?"":separatedst);
|
}
|
sb.append("\",")
|
.append("\"name\":\"");
|
for(int j=0;j<showFields.length;j++){
|
sb.append(temp.get(showFields[j])==null?"": String.valueOf(temp.get(showFields[j])).replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", ""))
|
.append((j+1)==showFields.length?"":separatedst);
|
}
|
sb.append("\",");
|
if(!StringUtils.isBlank((String)temp.get("haschild"))){
|
sb.append("\"state\":\"closed\",");
|
sb.append("\"tree\":[],");
|
}
|
|
sb.append("\"nodevalue\":\"").append(temp.get(primaryKey)).append("\"},");
|
}
|
|
}
|