package com.hotent.Calendar.model;
import java.util.ArrayList;
import java.util.List;
import com.hotent.Calendar.util.CalendarUtil;
/**
* 日历设置事件
*
* 日历设置事件是可以跨多个自然天的对象
*
* @author heyifan
*/
public class CalendarSettingEvent {
private Integer startYear; /*开始的年份*/
private Integer endYear; /*结束的年份*/
private Integer startMonth; /*开始的月份*/
private Integer endMonth; /*结束的月份*/
private Integer startDay; /*开始的那天*/
private Integer endDay; /*结束的那天*/
private String shiftId; /*对应的班次ID*/
public CalendarSettingEvent(){
}
public CalendarSettingEvent(Integer startYear, Integer endYear, Integer startMonth, Integer endMonth,
Integer startDay, Integer endDay, String shiftId){
this.startYear = startYear;
this.endYear = endYear;
this.startMonth = startMonth;
this.endMonth = endMonth;
this.startDay = startDay;
this.endDay = endDay;
this.shiftId = shiftId;
}
public CalendarSettingEvent(Long startYear, Long endYear, Long startMonth, Long endMonth,
Long startDay, Long endDay, String shiftId){
this.startYear = startYear.intValue();
this.endYear = endYear.intValue();
this.startMonth = startMonth.intValue();
this.endMonth = endMonth.intValue();
this.startDay = startDay.intValue();
this.endDay = endDay.intValue();
this.shiftId = shiftId;
}
public Integer getStartYear() {
return startYear;
}
public void setStartYear(Integer startYear) {
this.startYear = startYear;
}
public Integer getEndYear() {
return endYear;
}
public void setEndYear(Integer endYear) {
this.endYear = endYear;
}
public Integer getStartMonth() {
return startMonth;
}
public void setStartMonth(Integer startMonth) {
this.startMonth = startMonth;
}
public Integer getEndMonth() {
return endMonth;
}
public void setEndMonth(Integer endMonth) {
this.endMonth = endMonth;
}
public Integer getStartDay() {
return startDay;
}
public void setStartDay(Integer startDay) {
this.startDay = startDay;
}
public Integer getEndDay() {
return endDay;
}
public void setEndDay(Integer endDay) {
this.endDay = endDay;
}
public String getShiftId() {
return shiftId;
}
public void setShiftId(String shiftId) {
this.shiftId = shiftId;
}
/**
* 将事件分拆为以月为单位
* @return
* @throws Exception
*/
public List partition() throws Exception{
List list = new ArrayList();
//跨年的事件,将其按年分拆
if(yearsMinus() > 0){
Integer daysOfMonth = CalendarUtil.getDaysOfMonth(this.startYear, 12);
CalendarSettingEvent startEvent = new CalendarSettingEvent(this.startYear, this.startYear,this.startMonth,
12 ,this.startDay, daysOfMonth ,this.shiftId);
CalendarSettingEvent endEvent = new CalendarSettingEvent(this.endYear,this.endYear, 1 ,this.endMonth,
1, this.endDay,this.shiftId);
list.add(startEvent);
list.add(endEvent);
}
//跨两个月的,按月分拆为两个
else if(monthMinus() == 1){
Integer daysOfMonth = CalendarUtil.getDaysOfMonth(this.startYear, this.startMonth);
CalendarSettingEvent startEvent = new CalendarSettingEvent(this.startYear, this.startYear,this.startMonth,
this.startMonth ,this.startDay, daysOfMonth ,this.shiftId);
CalendarSettingEvent endEvent = new CalendarSettingEvent(this.startYear, this.startYear,this.endMonth,
this.endMonth , 1 ,this.endDay ,this.shiftId);
list.add(startEvent);
list.add(endEvent);
}
//跨三个月的,按月分拆为三个
else if(monthMinus() == 2){
Integer daysOfMonth = CalendarUtil.getDaysOfMonth(this.startYear, this.startMonth);
CalendarSettingEvent startEvent = new CalendarSettingEvent(this.startYear, this.startYear,this.startMonth,
this.startMonth ,this.startDay, daysOfMonth ,this.shiftId);
Integer daysOfMonth2 = CalendarUtil.getDaysOfMonth(this.startYear, this.startMonth + 1);
CalendarSettingEvent midEvent = new CalendarSettingEvent(this.startYear, this.startYear,this.startMonth + 1,
this.startMonth + 1 ,1 , daysOfMonth2 ,this.shiftId);
CalendarSettingEvent endEvent = new CalendarSettingEvent(this.startYear, this.startYear,this.endMonth,
this.endMonth , 1 ,this.endDay ,this.shiftId);
list.add(startEvent);
list.add(midEvent);
list.add(endEvent);
}
return list;
}
/**
* 是否需要分拆
* @return
* @throws Exception
*/
public Boolean shouldPartition() throws Exception{
if(yearsMinus() > 0) return true;
else if(monthMinus() > 0) return true;
else return false;
}
/**
* 获取年差
* @return
*/
private Integer yearsMinus() throws Exception{
Integer minus = this.endYear-this.startYear;
if(minus < 0 || minus > 1){
throw new RuntimeException("工作日历的设置有误");
}
return minus;
}
/**
* 获取月差
* @return
*/
private Integer monthMinus() throws Exception{
Integer minus = this.endMonth - this.startMonth;
if(minus < 0 || minus > 1){
throw new RuntimeException("工作日历的设置有误");
}
return minus;
}
}