package org.jeecg.modules.mdc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang.StringUtils; import org.jeecg.modules.mdc.dto.MdcEquipmentStatisticalDto; import org.jeecg.modules.mdc.entity.Equipment; import org.jeecg.modules.mdc.entity.MdcEquipmentRepair; import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection; import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalShiftInfo; import org.jeecg.modules.mdc.mapper.MdcEquipmentStatisticalShiftInfoMapper; import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.vo.MdcDateVo; import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo; import org.jeecg.modules.mdc.vo.MdcShiftDateVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @Description: 设备单日班次运行数据表 * @author: LiuS * @create: 2023-07-24 11:19 */ @Service public class MdcEquipmentStatisticalShiftInfoServiceImpl extends ServiceImpl implements IMdcEquipmentStatisticalShiftInfoService { @Resource private IEquipmentService equipmentService; @Resource private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService; @Resource private IMdcDeviceCalendarService mdcDeviceCalendarService; @Resource private IMdcEquipmentRepairService mdcEquipmentRepairService; /** * 计算设备单日班次运行数据 * * @param dateTime */ @Override @Transactional(rollbackFor = {Exception.class}) public void runningAllEquipmentShiftStatisticalProcess(String dateTime) { if (StringUtils.isNotBlank(dateTime)) { try { Date initDate = DateUtils.toDate(dateTime, "yyyyMMdd"); if (initDate != null) { this.remove(new LambdaQueryWrapper().eq(MdcEquipmentStatisticalShiftInfo::getTheDate, dateTime)); } } catch (Exception e) { log.error("参数格式不对", e); } } List equipmentList = equipmentService.list(); List result = new ArrayList<>(); for (Equipment equipment : equipmentList) { List equipmentStatisticalShiftInfoList = equipmentShiftStatisticalProcess(equipment, dateTime); if (equipmentStatisticalShiftInfoList != null && !equipmentStatisticalShiftInfoList.isEmpty()) { result.addAll(equipmentStatisticalShiftInfoList); } } if (!result.isEmpty()) { this.saveBatch(result); } } /** * 查询主轴运行时间 * * @param equipmentId * @param validDate * @return */ @Override public BigDecimal findSpindleRunDuration(String equipmentId, String validDate) { validDate = validDate.replaceAll("-", ""); BigDecimal duration = this.baseMapper.findSpindleRunDuration(equipmentId, validDate); if (duration != null && duration.compareTo(BigDecimal.ZERO) != 0) { return duration.divide(new BigDecimal("60"), 0, RoundingMode.HALF_UP); } else { return new BigDecimal("0"); } } @Override public MdcEquipmentStatisticalDto findByEquipmentAndMonth(String equipmentId, String date) { return this.baseMapper.findByEquipmentAndMonth(equipmentId, date); } @Transactional(readOnly = true) public List equipmentShiftStatisticalProcess(Equipment equipment, String dateTime) { Date initDate = null; //取最后的统计数据 if (StringUtils.isBlank(dateTime)) { MdcEquipmentStatisticalShiftInfo nearestDate = this.baseMapper.getMaxStaticsData(equipment.getEquipmentid()); if (nearestDate != null) { initDate = DateUtils.toDate(nearestDate.getTheDate(), "yyyyMMdd"); initDate = DateUtils.plusTime(initDate, 1); } else { //初次取值 取最早时间 MdcEquipmentRunningSection equipmentRunningSection = mdcEquipmentRunningSectionService.getFirstData(equipment.getEquipmentid()); if (equipmentRunningSection != null) { initDate = equipmentRunningSection.getStartTime(); } } } else { try { initDate = DateUtils.toDate(dateTime, "yyyyMMdd"); initDate = DateUtils.plusTime(initDate, 0); } catch (Exception e) { log.error("参数格式不对", null); return null; } } if (initDate == null) { return null; } Date endDate = DateUtils.plusTime(DateUtils.getNow(), 0); if (!DateUtils.less(initDate, endDate)) { return Collections.emptyList(); } //获取两个时间段的差 List stringDates = DateUtils.getDatesStringList2(initDate, DateUtils.plusTime(endDate, -1)); if (stringDates.isEmpty()) { return Collections.emptyList(); } //查询班制班次信息 Map> listMap = this.mdcDeviceCalendarMap(equipment.getEquipmentid(), stringDates); if (listMap == null || listMap.isEmpty()) { listMap = new HashMap<>(); } List resultList = new ArrayList<>(); for (String stringDate : stringDates) { if (listMap.containsKey(stringDate)) { List mdcDeviceCalendarVos = listMap.get(stringDate); for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) { //班制班次时间集合 List datesListByMdcDeviceCalendarVo = this.getDatesListByMdcDeviceCalendarVo(mdcDeviceCalendarVo); if (datesListByMdcDeviceCalendarVo == null || datesListByMdcDeviceCalendarVo.isEmpty()) { break; } //合并 MdcEquipmentStatisticalShiftInfo equipmentStatisticalShiftInfo = new MdcEquipmentStatisticalShiftInfo(); equipmentStatisticalShiftInfo.setEquipmentId(equipment.getEquipmentid()); //处理时间 Date date = DateUtils.strToDate(stringDate, DateUtils.STRDATE); equipmentStatisticalShiftInfo.setTheDate(DateUtils.format(date, DateUtils.STRDATE)); equipmentStatisticalShiftInfo.setShiftId(mdcDeviceCalendarVo.getShiftId()); equipmentStatisticalShiftInfo.setShiftSubId(mdcDeviceCalendarVo.getShiftSubId()); equipmentStatisticalShiftInfo.setCreateTime(new Date()); for (MdcShiftDateVo dates : datesListByMdcDeviceCalendarVo) { //处理数据 MdcEquipmentStatisticalShiftInfo shiftInfo = this.selectRunningEquipment(dates, equipment.getEquipmentid()); equipmentStatisticalShiftInfo.setWaitLong(equipmentStatisticalShiftInfo.getWaitLong().add(shiftInfo.getWaitLong())); equipmentStatisticalShiftInfo.setProcessLong(equipmentStatisticalShiftInfo.getProcessLong().add(shiftInfo.getProcessLong())); equipmentStatisticalShiftInfo.setCloseLong(equipmentStatisticalShiftInfo.getCloseLong().add(shiftInfo.getCloseLong())); equipmentStatisticalShiftInfo.setOpenLong(equipmentStatisticalShiftInfo.getOpenLong().add(shiftInfo.getOpenLong())); equipmentStatisticalShiftInfo.setErrorLong(equipmentStatisticalShiftInfo.getErrorLong().add(shiftInfo.getErrorLong())); equipmentStatisticalShiftInfo.setTotalLong(equipmentStatisticalShiftInfo.getTotalLong().add(shiftInfo.getTotalLong())); } resultList.add(equipmentStatisticalShiftInfo); } } } return resultList; } /** * 查询某一天某个班次的数据 * * @param dates * @param equipmentid * @return */ private MdcEquipmentStatisticalShiftInfo selectRunningEquipment(MdcShiftDateVo dates, String equipmentid) { if (dates == null || StringUtils.isBlank(equipmentid)) { return null; } //查询是否需要维修的设备 List repairs = mdcEquipmentRepairService.mdcRepairListDate(equipmentid, dates.getStartDate(), dates.getEndDate()); //制度时间段内的休班和维修时间段筛选 List repairList = this.findSubRepairs(repairs, dates); List dateList = new ArrayList<>(); if (repairList == null || repairList.isEmpty()) { //制度时间段内没有维修和休班时间段 MdcEquipmentStatisticalShiftInfo shiftInfo = mdcRateEquipment(equipmentid, dates.getStartDate(), dates.getEndDate()); return shiftInfo; } else { if (repairList.size() == 1) { long start = repairList.get(0).getStartTime().getTime(); long end = repairList.get(0).getEndTime().getTime(); if (start > dates.getStart() && end < dates.getEnd()) { MdcDateVo d1 = new MdcDateVo(); d1.setStartTime(dates.getStartDate()); d1.setEndTime(repairList.get(0).getStartTime()); dateList.add(d1); MdcDateVo d2 = new MdcDateVo(); d2.setStartTime(repairList.get(0).getEndTime()); d2.setEndTime(dates.getEndDate()); dateList.add(d2); } else if (start == dates.getStart() && end < dates.getEnd()) { MdcDateVo d2 = new MdcDateVo(); d2.setStartTime(repairList.get(0).getEndTime()); d2.setEndTime(dates.getEndDate()); dateList.add(d2); } else if (start > dates.getStart() && end == dates.getEnd()) { MdcDateVo d1 = new MdcDateVo(); d1.setStartTime(dates.getStartDate()); d1.setEndTime(repairList.get(0).getStartTime()); dateList.add(d1); } else { //休班 MdcEquipmentStatisticalShiftInfo vo = new MdcEquipmentStatisticalShiftInfo(); vo.setTotalLong(BigDecimal.ZERO); vo.setErrorLong(BigDecimal.ZERO); vo.setProcessLong(BigDecimal.ZERO); vo.setWaitLong(BigDecimal.ZERO); vo.setCloseLong(BigDecimal.ZERO); vo.setOpenLong(BigDecimal.ZERO); return vo; } } else { long s = dates.getStartDate().getTime(); for (int i = 0; i < repairList.size(); i++) { long start = repairList.get(i).getStartTime().getTime(); long end = repairList.get(i).getEndTime().getTime(); if (start > s) { MdcDateVo d = new MdcDateVo(); d.setStartTime(dates.getStartDate()); d.setEndTime(repairList.get(i).getStartTime()); if (d.getEndTime().getTime() != d.getStartTime().getTime()) { dateList.add(d); } dates.setStartDate(repairList.get(i).getEndTime()); } else if (start == s) { dates.setStartDate(repairList.get(i).getEndTime()); } if (i == repairList.size() - 1) { if (dates.getStartDate().getTime() >= end) { MdcDateVo d = new MdcDateVo(); d.setStartTime(repairList.get(i).getEndTime()); d.setEndTime(dates.getEndDate()); if (d.getEndTime().getTime() != d.getStartTime().getTime()) { dateList.add(d); } } } } } } MdcEquipmentStatisticalShiftInfo shiftInfo = new MdcEquipmentStatisticalShiftInfo(); for (MdcDateVo date : dateList) { MdcEquipmentStatisticalShiftInfo v = mdcRateEquipment(equipmentid, date.getStartTime(), date.getEndTime()); shiftInfo.setTotalLong(v.getTotalLong().add(shiftInfo.getTotalLong())); shiftInfo.setOpenLong(v.getOpenLong().add(shiftInfo.getOpenLong())); shiftInfo.setCloseLong(v.getCloseLong().add(shiftInfo.getCloseLong())); shiftInfo.setWaitLong(v.getWaitLong().add(shiftInfo.getWaitLong())); shiftInfo.setProcessLong(v.getProcessLong().add(shiftInfo.getProcessLong())); shiftInfo.setErrorLong(v.getErrorLong().add(shiftInfo.getErrorLong())); } return shiftInfo; } private MdcEquipmentStatisticalShiftInfo mdcRateEquipment(String equipmentid, Date startDate, Date endDate) { MdcDateVo date = new MdcDateVo(); date.setStartTime(startDate); date.setEndTime(endDate); List runningSections = new ArrayList<>(); runningSections = mdcEquipmentRunningSectionService.listEquipmentRunningSectionRun(equipmentid, startDate.getTime(), endDate.getTime()); //查询如果无数据需要 EquipmentLog 解析 if (runningSections == null || runningSections.isEmpty()) { runningSections = mdcEquipmentRunningSectionService.listRunningSectionFromLog(equipmentid, startDate.getTime(), endDate.getTime()); } if (runningSections == null || runningSections.isEmpty()) { runningSections = new ArrayList<>(); } List sectionErrors = mdcEquipmentRunningSectionService.listEquipmentRunningSectionError(equipmentid, startDate.getTime(), endDate.getTime()); // 排除基础配置报警号(基础配置报警号的不算报警) //sectionErrors = filterSectionErrors(equipmentId, sectionErrors); MdcEquipmentStatisticalShiftInfo shiftInfo = new MdcEquipmentStatisticalShiftInfo(); BigDecimal totalLongRairs = new BigDecimal("0"); List sectionList = findStatsEquipment(null, runningSections, date, sectionErrors); if (sectionList == null || sectionList.isEmpty()) { shiftInfo.setEquipmentId(equipmentid); return shiftInfo; } List runs = new ArrayList<>(); List errs = new ArrayList<>(); for (MdcEquipmentRunningSection section : sectionList) { if (section.getStatus() == 22 || section.getStatus() == 0) { errs.add(section); } if (section.getStatus() == 3) { runs.add(section); } } // 及总工时 => 有效时长减 BigDecimal totalLong = new BigDecimal(DateUtils.getSeconds(startDate, endDate)).subtract(totalLongRairs); // 计算加工 BigDecimal processLong = new BigDecimal("0"); if (runs != null && !runs.isEmpty()) { processLong = processLongInfo(runs); } // 关机数据 List closes = errs.stream().filter(section -> section.getStatus() != 22).collect(Collectors.toList()); // 关机时长 BigDecimal closeLong = new BigDecimal("0"); closeLong = closeLong(closes); /*故障时间 errs => 关机数据 + 报警数据 */ BigDecimal faultLong = new BigDecimal("0"); faultLong = faultLongInfo(errs); //报警数据 List alarms = errs.stream().filter(section -> section.getStatus() == 22).collect(Collectors.toList()); //报警时长 BigDecimal alarmLong = new BigDecimal("0"); alarmLong = alarmLong(alarms); //待机时长 => 有效时长 - 运行时长 - 报警时长 BigDecimal waitLong = totalLong.subtract(processLong).subtract(alarmLong); if (waitLong.compareTo(BigDecimal.ZERO) < 0) { waitLong = new BigDecimal("0"); } // 开机时长 => 有效时长 - 关机时长 BigDecimal openLong = totalLong.subtract(closeLong); if (openLong.compareTo(BigDecimal.ZERO) < 0) { openLong = new BigDecimal("0"); } shiftInfo.setProcessLong(processLong); shiftInfo.setTotalLong(totalLong); shiftInfo.setWaitLong(waitLong); shiftInfo.setErrorLong(alarmLong); shiftInfo.setCloseLong(closeLong); shiftInfo.setOpenLong(openLong); return shiftInfo; } /** * 统计关机时长 */ private BigDecimal closeLong(List closes) { BigDecimal closeLong = new BigDecimal("0"); for (MdcEquipmentRunningSection alarm : closes) { closeLong = closeLong.add(new BigDecimal(alarm.getDuration())); } return closeLong; } /** * 统计报警时长 */ private BigDecimal alarmLong(List alarms) { BigDecimal alarmLong = new BigDecimal("0"); for (MdcEquipmentRunningSection alarm : alarms) { alarmLong = alarmLong.add(new BigDecimal(alarm.getDuration())); } return alarmLong; } /** * 统计故障时长 */ private BigDecimal faultLongInfo(List errs) { BigDecimal faultLong = new BigDecimal("0"); for (MdcEquipmentRunningSection e : errs) { faultLong = faultLong.add(new BigDecimal(e.getDuration())); } return faultLong; } /** * 统计加工时长 */ private BigDecimal processLongInfo(List runs) { BigDecimal processLong = new BigDecimal("0"); for (MdcEquipmentRunningSection se : runs) { if (se.getStatus() == 3) { processLong = processLong.add(new BigDecimal(se.getDuration())); } } return processLong; } private List findStatsEquipment(List repairs, List sRun, MdcDateVo mdcDate, List errors) { if (sRun == null || sRun.isEmpty()) { //无数据处理 //TODO return null; } Long startMdc = mdcDate.getStartTime().getTime(); Long endMdc = mdcDate.getEndTime().getTime(); if (sRun != null && !sRun.isEmpty()) { for (int i = 0; i < sRun.size(); i++) { Long start = sRun.get(i).getStartTime().getTime(); Long end = sRun.get(i).getEndTime().getTime(); if (startMdc <= start) { sRun.get(i).setStartTime(sRun.get(i).getStartTime()); } else { sRun.get(i).setStartTime(mdcDate.getStartTime()); } if (endMdc >= end) { sRun.get(i).setEndTime(sRun.get(i).getEndTime()); } else { sRun.get(i).setEndTime(mdcDate.getEndTime()); } Long sen = DateUtils.differentSecond(sRun.get(i).getStartTime(), sRun.get(i).getEndTime()); if (sen <= 0) { sRun.remove(i); i--; } else { sRun.get(i).setDuration(sen); sRun.get(i).setStartLong(sRun.get(i).getStartTime().getTime()); sRun.get(i).setEndLong(sRun.get(i).getEndTime().getTime()); } } } //部分数据是维修 1、运行状态下报警情况 List faultRun = new ArrayList<>(); //制度时间段内报警数据 if (errors != null && !errors.isEmpty()) { for (int i = 0; i < errors.size(); i++) { Long start = errors.get(i).getStartTime().getTime(); Long end = errors.get(i).getEndTime().getTime(); if (startMdc <= start) { errors.get(i).setStartTime(errors.get(i).getStartTime()); } else { errors.get(i).setStartTime(mdcDate.getStartTime()); } if (endMdc >= end) { errors.get(i).setEndTime(errors.get(i).getEndTime()); } else { errors.get(i).setEndTime(mdcDate.getEndTime()); } Long sen = DateUtils.differentSecond(errors.get(i).getStartTime(), errors.get(i).getEndTime()); if (sen <= 0) { errors.remove(i); i--; } else { errors.get(i).setDuration(sen); errors.get(i).setStartLong(errors.get(i).getStartTime().getTime()); errors.get(i).setEndLong(errors.get(i).getEndTime().getTime()); } } //把运行中存在的报警剔除掉 for (MdcEquipmentRunningSection se : sRun) { long runStart = se.getStartTime().getTime(); long runEnd = se.getEndTime().getTime(); if (se.getStatus() == 3) { if (errors != null && !errors.isEmpty()) { //处理报警数据 for (int i = 0; i < errors.size(); i++) { long errStart = errors.get(i).getStartTime().getTime(); long errEnd = errors.get(i).getEndTime().getTime(); // 报警开始 小于 运行开始 报警结束 小于运行结束 报警结束 大于 运行开始 if (errStart < runStart && errEnd <= runEnd && errEnd > runStart) { errors.get(i).setEndTime(se.getStartTime()); Long sen = DateUtils.differentSecond(errors.get(i).getStartTime(), errors.get(i).getEndTime()); errors.get(i).setDuration(sen); errors.get(i).setStartLong(errors.get(i).getStartTime().getTime()); errors.get(i).setEndLong(errors.get(i).getEndTime().getTime()); } // 报警开始 大于 运行开始 , 报警开始 小于 运行结束 ,报警结束 大于 运行结束 else if (errStart >= runStart && errStart < runEnd && errEnd > runEnd) { errors.get(i).setStartTime(se.getEndTime()); Long sen = DateUtils.differentSecond(errors.get(i).getStartTime(), errors.get(i).getEndTime()); errors.get(i).setDuration(sen); errors.get(i).setStartLong(errors.get(i).getStartTime().getTime()); errors.get(i).setEndLong(errors.get(i).getEndTime().getTime()); } // 报警开始 大于 运行开始 , 报警开始 小于 运行结束 ,报警结束 大于 运行开始,报警结束 小于 运行结束 else if (errStart >= runStart && errStart < runEnd && errEnd > runStart && errEnd <= runEnd) { errors.remove(i); i--; } //如果超出范围 else if (errStart <= runStart && errStart < runEnd && errEnd > runStart && errEnd >= runEnd) { MdcEquipmentRunningSection errOne = new MdcEquipmentRunningSection(); errOne.setEndTime(errors.get(i).getEndTime()); errors.get(i).setStartTime(errors.get(i).getStartTime()); errors.get(i).setEndTime(se.getStartTime()); Long sen = DateUtils.differentSecond(errors.get(i).getStartTime(), errors.get(i).getEndTime()); // //TODO errOne.setStatus(22); errOne.setEquipmentId(errors.get(i).getEquipmentId()); errOne.setStartTime(se.getEndTime()); errors.get(i).setDuration(sen); errors.get(i).setStartLong(errors.get(i).getStartTime().getTime()); errors.get(i).setEndLong(errors.get(i).getEndTime().getTime()); Long one = DateUtils.differentSecond(errOne.getStartTime(), errOne.getEndTime()); errOne.setDuration(one); errOne.setStartLong(errOne.getStartTime().getTime()); errOne.setEndLong(errOne.getEndTime().getTime()); if (sen <= 0) { errors.remove(i); errors.add(i, errOne); } else { errors.add(i + 1, errOne); i++; } } else { continue; } } } } } } //处理报警数据 List sectionList = new ArrayList<>(); if (sRun != null && !sRun.isEmpty()) { for (MdcEquipmentRunningSection se : sRun) { sectionList.add(se); } } //报警剔除运行报警 if (errors != null && !errors.isEmpty()) { sectionList.addAll(errors); } //关机处理为故障报警 if (faultRun != null && !faultRun.isEmpty()) { sectionList.addAll(faultRun); } return sectionList; } private List findSubRepairs(List repairs, MdcShiftDateVo dates) { if (repairs == null || repairs.isEmpty() || dates == null) { return null; } for (MdcEquipmentRepair repair : repairs) { //调整 Date start = null; Date end = null; long dStart = dates.getStartDate().getTime(); long dEnd = dates.getEndDate().getTime(); long rStart = repair.getStartTime().getTime(); long rEnd = repair.getEndTime().getTime(); if (rStart <= dStart && rEnd >= dStart && rEnd <= dEnd) { start = dates.getStartDate(); end = repair.getEndTime(); } else if (rStart >= dStart && rEnd <= dEnd) { start = repair.getStartTime(); end = repair.getEndTime(); } else if (rStart >= dStart && rStart <= dEnd && rEnd >= dEnd) { start = repair.getStartTime(); end = dates.getEndDate(); } else if (rStart <= dStart && rEnd >= dEnd) { start = dates.getStartDate(); end = dates.getEndDate(); } repair.setStartTime(start); repair.setEndTime(end); //处理异常数据 if (start == null || end == null) { repair.setSecondLong(0); } else { try { repair.setSecondLong(DateUtils.getSeconds(start, end)); } catch (Exception e) { repair.setSecondLong(0); } } } for (int i = 0; i < repairs.size(); i++) { if (repairs.get(i).getStartTime() == null || repairs.get(i).getEndTime() == null || repairs.get(i).getSecondLong() == 0) { repairs.remove(i); i--; } } return repairs; } /** * 时间问题处理 如果当天最末尾时间大于当前时间 返回0 * * @param temp * @return */ private List getDatesListByMdcDeviceCalendarVo(MdcDeviceCalendarVo temp) { List result = new ArrayList<>(); String startDateStr = temp.getStartDate(); String endDateStr = temp.getEndDate(); String sleepStartDateStr = temp.getSleepStartDate(); String sleepEndDateStr = temp.getSleepEndDate(); String effectiveDateStr = temp.getEffectiveDate(); String eff = DateUtils.format(DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE), DateUtils.STR_DATE); try { Date effectiveDate = new SimpleDateFormat("yyyyMMdd").parse(effectiveDateStr); long startDate = getLongDate(effectiveDate, startDateStr, "false"); long endDate = getLongDate(effectiveDate, endDateStr, temp.getIsDaySpan()); //处理最后的时间问题 是否超过当前时间 如果超过不列入计算 BUG Date endTime = null; if ("true".equals(temp.getIsDaySpan())) { Date day = DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE); day = DateUtils.plusTime(day, 1); String dayTime = DateUtils.format(day, DateUtils.STR_DATE); endTime = DateUtils.toDate(dayTime + " " + temp.getEndDate(), DateUtils.STR_DATE_TIME_SMALL); } else { Date day = DateUtils.toDate(effectiveDateStr, DateUtils.STRDATE); String dayTime = DateUtils.format(day, DateUtils.STR_DATE); endTime = DateUtils.toDate(dayTime + " " + temp.getEndDate(), DateUtils.STR_DATE_TIME_SMALL); } if (endTime.getTime() > DateUtils.getNow().getTime()) { return null; } if (StringUtils.isNotEmpty(sleepStartDateStr)) { long sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, "false"); long sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, "false"); Date start1 = DateUtils.getFormatDate(eff + " " + startDateStr, DateUtils.STR_DATE_TIME_SMALL); Date end1 = DateUtils.getFormatDate(eff + " " + sleepStartDateStr, DateUtils.STR_DATE_TIME_SMALL); Date start2 = DateUtils.getFormatDate(eff + " " + sleepEndDateStr, DateUtils.STR_DATE_TIME_SMALL); Date end2 = DateUtils.getFormatDate(eff + " " + endDateStr, DateUtils.STR_DATE_TIME_SMALL); if ("true".equals(temp.getIsDaySpan())) { //跨天 判断班次开始时间和结束时间是否跨天 if (startDateStr.compareTo(endDateStr) < 0) { //班次开始时间和结束时间都跨天 startDate = getLongDate(effectiveDate, startDateStr, temp.getIsDaySpan()); start1 = DateUtils.addDays(start1, 1); end2 = DateUtils.addDays(end2, 1); //班次开始时间和结束时间都跨天 休息开始时间和结束时间也一定跨天 sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, temp.getIsDaySpan()); end1 = DateUtils.addDays(end1, 1); sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan()); start2 = DateUtils.addDays(start2, 1); } else { //班次开始时间不跨天, 结束时间跨天 end2 = DateUtils.addDays(end2, 1); //判断休息开始时间是否跨天 if (startDateStr.compareTo(sleepStartDateStr) > 0) { //开始休息时间跨天, 结束休息时间也一定跨天 sleepStartDate = getLongDate(effectiveDate, sleepStartDateStr, temp.getIsDaySpan()); end1 = DateUtils.addDays(end1, 1); sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan()); start2 = DateUtils.addDays(start2, 1); } else { //休息开始时间不跨天, 判断休息结束时间是否跨天 if (sleepStartDateStr.compareTo(sleepEndDateStr) > 0) { //休息结束时间跨天 sleepEndDate = getLongDate(effectiveDate, sleepEndDateStr, temp.getIsDaySpan()); start2 = DateUtils.addDays(start2, 1); } } } } MdcShiftDateVo dates1 = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, sleepStartDate, effectiveDateStr, endTime, start1, end1); result.add(dates1); MdcShiftDateVo dates2 = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), sleepEndDate, endDate, effectiveDateStr, endTime, start2, end2); result.add(dates2); } else { /*获取班次的开始时间结束时间*/ Date start = DateUtils.getFormatDate(eff + " " + startDateStr, DateUtils.STR_DATE_TIME_SMALL); Date end = DateUtils.getFormatDate(eff + " " + endDateStr, DateUtils.STR_DATE_TIME_SMALL); if ("true".equals(temp.getIsDaySpan())) { if (startDateStr.compareTo(endDateStr) < 0) { startDate = getLongDate(effectiveDate, startDateStr, temp.getIsDaySpan()); start = DateUtils.addDays(start, 1); } end = DateUtils.addDays(end, 1); } MdcShiftDateVo dates = new MdcShiftDateVo(temp.getShiftId(), temp.getShiftSubId(), startDate, endDate, effectiveDateStr, endTime, start, end); result.add(dates); } } catch (ParseException e) { e.printStackTrace(); } return result; } /** * 设备班次转换 * * @param equipmentid * @param stringDates * @return */ private Map> mdcDeviceCalendarMap(String equipmentid, List stringDates) { List mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentAndDate(equipmentid, stringDates); if (mdcDeviceCalendarVos == null || mdcDeviceCalendarVos.isEmpty()) { return null; } Map> map = new HashMap<>(); for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) { List mdcDeviceCalendarVos1; if (map.containsKey(mdcDeviceCalendarVo.getEffectiveDate())) { mdcDeviceCalendarVos1 = map.get(mdcDeviceCalendarVo.getEffectiveDate()); } else { mdcDeviceCalendarVos1 = new ArrayList<>(); } mdcDeviceCalendarVos1.add(mdcDeviceCalendarVo); map.put(mdcDeviceCalendarVo.getEffectiveDate(), mdcDeviceCalendarVos1); } return map; } private long getLongDate(Date effectiveDate, String startDateStr, String isDaySpan) { String[] startDateArray = startDateStr.split(":"); Calendar cal = Calendar.getInstance(); cal.setTime(effectiveDate); cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startDateArray[0])); cal.set(Calendar.MINUTE, Integer.parseInt(startDateArray[1])); cal.set(Calendar.SECOND, Integer.parseInt(startDateArray[2])); if ("true".equals(isDaySpan)) { cal.add(Calendar.DAY_OF_YEAR, 1); } return cal.getTime().getTime(); } }