From 9fc1177fb8a16510eda36cb4a9613b709a3dbdba Mon Sep 17 00:00:00 2001 From: luyie Date: Mon, 19 Aug 2024 20:10:15 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A4=A7=E6=A8=A1=E5=9E=8B=E5=88=86?= =?UTF-8?q?=E6=9E=90=E5=A2=9E=E5=8A=A0=E5=A4=9A=E5=9C=BA=E6=99=AF=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bigmodel/api/dto/BigModelAnalysisDTO.java | 20 ---- .../api/dto/BigModelAnalysisRequestDTO.java | 26 +++++ .../api/dto/BigModelAnalysisResponseDTO.java | 56 ++++++++++ .../api/feign/IBigModelAnalysisClient.java | 5 +- .../bigmodel/api/feign/BigModelAnalysisClient.java | 9 +- .../controller/ZhipuAnalysisInfoController.java | 4 +- .../zhipuai/entity/ZhipuAnalysisInfoEntity.java | 5 +- .../handler/AbstractZhipuAnalysisHandler.java | 6 ++ .../bigmodel/zhipuai/handler/ResultStrategy.java | 4 +- .../bigmodel/zhipuai/handler/ZhipuAnalyser.java | 32 ++++-- .../zhipuai/handler/ZhipuAnalysisHandlerGlm4v.java | 12 +-- .../zhipuai/service/ZhipuAnalysisService.java | 4 + .../service/impl/ZhipuAnalysisServiceImpl.java | 119 ++++++++++++++++++++- .../zhipuai/vo/ZhipuAnalysisFileRequest.java | 11 +- .../bigmodel/zhipuai/vo/ZhipuAnalysisResult.java | 2 +- hzims-service/inspect/pom.xml | 4 + .../inspect/task/schedule/VideoTaskSchedule.java | 62 +++++++---- 17 files changed, 303 insertions(+), 78 deletions(-) delete mode 100644 hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisDTO.java create mode 100644 hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisRequestDTO.java create mode 100644 hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisResponseDTO.java diff --git a/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisDTO.java b/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisDTO.java deleted file mode 100644 index 5694e33..0000000 --- a/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.hnac.hzims.bigmodel.api.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @Author: ypj - * @Date: 2024/8/12 16:02 - */ -@Data -@ApiModel(value = "大模型分析",description = "大模型分析参数") -public class BigModelAnalysisDTO { - - @ApiModelProperty("策略编码") - private String code; - - @ApiModelProperty("文件地址或文件的base64文件内容") - private String url; -} diff --git a/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisRequestDTO.java b/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisRequestDTO.java new file mode 100644 index 0000000..18dbbbd --- /dev/null +++ b/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisRequestDTO.java @@ -0,0 +1,26 @@ +package com.hnac.hzims.bigmodel.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @Author: ypj + * @Date: 2024/8/12 16:02 + */ +@Data +@ApiModel(value = "大模型分析",description = "大模型分析参数") +public class BigModelAnalysisRequestDTO { + + @ApiModelProperty("策略编码") + private List codeList; + + @ApiModelProperty(value = "检测类型子类") + private List checkTypeSonList; + + @ApiModelProperty("文件地址或文件的base64文件内容") + private String url; +} diff --git a/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisResponseDTO.java b/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisResponseDTO.java new file mode 100644 index 0000000..9869fe1 --- /dev/null +++ b/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisResponseDTO.java @@ -0,0 +1,56 @@ +package com.hnac.hzims.bigmodel.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Optional; + +/** + * @Author: ypj + * @Date: 2024/8/19 10:38 + */ +@Data +@ApiModel(description = "分析返回信息") +public class BigModelAnalysisResponseDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "是否成功", required = true) + private Boolean success = null; + + @ApiModelProperty(value = "分析结果数据列表") + private List data; + + @ApiModelProperty(value = "状态码", required = true) + private int code; + + @ApiModelProperty(value = "返回消息") + private String msg; + + + @Data + @ApiModel(description = "分析结果") + public static class BigModelAnalysisResult implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "承载数据") + private Object result; + + @ApiModelProperty(value = "结果字符串") + private String resultStr; + + @ApiModelProperty(value = "结果描述") + private String description; + + @ApiModelProperty(value = "结果描述") + private String checkTypeSon; + } + + public Boolean getSuccess() { + return Optional.ofNullable(success).orElse(Boolean.FALSE); + } +} diff --git a/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/feign/IBigModelAnalysisClient.java b/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/feign/IBigModelAnalysisClient.java index da57522..e839026 100644 --- a/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/feign/IBigModelAnalysisClient.java +++ b/hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/feign/IBigModelAnalysisClient.java @@ -1,7 +1,8 @@ package com.hnac.hzims.bigmodel.api.feign; import com.hnac.hzims.bigmodel.BigModelConstants; -import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisDTO; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO; import org.springblade.core.tool.api.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -16,5 +17,5 @@ public interface IBigModelAnalysisClient { String PREFIX_API = "feign/bigModel"; @PostMapping(PREFIX_API + "/analysis") - R analysis(@RequestBody BigModelAnalysisDTO analysisInfo); + BigModelAnalysisResponseDTO analysis(@RequestBody BigModelAnalysisRequestDTO analysisInfo); } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/api/feign/BigModelAnalysisClient.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/api/feign/BigModelAnalysisClient.java index bb0532d..7e2fac1 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/api/feign/BigModelAnalysisClient.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/api/feign/BigModelAnalysisClient.java @@ -1,10 +1,9 @@ package com.hnac.hzims.bigmodel.api.feign; -import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisDTO; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO; import com.hnac.hzims.bigmodel.zhipuai.service.ZhipuAnalysisService; -import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileRequest; import lombok.AllArgsConstructor; -import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,7 +19,7 @@ public class BigModelAnalysisClient implements IBigModelAnalysisClient { @Override @PostMapping(PREFIX_API + "/analysis") - public R analysis(BigModelAnalysisDTO analysisInfo) { - return R.data(analysisService.analysis(ZhipuAnalysisFileRequest.of(analysisInfo))); + public BigModelAnalysisResponseDTO analysis(BigModelAnalysisRequestDTO analysisInfo) { + return analysisService.multiAnalysis(analysisInfo); } } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/controller/ZhipuAnalysisInfoController.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/controller/ZhipuAnalysisInfoController.java index 905710f..ce4664c 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/controller/ZhipuAnalysisInfoController.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/controller/ZhipuAnalysisInfoController.java @@ -32,7 +32,7 @@ public class ZhipuAnalysisInfoController { @PostMapping("/save") @ApiOperation("保存智谱分析信息") @ApiOperationSupport(order = 1) - public R save(@RequestBody @Validated ZhipuAnalysisInfoVO request) { + public R save(@RequestBody ZhipuAnalysisInfoVO request) { return R.status(analysisInfoService.save(request.toEntity())); } @@ -53,7 +53,7 @@ public class ZhipuAnalysisInfoController { @PutMapping("/update") @ApiOperation("更新智谱分析配置信息") @ApiOperationSupport(order = 4) - public R update(@RequestBody @Validated ZhipuAnalysisInfoEntity requestData) { + public R update(@RequestBody ZhipuAnalysisInfoEntity requestData) { return R.status(analysisInfoService.updateById(requestData)); } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/entity/ZhipuAnalysisInfoEntity.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/entity/ZhipuAnalysisInfoEntity.java index 4712811..ff583d4 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/entity/ZhipuAnalysisInfoEntity.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/entity/ZhipuAnalysisInfoEntity.java @@ -7,7 +7,6 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.support.QueryField; import org.springblade.core.tenant.mp.TenantEntity; @@ -25,6 +24,10 @@ public class ZhipuAnalysisInfoEntity extends TenantEntity { @TableField("CODE") private String code; + @ApiModelProperty(value = "对应字典表“AI识别类型”的key值") + @TableField("CHECK_TYPE_SON") + private String checkTypeSon; + @ApiModelProperty(value = "策略名称") @TableField("NAME") @QueryField(condition = SqlCondition.LIKE) diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/AbstractZhipuAnalysisHandler.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/AbstractZhipuAnalysisHandler.java index 09fa6dd..62a19ec 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/AbstractZhipuAnalysisHandler.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/AbstractZhipuAnalysisHandler.java @@ -1,6 +1,7 @@ package com.hnac.hzims.bigmodel.zhipuai.handler; import com.zhipu.oapi.ClientV4; +import lombok.Data; import javax.annotation.Resource; @@ -8,10 +9,15 @@ import javax.annotation.Resource; * @Author: ypj * @Date: 2024/8/12 8:44 */ +@Data public abstract class AbstractZhipuAnalysisHandler implements ZhipuAnalyser { protected final String requestIdTemplate = "big_model-%d"; @Resource protected ClientV4 client; + private String text; + + private String url; + } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ResultStrategy.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ResultStrategy.java index 3ae3c7e..b86adea 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ResultStrategy.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ResultStrategy.java @@ -36,8 +36,8 @@ public interface ResultStrategy { return originalData; } - default T getResult(ZhipuAnalysisInfoEntity info, String originalData) { - return getResult(info, convertOriginalData(originalData, info.getResultType())); + default T getResult(ZhipuAnalysisInfoEntity info, String originalValue) { + return getResult(info, convertOriginalData(originalValue, info.getResultType())); } T getResult(ZhipuAnalysisInfoEntity info, Object resultData); diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalyser.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalyser.java index 9de7349..6b22484 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalyser.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalyser.java @@ -1,32 +1,50 @@ package com.hnac.hzims.bigmodel.zhipuai.handler; -import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; import org.springblade.core.tool.jackson.JsonUtil; import java.util.Map; +import java.util.Optional; /** * @Author: ypj * @Date: 2024/8/8 14:45 */ public interface ZhipuAnalyser { + String QUESTION_PROFILE = "## Profile\n"; + + String QUESTION_CONSTRAINS = "## Constrains\n"; + + String QUESTION_OUTPUT_FORMAT = "## OutputFormat\n"; String getAnalysisStrategy(); String getAnalysisModel(); + String getUrl(); + + void setUrl(String url); + + String getText(); + + void setText(String text); + default boolean isSupport(String strategyCode) { return getAnalysisStrategy().equals(strategyCode); } - Resp sendRequest(ZhipuAnalysisInfoEntity info, String url); + Resp sendRequest(String text, String url); - Req getRequest(ZhipuAnalysisInfoEntity info, String url); + Req getRequest(String text, String url); - String getResult(ZhipuAnalysisInfoEntity info, String url); + String getResult(String text, String url); + + default Map getResultMap(String text, String url) { + String result = getResult(text, url); + return Optional.ofNullable(result).map(str -> JsonUtil.toMap(result)).orElse(null); + } - default Object getResultValue(ZhipuAnalysisInfoEntity info, String url) { - Map resultMap = JsonUtil.toMap(getResult(info, url)); - return resultMap.get(info.getResultKey()); + default Object getResultValue(String text, String key, String url) { + Map resultMap = getResultMap(text, url); + return Optional.ofNullable(resultMap).map(data -> data.get(key)).orElse(null); } } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalysisHandlerGlm4v.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalysisHandlerGlm4v.java index 23c7767..e56b0f3 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalysisHandlerGlm4v.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalysisHandlerGlm4v.java @@ -33,19 +33,19 @@ public class ZhipuAnalysisHandlerGlm4v extends AbstractZhipuAnalysisHandler { } @Override - public ModelApiResponse sendRequest(ZhipuAnalysisInfoEntity info, String url) { - ChatCompletionRequest request = getRequest(info, url); + public ModelApiResponse sendRequest(String text, String url) { + ChatCompletionRequest request = getRequest(text, url); log.info("send zhipu ai request :{}", Optional.ofNullable(request).map(req -> JsonUtil.toJson(req)).orElse("null")); return client.invokeModelApi(request); } @Override - public ChatCompletionRequest getRequest(ZhipuAnalysisInfoEntity info, String url) { + public ChatCompletionRequest getRequest(String text, String url) { List messages = new ArrayList<>(); List> contentList = new ArrayList<>(); Map textMap = new HashMap<>(); textMap.put("type", "text"); - textMap.put("text", info.getRequestContent()); + textMap.put("text", text); Map typeMap = new HashMap<>(); typeMap.put("type", "image_url"); Map urlMap = new HashMap<>(); @@ -68,8 +68,8 @@ public class ZhipuAnalysisHandlerGlm4v extends AbstractZhipuAnalysisHandler { } @Override - public String getResult(ZhipuAnalysisInfoEntity info, String url) { - ModelApiResponse response = sendRequest(info, url); + public String getResult(String text, String url) { + ModelApiResponse response = sendRequest(text, url); log.info("get zhi pu ai response : {}", Optional.ofNullable(response).map(resp -> JsonUtil.toJson(resp)).orElse("null")); if (response.isSuccess()) { try { diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/ZhipuAnalysisService.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/ZhipuAnalysisService.java index f6649ca..2316cbd 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/ZhipuAnalysisService.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/ZhipuAnalysisService.java @@ -1,5 +1,7 @@ package com.hnac.hzims.bigmodel.zhipuai.service; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO; import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileRequest; import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileResponse; @@ -13,4 +15,6 @@ public interface ZhipuAnalysisService { ZhipuAnalysisFileResponse analysis(ZhipuAnalysisFileRequest request); ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisFileRequest request); + + BigModelAnalysisResponseDTO multiAnalysis(BigModelAnalysisRequestDTO analysisInfo); } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/impl/ZhipuAnalysisServiceImpl.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/impl/ZhipuAnalysisServiceImpl.java index 1848f58..a639efa 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/impl/ZhipuAnalysisServiceImpl.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/impl/ZhipuAnalysisServiceImpl.java @@ -1,6 +1,8 @@ package com.hnac.hzims.bigmodel.zhipuai.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO; import com.hnac.hzims.bigmodel.zhipuai.constants.BaseEnum; import com.hnac.hzims.bigmodel.zhipuai.constants.ResultStrategyType; import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; @@ -15,13 +17,15 @@ import com.hnac.hzims.common.utils.FileUtil; import com.hnac.hzinfo.exception.HzServiceException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.api.ResultCode; import org.springblade.core.tool.jackson.JsonUtil; +import org.springblade.core.tool.utils.CollectionUtil; +import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; import org.springframework.util.Assert; -import java.util.Objects; -import java.util.Optional; +import java.util.*; /** * @Author: ypj @@ -36,6 +40,14 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService { private final ZhipuAnalysisInfoService infoService; + private final String multiQuestionBrief = "从给出的图片回答以下{}个问题\n"; + + private final String multiQuestionPrefix = "第{}个问题,"; + + private final String multiQuestionConstrains = "- 不要在输出中添加任何注释和思考过程和其他多余的内容,以JSON格式输出简单结果,{}结果只包含'是'或者'否'\n"; + + private final String multiQuestionConstrainsList = "'问题{}'代表第{}个问题,"; + @Override public ZhipuAnalysisFileResponse analysis(ZhipuAnalysisFileRequest request) { Assert.isTrue(StringUtil.isNotBlank(request.getFilePath()) || StringUtil.isNotBlank(request.getUrl()), () -> { @@ -49,7 +61,21 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService { }); ZhipuAnalyser analyser = analysisFactory.getAnalysisStrategy(info.getModel()); - Object resultObject = analyser.getResultValue(info, getSendUrl(request)); + Assert.isTrue(StringUtil.isNotBlank(info.getRequestContent()), () -> { + throw new HzServiceException("智谱平台交互内容为空"); + }); + //拼接文字内容 + StringBuilder textBuilder = new StringBuilder(); + textBuilder.append(ZhipuAnalyser.QUESTION_PROFILE).append(info.getRequestContent()); + if (StringUtil.isNotBlank(info.getRequestConstrains())) { + textBuilder.append(ZhipuAnalyser.QUESTION_CONSTRAINS).append(info.getRequestConstrains()); + } + if (StringUtil.isNotBlank(info.getRequestOutputFormat())) { + textBuilder.append(ZhipuAnalyser.QUESTION_OUTPUT_FORMAT).append("{").append(info.getRequestOutputFormat()).append("}"); + } + analyser.setText(textBuilder.toString()); + + Object resultObject = analyser.getResultValue(analyser.getText(), info.getResultKey(), getSendUrl(request)); Assert.isTrue(Objects.nonNull(resultObject), () -> { throw new HzServiceException("智谱平台分析失败"); }); @@ -82,11 +108,12 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService { @Override public ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisFileRequest request) { ZhipuAnalysisInfoEntity result = null; - if (StringUtil.isBlank(request.getCode())) { + if (StringUtil.isBlank(request.getCode()) && StringUtil.isBlank(request.getCheckTypeSon())) { result = request.toAnalysisInfo(); } else { result = infoService.getOne(Wrappers.lambdaQuery() - .eq(ZhipuAnalysisInfoEntity::getCode, request.getCode()) + .eq(StringUtil.isNotBlank(request.getCode()), ZhipuAnalysisInfoEntity::getCode, request.getCode()) + .eq(StringUtil.isNotBlank(request.getCheckTypeSon()), ZhipuAnalysisInfoEntity::getCheckTypeSon, request.getCheckTypeSon()) .last("limit 1;")); } log.info("the analysis information is {}", Optional.ofNullable(result).map(r -> JsonUtil.toJson(r)).orElse("null")); @@ -94,4 +121,86 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService { } + @Override + public BigModelAnalysisResponseDTO multiAnalysis(BigModelAnalysisRequestDTO request) { + BigModelAnalysisResponseDTO response = new BigModelAnalysisResponseDTO(); + try { + Assert.isTrue(StringUtil.isNotBlank(request.getUrl()), () -> { + throw new HzServiceException("文件为空"); + }); + Assert.isTrue(CollectionUtil.isNotEmpty(request.getCodeList()) || CollectionUtil.isNotEmpty(request.getCheckTypeSonList()), () -> { + throw new HzServiceException("识别类型为空"); + }); + List infoList = infoService.list(Wrappers.lambdaQuery().in(CollectionUtil.isNotEmpty(request.getCodeList()), ZhipuAnalysisInfoEntity::getCode, request.getCodeList()) + .in(CollectionUtil.isNotEmpty(request.getCheckTypeSonList()), ZhipuAnalysisInfoEntity::getCheckTypeSon, request.getCheckTypeSonList())); + Assert.isTrue(CollectionUtil.isNotEmpty(infoList), () -> { + throw new HzServiceException("未知的识别类型"); + }); + ZhipuAnalyser analyser = analysisFactory.getAnalysisStrategy(infoList.get(0).getModel()); + + String text = getMultiAnalyserText(infoList); + Map resultMap = analyser.getResultMap(text, request.getUrl()); + + if (null == resultMap) { + response.setCode(ResultCode.FAILURE.getCode()); + response.setMsg("智谱大模型分析失败"); + return response; + } + + List results = new ArrayList<>(infoList.size()); + for (int index = 1; index <= infoList.size(); index++) { + ZhipuAnalysisInfoEntity infoEntity = infoList.get(index - 1); + BigModelAnalysisResponseDTO.BigModelAnalysisResult result = new BigModelAnalysisResponseDTO.BigModelAnalysisResult(); + results.add(result); + result.setCheckTypeSon(infoEntity.getCheckTypeSon()); + Object resultObj = resultMap.get(infoEntity.getResultKey()); + if (ObjectUtil.isEmpty(resultObj)) { + continue; + } + String resultStr = resultObj.toString(); + result.setResultStr(resultStr); + result.setDescription(infoEntity.getName() + StringUtil.format(",结果为{}", resultStr)); + ResultStrategyType strategyType = BaseEnum.getInstance(infoEntity.getResultStrategy(), ResultStrategyType.class); + if (ObjectUtil.isEmpty(strategyType)) { + continue; + } + result.setResult(strategyType.getStrategy().getResult(infoEntity, resultObj)); + } + response.setData(results); + response.setCode(ResultCode.SUCCESS.getCode()); + response.setMsg(ResultCode.SUCCESS.getMessage()); + } catch (Exception e) { + if (e instanceof HzServiceException) { + response.setCode(ResultCode.FAILURE.getCode()); + response.setMsg(e.getMessage()); + } else { + response.setCode(ResultCode.FAILURE.getCode()); + response.setMsg("智谱大模型分析失败"); + } + log.error("智谱大模型分析失败", e); + } + return response; + } + + String getMultiAnalyserText(List infoList) { + StringBuilder stringBuilder = new StringBuilder(); + StringBuilder titleBuilder = new StringBuilder(); + StringBuilder formatBuilder = new StringBuilder(); + stringBuilder.append(ZhipuAnalyser.QUESTION_PROFILE) + .append(StringUtil.format(multiQuestionBrief, infoList.size())); + formatBuilder.append("{"); + for (int index = 1; index <= infoList.size(); index++) { + ZhipuAnalysisInfoEntity infoEntity = infoList.get(index - 1); + stringBuilder.append(StringUtil.format(multiQuestionPrefix, index)); + titleBuilder.append(StringUtil.format(multiQuestionConstrainsList, infoEntity.getResultKey(), index)); + formatBuilder.append(infoEntity.getRequestOutputFormat()).append(","); + } + formatBuilder.deleteCharAt(formatBuilder.length() - 1); + formatBuilder.append("}"); + stringBuilder.append(ZhipuAnalyser.QUESTION_CONSTRAINS) + .append(StringUtil.format(multiQuestionConstrains, titleBuilder.toString())) + .append(ZhipuAnalyser.QUESTION_OUTPUT_FORMAT).append(formatBuilder); + return stringBuilder.toString(); + } + } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisFileRequest.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisFileRequest.java index 451c4aa..81184a6 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisFileRequest.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisFileRequest.java @@ -1,6 +1,6 @@ package com.hnac.hzims.bigmodel.zhipuai.vo; -import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisDTO; +import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO; import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -16,6 +16,9 @@ public class ZhipuAnalysisFileRequest { @ApiModelProperty("策略编码") private String code; + @ApiModelProperty(value = "检测类型子类") + private String checkTypeSon; + @ApiModelProperty("模型名称") private String model; @@ -39,10 +42,4 @@ public class ZhipuAnalysisFileRequest { return info; } - public static ZhipuAnalysisFileRequest of(BigModelAnalysisDTO analysisDTO) { - ZhipuAnalysisFileRequest request = new ZhipuAnalysisFileRequest(); - request.setCode(analysisDTO.getCode()); - request.setUrl(analysisDTO.getUrl()); - return request; - } } diff --git a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisResult.java b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisResult.java index e037767..cc67650 100644 --- a/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisResult.java +++ b/hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisResult.java @@ -21,7 +21,7 @@ public class ZhipuAnalysisResult implements Serializable { private Boolean success = null; @ApiModelProperty(value = "承载数据") - private T result; + private Object result; @ApiModelProperty(value = "结果描述") private String resultStr; diff --git a/hzims-service/inspect/pom.xml b/hzims-service/inspect/pom.xml index 10d46e5..401e4d8 100644 --- a/hzims-service/inspect/pom.xml +++ b/hzims-service/inspect/pom.xml @@ -155,6 +155,10 @@ okhttp 4.9.3 + + com.hnac.hzims + big-model-api + diff --git a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/task/schedule/VideoTaskSchedule.java b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/task/schedule/VideoTaskSchedule.java index d4f79be..1519e95 100644 --- a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/task/schedule/VideoTaskSchedule.java +++ b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/task/schedule/VideoTaskSchedule.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Lists; +import com.hnac.hzims.bigmodel.api.feign.IBigModelAnalysisClient; import com.hnac.hzinfo.datasearch.soe.ISoeClient; import com.hnac.hzinfo.datasearch.soe.vo.DeviceSoeVO; import com.hnac.hzinfo.inspect.ai.entity.CameraInfoEntity; @@ -13,6 +14,8 @@ import com.hnac.hzinfo.inspect.ai.service.ICameraInfoService; import com.hnac.hzinfo.inspect.ai.service.IRobotTaskService; import com.hnac.hzinfo.inspect.areamonthly.vo.TaskObjectVO; import com.hnac.hzinfo.inspect.hikVideo.service.IHikApiService; +import com.hnac.hzinfo.inspect.obj.entity.ContentEntity; +import com.hnac.hzinfo.inspect.obj.services.ContentService; import com.hnac.hzinfo.inspect.plan.PlanContants; import com.hnac.hzinfo.inspect.task.TaskContants; import com.hnac.hzinfo.inspect.task.entity.EventEntity; @@ -34,12 +37,14 @@ import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; +import org.springblade.resource.feign.IOssClient; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Component; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -63,9 +68,13 @@ public class VideoTaskSchedule { private final ISoeClient soeClient; private final DataSourceTransactionManager dataSourceTransactionManager; private final TransactionDefinition transactionDefinition; + private final IOssClient ossClient; + private final ContentService contentService; + private final IBigModelAnalysisClient bigModelClient; /** * 视频巡检任务执行 + * * @param params 任务ID * @return */ @@ -74,15 +83,14 @@ public class VideoTaskSchedule { public ReturnT execute(String params) throws InterruptedException { List taskList = Lists.newArrayList(); // 获取待执行的任务 - if(StringUtil.isBlank(params)) { + if (StringUtil.isBlank(params)) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() .eq(TaskEntity::getStatus, TaskContants.TaskStatusEnum.INIT_STATUS.getStatus()) .le(TaskEntity::getPlanStartTime, LocalDateTime.now()) .ge(TaskEntity::getPlanEndTime, LocalDateTime.now()) .eq(TaskEntity::getAutoVideo, PlanContants.InspectTypeEnum.VIDEO.getVal()); taskList.addAll(taskService.list(queryWrapper)); - } - else { + } else { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() .in(TaskEntity::getId, Func.toLongList(",", params)) .eq(TaskEntity::getStatus, TaskContants.TaskStatusEnum.UNDERWAY_STATUS.getStatus()) @@ -95,6 +103,7 @@ public class VideoTaskSchedule { /** * 执行视频巡检任务 + * * @param task 视频巡检任务 */ private void executeVideoTask(TaskEntity task) { @@ -105,16 +114,15 @@ public class VideoTaskSchedule { this.fillEvent(task); // 更新视频巡检任务状态 taskService.update(Wrappers.lambdaUpdate() - .set(TaskEntity::getStatus,TaskContants.TaskStatusEnum.FINISH_STATUS.getStatus()) - .set(TaskEntity::getEndTime,LocalDateTime.now()) - .eq(TaskEntity::getId,task.getId())); - } - catch(Exception e) { + .set(TaskEntity::getStatus, TaskContants.TaskStatusEnum.FINISH_STATUS.getStatus()) + .set(TaskEntity::getEndTime, LocalDateTime.now()) + .eq(TaskEntity::getId, task.getId())); + } catch (Exception e) { e.printStackTrace(); - XxlJobLogger.log("【taskId:"+task.getId()+"】视频巡检任务执行失败,报错信息为:"+e.getMessage()); + XxlJobLogger.log("【taskId:" + task.getId() + "】视频巡检任务执行失败,报错信息为:" + e.getMessage()); } try { - Thread.sleep(3*1000); + Thread.sleep(3 * 1000); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -122,11 +130,12 @@ public class VideoTaskSchedule { /** * 填充视频巡检执行情况 + * * @param task 视频巡检任务 */ private void fillEvent(TaskEntity task) { List taskObjects = taskService.getTaskById(task.getId()); - List taskObjectList = JSONArray.parseArray(JSON.toJSONString(taskObjects),TaskObjectVO.class); + List taskObjectList = JSONArray.parseArray(JSON.toJSONString(taskObjects), TaskObjectVO.class); taskObjectList.forEach(object -> object.getProjects().forEach(project -> { EventEntity event = new EventEntity(); event.setTaskId(task.getId()); @@ -150,17 +159,17 @@ public class VideoTaskSchedule { record.setUpdateUser(task.getUpdateUser()); record.setCurrentStatus("1"); CameraInfoEntity camera = this.getCameraByProIdAndConId(project.getProjectId(), content.getContentId()); - if(Func.isNotEmpty(camera)) { + if (Func.isNotEmpty(camera)) { // 获取计划时间段内视频的告警信息设置是否异常 - if(Func.isNotEmpty(camera.getEmCode())) { + if (Func.isNotEmpty(camera.getEmCode())) { Result> deviceSoeR = soeClient.getDeviceCodeByTaosSoe(DateUtil.formatDateTime(task.getPlanStartTime()), DateUtil.formatDateTime(task.getPlanEndTime()), camera.getEmCode(), 0, String.valueOf(-1)); - if(deviceSoeR.isSuccess() && CollectionUtil.isNotEmpty(deviceSoeR.getData().getRecords())) { + if (deviceSoeR.isSuccess() && CollectionUtil.isNotEmpty(deviceSoeR.getData().getRecords())) { record.setCurrentStatus("0"); } } // 调用海康威视api实现手动截屏回传至fileUrl - if(Func.isNotEmpty(camera.getPointCode())) { + if (Func.isNotEmpty(camera.getPointCode())) { String picUrl = hikApiService.manualCapture(camera.getPointCode()); record.setFileUrl(picUrl); record.setCurrentValue(picUrl); @@ -169,14 +178,15 @@ public class VideoTaskSchedule { return record; }).collect(Collectors.toList()); eventRecordService.saveBatch(recordList); - if(recordList.stream().anyMatch(r -> TaskContants.CurrentStatusEnum.abnormal.getType().equals(r.getCurrentStatus()))) { - eventService.update(Wrappers.lambdaUpdate().set(EventEntity::getIsProblem,"1").eq(EventEntity::getId,event.getId())); + if (recordList.stream().anyMatch(r -> TaskContants.CurrentStatusEnum.abnormal.getType().equals(r.getCurrentStatus()))) { + eventService.update(Wrappers.lambdaUpdate().set(EventEntity::getIsProblem, "1").eq(EventEntity::getId, event.getId())); } })); } /** * 登记任务 + * * @param task 视频巡检任务 */ private void registration(TaskEntity task) { @@ -188,7 +198,7 @@ public class VideoTaskSchedule { taskUserEntity.setClaimStatus(TaskContants.ClaimStatusEnum.COLLECT.getStatus()); taskUserEntity.setClaimTime(LocalDateTime.now()); taskUserService.updateById(taskUserEntity); - if(PlanContants.PlanMethodEnum.SEIZE.getMethod().equals(task.getMethod())) { + if (PlanContants.PlanMethodEnum.SEIZE.getMethod().equals(task.getMethod())) { taskUserService.removeByIds(taskUserList.stream().map(TaskUserEntity::getId).filter(id -> !taskUserEntity.getId().equals(id)).collect(Collectors.toList())); } // 更改任务状态 @@ -199,19 +209,31 @@ public class VideoTaskSchedule { /** * 根据项目ID以及内容ID获取摄像头编号 + * * @param projectId 项目ID * @param contentId 内容ID * @return 摄像头编号 */ - private CameraInfoEntity getCameraByProIdAndConId(Long projectId,Long contentId) { + private CameraInfoEntity getCameraByProIdAndConId(Long projectId, Long contentId) { RobotTaskEntity robotTaskEntity = robotTaskService.getOne(Wrappers.lambdaQuery() .eq(RobotTaskEntity::getProjectId, projectId) .like(RobotTaskEntity::getContentIds, String.valueOf(contentId)) ); - if(Func.isNotEmpty(robotTaskEntity)) { + if (Func.isNotEmpty(robotTaskEntity)) { return cameraInfoService.getById(robotTaskEntity.getCameraId()); } return null; } + private void pictureHandle(String url, Long contentId) { + + ContentEntity content = contentService.getById(contentId); + if (StringUtil.isBlank(content.getMultiCheckTypeSon())) { + return; + } + String[] typeArray = content.getMultiCheckTypeSon().split(","); + List checkTypeSonList = Arrays.asList(typeArray); + + } + }