package com.vci.ubcs.code.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.vci.ubcs.code.entity.CodeClassify; import com.vci.ubcs.code.entity.MdmCount; import com.vci.ubcs.code.mapper.CommonsMapper; import com.vci.ubcs.code.service.ICodeClassifyService; import com.vci.ubcs.code.service.IMdmCountService; import com.vci.ubcs.system.entity.MdmCountConfig; import com.vci.ubcs.system.entity.Menu; import com.vci.ubcs.system.feign.ISysClient; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static com.vci.ubcs.starter.web.util.VciBaseUtil.getTableName; /** * 主数据统计服务 * @author ludc * @date 2023/10/16 15:47 */ @Slf4j @Service public class MdmCountServiceImpl implements IMdmCountService { /** * 系统服务 */ @Resource private ISysClient sysClient; @Resource private ICodeClassifyService codeClassifyService; @Resource private CommonsMapper commonsMapper; /** * 查询主数据总数 * @param userId * @return * @throws ServiceException */ @Override public List getMdmCounts(String userId) throws ServiceException{ if(Func.isBlank(userId) && Func.isBlank(AuthUtil.getUserId().toString())){ throw new ServiceException("必传参数用户id不能为空"); } /** 1、先查询出各分类顶层节点有哪些主数据,拿到业务类型名称,相当于拿到主数据表名 顶层节点的btmtypeid还需要用作查询条件对应的菜单表的code字段 但是为了减少查询次数,就需在查询是使用btmtypeid字段进行排序 */ LambdaQueryWrapper wrapper = Wrappers.query() .lambda() .isNull(CodeClassify::getParentCodeClassifyOid).select(CodeClassify::getBtmTypeId) .orderByAsc(CodeClassify::getBtmTypeId); List codeClassifies = codeClassifyService.list(wrapper); List btmTypeIds = codeClassifies.stream().map(CodeClassify::getBtmTypeId).collect(Collectors.toList()); // 2、然后feign调用需要查询出菜单路由和图标 R> menuList = sysClient.getMenuByCodes(btmTypeIds,Func.toLong(userId)); if(!menuList.isSuccess()){ throw new ServiceException("获取主数据统计时,主数据菜单查询失败,原因:"+menuList.getMsg()); } List mdmCountList = new ArrayList<>(); // 3、查询当前登录的用户配置了那些主数据统计项 R mdmCountConfig = sysClient.getMdmCountConfig(Func.isBlank(userId) ? AuthUtil.getUserId().toString():userId); if(!mdmCountConfig.isSuccess()){ throw new ServiceException("获取主数据统计项配置时出现错误,原因:"+mdmCountConfig.getMsg()); } List mdmNames = null; if(Func.isBlank(mdmCountConfig.getData().getMdmName())){ AtomicInteger count = new AtomicInteger(); mdmNames = menuList.getData().stream().map(item->{ if(count.getAndIncrement() <5){ return item.getCode(); } return null; }).collect(Collectors.toList()); }else { mdmNames = Arrays.stream(mdmCountConfig.getData().getMdmName().split(",")).collect(Collectors.toList()); } final List mdmNamesFinal = mdmNames; // 4、然后set进对象中 menuList.getData().stream().forEach(item->{ Integer isDefault = mdmNamesFinal.contains(item.getCode()) ? 1:0; MdmCount mdmCount = new MdmCount( item.getName(), getCountByTableName(item.getCode()), /*查询主数据总数*/ item.getPath(), item.getSource(), item.getCode(), isDefault ); mdmCountList.add(mdmCount); }); return mdmCountList; } /** * 拼接表名查询总数 * @param tableName * @return */ private String getCountByTableName(String tableName){ String sql = "SELECT COUNT(*) FROM " + getTableName(tableName,true) +";"; String count = "0"; try { count = commonsMapper.queryCountStringBySql(sql); }catch (Exception e){ throw new ServiceException("主数据总数查询失败,原因:"+e.getCause()); } return count; } }