From 353d28c90ed8ddf5568e91b49cd8e42cbfe96006 Mon Sep 17 00:00:00 2001 From: shuliYao <1397940314@qq.com> Date: Mon, 25 Mar 2024 02:41:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=80=E4=BB=B6=E6=9F=A5=E9=87=8D?= =?UTF-8?q?=E3=80=81=E5=88=9B=E5=BB=BA=E4=BB=BB=E5=8A=A1=E5=8C=85=E6=96=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OcrCheckDuplicateController.java | 157 ++++++++ .../controller/OcrTaskPackageController.java | 146 ++------ ...java => OcrPictureDuplicateHisMapper.java} | 4 +- .../xiaoyao/ocr/dataobject/OcrPicture.java | 6 +- ...teHis.java => OcrPictureDuplicateHis.java} | 2 +- .../ocr/dataobject/OcrTaskPackage.java | 3 + .../xiaoyao/ocr/dto/OcrTaskPackageDto.java | 35 ++ .../service/IOcrCheckDuplicateService.java | 47 +++ .../IOcrPictrueDuplicateHisService.java | 16 - .../IOcrPictureDuplicateHisService.java | 22 ++ .../ocr/service/IOcrTaskPackageService.java | 9 +- .../impl/OcrCheckDuplicateServiceImpl.java | 339 +++++++++++++++++- .../OcrPictrueDuplicateHisServiceImpl.java | 20 -- .../OcrPictureDuplicateHisServiceImpl.java | 33 ++ .../service/impl/OcrPictureServiceImpl.java | 1 - .../impl/OcrTaskPackageServiceImpl.java | 209 +---------- .../cn/jyjz/xiaoyao/ocr/util/DataUtil.java | 7 +- 17 files changed, 690 insertions(+), 366 deletions(-) create mode 100644 jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrCheckDuplicateController.java rename jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataDao/{OcrPictrueDuplicateHisMapper.java => OcrPictureDuplicateHisMapper.java} (63%) rename jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/{OcrPictrueDuplicateHis.java => OcrPictureDuplicateHis.java} (95%) create mode 100644 jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dto/OcrTaskPackageDto.java delete mode 100644 jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictrueDuplicateHisService.java create mode 100644 jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictureDuplicateHisService.java delete mode 100644 jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictrueDuplicateHisServiceImpl.java create mode 100644 jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureDuplicateHisServiceImpl.java diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrCheckDuplicateController.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrCheckDuplicateController.java new file mode 100644 index 00000000..431cd0f4 --- /dev/null +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrCheckDuplicateController.java @@ -0,0 +1,157 @@ +package cn.jyjz.xiaoyao.ocr.controller; + +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.service.IOcrCheckDuplicateService; +import cn.jyjz.xiaoyao.ocr.service.OcrPictureService; +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.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; + +/** + * 一键查重 功能 + * + * @author hugh(shuli.yao) 1397940314@qq.com + * @version 1.0 + * @date 2024/3/25 1:31 + */ +@RestController +@RequestMapping("/ocr/checkDuplicate") +public class OcrCheckDuplicateController { + + @Resource + private UserTokenService userTokenService; + @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 = "/openCheckDuplicate") + 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 queryWrapper = new QueryWrapper<>(); + + //根据参数枚举,获取检索参数,并映射为数据库的字段的key-v map + Map 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 pageList = ocrPictureService.listPage(queryWrapper); + if (null != pageList && !pageList.isEmpty()) { + if (pageList.size() == 1) { + return ResultVoUtil.error("查重数据至少要有两条。"); + } else { + return ocrCheckDuplicateService.duplicateCheck(pageList, tenantId, userToken, req,paraMap); + } + } 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.success(); + } + } + + /** + * 删除查重任务 + * @param request + * @return + */ + @GetMapping(value = "/removeCheckDuplicate") + public ResultVo removeCheckDuplicate(HttpServletRequest request,@RequestParam(name="checkDuplicateNo",required = true) String checkDuplicateNo) { + + String tenantId = request.getHeader("X-Tenant-Id"); + if(StringUtils.isBlank(tenantId)){ + return ResultVoUtil.error("租户主键不能为空"); + } + + Boolean result = this.ocrCheckDuplicateService.removeCheckDuplicate(checkDuplicateNo,tenantId); + + if(result){ + return ResultVoUtil.success("取消查重任务成功!"); + } + return ResultVoUtil.error("取消任务失败!"); + } +} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrTaskPackageController.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrTaskPackageController.java index faa609ba..f813d6f1 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrTaskPackageController.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/controller/OcrTaskPackageController.java @@ -12,13 +12,12 @@ 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.dto.OcrTaskPackageDto; 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; @@ -34,13 +33,14 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

