From 2d061ec924b4b55ea825bfb0ea5b602cc4f8b94b Mon Sep 17 00:00:00 2001
From: lius <Lius2225@163.com>
Date: 星期三, 02 八月 2023 10:13:34 +0800
Subject: [PATCH] update

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java |  203 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 193 insertions(+), 10 deletions(-)

diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
index 2fca558..6cedc45 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
@@ -1,19 +1,15 @@
 package org.jeecg.modules.mdc.service.impl;
 
+import com.alipay.api.domain.NewsfeedMediaGiftInfo;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.A;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.mdc.dto.*;
-import org.jeecg.modules.mdc.entity.MdcEquipment;
-import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalShiftInfo;
-import org.jeecg.modules.mdc.entity.MdcShiftSub;
-import org.jeecg.modules.mdc.entity.MdcUtilizationRate;
+import org.jeecg.modules.mdc.entity.*;
 import org.jeecg.modules.mdc.mapper.MdcEfficiencyReportMapper;
-import org.jeecg.modules.mdc.service.IMdcEquipmentService;
-import org.jeecg.modules.mdc.service.IMdcShiftSubService;
-import org.jeecg.modules.mdc.service.IMdcUtilizationRateService;
-import org.jeecg.modules.mdc.service.MdcEfficiencyReportService;
+import org.jeecg.modules.mdc.service.*;
 import org.jeecg.modules.mdc.util.DateUtils;
 import org.jeecg.modules.mdc.vo.*;
 import org.jeecg.modules.system.entity.MdcProduction;
@@ -24,6 +20,11 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -51,6 +52,9 @@
 
     @Resource
     private IMdcShiftSubService mdcShiftSubService;
