fix: 接口联调

feature/task-zhanglin
Vincent 2 weeks ago
parent fde125426e
commit c3bc2e094d

@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
import lombok.Data; import lombok.Data;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@Data @Data
@ -94,7 +95,42 @@ public class FormRecord {
/** /**
* *
*/ */
private LivePhoto livePhoto; private List<LivePhoto> livePhoto;
/**
*
*/
private List<LivePhoto> drt0011;
/**
*
*/
private List<LivePhoto> drt0013;
/**
*
*/
private List<LivePhoto> drt0014;
/**
*
*/
private String localImageUrl;
/**
* hash
*/
private String imgHash;
/**
*
*/
private String imageUrl;
/**
*
*/
private String imageNo;
// 使用 Map 捕获动态字段 // 使用 Map 捕获动态字段
private Map<String, Object> dynamicFields; private Map<String, Object> dynamicFields;

@ -34,11 +34,12 @@ public class PictureDisposeTask implements Runnable {
OcrPictureService ocrPictureService = SpringUtils.getBean("ocrPictureService"); OcrPictureService ocrPictureService = SpringUtils.getBean("ocrPictureService");
//获取当前任务中有多少图片 //获取当前任务中有多少图片
LivePhoto livePhoto = pictureSourceResult.getLivePhoto(); List<LivePhoto> livePhotos = pictureSourceResult.getLivePhoto();
//定义新增集合对象 //定义新增集合对象
List<OcrPicture> ocrPictureList = new ArrayList<>(); List<OcrPicture> ocrPictureList = new ArrayList<>();
for (LivePhoto livePhoto : livePhotos) {
//检查图片地址是否为空 //检查图片地址是否为空
if (StringUtils.isEmpty(livePhoto.getFileUrl())) { if (StringUtils.isEmpty(livePhoto.getFileUrl())) {
OcrPicture picture = new OcrPicture(); OcrPicture picture = new OcrPicture();
@ -47,6 +48,7 @@ public class PictureDisposeTask implements Runnable {
picture.setHistory(true); picture.setHistory(true);
ocrPictureList.add(picture); ocrPictureList.add(picture);
} }
}
//调用图片入库方法 //调用图片入库方法
int size = ocrPictureService.savePictures(ocrPictureList); int size = ocrPictureService.savePictures(ocrPictureList);

@ -3,16 +3,20 @@ package org.jeecg.module.custom.ocr.api.thread.tasks;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.module.custom.ocr.api.entity.FormRecord; import org.jeecg.module.custom.ocr.api.entity.FormRecord;
import org.jeecg.module.custom.ocr.dataobject.OcrPicture; import org.jeecg.module.custom.ocr.api.entity.LivePhoto;
import org.jeecg.module.custom.ocr.dataobject.Task;
import org.jeecg.module.custom.ocr.service.OcrPictureService; import org.jeecg.module.custom.ocr.service.OcrPictureService;
import org.jeecg.module.custom.ocr.service.TaskService;
import org.jeecg.module.custom.ocr.utils.DownloadImgUtil; import org.jeecg.module.custom.ocr.utils.DownloadImgUtil;
import org.jeecg.module.custom.ocr.utils.ImageUtils; import org.jeecg.module.custom.ocr.utils.ImageUtils;
import org.jeecg.module.custom.ocr.utils.SpringUtils; import org.jeecg.module.custom.ocr.utils.SpringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Map; import java.util.Map;
@ -36,36 +40,54 @@ public class PictureImgToLocalTask implements Runnable {
@Override @Override
public void run() { public void run() {
OcrPictureService ocrPictureService = SpringUtils.getBean("ocrPictureService"); OcrPictureService ocrPictureService = SpringUtils.getBean("ocrPictureService");
OcrPicture picture = ocrPictureService.getById(pictureImgToLocal.getId()); // OcrPicture picture = ocrPictureService.getById(pictureImgToLocal.getId());
TaskService taskService = SpringUtils.getBean("taskServiceImpl");
Task task = taskService.getById(pictureImgToLocal.getId());
//1.开始转储图片 //1.开始转储图片
Boolean result = true; Boolean result = true;
handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getLivePhoto());
handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0011());
handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0013());
handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0014());
}
private void handlePicture(Boolean result, Task task, OcrPictureService ocrPictureService, TaskService taskService, List<LivePhoto> livePhotos) {
if (CollectionUtils.isEmpty(livePhotos)) {
return;
}
for (LivePhoto livePhoto : livePhotos) {
//检查是否已经存在本地图片,存在则不进行转储了。 //检查是否已经存在本地图片,存在则不进行转储了。
File file = new File(pictureImgToLocal.getLivePhoto().getFileUrl()); if (ObjectUtil.isNotEmpty(livePhoto)) {
File file = new File(livePhoto.getFileUrl());
// pictureImgToLocal.getLivePhoto().getLocalImgUrl() // pictureImgToLocal.getLivePhoto().getLocalImgUrl()
if (!file.isFile()) { if (!file.isFile()) {
result = DownloadImgUtil.downloadImage(pictureImgToLocal.getLivePhoto().getFileUrl(), pictureImgToLocal.getLivePhoto().getLocalImgUrl()); result = DownloadImgUtil.downloadImage(livePhoto.getFileUrl().replaceAll("https://https://", "https://"), livePhoto.getFileName());
// result = DownloadImgUtil.downloadImage(pictureImgToLocal.getLivePhoto().getFileUrl(), "D:\\code\\ocr-activity-backend\\1.jpeg"); // result = DownloadImgUtil.downloadImage(pictureImgToLocal.getLivePhoto().getFileUrl(), "D:\\code\\ocr-activity-backend\\1.jpeg");
} }
}
if (Boolean.TRUE.equals(result)) { if (Boolean.TRUE.equals(result)) {
if (ObjectUtil.isNotEmpty(picture)) { if (ObjectUtil.isNotEmpty(task)) {
picture.setLocalImageUrl(pictureImgToLocal.getLivePhoto().getFileUrl()); task.setLocalImageUrl(livePhoto.getFileUrl());
try { try {
// picture.setLocalImageUrl(ImageUtils.generateThumbnail("D:\\code\\ocr-activity-backend\\1.jpeg",182)); // picture.setLocalImageUrl(ImageUtils.generateThumbnail("D:\\code\\ocr-activity-backend\\1.jpeg",182));
picture.setLocalImageUrl(ImageUtils.generateThumbnail(pictureImgToLocal.getLivePhoto().getLocalImgUrl(),182)); task.setLocalImageUrl(ImageUtils.generateThumbnail(livePhoto.getFileName(), 182));
// picture.setServerThumbnailUrl(ocrPictureService.getServerUrl()+ImageUtils.getFileName(picture.getLocalThumbnailUrl())); // picture.setServerThumbnailUrl(ocrPictureService.getServerUrl()+ImageUtils.getFileName(picture.getLocalThumbnailUrl()));
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
Map<String, String> ocrPictureClassifyAndHash = ocrPictureService.getOcrPictureClassifyAndHash(picture.getLocalImageUrl()); Map<String, String> ocrPictureClassifyAndHash = ocrPictureService.getOcrPictureClassifyAndHash(task.getLocalImageUrl());
if (ocrPictureClassifyAndHash != null) { if (ocrPictureClassifyAndHash != null) {
picture.setImgHash(ocrPictureClassifyAndHash.get("hash")); task.setImgHash(ocrPictureClassifyAndHash.get("hash"));
} }
ocrPictureService.updateById(picture); taskService.updateById(task);
logger.info("图片本地化,回写数据完成!"); logger.info("图片本地化,回写数据完成!");
logger.info("开启获取图片信息操作!"); logger.info("开启获取图片信息操作!");
ocrPictureService.savePicturesInfo(picture); ocrPictureService.savePicturesInfo(task);
logger.info("获取图片信息操作,结束!"); logger.info("获取图片信息操作,结束!");
} }
} else { } else {
@ -83,3 +105,5 @@ public class PictureImgToLocalTask implements Runnable {
} }
} }
}

@ -2,25 +2,31 @@ package org.jeecg.module.custom.ocr.controller;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.module.custom.ocr.api.PrevailCloudApi; import org.jeecg.module.custom.ocr.api.PrevailCloudApi;
import org.jeecg.module.custom.ocr.api.entity.PictureSourceAllPullMsg; import org.jeecg.module.custom.ocr.api.entity.PictureSourceAllPullMsg;
import org.jeecg.module.custom.ocr.api.thread.PullAllPictureSourceThread; import org.jeecg.module.custom.ocr.api.thread.PullAllPictureSourceThread;
import org.jeecg.module.custom.ocr.common.entity.RequestData;
import org.jeecg.module.custom.ocr.config.ApiConfig; import org.jeecg.module.custom.ocr.config.ApiConfig;
import org.jeecg.module.custom.ocr.controller.dto.AddTaskRequest; import org.jeecg.module.custom.ocr.controller.dto.*;
import org.jeecg.module.custom.ocr.controller.dto.DeleteTaskRequest; import org.jeecg.module.custom.ocr.controller.dto.enc.AddTaskEncRequest;
import org.jeecg.module.custom.ocr.controller.dto.DuplicateTaskRequest; import org.jeecg.module.custom.ocr.controller.dto.enc.DeleteEncTaskRequest;
import org.jeecg.module.custom.ocr.controller.dto.enc.DuplicateTaskEncRequest;
import org.jeecg.module.custom.ocr.service.DuplicateTaskService; import org.jeecg.module.custom.ocr.service.DuplicateTaskService;
import org.jeecg.module.custom.ocr.service.TaskService; import org.jeecg.module.custom.ocr.service.TaskService;
import org.jeecg.module.custom.ocr.utils.ApiHelper;
import org.jeecg.module.custom.ocr.utils.StringUtils; import org.jeecg.module.custom.ocr.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.concurrent.*; import java.util.concurrent.*;
@ -42,6 +48,9 @@ public class PrevailCloudApiController {
@Autowired @Autowired
private DuplicateTaskService duplicateTaskService; private DuplicateTaskService duplicateTaskService;
@Value("${accessCode}")
private String accessCode;
/** /**
* 线 * 线
*/ */
@ -116,8 +125,18 @@ public class PrevailCloudApiController {
*/ */
@ApiOperation(value = "添加任务", notes = "添加任务") @ApiOperation(value = "添加任务", notes = "添加任务")
@PostMapping("/addTask") @PostMapping("/addTask")
public void addTask(@RequestBody AddTaskRequest request) { public void addTask(@RequestBody AddTaskEncRequest request) {
taskService.save(request); try {
RequestData requestData = JSON.parseObject(JSON.toJSONString(request), RequestData.class);
String decryptRequest = ApiHelper.decryptRequest(accessCode, requestData);
List<TaskDTO> taskDTOS = JSON.parseArray(decryptRequest, TaskDTO.class);
AddTaskRequest addTaskRequest = convertToAddTaskRequest(request);
addTaskRequest.getData().setRecords(taskDTOS);
taskService.save(addTaskRequest);
} catch (Exception e) {
throw new RuntimeException(e);
}
} }
/** /**
@ -128,8 +147,18 @@ public class PrevailCloudApiController {
*/ */
@ApiOperation(value = "删除任务", notes = "删除任务") @ApiOperation(value = "删除任务", notes = "删除任务")
@PostMapping("/deleteTask") @PostMapping("/deleteTask")
public void deleteTask(@RequestBody @Validated DeleteTaskRequest request) { public void deleteTask(@RequestBody @Validated DeleteEncTaskRequest request) {
taskService.deleteTask(request.getTaskNo()); try {
DeleteTaskRequest deleteTaskRequest = convertToDeleteTaskRequest(request);
RequestData requestData = JSON.parseObject(JSON.toJSONString(request), RequestData.class);
String decryptRequest = ApiHelper.decryptRequest(accessCode, requestData);
DeleteTaskData deleteTaskData = JSON.parseObject(decryptRequest, DeleteTaskData.class);
deleteTaskRequest.setData(deleteTaskData);
taskService.deleteTasks(deleteTaskData.getTaskNos());
} catch (Exception e) {
throw new RuntimeException(e);
}
} }
/** /**
@ -140,7 +169,46 @@ public class PrevailCloudApiController {
*/ */
@ApiOperation(value = "查重", notes = "查重") @ApiOperation(value = "查重", notes = "查重")
@PostMapping("/checkDuplicate") @PostMapping("/checkDuplicate")
public void checkDuplicate(@RequestBody @Validated DuplicateTaskRequest request) { public void checkDuplicate(@RequestBody @Validated DuplicateTaskEncRequest request) {
duplicateTaskService.save(request); try {
DuplicateTaskRequest duplicateTaskRequest = convertToDuplicateTaskRequest(request);
RequestData requestData = JSON.parseObject(JSON.toJSONString(request), RequestData.class);
String decryptRequest = ApiHelper.decryptRequest(accessCode, requestData);
DuplicateTaskData duplicateTaskData = JSON.parseObject(decryptRequest, DuplicateTaskData.class);
duplicateTaskRequest.setData(duplicateTaskData);
duplicateTaskService.save(duplicateTaskRequest);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static AddTaskRequest convertToAddTaskRequest(AddTaskEncRequest encRequest) {
AddTaskRequest request = new AddTaskRequest();
request.setTenantCode(encRequest.getTenantCode());
request.setAccessKey(encRequest.getAccessKey());
request.setTimestamp(encRequest.getTimestamp());
request.setSignature(encRequest.getSignature());
request.setData(new AddTaskData());
return request;
}
private static DuplicateTaskRequest convertToDuplicateTaskRequest(DuplicateTaskEncRequest encRequest) {
DuplicateTaskRequest request = new DuplicateTaskRequest();
request.setTenantCode(encRequest.getTenantCode());
request.setAccessKey(encRequest.getAccessKey());
request.setTimestamp(encRequest.getTimestamp());
request.setSignature(encRequest.getSignature());
request.setData(new DuplicateTaskData());
return request;
}
private static DeleteTaskRequest convertToDeleteTaskRequest(DeleteEncTaskRequest encRequest) {
DeleteTaskRequest request = new DeleteTaskRequest();
request.setTenantCode(encRequest.getTenantCode());
request.setAccessKey(encRequest.getAccessKey());
request.setTimestamp(encRequest.getTimestamp());
request.setSignature(encRequest.getSignature());
return request;
} }
} }

@ -0,0 +1,15 @@
package org.jeecg.module.custom.ocr.controller.dto;
import lombok.Data;
import java.util.List;
@Data
public class DeleteTaskData {
private String accountNo;
private String tenantNo;
private List<Long> taskNos;
}

@ -2,14 +2,16 @@ package org.jeecg.module.custom.ocr.controller.dto;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
@Data @Data
public class DeleteTaskRequest { public class DeleteTaskRequest {
/** private String tenantCode;
* NO
*/ private String accessKey;
@NotNull
private Long taskNo; private Long timestamp;
private String signature;
private DeleteTaskData data;
} }

@ -5,6 +5,7 @@ import com.google.common.collect.Maps;
import lombok.Data; import lombok.Data;
import org.jeecg.module.custom.ocr.api.entity.LivePhoto; import org.jeecg.module.custom.ocr.api.entity.LivePhoto;
import java.util.List;
import java.util.Map; import java.util.Map;
@Data @Data
@ -93,7 +94,43 @@ public class TaskDTO {
/** /**
* *
*/ */
private LivePhoto livePhoto; private List<LivePhoto> livePhoto;
/**
*
*/
private List<LivePhoto> drt0011;
/**
*
*/
private List<LivePhoto> drt0013;
/**
*
*/
private List<LivePhoto> drt0014;
/**
*
*/
private String localImageUrl;
/**
* hash
*/
private String imgHash;
/**
*
*/
private String imageUrl;
/**
*
*/
private String imageNo;
// 使用 Map 捕获动态字段 // 使用 Map 捕获动态字段
private Map<String, Object> dynamicFields = Maps.newHashMap(); private Map<String, Object> dynamicFields = Maps.newHashMap();

@ -0,0 +1,16 @@
package org.jeecg.module.custom.ocr.controller.dto.enc;
import lombok.Data;
@Data
public class AddTaskEncRequest {
private String tenantCode;
private String accessKey;
private Long timestamp;
private String signature;
private String data;
}

@ -0,0 +1,16 @@
package org.jeecg.module.custom.ocr.controller.dto.enc;
import lombok.Data;
@Data
public class DeleteEncTaskRequest {
private String tenantCode;
private String accessKey;
private Long timestamp;
private String signature;
private String data;
}

@ -0,0 +1,32 @@
package org.jeecg.module.custom.ocr.controller.dto.enc;
import lombok.Data;
import org.jeecg.module.custom.ocr.controller.dto.DuplicateTaskData;
@Data
public class DuplicateTaskEncRequest {
/**
*
*/
private String tenantCode;
/**
* 访
*/
private String accessKey;
/**
*
*/
private Long timestamp;
/**
*
*/
private String signature;
/**
*
*/
private String data;
}

@ -1,10 +1,15 @@
package org.jeecg.module.custom.ocr.dataDao; package org.jeecg.module.custom.ocr.dataDao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.module.custom.ocr.dataobject.Task; import org.jeecg.module.custom.ocr.dataobject.Task;
import java.util.List;
public interface TaskMapper extends BaseMapper<Task> { public interface TaskMapper extends BaseMapper<Task> {
void save(Task task); void save(Task task);
void deleteByTaskNo(Long taskNo); void deleteByTaskNo(@Param("taskNo") Long taskNo);
void deleteByTaskNos(@Param("taskNos") List<Long> taskNos);
} }

@ -0,0 +1,405 @@
package org.jeecg.module.custom.ocr.dataobject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
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 lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.jeecg.module.custom.ocr.base.jsonDomain.DateSerializer;
import org.jeecg.module.custom.ocr.common.dto.BaseDto;
import org.jeecg.module.custom.ocr.jsonDomain.DateNotimeSerializer;
import org.jeecg.module.custom.ocr.utils.requestFormat.SearchQuery;
import java.util.List;
/**
*
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "图片信息表", description = "图片信息表")
@TableName(value = "ocr_task")
public class OcrPictureBak implements BaseDto, java.io.Serializable {
private static final long serialVersionUID = -10378331243377607L;
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
@TableField(value = "ID")
private Long id;
@ApiModelProperty(value = "创建人")
@TableField(value = "create_by")
private String createBy;
@ApiModelProperty(value = "创建时间")
@TableField(value = "create_time")
@JsonSerialize(using = DateSerializer.class)
private Long createTime;
@ApiModelProperty(value = "修改人")
@TableField(value = "update_by")
private String updateBy;
@ApiModelProperty(value = "修改时间")
@TableField(value = "update_time")
@JsonSerialize(using = DateSerializer.class)
private Long updateTime;
@ApiModelProperty(value = "分类表主键--通过“图片分类”字段做匹配,如果没有自动添加")
@TableField(value = "classificationid")
private String classificationid;
@ApiModelProperty(value = "图片类型--通过“AI图片分类接口获得”")
@TableField(value = "pictureclassid")
private String pictureclassid;
@ApiModelProperty(value = "图片类型相似度,图片类型--通过“AI图片分类接口获得”")
@TableField(value = "pictureclassscores")
private String pictureclassscores;
@ApiModelProperty(value = "图片真假0:假1真")
@TableField(value = "iztrueorfalse")
private Integer iztrueorfalse;
@ApiModelProperty(value = "选判真假原因id,从字典表中获得,其他时,当前字段为零")
@TableField(value = "judgeid")
@JsonSerialize(using = ToStringSerializer.class)
private Long judgeid;
@ApiModelProperty(value = "图片为假的其他原因长度不超过50个汉字")
@TableField(value = "judgedesc")
private String judgedesc;
@ApiModelProperty(value = "公司ID")
@JsonSerialize(using = ToStringSerializer.class)
@TableField(value = "tenant_id")
private Long tenantId;
@ApiModelProperty(value = "公司状态")
@TableField(value = "tenantstatus")
private String tenantstatus;
@ApiModelProperty(value = "公司代码,第三方系统")
@TableField(value = "plantCode")
private String plantcode;
@ApiModelProperty(value = "公司名称")
@TableField(value = "tenantname")
private String tenantname;
@ApiModelProperty(value = "业务主体ID--图片主键")
@TableField(value = "pictureid")
private String pictureid;
@ApiModelProperty(value = "业务主体名称--图片成名")
@TableField(value = "picturename")
private String picturename;
@ApiModelProperty(value = "图片名称")
@TableField(value = "imgName")
private String imgname;
@ApiModelProperty(value = "图片地址")
@TableField(value = "imgUrl")
private String imgurl;
@ApiModelProperty(value = "业务主体状态")
@TableField(value = "picturestatus")
private String picturestatus;
@ApiModelProperty(value = "源项目id")
@TableField(value = "projectId")
private String projectid;
@ApiModelProperty(value = "项目名称")
@TableField(value = "projectIdName")
private String projectidname;
@ApiModelProperty(value = "项目状态")
@TableField(value = "projectstatus")
private String projectstatus;
@ApiModelProperty(value = "源计划id")
@TableField(value = "planId")
private String planid;
@ApiModelProperty(value = "计划名称")
@TableField(value = "planName")
private String planname;
@ApiModelProperty(value = "计划状态")
@TableField(value = "planstatus")
private String planstatus;
@ApiModelProperty(value = "所属子计划ID")
@TableField(value = "planchildid")
private String planchildid;
@ApiModelProperty(value = "所属子计划名称")
@TableField(value = "planchildname")
private String planchildname;
@ApiModelProperty(value = "所属子计划状态")
@TableField(value = "planchildstatus")
private String planchildstatus;
@ApiModelProperty(value = "上传时间")
@JsonSerialize(using = DateNotimeSerializer.class)
@TableField(value = "upTime")
private Long uptime;
@ApiModelProperty(value = "生成时间")
@JsonSerialize(using = DateNotimeSerializer.class)
@TableField(value = "genTime")
private Long gentime;
@ApiModelProperty(value = "色彩空间")
@TableField(value = "space")
private String space;
@ApiModelProperty(value = "来源")
@TableField(value = "source")
private String source;
@ApiModelProperty(value = "上报者头像--接口传送")
@TableField(value = "upHead")
private String uphead;
@ApiModelProperty(value = "上报人主键")
@TableField(value = "upuserid")
private String upuserid;
@ApiModelProperty(value = "上报者名称--接口传送")
@TableField(value = "upName")
private String upname;
@ApiModelProperty(value = "发布地区,拜访城市,城市名称,例如:北京市、天津市、石家庄市")
@TableField(value = "releaseArea")
private String releasearea;
@ApiModelProperty(value = "拜访省份")
@TableField(value = "releaseProvince")
private String releaseprovince;
@ApiModelProperty(value = "任务id")
@TableField(value = "remark")
private String remark;
@ApiModelProperty(value = "任务名称,源系统")
@TableField(value = "taskName")
private String taskname;
@ApiModelProperty(value = "是否已经生成任务,01是")
@TableField(value = "taskstatus")
private String taskstatus;
@ApiModelProperty(value = "是否已经审批0未生成1审批中2已审批")
@TableField(value = "work_status")
private String workStatus;
@ApiModelProperty(value = "现项目ID")
@TableField(value = "categoryid")
private Long categoryid;
@ApiModelProperty(value = "任务-工单主键")
@TableField(value = "taskchildpictureid")
private String taskchildpictureid;
@ApiModelProperty(value = "提报人")
@TableField(value = "field1")
private String field1;
@ApiModelProperty(value = "拜访客户类型")
@TableField(value = "field2")
private String field2;
@ApiModelProperty(value = "拜访客户名称,终端名称,例如中日友好医院")
@TableField(value = "field3")
private String field3;
@ApiModelProperty(value = "任务来源")
@TableField(value = "field4")
private String field4;
@ApiModelProperty(value = "厂商")
@TableField(value = "field5")
private String field5;
@ApiModelProperty(value = "拜访客户级别")
@TableField(value = "field6")
private String field6;
@ApiModelProperty(value = "科室名称")
@TableField(value = "field7")
private String field7;
@ApiModelProperty(value = "拜访小结")
@TableField(value = "field8")
private String field8;
@ApiModelProperty(value = "产品名称")
@TableField(value = "field9")
private String field9;
@ApiModelProperty(value = "地区定位信息例如北京市朝阳区文苑路10号")
@TableField(value = "field10")
private String field10;
@ApiModelProperty(value = "拜访日期")
@TableField(value = "field11")
private String field11;
@ApiModelProperty(value = "定位距离")
@TableField(value = "field12")
private String field12;
@ApiModelProperty(value = "病历号")
@TableField(value = "field13")
private String field13;
@ApiModelProperty(value = "是否重复")
@TableField(value = "field14")
private String field14;
@ApiModelProperty(value = "任务类型")
@TableField(value = "field15")
private String field15;
@ApiModelProperty(value = "任务状态")
@TableField(value = "field16")
private String field16;
@ApiModelProperty(value = "拜访项目类别")
@TableField(value = "field17")
private String field17;
@ApiModelProperty(value = "备用字段")
@TableField(value = "field18")
private String field18;
@ApiModelProperty(value = "本地图片地址")
@TableField(value = "local_pictrue_url")
private String localpictrueurl;
@ApiModelProperty(value = "是否已下载到本地")
@TableField(value = "is_download")
private Integer isdownload;
@ApiModelProperty(value = "图片hash值")
@TableField(value = "img_hash")
private String imgHash;
@ApiModelProperty(value = "相似度数值")
@TableField(value = "similarity_score")
private Integer similarityscore;
@ApiModelProperty(value = "下载到本地,失败次数")
@TableField(value = "download_error_count")
private Integer downloadErrorCount;
@ApiModelProperty(value = "图片查重的比对图片集合")
@TableField(exist = false)
private List<OcrPictureBak> listCom;
@ApiModelProperty(value = "非历史图片主键集合")
@TableField(exist = false)
private List<String> picturecompareList;
@ApiModelProperty(value = "图片对应的工单对象")
@TableField(exist = false)
private OcrTaskchildPicture ocrTaskchildPicture;
@ApiModelProperty(value = "当前图片与参考图比对结果")
//当前图片与参考图比对结果
@TableField(exist = false)
private String result;
@ApiModelProperty(value = "缩略图服务器绝对路径")
@TableField(value = "local_thumbnail_url")
private String localThumbnailUrl;
@ApiModelProperty(value = "缩略图请求地址")
@TableField(value = "server_thumbnail_url")
private String serverThumbnailUrl;
@ApiModelProperty(value = "提报日期时间戳")
@TableField(value = "submit_date_timestamp")
private Long submitDateTimestamp;
@ApiModelProperty(value = "是否重复0.不重复 1.重复 (历史比对中阈值存在100的会显示此值)")
@TableField(value = "is_repeat")
private Integer isRepeat;
@ApiModelProperty(value = "任务状态")
@TableField(exist = false)
private Integer states;
@ApiModelProperty(value = "可疑文件夹 0:不在1在")
@TableField(value = "suspiciousfile")
private Integer suspiciousfile;
@ApiModelProperty(value = "定位")
@TableField(value = "location")
private String location;
@ApiModelProperty(value = "备注")
@TableField(value = "comment")
private String comment;
@ApiModelProperty(value = "拍照时间")
@TableField(value = "photo_date_timestamp")
@JsonSerialize(using = DateSerializer.class)
private Long photoDateTimestamp;
@ApiModelProperty(value = "完全相似分组id")
@TableField(value = "complete_similar_group_id")
private Long completeSimilarGroupId;
@ApiModelProperty(value = "是否为历史图")
@TableField(value = "history")
private Boolean history;
@ApiModelProperty(value = "节点状态")
@TableField(exist = false)
private Integer historyStates;
@ApiModelProperty(value = "节点状态")
@TableField(exist = false)
private String taskId;
@ApiModelProperty(value = "是否是历史重复一键查重图片墙检索结果阈值100无相同图片时使用")
@TableField(exist = false)
private Integer isRepeatHis;
@ApiModelProperty(value = "图片信息-宽")
@TableField(exist = false)
private String wide;
@ApiModelProperty(value = "图片信息-高")
@TableField(exist = false)
private String high;
//保存当前登录用户的数据权限范围的搜索条件
@TableField(exist = false)
@JsonIgnore
private SearchQuery searchQueryrolesShowleave;
@TableField(exist = false)
private OcrPictureInfo pictureInfo;
@Override
public String getQueryFiled(String filedname) {
return "";
}
}

@ -100,6 +100,26 @@ public class Task {
*/ */
private String livePhoto; private String livePhoto;
/**
*
*/
private String localImageUrl;
/**
* hash
*/
private String imgHash;
/**
*
*/
private String imageUrl;
/**
*
*/
private String imageNo;
// 使用 Map 捕获动态字段 // 使用 Map 捕获动态字段
private String dynamicFields; private String dynamicFields;
} }

@ -3,6 +3,7 @@ package org.jeecg.module.custom.ocr.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import org.jeecg.module.custom.ocr.base.BaseService; import org.jeecg.module.custom.ocr.base.BaseService;
import org.jeecg.module.custom.ocr.dataobject.OcrPicture; import org.jeecg.module.custom.ocr.dataobject.OcrPicture;
import org.jeecg.module.custom.ocr.dataobject.Task;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -27,4 +28,6 @@ public interface OcrPictureService extends BaseService<OcrPicture> {
void savePicturesInfo(OcrPicture ocrPicture); void savePicturesInfo(OcrPicture ocrPicture);
OcrPicture getByTaskId(Long taskId); OcrPicture getByTaskId(Long taskId);
void savePicturesInfo(Task task);
} }

@ -1,12 +1,20 @@
package org.jeecg.module.custom.ocr.service; package org.jeecg.module.custom.ocr.service;
import org.jeecg.module.custom.ocr.controller.dto.AddTaskRequest; import org.jeecg.module.custom.ocr.controller.dto.AddTaskRequest;
import org.jeecg.module.custom.ocr.dataobject.Task;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List;
public interface TaskService { public interface TaskService {
void save(AddTaskRequest request); void save(AddTaskRequest request);
void deleteTask(Long taskNo); void deleteTask(Long taskNo);
Task getById(Long id);
void updateById(Task task);
void deleteTasks(List<Long> taskNos);
} }

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jeecg.module.custom.ocr.api.entity.FormRecord; import org.jeecg.module.custom.ocr.api.entity.FormRecord;
@ -14,6 +15,7 @@ import org.jeecg.module.custom.ocr.config.ApiConfig;
import org.jeecg.module.custom.ocr.dataDao.OcrPictureMybatisDao; import org.jeecg.module.custom.ocr.dataDao.OcrPictureMybatisDao;
import org.jeecg.module.custom.ocr.dataobject.OcrPicture; import org.jeecg.module.custom.ocr.dataobject.OcrPicture;
import org.jeecg.module.custom.ocr.dataobject.OcrPictureInfo; import org.jeecg.module.custom.ocr.dataobject.OcrPictureInfo;
import org.jeecg.module.custom.ocr.dataobject.Task;
import org.jeecg.module.custom.ocr.service.OcrPictureInfoService; import org.jeecg.module.custom.ocr.service.OcrPictureInfoService;
import org.jeecg.module.custom.ocr.service.OcrPictureService; import org.jeecg.module.custom.ocr.service.OcrPictureService;
import org.jeecg.module.custom.ocr.service.OcrTaskchildPictureService; import org.jeecg.module.custom.ocr.service.OcrTaskchildPictureService;
@ -161,6 +163,20 @@ public class OcrPictureServiceImpl extends BaseServiceImpl<OcrPictureMybatisDao,
return this.lambdaQuery().eq(OcrPicture::getTaskId, taskId).one(); return this.lambdaQuery().eq(OcrPicture::getTaskId, taskId).one();
} }
@Override
public void savePicturesInfo(Task task) {
boolean isConnection = true;
String url = task.getImageUrl();
if (!StringUtils.isEmpty(task.getLocalImageUrl())) {
url = task.getLocalImageUrl();
isConnection = false;
}
OcrPictureInfo imageInfo = getImageInfo(url, isConnection);
imageInfo.setPictureId(task.getId());
imageInfo.setImgName(String.valueOf(task.getImageNo()));
ocrPictureInfoService.save(imageInfo);
}
/** /**
* *
* *
@ -241,7 +257,7 @@ public class OcrPictureServiceImpl extends BaseServiceImpl<OcrPictureMybatisDao,
String imgurl = ocrPicture.getImageUrl(); String imgurl = ocrPicture.getImageUrl();
livePhoto.setLocalImgUrl(apiConfig.getLocalImagePath() + imgurl.substring(imgurl.lastIndexOf("/"))); livePhoto.setLocalImgUrl(apiConfig.getLocalImagePath() + imgurl.substring(imgurl.lastIndexOf("/")));
entity.setLivePhoto(livePhoto); entity.setLivePhoto(Lists.newArrayList(livePhoto));
boolean addedToQueue = false; boolean addedToQueue = false;
while (!addedToQueue) { while (!addedToQueue) {
try { try {

@ -12,7 +12,9 @@ import org.jeecg.module.custom.ocr.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service import java.util.List;
@Service("taskServiceImpl")
public class TaskServiceImpl implements TaskService { public class TaskServiceImpl implements TaskService {
@Autowired @Autowired
@ -41,6 +43,21 @@ public class TaskServiceImpl implements TaskService {
taskMapper.deleteByTaskNo(taskNo); taskMapper.deleteByTaskNo(taskNo);
} }
@Override
public Task getById(Long id) {
return this.taskMapper.selectById(id);
}
@Override
public void updateById(Task task) {
this.taskMapper.updateById(task);
}
@Override
public void deleteTasks(List<Long> taskNos) {
taskMapper.deleteByTaskNos(taskNos);
}
private Task toTask(AddTaskRequest request) { private Task toTask(AddTaskRequest request) {
Task task = new Task(); Task task = new Task();
@ -73,6 +90,10 @@ public class TaskServiceImpl implements TaskService {
task.setUserName(taskDTO.getUserName()); task.setUserName(taskDTO.getUserName());
task.setSubmitTime(taskDTO.getSubmitTime()); task.setSubmitTime(taskDTO.getSubmitTime());
task.setLivePhoto(JSONObject.toJSONString(taskDTO.getLivePhoto())); task.setLivePhoto(JSONObject.toJSONString(taskDTO.getLivePhoto()));
task.setLocalImageUrl(taskDTO.getLocalImageUrl());
task.setImgHash(taskDTO.getImgHash());
task.setImageUrl(taskDTO.getImageUrl());
task.setImageNo(taskDTO.getImageNo());
// 将 Map<String, Object> 转换为 JSON 字符串 // 将 Map<String, Object> 转换为 JSON 字符串
try { try {
@ -114,6 +135,13 @@ public class TaskServiceImpl implements TaskService {
formRecord.setUserName(taskDTO.getUserName()); formRecord.setUserName(taskDTO.getUserName());
formRecord.setSubmitTime(taskDTO.getSubmitTime()); formRecord.setSubmitTime(taskDTO.getSubmitTime());
formRecord.setLivePhoto(taskDTO.getLivePhoto()); formRecord.setLivePhoto(taskDTO.getLivePhoto());
formRecord.setDrt0011(taskDTO.getDrt0011());
formRecord.setDrt0013(taskDTO.getDrt0013());
formRecord.setDrt0014(taskDTO.getDrt0014());
formRecord.setLocalImageUrl(taskDTO.getLocalImageUrl());
formRecord.setImgHash(taskDTO.getImgHash());
formRecord.setImageUrl(taskDTO.getImageUrl());
formRecord.setImageNo(taskDTO.getImageNo());
formRecord.setDynamicFields(taskDTO.getDynamicFields()); formRecord.setDynamicFields(taskDTO.getDynamicFields());
} }

@ -1,5 +1,6 @@
package org.jeecg.module.custom.ocr.utils; package org.jeecg.module.custom.ocr.utils;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
@ -454,6 +455,66 @@ public class ApiHelper {
return mapper.readValue(decrypedData, clazz); return mapper.readValue(decrypedData, clazz);
} }
/**
* do verify signature then decrypt
*
* @param accessCode access code
* @param resultData {@link ResultData} which to be decrypted
* @param clazz class use for {@link ObjectMapper#readValue(String, Class)} to convert JSON to object
* @return decrypted string
* @throws Exception
*/
public @Nullable static <T> T decryptResponse(String accessCode, Long time, String data, String signature,
Class<T> clazz) throws Exception {
String decrypedData = null;
// 1. verify signature
String timestamp = String.valueOf(time);
if (!verifySignature(accessCode, timestamp, data, signature)) {
throw new Exception(String.format("illegal signature: %s", signature));
}
// 2. do decrypt
byte[] bytes = decrypt(accessCode, timestamp, data);
if (bytes != null) {
decrypedData = new String(bytes, StandardCharsets.UTF_8);
}
// 3. convert to object
if (clazz.equals(String.class)) {
return (T) decrypedData;
}
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(decrypedData, clazz);
}
public @Nullable static <T> List<T> decryptListResponse(String accessCode, Long time, String data, String signature,
Class<T> clazz) throws Exception {
String decrypedData = null;
// 1. 验证签名
String timestamp = String.valueOf(time);
if (!verifySignature(accessCode, timestamp, data, signature)) {
throw new Exception(String.format("非法签名: %s", signature));
}
// 2. 解密
byte[] bytes = decrypt(accessCode, timestamp, data);
if (bytes != null) {
decrypedData = new String(bytes, StandardCharsets.UTF_8);
}
// 3. 转换为对象
if (clazz.equals(String.class)) {
return Collections.singletonList((T) decrypedData);
}
ObjectMapper mapper = new ObjectMapper();
// 反序列化为指定类型的列表
JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);
return mapper.readValue(decrypedData, listType);
}
/** /**
* do AES encrypt * do AES encrypt
* *

@ -268,3 +268,4 @@ image:
classifyPath: http://47.103.213.109/ai/api/classify/ classifyPath: http://47.103.213.109/ai/api/classify/
serverUrl: http://81.70.154.131/api/image/ serverUrl: http://81.70.154.131/api/image/
classifyBaseUrl: http://47.93.59.251/ai/api/classify/ classifyBaseUrl: http://47.93.59.251/ai/api/classify/
accessCode: ED6F7B39768AF95E87AEA8ACCCC71A6F

@ -65,6 +65,13 @@
</insert> </insert>
<delete id="deleteByTaskNo" parameterType="java.lang.Long"> <delete id="deleteByTaskNo" parameterType="java.lang.Long">
DELETE FROM task WHERE task_no = #{taskNo,jdbcType=BIGINT} DELETE FROM task WHERE task_no = #{taskNo}
</delete>
<delete id="deleteByTaskNos" parameterType="java.lang.Long">
DELETE FROM task WHERE task_no IN
<foreach collection="taskNos" item="taskNo" open="(" separator="," close=")">
#{taskNo}
</foreach>
</delete> </delete>
</mapper> </mapper>

Loading…
Cancel
Save