标签:
package com.paic.pad.info.monitor.res.biz.services.impl;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.paic.pad.info.common.biz.services.BussinessServices;
import com.paic.pad.info.common.biz.services.CommSysParamService;
import com.paic.pad.info.common.biz.services.WorkCalendarService;
import com.paic.pad.info.common.dto.BussinessDTO;
import com.paic.pad.info.common.utils.CommonUtils;
import com.paic.pad.info.common.utils.DateUtils;
import com.paic.pad.info.common.utils.SystemConstant;
import com.paic.pad.info.monitor.res.biz.services.MessageBoardQuartzService;
import com.paic.pad.info.tmr.board.biz.dao.po.MsgBoardInstructorPO;
import com.paic.pad.info.tmr.board.biz.services.MsgBoardInstructorServices;
import com.paic.pad.info.tmr.board.biz.services.MsgBoardRegistrationServices;
import com.paic.pad.info.tmr.board.biz.services.MsgBoardScheduleServices;
import com.paic.pad.info.tmr.board.biz.services.ScheduleHistoryServices;
import com.paic.pad.info.tmr.board.dto.MsgBoardInstructorDTO;
import com.paic.pad.info.tmr.board.dto.MsgBoardScheduleDTO;
import com.paic.pad.info.tmr.board.dto.ScheduleHistoryDTO;
import com.paic.pad.info.tmr.message.biz.dao.po.MessagePO;
import com.paic.pad.info.tmr.message.biz.services.MessageService;
import com.paic.pad.info.tmr.message.dto.MessageDTO;
import com.paic.pafa.app.biz.service.BaseService;
import com.paic.pafa.app.biz.service.BusinessServiceException;
/**
* 留言板定时任务
*
* @author hailei015
*
*/
@Component("messageBoardQuartzService")
public class MessageBoardQuartzServiceImpl extends BaseService implements MessageBoardQuartzService {
private final Log logger = LogFactory.getLog(this.getClass());
@Autowired
private CommSysParamService commSysParamService;
@Autowired
private MsgBoardRegistrationServices msgBoardRegistrationServices;
@Autowired
private WorkCalendarService workCalendarService;
@Autowired
private ScheduleHistoryServices scheduleHistoryServices;
@Autowired
private MsgBoardScheduleServices msgBoardScheduleServices;
@Autowired
private MsgBoardInstructorServices msgBoardInstructorServices;
@Autowired
private MessageService messageService;
@Autowired
private BussinessServices bussinessServices;
private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Override
public String executeMsgBoardScheduleAndRemindDisableJob() {
String message = "";
try {
List<BussinessDTO> list = bussinessServices.getAllBussinessList();
message = executeMsgBoardScheduleAndRemindDisableJobByAdmin(list);
}
catch (Exception e) {
message = "查询业务线出现异常";
logger.error("executeMsgBoardScheduleAndRemindJob: 查询业务线出现异常",e);
}
return message;
}
/**
* 给出一个日期判断它是否有排班, 如果没有则将最小的日期对象排成这个班
*
* @param date
* @throws BusinessServiceException
*/
private void msgBoardScheduleByDate(String date, String bizSeries) throws Exception {
boolean canSchedule = true;// 默认需要排班
MsgBoardScheduleDTO dto = msgBoardScheduleServices.getMsgBoardScheduleByDate(date, bizSeries);
if (dto != null) {
// 假如这天已经被排班了
if (dto.getIsDisable().equals(MsgBoardInstructorPO.DISABLE_NO)) {
canSchedule = false;
logger.info("msgBoardScheduleByDate: 日期 " + date + "已有辅导员, 无需排班!");
}
}
if (canSchedule) {
String minDate = msgBoardScheduleServices.getMinMsgBoardScheduleDate(bizSeries);
if (StringUtils.isNotEmpty(minDate)) {
MsgBoardScheduleDTO toScheduleDto = msgBoardScheduleServices.getMsgBoardScheduleByDate(minDate, bizSeries);
toScheduleDto.setScheduleDate(DateUtils.toDate(date));
msgBoardScheduleServices.updateMsgBoardSchedule(toScheduleDto);
MsgBoardInstructorDTO msgDto = new MsgBoardInstructorDTO();
msgDto.setUmId(toScheduleDto.getUmId());
msgDto.setIsDisable(MsgBoardInstructorPO.DISABLE_NO);
msgBoardInstructorServices.updateMsgBoardInstructor(msgDto);
logger.info("msgBoardScheduleByDate: 成功将" + msgDto.getUmId() + "排班, 其上次值班日期为:" + minDate + ", 新排班日期为:" + date);
}
}
}
/**
* 根据业务线执行留言板定时任务
*
* @param bizSeries
*/
@Transactional
private String executeMsgBoardJobs(String bizSeries) throws Exception {
String message = "执行成功!";
// 获得当前日期
String today = DateUtils.getTodayDate(format);
String yesterday = DateUtils.getDate(today, -1, format);
// 今天的值班记录对象
MsgBoardScheduleDTO dto = msgBoardScheduleServices.getMsgBoardScheduleByDate(yesterday, bizSeries);
if (dto != null) {
// 假如today是周五 那么 nextDay 不应该是周六 而应该是个工作日 (如周一才正确)
Date nextWorkday = workCalendarService.getSEQWorkDayByPramDate(today, bizSeries);
if (nextWorkday != null) {
today = DateUtils.toString(nextWorkday);
}
else {
message = "执行失败, 无法获取下一个工作日!";
logger.error("executeMsgBoardJobs: " + message);
return message;
}
/************************ 执行内容 1.今天值班完了 插入一条流水记录 **************************************/
ScheduleHistoryDTO scheduleHistoryDTO = new ScheduleHistoryDTO();
scheduleHistoryDTO.setScheduleDate(dto.getScheduleDate());
scheduleHistoryDTO.setUmId(dto.getUmId());
scheduleHistoryDTO.setLoginUser("MsgBoardJob");
scheduleHistoryServices.insertScheduleHistory(scheduleHistoryDTO);
logger.info("executeMsgBoardJobs: 成功插入" + yesterday + "的值班记录, 辅导员:" + dto.getUmId());
/************************ 执行内容 2.修改当天值班人为可禁用状态,可以重新排班状态 **************************************/
MsgBoardInstructorDTO msgBoardInstructorDTO = new MsgBoardInstructorDTO();
msgBoardInstructorDTO.setIsDisable(MsgBoardInstructorPO.DISABLE_YES);
msgBoardInstructorDTO.setUmId(dto.getUmId());
msgBoardInstructorServices.updateMsgBoardInstructor(msgBoardInstructorDTO);
//将今天之前未值班的人全部置为已值班
msgBoardInstructorServices.changeInstructorDisableBeforeToday(bizSeries);
logger.info("executeMsgBoardJobs: 成功修改" + yesterday + "的辅导员" + dto.getUmId() + "为已值班状态");
/************************ 执行内容 3.排班 **************************************/
Integer personCount = msgBoardScheduleServices.getMsgBoardScheduleCount(bizSeries);
String oneWorkDay = getWorkdayAfter(1, yesterday, bizSeries);// 排出 今天之后的 1天后的工作日
String twoWorkDay = getWorkdayAfter(1, today, bizSeries); // 提醒1天提醒 排2天后的班
String threeWorkDay = getWorkdayAfter(3, yesterday, bizSeries);// 排出 今天之后的 3天后的工作日
String fourWorkDay = getWorkdayAfter(3, today, bizSeries); // 支持3天提醒// 排4天后的班
if ((personCount != null) && (personCount.intValue() > 0)) {
// 人数至大于4人才能走3天提醒流程和1天提醒
if (personCount.intValue() >= 4) {
this.msgBoardScheduleByDate(oneWorkDay, bizSeries);
this.msgBoardScheduleByDate(twoWorkDay, bizSeries);
this.msgBoardScheduleByDate(threeWorkDay, bizSeries);
this.msgBoardScheduleByDate(fourWorkDay, bizSeries);
}
// 人数小于4大于2人 只走 1天提醒
else if ((personCount.intValue() <= 3) && (personCount.intValue() >= 2)) {
this.msgBoardScheduleByDate(oneWorkDay, bizSeries);
this.msgBoardScheduleByDate(twoWorkDay, bizSeries);
}
// 假如只有1人 只能排班无法 提醒
else if (personCount.intValue() == 1) {
this.msgBoardScheduleByDate(oneWorkDay, bizSeries);
}
}
else {
message = "目前没有留言板辅导员,无法排班!";
logger.info("executeMsgBoardJobs:" + message);
}
/************************ 执行内容 4.消息提醒 **************************************/
String sysNameStr = commSysParamService.queryParamValueByBizSeriesAndParamKey(bizSeries, SystemConstant.MESSAGE_BOARD_SYSADMIN_NAME);
String sysName = StringUtils.isEmpty(sysNameStr) ? "未知" : sysNameStr;
String sysTelStr = commSysParamService.queryParamValueByBizSeriesAndParamKey(bizSeries, SystemConstant.MESSAGE_BOARD_SYSADMIN_TEL);
String sysTel = StringUtils.isEmpty(sysTelStr) ? "未知" : sysTelStr;
MessageDTO messageDTO = new MessageDTO();
messageDTO.setMessageTitle("留言板辅导员提醒");
messageDTO.setMessageType(MessagePO.MESSAGE_BOARD);
messageDTO.setSource(MessagePO.MESSAGE_SOURCE_TMR);
messageDTO.setStatus(0);
messageDTO.setMessageFrom(MessagePO.MESSAGE_SYS_FROM);
messageDTO.setSubmitDate(new Date());
messageDTO.setUmId("padinfodata");
MsgBoardScheduleDTO msgDtoThree = msgBoardScheduleServices.getMsgBoardScheduleByDate(fourWorkDay, bizSeries);
if (msgDtoThree != null) {
messageDTO.setMessageTo(msgDtoThree.getUmId());
messageDTO.setMessageContent(fourWorkDay + "您将担任留言板值班人,若当天休假请提前联系管理员" + sysName + "(联系方式:" + sysTel + ")安排调整。");
messageService.addMessage(messageDTO);
logger.info("executeMsgBoardJobs:成功发送三天后的提醒 " + msgDtoThree.getUmId() + " 值班日期:" + fourWorkDay);
}
MsgBoardScheduleDTO msgDtoTomorrow = msgBoardScheduleServices.getMsgBoardScheduleByDate(twoWorkDay, bizSeries);
if (msgDtoTomorrow != null) {
messageDTO.setMessageTo(msgDtoTomorrow.getUmId());
messageDTO.setMessageContent(twoWorkDay + "您将担任留言板值班人,若当天休假请提前联系管理员" + sysName + "(联系方式:" + sysTel + ")安排调整。");
messageService.addMessage(messageDTO);
logger.info("executeMsgBoardJobs:成功发送一天后的提醒 " + msgDtoTomorrow.getUmId() + " 值班日期:" + twoWorkDay);
}
}
else {
logger.info("executeMsgBoardJobs:昨天没有值班人无需排班!");
}
return message;
}
/**
* 给定一个日期获得这个日期 指定天数后的工作日期(非工作日自动过滤) 如传入周四想得到3天后的日期则返回下周二
*
* @param today
* @return
* @throws BusinessServiceException
*/
private String getWorkdayAfter(int laterDay, String today, String umBizSeries) throws BusinessServiceException {
String threeDay = null;
for (int i = 1; i <= laterDay; i++) {
String oneDay = DateUtils.getDate(today, +1, format);
today = DateUtils.toString(workCalendarService.getSEQWorkDayByPramDate(oneDay, umBizSeries));
threeDay = today;
}
return threeDay;
}
@Override
public String executeMsgBoardScheduleAndRemindDisableJobByAdmin(List<BussinessDTO> list) {
String message = " 留言板排班";
boolean isGetLock = false;
try {
// N为目前没人执行 Y表示已经在执行 如果 N 能改为Y 证明目前没人执行。 默认执行完都会改为N
// 将N改为Y 如果修改条数大于0说明成功, 目前没人
int updatedCount = commSysParamService.updateParamValueByParamKey(SystemConstant.MESSAGE_SCHEDULE_QUARTZ_IS_STARTED, SystemConstant.NO, SystemConstant.YES, null);
boolean isQuartzStarted = (updatedCount <= 0);
if (isQuartzStarted) {
message = "已在执行,无法重执行!";
logger.info("executeMsgBoardScheduleAndRemindJob: " + message);
return message;
}
else {
isGetLock = true;
}
StopWatch watch = new StopWatch();
watch.start();
logger.info("executeMsgBoardScheduleAndRemindJob: 任务开始");
if (CommonUtils.listNotNull(list)) {
// 判断该业务线下留言板辅导员功能是否开启(Y:启用 或者 N:禁用)
Map<String, String> map = commSysParamService.queryParamValuesMapByParamKey(SystemConstant.ENABLE_FUN_INSTRUCTOR);
logger.info("executeMsgBoardScheduleAndRemindJob: 目前可以执行的业务线为(" + list.size() + ")条");
for (int i = 0; i < list.size(); i++) {
BussinessDTO bussinessDTO = list.get(i);
String bizSeri = bussinessDTO.getBizSeries();
String enableFunInstructor = map.get(bizSeri);
//功能开关开启
if (StringUtils.isNotEmpty(enableFunInstructor) && enableFunInstructor.equals(SystemConstant.YES)) {
try {
//获得上一次任务执行日期
String lastQuartzDate = commSysParamService.queryParamValueByBizSeriesAndParamKeyWithoutCache(bizSeri, SystemConstant.MESSAGE_SCHEDULE_QUARTZ_DEAL_TIME);
lastQuartzDate = StringUtils.isNotEmpty(lastQuartzDate) ? lastQuartzDate : "2000-01-01";
// 获得当前日期
String today = DateUtils.getTodayDate(format);
boolean isDataLatest = (lastQuartzDate.compareTo(today) >= 0);
if (isDataLatest) {
message = message +"业务线[" + bizSeri + "] 已执行过排班, 无法重复执行!\n";
logger.info("executeMsgBoardScheduleAndRemindJob:" + message);
continue;
}
logger.info("executeMsgBoardScheduleAndRemindJob: 开始业务线[" + bizSeri + "]排班");
String bizMsg = this.executeMsgBoardJobs(bizSeri);
message = message + "\n [" + bizSeri + "]排班 " + bizMsg;
logger.info("executeMsgBoardScheduleAndRemindJob: 完成业务线[" + bizSeri + "]排班");
commSysParamService.updateParamValueByParamKey(SystemConstant.MESSAGE_SCHEDULE_QUARTZ_DEAL_TIME, null, today, bussinessDTO.getBussinessId());
logger.info("executeMsgBoardScheduleAndRemindJob:业务线[" + bizSeri + "]执行日期更新到" + today + "成功");
}
catch (Exception e) {
message = message + "\n [" + bizSeri + "]排班 出现异常";
logger.error("executeMsgBoardScheduleAndRemindJob: 业务线[" + bizSeri + "]排班 出现异常",e);
}
}
else {
message = message + "\n [" + bizSeri + "]排班 功能开关没有开启!" ;
}
}
}
//处理完等待5分钟, 防止其他服务器重复执行
Thread.sleep(5 * 60 * 1000);
watch.stop();
logger.info("executeMsgBoardScheduleAndRemindJob: 任务完成, 执行花费时间为:" + watch.getTime());
}
catch (Exception e) {
message = "执行发生异常!执行失败!请联系管理员!";
logger.error("executeMsgBoardScheduleAndRemindDisableJob: " + message, e);
}
finally {
// 所有任务执行完毕后打开开关让下次可以进入执行
try {
if(isGetLock) {
commSysParamService.updateParamValueByParamKey(SystemConstant.MESSAGE_SCHEDULE_QUARTZ_IS_STARTED, SystemConstant.YES, SystemConstant.NO, null);
}
}
catch (BusinessServiceException e) {
logger.error("executeMsgBoardScheduleAndRemindJob: 重置MESSAGE_SCHEDULE_QUARTZ_IS_STARTED 失败", e);
}
}
return message;
}
}
标签:
原文地址:http://www.cnblogs.com/hailei/p/4757584.html