多维度统计-一定要从外侧依次关联-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 协议》,转载必须注明作者和本文链接
MissYou123
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!