package cn.com.goldenwater.dcproj.service.impl.system; import cn.com.goldenwater.core.service.AbstractCrudService; import cn.com.goldenwater.dcproj.dao.BisInspAllRlationPersDao; import cn.com.goldenwater.dcproj.dao.MenuDao; import cn.com.goldenwater.dcproj.dao.PrivDao; import cn.com.goldenwater.dcproj.dto.BisInspAllRelationPersPrivDto; import cn.com.goldenwater.dcproj.dto.MenuDto; import cn.com.goldenwater.dcproj.dto.PrivDto; import cn.com.goldenwater.dcproj.dto.PrivSysDto; import cn.com.goldenwater.dcproj.enums.EnumBean; import cn.com.goldenwater.dcproj.enums.PrivTypeEnum; import cn.com.goldenwater.dcproj.enums.SqlExecuteStateEnum; import cn.com.goldenwater.dcproj.enums.SystemFlagEnum; import cn.com.goldenwater.dcproj.model.BisInspAllRlationPers; import cn.com.goldenwater.dcproj.model.Menu; import cn.com.goldenwater.dcproj.model.Priv; import cn.com.goldenwater.dcproj.param.GetPrivByRoleIdParam; import cn.com.goldenwater.dcproj.param.GetPrivByUserIdParam; import cn.com.goldenwater.dcproj.param.MenuParam; import cn.com.goldenwater.dcproj.param.PrivParam; import cn.com.goldenwater.dcproj.service.PrivService; import cn.com.goldenwater.dcproj.utils.DateUtils; import cn.com.goldenwater.target.CheckException; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Optional; /** * @author lune * @date 2018-2-13 */ @Service @Transactional public class PrivServiceImpl extends AbstractCrudService implements PrivService { @Autowired private PrivDao privDao; @Autowired private MenuDao menuDao; @Autowired private BisInspAllRlationPersDao bisInspAllRlationPersDao; public PrivServiceImpl(PrivDao privDao) { super(privDao); this.privDao = privDao; } @Override public List findPageStatic(PrivParam privParam) { PageHelper.startPage(privParam.getPageNum(), privParam.getPageSize(), false); return privDao.findPageStatic(privParam); } @Override public PageInfo findPageInfoStatic(PrivParam privParam) { PageHelper.startPage(privParam.getPageNum(), privParam.getPageSize(), false); List list = privDao.findPageStatic(privParam); PageInfo page = new PageInfo(list); return page; } @Override public PageInfo findTreeByRoleId(GetPrivByRoleIdParam p) throws Exception { String persId = p.getUserId();//默认过滤权限 BisInspAllRlationPers per = bisInspAllRlationPersDao.get(p.getUserId()); if (per == null) { throw new Exception("此用户不存在:" + p.getUserId()); } if (per.getOwnerSystem() == null) { throw new Exception("用户所属系统不正确:" + per.getOwnerSystem()); } List systemList = new ArrayList<>(); if (!SystemFlagEnum.DC_ALL.getValue().equals(per.getOwnerSystem())) { systemList.add(SystemFlagEnum.DC_ALL.getValue()); systemList.add(per.getOwnerSystem()); } PageHelper.startPage(p.getPageNum(), p.getPageSize()); //如果是李海超账户或者金水管理机构账户则提取所有权限 if (per.getOrgId().equals("041") || per.getGuid().equals("80df1213ad9f493e85a771d6f4b18a17")) { persId = ""; } List list = privDao.findTreeByRoleId(p.getRoleId(), systemList, p.getPrivName(), persId); return new PageInfo<>(list); } @Override public List listByRoleId(GetPrivByRoleIdParam p) { BisInspAllRlationPers per = bisInspAllRlationPersDao.get(p.getUserId()); Optional.ofNullable(per).orElseThrow(() -> new CheckException("此用户不存在:" + p.getUserId())); Optional.of(per).map(BisInspAllRlationPers::getOwnerSystem) .orElseThrow(() -> new CheckException("用户所属系统不正确:" + per.getOwnerSystem())); List systemList = new ArrayList<>(); if (!SystemFlagEnum.DC_ALL.getValue().equals(per.getOwnerSystem())) { systemList.add(SystemFlagEnum.DC_ALL.getValue()); systemList.add(per.getOwnerSystem()); } return privDao.findTreeByRoleId(p.getRoleId(), systemList, p.getPrivName(), ""); } // 建立树形结构 public void buildTree(List list) { List privList = privDao.findList(null); for (Priv priv : list) { buildChilTree(priv, privList); } } //递归,建立子树形结构 private Priv buildChilTree(Priv pNode, List privList) { List chilMenus = new ArrayList<>(); for (Priv menuNode : privList) { if (menuNode.getParentId().equals(pNode.getId())) { chilMenus.add(buildChilTree(menuNode, privList)); } } pNode.setChildren(chilMenus); return pNode; } @Override public PageInfo findTreeShapeByRoleId(GetPrivByRoleIdParam p) throws Exception { BisInspAllRlationPers per = bisInspAllRlationPersDao.get(p.getUserId()); if (per == null) { throw new Exception("此用户不存在:" + p.getUserId()); } if (per.getOwnerSystem() == null) { throw new Exception("用户所属系统不正确:" + per.getOwnerSystem()); } List systemList = new ArrayList<>(); if (!SystemFlagEnum.DC_ALL.getValue().equals(per.getOwnerSystem())) { systemList.add(SystemFlagEnum.DC_ALL.getValue()); systemList.add(per.getOwnerSystem()); } PageHelper.startPage(p.getPageNum(), p.getPageSize()); List list = privDao.findFirstLevelTree(systemList, p.getPrivName()); // 获取子节点 buildTree(list); return new PageInfo(list); } @Override public void insertPriv(Priv priv, List list) { privDao.insert(priv); menuDao.clearMemuPriv(priv.getId()); if (null != list && list.size() > 0) { menuDao.updateMemuPriv(list); } } @Override public void updatePriv(Priv priv, List list) { privDao.update(priv); menuDao.clearMemuPriv(priv.getId()); if (null != list && list.size() > 0) { menuDao.updateMemuPriv(list); } } /** * TODO 耗时太长,需要优化 * * @param p * @return * @throws Exception */ @Override public BisInspAllRelationPersPrivDto getPrivByUserId(GetPrivByUserIdParam p) { try { BisInspAllRlationPers pers = bisInspAllRlationPersDao.get(p.getUserId()); Optional.ofNullable(pers).orElseThrow(() -> new CheckException("此人员不存在:" + p.getUserId())); String owerSystem = pers.getOwnerSystem(); BisInspAllRelationPersPrivDto dto = new BisInspAllRelationPersPrivDto(); dto.setGuid(pers.getGuid()); dto.setAdmDuty(pers.getAdmDuty()); dto.setBornDate(DateUtils.Date2Str(pers.getBornDate(), "yyyy-MM-dd")); dto.setCallnumber(pers.getCallnumber()); dto.setCollTime(DateUtils.Date2Str(pers.getCollTime(), "yyyy-MM-dd hh:mm:ss")); dto.setDpnm(pers.getDpnm()); dto.setDppost(pers.getDppost()); dto.setEmail(pers.getEmail()); dto.setFaxnumb(pers.getFaxnumb()); dto.setIdnm(pers.getIdnm()); dto.setImgurl(pers.getImgurl()); dto.setLoginTm(DateUtils.Date2Str(pers.getLoginTm(), "yyyy-MM-dd hh:mm:ss")); dto.setMobilenumb(pers.getMobilenumb()); dto.setOrgId(pers.getOrgId()); dto.setOrgNm(pers.getOrgNm()); dto.setPlst(pers.getPlst()); dto.setTelnumb(pers.getTelnumb()); dto.setSex(pers.getSex()); dto.setSchool(pers.getSchool()); dto.setRemark(pers.getRemark()); dto.setSpecialty(pers.getSpecialty()); dto.setOwnerSystem(pers.getOwnerSystem()); dto.setPersName(pers.getPersName()); List menuList = menuDao.getListByUserId(p.getUserId(), PrivTypeEnum.MENU.getValue(), p.getOwnApp(), owerSystem); List privList = privDao.getListByUserId(p.getUserId(), owerSystem); dto.setMenu(getMenu(menuList, "0")); dto.setPriv(getPrivTree(privList, "0")); return dto; } catch (Exception ex) { ex.printStackTrace(); return null; } } @Override public void remove(String id) { MenuParam mp = new MenuParam(); mp.setPrivId(id); menuDao.deleteBy(mp); privDao.delete(id); } @Override public Priv modify(Priv p) throws Exception { Priv priv = privDao.get(p.getId()); if (priv == null) { throw new Exception("此权限不存在"); } if (StringUtils.isNotBlank(p.getPrivName())) { Menu menu = new Menu(); menu.setMenuName(p.getPrivName()); menu.setPrivId(p.getId()); int ret = menuDao.updateByPrivId(menu); if (ret != SqlExecuteStateEnum.SUCCESS.getValue()) { throw new Exception("更新菜单名字失败"); } } int ret = privDao.update(p); if (ret != SqlExecuteStateEnum.SUCCESS.getValue()) { throw new Exception("更新权限失败"); } Priv one = privDao.get(p.getId()); return one; } @Override public Priv add(Priv p) throws Exception { if (PrivTypeEnum.MENU.getValue().equals(p.getPrivType())) { throw new Exception("添加菜单类型权限请前往菜单页面添加"); } if (p.getSeq() == null || p.getSeq() == 0) { if (StringUtils.isBlank(p.getParentId())) { p.setParentId("0"); } Long maxSeq = privDao.selectMaxSeqByParentId(p.getParentId()); if (maxSeq == null) { maxSeq = 0L; } p.setSeq(maxSeq + 1); } int ret = insert(p); if (ret != SqlExecuteStateEnum.SUCCESS.getValue()) { throw new Exception("插入权限失败"); } return p; } @Override public List getPrivViewByUserId(GetPrivByUserIdParam p) throws Exception { BisInspAllRlationPers pers = bisInspAllRlationPersDao.get(p.getUserId()); if (pers == null) { throw new Exception("此人员不存在:" + p.getUserId()); } String owerSystem = pers.getOwnerSystem(); List privList = privDao.getPriViewListByUserId(p.getUserId(), p.getOrgId(), owerSystem, "图层"); return privList; } @Override public List getSysFlagByUserId(String userId) throws Exception { List list = new ArrayList<>(); BisInspAllRlationPers per = bisInspAllRlationPersDao.get(userId); if (per == null) { throw new Exception("此用户不存在:" + userId); } if (StringUtils.isBlank(per.getOwnerSystem())) { throw new Exception("用户所属系统不存在:" + per.getOwnerSystem()); } if (SystemFlagEnum.DC_ALL.getValue().equals(per.getOwnerSystem())) { list = SystemFlagEnum.getAll(); } else { EnumBean bean = new EnumBean(); bean.setName(SystemFlagEnum.getName(per.getOwnerSystem())); bean.setValue(per.getOwnerSystem()); list.add(bean); } return list; } private List getMenu(List list, String pid) { List menuList = new ArrayList<>(); //取出所有菜单 for (int i = 0; i < list.size(); i++) { MenuDto menu = list.get(i); if (menu == null) { continue; } // 取出所有父菜单 if (pid.equals(menu.getParentId())) { if (menu.getFlagLeaf() != null && !menu.getFlagLeaf()) { menu.setMenuList(getMenu(list, menu.getId())); } menuList.add(menu); } } return menuList; } private List getPrivTree(List list, String pid) { List privList = new ArrayList<>(); //取出所有菜单 for (int i = 0; i < list.size(); i++) { PrivSysDto priv = list.get(i); if (priv == null || null == priv.getParentId() || StringUtils.isBlank(priv.getParentId())) { continue; } else { if (pid.equals(priv.getParentId())) {//取出所有父菜单 priv.setPrivList(getPrivTree(list, priv.getId())); privList.add(priv); } } } return privList; } }