Merge branch 'dev-lili'

pull/1/head
shuliYao 1 year ago
commit 15b105543f

1
.gitignore vendored

@ -2,3 +2,4 @@
**/.idea/ **/.idea/
*.iml *.iml
rebel.xml rebel.xml
*.log

@ -119,3 +119,47 @@ cn.jyjz.xiaoyao.common.base.exception.ServiceException: token失效。
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748) at java.lang.Thread.run(Thread.java:748)
ERROR [2024-03-22 20:46:37,534][] com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread:2912 - create connection SQLException, url: jdbc:mysql://47.93.59.251:3306/ocrnew?useUnicode=true&nullCatalogMeansCurrent=true&characterEncoding=UTF-8&characterSetResults=utf8&serverTimezone=Asia/Shanghai&useSSL=false, errorCode 0, state 08S01
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:118)
at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:232)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:112)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1703)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1786)
at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2910)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:519)
at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:683)
at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:660)
at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:137)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.proceedHandshakeWithPluggableAuthentication(NativeAuthenticationProvider.java:462)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:209)
at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1352)
at com.mysql.cj.NativeSession.connect(NativeSession.java:132)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:948)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:818)
... 9 common frames omitted
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.cj.protocol.FullReadInputStream.readFully(FullReadInputStream.java:67)
at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:63)
at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:45)
at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:513)
... 18 common frames omitted

File diff suppressed because it is too large Load Diff

