package com.norteksoft.mms.module.service; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.norteksoft.acs.entity.authorization.BusinessSystem; import com.norteksoft.acs.service.AcsUtils; import com.norteksoft.mms.form.entity.DataTable; import com.norteksoft.mms.form.entity.FormView; import com.norteksoft.mms.form.enumeration.MenuType; import com.norteksoft.mms.form.service.DataTableManager; import com.norteksoft.mms.form.service.FormViewManager; import com.norteksoft.mms.module.dao.MenuDao; import com.norteksoft.mms.module.dao.ModulePageDao; import com.norteksoft.mms.module.entity.Menu; import com.norteksoft.mms.module.entity.ModulePage; import com.norteksoft.product.enumeration.DataState; import com.norteksoft.product.util.ContextUtils; @Service @Transactional(readOnly=true) public class MenuManager { private MenuDao menuDao; private ModulePageDao modulePageDao; private AcsUtils acsUtils; @Autowired private DataTableManager dataTableManager; @Autowired private FormViewManager formViewManager; @Autowired public void setMenuDao(MenuDao menuDao) { this.menuDao = menuDao; } @Autowired public void setModulePageDao(ModulePageDao modulePageDao) { this.modulePageDao = modulePageDao; } @Autowired public void setAcsUtils(AcsUtils acsUtils) { this.acsUtils = acsUtils; } /** * 保存菜单 */ @Transactional(readOnly=false) public void saveMenu(Menu menu){ if(menu.getId()==null){ if(menu.getSystemId()==null){ if(menu.getParent()!=null){ //二级菜单系统id menu.setSystemId(menu.getParent().getSystemId()); }else{ //自定义一级菜单 menu.setType(MenuType.CUSTOM); menu.setSystemId(ContextUtils.getSystemId("mms")); if(!(StringUtils.isNotBlank(menu.getUrl())&&menu.getUrl().startsWith("http:"))){ String sysUrl=getSysUrl(ContextUtils.getSystemId("mms")); menu.setUrl(sysUrl+"/common/list.htm"); } } //自定义非一级菜单的url的设置 if(menu.getParent()!=null){ if("#this".equals(menu.getUrl())||StringUtils.isEmpty(menu.getUrl())){ //标准或自定义系统中的子菜单没设url则为“定义菜单” menu.setType(MenuType.CUSTOM); //三级和三级以下菜单 if(menu.getParent().getParent()!=null){ menu.setUrl("/mms/common/list.htm"); }else{//二级菜单 menu.setUrl("/mms/common/list.htm"); } }else{ //子菜单设置了url if(menu.getParent().getType()==MenuType.STANDARD){ //标准系统已有子菜单设置为“标准菜单” menu.setType(MenuType.STANDARD); }else{ //自定义系统中子菜单无论是否设置了url,永远为“自定义菜单” menu.setType(MenuType.CUSTOM); menu.setUrl("/mms/common/list.htm"); } } } } menu.setCompanyId(ContextUtils.getCompanyId()); menu.setCreatedTime(new Date()); if(menu.getParent()!=null){ menu.setLayer(menu.getParent().getLayer()+1); } } if(!menu.getLayer().equals(1)){//如果不是一级菜单 if("/mms/common/list.htm".equals(menu.getUrl())||"/mms/common/list.htm?".equals(menu.getUrl())){ //当不是一级菜单时,修改了路径为/mms/common/list.htm或/mms/common/list.htm?时,该菜单的类型改为自定义 menu.setType(MenuType.CUSTOM); }else{ //当不是一级菜单时,修改了路径不为/mms/common/list.htm或/mms/common/list.htm?时,该菜单的类型改为标准 menu.setType(MenuType.STANDARD); } } menuDao.saveMenu(menu); } /** * 获取菜单 */ public Menu getMenu(Long menuId){ return menuDao.getMenu(menuId); } /** * 得到公司所有的一级菜单 */ public List<Menu> getRootMenuByCompany() { return menuDao.getRootMenuByCompany(); } /** * 得到公司所有启用的一级菜单 */ public List<Menu> getEnabledRootMenuByCompany() { return menuDao.getEnabledRootMenuByCompany(); } /** * 删除菜单 */ @Transactional(readOnly=false) public String deleteMenu(Menu menu) { List<DataTable> tables=dataTableManager.getAllDataTablesByMenu(menu.getId()); if(tables.size()>0){ return "该菜单已被使用,无法删除"; } List<FormView> formviews=formViewManager.getFormViewsByMenu(menu.getId()); if(formviews.size()>0){ return "该菜单已被使用,无法删除"; } menuDao.delete(menu); return "success"; } public Menu getRootMenu(Long menuId){ Menu menu=menuDao.get(menuId); if(menu.getLayer()==1){ return menu; } if(menu.getLayer()==2){ return menu.getParent(); } if(menu.getLayer()==3){ return menu.getParent().getParent(); } if(menu.getLayer()==4){ return menu.getParent().getParent().getParent(); } return null; } public List<Menu> getMenuByLayer(Integer layer,Long parentId) { return menuDao.getMenuByLayer(layer,parentId); } public List<Menu> getEnableMenuByLayer(Integer layer,Long parentId) { return menuDao.getEnableMenuByLayer(layer,parentId); } public Menu getDefaultModulePageBySystem(String code, Long companyId) { List<Menu> menus=menuDao.getDefaultMenuByLayer(1, code, companyId); Menu firstMenu =null; if(menus.size()>0){ firstMenu = menus.get(0); } Menu secondMenu = (firstMenu==null?null:firstMenu.getFirstChildren()); return secondMenu==null?null:secondMenu.getFirstChildren(); } /** * 获得最底层菜单 * @param systemId * @param companyId * @return */ @Transactional(readOnly=true) public Menu getLastMenu(Long menuId) { Menu lastMenu=null; Menu menu=getMenu(menuId); if(menu!=null){ lastMenu=menu; List<Menu> secMenus=menuDao.getChildrenEnabledMenus(lastMenu.getId()); Menu secondMenu = (secMenus.size()<=0?null:secMenus.get(0)); if(secondMenu!=null){ lastMenu=secondMenu; List<Menu> thirdMenus=menuDao.getChildrenEnabledMenus(lastMenu.getId()); Menu thirdMenu = (thirdMenus.size()<=0?null:thirdMenus.get(0)); if(thirdMenu!=null){ lastMenu=thirdMenu; List<Menu> fourMenus=menuDao.getChildrenEnabledMenus(lastMenu.getId()); Menu fourMenu = (fourMenus.size()<=0?null:fourMenus.get(0)); if(fourMenu!=null){ lastMenu=fourMenu; } } } } return lastMenu; } public Menu getGoldMenuByCode(String code, Long systemId, Long companyId) { return menuDao.getGoldMenuByCode(code, systemId, companyId); } public ModulePage getDefaultModulePageByMenu(Long menuId) { Menu menu=menuDao.get(menuId); ModulePage defaultPage=null; ModulePage page=modulePageDao.getDefaultDisplayPageByMenuId(menuId); if(page==null){ List<ModulePage> pages=modulePageDao.getEnableModulePagesByMenuId(menuId); if(pages.size()>0)defaultPage=pages.get(0); if(defaultPage==null){ List<Menu> menus=menuDao.getChildrenEnabledMenus(menu.getId()); menu= (menus.size()<=0?null:menus.get(0)); if(menu!=null){ defaultPage=getDefaultModulePageByMenu(menu.getId()); if(defaultPage!=null){ return defaultPage; } } } }else{ defaultPage=page; } return defaultPage; } public Menu getMenuByLastMenu(Integer layer,Long menuId){ Menu result=null; Menu menu=getMenu(menuId); if(menu.getLayer()>=layer){ if(menu.getLayer().equals(layer))result=menu; if(result==null){ menu=menu.getParent(); if(menu!=null){ if(menu.getLayer().equals(layer))result=menu; if(result==null){ menu=menu.getParent(); if(menu!=null){ if(menu.getLayer().equals(layer))result=menu; } } } } } return result; } //得到子菜单及其所有父菜单 public void getMenuParents(List<Menu> menus,Menu menu){ if(menu!=null){ menus.add(menu); getMenuParents(menus,menu.getParent()); } } public List<Menu> getChildrenEnabledMenus(Long menuId){ return menuDao.getChildrenEnabledMenus(menuId); } /** * 获得启用的标准菜单一级菜单集合 * @return */ public List<Menu> getEnabledStandardRootMenuByCompany() { return menuDao.getEnabledStandardRootMenuByCompany(); } /** * 获得启用的自定义菜单一级菜单集合 * @return */ public List<Menu> getEnabledCustomRootMenuByCompany() { return menuDao.getEnabledCustomRootMenuByCompany(); } public String getSysUrl(Long systemId){ Menu menu=menuDao.getSysMenu(systemId); if(menu!=null){ String url=menu.getUrl(); if(url.lastIndexOf("/")==url.length()-1){ return url.substring(0,url.length()-1); }else{ return url; } } return ""; } /** * 初始化一级菜单 */ @Transactional(readOnly=false) public void initAllMenus(){ List<BusinessSystem> bses=acsUtils.getAllBusiness(ContextUtils.getCompanyId()); List<BusinessSystem> imatrixBs=acsUtils.getParentSystem(); if(imatrixBs!=null){ for(BusinessSystem sys:imatrixBs){ if(!bses.contains(sys)){//底层系统中是否已经包括底层平台系统 bses.add(sys); } } } List<Menu> menus=menuDao.getRootMenuByCompany(); for(BusinessSystem bs:bses){ boolean isHasMenu=false; Menu mn=null; for(Menu menu:menus){ if(menu.getCode().equals(bs.getCode())){ isHasMenu=true; mn=getMenu(menu.getId()); break; } } if(!isHasMenu){ mn=new Menu(); mn.setType(MenuType.STANDARD); mn.setCompanyId(ContextUtils.getCompanyId()); mn.setSystemId(bs.getId()); mn.setLayer(1); mn.setCode(bs.getCode()); mn.setName(bs.getName()); mn.setEnableState(DataState.ENABLE); mn.setUrl(bs.getPath()); menuDao.save(mn); } } } /** * 根据系统id获得一级菜单 * @return */ public Menu getDefaultMenuByLayer(String code){ List<Menu> menus=menuDao.getDefaultMenuByLayer(1, code, ContextUtils.getCompanyId()); if(menus.size()>0)return menus.get(0); return null; } /** * 获得所有标准菜单 * @return */ public List<Menu> getAllMenus(){ return menuDao.getAllMenus(); } /** * 获得所有菜单(标准和自定义) * @return */ public List<Menu> getMenus(){ return menuDao.getMenus(); } public Menu getMenuByCode(String code){ return menuDao.getMenuByCode(code); } public Menu getMenuByCode(String code,Long companyId){ return menuDao.getMenuByCode(code,companyId); } public Menu getUnCompanyMenuByCode(String code){ return menuDao.getUnCompanyMenuByCode(code); } public List<Menu> getMenuBySystem(String systemIds,Long companyId){ return menuDao.getMenuBySystem(systemIds,companyId); } /** * 获得该系统中第一个叶子菜单 * @param systemId * @return */ public Menu getLeafMenuBySystem(Long systemId){ return menuDao.getLeafMenuBySystem(systemId); } }