package com.vci.frameworkcore.compatibility.impl; import com.vci.dto.SmPasswordStrategyDTO; import com.vci.corba.common.PLException; import com.vci.corba.common.data.UserEntityInfo; import com.vci.corba.framework.data.PasswordStrategyInfo; import com.vci.corba.omd.data.BusinessObject; import com.vci.frameworkcore.compatibility.SmPwdStrategyQueryServiceI; import com.vci.frameworkcore.compatibility.SmUserQueryServiceI; import com.vci.frameworkcore.enumpck.CombinationEnum; import com.vci.model.SmPasswordStrategyDO; import com.vci.model.SmPasswordStrategyForPlatform1; import com.vci.pagemodel.SmPasswordStrategyVO; import com.vci.omd.utils.ObjectTool; import com.vci.starter.web.constant.QueryOptionConstant; 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.util.BeanUtil; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.util.WebThreadLocalUtil; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; import static com.vci.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST; /** * 密码策略查询服务 * @author ludc * @date 2024/6/24 16:33 */ @Service public class SmPwdStrategyQueryServiceImpl implements SmPwdStrategyQueryServiceI { /** * 业务数据服务 */ @Autowired private WebBoServiceI boService; /** * 用户查询服务 */ @Autowired private SmUserQueryServiceI smUserQueryService; /** * 平台调用客户端 */ @Autowired private PlatformClientUtil platformClientUtil; /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 获取默认密码策略 * @return */ public SmPasswordStrategyVO getPasswordStrategyVOByDefault(){ //获取默认的 VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class); queryWrapperForDO.eq("plisdefault","1"); List cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() + (StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null); if(!CollectionUtils.isEmpty(cboList)){ SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO(); WebUtil.copyValueToObjectFromCbos(cboList.get(0),passwordStrategyDO); return pwdStrategyDO2VO(passwordStrategyDO); } return null; } /** * 密码策略分页查询 * @param conditionMap * @param pageHelper * @return */ @Override public DataGrid refDataGrid(Map conditionMap, PageHelper pageHelper) throws PLException { if(pageHelper == null){ pageHelper = new PageHelper(-1); } pageHelper.addDefaultAsc("pname"); VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap, SmPasswordStrategyForPlatform1.class,pageHelper); //platformClientUtil.getFrameworkService().fetchAllPasswordStrategy(); List smPasswordStrategyForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmPasswordStrategyForPlatform1.class); DataGrid dataGrid = new DataGrid<>(); if(!CollectionUtils.isEmpty(smPasswordStrategyForPlatform1s)){ dataGrid.setData(pltPwdStrategy2SmPwdStrategyVOs(smPasswordStrategyForPlatform1s)); dataGrid.setTotal(boService.countByQueryWrapper(queryWrapper,SmPasswordStrategyForPlatform1.class)); } return dataGrid; } /** * 查询密码安全策略,下拉使用的接口 * @param conditionMap * @return key为密码策略name,value为密码策略的oid * @throws VciBaseException */ @Override public List> selectPwdStrategyMap(Map conditionMap) throws PLException { PageHelper pageHelper = new PageHelper(-1); pageHelper.addDefaultAsc("plname"); PasswordStrategyInfo[] passwordStrategyInfos = platformClientUtil.getFrameworkService().fetchAllPasswordStrategy(); List> mapArrayList = new ArrayList<>(); if(Func.isEmpty(passwordStrategyInfos)){ return mapArrayList; } Arrays.stream(passwordStrategyInfos).forEach(item->{ Map map = new HashMap<>(); map.put("name",item.name); map.put("id",item.id); mapArrayList.add(map); }); return mapArrayList; } /** * 原平台密码策略转SmPasswordStrategyVOS对象 * @param smPasswordStrategyForPlatform1s 原平台的密码策略 * @return */ private List pltPwdStrategy2SmPwdStrategyVOs(List smPasswordStrategyForPlatform1s) throws PLException{ List smPasswordStrategyVOList = new ArrayList<>(); if(!CollectionUtils.isEmpty(smPasswordStrategyForPlatform1s)){ smPasswordStrategyForPlatform1s.stream().forEach(s -> { try { smPasswordStrategyVOList.add(pltPwdStrategy2SmPwdStrategyVO(s)); } catch (PLException e) { e.printStackTrace(); String exceptionMessage = "Platform1对象转VO对象时出现错误,原因:"+VciBaseUtil.getExceptionMessage(e); logger.error(exceptionMessage); throw new VciBaseException(exceptionMessage); } }); } return smPasswordStrategyVOList; } /** * 原平台密码策略转SmPasswordStrategyVO对象 * @param strategyForPlatform1 原平台的密码策略 * @return 新的密码策略对象 */ private SmPasswordStrategyVO pltPwdStrategy2SmPwdStrategyVO(SmPasswordStrategyForPlatform1 strategyForPlatform1) throws PLException { SmPasswordStrategyVO strategyVO = new SmPasswordStrategyVO(); strategyVO.setOid(strategyForPlatform1.getPluid()); strategyVO.setId(""); strategyVO.setName(strategyForPlatform1.getPname()); strategyVO.setMaxLength(strategyForPlatform1.getPlmaxlength()); strategyVO.setMinLength(strategyForPlatform1.getPlength()); strategyVO.setValidDay(strategyForPlatform1.getPoverdueday()); strategyVO.setRemindDay(strategyForPlatform1.getPremindday()); strategyVO.setRetryTime(strategyForPlatform1.getPretrytime()); strategyVO.setLockTime(strategyForPlatform1.getPlocktime()); strategyVO.setDefaultFlag(strategyForPlatform1.getPlisdefault() == 1); strategyVO.setDescription(strategyForPlatform1.getPldesc()); strategyVO.setCreateTime(new Date(strategyForPlatform1.getPlcreatetime())); strategyVO.setCreator(strategyForPlatform1.getPlcreateuser()); strategyVO.setLastModifyTime(new Date(strategyForPlatform1.getPlupdatetime())); strategyVO.setLastModifier(strategyForPlatform1.getPlupdateuser()); strategyVO.setLicensors(strategyForPlatform1.getPllicensors()); strategyVO.setRequireCharCount(strategyForPlatform1.getPlrequiredtype()); //处理密码策略的组合方式 Integer plchartypes = strategyForPlatform1.getPlchartypes(); if(Func.isNotEmpty(plchartypes)){ String combinations = plchartypes2Combinations(plchartypes); strategyVO.setRequireCharType(combinations); strategyVO.setRequireCharTypeText(CombinationEnum.getCombinationText(combinations)); } return strategyVO; } /** * plchartypes转换为Combinations(英文) * @param plchartypes * @return 进制数转换为组合方式的因为枚举多个之间用都好间隔 */ private String plchartypes2Combinations(Integer plchartypes){ StringBuilder sb = new StringBuilder(); if ((plchartypes & 0x01) == 0x01) sb.append("number,"); if ((plchartypes & 0x02) == 0x02) sb.append("lower,"); if ((plchartypes & 0x04) == 0x04) sb.append("upper,"); if ((plchartypes & 0x08) == 0x08) sb.append("symbol,"); return sb.deleteCharAt(sb.length() - 1).toString(); } /** * plchartypes转换为Combinations(英文) * @param combinations * @return 组合方式转换为实际要存储的整形数 */ private short combinations2Plchartypes(String combinations) { short plchartypes = 0; String[] combinationsArray = combinations.split(","); for (String type : combinationsArray) { switch (type) { case "number": plchartypes |= 0x01; break; case "lower": plchartypes |= 0x02; break; case "upper": plchartypes |= 0x04; break; case "symbol": plchartypes |= 0x08; break; } } return plchartypes; } /** * 保存用户关联密码策略 * @param userIds * @param passwordStrategId * @return */ @Override public boolean saveUserPasswordStrateg(String[] userIds, String passwordStrategId) throws PLException { VciBaseUtil.alertNotNull(userIds,"用户主键",passwordStrategId,"密码安全策略主键"); return platformClientUtil.getFrameworkService().saveUserPasswordStrateg( userIds, passwordStrategId, new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(),null) ); } /** * 密码策略校验:是否合规校验 * @param strategy */ private void checkPwdStrategy(SmPasswordStrategyDTO strategy){ if(strategy.getRequireCharCount() > strategy.getCombinations().split(",").length){ throw new VciBaseException("必填种类不能大于所选择的密码组合方式的个数!"); } if(strategy.getRequireCharCount() <= 0){ throw new VciBaseException("必填种类不能小于等于0!"); } if(strategy.getMaxLength() < strategy.getMinLength()){ throw new VciBaseException("密码最大长度不能小于最小长度!"); } if(Func.isNotEmpty(strategy.getRequireCharCount()) && (strategy.getMinLength() < strategy.getRequireCharCount() || strategy.getMaxLength() < strategy.getRequireCharCount()) ){ throw new VciBaseException("密码最小长度不能小于必填种类的值!"); } if(strategy.getValidDay() <= strategy.getRemindDay()){ throw new VciBaseException("过期时间不能小于提醒时间!"); } //判断前端是否未提交,是否默认字段 if(Func.isEmpty(strategy.getDefaultFlag())){ strategy.setDefaultFlag("false"); } } /** * dto对象转换为info对象 * @param dto * @return */ private PasswordStrategyInfo changePasswordStrategyDTO2Info(SmPasswordStrategyDTO dto){ PasswordStrategyInfo info = new PasswordStrategyInfo(); info.id = dto.getOid() == null ? "" : dto.getOid(); info.name = dto.getName(); info.passwordLen = dto.getMinLength(); info.passwordMaxLen = dto.getMaxLength(); info.charTypes = dto.getRequireCharType(); info.requiredType = dto.getRequireCharCount(); //逾期日=有效天数 info.overdueDay = dto.getValidDay(); info.remideDay = dto.getRemindDay(); info.retryTime = dto.getRetryTime(); info.lockTime = dto.getLockTime(); if(dto.getDefaultFlag().equals("1") || dto.getDefaultFlag().equals("true")){ info.isDefault = true; }else { info.isDefault = false; } info.desc = dto.getDescription() == null ? "" : dto.getDescription(); info.createTime = dto.getCreateTime() == null ? System.currentTimeMillis() : dto.getCreateTime().getTime(); info.createUser = dto.getCreator() == null ? "" : dto.getCreator(); info.updateTime = System.currentTimeMillis(); info.updateUser = dto.getLastModifier() == null ? "" : dto.getLastModifier(); return info; } /** * 根据map条件查询密码策略 * @param conditionMap * @return */ private List getPwdStrategyByCondition(Map conditionMap) throws PLException { if(Func.isEmpty(conditionMap)){ conditionMap = new HashMap(); } VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap, SmPasswordStrategyForPlatform1.class); List roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmPasswordStrategyForPlatform1.class); if(Func.isEmpty(roleForPlatform1s)){ return null; } return pltPwdStrategy2SmPwdStrategyVOs(roleForPlatform1s); } /** * 新增密码策略 * @param spsDto * @return */ @Override public boolean addPasswordStrateg(SmPasswordStrategyDTO spsDto) throws PLException { VciBaseUtil.alertNotNull( spsDto,"新增的密码策略对象", spsDto.getName(),"策略名称", spsDto.getMinLength(),"密码最小长度", spsDto.getMaxLength(),"密码最大长度", spsDto.getCombinations(),"组合方式种类", spsDto.getRequireCharCount(),"必填种类", spsDto.getValidDay(),"过期时间", spsDto.getRemindDay(),"提醒时间", spsDto.getRetryTime(),"重试次数", spsDto.getLockTime(),"锁定时间" ); //密码策略合规校验,不合规会抛出错误 this.checkPwdStrategy(spsDto); //根据策略名称查重 Map conditionMap = new HashMap<>(); conditionMap.put("pname",spsDto.getName()); List dbVoList = this.getPwdStrategyByCondition(conditionMap); if(Func.isNotEmpty(dbVoList)){ throw new VciBaseException("策略名称已经存在,请进行修改!"); } //获取当前用户账号信息:平台保存方法中会将userEntityInfo中的用户信息用作当前策略的创建人和修改人 String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(); UserEntityInfo userEntityInfo = new UserEntityInfo(userId,null); //组合方式转换为存储值 spsDto.setRequireCharType(combinations2Plchartypes(spsDto.getCombinations())); spsDto.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT)); spsDto.setCreator(userId); spsDto.setLastModifier(userId); //转换为存储用对象 PasswordStrategyInfo passwordStrategyInfo = changePasswordStrategyDTO2Info(spsDto); //当设置为默认策略时,平台保存方法会自动处理掉已存在的默认策略,以保证只有一条默认策略 return platformClientUtil.getFrameworkService().savePasswordStrategy(passwordStrategyInfo, userEntityInfo); } /** * 修改密码策略 * @param spsDto * @return */ @Override public boolean updatePasswordStrateg(SmPasswordStrategyDTO spsDto) throws PLException { VciBaseUtil.alertNotNull( spsDto,"新增的密码策略对象", spsDto.getOid(),"策略主键", spsDto.getName(),"策略名称", spsDto.getMinLength(),"密码最小长度", spsDto.getMaxLength(),"密码最大长度", spsDto.getCombinations(),"组合方式种类", spsDto.getRequireCharCount(),"必填种类", spsDto.getValidDay(),"过期时间", spsDto.getRemindDay(),"提醒时间", spsDto.getRetryTime(),"重试次数", spsDto.getLockTime(),"锁定时间" ); //密码策略合规校验,不合规会抛出错误 this.checkPwdStrategy(spsDto); //查询修改的策略是否存在 Map conditionMap = new HashMap<>(); conditionMap.put("pluid",spsDto.getOid()); List dbVoList = this.getPwdStrategyByCondition(conditionMap); if(Func.isEmpty(dbVoList)){ throw new VciBaseException("当前修改的密码策略在系统中不存在,请刷新后重试!"); } //获取当前用户账号信息 String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(); UserEntityInfo userEntityInfo = new UserEntityInfo(userId,null); //根据策略名称查重 conditionMap.clear(); conditionMap.put("pname",spsDto.getName()); conditionMap.put("pluid", QueryOptionConstant.NOTEQUAL + spsDto.getOid()); List repeatVoList = this.getPwdStrategyByCondition(conditionMap); if(Func.isNotEmpty(repeatVoList)){ throw new VciBaseException("策略名称已经存在,请进行修改!"); } SmPasswordStrategyVO smPasswordStrategyVO = dbVoList.get(0); spsDto.setCreateTime(smPasswordStrategyVO.getCreateTime()); spsDto.setCreator(smPasswordStrategyVO.getCreator()); spsDto.setLastModifier(userId); //组合方式转换为存储值 spsDto.setRequireCharType(combinations2Plchartypes(spsDto.getCombinations())); PasswordStrategyInfo passwordStrategyInfo = changePasswordStrategyDTO2Info(spsDto); return platformClientUtil.getFrameworkService().editPasswordStrategy(passwordStrategyInfo,userEntityInfo); } /** * 删除密码策略 * @param pwdIds * @return */ @Override public boolean delPasswordStrateg(String[] pwdIds) throws PLException { VciBaseUtil.alertNotNull(pwdIds,"要删除的密码策略主键"); //TODO: 应该是不具备连带删除的功能,策略删除后用户关联的无用策略信息还在,考虑后期是否需要做,数据量不大可以不做连带删除 return platformClientUtil.getFrameworkService().deletePasswordStrategy( pwdIds, new UserEntityInfo("developer"/*WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId()*/, null) ); } /** * 根据主键查询密码策略map对象 * @param oidList * @return key为密码策略主键 value为密码策略 */ @Override public Map mapPasswordStrategyVOMapByOid(Collection oidList) { VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class); queryWrapperForDO.in("oid",oidList.stream().collect(Collectors.joining(","))); List cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() + (StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null); Map smPasswordStrategyVOMap = new HashMap<>(); if(Func.isEmpty(cboList)){ return new HashMap<>(); } cboList.stream().forEach(item->{ SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO(); WebUtil.copyValueToObjectFromCbos(item,passwordStrategyDO); SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO(); BeanUtil.convert(passwordStrategyDO,passwordStrategyVO); smPasswordStrategyVOMap.put(passwordStrategyVO.getOid(),passwordStrategyVO); }); return smPasswordStrategyVOMap; } /** * 使用主键获取密码策略 * @param oid 主键 * @return 密码策略显示对象 */ public SmPasswordStrategyVO getPasswordStrategyVOByOid(String oid){ VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class); queryWrapperForDO.eq("oid",oid.trim()); List cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() + (StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null); if(!CollectionUtils.isEmpty(cboList)){ SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO(); WebUtil.copyValueToObjectFromCbos(cboList.get(0),passwordStrategyDO); SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO(); BeanUtil.convert(passwordStrategyDO,passwordStrategyVO); return passwordStrategyVO; }else{ //获取默认的 queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class); queryWrapperForDO.eq("plisdefault","1"); cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() + (StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null); if(!CollectionUtils.isEmpty(cboList)){ SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO(); WebUtil.copyValueToObjectFromCbos(cboList.get(0),passwordStrategyDO); return pwdStrategyDO2VO(passwordStrategyDO); } } return null; } /** * 多条密码策略do对象转vo对象 * @param smPasswordStrategyDOList * @return */ private List pwdStrategyDO2VOS(List smPasswordStrategyDOList){ List smPasswordStrategyVOList = new ArrayList<>(); if(Func.isEmpty(smPasswordStrategyDOList)) { return smPasswordStrategyVOList; } smPasswordStrategyDOList.stream().forEach(item->{ smPasswordStrategyVOList.add(pwdStrategyDO2VO(item)); }); return smPasswordStrategyVOList; } /** * 密码策略do对象转vo对象 * @param smPasswordStrategyDO * @return */ private SmPasswordStrategyVO pwdStrategyDO2VO(SmPasswordStrategyDO smPasswordStrategyDO){ SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO(); BeanUtil.convert(smPasswordStrategyDO,passwordStrategyVO); return passwordStrategyVO; } /** * 根据用户的主键,获取用户的密码安全策略 * @param userOid 用户的主键 * @return 密码安全策略的显示对象,如果不存在则会返回Null * @throws VciBaseException 参数为空或者数据库查询出错的时候会抛出异常 */ @Override public SmPasswordStrategyVO getPasswordStrategyVOByUserOid(String userOid) throws PLException { WebUtil.alertNotNull(userOid,"用户的主键"); if(!smUserQueryService.checkUserExist(null,userOid)){ throw new VciBaseException(DATA_OID_NOT_EXIST); } String sql = "select plpasswordstrategyuid,pluseruid from pluserpasswordstrategy where pluseruid = '"+ userOid +"'"; List cbos = boService.queryBySql(sql, null); if(Func.isNotEmpty(cbos)){ return getPasswordStrategyVOByOid(ObjectTool.getNewBOAttributeValue(cbos.get(0), "plpasswordstrategyuid")); } return null; } /** * 根据多条用户主键,获取用户的密码安全策略 * @param userOids * @return * @throws PLException */ @Override public List listSmPasswordStrategyVOByUserOids(Collection userOids) { WebUtil.alertNotNull(userOids,"用户的主键"); //先查关联表 List userPwdStrategyList = new ArrayList<>(); WebUtil.switchCollectionForOracleIn(userOids).stream().forEach(userOidSplit->{ //查关联表sql String sql = "select plpasswordstrategyuid,pluseruid from pluserpasswordstrategy where pluseruid in (" + WebUtil.toInSql(userOidSplit.toArray(new String[0])) + ")"; List cbos = boService.queryBySql(sql, null); cbos.stream().forEach(cbo->{ userPwdStrategyList.add(ObjectTool.getNewBOAttributeValue(cbo,"plpasswordstrategyuid")); }); }); return listSmPasswordStrategyVOByOids(userPwdStrategyList); } /** * 根据用户主键查询密码策略关联表中的密码策略主键 * @param userOids * @return key为用户oid:value为密码策略oid */ private Map mapUserPwdStrategy(Collection userOids){ Map userPwdStrategyMap = new HashMap<>(); WebUtil.switchCollectionForOracleIn(userOids).stream().forEach(userOidSplit->{ //查关联表sql String sql = "select plpasswordstrategyuid,pluseruid from pluserpasswordstrategy where pluseruid in (" + WebUtil.toInSql(userOidSplit.toArray(new String[0])) + ")"; List cbos = boService.queryBySql(sql, null); cbos.stream().forEach(cbo->{ String pluseruid = ObjectTool.getNewBOAttributeValue(cbo, "pluseruid"); String plpasswordstrategyuid = ObjectTool.getNewBOAttributeValue(cbo, "plpasswordstrategyuid"); userPwdStrategyMap.put(pluseruid,plpasswordstrategyuid); }); }); return userPwdStrategyMap; } /** * 根据主键,批量获取密码安全策略主键 * @param oids * @return * @throws PLException */ @Override public List listSmPasswordStrategyVOByOids(Collection oids) { VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class); queryWrapperForDO.in("oid",oids.stream().collect(Collectors.joining(","))); List cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() + (StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null); List smPasswordStrategyVOList = new ArrayList<>(); if(Func.isEmpty(cboList)){ return smPasswordStrategyVOList; } cboList.stream().forEach(item->{ SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO(); WebUtil.copyValueToObjectFromCbos(item,passwordStrategyDO); SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO(); BeanUtil.convert(passwordStrategyDO,passwordStrategyVO); smPasswordStrategyVOList.add(passwordStrategyVO); }); return smPasswordStrategyVOList; } /** * 批量根据用户的主键来获取密码策略 * @param userOidCollection 用户主键集合 * @return 密码策略的显示对象,key是用户主键,value是这个用户关联的密码策略 */ @Override public Map batchSmPwdStrategyByUserOids(Collection userOidCollection) { if(CollectionUtils.isEmpty(userOidCollection)){ return new HashMap<>(); } Map smPasswordStrategyVOMap = new HashMap<>(); Map userPasswordStrategyVOMap = new HashMap<>(); Map returnMap = new HashMap<>(); WebUtil.switchCollectionForOracleIn(userOidCollection).stream().forEach(userOids->{ //查询密码策略关联信息,key为用户oid:value为密码策略oid Map userPwdStrategyMap = mapUserPwdStrategy(userOids); userPasswordStrategyVOMap.putAll(userPwdStrategyMap); //查询密码策略,key为密码策略主键:value为密码策略 smPasswordStrategyVOMap.putAll(mapPasswordStrategyVOMapByOid(userPwdStrategyMap.values())); }); //查询默认的密码策略 SmPasswordStrategyVO passwordStrategyVOByDefault = getPasswordStrategyVOByDefault(); //循环用户id,查询是否有符合条件的oid userOidCollection.stream().forEach(oid->{ SmPasswordStrategyVO smPasswordStrategyVO; //通过用户oid没获取到密码策略oid,说明没有给当前用户设置策略,直接返默认的密码策略 String pwdStrategyId = userPasswordStrategyVOMap.get(oid); if(Func.isNotBlank(pwdStrategyId)){ //通过密码策略oid去map中取密码策略 smPasswordStrategyVO = smPasswordStrategyVOMap.get(pwdStrategyId); }else { smPasswordStrategyVO = passwordStrategyVOByDefault; } returnMap.put(oid,smPasswordStrategyVO); }); return returnMap; } }