com.glaf.base.modules.sys.service.mybatis.SysUserServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.glaf.base.modules.sys.service.mybatis.SysUserServiceImpl.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.glaf.base.modules.sys.service.mybatis;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.glaf.base.modules.sys.mapper.SysAccessMapper;
import com.glaf.base.modules.sys.mapper.SysApplicationMapper;
import com.glaf.base.modules.sys.mapper.SysDeptRoleMapper;
import com.glaf.base.modules.sys.mapper.SysFunctionMapper;
import com.glaf.base.modules.sys.mapper.SysPermissionMapper;
import com.glaf.base.modules.sys.mapper.SysRoleMapper;
import com.glaf.base.modules.sys.mapper.SysUserMapper;
import com.glaf.base.modules.sys.mapper.SysUserRoleMapper;
import com.glaf.base.modules.sys.model.SysApplication;
import com.glaf.base.modules.sys.model.SysDepartment;
import com.glaf.base.modules.sys.model.SysDeptRole;
import com.glaf.base.modules.sys.model.SysFunction;
import com.glaf.base.modules.sys.model.SysRole;
import com.glaf.base.modules.sys.model.SysUser;
import com.glaf.base.modules.sys.model.SysUserRole;
import com.glaf.base.modules.sys.model.UserRole;
import com.glaf.base.modules.sys.query.SysDeptRoleQuery;
import com.glaf.base.modules.sys.query.SysUserQuery;
import com.glaf.base.modules.sys.query.SysUserRoleQuery;
import com.glaf.base.modules.sys.query.UserRoleQuery;
import com.glaf.base.modules.sys.service.SysDepartmentService;
import com.glaf.base.modules.sys.service.SysUserService;
import com.glaf.base.modules.sys.util.SysUserJsonFactory;
import com.glaf.core.base.TableModel;
import com.glaf.core.cache.CacheFactory;
import com.glaf.core.config.SystemConfig;
import com.glaf.core.domain.Membership;
import com.glaf.core.id.IdGenerator;
import com.glaf.core.jdbc.DBConnectionFactory;
import com.glaf.core.service.ITableDataService;
import com.glaf.core.service.MembershipService;
import com.glaf.core.util.DBUtils;
import com.glaf.core.util.PageResult;
import com.glaf.core.util.StringTools;

@Service("sysUserService")
@Transactional(readOnly = true)
public class SysUserServiceImpl implements SysUserService {
    protected final static Log logger = LogFactory.getLog(SysUserServiceImpl.class);

    protected IdGenerator idGenerator;

    protected MembershipService membershipService;

    protected SqlSessionTemplate sqlSessionTemplate;

    protected SysAccessMapper sysAccessMapper;

    protected SysApplicationMapper sysApplicationMapper;

    protected SysDepartmentService sysDepartmentService;

    protected SysDeptRoleMapper sysDeptRoleMapper;

    protected SysFunctionMapper sysFunctionMapper;

    protected SysPermissionMapper sysPermissionMapper;

    protected SysRoleMapper sysRoleMapper;

    protected SysUserMapper sysUserMapper;

    protected SysUserRoleMapper sysUserRoleMapper;

    protected ITableDataService tableDataService;

    public SysUserServiceImpl() {

    }

    public int count(SysUserQuery query) {
        return sysUserMapper.getSysUserCount(query);
    }

    @Transactional
    public boolean create(SysUser bean) {
        bean.setCreateTime(new Date());
        bean.setLastChangePasswordDate(new Date());
        this.save(bean);
        return true;
    }

    /**
     * ???
     * @param roleId
     * @return
     */
    public List<SysUser> getSysUsersByRoleId(long roleId) {
        return sysUserMapper.getSysUsersByRoleId(roleId);
    }

