/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.plugin.notes.manager.service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ewcms.plugin.notes.manager.dao.MemorandaDAO; import com.ewcms.plugin.notes.model.Memoranda; import com.ewcms.plugin.notes.model.Memoranda.BeforeStatus; import com.ewcms.plugin.notes.model.Memoranda.FrequencyStatus; import com.ewcms.plugin.notes.util.Lunar; import com.ewcms.plugin.notes.util.SolarTerm; import com.ewcms.web.util.EwcmsContextUtil; /** * * @author wu_zhijun */ @Service public class MemorandaService implements MemorandaServiceable { protected static final Logger logger = LoggerFactory.getLogger(MemorandaService.class); private final static String POSITION_PREV="prev_"; private final static String POSITION_NEXT="next_"; @Autowired private MemorandaDAO memorandaDAO; private int dayCount; private int currentMonth; private int currentDay; private int selYear; private int selMonth; private int prevMonth; private int nextMonth; @Override public StringBuffer getInitCalendarToHtml(final int year, final int month) { StringBuffer sb = new StringBuffer(); Calendar calendar = Calendar.getInstance(); int currentYear = calendar.get(Calendar.YEAR); currentMonth = calendar.get(Calendar.MONTH); if (currentYear == year && currentMonth == month - 1){ currentDay = calendar.get(Calendar.DATE); }else{ currentDay = 0; } calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month - 1); selYear = year; selMonth = month; prevMonth = month - 1; nextMonth = month + 1; calendar.set(Calendar.DAY_OF_MONTH, 1); int firstDayOfMonth = calendar.get(Calendar.DAY_OF_WEEK); int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); int week = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH); dayCount = 1; sb.append(getTitleHtml().toString()); sb.append(generatorFirstWeekHtml(firstDayOfMonth).toString()); sb.append(generatorMiddleWeekHtml(week).toString()); sb.append(generatorLastWeekHtml(days,firstDayOfMonth).toString()); sb.append(generatorJs().toString()); return sb; } private StringBuffer generatorJs(){ StringBuffer sb = new StringBuffer(); sb.append("<script type='text/javascript'>\n"); sb.append(" $('.a_notes_value').draggable({revert:true,proxy:'clone'});\n"); sb.append(" $('.div_notes').droppable({\n"); sb.append(" onDragEnter:function(e, source){\n"); //sb.append(" $(this).addClass('over');\n"); sb.append(" },\n"); sb.append(" onDragLeave:function(e, source){\n"); //sb.append(" $(this).removeClass('over');\n"); sb.append(" },\n"); sb.append(" onDrop:function(e, source){\n"); //sb.append(" $(this).removeClass('over');\n"); sb.append(" $(this).append(source);\n"); sb.append(" var divMemoId = $(source).attr('id');\n"); sb.append(" var memoId = divMemoId.split('_')[3];\n"); sb.append(" var targetDivId = $(source).parents('div:first').attr('id');\n"); sb.append(" var dropDays = targetDivId.split('_');\n"); sb.append(" var dropDay;\n"); sb.append(" var month=$('#month').val();\n"); sb.append(" if (dropDays[2]=='prev'){\n"); sb.append(" month = parseInt(month) - 1;\n"); sb.append(" dropDay = dropDays[3];\n"); sb.append(" }else if (dropDays[2]=='next'){\n"); sb.append(" month = parseInt(month) + 1;\n"); sb.append(" dropDay = dropDays[3];\n"); sb.append(" }else{\n"); sb.append(" dropDay = dropDays[2];\n"); sb.append(" }\n"); sb.append(" $.post(dropURL,{'memoId':memoId,'year':$('#year').val(),'month':month,'dropDay':dropDay},function(data){\n"); sb.append(" if (data != 'true'){\n"); sb.append(" }\n"); sb.append(" });\n"); sb.append(" }\n"); sb.append(" });\n"); sb.append("</script>\n"); return sb; } private StringBuffer generatorContentHtml(int year, int month, int day, String position){ StringBuffer sb = new StringBuffer(); String lunarValue= getLunarDay(year, month, day); if (!getSolarTerms(year, month, day).equals("")) lunarValue = getSolarTerms(year, month, day); List<Memoranda> memos = findMemorandaByDate(year, month, day); StringBuffer memoSb = new StringBuffer(); for (Memoranda memo : memos){ String title = memo.getTitle(); String clock = ""; if (memo.getWarn()){ clock = "<img id='img_clock_" + memo.getId() + "' src='../ewcmssource/image/notes/clock.png' width='13px' height='13px' align='bottom'/>"; } if (title.length() > 12){ title = title.substring(0, 9) + "..."; } memoSb.append("<div id='div_notes_memo_" + memo.getId() + "' class='a_notes_value'><span id='title_" + memo.getId() + "' class='span_title'><a class='a_title' id='a_title_" + memo.getId() + "' onclick='edit(" + memo.getId() + ");' style='cursor:pointer;' href='javascript:void(0);' title='" + memo.getTitle() + "'>" + title + "</a></span>" + clock + "<div></div></div>\n"); } sb.append(" <td id='td_notes_" + position + day + "'>\n"); sb.append(" <table width='100%' cellspacing='0' cellpadding='0' border='0'"); if (position.equals("")){ sb.append(" ondblclick='add(" + day + ");'"); } sb.append(">\n"); sb.append(" <tr>\n"); sb.append(" <td width='33%' valign='middle' height='20' align='center' style='border-bottom: #aaccee 1px solid; border-right: #aaccee 1px solid; background-color: #DCF0FB;"); if (!position.equals("")){ sb.append("color:#AAAAAA' "); } sb.append(" id='td_table_notes_" + position + day + "'>" + day + " " + lunarValue + "<br></td>\n"); sb.append(" <td width='67%' bgcolor='#E9F0F8'></td>\n"); sb.append(" </tr>\n"); sb.append(" <tr valign='top'>\n"); sb.append(" <td height='65' onmouseover=this.bgColor='#EDFBD2' colspan='2' "); if (currentMonth == (month -1) && currentDay == day){ sb.append(" onmouseout=this.bgColor='#FFFFCC' bgcolor='#FFFFCC' "); }else{ sb.append(" onmouseout=this.bgColor='' "); } sb.append(">\n"); sb.append(" <div id='div_notes_" + position + day + "' class='div_notes' style='cursor:pointer;width:auto;height:65px; overflow-y:auto; border:0px solid;'>\n"); sb.append(memoSb.toString()); sb.append(" </div>\n"); sb.append(" </td>\n"); sb.append(" </tr>\n"); sb.append(" </table>\n"); sb.append(" </td>\n"); return sb; } private StringBuffer generatorFirstWeekHtml(final int firstDayOfMonth) { StringBuffer sb = new StringBuffer(); sb.append("<tr class='notes_tr' valign='top'>\n"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, selYear); if (prevMonth == 0){ calendar.set(Calendar.YEAR, selYear - 1); prevMonth = 12; } calendar.set(Calendar.MONTH, prevMonth - 1); int prevMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); int beginDay = prevMonthMaxDay - firstDayOfMonth + 2; for (int i = 1; i < firstDayOfMonth; i++){ sb.append(generatorContentHtml(calendar.get(Calendar.YEAR), prevMonth, beginDay, POSITION_PREV).toString()); beginDay++; } for (int i = firstDayOfMonth; i<=7;i++){ sb.append(generatorContentHtml(selYear, selMonth, dayCount, "").toString()); dayCount++; } sb.append("</tr>\n"); return sb; } private StringBuffer generatorMiddleWeekHtml(final int week){ StringBuffer sb = new StringBuffer(); int middleWeek = week - 1; for (int j = 1; j < middleWeek; j++){ sb.append("<tr class='notes_tr' valign='top'>\n"); for (int i = 1; i <= 7; i++){ sb.append(generatorContentHtml(selYear, selMonth, dayCount, "").toString()); dayCount++; } sb.append("</tr>\n"); } return sb; } private StringBuffer generatorLastWeekHtml(final int days, final int firstDayOfMonth){ StringBuffer sb = new StringBuffer(); int lastDays = days - dayCount + 1; sb.append("<tr class='notes_tr' valign='top'>\n"); for (int i = 1; i <= lastDays; i++){ sb.append(generatorContentHtml(selYear, selMonth, dayCount, "").toString()); dayCount++; } int blankDay = 7 - lastDays; Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, selYear); if (nextMonth == 13){ calendar.set(Calendar.YEAR, selYear + 1); nextMonth = 1; } for (int i = 1; i <= blankDay; i++){ sb.append(generatorContentHtml(calendar.get(Calendar.YEAR), nextMonth, i, POSITION_NEXT).toString()); } sb.append("</tr>\n"); return sb; } private StringBuffer getTitleHtml(){ StringBuffer sb = new StringBuffer(); sb.append("<tr class='notes_tr' bgcolor='#DCF0FB' align='center'>"); sb.append(" <td width='15%' height='30'><font color='#14AD00'>星期日</font></td>"); sb.append(" <td width='14%'>星期一</td>"); sb.append(" <td width='14%'>星期二</td>"); sb.append(" <td width='14%'>星期三</td>"); sb.append(" <td width='14%'>星期四</td>"); sb.append(" <td width='14%'>星期五</td>"); sb.append(" <td width='15%'><font color='#14AD00'>星期六</font></td>"); sb.append("</tr>"); return sb; } private String getLunarDay(int year, int month, int day){ return Lunar.getLunarDay(year, month, day); } private String getSolarTerms(int year, int month, int day){ return SolarTerm.getSoralTerm(year, month, day); } @Override public Long addMemoranda(Memoranda memoranda, Integer year, Integer month, Integer day) { memoranda.setUserName(EwcmsContextUtil.getUserName()); Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, day); memoranda.setNoteDate(calendar.getTime()); if (memoranda.getWarn() && memoranda.getWarnTime() != null){ setBefore(memoranda); } memorandaDAO.persist(memoranda); return memoranda.getId(); } @Override public void delMemoranda(Long memorandaId) { memorandaDAO.removeByPK(memorandaId); } @Override public Memoranda findMemoranda(Long memorandaId) { return memorandaDAO.get(memorandaId); } @Override public Long updMemoranda(Memoranda memoranda) { if (memoranda.getWarn() && memoranda.getWarnTime() != null){ setBefore(memoranda); } memorandaDAO.merge(memoranda); return memoranda.getId(); } private List<Memoranda> findMemorandaByDate(Integer year, Integer month, Integer day) { SimpleDateFormat noteDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, day); Date beginDate = calendar.getTime(); calendar.add(Calendar.DATE, 1); Date endDate = calendar.getTime(); try { beginDate = noteDateFormat.parse(noteDateFormat.format(beginDate)); endDate = noteDateFormat.parse(noteDateFormat.format(endDate)); } catch (ParseException e) { logger.error(e.toString()); } return memorandaDAO.findMemorandaByDate(beginDate, endDate, EwcmsContextUtil.getUserName()); } @Override public void updMemoranda(Long memorandaId, Integer year, Integer month, Integer day) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, day); Memoranda memoranda = memorandaDAO.get(memorandaId); memoranda.setNoteDate(calendar.getTime()); memorandaDAO.merge(memoranda); } @Override public List<Memoranda> getMemorandaFireTime(String userName, Date clientTime){ Calendar c_before = Calendar.getInstance(); Calendar c_after = Calendar.getInstance(); c_before.setTime(clientTime); c_after.setTime(clientTime); c_before.add(Calendar.MINUTE, -1); c_after.add(Calendar.MINUTE, 1); Long beforeTime = c_before.getTime().getTime(); Long afterTime = c_after.getTime().getTime(); List<Memoranda> memorandaMsg = new ArrayList<Memoranda>(); List<Memoranda> memorandas = memorandaDAO.findMemorandaByWarn(userName); if (memorandas == null || memorandas.isEmpty()) return new ArrayList<Memoranda>(); for (Memoranda memoranda : memorandas){ Date fireTime = memoranda.getFireTime(); if (fireTime == null){ setBefore(memoranda); memorandaDAO.merge(memoranda); } Long fireTimeValue = memoranda.getFireTime().getTime(); if (fireTimeValue.longValue() >= beforeTime && fireTimeValue.longValue() <= afterTime){ memorandaMsg.add(memoranda); updMemorandaNextFireTime(memoranda.getId()); }else if (fireTimeValue.longValue() < beforeTime ){ if (memoranda.getMissRemind()) memorandaMsg.add(memoranda); updMemorandaNextFireTime(memoranda.getId()); } } return memorandaMsg; } private void updMemorandaNextFireTime(Long memorandaId){ Memoranda memoranda = memorandaDAO.get(memorandaId); setFrequency(memoranda); memorandaDAO.merge(memoranda); } private void setFrequency(Memoranda memoranda){ Calendar calendar = Calendar.getInstance(); Date fireTime = memoranda.getFireTime(); if (fireTime == null){ SimpleDateFormat notesDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String notesDateValue = notesDateFormat.format(memoranda.getNoteDate()); SimpleDateFormat warnDateFormat = new SimpleDateFormat("HH:mm:00"); String warnDateValue = warnDateFormat.format(memoranda.getWarnTime()); String fireTimeValue = notesDateValue + " " + warnDateValue; SimpleDateFormat fireDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00"); try { fireTime = fireDateFormat.parse(fireTimeValue); } catch (ParseException e) { fireTime = calendar.getTime(); } } calendar.setTime(fireTime); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DATE); FrequencyStatus status = memoranda.getFrequency(); switch(status){ case SINGLE://单次 memoranda.setWarn(false); break; case EVERYDAY://每天 calendar.set(year, month, day + 1); break; case EVERYWEEK://每周 calendar.set(year, month, day + 7); break; case EVERYMONTHWEEK://每月(星期) calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); break; case EVERYMONTH://每月(日) calendar.set(year, month + 1, day); break; case EVERYYEAR://每年 calendar.set(year + 1, month , day); break; default: break; } memoranda.setFireTime(calendar.getTime()); } private void setBefore(Memoranda memoranda){ Calendar calendar = Calendar.getInstance(); Date fireTime = memoranda.getFireTime(); if (fireTime == null){ SimpleDateFormat notesDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String notesDateValue = notesDateFormat.format(memoranda.getNoteDate()); SimpleDateFormat warnDateFormat = new SimpleDateFormat("HH:mm:00"); String warnDateValue = warnDateFormat.format(memoranda.getWarnTime()); String fireTimeValue = notesDateValue + " " + warnDateValue; SimpleDateFormat fireDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00"); try { fireTime = fireDateFormat.parse(fireTimeValue); } catch (ParseException e) { fireTime = calendar.getTime(); } } calendar.setTime(fireTime); BeforeStatus status = memoranda.getBefore(); switch(status){ case NONE://正点 break; case ONE://1分钟 calendar.add(Calendar.MINUTE, -1); break; case FIVE://5分钟 calendar.add(Calendar.MINUTE, -5); break; case TEN://10分钟 calendar.add(Calendar.MINUTE, -10); break; case FIFTEEN://15分钟 calendar.add(Calendar.MINUTE, -15); break; case TWENTY://20分钟 calendar.add(Calendar.MINUTE, -20); break; case TWENTYFIVE://25分钟 calendar.add(Calendar.MINUTE, -25); break; case THIRTY://30分钟 calendar.add(Calendar.MINUTE, -30); break; case FORTYFIVE://45分钟 calendar.add(Calendar.MINUTE, -45); break; case ONEHOUR://1小时 calendar.add(Calendar.HOUR, -1); break; case TWOHOUR://2小时 calendar.add(Calendar.HOUR, -2); break; case THREEHOUR://3小时 calendar.add(Calendar.HOUR, -3); break; case TWELVEHOUR://12小时 calendar.add(Calendar.HOUR, -12); break; case TWENTYFOUR://24小时 calendar.add(Calendar.HOUR, -24); break; case TWODAY://2天 calendar.add(Calendar.DATE, -2); break; case ONEWEEK://1星期 calendar.add(Calendar.DATE, -7); break; default: break; } memoranda.setFireTime(calendar.getTime()); } @Override public List<Memoranda> findMemorandaByUserName() { return memorandaDAO.findMemorandaByUserName(EwcmsContextUtil.getUserName()); } }