ludc
2023-11-30 1b8098b7f79b66a80e5ca49d8765606cb5fa0408
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
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<MdmCount> getMdmCounts(String userId) throws ServiceException{
        if(Func.isBlank(userId) && Func.isBlank(AuthUtil.getUserId().toString())){
            throw new ServiceException("必传参数用户id不能为空");
        }
        /** 1、先查询出各分类顶层节点有哪些主数据,拿到业务类型名称,相当于拿到主数据表名
            顶层节点的btmtypeid还需要用作查询条件对应的菜单表的code字段
            但是为了减少查询次数,就需在查询是使用btmtypeid字段进行排序
         */
        LambdaQueryWrapper<CodeClassify> wrapper = Wrappers.<CodeClassify>query()
            .lambda()
            .isNull(CodeClassify::getParentCodeClassifyOid).select(CodeClassify::getBtmTypeId)
            .orderByAsc(CodeClassify::getBtmTypeId);
        List<CodeClassify> codeClassifies = codeClassifyService.list(wrapper);
        List<String> btmTypeIds = codeClassifies.stream().map(CodeClassify::getBtmTypeId).collect(Collectors.toList());
        // 2、然后feign调用需要查询出菜单路由和图标
        R<List<Menu>> menuList = sysClient.getMenuByCodes(btmTypeIds,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;
        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、然后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;
    }
 
}