    @Transactional
    public void createRoleUser(long roleId, String actorId) {
        SysUser user = this.findByAccount(actorId);
        SysDeptRoleQuery query = new SysDeptRoleQuery();
        query.deptId(user.getDeptId());
        query.sysRoleId(roleId);
        SysDeptRole deptRole = null;
        List<SysDeptRole> list = sysDeptRoleMapper.getSysDeptRoles(query);
        if (list != null && !list.isEmpty()) {
            deptRole = list.get(0);
        } else {
            deptRole = new SysDeptRole();
            deptRole.setId(idGenerator.nextId());
            deptRole.setDeptId(user.getDeptId());
            deptRole.setSysRoleId(roleId);
            deptRole.setCreateDate(new Date());
            deptRole.setGrade(0);
            sysDeptRoleMapper.insertSysDeptRole(deptRole);
        }

        TableModel table = new TableModel();
        table.setTableName("SYS_USER_ROLE");
        table.addLongColumn("ID", idGenerator.nextId());
        table.addIntegerColumn("AUTHORIZED", 0);
        table.addLongColumn("ROLEID", deptRole.getId());
        table.addLongColumn("USERID", user.getId());
        tableDataService.insertTableData(table);

        TableModel table2 = new TableModel();
        table2.setTableName("SYS_MEMBERSHIP");
        table2.addLongColumn("ID_", idGenerator.nextId());
        table2.addStringColumn("ACTORID_", user.getAccount());
        table2.addLongColumn("ROLEID_", deptRole.getId());
        table2.addLongColumn("NODEID_", user.getDeptId());
        table2.addStringColumn("TYPE_", "UserRole");
        tableDataService.insertTableData(table2);

    }

    @Transactional
    public boolean delete(long id) {
        return false;
    }

    @Transactional
    public boolean delete(SysUser bean) {
        return false;
    }

    @Transactional
    public boolean deleteAll(long[] ids) {
        return false;
    }

    @Transactional
    public void deleteById(Long id) {
        if (id != null) {
            sysUserMapper.deleteSysUserById(id);
        }
    }

    @Transactional
    public void deleteByIds(List<Long> rowIds) {
        if (rowIds != null && !rowIds.isEmpty()) {
            SysUserQuery query = new SysUserQuery();
            query.rowIds(rowIds);
            sysUserMapper.deleteSysUsers(query);
        }
    }

    @Transactional
    public void deleteRoleUser(long roleId, String actorId) {
        SysUser user = this.findByAccount(actorId);
        SysDeptRoleQuery query = new SysDeptRoleQuery();
        query.deptId(user.getDeptId());
        query.sysRoleId(roleId);
        List<SysDeptRole> list = sysDeptRoleMapper.getSysDeptRoles(query);
        if (list != null && !list.isEmpty()) {
            SysDeptRole deptRole = list.get(0);

            TableModel table = new TableModel();
            table.setTableName("SYS_USER_ROLE");
            table.addIntegerColumn("AUTHORIZED", 0);
            table.addLongColumn("ROLEID", deptRole.getId());
            table.addLongColumn("USERID", user.getId());
            tableDataService.deleteTableData(table);

            TableModel table2 = new TableModel();
            table2.setTableName("SYS_MEMBERSHIP");
            table2.addStringColumn("ACTORID_", user.getAccount());
            table2.addLongColumn("ROLEID_", deptRole.getId());
            table2.addLongColumn("NODEID_", user.getDeptId());
            tableDataService.deleteTableData(table2);
        }

    }

    /**
     * 
     * 
     * @param deptRole
     * @param userIds
     */
    @Transactional
    public void deleteRoleUsers(SysDeptRole deptRole, long[] userIds) {
        for (int i = 0; i < userIds.length; i++) {
            SysUser user = this.findById(userIds[i]);
            if (user != null) {
                logger.info(user.getName());
                TableModel table = new TableModel();
                table.setTableName("SYS_USER_ROLE");
                table.addIntegerColumn("AUTHORIZED", 0);
                table.addLongColumn("ROLEID", deptRole.getId());
                table.addLongColumn("USERID", user.getId());
                tableDataService.deleteTableData(table);

                TableModel table2 = new TableModel();
                table2.setTableName("SYS_MEMBERSHIP");
                table2.addStringColumn("ACTORID_", user.getAccount());
                table2.addLongColumn("ROLEID_", deptRole.getSysRoleId());
                table2.addLongColumn("NODEID_", deptRole.getDeptId());
                tableDataService.deleteTableData(table2);
            }
        }
    }