@ -5,6 +5,7 @@ import cn.jyjz.xiaoyao.common.base.exception.CommonExceptionCodeEnum;
import cn.jyjz.xiaoyao.common.base.exception.ServiceException; import cn.jyjz.xiaoyao.common.base.exception.ServiceException;
import cn.jyjz.xiaoyao.common.base.service.UserTokenService; import cn.jyjz.xiaoyao.common.base.service.UserTokenService;
import cn.jyjz.xiaoyao.common.base.util.RequestBaseUtil; import cn.jyjz.xiaoyao.common.base.util.RequestBaseUtil;
import cn.jyjz.xiaoyao.common.base.util.SpringUtils;
import cn.jyjz.xiaoyao.common.base.util.UserUtils; import cn.jyjz.xiaoyao.common.base.util.UserUtils;
import cn.jyjz.xiaoyao.common.base.vo.User; import cn.jyjz.xiaoyao.common.base.vo.User;
import cn.jyjz.xiaoyao.common.base.vo.UserToken; import cn.jyjz.xiaoyao.common.base.vo.UserToken;
@ -27,6 +28,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.HandlerExceptionResolver;
/** /**
* https://blog.csdn.net/zkc7441976/article/details/111034574 * https://blog.csdn.net/zkc7441976/article/details/111034574
@ -58,7 +60,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
String[] excludespath = systemopenurlService.getOpenUrl(); String[] excludespath = systemopenurlService.getOpenUrl();
//不需要过滤的url //不需要过滤的url
String[] excludesOther = {"/static","/json",".js",".css",".ico",".jpg",".png",".pcm","/druid"}; String[] excludesOther = {"/static","/json",".js",".css",".ico",".jpg",".png",".pcm","/druid","/doc.html","/swagger-ui.html","/swagger-resources","/webjars/**","/v2/api-docs"};
String[] urls = ArrayUtils.addAll(excludespath, excludesOther); String[] urls = ArrayUtils.addAll(excludespath, excludesOther);
@ -143,6 +145,12 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
} }
} }
else{
//抛出filter异常到全局处理异常
HandlerExceptionResolver hadoopHandlerExceptionResolver = SpringUtils.getBean("handlerExceptionResolver");
hadoopHandlerExceptionResolver.resolveException(request,response,null, new ServiceException(CommonExceptionCodeEnum.DATA_TOKEN_NULL));
return;
}
} }
filterChain.doFilter(request, response); filterChain.doFilter(request, response);

@ -0,0 +1,209 @@
package cn.jyjz.xiaoyao.ocr.controller;
import cn.jyjz.xiaoyao.abase.service.FtperrorService;
import cn.jyjz.xiaoyao.admin.service.UserService;
import cn.jyjz.xiaoyao.common.base.config.XiaoyaoConfig;
import cn.jyjz.xiaoyao.common.base.controller.BaseController;
import cn.jyjz.xiaoyao.common.base.service.UserTokenService;
import cn.jyjz.xiaoyao.common.base.util.RequestBaseUtil;
import cn.jyjz.xiaoyao.common.base.vo.ResultVo;
import cn.jyjz.xiaoyao.common.base.vo.ResultVoUtil;
import cn.jyjz.xiaoyao.common.base.vo.UserToken;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicate;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrPicture;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrPlan;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrTaskPackage;
import cn.jyjz.xiaoyao.ocr.service.IOcrCheckDuplicateResultService;
import cn.jyjz.xiaoyao.ocr.service.IOcrCheckDuplicateService;
import cn.jyjz.xiaoyao.ocr.service.IOcrTaskPackageService;
import cn.jyjz.xiaoyao.ocr.service.OcrPictureService;
import cn.jyjz.xiaoyao.ocr.util.DataUtil;
import cn.jyjz.xiaoyao.ocr.util.SearchConfigEnum;
import cn.jyjz.xiaoyao.ocr.util.SearchParaFormatting;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
@RestController
@RequestMapping("/ocr/ocrTaskPackage")
public class OcrTaskPackageController extends BaseController {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Resource
private IOcrTaskPackageService ocrTaskPackageService;
@Resource
private UserTokenService userTokenService;
@Resource
private UserService userService;
@Resource
private XiaoyaoConfig xiaoyaoConfig;
@Resource
private FtperrorService ftperrorService;
@Resource
private IOcrCheckDuplicateResultService ocrCheckDuplicateResultService;
@Resource
private IOcrCheckDuplicateService ocrCheckDuplicateService;
@Resource
private OcrPictureService ocrPictureService;
@ApiOperation(value = "一键查重", notes = "一键查重")
@ApiImplicitParams({
@ApiImplicitParam(paramType = "header", name = "X-Tenant-Id", value = "租户主键,用户登录时的信息“tenantList”中获得。", dataType = "String", required = true)
})
@GetMapping(value = "/checkDuplicate")
public ResultVo checkDuplicate(OcrPicture ocrPicture, HttpServletRequest req) {
//获取当前登录人
UserToken userToken = this.userTokenService.getUserToken(RequestBaseUtil.getToken(req));
//租户主键,由前端页面传送
String tenantId = req.getHeader("X-Tenant-Id");
if (StringUtils.isBlank(tenantId)) {
return ResultVoUtil.error("租户主键不能为空");
}
QueryWrapper<OcrPicture> queryWrapper = new QueryWrapper<>();
//根据参数枚举获取检索参数并映射为数据库的字段的key-v map
Map<String, Object> paraMap = new HashMap<>();
for (SearchConfigEnum config : SearchConfigEnum.values()) {
String searchvalue = req.getParameter(config.getId());
if (StringUtils.isNotBlank(searchvalue)) {
paraMap.put(config.getMeaning(), searchvalue);
}
}
//调用查询参数解析方法解析为queryWrapper
queryWrapper = SearchParaFormatting.searchParaParse(queryWrapper, paraMap);
queryWrapper.eq("tenant_id", tenantId);
List<OcrPicture> pageList = ocrPictureService.listPage(queryWrapper);
if (null != pageList && !pageList.isEmpty()) {
if (pageList.size() == 1) {
return ResultVoUtil.error("查重数据至少要有两条。");
} else {
return ocrTaskPackageService.duplicateCheck(pageList, tenantId, userToken, req);
}
} else {
return ResultVoUtil.error("没有查重数据。");
}
}
//取消查重任务接口
@ApiOperation(value = "获取查重任务接口异步状态", notes = "获取查重任务接口异步状态")
@GetMapping("/getCheckDuplicateStatus")
@ResponseBody
public ResultVo getCheckDuplicateStatus(HttpServletResponse response, HttpServletRequest request,
@RequestParam(name="checkDuplicateNo",required = true) String checkDuplicateNo) throws IOException {
String tenantId = request.getHeader("X-Tenant-Id");
if(StringUtils.isBlank(tenantId)){
return ResultVoUtil.error("租户主键不能为空");
}
if(StringUtils.isBlank(checkDuplicateNo)){
return ResultVoUtil.error("查重编号不能为空");
}
OcrCheckDuplicate dto = this.ocrCheckDuplicateService.getCheckDuplicateStatus(checkDuplicateNo);
if(null != dto){
return ResultVoUtil.success(dto);
}else{
return ResultVoUtil.error();
}
}
/**
*
* @param request
* @return
*/
@GetMapping(value = "/getLastCheckNo")
public ResultVo getLastCheckNo(HttpServletRequest request) {
String tenantId = request.getHeader("X-Tenant-Id");
if(StringUtils.isBlank(tenantId)){
return ResultVoUtil.error("租户主键不能为空");
}
String lastCheckNo = this.ocrCheckDuplicateService.getLastCheckNo(tenantId);
if(StringUtils.isBlank(lastCheckNo)){
return ResultVoUtil.success(lastCheckNo);
}else{
return ResultVoUtil.error();
}
}
/**
*
* @param ocrTaskPackage
* @param req
* @return
*/
@GetMapping(value = "/createPackage")
public ResultVo createPackage(OcrTaskPackage ocrTaskPackage, HttpServletRequest req) {
//校验参数包名称
if(ocrTaskPackage == null){
return ResultVoUtil.error("参数对象为空");
}
//校验参数包名称
if(StringUtils.isBlank(ocrTaskPackage.getName())){
return ResultVoUtil.error("任务包名称不能为空");
}
boolean isSuccess = ocrTaskPackageService.save(ocrTaskPackage);
if(isSuccess){
return ResultVoUtil.success(ocrTaskPackage);
}else{
return ResultVoUtil.error();
}
}
/**
*
* @param id
* @param req
* @return
*/
@GetMapping(value = "/deletePackage")
public ResultVo deletePackage(Long id, HttpServletRequest req) {
boolean b = ocrTaskPackageService.removeById(id);
if(b){
return ResultVoUtil.success();
}else{
return ResultVoUtil.error();
}
}
}

