ludc
2024-07-09 5acc490fa6f77a9ed7b5976ee6a2e22b070df5bf
角色管理联调修改、部门管理接口等代码上传
已修改12个文件
已添加1个文件
839 ■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/model/OrgDeptForPlatform1.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/model/dto/OrgDepartmentDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/model/po/OrgDeptPO.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDepartmentVO.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/Func.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
@@ -1,6 +1,8 @@
package com.vci.starter.web.util;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.vci.common.exception.VciExceptionTool;
@@ -81,6 +83,19 @@
    }
    /**
     * é›ªèбID
     * @return
     */
    public static String getSnowflakePk() {
        return String.valueOf(getSnowflakePk(1,1));
    }
    public static  Long getSnowflakePk(long workerId,long dataCenterId){
        Snowflake snowflake = IdUtil.getSnowflake(workerId,dataCenterId);
        return snowflake.nextId();
    }
    /**
     * å­—符串转数字
     * @param string å­—符串
     * @return æ•°å­—
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java
@@ -4,11 +4,9 @@
import com.vci.frameworkcore.model.dto.OrgDepartmentDTO;
import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.pagemodel.PageHelper;
import com.vci.starter.web.pagemodel.Tree;
import com.vci.starter.web.pagemodel.TreeQueryObject;
import com.vci.starter.web.pagemodel.*;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -35,7 +33,7 @@
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œå¦‚果部门不存在则返回null,不会抛出异常
     * @throws VciBaseException å‚数为空或者数据库存在问题的时候会抛出异常
     */
    OrgDepartmentVO getDeptByDeptPOidAndCondition(String parentDeptOid,Map<String,String> conditionMap) throws VciBaseException;
    List<OrgDepartmentVO> getDeptByDeptPOidAndCondition(String parentDeptOid,Map<String,String> conditionMap) throws VciBaseException;
    /**
     * æ‰¹é‡èŽ·å–éƒ¨é—¨çš„ä¿¡æ¯ ï¼ˆæ ¹æ®éƒ¨é—¨ä¸»é”®ï¼‰
@@ -90,9 +88,17 @@
     * æ‰¹é‡æ ¹æ®ç”¨æˆ·çš„主键来获取部门
     * @param userOidCollection ç”¨æˆ·ä¸»é”®é›†åˆ
     * @param queryMap æŸ¥è¯¢æ¡ä»¶ï¼Œå¦‚果需要使用用户的属性来查询可以使用pkUser.xxxx
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œkey是用户主键,value是这个用户关联的部门
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œkey是用户主键,value是关联的部门
     */
    Map<String,List<OrgDepartmentVO>> batchListDeptByUserOids(Collection<String> userOidCollection, Map<String, String> queryMap);
    /**
     * æ‰¹é‡æ ¹æ®ç”¨æˆ·çš„主键来获取部门名称(/间隔方式)
     * @param userOidCollection ç”¨æˆ·ä¸»é”®é›†åˆ
     * @param queryMap æŸ¥è¯¢æ¡ä»¶ï¼Œå¦‚果需要使用用户的属性来查询可以使用pkUser.xxxx
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œkey是用户主键,value是关联的部门(key:关联的部门oid,value:包含父节点如当前部门为人力资源部则值为:550/人力资源部)
     */
    Map<String,Map<String,String>> batchMapDeptNameByUserOids(Collection<String> userOidCollection, Map<String, String> queryMap);
    /**
     * èŽ·å–æŸä¸ªéƒ¨é—¨çš„ç›´å±žä¸‹çº§éƒ¨é—¨
@@ -159,4 +165,19 @@
     */
    Map<String,OrgDepartmentVO> getDeptAllTreeMap();
    /**
     * ä¸‹è½½å¯¼å…¥éƒ¨é—¨çš„excel模板。
     * @param downloadFileName
     * @return
     */
    String downloadImportTemplate(String downloadFileName);
    /**
     * å¯¼å…¥éƒ¨é—¨
     * @param file
     * @return
     * @throws VciBaseException
     */
    BaseResult importDept(File file) throws VciBaseException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java
@@ -182,11 +182,20 @@
    BaseResult importRole(File file) throws VciBaseException;
    /**
     * ä¿å­˜ç”¨æˆ·è§’色关联关系
     * æˆå‘˜ç®¡ç†åˆ†é…è§’色调用,保存用户角色关联关系
     * @param userOids
     * @param roleIds
     * @return
     */
    boolean saveRights(String[] userOids, String[] roleIds) throws PLException;
    /**
     * è§’色管理分配成员接口调用
     * @param userOids
     * @param roleId
     * @return
     * @throws PLException
     */
    boolean saveRight(String[] userOids, String roleId) throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