    public SysUser findByAccount(String account) {
        SysUser user = null;
        if (StringUtils.equals(DBUtils.ORACLE, DBConnectionFactory.getDatabaseType())) {
            account = account.toLowerCase();
            user = sysUserMapper.getSysUserByLowerCaseAccount(account);
        } else if (StringUtils.equals(DBUtils.POSTGRESQL, DBConnectionFactory.getDatabaseType())) {
            account = account.toLowerCase();
            user = sysUserMapper.getSysUserByLowerCaseAccount(account);
        } else {
            user = sysUserMapper.getSysUserByAccount(account);
        }
        if (user == null) {
            try {
                account = account.toLowerCase();
                user = sysUserMapper.getSysUserByLowerCaseAccount(account);
            } catch (Exception ex) {
            }
        }
        if (user != null && user.getDeptId() > 0) {
            user.setDepartment(sysDepartmentService.findById(user.getDeptId()));
        }
        return user;
    }

    public SysUser findByAccountWithAll(String account) {
        SysUser user = null;
        if (StringUtils.equals(DBUtils.ORACLE, DBConnectionFactory.getDatabaseType())) {
            account = account.toLowerCase();
            user = sysUserMapper.getSysUserByLowerCaseAccount(account);
        } else if (StringUtils.equals(DBUtils.POSTGRESQL, DBConnectionFactory.getDatabaseType())) {
            account = account.toLowerCase();
            user = sysUserMapper.getSysUserByLowerCaseAccount(account);
        } else {
            user = sysUserMapper.getSysUserByAccount(account);
        }
        if (user == null) {
            try {
                account = account.toLowerCase();
                user = sysUserMapper.getSysUserByLowerCaseAccount(account);
            } catch (Exception ex) {
            }
        }
        if (user != null) {
            user.setDepartment(sysDepartmentService.findById(user.getDeptId()));
            List<SysUserRole> userRoles = sysUserRoleMapper.getSysUserRolesByUserId(user.getId());
            user.getUserRoles().addAll(userRoles);
            List<SysDeptRole> deptRoles = sysDeptRoleMapper.getSysDeptRolesByUserId(user.getId());
            user.getRoles().addAll(deptRoles);
            List<SysApplication> apps = sysApplicationMapper.getSysApplicationByUserId(user.getId());
            user.getApps().addAll(apps);
            List<SysFunction> funs = sysFunctionMapper.getSysFunctionByUserId(user.getId());
            user.getFunctions().addAll(funs);
            return user;
        }

        return null;
    }

    public SysUser findById(long id) {
        SysUser user = this.getSysUser(id);
        if (user != null) {
            user.setDepartment(sysDepartmentService.findById(user.getDeptId()));
        }
        return user;
    }

    public SysUser findByMail(String mail) {
        SysUser user = sysUserMapper.getSysUserByMail(mail);
        return user;
    }

    public SysUser findByMobile(String mobile) {
        SysUser user = sysUserMapper.getSysUserByMobile(mobile);
        return user;
    }

    public int getCountDeptUsers(String searchWord) {
        SysUserQuery query = new SysUserQuery();
        query.searchWord(searchWord);
        return sysUserMapper.getCountDeptUsers(query);
    }

    protected Map<Long, SysDepartment> getDepartmentMap() {
        Map<Long, SysDepartment> deptMap = new java.util.HashMap<Long, SysDepartment>();
        List<SysDepartment> depts = sysDepartmentService.getSysDepartmentList();
        if (depts != null && !depts.isEmpty()) {
            for (SysDepartment dept : depts) {
                deptMap.put(dept.getId(), dept);
            }
        }
        return deptMap;
    }

    /**
     * ??
     * 
     * @param searchWord
     * 
     * @param pageNo
     * 
     * @param pageSize
     * 
     * @return
     */
    public PageResult getDeptUserList(String searchWord, int pageNo, int pageSize) {
        SysUserQuery query = new SysUserQuery();
        query.searchWord(searchWord);
        // 
        PageResult pager = new PageResult();
        int count = sysUserMapper.getCountDeptUsers(query);

        if (count == 0) {// 
            pager.setPageSize(pageSize);
            return pager;
        }

        int start = pageSize * (pageNo - 1);
        RowBounds rowBounds = new RowBounds(start, pageSize);
        List<SysUser> list = sqlSessionTemplate.selectList("getDeptUsers", query, rowBounds);
        this.initUserDepartments(list);
        pager.setResults(list);
        pager.setPageSize(pageSize);
        pager.setCurrentPageNo(pageNo);
        pager.setTotalRecordCount(count);

        return pager;
    }