@ -0,0 +1,18 @@
package cn.jyjz.xiaoyao.ocr.dataDao;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicate;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author author
* @since 2024-03-24
*/
@Mapper
public interface OcrCheckDuplicateMapper extends BaseMapper<OcrCheckDuplicate> {
}

@ -0,0 +1,18 @@
package cn.jyjz.xiaoyao.ocr.dataDao;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicateResult;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author author
* @since 2024-03-24
*/
@Mapper
public interface OcrCheckDuplicateResultMapper extends BaseMapper<OcrCheckDuplicateResult> {
}

@ -0,0 +1,18 @@
package cn.jyjz.xiaoyao.ocr.dataDao;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictrueDuplicateHis;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author author
* @since 2024-03-24
*/
@Mapper
public interface OcrPictrueDuplicateHisMapper extends BaseMapper<OcrPictrueDuplicateHis> {
}

@ -0,0 +1,18 @@
package cn.jyjz.xiaoyao.ocr.dataDao;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrTaskPackage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* (20240323) Mapper
* </p>
*
* @author author
* @since 2024-03-24
*/
@Mapper
public interface OcrTaskPackageMapper extends BaseMapper<OcrTaskPackage> {
}

@ -0,0 +1,71 @@
package cn.jyjz.xiaoyao.ocr.dataobject;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("ocr_check_duplicate")
@ApiModel(value="OcrCheckDuplicate对象", description="查重任务表")
public class OcrCheckDuplicate implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "主键")
@TableId(value = "id",type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
@TableField(value="id")
private Long id;
@ApiModelProperty(value = "查重任务编号")
private String checkDuplicateNo;
@ApiModelProperty(value = "1.执行中 2.执行完毕 3.执行异常")
private Integer status;
@ApiModelProperty(value = "完成时间")
private Long completionTime;
@ApiModelProperty(value = "租户标识")
private Long tenantId;
@ApiModelProperty(value = "创建人")
private String createBy;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Long createTime;
@ApiModelProperty(value = "查重时的筛选条件")
private String searchingJson;
@ApiModelProperty(value = "主图数量")
private Integer pictureCount;
@ApiModelProperty(value = "0可用 1删除")
private Integer isDelete;
}

