forked from I3-YF/i3plus-mes-yfai
时间段合并
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…
Reference in New Issue