Browse Source

1. 修改定时回传为响应式回传

SemiWarm 5 years ago
parent
commit
8e65797f12

+ 31 - 0
src/main/java/com/pavis/ai/kwp/ioc/common/event/OcrEvent.java

@@ -0,0 +1,31 @@
+package com.pavis.ai.kwp.ioc.common.event;
+
+import org.springframework.context.ApplicationEvent;
+
+public class OcrEvent extends ApplicationEvent {
+
+    private String ocrType;
+    private String uploadId;
+
+    public OcrEvent(Object source, String ocrType, String uploadId) {
+        super(source);
+        this.ocrType = ocrType;
+        this.uploadId = uploadId;
+    }
+
+    public String getOcrType() {
+        return ocrType;
+    }
+
+    public void setOcrType(String ocrType) {
+        this.ocrType = ocrType;
+    }
+
+    public String getUploadId() {
+        return uploadId;
+    }
+
+    public void setUploadId(String uploadId) {
+        this.uploadId = uploadId;
+    }
+}

+ 55 - 0
src/main/java/com/pavis/ai/kwp/ioc/common/listener/OcrListener.java

@@ -0,0 +1,55 @@
+package com.pavis.ai.kwp.ioc.common.listener;
+
+import com.pavis.ai.kwp.ioc.common.config.properties.IocProperties;
+import com.pavis.ai.kwp.ioc.common.event.OcrEvent;
+import com.pavis.ai.kwp.ioc.mapper.GoodsLogMapper;
+import com.pavis.ai.kwp.ioc.mapper.TripLogMapper;
+import com.pavis.ai.kwp.ioc.model.GoodsLog;
+import com.pavis.ai.kwp.ioc.model.TripLog;
+import com.pavis.ai.kwp.ioc.service.CallbackService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class OcrListener {
+
+    private static final String GOODS_OCR_TYPE = "G";
+    private static final String TRIP_OCR_TYPE = "T";
+
+    @Autowired
+    private IocProperties properties;
+    @Autowired
+    private GoodsLogMapper goodsLogMapper;
+    @Autowired
+    private TripLogMapper tripLogMapper;
+    @Autowired
+    private CallbackService callbackService;
+
+    @EventListener
+    public void callback(OcrEvent event) {
+        log.info("ocr type:{}", event.getOcrType());
+        if (properties.getCallback()) {
+            if (StringUtils.equals(event.getOcrType(), GOODS_OCR_TYPE)) {
+                // 查询小票是否识别完成
+                TripLog tripLog = tripLogMapper.selectById(event.getUploadId());
+                if (tripLog.getTDone()) {
+                    log.info("小票已识别,开始回传");
+                    callbackService.callback(event.getUploadId());
+                }
+            }
+
+            if (StringUtils.equals(event.getOcrType(), TRIP_OCR_TYPE)) {
+                // 查询商品是否识别完成
+                GoodsLog goodsLog = goodsLogMapper.selectById(event.getUploadId());
+                if (goodsLog.getGDone()) {
+                    log.info("商品已识别,开始回传");
+                    callbackService.callback(event.getUploadId());
+                }
+            }
+        }
+    }
+}

+ 2 - 2
src/main/java/com/pavis/ai/kwp/ioc/common/utils/ImageUtils.java

@@ -21,8 +21,8 @@ public class ImageUtils {
         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         connection.setDoOutput(true);
         connection.setDoOutput(true);
         connection.setRequestMethod("GET");
         connection.setRequestMethod("GET");
-        connection.setConnectTimeout(6000);
-        connection.setReadTimeout(6000);
+        connection.setConnectTimeout(6000 * 5);
+        connection.setReadTimeout(6000 * 5);
         if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
         if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
             throw new ParamsException("无效图片");
             throw new ParamsException("无效图片");
         }
         }

+ 2 - 0
src/main/java/com/pavis/ai/kwp/ioc/service/CallbackService.java

@@ -3,4 +3,6 @@ package com.pavis.ai.kwp.ioc.service;
 public interface CallbackService {
 public interface CallbackService {
 
 
     void callback();
     void callback();
+
+    void callback(String uploadId);
 }
 }

