Lius
2025-03-03 75d26035001d85c12dc3ca93455b0fee477c3f77
看板设备状态概况及月利用路趋势接口
已添加2个文件
已修改12个文件
374 ■■■■■ 文件已修改
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/controller/MdcLargeScreenController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/dto/UtilizationMonth.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/dto/UtilizationMonthDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/service/MdcLargeScreenService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/service/impl/MdcLargeScreenServiceImpl.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentMapper.java
@@ -127,8 +127,8 @@
    /**
     * æ ¹æ®äº§çº¿id获取设备状态列表
     * @param workshopId
     * @param productionId
     * @return
     */
    List<MdcEquipmentMonitor> getEquipmentMonitorList(@Param("workshopId") String workshopId);
    List<MdcEquipmentMonitor> getEquipmentMonitorList(@Param("productionId") String productionId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentStatisticalInfoMapper.java
@@ -4,6 +4,8 @@
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo;
import java.math.BigDecimal;
/**
 * @Description: è®¾å¤‡å•日运行数据表
 * @Author: jeecg-boot
@@ -27,4 +29,8 @@
    Integer selectProcessLong(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate);
    MdcEquipmentStatisticalInfo findMdcEquipmentStatisticalInfo(@Param("equipmentId") String equipmentId, @Param("data") String data);
    BigDecimal computeUtilizationMonth(@Param("productionId") String productionId, @Param("startDate") String startDate, @Param("endDate") String endDate);
    BigDecimal computeUtilizationMonthTotal(@Param("productionId") String productionId, @Param("startDate") String startDate, @Param("endDate") String endDate);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
@@ -281,19 +281,29 @@
    <!--根据产线id获取设备状态列表-->
    <select id="getEquipmentMonitorList" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentMonitor">
        SELECT e.equipment_id,
               et.CollectTime,
               e.equipment_name,
               et.Oporation,
               e.id,
               e.equipment_status,
               e.equipment_type AS equipmentType,
               etp.equipment_type_pictures
        FROM mdc_equipment e
                 LEFT JOIN Equipment et ON e.equipment_id = et.EquipmentID
                 LEFT JOIN mdc_equipment_type etp ON e.equipment_type = etp.equipment_type_name
                 JOIN mdc_workshop_equipment we ON e.equipment_id = we.equipment_id
        WHERE we.workshop_id = #{workshopId}
        SELECT
            t1.equipment_id,
            t2.CollectTime,
            t1.equipment_name,
            t2.Oporation,
            t1.id,
            t1.equipment_status,
            t1.equipment_type AS equipmentType,
            t3.equipment_type_pictures
        FROM
            mdc_equipment t1
                JOIN
            mdc_workshop_equipment t4
            ON t1.equipment_id = t4.equipment_id
                JOIN
            mdc_workshop_info t5
            ON t4.workshop_id = t5.id AND t5.production_id = #{productionId}
                LEFT JOIN
            Equipment t2
            ON t1.equipment_id = t2.EquipmentID
                LEFT JOIN
            mdc_equipment_type t3
            ON t1.equipment_type = t3.equipment_type_name
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentStatisticalInfoMapper.xml
@@ -16,4 +16,31 @@
    <select id="findMdcEquipmentStatisticalInfo" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo">
        SELECT TOP 1 * FROM mdc_equipment_statistical_info WHERE equipment_id = #{equipmentId} AND the_date = #{data}
    </select>
    <select id="computeUtilizationMonth" resultType="java.math.BigDecimal">
        SELECT
            AVG(t1.process_long) AS processLong
        FROM
            mdc_equipment_statistical_info t1
                INNER JOIN mdc_equipment t2
                           ON t1.equipment_id = t2.equipment_id
                INNER JOIN mdc_production_equipment t3
                           ON t2.id = t3.equipment_id
                               AND t3.production_id = #{productionId}
        WHERE
            t1.the_date BETWEEN #{startDate} AND #{endDate}
    </select>
    <select id="computeUtilizationMonthTotal" resultType="java.math.BigDecimal">
        SELECT AVG
               ( t1.process_long ) AS processLong
        FROM
            mdc_equipment_statistical_info t1
                INNER JOIN mdc_equipment t2 ON t1.equipment_id = t2.equipment_id
                INNER JOIN mdc_production_equipment t3 ON t2.id = t3.equipment_id
                INNER JOIN mdc_production t4 ON t3.production_id = t4.id
        WHERE
            t4.parent_id = #{productionId}
          AND t1.the_date BETWEEN #{startDate} AND #{endDate}
    </select>
</mapper>
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentService.java
@@ -213,8 +213,8 @@
    /**
     * æ ¹æ®äº§çº¿id获取设备状态列表
     *
     * @param workshopId
     * @param productionId
     * @return
     */
    List<MdcEquipmentMonitor> getEquipmentMonitorList(String workshopId);
    List<MdcEquipmentMonitor> getEquipmentMonitorList(String productionId);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentStatisticalInfoService.java
@@ -3,6 +3,8 @@
import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
/**
 * @Description: è®¾å¤‡å•日运行数据表
 * @Author: lius
@@ -35,4 +37,22 @@
     * @return
     */
    MdcEquipmentStatisticalInfo findMdcEquipmentStatisticalInfo(String equipmentId, String date);
    /**
     * è®¡ç®—工段月利用率
     * @param productionId
     * @param startDate
     * @param endDate
     * @return
     */
    BigDecimal computeUtilizationMonth(String productionId, String startDate, String endDate);
    /**
     *
     * @param productionId
     * @param startDate
     * @param endDate
     * @return
     */
    BigDecimal computeUtilizationMonthTotal(String productionId, String startDate, String endDate);
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -908,12 +908,12 @@
    /**
     * æ ¹æ®äº§çº¿id获取设备状态列表
     *
     * @param workshopId
     * @param productionId
     * @return
     */
    @Override
    public List<MdcEquipmentMonitor> getEquipmentMonitorList(String workshopId) {
        return this.baseMapper.getEquipmentMonitorList(workshopId);
    public List<MdcEquipmentMonitor> getEquipmentMonitorList(String productionId) {
        return this.baseMapper.getEquipmentMonitorList(productionId);
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.swagger.models.auth.In;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.modules.mdc.entity.*;
@@ -99,6 +98,26 @@
        return this.baseMapper.findMdcEquipmentStatisticalInfo(equipmentId, date.replaceAll("-", ""));
    }
    @Override
    public BigDecimal computeUtilizationMonth(String productionId, String startDate, String endDate) {
        BigDecimal processLong = this.baseMapper.computeUtilizationMonth(productionId, startDate, endDate);
        if (processLong != null && processLong.compareTo(BigDecimal.ZERO) > 0) {
            return processLong.divide(new BigDecimal("864"), 2, RoundingMode.HALF_UP);
        } else {
            return BigDecimal.ZERO;
        }
    }
    @Override
    public BigDecimal computeUtilizationMonthTotal(String productionId, String startDate, String endDate) {
        BigDecimal processLong = this.baseMapper.computeUtilizationMonthTotal(productionId, startDate, endDate);
        if (processLong != null && processLong.compareTo(BigDecimal.ZERO) > 0) {
            return processLong.divide(new BigDecimal("864"), 2, RoundingMode.HALF_UP);
        } else {
            return BigDecimal.ZERO;
        }
    }
    private List<EquipmentStatisticalInfo> dataHandle(List<MdcEquipmentStatisticalInfo> list) {
        List<EquipmentStatisticalInfo> result = new ArrayList<>();
        list.forEach(item -> {
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java
@@ -1,8 +1,6 @@
package org.jeecg.modules.mdc.util;
import io.swagger.models.auth.In;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
@@ -10,6 +8,8 @@
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.util.*;
@@ -1098,4 +1098,40 @@
        return formattedHours + "小时" + formattedMinutes + "分" + formattedSeconds + "秒";
    }
    public static List<String[]> generateMonthlyDateRanges(String inputDate) {
        List<String[]> dateRanges = new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        // è§£æžä¼ å…¥çš„æ—¥æœŸ
        LocalDate date = LocalDate.parse(inputDate, formatter);
        // å¦‚果当前日期是18号或之前,结束日期是上个月的18号
        LocalDate endDate = date.getDayOfMonth() <= 18
                ? date.minusMonths(1).withDayOfMonth(18)
                : date.withDayOfMonth(18);
        // å¾ªçŽ¯ç”Ÿæˆ12个月的日期范围
        for (int i = 0; i < 12; i++) {
            // å¼€å§‹æ—¥æœŸï¼šä¸Šä¸Šä¸ªæœˆçš„19号
            LocalDate startDate = endDate.minusMonths(1).withDayOfMonth(19);
            String startDateStr = startDate.format(formatter);
            String endDateStr = endDate.format(formatter);
            // èŽ·å–æœˆä»½åç§°ï¼ˆå¦‚ï¼š2月)
            String monthName = endDate.getMonth().getDisplayName(TextStyle.FULL, Locale.CHINA);
            // å°†æ—¥æœŸèŒƒå›´å’Œæœˆä»½åç§°æ·»åŠ åˆ°é›†åˆä¸­ï¼ˆå€’åºæ’å…¥ï¼‰
            dateRanges.add(0, new String[]{startDateStr, endDateStr, monthName});
            // å›žé€€åˆ°ä¸Šä¸ªæœˆçš„18号
            endDate = endDate.minusMonths(1).withDayOfMonth(18);
        }
        return dateRanges;
    }
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/controller/MdcLargeScreenController.java
@@ -11,6 +11,7 @@
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Map;
/**
 * @Author: Lius
@@ -28,16 +29,18 @@
    @ApiOperation(value = "大屏看板-设备情况", notes = "大屏看板-设备情况")
    @GetMapping("/equipmentStatusOverview")
    public Result<EquipmentStatusOverview> equipmentStatusOverview(String workshopId) {
        EquipmentStatusOverview equipmentStatusOverview = mdcLargeScreenService.equipmentStatusOverview(workshopId);
    public Result<EquipmentStatusOverview> equipmentStatusOverview(String productionId) {
        EquipmentStatusOverview equipmentStatusOverview = mdcLargeScreenService.equipmentStatusOverview(productionId);
        return Result.OK(equipmentStatusOverview);
    }
//    @ApiOperation(value = "大屏看板-月利用率趋势", notes = "大屏看板-月利用率趋势")
//    @GetMapping("/monthUtilizationTendency")
//    public Result<EquipmentStatusOverview> monthUtilizationTendency(String workshopId) {
//
//        return Result.OK(equipmentStatusOverview);
//    }
    @ApiOperation(value = "大屏看板-月利用率趋势", notes = "大屏看板-月利用率趋势")
    @GetMapping("/monthUtilizationTendency")
    public Result<Map<String, Object>> monthUtilizationTendency(String productionId) {
        Map<String, Object> result = mdcLargeScreenService.monthUtilizationTendency(productionId);
        return Result.OK(result);
    }
//    public Result<?> monthUtilizationTendency(String)
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/dto/UtilizationMonth.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package org.jeecg.modules.screen.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @Author: Lius
 * @CreateTime: 2025-03-03
 * @Description:
 */
@Data
@ApiModel(value = "月利用率resp", description = "月利用率resp")
public class UtilizationMonth {
    @ApiModelProperty(value = "月份")
    private String month;
    @ApiModelProperty(value = "利用率")
    private BigDecimal utilizationRate = BigDecimal.ZERO;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/dto/UtilizationMonthDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package org.jeecg.modules.screen.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.UUID;
/**
 * @Author: Lius
 * @CreateTime: 2025-03-03
 * @Description:
 */
@Data
@ApiModel(value = "月利用率resp", description = "月利用率resp")
public class UtilizationMonthDto {
    /**
     * å·¥æ®µid
     */
    @ApiModelProperty(value = "工段id")
    private String productionId = UUID.randomUUID().toString().replace("-", "");
    /**
     * å·¥æ®µåç§°
     */
    @ApiModelProperty(value = "工段名称")
    private String productionName;
    /**
     * æœˆåˆ©ç”¨çއ
     */
    @ApiModelProperty(value = "月利用率")
    private List<UtilizationMonth> utilizationMonthList;
}
lxzn-module-mdc/src/main/java/org/jeecg/modules/screen/service/MdcLargeScreenService.java
@@ -2,6 +2,8 @@
import org.jeecg.modules.screen.dto.EquipmentStatusOverview;
import java.util.Map;
/**
 * @Author: Lius
 * @CreateTime: 2025-02-28
@@ -12,8 +14,16 @@
    /**
     * è®¾å¤‡æƒ…况
     *
     * @param workshopId
     * @param productionId
     * @return
     */
    EquipmentStatusOverview equipmentStatusOverview(String workshopId);
    EquipmentStatusOverview equipmentStatusOverview(String productionId);
    /**
     * è®¾å¤‡æœˆåˆ©ç”¨çŽ‡è¶‹åŠ¿
     *
     * @param productionId
     * @return
     */
    Map<String, Object> monthUtilizationTendency(String productionId);
}
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.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.UtilizationMonth;
import org.jeecg.modules.screen.dto.UtilizationMonthDto;
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.util.*;
import java.util.stream.Collectors;
/**
 * @Author: Lius
@@ -26,16 +35,22 @@
    @Resource
    private ISysDictService sysDictService;
    @Resource
    private IMdcProductionService mdcProductionService;
    @Resource
    private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
    /**
     * è®¾å¤‡çŠ¶æ€æƒ…å†µ
     *
     * @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 +87,100 @@
        }
        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<UtilizationMonthDto> utilizationMonthDtoList = mdcProductionList.stream()
                .map(mdcProduction -> createUtilizationMonthDto(mdcProduction, dateLists))
                .collect(Collectors.toList());
        // è®¡ç®—总厂的月度利用率
        UtilizationMonthDto totalUtilizationMonthDto = createTotalUtilizationMonthDto(productionId, dateLists);
        utilizationMonthDtoList.add(totalUtilizationMonthDto);
        result.put("dataList", utilizationMonthDtoList);
        return result;
    }
    /**
     * åˆ›å»ºå­ç”Ÿäº§çš„æœˆåº¦åˆ©ç”¨çއ DTO
     */
    private UtilizationMonthDto createUtilizationMonthDto(MdcProduction mdcProduction, List<String[]> dateLists) {
        UtilizationMonthDto utilizationMonthDto = new UtilizationMonthDto();
        utilizationMonthDto.setProductionId(mdcProduction.getId());
        utilizationMonthDto.setProductionName(mdcProduction.getProductionName());
        List<UtilizationMonth> utilizationMonthList = calculateUtilizationRates(mdcProduction.getId(), dateLists);
        utilizationMonthDto.setUtilizationMonthList(utilizationMonthList);
        return utilizationMonthDto;
    }
    /**
     * åˆ›å»ºæ€»åŽ‚çš„æœˆåº¦åˆ©ç”¨çŽ‡ DTO
     */
    private UtilizationMonthDto createTotalUtilizationMonthDto(String productionId, List<String[]> dateLists) {
        UtilizationMonthDto utilizationMonthDto = new UtilizationMonthDto();
        utilizationMonthDto.setProductionName("总厂");
        List<UtilizationMonth> utilizationMonthList = calculateUtilizationRatesTotal(productionId, dateLists);
        utilizationMonthDto.setUtilizationMonthList(utilizationMonthList);
        return utilizationMonthDto;
    }
    /**
     * è®¡ç®—子生产的月度利用率
     */
    private List<UtilizationMonth> calculateUtilizationRates(String productionId, List<String[]> dateLists) {
        return dateLists.stream()
                .map(dates -> {
                    UtilizationMonth utilizationMonth = new UtilizationMonth();
                    utilizationMonth.setMonth(dates[2]);
                    BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationMonth(productionId, dates[0], dates[1]);
                    utilizationMonth.setUtilizationRate(utilizationRate);
                    return utilizationMonth;
                })
                .collect(Collectors.toList());
    }
    /**
     * è®¡ç®—总厂的月度利用率
     */
    private List<UtilizationMonth> calculateUtilizationRatesTotal(String productionId, List<String[]> dateLists) {
        return dateLists.stream()
                .map(dates -> {
                    UtilizationMonth utilizationMonth = new UtilizationMonth();
                    utilizationMonth.setMonth(dates[2]);
                    BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationMonthTotal(productionId, dates[0], dates[1]);
                    utilizationMonth.setUtilizationRate(utilizationRate);
                    return utilizationMonth;
                })
                .collect(Collectors.toList());
    }
}