package org.jeecg.modules.screen.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.system.vo.DictModel;
|
import org.jeecg.modules.mdc.entity.MdcEquipmentMonitor;
|
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
|
import org.jeecg.modules.mdc.service.IMdcEquipmentStatisticalInfoService;
|
import org.jeecg.modules.mdc.util.DateUtils;
|
import org.jeecg.modules.screen.dto.EquipmentStatusOverview;
|
import org.jeecg.modules.screen.dto.UtilizationDayDto;
|
import org.jeecg.modules.screen.dto.UtilizationRate;
|
import org.jeecg.modules.screen.dto.UtilizationRateDto;
|
import org.jeecg.modules.screen.service.MdcLargeScreenService;
|
import org.jeecg.modules.system.entity.MdcProduction;
|
import org.jeecg.modules.system.service.IMdcProductionService;
|
import org.jeecg.modules.system.service.ISysDictService;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.time.LocalDate;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @Author: Lius
|
* @CreateTime: 2025-02-28
|
* @Description:
|
*/
|
@Service
|
public class MdcLargeScreenServiceImpl implements MdcLargeScreenService {
|
|
@Resource
|
private IMdcEquipmentService mdcEquipmentService;
|
|
@Resource
|
private ISysDictService sysDictService;
|
|
@Resource
|
private IMdcProductionService mdcProductionService;
|
|
@Resource
|
private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
|
|
/**
|
* 设备状态情况
|
*
|
* @param productionId
|
* @return
|
*/
|
@Override
|
public EquipmentStatusOverview equipmentStatusOverview(String productionId) {
|
EquipmentStatusOverview equipmentStatusOverview = new EquipmentStatusOverview();
|
List<MdcEquipmentMonitor> equipmentMonitorList = mdcEquipmentService.getEquipmentMonitorList(productionId);
|
if (equipmentMonitorList != null && !equipmentMonitorList.isEmpty()) {
|
equipmentStatusOverview.setEquipmentCount(equipmentMonitorList.size());
|
for (MdcEquipmentMonitor mdcEquipmentMonitor : equipmentMonitorList) {
|
if (mdcEquipmentMonitor.getEquipmentStatus() == 0) {
|
if (mdcEquipmentMonitor.getOporation() != null) {
|
switch (mdcEquipmentMonitor.getOporation()) {
|
case 1:
|
case 2:
|
equipmentStatusOverview.setWaitCount(equipmentStatusOverview.getWaitCount() + 1);
|
break;
|
case 3:
|
equipmentStatusOverview.setRunCount(equipmentStatusOverview.getRunCount());
|
break;
|
case 22:
|
equipmentStatusOverview.setErrorCount(equipmentStatusOverview.getErrorCount() + 1);
|
break;
|
default:
|
equipmentStatusOverview.setCloseCount(equipmentStatusOverview.getCloseCount() + 1);
|
break;
|
}
|
} else {
|
equipmentStatusOverview.setCloseCount(equipmentStatusOverview.getCloseCount() + 1);
|
mdcEquipmentMonitor.setOporation(0);
|
}
|
} else {
|
List<DictModel> dictList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_EQUIPMENT_STATUS);
|
for (DictModel dictModel : dictList) {
|
if (Integer.valueOf(dictModel.getValue()).equals(mdcEquipmentMonitor.getEquipmentStatus())) {
|
equipmentStatusOverview.setRepairCount(equipmentStatusOverview.getRepairCount() + 1);
|
}
|
}
|
}
|
}
|
}
|
return equipmentStatusOverview;
|
}
|
|
/**
|
* 设备月利用率趋势
|
*
|
* @param productionId
|
* @return
|
*/
|
@Override
|
public Map<String, Object> monthUtilizationTendency(String productionId) {
|
Map<String, Object> result = new HashMap<>();
|
|
// 获取子生产列表
|
List<MdcProduction> mdcProductionList = mdcProductionService.list(
|
new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getParentId, productionId)
|
);
|
|
if (mdcProductionList == null || mdcProductionList.isEmpty()) {
|
return result;
|
}
|
|
// 生成月度日期范围
|
List<String[]> dateLists = DateUtils.generateMonthlyDateRanges(DateUtils.format(new Date(), DateUtils.STRDATE));
|
List<String> dateList = dateLists.stream()
|
.map(array -> array[2]) // 提取月份名称
|
.collect(Collectors.toList());
|
result.put("dateList", dateList);
|
|
// 计算每个子生产的月度利用率
|
List<UtilizationRateDto> utilizationMonthDtoList = mdcProductionList.stream()
|
.map(mdcProduction -> createUtilizationMonthDto(mdcProduction, dateLists))
|
.collect(Collectors.toList());
|
|
// 计算总厂的月度利用率
|
UtilizationRateDto totalUtilizationMonthDto = createTotalUtilizationMonthDto(productionId, dateLists);
|
utilizationMonthDtoList.add(totalUtilizationMonthDto);
|
|
result.put("dataList", utilizationMonthDtoList);
|
return result;
|
}
|
|
/**
|
* 设备周利用率趋势
|
*
|
* @param productionId
|
* @return
|
*/
|
@Override
|
public Map<String, Object> weekUtilizationTendency(String productionId) {
|
Map<String, Object> result = new HashMap<>();
|
|
// 获取子生产列表
|
List<MdcProduction> mdcProductionList = mdcProductionService.list(
|
new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getParentId, productionId)
|
);
|
|
if (mdcProductionList == null || mdcProductionList.isEmpty()) {
|
return result;
|
}
|
// 生成周范围
|
List<String> dateList = DateUtils.getNearWeek();
|
result.put("dateList", dateList);
|
// 计算每个工段的利用率
|
List<UtilizationRateDto> utilizationMonthDtoList = new ArrayList<>();
|
for (MdcProduction mdcProduction : mdcProductionList) {
|
UtilizationRateDto utilizationRateDto = new UtilizationRateDto();
|
utilizationRateDto.setProductionId(mdcProduction.getId());
|
utilizationRateDto.setProductionName(mdcProduction.getProductionName());
|
List<UtilizationRate> utilizationRates = dateList.stream()
|
.map(date -> {
|
UtilizationRate utilizationMonth = new UtilizationRate();
|
utilizationMonth.setDate(date);
|
BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationWeek(productionId, date.replaceAll("-", ""));
|
utilizationMonth.setUtilizationRate(utilizationRate);
|
return utilizationMonth;
|
})
|
.collect(Collectors.toList());
|
utilizationRateDto.setUtilizationMonthList(utilizationRates);
|
utilizationMonthDtoList.add(utilizationRateDto);
|
}
|
//计算总厂的利用率
|
UtilizationRateDto utilizationRateDto = new UtilizationRateDto();
|
utilizationRateDto.setProductionName("总厂");
|
List<UtilizationRate> utilizationRates = dateList.stream()
|
.map(date -> {
|
UtilizationRate utilizationMonth = new UtilizationRate();
|
utilizationMonth.setDate(date);
|
BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationWeekTotal(productionId, date.replaceAll("-", ""));
|
utilizationMonth.setUtilizationRate(utilizationRate);
|
return utilizationMonth;
|
})
|
.collect(Collectors.toList());
|
utilizationRateDto.setUtilizationMonthList(utilizationRates);
|
utilizationMonthDtoList.add(utilizationRateDto);
|
result.put("dataList", utilizationMonthDtoList);
|
return result;
|
}
|
|
/**
|
* 设备日利用率
|
*
|
* @param productionId
|
* @return
|
*/
|
@Override
|
public Map<String, Object> dayUtilizationTendency(String productionId) {
|
Map<String, Object> result = new HashMap<>();
|
// 获取子生产列表
|
List<MdcProduction> mdcProductionList = mdcProductionService.list(
|
new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getParentId, productionId)
|
);
|
|
if (mdcProductionList == null || mdcProductionList.isEmpty()) {
|
return result;
|
}
|
List<String> productionList = mdcProductionList.stream().map(MdcProduction::getProductionName).collect(Collectors.toList());
|
result.put("productionList", productionList);
|
|
String date = LocalDate.now().minusDays(1).toString().replaceAll("-", "");
|
List<UtilizationDayDto> utilizationDayDtos = new ArrayList<>();
|
for (MdcProduction mdcProduction : mdcProductionList) {
|
UtilizationDayDto utilizationDayDto = new UtilizationDayDto();
|
utilizationDayDto.setProductionName(mdcProduction.getProductionName());
|
BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationWeekTotal(mdcProduction.getId(), date);
|
utilizationDayDto.setUtilizationRate(utilizationRate);
|
utilizationDayDtos.add(utilizationDayDto);
|
}
|
result.put("dataList", utilizationDayDtos);
|
return result;
|
}
|
|
/**
|
* 创建子生产的月度利用率 DTO
|
*/
|
private UtilizationRateDto createUtilizationMonthDto(MdcProduction mdcProduction, List<String[]> dateLists) {
|
UtilizationRateDto utilizationMonthDto = new UtilizationRateDto();
|
utilizationMonthDto.setProductionId(mdcProduction.getId());
|
utilizationMonthDto.setProductionName(mdcProduction.getProductionName());
|
|
List<UtilizationRate> utilizationMonthList = calculateUtilizationRates(mdcProduction.getId(), dateLists);
|
utilizationMonthDto.setUtilizationMonthList(utilizationMonthList);
|
|
return utilizationMonthDto;
|
}
|
|
/**
|
* 创建总厂的月度利用率 DTO
|
*/
|
private UtilizationRateDto createTotalUtilizationMonthDto(String productionId, List<String[]> dateLists) {
|
UtilizationRateDto utilizationMonthDto = new UtilizationRateDto();
|
utilizationMonthDto.setProductionName("总厂");
|
|
List<UtilizationRate> utilizationMonthList = calculateUtilizationRatesTotal(productionId, dateLists);
|
utilizationMonthDto.setUtilizationMonthList(utilizationMonthList);
|
|
return utilizationMonthDto;
|
}
|
|
/**
|
* 计算子生产的月度利用率
|
*/
|
private List<UtilizationRate> calculateUtilizationRates(String productionId, List<String[]> dateLists) {
|
return dateLists.stream()
|
.map(dates -> {
|
UtilizationRate utilizationMonth = new UtilizationRate();
|
utilizationMonth.setDate(dates[2]);
|
BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationMonth(productionId, dates[0], dates[1]);
|
utilizationMonth.setUtilizationRate(utilizationRate);
|
return utilizationMonth;
|
})
|
.collect(Collectors.toList());
|
}
|
|
/**
|
* 计算总厂的月度利用率
|
*/
|
private List<UtilizationRate> calculateUtilizationRatesTotal(String productionId, List<String[]> dateLists) {
|
return dateLists.stream()
|
.map(dates -> {
|
UtilizationRate utilizationMonth = new UtilizationRate();
|
utilizationMonth.setDate(dates[2]);
|
BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationMonthTotal(productionId, dates[0], dates[1]);
|
utilizationMonth.setUtilizationRate(utilizationRate);
|
return utilizationMonth;
|
})
|
.collect(Collectors.toList());
|
}
|
}
|