|
|
|
@ -1,11 +1,30 @@
|
|
|
|
|
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.OcrTaskPackage;
|
|
|
|
|
import cn.jyjz.xiaoyao.ocr.service.IOcrTaskPackageService;
|
|
|
|
|
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) 服务实现类
|
|
|
|
@ -17,4 +36,207 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
@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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|