lius
2023-07-31 6701732c08bb8e5a20c5d7c2deb69c760344013d
对比分析接口
已添加7个文件
已修改6个文件
387 ■■■■■ 文件已修改
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEfficiencyReportController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/ComparativeAnalysisDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/GraphicsDto.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcComAnaDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MeterDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/PieChartDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/UtilizationRateDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEfficiencyReportMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/MdcEfficiencyReportService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/ComparativeAnalysisQueryVo.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}