多维度统计-一定要从外侧依次关联-java-工单类型统计
/**
* @author zhangxiao
* @qq 490433117
* @create_date 2022/1/26 10:27
*/package com.suninfo.itsm.service.statisticalreport.impl;
import com.suninfo.itsm.entity.statisticalreport.ReportHeadColumn;
import com.suninfo.itsm.entity.statisticalreport.vo.ItsmTypeReportResultVo;
import com.suninfo.itsm.entity.vo.*;
import com.suninfo.itsm.mapper.ItsmOrderMapper;
import com.suninfo.itsm.service.statisticalreport.ItsmTypeReportService;
import com.suninfo.userasset.entity.department.Department;
import com.suninfo.userasset.feign.DepartmentClient;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* * @author zhangxiao
* @date 2023/06/15 10:27
*/@Service
public class ItsmTypeReportServiceImpl implements ItsmTypeReportService {
@Autowired
private ItsmOrderMapper itsmOrderMapper;
@Autowired
private DepartmentClient departmentClient;
@Override
public ItsmTypeReportHeadListCompleteVo queryItsmOrderTypeMapList(Map<String, Object> params) {
// 查询所有数据
List<ItsmTypeReportResultVo> resultVos = itsmOrderMapper.queryItsmOrderTypeMapList(params);
// 获取部门名称
List<String> departUuidList = resultVos.stream().distinct().map(ItsmTypeReportResultVo::getDepartUuid).collect(Collectors.toList());
List<Department> departmentList = departmentClient.queryListByUuids(departUuidList);
ItsmTypeReportHeadListCompleteVo completeVo = new ItsmTypeReportHeadListCompleteVo();
completeVo.setListHead(this.getListHead(departmentList));
completeVo.setWorkFlowList(this.getWorkFlowList(resultVos,departmentList));
return completeVo;
}
/**
* 获取报表数据-构建值
* @return
*/
private List<Object> getWorkFlowList(List<ItsmTypeReportResultVo> resultVos,List<Department> departmentList){
// 根据列头-动态部门
List<ItsmTypeReportHeadListSimplifyVo> departAutoColumnData = this.getMap3DepartAutoColumnData(departmentList);
Map<String, String> headDepartMap = departAutoColumnData.stream().collect(Collectors.toMap(ItsmTypeReportHeadListSimplifyVo::getColKey, ItsmTypeReportHeadListSimplifyVo::getColumnName));
// 按照工单类型分组
Map<String, List<ItsmTypeReportResultVo>> itsmtypeMapList = resultVos.stream().collect(Collectors.groupingBy(ItsmTypeReportResultVo::getItsmTypeStr));
List<Object> allLastData = new ArrayList<>();
// 循环大类
for (Map.Entry<String, List<ItsmTypeReportResultVo>> stringListEntry : itsmtypeMapList.entrySet()) {
// 工单类型名称
String key = stringListEntry.getKey();
List<ItsmTypeReportResultVo> value = stringListEntry.getValue();
ItsmTypeReportWorkFlowListDataVo allData = new ItsmTypeReportWorkFlowListDataVo();
// 顶级
allData.setSyscounts("0");
allData.setDealusercounts("0");
allData.setItsmType(key);
// 按部门分组
Map<String, List<ItsmTypeReportResultVo>> departMap = value.stream().collect(Collectors.groupingBy(ItsmTypeReportResultVo::getDepartUuid));
Integer numbers = 0;
List<Object> depart = new ArrayList<>();
for (ItsmTypeReportHeadListSimplifyVo departAutoColumnDatum : departAutoColumnData) {
Map<String,Object> map = new HashMap<>();
String colKey = departAutoColumnDatum.getColKey();
if ("orderCounts".equals(colKey)){
continue;
} List<ItsmTypeReportResultVo> resultVos1 = departMap.get(colKey);
if (CollectionUtils.isNotEmpty(resultVos1)){
List<String> collect = resultVos1.stream().distinct().map(ItsmTypeReportResultVo::getOrderUuidList).collect(Collectors.toList());
if (colKey != null ) {
int size = collect.size();
map.put(colKey,size);
numbers = numbers + size;
} else {
map.put(colKey,0);
} } else {
map.put(colKey,0);
} depart.add(map);
}
Map<String,Object> mapCounts = new HashMap<>();
mapCounts.put("orderCounts",numbers);
depart.add(mapCounts);
allData.setDepartList(depart);
// 模板子分类
List<ItsmTypeReportWorkFlowListDataVo> childrenList = new ArrayList<>();
Map<String, List<ItsmTypeReportResultVo>> formTypeNameMap = value.stream().collect(Collectors.groupingBy(ItsmTypeReportResultVo::getFormName));
for (Map.Entry<String, List<ItsmTypeReportResultVo>> formTypeItsm : formTypeNameMap.entrySet()) {
// 工单类型名称
String formTypeItsmKey = formTypeItsm.getKey();
List<ItsmTypeReportResultVo> result = formTypeItsm.getValue();
ItsmTypeReportWorkFlowListDataVo childRenData = new ItsmTypeReportWorkFlowListDataVo();
childRenData.setSyscounts("0");
childRenData.setDealusercounts("0");
childRenData.setFormType(formTypeItsmKey);
// 按子部门分组
Map<String, List<ItsmTypeReportResultVo>> childdepartMap = result.stream().collect(Collectors.groupingBy(ItsmTypeReportResultVo::getDepartUuid));
Integer childnumbers = 0;
List<Object> childdepart = new ArrayList<>();
for (ItsmTypeReportHeadListSimplifyVo departAutoColumnDatum2 : departAutoColumnData) {
Map<String,Object> childmap = new HashMap<>();
String colKey2 = departAutoColumnDatum2.getColKey();
List<ItsmTypeReportResultVo> resultVos2 = childdepartMap.get(colKey2);
if ("orderCounts".equals(colKey2)){
continue;
}
if (CollectionUtils.isNotEmpty(resultVos2)) {
List<String> child_collect = resultVos2.stream().distinct().map(ItsmTypeReportResultVo::getOrderUuidList).collect(Collectors.toList());
if (colKey2 != null ) {
int childsize = child_collect.size();
childmap.put(colKey2,childsize);
childnumbers = childnumbers + childsize;
} else {
childmap.put(colKey2,0);
}
} else {
childmap.put(colKey2,0);
} childdepart.add(childmap);
}
Map<String,Object> childmapCounts = new HashMap<>();
childmapCounts.put("orderCounts",childnumbers);
childdepart.add(childmapCounts);
childRenData.setDepartList(childdepart);
childrenList.add(childRenData);
allData.setChildrenList(childrenList);
}
allLastData.add(allData);
}
return allLastData;
}
/**
* 获取报表列头
* @return
*/
private List<Object> getListHead(List<Department> departmentList){
List<Object> headList = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
map1.put("colKey","itsmType");
map1.put("columnName","工单类型");
map1.put("treeIndex",1);
Map<String,Object> map2 = new HashMap<>();
map2.put("colKey","formType");
map2.put("columnName","模板");
map2.put("treeIndex",1);
Map<String,Object> map3 = new HashMap<>();
map3.put("colKey","orderCountsTemplate");
map3.put("columnName","工单数量");
map3.put("treeIndex",2);
// 动态列表头
map3.put("list",this.getMap3DepartAutoColumnData(departmentList));
Map<String,Object> map4 = new HashMap<>();
map4.put("colKey","syscounts");
map4.put("columnName","涉及系统数");
map4.put("treeIndex",3);
Map<String,Object> map5 = new HashMap<>();
map5.put("colKey","dealusercounts");
map5.put("columnName","涉及处理人数");
map5.put("treeIndex",3);
headList.add(map1);
headList.add(map2);
headList.add(map3);
headList.add(map4);
headList.add(map5);
return headList;
}
/**
* 获取动态列部门数据
* @return
*/
private List<ItsmTypeReportHeadListSimplifyVo> getMap3DepartAutoColumnData(List<Department> departmentList){
List<ItsmTypeReportHeadListSimplifyVo> headListSimplifyVos = new ArrayList<>();
ItsmTypeReportHeadListSimplifyVo list1 = new ItsmTypeReportHeadListSimplifyVo();
list1.setColKey("orderCounts");
list1.setColumnName("总数");
headListSimplifyVos.add(list1);
departmentList.forEach(d->{
ItsmTypeReportHeadListSimplifyVo itsm = new ItsmTypeReportHeadListSimplifyVo();
itsm.setColKey(d.getUuid());
itsm.setColumnName(d.getDepartName());
headListSimplifyVos.add(itsm);
});
return headListSimplifyVos;
}
/**
* 逗号分隔处理数据
* @param orderUuidList
* @return
*/
private List<String> splitUuidList(List<String> orderUuidList) {
List<String> newOrderUuidList = new ArrayList<>();
for (String orderUuid : orderUuidList) {
String[] splitUuids = orderUuid.split(","); // 使用split()方法拆分逗号分隔的字符串
newOrderUuidList.addAll(Arrays.asList(splitUuids)); // 将数组元素添加到新的List<String>中
}
return newOrderUuidList;
}
@Override
public ItsmTypeReportHeadListCompleteVo queryItsmOrderTypeMapListTemp(Map<String, Object> params) {
ItsmTypeReportHeadListCompleteVo dataList = new ItsmTypeReportHeadListCompleteVo();
// 获取工单数据
List<ItsmTypeReportResultVo> orderList = itsmOrderMapper.queryItsmOrderTypeMapList(params);
Map<String, String> departMap = orderList.stream().collect(Collectors.toMap(t -> t.getDepartUuid(), t -> t.getDepartName(), (n, o) -> o));
// 表头设置
List<ReportHeadColumn> headColumns = this.getHeadColumnsExtracted(departMap);
dataList.setListHead(Collections.singletonList(headColumns));
// 根据工单类型分组-大类
Map<String, List<ItsmTypeReportResultVo>> itsmTypeMapList = orderList.stream().collect(Collectors.groupingBy(ItsmTypeReportResultVo::getItsmTypeStr));
List<ItsmTypeReportWorkFlowListDataTempVo> w = new ArrayList<>();
// 部门统计数量
List<ReportHeadColumn> departListHead = this.getHeadColumns(departMap);
for (Map.Entry<String, List<ItsmTypeReportResultVo>> entry : itsmTypeMapList.entrySet()) {
String type = entry.getKey();
List<ItsmTypeReportResultVo> value = entry.getValue();
ItsmTypeReportWorkFlowListDataTempVo itsm = new ItsmTypeReportWorkFlowListDataTempVo();
// 工单类型名称
itsm.setItsmType(type);
Map<String, Integer> departList = getStringIntegerMap(departListHead, value);
// 部门统计数
itsm.setDepartList(departList);
// 分组模板子集
Map<String, List<ItsmTypeReportResultVo>> formTypeMap = value.stream().collect(Collectors.groupingBy(ItsmTypeReportResultVo::getFormName));
if (formTypeMap == null) {
continue;
} List<ItsmTypeReportWorkFlowListDataTempVo> childrenList = new ArrayList<>();
formTypeMap.forEach((formTypeKey, childValue) -> {
ItsmTypeReportWorkFlowListDataTempVo tempVo = new ItsmTypeReportWorkFlowListDataTempVo();
tempVo.setFormType(formTypeKey);
// 模板-部门分组
Map<String, Integer> cccc = getStringIntegerMap(departListHead, childValue);
tempVo.setDepartList(cccc);
childrenList.add(tempVo);
}); itsm.setChildrenList(childrenList);
w.add(itsm);
} dataList.setWorkFlowList(Collections.singletonList(w));
return dataList;
}
private Map<String, Integer> getStringIntegerMap(List<ReportHeadColumn> departListHead, List<ItsmTypeReportResultVo> value) {
Map<String, List<ItsmTypeReportResultVo>> departListMap = value.stream().collect(Collectors.groupingBy(ItsmTypeReportResultVo::getDepartUuid));
Map<String,Object> departList = new HashMap<>();
// todo 2023-06-18 18:39
int total=0;
for (ReportHeadColumn h : departListHead) {
if ("counts".equals(h)) {
continue;
} List<ItsmTypeReportResultVo> resultVos = departListMap.get(h.getColKey());
if (CollectionUtils.isEmpty(resultVos)){
departList.put(h.getColKey(),0);
continue;
} long count = resultVos.stream().distinct().map(ItsmTypeReportResultVo::getOrderUuidList).count();
departList.put(h.getColKey(),(int)count);
total = total + (int)count;
} departList.put("counts",total);
return departList;
}
private List<ReportHeadColumn> getHeadColumnsExtracted(Map<String, String> departMap) {
List<ReportHeadColumn> headList = new ArrayList<>();
ReportHeadColumn h1 = new ReportHeadColumn();
h1.setColKey("itsmType");
h1.setColumn("工单类型");
h1.setIsFixed(1);
headList.add(h1);
ReportHeadColumn h2 = new ReportHeadColumn();
h2.setColKey("formType");
h2.setColumn("模板");
h2.setIsFixed(1);
headList.add(h2);
ReportChildListSimplifyTempVo h3 = new ReportChildListSimplifyTempVo();
h3.setColKey("orderCounts");
h3.setColumn("工单数量");
h3.setIsFixed(2);
// 动态列表头
List<ReportHeadColumn> list = getHeadColumns(departMap);
h3.setChildHeadList(list);
headList.add(h3);
ReportHeadColumn h4 = new ReportHeadColumn();
h4.setColKey("syscounts");
h4.setColumn("涉及系统数");
h4.setIsFixed(3);
headList.add(h4);
ReportHeadColumn h5 = new ReportHeadColumn();
h5.setColKey("dealusercounts");
h5.setColumn("涉及处理人数");
h5.setIsFixed(3);
headList.add(h5);
return headList;
}
private List<ReportHeadColumn> getHeadColumns(Map<String, String> departMap) {
List<ReportHeadColumn> list = new ArrayList<>();
departMap.forEach((k, v)->{
ReportHeadColumn h4 = new ReportHeadColumn();
h4.setColKey(k);
h4.setColumn(v);
list.add(h4);
}); ReportHeadColumn h5 = new ReportHeadColumn();
h5.setColKey("counts");
h5.setColumn("总数");
list.add(h5);
return list;
}}
本作品采用《CC 协议》,转载必须注明作者和本文链接