package com.norteksoft.bs.holiday.service; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import com.norteksoft.bs.holiday.dao.HolidayDao; import com.norteksoft.bs.holiday.entity.DateType; import com.norteksoft.bs.holiday.entity.Holiday; @Service @Transactional public class HolidayManager { @Autowired private HolidayDao holidayDao; /** * 查询给定日期该月分中所有设置了的特殊日期 * @param date * @return */ public List<Integer> getMonthSetting(Date date){ Calendar cal = Calendar.getInstance(); cal.setTime(date); Calendar newCal = Calendar.getInstance(); newCal.setTime(new Date(0)); newCal.set(Calendar.YEAR, cal.get(Calendar.YEAR)); newCal.set(Calendar.MONTH, cal.get(Calendar.MONTH)); newCal.set(Calendar.HOUR_OF_DAY, 0); Date startDate = newCal.getTime(); newCal.add(Calendar.MONTH, 1); newCal.add(Calendar.MILLISECOND, -1); Date endDate = newCal.getTime(); // 所有设置为特殊日期的 List<Holiday> setting = holidayDao.getHolidaySetting(startDate, endDate); newCal.add(Calendar.MILLISECOND, 1); newCal.add(Calendar.MONTH, -1); int month = newCal.get(Calendar.MONTH); newCal.set(Calendar.DAY_OF_MONTH, 1); // 一个月中所有的周末 List<Integer> holidays = new ArrayList<Integer>(); for(;newCal.get(Calendar.MONTH) == month; newCal.add(Calendar.DAY_OF_YEAR, 1)){ if(newCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY || newCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY){ holidays.add(Integer.valueOf(newCal.get(Calendar.DAY_OF_MONTH))); } } for(Holiday holiday : setting){ newCal.setTime(holiday.getSpecialDate()); if(holiday.getDateType() == DateType.WORKING_DAY){ holidays.remove(Integer.valueOf(newCal.get(Calendar.DAY_OF_MONTH))); }else if(holiday.getDateType() == DateType.HOLIDAY){ holidays.add(Integer.valueOf(newCal.get(Calendar.DAY_OF_MONTH))); } } return holidays; } public List<Holiday> getHolidaySetting(Date startDate, Date endDate){ return holidayDao.getHolidaySetting(startDate, endDate); } /** * 查询给定时间段内的节假日和工作日 * @param startDate * @param endDate * @return key: workDate工作日,spareDate节假日 */ @Transactional(readOnly=true) public Map<String, List<Date>> getHolidaySettingDays(Date startDate, Date endDate){ Assert.notNull(startDate, "startDate不能为null"); Assert.notNull(endDate, "endDate不能为null"); startDate = clearDateTime(startDate); endDate = clearDateTime(endDate); List<Holiday> holidaySetting = holidayDao.getHolidaySetting(startDate, endDate); endDate.setTime(endDate.getTime()+24*60*60*1000L); Calendar cal = Calendar.getInstance(); cal.setTime(startDate); List<Date> commonDays = new ArrayList<Date>(); List<Date> holidays = new ArrayList<Date>(); for( ; cal.getTime().before(endDate); cal.add(Calendar.DAY_OF_YEAR, 1)){ if(isHoliday(holidaySetting, cal.getTime())){ holidays.add(cal.getTime()); }else{ commonDays.add(cal.getTime()); } } Map<String, List<Date>> result = new HashMap<String, List<Date>>(); result.put("spareDate", holidays); result.put("workDate", commonDays); return result; } public boolean isHoliday(List<Holiday> holidaySetting, Date date){ // 优先读取设置中的 for(Holiday hol : holidaySetting){ if(hol.getSpecialDate().getTime()==date.getTime()){ if(hol.getDateType() == DateType.HOLIDAY){ return true; }else{ return false; } } } Calendar cal = Calendar.getInstance(); cal.setTime(date); if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY){ return true; } return false; } public Date clearDateTime(Date srcDate){ Calendar cal = Calendar.getInstance(); cal.setTime(srcDate); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } public Date addDate(Date srcDate, int add){ Calendar cal = Calendar.getInstance(); cal.setTime(srcDate); cal.add(Calendar.DAY_OF_YEAR, add); return cal.getTime(); } public Holiday getHoliday(Long id){ return holidayDao.get(id); } public void deleteHoliday(Long id){ holidayDao.delete(id); } public void deleteHoliday(Holiday holiday){ holidayDao.delete(holiday); } public void saveHoliday(Holiday holiday){ holiday.setCompanyId(holidayDao.getCompanyId()); Holiday hol = holidayDao.getHolidayByDate(holiday.getSpecialDate()); if(hol!=null){ hol.setDateType(holiday.getDateType()); holiday = hol; } holidayDao.save(holiday); } public void saveHoliday(List<Holiday> holidays){ for(Holiday holiday : holidays) saveHoliday(holiday); } }