成员管理:分配角色、分配部门、分配部门界面查询、角色角色界面查询等接口添加
已修改13个文件
已添加1个文件
526 ■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-base/pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/PltWebConstant.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/BaseResult.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/pom.xml
@@ -56,6 +56,23 @@
            <artifactId>transmittable-thread-local</artifactId>
            <version>2.12.6</version>
        </dependency>
        <dependency>
            <groupId>com.vci.common</groupId>
            <artifactId>plt-common</artifactId>
            <version>1.0.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.vci.corba</groupId>
            <artifactId>plt-slice</artifactId>
            <version>1.0.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.zeroc</groupId>
            <artifactId>icegridgui</artifactId>
            <version>1.0.RELEASE</version>
        </dependency>
    </dependencies>
</project>
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/PltWebConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
package com.vci.starter.web.constant;
/**
 * å¸¸ç”¨ç³»ç»Ÿå¸¸é‡
 * @author ludc
 * @date 2024/6/26 16:09
 */
public interface PltWebConstant {
    /**
     * ç¼–码
     */
    String UTF_8 = "UTF-8";
    /**
     * contentType
     */
    String CONTENT_TYPE_NAME = "Content-type";
    /**
     * JSON èµ„源
     */
    String CONTENT_TYPE = "application/json;charset=utf-8";
    /**
     * ä¸Šä¸‹æ–‡é”®å€¼
     */
    String CONTEXT_KEY = "bladeContext";
    /**
     * mdc request id key
     */
    String MDC_REQUEST_ID_KEY = "requestId";
    /**
     * mdc account id key
     */
    String MDC_ACCOUNT_ID_KEY = "accountId";
    /**
     * mdc tenant id key
     */
    String MDC_TENANT_ID_KEY = "tenantId";
    /**
     * è§’色前缀
     */
    String SECURITY_ROLE_PREFIX = "ROLE_";
    /**
     * ä¸»é”®å­—段名
     */
    String DB_PRIMARY_KEY = "id";
    /**
     * ä¸»é”®å­—段get方法
     */
    String DB_PRIMARY_KEY_METHOD = "getId";
    /**
     * ç§Ÿæˆ·å­—段名
     */
    String DB_TENANT_KEY = "tenantId";
    /**
     * ç§Ÿæˆ·å­—段get方法
     */
    String DB_TENANT_KEY_GET_METHOD = "getTenantId";
    /**
     * ç§Ÿæˆ·å­—段set方法
     */
    String DB_TENANT_KEY_SET_METHOD = "setTenantId";
    /**
     * ä¸šåŠ¡çŠ¶æ€[1:正常]
     */
    int DB_STATUS_NORMAL = 1;
    /**
     * åˆ é™¤çŠ¶æ€[0:正常,1:删除]
     */
    int DB_NOT_DELETED = 0;
    int DB_IS_DELETED = 1;
    /**
     * ç”¨æˆ·é”å®šçŠ¶æ€
     */
    int DB_ADMIN_NON_LOCKED = 0;
    int DB_ADMIN_LOCKED = 1;
    /**
     * é¡¶çº§çˆ¶èŠ‚ç‚¹id
     */
    Long TOP_PARENT_ID = 0L;
    /**
     * é¡¶çº§çˆ¶èŠ‚ç‚¹åç§°
     */
    String TOP_PARENT_NAME = "顶级";
    /**
     * ç®¡ç†å‘˜å¯¹åº”的租户ID
     */
    String ADMIN_TENANT_ID = "000000";
    /**
     * æ—¥å¿—默认状态
     */
    String LOG_NORMAL_TYPE = "1";
    /**
     * é»˜è®¤ä¸ºç©ºæ¶ˆæ¯
     */
    String DEFAULT_NULL_MESSAGE = "暂无承载数据";
    /**
     * é»˜è®¤æˆåŠŸæ¶ˆæ¯
     */
    String DEFAULT_SUCCESS_MESSAGE = "操作成功";
    /**
     * é»˜è®¤å¤±è´¥æ¶ˆæ¯
     */
    String DEFAULT_FAILURE_MESSAGE = "操作失败";
    /**
     * é»˜è®¤æœªæŽˆæƒæ¶ˆæ¯
     */
    String DEFAULT_UNAUTHORIZED_MESSAGE = "签名认证失败";
}
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/BaseResult.java
@@ -1,10 +1,13 @@
package com.vci.starter.web.pagemodel;
import com.vci.starter.web.constant.PltWebConstant;
import com.vci.starter.web.enumpck.ResultCodeEnum;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
 * ç»Ÿä¸€çš„æ•°æ®è¿”回对象,保证feign、restTemplate或者其他rest请求客户端可以统一处理
