From 300af1e79e643f1355d0593f12f688ed13087946 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Sun, 31 Mar 2024 08:39:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=97=A8=E7=A6=81=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AcDeviceController.java | 66 ++++ .../coal/acDevice/dto/AcDeviceDto.java | 41 +++ .../coal/acDevice/dto/CreateAcDeviceDto.java | 35 +++ .../coal/acDevice/dto/UpdateAcDeviceDto.java | 35 +++ .../coal/acDevice/entity/AcDeviceEntity.java | 50 +++ .../coal/acDevice/mapper/AcDeviceMapper.java | 19 ++ .../repository/AcDeviceRepository.java | 9 + .../acDevice/service/AcDeviceService.java | 120 +++++++ .../controller/AcDeviceDataController.java | 54 ++++ .../acDeviceData/dto/AcDeviceDataDto.java | 65 ++++ .../dto/CreateAcDeviceDataDto.java | 8 + .../dto/UpdateAcDeviceDataDto.java | 8 + .../entity/AcDeviceDataEntity.java | 86 ++++++ .../mapper/AcDeviceDataMapper.java | 23 ++ .../repository/AcDeviceDataRepository.java | 9 + .../service/AcDeviceDataService.java | 73 +++++ .../AcDeviceSupplierController.java | 66 ++++ .../dto/AcDeviceSupplierDto.java | 18 ++ .../dto/CreateAcDeviceSupplierDto.java | 15 + .../dto/UpdateAcDeviceSupplierDto.java | 15 + .../entity/AcDeviceSupplierEntity.java | 34 ++ .../mapper/AcDeviceSupplierMapper.java | 23 ++ .../AcDeviceSupplierRepository.java | 9 + .../service/AcDeviceSupplierService.java | 121 ++++++++ .../listener/DataCollectorListener.java | 99 ++++++ .../dataCollector/listener/PmsListener.java | 292 ++++++++++++++++++ .../repository/DataCollectorRepository.java | 4 +- .../service/DataCollectorService.java | 7 + .../coal/rabbitmq/RabbitMQConfiguration.java | 2 + src/main/resources/application.yaml | 2 +- src/main/resources/config/dictionary.json | 11 + .../scripts/dict/enum/acDeviceDataDict.groovy | 17 + .../scripts/dict/enum/acDeviceDict.groovy | 17 + .../dict/enum/acDeviceSupplierDict.groovy | 17 + 34 files changed, 1468 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/controller/AcDeviceController.java create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/dto/AcDeviceDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/dto/CreateAcDeviceDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/dto/UpdateAcDeviceDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/entity/AcDeviceEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/mapper/AcDeviceMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/repository/AcDeviceRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/acDevice/service/AcDeviceService.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/controller/AcDeviceDataController.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/dto/AcDeviceDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/dto/CreateAcDeviceDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/dto/UpdateAcDeviceDataDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/entity/AcDeviceDataEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/mapper/AcDeviceDataMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/repository/AcDeviceDataRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceData/service/AcDeviceDataService.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/controller/AcDeviceSupplierController.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/AcDeviceSupplierDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/CreateAcDeviceSupplierDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/UpdateAcDeviceSupplierDto.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/entity/AcDeviceSupplierEntity.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/mapper/AcDeviceSupplierMapper.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/repository/AcDeviceSupplierRepository.java create mode 100644 src/main/java/cn/lihongjie/coal/acDeviceSupplier/service/AcDeviceSupplierService.java create mode 100644 src/main/java/cn/lihongjie/coal/dataCollector/listener/DataCollectorListener.java create mode 100644 src/main/java/cn/lihongjie/coal/dataCollector/listener/PmsListener.java create mode 100644 src/main/resources/scripts/dict/enum/acDeviceDataDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/acDeviceDict.groovy create mode 100644 src/main/resources/scripts/dict/enum/acDeviceSupplierDict.groovy diff --git a/src/main/java/cn/lihongjie/coal/acDevice/controller/AcDeviceController.java b/src/main/java/cn/lihongjie/coal/acDevice/controller/AcDeviceController.java new file mode 100644 index 00000000..c3993d1b --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/controller/AcDeviceController.java @@ -0,0 +1,66 @@ +package cn.lihongjie.coal.acDevice.controller; + +import cn.lihongjie.coal.acDevice.dto.AcDeviceDto; +import cn.lihongjie.coal.acDevice.dto.CreateAcDeviceDto; +import cn.lihongjie.coal.acDevice.dto.UpdateAcDeviceDto; +import cn.lihongjie.coal.acDevice.service.AcDeviceService; +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 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("/acDevice") +@SysLog(module = "门禁设备") +@Slf4j +@OrgScope +public class AcDeviceController { + @Autowired private AcDeviceService service; + + @PostMapping("/create") + public AcDeviceDto create(@RequestBody CreateAcDeviceDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public AcDeviceDto update(@RequestBody UpdateAcDeviceDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public AcDeviceDto 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/acDevice/dto/AcDeviceDto.java b/src/main/java/cn/lihongjie/coal/acDevice/dto/AcDeviceDto.java new file mode 100644 index 00000000..d868e20b --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/dto/AcDeviceDto.java @@ -0,0 +1,41 @@ +package cn.lihongjie.coal.acDevice.dto; + +import cn.lihongjie.coal.acDeviceSupplier.dto.AcDeviceSupplierDto; +import cn.lihongjie.coal.base.dto.OrgCommonDto; +import cn.lihongjie.coal.dataCollector.dto.DataCollectorDto; + +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; + +@Data +public class AcDeviceDto extends OrgCommonDto { + + @ManyToOne + AcDeviceSupplierDto supplier; + + @ManyToOne + DataCollectorDto dataCollector; + + @Comment("设备类型") + private String deviceType; + + @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 = 'ac.device.type'\n" + + " and i.code = device_type)") + private String deviceTypeName; + + private String location; + + + private String archiveStatus; + + private String archiveStatusName; +} diff --git a/src/main/java/cn/lihongjie/coal/acDevice/dto/CreateAcDeviceDto.java b/src/main/java/cn/lihongjie/coal/acDevice/dto/CreateAcDeviceDto.java new file mode 100644 index 00000000..b9b4e960 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/dto/CreateAcDeviceDto.java @@ -0,0 +1,35 @@ +package cn.lihongjie.coal.acDevice.dto; + +import cn.lihongjie.coal.acDevice.entity.AcDeviceEntity; +import cn.lihongjie.coal.base.dto.OrgCommonDto; +import cn.lihongjie.coal.errorMsg.ErrorMsgCode; +import cn.lihongjie.coal.validator.OrgUniq; +import cn.lihongjie.coal.validator.RequireCode; +import cn.lihongjie.coal.validator.RequireName; + +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +@Data +@RequireName +@RequireCode +@OrgUniq(fields = {"code"}, message = ErrorMsgCode.UNIQ_CODE, entityClass = AcDeviceEntity.class) +@OrgUniq(fields = {"name"}, message = ErrorMsgCode.UNIQ_NAME, entityClass = AcDeviceEntity.class) +public class CreateAcDeviceDto extends OrgCommonDto { + + @ManyToOne + String supplier; + + @ManyToOne + String dataCollector; + + @Comment("设备类型") + private String deviceType; + + + + private String location; +} diff --git a/src/main/java/cn/lihongjie/coal/acDevice/dto/UpdateAcDeviceDto.java b/src/main/java/cn/lihongjie/coal/acDevice/dto/UpdateAcDeviceDto.java new file mode 100644 index 00000000..02b566da --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/dto/UpdateAcDeviceDto.java @@ -0,0 +1,35 @@ +package cn.lihongjie.coal.acDevice.dto; + +import cn.lihongjie.coal.acDevice.entity.AcDeviceEntity; +import cn.lihongjie.coal.base.dto.OrgCommonDto; +import cn.lihongjie.coal.errorMsg.ErrorMsgCode; +import cn.lihongjie.coal.validator.OrgUniq; +import cn.lihongjie.coal.validator.RequireCode; +import cn.lihongjie.coal.validator.RequireName; + +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +@Data +@RequireName +@RequireCode +@OrgUniq(fields = {"code"}, message = ErrorMsgCode.UNIQ_CODE, entityClass = AcDeviceEntity.class) +@OrgUniq(fields = {"name"}, message = ErrorMsgCode.UNIQ_NAME, entityClass = AcDeviceEntity.class) +public class UpdateAcDeviceDto extends OrgCommonDto { + + @ManyToOne + String supplier; + + @ManyToOne + String dataCollector; + + @Comment("设备类型") + private String deviceType; + + + + private String location; +} diff --git a/src/main/java/cn/lihongjie/coal/acDevice/entity/AcDeviceEntity.java b/src/main/java/cn/lihongjie/coal/acDevice/entity/AcDeviceEntity.java new file mode 100644 index 00000000..5fc6ec56 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/entity/AcDeviceEntity.java @@ -0,0 +1,50 @@ +package cn.lihongjie.coal.acDevice.entity; + +import cn.lihongjie.coal.acDeviceSupplier.entity.AcDeviceSupplierEntity; +import cn.lihongjie.coal.base.entity.OrgCommonEntity; +import cn.lihongjie.coal.dataCollector.entity.DataCollectorEntity; + +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 AcDeviceEntity extends OrgCommonEntity { + @ManyToOne + AcDeviceSupplierEntity supplier; + + @ManyToOne + DataCollectorEntity dataCollector; + + @Comment("设备类型") + private String deviceType; + + @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 = 'ac.device.type'\n" + + " and i.code = device_type)") + private String deviceTypeName; + + private String location; + @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/acDevice/mapper/AcDeviceMapper.java b/src/main/java/cn/lihongjie/coal/acDevice/mapper/AcDeviceMapper.java new file mode 100644 index 00000000..7f9a73ea --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/mapper/AcDeviceMapper.java @@ -0,0 +1,19 @@ +package cn.lihongjie.coal.acDevice.mapper; + +import cn.lihongjie.coal.acDevice.dto.AcDeviceDto; +import cn.lihongjie.coal.acDevice.dto.CreateAcDeviceDto; +import cn.lihongjie.coal.acDevice.dto.UpdateAcDeviceDto; +import cn.lihongjie.coal.acDevice.entity.AcDeviceEntity; +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; + +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 AcDeviceMapper + extends BaseMapper {} diff --git a/src/main/java/cn/lihongjie/coal/acDevice/repository/AcDeviceRepository.java b/src/main/java/cn/lihongjie/coal/acDevice/repository/AcDeviceRepository.java new file mode 100644 index 00000000..e50f1289 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/repository/AcDeviceRepository.java @@ -0,0 +1,9 @@ +package cn.lihongjie.coal.acDevice.repository; + +import cn.lihongjie.coal.acDevice.entity.AcDeviceEntity; +import cn.lihongjie.coal.base.dao.BaseRepository; + +import org.springframework.stereotype.Repository; + +@Repository +public interface AcDeviceRepository extends BaseRepository {} diff --git a/src/main/java/cn/lihongjie/coal/acDevice/service/AcDeviceService.java b/src/main/java/cn/lihongjie/coal/acDevice/service/AcDeviceService.java new file mode 100644 index 00000000..766c0b61 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDevice/service/AcDeviceService.java @@ -0,0 +1,120 @@ +package cn.lihongjie.coal.acDevice.service; + +import cn.lihongjie.coal.acDevice.dto.AcDeviceDto; +import cn.lihongjie.coal.acDevice.dto.CreateAcDeviceDto; +import cn.lihongjie.coal.acDevice.dto.UpdateAcDeviceDto; +import cn.lihongjie.coal.acDevice.entity.AcDeviceEntity; +import cn.lihongjie.coal.acDevice.mapper.AcDeviceMapper; +import cn.lihongjie.coal.acDevice.repository.AcDeviceRepository; +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 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 AcDeviceService extends BaseService { + @Autowired private AcDeviceRepository repository; + + @Autowired private AcDeviceMapper mapper; + + @Autowired private ConversionService conversionService; + + @Autowired private DbFunctionService dbFunctionService; + + public AcDeviceDto create(CreateAcDeviceDto request) { + AcDeviceEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public AcDeviceDto update(UpdateAcDeviceDto request) { + AcDeviceEntity entity = this.repository.get(request.getId()); + ArchiveUtils.checkArchiveStatus( + entity, + AcDeviceEntity::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(), + AcDeviceEntity::getArchiveStatus, + x -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法删除"); + }); + this.repository.deleteAllById(request.getIds()); + } + + public AcDeviceDto getById(String id) { + AcDeviceEntity 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, + AcDeviceEntity::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, + AcDeviceEntity::getArchiveStatus, + y -> "1", + (e, actual, expected) -> { + throw new BizException("数据" + "未归档,无法取消归档"); + })) + .peek(x -> x.setArchiveStatus("0")) + .forEach(this.repository::save); + } +} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceData/controller/AcDeviceDataController.java b/src/main/java/cn/lihongjie/coal/acDeviceData/controller/AcDeviceDataController.java new file mode 100644 index 00000000..b8c8e321 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/controller/AcDeviceDataController.java @@ -0,0 +1,54 @@ +package cn.lihongjie.coal.acDeviceData.controller; + +import cn.lihongjie.coal.acDeviceData.dto.AcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.dto.CreateAcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.dto.UpdateAcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.service.AcDeviceDataService; +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 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("/acDeviceData") +@SysLog(module = "门禁设备数据") +@Slf4j +@OrgScope +public class AcDeviceDataController { + @Autowired private AcDeviceDataService service; + + @PostMapping("/create") + public AcDeviceDataDto create(@RequestBody CreateAcDeviceDataDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public AcDeviceDataDto update(@RequestBody UpdateAcDeviceDataDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public AcDeviceDataDto 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/acDeviceData/dto/AcDeviceDataDto.java b/src/main/java/cn/lihongjie/coal/acDeviceData/dto/AcDeviceDataDto.java new file mode 100644 index 00000000..15e790a9 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/dto/AcDeviceDataDto.java @@ -0,0 +1,65 @@ +package cn.lihongjie.coal.acDeviceData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + +@Data +public class AcDeviceDataDto extends OrgCommonDto { + @Comment("原始数据id") + private String srcId; + + @Comment("停车场id") + private String parkNo; + + @Comment("停车场名称") + private String parkName; + + @Comment("大门id") + private String gateNo; + + @Comment("大门名称") + private String gateName; + + @Comment("车道id") + private String laneNo; + + @Comment("车道名称") + private String laneName; + + @Comment("车牌号") + private String plateNo; + + @Comment("方向编码") + private String direction; + + @Comment("操作类型") + private String operationType; + + @Comment("车牌类型") + private String plateType; + + @Comment("车牌颜色") + private String plateColor; + + @Comment("通行时间") + private LocalDateTime passTime; + + @Comment("车辆颜色") + private String vehicleColor; + + private String vehicleShade; + + private String parkingType; + + @Comment("车辆类型") + private String vehicleType; + + @Comment("信任度") + private String belief; + +} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceData/dto/CreateAcDeviceDataDto.java b/src/main/java/cn/lihongjie/coal/acDeviceData/dto/CreateAcDeviceDataDto.java new file mode 100644 index 00000000..b4aaaed1 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/dto/CreateAcDeviceDataDto.java @@ -0,0 +1,8 @@ +package cn.lihongjie.coal.acDeviceData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class CreateAcDeviceDataDto extends OrgCommonDto {} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceData/dto/UpdateAcDeviceDataDto.java b/src/main/java/cn/lihongjie/coal/acDeviceData/dto/UpdateAcDeviceDataDto.java new file mode 100644 index 00000000..bbac89e4 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/dto/UpdateAcDeviceDataDto.java @@ -0,0 +1,8 @@ +package cn.lihongjie.coal.acDeviceData.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class UpdateAcDeviceDataDto extends OrgCommonDto {} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceData/entity/AcDeviceDataEntity.java b/src/main/java/cn/lihongjie/coal/acDeviceData/entity/AcDeviceDataEntity.java new file mode 100644 index 00000000..b180459c --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/entity/AcDeviceDataEntity.java @@ -0,0 +1,86 @@ +package cn.lihongjie.coal.acDeviceData.entity; + +import cn.lihongjie.coal.acDevice.entity.AcDeviceEntity; +import cn.lihongjie.coal.base.entity.OrgCommonEntity; + +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + +@Data +@Entity +public class AcDeviceDataEntity extends OrgCommonEntity { + + @ManyToOne + private AcDeviceEntity device; + + @Comment("原始数据id") + private String srcId; + + @Comment("停车场id") + private String parkNo; + + @Comment("停车场名称") + private String parkName; + + @Comment("大门id") + private String gateNo; + + @Comment("大门名称") + private String gateName; + + @Comment("车道id") + private String laneNo; + + @Comment("车道名称") + private String laneName; + + @Comment("车牌号") + private String plateNo; + + @Comment("方向编码") + private String direction; + @Comment("方向名称") + private String directionName; + + @Comment("操作类型") + private String operationType; + + @Comment("车牌类型") + private String plateType; + @Comment("车牌类型名称") + private String plateTypeName; + + @Comment("车牌颜色") + private String plateColor; + @Comment("车牌颜色名称") + private String plateColorName; + + @Comment("通行时间") + private LocalDateTime passTime; + + @Comment("车辆颜色") + private String vehicleColor; + @Comment("车辆颜色名称") + private String vehicleColorName; + + private String vehicleShade; + + private String parkingType; + @Comment("停车类型名称") + private String parkingTypeName; + + @Comment("车辆类型") + private String vehicleType; + @Comment("车辆类型名称") + private String vehicleTypeName; + + + @Comment("信任度") + private String belief; +} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceData/mapper/AcDeviceDataMapper.java b/src/main/java/cn/lihongjie/coal/acDeviceData/mapper/AcDeviceDataMapper.java new file mode 100644 index 00000000..5055653d --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/mapper/AcDeviceDataMapper.java @@ -0,0 +1,23 @@ +package cn.lihongjie.coal.acDeviceData.mapper; + +import cn.lihongjie.coal.acDeviceData.dto.AcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.dto.CreateAcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.dto.UpdateAcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.entity.AcDeviceDataEntity; +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; + +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 AcDeviceDataMapper + extends BaseMapper< + AcDeviceDataEntity, + AcDeviceDataDto, + CreateAcDeviceDataDto, + UpdateAcDeviceDataDto> {} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceData/repository/AcDeviceDataRepository.java b/src/main/java/cn/lihongjie/coal/acDeviceData/repository/AcDeviceDataRepository.java new file mode 100644 index 00000000..5983394b --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/repository/AcDeviceDataRepository.java @@ -0,0 +1,9 @@ +package cn.lihongjie.coal.acDeviceData.repository; + +import cn.lihongjie.coal.acDeviceData.entity.AcDeviceDataEntity; +import cn.lihongjie.coal.base.dao.BaseRepository; + +import org.springframework.stereotype.Repository; + +@Repository +public interface AcDeviceDataRepository extends BaseRepository {} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceData/service/AcDeviceDataService.java b/src/main/java/cn/lihongjie/coal/acDeviceData/service/AcDeviceDataService.java new file mode 100644 index 00000000..e882df55 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceData/service/AcDeviceDataService.java @@ -0,0 +1,73 @@ +package cn.lihongjie.coal.acDeviceData.service; + +import cn.lihongjie.coal.acDeviceData.dto.AcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.dto.CreateAcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.dto.UpdateAcDeviceDataDto; +import cn.lihongjie.coal.acDeviceData.entity.AcDeviceDataEntity; +import cn.lihongjie.coal.acDeviceData.mapper.AcDeviceDataMapper; +import cn.lihongjie.coal.acDeviceData.repository.AcDeviceDataRepository; +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 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 AcDeviceDataService extends BaseService { + @Autowired private AcDeviceDataRepository repository; + + @Autowired private AcDeviceDataMapper mapper; + + @Autowired private ConversionService conversionService; + + @Autowired private DbFunctionService dbFunctionService; + + public AcDeviceDataDto create(CreateAcDeviceDataDto request) { + AcDeviceDataEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public AcDeviceDataDto update(UpdateAcDeviceDataDto request) { + AcDeviceDataEntity 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 AcDeviceDataDto getById(String id) { + AcDeviceDataEntity 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/acDeviceSupplier/controller/AcDeviceSupplierController.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/controller/AcDeviceSupplierController.java new file mode 100644 index 00000000..30d62f7d --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/controller/AcDeviceSupplierController.java @@ -0,0 +1,66 @@ +package cn.lihongjie.coal.acDeviceSupplier.controller; + +import cn.lihongjie.coal.acDeviceSupplier.dto.AcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.dto.CreateAcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.dto.UpdateAcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.service.AcDeviceSupplierService; +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 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("/acDeviceSupplier") +@SysLog(module = "门禁设备厂商") +@Slf4j +@OrgScope +public class AcDeviceSupplierController { + @Autowired private AcDeviceSupplierService service; + + @PostMapping("/create") + public AcDeviceSupplierDto create(@RequestBody CreateAcDeviceSupplierDto request) { + return this.service.create(request); + } + + @PostMapping("/update") + public AcDeviceSupplierDto update(@RequestBody UpdateAcDeviceSupplierDto request) { + return this.service.update(request); + } + + @PostMapping("/delete") + public Object delete(@RequestBody IdRequest request) { + this.service.delete(request); + return true; + } + + @PostMapping("/getById") + public AcDeviceSupplierDto 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/acDeviceSupplier/dto/AcDeviceSupplierDto.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/AcDeviceSupplierDto.java new file mode 100644 index 00000000..61b3d8da --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/AcDeviceSupplierDto.java @@ -0,0 +1,18 @@ +package cn.lihongjie.coal.acDeviceSupplier.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class AcDeviceSupplierDto extends OrgCommonDto { + + private String contact; + + private String contactPhone; + + private String address; + private String archiveStatus; + + private String archiveStatusName; +} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/CreateAcDeviceSupplierDto.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/CreateAcDeviceSupplierDto.java new file mode 100644 index 00000000..fa953c3e --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/CreateAcDeviceSupplierDto.java @@ -0,0 +1,15 @@ +package cn.lihongjie.coal.acDeviceSupplier.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class CreateAcDeviceSupplierDto extends OrgCommonDto { + + private String contact; + + private String contactPhone; + + private String address; +} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/UpdateAcDeviceSupplierDto.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/UpdateAcDeviceSupplierDto.java new file mode 100644 index 00000000..84e667a8 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/dto/UpdateAcDeviceSupplierDto.java @@ -0,0 +1,15 @@ +package cn.lihongjie.coal.acDeviceSupplier.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +@Data +public class UpdateAcDeviceSupplierDto extends OrgCommonDto { + + private String contact; + + private String contactPhone; + + private String address; +} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceSupplier/entity/AcDeviceSupplierEntity.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/entity/AcDeviceSupplierEntity.java new file mode 100644 index 00000000..050a86d7 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/entity/AcDeviceSupplierEntity.java @@ -0,0 +1,34 @@ +package cn.lihongjie.coal.acDeviceSupplier.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 AcDeviceSupplierEntity extends OrgCommonEntity { + private String contact; + + private String contactPhone; + + private String address; + + @Comment("归档状态") + @ColumnDefault("'0'") + private String archiveStatus; + + @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/acDeviceSupplier/mapper/AcDeviceSupplierMapper.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/mapper/AcDeviceSupplierMapper.java new file mode 100644 index 00000000..dfbc1db6 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/mapper/AcDeviceSupplierMapper.java @@ -0,0 +1,23 @@ +package cn.lihongjie.coal.acDeviceSupplier.mapper; + +import cn.lihongjie.coal.acDeviceSupplier.dto.AcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.dto.CreateAcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.dto.UpdateAcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.entity.AcDeviceSupplierEntity; +import cn.lihongjie.coal.base.mapper.BaseMapper; +import cn.lihongjie.coal.base.mapper.CommonEntityMapper; +import cn.lihongjie.coal.base.mapper.CommonMapper; + +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 AcDeviceSupplierMapper + extends BaseMapper< + AcDeviceSupplierEntity, + AcDeviceSupplierDto, + CreateAcDeviceSupplierDto, + UpdateAcDeviceSupplierDto> {} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceSupplier/repository/AcDeviceSupplierRepository.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/repository/AcDeviceSupplierRepository.java new file mode 100644 index 00000000..21ad5289 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/repository/AcDeviceSupplierRepository.java @@ -0,0 +1,9 @@ +package cn.lihongjie.coal.acDeviceSupplier.repository; + +import cn.lihongjie.coal.acDeviceSupplier.entity.AcDeviceSupplierEntity; +import cn.lihongjie.coal.base.dao.BaseRepository; + +import org.springframework.stereotype.Repository; + +@Repository +public interface AcDeviceSupplierRepository extends BaseRepository {} diff --git a/src/main/java/cn/lihongjie/coal/acDeviceSupplier/service/AcDeviceSupplierService.java b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/service/AcDeviceSupplierService.java new file mode 100644 index 00000000..f68e7d4c --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/acDeviceSupplier/service/AcDeviceSupplierService.java @@ -0,0 +1,121 @@ +package cn.lihongjie.coal.acDeviceSupplier.service; + +import cn.lihongjie.coal.acDeviceSupplier.dto.AcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.dto.CreateAcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.dto.UpdateAcDeviceSupplierDto; +import cn.lihongjie.coal.acDeviceSupplier.entity.AcDeviceSupplierEntity; +import cn.lihongjie.coal.acDeviceSupplier.mapper.AcDeviceSupplierMapper; +import cn.lihongjie.coal.acDeviceSupplier.repository.AcDeviceSupplierRepository; +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 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 AcDeviceSupplierService + extends BaseService { + @Autowired private AcDeviceSupplierRepository repository; + + @Autowired private AcDeviceSupplierMapper mapper; + + @Autowired private ConversionService conversionService; + + @Autowired private DbFunctionService dbFunctionService; + + public AcDeviceSupplierDto create(CreateAcDeviceSupplierDto request) { + AcDeviceSupplierEntity entity = mapper.toEntity(request); + + this.repository.save(entity); + return getById(entity.getId()); + } + + public AcDeviceSupplierDto update(UpdateAcDeviceSupplierDto request) { + AcDeviceSupplierEntity entity = this.repository.get(request.getId()); + ArchiveUtils.checkArchiveStatus( + entity, + AcDeviceSupplierEntity::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(), + AcDeviceSupplierEntity::getArchiveStatus, + x -> "0", + (e, actual, expected) -> { + throw new BizException("数据 " + "已归档,无法删除"); + }); + this.repository.deleteAllById(request.getIds()); + } + + public AcDeviceSupplierDto getById(String id) { + AcDeviceSupplierEntity 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, + AcDeviceSupplierEntity::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, + AcDeviceSupplierEntity::getArchiveStatus, + y -> "1", + (e, actual, expected) -> { + throw new BizException("数据" + "未归档,无法取消归档"); + })) + .peek(x -> x.setArchiveStatus("0")) + .forEach(this.repository::save); + } +} diff --git a/src/main/java/cn/lihongjie/coal/dataCollector/listener/DataCollectorListener.java b/src/main/java/cn/lihongjie/coal/dataCollector/listener/DataCollectorListener.java new file mode 100644 index 00000000..ccbaf52c --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/dataCollector/listener/DataCollectorListener.java @@ -0,0 +1,99 @@ +package cn.lihongjie.coal.dataCollector.listener; + +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.rabbitmq.RabbitMQConfiguration; + +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.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; + +@Component +@Slf4j +public class DataCollectorListener { + + @Autowired DataCollectorService dataCollectorService; + + @Autowired + DataCollectorLogService dataCollectorLogService; + + @RabbitListener( + bindings = { + @QueueBinding( + value = + @org.springframework.amqp.rabbit.annotation.Queue( + value = "dataCollector.status", + durable = "true"), + exchange = + @org.springframework.amqp.rabbit.annotation.Exchange( + value = RabbitMQConfiguration.SYS_EXCHANGE, + declare = Exchange.FALSE), + key = "dataCollector.*") + }) + @Transactional + public void handleDataCollectorMessage(String body, @Headers Map headers) { + + 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); + + if (!StringUtils.equals(sign, headers.get("sign").toString())) { + log.error("sign not match {} {}", sign, headers.get("sign")); + return; + } + + DataCollectorLogEntity log = new DataCollectorLogEntity(); + log.setDataCollector(dataCollector); + log.setOrganizationId(dataCollector.getOrganizationId() ); + log.setLogTime(LocalDateTime.now()); + Object rk = headers.get(AmqpHeaders.RECEIVED_ROUTING_KEY); + + switch (rk.toString()) { + case "dataCollector.online": + dataCollector.setLastLoginTime(LocalDateTime.now()); + log.setContent("online"); + break; + + case "dataCollector.offline": + dataCollector.setLastLogoutTime(LocalDateTime.now()); + log.setContent("offline"); + break; + + case "dataCollector.heartbeat": + dataCollector.setHeartbeatTime(LocalDateTime.now()); + log.setContent("heartbeat"); + break; + + default: + DataCollectorListener.log.error("unknown routing key {}", rk); + break; + } + + dataCollectorService.save(dataCollector); + dataCollectorLogService.save(log); + } +} diff --git a/src/main/java/cn/lihongjie/coal/dataCollector/listener/PmsListener.java b/src/main/java/cn/lihongjie/coal/dataCollector/listener/PmsListener.java new file mode 100644 index 00000000..47bed2c5 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/dataCollector/listener/PmsListener.java @@ -0,0 +1,292 @@ +package cn.lihongjie.coal.dataCollector.listener; + +import cn.lihongjie.coal.acDevice.entity.AcDeviceEntity; +import cn.lihongjie.coal.acDevice.service.AcDeviceService; +import cn.lihongjie.coal.acDeviceData.entity.AcDeviceDataEntity; +import cn.lihongjie.coal.acDeviceData.service.AcDeviceDataService; +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.rabbitmq.RabbitMQConfiguration; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; + +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.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.messaging.handler.annotation.Headers; +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.time.ZoneOffset; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +@Component +@Slf4j +public class PmsListener { + + @Autowired DataCollectorService dataCollectorService; + + @Autowired DataCollectorLogService dataCollectorLogService; + + @Autowired ObjectMapper objectMapper; + + @Autowired AcDeviceDataService acDeviceDataService; + + @Autowired + AcDeviceService acDeviceService; + + @SneakyThrows + @RabbitListener( + bindings = { + @QueueBinding( + value = + @org.springframework.amqp.rabbit.annotation.Queue( + value = "pms.data", + durable = "true"), + exchange = + @Exchange( + value = RabbitMQConfiguration.SYS_EXCHANGE, + declare = Exchange.FALSE), + key = "pms.*") + }) + @Transactional + public void handlePmsMessage(String body, @Headers Map headers) { + + 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; + } + + List devices = acDeviceService.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; + } + + var device = devices.get(0); + + JsonNode jsonNode = objectMapper.readTree(body); + + DataCollectorLogEntity logEntity = new DataCollectorLogEntity(); + logEntity.setOrganizationId(dataCollector.getOrganizationId()); + logEntity.setDataCollector(dataCollector); + + Object rk = headers.get(AmqpHeaders.RECEIVED_ROUTING_KEY); + + logEntity.setLogTime(LocalDateTime.now()); + logEntity.setType(rk.toString()); + + switch (rk.toString()) { + case "pms.passvehicleinfo" -> { + ArrayNode nodes = (ArrayNode) jsonNode; + var ids = + StreamSupport.stream(nodes.spliterator(), false) + .map(x -> x.get("id").asText()) + .toList(); + logEntity.setContent(StringUtils.join(ids, ",")); + + Map srcIdMap = acDeviceDataService + .findAll( + new Specification() { + @Override + public Predicate toPredicate( + Root root, + CriteriaQuery query, + CriteriaBuilder criteriaBuilder) { + return criteriaBuilder.and( + criteriaBuilder.equal( + root.get("device").get("id"), + device.getId()), + root.get("srcId").in(ids)); + } + }) + .stream() + .collect(Collectors.toMap(AcDeviceDataEntity::getSrcId, e -> e)); + + nodes.forEach( + x -> { + var id = x.get("id").asText(); + if (srcIdMap.containsKey(id)) { + log.info("data already exists: {} {}", id, device.getId()); + return; + } + var parkbelonged = x.get("parkbelonged").asText(); + var parkname = x.get("parkname").asText(); + var gateno = x.get("gateno").asText(); + var gatename = x.get("gatename").asText(); + var laneno = x.get("laneno").asText(); + var lanename = x.get("lanename").asText(); + var plateno = x.get("plateno").asText(); + var cardno = x.get("cardno").asText(); + var direction = x.get("direction").asText(); + var operationtype = x.get("operationtype").asText(); + var platetype = x.get("platetype").asText(); + var platecolor = x.get("platecolor").asText(); + var passtime = x.get("passtime").asText(); + var vehiclecolor = x.get("vehiclecolor").asText(); + var vehicleshade = x.get("vehicleshade").asText(); + var parkingtype = x.get("parkingtype").asText(); + var vehicletype = x.get("vehicletype").asText(); + var belief = x.get("belief").asText(); + + AcDeviceDataEntity deviceData = new AcDeviceDataEntity(); + deviceData.setDevice(device); + deviceData.setSrcId(id); + deviceData.setParkNo(parkbelonged); + deviceData.setParkName(parkname); + deviceData.setGateNo(gateno); + deviceData.setGateName(gatename); + deviceData.setLaneNo(laneno); + deviceData.setLaneName(lanename); + deviceData.setPlateNo(plateno); + deviceData.setDirection(direction); + deviceData.setDirectionName( + switch (direction) { + case "0" -> "入场"; + case "1" -> "出场"; + default -> "未知"; + }); + + deviceData.setOperationType(operationtype); + deviceData.setPlateType(platetype); + deviceData.setPlateTypeName( + switch (platetype) { + case "0" -> "无类型"; + case "1" -> "92 式民用车"; + case "2" -> "警用车"; + case "3" -> "上下军车"; + case "4" -> "92 式武警车"; + case "5" -> "左右军车车牌类型(一行结构)"; + case "7" -> "02 式个性化车"; + case "8" -> "黄色双行尾牌"; + case "9" -> "04 式新军车"; + case "10" -> "使馆车"; + case "11" -> "一行结构的新 WJ 车"; + case "12" -> "两行结构的新 WJ 车"; + case "13" -> "黄色 1225 农用车"; + case "14" -> "绿色 1325 农用车"; + case "15" -> "黄色 1325 农用车"; + case "16" -> "摩托车"; + case "17" -> "13 式新武警总部一行车牌"; + case "18" -> "13 式新武警总部两行车牌"; + case "19" -> "民航车牌类型"; + case "100" -> "教练车"; + case "101" -> "临时行驶车"; + case "102" -> "挂车"; + case "103" -> "领馆汽车"; + case "104" -> "港澳入出车"; + case "105" -> "临时入境车"; + default -> "未知"; + }); + deviceData.setPlateColor(platecolor); + deviceData.setPlateColorName( + switch (platecolor) { + case "0" -> "其他"; + case "1" -> "蓝色"; + case "2" -> "黄色"; + case "3" -> "黑色"; + case "4" -> "白色"; + case "5" -> "绿色"; + default -> "未知"; + }); + deviceData.setPassTime( + LocalDateTime.ofInstant( + Instant.ofEpochMilli(Long.parseLong(passtime)), + ZoneOffset.ofHours(8))); + deviceData.setVehicleColor(vehiclecolor); + deviceData.setVehicleColorName( + switch (vehiclecolor) { + case "0" -> "其它"; + case "1" -> "白色"; + case "2" -> "银色"; + case "3" -> "灰色"; + case "4" -> "黑色"; + case "5" -> "红色"; + case "6" -> "深蓝"; + case "7" -> "蓝色"; + case "8" -> "黄色"; + case "9" -> "绿色"; + case "10" -> "棕色"; + default -> "未知"; + }); + deviceData.setVehicleShade(vehicleshade); + deviceData.setParkingType(parkingtype); + deviceData.setParkingTypeName( + switch (parkingtype) { + case "0" -> "固定车"; + case "1" -> "临时车"; + + default -> "未知"; + }); + deviceData.setVehicleType(vehicletype); + deviceData.setVehicleTypeName( + switch (vehicletype) { + case "0" -> "其他"; + case "1" -> "小型汽车"; + case "2" -> "大型汽车"; + + default -> "未知"; + }); + deviceData.setBelief(belief); + acDeviceDataService.save(deviceData); + }); + } + 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/repository/DataCollectorRepository.java b/src/main/java/cn/lihongjie/coal/dataCollector/repository/DataCollectorRepository.java index b91f7694..8f4339c7 100644 --- a/src/main/java/cn/lihongjie/coal/dataCollector/repository/DataCollectorRepository.java +++ b/src/main/java/cn/lihongjie/coal/dataCollector/repository/DataCollectorRepository.java @@ -6,4 +6,6 @@ import cn.lihongjie.coal.dataCollector.entity.DataCollectorEntity; import org.springframework.stereotype.Repository; @Repository -public interface DataCollectorRepository extends BaseRepository {} +public interface DataCollectorRepository extends BaseRepository { + DataCollectorEntity findByAppKey(String appKey); +} 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 644d4c1c..adc65611 100644 --- a/src/main/java/cn/lihongjie/coal/dataCollector/service/DataCollectorService.java +++ b/src/main/java/cn/lihongjie/coal/dataCollector/service/DataCollectorService.java @@ -75,4 +75,11 @@ public class DataCollectorService return page.map(this.mapper::toDto); } + + public DataCollectorEntity findByAppKey(String appKey) { + + + return repository.findByAppKey(appKey); + + } } diff --git a/src/main/java/cn/lihongjie/coal/rabbitmq/RabbitMQConfiguration.java b/src/main/java/cn/lihongjie/coal/rabbitmq/RabbitMQConfiguration.java index 7e39839f..edd4e13b 100644 --- a/src/main/java/cn/lihongjie/coal/rabbitmq/RabbitMQConfiguration.java +++ b/src/main/java/cn/lihongjie/coal/rabbitmq/RabbitMQConfiguration.java @@ -34,8 +34,10 @@ public class RabbitMQConfiguration { @Autowired private ObjectMapper objectMapper; + @Bean RabbitTemplateCustomizer rabbitTemplateCustomizer() { + return template -> { template.setMessageConverter(new Jackson2JsonMessageConverter(objectMapper)); }; diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 66f05ad6..9a84dafa 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -76,7 +76,7 @@ spring: username: ${PG_USER:postgres} password: ${PG_PASSWORD:abc@123} initial-size: 10 - max-active: 30 + max-active: 20 min-idle: 10 validation-query: "select 1" validation-query-timeout: 1000 diff --git a/src/main/resources/config/dictionary.json b/src/main/resources/config/dictionary.json index 0eece571..eb75b7e0 100644 --- a/src/main/resources/config/dictionary.json +++ b/src/main/resources/config/dictionary.json @@ -2541,6 +2541,17 @@ ] }, + { + "code": "ac.device.type", + "name": "门禁设备类型", + "item": [ + { + "code": "1", + "name": "海康道闸PMS4.0" + } + + ] + }, { "code": "thirdAccount.type", "name": "第三方账号类型", diff --git a/src/main/resources/scripts/dict/enum/acDeviceDataDict.groovy b/src/main/resources/scripts/dict/enum/acDeviceDataDict.groovy new file mode 100644 index 00000000..4838c887 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/acDeviceDataDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.acDeviceData.controller.AcDeviceDataController +import cn.lihongjie.coal.base.dto.CommonQuery +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(AcDeviceDataController.class) + + + + +return controller.list(new CommonQuery()) + + diff --git a/src/main/resources/scripts/dict/enum/acDeviceDict.groovy b/src/main/resources/scripts/dict/enum/acDeviceDict.groovy new file mode 100644 index 00000000..8ac8af6c --- /dev/null +++ b/src/main/resources/scripts/dict/enum/acDeviceDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.acDevice.controller.AcDeviceController +import cn.lihongjie.coal.base.dto.CommonQuery +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(AcDeviceController.class) + + + + +return controller.list(new CommonQuery()) + + diff --git a/src/main/resources/scripts/dict/enum/acDeviceSupplierDict.groovy b/src/main/resources/scripts/dict/enum/acDeviceSupplierDict.groovy new file mode 100644 index 00000000..142f0875 --- /dev/null +++ b/src/main/resources/scripts/dict/enum/acDeviceSupplierDict.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.acDeviceSupplier.controller.AcDeviceSupplierController +import cn.lihongjie.coal.base.dto.CommonQuery +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(AcDeviceSupplierController.class) + + + + +return controller.list(new CommonQuery()) + +