+ 2 - 1
src/main/java/com/pavis/ai/kwp/ioc/service/OcrGoodsService.java

@@ -1,8 +1,9 @@
 package com.pavis.ai.kwp.ioc.service;
 package com.pavis.ai.kwp.ioc.service;
 
 
 import com.pavis.ai.kwp.ioc.dto.meta.OcrGoods;
 import com.pavis.ai.kwp.ioc.dto.meta.OcrGoods;
+import org.springframework.context.ApplicationEventPublisherAware;
 
 
-public interface OcrGoodsService {
+public interface OcrGoodsService extends ApplicationEventPublisherAware {
 
 
     void recAndSave(OcrGoods ocrGoods);
     void recAndSave(OcrGoods ocrGoods);
 
 

+ 2 - 1
src/main/java/com/pavis/ai/kwp/ioc/service/OcrTripService.java

@@ -3,8 +3,9 @@ package com.pavis.ai.kwp.ioc.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.pavis.ai.kwp.ioc.dto.meta.OcrRetDto;
 import com.pavis.ai.kwp.ioc.dto.meta.OcrRetDto;
 import com.pavis.ai.kwp.ioc.model.OcrTrip;
 import com.pavis.ai.kwp.ioc.model.OcrTrip;
+import org.springframework.context.ApplicationEventPublisherAware;
 
 
-public interface OcrTripService extends IService<OcrTrip> {
+public interface OcrTripService extends IService<OcrTrip>, ApplicationEventPublisherAware {
 
 
     void saveOcrRet(OcrRetDto ret);
     void saveOcrRet(OcrRetDto ret);
 
 

+ 23 - 0
src/main/java/com/pavis/ai/kwp/ioc/service/impl/CallbackServiceImpl.java

@@ -63,6 +63,29 @@ public class CallbackServiceImpl implements CallbackService {
         }
         }
     }
     }
 
 
+    @Override
+    public void callback(String uploadId) {
+        RecLog recLog = recLogMapper.selectByUpId(uploadId);
+        if (recLog != null) {
+            log.info("rec log:{}", JSON.toJSONString(recLog));
+            // 初始化回传日志
+            CbLog cbLog = initCbLog(recLog);
+            cbLog.setCStartTime(DateTimeUtils.dateTimeNow());
+            try {
+                Map<String, Object> cbDet = adapter(cbLog);
+                ctrService.startCallback(cbDet);
+                cbLog.setCDone(true);
+            } catch (Exception e) {
+                log.error("upload_id:{},回传失败", cbLog.getUploadId(), e);
+                cbLog.setCDone(false);
+                cbLog.setCError(e.getMessage());
+            }
+            cbLog.setCFinishTime(DateTimeUtils.dateTimeNow());
+            cbLog.setCTimeConsume(DateTimeUtils.calculateTimeConsume(cbLog.getCStartTime(), cbLog.getCFinishTime()));
+            cbLogMapper.updateById(cbLog);
+        }
+    }
+
     public CbLog initCbLog(RecLog recLog) {
     public CbLog initCbLog(RecLog recLog) {
         CbLog cbLog = cbLogMapper.selectById(recLog.getUploadId());
         CbLog cbLog = cbLogMapper.selectById(recLog.getUploadId());
         if (StringUtils.isNotBlank(recLog.getTError())) {
         if (StringUtils.isNotBlank(recLog.getTError())) {

+ 3 - 0
src/main/java/com/pavis/ai/kwp/ioc/service/impl/CtrServiceImpl.java

@@ -49,11 +49,14 @@ public class CtrServiceImpl implements CtrService {
     public IrRes startRequest(String uploadId, String goodsImg) throws Exception {
     public IrRes startRequest(String uploadId, String goodsImg) throws Exception {
         String accessToken = accessToken();
         String accessToken = accessToken();
         if (StringUtils.isNotBlank(accessToken)) {
         if (StringUtils.isNotBlank(accessToken)) {
+            log.info("img start transform to base64");
             String imgBase64Str = ImageUtils.imgUrl2Base64(goodsImg);
             String imgBase64Str = ImageUtils.imgUrl2Base64(goodsImg);
+            log.info("img finish transform to base64");
             Map<String, Object> map = Maps.newHashMap();
             Map<String, Object> map = Maps.newHashMap();
             map.put("access_token", accessToken);
             map.put("access_token", accessToken);
             map.put("image", imgBase64Str);
             map.put("image", imgBase64Str);
             map.put("request_id", uploadId);
             map.put("request_id", uploadId);
+            log.info("baidu ir rec start");
             String res = irClient.ir(map);
             String res = irClient.ir(map);
             log.info("baidu ir res:{}", res);
             log.info("baidu ir res:{}", res);
             return JSONObject.parseObject(res, IrRes.class);
             return JSONObject.parseObject(res, IrRes.class);

+ 16 - 5
src/main/java/com/pavis/ai/kwp/ioc/service/impl/OcrGoodsServiceImpl.java

@@ -2,6 +2,7 @@ package com.pavis.ai.kwp.ioc.service.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Maps;
+import com.pavis.ai.kwp.ioc.common.event.OcrEvent;
 import com.pavis.ai.kwp.ioc.common.utils.DateTimeUtils;
 import com.pavis.ai.kwp.ioc.common.utils.DateTimeUtils;
 import com.pavis.ai.kwp.ioc.dto.meta.IrRes;
 import com.pavis.ai.kwp.ioc.dto.meta.IrRes;
 import com.pavis.ai.kwp.ioc.dto.meta.IrRet;
 import com.pavis.ai.kwp.ioc.dto.meta.IrRet;
@@ -15,6 +16,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.List;
 import java.util.List;
@@ -24,6 +26,8 @@ import java.util.Map;
 @Service
 @Service
 public class OcrGoodsServiceImpl implements OcrGoodsService {
 public class OcrGoodsServiceImpl implements OcrGoodsService {
 
 
+    private ApplicationEventPublisher applicationEventPublisher;
+
     @Autowired
     @Autowired
     private CtrService ctrService;
     private CtrService ctrService;
     @Autowired
     @Autowired
@@ -42,6 +46,7 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
     // @Async("recAndSaveExecutor")
     // @Async("recAndSaveExecutor")
     @Override
     @Override
     public void recAndSave(OcrGoods ocrGoods) {
     public void recAndSave(OcrGoods ocrGoods) {
+        log.info("start rec and save");
         QueryWrapper<UpGoods> ugw = new QueryWrapper<>();
         QueryWrapper<UpGoods> ugw = new QueryWrapper<>();
         ugw.lambda().eq(UpGoods::getUploadId, ocrGoods.getUploadId());
         ugw.lambda().eq(UpGoods::getUploadId, ocrGoods.getUploadId());
         List<UpGoods> upGoods = upGoodsMapper.selectList(ugw);
         List<UpGoods> upGoods = upGoodsMapper.selectList(ugw);
@@ -62,6 +67,8 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
             } else {
             } else {
                 goodsLog.setGError(false);
                 goodsLog.setGError(false);
                 goodsLog.setGDone(true);
                 goodsLog.setGDone(true);
+                // 通知监听器
+                applicationEventPublisher.publishEvent(new OcrEvent(this, "G", ocrGoods.getUploadId()));
             }
             }
             goodsLog.setGFinishTime(DateTimeUtils.dateTimeNow());
             goodsLog.setGFinishTime(DateTimeUtils.dateTimeNow());
             goodsLog.setGTimeConsume(DateTimeUtils.calculateTimeConsume(goodsLog.getGStartTime(), goodsLog.getGFinishTime()));
             goodsLog.setGTimeConsume(DateTimeUtils.calculateTimeConsume(goodsLog.getGStartTime(), goodsLog.getGFinishTime()));
@@ -105,11 +112,15 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
             } else {
             } else {
                 goodsLog.setGError(false);
                 goodsLog.setGError(false);
                 goodsLog.setGDone(true);
                 goodsLog.setGDone(true);
+                // 通知监听器
+                applicationEventPublisher.publishEvent(new OcrEvent(this, "G", goodsLog.getUploadId()));
             }
             }
             goodsLog.setTimes(goodsLog.getTimes() + 1);
             goodsLog.setTimes(goodsLog.getTimes() + 1);
         } else {
         } else {
             goodsLog.setGError(true);
             goodsLog.setGError(true);
             goodsLog.setGDone(true);
             goodsLog.setGDone(true);
+            // 通知监听器
+            applicationEventPublisher.publishEvent(new OcrEvent(this, "G", goodsLog.getUploadId()));
         }
         }
         goodsLogMapper.updateById(goodsLog);
         goodsLogMapper.updateById(goodsLog);
     }
     }
@@ -120,7 +131,6 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
         // 检查是否已有识别结果
         // 检查是否已有识别结果
         List<SubImg> subImgList = subImgMapper.selectList(wrapper);
         List<SubImg> subImgList = subImgMapper.selectList(wrapper);
         if (CollectionUtils.isEmpty(subImgList)) {
         if (CollectionUtils.isEmpty(subImgList)) {
-            GoodsLog goodsLog = goodsLogMapper.selectById(uploadId);
             IrRes res = null;
             IrRes res = null;
             try {
             try {
                 res = ctrService.startRequest(uploadId, ug.getGoodsImg());
                 res = ctrService.startRequest(uploadId, ug.getGoodsImg());
@@ -133,7 +143,6 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
                         .build();
                         .build();
                 errGoodsMapper.insert(err);
                 errGoodsMapper.insert(err);
                 log.error("商品图片:{},识别出错:{}", ug.getGoodsImg(), e.getMessage());
                 log.error("商品图片:{},识别出错:{}", ug.getGoodsImg(), e.getMessage());
-                goodsLog.setGError(true);
             }
             }
             if (res != null) {
             if (res != null) {
                 if (StringUtils.isBlank(res.getErrorCode())) {
                 if (StringUtils.isBlank(res.getErrorCode())) {
@@ -147,7 +156,6 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
                             .createTime(DateTimeUtils.dateTimeNow())
                             .createTime(DateTimeUtils.dateTimeNow())
                             .build();
                             .build();
                     errGoodsMapper.insert(err);
                     errGoodsMapper.insert(err);
-                    goodsLog.setGError(true);
                 }
                 }
             } else {
             } else {
                 ErrGoods err = ErrGoods.builder()
                 ErrGoods err = ErrGoods.builder()
@@ -157,9 +165,7 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
                         .createTime(DateTimeUtils.dateTimeNow())
                         .createTime(DateTimeUtils.dateTimeNow())
                         .build();
                         .build();
                 errGoodsMapper.insert(err);
                 errGoodsMapper.insert(err);
-                goodsLog.setGError(true);
             }
             }
-            goodsLogMapper.updateById(goodsLog);
         }
         }
     }
     }
 
 
@@ -194,4 +200,9 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
             errGoodsMapper.insert(err);
             errGoodsMapper.insert(err);
         }
         }
     }
     }
