package com.vci.web.service.impl; import com.vci.starter.web.util.VciBaseUtil; import com.vci.web.pageModel.SmOperationVO; import com.vci.web.service.SmOperationServiceI; import com.vci.web.service.WebBoServiceI; 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; /** * 操作的服务 * @author weidy * @date 2022-2-23 */ @Service public class SmOperationServiceImpl implements SmOperationServiceI { /** * 业务数据的服务 */ @Autowired private WebBoServiceI boService; /** * 使用菜单的编号获取按钮的内容 * * @param functionId 功能的编号 * @return 操作的信息 */ @Override public List listButtonByFunctionId(String functionId) { VciBaseUtil.alertNotNull(functionId,"功能菜单"); //我们需要先获取到授权的值 String sql = "select f.ploid from plfunction f where lower(f.plmoduleno) = :functionId"; Map conditionMap = new HashMap<>(); conditionMap.put("functionId",functionId.toLowerCase(Locale.ROOT).trim()); List functionCbos = boService.queryBySql(sql, conditionMap); if(CollectionUtils.isEmpty(functionCbos)){ //都没有这个功能 return new ArrayList<>(); } String functionOid = functionCbos.get(0).getAttributeValue("ploid"); conditionMap.clear(); conditionMap.put("functionOid",functionOid); sql = "select rf.plrightvalue from PLROLERIGHT rf left join pluserrole ur on rf.plroleoid = ur.plroleuid " + " where ur.pluseruid =:useroid and rf.plfuncoid = :functionOid"; conditionMap.put("useroid",VciBaseUtil.getCurrentUserOid()); List cbos = boService.queryBySql(sql, conditionMap); if(CollectionUtils.isEmpty(cbos)){ //没有授权 return new ArrayList<>(); } long rightValue = VciBaseUtil.getLong(cbos.get(0).getAttributeValue("plrightvalue")); //获取具体包含哪些按钮 sql = "select o.ploperoid,o.plno from PLFUNCOPERATION o where o.plfuncoid = :functionOid "; conditionMap.remove("useroid"); List operationLinkCbos = boService.queryBySql(sql, conditionMap); if(CollectionUtils.isEmpty(operationLinkCbos)){ //根本没有按钮 return new ArrayList<>(); } //需要判断有权限的内容 List hasRightOids = new ArrayList<>(); Map oidOrderMap = new HashMap<>(); operationLinkCbos.stream().forEach(cbo->{ String operationOid = cbo.getAttributeValue("ploperoid"); int orderNo = VciBaseUtil.getInt(cbo.getAttributeValue("plno")); if(hasRight(rightValue,orderNo)){ hasRightOids.add(operationOid); oidOrderMap.put(operationOid,orderNo); } }); if(CollectionUtils.isEmpty(hasRightOids)){ //没有权限 return new ArrayList<>(); } sql = "select ploid as oid,plname,pluniqueflag,pldesc,plalias,plsequence from ploperation where ploid in (" + VciBaseUtil.toInSql(hasRightOids.toArray(new String[0])) + ")"; List opertionCBOs = boService.queryBySql(sql, new HashMap<>()); List operationVOS = new ArrayList<>(); Optional.ofNullable(opertionCBOs).orElseGet(()->new ArrayList<>()).stream().forEach(cbo->{ SmOperationVO operationVO = new SmOperationVO(); operationVO.setFunctionOid(functionOid); operationVO.setOid(cbo.getOid()); operationVO.setUniqueFlag(cbo.getAttributeValue("pluniqueflag")); operationVO.setName(cbo.getAttributeValue("plname")); operationVO.setAlias(cbo.getAttributeValue("plalias")); operationVO.setOrderNo(String.valueOf(oidOrderMap.get(operationVO.getOid()))); operationVO.setDescription(cbo.getAttributeValue("pldesc")); operationVO.setModuleNo(functionId); operationVOS.add(operationVO); }); List operationVOList = operationVOS.stream().sorted(((o1, o2) -> o1.getOrderNo().compareTo(o2.getOrderNo()))).collect(Collectors.toList()); return operationVOList; } /** * 是否有权限 * @param rightValue 权限的值 * @param operNum 操作的位置号 * @return true表示有权限,false表示没有 */ private boolean hasRight(long rightValue, int operNum) { boolean res = false; long preValue = (long) Math.pow(2, operNum); if (preValue == (rightValue & preValue)) { res = true; } return res; } }