lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEfficiencyReportController.java
@@ -7,6 +7,7 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.mdc.dto.ComparativeAnalysisDto; import org.jeecg.modules.mdc.service.MdcEfficiencyReportService; import org.jeecg.modules.mdc.vo.*; import org.springframework.web.bind.annotation.GetMapping; @@ -68,4 +69,14 @@ return Result.OK(result); } @AutoLog(value = "è®¾å¤æçæ¥è¡¨-对æ¯åæ") @ApiOperation(value = "è®¾å¤æçæ¥è¡¨-对æ¯åæ", notes = "è®¾å¤æçæ¥è¡¨-对æ¯åæ") @GetMapping("/comparativeAnalysis") public Result comparativeAnalysis(ComparativeAnalysisQueryVo vo) { LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); ComparativeAnalysisDto result = mdcEfficiencyReportService.comparativeAnalysis(userId, vo); return Result.OK(result); } } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/ComparativeAnalysisDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package org.jeecg.modules.mdc.dto; import javafx.scene.chart.PieChart; import lombok.Data; import java.util.List; /** * @author: LiuS * @create: 2023-07-31 10:06 */ @Data public class ComparativeAnalysisDto { /** * å¾å½¢é¡µé¢æ°æ® */ private List<GraphicsDto> graphics; /** * ä»ªè¡¨é¡µé¢æ°æ® */ private MeterDto meters; /** * 饼å¾é¡µé¢æ°æ® */ private PieChartDto pieCharts; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/GraphicsDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ package org.jeecg.modules.mdc.dto; import lombok.Data; import java.math.BigDecimal; /** * @author: LiuS * @create: 2023-07-31 10:09 */ @Data public class GraphicsDto { /** * 设å¤ç¼ç */ private String equipmentId; /** * å©ç¨ç */ private BigDecimal utilizationRate; /** * 弿ºç */ private BigDecimal openRate; /** * 弿ºæ¶é¿ */ private BigDecimal openLong; /** * å ³æºæ¶é¿ */ private BigDecimal closeLong; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcComAnaDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package org.jeecg.modules.mdc.dto; import lombok.Data; import java.math.BigDecimal; /** * @author: LiuS * @create: 2023-07-31 14:08 */ @Data public class MdcComAnaDto { private String equipmentId; private BigDecimal openLong; private BigDecimal closeLong; private BigDecimal waitLong; private BigDecimal processLong; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MeterDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package org.jeecg.modules.mdc.dto; import lombok.Data; import java.util.List; /** * @author: LiuS * @create: 2023-07-31 10:12 */ @Data public class MeterDto { /** * åäºæè¡ */ private List<UtilizationRateDto> tops; /** * åäºæè¡ */ private List<UtilizationRateDto> lasts; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/PieChartDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package org.jeecg.modules.mdc.dto; import lombok.Data; import java.math.BigDecimal; /** * @author: LiuS * @create: 2023-07-31 10:16 */ @Data public class PieChartDto { /** * 弿ºç */ private BigDecimal openRate; /** * å ³æºç */ private BigDecimal closeRate; /** * å å·¥ç */ private BigDecimal processRate; /** * å¾ æºç */ private BigDecimal waitRate; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/UtilizationRateDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package org.jeecg.modules.mdc.dto; import lombok.Data; import java.math.BigDecimal; /** * @author: LiuS * @create: 2023-07-31 10:13 */ @Data public class UtilizationRateDto { /** * 设å¤ç¼ç */ private String equipmentId; /** * å©ç¨ç */ private BigDecimal utilizationRate; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEfficiencyReportMapper.java
@@ -1,8 +1,11 @@ package org.jeecg.modules.mdc.mapper; import org.apache.ibatis.annotations.Param; import org.jeecg.modules.mdc.dto.MdcComAnaDto; import org.jeecg.modules.mdc.dto.MdcEfficiencyDto; import org.jeecg.modules.mdc.dto.MdcEfficiencyResultDto; import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalShiftInfo; import org.jeecg.modules.mdc.vo.ComparativeAnalysisQueryVo; import org.jeecg.modules.mdc.vo.MdcEfficiencyReportQueryVo; import org.jeecg.modules.mdc.vo.MdcEfficiencyReportShiftQueryVo; @@ -37,4 +40,12 @@ * @return */ List<MdcEquipmentStatisticalShiftInfo> efficiencyShiftSumList(@Param("vo") MdcEfficiencyReportShiftQueryVo vo); /** * æ¥è¯¢åå§æ°æ® * * @param vo * @return */ List<MdcComAnaDto> comparativeAnalysis(@Param("vo") ComparativeAnalysisQueryVo vo); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
@@ -111,4 +111,31 @@ ORDER BY t1.the_date </select> <!--æ¥è¯¢åå§æ°æ®--> <select id="comparativeAnalysis" resultType="org.jeecg.modules.mdc.dto.MdcComAnaDto"> SELECT mesi.equipment_id equipmentId, SUM ( mesi.open_long ) openLong, SUM ( mesi.close_long ) closeLong, SUM ( mesi.wait_long ) waitLong, SUM ( mesi.process_long ) processLong FROM mdc_equipment_statistical_info mesi LEFT JOIN mdc_equipment me ON mesi.equipment_id = me.equipment_id <where> <if test="vo.equipmentIdList != null and vo.equipmentIdList.size() > 0 "> AND mesi.equipment_id IN <foreach collection="vo.equipmentIdList" item="id" index="index" open="(" close=")" separator=","> #{ id } </foreach> </if> <if test="vo.driveType != null and vo.driveType != null"> AND me.drive_type = #{ vo.driveType } </if> AND mesi.the_date BETWEEN #{ vo.startTime } AND #{ vo.endTime } </where> GROUP BY mesi.equipment_id </select> </mapper> lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/MdcEfficiencyReportService.java
@@ -1,5 +1,6 @@ package org.jeecg.modules.mdc.service; import org.jeecg.modules.mdc.dto.ComparativeAnalysisDto; import org.jeecg.modules.mdc.vo.*; /** @@ -44,4 +45,12 @@ */ StatisticalAnalysisVo dayStatisticalRate(String userId, MdcEfficiencyReportQueryVo vo); /** * 对æ¯åæ * * @param userId * @param vo * @return */ ComparativeAnalysisDto comparativeAnalysis(String userId, ComparativeAnalysisQueryVo vo); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
@@ -1,7 +1,9 @@ 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.*; @@ -24,6 +26,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; @@ -758,6 +765,106 @@ 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; } private StatisticalAnalysisVo efficiencyStatisticalRate(List<MdcEfficiencyDto> efficiencyList) { StatisticalAnalysisVo vo = new StatisticalAnalysisVo(); for (MdcEfficiencyDto mdcEfficiencyDto : efficiencyList) { lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java
@@ -1,6 +1,8 @@ package org.jeecg.modules.mdc.util; import io.swagger.models.auth.In; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.ParseException; @@ -1011,4 +1013,29 @@ dateList.forEach(localDate -> result.add(Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()))); return result; } /** * @param smallDate * @param bigDate * @desc è·åä¸¤ä¸ªæ¥æä¹é´çå¤©æ° */ public static Integer getDaysBetween(String smallDate, String bigDate) throws ParseException { // æ¥ææ ¼å¼ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // è·åä¸¤ä¸ªæ¥æçæ¶é´æ³ Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(smallDate)); long smallTime = cal.getTimeInMillis(); cal.setTime(sdf.parse(bigDate)); long bigTime = cal.getTimeInMillis(); // ç¸å·®çæ¥æ long days = (bigTime - smallTime) / (1000 * 3600 * 24); // long转int å卿º¢åºæ åµ æ ¹æ®ä¸å¡æ åµç¼è¾catchä¸è¿åå¼ try { return Integer.parseInt(String.valueOf(days)); } catch (NumberFormatException e) { e.printStackTrace(); return 0; } } } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/ComparativeAnalysisQueryVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package org.jeecg.modules.mdc.vo; import lombok.Data; import java.util.List; /** * @author: LiuS * @create: 2023-07-31 09:51 */ @Data public class ComparativeAnalysisQueryVo { /** * 设å¤ç±»å */ private String driveType; /** * å¼å§æ¶é´ -> 20220101 */ private String startTime; /** * ç»ææ¶é´ -> 20220101 */ private String endTime; /** * æ ç±»å -> 1:车é´å±çº§ 2:é¨é¨å±çº§ */ private String typeTree; /** * å±çº§ID */ private String parentId; /** * 设å¤Id */ private String equipmentId; /** * 设å¤ids */ private List<String> equipmentIdList; }