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<MdcProcessCountMapper, MdcProcessCount> 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<MdcEquipment> mdcEquipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140244"));
|
List<MdcProcessCount> result = new ArrayList<>();
|
for (MdcEquipment mdcEquipment : mdcEquipmentList) {
|
List<MdcProcessCount> mdcProcessCountList = processCount(mdcEquipment);
|
if (mdcProcessCountList != null && !mdcProcessCountList.isEmpty()) {
|
result.addAll(mdcProcessCountList);
|
}
|
}
|
if (!result.isEmpty()) {
|
this.saveBatch(result);
|
}
|
}
|
|
@Transactional(readOnly = true)
|
List<MdcProcessCount> 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<String> stringDates = DateUtils.getDatesStringList2(initDate, DateUtils.plusTime(endDate, -1));
|
if (stringDates.isEmpty()) {
|
return Collections.emptyList();
|
}
|
// 获取设备班次信息
|
Map<String, List<MdcDeviceCalendarVo>> listMap = this.mdcDeviceCalendarMap(mdcEquipment.getEquipmentId(), stringDates);
|
if (listMap.isEmpty()) {
|
listMap = new HashMap<>();
|
}
|
List<MdcProcessCount> resultList = new ArrayList<>();
|
for (String stringDate : stringDates) {
|
if (listMap.containsKey(stringDate)) {
|
List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = listMap.get(stringDate);
|
for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
|
// 处理班制班次时间
|
List<MdcShiftDateVo> datesListByMdcDeviceCalendarVo = this.getDatesListByMdcDeviceCalendarVo(mdcDeviceCalendarVo);
|
if (datesListByMdcDeviceCalendarVo == null || datesListByMdcDeviceCalendarVo.isEmpty()) {
|
break;
|
}
|
for (MdcShiftDateVo mdcShiftDateVo : datesListByMdcDeviceCalendarVo) {
|
Date startDate = null;
|
//处理数据
|
//List<MdcProcessCount> result = new ArrayList<>();
|
// 查询班次内设备运行状态时间段
|
List<MdcEquipmentRunningSection> 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<MdcEquipmentOverFlag>().eq(MdcEquipmentOverFlag::getDriveType, mdcEquipment.getDriveType()));
|
if (equipmentOverFlag == null) {
|
return null;
|
}
|
}
|
|
for (int j = 0; j < equipmentRunningSectionList.size(); j++) {
|
MdcEquipmentRunningSection mdcEquipmentRunningSection = equipmentRunningSectionList.get(j);
|
// 查找设备单表运行数据
|
List<Map<String, Object>> 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<MdcShiftDateVo> getDatesListByMdcDeviceCalendarVo(MdcDeviceCalendarVo temp) {
|
List<MdcShiftDateVo> 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<String, List<MdcDeviceCalendarVo>> mdcDeviceCalendarMap(String equipmentId, List<String> stringDates) {
|
List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentAndDate(equipmentId, stringDates);
|
if (mdcDeviceCalendarVos.isEmpty()) {
|
return null;
|
}
|
Map<String, List<MdcDeviceCalendarVo>> map = new HashMap<>();
|
for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
|
List<MdcDeviceCalendarVo> 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();
|
}
|
}
|