package com.mossle.party.rs; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import com.mossle.api.user.UserConnector; import com.mossle.api.user.UserDTO; import com.mossle.party.persistence.domain.PartyEntity; import com.mossle.party.persistence.domain.PartyStruct; import com.mossle.party.persistence.domain.PartyType; import com.mossle.party.persistence.manager.PartyEntityManager; import com.mossle.party.persistence.manager.PartyStructManager; import com.mossle.party.persistence.manager.PartyTypeManager; import com.mossle.party.service.PartyService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component @Path("party") public class PartyResource { private static Logger logger = LoggerFactory.getLogger(PartyResource.class); private PartyTypeManager partyTypeManager; private PartyEntityManager partyEntityManager; private PartyStructManager partyStructManager; private PartyService partyService; private UserConnector userConnector; @GET @Path("types") @Produces(MediaType.APPLICATION_JSON) public List<PartyTypeDTO> getAllPartyTypes() { List<PartyType> partyTypes = partyTypeManager.getAll(); List<PartyTypeDTO> partyTypeDtos = new ArrayList<PartyTypeDTO>(); for (PartyType partyType : partyTypes) { PartyTypeDTO partyTypeDto = new PartyTypeDTO(); partyTypeDto.setId(partyType.getId()); partyTypeDto.setName(partyType.getName()); partyTypeDtos.add(partyTypeDto); } return partyTypeDtos; } @GET @Path("entities") @Produces(MediaType.APPLICATION_JSON) public List<PartyEntityDTO> getPartyEntitiesByType( @QueryParam("typeId") long typeId) { List<PartyEntity> partyEntities = partyEntityManager.findBy( "partyType.id", typeId); List<PartyEntityDTO> partyEntityDtos = new ArrayList<PartyEntityDTO>(); for (PartyEntity partyEntity : partyEntities) { if (partyEntity.getParentStructs().size() == 1) { PartyStruct partyStruct = partyEntity.getParentStructs() .iterator().next(); if (partyStruct.getParentEntity() == null) { logger.info("skip top entity : {}, {}", partyEntity.getId(), partyEntity.getName()); continue; } } PartyEntityDTO partyEntityDto = new PartyEntityDTO(); partyEntityDto.setId(partyEntity.getId()); partyEntityDto.setName(partyEntity.getName()); partyEntityDto.setRef(partyEntity.getRef()); partyEntityDtos.add(partyEntityDto); } PartyType partyType = partyTypeManager.get(typeId); if (partyType.getType() != 2) { return partyEntityDtos; } // 如果是岗位,按名称去重 Set<String> names = new HashSet<String>(); List<PartyEntityDTO> list = new ArrayList<PartyEntityDTO>(); for (PartyEntityDTO partyEntityDto : partyEntityDtos) { if (names.contains(partyEntityDto.getName())) { list.add(partyEntityDto); continue; } names.add(partyEntityDto.getName()); } partyEntityDtos.removeAll(list); return partyEntityDtos; } @POST @Path("tree") @Produces(MediaType.APPLICATION_JSON) public List<Map> tree( @QueryParam("partyStructTypeId") long partyStructTypeId) { List<PartyEntity> partyEntities = partyService .getTopPartyEntities(partyStructTypeId); return generatePartyEntities(partyEntities, partyStructTypeId); } public List<Map> generatePartyEntities(List<PartyEntity> partyEntities, long partyStructTypeId) { if (partyEntities == null) { return null; } List<Map> list = new ArrayList<Map>(); try { for (PartyEntity partyEntity : partyEntities) { list.add(generatePartyEntity(partyEntity, partyStructTypeId)); } } catch (Exception ex) { logger.error(ex.getMessage(), ex); } return list; } public Map<String, Object> generatePartyEntity(PartyEntity partyEntity, long partyStructTypeId) { Map<String, Object> map = new HashMap<String, Object>(); try { map.put("id", partyEntity.getId()); map.put("name", partyEntity.getName()); map.put("ref", partyEntity.getRef()); List<PartyStruct> partyStructs = partyStructManager.find( "from PartyStruct where parentEntity=? order by priority", partyEntity); List<PartyEntity> partyEntities = new ArrayList<PartyEntity>(); for (PartyStruct partyStruct : partyStructs) { if (partyStruct.getPartyStructType().getId() == partyStructTypeId) { PartyEntity childPartyEntity = partyStruct.getChildEntity(); if (childPartyEntity == null) { logger.info("child party entity is null"); continue; } if (childPartyEntity.getPartyType().getType() != 1) { partyEntities.add(childPartyEntity); } } } if (partyEntities.isEmpty()) { map.put("open", false); } else { map.put("open", true); map.put("children", generatePartyEntities(partyEntities, partyStructTypeId)); } return map; } catch (Exception ex) { logger.error(ex.getMessage(), ex); return map; } } @GET @Path("search") @Produces(MediaType.APPLICATION_JSON) public List<String> search(@QueryParam("name") String name, @QueryParam("partyTypeId") long partyTypeId) { List<String> names = partyEntityManager .find("select name from PartyEntity where name like ? and partyType.id=?", "%" + name + "%", partyTypeId); return names; } @GET @Path("searchUser") @Produces(MediaType.APPLICATION_JSON) public List<Map<String, String>> searchUser( @QueryParam("parentId") Long parentId) { String hql = "select child from PartyEntity child join child.parentStructs parent where child.partyType.id=1 and parent.parentEntity.id=?"; List<PartyEntity> partyEntities = partyEntityManager .find(hql, parentId); List<Map<String, String>> list = new ArrayList<Map<String, String>>(); for (PartyEntity partyEntity : partyEntities) { Map<String, String> map = new HashMap<String, String>(); UserDTO userDto = userConnector.findById(partyEntity.getRef()); map.put("id", userDto.getId()); map.put("username", userDto.getUsername()); map.put("displayName", userDto.getDisplayName()); list.add(map); } return list; } // ~ ================================================== @Resource public void setPartyTypeManager(PartyTypeManager partyTypeManager) { this.partyTypeManager = partyTypeManager; } @Resource public void setPartyEntityManager(PartyEntityManager partyEntityManager) { this.partyEntityManager = partyEntityManager; } @Resource public void setPartyStructManager(PartyStructManager partyStructManager) { this.partyStructManager = partyStructManager; } @Resource public void setPartyService(PartyService partyService) { this.partyService = partyService; } @Resource public void setUserConnector(UserConnector userConnector) { this.userConnector = userConnector; } // ~ ================================================== public static class PartyTypeDTO { private long id; private String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static class PartyEntityDTO { private long id; private String name; private String ref; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRef() { return ref; } public void setRef(String ref) { this.ref = ref; } } }