SecuityServiceImpl.java

package com.mycim.server.security.service;

import com.alipay.sofa.runtime.api.annotation.SofaService;
import com.alipay.sofa.runtime.api.annotation.SofaServiceBinding;
import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.i18n.I18nUtils;
import com.fa.sesa.i18n.Languages;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.Page;
import com.mycim.framework.logging.Logger;
import com.mycim.framework.logging.LoggerFactory;
import com.mycim.framework.utils.lang.ObjectUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.base.manager.RelationManager;
import com.mycim.server.security.manager.*;
import com.mycim.server.system.manager.LabelManager;
import com.mycim.server.system.manager.ReferenceFileManager;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.Relation;
import com.mycim.valueobject.bas.RelationEventModle;
import com.mycim.valueobject.bas.RelationHistory;
import com.mycim.valueobject.consts.*;
import com.mycim.valueobject.security.*;
import com.mycim.valueobject.sys.ReferenceFileDetail;
import com.mycim.valueobject.sys.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.constraints.NotNull;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Johnson W
 */
@Service
@SofaService(interfaceType = SecurityService.class, bindings = {@SofaServiceBinding(bindingType = "bolt")})
@Transactional
public class SecuityServiceImpl implements SecurityService {

    private static final Logger logger = LoggerFactory.getLogger(SecuityServiceImpl.class);

    @Autowired
    private NamedObjectManager namedObjectManager;

    @Autowired
    private UserManager userManager;

    @Autowired
    private StationManager stationManager;

    @Autowired
    private MenuManager menuManager;

    @Autowired
    private ButtonManager buttonManager;

    @Autowired
    private ReferenceFileManager referenceFileManager;

    @Autowired
    private RelationManager relationManager;

    @Autowired
    private UserGroupManager userGroupManager;

    @Autowired
    private RoleManager roleManager;

    @Autowired
    private LabelManager labelManager;

    @Override
    public String[] getSecurityFlag(long userRRN, String namedSpace, String programID) {
        return new String[0];
    }

    @Override
    public Map getSecurityInfo(Long userRrn, String screenId) {
        return null;
    }

    @Override
    public Long checkPassword(String userId, String password, Long facility) {
        return userManager.checkPassword(userId, password, facility);
    }

    @Override
    public Long checkUserTime(Long userRrn, Long facility) {
        return null;
    }

    @Override
    public boolean checkRole(Long userRrn, Long instanceRrn, String key) {
        return false;
    }

    @Override
    public List<Map> getSecurityMenuListById(long menuRoot, Languages language, String id, String isLeaf) {
        return menuManager.getSecurityMenuListById(menuRoot, language, id, isLeaf);
    }

    @Override
    public List<Map> getAllRole() {
        return roleManager.getAllRoleInfo();
    }

    @Override
    public List<Map> getSecurityMenuList(long menuRoot, Languages language) {
        return menuManager.getSecurityMenuList(menuRoot, language);
    }

    @Override
    public List<Map<String, Object>> getSecurityMenuTreeRootList(long menuRoot, Languages language) {
        return menuManager.getSecurityMenuTreeRootList(menuRoot, language);
    }

    @Override
    public Collection getSecurityMenuTreeListById(long menuRoot, Languages language, String id) {
        return menuManager.getSecurityMenuTreeListById(language, id);
    }

    @Override
    public Collection getGrantSecurityMenuList(long roleRrn, Languages language) {
        return null;
    }

    @Override
    public Collection getMenuTree(long menuRoot, Languages language, String id) {
        return null;
    }

    @Override
    public Collection getMenuTreeRoot(long menuRoot, Languages language) {
        return null;
    }

    @Override
    public Collection getMenuTreeRootLeaf(long menuRoot, Languages language, String id) {
        return null;
    }

    @Override
    public long getUserMenuRrn(long useRrn) {
        return 0;
    }

    @Override
    public List<RelationHistory> getRelationHistory(Long fromRrn) {
        List<RelationHistory> relationHistory = relationManager.getRelationHistory(fromRrn);
        if (CollectionUtils.isEmpty(relationHistory)) {
            return null;
        }
        return relationHistory;
    }

    @Override
    public Collection getClassfication(Long treeRrn) {
        return null;
    }

    @Override
    public Collection getClassfication(String objectType, Long facility, Long instanceRrn) {
        return null;
    }

    @Override
    public void maintainClassfication(Long instanceRrn, String[] classValues) {

    }

    @Override
    public void maintainClassfication(Long instanceRrn, String[] classValues, String[] topClasses) {

    }

    @Override
    public Map getLotAttributes() {
        return null;
    }

    @Override
    public String getObjectAttributeValue(long instanceRrn, int instanceVersion, long fieldRrn) {
        return null;
    }

    @Override
    public void updateObjectAttributeValue(long instanceRrn, int instanceVersion, long fieldRrn, String value) {

    }

    @Override
    public Page searchResults(Page page, Map condtionMap, String buildSql) {
        return null;
    }

