Lius
2025-03-04 7c0f82055e064831c9971aad068106241705030e
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/service/impl/MdcLargeScreenServiceImpl.java
@@ -1,16 +1,25 @@
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.IEquipmentAlarmService;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.screen.dto.EquipmentStatusOverview;
import org.jeecg.modules.mdc.service.IMdcEquipmentStatisticalInfoService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.screen.dto.*;
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.util.List;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @Author: Lius
@@ -26,16 +35,25 @@
    @Resource
    private ISysDictService sysDictService;
    @Resource
    private IMdcProductionService mdcProductionService;
    @Resource
    private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
    @Resource
    private IEquipmentAlarmService equipmentAlarmService;
    /**
     * 设备状态情况
     *
     * @param workshopId
     * @param productionId
     * @return
     */
    @Override
    public EquipmentStatusOverview equipmentStatusOverview(String workshopId) {
    public EquipmentStatusOverview equipmentStatusOverview(String productionId) {
        EquipmentStatusOverview equipmentStatusOverview = new EquipmentStatusOverview();
        List<MdcEquipmentMonitor> equipmentMonitorList = mdcEquipmentService.getEquipmentMonitorList(workshopId);
        List<MdcEquipmentMonitor> equipmentMonitorList = mdcEquipmentService.getEquipmentMonitorList(productionId);
        if (equipmentMonitorList != null && !equipmentMonitorList.isEmpty()) {
            equipmentStatusOverview.setEquipmentCount(equipmentMonitorList.size());
            for (MdcEquipmentMonitor mdcEquipmentMonitor : equipmentMonitorList) {
@@ -72,4 +90,201 @@
        }
        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.setUtilizationRateList(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.setUtilizationRateList(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;
    }
    /**
     * 设备报警信息
     *
     * @param productionId
     * @return
     */
    @Override
    public List<AlarmInfoDto> getAlarmInfo(String productionId) {
        return equipmentAlarmService.getAlarmInfo(productionId);
    }
    /**
     * 创建子生产的月度利用率 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.setUtilizationRateList(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.setUtilizationRateList(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());
    }
}