    public List<SysUser> getDeptUsers(String searchWord, int pageNo, int pageSize) {
        SysUserQuery query = new SysUserQuery();
        query.searchWord(searchWord);
        int start = pageSize * (pageNo - 1);
        RowBounds rowBounds = new RowBounds(start, pageSize);
        List<SysUser> list = sqlSessionTemplate.selectList("getDeptUsers", query, rowBounds);
        this.initUserDepartments(list);
        return list;
    }

    public List<UserRole> getRoleUserViews(UserRoleQuery query) {
        return sysUserMapper.getRoleUserViews(query);
    }

    public List<SysUser> getSuperiors(String account) {
        List<SysUser> superiors = new java.util.ArrayList<SysUser>();
        SysUser bean = this.findByAccount(account);
        if (bean != null && bean.getSuperiorIds() != null) {
            List<String> superiorIds = StringTools.split(bean.getSuperiorIds());
            if (superiorIds != null && !superiorIds.isEmpty()) {
                for (String superiorId : superiorIds) {
                    SysUser user = this.findByAccount(superiorId);
                    if (user != null && user.getBlocked() == 0) {
                        superiors.add(user);
                    }
                }
            }
        }
        return superiors;
    }

    public List<SysUser> getSupplierUser(String supplierNo) {
        SysUserQuery query = new SysUserQuery();
        query.account(supplierNo);
        List<SysUser> users = this.list(query);
        this.initUserDepartments(users);
        return users;
    }

    public SysUser getSysUser(Long id) {
        if (id == null) {
            return null;
        }
        String cacheKey = "sys_user_" + id;
        if (SystemConfig.getBoolean("use_query_cache") && CacheFactory.getString(cacheKey) != null) {
            String text = CacheFactory.getString(cacheKey);
            JSONObject json = JSON.parseObject(text);
            return SysUserJsonFactory.jsonToObject(json);
        }

        SysUser sysUser = sysUserMapper.getSysUserById(id);
        if (sysUser != null && SystemConfig.getBoolean("use_query_cache")) {
            JSONObject json = sysUser.toJsonObject();
            CacheFactory.put(cacheKey, json.toJSONString());
        }
        return sysUser;
    }

    public int getSysUserCountByQueryCriteria(SysUserQuery query) {
        return sysUserMapper.getSysUserCount(query);
    }

    public List<SysUser> getSysUserList() {
        SysUserQuery query = new SysUserQuery();
        return this.list(query);
    }

    public List<SysUser> getSysUserList(long deptId) {
        SysUserQuery query = new SysUserQuery();
        query.deptId(Long.valueOf(deptId));
        return this.list(query);
    }

    public PageResult getSysUserList(long deptId, int pageNo, int pageSize) {
        // 
        PageResult pager = new PageResult();
        SysUserQuery query = new SysUserQuery();
        query.deptId(Long.valueOf(deptId));

        int count = this.count(query);
        if (count == 0) {// 
            pager.setPageSize(pageSize);
            return pager;
        }
        query.setOrderBy(" E.ID asc");

        int start = pageSize * (pageNo - 1);
        List<SysUser> list = this.getSysUsersByQueryCriteria(start, pageSize, query);
        this.initUserDepartments(list);
        pager.setResults(list);
        pager.setPageSize(pageSize);
        pager.setCurrentPageNo(pageNo);
        pager.setTotalRecordCount(count);

        return pager;
    }

    public PageResult getSysUserList(long deptId, String fullName, int pageNo, int pageSize) {
        // 
        PageResult pager = new PageResult();
        SysUserQuery query = new SysUserQuery();
        query.deptId(Long.valueOf(deptId));
        if (fullName != null && fullName.trim().length() > 0) {
            query.nameLike(fullName);
        }
        int count = this.count(query);
        if (count == 0) {// 
            pager.setPageSize(pageSize);
            return pager;
        }
        query.setOrderBy(" E.ID asc");

        int start = pageSize * (pageNo - 1);
        List<SysUser> list = this.getSysUsersByQueryCriteria(start, pageSize, query);
        this.initUserDepartments(list);
        pager.setResults(list);
        pager.setPageSize(pageSize);
        pager.setCurrentPageNo(pageNo);
        pager.setTotalRecordCount(count);

        return pager;
    }