@@ -356,7 +359,51 @@
        return baseResult;
    }
    /**
     * è¿”回list
     *
     * @param data æ•°æ®
     * @param <T>  T æ³›åž‹æ ‡è®°
     * @return R
     */
    public static <T> BaseResult<T> dataList(T data) {
        return dataList(data, PltWebConstant.DEFAULT_SUCCESS_MESSAGE);
    }
    /**
     * è¿”回list
     *
     * @param data æ•°æ®
     * @param msg  æ¶ˆæ¯
     * @param <T>  T æ³›åž‹æ ‡è®°
     * @return R
     */
    public static <T> BaseResult<T> dataList(T data, String msg) {
        return dataList(HttpServletResponse.SC_OK, data, msg);
    }
    /**
     * è¿”回list
     *
     * @param code çŠ¶æ€ç 
     * @param data æ•°æ®
     * @param msg  æ¶ˆæ¯
     * @param <T>  T æ³›åž‹æ ‡è®°
     * @return R
     */
    public static <T> BaseResult<T> dataList(int code, T data, String msg) {
        return new BaseResult<>(code, data, data == null ? PltWebConstant.DEFAULT_NULL_MESSAGE : msg);
    }
    private BaseResult(int code, T data, String msg) {
        this.code = code;
        this.data = (Collection<T>) data;
        this.msg = msg;
        this.success = ResultCodeEnum.SUCCESS.code == code;
    }
    public BaseResult() {
    }
    /**
     * æ ¹æ®åˆ—表获取统一数据对象
@@ -370,7 +417,6 @@
        baseResult.setTreeData(treeList);
        return baseResult;
    }
    @Override
    public String toString() {
@@ -390,4 +436,5 @@
                ", treeData=" + treeData +
                '}';
    }
}
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
@@ -3,6 +3,8 @@
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.vci.common.exception.VciExceptionTool;
import com.vci.corba.common.PLException;
import com.vci.starter.web.annotation.Id;
import com.vci.starter.web.annotation.VciBtmType;
import com.vci.starter.web.annotation.VciLinkType;
@@ -48,6 +50,23 @@
public class VciBaseUtil {
    /**
     * èŽ·å–å¼‚å¸¸ä¿¡æ¯,因为抛出的异常不同,获取错误信息的方式存在差异所以无法统一获取
     * åŽç»­æœ‰å…¶ä»–异常需要获取,自行添加处理逻辑,
     * @param e
     * @return
     */
    public static String getExceptionMessage(Exception e){
        String exceptionStr = VciExceptionTool.getExceptionStr(e);
        if(exceptionStr.contains("VciBaseException")){
            return e.getMessage();
        }else if(exceptionStr.contains("PLException")){
            return Arrays.stream(((PLException) e).messages).collect(Collectors.joining("\n"));
        }else {
            return e.getMessage();
        }
    }
    /**
     * æ—¥å¿—对象
     */
    private static Logger log = LoggerFactory.getLogger(VciBaseUtil.class);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java
@@ -1,6 +1,7 @@
package com.vci.frameworkcore.compatibility;
import com.vci.corba.common.PLException;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.DataGrid;
@@ -115,11 +116,11 @@
    DataGrid refTreeGridDept(TreeQueryObject treeQueryObject);
    /**
     * ä¿å­˜éƒ¨é—¨è§’色关联信息,带查重功能
     * @param userId ç”¨æˆ·id
     * @param deptIds éƒ¨é—¨oid
     * ä¿å­˜éƒ¨é—¨è§’色关联信息,带查重功能,多对多保存
     * @param userOIds ç”¨æˆ·id
     * @param deptId éƒ¨é—¨oid
     * @return
     */
    boolean saveUserDepts(String userId, List<String> deptIds) throws PLException;
    boolean saveUsersDept(String[] userOIds, String deptId) throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java
