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.entity.*; import org.jeecg.modules.mdc.mapper.MdcProcessCountMapper; import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.util.TimeFieldUtils; 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.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @author Lius * @date 2023/11/23 10:17 */ @Service public class ProcessCountServiceImpl extends ServiceImpl implements IProcessCountService { @Resource private IMdcEquipmentService mdcEquipmentService; @Resource private IMdcDeviceCalendarService mdcDeviceCalendarService; @Resource private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService; @Resource private IMdcEquipmentOverFlagService mdcEquipmentOverFlagService; @Resource private IEquipmentWorkLineService equipmentWorkLineService; /** * 计算加工工件个数和时间任务 */ @Override @Transactional(rollbackFor = {Exception.class}) public void runningProcessCount() { // 获取所有设备 List mdcEquipmentList = mdcEquipmentService.list(new LambdaQueryWrapper().eq(MdcEquipment::getEquipmentId, "2140244")); List result = new ArrayList<>(); for (MdcEquipment mdcEquipment : mdcEquipmentList) { List mdcProcessCountList = processCount(mdcEquipment); if (mdcProcessCountList != null && !mdcProcessCountList.isEmpty()) { result.addAll(mdcProcessCountList); } } if (!result.isEmpty()) { this.saveBatch(result); } } @Transactional(readOnly = true) List processCount(MdcEquipment mdcEquipment) { Date initDate = null; //取最后的统计数据 MdcProcessCount lastData = this.baseMapper.getLastData(mdcEquipment.getEquipmentId()); Boolean flag = true; if (lastData != null) { initDate = DateUtils.toDate(lastData.getTheDate(), DateUtils.STRDATE); initDate = DateUtils.plusTime(initDate, 1); } else { //初次取值 取最早时间 MdcDeviceCalendar mdcDeviceCalendar = mdcDeviceCalendarService.getFirstData(mdcEquipment.getEquipmentId()); if (mdcDeviceCalendar != null) { initDate = DateUtils.toDate(mdcDeviceCalendar.getEffectiveDate(), DateUtils.STRDATE); } } 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(mdcEquipment.getEquipmentId(), stringDates); if (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; } for (MdcShiftDateVo mdcShiftDateVo : datesListByMdcDeviceCalendarVo) { Date startDate = null; //处理数据 //List result = new ArrayList<>(); // 查询班次内设备运行状态时间段 List equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), mdcShiftDateVo.getStartDate(), mdcShiftDateVo.getEndDate()); if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) { // 时间修正 equipmentRunningSectionList.get(0).setStartTime(mdcShiftDateVo.getStartDate()); if (equipmentRunningSectionList.size() > 1) { equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(mdcShiftDateVo.getEndDate()); } else { equipmentRunningSectionList.get(0).setEndTime(mdcShiftDateVo.getEndDate()); } if (!"FANUC".equals(mdcEquipment.getDriveType())) { MdcEquipmentOverFlag equipmentOverFlag = mdcEquipmentOverFlagService.getOne(new LambdaQueryWrapper().eq(MdcEquipmentOverFlag::getDriveType, mdcEquipment.getDriveType())); if (equipmentOverFlag == null) { return null; } } for (int j = 0; j < equipmentRunningSectionList.size(); j++) { MdcEquipmentRunningSection mdcEquipmentRunningSection = equipmentRunningSectionList.get(j); // 查找设备单表运行数据 List> mdcEquipmentDtoList = equipmentWorkLineService.findRunningData(mdcEquipment.getSaveTableName(), mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime()); if (mdcEquipmentDtoList == null || mdcEquipmentDtoList.isEmpty()) { continue; } MdcProcessCount mdcProcessCount = new MdcProcessCount(); mdcProcessCount.setEquipmentId(mdcEquipment.getEquipmentId()); mdcProcessCount.setEquipmentName(mdcEquipment.getEquipmentName()); mdcProcessCount.setTheDate(mdcShiftDateVo.getDay()); if (lastData != null && flag) { mdcProcessCount.setStartTime(lastData.getEndTime()); startDate = mdcProcessCount.getStartTime(); flag = false; } else if (startDate == null) { mdcProcessCount.setStartTime(mdcEquipmentRunningSection.getStartTime()); startDate = mdcProcessCount.getStartTime(); } else { mdcProcessCount.setStartTime(startDate); } if ("FANUC".equals(mdcEquipment.getDriveType())) { // 法兰克设备根据ProductCount字段判断 String productCount = mdcEquipmentDtoList.get(0).get("ProductCount").toString(); for (int i = 0; i < mdcEquipmentDtoList.size(); i++) { if (!productCount.equals(mdcEquipmentDtoList.get(i).get("ProductCount").toString())) { productCount = mdcEquipmentDtoList.get(i).get("ProductCount").toString(); if (mdcEquipmentDtoList.get(i - 1).get("CollectTime") != null) { mdcProcessCount.setEndTime(DateUtils.toDate(mdcEquipmentDtoList.get(i - 1).get("CollectTime").toString(), DateUtils.STR_DATE_TIME)); mdcProcessCount.setDuration(TimeFieldUtils.duration(mdcProcessCount.getStartTime(), mdcProcessCount.getEndTime())); mdcProcessCount.setSequenceNumber(mdcEquipmentDtoList.get(i - 1).get("Sequencenumber").toString()); resultList.add(mdcProcessCount); if (TimeFieldUtils.duration(mdcProcessCount.getEndTime(), mdcEquipmentRunningSection.getEndTime()) > 60) { //mdcProcessCount.setStartTime(mdcProcessCount.getEndTime()); startDate = mdcProcessCount.getEndTime(); } else if (j + 1 < equipmentRunningSectionList.size()) { //mdcProcessCount.setStartTime(equipmentRunningSectionList.get(j + 1).getStartTime()); startDate = equipmentRunningSectionList.get(j + 1).getStartTime(); } else { startDate = null; } } } } } } } } } } } return resultList; } 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 overtimeStartTime = temp.getOvertimeStartTime(); String overtimeEndTime = temp.getOvertimeEndTime(); 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); } // 处理加班时间 if (StringUtils.isNotEmpty(overtimeStartTime)) { Date start = DateUtils.getFormatDate(eff + " " + overtimeStartTime, DateUtils.STR_DATE_TIME_SMALL); Date end = DateUtils.getFormatDate(eff + " " + overtimeEndTime, DateUtils.STR_DATE_TIME_SMALL); if ("true".equals(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; } private Map> mdcDeviceCalendarMap(String equipmentId, List stringDates) { List mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentAndDate(equipmentId, stringDates); if (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(); } }