时间段合并

tags/yfai-mes-ext-v1.0
王杰 1 year ago
parent 94616b4a08
commit 777743541c

@ -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<JxMergeTimeSlotsModel> mergeTimeSlots(List<JxMergeTimeSlotsModel> timeSlots);
}

@ -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<JxMergeTimeSlotsModel> mergeTimeSlots(List<JxMergeTimeSlotsModel> 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<JxMergeTimeSlotsModel> 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());
}
}
}

@ -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;
}
}
Loading…
Cancel
Save