    public PageResult getSysUserList(long deptId, String userName, String account, int pageNo, int pageSize) {
        // 
        PageResult pager = new PageResult();
        SysUserQuery query = new SysUserQuery();
        query.deptId(Long.valueOf(deptId));
        int count = this.count(query);
        if (count == 0) {// 
            pager.setPageSize(pageSize);
            return pager;
        }
        query.setOrderBy(" E.ID asc, E.DEPTID asc ");

        int start = pageSize * (pageNo - 1);
        List<SysUser> list = this.getSysUsersByQueryCriteria(start, pageSize, query);
        this.initUserDepartments(list);
        pager.setResults(list);
        pager.setPageSize(pageSize);
        pager.setCurrentPageNo(pageNo);
        pager.setTotalRecordCount(count);

        return pager;
    }

    public String getSysUserPasswordByAccount(String account) {
        return sysUserMapper.getSysUserPasswordByAccount(account);
    }

    /**
     * ????
     * 
     * @param appId
     * @return
     */
    public List<SysUser> getSysUsersByAppId(Long appId) {
        return sysUserMapper.getSysUsersByAppId(appId);
    }

    public List<SysUser> getSysUsersByDeptRole(Long deptId, String roleCode) {
        if (roleCode == null) {
            return null;
        }
        SysDeptRoleQuery query = new SysDeptRoleQuery();
        query.setRoleCode(roleCode);
        query.setDeptId(deptId);
        return sysUserMapper.getSysDeptRoleUsers(query);
    }

    public List<SysUser> getSysUsersByDeptRoleId(Long deptRoleId) {
        if (deptRoleId == null || deptRoleId == 0) {
            return null;
        }
        SysDeptRoleQuery query = new SysDeptRoleQuery();
        query.setDeptRoleId(deptRoleId);
        return sysUserMapper.getSysDeptRoleUsers(query);
    }

    public List<SysUser> getSysUsersByQueryCriteria(int start, int pageSize, SysUserQuery query) {
        RowBounds rowBounds = new RowBounds(start, pageSize);
        List<SysUser> rows = sqlSessionTemplate.selectList("getSysUsers", query, rowBounds);
        this.initUserDepartments(rows);
        return rows;
    }

    /**
     * ???
     * 
     * @param roleCode
     * @return
     */
    public List<SysUser> getSysUsersByRoleCode(String roleCode) {
        if (roleCode == null) {
            return null;
        }
        SysDeptRoleQuery query = new SysDeptRoleQuery();
        query.setRoleCode(roleCode);
        return sysUserMapper.getSysDeptRoleUsers(query);
    }

    public List<SysUser> getSysUserWithDeptList() {
        SysUserQuery query = new SysUserQuery();
        List<SysUser> users = this.list(query);
        if (users != null && !users.isEmpty()) {
            this.initUserDepartments(users);
        }
        return users;
    }

    /**
     * ??
     * 
     * @return
     */
    public Map<String, String> getUserMap() {
        SysUserQuery query = new SysUserQuery();
        query.blocked(0);
        List<SysUser> users = this.list(query);
        Map<String, String> userMap = new LinkedHashMap<String, String>();
        for (SysUser user : users) {
            userMap.put(user.getActorId(), user.getName());
        }
        return userMap;
    }

    public SysUser getUserPrivileges(SysUser user) {
        SysUser bean = user;
        try {
            bean.setRoles(getUserRoles(bean));
            Iterator<SysDeptRole> roles = bean.getRoles().iterator();
            while (roles.hasNext()) {
                SysDeptRole role = (SysDeptRole) roles.next();
                List<SysApplication> apps = sysApplicationMapper.getSysApplicationByRoleId(role.getId());
                List<SysFunction> functions = sysFunctionMapper.getSysFunctionByRoleId(role.getId());
                bean.getFunctions().addAll(functions);
                bean.getApps().addAll(apps);
            }
        } catch (Exception e) {
            logger.error(e);
        }
        return bean;
    }

    /**
     * ??
     * 
     * @param actorIds
     * @return
     */
    public List<SysRole> getUserRoles(List<String> actorIds) {
        List<SysRole> roles = new java.util.ArrayList<SysRole>();
        if (actorIds != null && !actorIds.isEmpty()) {
            for (String actorId : actorIds) {
                List<SysRole> list = sysRoleMapper.getSysRolesOfUser(actorId);
                if (list != null && !list.isEmpty()) {
                    for (SysRole role : list) {
                        if (!roles.contains(role)) {
                            roles.add(role);
                        }
                    }
                }
            }
        }
        return roles;
    }