@ -0,0 +1,54 @@
package cn.jyjz.xiaoyao.ocr.dataobject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("ocr_check_duplicate_result")
@ApiModel(value="OcrCheckDuplicateResult对象", description="")
public class OcrCheckDuplicateResult implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "主键")
@TableId(value = "id",type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
@TableField(value="ID")
private Long id;
@ApiModelProperty(value = "图片id")
private Long pictureId;
@ApiModelProperty(value = "当前图片与任务包其他图片比对结果")
private String compareResultJson;
@ApiModelProperty(value = "查重任务id")
private Long checkDuplicateId;
@ApiModelProperty(value = "当前图片在当前任务包下比对最高阈值")
private Double maxSimilarity;
}

@ -0,0 +1,48 @@
package cn.jyjz.xiaoyao.ocr.dataobject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("ocr_pictrue_duplicate_his")
@ApiModel(value="OcrPictrueDuplicateHis对象", description="图片比对历史信息表")
public class OcrPictrueDuplicateHis implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "主键")
@TableId(value = "id",type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
@TableField(value="id")
private Long id;
@ApiModelProperty(value = "图片表id")
private Long pictureId;
@ApiModelProperty(value = "图片查重历史(该图片历史的查重任务中所对比的图片的集合)")
private String checkDuplicateResultHisJson;
}

@ -0,0 +1,64 @@
package cn.jyjz.xiaoyao.ocr.dataobject;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.experimental.Accessors;
/**
* <p>
* (20240323)
* </p>
*
* @author author
* @since 2024-03-24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("ocr_task_package")
@ApiModel(value="OcrTaskPackage对象", description="任务包表 (新20240323)")
public class OcrTaskPackage implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "任务包id")
@Schema(description = "主键")
@TableId(value = "id",type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
@TableField(value="id")
private Long id;
@ApiModelProperty(value = "任务包名称")
private String name;
@ApiModelProperty(value = "查重任务id")
private Long checkDuplicateId;
@ApiModelProperty(value = "创建人")
private String createBy;
@ApiModelProperty(value = "创建时间")
private Long createTime;
@ApiModelProperty(value = "修改人")
private String updateBy;
@ApiModelProperty(value = "修改时间")
private Long updateTime;
private Integer isDelete;
}

@ -0,0 +1,16 @@
package cn.jyjz.xiaoyao.ocr.service;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicateResult;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
public interface IOcrCheckDuplicateResultService extends IService<OcrCheckDuplicateResult> {
}

@ -0,0 +1,19 @@
package cn.jyjz.xiaoyao.ocr.service;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicate;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
public interface IOcrCheckDuplicateService extends IService<OcrCheckDuplicate> {
OcrCheckDuplicate getCheckDuplicateStatus(String checkDuplicateNo);
String getLastCheckNo(String tenantId);
}

@ -0,0 +1,16 @@
package cn.jyjz.xiaoyao.ocr.service;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictrueDuplicateHis;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
public interface IOcrPictrueDuplicateHisService extends IService<OcrPictrueDuplicateHis> {
}

@ -0,0 +1,24 @@
package cn.jyjz.xiaoyao.ocr.service;
import cn.jyjz.xiaoyao.common.base.vo.ResultVo;
import cn.jyjz.xiaoyao.common.base.vo.UserToken;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrPicture;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrTaskPackage;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* <p>
* (20240323)
* </p>
*
* @author author
* @since 2024-03-24
*/
public interface IOcrTaskPackageService extends IService<OcrTaskPackage> {
ResultVo duplicateCheck(List<OcrPicture> pageList, String tenantId, UserToken userToken, HttpServletRequest req);
}

