其实对于程序来讲,你的想法很重要,思维方式决定了你的程序写法。尤其是对于组织机构来讲,他是用于一定的规律性,所以当冗杂的大量数据堆砌在一起时,这时寻找数据中出现的规律,从而在程序的循环体关键性位置,给予其致命一击,可能就将你的程序写入正确。
先看数据表
我们的目的是:保留树形的组织机构输出,同时要以type=3和type=4的数据进行分割,如何实现?
Controller:
/**其实这里还可以在简化,通过传入的funtype,当用户不等于此类型是,利用for循环的continue**/
@RequestMapping (params ="AppDepartTree")
public void AppDepartTree(HttpServletRequest request,HttpServletResponse response){
JsonUtil.responseUTF8(response);
JSONObject returnJsonObj=new JSONObject();
try {
String updateTime=request.getParameter("updateDepartTime"); //时间戳
String departid=request.getParameter("userGroupId");//所属机构编号
String type=request.getParameter("type"); //从登录API中获取
String funtype=request.getParameter("funtype"); //模块类型
if(StringUtil.Null2Blank(updateTime).length()>0){
//如果登录中的时间和此时的时间比对是一致的,表示组织机构没有被更改过,否则就重新请求组织机构
String tempTime=String.valueOf(GetDate.DateTimeConvetTimetmp(infService.getUpdateDepartTime()));//组织机构更新时间,转换为时间戳
if(StringUtil.Null2Blank(tempTime).length()>0 && tempTime.equalsIgnoreCase(updateTime)){
returnJsonObj.put("data","[]");
returnJsonObj.put("success", false);
}else{
List<Departxinxi> departxixxList=new ArrayList<Departxinxi>();
List<Departxinxi> departList=systemService.RecursionDepartById(departxixxList, departid, type, null,funtype);
if(departList.size()>0){
returnJsonObj.put("data",departList);
returnJsonObj.put("success", true);
}
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("获取组织机构树异常");
returnJsonObj.put("data","[]");
returnJsonObj.put("success", false);
}
responseOutWrite(response, returnJsonObj);
}
调用的service,很关键,在于切入点,并且切入点的逻辑关系是什么样。必须理清楚
public List<Departxinxi> RecursionDepartById(List<Departxinxi> departxixxList,String departId,String type,String newdepartId,String funtype){
List<Departxinxi> departListTemp=new ArrayList<Departxinxi>();
CriteriaQuery cq=new CriteriaQuery(TSDepart.class);
if(StringUtil.Null2Blank(departId).length()>0){
cq.eq("id", departId); //这句话是通过给HQL设置Id查询数据,得到主节点
}
if(StringUtil.Null2Blank(type).length()>0){
cq.eq("type", type);
}
if(StringUtil.Null2Blank(newdepartId).length()>0){
cq.eq("TSPDepart.id", newdepartId); //这句话是通过给HQL设置Id查询数据,得到主节点
}
cq.add();
List<TSDepart> departList=this.commonDao.getListByCriteriaQuery(cq, false);
for(int i=0;i<departList.size();i++){
TSDepart depart=departList.get(i);
Departxinxi departxinxi=new Departxinxi();
departxinxi.setID(depart.getId());
newdepartId=depart.getId();
if(depart.getTSPDepart()==null || depart.getId().equalsIgnoreCase(departId)){
departxinxi.setParentdepartid("");
}else{
departxinxi.setParentdepartid(depart.getTSPDepart().getId());
}
departxinxi.setDepartname(depart.getDepartname());
departxinxi.setDepartorderid(StringUtil.Null2Blank(depart.getDepartorderid()));
departxinxi.setDescription(depart.getDescription());
departxinxi.setLat(depart.getLat());
departxinxi.setLft(String.valueOf(depart.getLft()));
departxinxi.setLng(String.valueOf(depart.getLng()));
departxinxi.setRgt(String.valueOf(depart.getRgt()));
departxinxi.setType(String.valueOf(depart.getType()));
departListTemp.add(departxinxi);
String sql="select * from t_s_depart where (rgt-lft)=1 and parentdepartid='"+newdepartId+"'";
List<Object[]> list=findListbySql(sql);
if(StringUtil.isNotEmpty(newdepartId)){
// rgt与lft之间相差1
//哥哥我无解了
if(list.size()>0){
type=funtype;
}
RecursionDepartById(departxixxList,null,type,newdepartId,funtype);
}
}
departxixxList.addAll(departListTemp);
return departxixxList;
}