@@ -8,26 +8,44 @@
import com.vci.frameworkcore.model.dto.OrgDepartmentDTO;
import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
import com.vci.frameworkcore.model.OrgDeptForPlatform1;
import com.vci.frameworkcore.model.dto.SmUserDTO;
import com.vci.frameworkcore.model.po.OrgDeptPO;
import com.vci.frameworkcore.model.po.SmUserPO;
import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
import com.vci.frameworkcore.pagemodel.SmUserVO;
import com.vci.frameworkcore.properties.ConfigReader;
import com.vci.omd.utils.ObjectTool;
import com.vci.starter.poi.bo.ReadExcelOption;
import com.vci.starter.poi.bo.WriteExcelData;
import com.vci.starter.poi.bo.WriteExcelOption;
import com.vci.starter.poi.constant.ExcelLangCodeConstant;
import com.vci.starter.poi.util.ExcelUtil;
import com.vci.starter.revision.bo.TreeWrapperOptions;
import com.vci.starter.revision.service.RevisionModelUtil;
import com.vci.starter.web.constant.QueryOptionConstant;
import com.vci.starter.web.enumpck.UserSecretEnum;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.*;
import com.vci.starter.web.util.BeanUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.starter.web.util.*;
import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
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;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.util.WebUtils;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -59,6 +77,16 @@
    private RevisionModelUtil revisionModelUtil;
    /**
     * å¿…填列
     */
    private ArrayList<Integer> ColumnNameisRed = new ArrayList<Integer>();
    /**
     * æ—¥å¿—
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * æ ¹æ®éƒ¨é—¨ä¸»é”®èŽ·å–éƒ¨é—¨çš„ä¿¡æ¯
     * @param deptOid éƒ¨é—¨ä¸»é”®
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œå¦‚果部门不存在则返回null,不会抛出异常
@@ -69,8 +97,14 @@
        if(StringUtils.isBlank(deptOid)){
            return null;
        }
        OrgDeptForPlatform1 deptForPlatform1 = boService.selectByOid(deptOid, OrgDeptForPlatform1.class);
        return deptDO2VO(deptForPlatform1);
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("pluid",deptOid);
        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
        List<OrgDeptForPlatform1> deptForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
        if(Func.isEmpty(deptForPlatform1s)){
            return null;
        }
        return deptDO2VO(deptForPlatform1s.get(0));
    }
    /**
@@ -81,11 +115,11 @@
     * @throws VciBaseException å‚数为空或者数据库存在问题的时候会抛出异常
     */
    @Override
    public OrgDepartmentVO getDeptByDeptPOidAndCondition(String parentDeptOid,Map<String,String> conditionMap) throws VciBaseException {
    public List<OrgDepartmentVO> getDeptByDeptPOidAndCondition(String parentDeptOid,Map<String,String> conditionMap) throws VciBaseException {
        if(Func.isEmpty(conditionMap)){
            conditionMap = new HashMap();
        }
        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(new HashMap<>(),OrgDeptForPlatform1.class);
        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
        //父主键为空查顶层
        if(Func.isBlank(parentDeptOid)){
            queryWrapper.isNull("plparentuid");
@@ -96,7 +130,7 @@
        if(Func.isEmpty(roleForPlatform1s)){
            return null;
        }
        return deptDO2VO(roleForPlatform1s.get(0));
        return deptDO2VOs(roleForPlatform1s);
    }
    /**
@@ -121,18 +155,23 @@
        OrgDepartmentVO departmentVO = new OrgDepartmentVO();
        if(deptForPlatform1!=null){
            departmentVO.setOid(deptForPlatform1.getPluid());
            // é™¤éƒ¨é—¨ä¸»é”®å¤–的唯一标识,长度为Dept:+8位可通过该参数反推回部门主键的hash编码
            departmentVO.setUniqueId("Dept:"+Func.oidEnHash(deptForPlatform1.getPluid()));
            departmentVO.setId(deptForPlatform1.getPlnum());
            departmentVO.setName(deptForPlatform1.getPlname());
            departmentVO.setStatus(deptForPlatform1.getPlstatus());
            if(0 == deptForPlatform1.getPlstatus()){
                departmentVO.setLcStatus(FrameworkDataLCStatus.ENABLED.getValue());
                departmentVO.setStatusText(FrameworkDataLCStatus.ENABLED.getValue());
            }else{
                departmentVO.setLcStatus(FrameworkDataLCStatus.DISABLED.getValue());
                departmentVO.setStatusText(FrameworkDataLCStatus.DISABLED.getValue());
            }
            departmentVO.setSpecialties(deptForPlatform1.getPlspecialties());
            departmentVO.setCode(deptForPlatform1.getPlcode());
            departmentVO.setPkFatherDepartment(deptForPlatform1.getPlparentuid());
            departmentVO.setDescription(deptForPlatform1.getPldesc());
            departmentVO.setCheckInTime(deptForPlatform1.getPlcreatetime());
            departmentVO.setCreateTime(new Date(deptForPlatform1.getPlcreatetime()));
            departmentVO.setCreator(deptForPlatform1.getPlcreateuser());
            departmentVO.setLastModifyTime(deptForPlatform1.getPlupdatetime());
            departmentVO.setLastModifyTime(new Date(deptForPlatform1.getPlupdatetime()));
            departmentVO.setLastModifier(deptForPlatform1.getPlupdateuser());
        }
        return departmentVO;
@@ -312,7 +351,7 @@
     * æ‰¹é‡æ ¹æ®ç”¨æˆ·çš„主键来获取部门
     * @param userOidCollection ç”¨æˆ·ä¸»é”®é›†åˆ
     * @param queryMap æŸ¥è¯¢æ¡ä»¶ï¼Œå¦‚果需要使用用户的属性来查询可以使用pkUser.xxxx
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œkey是用户主键,value是这个用户关联的部门
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œkey是用户主键,value是关联的部门
     */
    @Override
    public Map<String, List<OrgDepartmentVO>> batchListDeptByUserOids(
@@ -342,7 +381,6 @@
            //这儿应该对deptVOList做一次去重处理,因为肯定会有重复的部门被查出来
            Map<String, OrgDepartmentVO> deptVOMap = deptVOList.stream()
                    .collect(Collectors.toMap(OrgDepartmentVO::getOid, Function.identity(), (existing, replacement) -> existing));
            //Map<String, OrgDepartmentVO> deptVOMap = deptVOList.stream().distinct().collect(Collectors.toMap(s -> s.getOid(), t -> t));
            Map<String, List<OrgDepartmentVO>> userDeptVOMap = new HashMap<>();
            userDeptOidMap.forEach((userOid,deptOids)->{
                List<OrgDepartmentVO> deptVOS = new ArrayList<>();
@@ -358,7 +396,63 @@
        return new HashMap<>();
    }
     /**
    /**
     * æ‰¹é‡æ ¹æ®ç”¨æˆ·çš„主键来获取部门名称(/间隔方式)
     * @param userOidCollection ç”¨æˆ·ä¸»é”®é›†åˆ
     * @param queryMap æŸ¥è¯¢æ¡ä»¶ï¼Œå¦‚果需要使用用户的属性来查询可以使用pkUser.xxxx
     * @return éƒ¨é—¨çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œkey是用户主键,value是关联的部门(包含父节点如当前部门为人力资源部则值为:550/人力资源部)
     */
    @Override
    public Map<String,Map<String,String>> batchMapDeptNameByUserOids(Collection<String> userOidCollection, Map<String, String> queryMap) {
        if(CollectionUtils.isEmpty(userOidCollection)){
            return new HashMap<>();
        }
        Map<String,Map<String,String>> deptOidNameMap = new HashMap<>();
        Map<String,Map<String,String>> userDeptOidMap = new HashMap<>();
        WebUtil.switchCollectionForOracleIn(userOidCollection).stream().forEach(userOids->{
            //1、要先根据用户主键获取到关联的部门主键
            String sql = "select pluseruid,pldeptuid from pluserdept where pluseruid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")";
            List<BusinessObject> cbos = boService.queryBySql(sql, null);
            if(!CollectionUtils.isEmpty(cbos)){
                cbos.stream().forEach(cbo->{
                    //角色主键
                    String userOid = ObjectTool.getNewBOAttributeValue(cbo,"pluseruid");
                    //部门主键
                    String deptUid = ObjectTool.getNewBOAttributeValue(cbo, "pldeptuid");
                    //2、然后根据部门主键获取到由部门名称/组成的值
                    //避免多次查询,或者循环查询
                    if(deptOidNameMap.containsKey(deptUid)){
                        userDeptOidMap.put(userOid,deptOidNameMap.get(deptUid));
                    }else {
                        if(Func.isNotEmpty(deptUid)){
                            //2.1、查询部门oid,当前部门包含父部门
                            String queryDeptSql = "select pluid,plname from pldept START with pluid = '" +
                                    deptUid + "' connect by prior plparentuid = pluid";
                            List<BusinessObject> cboDepts = boService.queryBySql(queryDeptSql, null);
                            if(!CollectionUtils.isEmpty(cboDepts)){
                                StringBuilder sb = new StringBuilder();
                                for (int i = cboDepts.size()-1; i >=0; i--) {
                                    String deptName = ObjectTool.getNewBOAttributeValue(cboDepts.get(i),"plname");
                                    sb.append(deptName);
                                    sb.append("/");
                                }
                                //2.2、避免同一部门多次查询,这里存储在一个公共集合中,便于重复使用
                                //删除最后一个斜杠
                                sb.deleteCharAt(sb.length() - 1);
                                Map<String,String> tempMap = new HashMap<>();
                                tempMap.put(deptUid,sb.toString());
                                deptOidNameMap.put(deptUid,tempMap);
                                userDeptOidMap.put(userOid,tempMap);
                            }
                        }
                    }
                });
            }
        });
        return userDeptOidMap;
    }
    /**
     * èŽ·å–æŸä¸ªéƒ¨é—¨çš„ç›´å±žä¸‹çº§éƒ¨é—¨
     * @param pkFatherDepartmment éƒ¨é—¨çš„主键
     * @param queryMap æŸ¥è¯¢æ¡ä»¶
@@ -400,6 +494,7 @@
    public List<Tree> refTreeDept(TreeQueryObject treeQueryObject) {
        String pkFatherDepartmment=treeQueryObject.getParentOid();
        Map<String, String> conditionMap = treeQueryObject.getConditionMap();
        Map<String, String> extandParamsMap = treeQueryObject.getExtandParamsMap();
        if(conditionMap==null){
            conditionMap=new HashMap<String, String>();
        }
@@ -414,9 +509,27 @@
        TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions();
        BeanUtil.convert(treeQueryObject,treeWrapperOptions);
        treeWrapperOptions.setParentFieldName("pkFatherDepartment");
        return revisionModelUtil.doList2Trees(orgDepartmentVOList,treeWrapperOptions,dept->{
            return dept.getId() + " " + dept.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equals(dept.getLcStatus())?"【停用】":"");
        List<Tree> trees = revisionModelUtil.doList2Trees(orgDepartmentVOList, treeWrapperOptions, dept -> {
            return dept.getId() + " " + dept.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equals(dept.getLcStatus()) ? "【停用】" : "");
        });
        //extandParamsMap中添加"showAllDepartmentNode"为"true"时,并且parentOid为空,返回结果中会包含“所有部门”这个节点
        if(Func.isBlank(pkFatherDepartmment) && (Func.isNotEmpty(extandParamsMap) && Boolean.parseBoolean(extandParamsMap.getOrDefault("showAllDepartmentNode","false")))){
            List<Tree> treeList = new ArrayList<>();
            Tree tree = new Tree();
            tree.setLeaf(false);
            tree.setParentId(null);
            //没有实际作用只是界面上渲染使用
            tree.setOid(UUID.randomUUID().toString());
            tree.setParentName(null);
            Map<String, String> map = new HashMap<>();
            map.put("name","所有部门");
            map.put("ALLDept","ALLDept");
            tree.setAttributes(map);
            tree.setChildren(trees);
            treeList.add(tree);
            return treeList;
        }
        return trees;
    }
      /**
@@ -476,7 +589,7 @@
        tempList.removeAll(repeatUserOidList);
        userOIds = tempList.toArray(new String[tempList.size()]);
        if(Func.isNotEmpty(userOIds)){
            platformClientUtil.getFrameworkService().saveUserDept(userOIds, deptId,null);
            platformClientUtil.getFrameworkService().saveUserDept(userOIds, deptId,new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(),null));
        }
        return true;
    }
@@ -492,16 +605,18 @@
        VciBaseUtil.alertNotNull(
                orgDepartmentDTO,"添加的部门对象",
                orgDepartmentDTO.getName(),"部门名");
        //部门名判重
        //部门名和编号判重
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("plname",orgDepartmentDTO.getName());
        conditionMap.put("plnum",QueryOptionConstant.OR + orgDepartmentDTO.getId());
        OrgDepartmentVO departmentVO = getDeptByDeptPOidAndCondition(orgDepartmentDTO.getPkFatherDepartment(), conditionMap);
        if(Func.isNotEmpty(departmentVO)){
        conditionMap.put("plname",QueryOptionConstant.OR + orgDepartmentDTO.getName());
        if(Func.isNotBlank(orgDepartmentDTO.getId())){
            conditionMap.put("plnum",QueryOptionConstant.OR + orgDepartmentDTO.getId());
        }
        List<OrgDepartmentVO> departmentVOS = getDeptByDeptPOidAndCondition(orgDepartmentDTO.getPkFatherDepartment(), conditionMap);
        if(Func.isNotEmpty(departmentVOS)){
            throw new VciBaseException("同一父节点下该部门名称或编号已经存在,请修改!");
        }
        //SessionInfo loginUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
        String userId = "developer";//loginUser.getUserId();
        SessionInfo loginUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
        String userId = loginUser.getUserId();
        //生成存储的corba对象
        orgDepartmentDTO.setCreateTime(new Date());
@@ -531,18 +646,37 @@
                orgDepartmentDTO.getId(),"用户名"
        );
        //按oid查询数据库中已存在的
        OrgDepartmentVO departmentVO = getDeptByDeptOid(orgDepartmentDTO.getOid());
        //根据主键没查询到
        OrgDepartmentDTO orgDepartmentDTO1 = new OrgDepartmentDTO();
        //默认属性给赋值上
        //BeanUtil.convert(departmentVO,orgDepartmentDTO1);
        Func.copy(departmentVO,orgDepartmentDTO);
        //orgDepartmentDTO1.setName(orgDepartmentDTO.getName());
        //orgDepartmentDTO1.setCode(orgDepartmentDTO.getCode());
        //orgDepartmentDTO1.setDescription(orgDepartmentDTO.getDescription());
        String loginUserId = "developer";//WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        orgDepartmentDTO1.setLastModifier(loginUserId);
        DeptInfo deptInfo = changeOrgDeptDTOToDeptInfo(orgDepartmentDTO1);
        OrgDepartmentVO dbDepartmentVO = getDeptByDeptOid(orgDepartmentDTO.getOid());
        if(Func.isEmpty(dbDepartmentVO)){
            throw new VciBaseException("修改的部门不存在!");
        }
        //部门名和编号判重
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("plname",QueryOptionConstant.OR + orgDepartmentDTO.getName());
        if(Func.isNotBlank(orgDepartmentDTO.getId())){
            conditionMap.put("plnum",QueryOptionConstant.OR + orgDepartmentDTO.getId());
        }
        List<OrgDepartmentVO> repeatDepartmentVOS = getDeptByDeptPOidAndCondition(orgDepartmentDTO.getPkFatherDepartment(), conditionMap);
        repeatDepartmentVOS = repeatDepartmentVOS.stream().filter(item -> {
            if((item.getName().equals(orgDepartmentDTO.getName()) || item.getId().equals(orgDepartmentDTO.getId())) &&
                    !item.getOid().equals(orgDepartmentDTO.getOid())){
                return true;
            }
            return false;
        }).collect(Collectors.toList());
        if(Func.isNotEmpty(repeatDepartmentVOS) ){
            throw new VciBaseException("同一父节点下该部门名称或编号已经存在,请修改!");
        }
        OrgDepartmentDTO departmentDTO = new OrgDepartmentDTO();
        BeanUtil.convert(dbDepartmentVO,departmentDTO);
        departmentDTO.setCode(orgDepartmentDTO.getCode());
        departmentDTO.setId(orgDepartmentDTO.getId());
        departmentDTO.setSpecialties(orgDepartmentDTO.getSpecialties());
        departmentDTO.setDescription(orgDepartmentDTO.getDescription());
        departmentDTO.setName(orgDepartmentDTO.getName());
        String loginUserId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
        orgDepartmentDTO.setLastModifier(loginUserId);
        DeptInfo deptInfo = changeOrgDeptDTOToDeptInfo(departmentDTO);
        boolean updateBoolean = platformClientUtil.getFrameworkService().updateDepartment(deptInfo, new UserEntityInfo(loginUserId, null));
        return updateBoolean;
    }
@@ -596,6 +730,176 @@
        return stringOrgDepartmentVOMap;
    }
    /**
     * ä¸‹è½½å¯¼å…¥éƒ¨é—¨çš„excel模板。
     * @param downloadFileName
     * @return
     */
    @Override
    public String downloadImportTemplate(String downloadFileName) {
        //界面没传名称,使用默认名称
        downloadFileName = Func.isBlank(downloadFileName) ?  "部门导入模板_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):downloadFileName;
        // è®¾ç½®è¡¨å•列名
        List<String> columns = new ArrayList<>(Arrays.asList("ID", "名称", "编号", "代号", "专业", "父ID(部门唯一标识ID)", "描述"));
        //设置必填列
        ColumnNameisRed.clear();
        ColumnNameisRed.add(0);
        ColumnNameisRed.add(1);
        //写excel
        String excelPath = LocalFileUtil.getDefaultTempFolder() + File.separator + downloadFileName +  ".xls";
        try {
            new File(excelPath).createNewFile();
        } catch (Throwable e) {
            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[]{excelPath}, e);
        }
        //设置列
        List<WriteExcelData> excelDataList = new ArrayList<>();
        for (int index = 0; index < columns.size(); index++) {
            //判断是否为必填列,给必填列设置颜色
            if(ColumnNameisRed.contains(index)){
                WriteExcelData excelData = new WriteExcelData(0, index, columns.get(index));
                excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
                excelDataList.add(excelData);
            }else{
                excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
            }
        }
        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
        ExcelUtil.writeDataToFile(excelPath, excelOption);
        return excelPath;
    }
    /**
     * å¯¼å…¥éƒ¨é—¨
     * @param file
     * @return
     * @throws VciBaseException
     */
    @Override
    public BaseResult importDept(File file) throws VciBaseException {
        VciBaseUtil.alertNotNull(file,"excel文件");
        if(!file.exists()){
            throw new VciBaseException("导入的excel文件不存在,{0}",new String[]{file.getPath()});
        }
        try{
            //1、读取excel中的数据,组成对象
            ReadExcelOption excelOption = new ReadExcelOption();
            //当前登录的用户账号
            //String loginUserId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
            String loginUserId = "developer";
            UserEntityInfo userEntityInfo = new UserEntityInfo(loginUserId,null);
            List<OrgDeptPO> poList = ExcelUtil.readDataObjectFromExcel(file, OrgDeptPO.class,excelOption,(value, po, fieldName)->{});
            //去除都是空的情况
            if(CollectionUtils.isEmpty(poList)){
                return BaseResult.fail(ExcelLangCodeConstant.IMPORT_CONTENT_NULL,new String[]{});
            }
            /*部门导入几个比较重要的情景:
                1、当前导入的数据是一个部门树结构(要判断用户手输的ID是否存在重复,输了就要判断是否在当前表格中重复,
                    å¹¶ä¸”保存时不能使用用户手输的ID,要根据手输ID和实际存储OID做对应映射,
                    å¹¶ä¸”不破坏表格中部门树结构,如果没手输ID就只需要关注parentId这个属性,
                    å¹¶ä¸”需要注意如果有的ID有,有的没有那就需要注意,既存在和系统中,
                    å…³è”的部门树,又存在和当前表格中关联的部门树)。
                2、当前导入的数据父id关联了已存在的部门oid(要查询父id这个部门是否存在,)
            è§£å†³æ€è·¯ï¼šæœ€å¥½æ˜¯å°†è¡¨æ ¼ä¸­å¯èƒ½æ˜¯éƒ¨é—¨æ ‘的给遍历成树,然后再做查重啥的处理
            */
            //2、必填判空、判重(数据库判重和excel中判重),组装成保存用的数据对象
            List<DeptInfo> deptInfoList = new ArrayList<>();
            //2.1、用以存储excel中重复的数据,三个不可重复的字段)(Name不能为空,Name、Code同一父部门下唯一)
            List<String> repeatIdList = new ArrayList<>();
            Map<String,String> repeatNameMap = new HashMap<>();
            Map<String,String> repeatNumMap = new HashMap<>();
            Map<String,String> indexMap = new HashMap<>();
            //2.2、存储用户手输的oid和实际存储oid的映射关系
            Map<String, String> oidMap = new HashMap<>();
            poList.stream().forEach(po->{
                String parentId = Func.isBlank(po.getParentId()) ? "":po.getParentId();
                //表格内判重
                //部门名称判空
                if(Func.isEmpty(po.getName())){
                    throw new VciBaseException("第【"+po.getRowIndex()+"】行,depterror,Reason:Name cannot be empty");
                }else if(repeatNameMap.getOrDefault(po.getName(), "").equals(parentId)/*excel中同一部门下Name相等*/){
                    //同一部门下名称判重
                    throw new VciBaseException("第【"+po.getRowIndex()+"】行,deptnameerror,Reason: Names under the same department cannot be duplicated");
                }else if(Func.isNotEmpty(po.getId()) && repeatIdList.equals(po.getId())){
                    throw new VciBaseException("第【"+po.getRowIndex()+"】行,deptiderror,Reason: The primary key cannot be duplicated");
                }else if(Func.isNotEmpty(po.getNum()) && repeatNumMap.getOrDefault(po.getNum(),"").equals(parentId)/*excel中同一部门下编号存在 */){
                    throw new VciBaseException("第【"+po.getRowIndex()+"】行,deptnumerror,Reason: The number cannot be duplicated");
                }else{
                    //2.2、查询数据库中的数据(查重ID和NUM),比较麻烦需要根据ParentID查询(所有只能单条查询进行判重)
                    //组装查重条件:同一部门下(parentId相等),name或者num相等
                    HashMap<String, String> conditionMap = new HashMap<>();
                    conditionMap.put("plname",po.getName());
                    conditionMap.put("plnum",QueryOptionConstant.OR + po.getNum());
                    String pId = Func.isBlank(po.getParentId()) ? null:po.getParentId();
                    List<OrgDepartmentVO> repeatOrgDept = this.getDeptByDeptPOidAndCondition(pId, conditionMap);
                    //只要不为空就说明当前行数据在系统中重复
                    if(Func.isNotEmpty(repeatOrgDept)){
                        throw new VciBaseException("第【"+po.getRowIndex()+"】行,deptname or deptnum error,Reason: The name or number already exists in the system");
                    }
                }
                //存储校验通过的数据,以便后续excel查重
                repeatNameMap.put(po.getName(),Func.isBlank(po.getParentId()) ? "":po.getParentId());
                repeatIdList.add(po.getId());
                repeatNumMap.put(po.getNum(),po.getParentId());
                indexMap.put(po.getName(),po.getRowIndex());
                //校验数据就该组装成DTO数据对象了
                OrgDepartmentDTO dto = new OrgDepartmentDTO();
                BeanUtil.convert(po,dto);
                dto.setOid(po.getId());
                dto.setId(po.getNum());
                dto.setPkFatherDepartment(po.getParentId());
                dto.setCreateTime(new Date());
                dto.setCreator(loginUserId);
                dto.setLastModifier(loginUserId);
                dto.setStatus((short) 0);
                //2.2、过程中处理主键转换问题最好是一条一条的处理ID是否存在还有ParentID是否存在的问题
                //先判断是已存在的部门ID,还是不存在的部门ID,已存在系统中的ID就是为Dept:开头的
                String pId = dto.getPkFatherDepartment();
                //是已存在系统中的部门id
                if(pId.contains("Dept:")){
                    //解析出真实的oid
                    String deParentId = Func.oidDeHash(pId.replace("Dept:", "").trim());
                    //解析出来的deParentId必须得在库中存在
                    if(Func.isBlank(deParentId) || Func.isEmpty(this.getDeptByDeptOid(deParentId))){
                        throw new VciBaseException("第【"+ po.getRowIndex() +"】行,deptparentiderror,Reason:Parent ID resolution error or does not exist in the system");
                    }
                    //替换掉临时使用的部门唯一标识
                    dto.setPkOrganizationName(deParentId);
                }
                //用户手输了部门oid,但是避免oid不规范需要,用规范oid进行替换,如果没输入保存时会自动生成oid
                if(Func.isNotBlank(dto.getOid())){
                    String pkOid = VciBaseUtil.getPk();
                    dto.setOid(pkOid);
                    //oid映射关系,后续用来更新parentId
                    oidMap.put(dto.getOid(),pkOid);
                }
                DeptInfo deptInfo = this.changeOrgDeptDTOToDeptInfo(dto);
                deptInfoList.add(deptInfo);
            });
            //3、处理id和parentId的映射关系:将用户手输的父ID转换成实际存储的ID
            List<DeptInfo> lastDeptInfoList = deptInfoList.stream().map(info -> {
                //parentId不为空并且没有Dept:相关的字符串,说明是用户手输的ParentId(导入的数据就是一个树结构)
                if (Func.isNotBlank(info.parentId) || info.parentId.contains("Dept:")) {
                    //转换ParentId为实际要存储的部门ID
                    info.parentId = oidMap.get(info.parentId);
                }
                return info;
            }).collect(Collectors.toList());
            //4、对最终处理好的部门数据保存,实现最终统一保存,避免了一部分数据进了一部分数据因为校验没过没进库的问题
            platformClientUtil.getFrameworkService().batchSaveDepart(
                    lastDeptInfoList.toArray(new DeptInfo[lastDeptInfoList.size()]),
                    userEntityInfo
            );
        }catch (Exception e){
            if(logger.isErrorEnabled()){
                logger.error("读取excel内容时或保存用户信息时出现了错误,具体原因:",e.getMessage());
            }
            e.printStackTrace();
            return BaseResult.fail(LangBaseUtil.getErrorMsg(e),new String[]{},e);
        }
        return BaseResult.success("部门导入成功!");
    }
    public Map<String, OrgDepartmentVO> convertToMap(List<OrgDepartmentVO> orgDepartmentVOList) {
        Map<String, OrgDepartmentVO> map = new HashMap<>();
        for (OrgDepartmentVO orgDepartmentVO : orgDepartmentVOList) {
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java
@@ -567,7 +567,7 @@
    }
    /**
     * ä¿å­˜ç”¨æˆ·è§’色关联关系
     * æˆå‘˜ç®¡ç†åˆ†é…è§’色调用,保存用户角色关联关系
     * @param userOids
     * @param roleIds
     * @return
@@ -576,7 +576,23 @@
    public boolean saveRights(String[] userOids, String[] roleIds) throws PLException {
        VciBaseUtil.alertNotNull(userOids,"用户主键");
        //roleIds允许为空,为空时清空当前用户的权限
        return platformClientUtil.getFrameworkService().saveRights(roleIds,userOids,new UserEntityInfo());
        UserEntityInfo userEntityInfo = new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(),null);
        return platformClientUtil.getFrameworkService().saveRights(roleIds,userOids,userEntityInfo);
    }
    /**
     * è§’色管理分配成员接口调用
     * @param userOids
     * @param roleId
     * @return
     * @throws PLException
     */
    @Override
    public boolean saveRight(String[] userOids, String roleId) throws PLException {
        VciBaseUtil.alertNotNull(roleId,"角色主键");
        //roleIds允许为空,为空时清空当前用户的权限
        UserEntityInfo userEntityInfo = new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(),null);
        return platformClientUtil.getFrameworkService().saveRight(roleId,userOids,userEntityInfo);
    }
    /**
@@ -632,7 +648,7 @@
                smRoleDTO.getName(),"角色名");
        //查询数据库中的,根据角色名查
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("pluid",smRoleDTO.getOid());
        conditionMap.put("plname",smRoleDTO.getName());
        SmRoleVO dbSmRoleVO = getRoleByConditionMap(conditionMap);
        //根据主键没查询到了用户
        if(Func.isEmpty(dbSmRoleVO) || Func.isBlank(dbSmRoleVO.getOid())){
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -30,7 +30,6 @@
import com.vci.starter.web.util.*;
import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
import com.vci.web.enumpck.UserTypeEnum;
import com.vci.web.model.WFProcessClassifyDO;
import com.vci.web.service.WebBoServiceI;
import com.vci.web.util.Func;
import com.vci.web.util.PlatformClientUtil;
@@ -123,7 +122,7 @@
    /**
     * ç”¨æˆ·åˆ†é¡µæŸ¥è¯¢æ—¶èŽ·å–éƒ¨é—¨æ”¾åˆ°è¿™é‡Œé¿å…é‡å¤æŸ¥è¯¢
     */
    private Map<String,List<OrgDepartmentVO>> orgDepartmentVOMap;
    private Map<String,Map<String,String>> orgDepartmentVOMap;
    /**
     * ç”¨æˆ·åˆ†é¡µæŸ¥è¯¢æ—¶èŽ·å–è§’è‰²æ”¾åˆ°è¿™é‡Œé¿å…é‡å¤æŸ¥è¯¢
@@ -323,21 +322,19 @@
        smUserVO.setPassword(userInfo.pwd);
        smUserVO.setConfirmPassword(userInfo.pwd);
        //用户所属部门的查询设置
        List<OrgDepartmentVO> orgDepartmentVOList;
        Map<String,String> orgDepartmentVOList;
        //查看全局变量中是否存在部门信息,存在的情况最主要是针对多条用户查询的时候避免重复查询的
        if(Func.isNotEmpty(orgDepartmentVOMap)){
            orgDepartmentVOList = orgDepartmentVOMap.get(userInfo.id);
            orgDepartmentVOList = Func.isNotEmpty(orgDepartmentVOMap.get(userInfo.id)) ?
                    orgDepartmentVOMap.get(userInfo.id):new HashMap<>();
        }else {
            orgDepartmentVOList = orgDeptQueryService.listDeptByUserOid(userInfo.id,null);
            Map<String, Map<String, String>> tempDeptMap = orgDeptQueryService.batchMapDeptNameByUserOids(Arrays.asList(userInfo.id), null);
            orgDepartmentVOList = Func.isNotEmpty(tempDeptMap.get(userInfo.id)) ?
                    tempDeptMap.get(userInfo.id):new HashMap<>();
        }
        smUserVO.setPkDepartment(
                Func.isEmpty(orgDepartmentVOList) ?
                        null:orgDepartmentVOList.stream().map(OrgDepartmentVO::getOid).collect(Collectors.joining(","))
        );
        smUserVO.setPkDepartmentName(
                Func.isEmpty(orgDepartmentVOList) ?
                        null:orgDepartmentVOList.stream().map(OrgDepartmentVO::getName).collect(Collectors.joining(","))
        );
        //部门oid,正常情况下一个用户只会存在一个部门下
        smUserVO.setPkDepartment(orgDepartmentVOList.keySet().stream().collect(Collectors.joining(",")));
        smUserVO.setPkDepartmentName(orgDepartmentVOList.values().stream().collect(Collectors.joining(",")));
        //密码策略查询设置
        SmPasswordStrategyVO smPasswordStrategyVO;
        if(Func.isNotEmpty(smPwdStrategyVOMap)){
@@ -536,7 +533,7 @@
        DataGrid<SmUserVO> dataGrid = new DataGrid<>();
        if(Func.isNotEmpty(userInfos)){
            List<String> idList = Arrays.stream(userInfos).map(item -> item.id).collect(Collectors.toList());
            orgDepartmentVOMap = orgDeptQueryService.batchListDeptByUserOids(idList, null);
            orgDepartmentVOMap = orgDeptQueryService.batchMapDeptNameByUserOids(idList, null);
            smRoleVOMap = smRoleQueryService.batchListRoleByUserOids(idList,null);
            smPwdStrategyVOMap = smPwdStrategyQueryService.batchSmPwdStrategyByUserOids(idList);
            dataGrid.setData(userInfoArr2VO(userInfos));
@@ -607,10 +604,27 @@
    @Override
    public List<SmUserVO> countSmUserByDeptOid(String deptOid, Map<String, String> queryMap) throws VciBaseException {
        //是否查询子部门下关联的用户
        List<OrgDepartmentVO> orgDepartmentVOList = orgDeptQueryService.listChildrenDeptByParentOid(deptOid, null);
        List<OrgDepartmentVO> orgDepartmentVOList = orgDeptQueryService.listAllLevelChildrenDeptByParentOid(deptOid, null);
        List<String> deptOidCollection = orgDepartmentVOList.stream().map(OrgDepartmentVO::getOid).collect(Collectors.toList());
        deptOidCollection.add(deptOid);//将当前层的oid也放进去
        return listUserVOByDeptOid(queryMap,deptOidCollection,false);
        List<SmUserVO> smUserVOList = listUserVOByDeptOid(queryMap, deptOidCollection, false);
        if(Func.isEmpty(smUserVOList)){
            return new ArrayList<>();
        }
        Map<String, List<SmRoleVO>> smRoleVOMap = smRoleQueryService.batchListRoleByUserOids(smUserVOList.stream().map(SmUserVO::getOid).collect(Collectors.toSet()), null);
        smUserVOList = smUserVOList.stream().map(vo->{
            List<SmRoleVO> smRoleVOS = smRoleVOMap.get(vo.getOid());
            vo.setPkPerson(
                    Func.isEmpty(smRoleVOS) ?
                            null:smRoleVOS.stream().map(SmRoleVO::getOid).collect(Collectors.joining(","))
            );
            vo.setPkPersonName(
                    Func.isEmpty(smRoleVOS) ?
                            null:smRoleVOS.stream().map(SmRoleVO::getName).collect(Collectors.joining(","))
            );
            return vo;
        }).collect(Collectors.toList());
        return smUserVOList;
    }
     /**
@@ -672,6 +686,7 @@
        queryWrapperForDO.setLinkTableSql(" left join pluserdept up on " + queryWrapperForDO.getTableNick() + ".pluid = up.pluseruid" +
                " left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
                " left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapperForDO.getTableNick() + ".pluid = pkUserPassword.pluseruid ");
        queryWrapperForDO.setOrderSql("order by " + queryWrapperForDO.getTableNick() + ".pltrueName");
        List<SmUserDO> smUserDOList = new ArrayList<>();
        //userOidList为空时的两种情况
        if(Func.isEmpty(userOidList)){
@@ -1198,9 +1213,7 @@
        }
        //根据当前创建这个用户的人所绑定密码策略来进行密码校验
        try {
            //TODO:为了方便调试,所以这儿先注释写死后面记得更改
            String userName = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
            //String userName = "developer";
            String error = platformClientUtil.getFrameworkService().checkPasswordStrategyByUserId(userName, smUserDTO.getPassword(),null);
            if (!StringUtils.isBlank(error)) {
                throw new VciBaseException("当前设置的密码,密码策略校验未通过");
@@ -1330,7 +1343,6 @@
            ReadExcelOption excelOption = new ReadExcelOption();
            //当前登录的用户账号
            String loginUserId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
            //String loginUserId = "developer";
            UserEntityInfo userEntityInfo = new UserEntityInfo(loginUserId,null);
            //是否导入密级配置
            boolean exportSecretGrade = Boolean.parseBoolean(ConfigReader.getConfigValue("exportSecretGrade"));
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java
@@ -1,20 +1,34 @@
package com.vci.frameworkcore.controller;
import com.vci.corba.common.PLException;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.corba.framework.data.DeptInfo;
import com.vci.frameworkcore.compatibility.OrgDeptQueryServiceI;
import com.vci.frameworkcore.constant.FrameWorkLangCodeConstant;
import com.vci.frameworkcore.model.dto.OrgDepartmentDTO;
import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
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.ControllerUtil;
import com.vci.starter.web.util.LangBaseUtil;
import com.vci.starter.web.util.LocalFileUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.web.util.Func;
import com.vci.web.util.PlatformClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
/**
@@ -65,18 +79,18 @@
    /**
     * ä¿å­˜éƒ¨é—¨ç”¨æˆ·å…³è”信息,平台自带查重功能
     * @param userOIds ç”¨æˆ·id
     * @param userOids ç”¨æˆ·id
     * @param deptId éƒ¨é—¨oid
     * @return
     */
    @RequestMapping(value = "/saveUsersDepts",method = RequestMethod.POST)
    public BaseResult saveUsersDepts(String[] userOIds, String deptId){
    public BaseResult saveUsersDepts(String[] userOids, String deptId){
        //不能同时为空
        if(Func.isEmpty(userOIds) && Func.isBlank(deptId)){
        if(Func.isEmpty(userOids) && Func.isBlank(deptId)){
            return BaseResult.fail("角色主键和部门主键,参数不能同时为空!");
        }
        try {
            return deptQueryService.saveUsersDept(userOIds,deptId) ? BaseResult.success("部门分配成功!"):BaseResult.fail("部门分配失败!");
            return deptQueryService.saveUsersDept(userOids,deptId) ? BaseResult.success("部门分配成功!"):BaseResult.fail("部门分配失败!");
        }catch (Exception e){
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
@@ -91,7 +105,6 @@
     * @return
     */
    @RequestMapping(value = "/addDept",method = RequestMethod.POST)
    @VciUnCheckRight
    public BaseResult addDept(@RequestBody OrgDepartmentDTO orgDepartmentDTO){
        try {
            return deptQueryService.addDept(orgDepartmentDTO) ? BaseResult.success("部门添加成功!"):BaseResult.fail("部门添加失败!");
@@ -109,7 +122,6 @@
     * @return
     */
    @RequestMapping(value = "/updateDept",method = RequestMethod.PUT)
    @VciUnCheckRight
    public BaseResult updateRole(@RequestBody OrgDepartmentDTO orgDepartmentDTO){
        try {
            return deptQueryService.updateDept(orgDepartmentDTO) ? BaseResult.success("部门修改成功!"):BaseResult.fail("部门修改失败!");
@@ -127,7 +139,6 @@
     * @return
     */
    @RequestMapping(value = "/deleteDept",method = RequestMethod.DELETE)
    @VciUnCheckRight
    public BaseResult deleteDept(String[] ids){
        try {
            return deptQueryService.deleteDept(ids) ? BaseResult.success("删除部门成功!"):BaseResult.fail("删除部门失败!");
@@ -139,4 +150,50 @@
        }
    }
    /**
     * ä¸‹è½½äººå‘˜å¯¼å…¥æ¨¡æ¿
     * @param downloadFileName
     * @param response
     */
    @RequestMapping(value = "/downloadImportTemplate",method = RequestMethod.GET)
    @VciUnCheckRight
    public void downloadImportTemplate(String downloadFileName, HttpServletResponse response){
        try {
            String excelPath = deptQueryService.downloadImportTemplate(downloadFileName);
            ControllerUtil.writeFileToResponse(response,excelPath);
        } catch (Exception e) {
            String msg = "下载部门导入模板时出现错误,原因:" + LangBaseUtil.getErrorMsg(e);
            try {
                e.printStackTrace();
                ControllerUtil.writeDataToResponse(response,"error_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss") + ".txt", StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
    /**
     * éƒ¨é—¨å¯¼å…¥
     * @param file
     * @return
     */
    @RequestMapping(value = "/importDept",method = RequestMethod.POST)
    @VciUnCheckRight
    public BaseResult importUser(MultipartFile file){
        String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
        File file1 = new File(excelFileName);
        try {
            file.transferTo(new File(excelFileName));
            if (file != null) {
                return deptQueryService.importDept(file1);
            } else {
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"});
            }
        }catch (Throwable e) {
            throw new VciBaseException(e.getMessage(),new String[0],e);
        }finally {
            file1.delete();
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java
@@ -195,7 +195,7 @@
    }
    /**
     * åˆ†é…è§’色:保存用户角色关联关系,用户管理的分配角色和角色管理的分配成员共用
     * æˆå‘˜ç®¡ç†åˆ†é…è§’色:保存用户角色关联关系
     * @param userOids
     * @param roleIds
     * @return
@@ -207,8 +207,26 @@
        }catch (Exception e){
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            log.error("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("根据用户主键获取,关联的角色时出现错误,原因:" + exceptionMessage);
            log.error("分配角色时出现错误,原因:" + exceptionMessage);
            return BaseResult.fail("分配角色时出现错误,原因:" + exceptionMessage);
        }
    }
    /**
     * è§’色管理分配成员:保存用户角色关联关系
     * @param userOids
     * @param roleId
     * @return
     */
    @RequestMapping(value = "/saveRight",method = RequestMethod.POST)
    public BaseResult saveRight(String[] userOids, String roleId){
        try {
            return roleQueryService.saveRight(userOids,roleId) ? 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/model/OrgDeptForPlatform1.java
@@ -31,6 +31,16 @@
    private String plnum;
    /**
     * éƒ¨é—¨ä»£å·
     */
    private String plcode;
    /**
     * ä¸“业
     */
    private String plspecialties;
    /**
     * åœç”¨å¯ç”¨çŠ¶æ€
     */
    private Short plstatus;
@@ -48,7 +58,7 @@
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date plcreatetime;
    private Long plcreatetime;
    /**
     * åˆ›å»ºäºº
@@ -58,7 +68,7 @@
    /**
     * æœ€åŽä¿®æ”¹æ—¶é—´
     */
    private Date plupdatetime;
    private Long plupdatetime;
    /**
     * æœ€åŽä¿®æ”¹äºº
@@ -69,6 +79,22 @@
     * ä¸çŸ¥é“做啥的
     */
    private String pllicensors;
    public String getPlspecialties() {
        return plspecialties;
    }
    public void setPlspecialties(String plspecialties) {
        this.plspecialties = plspecialties;
    }
    public String getPlcode() {
        return plcode;
    }
    public void setPlcode(String plcode) {
        this.plcode = plcode;
    }
    public String getPluid() {
        return pluid;
@@ -118,11 +144,11 @@
        this.pldesc = pldesc == null ? null : pldesc.trim();
    }
    public Date getPlcreatetime() {
    public Long getPlcreatetime() {
        return plcreatetime;
    }
    public void setPlcreatetime(Date plcreatetime) {
    public void setPlcreatetime(Long plcreatetime) {
        this.plcreatetime = plcreatetime;
    }
@@ -134,11 +160,11 @@
        this.plcreateuser = plcreateuser == null ? null : plcreateuser.trim();
    }
    public Date getPlupdatetime() {
    public Long getPlupdatetime() {
        return plupdatetime;
    }
    public void setPlupdatetime(Date plupdatetime) {
    public void setPlupdatetime(Long plupdatetime) {
        this.plupdatetime = plupdatetime;
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/model/dto/OrgDepartmentDTO.java
@@ -83,11 +83,11 @@
    /**
     * ä¸“业
     */
    public String specialties;
    private String specialties;
    /**
     * çŠ¶æ€
     */
    public short status;
    private short status;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/model/po/OrgDeptPO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.vci.frameworkcore.model.po;
import com.vci.starter.poi.annotation.ExcelColumn;
import com.vci.starter.web.pagemodel.BaseModelVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * éƒ¨é—¨çš„导入导出对象
 * @author ludc
 * @date 2024/7/5 16:35
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrgDeptPO extends BaseModelVO {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
    private static final long serialVersionUID = -2239512786206928201L;
    /**
     * æ‰€åœ¨æ•°æ®è¡Œ
     */
    @ExcelColumn(rowIndexColumn = true,value = "")
    private String rowIndex;
    /**
     * ä¸»é”®
     */
    @ExcelColumn(value="ID")
    private String id;
    /**
     * éƒ¨é—¨åç§°
     */
    @ExcelColumn(value="名称",nullable = false)
    private String name;
    /**
     * ç¼–号
     */
    @ExcelColumn(value="编号")
    private String num;
    /**
     * éƒ¨é—¨ä»£å·ï¼Œå¯¹åº”表中plcode字段
     */
    @ExcelColumn(value="代号")
    private String code;
    /**
     * ä¸“业
     */
    @ExcelColumn(value="专业")
    private String specialties;
    /**
     * çˆ¶id
     */
    @ExcelColumn(value="父ID(部门唯一标识ID)")
    private String parentId;
    /**
     * æè¿°
     */
    @ExcelColumn(value="描述")
    private String desc;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDepartmentVO.java
@@ -20,9 +20,34 @@
    private String id;
    /**
     * é™¤éƒ¨é—¨ä¸»é”®å¤–的唯一标识,长度为8位,可通过该参数反推回部门主键;主要用于导入部门时使用
     */
    private String uniqueId;
    /**
     * éƒ¨é—¨åç§°
     */
    private String name;
    /**
     * éƒ¨é—¨ä»£å·
     */
    private String code;
    /**
     * ä¸“业
     */
    private String specialties;
    /**
     * åœç”¨å¯ç”¨çŠ¶æ€
     */
    private Short status;
    /**
     * åœç”¨å¯ç”¨çŠ¶æ€æ˜¾ç¤ºå€¼
     */
    private String statusText;
    /**
     * éƒ¨é—¨çº§åˆ«
@@ -73,7 +98,49 @@
     * éƒ¨é—¨è”系电话
     */
    private String tel;
     private int treelevel;
    private int treelevel;
    public String getCode() {
        return code;
    }
    public String getSpecialties() {
        return specialties;
    }
    public Short getStatus() {
        return status;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public void setSpecialties(String specialties) {
        this.specialties = specialties;
    }
    public void setStatus(Short status) {
        this.status = status;
    }
    public void setStatusText(String statusText) {
        this.statusText = statusText;
    }
    public String getStatusText() {
        return statusText;
    }
    public String getUniqueId() {
        return uniqueId;
    }
    public void setUniqueId(String uniqueId) {
        this.uniqueId = uniqueId;
    }
    @Override
    public String getId() {
        return id;
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/Func.java
@@ -40,6 +40,60 @@
public class Func {
    /**
     * é€šå¸¸ç”¨äºŽå°†ä¸»é”®oid转换成8位唯一hash码值
     * @return
     */
    public static String oidEnHash(String oid){
        UUID originalUUID = UUID.fromString(oid);
        // ä½¿ç”¨Base64编码将原始UUID转换为较短的字符串
        String base64String = Base64.getUrlEncoder().withoutPadding().encodeToString(new byte[] {
                (byte)(originalUUID.getMostSignificantBits()>>>56),
                (byte)(originalUUID.getMostSignificantBits()>>>48),
                (byte)(originalUUID.getMostSignificantBits()>>>40),
                (byte)(originalUUID.getMostSignificantBits()>>>32),
                (byte)(originalUUID.getMostSignificantBits()>>>24),
                (byte)(originalUUID.getMostSignificantBits()>>>16),
                (byte)(originalUUID.getMostSignificantBits()>>>8),
                (byte)(originalUUID.getMostSignificantBits()),
                (byte)(originalUUID.getLeastSignificantBits()>>>56),
                (byte)(originalUUID.getLeastSignificantBits()>>>48),
                (byte)(originalUUID.getLeastSignificantBits()>>>40),
                (byte)(originalUUID.getLeastSignificantBits()>>>32),
                (byte)(originalUUID.getLeastSignificantBits()>>>24),
                (byte)(originalUUID.getLeastSignificantBits()>>>16),
                (byte)(originalUUID.getLeastSignificantBits()>>>8),
                (byte)(originalUUID.getLeastSignificantBits())});
        return base64String;
    }
    /**
     * é€šå¸¸ç”¨äºŽå°†ä¸»é”®oid转换成的8位唯一hash码,反转为oid
     * @param base64String
     * @return
     */
    public static String oidDeHash(String base64String){
        // åæŽ¨å›žåŽŸå§‹çš„UUID字符串
        byte[] bytes = Base64.getUrlDecoder().decode(base64String);
        UUID reconstructedUUID = new UUID(((long)(bytes[0] & 0xff) << 56)
                | ((long)(bytes[1] & 0xff) << 48)
                | ((long)(bytes[2] & 0xff) << 40)
                | ((long)(bytes[3] & 0xff) << 32)
                | ((long)(bytes[4] & 0xff) << 24)
                | ((long)(bytes[5] & 0xff) << 16)
                | ((long)(bytes[6] & 0xff) << 8)
                | (bytes[7] & 0xff),
                ((long)(bytes[8] & 0xff) << 56)
                        | ((long)(bytes[9] & 0xff) << 48)
                        | ((long)(bytes[10] & 0xff) << 40)
                        | ((long)(bytes[11] & 0xff) << 32)
                        | ((long)(bytes[12] & 0xff) << 24)
                        | ((long)(bytes[13] & 0xff) << 16)
                        | ((long)(bytes[14] & 0xff) << 8)
                        | (bytes[15] & 0xff));
        return reconstructedUUID.toString().toUpperCase(Locale.ROOT);
    }
    /**
     * æ–­è¨€ï¼Œå¿…须不能为 null
     * <blockquote><pre>
     * public Foo(Bar bar) {