Index: forgon-core/src/main/java/com/forgon/directory/service/OrgUnitGroupManagerImpl.java =================================================================== diff -u -r30157 -r33354 --- forgon-core/src/main/java/com/forgon/directory/service/OrgUnitGroupManagerImpl.java (.../OrgUnitGroupManagerImpl.java) (revision 30157) +++ forgon-core/src/main/java/com/forgon/directory/service/OrgUnitGroupManagerImpl.java (.../OrgUnitGroupManagerImpl.java) (revision 33354) @@ -3,12 +3,15 @@ import java.sql.ResultSet; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -156,69 +159,98 @@ throw new SystemException("科室不存在!"); } - String sql = String.format("select bh.name as brancheOfHospital, o.name as orgUnitName from BrancheOfHospital bh " - + "join OrgUnitGroup og on bh.orgUnitGroupId = og.id " - + "join Org_OrgGroup oo on oo.orgGroupId = og.id " - + "join OrgUnit o on o.id = oo.orgUnitId " - + "where %s", - SqlUtils.getStringFieldInLargeCollectionsPredicate("o.orgUnitCoding", departCodeList)); - if(DatabaseUtil.isPoIdValid(orgUnitGroup.getId())){ - sql += " and og.id <> " + orgUnitGroup.getId(); - } - - Set orgUnitNames = new LinkedHashSet(); - Set bhNames = new LinkedHashSet(); - int orgSize = 0; - int bhSize= 0; - ResultSet rs = null; - try { - rs = objectDao.executeSql(sql); - while(rs.next()){ - String bhName = rs.getString("brancheOfHospital"); - String orgUnitName = rs.getString("orgUnitName"); - if(!bhNames.contains(bhName)){ - bhSize++; - } - if(!orgUnitNames.contains(orgUnitName)){ - orgSize++; - } - if(bhNames.size() < 5){ - bhNames.add(bhName); - } - if(orgUnitNames.size() < 5){ - orgUnitNames.add(orgUnitName); - } - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - DatabaseUtil.closeResultSetAndStatement(rs); - } - - if(CollectionUtils.isNotEmpty(bhNames) && CollectionUtils.isNotEmpty(orgUnitNames)){ - String orgNames = StringTools.join(orgUnitNames, "、"); - String bhNameStr = StringTools.join(bhNames, "、"); - if(orgSize > 5){ - orgNames += "......"; - } - if(bhSize > 5){ - bhNameStr += "......"; - } - throw new SystemException("如下科室同时属于【" + bhNameStr + "】所引用的科室分组,不允许一个科室属于多个院区,请修改后再保存!【" + orgNames + "】"); - } - String deleteOrg_GroupSql = String.format("delete from %s where orgGroupId = %s ", Org_OrgGroup.class.getSimpleName(), orgUnitGroup.getId()); objectDao.excuteSQL(deleteOrg_GroupSql); - List org_GroupList = new ArrayList(); for (OrgUnit orgUnit : orgList) { Org_OrgGroup or = new Org_OrgGroup(); or.setOrgGroupId(orgUnitGroup.getId()); or.setOrgUnitId(orgUnit.getId()); - org_GroupList.add(or); + objectDao.saveOrUpdate(or); } - objectDao.batchSaveOrUpdate(org_GroupList); + //检查同一科室是否属于多个院区(科室分组保存后再判断) + valideOrgUnitGroup(departCodeList); } } + + /** + * 检查同一科室是否属于多个院区 + * @param departCodeList + */ + private void valideOrgUnitGroup(List departCodeList) { + //统计每个科室关联院区的情况 + String sql = String.format("select bh.name as brancheOfHospital, o.name as orgUnitName, o.orgUnitCoding from %s bh " + + "join %s og on bh.orgUnitGroupId = og.id " + + "join %s oo on oo.orgGroupId = og.id " + + "join %s o on o.id = oo.orgUnitId " + + "where %s", + BrancheOfHospital.class.getSimpleName(), + OrgUnitGroup.class.getSimpleName(), + Org_OrgGroup.class.getSimpleName(), + OrgUnit.class.getSimpleName(), + SqlUtils.getStringFieldInLargeCollectionsPredicate("o.orgUnitCoding", departCodeList)); + //科室编码和对应的院区的Map + Map> orgNameToBrancheOfHospitalMap = new HashMap>(); + //科室编码和科室名称的Map + Map orgUnitCodingToNameMap = new HashMap(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + String bhName = rs.getString("brancheOfHospital"); + String orgUnitName = rs.getString("orgUnitName"); + String orgUnitCoding = rs.getString("orgUnitCoding"); + Set bhNameSet = orgNameToBrancheOfHospitalMap.get(orgUnitCoding); + if(CollectionUtils.isEmpty(bhNameSet)){ + bhNameSet = new LinkedHashSet(); + } + bhNameSet.add(bhName); + orgNameToBrancheOfHospitalMap.put(orgUnitCoding, bhNameSet); + orgUnitCodingToNameMap.put(orgUnitCoding, orgUnitName); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + //属于多个院区的科室名称(最多包含5个科室名称) + Set orgUnitNames = new LinkedHashSet(); + //包含了相同科室的院区(最多包含5个院区名称) + Set bhNames = new LinkedHashSet(); + //属于多个院区的科室数量,用于判断科室是否超过5个,超过5个时,页面最多只显示5个科室名称 + int orgSize = 0; + //包含了相同科室的院区数量,用于判断院区是否超过5个,超过5个时,页面最多只显示5个院区名称 + int bhSize= 0; + if(MapUtils.isNotEmpty(orgNameToBrancheOfHospitalMap)){ + for (String orgCode : orgNameToBrancheOfHospitalMap.keySet()) { + Set bhNameSet = orgNameToBrancheOfHospitalMap.get(orgCode); + if(bhNameSet != null && bhNameSet.size() >= 2){ + if(orgSize < 5){ + orgUnitNames.add(orgUnitCodingToNameMap.get(orgCode)); + } + for (String bhName : bhNameSet) { + if(bhSize < 5){ + bhNames.add(bhName); + } + bhSize++; + } + orgSize++; + } + } + } + + if(CollectionUtils.isNotEmpty(bhNames) && CollectionUtils.isNotEmpty(orgUnitNames)){ + String orgNames = StringTools.join(orgUnitNames, "、"); + String bhNameStr = StringTools.join(bhNames, "、"); + if(orgSize > 5){ + orgNames += "......"; + } + if(bhSize > 5){ + bhNameStr += "......"; + } + throw new SystemException("如下科室同时属于【" + bhNameStr + "】所引用的科室分组,不允许一个科室属于多个院区,请修改后再保存!【" + orgNames + "】"); + } + } }