package org.jeecg.modules.mdc.job; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.DictModel; import org.jeecg.modules.mdc.constant.MdcConstant; import org.jeecg.modules.mdc.entity.MdcEquipment; import org.jeecg.modules.mdc.entity.MdcMessageApproval; import org.jeecg.modules.mdc.service.IMdcEquipmentRunningSectionService; import org.jeecg.modules.mdc.service.IMdcEquipmentService; import org.jeecg.modules.mdc.service.IMdcMessageApprovalService; import org.jeecg.modules.mdc.service.MdcEfficiencyReportService; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.util.ThrowableUtil; 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.entity.SysAnnouncement; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.service.ISysAnnouncementService; import org.jeecg.modules.system.service.ISysDictService; import org.jeecg.modules.system.service.ISysUserService; import org.quartz.*; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author Lius * @Description: 利用率正常值,设备状态长期无变化报警 * @date 2024/1/17 14:10 */ @Slf4j public class RunningEquipmentStatusJob implements Job { @Resource private IQuartzJobService quartzJobService; @Resource private ISysQuartzLogService sysQuartzLogService; @Resource private ISysAnnouncementService sysAnnouncementService; @Resource private IMdcEquipmentService mdcEquipmentService; @Resource private ISysDictService sysDictService; @Resource private MdcEfficiencyReportService mdcEfficiencyReportService; @Resource private ISysBaseAPI sysBaseApi; @Resource private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService; @Resource private IMdcMessageApprovalService mdcMessageApprovalService; @Resource private ISysUserService sysUserService; @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()); } log.info("设备状态长期无变化报警任务 RunningEquipmentStatusJob start! 时间:" + DateUtils.getNow()); long startTime = System.currentTimeMillis(); try { List equipmentList = mdcEquipmentService.list(); // List equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper().eq(MdcEquipment::getEquipmentId, "3140045")); // 获取利用率判定天数 List dictModelList1 = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_EQUIPMENT_RATE_JUDGE); Integer equipmentRateJudge = 5; if (dictModelList1 != null && !dictModelList1.isEmpty()) { equipmentRateJudge = Integer.valueOf(dictModelList1.get(0).getValue()); } // 获取利用率正常值 List dictModelList2 = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_EQUIPMENT_RATE_NORMAL); Integer equipmentRateNormal = 20; if (dictModelList2 != null && !dictModelList2.isEmpty()) { equipmentRateNormal = Integer.valueOf(dictModelList2.get(0).getValue()); } // 获取设备状态天数 List dictModelList3 = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_EQUIPMENT_SPEED_JUDGE); Integer equipmentStatusJudge = 5; if (dictModelList3 != null && !dictModelList3.isEmpty()) { equipmentStatusJudge = Integer.valueOf(dictModelList3.get(0).getValue()); } Map proNamesByEquipmentIds = mdcEquipmentService.getProNamesByEquipmentIds(equipmentList.stream().map(MdcEquipment::getId).collect(Collectors.toList())); for (MdcEquipment mdcEquipment : equipmentList) { String productionName = proNamesByEquipmentIds.get(mdcEquipment.getId()); // 判断利用率 // step.1 查询消息中此设备报警时间 SysAnnouncement sysAnnouncement = sysAnnouncementService.findLastMessage("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备利用率低于正常值!"); boolean flag1 = true; if (sysAnnouncement != null) { Date createTime = sysAnnouncement.getCreateTime(); Date msgDate = DateUtils.toDate(DateUtils.format(createTime, DateUtils.STR_DATE), DateUtils.STR_DATE); Date now = DateUtils.toDate(LocalDate.now().toString(), DateUtils.STR_DATE); Integer days = DateUtils.getDays(msgDate, now); if (days < equipmentRateJudge) { flag1 = false; } } if (flag1) { String date = DateUtils.format(DateUtils.toDate(LocalDate.now().plusDays(-equipmentRateJudge).toString(), DateUtils.STR_DATE), DateUtils.STRDATE); List efficiencyRateList = mdcEfficiencyReportService.getEfficiencyRate(mdcEquipment.getEquipmentId(), date); if (efficiencyRateList != null && !efficiencyRateList.isEmpty()) { boolean flag = true; for (BigDecimal processLong : efficiencyRateList) { BigDecimal efficiencyRate = processLong.divide(new BigDecimal("86400"), 4, RoundingMode.HALF_UP); if (efficiencyRate.compareTo(new BigDecimal(equipmentRateNormal)) > -1) { flag = false; } } if (flag) { // 上报 MessageDTO messageDTO = new MessageDTO(); messageDTO.setTitle("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备利用率低于正常值!"); messageDTO.setCategory(CommonConstant.MSG_CATEGORY_2); messageDTO.setFromUser("admin"); messageDTO.setToUser("admin"); messageDTO.setContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备利用率低于正常值!"); sysBaseApi.sendSysAnnouncement(messageDTO); } } } // 判断设备状态长时间无变化审批人 SysAnnouncement sysAnnouncement1 = sysAnnouncementService.findLastMessage("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备状态长期无变化!"); if (sysAnnouncement1 != null) { Date createTime = sysAnnouncement1.getCreateTime(); Date msgDate = DateUtils.toDate(DateUtils.format(createTime, DateUtils.STR_DATE), DateUtils.STR_DATE); Date now = DateUtils.toDate(LocalDate.now().toString(), DateUtils.STR_DATE); Integer days = DateUtils.getDays(msgDate, now); if (days < equipmentStatusJudge) { continue; } } Date date1 = DateUtils.toDate(LocalDate.now().plusDays(-equipmentStatusJudge).toString(), DateUtils.STR_DATE); List sectionList = mdcEquipmentRunningSectionService.getDataList(mdcEquipment.getEquipmentId(), date1); if (sectionList != null && !sectionList.isEmpty() && sectionList.size() > 1) { boolean flag = true; Integer integer = sectionList.get(0); for (Integer integer1 : sectionList) { if (!integer.equals(integer1)) { flag = false; } } if (flag) { // 上报 // 查询设备管理员 List adminList = sysUserService.getEquipmentAdmin(MdcConstant.MDC_EQUIPMENT_MANAGER, mdcEquipment.getEquipmentId()); // 查询设备超级管理员 List superList = sysUserService.getEquipmentAdmin(MdcConstant.MDC_EQUIPMENT_SUPER_MANAGER, mdcEquipment.getEquipmentId()); if (adminList != null && !adminList.isEmpty()) { for (SysUser sysUser : adminList) { MessageDTO messageDTO = new MessageDTO(); messageDTO.setTitle("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备状态长期无变化!"); messageDTO.setCategory(CommonConstant.MSG_CATEGORY_2); messageDTO.setFromUser("admin"); messageDTO.setToUser(sysUser.getUsername()); messageDTO.setContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备状态长期无变化!"); sysBaseApi.sendSysAnnouncement(messageDTO); } } else { MessageDTO messageDTO = new MessageDTO(); messageDTO.setTitle("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备状态长期无变化!"); messageDTO.setCategory(CommonConstant.MSG_CATEGORY_2); messageDTO.setFromUser("admin"); messageDTO.setToUser("admin"); messageDTO.setContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备状态长期无变化!"); sysBaseApi.sendSysAnnouncement(messageDTO); } if (adminList != null && !adminList.isEmpty() && superList != null && !superList.isEmpty()) { MdcMessageApproval mdcMessageApproval = new MdcMessageApproval(); mdcMessageApproval.setEquipmentId(mdcEquipment.getEquipmentId()); mdcMessageApproval.setTitile("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备状态长期无变化!"); mdcMessageApproval.setMsgContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备状态长期无变化!"); List senderIdList = adminList.stream().map(SysUser::getId).collect(Collectors.toList()); mdcMessageApproval.setSenderIds(String.join(",", senderIdList)); List senderNameList = adminList.stream().map(SysUser::getRealname).collect(Collectors.toList()); mdcMessageApproval.setSenderNames(String.join(",", senderNameList)); List superIdList = superList.stream().map(SysUser::getId).collect(Collectors.toList()); mdcMessageApproval.setApproverIds(String.join(",", superIdList)); List superNameList = superList.stream().map(SysUser::getRealname).collect(Collectors.toList()); mdcMessageApproval.setApproverNames(String.join(",", superNameList)); mdcMessageApproval.setMsgStatus(MdcConstant.MSG_STATUS_0); mdcMessageApprovalService.save(mdcMessageApproval); } } } } 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); } }