Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -1,5 +1,6 @@
package com.vci.frameworkcore.compatibility.impl;
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 +10,13 @@
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.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;
@@ -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;
   /**
    * 用户分页查询时获取角色放到这里避免重复查询
@@ -184,7 +183,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);
@@ -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)){
@@ -1006,23 +1021,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);
      }
@@ -1198,10 +1242,8 @@
      }
      //根据当前创建这个用户的人所绑定密码策略来进行密码校验
      try {
         //TODO:为了方便调试,所以这儿先注释写死后面记得更改
         String userName = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
         //String userName = "developer";
         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("当前设置的密码,密码策略校验未通过");
         }
@@ -1280,7 +1322,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("账号", "密码", "姓名", "电子邮箱", "专业", "描述", "部门(上下级部门之间以反斜杠隔开(/))" ,"密级"));
      }
@@ -1320,7 +1362,7 @@
    * @throws VciBaseException
    */
   @Override
   public BaseResult importUser(File file) throws VciBaseException {
   public BaseResult importUser(File file) throws Exception {
      VciBaseUtil.alertNotNull(file,"excel文件");
      if(!file.exists()){
         throw new VciBaseException("导入的excel文件不存在,{0}",new String[]{file.getPath()});
@@ -1330,10 +1372,9 @@
         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"));
         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());
            //是否必须导入密级
@@ -1357,7 +1398,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 -> {