@@ -1,5 +1,6 @@
package com.vci.frameworkcore.compatibility;
import com.vci.corba.common.PLException;
import com.vci.frameworkcore.pagemodel.SmRoleVO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.DataGrid;
@@ -65,7 +66,7 @@
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序对象,老平台不支持使用角色编号来排序
     * @return è§’色的显示对象
     */
    DataGrid<SmRoleVO>  gridRoleByUserOid(String userOid, Map<String, String> queryMap, PageHelper pageHelper);
    DataGrid<SmRoleVO> gridRoleByUserOid(String userOid, Map<String, String> queryMap, PageHelper pageHelper);
    /**
     * èŽ·å–æœªå…³è”æŸä¸ªç”¨æˆ·çš„è§’è‰²
@@ -150,4 +151,13 @@
     * @throws VciBaseException å‚数为空的时候会抛出异常
     */
    List<Tree> refTreeRoles(TreeQueryObject treeQueryObject) throws VciBaseException;
    /**
     * è¯¥æ–¹æ³•只支持一次只允许单个用户分配多个角色,一对多
     * @param userOid
     * @param roleIds
     * @return
     */
    boolean saveRights(String userOid, String[] roleIds) throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java
@@ -280,6 +280,8 @@
     * @param flag
     * @return
     */
    boolean disableOrEnableUsers(String[] ids,boolean flag) throws PLException;
    boolean stopUsers(String[] ids,boolean flag) throws PLException;
    void downloadImportTemplate();
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
@@ -424,37 +424,40 @@
    /**
     * ä¿å­˜éƒ¨é—¨è§’色关联信息,带查重功能
     * @param userId ç”¨æˆ·id
     * @param deptIds éƒ¨é—¨id
     * @param userOIds ç”¨æˆ·id
     * @param deptId éƒ¨é—¨id
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveUserDepts(String userId, List<String> deptIds) throws PLException {
        if(Func.isBlank(userId) || Func.isEmpty(deptIds)){
    public boolean saveUsersDept(String[] userOIds, String deptId) throws PLException {
        if(Func.isEmpty(userOIds) || Func.isBlank(deptId)){
            return false;
        }
        List<String> repeatDeptOidList = new ArrayList<>();
        //先进性查重处理
        List<String> repeatUserOidList = new ArrayList<>();
        //循环进行查重,避免in大于1000
        WebUtil.switchCollectionForOracleIn(deptIds).stream().forEach(deptoids->{
            String sql = "select pluseruid,pldeptuid from pluserdept where pluseruid = " + userId
                    + " and " + "pldeptuid in ("+WebUtil.toInSql(deptoids.toArray(new String[0]))+")";
        WebUtil.switchCollectionForOracleIn(Arrays.asList(userOIds)).stream().forEach(userOId->{
            String sql = "select pluseruid,pldeptuid from pluserdept where pldeptuid = '" + deptId
                    + "' and " + "pluseruid in ("+WebUtil.toInSql(userOId.toArray(new String[0]))+")";
            List<BusinessObject> cbos = boService.queryBySql(sql, null);
            if(!CollectionUtils.isEmpty(cbos)){
                cbos.stream().forEach(cbo->{
                    repeatDeptOidList.add(ObjectTool.getNewBOAttributeValue(cbo,"pldeptuid"));
                    repeatUserOidList.add(ObjectTool.getNewBOAttributeValue(cbo,"pluseruid"));
                });
            }
        });
        //从即将要执行保存的部门oid中移除当前用户已经存在关联关系的的部门oid
        deptIds.removeAll(repeatDeptOidList);
        if(Func.isNotEmpty(deptIds)){
            for (String deptId : deptIds){
                platformClientUtil.getFrameworkService().saveUserDept(new String[]{userId}, deptId,null);
            }
        //从即将要执行保存的用户oid中移除当前用户已经存在关联关系的oid
        //移除重复的
        List<String> tempList = new ArrayList<>(Arrays.asList(userOIds));
        tempList.removeAll(repeatUserOidList);
        userOIds = tempList.toArray(new String[tempList.size()]);
        if(Func.isNotEmpty(userOIds)){
            platformClientUtil.getFrameworkService().saveUserDept(userOIds, deptId,null);
        }
        return true;
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java
@@ -1,5 +1,7 @@
package com.vci.frameworkcore.compatibility.impl;
import com.vci.corba.common.PLException;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
import com.vci.frameworkcore.constant.FrameWorkBtmTypeConstant;
@@ -19,6 +21,7 @@
import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
import com.vci.web.properties.WebProperties;
import com.vci.web.service.WebBoServiceI;
import com.vci.web.util.Func;
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
@@ -45,6 +48,12 @@
     */
    @Autowired
    private WebBoServiceI boService;
    /**
     * å¹³å°è°ƒç”¨å®¢æˆ·ç«¯
     */
    @Autowired
    private PlatformClientUtil platformClientUtil;
    /**
     * æ ¹æ®è§’色主键获取角色的信息
@@ -504,6 +513,38 @@
    }
    /**
     * è¯¥æ–¹æ³•只支持一次只允许单个用户分配多个角色,一对多
     * @param userOid
     * @param roleIds
     * @return
     */
    @Override
    public boolean saveRights(String userOid, String[] roleIds) throws PLException {
        VciBaseUtil.alertNotNull(userOid,"用户主键");
        //roleIds允许为空,为空时清空当前用户的权限
        //先查重
        if(Func.isNotEmpty(roleIds)){
            List<String> repeatRoleOidList = new ArrayList<>();
            //循环进行查重,避免in大于1000
            WebUtil.switchCollectionForOracleIn(Arrays.asList(roleIds)).stream().forEach(deptoids->{
                String sql = "select pluseruid,plroleuid from pluserrole where pluseruid = '" + userOid
                        + "' and " + "plroleuid in ("+WebUtil.toInSql(deptoids.toArray(new String[0]))+")";
                List<BusinessObject> cbos = boService.queryBySql(sql, null);
                if(!CollectionUtils.isEmpty(cbos)){
                    cbos.stream().forEach(cbo->{
                        repeatRoleOidList.add(ObjectTool.getNewBOAttributeValue(cbo,"plroleuid"));
                    });
                }
            });
            //移除重复的
            List<String> tempList = new ArrayList<>(Arrays.asList(roleIds));
            tempList.removeAll(repeatRoleOidList);
            roleIds = tempList.toArray(new String[tempList.size()]);
        }
        return platformClientUtil.getFrameworkService().saveRights(roleIds,new String[]{userOid},new UserEntityInfo());
    }
    /**
     * è§’色的转换,默认全部是bs控制的角色
     * @param roleForPlatform1List åŽŸå¹³å°çš„è§’è‰²
     * @return è§’色的显示对象
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -135,7 +135,7 @@
    @Override
    public boolean checkUserExist(String userName, String oid) throws PLException {
        if(Func.isEmpty(userName) && Func.isEmpty(oid)){
            throw new PLException("检查用户是否存在时,传递的参数用户名和用户oid都为空!",new String[0]);
            throw new PLException("500", new String[] { "检查用户是否存在时,传递的参数用户名和用户oid都为空!"});
        }
        UserInfo userInfo = null;
        if(Func.isNotEmpty(userName)) {
@@ -304,6 +304,8 @@
        smUserVO.setUserTypeText(UserTypeEnum.getTextByValue(smUserVO.getUserType()));
        smUserVO.setDescription(userInfo.desc);
        smUserVO.setEmail(userInfo.email);
        smUserVO.setStatus(userInfo.status);
        smUserVO.setPassword(userInfo.pwd);
        //用户所属部门的查询设置
        List<OrgDepartmentVO> orgDepartmentVOList;
        //查看全局变量中是否存在部门信息,存在的情况最主要是针对多条用户查询的时候避免重复查询的
@@ -521,9 +523,9 @@
        //分页查询
        UserInfo[] userInfos = platformClientUtil.getFrameworkService().fetchUserInfoByCondition(
                conditionMap.get("name"),
                conditionMap.get("userName"),
                conditionMap.get("deptId"),
                conditionMap.get("roleId"),
                conditionMap.get("id"),
                conditionMap.get("pkDepartment"),
                conditionMap.get("pkPerson"),
                "developer",  //当前登录的用户名
                pageHelper.getPage(),
                pageHelper.getLimit()
@@ -538,9 +540,9 @@
            dataGrid.setTotal(
                    platformClientUtil.getFrameworkService().getUserTotalByCondition(
                        conditionMap.get("name"),
                        conditionMap.get("userName"),
                        conditionMap.get("deptId"),
                        conditionMap.get("roleId"),
                        conditionMap.get("id"),
                        conditionMap.get("pkDepartment"),
                        conditionMap.get("pkPerson"),
                        "developer"  //当前登录的用户名
                    )
            );
@@ -1062,14 +1064,16 @@
        smUserDTO.setCreator("developer");
        //userObject.setUpdateUser(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserName());
        smUserDTO.setLastModifier("developer");
        UserInfo userInfo = changeUserObjectToUserInfo(smUserDTO);
        UserInfo userInfo = changeSmUserDTOToUserInfo(smUserDTO);
        UserEntityInfo userEntityInfo = new UserEntityInfo("developer", "");
        String oid = platformClientUtil.getFrameworkService().saveUser(userInfo, userEntityInfo);
        if (Func.isEmpty(oid)) {
            return false;
        }
        if(Func.isNotBlank(smUserDTO.getPkDepartment())){
            platformClientUtil.getFrameworkService().saveUserDept(new String[]{oid}, smUserDTO.getPkDepartment(), userEntityInfo);
            //执行保存用户部门关联关系
            orgDeptQueryService.saveUsersDept(new String[]{oid},smUserDTO.getPkDepartment());
            //platformClientUtil.getFrameworkService().saveUserDept(new String[]{oid}, smUserDTO.getPkDepartment(), userEntityInfo);
        }
        return true;
    }
@@ -1094,28 +1098,21 @@
        //校验
        check(smUserDTO,false);
        //查询数据库中的
        SmUserVO dbSmUserVO = getUserByUserId(smUserDTO.getId());
        //根据用户名查询到了用户,但是oid不是当前修改的用户的oid,说明修改的用户名重复
        if(Func.isNotEmpty(dbSmUserVO)
            && !dbSmUserVO.getOid().equals(smUserDTO.getOid())
        ){
            throw new PLException("用户名已存在,不能将当前用户的用户名修改为" + dbSmUserVO.getId(),new String[0]);
        SmUserVO dbSmUserVO = getUserByUserOid(smUserDTO.getOid());
        //根据主键没查询到了用户
        if(Func.isEmpty(dbSmUserVO) || Func.isBlank(dbSmUserVO.getOid())){
            throw new PLException("500", new String[] { "当前修改的用户不存在"});
        }
        smUserDTO.setLastModifyTime(new Date());
        //userObject.setUpdateUser(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserName());
        smUserDTO.setLastModifier("developer");
        UserInfo userInfo = changeUserObjectToUserInfo(smUserDTO);
        UserInfo userInfo = changeSmUserDTOToUserInfo(smUserDTO);
        boolean updateBoolean = platformClientUtil.getFrameworkService().updateUser(userInfo, new UserEntityInfo("developer", null));
        //用户关联部门有所更改
        if(Func.isNotEmpty(smUserDTO.getPkDepartment()) && !smUserDTO.getPkDepartment().equals(dbSmUserVO.getPkDepartment())){
            //界面传递过来的已关联的部门oid
            List<String> updatePkDept = Func.toStrList(smUserDTO.getPkDepartment(), ",");
            //用户已关联的部门oid
            List<String> associatedPkDept = Func.toStrList(dbSmUserVO.getPkDepartment(), ",");
            //移除
            updatePkDept.removeAll(associatedPkDept);
        //修改成功,并且用户关联部门有所更改
        if(updateBoolean && Func.isNotEmpty(smUserDTO.getPkDepartment()) && !smUserDTO.getPkDepartment().equals(dbSmUserVO.getPkDepartment())){
            //执行保存用户部门关联关系
            orgDeptQueryService.saveUserDepts(dbSmUserVO.getOid(),updatePkDept);
            orgDeptQueryService.saveUsersDept(new String[]{dbSmUserVO.getOid()},smUserDTO.getPkDepartment());
        }
        return updateBoolean;
    }
@@ -1147,13 +1144,13 @@
        if (Func.isNotBlank(smUserDTO.getDescription()) && smUserDTO.getDescription().getBytes().length > 255 ){
            throw new VciBaseException("描述长度超过上限");
        }
        if (!smUserDTO.getName().matches("^[A-Za-z0-9_]+$")) {
        if (!smUserDTO.getId().matches("^[A-Za-z0-9_]+$")) {
            throw new VciBaseException("用户名必须是由A-Z a-z 0-9 _组成");
        }
        if (Func.isNotBlank(smUserDTO.getEmail()) && !smUserDTO.getEmail().matches("^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$")){
            throw new VciBaseException("电子邮箱格式错误");
        }
        //是新增才做用户名查重处理
        //是新增才做用户名查重处理,因为用户名一经创建,不允许修改
        if(isAdd){
            //根据用户名(账号)查重
            SmUserVO dbSmUserVO = getUserByUserId(smUserDTO.getId());
@@ -1177,14 +1174,12 @@
        }
    }
    /***
     * ç”¨æˆ·ä»ŽDTO对象到corba对象
     * @param user
     * @return
     */
    public UserInfo changeUserObjectToUserInfo(SmUserDTO user) {
    public UserInfo changeSmUserDTOToUserInfo(SmUserDTO user) {
        UserInfo userInfo = new UserInfo();
        userInfo.id = user.getOid() == null ? "" : user.getOid();
        userInfo.userName = user.getId() == null ? "" : user.getId();
@@ -1240,7 +1235,10 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteUser(String[] ids) throws PLException {
        VciBaseUtil.alertNotNull(ids,"待删除的用户id列表不能为空!");
        if(Func.isEmpty(ids)){
            throw new VciBaseException("待删除的用户id列表不能为空!");
        }
        //调用platformClientUtil的删除用户的方法,会一起删除掉具备关联关系的一些信息,如部门
        return platformClientUtil.getFrameworkService().deleteUser(ids, null);
    }
@@ -1252,9 +1250,14 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean disableOrEnableUsers(String[] ids, boolean flag) throws PLException {
    public boolean stopUsers(String[] ids, boolean flag) throws PLException {
        VciBaseUtil.alertNotNull(ids,"停用/启用的用户id列表");
        return platformClientUtil.getFrameworkService().stopUsers(ids, flag,null);
    }
    @Override
    public void downloadImportTemplate() {
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java
@@ -1,14 +1,18 @@
package com.vci.frameworkcore.controller;
import com.vci.corba.common.PLException;
import com.vci.frameworkcore.compatibility.OrgDeptQueryServiceI;
import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.*;
import com.vci.starter.web.util.VciBaseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@@ -17,8 +21,9 @@
 * @author weidy
 * @date 2020/3/4
 */
@Controller
@RestController
@RequestMapping("/departmentQueryController")
@Slf4j
public class OrgDepartmentQueryController {
    /**
@@ -34,17 +39,40 @@
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常,如果是老的项目里不抛出异常
     */
    @RequestMapping(value = "/refTree",method = RequestMethod.GET)
    @ResponseBody
    public BaseResult<Tree> refTree(TreeQueryObject treeQueryObject) throws VciBaseException{
        List<Tree> deptTreeList = deptQueryService.refTreeDept(treeQueryObject);
        return  BaseResult.tree(deptTreeList);
        //老的项目依然是添加try catch,方法里不抛出异常
        //BaseResult.fail("这里返回前端的错误信息");
    }
    /**
     * éƒ¨é—¨æŸ¥è¯¢ï¼Œå¸¦åˆ†é¡µ
     * @param queryObject
     * @return
     */
    @RequestMapping(value = "/refDataGrid",method = RequestMethod.GET)
    @ResponseBody
    public BaseResult<OrgDepartmentVO> refDataGrid(BaseQueryObject queryObject){
        DataGrid<OrgDepartmentVO> dataGrid=deptQueryService.gridDepts(queryObject.getConditionMap(), queryObject.getPageHelper());
        return BaseResult.dataGrid(dataGrid);
    }
    /**
     * ä¿å­˜éƒ¨é—¨è§’色关联信息,带查重功能
     * @param userOIds ç”¨æˆ·id
     * @param deptId éƒ¨é—¨oid
     * @return
     */
    @RequestMapping(value = "/saveUsersDepts",method = RequestMethod.POST)
    public BaseResult saveUsersDepts(String[] userOIds, String deptId){
        try {
            return deptQueryService.saveUsersDept(userOIds,deptId) ? BaseResult.success("角色分配成功!"):BaseResult.fail("角色分配失败!");
        }catch (Exception e){
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java
@@ -4,21 +4,26 @@
import com.vci.frameworkcore.pagemodel.SmRoleVO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.*;
import com.vci.starter.web.util.VciBaseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
 * è§’色查询控制器
 * @author weidy
 * @date 2020/3/4
 */
@Controller
@RestController
@RequestMapping("/roleQueryController")
@Slf4j
public class SmRoleQueryController {
    /**
@@ -34,7 +39,6 @@
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常,如果是老的项目里不抛出异常
     */
    @RequestMapping(value = "/refDataGrid",method = RequestMethod.GET)
    @ResponseBody
    public BaseResult<SmRoleVO> refDataGrid(BaseQueryObject queryObject) throws VciBaseException {
        if(queryObject == null){
            queryObject = new BaseQueryObject();
@@ -46,13 +50,48 @@
    }
    /**
     * æ ¹æ®ç”¨æˆ·ä¸»é”®èŽ·å–å…³è”çš„è§’è‰²
     * @param userOid ç”¨æˆ·ä¸»é”®
     * @param queryMap æŸ¥è¯¢æ¡ä»¶ï¼Œå¦‚果需要使用用户的属性来查询可以使用pkUser.xxxx
     * @return è§’色的显示对象
     */
    @RequestMapping(value = "/listRoleByUserOid",method = RequestMethod.GET)
    public BaseResult<List<SmRoleVO>> listRoleByUserOid(String userOid, Map<String, String> queryMap){
        try {
            return BaseResult.dataList(roleQueryService.listRoleByUserOid(userOid,queryMap));
        }catch (Exception e){
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
        }
    }
    /**
     * åˆ†é…è§’色:保存用户角色关联关系
     * @param userOid
     * @param roleIds
     * @return
     */
    @RequestMapping(value = "/saveRights",method = RequestMethod.POST)
    public BaseResult saveRights(String userOid, String[] roleIds){
        try {
            return roleQueryService.saveRights(userOid,roleIds) ? BaseResult.success("角色分配成功!"):BaseResult.fail("角色分配失败!");
        }catch (Exception e){
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
        }
    }
    /**
     * è§’色的树形参照
     * @param treeQueryObject æ ‘形数据的查询对象,包括查询条件,上级主键,是否多选等,extandParamsMap中添加"showAllRoleNode"为"true"时,返回结果中会包含“所有角色”这个节点
     * @return è§’色的树形参照,无上下级关系
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常,如果是老的项目里不抛出异常
     */
    @RequestMapping(value = "/refTree",method = RequestMethod.GET)
    @ResponseBody
    public BaseResult<Tree> refTree(TreeQueryObject treeQueryObject) throws VciBaseException{
        List<Tree> roleTreeList = roleQueryService.refTreeRoles(treeQueryObject);
        return  BaseResult.tree(roleTreeList);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java
@@ -1,11 +1,14 @@
package com.vci.frameworkcore.controller;
import com.vci.common.exception.VciExceptionTool;
import com.vci.corba.common.PLException;
import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
import com.vci.frameworkcore.model.dto.SmUserDTO;
import com.vci.frameworkcore.pagemodel.SmUserVO;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.*;
import com.vci.starter.web.util.VciBaseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@@ -123,7 +126,8 @@
            return BaseResult.dataGrid(userVODataGrid);
        }catch (Exception e) {
            e.printStackTrace();
            log.error("用户管理列表查询时出现错误,原因:" + e.getMessage());
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("用户管理列表查询时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("用户管理列表查询时出现错误,原因:" + e.getMessage());
        }
    }
@@ -137,11 +141,12 @@
    @VciUnCheckRight
    public BaseResult addUser(@RequestBody SmUserDTO smUserDTO){
        try {
            return BaseResult.success(userQueryService.addUser(smUserDTO) ? "用户添加成功!":"用户添加失败!");
            return userQueryService.addUser(smUserDTO) ? BaseResult.success("用户添加成功!"):BaseResult.fail("用户添加失败!");
        }catch (Exception e){
            e.printStackTrace();
            log.error("添加用户时出现错误,原因:" + e.getMessage());
            return BaseResult.fail("添加用户时出现错误,原因:" + e.getMessage());
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("添加用户时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("添加用户时出现错误,原因:" + exceptionMessage);
        }
    }
@@ -157,8 +162,9 @@
            return BaseResult.success(userQueryService.updateUser(smUserDTO) ? "用户修改成功!":"用户修改失败!");
        }catch (Exception e){
            e.printStackTrace();
            log.error("修改用户时出现错误,原因:" + e.getMessage());
            return BaseResult.fail("修改用户时出现错误,原因:" + e.getMessage());
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("修改用户时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("修改用户时出现错误,原因:" + exceptionMessage);
        }
    }
@@ -168,14 +174,15 @@
     * @return
     */
    @RequestMapping(value = "/deleteUser",method = RequestMethod.DELETE)
    //@VciUnCheckRight
    @VciUnCheckRight
    public BaseResult deleteUser(String[] ids){
        try {
            return BaseResult.success(userQueryService.deleteUser(ids) ? "删除用户成功!":"删除用户失败!");
            return userQueryService.deleteUser(ids) ? BaseResult.success("删除用户成功!"):BaseResult.fail("删除用户失败!");
        }catch (Exception e){
            e.printStackTrace();
            log.error("添加用户时出现错误,原因:" + e.getMessage());
            return BaseResult.fail("添加用户时出现错误,原因:" + e.getMessage());
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("添加用户时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("添加用户时出现错误,原因:" + exceptionMessage);
        }
    }
@@ -186,15 +193,16 @@
     * @return
     */
    @RequestMapping(value = "/stopUsers",method = RequestMethod.POST)
    //@VciUnCheckRight
    public BaseResult disableOrEnableUsers(String[] ids,boolean flag){
    @VciUnCheckRight
    public BaseResult stopUsers(String[] ids,boolean flag){
        try {
            userQueryService.disableOrEnableUsers(ids,flag);
            userQueryService.stopUsers(ids,flag);
            return BaseResult.success("用户【停用/启用】成功!");
        }catch (Exception e){
            e.printStackTrace();
            log.error("用户【停用/启用】时出现错误,原因:" + e.getMessage());
            return BaseResult.fail("用户【停用/启用】时出现错误,原因:" + e.getMessage());
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("用户【停用/启用】时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("用户【停用/启用】时出现错误,原因:" + exceptionMessage);
        }
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java
@@ -111,6 +111,11 @@
    private Date lastModifyPasswordTime;
    /**
     * ç”¨æˆ·å¯†ç 
     */
    private String password;
    /**
     * å¯†ç é”™è¯¯æ¬¡æ•°
     */
    private Integer pwdWrongCount;
@@ -155,6 +160,27 @@
     */
    private String specialties;
    /**
     * çŠ¶æ€
     */
    private short status;
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setStatus(short status) {
        this.status = status;
    }
    public short getStatus() {
        return status;
    }
    public void setSpecialties(String specialties) {
        this.specialties = specialties;
    }