Przeglądaj źródła

算法服务兼容V6平台

linfutong 2 lat temu
rodzic
commit
e66c9cbc2c

+ 13 - 0
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/config/AlgorithmYml.java

@@ -78,6 +78,11 @@ public class AlgorithmYml {
      */
     boolean loudspeakerSwitch = false;
 
+    /**
+     * 算法平台:V5 OR V6
+     */
+    String platform;
+
     public boolean isLoudspeakerSwitch() {
         return loudspeakerSwitch;
     }
@@ -158,6 +163,14 @@ public class AlgorithmYml {
         this.checkLogUrl = checkLogUrl;
     }
 
+    public String getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
     public static class VideoCheckValid {
         @NotNull(message = "描述不能为空")
         String tips;

+ 142 - 23
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/CheckService.java

@@ -39,6 +39,7 @@ import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
@@ -48,6 +49,8 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.util.*;
 import static com.zd.alg.forward.utils.HttpUtils.*;
 
@@ -128,25 +131,56 @@ public class CheckService {
             for (String code : checkItem) {
                 //========= 获取算法INFO ===========
                 AlgorithmYml.CheckValid checkValid = algorithmYml.getCheckValid(Integer.valueOf(code));
-                MultiValueMap<String, Object> params = getStringObjectMultiValueMap(checkValid, String.valueOf(id));
-                HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(toFile, params);
+
                 //添加一条算法请求记录
                 R alg = insertRequestRecordLog(orgImgUrl, subId, checkValid);
                 logger.info("【调用算法服务】 添加算法调用日志,添加结果:"+JSONObject.toJSONString(alg));
-                ImgPostResponse<AnalysisReturnData> send = HttpUtils.sendV5(restTemplateLocal, files, algorithmYml);
-                //算法记录更新
-                if (alg.getCode() == 200) {
-                    updateRequestRecordLog(alg.getData() != null?Long.valueOf(alg.getData()+""):null, send);
-                    logger.info("【调用算法服务】 更新算法调用日志记录");
-                }
-                //判断算法
-                if (send == null || send.getStatus_code() != 1000) {
-                    assert send != null;
-                    logger.error("【调用算法服务】 算法服务调用失败,响应信息:"+ JSONObject.toJSONString(send));
-                    return R.fail("算法服务错误,请重试!");
+                Map<String, Object> result = new HashMap<>();
+                long status_code = 0;
+                //V5
+                if (algorithmYml.getPlatform() == null || "V5".equals(algorithmYml.getPlatform())) {
+                    logger.info("【调用算法服务V5】 进入调用...........");
+                    MultiValueMap<String, Object> params = getStringObjectMultiValueMap(checkValid, String.valueOf(id));
+                    HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(toFile,"image", params);
+                    ImgPostResponse<AnalysisReturnData> send = HttpUtils.sendV5(restTemplateLocal, files, algorithmYml);
+                    //算法记录更新
+                    if (alg.getCode() == 200) {
+                        updateRequestRecordLogV5(alg.getData() != null?Long.valueOf(alg.getData()+""):null, send);
+                        logger.info("【调用算法服务V5】 更新算法调用日志记录");
+                    }
+                    //判断算法
+                    if (send == null || send.getStatus_code() != 1000) {
+                        assert send != null;
+                        logger.error("【调用算法服务V5】 算法服务调用失败,响应信息:"+ JSONObject.toJSONString(send));
+                        return R.fail("算法服务错误,请重试!");
+                    }
+                    AnalysisReturnData data = send.getData();
+                    result = (Map<String, Object>) data.getResult();
+                    status_code = send.getStatus_code();
+                } else {
+                    //V6
+                    logger.info("【调用算法服务V6】 进入调用...........");
+                    MultiValueMap<String, Object> params = generateParamsForV6(checkValid, String.valueOf(id));
+                    HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(toFile,"file", params);
+                    ImgPostResponse<DataPostAnalysisRespDto> send = HttpUtils.send(restTemplateLocal, files, algorithmYml);
+                    //logger.info("【调用算法服务V6】 响应结果:  \n", JSONObject.toJSONString(send));
+                    //算法记录更新
+                    if (alg.getCode() == 200) {
+                        updateRequestRecordLogV6(alg.getData() != null?Long.valueOf(alg.getData()+""):null, send);
+                        logger.info("【调用算法服务V6】 更新算法调用日志记录");
+                    }
+                    //判断算法
+                    if (send == null || send.getStatus_code() != 1000) {
+                        assert send != null;
+                        logger.error("【调用算法服务v6】 算法服务调用失败,响应信息:"+ JSONObject.toJSONString(send));
+                        return R.fail("算法服务错误,请重试!");
+                    }
+                    DataPostAnalysisRespDto data = send.getData();
+                    result = (Map<String, Object>) data.getAnalysisDatas().get(0).getResult();
+                    status_code = send.getStatus_code();
                 }
-                AnalysisReturnData data = send.getData();
-                Map<String, Object> result = (Map<String, Object>) data.getResult();
+                //AnalysisReturnData data = send.getData();
+                //Map<String, Object> result = (Map<String, Object>) data.getResult();
                 Map<String, Object> algorithmData = (Map<String, Object>) result.get("algorithm_data");
                 Map<String, Object> modelResult = (Map<String, Object>) result.get("model_data");
                 List<Map<String, Object>> objects = (List<Map<String, Object>>) modelResult.get("objects");
@@ -169,7 +203,7 @@ public class CheckService {
                     }
                     return R.fail(300, "算法识别未通过", code);
                 }
-                Boolean f = send.getStatus_code() == 1000;
+                Boolean f = status_code == 1000;
                 String msg = f ? "解析成功!" : "解析失败!";
                 send(code, id, f, msg);
             }
@@ -183,6 +217,21 @@ public class CheckService {
     }
 
     /**
+     * 算法V6平台参数
+     * @param checkValid
+     * @param extension
+     * @return
+     */
+    private static MultiValueMap<String, Object> generateParamsForV6(AlgorithmYml.CheckValid checkValid, String extension) {
+        MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
+        form.add("sync", 1);
+        form.add("timeStamp", LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli() / 1000);
+        form.add("extension", extension);
+        form.add("algoId", checkValid.getAlgoId());
+        form.add("did", checkValid.getDid());
+        return form;
+    }
+    /**
      * 添加日志记录
      * @param fileUrl
      * @param subId
@@ -201,19 +250,19 @@ public class CheckService {
 
 
     /**
-     * 算法调用日志更新
+     * 算法调用日志更新V5
      * @param id
      * @param send
      */
-    private void updateRequestRecordLog(Long id,ImgPostResponse<AnalysisReturnData> send) {
+    private void updateRequestRecordLogV5(Long id,ImgPostResponse<AnalysisReturnData> send) {
         Algorithm algorithm = new Algorithm();
         algorithm.setId(id);
         //请求成功
         if (send != null && send.getStatus_code() == 1000) {
-            AnalysisReturnData data =  send.getData();
+            AnalysisReturnData data = send.getData();
             //识别后的图片
             String picture = data.getRet_image();
-            String header = "data:image/jpeg;base64,"+picture;
+            String header = "data:image/jpeg;base64," + picture;
             MultipartFile multipartFile = Base64DecodedMultipartFile.base64ToMultipart(header);
             R<SysFile> sysFileR = remoteFileService.upload(multipartFile);
             String imageUrl = sysFileR.getData().getUrl();
@@ -221,13 +270,13 @@ public class CheckService {
             //识别id
             algorithm.setSignId(Long.parseLong(data.getCid()));
             //是否报警
-            Map<String, Object> result =(Map<String, Object>)data.getResult();
+            Map<String, Object> result = (Map<String, Object>) data.getResult();
             Map<String, Object> algorithmData = (Map<String, Object>) result.get("algorithm_data");
             Map<String, Object> modelResult = (Map<String, Object>) result.get("model_data");
             List<Map<String, Object>> objects = (List<Map<String, Object>>) modelResult.get("objects");
-            if(algorithmData.getOrDefault("is_alert", "").toString().equals("false")){
+            if (algorithmData.getOrDefault("is_alert", "").toString().equals("false")) {
                 algorithm.setIsAlarm(0);
-            }else{
+            } else {
                 algorithm.setIsAlarm(1);
             }
             algorithm.setStatus(1);
@@ -259,6 +308,76 @@ public class CheckService {
     }
 
     /**
+     * 算法调用日志更新V5
+     * @param id
+     * @param send
+     */
+    private void updateRequestRecordLogV6(Long id,ImgPostResponse<DataPostAnalysisRespDto> send) {
+        try {
+            Algorithm algorithm = new Algorithm();
+            algorithm.setId(id);
+            //请求成功
+            if (send != null && send.getStatus_code() == 1000) {
+                DataPostAnalysisRespDto analysisRespDto = send.getData();
+                List<AnalysisData> analysisDatas = analysisRespDto.getAnalysisDatas();
+                if (!analysisDatas.isEmpty() && analysisDatas.size() > 0) {
+                    AnalysisData data = analysisDatas.get(0);
+                    if (StringUtils.isNotEmpty(data.getRet_image())) {
+                        String header = "data:image/jpeg;base64," + data.getRet_image();
+                        MultipartFile multipartFile = Base64DecodedMultipartFile.base64ToMultipart(header);
+                        //识别后的图片
+                        R<SysFile> sysFileR = remoteFileService.upload(multipartFile);
+                        String imageUrl = sysFileR.getData().getUrl();
+                        algorithm.setAlgorithmResult(imageUrl);
+                    }
+                    //识别id
+                    algorithm.setSignId(Long.parseLong(analysisRespDto.getAid()+""));
+                    //是否报警
+                    if (data.getResult() != null) {
+                        Map<String, Object> result =(Map<String, Object>)data.getResult();
+                        Map<String, Object> algorithmData = (Map<String, Object>) result.get("algorithm_data");
+                        Map<String, Object> modelResult = (Map<String, Object>) result.get("model_data");
+                        List<Map<String, Object>> objects = (List<Map<String, Object>>) modelResult.get("objects");
+                        if(algorithmData.getOrDefault("is_alert", "").toString().equals("false") && objects.size() > 0){
+                            algorithm.setIsAlarm(0);
+                        }else{
+                            algorithm.setIsAlarm(1);
+                        }
+                        algorithm.setStatus(1);
+                    }
+                }
+            } else {
+                algorithm.setStatus(0);
+            }
+            //存原始数据
+            if (send != null) {
+                if (send.getData() != null) {
+                    DataPostAnalysisRespDto respData = send.getData();
+                    if (respData.getAnalysisDatas() != null && respData.getAnalysisDatas().size() > 0) {
+                        List<AnalysisData> list = respData.getAnalysisDatas();
+                        list.stream().forEach(a -> {
+                            a.setRet_image("");
+                            a.setSrc_image("");
+                        });
+                    }
+                    algorithm.setRespData(JSONObject.toJSONString(respData));
+                } else {
+                    algorithm.setRespData(JSONObject.toJSONString(send));
+                }
+                algorithm.setRespCode(send.getStatus_code());
+            } else {
+                algorithm.setRespCode(0L);
+                algorithm.setRespData("算法服务未响应");
+            }
+            algorithm.setUpdateTime(new Date());
+            //logger.info("【算法服务】 更新日志实体信息:"+JSONObject.toJSONString(algorithm));
+            laboratoryService.update(algorithm);
+        } catch (Exception e) {
+            logger.info("【调用算法服务V6】 更新日志异常,", e);
+        }
+    }
+
+    /**
      * @param id 进出记录ID
      */
     public R checkAndCommit(String code, MultipartFile file, Long id) {

+ 1 - 1
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/FireImageService.java

@@ -110,7 +110,7 @@ public class FireImageService {
             throw new ServiceException("未配置火焰算法ID");
         }
         MultiValueMap<String, Object> params = HttpUtils.getMultiValueMap(fireProperties, null);
-        HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(file, params);
+        HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(file, "image", params);
         ImgPostResponse<DataPostAnalysisRespDto> send = HttpUtils.send(restTemplate, files, algorithmYml);
         if (send == null || send.getStatus_code() != SUCCESS_CODE) {
             assert send != null;

+ 4 - 4
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/utils/HttpUtils.java

@@ -34,19 +34,19 @@ public class HttpUtils {
     /**
      * 构造算法文件逆流
      */
-    public static HttpEntity<MultiValueMap<String, Object>> getHttpEntityMap(File file, MultiValueMap<String, Object> params) {
+    public static HttpEntity<MultiValueMap<String, Object>> getHttpEntityMap(File file, String key, MultiValueMap<String, Object> params) {
         //设置请求头
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.MULTIPART_FORM_DATA);
         //文件转为文件系统资源
-        return getHttpEntity(file, params, headers);
+        return getHttpEntity(file,key,  params, headers);
     }
 
-    private static HttpEntity<MultiValueMap<String, Object>> getHttpEntity(File file, MultiValueMap<String, Object> params, HttpHeaders headers) {
+    private static HttpEntity<MultiValueMap<String, Object>> getHttpEntity(File file, String key, MultiValueMap<String, Object> params, HttpHeaders headers) {
         //文件转为文件系统资源
         FileSystemResource fileSystemResource = new FileSystemResource(file);
         //设置请求体,注意是LinkedMultiValueMap
-        MultiValueMap<String, Object> form = getStringObjectMultiValueMap(fileSystemResource,"image");
+        MultiValueMap<String, Object> form = getStringObjectMultiValueMap(fileSystemResource,key);
         form.addAll(params);
         //用HttpEntity封装整个请求报文
         return new HttpEntity<>(form, headers);