lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
@@ -1,22 +1,17 @@ package org.jeecg.modules.board.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import liquibase.pro.packaged.I; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.vo.DictModel; import org.jeecg.modules.board.mapper.DtBoardMapper; import org.jeecg.modules.board.service.IDtBoardService; import org.jeecg.modules.board.vo.*; import org.jeecg.modules.eam.service.IEamRepairOrderService; import org.jeecg.modules.mdc.constant.MdcConstant; import org.jeecg.modules.mdc.entity.*; import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.system.entity.MdcProduction; import org.jeecg.modules.system.service.IMdcProductionService; import org.jeecg.modules.system.service.ISysDictService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyDto.java
@@ -55,6 +55,17 @@ * å ³æºæ¶é¿ */ private BigDecimal closeLong; /** * æ éæ¶é¿ */ private BigDecimal faultLong; /** * æ éç */ private BigDecimal faultRate; /** * è¿è¡æ¶é¿(å»é¤æ éæ¶é´) */ private BigDecimal removeFaultRunLong; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyResultDto.java
@@ -43,11 +43,23 @@ */ private BigDecimal closeLong = BigDecimal.ZERO; /** * æ éæ¶é¿ */ private BigDecimal faultLong = BigDecimal.ZERO; /** * æ éç */ private BigDecimal faultRate = BigDecimal.ZERO; /** * è¿è¡æ¶é¿(å»é¤æ éæ¶é´) */ private BigDecimal removeFaultRunLong = BigDecimal.ZERO; /** * é¢è² */ private String color; public MdcEfficiencyResultDto(String theDate, BigDecimal processLong, BigDecimal utilizationRate, BigDecimal startRate, BigDecimal openRate, BigDecimal openLong, BigDecimal waitLong, BigDecimal closeLong) { public MdcEfficiencyResultDto(String theDate, BigDecimal processLong, BigDecimal utilizationRate, BigDecimal startRate, BigDecimal openRate, BigDecimal openLong, BigDecimal waitLong, BigDecimal closeLong, BigDecimal faultLong, BigDecimal faultRate, BigDecimal removeFaultRunLong) { this.theDate = theDate; this.processLong = processLong; this.utilizationRate = utilizationRate; @@ -56,6 +68,9 @@ this.openLong = openLong; this.waitLong = waitLong; this.closeLong = closeLong; this.faultLong = faultLong; this.faultRate = faultRate; this.removeFaultRunLong = removeFaultRunLong; } public MdcEfficiencyResultDto() { lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentFaultInfo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ package org.jeecg.modules.mdc.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.jeecgframework.poi.excel.annotation.Excel; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** * @Description: æ éç表 * @Author: Lius * @Date: 2025-06-16 * @Version: V1.0 */ @Data @TableName("mdc_equipment_fault_info") @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel(value = "mdc_equipment_fault_info对象", description = "æ éç表") public class MdcEquipmentFaultInfo implements Serializable { private static final long serialVersionUID = 7825739575204258911L; /** * ä¸»é® */ @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "主é®") private String id; /** * 设å¤id */ @Excel(name = "设å¤id", width = 15) @ApiModelProperty(value = "设å¤id") private String equipmentId; /** * æ éæ¶é¿ */ @Excel(name = "æ éæ¶é¿", width = 15) @ApiModelProperty(value = "æ éæ¶é¿") private Integer faultLong = 0; /** * æ éç */ @Excel(name = "æ éç", width = 15) @ApiModelProperty(value = "æ éç") private BigDecimal faultRate = BigDecimal.ZERO; /** * å»é¤æ éæ¶é´çè¿è¡æ¶é´ */ @Excel(name = "å»é¤æ éæ¶é´çè¿è¡æ¶é´", width = 15) @ApiModelProperty(value = "å»é¤æ éæ¶é´çè¿è¡æ¶é´") private Integer removeFaultRunLong = 0; /** * å»é¤æ éæ¶é´å©ç¨ç */ @Excel(name = "å»é¤æ éæ¶é´å©ç¨ç", width = 15) @ApiModelProperty(value = "å»é¤æ éæ¶é´å©ç¨ç") private BigDecimal removeFaultRate = BigDecimal.ZERO; /** * æææ¥æ */ @Excel(name = "æææ¥æ", width = 15) @ApiModelProperty(value = "æææ¥æ") private String theDate; /** * å建æ¶é´ */ @ApiModelProperty(value = "å建æ¶é´") private Date createTime; public MdcEquipmentFaultInfo() { } public MdcEquipmentFaultInfo(String equipmentId, String theDate) { this.equipmentId = equipmentId; this.theDate = theDate; } } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentFaultInfoMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package org.jeecg.modules.mdc.mapper; import org.apache.ibatis.annotations.Param; import org.jeecg.modules.mdc.entity.MdcEquipmentFaultInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.jeecg.modules.mdc.vo.EquFaultRecord; import java.util.List; /** * @Description: æ éç表 * @Author: jeecg-boot * @Date: 2025-06-16 * @Version: V1.0 */ public interface MdcEquipmentFaultInfoMapper extends BaseMapper<MdcEquipmentFaultInfo> { List<EquFaultRecord> findFaultRecord(@Param("equipmentIdList") List<String> equipmentIdList, @Param("startTime") String startTime, @Param("endTime") String endTime); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
@@ -18,10 +18,14 @@ t1.open_long / 86400 openRate, t1.open_long openLong, t1.wait_long waitLong, t1.close_long closeLong t1.close_long closeLong, COALESCE(t3.fault_long, 0) faultLong, COALESCE(t3.fault_rate, 0) faultRate, COALESCE(t3.remove_fault_run_long, 0) removeFaultRunLong FROM mdc_equipment t2 LEFT JOIN mdc_equipment_statistical_info t1 ON t1.equipment_id = t2.equipment_id LEFT JOIN mdc_equipment_fault_info t3 ON t2.equipment_id = t3.equipment_id AND t1.the_date = t3.the_date WHERE t1.the_date <= #{ vo.endTime } AND t1.the_date >= #{ vo.startTime } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentFaultInfoMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.jeecg.modules.mdc.mapper.MdcEquipmentFaultInfoMapper"> <select id="findFaultRecord" resultType="org.jeecg.modules.mdc.vo.EquFaultRecord"> SELECT t3.equipment_code equipmentId, t1.fault_start_time startTime, t2.actual_end_time endTime FROM eam_report_repair t1 LEFT JOIN eam_repair_order t2 ON t2.report_id = t1.id LEFT JOIN eam_equipment t3 ON t1.equipment_id = t3.id WHERE ( ( t1.fault_start_time BETWEEN #{startTime} AND #{endTime} ) OR ( t2.actual_end_time BETWEEN #{startTime} AND #{endTime} ) ) AND t3.equipment_code IN <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=","> #{ id } </foreach> AND t1.report_status != 'ABOLISH' </select> </mapper> lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentFaultInfoService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package org.jeecg.modules.mdc.service; import org.jeecg.modules.mdc.entity.MdcEquipmentFaultInfo; import com.baomidou.mybatisplus.extension.service.IService; /** * @Description: æ éç表 * @Author: Lius * @Date: 2025-06-16 * @Version: V1.0 */ public interface IMdcEquipmentFaultInfoService extends IService<MdcEquipmentFaultInfo> { /** * ç»è®¡æ éæ¶é¿ï¼è®¡ç®æ éç * @param parameter */ void runningAllEquFaultStatistical(String parameter); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
@@ -196,6 +196,12 @@ mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong()); mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setFaultLong(mdcEfficiencyResultDto.getFaultLong()); mdcEfficiencyResultDto.setFaultLong(mdcEfficiencyResultDto.getFaultLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setFaultRate(mdcEfficiencyResultDto.getFaultRate()); mdcEfficiencyResultDto.setFaultRate(mdcEfficiencyResultDto.getFaultRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong()); mdcEfficiencyResultDto.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { @@ -284,6 +290,12 @@ mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong()); mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setFaultLong(mdcEfficiencyResultDto.getFaultLong()); mdcEfficiencyResultDto.setFaultLong(mdcEfficiencyResultDto.getFaultLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setFaultRate(mdcEfficiencyResultDto.getFaultRate()); mdcEfficiencyResultDto.setFaultRate(mdcEfficiencyResultDto.getFaultRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong()); mdcEfficiencyResultDto.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { @@ -349,7 +361,10 @@ a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); a.getCloseLong().add(b.getCloseLong()), a.getFaultLong().add(b.getFaultLong()), a.getFaultRate().add(b.getFaultRate()), a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); @@ -392,7 +407,10 @@ a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); a.getCloseLong().add(b.getCloseLong()), a.getFaultLong().add(b.getFaultLong()), a.getFaultRate().add(b.getFaultRate()), a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); @@ -696,7 +714,10 @@ a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); a.getCloseLong().add(b.getCloseLong()), a.getFaultLong().add(b.getFaultLong()), a.getFaultRate().add(b.getFaultRate()), a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); @@ -706,6 +727,9 @@ mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setFaultLong(mdcEfficiencyResultDto.getFaultLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setFaultRate(mdcEfficiencyResultDto.getFaultRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { @@ -740,12 +764,16 @@ a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); a.getCloseLong().add(b.getCloseLong()), a.getFaultLong().add(b.getFaultLong()), a.getFaultRate().add(b.getFaultRate()), a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setFaultRate(mdcEfficiencyResultDto.getFaultRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { @@ -2146,6 +2174,9 @@ mdcEfficiencyResultDto.setOpenLong(efficiencyDto.getOpenLong()); mdcEfficiencyResultDto.setWaitLong(efficiencyDto.getWaitLong()); mdcEfficiencyResultDto.setCloseLong(efficiencyDto.getCloseLong()); mdcEfficiencyResultDto.setFaultLong(efficiencyDto.getFaultLong()); mdcEfficiencyResultDto.setFaultRate(efficiencyDto.getFaultRate()); mdcEfficiencyResultDto.setRemoveFaultRunLong(efficiencyDto.getRemoveFaultRunLong()); long rate = efficiencyDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { @@ -2163,6 +2194,9 @@ mdcEfficiencyResultDto.setOpenLong(new BigDecimal("0")); mdcEfficiencyResultDto.setWaitLong(new BigDecimal("0")); mdcEfficiencyResultDto.setCloseLong(new BigDecimal("0")); mdcEfficiencyResultDto.setFaultLong(new BigDecimal("0")); mdcEfficiencyResultDto.setFaultRate(new BigDecimal("0")); mdcEfficiencyResultDto.setRemoveFaultRunLong(new BigDecimal("0")); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); @@ -2178,6 +2212,9 @@ mdcEfficiencyResultDto.setOpenLong(new BigDecimal("0")); mdcEfficiencyResultDto.setWaitLong(new BigDecimal("0")); mdcEfficiencyResultDto.setCloseLong(new BigDecimal("0")); mdcEfficiencyResultDto.setFaultLong(new BigDecimal("0")); mdcEfficiencyResultDto.setFaultRate(new BigDecimal("0")); mdcEfficiencyResultDto.setRemoveFaultRunLong(new BigDecimal("0")); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); @@ -2191,6 +2228,9 @@ efficiencyResultDto.setOpenLong(efficiencyResultDto.getOpenLong().add(mdcEfficiencyResultDto.getOpenLong())); efficiencyResultDto.setWaitLong(efficiencyResultDto.getWaitLong().add(mdcEfficiencyResultDto.getWaitLong())); efficiencyResultDto.setCloseLong(efficiencyResultDto.getCloseLong().add(mdcEfficiencyResultDto.getCloseLong())); efficiencyResultDto.setFaultLong(efficiencyResultDto.getFaultLong().add(mdcEfficiencyResultDto.getFaultLong())); efficiencyResultDto.setFaultRate(efficiencyResultDto.getFaultRate().add(mdcEfficiencyResultDto.getFaultRate())); efficiencyResultDto.setRemoveFaultRunLong(efficiencyResultDto.getRemoveFaultRunLong().add(mdcEfficiencyResultDto.getRemoveFaultRunLong())); return mdcEfficiencyResultDto; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentFaultInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,324 @@ package org.jeecg.modules.mdc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.commons.lang.StringUtils; import org.jeecg.modules.mdc.entity.*; import org.jeecg.modules.mdc.mapper.MdcEquipmentFaultInfoMapper; import org.jeecg.modules.mdc.service.IEquipmentService; import org.jeecg.modules.mdc.service.IMdcEquipmentFaultInfoService; import org.jeecg.modules.mdc.service.IMdcEquipmentRunningSectionService; import org.jeecg.modules.mdc.service.IMdcSystemParametersService; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.vo.EquFaultRecord; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; /** * @Description: æ éç表 * @Author: Lius * @Date: 2025-06-16 * @Version: V1.0 */ @Service public class MdcEquipmentFaultInfoServiceImpl extends ServiceImpl<MdcEquipmentFaultInfoMapper, MdcEquipmentFaultInfo> implements IMdcEquipmentFaultInfoService { @Resource private IEquipmentService equipmentService; @Resource private IMdcSystemParametersService mdcSystemParametersService; @Resource private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService; @Override @Transactional(rollbackFor = {Exception.class}) public void runningAllEquFaultStatistical(String dateTime) { String validDate = LocalDate.now().minusDays(1).toString().replaceAll("-", ""); if (StringUtils.isNotBlank(dateTime)) { validDate = DateUtils.format(DateUtils.toDate(dateTime, DateUtils.STRDATE), DateUtils.STRDATE); } try { this.remove(new LambdaQueryWrapper<MdcEquipmentFaultInfo>().eq(MdcEquipmentFaultInfo::getTheDate, validDate)); } catch (Exception e) { log.error("åæ°æ ¼å¼ä¸å¯¹", e); } List<Equipment> equipmentList = equipmentService.list(); if (equipmentList == null || equipmentList.isEmpty()) { return; } Map<String, MdcEquipmentFaultInfo> map = new HashMap<>(); String finalValidDate = validDate; equipmentList.forEach(equipment -> { MdcEquipmentFaultInfo mdcEquipmentFaultInfo = new MdcEquipmentFaultInfo(equipment.getEquipmentid(), finalValidDate); map.put(equipment.getEquipmentid(), mdcEquipmentFaultInfo); }); String planTime = "00:00:00"; MdcSystemParameters mdcSystemParameters = mdcSystemParametersService.getOne(new LambdaQueryWrapper<MdcSystemParameters>().eq(MdcSystemParameters::getCode, "equip_log_statis_time")); if (mdcSystemParameters != null) { planTime = mdcSystemParameters.getValue(); } List<String> equipmentIdList = equipmentList.stream().map(Equipment::getEquipmentid).collect(Collectors.toList()); String startTime = DateUtils.format(DateUtils.setTimeForDay(DateUtils.toDate(validDate, DateUtils.STRDATE), planTime), DateUtils.STR_DATE_TIME_SMALL); Date start = DateUtils.toDate(startTime, DateUtils.STR_DATE_TIME_SMALL); String endTime = DateUtils.format(DateUtils.addDays(DateUtils.toDate(startTime, DateUtils.STR_DATE_TIME_SMALL), 1), DateUtils.STR_DATE_TIME_SMALL); Date end = DateUtils.toDate(endTime, DateUtils.STR_DATE_TIME_SMALL); //æ¥è¯¢æ éè®°å½ List<EquFaultRecord> equFaultRecordList = this.baseMapper.findFaultRecord(equipmentIdList, startTime, endTime); if (equFaultRecordList != null && !equFaultRecordList.isEmpty()) { // ä¿®æ´æ¶é´ Map<String, List<EquFaultRecord>> equFaultRecordMap = equFaultRecordList.stream().collect(Collectors.groupingBy(EquFaultRecord::getEquipmentId)); equFaultRecordMap.forEach((key, value) -> { if (map.containsKey(key)) { MdcEquipmentFaultInfo equFaultRecords = map.get(key); long faultLong = calculateTotalFaultDuration(value, start, end); equFaultRecords.setFaultLong((int) faultLong); if (faultLong != 0) { equFaultRecords.setFaultRate(new BigDecimal(faultLong).divide(new BigDecimal("86400"), 2, RoundingMode.HALF_UP)); } // 计ç®å»é¤æ éæ¶é¿çå å·¥æ¶é´ // step.1 æ¥è¯¢å å·¥æ¶é´ List<MdcEquipmentRunningSection> mdcEquipmentRunningSections = mdcEquipmentRunningSectionService.selectRunningData(key, start, end); if (mdcEquipmentRunningSections != null && !mdcEquipmentRunningSections.isEmpty()) { // æ¶é´ä¿®æ£ if (mdcEquipmentRunningSections.get(0).getStartTime().before(start)) { mdcEquipmentRunningSections.get(0).setStartTime(start); } if (mdcEquipmentRunningSections.size() > 1) { if (mdcEquipmentRunningSections.get(mdcEquipmentRunningSections.size() - 1).getEndTime().after(end)) { mdcEquipmentRunningSections.get(mdcEquipmentRunningSections.size() - 1).setEndTime(end); } } else { if (mdcEquipmentRunningSections.get(0).getEndTime().after(end)) { mdcEquipmentRunningSections.get(0).setEndTime(end); } } // step.2 计ç®å»é¤æ éæ¶é¿çå å·¥æ¶é´ long processingTime = calculateProcessingTimeWithoutFaults(mdcEquipmentRunningSections, value, start, end); equFaultRecords.setRemoveFaultRunLong((int) processingTime); if (faultLong != 0) { // 计ç®å»é¤æ éæ¶é¿çå©ç¨ç BigDecimal removeFaultRate = new BigDecimal(processingTime).divide(new BigDecimal("86400").subtract(new BigDecimal(faultLong)), 2, RoundingMode.HALF_UP); equFaultRecords.setRemoveFaultRate(removeFaultRate); } } map.put(key, equFaultRecords); } }); } if (!map.isEmpty()) { this.saveBatch(new ArrayList<>(map.values())); } } public static long calculateTotalFaultDuration(List<EquFaultRecord> records, Date startTime, Date endTime) { LocalDateTime start = convertToLocalDateTime(startTime); LocalDateTime end = convertToLocalDateTime(endTime); // ä¿®æ£è®°å½æ¶é´ List<EquFaultRecord> correctedRecords = correctRecordTimes(records, start, end); // æå¼å§æ¶é´æåº correctedRecords.sort(Comparator.comparing(EquFaultRecord::getStartTime)); // åå¹¶éå æ¶é´æ®µ List<TimeInterval> mergedIntervals = mergeIntervals(correctedRecords); // è®¡ç®æ»æ¶é¿ï¼ç§ï¼ return mergedIntervals.stream() .mapToLong(interval -> ChronoUnit.SECONDS.between(interval.start, interval.end)) .sum(); } private static List<EquFaultRecord> correctRecordTimes(List<EquFaultRecord> records, LocalDateTime startTime, LocalDateTime endTime) { return records.stream() .map(record -> { LocalDateTime recordStart = convertToLocalDateTime(record.getStartTime()); LocalDateTime recordEnd = record.getEndTime() != null ? convertToLocalDateTime(record.getEndTime()) : null; // ä¿®æ£å¼å§æ¶é´ LocalDateTime correctedStart = recordStart.isBefore(startTime) ? startTime : recordStart; // ä¿®æ£ç»ææ¶é´ LocalDateTime correctedEnd = recordEnd == null || recordEnd.isAfter(endTime) ? endTime : recordEnd; // å建修æ£åçè®°å½ return new EquFaultRecord( record.getEquipmentId(), convertToDate(correctedStart), convertToDate(correctedEnd) ); }) .collect(Collectors.toList()); } private static List<TimeInterval> mergeIntervals(List<EquFaultRecord> records) { List<TimeInterval> intervals = records.stream() .map(record -> new TimeInterval( convertToLocalDateTime(record.getStartTime()), convertToLocalDateTime(record.getEndTime()))) .collect(Collectors.toList()); if (intervals.isEmpty()) { return Collections.emptyList(); } List<TimeInterval> merged = new ArrayList<>(); TimeInterval current = intervals.get(0); for (int i = 1; i < intervals.size(); i++) { TimeInterval next = intervals.get(i); if (next.start.isBefore(current.end) || next.start.equals(current.end)) { // æéå ï¼åå¹¶åºé´ current.end = current.end.isAfter(next.end) ? current.end : next.end; } else { // æ éå ï¼æ·»å å½ååºé´å¹¶æ´æ°å½ååºé´ merged.add(current); current = next; } } merged.add(current); // æ·»å æåä¸ä¸ªåºé´ return merged; } // Dateä¸LocalDateTimeäºç¸è½¬æ¢çå·¥å ·æ¹æ³ private static LocalDateTime convertToLocalDateTime(Date date) { if (date == null) { return null; } return Instant.ofEpochMilli(date.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); } private static Date convertToDate(LocalDateTime localDateTime) { if (localDateTime == null) { return null; } return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); } static class TimeInterval { LocalDateTime start; LocalDateTime end; public TimeInterval(LocalDateTime start, LocalDateTime end) { this.start = start; this.end = end; } } // 计ç®å»é¤æ éæ¶é¿åçå å·¥æ¶é´ private long calculateProcessingTimeWithoutFaults( List<MdcEquipmentRunningSection> runningSections, List<EquFaultRecord> faultRecords, Date startTime, Date endTime) { // 转æ¢ä¸ºLocalDateTimeè¿è¡å¤ç LocalDateTime start = convertToLocalDateTime(startTime); LocalDateTime end = convertToLocalDateTime(endTime); // å°æ éè®°å½è½¬æ¢ä¸ºæ¶é´åºé´å¹¶åå¹¶éå é¨å // List<TimeInterval> faultIntervals = faultRecords.stream() // .map(record -> new TimeInterval( // convertToLocalDateTime(record.getStartTime()), // convertToLocalDateTime(record.getEndTime()))) // .collect(Collectors.toList()); List<TimeInterval> mergedFaultIntervals = mergeIntervals(faultRecords); long totalProcessingTime = 0; // éåæ¯ä¸ªå å·¥åºé´ï¼æé¤æ éæ¶é´ for (MdcEquipmentRunningSection section : runningSections) { LocalDateTime sectionStart = convertToLocalDateTime(section.getStartTime()); LocalDateTime sectionEnd = convertToLocalDateTime(section.getEndTime()); // æé¤æ éæ¶é´åçææå å·¥æ¶é´ List<TimeInterval> validIntervals = excludeFaultsFromSection( new TimeInterval(sectionStart, sectionEnd), mergedFaultIntervals); // ç´¯å ææå å·¥æ¶é´ï¼ç§ï¼ for (TimeInterval interval : validIntervals) { totalProcessingTime += ChronoUnit.SECONDS.between(interval.start, interval.end); } } return totalProcessingTime; } // ä»è¿è¡åºé´ä¸æé¤æ éæ¶é´ private List<TimeInterval> excludeFaultsFromSection( TimeInterval section, List<TimeInterval> faultIntervals) { List<TimeInterval> validIntervals = new ArrayList<>(); validIntervals.add(section); // éåæ¯ä¸ªæ éåºé´ï¼ä»ææåºé´ä¸æ£é¤ for (TimeInterval fault : faultIntervals) { List<TimeInterval> newValidIntervals = new ArrayList<>(); for (TimeInterval valid : validIntervals) { // è®¡ç®ææåºé´ä¸æ éåºé´ç交é if (isOverlapping(valid, fault)) { // å岿æåºé´ splitInterval(valid, fault, newValidIntervals); } else { // æ 交éï¼ä¿çåææåºé´ newValidIntervals.add(valid); } } validIntervals = newValidIntervals; } return validIntervals; } // å¤æä¸¤ä¸ªæ¶é´åºé´æ¯å¦éå private boolean isOverlapping(TimeInterval a, TimeInterval b) { return a.start.isBefore(b.end) && b.start.isBefore(a.end); } // åå²åºé´ï¼æ£é¤éå é¨åï¼ private void splitInterval( TimeInterval valid, TimeInterval fault, List<TimeInterval> result) { // éå åçé¨å if (valid.start.isBefore(fault.start)) { result.add(new TimeInterval(valid.start, fault.start)); } // éå åçé¨å if (valid.end.isAfter(fault.end)) { result.add(new TimeInterval(fault.end, valid.end)); } } } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
@@ -520,9 +520,9 @@ //è·årunningè¿è¡çæ¥å¿è®°å½ List<MdcEquipmentRunningSection> list = this.equipmentRunningTracesLog(equipment.getEquipmentid()); if (list != null && !list.isEmpty()) { List<MdcEquipmentRunningSection> equipList = addSequenceNumber(list); //æ·»å ç¨åºå· this.ergodicTrim(equipList); super.saveBatch(equipList); // List<MdcEquipmentRunningSection> equipList = addSequenceNumber(list); //æ·»å ç¨åºå· this.ergodicTrim(list); super.saveBatch(list); } //è·åæ¥è¦çæ¥å¿è®°å½ List<MdcEquipmentRunningSection> errorList = this.equipmentRunningTracesErrorLog(equipment.getEquipmentid()); lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java
@@ -37,10 +37,7 @@ private IMdcSystemParametersService mdcSystemParametersService; @Resource private ISysDictService sysDictService; @Resource private IEquipmentStatisticalInfoService equipmentStatisticalInfoService; private IMdcEquipmentFaultInfoService mdcEquipmentFaultInfoService; /** * 计ç®è®¾å¤åæ¥è¿è¡æ°æ® @@ -69,28 +66,8 @@ } if (!result.isEmpty()) { this.saveBatch(result); List<DictModel> dictList = sysDictService.queryDictItemsByCode("data_synchronization_flag"); if (dictList != null && !dictList.isEmpty() && "0".equals(dictList.get(0).getValue())) { List<EquipmentStatisticalInfo> list = this.dataHandle(result); equipmentStatisticalInfoService.saveBatch(list); } } } private List<EquipmentStatisticalInfo> dataHandle(List<MdcEquipmentStatisticalInfo> list) { List<EquipmentStatisticalInfo> result = new ArrayList<>(); list.forEach(item -> { EquipmentStatisticalInfo equipmentStatisticalInfo = new EquipmentStatisticalInfo(); equipmentStatisticalInfo.setEquipment(item.getEquipmentId()); equipmentStatisticalInfo.setTheDate(item.getTheDate()); equipmentStatisticalInfo.setClosedLong(item.getCloseLong()); equipmentStatisticalInfo.setOpeningLong(item.getOpenLong()); equipmentStatisticalInfo.setErroringLong(item.getErrorLong()); equipmentStatisticalInfo.setProcessingLong(item.getProcessLong()); equipmentStatisticalInfo.setWaitingLong(item.getWaitLong()); result.add(equipmentStatisticalInfo); }); return result; mdcEquipmentFaultInfoService.runningAllEquFaultStatistical(dateTime); } private List<MdcEquipmentStatisticalInfo> equipmentStatisticalProcess(Equipment equipment, String dateTime) { @@ -141,7 +118,6 @@ List<MdcEquipmentRunningSection> equipmentRunningSectionList = mdcEquipmentRunningSectionService.listForEquipmentStatisticalInfo(equipment.getEquipmentid(), startDate, endDate); return this.statisticsData(equipmentRunningSectionList, planTime, startDate, endDate, equipment); } else { //å¾ éªè¯ Date end = DateUtils.plusTime(initDate, 1); endDate = DateUtils.setTimeForDay(end, planTime); List<MdcEquipmentRunningSection> equipmentRunningSectionList = mdcEquipmentRunningSectionService.listForEquipmentStatisticalInfo(equipment.getEquipmentid(), startDate, endDate); lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/EquFaultRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ package org.jeecg.modules.mdc.vo; import lombok.Data; import java.util.Date; /** * @Author: Lius * @CreateTime: 2025-06-16 * @Description: */ @Data public class EquFaultRecord { /** * 设å¤ç¼å· */ private String equipmentId; /** * å¼å§æ¶é´ */ private Date startTime; /** * ç»ææ¶é´ */ private Date endTime; public EquFaultRecord(String equipmentId, Date startTime, Date endTime) { this.equipmentId = equipmentId; this.startTime = startTime; this.endTime = endTime; } }