+
+    @Override
+    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
+        this.applicationEventPublisher = applicationEventPublisher;
+    }
 }
 }

+ 11 - 0
src/main/java/com/pavis/ai/kwp/ioc/service/impl/OcrTripServiceImpl.java

@@ -2,6 +2,7 @@ package com.pavis.ai.kwp.ioc.service.impl;
 
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pavis.ai.kwp.ioc.common.config.Constants;
 import com.pavis.ai.kwp.ioc.common.config.Constants;
+import com.pavis.ai.kwp.ioc.common.event.OcrEvent;
 import com.pavis.ai.kwp.ioc.common.utils.DateTimeUtils;
 import com.pavis.ai.kwp.ioc.common.utils.DateTimeUtils;
 import com.pavis.ai.kwp.ioc.dto.meta.OcrRetDto;
 import com.pavis.ai.kwp.ioc.dto.meta.OcrRetDto;
 import com.pavis.ai.kwp.ioc.dto.meta.OcrTripDto;
 import com.pavis.ai.kwp.ioc.dto.meta.OcrTripDto;
@@ -18,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
@@ -28,6 +30,8 @@ import java.util.List;
 @Transactional(rollbackFor = Exception.class)
 @Transactional(rollbackFor = Exception.class)
 public class OcrTripServiceImpl extends ServiceImpl<OcrTripMapper, OcrTrip> implements OcrTripService {
 public class OcrTripServiceImpl extends ServiceImpl<OcrTripMapper, OcrTrip> implements OcrTripService {
 
 
+    private ApplicationEventPublisher applicationEventPublisher;
+
     @Autowired
     @Autowired
     private TripLogMapper tripLogMapper;
     private TripLogMapper tripLogMapper;
     @Autowired
     @Autowired
@@ -75,6 +79,13 @@ public class OcrTripServiceImpl extends ServiceImpl<OcrTripMapper, OcrTrip> impl
             tripLog.setTDone(true);
             tripLog.setTDone(true);
             tripLogMapper.updateById(tripLog);
             tripLogMapper.updateById(tripLog);
         }
         }