    public Set<SysDeptRole> getUserRoles(SysUser user) {
        Set<SysDeptRole> deptRoles = new HashSet<SysDeptRole>();
        SysUserRoleQuery query = new SysUserRoleQuery();
        query.setUserId(user.getId());
        List<SysUserRole> userRoles = sysUserRoleMapper.getSysUserRoles(query);
        if (userRoles != null && !userRoles.isEmpty()) {
            for (SysUserRole userRole : userRoles) {
                if (userRole.getDeptRoleId() > 0) {
                    SysDeptRole deptRole = sysDeptRoleMapper.getSysDeptRoleById(userRole.getDeptRoleId());
                    deptRoles.add(deptRole);
                }
            }
        }
        return deptRoles;
    }

    protected void initUserDepartments(List<SysUser> users) {
        if (users != null && !users.isEmpty()) {
            List<SysDepartment> depts = sysDepartmentService.getSysDepartmentList();
            Map<Long, SysDepartment> deptMap = new java.util.HashMap<Long, SysDepartment>();
            if (depts != null && !depts.isEmpty()) {
                for (SysDepartment dept : depts) {
                    deptMap.put(dept.getId(), dept);
                }
            }
            for (SysUser user : users) {
                user.setDepartment(deptMap.get(user.getDeptId()));
            }
        }
    }

    public List<SysUser> list(SysUserQuery query) {
        query.ensureInitialized();
        List<SysUser> list = sysUserMapper.getSysUsers(query);
        this.initUserDepartments(list);
        return list;
    }

    @Transactional
    public void save(SysUser sysUser) {
        if (sysUser.getId() == 0) {
            sysUser.setId(idGenerator.nextId());
            sysUser.setCreateTime(new Date());
            sysUserMapper.insertSysUser(sysUser);
        } else {
            sysUser.setUpdateDate(new Date());
            sysUserMapper.updateSysUser(sysUser);
            String cacheKey = "sys_user_" + sysUser.getId();
            CacheFactory.remove(cacheKey);
        }

        TableModel table = new TableModel();
        table.setTableName("SYS_MEMBERSHIP");
        table.addStringColumn("ACTORID_", sysUser.getAccount());
        table.addStringColumn("TYPE_", "Superior");
        tableDataService.deleteTableData(table);

        if (StringUtils.isNotEmpty(sysUser.getSuperiorIds())) {
            List<String> superiorIds = StringTools.split(sysUser.getSuperiorIds());
            if (superiorIds != null && !superiorIds.isEmpty()) {
                for (String superiorId : superiorIds) {
                    if (!StringUtils.equals(superiorId, sysUser.getAccount())) {
                        Membership membership = new Membership();
                        membership.setActorId(sysUser.getAccount());
                        membership.setSuperiorId(superiorId);
                        membership.setModifyBy(sysUser.getUpdateBy());
                        membership.setModifyDate(new java.util.Date());
                        membership.setType("Superior");
                        membership.setObjectId("Superior");
                        membership.setObjectValue(superiorId);
                        membershipService.save(membership);
                    }
                }
            }
        }
    }

    @javax.annotation.Resource
    public void setIdGenerator(IdGenerator idGenerator) {
        this.idGenerator = idGenerator;
    }

    @javax.annotation.Resource
    public void setMembershipService(MembershipService membershipService) {
        this.membershipService = membershipService;
    }

    @javax.annotation.Resource
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    @javax.annotation.Resource
    public void setSysAccessMapper(SysAccessMapper sysAccessMapper) {
        this.sysAccessMapper = sysAccessMapper;
    }

    @javax.annotation.Resource
    public void setSysApplicationMapper(SysApplicationMapper sysApplicationMapper) {
        this.sysApplicationMapper = sysApplicationMapper;
    }

    @javax.annotation.Resource
    public void setSysDepartmentService(SysDepartmentService sysDepartmentService) {
        this.sysDepartmentService = sysDepartmentService;
    }

    @javax.annotation.Resource
    public void setSysDeptRoleMapper(SysDeptRoleMapper sysDeptRoleMapper) {
        this.sysDeptRoleMapper = sysDeptRoleMapper;
    }

    @javax.annotation.Resource
    public void setSysFunctionMapper(SysFunctionMapper sysFunctionMapper) {
        this.sysFunctionMapper = sysFunctionMapper;
    }

