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.MdcEquipmentDto; import org.jeecg.modules.mdc.dto.MdcProcessCountDto; import org.jeecg.modules.mdc.entity.MdcEquipment; import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection; import org.jeecg.modules.mdc.entity.MdcProcessCount; 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.MdcDateVo; import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo; import org.jeecg.modules.mdc.vo.MdcProcessCountVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.time.LocalDate; 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, "2140198")); List mdcEquipmentList = mdcEquipmentService.list(new LambdaQueryWrapper().eq(MdcEquipment::getDriveType, "FANUC")); 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); } } /** * 分页查询 * * @param userId * @param page * @param mdcProcessCountVo * @param req * @return */ @Override public List pageList(String userId, MdcProcessCountVo mdcProcessCountVo, HttpServletRequest req) { List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(mdcProcessCountVo.getParentId()) && StringUtils.isEmpty(mdcProcessCountVo.getEquipmentId())) { if ("2".equals(mdcProcessCountVo.getTypeTree())) { //部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, mdcProcessCountVo.getParentId()); } else { //产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, mdcProcessCountVo.getParentId()); } } else if (StringUtils.isNotEmpty(mdcProcessCountVo.getEquipmentId())) { //单台设备信息 mdcProcessCountVo.setMdcSectionIds(Collections.singletonList(mdcProcessCountVo.getEquipmentId())); } else { //查询用户拥有的所有设备信息 if ("2".equals(mdcProcessCountVo.getTypeTree())) { //部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { //产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (mdcProcessCountVo.getMdcSectionIds() == null || mdcProcessCountVo.getMdcSectionIds().isEmpty()) { mdcProcessCountVo.setMdcSectionIds(equipmentIds); } if (mdcProcessCountVo.getMdcSectionIds() == null || mdcProcessCountVo.getMdcSectionIds().isEmpty()) { return null; } return this.baseMapper.pageList(mdcProcessCountVo); } @Override public BigDecimal findDuration(String equipmentId, String validDate) { BigDecimal result = this.baseMapper.findDuration(equipmentId, validDate.replaceAll("-", "")); return result == null ? BigDecimal.ZERO : result; } @Override public BigDecimal findCount(String equipmentId, String validDate) { BigDecimal result = this.baseMapper.findCount(equipmentId, validDate.replaceAll("-", "")); return result == null ? BigDecimal.ZERO : result; } List processCount(MdcEquipment mdcEquipment) { Date initDate = null; //取最后的统计数据 MdcProcessCount lastData = this.baseMapper.getLastData(mdcEquipment.getEquipmentId()); if (lastData != null) { initDate = DateUtils.toDate(lastData.getTheDate(), DateUtils.STRDATE); initDate = DateUtils.plusTime(initDate, 1); } else { //初次取值 取当前时间往前推一个月时间 // MdcDeviceCalendar mdcDeviceCalendar = mdcDeviceCalendarService.getFirstData(mdcEquipment.getEquipmentId()); initDate = DateUtils.toDate(LocalDate.now().plusMonths(-1).toString(), DateUtils.STR_DATE); } 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 == null || listMap.isEmpty()) { return null; } List resultList = new ArrayList<>(); for (String stringDate : stringDates) { if (listMap.containsKey(stringDate)) { List mdcDeviceCalendarVos = listMap.get(stringDate); // 处理班制班次时间 MdcDateVo mdcDateVo = this.handleDeviceCalendar(mdcDeviceCalendarVos); // 查找设备单表运行数据 List productCountList = new ArrayList<>(); try { productCountList = equipmentWorkLineService.findRunningData(mdcEquipment.getSaveTableName(), mdcDateVo.getStartTime(), mdcDateVo.getEndTime()); } catch (Exception e) { continue; } if (productCountList == null || productCountList.isEmpty()) { continue; } /* Map firstMap = new HashMap<>(mdcEquipmentDtoList.get(0)); Map mdcEquipmentDtoMap = mdcEquipmentDtoList.get(0); for (int i = 1; i < mdcEquipmentDtoList.size(); i++) { String productCount1 = mdcEquipmentDtoList.get(i).get("ProductCount").toString(); if (!mdcEquipmentDtoMap.get("ProductCount").equals(productCount1)) { Date start; Date end; String sequenceNumber; if (firstMap.get("ProductCount").toString().equals(mdcEquipmentDtoList.get(i - 1).get("ProductCount").toString())) { //结束时间 end = DateUtils.toDate(mdcEquipmentDtoList.get(i - 1).get("CollectTime").toString(), DateUtils.STR_DATE_TIME); //根据productCount值查询开始时间 String productCount = mdcEquipmentDtoList.get(i - 1).get("ProductCount").toString(); MdcEquipmentDto mdcEquipmentDto = equipmentWorkLineService.findProductCountStartTime(mdcEquipment.getSaveTableName(), productCount); if (mdcEquipmentDto == null) { continue; } start = mdcEquipmentDto.getCollectTime(); //程序号 sequenceNumber = mdcEquipmentDtoList.get(i - 1).get("Sequencenumber").toString(); } else { start = DateUtils.toDate(mdcEquipmentDtoMap.get("CollectTime").toString(), DateUtils.STR_DATE_TIME); end = DateUtils.toDate(mdcEquipmentDtoList.get(i - 1).get("CollectTime").toString(), DateUtils.STR_DATE_TIME); sequenceNumber = mdcEquipmentDtoList.get(i - 1).get("Sequencenumber").toString(); } mdcEquipmentDtoMap.put("ProductCount", mdcEquipmentDtoList.get(i).get("ProductCount").toString()); mdcEquipmentDtoMap.put("CollectTime", mdcEquipmentDtoList.get(i).get("CollectTime").toString()); } }*/ for (String productCount : productCountList) { MdcEquipmentDto mdcEquipmentDtoFirst = equipmentWorkLineService.findProductCountStartTime(mdcEquipment.getSaveTableName(), productCount, mdcDateVo.getStartTime(), mdcDateVo.getEndTime()); if (mdcEquipmentDtoFirst == null) { continue; } Date start = mdcEquipmentDtoFirst.getCollectTime(); MdcEquipmentDto mdcEquipmentDtoLast = equipmentWorkLineService.findProductCountEndTime(mdcEquipment.getSaveTableName(), productCount, mdcDateVo.getStartTime(), mdcDateVo.getEndTime()); if (mdcEquipmentDtoLast == null) { continue; } Date end = mdcEquipmentDtoLast.getCollectTime(); List equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), start, end); if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) { //时间修正 if (equipmentRunningSectionList.get(0).getStartTime().before(start)) { equipmentRunningSectionList.get(0).setStartTime(start); } if (equipmentRunningSectionList.size() > 1) { if (equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).getEndTime().after(end)) { equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(end); } } else { if (equipmentRunningSectionList.get(0).getEndTime().after(end)) { equipmentRunningSectionList.get(0).setEndTime(end); } } //计算加工时长 long duration = this.handleProcessDuration(equipmentRunningSectionList); if (duration != 0 && duration < 100000) { MdcProcessCount mdcProcessCount = new MdcProcessCount(); mdcProcessCount.setEquipmentId(mdcEquipment.getEquipmentId()); mdcProcessCount.setEquipmentName(mdcEquipment.getEquipmentName()); if (StringUtils.isBlank(mdcEquipmentDtoFirst.getSequencenumber())) { mdcProcessCount.setSequenceNumber(mdcEquipmentDtoLast.getSequencenumber()); } else { mdcProcessCount.setSequenceNumber(mdcEquipmentDtoFirst.getSequencenumber()); } mdcProcessCount.setDuration(duration); mdcProcessCount.setTheDate(stringDate); resultList.add(mdcProcessCount); } } } } } return resultList; } /** * 计算加工工件时长 * @param equipmentRunningSectionList * @return */ private long handleProcessDuration(List equipmentRunningSectionList) { long result = 0; for (MdcEquipmentRunningSection mdcEquipmentRunningSection : equipmentRunningSectionList) { result += TimeFieldUtils.duration(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime()); } return result; } private MdcDateVo handleDeviceCalendar(List mdcDeviceCalendarVos) { MdcDateVo result = new MdcDateVo(); List dateList = new ArrayList<>(); for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) { String startDateStr = mdcDeviceCalendarVo.getStartDate(); String endDateStr = mdcDeviceCalendarVo.getEndDate(); String overtimeEndTime = mdcDeviceCalendarVo.getOvertimeEndTime(); String effectiveDateStr = DateUtils.format(DateUtils.toDate(mdcDeviceCalendarVo.getEffectiveDate(), DateUtils.STRDATE), DateUtils.STR_DATE); Date start = DateUtils.getFormatDate(effectiveDateStr + " " + startDateStr, DateUtils.STR_DATE_TIME_SMALL); dateList.add(start); Date end = DateUtils.getFormatDate(effectiveDateStr + " " + endDateStr, DateUtils.STR_DATE_TIME_SMALL); if ("true".equals(mdcDeviceCalendarVo.getIsDaySpan())) { end = DateUtils.addDays(end, 1); } dateList.add(end); // 处理加班时间 if (StringUtils.isNotEmpty(overtimeEndTime)) { Date overtimeEnd = DateUtils.getFormatDate(effectiveDateStr + " " + overtimeEndTime, DateUtils.STR_DATE_TIME_SMALL); if ("true".equals(mdcDeviceCalendarVo.getIsDaySpan())) { overtimeEnd = DateUtils.addDays(overtimeEnd, 1); } dateList.add(overtimeEnd); } } if (!dateList.isEmpty()) { dateList.sort(Date::compareTo); result.setStartTime(dateList.get(0)); result.setEndTime(dateList.get(dateList.size() - 1)); } return result; } 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(); } }