diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/jx/IJxMergeTimeSlotsService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/jx/IJxMergeTimeSlotsService.java new file mode 100644 index 0000000..6ff17e1 --- /dev/null +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/jx/IJxMergeTimeSlotsService.java @@ -0,0 +1,23 @@ +package cn.estsh.i3plus.ext.mes.api.busi.jx; + +import cn.estsh.i3plus.ext.mes.pojo.model.jx.JxMergeTimeSlotsModel; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/19 15:06 下午 + * @Description: 时段合并 + **/ +public interface IJxMergeTimeSlotsService { + + /** + * 时段合并 + * @param timeSlots 时段数据 + * @return 时段合并数据 + */ + @ApiOperation(value = "时段合并", notes = "时段合并") + List mergeTimeSlots(List timeSlots); + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/jx/JxMergeTimeSlotsService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/jx/JxMergeTimeSlotsService.java new file mode 100644 index 0000000..bb63017 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/jx/JxMergeTimeSlotsService.java @@ -0,0 +1,74 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.jx; + +import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxMergeTimeSlotsService; +import cn.estsh.i3plus.ext.mes.pojo.model.jx.JxMergeTimeSlotsModel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author : wangjie + * @CreateDate : 2022-02-15 + * @Modify: + **/ +@Slf4j +@Service +public class JxMergeTimeSlotsService implements IJxMergeTimeSlotsService { + + @Override + public List mergeTimeSlots(List timeSlots) { + // 如果只剩一个时间段直接返回 + if (timeSlots.size() == 1) return timeSlots; + for (int i = 0; i < timeSlots.size(); i++) { + for (int j = i + 1; j < timeSlots.size(); j++) { + JxMergeTimeSlotsModel timeSlot1 = timeSlots.get(i); + JxMergeTimeSlotsModel timeSlot2 = timeSlots.get(j); + JxMergeTimeSlotsModel mergeSlot = compareToMarge(timeSlot1, timeSlot2); + // 如果两个时间段能合并则递归继续合并 + if (null != mergeSlot) { + timeSlots.remove(timeSlot1); + timeSlots.remove(timeSlot2); + timeSlots.add(mergeSlot); + mergeTimeSlots(timeSlots); + } + } + } + return timeSlots; + } + + private JxMergeTimeSlotsModel compareToMarge(JxMergeTimeSlotsModel timeSlot1, JxMergeTimeSlotsModel timeSlot2) { + // 如果两个时间段完全没有交集则直接返回 + if (timeSlot1.getEndDate().before(timeSlot2.getStartDate()) || timeSlot1.getStartDate().after(timeSlot2.getEndDate())) return null; + // 如果有完全包含则去掉小的那个 + else if (!timeSlot1.getStartDate().after(timeSlot2.getStartDate()) && !timeSlot1.getEndDate().before(timeSlot2.getEndDate())) return timeSlot1; + else if (!timeSlot2.getStartDate().after(timeSlot1.getStartDate()) && !timeSlot2.getEndDate().before(timeSlot1.getEndDate())) return timeSlot2; + // 有交集则合并 + else if (timeSlot1.getStartDate().before(timeSlot2.getStartDate()) && timeSlot1.getEndDate().before(timeSlot2.getEndDate())) return new JxMergeTimeSlotsModel().copy(timeSlot1).mergeEnd(timeSlot2.getEndTime(), timeSlot2.getEndDate()); + else if (timeSlot2.getStartDate().before(timeSlot1.getStartDate()) && timeSlot2.getEndDate().before(timeSlot1.getEndDate())) return new JxMergeTimeSlotsModel().copy(timeSlot2).mergeEnd(timeSlot1.getEndTime(), timeSlot1.getEndDate()); + else return null; + } + + public /** static **/ void main(String[] args) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + List timeSlots = new ArrayList<>(); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 00:00:00", "2023-01-01 01:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 02:00:00", "2023-01-01 03:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 03:00:00", "2023-01-01 04:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 05:00:00", "2023-01-01 06:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 05:10:00", "2023-01-01 05:30:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 07:00:00", "2023-01-01 08:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 07:30:00", "2023-01-01 09:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 10:20:00", "2023-01-01 10:40:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 10:00:00", "2023-01-01 11:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 13:30:00", "2023-01-01 14:30:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 12:00:00", "2023-01-01 14:00:00", simpleDateFormat)); + timeSlots.add(new JxMergeTimeSlotsModel().convertTime("2023-01-01 15:00:00", "2023-01-01 23:00:00", simpleDateFormat)); + timeSlots = mergeTimeSlots(timeSlots); + for (JxMergeTimeSlotsModel timeSlot : timeSlots) { + System.out.println("statTime: " + timeSlot.getStartTime() + " , endTime: " + timeSlot.getEndTime()); + } + } +} \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/jx/JxMergeTimeSlotsModel.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/jx/JxMergeTimeSlotsModel.java new file mode 100644 index 0000000..a8600eb --- /dev/null +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/jx/JxMergeTimeSlotsModel.java @@ -0,0 +1,51 @@ +package cn.estsh.i3plus.ext.mes.pojo.model.jx; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import org.springframework.beans.BeanUtils; + +import java.io.Serializable; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @DESCRIPTION: + * @USER: wangjie + * @DATE: 2022-11-01 15:54 + */ +@Data +@ApiModel("嘉兴时段合并MODEL") +public class JxMergeTimeSlotsModel implements Serializable { + + private static final long serialVersionUID = 2947166834890286384L; + + private String startTime; + private String endTime; + + private Date startDate; + private Date endDate; + + public JxMergeTimeSlotsModel convertTime(String startTime, String endTime, SimpleDateFormat simpleDateFormat) { + this.startTime = startTime; + this.endTime = endTime; + try { + this.startDate = simpleDateFormat.parse(startTime); + this.endDate = simpleDateFormat.parse(endTime); + } catch (ParseException e) { + } + return this; + } + + public JxMergeTimeSlotsModel copy(JxMergeTimeSlotsModel timeSlot) { + BeanUtils.copyProperties(timeSlot, this); + return this; + } + + public JxMergeTimeSlotsModel mergeEnd(String endTime, Date endDate) { + this.endTime = endTime; + this.endDate = endDate; + return this; + } + +}