From 977ce80f7219077fa4cb85dd1780be7e9dfda049 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Mon, 21 Apr 2025 21:50:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(smartCamCarData):=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=A6=E8=BE=86=E6=95=B0=E6=8D=AE=E5=85=B3=E8=81=94=E5=8A=9F?= =?UTF-8?q?=E8=83=BD-=20=E6=96=B0=E5=A2=9E=20BindRequest=20=E7=B1=BB?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=BD=A6=E8=BE=86=E6=95=B0=E6=8D=AE=E5=85=B3?= =?UTF-8?q?=E8=81=94=E8=AF=B7=E6=B1=82=20-=20=E5=9C=A8=20SmartCamCarDataCo?= =?UTF-8?q?ntroller=20=E4=B8=AD=E6=B7=BB=E5=8A=A0=E5=85=B3=E8=81=94?= =?UTF-8?q?=E5=92=8C=E8=A7=A3=E5=85=B3=E8=81=94=E8=BD=A6=E8=BE=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E6=8E=A5=E5=8F=A3=20-=20=E5=9C=A8=20SmartCam?= =?UTF-8?q?CarDataService=20=E4=B8=AD=E5=AE=9E=E7=8E=B0=E8=BD=A6=E8=BE=86?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=85=B3=E8=81=94=E5=92=8C=E8=A7=A3=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=9A=84=E9=80=BB=E8=BE=91=20-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20FindSimilarRequest=20=E7=B1=BB=E7=94=A8=E4=BA=8E=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E7=9B=B8=E4=BC=BC=E8=BD=A6=E7=89=8C=E5=8F=B7=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E8=AF=B7=E6=B1=82=20-=20=E5=9C=A8=20SmartCamCarLicens?= =?UTF-8?q?eSnapshotDataRepository=20=E4=B8=AD=E6=B7=BB=E5=8A=A0=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E7=9B=B8=E4=BC=BC=E8=BD=A6=E7=89=8C=E5=8F=B7=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95=20-=20=E5=9C=A8=20SmartCamCarLicens?= =?UTF-8?q?eSnapshotDataService=20=E4=B8=AD=E5=AE=9E=E7=8E=B0=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E7=9B=B8=E4=BC=BC=E8=BD=A6=E7=89=8C=E5=8F=B7=E7=A0=81?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91-=20=E6=9B=B4=E6=96=B0=20SmartCamCar?= =?UTF-8?q?LicenseSnapshotDataEntity=20=E7=B1=BB=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=BD=A6=E7=89=8C=E5=8F=B7=E7=A0=81=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95=20-=20=E5=9C=A8=20MyPostgr?= =?UTF-8?q?eSQLDialect=20=E4=B8=AD=E6=B3=A8=E5=86=8C=20similarity=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BindRequest.java | 29 ++++++ .../controller/SmartCamCarDataController.java | 21 ++++ .../dto/FindSimilarRequest.java | 15 +++ .../service/SmartCamCarDataService.java | 96 +++++++++++++++++++ .../SmartCamCarLicenseSnapshotDataEntity.java | 29 +++++- ...rtCamCarLicenseSnapshotDataRepository.java | 16 ++++ ...SmartCamCarLicenseSnapshotDataService.java | 6 ++ .../spring/config/MyPostgreSQLDialect.java | 4 + 8 files changed, 212 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/smartCamCarData/controller/BindRequest.java create mode 100644 src/main/java/cn/lihongjie/coal/smartCamCarData/dto/FindSimilarRequest.java diff --git a/src/main/java/cn/lihongjie/coal/smartCamCarData/controller/BindRequest.java b/src/main/java/cn/lihongjie/coal/smartCamCarData/controller/BindRequest.java new file mode 100644 index 00000000..6722a88d --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/smartCamCarData/controller/BindRequest.java @@ -0,0 +1,29 @@ +package cn.lihongjie.coal.smartCamCarData.controller; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class BindRequest { + + + private String id; + + + /** + * 入场记录id + */ + private String entryId; + + + /** + * 出场记录id + */ + + private String exitId; +} diff --git a/src/main/java/cn/lihongjie/coal/smartCamCarData/controller/SmartCamCarDataController.java b/src/main/java/cn/lihongjie/coal/smartCamCarData/controller/SmartCamCarDataController.java index 64057d0a..58e8b173 100644 --- a/src/main/java/cn/lihongjie/coal/smartCamCarData/controller/SmartCamCarDataController.java +++ b/src/main/java/cn/lihongjie/coal/smartCamCarData/controller/SmartCamCarDataController.java @@ -6,6 +6,7 @@ import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.smartCamCarData.dto.*; import cn.lihongjie.coal.smartCamCarData.service.SmartCamCarDataService; +import cn.lihongjie.coal.smartCamCarLicenseSnapshotData.dto.SmartCamCarLicenseSnapshotDataDto; import lombok.extern.slf4j.Slf4j; @@ -56,4 +57,24 @@ public class SmartCamCarDataController { public CompareResult compare(@RequestBody CompareRequest request) { return this.service.compare(request); } + + + @PostMapping("/bind") + public SmartCamCarDataDto bind(@RequestBody BindRequest request) { + return this.service.bind(request); + } + + + @PostMapping("/unbind") + public SmartCamCarDataDto unbind(@RequestBody BindRequest request) { + return this.service.unbind(request); + } + + + @PostMapping("/findSimilar") + public Page findSimilar(@RequestBody FindSimilarRequest request) { + + return this.service.findSimilar(request); + + } } diff --git a/src/main/java/cn/lihongjie/coal/smartCamCarData/dto/FindSimilarRequest.java b/src/main/java/cn/lihongjie/coal/smartCamCarData/dto/FindSimilarRequest.java new file mode 100644 index 00000000..263b5af8 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/smartCamCarData/dto/FindSimilarRequest.java @@ -0,0 +1,15 @@ +package cn.lihongjie.coal.smartCamCarData.dto; + +import lombok.Data; + +import java.util.*; + +@Data + +public class FindSimilarRequest { + + private Integer pageNo = 0; + private Integer pageSize = Integer.MAX_VALUE; + + private String number; +} diff --git a/src/main/java/cn/lihongjie/coal/smartCamCarData/service/SmartCamCarDataService.java b/src/main/java/cn/lihongjie/coal/smartCamCarData/service/SmartCamCarDataService.java index 0b7c12f2..bdc38a8f 100644 --- a/src/main/java/cn/lihongjie/coal/smartCamCarData/service/SmartCamCarDataService.java +++ b/src/main/java/cn/lihongjie/coal/smartCamCarData/service/SmartCamCarDataService.java @@ -6,10 +6,14 @@ import cn.lihongjie.coal.base.service.BaseService; import cn.lihongjie.coal.common.Ctx; import cn.lihongjie.coal.dbFunctions.DbFunctionService; import cn.lihongjie.coal.exception.BizException; +import cn.lihongjie.coal.smartCamCarData.controller.BindRequest; import cn.lihongjie.coal.smartCamCarData.dto.*; import cn.lihongjie.coal.smartCamCarData.entity.SmartCamCarDataEntity; import cn.lihongjie.coal.smartCamCarData.mapper.SmartCamCarDataMapper; import cn.lihongjie.coal.smartCamCarData.repository.SmartCamCarDataRepository; +import cn.lihongjie.coal.smartCamCarLicenseSnapshotData.dto.SmartCamCarLicenseSnapshotDataDto; +import cn.lihongjie.coal.smartCamCarLicenseSnapshotData.entity.SmartCamCarLicenseSnapshotDataEntity; +import cn.lihongjie.coal.smartCamCarLicenseSnapshotData.service.SmartCamCarLicenseSnapshotDataService; import cn.lihongjie.coal.weightDeviceData.entity.WeightDeviceDataEntity; import cn.lihongjie.coal.weightDeviceData.repository.WeightDeviceDataRepository; @@ -20,6 +24,7 @@ import jakarta.persistence.criteria.Root; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Page; @@ -48,6 +53,8 @@ public class SmartCamCarDataService @Autowired WeightDeviceDataRepository weightDeviceDataRepository; + @Autowired SmartCamCarLicenseSnapshotDataService smartCamCarLicenseSnapshotDataService; + public CompareResult compare(CompareRequest request) { List camData = @@ -188,4 +195,93 @@ public class SmartCamCarDataService return page.map(this.mapper::toDto); } + + public SmartCamCarDataDto bind(BindRequest request) { + + SmartCamCarDataEntity entity = this.repository.get(request.getId()); + + + if (entity.getEntry() != null && entity.getExit() != null) { + throw new BizException("进出记录都被关联了"); + } + + if (entity.getEntry() == null) { + + if (StringUtils.isNotBlank(request.getEntryId())){ + + SmartCamCarLicenseSnapshotDataEntity entry = + smartCamCarLicenseSnapshotDataService.get(request.getEntryId()); + + entity.setEntry(entry); + + entity.setEntryTime(entry.getInfoTimeObj()); + + }else { + + throw new BizException("请选择关联的进记录"); + } + + }else if (entity.getExit() == null) { + + if (StringUtils.isNotBlank(request.getExitId())){ + + SmartCamCarLicenseSnapshotDataEntity exit = + smartCamCarLicenseSnapshotDataService.get(request.getExitId()); + + entity.setExit(exit); + + entity.setExitTime(exit.getInfoTimeObj()); + + entity.setFinished(true); + + }else { + + throw new BizException("请选择关联的出记录"); + } + + }else { + + throw new BizException("进出记录都已经关联了"); + } + + this.repository.save(entity); + + return getById(entity.getId()); + } + + public Page findSimilar(FindSimilarRequest request) { + + + Page similar = smartCamCarLicenseSnapshotDataService.findSimilar(request.getNumber(), PageRequest.of(request.getPageNo(), request.getPageSize())); + + + return similar; + + } + + public SmartCamCarDataDto unbind(BindRequest request) { + + + + SmartCamCarDataEntity entity = this.repository.get(request.getId()); + + + if (StringUtils.isNotBlank(request.getEntryId()) && StringUtils.equals(entity.getEntry().getId(), request.getEntryId())){ + + entity.setEntry(null); + entity.setEntryTime(null); + }else if (StringUtils.isNotBlank(request.getExitId()) && StringUtils.equals(entity.getExit().getId(), request.getExitId())){ + + entity.setExit(null); + entity.setExitTime(null); + entity.setFinished(false); + }else { + throw new BizException("关联的记录不匹配"); + } + + this.repository.save(entity); + + return getById(entity.getId()); + + } } diff --git a/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/entity/SmartCamCarLicenseSnapshotDataEntity.java b/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/entity/SmartCamCarLicenseSnapshotDataEntity.java index 07882726..9a92603e 100644 --- a/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/entity/SmartCamCarLicenseSnapshotDataEntity.java +++ b/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/entity/SmartCamCarLicenseSnapshotDataEntity.java @@ -10,6 +10,7 @@ import jakarta.persistence.Table; import lombok.Data; +import org.apache.commons.lang3.StringUtils; import org.hibernate.annotations.Comment; import java.time.LocalDateTime; @@ -151,10 +152,30 @@ public class SmartCamCarLicenseSnapshotDataEntity extends OrgCommonEntity { @Comment("车牌背景图片信息 原始图片MD5值") private String backgroundImagePictureMd5; + @ManyToOne private FileEntity captureImage; - @ManyToOne - private FileEntity captureImage; + @ManyToOne private FileEntity backgroundImage; - @ManyToOne - private FileEntity backgroundImage; + @Comment("车牌号码 只有数字和字母") + private String numberPart; + + @Override + public void prePersist() { + super.prePersist(); + + if (StringUtils.isNotBlank(this.numberPart)) { + + this.numberPart = this.number.replaceAll("[^0-9a-zA-Z]", ""); + } + } + + @Override + public void preUpdate() { + super.preUpdate(); + + if (StringUtils.isNotBlank(this.numberPart)) { + + this.numberPart = this.number.replaceAll("[^0-9a-zA-Z]", ""); + } + } } diff --git a/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/repository/SmartCamCarLicenseSnapshotDataRepository.java b/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/repository/SmartCamCarLicenseSnapshotDataRepository.java index 444afbf1..1b31f742 100644 --- a/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/repository/SmartCamCarLicenseSnapshotDataRepository.java +++ b/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/repository/SmartCamCarLicenseSnapshotDataRepository.java @@ -3,7 +3,10 @@ package cn.lihongjie.coal.smartCamCarLicenseSnapshotData.repository; import cn.lihongjie.coal.base.dao.BaseRepository; import cn.lihongjie.coal.smartCamCarLicenseSnapshotData.entity.SmartCamCarLicenseSnapshotDataEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -13,4 +16,17 @@ public interface SmartCamCarLicenseSnapshotDataRepository extends BaseRepository { @Query("select false") boolean isLinked(List ids); + + @Query(""" + select e from SmartCamCarLicenseSnapshotDataEntity e + left join SmartCamCarDataEntity c1 on c1.entry = e + left join SmartCamCarDataEntity c2 on c2.exit = e + + where c1 is null and c2 is null + + order by similarity(e.numberPart, :number) desc + + + """) + Page findSimilar(@Param("number") String number, PageRequest of); } diff --git a/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/service/SmartCamCarLicenseSnapshotDataService.java b/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/service/SmartCamCarLicenseSnapshotDataService.java index 19c8f183..65c0c095 100644 --- a/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/service/SmartCamCarLicenseSnapshotDataService.java +++ b/src/main/java/cn/lihongjie/coal/smartCamCarLicenseSnapshotData/service/SmartCamCarLicenseSnapshotDataService.java @@ -645,4 +645,10 @@ public class SmartCamCarLicenseSnapshotDataService return "无效"; } } + + public Page findSimilar(String number, PageRequest of) { + + + return repository.findSimilar(number.replaceAll("[^0-9a-zA-Z]", ""), of).map(mapper::toDto); + } } diff --git a/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java b/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java index 934f4f8b..50038ba1 100644 --- a/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java +++ b/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java @@ -83,6 +83,10 @@ public class MyPostgreSQLDialect extends PostgreSQLDialect { .getBasicTypeRegistry().resolve(StandardBasicTypes.INTEGER)); + + functionContributions.getFunctionRegistry().registerPattern("similarity", "similarity(?1, ?2)", functionContributions.getTypeConfiguration() + .getBasicTypeRegistry().resolve(StandardBasicTypes.DOUBLE)); + } @Override