From db04121fb6272ee455e2b71da70b5ed7c61f0e42 Mon Sep 17 00:00:00 2001 From: guofeihu <3347277866@qq.com> Date: Thu, 11 Jul 2024 19:55:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B9=E6=A1=88=E6=95=B0=E6=8D=AE=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=B6=8B=E5=8A=BF=E4=BC=98=E5=8C=96=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E4=BA=A4=E5=8F=89=E8=8C=83=E5=9B=B4(=E4=BF=AE=E6=94=B9fuseWlRe?= =?UTF-8?q?cordTime=E6=96=B9=E6=B3=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/mapping/WlRecordMapper.xml | 2 +- .../service/impl/WlRecordServiceImpl.java | 60 ++++++++++++++++--- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/WlRecordMapper.xml b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/WlRecordMapper.xml index 053315a..d8c409b 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/WlRecordMapper.xml +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/WlRecordMapper.xml @@ -88,6 +88,6 @@ test_item_id = #{testRecordId} ) - order by dev_id + order by start_time \ No newline at end of file diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/WlRecordServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/WlRecordServiceImpl.java index 40f6d94..06b4f3b 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/WlRecordServiceImpl.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/WlRecordServiceImpl.java @@ -33,6 +33,7 @@ import com.njcn.system.enums.DicDataEnum; import com.njcn.system.pojo.po.DictData; import com.njcn.system.pojo.po.EleEpdPqd; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -51,6 +52,7 @@ import java.util.stream.Stream; * @author xuyang * @since 2024-04-01 */ +@Slf4j @Service @RequiredArgsConstructor public class WlRecordServiceImpl extends ServiceImpl implements IWlRecordService { @@ -281,8 +283,7 @@ public class WlRecordServiceImpl extends ServiceImpl i } //进行时间覆盖(查询的基础数据必须两个以上) if(data.size()>1){ - //fuseWlRecordTime(data,0); - //fuseWlRecordTime(data,0); + data = fuseWlRecordTime(data,0); } //格式化前端参数 formatQueryParamList(commonStatisticalQueryParam); @@ -336,18 +337,63 @@ public class WlRecordServiceImpl extends ServiceImpl i /** * 数据项内的时间进行覆盖:解决多个数据项的startTime及endTime之间存在时间冲突 * @param data 数据项 - * @param flag 覆盖规则(0:从左到右依次覆盖,1:时间范围度最大依次覆盖) + * @param flag 覆盖规则(0:从左到右依次覆盖,1:时间范围度最大依次覆盖) *注:从左到右依次覆盖规则下多个数据项必须按照 "开始时间升序排序" */ - private void fuseWlRecordTime(List data,int flag){ + private static List fuseWlRecordTime(List data,int flag){ + List rs = new ArrayList<>(); + log.info("覆盖规则为:{}",flag == 0 ? "从左到右依次覆盖":"时间范围度最大依次覆盖"); + log.info("覆盖前源数据:"); + for(WlRecord wlRecord : data){ + log.info("id:{} , startTime:{} , endTime:{}",wlRecord.getId(),wlRecord.getStartTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat)),wlRecord.getEndTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat))); + } if(flag == 0){ + //为防止意外 还是进行下排序 + data = data.stream().sorted(Comparator.comparing(WlRecord::getStartTime)).collect(Collectors.toList()); + //从左到右依次覆盖 + //由于覆盖规则是最左原则 所以第一个左主数据一定是有效的 + rs.add(data.get(0)); + WlRecord tempRecord = null; for (int i = 0; i < data.size(); i++) { - for (int j = 0; j < data.size(); j++) { - if(data.get(0).getEndTime().isBefore(data.get(j+1).getEndTime())){ - + if(i0 || current.getEndTime().compareTo(next.getEndTime())==0)){ + //如果当前节点把下一个节点吃掉了 那么此节点将不变继续作为当前比较的左主数据 参加下一轮比较 + tempRecord = current; + continue; + }else if(current.getEndTime().compareTo(next.getStartTime())<0){ + //这种属于两个节点的数据本来就没有交叉 属于正常时间串 + rs.add(next); + tempRecord = null; + }else{ + //时间出现交叉 + next.setStartTime(current.getEndTime().plusSeconds(1)); + rs.add(next); + tempRecord = null; } } } + }else{ + //时间范围度最大依次覆盖 + //此处逻辑暂定 默认按照上面最左原则 } + log.info("覆盖后新数据:"); + for(WlRecord wlRecord : rs){ + log.info("id:{} , startTime:{} , endTime:{}",wlRecord.getId(),wlRecord.getStartTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat)),wlRecord.getEndTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat))); + } + return rs; } private void formatQueryParamList(CommonStatisticalQueryParam commonStatisticalQueryParam){