From 3334705c1c5ac83ee48c4c417ab44f93fa20c6ec Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Wed, 17 Apr 2024 23:00:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9A=AE=E5=B8=A6=E7=A7=A4?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +- .../coal/base/service/BaseService.java | 3 + .../cn/lihongjie/coal/common/JpaUtils.java | 20 +- .../cn/lihongjie/coal/common/NumberUtils.java | 42 +++ .../dataCollector/listener/PdcListener.java | 321 ++++++++++++++++++ .../service/DataCollectorService.java | 2 +- .../controller/PdcDeviceController.java | 73 ++++ .../pdcDevice/dto/CreatePdcDeviceDto.java | 54 +++ .../coal/pdcDevice/dto/PdcDeviceDto.java | 56 +++ .../pdcDevice/dto/UpdatePdcDeviceDto.java | 55 +++ .../pdcDevice/entity/PdcDeviceEntity.java | 79 +++++ .../pdcDevice/mapper/PdcDeviceMapper.java | 19 ++ .../repository/PdcDeviceRepository.java | 16 + .../pdcDevice/service/PdcDeviceService.java | 179 ++++++++++ .../controller/PdcDeviceDataController.java | 54 +++ .../dto/CreatePdcDeviceDataDto.java | 8 + .../pdcDeviceData/dto/PdcDeviceDataDto.java | 8 + .../dto/UpdatePdcDeviceDataDto.java | 8 + .../entity/PdcDeviceDataEntity.java | 78 +++++ .../mapper/PdcDeviceDataMapper.java | 23 ++ .../repository/PdcDeviceDataRepository.java | 9 + .../service/PdcDeviceDataService.java | 74 ++++ .../PdcDeviceRealTimeDataController.java | 60 ++++ .../dto/CreatePdcDeviceRealTimeDataDto.java | 8 + .../dto/GetRealTImeReportRequest.java | 16 + .../dto/PdcDeviceRealTimeDataDto.java | 63 ++++ .../dto/PdcDeviceRealTimeDataReportDto.java | 87 +++++ .../dto/UpdatePdcDeviceRealTimeDataDto.java | 8 + .../entity/PdcDeviceRealTimeDataEntity.java | 105 ++++++ .../mapper/PdcDeviceRealTimeDataMapper.java | 26 ++ .../PdcDeviceRealTimeDataRepository.java | 20 ++ .../service/PdcDeviceRealTimeDataService.java | 170 ++++++++++ .../PdcDeviceSupplierController.java | 66 ++++ .../dto/CreatePdcDeviceSupplierDto.java | 15 + .../dto/PdcDeviceSupplierDto.java | 18 + .../dto/UpdatePdcDeviceSupplierDto.java | 15 + .../entity/PdcDeviceSupplierEntity.java | 34 ++ .../mapper/PdcDeviceSupplierMapper.java | 23 ++ .../PdcDeviceSupplierRepository.java | 9 + .../service/PdcDeviceSupplierService.java | 121 +++++++ .../db/migration/V39__pdcDataTrigger.sql | 38 +++ .../db/migration/V40__pdcDataTrigger.sql | 38 +++ .../scripts/cronJob/savePdcData.groovy | 9 + .../dict/enum/pdcDeviceDataDict.groovy | 17 + .../scripts/dict/enum/pdcDeviceDict.groovy | 17 + .../enum/pdcDeviceRealTimeDataDict.groovy | 17 + .../dict/enum/pdcDeviceSuplierDict.groovy | 17 + .../dict/enum/pdcDeviceSupplierDict.groovy | 17 + 48 files changed, 2227 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/common/NumberUtils.java create mode 100644 src/main/java/cn/lihongjie/coal/dataCollector/listener/PdcListener.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/controller/PdcDeviceController.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/dto/CreatePdcDeviceDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/dto/PdcDeviceDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/dto/UpdatePdcDeviceDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/entity/PdcDeviceEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/mapper/PdcDeviceMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/repository/PdcDeviceRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDevice/service/PdcDeviceService.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/controller/PdcDeviceDataController.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/CreatePdcDeviceDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/PdcDeviceDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/UpdatePdcDeviceDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/entity/PdcDeviceDataEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/mapper/PdcDeviceDataMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/repository/PdcDeviceDataRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceData/service/PdcDeviceDataService.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/controller/PdcDeviceRealTimeDataController.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/CreatePdcDeviceRealTimeDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/GetRealTImeReportRequest.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataReportDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/UpdatePdcDeviceRealTimeDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/entity/PdcDeviceRealTimeDataEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/mapper/PdcDeviceRealTimeDataMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/repository/PdcDeviceRealTimeDataRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/service/PdcDeviceRealTimeDataService.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/controller/PdcDeviceSupplierController.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/CreatePdcDeviceSupplierDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/PdcDeviceSupplierDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/UpdatePdcDeviceSupplierDto.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/entity/PdcDeviceSupplierEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/mapper/PdcDeviceSupplierMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/repository/PdcDeviceSupplierRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/service/PdcDeviceSupplierService.java create mode 100644 src/main/resources/db/migration/V39__pdcDataTrigger.sql create mode 100644 src/main/resources/db/migration/V40__pdcDataTrigger.sql create mode 100644 src/main/resources/scripts/cronJob/savePdcData.groovy create mode 100644 src/main/resources/scripts/dict/enum/pdcDeviceDataDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/pdcDeviceDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/pdcDeviceRealTimeDataDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/pdcDeviceSuplierDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/pdcDeviceSupplierDict.groovy diff --git a/README.md b/README.md index de684041..b82402ad 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,19 @@ cd /data/backup && sudo -u postgres pg_dumpall | gzip > /data/backup/$(date +"% ``` -rabbitmqctl add_user datacollector datacollector -rabbitmqctl set_permissions --vhost /coal/test datacollector '' 'sysExchange' 'pms\.client.*' +docker compose exec -it rabbitmq bash + +rabbitmqctl add_user datacollector datacollector +rabbitmqctl set_permissions --vhost /coal/test datacollector '' 'sysExchange' 'pms\.client\.*|dataCollector\.*' + +``` + + +本地端口映射 + + +``` + +gost-windows-amd64.exe -L=tcp://:5672/192.168.59.128:5672 ``` \ No newline at end of file diff --git a/src/main/java/cn/lihongjie/coal/base/service/BaseService.java b/src/main/java/cn/lihongjie/coal/base/service/BaseService.java index 661c59ab..307165a6 100644 --- a/src/main/java/cn/lihongjie/coal/base/service/BaseService.java +++ b/src/main/java/cn/lihongjie/coal/base/service/BaseService.java @@ -44,6 +44,9 @@ public abstract class BaseService< dao.deleteAllById(id); } + public Entity findOne(Specification spec) { + return dao.findOne(spec).orElse(null); + } public Page findAll(Specification spec, Pageable page) { return dao.findAll(spec, page); } diff --git a/src/main/java/cn/lihongjie/coal/common/JpaUtils.java b/src/main/java/cn/lihongjie/coal/common/JpaUtils.java index a6ed694c..636e4e92 100644 --- a/src/main/java/cn/lihongjie/coal/common/JpaUtils.java +++ b/src/main/java/cn/lihongjie/coal/common/JpaUtils.java @@ -1,20 +1,38 @@ package cn.lihongjie.coal.common; +import com.google.common.base.CaseFormat; + import jakarta.persistence.Tuple; import jakarta.persistence.TupleElement; import java.util.*; +import java.util.function.Function; public class JpaUtils { + + public static Function underscoreToCamelCase = + (String name) -> CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name); + public static List> convertTuplesToMap(List tuples) { + return convertTuplesToMap(tuples, Function.identity(), Function.identity()); + } + + public static List> convertTuplesToMap(List tuples, Function keyMapper) { + return convertTuplesToMap(tuples, keyMapper, Function.identity()); + } + + public static List> convertTuplesToMap(List tuples, Function keyMapper, Function valueMapper) { List> result = new ArrayList<>(); for (Tuple single : tuples) { Map tempMap = new HashMap<>(); for (TupleElement key : single.getElements()) { - tempMap.put(key.getAlias(), single.get(key)); + tempMap.put(keyMapper.apply(key.getAlias()), valueMapper.apply(single.get(key))); } result.add(tempMap); } return result; } + + + } diff --git a/src/main/java/cn/lihongjie/coal/common/NumberUtils.java b/src/main/java/cn/lihongjie/coal/common/NumberUtils.java new file mode 100644 index 00000000..529b9873 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/common/NumberUtils.java @@ -0,0 +1,42 @@ +package cn.lihongjie.coal.common; + +import lombok.experimental.UtilityClass; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +@UtilityClass +public class NumberUtils { + + public Double toDouble(String value) { + try { + + return Double.valueOf(value); + } catch (Exception e) { + return null; + } + } + + public Double round2(Double value) { + return round(value, 2); + } + public Double round3(Double value) { + return round(value, 3); + } + + public Double round4(Double value) { + return round(value, 4); + } + public Double round(Double value, int scale) { + if (value == null) { + return null; + } + try { + + return new BigDecimal(value).setScale(scale, RoundingMode.HALF_UP).doubleValue(); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/main/java/cn/lihongjie/coal/dataCollector/listener/PdcListener.java b/src/main/java/cn/lihongjie/coal/dataCollector/listener/PdcListener.java new file mode 100644 index 00000000..2fcd1499 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/dataCollector/listener/PdcListener.java @@ -0,0 +1,321 @@ +package cn.lihongjie.coal.dataCollector.listener; + +import cn.lihongjie.coal.base.entity.BaseEntity; +import cn.lihongjie.coal.common.NumberUtils; +import cn.lihongjie.coal.dataCollector.entity.DataCollectorEntity; +import cn.lihongjie.coal.dataCollector.service.DataCollectorService; +import cn.lihongjie.coal.dataCollectorLog.entity.DataCollectorLogEntity; +import cn.lihongjie.coal.dataCollectorLog.service.DataCollectorLogService; +import cn.lihongjie.coal.pdcDevice.entity.PdcDeviceEntity; +import cn.lihongjie.coal.pdcDevice.service.PdcDeviceService; +import cn.lihongjie.coal.pdcDeviceRealTimeData.entity.PdcDeviceRealTimeDataEntity; +import cn.lihongjie.coal.pdcDeviceRealTimeData.service.PdcDeviceRealTimeDataService; +import cn.lihongjie.coal.rabbitmq.RabbitMQConfiguration; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.codec.digest.HmacAlgorithms; +import org.apache.commons.codec.digest.HmacUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +@Component +@Slf4j +public class PdcListener { + + @Autowired DataCollectorService dataCollectorService; + + @Autowired DataCollectorLogService dataCollectorLogService; + + @Autowired ObjectMapper objectMapper; + + @Autowired PdcDeviceRealTimeDataService pdcDeviceRealTimeDataService; + + @Autowired PdcDeviceService pdcDeviceService; + + public static String buildFaultInfo(Long faultData) { + String faultInfo = ""; + + /** + * 0x00000001:通讯故障 0x00000002:重量超限 0x00000004:AD通道故障 + * + *

0x00000008:SP通道故障 0x00000008:SP通道故障 0x00000010:皮带跑偏 + * + *

0x00000020:流量超限 0x00000040:速度超限 0x00000080:缺料故障 + * + *

0x00000100:加料太久 0x00000200:AD溢出故障 0x00000400:定量超差 + * + *

0x00010000:定量停止 0x00020000:主运行(配料/皮带) 0x00040000:辅运行(加料) + * + *

0x00080000: 手动标志 + */ + if ((faultData & 0x00000001) != 0) { + faultInfo += "通讯故障;"; + } + if ((faultData & 0x00000002) != 0) { + faultInfo += "重量超限;"; + } + if ((faultData & 0x00000004) != 0) { + faultInfo += "AD通道故障;"; + } + if ((faultData & 0x00000008) != 0) { + faultInfo += "SP通道故障;"; + } + if ((faultData & 0x00000010) != 0) { + faultInfo += "皮带跑偏;"; + } + if ((faultData & 0x00000020) != 0) { + faultInfo += "流量超限;"; + } + if ((faultData & 0x00000040) != 0) { + faultInfo += "速度超限;"; + } + if ((faultData & 0x00000080) != 0) { + faultInfo += "缺料故障;"; + } + if ((faultData & 0x00000100) != 0) { + faultInfo += "加料太久;"; + } + if ((faultData & 0x00000200) != 0) { + faultInfo += "AD溢出故障;"; + } + if ((faultData & 0x00000400) != 0) { + faultInfo += "定量超差;"; + } + if ((faultData & 0x00010000) != 0) { + faultInfo += "定量停止;"; + } + if ((faultData & 0x00020000) != 0) { + faultInfo += "主运行(配料/皮带);"; + } + if ((faultData & 0x00040000) != 0) { + faultInfo += "辅运行(加料);"; + } + if ((faultData & 0x00080000) != 0) { + faultInfo += "手动标志;"; + } + + return faultInfo; + } + + @SneakyThrows + @RabbitListener( + bindings = { + @QueueBinding( + value = + @org.springframework.amqp.rabbit.annotation.Queue( + value = "pdc.data", + durable = "true"), + exchange = + @Exchange( + value = RabbitMQConfiguration.SYS_EXCHANGE, + declare = Exchange.FALSE), + key = "pdc.*") + }) + @Transactional + public void handlePdcMessage(Message message) { + + var body = new String(message.getBody(), StandardCharsets.UTF_8); + + Map headers = message.getMessageProperties().getHeaders(); + + Object key = headers.get("appKey"); + + if (key == null) { + log.error("appKey is null"); + return; + } + + DataCollectorEntity dataCollector = dataCollectorService.findByAppKey(key.toString()); + + var sign = + new HmacUtils(HmacAlgorithms.HMAC_SHA_256, dataCollector.getAppSecret()) + .hmacHex(body.getBytes(StandardCharsets.UTF_8)); + + if (!StringUtils.equals(sign, headers.get("sign").toString())) { + log.error("sign not match {} {}", sign, headers.get("sign")); + return; + } + + var devices = + pdcDeviceService.findAll( + new Specification() { + @Override + public Predicate toPredicate( + Root root, + CriteriaQuery query, + CriteriaBuilder criteriaBuilder) { + return criteriaBuilder.and( + criteriaBuilder.equal( + root.get("dataCollector").get("id"), + dataCollector.getId())); + } + }); + + if (devices.isEmpty()) { + log.error("no device found for data collector: {}", dataCollector.getId()); + return; + } + + + Map deviceIdMap = devices.stream().collect(Collectors.toMap(BaseEntity::getId, e -> e)); + + + Map deviceUidMap = devices.stream().collect(Collectors.toMap(PdcDeviceEntity::getModbusUId, e -> e)); + + + JsonNode jsonNode = objectMapper.readTree(body); + + DataCollectorLogEntity logEntity = new DataCollectorLogEntity(); + logEntity.setOrganizationId(dataCollector.getOrganizationId()); + logEntity.setDataCollector(dataCollector); + + Object rk = message.getMessageProperties().getReceivedRoutingKey(); + + logEntity.setLogTime(LocalDateTime.now()); + logEntity.setType(rk.toString()); + + switch (rk.toString()) { + case "pdc.realtime" -> { + ArrayNode nodes = (ArrayNode) jsonNode; + var ids = + StreamSupport.stream(nodes.spliterator(), false) + .map(x -> x.get("uid").asText()) + .toList(); + logEntity.setContent(StringUtils.join(ids, ",")); + + Map realTimeDataEntityMap = + pdcDeviceRealTimeDataService + .findAll( + (Specification) (root, query, criteriaBuilder) -> criteriaBuilder.and( + root.get("device") + .get("id") + .in( + devices.stream() + .map( + BaseEntity + ::getId) + .collect( + Collectors + .toList())), + root.get("modbusUId").in(ids))) + .stream() + .collect(Collectors.toMap(e -> e.getDevice().getId(), e -> e)); + + nodes.forEach( + x -> { + var uid = x.get("uid").asText(); + + + + if (!deviceUidMap.containsKey(uid)) { + + log.warn( + "device not found for uid: {} {}", + dataCollector.getAppKey(), + uid); + return; + } + + PdcDeviceEntity pdcDeviceEntity = deviceUidMap.get(uid); + + var data = realTimeDataEntityMap.getOrDefault(pdcDeviceEntity.getId(), new PdcDeviceRealTimeDataEntity()); + + + ObjectNode node = (ObjectNode) x; + + // 0.001(t/kg) + Double totalData = node.get("totalData").asLong(0) * 0.001; + // 0.001(t/kg) + Double monthData = node.get("monthData").asLong(0) * 0.001; + // 0.001(t/kg) + Double dayData = node.get("dayData").asLong(0) * 0.001; + // 0.001(t/kg) + Double classData = node.get("classData").asLong(0) * 0.001; + // 0.001(t/kg) + Double batchData = node.get("batchData").asLong(0) * 0.001; + // 0.001(t/kg) + Double fixedData = node.get("fixedData").asLong(0) * 0.001; + // 0.1(t/kg)/h + Double flowData = node.get("flowData").asLong(0) * 0.1; + // 0.001m/s + Double speedData = node.get("speedData").asLong(0) * 0.001; + // 0.01% + Double loadData = node.get("loadData").asLong(0) * 0.01; + // 0.01mA + Double outputData = node.get("outputData").asLong(0) * 0.01; + // 无(注1) + Long faultData = node.get("faultData").asLong(0); + String faultInfo = buildFaultInfo(faultData); + + // 0.001(t/kg) + Double netData = node.get("netData").asLong(0) * 0.001; + // 无(注2) + Double process1Data = node.get("process1Data").asLong(0) * 1.0; + // 无(注3) + Double process2Data = node.get("process2Data").asLong(0) * 1.0; + + data.setDevice(pdcDeviceEntity); + data.setTime( + Instant.ofEpochMilli(node.get("time").asLong()) + .atZone(java.time.ZoneOffset.of("+8")) + .toLocalDateTime()); + data.setModbusUId(uid); + data.setTotalData(NumberUtils.round3(totalData)); + data.setMonthData(NumberUtils.round3(monthData)); + data.setDayData(NumberUtils.round3(dayData)); + data.setClassData(NumberUtils.round3(classData)); + data.setBatchData(NumberUtils.round3(batchData)); + data.setFixedData(NumberUtils.round3(fixedData)); + data.setFlowData(NumberUtils.round3(flowData)); + data.setSpeedData(NumberUtils.round3(speedData)); + data.setLoadData(NumberUtils.round3(loadData)); + data.setOutputData(NumberUtils.round3(outputData)); + data.setFaultData(NumberUtils.round3(Double.valueOf(faultData))); + data.setFaultInfo((faultInfo)); + data.setNetData(NumberUtils.round3(netData)); + data.setProcess1Data(NumberUtils.round3(process1Data)); + data.setProcess2Data(NumberUtils.round3(process2Data)); + data.setOrganizationId(dataCollector.getOrganizationId()); + if (data.getLastSaveTime() == null) { + data.setLastSaveTime(LocalDateTime.now().minusDays(1)); + } + this.pdcDeviceRealTimeDataService.save(data); + }); + } + default -> { + log.warn("unknown message type: {}", rk); + } + } + + // 数据量太大, 不写日志了 + // dataCollectorLogService.save(logEntity); + + // log.info("new message from pms: {}", body); + } +} diff --git a/src/main/java/cn/lihongjie/coal/dataCollector/service/DataCollectorService.java b/src/main/java/cn/lihongjie/coal/dataCollector/service/DataCollectorService.java index f90468fb..d2cad16b 100644 --- a/src/main/java/cn/lihongjie/coal/dataCollector/service/DataCollectorService.java +++ b/src/main/java/cn/lihongjie/coal/dataCollector/service/DataCollectorService.java @@ -117,7 +117,7 @@ public class DataCollectorService amqpAdmin.declareQueue( new Queue( - "dataCollector.client." + entity.getAppKey(), + "dataCollector." + entity.getAppKey(), true, false, false, diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/controller/PdcDeviceController.java b/src/main/java/cn/lihongjie/coal/pdcDevice/controller/PdcDeviceController.java new file mode 100644 index 00000000..0a728e65 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/controller/PdcDeviceController.java @@ -0,0 +1,73 @@ +package cn.lihongjie.coal.pdcDevice.controller; + +import cn.lihongjie.coal.annotation.OrgScope; +import cn.lihongjie.coal.annotation.SysLog; +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.pdcDevice.dto.CreatePdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.dto.PdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.dto.UpdatePdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.service.PdcDeviceService; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/pdcDevice") +@SysLog(module = "皮带秤") +@Slf4j +@OrgScope +public class PdcDeviceController { + @Autowired private PdcDeviceService service; + + @PostMapping("/create") + public PdcDeviceDto create(@RequestBody CreatePdcDeviceDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public PdcDeviceDto update(@RequestBody UpdatePdcDeviceDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public PdcDeviceDto getById(@RequestBody IdRequest request) { + return this.service.getById(request.getId()); + } + + @PostMapping("/list") + public Page list(@RequestBody CommonQuery request) { + return this.service.list(request); + } + + @PostMapping("/deviceGroups") + public List deviceGroups() { + return this.service.deviceGroups(); + } + + @PostMapping("/archive") + public Object archive(@RequestBody IdRequest request) { + this.service.archive(request); + return true; + } + + @PostMapping("/unarchive") + public Object unarchive(@RequestBody IdRequest request) { + this.service.unarchive(request); + return true; + } +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/dto/CreatePdcDeviceDto.java b/src/main/java/cn/lihongjie/coal/pdcDevice/dto/CreatePdcDeviceDto.java new file mode 100644 index 00000000..5d901622 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/dto/CreatePdcDeviceDto.java @@ -0,0 +1,54 @@ +package cn.lihongjie.coal.pdcDevice.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import jakarta.persistence.ManyToOne; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +@Data +public class CreatePdcDeviceDto extends OrgCommonDto { + + + @ManyToOne + private String supplier; + + + + @ManyToOne + @NotEmpty + @NotNull + private String dataCollector; + + + + @Comment("设备分组") + @NotEmpty + @NotNull + private String deviceGroup = "默认分组"; + + + @Comment("煤类型") + @NotEmpty + @NotNull + private String coalType; + + + + + + @Comment("MODBUS地址") + @NotEmpty + @NotNull + private String modbusUId; + + @Comment("数据保存间隔(分钟)") + @NotNull + private Integer dataSaveInterval; + + +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/dto/PdcDeviceDto.java b/src/main/java/cn/lihongjie/coal/pdcDevice/dto/PdcDeviceDto.java new file mode 100644 index 00000000..9a2a5626 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/dto/PdcDeviceDto.java @@ -0,0 +1,56 @@ +package cn.lihongjie.coal.pdcDevice.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; +import cn.lihongjie.coal.dataCollector.dto.DataCollectorDto; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.PdcDeviceSupplierDto; + +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +@Data +public class PdcDeviceDto extends OrgCommonDto { + private String archiveStatus; + + private String archiveStatusName; + + @ManyToOne + private PdcDeviceSupplierDto supplier; + + + + @ManyToOne + private DataCollectorDto dataCollector; + + + + @Comment("设备分组") + private String deviceGroup; + + + + @Comment("煤类型") + private String coalType; + + + private String coalTypeName; + + + + + @Comment("MODBUS地址") + private String modbusUId; + + @Comment("数据保存间隔(分钟)") + private Integer dataSaveInterval; + + + + + + + + +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/dto/UpdatePdcDeviceDto.java b/src/main/java/cn/lihongjie/coal/pdcDevice/dto/UpdatePdcDeviceDto.java new file mode 100644 index 00000000..0f49dd38 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/dto/UpdatePdcDeviceDto.java @@ -0,0 +1,55 @@ +package cn.lihongjie.coal.pdcDevice.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import jakarta.persistence.ManyToOne; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +@Data +public class UpdatePdcDeviceDto extends OrgCommonDto { + + + + @ManyToOne + private String supplier; + + + + @ManyToOne + @NotEmpty + @NotNull + private String dataCollector; + + + + @Comment("设备分组") + @NotEmpty + @NotNull + private String deviceGroup = "默认分组"; + + + @Comment("煤类型") + @NotEmpty + @NotNull + private String coalType; + + + + + + @Comment("MODBUS地址") + @NotEmpty + @NotNull + private String modbusUId; + + @Comment("数据保存间隔(分钟)") + @NotEmpty + @NotNull + private Integer dataSaveInterval; + +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/entity/PdcDeviceEntity.java b/src/main/java/cn/lihongjie/coal/pdcDevice/entity/PdcDeviceEntity.java new file mode 100644 index 00000000..bca8f7d0 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/entity/PdcDeviceEntity.java @@ -0,0 +1,79 @@ +package cn.lihongjie.coal.pdcDevice.entity; + +import cn.lihongjie.coal.base.entity.OrgCommonEntity; +import cn.lihongjie.coal.dataCollector.entity.DataCollectorEntity; +import cn.lihongjie.coal.pdcDeviceSupplier.entity.PdcDeviceSupplierEntity; + +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; + +@Data +@Entity +public class PdcDeviceEntity extends OrgCommonEntity { + + + @ManyToOne + private PdcDeviceSupplierEntity supplier; + + + + @ManyToOne + private DataCollectorEntity dataCollector; + + + + + + + @Comment("煤类型") + private String coalType; + + @Formula( + "(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'coal.type'\n" + + " and i.code = coal_type)") + private String coalTypeName; + + + + + @Comment("MODBUS地址") + private String modbusUId; + + @Comment("数据保存间隔(分钟)") + private Integer dataSaveInterval; + + + @Comment("设备分组") + private String deviceGroup; + + + + + + + + @Comment("归档状态") + @ColumnDefault("'0'") + private String archiveStatus = "0"; + + @Formula( + "(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'archiveStatus'\n" + + " and i.code = archive_status)") + private String archiveStatusName; + + +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/mapper/PdcDeviceMapper.java b/src/main/java/cn/lihongjie/coal/pdcDevice/mapper/PdcDeviceMapper.java new file mode 100644 index 00000000..d513fc10 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/mapper/PdcDeviceMapper.java @@ -0,0 +1,19 @@ +package cn.lihongjie.coal.pdcDevice.mapper; + +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; +import cn.lihongjie.coal.pdcDevice.dto.CreatePdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.dto.PdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.dto.UpdatePdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.entity.PdcDeviceEntity; + +import org.mapstruct.Mapper; +import org.mapstruct.control.DeepClone; + +@Mapper( + componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING, + uses = {CommonMapper.class, CommonEntityMapper.class}, + mappingControl = DeepClone.class) +public interface PdcDeviceMapper + extends BaseMapper {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/repository/PdcDeviceRepository.java b/src/main/java/cn/lihongjie/coal/pdcDevice/repository/PdcDeviceRepository.java new file mode 100644 index 00000000..bc4be1f8 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/repository/PdcDeviceRepository.java @@ -0,0 +1,16 @@ +package cn.lihongjie.coal.pdcDevice.repository; + +import cn.lihongjie.coal.base.dao.BaseRepository; +import cn.lihongjie.coal.pdcDevice.entity.PdcDeviceEntity; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PdcDeviceRepository extends BaseRepository { + + @Query("select distinct deviceGroup from PdcDeviceEntity where organizationId = ?1") + List deviceGroups(String organizationId); +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDevice/service/PdcDeviceService.java b/src/main/java/cn/lihongjie/coal/pdcDevice/service/PdcDeviceService.java new file mode 100644 index 00000000..e27f15f2 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDevice/service/PdcDeviceService.java @@ -0,0 +1,179 @@ +package cn.lihongjie.coal.pdcDevice.service; + +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.ArchiveUtils; +import cn.lihongjie.coal.common.Ctx; +import cn.lihongjie.coal.dbFunctions.DbFunctionService; +import cn.lihongjie.coal.exception.BizException; +import cn.lihongjie.coal.pdcDevice.dto.CreatePdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.dto.PdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.dto.UpdatePdcDeviceDto; +import cn.lihongjie.coal.pdcDevice.entity.PdcDeviceEntity; +import cn.lihongjie.coal.pdcDevice.mapper.PdcDeviceMapper; +import cn.lihongjie.coal.pdcDevice.repository.PdcDeviceRepository; + +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.ConversionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Slf4j +@Transactional +public class PdcDeviceService extends BaseService { + @Autowired private PdcDeviceRepository repository; + + @Autowired private PdcDeviceMapper mapper; + + @Autowired private ConversionService conversionService; + + @Autowired private DbFunctionService dbFunctionService; + + public PdcDeviceDto create(CreatePdcDeviceDto request) { + PdcDeviceEntity entity = mapper.toEntity(request); + + long count = + this.repository.count( + new Specification() { + @Override + public Predicate toPredicate( + Root root, + CriteriaQuery query, + CriteriaBuilder criteriaBuilder) { + return criteriaBuilder.and( + criteriaBuilder.equal( + root.get("modbusUId"), request.getModbusUId()), + criteriaBuilder.equal( + root.get("dataCollector").get("id"), + request.getDataCollector())); + } + }); + + if (count > 0) { + throw new BizException("同一个数据采集器下MODBUS地址不能重复"); + } + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public PdcDeviceDto update(UpdatePdcDeviceDto request) { + PdcDeviceEntity entity = this.repository.get(request.getId()); + ArchiveUtils.checkArchiveStatus( + entity, + PdcDeviceEntity::getArchiveStatus, + x -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法编辑"); + }); + + long count = + this.repository.count( + new Specification() { + @Override + public Predicate toPredicate( + Root root, + CriteriaQuery query, + CriteriaBuilder criteriaBuilder) { + return criteriaBuilder.and( + criteriaBuilder.equal( + root.get("modbusUId"), request.getModbusUId()), + criteriaBuilder.equal( + root.get("dataCollector").get("id"), + request.getDataCollector()), + criteriaBuilder.notEqual(root.get("id"), request.getId())); + } + }); + + if (count > 0) { + throw new BizException("同一个数据采集器下MODBUS地址不能重复"); + } + + this.mapper.updateEntity(entity, request); + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public void delete(IdRequest request) { + ArchiveUtils.checkArchiveStatus( + this.repository::findAllById, + request.getIds(), + PdcDeviceEntity::getArchiveStatus, + x -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法删除"); + }); + this.repository.deleteAllById(request.getIds()); + } + + public PdcDeviceDto getById(String id) { + PdcDeviceEntity entity = repository.get(id); + + return mapper.toDto(entity); + } + + public Page list(CommonQuery query) { + Page page = + repository.findAll( + query.specification(conversionService), + PageRequest.of( + query.getPageNo(), + query.getPageSize(), + Sort.by(query.getOrders()))); + + return page.map(this.mapper::toDto); + } + + public void archive(IdRequest dto) { + this.repository.findAllById(dto.getIds()).stream() + .peek( + x -> + ArchiveUtils.checkArchiveStatus( + x, + PdcDeviceEntity::getArchiveStatus, + y -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法再次归档"); + })) + .peek(x -> x.setArchiveStatus("1")) + .forEach(this.repository::save); + } + + public void unarchive(IdRequest dto) { + this.repository.findAllById(dto.getIds()).stream() + .peek( + x -> + ArchiveUtils.checkArchiveStatus( + x, + PdcDeviceEntity::getArchiveStatus, + y -> "1", + (e, actual, expected) -> { + throw new BizException("数据" + "未归档,无法取消归档"); + })) + .peek(x -> x.setArchiveStatus("0")) + .forEach(this.repository::save); + } + + public List deviceGroups() { + + return repository.deviceGroups(Ctx.currentUser().getOrganizationId()); + } +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/controller/PdcDeviceDataController.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/controller/PdcDeviceDataController.java new file mode 100644 index 00000000..f068f3ab --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/controller/PdcDeviceDataController.java @@ -0,0 +1,54 @@ +package cn.lihongjie.coal.pdcDeviceData.controller; + +import cn.lihongjie.coal.annotation.OrgScope; +import cn.lihongjie.coal.annotation.SysLog; +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.pdcDeviceData.dto.CreatePdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.dto.PdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.dto.UpdatePdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.service.PdcDeviceDataService; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/pdcDeviceData") +@SysLog(module = "皮带秤数据") +@Slf4j +@OrgScope +public class PdcDeviceDataController { + @Autowired private PdcDeviceDataService service; + + @PostMapping("/create") + public PdcDeviceDataDto create(@RequestBody CreatePdcDeviceDataDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public PdcDeviceDataDto update(@RequestBody UpdatePdcDeviceDataDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public PdcDeviceDataDto getById(@RequestBody IdRequest request) { + return this.service.getById(request.getId()); + } + + @PostMapping("/list") + public Page list(@RequestBody CommonQuery request) { + return this.service.list(request); + } +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/CreatePdcDeviceDataDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/CreatePdcDeviceDataDto.java new file mode 100644 index 00000000..e8f9ff40 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/CreatePdcDeviceDataDto.java @@ -0,0 +1,8 @@ +package cn.lihongjie.coal.pdcDeviceData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class CreatePdcDeviceDataDto extends OrgCommonDto {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/PdcDeviceDataDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/PdcDeviceDataDto.java new file mode 100644 index 00000000..7fb2fa47 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/PdcDeviceDataDto.java @@ -0,0 +1,8 @@ +package cn.lihongjie.coal.pdcDeviceData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class PdcDeviceDataDto extends OrgCommonDto {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/UpdatePdcDeviceDataDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/UpdatePdcDeviceDataDto.java new file mode 100644 index 00000000..e3dbb3d7 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/dto/UpdatePdcDeviceDataDto.java @@ -0,0 +1,8 @@ +package cn.lihongjie.coal.pdcDeviceData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class UpdatePdcDeviceDataDto extends OrgCommonDto {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/entity/PdcDeviceDataEntity.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/entity/PdcDeviceDataEntity.java new file mode 100644 index 00000000..b9dd7f41 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/entity/PdcDeviceDataEntity.java @@ -0,0 +1,78 @@ +package cn.lihongjie.coal.pdcDeviceData.entity; + +import cn.lihongjie.coal.annotation.HyperTable; +import cn.lihongjie.coal.base.entity.OrgCommonEntity; +import cn.lihongjie.coal.pdcDevice.entity.PdcDeviceEntity; + +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + +@Data +@Entity +@HyperTable +public class PdcDeviceDataEntity extends OrgCommonEntity { + + + @ManyToOne + private PdcDeviceEntity device; + + private LocalDateTime time; + + @Comment("modbus地址") + private String modbusUId; + + @Comment("总累计量") + private Double totalData; + + @Comment("月累计量") + private Double monthData; + + @Comment("日累计量") + private Double dayData; + + @Comment("班累计量") + private Double classData; + + @Comment(" 批累计量") + private Double batchData; + + @Comment("定值累计量") + private Double fixedData; + + @Comment("瞬时流量") + private Double flowData; + + @Comment("瞬时速度") + private Double speedData; + + @Comment("当前负荷") + private Double loadData; + + @Comment("控制输出") + private Double outputData; + + @Comment("故障状态") + private Double faultData; + + @Comment("故障信息") + private String faultInfo; + + @Comment("净重") + private Double netData; + + @Comment("过程数据1") + private Double process1Data; + + @Comment("过程数据2") + private Double process2Data; + + + private Boolean saved; + +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/mapper/PdcDeviceDataMapper.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/mapper/PdcDeviceDataMapper.java new file mode 100644 index 00000000..e0a4d4cb --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/mapper/PdcDeviceDataMapper.java @@ -0,0 +1,23 @@ +package cn.lihongjie.coal.pdcDeviceData.mapper; + +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; +import cn.lihongjie.coal.pdcDeviceData.dto.CreatePdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.dto.PdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.dto.UpdatePdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.entity.PdcDeviceDataEntity; + +import org.mapstruct.Mapper; +import org.mapstruct.control.DeepClone; + +@Mapper( + componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING, + uses = {CommonMapper.class, CommonEntityMapper.class}, + mappingControl = DeepClone.class) +public interface PdcDeviceDataMapper + extends BaseMapper< + PdcDeviceDataEntity, + PdcDeviceDataDto, + CreatePdcDeviceDataDto, + UpdatePdcDeviceDataDto> {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/repository/PdcDeviceDataRepository.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/repository/PdcDeviceDataRepository.java new file mode 100644 index 00000000..7a277dc6 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/repository/PdcDeviceDataRepository.java @@ -0,0 +1,9 @@ +package cn.lihongjie.coal.pdcDeviceData.repository; + +import cn.lihongjie.coal.base.dao.BaseRepository; +import cn.lihongjie.coal.pdcDeviceData.entity.PdcDeviceDataEntity; + +import org.springframework.stereotype.Repository; + +@Repository +public interface PdcDeviceDataRepository extends BaseRepository {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceData/service/PdcDeviceDataService.java b/src/main/java/cn/lihongjie/coal/pdcDeviceData/service/PdcDeviceDataService.java new file mode 100644 index 00000000..075ec539 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceData/service/PdcDeviceDataService.java @@ -0,0 +1,74 @@ +package cn.lihongjie.coal.pdcDeviceData.service; + +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.dbFunctions.DbFunctionService; +import cn.lihongjie.coal.pdcDeviceData.dto.CreatePdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.dto.PdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.dto.UpdatePdcDeviceDataDto; +import cn.lihongjie.coal.pdcDeviceData.entity.PdcDeviceDataEntity; +import cn.lihongjie.coal.pdcDeviceData.mapper.PdcDeviceDataMapper; +import cn.lihongjie.coal.pdcDeviceData.repository.PdcDeviceDataRepository; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.ConversionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Slf4j +@Transactional +public class PdcDeviceDataService + extends BaseService { + @Autowired private PdcDeviceDataRepository repository; + + @Autowired private PdcDeviceDataMapper mapper; + + @Autowired private ConversionService conversionService; + + @Autowired private DbFunctionService dbFunctionService; + + public PdcDeviceDataDto create(CreatePdcDeviceDataDto request) { + PdcDeviceDataEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public PdcDeviceDataDto update(UpdatePdcDeviceDataDto request) { + PdcDeviceDataEntity entity = this.repository.get(request.getId()); + this.mapper.updateEntity(entity, request); + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public void delete(IdRequest request) { + this.repository.deleteAllById(request.getIds()); + } + + public PdcDeviceDataDto getById(String id) { + PdcDeviceDataEntity entity = repository.get(id); + + return mapper.toDto(entity); + } + + public Page list(CommonQuery query) { + Page page = + repository.findAll( + query.specification(conversionService), + PageRequest.of( + query.getPageNo(), + query.getPageSize(), + Sort.by(query.getOrders()))); + + return page.map(this.mapper::toDto); + } +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/controller/PdcDeviceRealTimeDataController.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/controller/PdcDeviceRealTimeDataController.java new file mode 100644 index 00000000..1a61b165 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/controller/PdcDeviceRealTimeDataController.java @@ -0,0 +1,60 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.controller; + +import cn.lihongjie.coal.annotation.OrgScope; +import cn.lihongjie.coal.annotation.SysLog; +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.pdcDeviceRealTimeData.dto.*; +import cn.lihongjie.coal.pdcDeviceRealTimeData.service.PdcDeviceRealTimeDataService; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/pdcDeviceRealTimeData") +@SysLog(module = "皮带秤实时数据") +@Slf4j +@OrgScope +public class PdcDeviceRealTimeDataController { + @Autowired private PdcDeviceRealTimeDataService service; + + @PostMapping("/create") + public PdcDeviceRealTimeDataDto create(@RequestBody CreatePdcDeviceRealTimeDataDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public PdcDeviceRealTimeDataDto update(@RequestBody UpdatePdcDeviceRealTimeDataDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public PdcDeviceRealTimeDataDto getById(@RequestBody IdRequest request) { + return this.service.getById(request.getId()); + } + + @PostMapping("/list") + public Page list(@RequestBody CommonQuery request) { + return this.service.list(request); + } + + + @PostMapping("/getRealTimeReport") + public List getRealTimeReport(@RequestBody GetRealTImeReportRequest request) { + return this.service.getRealTimeReport(request); + } +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/CreatePdcDeviceRealTimeDataDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/CreatePdcDeviceRealTimeDataDto.java new file mode 100644 index 00000000..066f1915 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/CreatePdcDeviceRealTimeDataDto.java @@ -0,0 +1,8 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class CreatePdcDeviceRealTimeDataDto extends OrgCommonDto {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/GetRealTImeReportRequest.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/GetRealTImeReportRequest.java new file mode 100644 index 00000000..89ee7a56 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/GetRealTImeReportRequest.java @@ -0,0 +1,16 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.dto; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.*; + +@Data +public class GetRealTImeReportRequest { + + private String deviceGroup; + + private LocalDateTime startTime; + + private LocalDateTime endTime; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataDto.java new file mode 100644 index 00000000..e3d6031c --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataDto.java @@ -0,0 +1,63 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; +import cn.lihongjie.coal.pdcDevice.dto.PdcDeviceDto; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +@Data +public class PdcDeviceRealTimeDataDto extends OrgCommonDto { + + private PdcDeviceDto device; + + + @Comment("modbus地址") + private String modbusUId; + + @Comment("总累计量") + private Double totalData; + + @Comment("月累计量") + private Double monthData; + + @Comment("日累计量") + private Double dayData; + + @Comment("班累计量") + private Double classData; + + @Comment("批累计量") + private Double batchData; + + @Comment("定值累计量") + private Double fixedData; + + @Comment("瞬时流量") + private Double flowData; + + @Comment("瞬时速度") + private Double speedData; + + @Comment("当前负荷") + private Double loadData; + + @Comment("控制输出") + private Double outputData; + + @Comment("故障状态") + private Double faultData; + + @Comment("故障信息") + private String faultInfo; + + @Comment("净重") + private Double netData; + + @Comment("过程数据1") + private Double process1Data; + + @Comment("过程数据2") + private Double process2Data; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataReportDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataReportDto.java new file mode 100644 index 00000000..8dc528da --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/PdcDeviceRealTimeDataReportDto.java @@ -0,0 +1,87 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + +@Data +public class PdcDeviceRealTimeDataReportDto extends OrgCommonDto { + + private String deviceId; + + private String deviceCode; + + private String deviceName; + + private String deviceGroup; + + private String deviceCoalType; + + @Comment("当前时间范围内的回收") + private Double timePercent; + + @Comment("当前时间范围内的产量") + private Double timeTotal; + + + private LocalDateTime time; + + + private LocalDateTime serverTime; + + + private Long timeDiff; + + + @Comment("modbus地址") + private String modbusUId; + + @Comment("总累计量") + private Double totalData; + + @Comment("月累计量") + private Double monthData; + + @Comment("日累计量") + private Double dayData; + + @Comment("班累计量") + private Double classData; + + @Comment("批累计量") + private Double batchData; + + @Comment("定值累计量") + private Double fixedData; + + @Comment("瞬时流量") + private Double flowData; + + @Comment("瞬时速度") + private Double speedData; + + @Comment("当前负荷") + private Double loadData; + + @Comment("控制输出") + private Double outputData; + + @Comment("故障状态") + private Double faultData; + + @Comment("故障信息") + private String faultInfo; + + @Comment("净重") + private Double netData; + + @Comment("过程数据1") + private Double process1Data; + + @Comment("过程数据2") + private Double process2Data; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/UpdatePdcDeviceRealTimeDataDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/UpdatePdcDeviceRealTimeDataDto.java new file mode 100644 index 00000000..e4a4a487 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/dto/UpdatePdcDeviceRealTimeDataDto.java @@ -0,0 +1,8 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class UpdatePdcDeviceRealTimeDataDto extends OrgCommonDto {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/entity/PdcDeviceRealTimeDataEntity.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/entity/PdcDeviceRealTimeDataEntity.java new file mode 100644 index 00000000..a4cd258c --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/entity/PdcDeviceRealTimeDataEntity.java @@ -0,0 +1,105 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.entity; + +import cn.lihongjie.coal.base.entity.OrgCommonEntity; +import cn.lihongjie.coal.pdcDevice.entity.PdcDeviceEntity; + +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + +/** + *
+ * 总累计量 0000H 30001 4字节 uint32 0.001(t/kg)
+ * 月累计量 0002H 30003 4字节 uint32 0.001(t/kg)
+ * 日累计量 0004H 30005 4字节 uint32 0.001(t/kg)
+ * 班累计量 0006H 30007 4字节 uint32 0.001(t/kg)
+ * 批累计量 0008H 30009 4字节 uint32 0.001(t/kg)
+ * 定值累计量 000aH 30011 4字节 uint32 0.001(t/kg)
+ * 瞬时流量 000cH 30013 4字节 uint32 0.1(t/kg)/h
+ * 瞬时速度 000eH 30015 4字节 uint32 0.001m/s
+ * 当前负荷 0010H 30017 4字节 uint32 0.01%
+ * 控制输出 0012H 30019 4字节 uint32 0.01mA
+ * 故障状态 0014H 30021 4字节 uint32 无(注1)
+ * 净重 0016H 30023 4字节 uint32 0.001(t/kg)
+ * 过程数据1 0018H 30025 4字节 uint32 无(注2)
+ * 过程数据2 001aH 30027 4字节 uint32 无(注3)
+ * 0x00000001:通讯故障
+ * 0x00000002:重量超限
+ * 0x00000004:AD通道故障
+ * 0x00000008:SP通道故障
+ * 0x00000008:SP通道故障
+ * 0x00000010:皮带跑偏
+ * 0x00000020:流量超限
+ * 0x00000040:速度超限
+ * 0x00000080:缺料故障
+ * 0x00000100:加料太久
+ * 0x00000200:AD溢出故障
+ * 0x00000400:定量超差
+ * 0x00010000:定量停止
+ * 0x00020000:主运行(配料/皮带)
+ * 0x00040000:辅运行(加料)
+ * 0x00080000: 手动标志 + */ +@Data +@Entity +public class PdcDeviceRealTimeDataEntity extends OrgCommonEntity { + + @ManyToOne private PdcDeviceEntity device; + + private LocalDateTime time; + + @Comment("modbus地址") + private String modbusUId; + + @Comment("总累计量") + private Double totalData; + + @Comment("月累计量") + private Double monthData; + + @Comment("日累计量") + private Double dayData; + + @Comment("班累计量") + private Double classData; + + @Comment(" 批累计量") + private Double batchData; + + @Comment("定值累计量") + private Double fixedData; + + @Comment("瞬时流量") + private Double flowData; + + @Comment("瞬时速度") + private Double speedData; + + @Comment("当前负荷") + private Double loadData; + + @Comment("控制输出") + private Double outputData; + + @Comment("故障状态") + private Double faultData; + + @Comment("故障信息") + private String faultInfo; + + @Comment("净重") + private Double netData; + + @Comment("过程数据1") + private Double process1Data; + + @Comment("过程数据2") + private Double process2Data; + + private LocalDateTime lastSaveTime; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/mapper/PdcDeviceRealTimeDataMapper.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/mapper/PdcDeviceRealTimeDataMapper.java new file mode 100644 index 00000000..8307878f --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/mapper/PdcDeviceRealTimeDataMapper.java @@ -0,0 +1,26 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.mapper; + +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; +import cn.lihongjie.coal.pdcDeviceData.entity.PdcDeviceDataEntity; +import cn.lihongjie.coal.pdcDeviceRealTimeData.dto.CreatePdcDeviceRealTimeDataDto; +import cn.lihongjie.coal.pdcDeviceRealTimeData.dto.PdcDeviceRealTimeDataDto; +import cn.lihongjie.coal.pdcDeviceRealTimeData.dto.UpdatePdcDeviceRealTimeDataDto; +import cn.lihongjie.coal.pdcDeviceRealTimeData.entity.PdcDeviceRealTimeDataEntity; + +import org.mapstruct.Mapper; +import org.mapstruct.control.DeepClone; + +@Mapper( + componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING, + uses = {CommonMapper.class, CommonEntityMapper.class}, + mappingControl = DeepClone.class) +public interface PdcDeviceRealTimeDataMapper + extends BaseMapper< + PdcDeviceRealTimeDataEntity, + PdcDeviceRealTimeDataDto, + CreatePdcDeviceRealTimeDataDto, + UpdatePdcDeviceRealTimeDataDto> { + PdcDeviceDataEntity toDataEntity(PdcDeviceRealTimeDataEntity x); +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/repository/PdcDeviceRealTimeDataRepository.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/repository/PdcDeviceRealTimeDataRepository.java new file mode 100644 index 00000000..032778db --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/repository/PdcDeviceRealTimeDataRepository.java @@ -0,0 +1,20 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.repository; + +import cn.lihongjie.coal.base.dao.BaseRepository; +import cn.lihongjie.coal.pdcDeviceRealTimeData.entity.PdcDeviceRealTimeDataEntity; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PdcDeviceRealTimeDataRepository + extends BaseRepository { + + @Query( + value = + "select id from t_pdc_device_real_time_data dd inner join t_pdc_device d on dd.device_id = d.id where d.id in :deviceIds and (extract(epoch from (now() - dd.last_save_time)) / 60) >= d.data_save_interval ", + nativeQuery = true) + List findNeedToSaveData(List deviceIds); +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/service/PdcDeviceRealTimeDataService.java b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/service/PdcDeviceRealTimeDataService.java new file mode 100644 index 00000000..f918a196 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceRealTimeData/service/PdcDeviceRealTimeDataService.java @@ -0,0 +1,170 @@ +package cn.lihongjie.coal.pdcDeviceRealTimeData.service; + +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.Ctx; +import cn.lihongjie.coal.common.JpaUtils; +import cn.lihongjie.coal.dataCollectorLog.repository.DataCollectorLogRepository; +import cn.lihongjie.coal.dbFunctions.DbFunctionService; +import cn.lihongjie.coal.pdcDevice.entity.PdcDeviceEntity; +import cn.lihongjie.coal.pdcDevice.service.PdcDeviceService; +import cn.lihongjie.coal.pdcDeviceData.entity.PdcDeviceDataEntity; +import cn.lihongjie.coal.pdcDeviceData.repository.PdcDeviceDataRepository; +import cn.lihongjie.coal.pdcDeviceData.service.PdcDeviceDataService; +import cn.lihongjie.coal.pdcDeviceRealTimeData.dto.*; +import cn.lihongjie.coal.pdcDeviceRealTimeData.entity.PdcDeviceRealTimeDataEntity; +import cn.lihongjie.coal.pdcDeviceRealTimeData.mapper.PdcDeviceRealTimeDataMapper; +import cn.lihongjie.coal.pdcDeviceRealTimeData.repository.PdcDeviceRealTimeDataRepository; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.Tuple; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.ConversionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Slf4j +@Transactional +public class PdcDeviceRealTimeDataService + extends BaseService { + @Autowired PdcDeviceDataService pdcDeviceDataService; + @Autowired PdcDeviceService pdcDeviceService; + @PersistenceContext EntityManager em; + @Autowired private PdcDeviceDataRepository pdcDeviceDataRepository; + @Autowired private DataCollectorLogRepository dataCollectorLogRepository; + @Autowired private PdcDeviceRealTimeDataRepository repository; + @Autowired private PdcDeviceRealTimeDataMapper mapper; + @Autowired private ConversionService conversionService; + @Autowired private DbFunctionService dbFunctionService; + + public PdcDeviceRealTimeDataDto create(CreatePdcDeviceRealTimeDataDto request) { + PdcDeviceRealTimeDataEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public PdcDeviceRealTimeDataDto update(UpdatePdcDeviceRealTimeDataDto request) { + PdcDeviceRealTimeDataEntity entity = this.repository.get(request.getId()); + this.mapper.updateEntity(entity, request); + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public void delete(IdRequest request) { + this.repository.deleteAllById(request.getIds()); + } + + public PdcDeviceRealTimeDataDto getById(String id) { + PdcDeviceRealTimeDataEntity entity = repository.get(id); + + return mapper.toDto(entity); + } + + public Page list(CommonQuery query) { + Page page = + repository.findAll( + query.specification(conversionService), + PageRequest.of( + query.getPageNo(), + query.getPageSize(), + Sort.by(query.getOrders()))); + + return page.map(this.mapper::toDto); + } + + public void saveRealTimeDataToData() { + saveRealTimeDataToData(pdcDeviceService.findAll()); + } + + public void saveRealTimeDataToData(List devices) { + + List ids = + this.repository.findNeedToSaveData( + devices.stream().map(x -> x.getId()).collect(Collectors.toList())); + + this.repository + .findAllById(ids) + .forEach( + x -> { + PdcDeviceDataEntity dataEntity = this.mapper.toDataEntity(x); + + pdcDeviceDataService.save(dataEntity); + + x.setLastSaveTime(LocalDateTime.now()); + this.repository.save(x); + }); + } + + public List getRealTimeReport( + GetRealTImeReportRequest request) { + + Query nativeQuery = + em.createNativeQuery( + """ + + + with tmp1 as ( + + select d.device_id as device_id, max(coal_type) as coal_type, max(total_data) - min(total_data) as time_total from t_pdc_device_data d + where d.organization_id = :organizationId + and d.time >= :startTime + and d.time <= :endTime + group by d.device_id + + ) + + + select rtd.*, d.id as device_id, d.name as device_name, d.device_group as device_group, d.coal_type as device_coal_type, + sum(t1.time_total ) as time_total, + sum(t1.time_total) / (select sum(time_total) from tmp1 where tmp1.coal_type = '0') as time_percent + + + from t_pdc_device_real_time_data rtd + inner join t_pdc_device d on rtd.device_id = d.id + left join tmp1 t1 on rtd.device_id = t1.device_id + + + where d.device_group = :deviceGroup and d.organization_id = :organizationId + + + + """, + Tuple.class); + + nativeQuery.setParameter("deviceGroup", request.getDeviceGroup()); + nativeQuery.setParameter("organizationId", Ctx.currentUser().getOrganizationId()); + nativeQuery.setParameter( + "startTime", + request.getStartTime() != null + ? request.getStartTime() + : LocalDateTime.now().toLocalDate().atStartOfDay()); + nativeQuery.setParameter( + "endTime", + request.getEndTime() != null + ? request.getEndTime() + : LocalDateTime.now().toLocalDate().atTime(23, 59, 59)); + + List list = + JpaUtils.convertTuplesToMap( + nativeQuery.getResultList(), JpaUtils.underscoreToCamelCase); + + return list; + } +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/controller/PdcDeviceSupplierController.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/controller/PdcDeviceSupplierController.java new file mode 100644 index 00000000..6a0bf22e --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/controller/PdcDeviceSupplierController.java @@ -0,0 +1,66 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.controller; + +import cn.lihongjie.coal.annotation.OrgScope; +import cn.lihongjie.coal.annotation.SysLog; +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.CreatePdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.PdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.UpdatePdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.service.PdcDeviceSupplierService; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/pdcDeviceSupplier") +@SysLog(module = "") +@Slf4j +@OrgScope +public class PdcDeviceSupplierController { + @Autowired private PdcDeviceSupplierService service; + + @PostMapping("/create") + public PdcDeviceSupplierDto create(@RequestBody CreatePdcDeviceSupplierDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public PdcDeviceSupplierDto update(@RequestBody UpdatePdcDeviceSupplierDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public PdcDeviceSupplierDto getById(@RequestBody IdRequest request) { + return this.service.getById(request.getId()); + } + + @PostMapping("/list") + public Page list(@RequestBody CommonQuery request) { + return this.service.list(request); + } + + @PostMapping("/archive") + public Object archive(@RequestBody IdRequest request) { + this.service.archive(request); + return true; + } + + @PostMapping("/unarchive") + public Object unarchive(@RequestBody IdRequest request) { + this.service.unarchive(request); + return true; + } +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/CreatePdcDeviceSupplierDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/CreatePdcDeviceSupplierDto.java new file mode 100644 index 00000000..17143a89 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/CreatePdcDeviceSupplierDto.java @@ -0,0 +1,15 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class CreatePdcDeviceSupplierDto extends OrgCommonDto { + + private String contact; + + private String contactPhone; + + private String address; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/PdcDeviceSupplierDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/PdcDeviceSupplierDto.java new file mode 100644 index 00000000..43124a49 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/PdcDeviceSupplierDto.java @@ -0,0 +1,18 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class PdcDeviceSupplierDto extends OrgCommonDto { + private String archiveStatus; + + private String archiveStatusName; + + private String contact; + + private String contactPhone; + + private String address; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/UpdatePdcDeviceSupplierDto.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/UpdatePdcDeviceSupplierDto.java new file mode 100644 index 00000000..4bc7afcf --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/dto/UpdatePdcDeviceSupplierDto.java @@ -0,0 +1,15 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class UpdatePdcDeviceSupplierDto extends OrgCommonDto { + + private String contact; + + private String contactPhone; + + private String address; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/entity/PdcDeviceSupplierEntity.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/entity/PdcDeviceSupplierEntity.java new file mode 100644 index 00000000..5cf5a3a3 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/entity/PdcDeviceSupplierEntity.java @@ -0,0 +1,34 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.entity; + +import cn.lihongjie.coal.base.entity.OrgCommonEntity; + +import jakarta.persistence.Entity; + +import lombok.Data; + +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; + +@Data +@Entity +public class PdcDeviceSupplierEntity extends OrgCommonEntity { + @Comment("归档状态") + @ColumnDefault("'0'") + private String archiveStatus = "0"; + + @Formula( + "(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'archiveStatus'\n" + + " and i.code = archive_status)") + private String archiveStatusName; + + private String contact; + + private String contactPhone; + + private String address; +} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/mapper/PdcDeviceSupplierMapper.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/mapper/PdcDeviceSupplierMapper.java new file mode 100644 index 00000000..07a4154a --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/mapper/PdcDeviceSupplierMapper.java @@ -0,0 +1,23 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.mapper; + +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.CreatePdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.PdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.UpdatePdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.entity.PdcDeviceSupplierEntity; + +import org.mapstruct.Mapper; +import org.mapstruct.control.DeepClone; + +@Mapper( + componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING, + uses = {CommonMapper.class, CommonEntityMapper.class}, + mappingControl = DeepClone.class) +public interface PdcDeviceSupplierMapper + extends BaseMapper< + PdcDeviceSupplierEntity, + PdcDeviceSupplierDto, + CreatePdcDeviceSupplierDto, + UpdatePdcDeviceSupplierDto> {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/repository/PdcDeviceSupplierRepository.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/repository/PdcDeviceSupplierRepository.java new file mode 100644 index 00000000..80adec63 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/repository/PdcDeviceSupplierRepository.java @@ -0,0 +1,9 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.repository; + +import cn.lihongjie.coal.base.dao.BaseRepository; +import cn.lihongjie.coal.pdcDeviceSupplier.entity.PdcDeviceSupplierEntity; + +import org.springframework.stereotype.Repository; + +@Repository +public interface PdcDeviceSupplierRepository extends BaseRepository {} diff --git a/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/service/PdcDeviceSupplierService.java b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/service/PdcDeviceSupplierService.java new file mode 100644 index 00000000..2abf7ce1 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/pdcDeviceSupplier/service/PdcDeviceSupplierService.java @@ -0,0 +1,121 @@ +package cn.lihongjie.coal.pdcDeviceSupplier.service; + +import cn.lihongjie.coal.base.dto.CommonQuery; +import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.ArchiveUtils; +import cn.lihongjie.coal.dbFunctions.DbFunctionService; +import cn.lihongjie.coal.exception.BizException; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.CreatePdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.PdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.dto.UpdatePdcDeviceSupplierDto; +import cn.lihongjie.coal.pdcDeviceSupplier.entity.PdcDeviceSupplierEntity; +import cn.lihongjie.coal.pdcDeviceSupplier.mapper.PdcDeviceSupplierMapper; +import cn.lihongjie.coal.pdcDeviceSupplier.repository.PdcDeviceSupplierRepository; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.ConversionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Slf4j +@Transactional +public class PdcDeviceSupplierService + extends BaseService { + @Autowired private PdcDeviceSupplierRepository repository; + + @Autowired private PdcDeviceSupplierMapper mapper; + + @Autowired private ConversionService conversionService; + + @Autowired private DbFunctionService dbFunctionService; + + public PdcDeviceSupplierDto create(CreatePdcDeviceSupplierDto request) { + PdcDeviceSupplierEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public PdcDeviceSupplierDto update(UpdatePdcDeviceSupplierDto request) { + PdcDeviceSupplierEntity entity = this.repository.get(request.getId()); + ArchiveUtils.checkArchiveStatus( + entity, + PdcDeviceSupplierEntity::getArchiveStatus, + x -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法编辑"); + }); + this.mapper.updateEntity(entity, request); + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public void delete(IdRequest request) { + ArchiveUtils.checkArchiveStatus( + this.repository::findAllById, + request.getIds(), + PdcDeviceSupplierEntity::getArchiveStatus, + x -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法删除"); + }); + this.repository.deleteAllById(request.getIds()); + } + + public PdcDeviceSupplierDto getById(String id) { + PdcDeviceSupplierEntity entity = repository.get(id); + + return mapper.toDto(entity); + } + + public Page list(CommonQuery query) { + Page page = + repository.findAll( + query.specification(conversionService), + PageRequest.of( + query.getPageNo(), + query.getPageSize(), + Sort.by(query.getOrders()))); + + return page.map(this.mapper::toDto); + } + + public void archive(IdRequest dto) { + this.repository.findAllById(dto.getIds()).stream() + .peek( + x -> + ArchiveUtils.checkArchiveStatus( + x, + PdcDeviceSupplierEntity::getArchiveStatus, + y -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法再次归档"); + })) + .peek(x -> x.setArchiveStatus("1")) + .forEach(this.repository::save); + } + + public void unarchive(IdRequest dto) { + this.repository.findAllById(dto.getIds()).stream() + .peek( + x -> + ArchiveUtils.checkArchiveStatus( + x, + PdcDeviceSupplierEntity::getArchiveStatus, + y -> "1", + (e, actual, expected) -> { + throw new BizException("数据" + "未归档,无法取消归档"); + })) + .peek(x -> x.setArchiveStatus("0")) + .forEach(this.repository::save); + } +} diff --git a/src/main/resources/db/migration/V39__pdcDataTrigger.sql b/src/main/resources/db/migration/V39__pdcDataTrigger.sql new file mode 100644 index 00000000..b0251402 --- /dev/null +++ b/src/main/resources/db/migration/V39__pdcDataTrigger.sql @@ -0,0 +1,38 @@ +create or replace function move_pdc_realtime_data() returns trigger as +$$ + +begin + insert into t_pdc_device_data (id, create_time, create_user_id, file_ids, update_time, update_user_id, code, name, + remarks, sort_key, status, organization_id, batch_data, class_data, day_data, + fault_data, + fault_info, fixed_data, flow_data, load_data, modbusuid, month_data, net_data, + output_data, process1data, process2data, speed_data, "time", total_data, + device_id) + values (new.id, new.create_time, new.create_user_id, new.file_ids, new.update_time, new.update_user_id, new.code, + new.name, + new.remarks, new.sort_key, new.status, new.organization_id, new.batch_data, new.class_data, new.day_data, + new.fault_data, + new.fault_info, new.fixed_data, new.flow_data, new.load_data, new.modbusuid, new.month_data, new.net_data, + new.output_data, new.process1data, new.process2data, new.speed_data, new."time", new.total_data, + new.device_id); + + return new; + + +end + + +$$ + language plpgsql; + + +--添加触发器 + +create or replace trigger move_pdc_realtime_data_trigger + + after insert or update + on t_pdc_device_real_time_data + + for each row + +execute procedure move_pdc_realtime_data(); diff --git a/src/main/resources/db/migration/V40__pdcDataTrigger.sql b/src/main/resources/db/migration/V40__pdcDataTrigger.sql new file mode 100644 index 00000000..6cb57bd1 --- /dev/null +++ b/src/main/resources/db/migration/V40__pdcDataTrigger.sql @@ -0,0 +1,38 @@ +create or replace function move_pdc_realtime_data() returns trigger as +$$ + +begin + insert into t_pdc_device_data (id, create_time, create_user_id, file_ids, update_time, update_user_id, code, name, + remarks, sort_key, status, organization_id, batch_data, class_data, day_data, + fault_data, + fault_info, fixed_data, flow_data, load_data, modbusuid, month_data, net_data, + output_data, process1data, process2data, speed_data, "time", total_data, + device_id) + values (gen_random_uuid()::text, new.create_time, new.create_user_id, new.file_ids, new.update_time, new.update_user_id, new.code, + new.name, + new.remarks, new.sort_key, new.status, new.organization_id, new.batch_data, new.class_data, new.day_data, + new.fault_data, + new.fault_info, new.fixed_data, new.flow_data, new.load_data, new.modbusuid, new.month_data, new.net_data, + new.output_data, new.process1data, new.process2data, new.speed_data, new."time", new.total_data, + new.device_id); + + return new; + + +end + + +$$ + language plpgsql; + + +--添加触发器 + +create or replace trigger move_pdc_realtime_data_trigger + + after insert or update + on t_pdc_device_real_time_data + + for each row + +execute procedure move_pdc_realtime_data(); diff --git a/src/main/resources/scripts/cronJob/savePdcData.groovy b/src/main/resources/scripts/cronJob/savePdcData.groovy new file mode 100644 index 00000000..d01cc689 --- /dev/null +++ b/src/main/resources/scripts/cronJob/savePdcData.groovy @@ -0,0 +1,9 @@ +import cn.lihongjie.coal.pdcDeviceRealTimeData.service.PdcDeviceRealTimeDataService +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def service = ioc.getBean(PdcDeviceRealTimeDataService.class) + +service.saveRealTimeDataToData() + diff --git a/src/main/resources/scripts/dict/enum/pdcDeviceDataDict.groovy b/src/main/resources/scripts/dict/enum/pdcDeviceDataDict.groovy new file mode 100644 index 00000000..26ea1e26 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/pdcDeviceDataDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.base.dto.CommonQuery +import cn.lihongjie.coal.pdcDeviceData.controller.PdcDeviceDataController +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(PdcDeviceDataController.class) + + + + +return controller.list(new CommonQuery()) + + diff --git a/src/main/resources/scripts/dict/enum/pdcDeviceDict.groovy b/src/main/resources/scripts/dict/enum/pdcDeviceDict.groovy new file mode 100644 index 00000000..876199f5 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/pdcDeviceDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.base.dto.CommonQuery +import cn.lihongjie.coal.pdcDevice.controller.PdcDeviceController +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(PdcDeviceController.class) + + + + +return controller.list(new CommonQuery()) + + diff --git a/src/main/resources/scripts/dict/enum/pdcDeviceRealTimeDataDict.groovy b/src/main/resources/scripts/dict/enum/pdcDeviceRealTimeDataDict.groovy new file mode 100644 index 00000000..2afa739e --- /dev/null +++ b/src/main/resources/scripts/dict/enum/pdcDeviceRealTimeDataDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.base.dto.CommonQuery +import cn.lihongjie.coal.pdcDeviceRealTimeData.controller.PdcDeviceRealTimeDataController +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(PdcDeviceRealTimeDataController.class) + + + + +return controller.list(new CommonQuery()) + + diff --git a/src/main/resources/scripts/dict/enum/pdcDeviceSuplierDict.groovy b/src/main/resources/scripts/dict/enum/pdcDeviceSuplierDict.groovy new file mode 100644 index 00000000..ade3ea25 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/pdcDeviceSuplierDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.base.dto.CommonQuery +import cn.lihongjie.coal.pdcDeviceSuplier.controller.PdcDeviceSuplierController +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(PdcDeviceSuplierController.class) + + + + +return controller.list(new CommonQuery()) + + diff --git a/src/main/resources/scripts/dict/enum/pdcDeviceSupplierDict.groovy b/src/main/resources/scripts/dict/enum/pdcDeviceSupplierDict.groovy new file mode 100644 index 00000000..fe74f662 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/pdcDeviceSupplierDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.base.dto.CommonQuery +import cn.lihongjie.coal.pdcDeviceSupplier.controller.PdcDeviceSupplierController +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(PdcDeviceSupplierController.class) + + + + +return controller.list(new CommonQuery()) + +