ludc
2024-04-13 5f0d9a00a1e0f27c2f8396dcd98fac5022aa40c7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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.starter.web.util.VciBaseUtil;
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.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
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<MdmCount> getMdmCounts(String userId) throws ServiceException{
        if(Func.isBlank(userId) && Func.isBlank(AuthUtil.getUserId().toString())){
            throw new ServiceException("必传参数用户id不能为空");
        }
        /** 1、先查询出各分类顶层节点有哪些主数据,拿到绑定的业务类型名称,相当于拿到主数据表名
            顶层节点的btmtypeid(2024年1月31日的时候改成了用分类的id)去查询对应的菜单表的code字段
             ,查询出主数据管理下面有哪些主数据的
            但是为了减少查询次数,就需在查询是使用id字段进行排序
         */
        LambdaQueryWrapper<CodeClassify> wrapper = Wrappers.<CodeClassify>query()
            .lambda()
            .isNull(CodeClassify::getParentCodeClassifyOid)/*顶层节点*/
            .orderByAsc(CodeClassify::getId);
        // 加上租户查询条件
        if(!VciBaseUtil.checkAdminTenant()){
            wrapper.eq(CodeClassify::getTenantId,AuthUtil.getTenantId());
        }
        List<CodeClassify> codeClassifies = codeClassifyService.list(wrapper);
        // List<String> btmTypeIds = codeClassifies.stream().map(CodeClassify::getBtmTypeId).collect(Collectors.toList());
        List<String> classifyIds = codeClassifies.stream().map(CodeClassify::getId).collect(Collectors.toList());
        // 2、然后feign调用需要查询出菜单路由和图标
        R<List<Menu>> menuList = sysClient.getMenuByCodes(classifyIds,Func.toLong(userId));
        if(!menuList.isSuccess()){
            throw new ServiceException("获取主数据统计时,主数据菜单查询失败,原因:"+menuList.getMsg());
        }
        List<MdmCount> mdmCountList = new ArrayList<>();
        // 3、查询当前登录的用户配置了那些主数据统计项
        R<MdmCountConfig> mdmCountConfig = sysClient.getMdmCountConfig(Func.isBlank(userId) ? AuthUtil.getUserId().toString():userId);
        if(!mdmCountConfig.isSuccess()){
            throw new ServiceException("获取主数据统计项配置时出现错误,原因:"+mdmCountConfig.getMsg());
        }
        List<String> mdmNames = null;
        //首页配置显示少于5个就默认显示前五个
        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<String> mdmNamesFinal = mdmNames;
        /* 4、获取表名,当前未获取到表名,菜单的code值对应了分类的id,
            未对应业务类型的id,所以需要通过菜单的id筛选出配置并且在使用的主数据分类,
            然后通过分类信息查询到业务类型id,在通过业务类型接口查询出表名(这一步可以先省略因为分类上关联的业务类型id也可以拼接出表名)
        */
        // 获取分类上的业务类型的id
        Map<String, String> btmTypeIdMaps = menuList.getData().stream()
        .filter(menu -> codeClassifies.stream()
            .anyMatch(codeClassify -> codeClassify.getId().equals(menu.getCode()))
        ).collect(Collectors.toMap(
            Menu::getCode,
            menu -> codeClassifies.stream()
                .filter(codeClassify -> codeClassify.getId().equals(menu.getCode()))
                .findFirst()
                .map(CodeClassify::getBtmTypeId)
                .orElse(null)
        ));
 
        // 5、然后set进对象中
        menuList.getData().stream().forEach(item->{
            Integer isDefault = mdmNamesFinal.contains(item.getCode()) ? 1:0;
            MdmCount mdmCount = new MdmCount(
                item.getName(),
                getCountByTableName(btmTypeIdMaps.get(item.getCode())), /*查询主数据总数*/
                item.getPath(),
                item.getSource(),
                item.getCode(),
                isDefault
            );
            mdmCountList.add(mdmCount);
        });
        return mdmCountList;
    }
 
    /**
     * 拼接表名查询总数
     * @param tableName
     * @return
     */
    private String getCountByTableName(String tableName){
        String count = "0";
        if(Func.isBlank(tableName)){
            return count;
        }
        String sql = "SELECT COUNT(*) FROM " + getTableName(tableName,true) +";";
        try {
            count = commonsMapper.queryCountStringBySql(sql);
        }catch (Exception e){
            throw new ServiceException("主数据总数查询失败,原因:"+e.getCause());
        }
        return count;
    }
 
}