/** 重设所有部门编号。 */ @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); } } }