/** 重设所有部门编号。 */
 @Transactional
 public void updateAllSerialNo() {
   List<Dept> tops = getDao().query("from Dept d where d.parentDept is null");
   Map serialMap = new HashMap(100); // 用于存放部门ID-SerialNo
   // 计算所有部门编号,并将部门ID-部门编号的对应关系存入serialMap
   Integer serial = null;
   for (Dept top : tops) {
     serial = this.getSerial(top, serial);
     // String serialNo = getSerialNo(top);
     top.setSerialNo(buildSerialNo(null, serial));
     serialMap.put(top.getId(), buildSerialNo(null, serial));
     // getDao().saveObject(top);
     if (top.getChildDepts().size() > 0) {
       this.updateChildrenSerialNo(top, serialMap);
     }
   }
   // 批量更新部门编号
   Set<Integer> ids = serialMap.keySet();
   for (Integer id : ids) {
     Dept dept = get(id);
     getDao().evict(dept);
     dept.setSerialNo((String) serialMap.get(id));
     getDao().getHibernateTemplate().update(dept);
   }
 }
  /**
   * 返回给定部门的部门编号
   *
   * @param parentDept 给定部门
   */
  public String getSerialNo(final Dept dept) {
    Assert.notNull(dept, "The given Dept must not be null.");
    String serialNo = null;
    if (dept.getParentDept() != null) { // 如果有上级部门
      List serialNos =
          getDao()
              .query(
                  "select d.serialNo from Dept d "
                      + "where d.parentDept = ? order by d.serialNo desc",
                  dept.getParentDept());
      if (serialNos == null || serialNos.isEmpty()) { // 如果同级部门
        serialNo = buildFirstSerialNo(dept.getParentDept());
      } else { // 有同级级部门
        String maxSerialNo = (String) serialNos.get(0); // 同级部门最大编号
        // 找出同级部门最大编号的最后两位
        final String[] splited =
            org.springframework.util.StringUtils.commaDelimitedListToStringArray(maxSerialNo);
        if (splited == null || splited.length == 0) { // 同级部门没有编号
          serialNo = buildFirstSerialNo(dept.getParentDept());
        } else { // 计算当前部门编号
          Integer serial = StringUtil.getNumFromSerial(splited[splited.length - 1]);
          serialNo =
              dept.getParentDept().getSerialNo() + "," + StringUtil.zeroPadding((serial + 1), 2);
        }
      }
    } else { // 如果没有上级部门
      serialNo = this.getTopDeptSerialNo();
      dept.setSerialNo(serialNo);
    }

    logger.debug("Create serial No." + serialNo);
    return serialNo;
  }
 /** 更新所有子部门的SerialNo */
 @Transactional
 public void updateChildrenSerialNo(Dept parent, Map serialMap) {
   logger.debug("Update " + parent.getName() + "'s children serial No.");
   Set<Dept> children = parent.getChildDepts();
   Integer serial = null;
   for (Dept child : children) {
     serial = this.getSerial(child, serial);
     child.setSerialNo(buildSerialNo(parent, serial));
     serialMap.put(child.getId(), buildSerialNo(parent, serial));
     // getDao().saveObject(child);
     if (child.getChildDepts().size() > 0) {
       updateChildrenSerialNo(child, serialMap);
     }
   }
 }