package com.qianwen.smartman.modules.mdc.service.impl; import java.sql.Timestamp; import java.time.LocalDate; import java.time.chrono.ChronoLocalDate; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Lists; import com.qianwen.core.excel.util.ExcelUtil; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.mp.support.Condition; import com.qianwen.core.mp.support.Query; import com.qianwen.core.oss.model.BladeFile; import com.qianwen.core.tool.support.Kv; import com.qianwen.core.tool.utils.DateUtil; import com.qianwen.core.tool.utils.Func; import com.qianwen.core.tool.utils.StringUtil; import com.qianwen.smartman.common.cache.cps.TimeSliceCache; import com.qianwen.smartman.common.cache.cps.WorkstationCache; import com.qianwen.smartman.common.constant.CalendarConstant; import com.qianwen.smartman.common.constant.CommonConstant; import com.qianwen.smartman.common.constant.DateConstant; import com.qianwen.smartman.common.constant.ExcelConstant; import com.qianwen.smartman.common.constant.MdcConstant; import com.qianwen.smartman.common.enums.DefaultWcsEnum; import com.qianwen.smartman.common.utils.LocalDateTimeUtils; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.smartman.modules.cps.entity.CommonGroup; import com.qianwen.smartman.modules.cps.entity.GlobalWcs; import com.qianwen.smartman.modules.cps.entity.ShiftDetail; import com.qianwen.smartman.modules.cps.entity.Workstation; import com.qianwen.smartman.modules.cps.enums.WorkstationTypeEnum; import com.qianwen.smartman.modules.cps.mapper.CalendarMapper; import com.qianwen.smartman.modules.cps.service.ICalendarService; import com.qianwen.smartman.modules.cps.service.ICommonGroupService; import com.qianwen.smartman.modules.cps.service.IWorkstationService; import com.qianwen.smartman.modules.mdc.dto.CountStatusDTO; import com.qianwen.smartman.modules.mdc.dto.GroupWorkDTO; import com.qianwen.smartman.modules.mdc.dto.IntervalDateDto; import com.qianwen.smartman.modules.mdc.dto.MixShiftDetailsDTO; import com.qianwen.smartman.modules.mdc.dto.NameIdDTO; import com.qianwen.smartman.modules.mdc.dto.ShiftIndexNameDTO; import com.qianwen.smartman.modules.mdc.entity.SuperAggregateState; import com.qianwen.smartman.modules.mdc.enums.OpenTypeEnums; import com.qianwen.smartman.modules.mdc.enums.StatisticalMethodEnum; import com.qianwen.smartman.modules.mdc.excel.TimeUsedDateExcel; import com.qianwen.smartman.modules.mdc.excel.TimeUsedExport; import com.qianwen.smartman.modules.mdc.mapper.SuperAggregateStateMapper; import com.qianwen.smartman.modules.mdc.service.ISuperAggregateStateService; import com.qianwen.smartman.modules.mdc.service.ITimeUsedAnalysisService; import com.qianwen.smartman.modules.mdc.utils.FilterOffUtils; import com.qianwen.smartman.modules.mdc.vo.QueryShiftIndexNameVO; import com.qianwen.smartman.modules.mdc.vo.TimeUsedAnalysisWorkstationVO; import com.qianwen.smartman.modules.mdc.vo.TimeUsedStatisticsByWorkstationVO; import com.qianwen.smartman.modules.mdc.vo.WorkstationBandShiftVO; import com.qianwen.smartman.modules.mdc.vo.excel.TimeUsedExcelVO; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; import cn.hutool.core.util.NumberUtil; @Service public class TimeUsedAnalysisServiceImpl implements ITimeUsedAnalysisService { private static final Logger log = LoggerFactory.getLogger(TimeUsedAnalysisServiceImpl.class); private final SuperAggregateStateMapper baseMapper; private final IWorkstationService workstationService; private final ICommonGroupService commonGroupService; private final CalendarMapper calendarMapper; private final ISuperAggregateStateService stateService; private final OssBuilder ossBuilder; private final ICalendarService calendarService; public TimeUsedAnalysisServiceImpl(final SuperAggregateStateMapper baseMapper, final IWorkstationService workstationService, final ICommonGroupService commonGroupService, final CalendarMapper calendarMapper, final ISuperAggregateStateService stateService, final OssBuilder ossBuilder, final ICalendarService calendarService) { this.baseMapper = baseMapper; this.workstationService = workstationService; this.commonGroupService = commonGroupService; this.calendarMapper = calendarMapper; this.stateService = stateService; this.ossBuilder = ossBuilder; this.calendarService = calendarService; } @Override // org.springblade.modules.mdc.service.ITimeUsedAnalysisService public TimeUsedAnalysisWorkstationVO timeUsedStatisticsByWorkstation(TimeUsedStatisticsByWorkstationVO stationVO, Query query) { Integer type = stationVO.getType(); if (MdcConstant.WORK_STATION.equals(type)) { return buildWorkStation(query, stationVO); } return buildGroup(query, stationVO); } private TimeUsedAnalysisWorkstationVO buildWorkStation(Query query, TimeUsedStatisticsByWorkstationVO stationVO) { TimeUsedAnalysisWorkstationVO res; StatisticalMethodEnum methodEnum = stationVO.getEnums(); List ids = stationVO.getIds(); LocalDate queryTime = stationVO.getQueryTime(); IPage page = this.workstationService.page(Condition.getPage(query),Wrappers.lambdaQuery() .in(Func.isNotEmpty(ids), Workstation::getId, ids) .eq(Workstation::getType, WorkstationTypeEnum.MACHINE.getCode()) .eq(Workstation::getStatus, CommonConstant.ENABLE) .isNotNull(Workstation::getCalendarCode) .orderByAsc(Workstation::getCode)); /* IPage page = this.workstationService.page(Condition.getPage(query), (Wrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().in(Func.isNotEmpty(ids), (v0) -> { return v0.getId(); }, ids).eq((v0) -> { return v0.getType(); }, WorkstationTypeEnum.MACHINE.getCode())).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE)).isNotNull((v0) -> { return v0.getCalendarCode(); })).orderByAsc((v0) -> { return v0.getCode(); }));*/ long total = page.getTotal(); List workstations = page.getRecords(); if (Func.isEmpty(workstations)) { return new TimeUsedAnalysisWorkstationVO(); } switch (methodEnum) { case DAY: res = buildTimeUsedAnalysisDay(workstations, queryTime); res.setTotal(Long.valueOf(total)); break; case WEEK: res = buildTimeUsedAnalysisWeek(workstations, stationVO.getYear(), stationVO.getWeek()); res.setTotal(Long.valueOf(total)); break; case MONTH: res = buildTimeUsedAnalysisMonth(workstations, stationVO.getYear(), stationVO.getMonth()); res.setTotal(Long.valueOf(total)); break; default: res = buildTimeUsedAnalysisShift(ids, queryTime, stationVO.getShiftIndex(), query); break; } return res; } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisDay(List workstations, LocalDate queryTime) { List ids = workstations.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); List stateList = this.baseMapper.dateState(DateUtil.format(queryTime, "yyyyMMdd"), ids); Map> map = buildStateMap(wcsList, stateList); for (Workstation workstation : workstations) { workStationDetails.add(NameIdDTO.builder().id(workstation.getId()).name(workstation.getName() + "\n" + workstation.getCode()).build()); Long id = workstation.getId(); Map countResults = mergeMap(map.get(id), wcsList); log.info("day合并后:{}", countResults); countStatus.add(buildCountStatus(countResults)); } return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).build(); } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisWeek(List workstations, Integer year, Integer week) { List ids = workstations.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); List stateList = this.baseMapper.weekState(ids, year, week); Map> map = buildStateMap(wcsList, stateList); for (Workstation workstation : workstations) { workStationDetails.add(NameIdDTO.builder().id(workstation.getId()).name(workstation.getName() + "\n" + workstation.getCode()).build()); Long id = workstation.getId(); Map countResults = mergeMap(map.get(id), wcsList); log.info("week合并后:{}", countResults); countStatus.add(buildCountStatus(countResults)); } return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).build(); } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisMonth(List workstations, Integer year, Integer month) { List ids = workstations.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); List stateList = this.baseMapper.yearState(ids, year, month); Map> map = buildStateMap(wcsList, stateList); for (Workstation workstation : workstations) { workStationDetails.add(NameIdDTO.builder().id(workstation.getId()).name(workstation.getName() + "\n" + workstation.getCode()).build()); Long id = workstation.getId(); Map countResults = mergeMap(map.get(id), wcsList); log.info("month合并后:{}", countResults); countStatus.add(buildCountStatus(countResults)); } return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).build(); } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisShift(List ids, LocalDate queryTime, Integer shiftIndex, Query query) { List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); IPage workstationPages = this.workstationService.listWorkStationOnShiftIndex(ids, queryTime, query, shiftIndex, WorkstationTypeEnum.MACHINE.getCode()); Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); LinkedHashMap> calendarMap = workstationPages.getRecords().stream().collect(Collectors.groupingBy((v0) -> { return v0.getCalendarCode(); }, LinkedHashMap::new, Collectors.toList())); calendarMap.forEach((calendarCode, workStationsList) -> { List workStationIds = workStationsList.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); List stateList = this.baseMapper.shiftState(workStationIds, DateUtil.format(queryTime, "yyyyMMdd"), shiftIndex, calendarCode); Map> map = buildStateMap(wcsList, stateList); Iterator it = workStationsList.iterator(); while (it.hasNext()) { Workstation workstation = it.next(); workStationDetails.add(NameIdDTO.builder().id(workstation.getId()).name(workstation.getName() + "\n" + workstation.getCode()).build()); Long id = workstation.getId(); Map countResults = mergeMap(map.get(id), wcsList); log.info("month合并后:{}", countResults); countStatus.add(buildCountStatus(countResults)); } }); return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).total(Long.valueOf(workstationPages.getTotal())).build(); } private TimeUsedAnalysisWorkstationVO buildGroup(Query query, TimeUsedStatisticsByWorkstationVO stationVO) { TimeUsedAnalysisWorkstationVO res; StatisticalMethodEnum methodEnum = stationVO.getEnums(); List ids = stationVO.getIds(); LocalDate queryTime = stationVO.getQueryTime(); String groupType = stationVO.getGroupType(); String groupCategory = stationVO.getGroupCategory(); long total = this.commonGroupService.count(Wrappers.lambdaQuery() .eq(CommonGroup::getGroupType, groupType) .eq(CommonGroup::getGroupCategory, groupCategory) .in(Func.isNotEmpty(ids), CommonGroup::getId, ids)); /* long total = this.commonGroupService.count(((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getGroupType(); }, groupType)).eq((v0) -> { return v0.getGroupCategory(); }, groupCategory)).in(Func.isNotEmpty(ids), (v0) -> { return v0.getId(); }, ids));*/ IPage page = this.commonGroupService.page(Condition.getPage(query), Wrappers.lambdaQuery() .eq(CommonGroup::getGroupType, groupType) .eq(CommonGroup::getGroupCategory, groupCategory) .in(Func.isNotEmpty(ids), CommonGroup::getId, ids) .orderByAsc(CommonGroup::getCode)); /* IPage page = this.commonGroupService.page(Condition.getPage(query), (Wrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getGroupType(); }, groupType)).eq((v0) -> { return v0.getGroupCategory(); }, groupCategory)).in(Func.isNotEmpty(ids), (v0) -> { return v0.getId(); }, ids).orderByAsc((v0) -> { return v0.getCode(); }));*/ List groups = page.getRecords(); if (Func.isEmpty(groups)) { return new TimeUsedAnalysisWorkstationVO(); } Map> groupWorkstationMap = this.commonGroupService.groupWorkstationMap(groups.stream().map(c -> { return String.valueOf(c.getId()); }).collect(Collectors.toList())); switch (methodEnum) { case DAY: res = buildTimeUsedAnalysisGroupDay(groups, groupWorkstationMap, queryTime); break; case WEEK: res = buildTimeUsedAnalysisGroupWeek(groups, groupWorkstationMap, stationVO.getYear(), stationVO.getWeek()); break; case MONTH: res = buildTimeUsedAnalysisGroupMonth(groups, groupWorkstationMap, stationVO.getYear(), stationVO.getMonth()); break; default: res = this.buildTimeUsedAnalysisShift(ids, queryTime, stationVO.getShiftIndex(), query); break; } res.setTotal(Long.valueOf(total)); return res; } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisGroupDay(List groups, Map> groupWorkstationMap, LocalDate queryTime) { List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); for (CommonGroup group : groups) { workStationDetails.add(NameIdDTO.builder().id(group.getId()).name(group.getName()).build()); Long id = group.getId(); Set workstationIds = groupWorkstationMap.get(id); if (Func.isEmpty(workstationIds)) { countStatus.add(buildCountStatus(new HashMap<>(10))); } else { Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); List stateEndTimeNotNullList = this.baseMapper.dateState(DateUtil.format(queryTime, "yyyyMMdd"), Lists.newArrayList(workstationIds)); Map map = buildStateGroupMap(wcsList, FilterOffUtils.filterOffDay(stateEndTimeNotNullList, OpenTypeEnums.TIME_USED_ANALYSIS)); Map countResults = mergeMap(map, wcsList); log.info("groupDay:{}", countResults); countStatus.add(buildCountStatus(countResults)); } } return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).build(); } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisGroupWeek(List groups, Map> groupWorkstationMap, Integer year, Integer week) { List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); for (CommonGroup group : groups) { workStationDetails.add(NameIdDTO.builder().id(group.getId()).name(group.getName()).build()); Long id = group.getId(); Set workstationIds = groupWorkstationMap.get(id); if (Func.isEmpty(workstationIds)) { countStatus.add(buildCountStatus(new HashMap<>(10))); } else { Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); List stateEndTimeNotNullList = this.baseMapper.weekState(Lists.newArrayList(workstationIds), year, week); Map map = buildStateGroupMap(wcsList, FilterOffUtils.filterOffDay(stateEndTimeNotNullList, OpenTypeEnums.TIME_USED_ANALYSIS)); Map countResults = mergeMap(map, wcsList); log.info("groupWeek:{}", countResults); countStatus.add(buildCountStatus(countResults)); } } return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).build(); } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisGroupMonth(List groups, Map> groupWorkstationMap, Integer year, Integer month) { List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); for (CommonGroup group : groups) { workStationDetails.add(NameIdDTO.builder().id(group.getId()).name(group.getName()).build()); Long id = group.getId(); Set workstationIds = groupWorkstationMap.get(id); if (Func.isEmpty(workstationIds)) { countStatus.add(buildCountStatus(new HashMap<>(10))); } else { Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); List stateEndTimeNotNullList = this.baseMapper.yearState(Lists.newArrayList(workstationIds), year, month); Map map1 = buildStateGroupMap(wcsList, FilterOffUtils.filterOffDay(stateEndTimeNotNullList, OpenTypeEnums.TIME_USED_ANALYSIS)); Map countResults = mergeMap(map1, wcsList); log.info("groupMonth:{}", countResults); countStatus.add(buildCountStatus(countResults)); } } return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).build(); } private TimeUsedAnalysisWorkstationVO buildTimeUsedAnalysisGroupShift(List groups, Map> groupWorkstationMap, LocalDate queryTime, Integer shiftIndex) { List workStationDetails = Lists.newArrayList(); List> countStatus = Lists.newArrayList(); List ids = groupWorkstationMap.values().stream().flatMap((v0) -> { return v0.stream(); }).distinct().collect(Collectors.toList()); Map calendarMap = findWorkstationCalendarCode(ids); Map groupMap = groups.stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, v -> { return v; })); groupWorkstationMap.forEach((groupId, workstationIds) -> { CommonGroup group = (CommonGroup) groupMap.getOrDefault(groupId, new CommonGroup()); workStationDetails.add(NameIdDTO.builder().id(group.getId()).name(group.getName()).build()); if (Func.isEmpty(workstationIds)) { countStatus.add(buildCountStatus(new HashMap<>(10))); return; } Set wcsList = listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()); List superAggregateStates = workstationIds.stream().map(wId -> { return this.baseMapper.countStatsShift(String.valueOf(wId), DateUtil.format(queryTime, "yyyyMMdd"), shiftIndex, String.valueOf(calendarMap.get(wId))); }).filter((v0) -> { return Func.isNotEmpty(v0); }).flatMap((v0) -> { return v0.stream(); }).filter((v0) -> { return Func.isNotEmpty(v0); }).collect(Collectors.toList()); Map map = buildStateGroupMap(wcsList, FilterOffUtils.filterOffDay(superAggregateStates, OpenTypeEnums.TIME_USED_ANALYSIS)); Map resultMap = mergeMap(map, wcsList); log.info("groupShift:{}", resultMap); countStatus.add(buildCountStatus(resultMap)); }); return TimeUsedAnalysisWorkstationVO.builder().countStatus(countStatus).workStationDetails(workStationDetails).build(); } private Map findWorkstationCalendarCode(List workstationIds) { if (Func.isEmpty(workstationIds)) { return new HashMap<>(10); } return this.workstationService.list(Wrappers.lambdaQuery() .in(Workstation::getId, workstationIds)) .stream() .collect(Collectors.toMap(Workstation::getId, Workstation::getCalendarCode)); /* return (Map) this.workstationService.list((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getId(); }, workstationIds)).stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, (v0) -> { return v0.getCalendarCode(); }));*/ } private List buildCountStatus(Map map) { List list = listGlobalWcs(); return list.stream().map(value -> { String code = value.getCode(); Long count = (Long) map.getOrDefault(Integer.valueOf(Integer.parseInt(code)), 0L); return CountStatusDTO.builder().count(count).statusName(value.getName()).code(code).build(); }).collect(Collectors.toList()); } private Map> buildStateMap(Set wcsList, List stateList) { List stateList2 = FilterOffUtils.filterOffDay(stateList, OpenTypeEnums.TIME_USED_ANALYSIS); Timestamp ts = new Timestamp(System.currentTimeMillis()); return stateList2.stream().peek(c -> { Timestamp endTime = c.getEndTime(); if (endTime == null) { c.setEndTime(ts); } c.setDurationCollect(Long.valueOf(LocalDateTimeUtils.betweenTwoTime(c.getStartTime().toLocalDateTime(), c.getEndTime().toLocalDateTime(), ChronoUnit.MILLIS))); }).filter(c2 -> { return (!wcsList.contains(c2.getValueCollect()) || c2.getValueCollect() == null || c2.getDurationCollect() == null) ? false : true; }).collect(Collectors.groupingBy((v0) -> { return v0.getWorkstationId(); }, Collectors.groupingBy((v0) -> { return v0.getValueCollect(); }, Collectors.summingLong((v0) -> { return v0.getDurationCollect(); })))); } private Map buildStateGroupMap(Set wcsList, List stateList) { Timestamp ts = new Timestamp(System.currentTimeMillis()); return stateList.stream().peek(c -> { Timestamp endTime = c.getEndTime(); if (endTime == null) { c.setEndTime(ts); } c.setDurationCollect(Long.valueOf(LocalDateTimeUtils.betweenTwoTime(c.getStartTime().toLocalDateTime(), c.getEndTime().toLocalDateTime(), ChronoUnit.MILLIS))); }).filter(c2 -> { return (!wcsList.contains(c2.getValueCollect()) || c2.getValueCollect() == null || c2.getDurationCollect() == null) ? false : true; }).collect(Collectors.groupingBy((v0) -> { return v0.getValueCollect(); }, Collectors.summingLong((v0) -> { return v0.getDurationCollect(); }))); } private Map mergeMap(Map map, Set wcsList) { Map result = new HashMap<>(wcsList.size()); wcsList.forEach(wcs -> { Long w1 = 0L; if (Func.isNotEmpty(map)) { w1 = (Long) map.getOrDefault(wcs, 0L); } result.put(wcs, w1); }); return result; } private List listGlobalWcs() { return WorkstationCache.getDefaultWcs(); } @Override // org.springblade.modules.mdc.service.ITimeUsedAnalysisService public WorkstationBandShiftVO queryWorkStationShiftIndexName(QueryShiftIndexNameVO vo) { Integer type = vo.getType(); if (MdcConstant.WORK_STATION.equals(type)) { return getWorkShiftIndexName(vo); } return getGroupShiftIndexName(vo); } @Override // org.springblade.modules.mdc.service.ITimeUsedAnalysisService public Map> queryWorkStationShiftIndex(List workstationIds, LocalDate localDate) { Map> idToValue = Kv.newMap(); workstationIds.forEach(workstationId -> { Workstation workstation = this.workstationService.getOne(Wrappers.lambdaQuery().eq(Workstation::getId, workstationId) .eq(Workstation::getType, WorkstationTypeEnum.MACHINE.getCode()).isNotNull(Workstation::getCalendarCode)); /* Workstation workstation = (Workstation) this.workstationService.getOne((Wrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getId(); }, workstationId)).eq((v0) -> { return v0.getType(); }, WorkstationTypeEnum.MACHINE.getCode())).isNotNull((v0) -> { return v0.getCalendarCode(); }));*/ if (Func.isEmpty(workstation)) { idToValue.put(workstationId, new ArrayList<>()); } if (workstation != null) { List dtos = this.calendarService.queryShiftIndexName(workstation.getCalendarCode(), Integer.valueOf(localDate.getYear()), DateUtil.formatDate(localDate)); idToValue.put(workstationId, dtos); } }); return idToValue; } @Override // org.springblade.modules.mdc.service.ITimeUsedAnalysisService public Map> queryBatchWorkStationShiftIndex(List workstationIdList, LocalDate localDate) { Map> idToValue = Kv.newMap(); List workstations = this.workstationService.listByIds(workstationIdList); Map> collect = workstations.stream().collect(Collectors.groupingBy((v0) -> { return v0.getCalendarCode(); })); List calendarCodeList = workstations.stream().map((v0) -> { return v0.getCalendarCode(); }).distinct().collect(Collectors.toList()); calendarCodeList.forEach(calendarCode -> { List shiftIndexNameDTOList = this.calendarService.queryShiftIndexName(calendarCode, Integer.valueOf(localDate.getYear()), DateUtil.formatDate(localDate)); List workstationIds = collect.get(calendarCode).stream().map(Workstation::getId).collect(Collectors.toList()); /* List workstationIds = collect.get(calendarCode).stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); */ workstationIds.forEach(workstationId -> { List list = idToValue.put(workstationId, shiftIndexNameDTOList); }); }); return idToValue; } @Override // org.springblade.modules.mdc.service.ITimeUsedAnalysisService public BladeFile exportTimeUsed(TimeUsedExcelVO vo) { List workstations; StatisticalMethodEnum enums = vo.getEnums(); List ids = vo.getIds(); if (Func.isEmpty(ids)) { workstations = this.workstationService.list(Wrappers.lambdaQuery() .eq(Workstation::getType, WorkstationTypeEnum.MACHINE.getCode()) .eq(Workstation::getStatus, CommonConstant.ENABLE)); /* workstations = this.workstationService.list((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getType(); }, WorkstationTypeEnum.MACHINE.getCode())).eq((v0) -> { return v0.getStatus(); }, CommonConstant.ENABLE));*/ ids = workstations.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); } else { workstations = this.workstationService.workStationList(ids); } if (Func.isEmpty(ids)) { return exportEmpty(vo.getEnums()); } Map workstationMap = workstations.stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, v -> { return v; })); LocalDate startTime = vo.getStartTime(); LocalDate endTime = vo.getEndTime(); if (Func.isNull(startTime) || Func.isNull(endTime)) { throw new ServiceException(MessageUtils.message("mdc.process.time.not.null", new Object[0])); } Map groupWorkMap = this.workstationService.queryGroupWorkStation(ids); switch (enums) { case DAY: return buildExcelByDay(ids, workstationMap, groupWorkMap, startTime, endTime); case WEEK: return buildExcelByWeek(ids, workstationMap, groupWorkMap, vo); case MONTH: return buildExcelByMonth(ids, workstationMap, groupWorkMap, vo); case SHIFT: return getExcelByShift(ids, startTime, endTime); default: return null; } } private BladeFile exportEmpty(StatisticalMethodEnum enums) { switch (enums) { case DAY: case WEEK: case MONTH: List timeUsedDataExports = new ArrayList<>(); return buildExcel(timeUsedDataExports); case SHIFT: List timeUsedExports = Lists.newArrayList(); String fileName = String.format("%s-%s.xlsx", ExcelConstant.TIME_USED, DateUtil.time()); MultipartFile multipartFile = ExcelUtil.exportToMultipartFile(fileName, ExcelConstant.TIME_USED, timeUsedExports, TimeUsedExport.class); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); default: return null; } } private BladeFile buildExcelByMonth(List ids, Map workstationMap, Map groupWorkMap, TimeUsedExcelVO vo) { List timeUsedExports = getExcelByMonth(ids, workstationMap, groupWorkMap, vo); return buildExcel(timeUsedExports); } private List getExcelByMonth(List ids, Map workstationMap, Map groupWorkMap, TimeUsedExcelVO vo) { LocalDate startTime = vo.getStartTime(); LocalDate endTime = vo.getEndTime(); List data = Lists.newArrayList(); List intervalDate = LocalDateTimeUtils.getIntervalDate(startTime, endTime); intervalDate.forEach(dto -> { Integer year = dto.getYear(); List monthList = dto.getMonthList(); data.addAll(this.stateService.getDataByMonth(ids, year, monthList)); }); List filterData = FilterOffUtils.filterOffDay(data, OpenTypeEnums.TIME_USED_ANALYSIS); if (Func.isEmpty(data)) { return Lists.newArrayList(); } List timeUsedExports = Lists.newArrayList(); Map>> stateMap = filterData.stream().sorted(Comparator.comparing(SuperAggregateState::getFactoryYear).reversed().thenComparing(SuperAggregateState::getFactoryMonth).reversed()).collect(Collectors.groupingBy(c -> { return c.getFactoryYear() + "-" + c.getFactoryMonth(); }, Collectors.groupingBy((v0) -> { return v0.getWorkstationId(); }))); stateMap.forEach((date, stats) -> { stats.forEach((workstationId, statsList) -> { Workstation workstation = (Workstation) workstationMap.getOrDefault(workstationId, new Workstation()); GroupWorkDTO groupWork = (GroupWorkDTO) groupWorkMap.getOrDefault(workstationId, new GroupWorkDTO()); Map wcsMap = getWcsMap(listGlobalWcs().stream().map(c2 -> { return Integer.valueOf(Integer.parseInt(c2.getCode())); }).collect(Collectors.toSet()), statsList); timeUsedExports.add(TimeUsedDateExcel.builder().date(date).groupName(groupWork.getName()).workstationCode(workstation.getCode()).workstationName(workstation.getName()).running(wcsMap.get(DefaultWcsEnum.RUNNING.getCode())).standby(wcsMap.get(DefaultWcsEnum.STANDBY.getCode())).debugging(wcsMap.get(DefaultWcsEnum.DEBUGGING.getCode())).alarm(wcsMap.get(DefaultWcsEnum.ALARM.getCode())).offline(wcsMap.get(DefaultWcsEnum.OFFLINE.getCode())).build()); }); }); timeUsedExports.sort(Comparator.comparing(TimeUsedDateExcel::getDate).reversed()); /* timeUsedExports.sort(Comparator.comparing((v0) -> { return v0.getDate(); }).reversed());*/ return timeUsedExports; } private BladeFile buildExcelByWeek(List ids, Map workstationMap, Map groupWorkMap, TimeUsedExcelVO vo) { List timeUsedExports = getExcelByWeek(ids, workstationMap, groupWorkMap, vo); return buildExcel(timeUsedExports); } private List getExcelByWeek(List ids, Map workstationMap, Map groupWorkMap, TimeUsedExcelVO vo) { LocalDate startTime = vo.getStartTime(); LocalDate endTime = vo.getEndTime(); List data = Lists.newArrayList(); List intervalDate = LocalDateTimeUtils.getIntervalDate(startTime, endTime); intervalDate.forEach(dto -> { Integer year = dto.getYear(); List weekList = dto.getWeekList(); data.addAll(this.stateService.getDataByWeek(ids, year, weekList)); }); List filterData = FilterOffUtils.filterOffDay(data, OpenTypeEnums.TIME_USED_ANALYSIS); if (Func.isEmpty(filterData)) { return Lists.newArrayList(); } Map>> stateMap = filterData.stream().sorted(Comparator.comparing(SuperAggregateState::getFactoryYear).reversed().thenComparing((v0) -> { return v0.getFactoryWeek(); }).reversed()).collect(Collectors.groupingBy(c -> { return c.getFactoryYear() + "-" + c.getFactoryWeek(); }, Collectors.groupingBy((v0) -> { return v0.getWorkstationId(); }))); List timeUsedExports = Lists.newArrayList(); stateMap.forEach((date, stats) -> { stats.forEach((workstationId, statsList) -> { Workstation workstation = workstationMap.getOrDefault(workstationId, new Workstation()); GroupWorkDTO groupWork = groupWorkMap.getOrDefault(workstationId, new GroupWorkDTO()); Map wcsMap = getWcsMap(listGlobalWcs().stream().map(c2 -> { return Integer.valueOf(Integer.parseInt(c2.getCode())); }).collect(Collectors.toSet()), statsList); timeUsedExports.add(TimeUsedDateExcel.builder().date(getWeek(date)).groupName(groupWork.getName()).workstationCode(workstation.getCode()).workstationName(workstation.getName()).running(wcsMap.get(DefaultWcsEnum.RUNNING.getCode())).standby(wcsMap.get(DefaultWcsEnum.STANDBY.getCode())).debugging(wcsMap.get(DefaultWcsEnum.DEBUGGING.getCode())).alarm(wcsMap.get(DefaultWcsEnum.ALARM.getCode())).offline(wcsMap.get(DefaultWcsEnum.OFFLINE.getCode())).build()); }); }); timeUsedExports.sort(Comparator.comparing(TimeUsedDateExcel::getDate).reversed()); /* timeUsedExports.sort(Comparator.comparing((v0) -> { return v0.getDate(); }).reversed());*/ return timeUsedExports; } private String getWeek(String date) { String[] split = date.split("-"); return StringUtil.format(split[0].concat("-").concat("第{}周"), new Object[]{split[1]}); } private BladeFile buildExcelByDay(List ids, Map workstationMap, Map groupWorkMap, LocalDate startTime, LocalDate endTime) { List timeUsedExports = getExcelByDay(ids, workstationMap, startTime, endTime, groupWorkMap); return buildExcel(timeUsedExports); } private List getExcelByDay(List ids, Map workstationMap, LocalDate startTime, LocalDate endTime, Map groupWorkMap) { List statusData = FilterOffUtils.filterOffDay(this.stateService.getStatusData(ids, StatisticalMethodEnum.DAY, startTime, endTime), OpenTypeEnums.TIME_USED_ANALYSIS); if (Func.isEmpty(statusData)) { return Lists.newArrayList(); } Map>> map = statusData.stream().sorted(Comparator.comparing(SuperAggregateState::getFactoryDate).reversed()).collect(Collectors.groupingBy((v0) -> { return v0.getFactoryDate(); }, Collectors.groupingBy((v0) -> { return v0.getWorkstationId(); }))); List timeUsedExports = Lists.newArrayList(); map.forEach((date, status) -> { status.forEach((workstationId, statsList) -> { Workstation workstation = workstationMap.getOrDefault(workstationId, new Workstation()); GroupWorkDTO groupWork = groupWorkMap.getOrDefault(workstationId, new GroupWorkDTO()); Map wcsMap = getWcsMap(listGlobalWcs().stream().map(c -> { return Integer.valueOf(Integer.parseInt(c.getCode())); }).collect(Collectors.toSet()), statsList); timeUsedExports.add(TimeUsedDateExcel.builder().date(getDay(date)).groupName(groupWork.getName()).workstationCode(workstation.getCode()).workstationName(workstation.getName()).running(wcsMap.get(DefaultWcsEnum.RUNNING.getCode())).standby(wcsMap.get(DefaultWcsEnum.STANDBY.getCode())).debugging(wcsMap.get(DefaultWcsEnum.DEBUGGING.getCode())).alarm(wcsMap.get(DefaultWcsEnum.ALARM.getCode())).offline(wcsMap.get(DefaultWcsEnum.OFFLINE.getCode())).build()); }); }); timeUsedExports.sort(Comparator.comparing(TimeUsedDateExcel::getDate).reversed()); /* timeUsedExports.sort(Comparator.comparing((v0) -> { return v0.getDate(); }).reversed());*/ return timeUsedExports; } private String getDay(Integer date) { char[] chars = String.valueOf(date).toCharArray(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < chars.length; i++) { if (i == 3) { sb.append(chars[i]).append("-"); } else if (i == 5) { sb.append(chars[i]).append("-"); } else { sb.append(chars[i]); } } return sb.toString(); } private BladeFile buildExcel(List timeUsedExports) { String fileName = String.format("%s-%s.xlsx", ExcelConstant.TIME_USED, DateUtil.time()); MultipartFile multipartFile = ExcelUtil.exportToMultipartFile(fileName, ExcelConstant.SHEET, timeUsedExports, TimeUsedDateExcel.class); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); } private BladeFile getExcelByShift(List ids, LocalDate startTime, LocalDate endTime) { List timeUsedExports = Lists.newArrayList(); while (endTime.compareTo((ChronoLocalDate) startTime) >= 0) { String date = DateUtil.format(endTime, DateConstant.PATTERN_DATE); List workstations = this.workstationService.listWorkStationOnShift(ids, endTime, MdcConstant.SHIFT_INDEX, WorkstationTypeEnum.MACHINE.getCode()); if (Func.isEmpty(workstations)) { endTime = endTime.minusDays(1L); } else { List wIds = workstations.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); Map workstationMap = workstations.stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, v -> { return v; })); Map> calendarCodeMap = workstations.stream().collect(Collectors.groupingBy((v0) -> { return v0.getCalendarCode(); })); LocalDate finalEndTime = endTime; Map> shiftNameMap = new HashMap<>(calendarCodeMap.size()); calendarCodeMap.forEach((calendarCode, wList) -> { List timeShiftDetail = TimeSliceCache.getTimeShiftDetail(calendarCode, finalEndTime); Map map = timeShiftDetail.stream().collect(Collectors.toMap((v0) -> { return v0.getShiftIndex(); }, v2 -> { return v2; })); shiftNameMap.put(calendarCode, map); }); Map groupWorkMap = this.workstationService.queryGroupWorkStation(wIds); List states = this.stateService.listsState(wIds, endTime, MdcConstant.SHIFT_INDEX); List exports = buildExportData(FilterOffUtils.filterOffDay(states, OpenTypeEnums.TIME_USED_ANALYSIS), workstationMap, shiftNameMap, groupWorkMap, date); timeUsedExports.addAll(exports); endTime = endTime.minusDays(1L); } } String fileName = String.format("%s-%s.xlsx", ExcelConstant.TIME_USED, DateUtil.time()); MultipartFile multipartFile = ExcelUtil.exportToMultipartFile(fileName, ExcelConstant.TIME_USED, timeUsedExports, TimeUsedExport.class); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); } private List buildExportData(List states, Map workstationMap, Map> shiftNameMap, Map groupWorkMap, String date) { if (Func.isEmpty(states)) { return Lists.newArrayList(); } Map>> stateMap = states.stream().filter(c -> { return MdcConstant.SHIFT_INDEX.contains(c.getShiftIndex()); }).collect(Collectors.groupingBy((v0) -> { return v0.getWorkstationId(); }, Collectors.groupingBy((v0) -> { return v0.getShiftIndex(); }))); List res = Lists.newArrayList(); stateMap.forEach((workstationId, shiftMap) -> { Workstation workstation = (Workstation) workstationMap.getOrDefault(workstationId, new Workstation()); GroupWorkDTO groupWorkDTO = (GroupWorkDTO) groupWorkMap.getOrDefault(workstationId, new GroupWorkDTO()); shiftMap.forEach((shiftIndex, stateList) -> { if (MdcConstant.SHIFT_INDEX.contains(shiftIndex)) { String shiftName = Optional.ofNullable(shiftNameMap.get(workstation.getCalendarCode())).map(m -> { return ((ShiftDetail) m.getOrDefault(shiftIndex, new ShiftDetail())).getIndexName(); }).orElse(MessageUtils.message("calendar.page.shift.model.shift", new Object[0]) + shiftIndex); Map wcsMap = getWcsMap(listGlobalWcs().stream().map(c2 -> { return Integer.valueOf(Integer.parseInt(c2.getCode())); }).collect(Collectors.toSet()), stateList); TimeUsedExport build = TimeUsedExport.builder().date(date).groupName(groupWorkDTO.getName()).workstationCode(workstation.getCode()).workstationName(workstation.getName()).shiftName(shiftName).running(wcsMap.get(DefaultWcsEnum.RUNNING.getCode())).standby(wcsMap.get(DefaultWcsEnum.STANDBY.getCode())).debugging(wcsMap.get(DefaultWcsEnum.DEBUGGING.getCode())).alarm(wcsMap.get(DefaultWcsEnum.ALARM.getCode())).offline(wcsMap.get(DefaultWcsEnum.OFFLINE.getCode())).build(); res.add(build); } }); }); return res; } private Map getWcsMap(Set wcsList, List states) { Map map = states.stream().filter(c -> { return (!wcsList.contains(c.getValueCollect()) || c.getValueCollect() == null || c.getDurationCollect() == null) ? false : true; }).collect(Collectors.groupingBy((v0) -> { return v0.getValueCollect(); }, Collectors.summingLong((v0) -> { return v0.getDurationCollect(); }))); long sum = map.values().stream().mapToLong(c2 -> { return c2.longValue(); }).sum(); Map res = new HashMap<>(map.size()); wcsList.forEach(w -> { String value; Long l = 0L; if (l.equals(Long.valueOf(sum))) { value = "0%"; } else { value = NumberUtil.decimalFormat(MdcConstant.NORMAL_FORMAT, ((((Long) map.getOrDefault(w, 0L)).longValue() * 1.0d) / sum) * 100.0d) + "%"; } res.put(w, value); }); return res; } private WorkstationBandShiftVO getWorkShiftIndexName(QueryShiftIndexNameVO vo) { List ids = vo.getIds(); LocalDate localDate = vo.getLocalDate(); List workstations = this.workstationService.list(Wrappers.lambdaQuery() .in(Func.isNotEmpty(ids), Workstation::getId, ids) .eq(Workstation::getType, WorkstationTypeEnum.MACHINE.getCode()) .isNotNull(Workstation::getCalendarCode) .orderByAsc(Workstation::getCode)); /* List workstations = this.workstationService.list((Wrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().in(Func.isNotEmpty(ids), (v0) -> { return v0.getId(); }, ids).eq((v0) -> { return v0.getType(); }, WorkstationTypeEnum.MACHINE.getCode())).isNotNull((v0) -> { return v0.getCalendarCode(); })).orderByAsc((v0) -> { return v0.getCode(); }));*/ return getWorkstationBandShiftVO(localDate, workstations); } private WorkstationBandShiftVO getWorkstationBandShiftVO(LocalDate localDate, List workstations) { Map> calendarCodeMap = workstations.stream().collect(Collectors.groupingBy((v0) -> { return v0.getCalendarCode(); })); if (Func.isEmpty(calendarCodeMap)) { return new WorkstationBandShiftVO(); } if (calendarCodeMap.size() == 1) { List result = Lists.newArrayList(); calendarCodeMap.forEach((calendarCode, workstationList) -> { List shiftDetails = this.calendarService.queryShiftIndexName(calendarCode, Integer.valueOf(localDate.getYear()), DateUtil.formatDate(localDate)); this.calendarService.queryShiftIndexName(calendarCode, Integer.valueOf(localDate.getYear()), DateUtil.formatDate(localDate)); for (ShiftIndexNameDTO shiftDetail : shiftDetails) { result.add(MixShiftDetailsDTO.builder().indexName(shiftDetail.getIndexName()).shiftIndex(shiftDetail.getShiftIndex()).mixShift(Boolean.FALSE).build()); } }); return WorkstationBandShiftVO.builder().shiftDetails(result).build(); } List result2 = Lists.newArrayList(); List shiftOne = Lists.newArrayList(); List shiftTwo = Lists.newArrayList(); List shiftThree = Lists.newArrayList(); List shiftFour = Lists.newArrayList(); calendarCodeMap.forEach((calendarCode2, workstationList2) -> { List shiftDetails = this.calendarService.queryShiftIndexName(calendarCode2, Integer.valueOf(localDate.getYear()), DateUtil.formatDate(localDate)); for (ShiftIndexNameDTO shiftDetail : shiftDetails) { if (CalendarConstant.ONE.equals(shiftDetail.getShiftIndex())) { shiftOne.add(shiftDetail); } if (CalendarConstant.TWO.equals(shiftDetail.getShiftIndex())) { shiftTwo.add(shiftDetail); } if (CalendarConstant.THREE.equals(shiftDetail.getShiftIndex())) { shiftThree.add(shiftDetail); } if (CalendarConstant.FOUR.equals(shiftDetail.getShiftIndex())) { shiftFour.add(shiftDetail); } } }); buildShiftIndexNameDTO(shiftOne, result2); buildShiftIndexNameDTO(shiftTwo, result2); buildShiftIndexNameDTO(shiftThree, result2); buildShiftIndexNameDTO(shiftFour, result2); return WorkstationBandShiftVO.builder().shiftDetails(result2).build(); } private void buildShiftIndexNameDTO(List shiftList, List result) { if (Func.isNotEmpty(shiftList)) { log.info("班次信息:{}", shiftList); long count = shiftList.stream().map((v0) -> { return v0.getIndexName(); }).distinct().count(); ShiftIndexNameDTO dto = shiftList.get(0); if (count > 1) { result.add(MixShiftDetailsDTO.builder().indexName("").shiftIndex(dto.getShiftIndex()).mixShift(Boolean.TRUE).build()); } else { result.add(MixShiftDetailsDTO.builder().indexName(dto.getIndexName()).shiftIndex(dto.getShiftIndex()).mixShift(Boolean.FALSE).build()); } } } private WorkstationBandShiftVO getGroupShiftIndexName(QueryShiftIndexNameVO vo) { List ids = vo.getIds(); String groupType = vo.getGroupType(); String groupCategory = vo.getGroupCategory(); LocalDate localDate = vo.getLocalDate(); List commonGroups = this.commonGroupService.list(Wrappers.lambdaQuery() .eq(CommonGroup::getGroupType, groupType) .eq(CommonGroup::getGroupCategory, groupCategory) .in(Func.isNotEmpty(ids), CommonGroup::getId, ids)); /* List commonGroups = this.commonGroupService.list(((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getGroupType(); }, groupType)).eq((v0) -> { return v0.getGroupCategory(); }, groupCategory)).in(Func.isNotEmpty(ids), (v0) -> { return v0.getId(); }, ids));*/ if (Func.isEmpty(commonGroups)) { return new WorkstationBandShiftVO(); } List groupIds = commonGroups.stream().map(c -> { return String.valueOf(c.getId()); }).collect(Collectors.toList()); List workstations = this.workstationService.listWorkStationByGroupId(groupIds); return getWorkstationBandShiftVO(localDate, workstations); } }