    @Override
    public List<Map> getRoleGrantMenu(long roleRrn) {
        List<Relation> relations = relationManager.getRelationsUseFromRrn(roleRrn, LinkTypeList.ROLE_MENU_KEY);
        List<Map> results = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(relations)) {
            for (Relation relation : relations) {
                Map result = new HashMap();
                result.put("torrn", relation.getToRrn());
                result.put("fromrrn", relation.getAttributedata1());
                results.add(result);
            }
        }
        return results;
    }

    @Override
    public List<Map> getUserGrantRoleList(long userRrn) {
        List<Relation> relations = relationManager.getRelationsUseFromRrn(userRrn, LinkTypeList.USER_ROLE_KEY);
        List<Map> results = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(relations)) {
            for (Relation relation : relations) {
                Map result = new HashMap();
                result.put("torrn", relation.getToRrn());
                results.add(result);
            }
        }
        return results;
    }

    @Override
    public List<Long> getUserBelongUserGroup(long userRrn) {
        return userGroupManager.getUserBelongUserGroup(userRrn);
    }

    @Override
    public List<Map> getUserGroupGrantRoleList(long userGroupRrn) {
        List<Relation> relations = relationManager
                .getRelationsUseFromRrn(userGroupRrn, LinkTypeList.USERGROUP_ROLE_KEY);
        List<Map> results = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(relations)) {
            for (Relation relation : relations) {
                Map result = new HashMap();
                result.put("torrn", relation.getToRrn());
                result.put("fromrrn", relation.getFromRrn());
                results.add(result);
            }
        }
        return results;
    }

    @Override
    public List<Map> getMenuFromRrn(long toRrn, long rootRrn) {
        return menuManager.getMenuFromRrn(toRrn, rootRrn);
    }

    @Override
    public boolean isExistedRelation(long subMenuRrn, long menuRrn) {
        return relationManager.isExistedRelation(subMenuRrn, menuRrn, LinkTypeList.MENU_SUBMENU_KEY);
    }

    @Override
    public boolean isExistedRelation(long menuRrn) {
        return relationManager.isExistedRelation(null, menuRrn, LinkTypeList.MENU_SUBMENU_KEY);
    }

    @Override
    public Collection getHasGrantUserGroupAll(long roleRrn, String userGroupId) {
        return roleManager.getHasGrantUserGroupAll(roleRrn, userGroupId);
    }

    @Override
    public Collection getHasRoleGrantUserAll(long roleRrn, String userId) {
        return roleManager.getHasRoleGrantUserAll(roleRrn, userId);
    }

    @Override
    public Collection getRoleGrantUserGroup(long roleRrn) {
        List<Relation> relations = relationManager.getRelationsUseToRrn(roleRrn, LinkTypeList.USERGROUP_ROLE_KEY);
        List<Map> results = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(relations)) {
            for (Relation relation : relations) {
                Map result = new HashMap();
                result.put("torrn", relation.getToRrn());
                result.put("fromrrn", relation.getFromRrn());
                result.put("attribute1", relation.getAttributedata1());
                results.add(result);
            }
        }
        return results;
    }

    @Override
    public Collection getRoleGrantUser(long roleRrn) {
        List<Relation> relations = relationManager.getRelationsUseToRrn(roleRrn, LinkTypeList.USER_ROLE_KEY);
        List<Map> results = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(relations)) {
            for (Relation relation : relations) {
                Map result = new HashMap();
                result.put("torrn", relation.getToRrn());
                result.put("fromrrn", relation.getFromRrn());
                results.add(result);
            }
        }
        return results;
    }

    @Override
    public Collection getUserGroupById(String userGroupId) {
        return roleManager.getUserGroupByIdNotInRole(userGroupId);
    }

    @Override
    public Collection getUserGroupAll() {
        return userGroupManager.getAllUserGroupInfo();
    }

    @Override
    public List<Map> getUserAll() {
        return userManager.getAllUserInfo();
    }

    @Override
    public Collection getUserById(String userId, long roleRrn) {
        return roleManager.getUserByIdNotInRole(userId, roleRrn);
    }

    @Override
    public List<Map> getHasGrantUserAll(long userGroupRrn, String userId) {
        return userGroupManager.getHasGrantUserAll(userGroupRrn, userId);
    }

    @Override
    public List<Map> getGroupUserById(String userId, long userGroupRrn) {
        return userGroupManager.getUsersByIdExcludeUserGroup(userGroupRrn, userId);
    }

    @Override
    public List<Button> getAllButtons(Long menuRrn) {
        return buttonManager.getAllButtons(menuRrn);
    }

    @Override
    public void insertButtonMenuExt(Long buttonRrn, Long menuRrn) {
        buttonManager.insertButtonMenuExt(buttonRrn, menuRrn);
    }

    @Override
    public void updateButtonMenu(Long buttonRrn, Long menuRrn) {
        buttonManager.updateButtonMenu(buttonRrn, menuRrn);
    }

    @Override
    public void updateButton(Button button) {
        buttonManager.updateButton(button);
    }

    @Override
    public void deleteAllButtonRelation(Long buttonRrn) {
        buttonManager.deleteAllButtonRelation(buttonRrn);
    }

    @Override
    public void deleteButton(Button button) {
        buttonManager.deleteButton(button);
    }

    @Override
    public List<Map> getRoleButton(Long roleRrn) {
        return buttonManager.getRoleButton(roleRrn);
    }

    @Override
    public void updateRoleButtonRelation(Long roleRrn, List<Long> buttonsRrn) {
        buttonManager.updateRoleButtonRelation(roleRrn, buttonsRrn);
    }

    @Override
    public Map getButtonInfoWithRoles(Collection roleRrns, String buttonId) {
        return roleManager.getButtonInfoWithRoles(roleRrns, buttonId);
    }

    @Override
    public Collection<Long> getUserGrantUserGroupAllRole(Long userRrn) {
        return roleManager.getUserGrantUserGroupAllRole(userRrn);
    }

    @Override
    public String getButtonDesc(String buttonId, Long faciltyRrn) {
        return null;
    }

    @Override
    public boolean checkUserHasMenu(String userId, String menuId, Long facilityRrn) {
        return false;
    }

    @Override
    public long validUser(String userName, String password, long facility) {
        long flag = 0;
        if (userName != null && userName.equals("ADMIN")) {
            facility = 1;
        }

        String nameSpace = namedObjectManager.getNamedSpace(facility, ObjectList.USER_KEY);
        NamedObject namedObject = namedObjectManager.getNamedObject(userName, nameSpace, ObjectList.USER_KEY);
        if (namedObject == null) {
            return 0; // 用户不存在
        }

        long userRrn = namedObject.getInstanceRrn();
        boolean isExcited = checkPassword(userRrn, password);
        if (isExcited) {
            flag = userRrn; // 用户存在,并且密码匹配
        } else {
            flag = -1; // 用户存在,密码不匹配
        }

        return flag;
    }

    @Override
    public boolean checkPassword(long userRrn, String password) {
        boolean isExited = false;
        String dbPassword = userManager.getPassword(userRrn);
        if (StringUtils.isBlank(dbPassword)) {
            isExited = true;
        } else if ((dbPassword != null) && dbPassword.equals(password)) {
            isExited = true;
        }
        return isExited;
    }

    @Override
    public TreeDetail getTreeDetail(TreeDetail instance) {
        return null;
    }

    @Override
    public Role getRole(Role role) {
        NamedObject object = namedObjectManager.getNamedObject(role);
        if (object == null) {
            return null;
        }
        role.copyNamedObject(object);
        return role;
    }

    @Override
    public SecurityClass getSecurityClass(SecurityClass instance) {
        return null;
    }

    @Override
    public Menu getMenu(Menu menu) {
        return menuManager.getMenu(menu);
    }

    @Override
    public long insertTreeDetail(TreeDetail treeDetail) {
        return 0;
    }

    @Override
    public long insertMenu(Menu menu) {
        return menuManager.insertMenu(menu);
    }

    @Override
    public void deleteMenu(Menu instance) {
        menuManager.deleteMenuItem(instance);
    }

    @Override
    public long insertSecurityClass(SecurityClass securityClass) {
        return 0;
    }

    @Override
    public long insertRole(Role role) {
        return namedObjectManager.insertNamedObject(role);
    }

    @Override
    public Collection getRolesByObjectType(String objectType) {
        return null;
    }

    @Override
    public List<Menu> getSubMenus(long menuRrn) {
        return menuManager.getSubMenus(menuRrn);
    }

    @Override
    public Menu getParentMenu(long menuRrn) {
        return menuManager.getParentMenu(menuRrn);
    }

    @Override
    public Collection getTreeChilds(TreeDetail tree) {
        return null;
    }

    @Override
    public Collection getUserGroupsByRole(Role role) {
        return null;
    }

    @Override
    public void updateRole(Role role) {
        namedObjectManager.updateNamedObject(role);
    }

    @Override
    public void updateSecurityClass(SecurityClass instance) {

    }

    @Override
    public void updateMenu(Menu menu) {
        menuManager.updateMenu(menu);
    }

    @Override
    public void updateTreeDetail(TreeDetail instance) {

    }

    @Override
    public Collection getScreensBySecurityClass(SecurityClass aClass) {
        return null;
    }

    @Override
    public Collection getGroupsBySecurityClass(SecurityClass aClass) {
        return null;
    }

    @Override
    public User getUser(Long userRrn) {
        return userManager.getUser(userRrn);
    }

    @Override
    public User getUser(User user) {
        return userManager.getUser(user);
    }

    @Override
    public User getUserByLdapId(String ldapId) {
        return userManager.getUserByLdapId(ldapId);
    }

    @Override
    public boolean updatePassword(long userRrn, String newPwd) {
        return userManager.updatePassword(userRrn, newPwd);
    }

    @Override
    public Collection getUserWithGroupGrantRoleList(long userRrn) {
        List<Long> userRoles = userManager.getUserGrantRoleList(userRrn);
        List<Long> userGroupRoles = userManager.getUserGroupGrantRoleList(userRrn);
        userRoles.addAll(userGroupRoles);
        return CollectionUtils.removeDuplicate(userRoles);
    }

    @Override
    public void insertLoginLog(LoginLog loginlog) {

    }

    @Override
    public long getUserLastLoginTime(long userRrn) {
        return 0;
    }

    @Override
    public void changeUserStatus(long userRrn, String userStatus, String longinUserId) {
        userManager.changeUserStatus(userRrn, userStatus, longinUserId);
    }

    @Override
    public long getUserLastChangePasswordTime(long userInstanceRrn) {
        return 0;
    }

    @Override
    public UserGroup getUserGroup(UserGroup group) {
        return userGroupManager.getUserGroup(group);
    }

    @Override
    public void addUserToUsergroup(Relation relation) {
        relation.setLinkType(LinkTypeList.USER_USERGROUP_KEY);

        insertUserPermissions(relation);
    }

    @Override
    public long getRootMenuRrn(long facilityRrn) {
        return namedObjectManager
                .getNamedObjectRrn("ROOTMENU", namedObjectManager.getNamedSpace(facilityRrn, ObjectList.MENU_KEY),
                                   ObjectList.MENU_KEY);
    }

    @Override
    public Map<String, Object> getUserAuthorizationMenu(long userRrn, long facilityRrn, Languages language) {
        // result.addAll(getUserMenu(userRrn, language)); //无用代码
        List<Map<String, Object>> result = new ArrayList<>(getRoleMenu(userRrn, facilityRrn, language));
        return filterMenu(facilityRrn, result);
    }

    @Override
    public String getUserType(User user) {
        // TODO:用于获取用户类型,PE/EE
        return "";
    }

    @Override
    public Station getStation(Station station) {
        return stationManager.getStation(station);
    }

    @Override
    public long insertStation(Station station) {
        return stationManager.insertStation(station);
    }

    @Override
    public long insertUser(User user) {
        return userManager.insertUser(user);
    }

    @Override
    public long insertUserGroup(UserGroup userGroup) {
        return userGroupManager.insertUserGroup(userGroup);
    }

    @Override
    public void deleteStation(Station station) {
        stationManager.deleteStation(station);
    }

    @Override
    public void deleteUser(User user) {
        userManager.deleteUser(user);
    }

    @Override
    public void deleteUserGroup(UserGroup userGroup) {
        userGroupManager.deleteUserGroup(userGroup);
    }

    @Override
    public void updateStation(Station station) {
        stationManager.updateStation(station);
    }

    @Override
    public void updateUser(User user) {
        userManager.updateUser(user);
    }

    @Override
    public void updateUserGroup(UserGroup userGroup) {
        userGroupManager.updateUserGroup(userGroup);
    }

    @Override
    public List<Relation> getUsers(UserGroup group) {
        return relationManager.getRelationsUseToRrn(group.getInstanceRrn(), LinkTypeList.USER_USERGROUP_KEY);
    }

    @Override
    public void removeUserFromGroup(Relation relation) {
        relation.setLinkType(LinkTypeList.USER_USERGROUP_KEY);

        deleteUserPermissions(relation);
    }

    @Override
    public void changeUserPassword(User user) {

    }

    @Override
    public boolean isNodeInTree(Long rootRrn, Long menuRrn) {
        return false;
    }

    @Override
    public void addSubMenuToMenu(Relation relation) {
        if (relationManager.getRelation(relation.getFromRrn(), relation.getToRrn(), relation.getLinkType()) == null) {
            relation.setSequenceNumber(0);
            relationManager.insertRelation(relation);
        }
    }

    @Override
    public void removeUserFromRole(Relation relation) {
        relation.setLinkType(LinkTypeList.USER_ROLE_KEY);

        setNecessaryParameters(relation,TransactionNames.DELETE_KEY);
        relationManager.deleteRelation(relation, DataBaseNames.REL_USER_PERMISSIONS, DataBaseNames.REL_USER_PERMISSIONS_H);
    }

    @Override
    public List<Relation> getUserRoles(long userRrn) {
        List<Relation> relations = relationManager.getRelationsUseFromRrn(userRrn, LinkTypeList.USER_ROLE_KEY);
        if (CollectionUtils.isNotEmpty(relations)) {
            for (Relation relation : relations) {
                NamedObject object = namedObjectManager.getNamedObject(relation.getToRrn());
                relation.copyNamedObject(object);
            }
        }
        return relations;
    }

    @Override
    public void addUserToRole(Relation relation) {
        relation.setLinkType(LinkTypeList.USER_ROLE_KEY);

        setNecessaryParameters(relation,TransactionNames.CREATE_KEY);
        relationManager.insertRelation(relation, DataBaseNames.REL_USER_PERMISSIONS, DataBaseNames.REL_USER_PERMISSIONS_H);
    }

    @Override
    public boolean isAdminGroup(long userGroupRrn) {
        return userGroupManager.isAdminGroup(userGroupRrn);
    }

    @Override
    public void updateRoleMenuBtnRelation(String userId, List<Relation> relations, long roleRrn) {
        roleManager.updateRoleMenuBtnRelation(userId, relations, roleRrn);
    }

    @Override
    public List<MenuTreeNode> getRootMenuTree(Long facilityRrn, Languages language) {
        long rootMenuRrn = getRootMenuRrn(facilityRrn);

        List<MenuTreeNode> userMenuTree = menuManager.getMenuTree(language, rootMenuRrn);
        if (CollectionUtils.isEmpty(userMenuTree)) {
            userMenuTree = Collections.emptyList();
        }

        return userMenuTree;
    }

    @Override
    public void deleteRole(Role role) {
        roleManager.deleteRole(role);
    }

    @Override
    public List<Map<String, Object>> qrySecuritySysParaSetTree(Long facilityRrn, Languages language) {
        long menuRootRrn = namedObjectManager.getNamedObjectRrn("ROOTMENU", facilityRrn, ObjectList.MENU_KEY);
        List<Map<String, Object>> menuTree = getSecurityMenuTreeRootList(menuRootRrn, language);
        List<Map> grantUserMenus = menuManager.getUserAccessMenuItemInfos(LocalContext.getUserRrn());
        List<Map<String, Object>> result = new ArrayList<>();
        for (Map<String, Long> map : grantUserMenus) {
            for (Map<String, Object> node : menuTree) {
                boolean isGrantUserMenu = MapUtils.getLong(node, "torrn").equals(MapUtils.getLong(map, "MENURRN")) &&
                        MapUtils.getLong(node, "fromrrn").equals(MapUtils.getLong(map, "PARENTMENURRN"));
                if (isGrantUserMenu) {
                    result.add(node);
                }
            }
        }

        for (Iterator iterator = result.iterator(); iterator.hasNext(); ) {
            HashMap menuItem = (HashMap) iterator.next();
            String id = (String) menuItem.get("torrn");
            String type = (String) menuItem.get("objectType");
            Collection menu_tree_children = new ArrayList();
            if (type.equalsIgnoreCase("SUBMENU")) {
                // 查询子菜单列表
                menu_tree_children = getSecurityMenuTreeListById(menuRootRrn, language, id);
                for (Iterator iterator_children = menu_tree_children.iterator(); iterator_children.hasNext(); ) {
                    HashMap menuItem_children = (HashMap) iterator_children.next();
                    String id_children = (String) menuItem_children.get("torrn");
                    String type_children = (String) menuItem_children.get("objectType");
                    Collection menu_tree_children_r = new ArrayList();
                    if (type_children.equalsIgnoreCase("SUBMENU")) {
                        menu_tree_children_r = getSecurityMenuTreeListById(menuRootRrn, language, id_children);
                        for (Iterator iterator_children_r = menu_tree_children_r.iterator(); iterator_children_r
                                .hasNext(); ) {
                            HashMap menuItem_children_r = (HashMap) iterator_children_r.next();
                            String id_children_r = (String) menuItem_children_r.get("torrn");
                            String type_children_r = (String) menuItem_children_r.get("objectType");

                            Collection menu_tree_children_r_r = new ArrayList();
                            if (type_children_r.equalsIgnoreCase("SUBMENU")) {
                                menu_tree_children_r_r = getSecurityMenuTreeListById(menuRootRrn, language,
                                                                                     id_children_r);
                                for (Iterator iterator_children_r_r = menu_tree_children_r_r
                                        .iterator(); iterator_children_r_r.hasNext(); ) {
                                    HashMap menuItem_children_r_r = (HashMap) iterator_children_r_r.next();
                                    String id_children_r_r = (String) menuItem_children_r_r.get("torrn");
                                    String type_children_r_r = (String) menuItem_children_r_r.get("objectType");
                                    menuItem_children_r_r.put("leaf", new Boolean(true));
                                }
                                menuItem_children_r.put("children", menu_tree_children_r_r);
                            } else {
                                menuItem_children_r.put("leaf", new Boolean(true));
                            }
                        }
                        menuItem_children.put("children", menu_tree_children_r);
                    } else {
                        menuItem_children.put("leaf", new Boolean(true));
                    }
                }
                menuItem.put("children", menu_tree_children);
            } else {
                menuItem.put("leaf", new Boolean(true));
                menuItem.put("children", new ArrayList());
            }
        }

        Collections.sort(result, new Comparator<Map<String, Object>>() {

            @Override
            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                String seq1 = MapUtils.getString(o1, "seq");
                String seq2 = MapUtils.getString(o2, "seq");
                return NumberUtils.toInt(seq1) - NumberUtils.toInt(seq2);
            }

        });
        return result;
    }

    @Override
    public void addButton(Button button) {
        buttonManager.addButton(button);
    }

    @Override
    public List<Relation> getEquipmentOfStation(long stationRrn) {
        return stationManager.getEquipmentOfStation(stationRrn);
    }

    @Override
    public List<RelationEventModle> getEquipmentOfStation(long stationRrn, long eventRrn) {
        return stationManager.getEquipmentOfStation(stationRrn, eventRrn);
    }

    @Override
    public List<Relation> getOperationOfStation(long stationRrn) {
        return stationManager.getOperationOfStation(stationRrn);
    }

    @Override
    public List<Relation> getUserOfStation(long stationRrn) {
        return stationManager.getUserOfStation(stationRrn);
    }

    @Override
    public void addOperationToStation(Relation relation) {
        relation.setLinkType(LinkTypeList.STATION_OPER_KEY);


        insertStationRelation(relation);
    }

    @Override
    public void addUserToStation(Relation relation) {
        relation.setLinkType(LinkTypeList.STATION_USER_KEY);


        insertStationRelation(relation);
    }

    @Override
    public void removeEquipmentFromStation(Relation relation) {
        // get the transaction log
        relation.setLinkType(LinkTypeList.STATION_EQPT_KEY);

        // insert a relatin into the relation table

        removeStationRelation(relation);
    }



    @Override
    public void removeOperationFromStation(Relation relation) {
        relation.setLinkType(LinkTypeList.STATION_OPER_KEY);

        // insert a relatin into the relation table

        removeStationRelation(relation);
    }

    @Override
    public void removeUserFromStation(Relation relation) {
        relation.setLinkType(LinkTypeList.STATION_USER_KEY);
        // insert a relatin into the relation table

        removeStationRelation(relation);
    }

    @Override
    public List<Station> getStationsByEquips(long equipRrn) {
        return stationManager.getStationsByEquips(equipRrn);
    }

    @Override
    public User getUser(String userId, Long facilityRrn) {
        return userManager.getUser(userId, facilityRrn);
    }

    @Override
    public Collection<Long> getUserRoleList(Long userRrn) {
        List<Map> userGrantRole = getUserGrantRoleList(userRrn);
        Collection<Long> rolesRrn = getUserGrantUserGroupAllRole(userRrn);
        for (Object obj : userGrantRole) {
            Map map = (Map) obj;
            Long roleRrn = MapUtils.getLong(map, "torrn");
            rolesRrn.add(roleRrn);
        }
        return CollectionUtils.removeDuplicate(rolesRrn);

    }

    @Override
    public List<String> getDepartmentIds(String reference_file, String key_1_value, String get_Value_key) {
        return userGroupManager.getDepartmentIds(reference_file, key_1_value, get_Value_key);
    }

    @Override
    public boolean checkUserExistedUserGroups(Long userRrn, String groups) {
        return userGroupManager.checkUserExistedUserGroups(userRrn, groups);
    }

    @Override
    public boolean isHasBtnPermission(long userRrn, String btnId) {
        return MapUtils.isNotEmpty(getButtonInfoWithRoles(getUserWithGroupGrantRoleList(userRrn), btnId));
    }

    @Override
    public Boolean hasRelationEditPermission(Long facilityRrn, Long userRrn, Long engineerGroupRrn) {
        return roleManager.isAdminRole(facilityRrn, userRrn) ||
                userGroupManager.getUserGroupRrnsByUserRrn(userRrn).contains(engineerGroupRrn);
    }

    @Override
    public List<Map> getUsers(String deptId) {
        return userManager.getUsers(deptId);
    }

    @Override
    public String getTel(String deptId, String userId) {
        return userManager.getTel(deptId, userId);
    }

    @Override
    public List<Relation> getUserGroups(long userRrn) {
        return userGroupManager.getUserGroups(userRrn);
    }

    @Override
    public List<Relation> getUserGroups(User user) {
        return getUserGroups(namedObjectManager.getNamedObjectRrn(user));
    }

    @Override
    public String getUserName(long userRrn) {
        return userManager.getUserName(userRrn);
    }

    @Override
    public Map getUserInfo4Alarm(long userRrn) {
        return userManager.getUserInfo4Alarm(userRrn);
    }

    @Override
    public Map getUserInfo4AlarmByUserGroup(long userGroupRrn) {
        return userManager.getUserInfo4AlarmByUserGroup(userGroupRrn);
    }

    @Override
    public Boolean isAdminRole(long facilityRrn, long userRrn) {
        return roleManager.isAdminRole(facilityRrn, userRrn);
    }

    @Override
    public Boolean isExportRole(long facilityRrn, long userRrn) {
        return roleManager.isExportRole(facilityRrn, userRrn);
    }

    @Override
    public List<UserGroup> getUserGroupByUserRrn(Long userRrn) {
        return userGroupManager.getUserGroupByUserRrn(userRrn);
    }

    @Override
    public List<User> getUserInfoForParam(Map param) {
        return userManager.getUserInfoForParam(param);
    }

    @Override
    public Page getInformUser(User user,Page page) {
        return  userManager.getInformUser(user, page);
    }

    @Override
    public Page getInformHistory(User user, Page page) {
        return userManager.getInformHistory(user,page);
    }

    @Override
    public void releaseOrCancelInformToUser(List<String> userRrnList, String informFlag) {
        User userInform = new User();
        for (String userRrn : userRrnList) {
            User user  = userManager.getInformUser(NumberUtils.toLong(userRrn));
            userInform.setInformFlag(informFlag);
            userInform.setInstanceRrn(NumberUtils.toLong(userRrn));
            if(user!=null){
                if(StringUtils.equals(informFlag,Constants.INFORM_STATUS.NOT_INFORM)) {
                    userInform.setLastInformTime(user.getLastInformTime());
                }
                userManager.updateUserInform(userInform);
            } else {
                userManager.insertUserInform(userInform);
            }
        }
    }

    @Override
    public Map<Long, String> getInformUserAndMsg(Long userRrn) {
        Map<Long, String> informMap = new HashMap<>();
        String nowTime = DateUtils.getNowTime();
        List<ReferenceFileDetail> referenceFileDetails = referenceFileManager.getRefFileValues(ReferenceDetailNames.SYSTEM_NOTICE, LocalContext.getFacilityRrn());
        Map<String,String> refMap =
                referenceFileDetails.stream().collect(
                        Collectors.toMap(ReferenceFileDetail::getKey1Value, ReferenceFileDetail::getData1Value));
        String date = MapUtils.getString(refMap, "MSGDATE");
        String content = MapUtils.getString(refMap, "MSGCONTENT");
        String title = MapUtils.getString(refMap, "MSGTITLE");
        String time = MapUtils.getString(refMap, "MSGTIME");
        // 判断是否在有效期内
        boolean flag = DateUtils.parse(time,DateUtils.DATE_FORMAT).getTime() < DateUtils.parse(nowTime,DateUtils.DATE_FORMAT).getTime()
                        && DateUtils.parse(nowTime,DateUtils.DATE_FORMAT).getTime() < DateUtils.parse(date,DateUtils.DATE_FORMAT).getTime();
        StringBuilder stringBuilder = new StringBuilder();
        User user = userManager.getInformUser(userRrn);
        if(user!= null && StringUtils.equalsIgnoreCase(user.getInformFlag(),Constants.INFORM_STATUS.INFORM) && flag){
            if(StringUtils.isBlank(DateUtils.formatDate(user.getLastInformTime()))){
                user.setLastInformTime(DateUtils.parse(nowTime));
                userManager.updateLastInformTime(user);
                stringBuilder.append(title).append("##").append(content).append("##").append(date);
            } else {
                //判断今天是否通知过
                Date nowDate = DateUtils.parse(nowTime,DateUtils.DATE_FORMAT4DAY);
                if(nowDate.compareTo(user.getLastInformTime())==1) {
                    user.setLastInformTime(DateUtils.parse(nowTime));
                    userManager.updateLastInformTime(user);
                    stringBuilder.append(title).append("##").append(content).append("##").append(date);
                }
            }
        }
        stringBuilder.append("##msg");
        informMap.put(userRrn,stringBuilder.toString());
        return informMap;
    }

    @Override
    public Page getRelationOfStation(Page page, String linType, long stationRrn) {
        return stationManager.getRelationOfStation(page, linType, stationRrn);
    }

    @Override
    public void addEquipmentToStation(Relation relation) {
        relation.setLinkType(LinkTypeList.STATION_EQPT_KEY);
        // relationManager.insertRelation(relation);
        insertStationRelation(relation);
    }

    @Override
    public void addRoleRelation(Relation relation) {
        relation.setSequenceNumber(0);
        insertUserPermissions(relation);
    }

    @Override
    public void deleteRoleRelation(Relation relation) {
        deleteUserPermissions(relation);
    }

    private List<Map<String, Object>> getRoleMenu(long userRrn, long facilityRrn, Languages language) {
        List<Map<String, Object>> result = new ArrayList<>();

        long rootMenuRrn = this.getRootMenuRrn(facilityRrn);
        List<MenuTreeNode> menuTree = menuManager.getMenuTree(language, rootMenuRrn);
        List<Map> grantUserMenus = menuManager.getUserAccessMenuItemInfos(userRrn);

        for (Map map : grantUserMenus) {
            for (MenuTreeNode node : menuTree) {
                boolean isGrantUserMenu = node.getMenuRrn().equals(MapUtils.getLong(map, "MENURRN")) &&
                        node.getParentMenuRrn().equals(MapUtils.getLong(map, "PARENTMENURRN"));
                if (isGrantUserMenu) {
                    result.add(convertNode2Map(node));
                }
            }
        }

        return result;
    }

    @Deprecated
    private List<Map<String, Object>> getUserMenu(long userRrn, Languages language) {
        List<Map<String, Object>> result = new ArrayList<>();
        long rootMenuRrn = userManager.getUser(userRrn).getMenuRrn().longValue();
        if (rootMenuRrn != 0) {
            List<MenuTreeNode> userMenuTree = menuManager.getMenuTree(language, rootMenuRrn);
            if (CollectionUtils.isNotEmpty(userMenuTree)) {
                for (MenuTreeNode node : userMenuTree) {
                    result.add(convertNode2Map(node));
                }
            }
        }
        return result;
    }

    private Map<String, Object> convertNode2Map(@NotNull MenuTreeNode node) {
        Map<String, Object> map = new HashMap<>();
        map.put("menuId", node.getMenuId());
        map.put("id", node.getLabelId());
        map.put("icon", node.getIcon());
        map.put("text", node.getLabelText());
        map.put("torrn", node.getMenuRrn());
        map.put("fromrrn", node.getParentMenuRrn());
        map.put("program", node.getUrl());
        map.put("seq", node.getSequence());
        map.put("label", node.getLabelText());
        map.put("leaf", node.getIsLeafNode());
        map.put("labelId", node.getLabelId());
        map.put("url", node.getUrl());
        return map;
    }

    private List<Map<String, Object>> buildListOfDeletedDuplicateMenu(List<Map<String, Object>> list) {
        List<String> norepelist = new ArrayList<>();
        String uniqueValue;
        List<Map<String, Object>> repelist = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            Map<String, Object> map = list.get(i);
            uniqueValue = MapUtils.getString(map, "torrn") + "#" + MapUtils.getString(map, "fromrrn");
            if (!norepelist.contains(uniqueValue)) {
                norepelist.add(uniqueValue);
            } else {
                list.remove(i);
                i--;
                repelist.add(map);
            }
        }
        return list;
    }

    private Map<String, Object> filterMenu(long facilityRrn, List<Map<String, Object>> menuList) {
        List<String> lotLocationMenuButtonIds = getLotLocationMenuButtonIds(facilityRrn);
        List<String> menuListFilterMenuIds = getMenuListFilterMenuIds(facilityRrn);

        List<Map<String, Object>> willRemovedMenuList = new ArrayList<>();
        List<Map<String, Object>> filterMenuList = new ArrayList<>();
        Set<String> buttonSet = new HashSet<>();
        List<String> buttonData = new ArrayList<>();



        for (Map<String, Object> menuMap : menuList) {
            String menuId = MapUtils.getString(menuMap, "menuId");
            for (String lotLocationMenuButtonId : lotLocationMenuButtonIds) {
                if (lotLocationMenuButtonId.equals(menuId)) {       //如果用户的权限中有此Button的权限
                    if (!"MENU_FUTURE_PROCESS".equals(menuId))      // MENU_FUTURE_PROCESS 菜单会在批次作业和菜单树上同时显示
                        willRemovedMenuList.add(menuMap);           //将此按钮的权限从菜单树上删掉
                    if (buttonSet.add(lotLocationMenuButtonId))
                        buttonData.add(lotLocationMenuButtonId);    //因为只需要展示在LotInfo界面
                    break;
                }
            }

            for (String filterMenuId : menuListFilterMenuIds) {
                if (filterMenuId.equals(menuId)) {
                    filterMenuList.add(menuMap);
                    break;
                }
            }
        }

        menuList.removeAll(willRemovedMenuList);
        menuList.removeAll(filterMenuList);

        menuList.sort(Comparator.comparingInt(o -> NumberUtils.toInt(MapUtils.getString(o, "seq"))));

        Map<String, Object> results = new HashMap<>();
        results.put("menuData", menuList);
        results.put("buttonData", buttonData);
        return results;
    }

    /**
     * 获取LotLocation中对应按钮的菜单项
     *
     * @param facilityRrn
     * @return
     */
    private List<String> getLotLocationMenuButtonIds(long facilityRrn) {
        List<String> menuButtonIds = new ArrayList<>();
        long refrenceFileRrn = namedObjectManager
                .getNamedObjectRrn("$$MENU_BTN_JOBBYLOT", facilityRrn, ObjectList.REFERENCE_FILE_KEY);
        if (refrenceFileRrn > 0) {
            menuButtonIds = menuManager.getMenusByRefrenceFileRrn(refrenceFileRrn);
        }
        return menuButtonIds;
    }

    /**
     * 获取左侧菜单列表需要过滤的菜单项
     *
     * @param facilityRrn
     * @return
     */
    private List<String> getMenuListFilterMenuIds(long facilityRrn) {
        List<String> menuButtonIds = new ArrayList<>();
        long refrenceFileRrn = namedObjectManager
                .getNamedObjectRrn("$FILTER_LEFT_MENU_BY_BUTTON", facilityRrn, ObjectList.REFERENCE_FILE_KEY);
        if (refrenceFileRrn > 0) {
            menuButtonIds = menuManager.getMenusByRefrenceFileRrn(refrenceFileRrn);
        }
        return menuButtonIds;
    }

    /**
     * 如菜单树中有LotLocation菜单项,那将在菜单树中隐藏LotLocation中对应按钮的菜单项 this.getLotLocationMenuButtonIds()<br>
     * <br>
     * Redmine #14146: as recode the whole part of related code could have problematic consequences. therefore
     * only add this patch for both of the original entry request and the integrated entry request to properly
     * filter the menus;
     *
     * @param menuURL
     * @return
     */
    private boolean hasLotLocation(String menuURL) {
        String lotLocationActionURL = "lotLocation4CSECAction.do?qry=lotlocation&nav=true";
        String lotLocationPageURL = "wip/viewlotlocation4CSEC.jsp";
        return lotLocationActionURL.equals(menuURL) || lotLocationPageURL.equals(menuURL);
    }

    private void insertUserPermissions(Relation relation) {
        setNecessaryParameters(relation, TransactionNames.CREATE_KEY);
        relationManager.insertRelation(relation, DataBaseNames.REL_USER_PERMISSIONS, DataBaseNames.REL_USER_PERMISSIONS_H);
    }

    private void deleteUserPermissions(Relation relation) {
        setNecessaryParameters(relation, TransactionNames.DELETE_KEY);
        relationManager.deleteRelation(relation, DataBaseNames.REL_USER_PERMISSIONS, DataBaseNames.REL_USER_PERMISSIONS_H);
    }

    private void insertStationRelation(Relation relation) {
        setNecessaryParameters(relation, TransactionNames.CREATE_KEY);
        relationManager.insertRelation(relation, DataBaseNames.REL_STATION, DataBaseNames.REL_STATION_H);
    }

    private void removeStationRelation(Relation relation) {
        setNecessaryParameters(relation, TransactionNames.DELETE_KEY);
        relationManager.deleteRelation(relation, DataBaseNames.REL_STATION, DataBaseNames.REL_STATION_H);
    }

    private void setNecessaryParameters(Relation relation, String type) {
        if (StringUtils.isBlank(relation.getTransId())){
            relation.setTransId(type);
        }
        if (StringUtils.isBlank(relation.getTransPerformedby())){
            relation.setTransPerformedby(LocalContext.getUserId());
        }
    }

    @Override
    public void saveOrUpdateMenuRelation(Menu menu, HashMap<String, Object> menuInfoParams) {
        String menuId = MapUtils.getString(menuInfoParams, "menuId");
        String labelId = MapUtils.getString(menuInfoParams, "labelId");
        String instanceId = MapUtils.getString(menuInfoParams, "instanceId");
        String instanceDesc = MapUtils.getString(menuInfoParams, "instanceDesc");
        Long parentMenuRrn = MapUtils.getLong(menuInfoParams, "parentMenuRrn");
        String userId = LocalContext.getUserId();
        long menuRrn = menu.getInstanceRrn();

        // label 处理
        Label label = processLabel(labelId, instanceId, instanceDesc);
        // 标签内容
        processLabelItem(instanceDesc, label);
        // menu 处理
        processMenu(menu, label, parentMenuRrn, menuId);

        Relation relation = new Relation();
        relation.setTransId(TransactionNames.CREATE_KEY.toLowerCase());
        relation.setTransPerformedby(LocalContext.getUserId());
        if (ObjectUtils.isNotEmpty(parentMenuRrn) && parentMenuRrn != 0) {
            relation.setFromRrn(parentMenuRrn);
        } else {
            relation.setFromRrn(this.getRootMenuRrn(LocalContext.getFacilityRrn()));
        }
        relation.setToRrn(menu.getInstanceRrn());
        relation.setLinkType(LinkTypeList.MENU_SUBMENU_KEY);

        Relation relationInfo = relationManager.getRelation(relation.getFromRrn(), relation.getToRrn(), relation.getLinkType());
        if (ObjectUtils.isNotEmpty(relationInfo)) {
            return;
        }
        Assert.state(!this.isNodeInTree(relation.getToRrn(), relation.getFromRrn()),
                       Errors.create().key(MessageIdList.MENU_FORBID_ADD).content("无法添加此菜单!").build());

        if (ObjectUtils.isEmpty(relationManager.getRelation(relation.getFromRrn(), relation.getToRrn(), relation.getLinkType()))) {
            relation.setSequenceNumber(0);
            relationManager.insertRelation(relation);
        }

        // add by liran 勾选Program类型菜单的所有父菜单勾选框的业务逻辑
        List<Map> roles = roleManager.getAllRoleInfo();
        for (Map role: roles) {
            Long roleRrn = MapUtils.getLong(role, "instanceRrn");
            List<Map> roleGrantMenuList = getRoleGrantMenu(MapUtils.getLong(role, "instanceRrn"));
            // 判断菜单是否被角色授权
            boolean isGrantUserMenu = false;
            for (Map roleGrantMenu: roleGrantMenuList) {
                if (MapUtils.getLong(roleGrantMenu, "torrn", 0L).equals(menuRrn)) {
                    isGrantUserMenu = true;
                    break;
                }
            }

            if (isGrantUserMenu) {
                ArrayList<Relation> relationList = new ArrayList<Relation>();
                List<Relation> relations = relationManager.getParentMenuRelationsByRrn(menuRrn);
                // 过滤老数据
                for (Relation tempRelation: relations) {
                    Menu tempMenu = menuManager.getMenu(tempRelation.getFromRrn());
                    if (!ObjectUtils.isEmpty(tempMenu)) {
                        relationList.add(tempRelation);
                    }
                }
                // 将被挪动菜单的所有父菜单都勾选上
                for (Relation menuNode: relationList) {
                    Relation parentRelation = new Relation();
                    parentRelation.setTransId(TransactionNames.CREATE_KEY.toLowerCase());
                    parentRelation.setLinkType(LinkTypeList.ROLE_MENU_KEY);
                    parentRelation.setFromRrn(roleRrn);
                    parentRelation.setAttributedata1(String.valueOf(menuNode.getFromRrn()));
                    parentRelation.setToRrn(menuNode.getToRrn());
                    parentRelation.setTransPerformedby(userId);
                    if (ObjectUtils.isEmpty(relationManager.getRelation(roleRrn, menuNode.getToRrn(), LinkTypeList.ROLE_MENU_KEY))) {
                        relationManager.insertRelation(parentRelation, DataBaseNames.REL_USER_PERMISSIONS, DataBaseNames.REL_USER_PERMISSIONS_H);
                    }
                }
                // 修改被挪动的Program类型菜单关联关系
                Relation sonRelation = new Relation();
                sonRelation.setLinkType(LinkTypeList.ROLE_MENU_KEY);
                sonRelation.setFromRrn(roleRrn);
                sonRelation.setTransPerformedby(userId);
                sonRelation.setTransId(TransactionNames.MODIFY_KEY.toLowerCase());
                sonRelation.setToRrn(menuRrn);
                sonRelation.setAttributedata1(String.valueOf(parentMenuRrn));
                sonRelation.setSequenceNumber(relationManager.getRelation(roleRrn, menuRrn, LinkTypeList.ROLE_MENU_KEY).getSequenceNumber());
                relationManager.updateRelation(sonRelation);
                relationManager.updateSpecificRelationTable(sonRelation, DataBaseNames.REL_USER_PERMISSIONS, DataBaseNames.REL_USER_PERMISSIONS_H, null);
            }
        }
    }

    @Override
    public Collection<Role> getUserRoleListWithGroupGrant(long userRrn) {
        List<Role> userRoles = userManager.getUserGrantRoles(userRrn);
        List<Role> userGroupRoles = userManager.getUserGroupGrantRoles(userRrn);
        userRoles.addAll(userGroupRoles);
        return CollectionUtils.removeDuplicate(userRoles);
    }

    @Override
    public List<Long> getUserGroupRrnsByUserRrn(Long userRrn) {
        return userGroupManager.getUserGroupRrnsByUserRrn(userRrn);
    }

    @Override
    public String getProcessRrnWithPermission(long userRrn) {
        return userGroupManager.getProcessRrnWithPermission(userRrn);
    }

    protected void process(NamedObject instance) {
        String action = instance.getTransId();

        if (action.equals(TransactionNames.CREATE_KEY.toLowerCase())) {
            long instanceRrn = 0;
            if (instance instanceof Label) {
                instanceRrn = labelManager.insertLabel((Label) instance);
            } else if (instance instanceof Menu) {
                instanceRrn = this.insertMenu((Menu) instance);
            }
            instance.setInstanceRrn(instanceRrn);
        } else if (action.equals(TransactionNames.DELETE_KEY.toLowerCase())) {
            if (instance instanceof Label) {
                labelManager.deleteLabel((Label) instance);
            } else if (instance instanceof Menu) {
                this.deleteMenu((Menu) instance);
            }
        } else if (action.equals(TransactionNames.MODIFY_KEY.toLowerCase())) {
            if (instance instanceof Label) {
                labelManager.updateLabel((Label)instance);
            } else if (instance instanceof Menu) {
                this.updateMenu((Menu) instance);
            }
        }

    }

    private Label processLabel(String labelId, String instanceId, String instanceDesc) {
        String labelName = StringUtils.trimToUpperCase(labelId);
        String autoLabelId = null;

        if (StringUtils.isNotBlank(labelName)) {
            autoLabelId = labelName;
        } else {
            if (StringUtils.isNotBlank(instanceId)) {
                autoLabelId = Constants.PREFIX.LBL + StringUtils.UNDERLINE + StringUtils.trimToUpperCase(StringUtils.substringAfter(instanceId, StringUtils.UNDERLINE));
            }
        }

        // 标签
        Label label = new Label(autoLabelId, namedObjectManager.getNamedSpace(LocalContext.getFacilityRrn(), ObjectList.LABEL_KEY),
                                ObjectList.LABEL_KEY);
        long labelRrn = namedObjectManager.getNamedObjectRrn(label);
        label.setTransPerformedby(LocalContext.getUserId());
        if (labelRrn <= 0) {
            label.setInstanceId(autoLabelId);
            label.setInstanceDesc(instanceDesc);
            label.setObjectType("NONE");
            label.setTransId(TransactionNames.CREATE_KEY.toLowerCase());
        } else {
            label.setInstanceRrn(labelRrn);
            label.setTransId(TransactionNames.MODIFY_KEY.toLowerCase());
        }
        this.process(label);

        return label;
    }

    private void processLabelItem(String instanceDesc, Label label) {
        LabelItem labelItem = new LabelItem();
        labelItem.setText(instanceDesc);
        labelItem.setLanguage(I18nUtils.getCurrentLanguage().toString());
        labelManager.updateLabelItem(label.getInstanceRrn(), labelItem);
    }

    private void processMenu(Menu menu, Label label, Long parentMenuRrn, String menuId) {
        // menu 处理
        long instanceRrn = menu.getInstanceRrn();
        if (instanceRrn <= 0) {
            menu.setInstanceId(menuId);
            menu.setTransId(TransactionNames.CREATE_KEY.toLowerCase());
        } else {
            menu.setTransId(TransactionNames.MODIFY_KEY.toLowerCase());
            this.deleteMenuRelation(instanceRrn, parentMenuRrn);
        }
        menu.setLabelRrn(label.getInstanceRrn());
        menu.setTransPerformedby(LocalContext.getUserId());
        this.process(menu);
        menu.setInstanceRrn(namedObjectManager.getNamedObjectRrn(menu));
        if (menu.getTransId().equals(TransactionNames.CREATE_KEY.toLowerCase()) && ObjectUtils.isNotEmpty(parentMenuRrn)) {
            boolean isExisted = this.isExistedRelation(parentMenuRrn, menu.getInstanceRrn());
            Assert.state(!isExisted, Errors.create().key(MessageIdList.MENU_ID_ALREADY_EXISTS).content(
                    "This menu id already exists in the parent menu.:{},You " + "can" + "'t add!")
                                          .args(menu.getInstanceId()).build());
        }
    }

    private void deleteMenuRelation(long menuRrn, Long parentMenuRrn) {
        List<Relation> results = relationManager.getRelationsUseToRrn(menuRrn, LinkTypeList.MENU_SUBMENU_KEY);

        for (Relation relation : results) {
            if (!relation.getFromRrn().equals(parentMenuRrn)) {
                relation.setTransId(TransactionNames.DELETE_KEY.toLowerCase());
                relationManager.deleteRelation(relation);
            }
        }
    }


}