package com.vci.frameworkcore.compatibility.impl; import com.vci.corba.common.PLException; import com.vci.corba.omd.data.BusinessObject; import com.vci.frameworkcore.compatibility.SmPwdStrategyQueryServiceI; import com.vci.frameworkcore.compatibility.SmUserQueryServiceI; import com.vci.frameworkcore.model.SmPasswordStrategyDO; import com.vci.frameworkcore.pagemodel.SmPasswordStrategyVO; import com.vci.omd.utils.ObjectTool; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.util.BeanUtil; import com.vci.starter.web.wrapper.VciQueryWrapperForDO; import com.vci.web.service.WebBoServiceI; import com.vci.web.util.Func; import com.vci.web.util.WebUtil; import org.apache.commons.lang3.StringUtils; 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.frameworkcore.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; /** * 获取默认密码策略 * @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; } /** * 根据主键查询密码策略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; } }