xiejun
2024-09-13 b8d0022a3c40c59322661e8eee568643fdeb9c50
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -1,5 +1,8 @@
package com.vci.frameworkcore.compatibility.impl;
import com.vci.corba.framework.data.DeptInfo;
import com.vci.corba.framework.data.RoleInfo;
import com.vci.dto.SmUserDTO;
import com.vci.common.util.ThreeDES;
import com.vci.corba.common.PLException;
import com.vci.corba.common.data.UserEntityInfo;
@@ -9,14 +12,14 @@
import com.vci.frameworkcore.compatibility.SmPwdStrategyQueryServiceI;
import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
import com.vci.frameworkcore.model.dto.SmUserDTO;
import com.vci.frameworkcore.model.SmUserDO;
import com.vci.frameworkcore.model.po.SmUserPO;
import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
import com.vci.frameworkcore.pagemodel.SmPasswordStrategyVO;
import com.vci.frameworkcore.pagemodel.SmRoleVO;
import com.vci.frameworkcore.pagemodel.SmUserVO;
import com.vci.frameworkcore.properties.ConfigReader;
import com.vci.frameworkcore.enumpck.OrgTypeEnum;
import com.vci.model.SmUserDO;
import com.vci.pagemodel.SmUserVO;
import com.vci.po.SmUserPO;
import com.vci.pagemodel.OrgDepartmentVO;
import com.vci.pagemodel.SmPasswordStrategyVO;
import com.vci.pagemodel.SmRoleVO;
import com.vci.frameworkcore.properties.ConfigCorbaReader;
import com.vci.omd.utils.ObjectTool;
import com.vci.starter.poi.bo.ReadExcelOption;
import com.vci.starter.poi.bo.WriteExcelData;
@@ -36,6 +39,7 @@
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -117,7 +121,7 @@
   /**
    * 必填列
    */
   private ArrayList<Integer> ColumnNameisRed = new ArrayList<Integer>();
   private List<Integer> ColumnNameisRed = new ArrayList<Integer>();
   /**
    * 用户分页查询时获取部门放到这里避免重复查询
@@ -183,7 +187,7 @@
    * @return 用户的信息
    * @throws VciBaseException 查询出错的时候会抛出异常
    */
   private SmUserVO getUserByField(String queryField,String queryValue) throws VciBaseException{
   private SmUserVO getUserByField(String queryField, String queryValue) throws VciBaseException{
      VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(null, SmUserDO.class,null,true);
      queryWrapper.eq(queryWrapper.getTableNick() + "." +queryField,queryValue);
      queryWrapper.setDistinct(true);
@@ -942,7 +946,168 @@
      return treeList;
   }
    /**
   /**
    * 获取角色数据
    * @param treeQueryObject
    * @return
    * @throws VciBaseException
    */
   @Override
   public List<Tree> refPersonOrgTree(TreeQueryObject treeQueryObject) throws VciBaseException {
      List<Tree> rootTreeList=new ArrayList<>();
       Map<String,String> conditionMap=treeQueryObject.getConditionMap();
       if(CollectionUtils.isEmpty(conditionMap)) {
          conditionMap = new HashMap<>();
       }
      String dataType=StringUtils.isNotBlank(conditionMap.get("dataType"))?conditionMap.get("dataType"):"";//数据类型
      String parentId=StringUtils.isNotBlank(conditionMap.get("parentId"))?conditionMap.get("parentId"):"";//父节点
      String orgType=StringUtils.isNotBlank(conditionMap.get("orgType"))?conditionMap.get("orgType"):"";//接口查询包含的类型
      try {
         initChildTree(dataType,orgType,parentId,rootTreeList);
      } catch (PLException e) {
         throw new  VciBaseException("用户权限选择树加载失败:"+e.getMessage());
      }
      return rootTreeList;
   }
   /***
    *
    * @param dataType
    * @param orgType
    * @param parentId
    */
   private void initChildTree(String dataType,String orgType, String  parentId, List<Tree>rootTreeList) throws PLException {
      if(StringUtils.isBlank(parentId)){
         Tree rootTree=new Tree("root","人员组织","root");
         rootTree.setParentBtmName("root");
         rootTree.setExpanded(true);
         List<Tree> childList=new ArrayList<>();
         if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(orgType)){//如果是人员
            Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
            childList.add(userTree);
         }else if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(orgType)){//如果是部门
            Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
            childList.add(departmentTree);
         }else if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(orgType)){//如果是角色
            Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
            childList.add(roleTree);
         }else{
            Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
            childList.add(userTree);
            Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
            childList.add(departmentTree);
            Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
            childList.add(roleTree);
         }
         if(childList.size()>0){
            rootTree.setExpanded(true);
            rootTree.setChildren(childList);
         }
         rootTreeList.add(rootTree);
      }else{
         if(OrgTypeEnum.ORG_TYPE_ROOT.getValue().equals(dataType)){//如果父节点有值,则需要判断是加载什么节点
            Tree rootTree=new Tree("root","人员组织","root");
            rootTree.setParentBtmName("root");
            rootTree.setExpanded(true);
            if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(orgType)){//如果是人员
               Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
               rootTreeList.add(userTree);
            }else if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(orgType)){//如果是部门
               Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
               rootTreeList.add(departmentTree);
            }else if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(orgType)){//如果是角色
               Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
               rootTreeList.add(roleTree);
            }else{
               Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
               rootTreeList.add(userTree);
               Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
               rootTreeList.add(departmentTree);
               Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
               rootTreeList.add(roleTree);
            }
         }else if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(dataType)) {//如果传进来的是user节点
            if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(parentId)) {
               Tree userTree = initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(), "用户", OrgTypeEnum.ORG_TYPE_USER.getValue(), OrgTypeEnum.ORG_TYPE_USER.getValue(), null);
               UserInfo[] infos = platformClientUtil.getFrameworkService().fetchUserInfo();
               Arrays.stream(infos).forEach(info -> {
                  Tree childTree = initDataTreeNode(info.id, info.trueName + "(" + info.userName + ")", info, OrgTypeEnum.ORG_TYPE_USER.getValue(), userTree);
                  rootTreeList.add(childTree);
               });
            }
         }else   if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(dataType)) {//如果是部门
            DeptInfo[] deptInfos=new DeptInfo[]{};
            Tree departmentTree=new Tree();
            if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(parentId)) {
               departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),null);
               deptInfos = platformClientUtil.getFrameworkService().fetchDepartmentInfo();
            }else{
               deptInfos=platformClientUtil.getFrameworkService().fetchDepartmentInfoByParentId(parentId);
               DeptInfo deptInfo=platformClientUtil.getFrameworkService().fetchDepartmentInfoById(parentId);
               departmentTree=initDataTreeNode(deptInfo.id,deptInfo.name,deptInfo,OrgTypeEnum.ORG_TYPE_DEPT.getValue(),null);
            }
            if(!CollectionUtils.isEmpty(Arrays.asList(deptInfos))){
               Tree finalDepartmentTree = departmentTree;
               Arrays.stream(deptInfos).forEach(deptInfo -> {
                  Tree childTree=initDataTreeNode(deptInfo.id,deptInfo.name,deptInfo,OrgTypeEnum.ORG_TYPE_DEPT.getValue(), finalDepartmentTree);
                  rootTreeList.add(childTree);
               });
            }
            if(!OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(parentId)) {
               UserInfo[] infos = platformClientUtil.getFrameworkService().getUserByDeptId(parentId);
               if (infos != null && infos.length > 0) {
                  Tree finalDepartmentTree = departmentTree;
                  Arrays.stream(infos).forEach(info -> {
                     Tree childTree = initDataTreeNode(info.id, info.trueName + "(" + info.userName + ")", info, OrgTypeEnum.ORG_TYPE_USER.getValue(), finalDepartmentTree);
                     rootTreeList.add(childTree);
                  });
               }
            }
         }else  if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(dataType)) {//如果是角色
            if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(parentId)){
               Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),null);
               RoleInfo[] roleInfos=platformClientUtil.getFrameworkService().fetchRoleInfo();
               if(roleInfos!=null&&roleInfos.length>0) {
                  Arrays.stream(roleInfos).forEach(info -> {
                     Tree childTree = initDataTreeNode(info.id, info.name, info, OrgTypeEnum.ORG_TYPE_ROLE.getValue(), roleTree);
                     rootTreeList.add(childTree);
                  });
               }
            }else{
               RoleInfo roleInfo=platformClientUtil.getFrameworkService().fetchRoleInfoById(parentId);
               Tree roleTree=initDataTreeNode(roleInfo.id,roleInfo.name,roleInfo,OrgTypeEnum.ORG_TYPE_ROLE.getValue(),null);
               UserInfo[] infos=platformClientUtil.getFrameworkService().fetchUserInfoByRoleId(roleInfo.id,roleInfo.type);
               if(infos!=null&&infos.length>0) {
                  Arrays.stream(infos).forEach(info -> {
                     Tree childTree = initDataTreeNode(info.id, info.trueName + "(" + info.userName + ")", info, OrgTypeEnum.ORG_TYPE_USER.getValue(), roleTree);
                     rootTreeList.add(childTree);
                  });
               }
            }
         }
      }
   }
   /***
    *
    * @param oid
    * @param text
    * @param o
    * @param type
    * @param parentTree
    * @return
    */
   private Tree initDataTreeNode(String oid,String text,Object o,String type,Tree parentTree){
      Tree ObjectTreeNode=new Tree(oid,text,o);
      ObjectTreeNode.setParentBtmName(type);
      if(parentTree!=null) {
         ObjectTreeNode.setParentId(parentTree.getParentId());
         ObjectTreeNode.setParentName(parentTree.getParentName());
      }
      return ObjectTreeNode;
   }
   /**
     * 校验密码是否相同,在新平台中存储的密码是两次md5
     * @param userOid 用户主键
     * @param md5Password 已经md5加密一次的密码--老的平台里不能加密
@@ -1021,23 +1186,52 @@
    /**
     * 修改密码
     * @param userOid 用户主键
     * @param oldPassword 旧的密码
     * @param password 新的密码
     * @param confirmPassword 确认密码
     */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void changePassword(String userOid, String password,
         String confirmPassword) throws VciBaseException {
      WebUtil.alertNotNull(userOid,"用户主键",password,"密码",confirmPassword,"确认密码");
   public boolean changePassword(String userOid,String oldPassword, String password,
         String confirmPassword) throws Exception {
      WebUtil.alertNotNull(userOid,"用户主键",oldPassword,"登录密码",password,"密码",confirmPassword,"确认密码");
      if(!password.equals(confirmPassword)){
         throw new VciBaseException("密码和确认密码不相等");
      }
      //对旧密码和密码进行解密,便于比对密码用
      oldPassword = Func.decryptAes(oldPassword,"daliantan0v0vcip");
      password = Func.decryptAes(password,"daliantan0v0vcip");
      //对比旧密码
      boolean b = this.checkPasswordEqual(oldPassword, userOid);
      if(!b){
         throw new PLException("500", new String[] { "您输入的密码与登录密码不一致,请重新输入!"});
      }
      SmUserVO smUserVO = getUserByUserOid(userOid);
      if(Func.isEmpty(smUserVO)){
         throw new VciBaseException("当前修改的用户不存在!");
      }
      //TODO:校验密码是否符合策略
      String error = platformClientUtil.getFrameworkService().checkPasswordStrategyByUserId(smUserVO.getId(), password,null);
      if (!StringUtils.isBlank(error)) {
         throw new VciBaseException("当前设置的密码,密码策略校验未通过!");
      }
      //TODO:考虑是否需要将修改方式改成直接调用平台的接口,因为现在的修改方式没能正确的更新缓存
      /*UserInfo userInfo = new UserInfo();
      userInfo.id = userOid.trim();
      userInfo.pwd = password;
      userInfo.pwdUpdateTime = System.currentTimeMillis();
      boolean updateBoolean = platformClientUtil.getFrameworkService().updateUser(userInfo, new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(), null));
      return updateBoolean;*/
      ThreeDES des = new ThreeDES();// 实例化一个对�?
      des.getKey("daliantan0v0");// 生成密匙
      String encPassword = des.getEncString(password);
      String sql = "update pluser set plpassword = '" + encPassword + "' where pluid = '" + userOid.trim() + "'";
      //修改密码的同时需要将密码修改时间也更新
      String sql = "update pluser set plpassword = '" + encPassword + "', plpwdupdatetime = TO_DATE('"
            + Func.format(new Date(),"yyyy-MM-dd HH:mm:ss") +"','yyyy-MM-dd hh24:mi:ss') where pluid = '" + userOid.trim() + "'";
      try {
         platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
         return platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
@@ -1213,8 +1407,8 @@
      }
      //根据当前创建这个用户的人所绑定密码策略来进行密码校验
      try {
         String userName = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
         String error = platformClientUtil.getFrameworkService().checkPasswordStrategyByUserId(userName, smUserDTO.getPassword(),null);
         String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
         String error = platformClientUtil.getFrameworkService().checkPasswordStrategyByUserId(userId, smUserDTO.getPassword(),null);
         if (!StringUtils.isBlank(error)) {
            throw new VciBaseException("当前设置的密码,密码策略校验未通过");
         }
@@ -1293,7 +1487,7 @@
      // 设置表单列名
      List<String> columns = new ArrayList<>(Arrays.asList("账号", "密码", "姓名", "电子邮箱", "专业", "描述", "部门(上下级部门之间以反斜杠隔开(/))"));
      //获取是否导出密级配置项
      String flag = ConfigReader.getConfigValue("exportSecretGrade");
      String flag = ConfigCorbaReader.getConfigValue("exportSecretGrade");
      if (flag != null && flag.equalsIgnoreCase("true")) {
         columns = new ArrayList<>(Arrays.asList("账号", "密码", "姓名", "电子邮箱", "专业", "描述", "部门(上下级部门之间以反斜杠隔开(/))" ,"密级"));
      }
@@ -1345,7 +1539,7 @@
         String loginUserId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
         UserEntityInfo userEntityInfo = new UserEntityInfo(loginUserId,null);
         //是否导入密级配置
         boolean exportSecretGrade = Boolean.parseBoolean(ConfigReader.getConfigValue("exportSecretGrade"));
         boolean exportSecretGrade = Boolean.parseBoolean(ConfigCorbaReader.getConfigValue("exportSecretGrade"));
         List<SmUserPO> poList = ExcelUtil.readDataObjectFromExcel(file, SmUserPO.class,excelOption,(value, po, fieldName)->{
            Integer secretValue = UserSecretEnum.getSecretValueByText(po.getSecretGradeText());
            //是否必须导入密级
@@ -1369,7 +1563,9 @@
         //当前excel中是否重复用的判重Map:(key:账号,value:行号)
         Map<String, String> excelReapeat = new HashMap<>();
         //先获取全部部门名称的父子对应关系:key为部门子父级名称路径,value为部门信息
         Map<String,OrgDepartmentVO> deptVOMap = orgDeptQueryService.getDeptAllTreeMap();
         List<OrgDepartmentVO> orgDepartmentVOList = orgDeptQueryService.getDeptAllFullName();
         Map<String, OrgDepartmentVO> deptVOMap = orgDepartmentVOList.stream().collect(Collectors.toMap(OrgDepartmentVO::getFullDeptNamePath, s->s));
         //Map<String,OrgDepartmentVO> deptVOMap = orgDeptQueryService.getDeptAllTreeMap();
         //判断必填属性是否为空,用户是否已存在,以及部门是否填错等校验逻辑
         List<String> finalRepeatUserId = repeatUserId;
         poList.stream().forEach(smUserPO -> {