最近遇到一个小需求,就是刷新部门的innercode。在导入数据的时候,innercode乱了,所以需要刷新。那先说说innercode是什么吧。
大家都知道部门是一个树形结构,但是有时候想知道一个部门下面都有哪些下级部门包括下级的下级等等,如果使用上级部门pk一级一级的往下找很麻烦,为了把这个树拉平,创建一个innercode字段。例如本系统中这样,加入本级部门的innercode是AAAA(四位随机字符),那么本部门所在的下级部门,innercode可能就是AAAABBBB,再下级可能就是AAAABBBBCCCC,没一个下级部门比上级部门多四个随机字符,并且前面的字符是和上级部门是一致的。这样就相当于拉平了这个部门树。比如查询本部门下的所有下级部门,可以在SQL中加上like 'AAAA%'就可以查出来了。但是现在有个需求就是innercode乱了,但是部门表里的pk_fatherorg没有乱的,是好的,这就要重新刷新了。实现的逻辑大概如下:
public void updateDeptInnercode(String innercode,String pk_fatherorg) throws DAOException{ String sql = "select innercode,pk_dept,pk_fatherorg from org_dept where dr=0 and pk_fatherorg = '"+pk_fatherorg+"'"; List<Map<String,String>> list = (List<Map<String, String>>) this.getBaseDAO().executeQuery(sql, new MapListProcessor()); if(list.size()==0){ return ; } for (Map<String, String> map : list) { String s = updateCode(innercode,map.get("pk_dept")); updateDeptInnercode(s,map.get("pk_dept")); } }
private String updateCode(String innercode,String pk_dept) throws DAOException {
StringBuffer sql = new StringBuffer();
String s = get4RandomCode();
//更新部门表
sql.append("update org_dept set innercode = '")
.append(innercode).append(s)
.append("' where pk_dept = '")
.append(pk_dept)
.append("'");
this.getBaseDAO().executeUpdate(sql.toString());
//更新部门版本表
sql = new StringBuffer();
sql.append("update org_dept_v v set v.innercode = '")
.append(innercode).append(s)
.append("' where v.pk_vid =(select d.pk_vid from org_dept d where d.pk_dept ='")
.append(pk_dept)
.append("' )");
this.getBaseDAO().executeUpdate(sql.toString());
return innercode+s;
}
private String get4RandomCode(){
Random rom = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i <4; i++) {
char r1 = ran[rom.nextInt(35)];
sb.append(r1);
}
return sb.toString();
}
private char[] ran = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z‘,'0','1','2','3','4','5','6','7','8','9'};