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
|
*/
|
@PersistJobDataAfterExecution
|
@DisallowConcurrentExecution
|
@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<QuartzJob> 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<MdcEquipmentOvertime>().eq(MdcEquipmentOvertime::getTheDate, this.parameter).eq(MdcEquipmentOvertime::getAutoFlag, CommonConstant.AUTO_FLAG_Y));
|
}
|
} else {
|
date = DateUtils.format(DateUtils.getNow(), DateUtils.STR_DATE);
|
}
|
List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<>());
|
MdcSystemParameters mdcSystemParameters = mdcSystemParametersService.getOne(new LambdaQueryWrapper<MdcSystemParameters>().eq(MdcSystemParameters::getCode, "equip_log_statis_time"));
|
if (mdcSystemParameters == null) {
|
throw new JobExecutionException("mdc_system_parameters 表中数据缺失");
|
}
|
String value = mdcSystemParameters.getValue();
|
List<MdcEquipmentOvertime> result = new ArrayList<>();
|
for (MdcEquipment mdcEquipment : equipmentList) {
|
// 获取设备工作日历
|
List<MdcDeviceCalendarVo> 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<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> 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<MdcDeviceCalendarVo> 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);
|
}
|
}
|