@ -0,0 +1,20 @@
package cn.jyjz.xiaoyao.ocr.service.impl;
import cn.jyjz.xiaoyao.ocr.dataDao.OcrCheckDuplicateResultMapper;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicateResult;
import cn.jyjz.xiaoyao.ocr.service.IOcrCheckDuplicateResultService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
@Service
public class OcrCheckDuplicateResultServiceImpl extends ServiceImpl<OcrCheckDuplicateResultMapper, OcrCheckDuplicateResult> implements IOcrCheckDuplicateResultService {
}

@ -0,0 +1,62 @@
package cn.jyjz.xiaoyao.ocr.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.jyjz.xiaoyao.admin.dataobject.User;
import cn.jyjz.xiaoyao.common.base.exception.CommonExceptionCodeEnum;
import cn.jyjz.xiaoyao.common.base.exception.ServiceException;
import cn.jyjz.xiaoyao.common.base.util.StringUtils;
import cn.jyjz.xiaoyao.ocr.dataDao.OcrCheckDuplicateMapper;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicate;
import cn.jyjz.xiaoyao.ocr.service.IOcrCheckDuplicateService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.function.Function;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
@Service
public class OcrCheckDuplicateServiceImpl extends ServiceImpl<OcrCheckDuplicateMapper, OcrCheckDuplicate> implements IOcrCheckDuplicateService {
@Resource
private OcrCheckDuplicateMapper ocrCheckDuplicateMapper;
@Override
public OcrCheckDuplicate getCheckDuplicateStatus(String checkDuplicateNo) {
if(StringUtils.isBlank(checkDuplicateNo)){
throw new ServiceException(CommonExceptionCodeEnum.PARAM_NOTVALID);
}
QueryWrapper<OcrCheckDuplicate> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("check_duplicate_no",checkDuplicateNo);
OcrCheckDuplicate ocrCheckDuplicate = ocrCheckDuplicateMapper.selectOne(queryWrapper);
return ocrCheckDuplicate;
}
@Override
public String getLastCheckNo(String tenantId) {
QueryWrapper<OcrCheckDuplicate> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("tenant_id",tenantId);
queryWrapper.orderByDesc("create_time");
List<OcrCheckDuplicate> list = ocrCheckDuplicateMapper.selectList(queryWrapper);
if(CollUtil.isNotEmpty(list)){
return list.get(0).getCheckDuplicateNo();
}else{
return null;
}
}
}

@ -0,0 +1,20 @@
package cn.jyjz.xiaoyao.ocr.service.impl;
import cn.jyjz.xiaoyao.ocr.dataDao.OcrPictrueDuplicateHisMapper;
import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictrueDuplicateHis;
import cn.jyjz.xiaoyao.ocr.service.IOcrPictrueDuplicateHisService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
*
* </p>
*
* @author author
* @since 2024-03-24
*/
@Service
public class OcrPictrueDuplicateHisServiceImpl extends ServiceImpl<OcrPictrueDuplicateHisMapper, OcrPictrueDuplicateHis> implements IOcrPictrueDuplicateHisService {
}

