From d0f024586f38a11662787c42b84e037a1c1be6cd Mon Sep 17 00:00:00 2001 From: Lius <Lius2225@163.com> Date: 星期二, 17 六月 2025 09:06:30 +0800 Subject: [PATCH] 设备故障率、设备去除故障时间利用率算法 --- lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentFaultInfoMapper.java | 19 + lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentFaultInfoServiceImpl.java | 324 +++++++++++++++++++++++++++++ lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/EquFaultRecord.java | 32 ++ lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java | 6 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java | 28 -- lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyDto.java | 13 + lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentFaultInfoMapper.xml | 22 ++ lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java | 5 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyResultDto.java | 17 + lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java | 48 ++++ lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentFaultInfoService.java | 19 + lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentFaultInfo.java | 87 +++++++ lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml | 6 13 files changed, 585 insertions(+), 41 deletions(-) diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java index f6fc360..38d74e0 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java +++ b/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; diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyDto.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyDto.java index d868159..1e6d764 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyDto.java +++ b/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; } diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyResultDto.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyResultDto.java index 6ce2977..2086182 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyResultDto.java +++ b/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() { diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentFaultInfo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentFaultInfo.java new file mode 100644 index 0000000..575a8c7 --- /dev/null +++ b/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; + } +} diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentFaultInfoMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentFaultInfoMapper.java new file mode 100644 index 0000000..11cc065 --- /dev/null +++ b/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); +} diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml index b249fad..b5d68c6 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml +++ b/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 } diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentFaultInfoMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentFaultInfoMapper.xml new file mode 100644 index 0000000..6bf12b9 --- /dev/null +++ b/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> \ No newline at end of file diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentFaultInfoService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentFaultInfoService.java new file mode 100644 index 0000000..ce9e4db --- /dev/null +++ b/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); +} 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 631c938..55ea7fd 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 @@ -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; } diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentFaultInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentFaultInfoServiceImpl.java new file mode 100644 index 0000000..189a144 --- /dev/null +++ b/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涓嶭ocalDateTime浜掔浉杞崲鐨勫伐鍏锋柟娉� + 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) { + + // 杞崲涓篖ocalDateTime杩涜澶勭悊 + 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)); + } + } + +} diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java index 47fe41c..d171beb 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java +++ b/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()); diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java index c149df2..4e6a883 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalInfoServiceImpl.java +++ b/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); diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/EquFaultRecord.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/EquFaultRecord.java new file mode 100644 index 0000000..beae4c6 --- /dev/null +++ b/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; + } +} -- Gitblit v1.9.3