package org.jeecg.modules.mdc.job; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.modules.mdc.entity.MdcEquipment; import org.jeecg.modules.mdc.entity.MdcEquipmentOvertime; import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection; import org.jeecg.modules.mdc.entity.MdcSystemParameters; import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.util.ThrowableUtil; import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo; import org.jeecg.modules.quartz.entity.QuartzJob; import org.jeecg.modules.quartz.entity.SysQuartzLog; import org.jeecg.modules.quartz.service.IQuartzJobService; import org.jeecg.modules.quartz.service.ISysQuartzLogService; import org.jeecg.modules.system.service.ISysAnnouncementService; import org.quartz.*; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author Lius * @Description: 设备加班时长算法统计 * @date 2024/1/24 17:12 */ @Slf4j public class RunningOvertimeDurationJob implements Job { @Resource private IQuartzJobService quartzJobService; @Resource private ISysQuartzLogService sysQuartzLogService; @Resource private IMdcEquipmentService mdcEquipmentService; @Resource private IMdcEquipmentOvertimeService mdcEquipmentOvertimeService; /** * 若参数变量名修改 QuartzJobController中也需对应修改 时间: yyyyMMdd 例: 20230414 */ private String parameter; public void setParameter(String parameter) { this.parameter = parameter; } @Resource private ISysAnnouncementService sysAnnouncementService; @Resource private IMdcDeviceCalendarService mdcDeviceCalendarService; @Resource private IMdcSystemParametersService mdcSystemParametersService; @Resource private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SysQuartzLog quartzLog = new SysQuartzLog(); quartzLog.setCreateTime(new Date()); List byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName()); if (byJobClassName != null && !byJobClassName.isEmpty()) { quartzLog.setJobId(byJobClassName.get(0).getId()); } quartzLog.setParams(this.parameter); log.info(String.format("定时统计设备加班时长任务 param: %s RunningOvertimeDurationJob start! 时间:" + DateUtils.getNow(), this.parameter)); long startTime = System.currentTimeMillis(); String date = ""; try { if (StringUtils.isNotBlank(this.parameter)) { date = DateUtils.format(DateUtils.toDate(this.parameter, DateUtils.STRDATE), DateUtils.STR_DATE); Date initDate = DateUtils.toDate(this.parameter, DateUtils.STRDATE); if (initDate != null) { mdcEquipmentOvertimeService.remove(new LambdaQueryWrapper().eq(MdcEquipmentOvertime::getTheDate, this.parameter).eq(MdcEquipmentOvertime::getAutoFlag, CommonConstant.AUTO_FLAG_Y)); } } else { date = DateUtils.format(DateUtils.getNow(), DateUtils.STR_DATE); } List equipmentList = mdcEquipmentService.list(); MdcSystemParameters mdcSystemParameters = mdcSystemParametersService.getOne(new LambdaQueryWrapper().eq(MdcSystemParameters::getCode, "equip_log_statis_time")); if (mdcSystemParameters == null) { throw new JobExecutionException("mdc_system_parameters 表中数据缺失"); } String value = mdcSystemParameters.getValue(); List result = new ArrayList<>(); for (MdcEquipment mdcEquipment : equipmentList) { // 获取设备工作日历 List mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentIdAndDate(mdcEquipment.getEquipmentId(), DateUtils.format(DateUtils.toDate(date, DateUtils.STR_DATE),DateUtils.STRDATE)); if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) { //获取最后一个班次结束时间 Date startDate = this.getCalendarEndDate(mdcDeviceCalendarVos, date); Date endDate = DateUtils.plusTime(DateUtils.toDate(date + " " + value, DateUtils.STR_DATE_TIME_SMALL), 1); List equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), startDate, endDate); if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) { // 时间修正 if (equipmentRunningSectionList.get(0).getStartTime().before(startDate)) { equipmentRunningSectionList.get(0).setStartTime(startDate); } if (equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).getEndTime().after(endDate)) { equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(endDate); } BigDecimal duration = BigDecimal.ZERO; for (MdcEquipmentRunningSection mdcEquipmentRunningSection : equipmentRunningSectionList) { duration = duration.add(new BigDecimal(DateUtils.differentSecond(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime()))); } MdcEquipmentOvertime mdcEquipmentOvertime = new MdcEquipmentOvertime(); mdcEquipmentOvertime.setEquipmentId(mdcEquipment.getEquipmentId()); mdcEquipmentOvertime.setDuration(duration); mdcEquipmentOvertime.setAutoFlag(CommonConstant.AUTO_FLAG_Y); mdcEquipmentOvertime.setTheDate(DateUtils.format(DateUtils.toDate(date, DateUtils.STR_DATE),DateUtils.STRDATE)); result.add(mdcEquipmentOvertime); } } else { // 没有班次配置,计算全天的设备加工状态 Date startDate = DateUtils.toDate(date + " " + value, DateUtils.STR_DATE_TIME_SMALL); Date endDate = DateUtils.plusTime(startDate, 1); List equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), startDate, endDate); if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) { // 时间修正 if (equipmentRunningSectionList.get(0).getStartTime().before(startDate)) { equipmentRunningSectionList.get(0).setStartTime(startDate); } if (equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).getEndTime().after(endDate)) { equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(endDate); } BigDecimal duration = BigDecimal.ZERO; for (MdcEquipmentRunningSection mdcEquipmentRunningSection : equipmentRunningSectionList) { duration = duration.add(new BigDecimal(DateUtils.differentSecond(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime()))); } MdcEquipmentOvertime mdcEquipmentOvertime = new MdcEquipmentOvertime(); mdcEquipmentOvertime.setEquipmentId(mdcEquipment.getEquipmentId()); mdcEquipmentOvertime.setDuration(duration); mdcEquipmentOvertime.setAutoFlag(CommonConstant.AUTO_FLAG_Y); mdcEquipmentOvertime.setTheDate(DateUtils.format(DateUtils.toDate(date, DateUtils.STR_DATE),DateUtils.STRDATE)); result.add(mdcEquipmentOvertime); } } } if (!result.isEmpty()) { mdcEquipmentOvertimeService.saveBatch(result); } quartzLog.setIsSuccess(0); } catch (Exception e) { quartzLog.setIsSuccess(-1); quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e)); // 发送消息通知 sysAnnouncementService.jobSendMessage("定时统计设备加班时长任务失败", quartzLog.getExceptionDetail()); } long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); sysQuartzLogService.save(quartzLog); } private Date getCalendarEndDate(List mdcDeviceCalendarVos, String date) { date = DateUtils.format(DateUtils.toDate(date, DateUtils.STRDATE), DateUtils.STR_DATE); String endDate = ""; for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) { String shiftEndDate = ""; if ("true".equals(mdcDeviceCalendarVo.getIsDaySpan())) { shiftEndDate = DateUtils.format(DateUtils.plusTime(DateUtils.toDate(date, DateUtils.STR_DATE), 1), DateUtils.STR_DATE) + " " + mdcDeviceCalendarVo.getEndDate(); } else { shiftEndDate = date + " " + mdcDeviceCalendarVo.getEndDate(); } if (StringUtils.isBlank(endDate)) { endDate = shiftEndDate; } else { // endDate Date date1 = DateUtils.toDate(endDate, DateUtils.STR_DATE_TIME_SMALL); // shiftEndDate Date date2 = DateUtils.toDate(shiftEndDate, DateUtils.STR_DATE_TIME_SMALL); if (date2.after(date1)) { endDate = shiftEndDate; } } } return DateUtils.toDate(endDate, DateUtils.STR_DATE_TIME_SMALL); } }