- * 一键查重功能 + * 一键查重 and 任务包功能 *

* * @author author @@ -53,111 +53,10 @@ public class OcrTaskPackageController extends BaseController { @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 queryWrapper = new QueryWrapper<>(); - - //根据参数枚举,获取检索参数,并映射为数据库的字段的key-v map - Map 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 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(); - } - } + @Resource + private UserTokenService userTokenService; /** * 创建任务包 @@ -165,9 +64,15 @@ public class OcrTaskPackageController extends BaseController { * @param req * @return */ - @GetMapping(value = "/createPackage") - public ResultVo createPackage(OcrTaskPackage ocrTaskPackage, HttpServletRequest req) { - + @PostMapping(value = "/createPackage") + public ResultVo createPackage(@RequestBody OcrTaskPackageDto ocrTaskPackage, HttpServletRequest req) { + UserToken userToken = this.userTokenService.getUserToken(RequestBaseUtil.getToken(req)); + //租户 + String tenantId = req.getHeader("X-Tenant-Id"); + if(StringUtils.isBlank(tenantId)){ + return ResultVoUtil.error("租户主键不能为空"); + } + ocrTaskPackage.setTenantId(Long.parseLong(tenantId)); //校验参数包名称 if(ocrTaskPackage == null){ return ResultVoUtil.error("参数对象为空"); @@ -178,27 +83,28 @@ public class OcrTaskPackageController extends BaseController { return ResultVoUtil.error("任务包名称不能为空"); } - boolean isSuccess = ocrTaskPackageService.save(ocrTaskPackage); - - if(isSuccess){ - return ResultVoUtil.success(ocrTaskPackage); - }else{ - return ResultVoUtil.error(); + //校验参数包名称 + if(StringUtils.isBlank(ocrTaskPackage.getCheckDuplicateNo())){ + return ResultVoUtil.error("查重任务编号不能为空"); } - + ocrTaskPackage.setCreateBy(userToken.getUserid()); + ocrTaskPackage.setCreateTime(System.currentTimeMillis()); + return ocrTaskPackageService.saveTaskPackage(ocrTaskPackage); } /** * 通过主键删除任务包 - * @param id + * @param packageId * @param req * @return */ @GetMapping(value = "/deletePackage") - public ResultVo deletePackage(Long id, HttpServletRequest req) { - - boolean b = ocrTaskPackageService.removeById(id); + public ResultVo deletePackage(@RequestParam(name="packageId",required = true)Long packageId, HttpServletRequest req) { + OcrTaskPackage taskPackage = new OcrTaskPackage(); + taskPackage.setId(packageId); + taskPackage.setIsDelete(1); + boolean b = ocrTaskPackageService.updateById(taskPackage); if(b){ return ResultVoUtil.success(); }else{ diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataDao/OcrPictrueDuplicateHisMapper.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataDao/OcrPictureDuplicateHisMapper.java similarity index 63% rename from jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataDao/OcrPictrueDuplicateHisMapper.java rename to jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataDao/OcrPictureDuplicateHisMapper.java index d1fdc845..0a72c9b5 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataDao/OcrPictrueDuplicateHisMapper.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataDao/OcrPictureDuplicateHisMapper.java @@ -1,6 +1,6 @@ package cn.jyjz.xiaoyao.ocr.dataDao; -import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictrueDuplicateHis; +import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictureDuplicateHis; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2024-03-24 */ @Mapper -public interface OcrPictrueDuplicateHisMapper extends BaseMapper { +public interface OcrPictureDuplicateHisMapper extends BaseMapper { } diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPicture.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPicture.java index f5c1944d..d040aeb9 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPicture.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPicture.java @@ -73,16 +73,16 @@ public class OcrPicture implements BaseDto, java.io.Serializable { private String pictureclassscores; @ApiModelProperty(value = "图片真假0:假,1:真") - @TableField(value = "iztrueorfalse", updateStrategy = FieldStrategy.IGNORED) + @TableField(value = "iztrueorfalse") private Integer iztrueorfalse; @ApiModelProperty(value = "选判真假原因id,从字典表中获得,其他时,当前字段为零") - @TableField(value = "judgeid", updateStrategy = FieldStrategy.IGNORED) + @TableField(value = "judgeid") @JsonSerialize(using = ToStringSerializer.class) private Long judgeid; @ApiModelProperty(value = "图片为假的其他原因,长度不超过50个汉字") - @TableField(value = "judgedesc", updateStrategy = FieldStrategy.IGNORED) + @TableField(value = "judgedesc") private String judgedesc; @ApiModelProperty(value = "公司ID") diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPictrueDuplicateHis.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPictureDuplicateHis.java similarity index 95% rename from jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPictrueDuplicateHis.java rename to jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPictureDuplicateHis.java index 84023e6d..83d6a26b 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPictrueDuplicateHis.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrPictureDuplicateHis.java @@ -28,7 +28,7 @@ import lombok.experimental.Accessors; @AllArgsConstructor @TableName("ocr_pictrue_duplicate_his") @ApiModel(value="OcrPictrueDuplicateHis对象", description="图片比对历史信息表") -public class OcrPictrueDuplicateHis implements Serializable { +public class OcrPictureDuplicateHis implements Serializable { private static final long serialVersionUID = 1L; diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrTaskPackage.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrTaskPackage.java index 4254c28b..c9eb211b 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrTaskPackage.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dataobject/OcrTaskPackage.java @@ -58,6 +58,9 @@ public class OcrTaskPackage implements Serializable { @ApiModelProperty(value = "修改时间") private Long updateTime; + @ApiModelProperty(value = "租户标识") + private Long tenantId; + private Integer isDelete; diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dto/OcrTaskPackageDto.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dto/OcrTaskPackageDto.java new file mode 100644 index 00000000..35ee9c30 --- /dev/null +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/dto/OcrTaskPackageDto.java @@ -0,0 +1,35 @@ +package cn.jyjz.xiaoyao.ocr.dto; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 任务包 dto对象 + * + * @author hugh(shuli.yao) 1397940314@qq.com + * @version 1.0 + * @date 2024/3/25 1:48 + */ +@Data +public class OcrTaskPackageDto { + @ApiModelProperty(value = "任务包名称") + private String name; + + @ApiModelProperty(value = "查重任务id") + private Long checkDuplicateId; + + @ApiModelProperty(value = "查重任务编号") + private String checkDuplicateNo; + + @ApiModelProperty(value = "租户标识") + private Long tenantId; + + @ApiModelProperty(value = "创建人") + private String createBy; + + @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Long createTime; +} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrCheckDuplicateService.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrCheckDuplicateService.java index 62aec2d8..13dde09e 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrCheckDuplicateService.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrCheckDuplicateService.java @@ -1,8 +1,15 @@ 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.OcrCheckDuplicate; +import cn.jyjz.xiaoyao.ocr.dataobject.OcrPicture; import com.baomidou.mybatisplus.extension.service.IService; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + /** *

* 查重任务表 服务类 @@ -13,7 +20,47 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface IOcrCheckDuplicateService extends IService { + /** + * 获取当前查重任务执行状态 + * @param checkDuplicateNo + * @return + */ OcrCheckDuplicate getCheckDuplicateStatus(String checkDuplicateNo); + /** + * 获取最后一次,在执行中的查重编号 + * @param tenantId + * @return + */ String getLastCheckNo(String tenantId); + + /** + * 创建一键查重任务 + * @param pageList + * @param tenantId + * @param userToken + * @param req + * @return + */ + ResultVo duplicateCheck(List pageList, String tenantId, UserToken userToken, HttpServletRequest req, Map paraMap); + + /** + * 图片比对,创建审核任务 + * @param ocrPictureList + * @param sysUser + */ + void comparePictureResultSave(List ocrPictureList,UserToken sysUser,Long checkDuplicateId) throws Exception; + + /** + * 取消查重任务 + */ + Boolean removeCheckDuplicate(String checkDuplicateNo, String tenantId); + + /** + * 获取查重任务信息 + * @param checkDuplicateNo + * @param tenantId + * @return + */ + OcrCheckDuplicate queryByCheckDuplicateNo(String checkDuplicateNo, Long tenantId); } diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictrueDuplicateHisService.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictrueDuplicateHisService.java deleted file mode 100644 index 316b851d..00000000 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictrueDuplicateHisService.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.jyjz.xiaoyao.ocr.service; - -import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictrueDuplicateHis; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 图片比对历史信息表 服务类 - *

- * - * @author author - * @since 2024-03-24 - */ -public interface IOcrPictrueDuplicateHisService extends IService { - -} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictureDuplicateHisService.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictureDuplicateHisService.java new file mode 100644 index 00000000..f5815e1e --- /dev/null +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrPictureDuplicateHisService.java @@ -0,0 +1,22 @@ +package cn.jyjz.xiaoyao.ocr.service; + +import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictureDuplicateHis; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 图片比对历史信息表 服务类 + *

+ * + * @author author + * @since 2024-03-24 + */ +public interface IOcrPictureDuplicateHisService extends IService { + + /** + * 根据pictrueId获取当前图片历史比对结果 + * @param pictureId + * @return + */ + OcrPictureDuplicateHis queryByPictureId(Long pictureId); +} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrTaskPackageService.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrTaskPackageService.java index aaf6d400..55d66b9c 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrTaskPackageService.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/IOcrTaskPackageService.java @@ -4,6 +4,7 @@ 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 cn.jyjz.xiaoyao.ocr.dto.OcrTaskPackageDto; import com.baomidou.mybatisplus.extension.service.IService; import javax.servlet.http.HttpServletRequest; @@ -19,6 +20,10 @@ import java.util.List; */ public interface IOcrTaskPackageService extends IService { - ResultVo duplicateCheck(List pageList, String tenantId, UserToken userToken, HttpServletRequest req); - + /** + * 创建任务包 根据查重任务编号 + * @param ocrTaskPackage + * @return + */ + ResultVo saveTaskPackage(OcrTaskPackageDto ocrTaskPackage); } diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrCheckDuplicateServiceImpl.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrCheckDuplicateServiceImpl.java index 752b133e..e8bb5f53 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrCheckDuplicateServiceImpl.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrCheckDuplicateServiceImpl.java @@ -1,20 +1,48 @@ package cn.jyjz.xiaoyao.ocr.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; import cn.jyjz.xiaoyao.admin.dataobject.User; +import cn.jyjz.xiaoyao.admin.service.LogService; import cn.jyjz.xiaoyao.common.base.exception.CommonExceptionCodeEnum; import cn.jyjz.xiaoyao.common.base.exception.ServiceException; +import cn.jyjz.xiaoyao.common.base.util.DateUtils; +import cn.jyjz.xiaoyao.common.base.util.SpringUtils; import cn.jyjz.xiaoyao.common.base.util.StringUtils; +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.common.redis.cache.ehcache.EhCacheTask; import cn.jyjz.xiaoyao.ocr.dataDao.OcrCheckDuplicateMapper; import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicate; +import cn.jyjz.xiaoyao.ocr.dataobject.OcrCheckDuplicateResult; +import cn.jyjz.xiaoyao.ocr.dataobject.OcrPicture; +import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictureDuplicateHis; +import cn.jyjz.xiaoyao.ocr.service.IOcrCheckDuplicateResultService; import cn.jyjz.xiaoyao.ocr.service.IOcrCheckDuplicateService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import cn.jyjz.xiaoyao.ocr.service.IOcrPictureDuplicateHisService; +import cn.jyjz.xiaoyao.ocr.service.OcrPictureService; +import cn.jyjz.xiaoyao.ocr.util.HashCompareUtil; +import cn.jyjz.xiaoyao.ocr.util.ImageClassUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.SneakyThrows; +import lombok.extern.log4j.Log4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.List; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.*; import java.util.function.Function; /** @@ -25,12 +53,83 @@ import java.util.function.Function; * @author author * @since 2024-03-24 */ -@Service +@Service("checkDuplicateService") public class OcrCheckDuplicateServiceImpl extends ServiceImpl implements IOcrCheckDuplicateService { - + private Logger logger = LoggerFactory.getLogger(OcrCheckDuplicateServiceImpl.class); @Resource private OcrCheckDuplicateMapper ocrCheckDuplicateMapper; + @Resource + private IOcrCheckDuplicateResultService checkDuplicateResultService; + + @Resource + private IOcrPictureDuplicateHisService pictureDuplicateHisService; + + @Resource + private OcrPictureService pictureService; + + @Resource + private LogService logService; + + @Value("${image.classifyPath}") + private String classifyPath; + + + + /** + * 查重任务接口 + */ + @Override + public ResultVo duplicateCheck(List ocrPictureList, String tenantId, UserToken sysUser, HttpServletRequest req,Map paraMap) { + + if (null != ocrPictureList && !ocrPictureList.isEmpty()) { + + //生成查重任务插入表ocr_check_duplicate + OcrCheckDuplicate ocrCheckDuplicate = new OcrCheckDuplicate(); + // 生成查重任务编号,规则用户id+当前年月日时分秒 + String checkDuplicateNoStr = sysUser.getUserid()+"-"+ DateUtils.parseDateToStr("yyyyMMddHHmmss",new Date()); + ocrCheckDuplicate.setCheckDuplicateNo(checkDuplicateNoStr); + ocrCheckDuplicate.setTenantId(Long.valueOf(tenantId)); + ocrCheckDuplicate.setCreateBy(sysUser.getUserid()); + ocrCheckDuplicate.setCreateTime(DateUtil.current()); + ocrCheckDuplicate.setPictureCount(ocrPictureList.size()); + ocrCheckDuplicate.setStatus(1); + ocrCheckDuplicate.setSearchingJson(JSONObject.toJSONString(paraMap));//查重时左侧的筛选条件 + this.save(ocrCheckDuplicate); + //异步执行图片比对查重功能 + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + IOcrCheckDuplicateService checkDuplicateService = SpringUtils.getBean("checkDuplicateService"); + Long id = ocrCheckDuplicate.getId(); + OcrCheckDuplicate checkDuplicate = new OcrCheckDuplicate(); + checkDuplicate.setId(id); + checkDuplicate.setStatus(7); //预留状态 + try { + //异步调用查重任务 + checkDuplicateService.comparePictureResultSave(ocrPictureList,sysUser,id); + checkDuplicate.setStatus(2); + } catch (Exception e) { + logger.error("异步执行图片比对异常:",e.getMessage()); + checkDuplicate.setStatus(3); + }finally { + checkDuplicateService.updateById(checkDuplicate); + } + } + }); + thread.start(); + return ResultVoUtil.success(ocrCheckDuplicate); + } + + return ResultVoUtil.error("比对图片不能为空!"); + + } + + + + /** + * 获取当前查重任务执行状态 + */ @Override public OcrCheckDuplicate getCheckDuplicateStatus(String checkDuplicateNo) { @@ -46,11 +145,16 @@ public class OcrCheckDuplicateServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("tenant_id",tenantId); + queryWrapper.eq("status","1"); + queryWrapper.eq("is_delete",0); queryWrapper.orderByDesc("create_time"); List list = ocrCheckDuplicateMapper.selectList(queryWrapper); if(CollUtil.isNotEmpty(list)){ @@ -59,4 +163,231 @@ public class OcrCheckDuplicateServiceImpl extends ServiceImpl ocrPictureList,UserToken sysUser,Long checkDuplicateId) throws Exception { + + List saveList = new ArrayList<>(); + //需要创建任务的图片集合 + List createTaskList = new ArrayList<>(); + + //图片信息不能为空 + if (null != ocrPictureList && !ocrPictureList.isEmpty()) { + + //1.开启比对任务 + for (OcrPicture ocrPicture : ocrPictureList) { + + logService.addLog(103, "AI获取图片相似度接口", sysUser, "sendParams"); + if (org.apache.commons.lang3.StringUtils.isBlank(ocrPicture.getImgHash())) { + Map map = this.getOcrPictureClassifyAndHash(ocrPicture.getLocalpictrueurl()); + if (map != null) { + ocrPicture.setImgHash(map.get("hash")); + ocrPicture.setClassificationid(map.get("classId")); + } + } + //定义比对结果存储结果map + Map resultMap = new HashMap<>(); + //定义比对临时map 防止重复比对 + Map compareMap = new HashMap<>(); + //定义当前图片比对的最高阈值 + BigDecimal maxSimilarity = new BigDecimal("0"); + //1.1 开始便利进行比对 + for (OcrPicture ocrPictureNext : ocrPictureList) { + //排除当前图片,自己跟自己没必要比较 + if (ocrPictureNext.getId().longValue() == ocrPicture.getId().longValue()) { + continue; + } + //分类不一致的也不需要进行比对 + //TODO 接口请求判断重复情况 + if (org.apache.commons.lang3.StringUtils.isBlank(ocrPictureNext.getImgHash())) { + Map 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 (compareMap.containsKey(strId) || compareMap.containsKey(strNextId)) { + resultValue = resultMap.get(strId) == null ? compareMap.get(strNextId) : compareMap.get(strId); + } else { + String img = org.apache.commons.lang3.StringUtils.isBlank(ocrPicture.getImgHash()) ? org.apache.commons.lang3.StringUtils.isBlank(ocrPicture.getLocalpictrueurl()) ? ocrPicture.getImgurl() : ocrPicture.getLocalpictrueurl() : ocrPicture.getImgHash(); + String imgNext = org.apache.commons.lang3.StringUtils.isBlank(ocrPictureNext.getImgHash()) ? org.apache.commons.lang3.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(b1.compareTo(maxSimilarity)==1){ + maxSimilarity = b1; + } + resultMap.put(ocrPictureNext.getId().toString(),resultValue); + } + //1.2 比对结束组装入库参数 + //定义比对存储对象 + OcrCheckDuplicateResult ocrCheckDuplicateResult = new OcrCheckDuplicateResult(); + ocrCheckDuplicateResult.setPictureId(ocrPicture.getId()); + ocrCheckDuplicateResult.setMaxSimilarity(maxSimilarity.doubleValue()); + ocrCheckDuplicateResult.setCompareResultJson(JSONObject.toJSONString(resultMap)); + ocrCheckDuplicateResult.setCheckDuplicateId(checkDuplicateId); + saveList.add(ocrCheckDuplicateResult); + } + } + //批量入库 + boolean b = checkDuplicateResultService.saveOrUpdateBatch(saveList); + if(!b){ + throw new Exception("批量入库比对结果失败!"); + } + //开始更新图片最高阈值 + this.updatePictureSimilarityScore(saveList); + //开始更新 图片历史比对数据结果 + this.updateCompareToPictureDuplicateHis(saveList); + } + + @Override + public Boolean removeCheckDuplicate(String checkDuplicateNo, String tenantId) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("tenant_id",tenantId); + queryWrapper.eq("check_duplicate_no",checkDuplicateNo); + OcrCheckDuplicate ocrCheckDuplicate = new OcrCheckDuplicate(); + ocrCheckDuplicate.setIsDelete(1); + return baseMapper.update(ocrCheckDuplicate,queryWrapper)>0; + } + + @Override + public OcrCheckDuplicate queryByCheckDuplicateNo(String checkDuplicateNo, Long tenantId) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("tenant_id",tenantId); + queryWrapper.eq("check_duplicate_no",checkDuplicateNo); + OcrCheckDuplicate ocrCheckDuplicate = ocrCheckDuplicateMapper.selectOne(queryWrapper); + return ocrCheckDuplicate; + } + + /** + * 更新图片最高历史阈值 + * @param saveList + * @return + */ + private boolean updatePictureSimilarityScore(List saveList) throws Exception { + List updateList = new ArrayList<>(); + for (OcrCheckDuplicateResult ocrCheckDuplicateResult : saveList) { + OcrPicture picture = pictureService.selectDtoById(ocrCheckDuplicateResult.getPictureId()); + OcrPicture ocrPicture = new OcrPicture(); + //如果当前图片没有历史阈值,直接更新上阈值 + if(picture.getSimilarityscore()==null){ + ocrPicture.setId(picture.getId()); + ocrPicture.setSimilarityscore(ocrCheckDuplicateResult.getMaxSimilarity().intValue()); + updateList.add(ocrPicture); + continue; + } + BigDecimal oldSimilarityScore = new BigDecimal(picture.getSimilarityscore()); + BigDecimal newSimilarityScore = new BigDecimal(ocrCheckDuplicateResult.getMaxSimilarity()); + if(newSimilarityScore.compareTo(oldSimilarityScore)==1){ + ocrPicture.setId(picture.getId()); + ocrPicture.setSimilarityscore(newSimilarityScore.intValue()); + updateList.add(ocrPicture); + } + } + if(updateList.size()<=0){ + return true; + } + + if(!pictureService.updateBatchById(updateList)){ + throw new Exception("更新图片历史最高阈值失败!"); + } + return true; + } + + + /** + * 将本次比对的结果增量存储到对应图片里 + * 存储增量比对历史数据 ocr_pictrue_duplicate_his + */ + public boolean updateCompareToPictureDuplicateHis(List checkDuplicateResults) throws Exception { + //定义update集合 + List updateList = new ArrayList<>(); + //定义insert集合 + List insertList = new ArrayList<>(); + //1.循环便利本次比对结果 + for (OcrCheckDuplicateResult checkDuplicateResult : checkDuplicateResults) { + //查看当前图片历史比对结果 + OcrPictureDuplicateHis pictureDuplicateHis = pictureDuplicateHisService.queryByPictureId(checkDuplicateResult.getPictureId()); + //获取本次对比结果map + ObjectMapper newObjectMapper = new ObjectMapper(); + Map newMap = newObjectMapper.readValue(checkDuplicateResult.getCompareResultJson(), HashMap.class); + //创建当前用于存储的历史map + Map hisMap = new HashMap<>(); + //定义处理对象 + OcrPictureDuplicateHis pictureDuplicate = new OcrPictureDuplicateHis(); + + if(pictureDuplicateHis!=null){ + //检查当前是否存在 历史 + if(StringUtils.isNotBlank(pictureDuplicateHis.getCheckDuplicateResultHisJson())){ + ObjectMapper hisObjectMapper = new ObjectMapper(); + hisMap = hisObjectMapper.readValue(pictureDuplicateHis.getCheckDuplicateResultHisJson(), HashMap.class); + for (String key : newMap.keySet()) { + //开始变更旧map + hisMap.put(key,newMap.get(key)); + } + pictureDuplicate.setId(pictureDuplicateHis.getId()); + pictureDuplicate.setCheckDuplicateResultHisJson(JSONObject.toJSONString(hisMap)); + pictureDuplicateHisService.updateById(pictureDuplicate); + updateList.add(pictureDuplicate); + continue; + } + } + //没有存储过 + hisMap = newMap; + pictureDuplicate.setPictureId(checkDuplicateResult.getPictureId()); + pictureDuplicate.setCheckDuplicateResultHisJson(JSONObject.toJSONString(hisMap)); + insertList.add(pictureDuplicate); + } + if(updateList.size()>0){ + if(!pictureDuplicateHisService.updateBatchById(updateList)){ + throw new Exception("更新图片历史比对失败!"); + } + } + + if(insertList.size()>0){ + if(!pictureDuplicateHisService.saveBatch(insertList)){ + throw new Exception("新增图片历史比对失败!"); + } + } + return true; + } + + + public Map 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 map = new HashMap(); + map.put("classId", data.getString("classId")); + map.put("hash", data.getString("hash")); + return map; + } else { + return null; + } + } + } diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictrueDuplicateHisServiceImpl.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictrueDuplicateHisServiceImpl.java deleted file mode 100644 index be862aed..00000000 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictrueDuplicateHisServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -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; - -/** - *

- * 图片比对历史信息表 服务实现类 - *

- * - * @author author - * @since 2024-03-24 - */ -@Service -public class OcrPictrueDuplicateHisServiceImpl extends ServiceImpl implements IOcrPictrueDuplicateHisService { - -} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureDuplicateHisServiceImpl.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureDuplicateHisServiceImpl.java new file mode 100644 index 00000000..dc479509 --- /dev/null +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureDuplicateHisServiceImpl.java @@ -0,0 +1,33 @@ +package cn.jyjz.xiaoyao.ocr.service.impl; + +import cn.jyjz.xiaoyao.ocr.dataDao.OcrPictureDuplicateHisMapper; +import cn.jyjz.xiaoyao.ocr.dataobject.OcrPictureDuplicateHis; +import cn.jyjz.xiaoyao.ocr.service.IOcrPictureDuplicateHisService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 图片比对历史信息表 服务实现类 + *

+ * + * @author author + * @since 2024-03-24 + */ +@Service +public class OcrPictureDuplicateHisServiceImpl extends ServiceImpl implements IOcrPictureDuplicateHisService { + + @Override + public OcrPictureDuplicateHis queryByPictureId(Long pictureId) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("picture_id",pictureId); + List pictureDuplicateHisList = baseMapper.selectList(queryWrapper); + if(pictureDuplicateHisList!=null && pictureDuplicateHisList.size()>0){ + return pictureDuplicateHisList.get(0); + } + return null; + } +} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureServiceImpl.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureServiceImpl.java index 92cf218a..74191da2 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureServiceImpl.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrPictureServiceImpl.java @@ -466,7 +466,6 @@ public class OcrPictureServiceImpl extends BaseServiceImpl listPage(Wrapper queryWrapper) { long count = this.count(queryWrapper); - Page ocrPicturePage = new Page<>(1, count); ocrPicturePage.setMaxLimit(count); IPage iPage = this.page(ocrPicturePage, queryWrapper); diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrTaskPackageServiceImpl.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrTaskPackageServiceImpl.java index 84eb7ec8..8187af47 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrTaskPackageServiceImpl.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/service/impl/OcrTaskPackageServiceImpl.java @@ -1,5 +1,6 @@ package cn.jyjz.xiaoyao.ocr.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.jyjz.xiaoyao.admin.service.LogService; import cn.jyjz.xiaoyao.common.base.vo.ResultVo; @@ -7,12 +8,14 @@ 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.dto.OcrTaskPackageDto; 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 liquibase.pro.packaged.T; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -36,207 +39,23 @@ import java.util.Map; @Service public class OcrTaskPackageServiceImpl extends ServiceImpl 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 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 ocrPictureList,UserToken sysUser) { - - List list = new ArrayList<>(); - - //图片错误信息 - StringBuffer error = new StringBuffer(); - //项目错误信息 - StringBuffer errorProject = new StringBuffer(); - //流程错误信息 - StringBuffer errorFlow = new StringBuffer(); - //记录任务相似度为百分百的任务主键 - List pointsList = new ArrayList<>(); - //图片信息不能为空 - if (null != ocrPictureList && !ocrPictureList.isEmpty()) { - - //用于标记相似度是否存在百分百的情况 - List newList = new ArrayList<>(); - Map 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 compareList = new ArrayList<>(); - //非历史图片主键集合 - List picturecompareList = new ArrayList<>(); - boolean havePoint = false; - logService.addLog(103, "AI获取图片相似度接口", sysUser, "sendParams"); - if (StringUtils.isBlank(ocrPicture.getImgHash())) { - Map 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 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 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 map = new HashMap(); - map.put("classId", data.getString("classId")); - map.put("hash", data.getString("hash")); - return map; - } else { - return null; - } - } - - public void bubbleSortOpt(List compareList) { - - if (null == compareList) { - return; + public ResultVo saveTaskPackage(OcrTaskPackageDto ocrTaskPackage) { + //1.获取查重任务 + OcrCheckDuplicate ocrCheckDuplicate = checkDuplicateService.queryByCheckDuplicateNo(ocrTaskPackage.getCheckDuplicateNo(),ocrTaskPackage.getTenantId()); + if(ocrCheckDuplicate==null){ + return ResultVoUtil.error("无法获取到查重任务!"); } - 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); - } - } + OcrTaskPackage taskPackage = new OcrTaskPackage(); + BeanUtil.copyProperties(ocrTaskPackage,taskPackage); + taskPackage.setCheckDuplicateId(ocrCheckDuplicate.getId()); + if(this.save(taskPackage)){ + return ResultVoUtil.success("创建任务包成功!"); } + return ResultVoUtil.error("创建任务包失败!"); } } diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/util/DataUtil.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/util/DataUtil.java index cf44b2f6..2b66629d 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/util/DataUtil.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/xiaoyao/ocr/util/DataUtil.java @@ -1,5 +1,7 @@ package cn.jyjz.xiaoyao.ocr.util; +import cn.hutool.core.date.DateUtil; + import java.util.Calendar; import java.util.Date; @@ -16,7 +18,7 @@ public class DataUtil { // String defaultEndDate = sdf.format(dNow); //格式化当前时间 // System.out.println("三个月之前时间======="+defaultStartDate); // System.out.println("当前时间==========="+defaultEndDate); - + return dBefore; } public static Date afterDateByWeek(int no){ @@ -31,11 +33,12 @@ public class DataUtil { // String defaultEndDate = sdf.format(dNow); //格式化当前时间 // System.out.println(no + "周之前时间======="+defaultStartDate); // System.out.println("当前时间==========="+defaultEndDate); - + return dBefore; } // public static void main(String[] args){ // DataUtil dataUtil = new DataUtil(); // dataUtil.afterDateByWeek(1); // } + }