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<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, "2140198"));
|
List<MdcEquipment> mdcEquipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getDriveType, "FANUC"));
|
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);
|
}
|
}
|
|
/**
|
* 分页查询
|
*
|
* @param userId
|
* @param page
|
* @param mdcProcessCountVo
|
* @param req
|
* @return
|
*/
|
@Override
|
public List<MdcProcessCountDto> pageList(String userId, MdcProcessCountVo mdcProcessCountVo, HttpServletRequest req) {
|
List<String> 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<MdcProcessCount> 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<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 == null || listMap.isEmpty()) {
|
return null;
|
}
|
List<MdcProcessCount> resultList = new ArrayList<>();
|
for (String stringDate : stringDates) {
|
if (listMap.containsKey(stringDate)) {
|
List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = listMap.get(stringDate);
|
// 处理班制班次时间
|
MdcDateVo mdcDateVo = this.handleDeviceCalendar(mdcDeviceCalendarVos);
|
// 查找设备单表运行数据
|
List<String> productCountList = new ArrayList<>();
|
try {
|
productCountList = equipmentWorkLineService.findRunningData(mdcEquipment.getSaveTableName(), mdcDateVo.getStartTime(), mdcDateVo.getEndTime());
|
} catch (Exception e) {
|
continue;
|
}
|
|
if (productCountList == null || productCountList.isEmpty()) {
|
continue;
|
}
|
/* Map<String, Object> firstMap = new HashMap<>(mdcEquipmentDtoList.get(0));
|
Map<String, Object> 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<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> equipmentRunningSectionList) {
|
long result = 0;
|
for (MdcEquipmentRunningSection mdcEquipmentRunningSection : equipmentRunningSectionList) {
|
result += TimeFieldUtils.duration(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime());
|
}
|
return result;
|
}
|
|
private MdcDateVo handleDeviceCalendar(List<MdcDeviceCalendarVo> mdcDeviceCalendarVos) {
|
MdcDateVo result = new MdcDateVo();
|
List<Date> 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<String, List<MdcDeviceCalendarVo>> mdcDeviceCalendarMap(String equipmentId, List<String> stringDates) {
|
List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentAndDate(equipmentId, stringDates);
|
if (mdcDeviceCalendarVos == null || 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();
|
}
|
}
|