+
+        // 通知监听器
+        applicationEventPublisher.publishEvent(new OcrEvent(this, "T", ret.getUploadId()));
     }
     }
 
 
+    @Override
+    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
+        this.applicationEventPublisher = applicationEventPublisher;
+    }
 }
 }

+ 1 - 0
src/main/java/com/pavis/ai/kwp/ioc/service/impl/RabbitMqServiceImpl.java

@@ -33,6 +33,7 @@ public class RabbitMqServiceImpl implements RabbitMqService {
         if (StringUtils.isNotBlank(message)) {
         if (StringUtils.isNotBlank(message)) {
             OcrGoods params = JSONObject.parseObject(message, OcrGoods.class);
             OcrGoods params = JSONObject.parseObject(message, OcrGoods.class);
             try {
             try {
+                log.info("ready to rec and save");
                 ocrGoodsService.recAndSave(params);
                 ocrGoodsService.recAndSave(params);
             } catch (Exception e) {
             } catch (Exception e) {
                 log.error("RecAndSave Error", e);
                 log.error("RecAndSave Error", e);

+ 1 - 0
src/main/java/com/pavis/ai/kwp/ioc/service/impl/UpServiceImpl.java

@@ -67,6 +67,7 @@ public class UpServiceImpl implements UpService {
         // 发送要是识别的数据,队列
         // 发送要是识别的数据,队列
         sendService.sendTripToOcr(upParams.getUploadId(), upParams.getTripType(), upParams.getTripImgs());
         sendService.sendTripToOcr(upParams.getUploadId(), upParams.getTripType(), upParams.getTripImgs());
         sendService.sendGoodsToOcr(upParams.getUploadId(), upParams.getGoodsImgs());
         sendService.sendGoodsToOcr(upParams.getUploadId(), upParams.getGoodsImgs());
+        log.info("开始识别...");
         return ResUtils.ok("上传成功", params.get("uploadId"));
         return ResUtils.ok("上传成功", params.get("uploadId"));
     }
     }
 }
 }

+ 4 - 3
src/main/resources/application-test.yml

@@ -27,6 +27,7 @@ feign:
 logging:
 logging:
   file: logs/test.log
   file: logs/test.log
   level:
   level:
-    org.springframework.cloud: error
-    org.springframework.boot: error
-    com.pavis.ai.kwp.ioc.mapper: error
+    org.springframework.cloud: debug
+    org.springframework.boot: debug
+    com.pavis.ai.kwp.ioc.mapper: error
+    com.pavis.ai.kwp.ioc.service: debug

+ 1 - 1
src/main/resources/application.yml

@@ -9,4 +9,4 @@ spring:
     active: prod
     active: prod
 mybatis-plus:
 mybatis-plus:
   mapper-locations: classpath*:/mapper/*Mapper.xml
   mapper-locations: classpath*:/mapper/*Mapper.xml
-  typeAliasesPackage: com.pavis.ai.kwp.ioc.model
+  typeAliasesPackage: com.pavis.ai.kwp.ioc.model