package com.qianwen.smartman.modules.mdc.service.impl; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; 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.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.mp.support.Query; import com.qianwen.core.oss.model.BladeFile; import com.qianwen.core.tool.jackson.JsonUtil; import com.qianwen.core.tool.utils.DateUtil; import com.qianwen.core.tool.utils.Func; import com.qianwen.smartman.common.cache.cps.TimeSliceCache; import com.qianwen.smartman.common.cache.cps.WorkstationCache; 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.WcsDataTypeEnums; import com.qianwen.smartman.common.utils.ListUtils; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.smartman.modules.smis.dto.CalendarShiftDTO; import com.qianwen.smartman.modules.smis.dto.CalendarShiftTimeSlicesDTO; import com.qianwen.smartman.modules.smis.dto.WorkstationWcsDmpDTO; import com.qianwen.smartman.modules.smis.entity.GlobalWcs; import com.qianwen.smartman.modules.smis.entity.Workstation; import com.qianwen.smartman.modules.smis.service.ICalendarService; import com.qianwen.smartman.modules.smis.service.IWorkstationService; import com.qianwen.smartman.modules.smis.service.WorkstationDatapointsService; import com.qianwen.smartman.modules.smis.utils.ThrowFun; import com.qianwen.smartman.modules.smis.vo.ShiftTimeDetailVO; import com.qianwen.smartman.modules.smis.vo.WorkstationDatapointsVO; import com.qianwen.smartman.modules.mdc.dto.DatapointDTO; import com.qianwen.smartman.modules.mdc.dto.GroupWorkDTO; import com.qianwen.smartman.modules.mdc.dto.NewParamDTO; import com.qianwen.smartman.modules.mdc.dto.ParamDTO; import com.qianwen.smartman.modules.mdc.dto.ProParamResDTO; import com.qianwen.smartman.modules.mdc.dto.ProcessParameterRealVO; import com.qianwen.smartman.modules.mdc.dto.ProcessParameterVO; import com.qianwen.smartman.modules.mdc.dto.ProcessWcsDTO; import com.qianwen.smartman.modules.mdc.dto.StatusDTO; import com.qianwen.smartman.modules.mdc.entity.WorkstationCollectData; import com.qianwen.smartman.modules.mdc.enums.ProcessParamEnum; //import com.qianwen.smartman.modules.mdc.mapper.SuperCollectJsonMapper; import com.qianwen.smartman.modules.mdc.mapper.SuperProcessParameterMapper; import com.qianwen.smartman.modules.mdc.service.IProcessParameterService; import com.qianwen.smartman.modules.mdc.service.ProcessParameterHelperService; import com.qianwen.smartman.modules.mdc.utils.ExcelStrategyUtil; import com.qianwen.smartman.modules.mdc.vo.AllShiftTimeDetail; import com.qianwen.smartman.modules.mdc.vo.CollectParamResVO; import com.qianwen.smartman.modules.mdc.vo.CollectParamSearchVO; import com.qianwen.smartman.modules.mdc.vo.ProParamSheetVO; import com.qianwen.smartman.modules.mdc.vo.ProcessParameterItemSearchVO; import com.qianwen.smartman.modules.mdc.vo.ProcessParameterResVO; import com.qianwen.smartman.modules.mdc.vo.ProcessParameterSearchVO; import com.qianwen.smartman.modules.mdc.vo.ShiftTimeVO; import com.qianwen.smartman.modules.mdc.vo.WorkstationShiftSearchVO; import com.qianwen.smartman.modules.mdc.vo.excel.ProcessParamExcelVO; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; import cn.hutool.core.lang.Tuple; import cn.hutool.core.util.ObjectUtil; @Service public class ProcessParameterServiceImpl implements IProcessParameterService { private static final Logger log = LoggerFactory.getLogger(ProcessParameterServiceImpl.class); //@Autowired //private SuperCollectJsonMapper collectJsonMapper; @Autowired private IWorkstationService workstationService; @Autowired private OssBuilder ossBuilder; @Autowired private SuperProcessParameterMapper parameterMapper; @Autowired private ICalendarService calendarService; @Autowired private JdbcTemplate jdbcTemplate; @Autowired private WorkstationDatapointsService dpService; @Autowired private ProcessParameterHelperService helperService; @Override public ProcessParameterResVO queryProcessParameterChart(ProcessParameterSearchVO vo) { ProcessParamEnum methodEnum = vo.getMethodEnum(); switch (methodEnum) { case HOUR: return buildProcessDate(vo); case SHIFT: return buildProcessShift(vo); default: return new ProcessParameterResVO(); } } @Override public List listGlobalWcs() { return WorkstationCache.getDefaultWcs(); } @Override public IPage pageProcessParameter(Query query, ProcessParameterItemSearchVO vo) { int size = query.getSize().intValue(); int current = query.getCurrent().intValue(); long startTime = vo.getStartTime().getTime(); long endTime = vo.getEndTime().getTime(); String workstationId = vo.getWorkstationId(); Integer flag = vo.getFlag(); String item = vo.getItem(); long total = Optional.ofNullable(this.parameterMapper.countProcessParameter(item, Long.valueOf(startTime), Long.valueOf(endTime), workstationId)).orElse(0L).longValue(); Page page = new Page<>(current, size, total); if (total == 0) { return page; } List res = this.parameterMapper.pageProcessParameter(size,(current - 1) * size, startTime, endTime, item, workstationId); Map map = getWcsMap(); List collect = res.stream().map(c -> { String value; if (MdcConstant.FLAG.equals(flag)) { value = (String) map.get(c.getValue()); } else { value = c.getValue(); } return ProcessParameterRealVO.builder().time(DateUtil.format(c.getTime(), "yyyy-MM-dd HH:mm:ss.SSS")).collectItem(c.getCollectItem()).value(value).build(); }).collect(Collectors.toList()); page.setRecords(collect); return page; } /* @Override public List processParam(String workstationId) { //获取展示在过程参数中的变量 List dps = new ArrayList<>(); if(ObjectUtil.isEmpty(workstationId)) { return Collections.emptyList(); } WorkstationDatapointsVO dpVo = dpService.getDatapoints(Long.parseLong(workstationId)); if(ObjectUtil.isEmpty(dpVo.getDpConfig())) { return Collections.emptyList(); } JSONArray dpArrJson = JSONArray.parseArray(dpVo.getDpConfig()); String dpName; JSONObject dp; for(int i=0; i processParams(String workstationId) { //获取展示在过程参数中的变量 if(ObjectUtil.isEmpty(workstationId)) { return Collections.emptyList(); } WorkstationDatapointsVO dpVo = dpService.getDatapoints(Long.parseLong(workstationId)); if(ObjectUtil.isEmpty(dpVo.getDpConfig())) { return Collections.emptyList(); } //JSONArray dpArrJson = JSONArray.parseArray(dpVo.getDpConfig()); List list = JSONObject.parseArray(dpVo.getDpConfig(),DatapointDTO.class); return list.stream().filter(dp -> dp.getIsProcessParam()!=null && dp.getIsProcessParam()).collect(Collectors.toList()); } /* @Override public ProParamSheetVO queryProcessParameterSheet(ProcessParameterSearchVO vo, Boolean isFilterProcessParameter) { ProcessParamEnum methodEnum = vo.getMethodEnum(); switch (methodEnum) { case HOUR: return buildProcessHourSheet(vo, isFilterProcessParameter); case SHIFT: return buildProcessShiftSheet(vo, isFilterProcessParameter); default: return new ProParamSheetVO(); } }*/ /* @Override public BladeFile exportProcessParam(ProcessParamExcelVO vo) { try { return exportByHour(vo); } catch (Exception e) { log.error("exportProcessParam异常",e); throw new RuntimeException(e); } } */ @Override public ShiftTimeVO getShiftTime(ProcessParameterSearchVO vo) { String workstationId = vo.getWorkstationId(); LocalDate queryTime = vo.getQueryTime(); Integer shift = vo.getShift(); Workstation workstation = (Workstation) this.workstationService.getById(Func.toLong(workstationId)); return (ShiftTimeVO) Optional.ofNullable(workstation).map(w -> { CalendarShiftTimeSlicesDTO timeSliceShift = TimeSliceCache.getTimeSliceShift(workstation.getCalendarCode(), queryTime, shift); return (ShiftTimeVO) Optional.ofNullable(timeSliceShift).map(time -> { return ShiftTimeVO.builder().startTime(time.getStartTime()).endTime(time.getEndTime()).build(); }).orElse(new ShiftTimeVO()); }).orElse(new ShiftTimeVO()); } @Override public CollectParamResVO queryProcessParameterOneChart(CollectParamSearchVO vo) { Date startTime = vo.getStartTime(); Date endTime = vo.getEndTime(); if (Func.isNull(startTime) || Func.isNull(endTime)) { throw new ServiceException(MessageUtils.message("mdc.process.time.not.null", new Object[0])); } Date now = DateUtil.now(); if (startTime.after(now)) { return new CollectParamResVO<>(); } Long workstationId = Long.parseLong(vo.getWorkstationId()); List processParameterList = getProcessParameterList(startTime, endTime, workstationId, vo.getDpDTO()); return getCollectParamResVO(vo.getDpDTO(), processParameterList); } private CollectParamResVO getCollectParamResVO(DatapointDTO dpDTO, List processParameterList) {//WorkstationWcsDmpDTO dmpDTO //状态特殊处理? //if (WcsDataTypeEnums.WcsDataType.STATE.getCode().equals(dmpDTO.getWcsDataType())) {//yys if ("DeviceStatus".equals(dpDTO.getDpName())) {//状态,需要特殊处理 Map colorMap = Maps.newHashMap(); Map nameMap = Maps.newHashMap(); Set codes = Sets.newHashSet(); buildWcsMap(colorMap, nameMap, codes); List list = processParameterList.stream().filter(c -> codes.contains(c.getValue())).map(param -> StatusDTO.builder().time(DateUtil.formatDateTime(DateUtil.fromMilliseconds(param.getRealTime().longValue()))).name((String)nameMap.get(param.getValue())).color((String)colorMap.get(param.getValue())).value(param.getValue()).build()).collect(Collectors.toList()); /* List collect = processParameterList.stream().filter(c -> { return codes.contains(c.getValue()); }).map(param -> { return StatusDTO.builder().time(DateUtil.formatDateTime(DateUtil.fromMilliseconds(param.getRealTime().longValue()))).name((String) nameMap.get(param.getValue())).color((String) colorMap.get(param.getValue())).value(param.getValue()).build(); }).collect(Collectors.toList());*/ return CollectParamResVO.builder() .collectItem(dpDTO.getDpLabel()) .collectRealItem(dpDTO.getDpName()) .data(list) .build(); //return CollectParamResVO.builder().collectItem(dmpDTO.getDescription()).collectRealItem(dmpDTO.getName()).data(list).build(); } //空指针 List collect = processParameterList.stream().map(param -> ParamDTO.builder().time(DateUtil.formatDateTime(DateUtil.fromMilliseconds(param.getRealTime().longValue()))).value(param.getValue()).build()).collect(Collectors.toList()); /* return CollectParamResVO.builder() .collectItem(dmpDTO.getDescription()) .collectRealItem(dmpDTO.getName()) .data(collect) .build(); */ return CollectParamResVO.builder() .collectItem(dpDTO.getDpLabel()) .collectRealItem(dpDTO.getDpName()) .data(collect) .build(); } private void buildWcsMap(Map colorMap, Map nameMap, Set codes) { List globalWcsList = listGlobalWcs(); for (GlobalWcs globalWcs : globalWcsList) { colorMap.put(globalWcs.getCode(), globalWcs.getColor()); nameMap.put(globalWcs.getCode(), globalWcs.getName()); codes.add(globalWcs.getCode()); } } /** * 获取过程参数列表 * @param startTime * @param endTime * @param workstationId * @param dmpDTO * @return */ private List getProcessParameterList(Date startTime, Date endTime, Long workstationId, DatapointDTO dpDTO) {//WorkstationWcsDmpDTO dmpDTO ProcessParameterVO firstStatue = oldFirstStatue(startTime, dpDTO.getDpName(), workstationId); ProcessParameterVO endStatue = oldLastStatue(endTime, dpDTO.getDpName(), workstationId); List processParameterList = oldOneCollectList(startTime, endTime, dpDTO.getDpName(), workstationId); if (Func.isNotEmpty(processParameterList)) { if (Func.notNull(firstStatue) && !firstStatue.getRealTime().equals(startTime.getTime())) { firstStatue.setRealTime(startTime.getTime()); processParameterList.add(0, firstStatue); } if (Func.notNull(endStatue) && !endStatue.getRealTime().equals(Long.valueOf(endTime.getTime()))) { endStatue.setRealTime(Long.valueOf(Math.min(DateUtil.now().getTime(), endTime.getTime()))); processParameterList.add(endStatue); } } else { if (Func.notNull(firstStatue)) { firstStatue.setRealTime(Long.valueOf(startTime.getTime())); processParameterList.add(firstStatue); } if (Func.notNull(endStatue)) { endStatue.setRealTime(Long.valueOf(Math.min(DateUtil.now().getTime(), endTime.getTime()))); processParameterList.add(endStatue); } } return processParameterList; } @Override public List getAllShiftTime(WorkstationShiftSearchVO vo) { String workstationId = vo.getWorkstationId(); List dates = vo.getDates(); Workstation workstation = (Workstation) this.workstationService.getById(Long.valueOf(Func.toLong(workstationId))); LocalDate firstDays = ((LocalDate) ListUtils.getFirst(dates)).minusDays(1L); LocalDate lastDays = ((LocalDate) ListUtils.getLast(dates)).plusDays(1L); dates.add(firstDays); dates.add(lastDays); List shiftDetailDates = this.calendarService.getShiftDetailDates(workstation.getCalendarCode(), dates.stream().distinct().collect(Collectors.toList())); if (Func.isEmpty(shiftDetailDates)) { return Lists.newArrayList(); } return shiftDetailDates.stream().map(shiftTime -> { LocalDate date = shiftTime.getCalendarDate(); LocalDateTime startTime = LocalDateTime.of(date, LocalTime.MIN).plusMinutes(shiftTime.getShiftStartTime().intValue()); LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MIN).plusMinutes(shiftTime.getShiftEndTime().intValue()); String indexName = shiftTime.getIndexName(); if (Func.isBlank(indexName)) { indexName = MessageUtils.message("calendar.page.shift.model.shift", new Object[0]) + shiftTime.getShiftIndex(); } return AllShiftTimeDetail.builder().color(shiftTime.getColour()).shiftIndex(shiftTime.getShiftIndex()).shiftName(indexName).startTime(DateUtil.toDate(startTime)).endTime(DateUtil.toDate(endTime)).build(); }).sorted(Comparator.comparing((v0) -> { return v0.getStartTime(); })).collect(Collectors.toList()); } private ProcessParameterResVO buildProcessDate(ProcessParameterSearchVO vo) { Date startTime = vo.getStartTime(); Date endTime = vo.getEndTime(); if (Func.isNull(startTime) || Func.isNull(endTime)) { throw new ServiceException(MessageUtils.message("mdc.process.time.not.null", new Object[0])); } String workstationId = vo.getWorkstationId(); List vos = WorkstationCache.getWorkstationWcsList(workstationId).stream().filter((v0) -> { return v0.getProcessParameter(); }).collect(Collectors.toList()); if (Func.isEmpty(vos)) { return new ProcessParameterResVO(); } Map collectItemMap = vos.stream().collect(Collectors.toMap((v0) -> { return v0.getName(); }, v -> { return v; })); log.info("工位的采集项:{}", vos); WorkstationWcsDmpDTO wcs = WorkstationCache.getDmpStatus(workstationId); List collectItems = vos.stream().map((v0) -> { return v0.getName(); }).collect(Collectors.toList()); List dtoList = oldProcessParameterList(startTime, endTime, collectItems, workstationId); if (Func.isEmpty(dtoList)) { return new ProcessParameterResVO(); } return entityVO(dtoList, wcs, collectItemMap); } private ProcessParameterResVO buildProcessShift(ProcessParameterSearchVO vo) { Integer shift = vo.getShift(); if (Func.isNull(shift)) { throw new ServiceException(MessageUtils.message("mdc.process.shift.not.null", new Object[0])); } LocalDate queryTime = vo.getQueryTime(); if (Func.isNull(queryTime)) { throw new ServiceException(MessageUtils.message("mdc.process.time.not.null", new Object[0])); } String workstationId = vo.getWorkstationId(); Workstation workstation = (Workstation) this.workstationService.getById(workstationId); if (Func.isNull(workstation)) { return new ProcessParameterResVO(); } List vos = WorkstationCache.getWorkstationWcsList(workstationId).stream().filter((v0) -> { return v0.getProcessParameter(); }).collect(Collectors.toList()); if (Func.isEmpty(vos)) { return new ProcessParameterResVO(); } Map collectItemMap = vos.stream().collect(Collectors.toMap((v0) -> { return v0.getName(); }, v -> { return v; })); log.info("工位的采集项:{}", vos); WorkstationWcsDmpDTO wcs = WorkstationCache.getDmpStatus(workstationId); CalendarShiftTimeSlicesDTO timeSliceShift = TimeSliceCache.getTimeSliceShift(workstation.getCalendarCode(), queryTime, shift); return (ProcessParameterResVO) Optional.ofNullable(timeSliceShift).map(time -> { Date startTime = time.getStartTime(); Date endTime = time.getEndTime(); List collectItems = vos.stream().map((v0) -> { return v0.getName(); }).collect(Collectors.toList()); List parameterList = oldProcessParameterList(startTime, endTime, collectItems, workstationId); if (Func.isEmpty(parameterList)) { return new ProcessParameterResVO(); } return entityVO(parameterList, wcs, collectItemMap); }).orElse(new ProcessParameterResVO()); } /* private ProParamSheetVO buildProcessHourSheet(ProcessParameterSearchVO vo, Boolean isFilterProcessParameter) { Date startTime = vo.getStartTime(); Date endTime = vo.getEndTime(); if (Func.isNull(startTime) || Func.isNull(endTime)) { throw new ServiceException(MessageUtils.message("mdc.process.time.not.null", new Object[0])); } String workstationId = vo.getWorkstationId(); Workstation workstation = (Workstation) this.workstationService.getById(workstationId); if (Func.isNull(workstation)) { return new ProParamSheetVO(); } List vos = getWorkstationWcsDmpDTO(isFilterProcessParameter, workstationId); if (isFilterProcessParameter.booleanValue()) { vos = vos.stream().filter((v0) -> { return v0.getProcessParameter(); }).collect(Collectors.toList()); } if (Func.isEmpty(vos)) { return new ProParamSheetVO(); } WorkstationWcsDmpDTO wcs = WorkstationCache.getDmpStatus(workstationId); List dtoList = processParameterList(startTime, endTime, workstationId); if (Func.isEmpty(dtoList)) { return new ProParamSheetVO(); } return buildSheetVO(vos, dtoList, wcs, getWcsMap()); }*/ /* private ProParamSheetVO buildProcessShiftSheet(ProcessParameterSearchVO vo, Boolean isFilterProcessParameter) { Integer shift = vo.getShift(); LocalDate queryTime = vo.getQueryTime(); if (Func.isEmpty(queryTime)) { throw new ServiceException(MessageUtils.message("mdc.process.time.not.null", new Object[0])); } String workstationId = vo.getWorkstationId(); Workstation workstation = (Workstation) this.workstationService.getById(workstationId); if (Func.isEmpty(workstation)) { return new ProParamSheetVO(); } CalendarShiftTimeSlicesDTO timeSliceShift = TimeSliceCache.getTimeSliceShift(workstation.getCalendarCode(), queryTime, shift); if (Func.isEmpty(timeSliceShift)) { return new ProParamSheetVO(); } List vos = getWorkstationWcsDmpDTO(isFilterProcessParameter, workstationId); if (Func.isEmpty(vos)) { return new ProParamSheetVO(); } WorkstationWcsDmpDTO wcs = WorkstationCache.getDmpStatus(workstationId); List dtoList = processParameterList(timeSliceShift.getStartTime(), timeSliceShift.getEndTime(), workstationId); if (Func.isEmpty(dtoList)) { return new ProParamSheetVO(); } return buildSheetVO(vos, dtoList, wcs, getWcsMap()); }*/ /* private BladeFile exportByHour(ProcessParamExcelVO vo) throws Exception { Date startTime = vo.getStartTime(); Date endTime = vo.getEndTime(); ThrowFun.isTrue(Func.isEmpty(startTime) || Func.isEmpty(endTime)).throwMessage(MessageUtils.message("mdc.process.time.not.null", new Object[0])); List collectItem = vo.getCollectItem(); List> head = buildExcelHeadByHour(collectItem); Long workstationId = vo.getWorkstationId(); List> content = buildExcelContentByHour(workstationId, collectItem, startTime, endTime); String fileName = String.format("%s-%s.xlsx", ExcelConstant.PROCESS_PARAMETER, DateUtil.time()); MultipartFile multipartFile = ExcelStrategyUtil.customerStyleExport(fileName, ExcelConstant.SHEET, head, content); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); } */ /* private List> buildExcelContentByHour(Long workstationId, List collectItem, Date startTime, Date endTime) { Workstation workstation = (Workstation) this.workstationService.getById(workstationId); Map groupWorkMap = this.workstationService.queryGroupWorkStation(Lists.newArrayList(new Long[]{workstation.getId()})); GroupWorkDTO groupWorkDTO = groupWorkMap.getOrDefault(workstation.getId(), new GroupWorkDTO()); String groupName = groupWorkDTO.getName(); String id = String.valueOf(workstationId); WorkstationWcsDmpDTO wcs = WorkstationCache.getDmpStatus(id); List timeShiftAll = this.calendarService.getTimeShiftAll(workstation.getCalendarCode(), startTime, endTime); log.info("班次信息: {}", timeShiftAll); List parameterList = processParameterList(startTime, endTime, id); if (Func.isEmpty(parameterList)) { return Lists.newArrayList(); } return buildExcelContentByHour(collectItem, parameterList, wcs, workstation, groupName, timeShiftAll); }*/ private List> buildExcelContentByHour(List collectItem, List parameterList, WorkstationWcsDmpDTO wcs, Workstation workstation, String groupName, List timeShiftAll) { List times = timeShiftAll.stream().map(calendarShiftDTO -> { Date startTime = DateUtil.plusMinutes(DateUtil.parse(calendarShiftDTO.getCalendarDate(), DateConstant.PATTERN_DATE), calendarShiftDTO.getShiftStartTime().intValue()); Date endTime = DateUtil.plusMinutes(DateUtil.parse(calendarShiftDTO.getCalendarDate(), DateConstant.PATTERN_DATE), calendarShiftDTO.getShiftEndTime().intValue()); long start = startTime.getTime(); long end = endTime.getTime(); String name = calendarShiftDTO.getIndexName(); return new Tuple(new Object[]{Long.valueOf(start), Long.valueOf(end), Func.isNotBlank(name) ? name : MessageUtils.message("calendar.page.shift.model.shift", new Object[0]) + calendarShiftDTO.getShiftIndex()}); }).collect(Collectors.toList()); List> res = Lists.newArrayList(); String code = workstation.getCode(); String name = workstation.getName(); Map wcsMap = getWcsMap(); parameterList.forEach(dto -> { Long time = dto.getTs(); Map valueMap = JsonUtil.toMap(dto.getV()); ArrayList newArrayList = Lists.newArrayList(); newArrayList.add(groupName); newArrayList.add(code); newArrayList.add(name); String shiftName = getShiftName(time.longValue(), times); newArrayList.add(shiftName); String firstContent = DateUtil.format(DateUtil.fromMilliseconds(time.longValue()), "yyyy-MM-dd HH:mm:ss.SSS"); newArrayList.add(firstContent); buildContent(collectItem, valueMap, wcs, wcsMap, newArrayList); res.add(newArrayList); }); return res; } private List> buildExcelHeadByHour(List collectItem) { List> head = Lists.newArrayList(); head.add(Lists.newArrayList(new String[]{MessageUtils.message("excel.import.process.parameter.group", new Object[0])})); head.add(Lists.newArrayList(new String[]{MessageUtils.message("excel.import.process.parameter.code", new Object[0])})); head.add(Lists.newArrayList(new String[]{MessageUtils.message("excel.import.process.parameter.name", new Object[0])})); head.add(Lists.newArrayList(new String[]{MessageUtils.message("calendar.page.shift.model.shift", new Object[0])})); head.add(Lists.newArrayList(new String[]{MessageUtils.message("calendar.page.shift.model.time", new Object[0])})); for (WorkstationWcsDmpDTO dto : collectItem) { head.add(Lists.newArrayList(new String[]{dto.getDescription()})); } return head; } /* private List processParameterList(Date startTime, Date endTime, String workstationId) { return this.collectJsonMapper.queryProcessParameter(workstationId, Long.valueOf(startTime.getTime()), Long.valueOf(endTime.getTime())); } */ private List oldProcessParameterList(Date startTime, Date endTime, List collectItems, String workstationId) { return this.parameterMapper.queryProcessParameter(workstationId, collectItems, Long.valueOf(startTime.getTime()), Long.valueOf(endTime.getTime())); } private ProcessParameterVO oldFirstStatue(Date startTime, String item, Long workstationId) { //ProcessParameterVO vo = this.parameterMapper.oldFirstStatue(workstationId, item, Long.valueOf(startTime.getTime())); ProcessParameterVO vo = helperService.queryLastParameterLessThenTime(workstationId, item, startTime.getTime()); if (Func.notNull(vo)) { vo.setCollectItem(item); } return vo; } /** * * @param endTime * @param item 数据点名称,如Output * @param workstationId * @return */ private ProcessParameterVO oldLastStatue(Date endTime, String item, Long workstationId) { //ProcessParameterVO vo = this.parameterMapper.oldLastStatue(workstationId, item, Long.valueOf(endTime.getTime())); ProcessParameterVO vo = helperService.getLastParameterGreaterThenTime(workstationId, item, endTime.getTime()); if (Func.notNull(vo)) { vo.setCollectItem(item); } return vo; } /** * * @param startTime * @param endTime * @param item 数据点名称,如Output * @param workstationId * @return */ private List oldOneCollectList(Date startTime, Date endTime, String item, Long workstationId) { List list = this.parameterMapper.oldOneCollectList(workstationId, item, startTime.getTime(), endTime.getTime()); list.forEach(p -> {p.setRealTime(p.getTime().getTime());}); return list; } private ProcessParameterResVO entityVO(List dtoList, WorkstationWcsDmpDTO wcs, Map collectItemMap) { List globalWcsList = listGlobalWcs(); Map colorMap = new HashMap<>(globalWcsList.size()); Map nameMap = new HashMap<>(globalWcsList.size()); Set codes = Sets.newHashSet(); for (GlobalWcs globalWcs : globalWcsList) { colorMap.put(globalWcs.getCode(), globalWcs.getColor()); nameMap.put(globalWcs.getCode(), globalWcs.getName()); codes.add(globalWcs.getCode()); } Map> map = dtoList.stream().collect(Collectors.groupingBy((v0) -> { return v0.getCollectItem(); })); List res = Lists.newArrayList(); map.forEach((k, v) -> { ProParamResDTO dto; if (Func.isNotEmpty(wcs) && wcs.getName().equals(k)) { List collect = v.stream().filter(c -> { return codes.contains(c.getValue()); }).map(c2 -> { return ProcessWcsDTO.builder().realTime(c2.getRealTime()).time(DateUtil.format(c2.getTime(), "yyyy-MM-dd HH:mm:ss.SSS")).name((String) nameMap.get(c2.getValue())).value(c2.getValue()).color((String) colorMap.get(c2.getValue())).build(); }).sorted(Comparator.comparing((v0) -> { return v0.getTime(); })).collect(Collectors.toList()); dto = ProParamResDTO.builder().collectRealItem(k).collectItem(wcs.getDescription()).dataType(wcs.getWcsDataType()).statusData(collect).build(); } else { List collect2 = v.stream().map(c3 -> { return ProcessParameterRealVO.builder().realTime(c3.getRealTime()).time(DateUtil.format(c3.getTime(), "yyyy-MM-dd HH:mm:ss.SSS")).collectItem(c3.getCollectItem()).value(c3.getValue()).build(); }).sorted(Comparator.comparing((v0) -> { return v0.getTime(); })).collect(Collectors.toList()); dto = ProParamResDTO.builder().dataType(((WorkstationWcsDmpDTO) collectItemMap.get(k)).getDataType()).collectRealItem(k).collectItem(((WorkstationWcsDmpDTO) collectItemMap.get(k)).getDescription()).data(collect2).build(); } res.add(dto); }); ProcessParameterResVO process = new ProcessParameterResVO(); process.setRes(res); return process; } private String getShiftName(long time, List times) { for (Tuple tuple : times) { long start = ((Long) tuple.get(0)).longValue(); long end = ((Long) tuple.get(1)).longValue(); if (start <= time && time <= end) { return (String) tuple.get(2); } } return ""; } private ProParamSheetVO buildSheetVO(List vos, List dtoList, WorkstationWcsDmpDTO wcs, Map wcsMap) { List head = buildSheetHead(vos); List> content = buildSheetContent(vos, dtoList, wcs, wcsMap); return ProParamSheetVO.builder().head(head).content(content).build(); } private List buildSheetHead(List vos) { List res = Lists.newArrayList(new String[]{MessageUtils.message("calendar.page.shift.model.time", new Object[0])}); for (WorkstationWcsDmpDTO dto : vos) { res.add(dto.getDescription()); } return res; } private List> buildSheetContent(List vos, List dtoList, WorkstationWcsDmpDTO wcs, Map wcsMap) { List> res = Lists.newArrayList(); dtoList.forEach(dto -> { Long time = dto.getTs(); Map valueMap = JsonUtil.toMap(dto.getV()); String firstContent = DateUtil.format(DateUtil.fromMilliseconds(time.longValue()), "yyyy-MM-dd HH:mm:ss.SSS"); ArrayList newArrayList = Lists.newArrayList(new Object[]{firstContent}); buildContent(vos, valueMap, wcs, wcsMap, newArrayList); res.add(newArrayList); }); return res; } private void buildContent(List vos, Map valueMap, WorkstationWcsDmpDTO wcs, Map wcsMap, List content) { for (WorkstationWcsDmpDTO dto : vos) { String name = dto.getName(); String value = Func.toStr(valueMap.get(name)); if (Func.notNull(value)) { if (Func.isNotEmpty(wcs) && name.equals(wcs.getName())) { content.add(wcsMap.getOrDefault(value, "-")); } else { content.add(value); } } else { content.add("-"); } } } private Map getWcsMap() { List globalWcs = listGlobalWcs(); return globalWcs.stream().collect(Collectors.toMap((v0) -> { return v0.getCode(); }, (v0) -> { return v0.getName(); })); } private List getWorkstationWcsDmpDTO(Boolean isFilterProcessParameter, String workstationId) { List vos = WorkstationCache.getWorkstationWcsList(workstationId); if (isFilterProcessParameter.booleanValue()) { vos = vos.stream().filter((v0) -> { return v0.getProcessParameter(); }).collect(Collectors.toList()); } return vos; } /* @Override public List lastParameter(long workstationId) { //yys LastProcessParam lp = this.parameterMapper.getLastParameters(workstationId+""); if(lp == null) { return Collections.emptyList(); } List result = new ArrayList<>(); //解析json为对象列表 JSONObject paramsObj = JSONObject.parseObject(lp.getParamJson()); paramsObj.keySet().forEach(k -> { JSONObject itemObj = paramsObj.getJSONObject(k); WorkstationCollectData item = WorkstationCollectData.builder().ts(itemObj.getLong("time")).n(k).v(itemObj.getString("value")).workstationId(lp.getWorkstationId()).build(); result.add(item); }); return result; }*/ /** * 获取工位最新参数值 * @param workstationId 工位id * @param item 参数名称,如DeviceStatus/Output * @param time 时间,参数应小于该时间 * @return */ /* public ProcessParameterVO getLastParameterLessThanTimeOld_notuse(long workstationId,String item,Long time) { //yys LastProcessParam lp = this.parameterMapper.lastParameterLessThanTime(workstationId,item,time); if(lp == null) { return null; } ProcessParameterVO vo = new ProcessParameterVO(); //解析json为对象列表 JSONObject paramsObj = JSONObject.parseObject(lp.getParamJson()); if(paramsObj.containsKey(item)) { JSONObject itemObj = paramsObj.getJSONObject(item); Long lastTime = itemObj.getLong("time"); vo.setTime(new Timestamp(lastTime)); vo.setRealTime(lastTime); vo.setValueCollect(itemObj.getString("value")); } return vo; }*/ @DS("iotdb") public ProcessParameterVO queryLastParameterLessThenTime1(long workstationId,String item,Long time) { /** *tdengine实现:oldFirstStatue * select last(ts) as realTime, last(v) as value_collect from iot_data.super_collect_data where n = #{item} and ts < #{startTime} and workstation_id = #{workstationId} */ ProcessParameterVO vo = null; String sql ="select max_time(n) as ts,last_value(n) as n,last_value(v) as v,last_value(workstation_id) as workstationId from root.f2.process_param_"+workstationId+"_"+item+" where time<"+time+" align by device limit 1"; List list = jdbcTemplate.query(sql, new RowMapper() { @Override public ProcessParameterVO mapRow(ResultSet rs, int rowNum) throws SQLException { ProcessParameterVO p = new ProcessParameterVO(); p.setRealTime(rs.getLong("ts")); p.setValueCollect(rs.getString("v")); return p; } }); if(!list.isEmpty()) { vo = list.get(0); } return vo; } /** * 获取工位最新参数值(采集时间应大于指定时间) * @param workstationId * @param item 参数名称,如DeviceStatus/Output * @param time 指定的时间 * @return */ @DS("iotdb") public ProcessParameterVO getLastParameterGreaterThenTime1(long workstationId,String item,Long time) { /* oldLastStatue select last(ts) as realTime, last(v) as value_collect from iot_data.super_collect_data where n = #{item} and ts > #{endTime} and workstation_id = #{workstationId} * */ /* LastProcessParam lp = this.parameterMapper.lastParameterGreaterThanTime(workstationId,item,time); if(lp == null) { return null; } ProcessParameterVO vo = new ProcessParameterVO(); //解析json为对象列表 JSONObject paramsObj = JSONObject.parseObject(lp.getParamJson()); if(paramsObj.containsKey(item)) { JSONObject itemObj = paramsObj.getJSONObject(item); Long lastTime = itemObj.getLong("time"); vo.setTime(new Timestamp(lastTime)); vo.setRealTime(lastTime); vo.setValueCollect(itemObj.getString("value")); } return vo;*/ ProcessParameterVO vo = null; String sql ="select max_time(n) as ts,last_value(n) as n,last_value(v) as v,last_value(workstation_id) as workstationId from root.f2.process_param_"+workstationId+"_"+item+" where time>"+time+" align by device limit 1"; List list = jdbcTemplate.query(sql, new RowMapper() { @Override public ProcessParameterVO mapRow(ResultSet rs, int rowNum) throws SQLException { ProcessParameterVO p = new ProcessParameterVO(); p.setRealTime(rs.getLong("ts")); p.setValueCollect(rs.getString("v")); return p; } }); if(!list.isEmpty()) { vo = list.get(0); } return vo; } @DS("iotdb") @Override public List queryLastParameter(long workstationId) { String sql ="select max_time(n) as ts,last_value(n) as n,last_value(v) as v,last_value(workstation_id) as workstationId from root.f2.process_param_"+workstationId+"_* align by device"; List list = jdbcTemplate.query(sql, new RowMapper() { @Override public WorkstationCollectData mapRow(ResultSet rs, int rowNum) throws SQLException { WorkstationCollectData data = WorkstationCollectData.builder().ts(rs.getLong("ts")).n(rs.getString("n")).v(rs.getString("v")).workstationId(workstationId).build(); return data; } }); return list; } }