    @javax.annotation.Resource
    public void setSysPermissionMapper(SysPermissionMapper sysPermissionMapper) {
        this.sysPermissionMapper = sysPermissionMapper;
    }

    @javax.annotation.Resource
    public void setSysRoleMapper(SysRoleMapper sysRoleMapper) {
        this.sysRoleMapper = sysRoleMapper;
    }

    @javax.annotation.Resource
    public void setSysUserMapper(SysUserMapper sysUserMapper) {
        this.sysUserMapper = sysUserMapper;
    }

    @javax.annotation.Resource
    public void setSysUserRoleMapper(SysUserRoleMapper sysUserRoleMapper) {
        this.sysUserRoleMapper = sysUserRoleMapper;
    }

    @javax.annotation.Resource
    public void setTableDataService(ITableDataService tableDataService) {
        this.tableDataService = tableDataService;
    }

    @Transactional
    public boolean update(SysUser sysUser) {
        sysUser.setUpdateDate(new Date());
        sysUserMapper.updateSysUser(sysUser);
        TableModel table = new TableModel();
        table.setTableName("SYS_MEMBERSHIP");
        table.addStringColumn("ACTORID_", sysUser.getAccount());
        table.addStringColumn("TYPE_", "Superior");
        tableDataService.deleteTableData(table);

        if (StringUtils.isNotEmpty(sysUser.getSuperiorIds())) {
            List<String> superiorIds = StringTools.split(sysUser.getSuperiorIds());
            if (superiorIds != null && !superiorIds.isEmpty()) {
                for (String superiorId : superiorIds) {
                    if (!StringUtils.equals(superiorId, sysUser.getAccount())) {
                        Membership membership = new Membership();
                        membership.setActorId(sysUser.getAccount());
                        membership.setSuperiorId(superiorId);
                        membership.setModifyBy(sysUser.getUpdateBy());
                        membership.setModifyDate(new java.util.Date());
                        membership.setType("Superior");
                        membership.setObjectId("Superior");
                        membership.setObjectValue(superiorId);
                        membershipService.save(membership);
                    }
                }
            }
        }
        String cacheKey = "sys_user_" + sysUser.getId();
        CacheFactory.remove(cacheKey);
        return true;
    }

    @Transactional
    public boolean updateRole(SysUser user, Set<SysDeptRole> delRoles, Set<SysDeptRole> newRoles) {
        // ???
        List<SysUserRole> userRoles = sysUserRoleMapper.getSysUserRolesByUserId(user.getId());
        if (userRoles != null && !userRoles.isEmpty()) {
            for (SysUserRole userRole : userRoles) {
                TableModel table = new TableModel();
                table.setTableName("SYS_USER_ROLE");
                table.addLongColumn("userId", user.getId());
                table.addLongColumn("roleId", userRole.getDeptRoleId());
                tableDataService.deleteTableData(table);
            }
        }

        List<Membership> memberships = new java.util.ArrayList<Membership>();

        // ??
        if (newRoles != null && !newRoles.isEmpty()) {
            Iterator<SysDeptRole> iter = newRoles.iterator();
            while (iter.hasNext()) {
                SysDeptRole deptRole = iter.next();
                SysUserRole userRole = new SysUserRole();
                userRole.setId(idGenerator.nextId());
                userRole.setUserId(user.getId());
                userRole.setDeptRoleId(deptRole.getId());
                userRole.setCreateDate(new Date());
                userRole.setCreateBy(user.getUpdateBy());
                sysUserRoleMapper.insertSysUserRole(userRole);

                Membership membership = new Membership();
                membership.setActorId(user.getAccount());
                membership.setModifyBy(user.getUpdateBy());
                membership.setModifyDate(new java.util.Date());
                membership.setNodeId(deptRole.getDeptId());
                membership.setRoleId(deptRole.getSysRoleId());
                membership.setObjectId("SYS_USER_ROLE");
                membership.setObjectValue(String.valueOf(userRole.getId()));
                memberships.add(membership);
            }
        }

        membershipService.saveMemberships(user.getDeptId(), "UserRole", memberships);

        return true;
    }

    @Transactional
    public boolean updateUser(SysUser sysUser) {
        sysUserMapper.updateSysUser(sysUser);
        String cacheKey = "sys_user_" + sysUser.getId();
        CacheFactory.remove(cacheKey);
        return true;
    }

}