From b5d02520af582a86aa95d7903558a5bf50a77aa7 Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期二, 17 六月 2025 16:12:46 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java | 4 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 | 298 +++++++++++++++++++++ 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 | 123 +++++++- 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/vo/TimeInterval.java | 21 + 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 | 26 + 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/mapper/MdcEquipmentRunningSectionMapper.java | 3 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java | 11 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java | 8 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/mapper/xml/MdcEquipmentRunningSectionMapper.xml | 19 + 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/entity/MdcEquipmentRunningSection.java | 11 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java | 32 ++ lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml | 6 21 files changed, 765 insertions(+), 65 deletions(-) diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java index 183133e..45a9c0a 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/GuideCardBatchServiceImpl.java @@ -129,16 +129,15 @@ guideCardBatch.setProcessWorkCode(workStep.getStepCode()); partsInfo=partsInfoService.getById(workStep.getPartsId()); } - if (partsInfo==null){ - return false; - } guideCardBatch.setDocId(docId); guideCardBatch.setSerialNumber(getSerialNumber("C140")); guideCardBatch.setUnit(sysDictService.queryDictTextByKey("unit_code", "C140")); guideCardBatch.setDocName(docInfo.getDocName()); - guideCardBatch.setPartsCode(partsInfo.getPartsCode()); - guideCardBatch.setPartsName(partsInfo.getPartsName()); - guideCardBatch.setMaterielDesp(partsInfo.getMaterielDesp()); + if (partsInfo!=null){ + guideCardBatch.setPartsCode(partsInfo.getPartsCode()); + guideCardBatch.setPartsName(partsInfo.getPartsName()); + guideCardBatch.setMaterielDesp(partsInfo.getMaterielDesp()); + } guideCardBatch.setCompiler(user.getUsername()); guideCardBatch.setCreateTime(new Date()); return this.save(guideCardBatch); diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java index 8b1fc58..c876f4e 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java @@ -540,10 +540,10 @@ List<DeviceType> deviceTypeList = deviceTypeService.getDeviceTypeByAttribution(processIds, DocAttributionTypeEnum.PROCESS.getCode(),treeInfoRequest.getDeviceManagementName(),treeInfoRequest.getDeviceManagementCode()); if (deviceTypeList != null && !deviceTypeList.isEmpty()) { - List<String> deviceManagementIds=deviceTypeList.stream().map(DeviceType::getId).collect(Collectors.toList()); + List<String> deviceTypeIds=deviceTypeList.stream().map(DeviceType::getId).collect(Collectors.toList()); DocInfoQueryRequest docQuery = new DocInfoQueryRequest(); BeanUtil.copyProperties(treeInfoRequest,docQuery); - docQuery.setAttributionIds(String.join(",",deviceManagementIds)); + docQuery.setAttributionIds(String.join(",",deviceTypeIds)); docQuery.setDocClassCode("NC"); docQuery.setAttributionType(DocAttributionTypeEnum.PROCESS.getCode()); docInfos=docInfoService.findListByDocQuery(docQuery); @@ -554,6 +554,10 @@ treeInfoRequest.setProcessIds(id); List<DocInfo> docInfoList = workStepService.getByWorkStepNCFile(treeInfoRequest); docInfos.addAll(docInfoList); + }else { + treeInfoRequest.setProcessIds(processIds); + List<DocInfo> docInfoList = workStepService.getByWorkStepNCFile(treeInfoRequest); + docInfos.addAll(docInfoList); } return docInfos; } diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java index 37623aa..56a9a0d 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java @@ -469,10 +469,10 @@ List<DeviceType> deviceTypeList = deviceTypeService.getDeviceTypeByAttribution(workStepIds, DocAttributionTypeEnum.WORKSITE.getCode(),treeInfoRequest.getDeviceManagementName(),treeInfoRequest.getDeviceManagementCode()); if (deviceTypeList != null && !deviceTypeList.isEmpty()) { - List<String> deviceManagementIds=deviceTypeList.stream().map(DeviceType::getDeviceManagementId).collect(Collectors.toList()); + List<String> deviceTypeIds=deviceTypeList.stream().map(DeviceType::getId).collect(Collectors.toList()); DocInfoQueryRequest docQuery = new DocInfoQueryRequest(); BeanUtil.copyProperties(treeInfoRequest,docQuery); - docQuery.setAttributionIds(String.join(",",deviceManagementIds)); + docQuery.setAttributionIds(String.join(",",deviceTypeIds)); docQuery.setDocClassCode("NC"); docQuery.setAttributionType(DocAttributionTypeEnum.WORKSITE.getCode()); docInfos=docInfoService.findListByDocQuery(docQuery); diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java index 1a41d3e..34592cb 100644 --- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java +++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java @@ -6,9 +6,7 @@ import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.DayOfWeek; -import java.time.LocalDate; -import java.time.ZoneId; +import java.time.*; import java.time.temporal.ChronoField; import java.time.temporal.ChronoUnit; import java.util.*; @@ -1086,4 +1084,32 @@ return dateString; } + + /** + * Date涓嶭ocalDateTime浜掔浉杞崲鐨勫伐鍏锋柟娉� + * + * @param date + * @return + */ + public static LocalDateTime convertToLocalDateTime(Date date) { + if (date == null) { + return null; + } + return Instant.ofEpochMilli(date.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + /** + * Date涓嶭ocalDateTime浜掔浉杞崲鐨勫伐鍏锋柟娉� + * + * @param localDateTime + * @return + */ + public static Date convertToDate(LocalDateTime localDateTime) { + if (localDateTime == null) { + return null; + } + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } } 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/entity/MdcEquipmentRunningSection.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java index df2abf4..00110c7 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentRunningSection.java @@ -100,4 +100,15 @@ @TableField(exist = false) private Set<TmpEquipmentAlarm> tmpEquipmentAlarmSet; + public MdcEquipmentRunningSection() { + } + + public MdcEquipmentRunningSection(Integer status, String equipmentId, Date startTime, Date endTime, Long startLong, Long endLong) { + this.status = status; + this.equipmentId = equipmentId; + this.startTime = startTime; + this.endTime = endTime; + this.startLong = startLong; + this.endLong = endLong; + } } 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/MdcEquipmentRunningSectionMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java index 3395eea..602ee5c 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java @@ -5,6 +5,7 @@ import org.jeecg.modules.mdc.dto.MdcAlarmListDto; import org.jeecg.modules.mdc.dto.MdcEquipmentWaitSectionDto; import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection; +import org.jeecg.modules.mdc.vo.EquFaultRecord; import org.jeecg.modules.mdc.vo.MdcAlarmAnalyzeQueryVo; import java.util.Date; @@ -78,4 +79,6 @@ List<Integer> getDataList(@Param("equipmentId") String equipmentId, @Param("date") Date date); List<MdcEquipmentWaitSectionDto> findWaitList(@Param("date") String date); + + List<EquFaultRecord> findFaultList(@Param("equipmentId") String equipmentId, @Param("startTime") Date startTime, @Param("endTime") Date 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..35d17f7 --- /dev/null +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentFaultInfoMapper.xml @@ -0,0 +1,26 @@ +<?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} ) + OR ( t1.fault_start_time < #{startTime} AND t2.actual_end_time IS NULL ) + ) + 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/mapper/xml/MdcEquipmentRunningSectionMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml index dd35b9f..b2eeea9 100644 --- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml @@ -188,5 +188,24 @@ equipment_id, start_time DESC </select> + <select id="findFaultList" 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} ) + OR ( t1.fault_start_time < #{startTime} AND t2.actual_end_time IS NULL ) + ) + AND t3.equipment_code = #{equipmentId} + 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..df0f7c6 --- /dev/null +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentFaultInfoServiceImpl.java @@ -0,0 +1,298 @@ +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.jeecg.modules.mdc.vo.TimeInterval; +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 = DateUtils.convertToLocalDateTime(startTime); + LocalDateTime end = DateUtils.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.getStart(), interval.getEnd())) + .sum(); + } + + private static List<EquFaultRecord> correctRecordTimes(List<EquFaultRecord> records, LocalDateTime startTime, LocalDateTime endTime) { + return records.stream() + .map(record -> { + LocalDateTime recordStart = DateUtils.convertToLocalDateTime(record.getStartTime()); + LocalDateTime recordEnd = record.getEndTime() != null ? + DateUtils.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(), + DateUtils.convertToDate(correctedStart), + DateUtils.convertToDate(correctedEnd) + ); + }) + .collect(Collectors.toList()); + } + + private static List<TimeInterval> mergeIntervals(List<EquFaultRecord> records) { + List<TimeInterval> intervals = records.stream() + .map(record -> new TimeInterval( + DateUtils.convertToLocalDateTime(record.getStartTime()), + DateUtils.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.getStart().isBefore(current.getEnd()) || next.getStart().equals(current.getEnd())) { + // 鏈夐噸鍙狅紝鍚堝苟鍖洪棿 + current.setEnd(current.getEnd().isAfter(next.getEnd()) ? current.getEnd() : next.getEnd()); + } else { + // 鏃犻噸鍙狅紝娣诲姞褰撳墠鍖洪棿骞舵洿鏂板綋鍓嶅尯闂� + merged.add(current); + current = next; + } + } + merged.add(current); // 娣诲姞鏈�鍚庝竴涓尯闂� + + return merged; + } + + // 璁$畻鍘婚櫎鏁呴殰鏃堕暱鍚庣殑鍔犲伐鏃堕棿 + private long calculateProcessingTimeWithoutFaults( + List<MdcEquipmentRunningSection> runningSections, + List<EquFaultRecord> faultRecords, + Date startTime, + Date endTime) { + + // 杞崲涓篖ocalDateTime杩涜澶勭悊 + LocalDateTime start = DateUtils.convertToLocalDateTime(startTime); + LocalDateTime end = DateUtils.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 = DateUtils.convertToLocalDateTime(section.getStartTime()); + LocalDateTime sectionEnd = DateUtils.convertToLocalDateTime(section.getEndTime()); + + // 鎺掗櫎鏁呴殰鏃堕棿鍚庣殑鏈夋晥鍔犲伐鏃堕棿 + List<TimeInterval> validIntervals = excludeFaultsFromSection( + new TimeInterval(sectionStart, sectionEnd), + mergedFaultIntervals); + + // 绱姞鏈夋晥鍔犲伐鏃堕棿锛堢锛� + for (TimeInterval interval : validIntervals) { + totalProcessingTime += ChronoUnit.SECONDS.between(interval.getStart(), interval.getEnd()); + } + } + + 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.getStart().isBefore(b.getEnd()) && b.getStart().isBefore(a.getEnd()); + } + + // 鍒嗗壊鍖洪棿锛堟墸闄ら噸鍙犻儴鍒嗭級 + private void splitInterval( + TimeInterval valid, + TimeInterval fault, + List<TimeInterval> result) { + + // 閲嶅彔鍓嶇殑閮ㄥ垎 + if (valid.getStart().isBefore(fault.getStart())) { + result.add(new TimeInterval(valid.getStart(), fault.getStart())); + } + + // 閲嶅彔鍚庣殑閮ㄥ垎 + if (valid.getEnd().isAfter(fault.getEnd())) { + result.add(new TimeInterval(fault.getEnd(), valid.getEnd())); + } + } + +} 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..158aca7 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 @@ -13,15 +13,20 @@ import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.util.TimeFieldUtils; +import org.jeecg.modules.mdc.vo.EquFaultRecord; import org.jeecg.modules.mdc.vo.MdcAlarmAnalyzeQueryVo; import org.jeecg.modules.mdc.vo.MdcEquipmentRunningSectionVo; +import org.jeecg.modules.mdc.vo.TimeInterval; import org.jeecg.modules.system.service.ISysDictService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 璁惧杩愯鏃舵鐘舵�佽〃 @@ -64,6 +69,8 @@ List<MdcEquipmentRunningSection> running = loadEquipmentRunningTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); //鏌ヨ鎶ヨ鏁版嵁 List<MdcEquipmentRunningSection> errs = loadEquipmentErrorTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); + //鏌ヨ鏁呴殰鏁版嵁 + List<MdcEquipmentRunningSection> faults = loadEquipmentFaultTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); Equipment equip = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().eq(Equipment::getEquipmentid, equipmentRunningSectionVo.getEquipmentId())); if (!running.isEmpty()) { MdcEquipmentRunningSectionDto dto; @@ -100,22 +107,12 @@ } } } -// Set<TmpEquipmentAlarm> set = entity.getTmpEquipmentAlarmSet(); -// if (entity.getStatus() == 22 && set != null && !set.isEmpty()) { -// Iterator<TmpEquipmentAlarm> iterator = entity.getTmpEquipmentAlarmSet().iterator(); -// //鑾峰彇鎶ヨ缂栧彿鐩稿悓鐨勬姤璀︿俊鎭� -// while (iterator.hasNext()) { -// TmpEquipmentAlarm next = iterator.next(); -// if (StringUtils.isNotBlank(next.getAlarmNo()) && next.getAlarmNo().equals(entity.getStatus())) { -// dto.setAlarmContent(next.getAlarmContent()); -// } -// } -// } dtos.add(dto); } } List<MdcEquipmentRunningSectionDto> result = new ArrayList<>(); + //鍚堝苟鐩稿悓鐘舵�佹暟鎹� for (int i = 0; i < dtos.size() - 1; i++) { MdcEquipmentRunningSectionDto mdcEquipmentRunningSectionDto = dtos.get(i); @@ -141,7 +138,105 @@ result.addAll(dtos); } + if (faults != null && !faults.isEmpty()) { + MdcEquipmentRunningSectionDto dto; + for (MdcEquipmentRunningSection entity : faults) { + dto = new MdcEquipmentRunningSectionDto(); + BeanUtils.copyProperties(entity, dto); + result.add(dto); + } + } + return result; + } + + private List<MdcEquipmentRunningSection> loadEquipmentFaultTrace(String equipmentId, String collectTimeStr) { + List<MdcEquipmentRunningSection> result = new ArrayList<>(); + Date startTime = DateUtils.getShortDate(collectTimeStr); + Date now = DateUtils.removeTime(DateUtils.getNow()); + long second = DateUtils.differentSecond(startTime, now); + Date endTime = DateUtils.plusTime(startTime, 1); + if (collectTimeStr.equals(LocalDate.now().toString())) { + endTime = DateUtils.getNow(); + } + if (second < 0) { + return Collections.emptyList(); + } else { + List<EquFaultRecord> equFaultRecordList = this.baseMapper.findFaultList(equipmentId, startTime, endTime); + if (equFaultRecordList != null && !equFaultRecordList.isEmpty()) { + + // 淇璁板綍鏃堕棿 + List<EquFaultRecord> correctedRecords = correctRecordTimes(equFaultRecordList, DateUtils.convertToLocalDateTime(startTime), DateUtils.convertToLocalDateTime(endTime)); + + // 鎸夊紑濮嬫椂闂存帓搴� + correctedRecords.sort(Comparator.comparing(EquFaultRecord::getStartTime)); + + // 鍚堝苟閲嶅彔鏃堕棿娈� + List<TimeInterval> mergedIntervals = mergeIntervals(correctedRecords); + + for (TimeInterval mergedInterval : mergedIntervals) { + MdcEquipmentRunningSection mdcEquipmentRunningSection = new MdcEquipmentRunningSection(25, equipmentId, DateUtils.convertToDate(mergedInterval.getStart()), DateUtils.convertToDate(mergedInterval.getEnd()), DateUtils.convertToDate(mergedInterval.getStart()).getTime(), DateUtils.convertToDate(mergedInterval.getEnd()).getTime()); + mdcEquipmentRunningSection.setDuration(DateUtils.differentSecond(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime())); + result.add(mdcEquipmentRunningSection); + } + } + } + return result; + } + + private static List<EquFaultRecord> correctRecordTimes(List<EquFaultRecord> records, LocalDateTime startTime, LocalDateTime endTime) { + return records.stream() + .map(record -> { + LocalDateTime recordStart = DateUtils.convertToLocalDateTime(record.getStartTime()); + LocalDateTime recordEnd = record.getEndTime() != null ? + DateUtils.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(), + DateUtils.convertToDate(correctedStart), + DateUtils.convertToDate(correctedEnd) + ); + }) + .collect(Collectors.toList()); + } + + private static List<TimeInterval> mergeIntervals(List<EquFaultRecord> records) { + List<TimeInterval> intervals = records.stream() + .map(record -> new TimeInterval( + DateUtils.convertToLocalDateTime(record.getStartTime()), + DateUtils.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.getStart().isBefore(current.getEnd()) || next.getStart().equals(current.getEnd())) { + // 鏈夐噸鍙狅紝鍚堝苟鍖洪棿 + current.setEnd(current.getEnd().isAfter(next.getEnd()) ? current.getEnd() : next.getEnd()); + } else { + // 鏃犻噸鍙狅紝娣诲姞褰撳墠鍖洪棿骞舵洿鏂板綋鍓嶅尯闂� + merged.add(current); + current = next; + } + } + merged.add(current); // 娣诲姞鏈�鍚庝竴涓尯闂� + + return merged; } /** @@ -520,9 +615,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; + } +} diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/TimeInterval.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/TimeInterval.java new file mode 100644 index 0000000..8193ab1 --- /dev/null +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/TimeInterval.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.mdc.vo; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @Author: Lius + * @CreateTime: 2025-06-17 + * @Description: + */ +@Data +public class TimeInterval { + LocalDateTime start; + LocalDateTime end; + + public TimeInterval(LocalDateTime start, LocalDateTime end) { + this.start = start; + this.end = end; + } +} -- Gitblit v1.9.3