@ -0,0 +1,242 @@
package cn.jyjz.xiaoyao.ocr.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.jyjz.xiaoyao.admin.service.LogService;
import cn.jyjz.xiaoyao.common.base.vo.ResultVo;
import cn.jyjz.xiaoyao.common.base.vo.ResultVoUtil;
import cn.jyjz.xiaoyao.common.base.vo.UserToken;
import cn.jyjz.xiaoyao.ocr.dataDao.OcrTaskPackageMapper;
import cn.jyjz.xiaoyao.ocr.dataobject.*;
import cn.jyjz.xiaoyao.ocr.service.*;
import cn.jyjz.xiaoyao.ocr.util.HashCompareUtil;
import cn.jyjz.xiaoyao.ocr.util.ImageClassUtil;
import cn.jyjz.xiaoyao.ocr.util.SearchEnum;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* (20240323)
* </p>
*
* @author author
* @since 2024-03-24
*/
@Service
public class OcrTaskPackageServiceImpl extends ServiceImpl<OcrTaskPackageMapper, OcrTaskPackage> implements IOcrTaskPackageService {
@Resource
private OcrPictureService ocrPictureService;
@Resource
private IOcrCheckDuplicateResultService checkDuplicateResultService;
@Resource
private IOcrCheckDuplicateService checkDuplicateService;
@Resource
private IOcrPictrueDuplicateHisService pictureDuplicateHisService;
@Resource
private LogService logService;
@Value("${image.classifyPath}")
private String classifyPath;
/**
*
*/
@Override
public ResultVo duplicateCheck(List<OcrPicture> ocrPictureList, String tenantId, UserToken sysUser, HttpServletRequest req) {
if (null != ocrPictureList && !ocrPictureList.isEmpty()) {
//生成查重任务插入表ocr_check_duplicate
OcrCheckDuplicate ocrCheckDuplicate = new OcrCheckDuplicate();
ocrCheckDuplicate.setCheckDuplicateNo("");// 生成查重任务编号,规则
ocrCheckDuplicate.setTenantId(Long.valueOf(tenantId));
ocrCheckDuplicate.setCreateBy(sysUser.getUserid());
ocrCheckDuplicate.setCreateTime(DateUtil.current());
ocrCheckDuplicate.setPictureCount(ocrPictureList.size());
ocrCheckDuplicate.setStatus(1);
ocrCheckDuplicate.setSearchingJson("");//查重时左侧的筛选条件
checkDuplicateService.save(ocrCheckDuplicate);
//异步执行图片比对查重功能 comparePictureResultSave()
//
}
return ResultVoUtil.success();
//生成查重任务插入ocr_check_duplicate
//异步执行查重任务比对查重
//异步查重结果回写 回写orc_check_duplicate_result
//图片比对历史 ocr_pictrue_duplicate_his 这个表的数据 以图片为维度,该图片与其他图片对比结果的保存
//回写 orc_check_duplicate_result表 max_similarity字段字段值是本次查重相似度最高的阈值。
//回写ocr_picture表similarity_score字段字段值是该图片所有历史比对的最高值如果本次比对的最高阈值小于最高值则不进行回写。
}
/**
* ocr_check_duplicate_result
*/
public void comparePictureResultSave(List<OcrPicture> ocrPictureList,UserToken sysUser) {
List<OcrCheckDuplicateResult> list = new ArrayList<>();
//图片错误信息
StringBuffer error = new StringBuffer();
//项目错误信息
StringBuffer errorProject = new StringBuffer();
//流程错误信息
StringBuffer errorFlow = new StringBuffer();
//记录任务相似度为百分百的任务主键
List<Long> pointsList = new ArrayList<>();
//图片信息不能为空
if (null != ocrPictureList && !ocrPictureList.isEmpty()) {
//用于标记相似度是否存在百分百的情况
List<OcrPicture> newList = new ArrayList<>();
Map<String, String> resultMap = new HashMap<>();
for (OcrPicture ocrPicture : ocrPictureList) {
//将比对结果按json格式存储
OcrCheckDuplicateResult ocrCheckDuplicateResult = new OcrCheckDuplicateResult();
//图片比对历史数据增量存储 ocr_pictrue_duplicate_his
OcrPictrueDuplicateHis pictrueDuplicateHis = new OcrPictrueDuplicateHis();
//如果当前图片已经生成任务包,直接跳过
if (ocrPicture.getTaskstatus().equals("1")) {
continue;
}
//图片查重的比对图片集合
List<OcrPicture> compareList = new ArrayList<>();
//非历史图片主键集合
List<String> picturecompareList = new ArrayList<>();
boolean havePoint = false;
logService.addLog(103, "AI获取图片相似度接口", sysUser, "sendParams");
if (StringUtils.isBlank(ocrPicture.getImgHash())) {
Map<String, String> map = this.getOcrPictureClassifyAndHash(ocrPicture.getLocalpictrueurl());
if (map != null) {
ocrPicture.setImgHash(map.get("hash"));
ocrPicture.setClassificationid(map.get("classId"));
}
// this.updateById(ocrPicture);
}
//二次遍历进行比对
for (OcrPicture ocrPictureNext : ocrPictureList) {
//分类不一致的也不需要进行比对
if (ocrPictureNext.getId().longValue() == ocrPicture.getId().longValue()) {
continue;
}
//分类不一致的也不需要进行比对
//TODO 接口请求判断重复情况
if (StringUtils.isBlank(ocrPictureNext.getImgHash())) {
Map<String, String> map = this.getOcrPictureClassifyAndHash(ocrPictureNext.getLocalpictrueurl());
if (map != null) {
ocrPictureNext.setImgHash(map.get("hash"));
ocrPictureNext.setClassificationid(map.get("classId"));
}
// this.updateById(ocrPictureNext);
}
String resultValue = "";
String strId = ocrPicture.getId() + ":" + ocrPictureNext.getId();
String strNextId = ocrPictureNext.getId() + ":" + ocrPicture.getId();
if (resultMap.containsKey(strId) || resultMap.containsKey(strNextId)) {
resultValue = resultMap.get(strId) == null ? resultMap.get(strNextId) : resultMap.get(strId);
} else {
String img = StringUtils.isBlank(ocrPicture.getImgHash()) ? StringUtils.isBlank(ocrPicture.getLocalpictrueurl()) ? ocrPicture.getImgurl() : ocrPicture.getLocalpictrueurl() : ocrPicture.getImgHash();
String imgNext = StringUtils.isBlank(ocrPictureNext.getImgHash()) ? StringUtils.isBlank(ocrPictureNext.getLocalpictrueurl()) ? ocrPictureNext.getImgurl() : ocrPictureNext.getLocalpictrueurl() : ocrPictureNext.getImgHash();
resultValue = HashCompareUtil.cmpHash(img, imgNext);
resultMap.put(strId, resultValue);
}
ocrPictureNext.setResult(resultValue);
BigDecimal b1 = new BigDecimal(resultValue);
BigDecimal b2 = new BigDecimal("100");
int val = b1.compareTo(b2);
if (val == 0) {
havePoint = true;
}
//如果当前图片未生成任务需要临时保存
if (ocrPictureNext.getTaskstatus().equals("0")) {
picturecompareList.add(ocrPictureNext.getId().toString());
}
compareList.add(ocrPictureNext);
}
// this.updateBatchById(ocrPictureList);
bubbleSortOpt(compareList);
//从大到小进行排序
ocrPicture.setListCom(compareList);
//非历史图片主键集合
ocrPicture.setPicturecompareList(picturecompareList);
ocrPicture.setTaskstatus("1");
}
}
boolean b = checkDuplicateResultService.saveOrUpdateBatch(list);
}
/**
* ocr_pictrue_duplicate_his
*/
public void comparePicture(){
}
/**
* ocr_pictrue_duplicate_his
*/
public void newComparePicture(){
}
public Map<String, String> getOcrPictureClassifyAndHash(String img) {
JSONObject jsonObjectSimi = ImageClassUtil.getClassify(img, "1", classifyPath);
//返回内容为零,表示成功,否则表示失败
if (null != jsonObjectSimi && jsonObjectSimi.getString("code").equals("0") && jsonObjectSimi.get("data") != null && jsonObjectSimi.getJSONArray("data").size() > 0) {
JSONObject data = jsonObjectSimi.getJSONArray("data").getJSONObject(0);
Map<String, String> map = new HashMap();
map.put("classId", data.getString("classId"));
map.put("hash", data.getString("hash"));
return map;
} else {
return null;
}
}
public void bubbleSortOpt(List<OcrPicture> compareList) {
if (null == compareList) {
return;
}
OcrPicture temp = null;
for (int i = 0; i < compareList.size() - 1; i++) {
for (int j = 0; j < compareList.size() - i - 1; j++) {
if (Double.parseDouble(compareList.get(j).getResult()) < Double.parseDouble(compareList.get(j + 1).getResult())) {
temp = compareList.get(j);
compareList.set(j, compareList.get(j + 1));
compareList.set((j + 1), temp);
}
}
}
}
}
Loading…
Cancel
Save