From bc8833da3203ad416a515a30bacd09d21fdea3ca Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Sun, 26 May 2024 15:37:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../cn/lihongjie/coal/base/dto/SimpleDto.java | 8 ++ .../cn/lihongjie/coal/common/DictCode.java | 2 + .../coal/common/IntsCompression.java | 34 ++++++ .../listener/WeightListener.java | 49 ++++++++ .../lihongjie/coal/device/dto/DeviceDto.java | 8 +- .../controller/DictionaryController.java | 7 ++ .../script/controller/ScriptController.java | 8 ++ .../dto/WeightDeviceDataReportRequest.java | 7 ++ .../service/WeightDeviceDataService.java | 109 ++++++++++++++++++ .../enum/weightDeviceDataGoodsDict.groovy | 22 ++++ .../enum/weightDeviceDataMzUserDict.groovy | 22 ++++ .../enum/weightDeviceDataPlateNoDict.groovy | 22 ++++ .../enum/weightDeviceDataPzUserDict.groovy | 22 ++++ ...htDeviceDataReceiveOrganizationDict.groovy | 22 ++++ ...eightDeviceDataSendOrganizationDict.groovy | 22 ++++ .../weightDeviceDataSpecificationDict.groovy | 22 ++++ 17 files changed, 391 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/lihongjie/coal/common/IntsCompression.java create mode 100644 src/main/resources/scripts/dict/enum/weightDeviceDataGoodsDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/weightDeviceDataMzUserDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/weightDeviceDataPlateNoDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/weightDeviceDataPzUserDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/weightDeviceDataReceiveOrganizationDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/weightDeviceDataSendOrganizationDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/weightDeviceDataSpecificationDict.groovy diff --git a/pom.xml b/pom.xml index d0841c39..731f1a93 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,12 @@ + + me.lemire.integercompression + JavaFastPFOR + 0.1.12 + + com.github.ben-manes.caffeine caffeine diff --git a/src/main/java/cn/lihongjie/coal/base/dto/SimpleDto.java b/src/main/java/cn/lihongjie/coal/base/dto/SimpleDto.java index 92be54fe..c403d76a 100644 --- a/src/main/java/cn/lihongjie/coal/base/dto/SimpleDto.java +++ b/src/main/java/cn/lihongjie/coal/base/dto/SimpleDto.java @@ -9,10 +9,18 @@ import java.util.*; @Data public class SimpleDto { private String id; + @Comment("名称") private String name; @Comment("编码") private String code; + public static SimpleDto from(String name) { + SimpleDto simpleDto = new SimpleDto(); + simpleDto.setName(name); + simpleDto.setId(name); + simpleDto.setCode(name); + return simpleDto; + } } diff --git a/src/main/java/cn/lihongjie/coal/common/DictCode.java b/src/main/java/cn/lihongjie/coal/common/DictCode.java index d9f60c79..97f31fb3 100644 --- a/src/main/java/cn/lihongjie/coal/common/DictCode.java +++ b/src/main/java/cn/lihongjie/coal/common/DictCode.java @@ -55,6 +55,8 @@ public class DictCode { public static final String DEVICE_CATEGORY_DEVICECODEGENRULE = "device.category.deviceCodeGenRule"; + public static final String DEVICE_STATUS = "device.status"; + public static final String EXCEL_GENERATOR_DATASOURCE_TYPE = "excel.generator.datasource.type"; public static final String DEVICE_WORKORDER_STATUS = "device.workOrder.status"; diff --git a/src/main/java/cn/lihongjie/coal/common/IntsCompression.java b/src/main/java/cn/lihongjie/coal/common/IntsCompression.java new file mode 100644 index 00000000..08371fec --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/common/IntsCompression.java @@ -0,0 +1,34 @@ +package cn.lihongjie.coal.common; + +import lombok.experimental.UtilityClass; + +import me.lemire.integercompression.differential.IntegratedIntCompressor; + +@UtilityClass +public class IntsCompression { + + public static int[] compress(int[] data){ + + + if (data == null || data.length == 0) { + return new int[0]; + } + + + + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + + return iic.compress(data); + + } + + + public static int[] decompress(int[] compressed) { + + if (compressed == null || compressed.length == 0) { + return new int[0]; + } + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + return iic.uncompress(compressed); + } +} diff --git a/src/main/java/cn/lihongjie/coal/dataCollector/listener/WeightListener.java b/src/main/java/cn/lihongjie/coal/dataCollector/listener/WeightListener.java index 1c71bc96..3830315a 100644 --- a/src/main/java/cn/lihongjie/coal/dataCollector/listener/WeightListener.java +++ b/src/main/java/cn/lihongjie/coal/dataCollector/listener/WeightListener.java @@ -2,6 +2,7 @@ package cn.lihongjie.coal.dataCollector.listener; import cn.lihongjie.coal.acDevice.service.AcDeviceService; import cn.lihongjie.coal.acDeviceData.service.AcDeviceDataService; +import cn.lihongjie.coal.common.IntsCompression; import cn.lihongjie.coal.dataCollector.entity.DataCollectorEntity; import cn.lihongjie.coal.dataCollector.service.DataCollectorService; import cn.lihongjie.coal.dataCollectorLog.entity.DataCollectorLogEntity; @@ -15,6 +16,7 @@ import cn.lihongjie.coal.weightDeviceData.service.WeightDeviceDataService; 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 io.vavr.control.Try; @@ -34,6 +36,7 @@ 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.core.convert.ConversionService; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -63,6 +66,9 @@ public class WeightListener { @Autowired WeightDeviceService weightDeviceService; + @Autowired + ConversionService conversionService; + @SneakyThrows @RabbitListener( bindings = { @@ -142,6 +148,10 @@ public class WeightListener { case "weight20.weightinvalid" -> { handleWeightInvalid((ArrayNode) jsonNode, logEntity, device); } + + case "weight20.seqSync" -> { + seqSync( jsonNode, logEntity, device); + } default -> { log.warn("unknown message type: {}", rk); } @@ -150,6 +160,45 @@ public class WeightListener { dataCollectorLogService.save(logEntity); // log.info("new message from pms: {}", body); + } + + private void seqSync(JsonNode jsonNode, DataCollectorLogEntity logEntity, WeightDeviceEntity device) { + + + ObjectNode node = (ObjectNode) jsonNode; + + LocalDateTime start = conversionService.convert(node.get("start").asText(), LocalDateTime.class); + LocalDateTime end = conversionService.convert(node.get("end").asText(), LocalDateTime.class); + + int[] seqs = objectMapper.convertValue(node.get("seqs"), int[].class); + + node.remove("seqs"); + + if (start == null || end == null){ + logEntity.setContent("start or end is null " + node.toPrettyString()); + return; + } + + + if (seqs == null){ + logEntity.setContent("seqs is null " + node.toPrettyString()); + return; + } + + + seqs = IntsCompression.decompress(seqs); + + + log.info("seqs: {} {} {} ", start, end, seqs.length); + + logEntity.setContent("seqs: " + seqs.length + " " + start + " " + end); + + + weightDeviceDataService.invalidate(start, end, seqs, device.getId()); + + + + } private void handleWeightInvalid( diff --git a/src/main/java/cn/lihongjie/coal/device/dto/DeviceDto.java b/src/main/java/cn/lihongjie/coal/device/dto/DeviceDto.java index afe33cec..bebd3654 100644 --- a/src/main/java/cn/lihongjie/coal/device/dto/DeviceDto.java +++ b/src/main/java/cn/lihongjie/coal/device/dto/DeviceDto.java @@ -71,7 +71,13 @@ public class DeviceDto extends OrgCommonDto { private String deviceStatus; - @JsonProperty("dReserve1") private Double dReserve1; + @DictTranslate(dictKey = DictCode.DEVICE_STATUS) + private String deviceStatusName; + + @JsonProperty("dReserve1") + private Double dReserve1; + + @JsonProperty("dReserve2") private Double dReserve2; @JsonProperty("dReserve3") private Double dReserve3; @JsonProperty("dReserve4") private Double dReserve4; diff --git a/src/main/java/cn/lihongjie/coal/dictionary/controller/DictionaryController.java b/src/main/java/cn/lihongjie/coal/dictionary/controller/DictionaryController.java index f7bb4aad..d3ae593f 100644 --- a/src/main/java/cn/lihongjie/coal/dictionary/controller/DictionaryController.java +++ b/src/main/java/cn/lihongjie/coal/dictionary/controller/DictionaryController.java @@ -40,6 +40,13 @@ public class DictionaryController extends BaseController { return true; } + @PostMapping("/initDefault") + @SysLog(action = "初始化默认数据") + public Object initDefault() { + this.service.initDefault(); + return true; + } + @PostMapping("/tree") public DictionaryTreeDto tree(@RequestBody DictTreeRequest dto) { return this.service.tree(dto); diff --git a/src/main/java/cn/lihongjie/coal/script/controller/ScriptController.java b/src/main/java/cn/lihongjie/coal/script/controller/ScriptController.java index af9c43b1..d4234c9b 100644 --- a/src/main/java/cn/lihongjie/coal/script/controller/ScriptController.java +++ b/src/main/java/cn/lihongjie/coal/script/controller/ScriptController.java @@ -45,6 +45,14 @@ public class ScriptController extends BaseController { return true; } + + @PostMapping("/initFromResource") + @SysLog(action = "初始化") + public Object initFromResource() { + this.service.initFromResource(); + return true; + } + @PostMapping("/list") public Page list(@RequestBody CommonQuery dto) { return this.service.list(dto); diff --git a/src/main/java/cn/lihongjie/coal/weightDeviceData/dto/WeightDeviceDataReportRequest.java b/src/main/java/cn/lihongjie/coal/weightDeviceData/dto/WeightDeviceDataReportRequest.java index 73636453..d3f86c17 100644 --- a/src/main/java/cn/lihongjie/coal/weightDeviceData/dto/WeightDeviceDataReportRequest.java +++ b/src/main/java/cn/lihongjie/coal/weightDeviceData/dto/WeightDeviceDataReportRequest.java @@ -37,13 +37,20 @@ hour /** 过滤条件 */ private String plateNo; + private List plateNoList; private String sendOrganization; + private List sendOrganizationList; private String receiveOrganization; + private List receiveOrganizationList; private String goods; + private List goodsList; private String specification; + private List specificationList; private String mzUser; + private List mzUserList; private String pzUser; + private List pzUserList; @Data public static class FieldInfo { diff --git a/src/main/java/cn/lihongjie/coal/weightDeviceData/service/WeightDeviceDataService.java b/src/main/java/cn/lihongjie/coal/weightDeviceData/service/WeightDeviceDataService.java index d8ad9e24..da42cdbe 100644 --- a/src/main/java/cn/lihongjie/coal/weightDeviceData/service/WeightDeviceDataService.java +++ b/src/main/java/cn/lihongjie/coal/weightDeviceData/service/WeightDeviceDataService.java @@ -429,6 +429,37 @@ where 更新时间>='%s' and 更新时间<='%s' where += " and d.specification = :specification "; } + + + + + + if (CollectionUtils.isNotEmpty(request.getPlateNoList())) { + where += " and d.plate_no like :plateNoList "; + } + + if (CollectionUtils.isNotEmpty(request.getSendOrganizationList())) { + where += " and d.send_organization like :sendOrganizationList "; + } + + if (CollectionUtils.isNotEmpty(request.getReceiveOrganizationList())) { + where += " and d.receive_organization like :receiveOrganizationList "; + } + + if (CollectionUtils.isNotEmpty(request.getGoodsList())) { + where += " and d.goods like :goodsList "; + } + + if (CollectionUtils.isNotEmpty(request.getSpecificationList())) { + where += " and d.specification = :specificationList "; + } + + + + + + + where += " and ( d.invalid is null or not d.invalid ) "; where += " and ( d.finished is null or d.finished ) "; @@ -503,6 +534,52 @@ where 更新时间>='%s' and 更新时间<='%s' countQuery.setParameter("specification", "%" + request.getSpecification() + "%"); } + + if (CollectionUtils.isNotEmpty(request.getPlateNoList())) { + selectQuery.setParameter("plateNoList", request.getPlateNoList()); + countQuery.setParameter("plateNoList", request.getPlateNoList()); + } + + if (CollectionUtils.isNotEmpty(request.getSendOrganizationList())) { + selectQuery.setParameter("sendOrganizationList", request.getSendOrganizationList()); + countQuery.setParameter("sendOrganizationList", request.getSendOrganizationList()); + } + + + if (CollectionUtils.isNotEmpty(request.getReceiveOrganizationList())) { + selectQuery.setParameter("receiveOrganizationList", request.getReceiveOrganizationList()); + countQuery.setParameter("receiveOrganizationList", request.getReceiveOrganizationList()); + } + + if (CollectionUtils.isNotEmpty(request.getGoodsList())) { + selectQuery.setParameter("goodsList", request.getGoodsList()); + countQuery.setParameter("goodsList", request.getGoodsList()); + } + + + if (CollectionUtils.isNotEmpty(request.getSpecificationList())) { + selectQuery.setParameter("specificationList", request.getSpecificationList()); + countQuery.setParameter("specificationList", request.getSpecificationList()); + } + + + + if (CollectionUtils.isNotEmpty(request.getMzUserList())){ + selectQuery.setParameter("mzUserList", request.getMzUserList()); + countQuery.setParameter("mzUserList", request.getMzUserList()); + } + + if (CollectionUtils.isNotEmpty(request.getPzUserList())){ + selectQuery.setParameter("pzUserList", request.getPzUserList()); + countQuery.setParameter("pzUserList", request.getPzUserList()); + } + + + + + + + var resultList = JpaUtils.convertTuplesToMap(selectQuery.getResultList()); var ans = @@ -529,4 +606,36 @@ where 更新时间>='%s' and 更新时间<='%s' PageRequest.of(0, request.getPageSize()), Integer.parseInt(countQuery.getSingleResult().toString())); } + + public int invalidate(LocalDateTime start, LocalDateTime end, int[] seqs, String id) { + + int cnt = + em.createQuery( + "update WeightDeviceDataEntity d set d.invalid = true where d.sequenceNumber not in :ids and d.dataUpdateTime >= :start and d.dataUpdateTime <= :end and d.device.id = :id and d.archiveStatus = '0'") + .setParameter("ids", seqs) + .setParameter("start", start) + .setParameter("end", end) + .setParameter("id", id) + .executeUpdate(); + + log.info("invalidate {} records, start {} end {} deviceId {} seqsLen {} ", cnt, start, end, id, seqs.length); + + + + int cnt2 = + em.createQuery( + "update WeightDeviceDataEntity d set d.invalid = false where d.sequenceNumber in :ids and d.dataUpdateTime >= :start and d.dataUpdateTime <= :end and d.device.id = :id and d.archiveStatus = '0'") + .setParameter("ids", seqs) + .setParameter("start", start) + .setParameter("end", end) + .setParameter("id", id) + .executeUpdate(); + + log.info("validate {} records, start {} end {} deviceId {} seqsLen {} ", cnt2, start, end, id, seqs.length); + + return cnt; + + + + } } diff --git a/src/main/resources/scripts/dict/enum/weightDeviceDataGoodsDict.groovy b/src/main/resources/scripts/dict/enum/weightDeviceDataGoodsDict.groovy new file mode 100644 index 00000000..6ba037bf --- /dev/null +++ b/src/main/resources/scripts/dict/enum/weightDeviceDataGoodsDict.groovy @@ -0,0 +1,22 @@ +package scripts.dict + + +import cn.lihongjie.coal.common.Ctx +import com.fasterxml.jackson.databind.JsonNode +import jakarta.persistence.EntityManager +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + + +EntityManager em = ioc.getBean(EntityManager.class) + + +return em.createQuery("select distinct goods from WeightDeviceDataEntity where goods like :q and organizationId = :organizationId order by goods limit 10") + .setParameter("q", "%${(params as JsonNode).get("q").asText('')}%" as String) + .setParameter("organizationId", Ctx.currentUser().organizationId) + .resultList + .collect { it as String } + .sort() + + diff --git a/src/main/resources/scripts/dict/enum/weightDeviceDataMzUserDict.groovy b/src/main/resources/scripts/dict/enum/weightDeviceDataMzUserDict.groovy new file mode 100644 index 00000000..fa674402 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/weightDeviceDataMzUserDict.groovy @@ -0,0 +1,22 @@ +package scripts.dict + + +import cn.lihongjie.coal.common.Ctx +import com.fasterxml.jackson.databind.JsonNode +import jakarta.persistence.EntityManager +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + + +EntityManager em = ioc.getBean(EntityManager.class) + + +return em.createQuery("select distinct mzUser from WeightDeviceDataEntity where mzUser like :q and organizationId = :organizationId order by mzUser limit 10") + .setParameter("q", "%${(params as JsonNode).get("q").asText('')}%" as String) + .setParameter("organizationId", Ctx.currentUser().organizationId) + .resultList + .collect { it as String } + .sort() + + diff --git a/src/main/resources/scripts/dict/enum/weightDeviceDataPlateNoDict.groovy b/src/main/resources/scripts/dict/enum/weightDeviceDataPlateNoDict.groovy new file mode 100644 index 00000000..e09575cb --- /dev/null +++ b/src/main/resources/scripts/dict/enum/weightDeviceDataPlateNoDict.groovy @@ -0,0 +1,22 @@ +package scripts.dict + + +import cn.lihongjie.coal.common.Ctx +import com.fasterxml.jackson.databind.JsonNode +import jakarta.persistence.EntityManager +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + + +EntityManager em = ioc.getBean(EntityManager.class) + + +return em.createQuery("select distinct plateNo from WeightDeviceDataEntity where plateNo like :q and organizationId = :organizationId order by plateNo limit 10") + .setParameter("q", "%${(params as JsonNode).get("q").asText('')}%" as String) + .setParameter("organizationId", Ctx.currentUser().organizationId) + .resultList + .collect { it as String } + .sort() + + diff --git a/src/main/resources/scripts/dict/enum/weightDeviceDataPzUserDict.groovy b/src/main/resources/scripts/dict/enum/weightDeviceDataPzUserDict.groovy new file mode 100644 index 00000000..e7cf2efb --- /dev/null +++ b/src/main/resources/scripts/dict/enum/weightDeviceDataPzUserDict.groovy @@ -0,0 +1,22 @@ +package scripts.dict + + +import cn.lihongjie.coal.common.Ctx +import com.fasterxml.jackson.databind.JsonNode +import jakarta.persistence.EntityManager +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + + +EntityManager em = ioc.getBean(EntityManager.class) + + +return em.createQuery("select distinct pzUser from WeightDeviceDataEntity where pzUser like :q and organizationId = :organizationId order by pzUser limit 10") + .setParameter("q", "%${(params as JsonNode).get("q").asText('')}%" as String) + .setParameter("organizationId", Ctx.currentUser().organizationId) + .resultList + .collect { it as String } + .sort() + + diff --git a/src/main/resources/scripts/dict/enum/weightDeviceDataReceiveOrganizationDict.groovy b/src/main/resources/scripts/dict/enum/weightDeviceDataReceiveOrganizationDict.groovy new file mode 100644 index 00000000..cb4e35b5 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/weightDeviceDataReceiveOrganizationDict.groovy @@ -0,0 +1,22 @@ +package scripts.dict + + +import cn.lihongjie.coal.common.Ctx +import com.fasterxml.jackson.databind.JsonNode +import jakarta.persistence.EntityManager +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + + +EntityManager em = ioc.getBean(EntityManager.class) + + +return em.createQuery("select distinct receiveOrganization from WeightDeviceDataEntity where receiveOrganization like :q and organizationId = :organizationId order by receiveOrganization limit 10") + .setParameter("q", "%${(params as JsonNode).get("q").asText('')}%" as String) + .setParameter("organizationId", Ctx.currentUser().organizationId) + .resultList + .collect { it as String } + .sort() + + diff --git a/src/main/resources/scripts/dict/enum/weightDeviceDataSendOrganizationDict.groovy b/src/main/resources/scripts/dict/enum/weightDeviceDataSendOrganizationDict.groovy new file mode 100644 index 00000000..09bf7456 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/weightDeviceDataSendOrganizationDict.groovy @@ -0,0 +1,22 @@ +package scripts.dict + + +import cn.lihongjie.coal.common.Ctx +import com.fasterxml.jackson.databind.JsonNode +import jakarta.persistence.EntityManager +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + + +EntityManager em = ioc.getBean(EntityManager.class) + + +return em.createQuery("select distinct sendOrganization from WeightDeviceDataEntity where sendOrganization like :q and organizationId = :organizationId order by sendOrganization limit 10") + .setParameter("q", "%${(params as JsonNode).get("q").asText('')}%" as String) + .setParameter("organizationId", Ctx.currentUser().organizationId) + .resultList + .collect { it as String } + .sort() + + diff --git a/src/main/resources/scripts/dict/enum/weightDeviceDataSpecificationDict.groovy b/src/main/resources/scripts/dict/enum/weightDeviceDataSpecificationDict.groovy new file mode 100644 index 00000000..2255d38e --- /dev/null +++ b/src/main/resources/scripts/dict/enum/weightDeviceDataSpecificationDict.groovy @@ -0,0 +1,22 @@ +package scripts.dict + + +import cn.lihongjie.coal.common.Ctx +import com.fasterxml.jackson.databind.JsonNode +import jakarta.persistence.EntityManager +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + + +EntityManager em = ioc.getBean(EntityManager.class) + + +return em.createQuery("select distinct specification from WeightDeviceDataEntity where specification like :q and organizationId = :organizationId order by specification limit 10") + .setParameter("q", "%${(params as JsonNode).get("q").asText('')}%" as String) + .setParameter("organizationId", Ctx.currentUser().organizationId) + .resultList + .collect { it as String } + .sort() + +