+
+    @Resource
+    private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
 
     /**
      * 鍒╃敤鐜囨姤琛�
@@ -646,8 +650,9 @@
                     mdcEfficiencyShiftResultDto.setOpenLong(equipmentStatisticalShiftInfo.getOpenLong());
                     mdcEfficiencyShiftResultDto.setWaitLong(equipmentStatisticalShiftInfo.getWaitLong());
                     mdcEfficiencyShiftResultDto.setOpenRate(equipmentStatisticalShiftInfo.getOpenLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, BigDecimal.ROUND_HALF_UP));
+                    long rate = mdcEfficiencyShiftResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
                     for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
-                        if (mdcEfficiencyShiftResultDto.getUtilizationRate().longValue() * 100 >= mdcUtilizationRate.getMinimumRange() && mdcEfficiencyShiftResultDto.getUtilizationRate().longValue() * 100 < mdcUtilizationRate.getMaximumRange()) {
+                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                             mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                         }
                     }
@@ -687,6 +692,7 @@
                 vo.setOpenLong(vo.getOpenLong().add(equipmentStatisticalShiftInfo.getOpenLong()));
                 vo.setWaitLong(vo.getWaitLong().add(equipmentStatisticalShiftInfo.getWaitLong()));
                 vo.setCloseLong(vo.getCloseLong().add(equipmentStatisticalShiftInfo.getCloseLong()));
+                vo.setTotalLong(vo.getTotalLong().add(equipmentStatisticalShiftInfo.getTotalLong()));
             } else {
                 map.put(equipmentStatisticalShiftInfo.getEquipmentId() + "_" + equipmentStatisticalShiftInfo.getTheDate(), equipmentStatisticalShiftInfo);
             }
@@ -758,6 +764,182 @@
         return result;
     }
 
+    /**
+     * 瀵规瘮鍒嗘瀽
+     */
+    @Override
+    public ComparativeAnalysisDto comparativeAnalysis(String userId, ComparativeAnalysisQueryVo vo) {
+        ComparativeAnalysisDto result = new ComparativeAnalysisDto();
+        List<String> equipmentIds = new ArrayList<>();
+        if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) {
+            if ("2".equals(vo.getTypeTree())) {
+                // 閮ㄩ棬灞傜骇
+                equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId());
+            } else {
+                // 浜х嚎灞傜骇
+                equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId());
+            }
+        } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) {
+            // 鍗曞彴璁惧淇℃伅
+            vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId()));
+        } else {
+            // 鏌ヨ鐢ㄦ埛鎷ユ湁鐨勬墍鏈夎澶囦俊鎭�
+            if ("2".equals(vo.getTypeTree())) {
+                // 閮ㄩ棬灞傜骇
+                equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null);
+            } else {
+                // 浜х嚎灞傜骇
+                equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null);
+            }
+        }
+        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
+            vo.setEquipmentIdList(equipmentIds);
+        }
+        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
+            return result;
+        }
+
+        // 鏌ヨ鍘熷鏁版嵁
+        List<MdcComAnaDto> resultDtos = mdcEfficiencyReportMapper.comparativeAnalysis(vo);
+        if (resultDtos != null && !resultDtos.isEmpty()) {
+            // 缁勮鍥惧舰鍜屼华琛ㄦ暟鎹�
+            List<GraphicsDto> graphicsDtos = new ArrayList<>();
+            // 鑾峰彇澶╂暟
+            long days = ChronoUnit.DAYS.between(LocalDate.parse(vo.getStartTime(), DateTimeFormatter.ofPattern("yyyyMMdd")), LocalDate.parse(vo.getEndTime(), DateTimeFormatter.ofPattern("yyyyMMdd"))) + 1;
+            BigDecimal time = new BigDecimal("24").multiply(new BigDecimal(days));
+            for (MdcComAnaDto mdcComAnaDto : resultDtos) {
+                GraphicsDto graphicsDto = new GraphicsDto();
+                graphicsDto.setEquipmentId(mdcComAnaDto.getEquipmentId());
+                graphicsDto.setCloseLong(mdcComAnaDto.getCloseLong());
+                graphicsDto.setOpenLong(mdcComAnaDto.getOpenLong());
+                // 24灏忔椂鍒╃敤鐜� = 鍔犲伐鏃堕棿/24
+                graphicsDto.setUtilizationRate(mdcComAnaDto.getProcessLong().divide(time, 6, BigDecimal.ROUND_HALF_UP));
+                // 寮�鏈虹巼 = 寮�鏈烘椂闂� / 24
+                graphicsDto.setOpenRate(mdcComAnaDto.getOpenLong().divide(time, 6, BigDecimal.ROUND_HALF_UP));
+                graphicsDtos.add(graphicsDto);
+            }
+            result.setGraphics(graphicsDtos);
+
+            List<UtilizationRateDto> tops = new ArrayList<>();
+            List<UtilizationRateDto> lasts = new ArrayList<>();
+            graphicsDtos.stream().sorted(Comparator.comparing(GraphicsDto::getUtilizationRate)).limit(5).forEach(graphicsDto -> {
+                UtilizationRateDto utilizationRateDto = new UtilizationRateDto();
+                utilizationRateDto.setEquipmentId(graphicsDto.getEquipmentId());
+                utilizationRateDto.setUtilizationRate(graphicsDto.getUtilizationRate());
+                lasts.add(utilizationRateDto);
+            });
+            graphicsDtos.stream().sorted(Comparator.comparing(GraphicsDto::getUtilizationRate).reversed()).limit(5).forEach(graphicsDto -> {
+                UtilizationRateDto utilizationRateDto = new UtilizationRateDto();
+                utilizationRateDto.setEquipmentId(graphicsDto.getEquipmentId());
+                utilizationRateDto.setUtilizationRate(graphicsDto.getUtilizationRate());
+                tops.add(utilizationRateDto);
+            });
+            MeterDto meterDto = new MeterDto();
+            meterDto.setTops(tops);
+            meterDto.setLasts(lasts);
+            result.setMeters(meterDto);
+            // 缁勮楗煎浘鏁版嵁
+            PieChartDto pieChartDto = new PieChartDto();
+            BigDecimal openLong = new BigDecimal("0");
+            BigDecimal closeLong = new BigDecimal("0");
+            BigDecimal waitLong = new BigDecimal("0");
+            BigDecimal processLong = new BigDecimal("0");
+            for (MdcComAnaDto resultDto : resultDtos) {
+                openLong = openLong.add(resultDto.getOpenLong());
+                closeLong = closeLong.add(resultDto.getCloseLong());
+                waitLong = waitLong.add(resultDto.getWaitLong());
+                processLong = processLong.add(resultDto.getProcessLong());
+            }
+            // 寮�鏈虹巼 = 寮�鏈烘椂闀� / (24 脳 澶╂暟 脳 涓暟)
+            pieChartDto.setOpenRate(openLong.divide(time.multiply(new BigDecimal(resultDtos.size())), 6, BigDecimal.ROUND_HALF_UP));
+            // 鍏虫満鐜� = 1 - 寮�鏈虹巼
+            pieChartDto.setCloseRate(new BigDecimal("1").subtract(pieChartDto.getOpenRate()));
+            // 鍔犲伐鐜� = 鍔犲伐鏃堕棿 / (24 脳 澶╂暟 脳 涓暟)
+            pieChartDto.setProcessRate(processLong.divide(time.multiply(new BigDecimal(resultDtos.size())), 6, BigDecimal.ROUND_HALF_UP));
+            // 寰呮満鐜� = 寮�鏈虹巼 - 鍔犲伐鐜�
+            pieChartDto.setWaitRate(pieChartDto.getOpenRate().subtract(pieChartDto.getProcessRate()));
+            result.setPieCharts(pieChartDto);
+        }
+
+        return result;
+    }
+
+    /**
+     * 璁惧鏃ュ埄鐢ㄧ巼
+     *
+     * @param vo
+     * @return
+     */
+    @Override
+    public DayUtilizationRateDto dayUtilizationRate(String userId, DayUtilizationRateQueryVo vo) {
+        DayUtilizationRateDto result = new DayUtilizationRateDto();
+        if (StringUtils.isBlank(vo.getEquipmentId())) {
+            List<String> equipmentIds;
+            // 鑾峰彇鐢ㄦ埛鎷ユ湁璁惧鏉冮檺
+            if ("2".equals(vo.getTypeTree())) {
+                // 閮ㄩ棬灞傜骇
+                equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null);
+            } else {
+                // 浜х嚎灞傜骇
+                equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null);
+            }
+            if (equipmentIds != null && !equipmentIds.isEmpty()) {
+                vo.setEquipmentId(equipmentIds.get(0));
+            }
+        }
+        result.setEquipmentId(vo.getEquipmentId());
+        MdcEquipment mdcEquipment = mdcEquipmentService.getOne(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, vo.getEquipmentId()));
+        result.setEquipmentName(mdcEquipment.getEquipmentName());
+        List<String> dateList = new ArrayList<>();
+        for (int i = 1; i <= 24 / vo.getTimeType(); i++) {
+            if (i * vo.getTimeType() < 10) {
+                dateList.add("0" + i * vo.getTimeType() + ":00");
+            } else {
+                dateList.add(i * vo.getTimeType() + ":00");
+            }
+        }
+
+        dateList.add(0, "00:00");
+
+        List<DayRateDto> dayRateDtoList = new ArrayList<>();
+        for (int i = 0; i < dateList.size() - 1; i++) {
+            DayRateDto dayRateDto = new DayRateDto();
+            dayRateDto.setDateTime(dateList.get(i + 1));
+            String dateTime = DateUtils.dateConvertion(vo.getDateTime());
+            Date startTime = DateUtils.toDate(dateTime + " " + dateList.get(i), DateUtils.STR_DATE_TIME_MIN);
+            Date endTime = DateUtils.toDate(dateTime + " " + dateList.get(i + 1), DateUtils.STR_DATE_TIME_MIN);
+            List<MdcEquipmentRunningSection> runningSections = mdcEquipmentRunningSectionService.listEquipmentRunningSection(vo.getEquipmentId(), startTime.getTime(), endTime.getTime());
+            if (runningSections != null && !runningSections.isEmpty()) {
+                // 鏃堕棿淇
+                runningSections.get(0).setStartTime(startTime);
+                if (runningSections.size() > 1) {
+                    runningSections.get(runningSections.size() - 1).setEndTime(endTime);
+                } else {
+                    runningSections.get(0).setEndTime(endTime);
+                }
+                // 鍒╃敤鐜囪绠�
+                BigDecimal processLong = new BigDecimal("0");
+                for (MdcEquipmentRunningSection runningSection : runningSections) {
+                    if (runningSection.getStatus() == 3) {
+                        long duration = DateUtils.differentSecond(runningSection.getStartTime(), runningSection.getEndTime());
+                        processLong = processLong.add(new BigDecimal(duration));
+                    }
+                }
+                BigDecimal totalLong = new BigDecimal(vo.getTimeType()).multiply(new BigDecimal("60")).multiply(new BigDecimal("60"));
+                BigDecimal utilizationRate = processLong.divide(totalLong, 6, BigDecimal.ROUND_HALF_UP);
+                dayRateDto.setUtilizationRate(utilizationRate);
+            } else {
+                dayRateDto.setUtilizationRate(new BigDecimal("0"));
+            }
+            dayRateDtoList.add(dayRateDto);
+        }
+        dateList.remove(0);
+        result.setDateList(dateList);
+        result.setDayRateDto(dayRateDtoList);
+
+        return result;
+    }
+
     private StatisticalAnalysisVo efficiencyStatisticalRate(List<MdcEfficiencyDto> efficiencyList) {
         StatisticalAnalysisVo vo = new StatisticalAnalysisVo();
         for (MdcEfficiencyDto mdcEfficiencyDto : efficiencyList) {
@@ -784,8 +966,9 @@
                     mdcEfficiencyResultDto.setOpenLong(efficiencyDto.getOpenLong());
                     mdcEfficiencyResultDto.setWaitLong(efficiencyDto.getWaitLong());
                     mdcEfficiencyResultDto.setCloseLong(efficiencyDto.getCloseLong());
+                    long rate = efficiencyDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
                     for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
-                        if (efficiencyDto.getUtilizationRate().longValue() * 100 >= mdcUtilizationRate.getMinimumRange() && efficiencyDto.getUtilizationRate().longValue() * 100 < mdcUtilizationRate.getMaximumRange()) {
+                        if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
                             mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                         }
                     }

--
Gitblit v1.9.3