From 0fd1ddcde1e975b5a6c00ea82127864b288ad6b5 Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 19 Jun 2025 14:56:18 +0800 Subject: [PATCH] =?UTF-8?q?TASK:=201=E3=80=81LLM=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=A4=E4=B8=AA=E5=B7=A5=E5=85=B7=EF=BC=8C?= =?UTF-8?q?=E6=9F=A5=E6=89=BEsketch=E5=92=8C=E4=BF=AE=E6=94=B9=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=8F=82=E6=95=B0=202=E3=80=81=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=8E=B7=E5=8F=96=E6=9C=80=E6=96=B0=E7=9A=84?= =?UTF-8?q?minio=E5=9B=BE=E7=89=87=E9=A2=84=E8=A7=88=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/controller/ThirdPartyController.java | 11 +++ .../da/mapper/primary/entity/Workspace.java | 4 +- .../ai/da/service/impl/LLMServiceImpl.java | 94 +++++++++++++++++-- 3 files changed, 102 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ai/da/controller/ThirdPartyController.java b/src/main/java/com/ai/da/controller/ThirdPartyController.java index 40cdaf42..f0779f81 100644 --- a/src/main/java/com/ai/da/controller/ThirdPartyController.java +++ b/src/main/java/com/ai/da/controller/ThirdPartyController.java @@ -1,6 +1,8 @@ package com.ai.da.controller; +import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.response.Response; +import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.primary.entity.GoogleUser; import com.ai.da.model.dto.*; import com.ai.da.model.vo.AccountLoginVO; @@ -35,6 +37,9 @@ public class ThirdPartyController { @Resource private DesignService designService; + @Resource + private MinioUtil minioUtil; + /*@ApiOperation(value = "Add user information") @PostMapping("/addUser") public Response addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) { @@ -153,4 +158,10 @@ public class ThirdPartyController { public Response receiveDesignParams(@Valid @RequestBody ReceiveDesignParam receiveDesignParam) { return Response.success(designService.receiveDesignParams(receiveDesignParam)); } + + @ApiOperation(value = "刷新minio预签名地址") + @GetMapping("/refreshMinioUrl") + public Response refreshMinioUrl(@RequestParam("path") String path){ + return Response.success(minioUtil.getPreSignedUrl(path, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java index c3714550..b2b16d2b 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java @@ -44,7 +44,9 @@ public class Workspace implements Serializable { */ @ApiModelProperty(value = "用户ID") private Long accountId; - + /** + * 年龄段 Adult || Child + */ private String ageGroup; /** * 性别 diff --git a/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java b/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java index 75111708..24a182ac 100644 --- a/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java @@ -1,5 +1,6 @@ package com.ai.da.service.impl; +import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.CollectionLevel1TypeEnum; @@ -20,11 +21,16 @@ import com.ai.da.python.PythonService; import com.ai.da.service.DesignService; import com.ai.da.service.LLMService; import com.ai.da.service.SysFileService; +import com.ai.da.service.WorkspaceService; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.text.StringEscapeUtils; +import org.checkerframework.checker.units.qual.C; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -71,6 +77,8 @@ public class LLMServiceImpl implements LLMService { private CollectionElementMapper collectionElementMapper; @Resource private CollectionElementRelModelMapper collectionElementRelModelMapper; + @Value("${minio.bucketName.sysImage}") + private String sysImage; @Override public SseEmitter stream(String prompt, Long projectParamId, String fileUrl, List imageUrlList, String token, Boolean enableThinking, String process) { @@ -78,12 +86,12 @@ public class LLMServiceImpl implements LLMService { executor.submit(() -> { try { - boolean validate = jwtTokenHelper.validateToken(token); + boolean validate = jwtTokenHelper.validateToken(token); // if (validate) { AuthPrincipalVo principal = jwtTokenHelper.parserToUser(token); Long accountId = principal.getId(); - String url = "http://18.167.251.121:10002/chat-stream"; -// String url = "http://10.1.1.240:1013/chat-stream"; +// String url = "http://18.167.251.121:10002/chat-stream"; + String url = "http://10.1.1.240:1013/chat-stream"; HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); @@ -222,10 +230,12 @@ public class LLMServiceImpl implements LLMService { @Override public SseEmitter streamNew(String prompt, Long projectParamId, String fileUrl, List imageUrlList, String token, Boolean enableThinking, String process) { SseEmitter emitter = new SseEmitter(0L); // 永不超时 + List designTools = Arrays.asList("moodboard", "printboard", "generate_color_code", "sketchboard"); executor.submit(() -> { try { - boolean validate = jwtTokenHelper.validateToken(token); +// boolean validate = jwtTokenHelper.validateToken(token); + boolean validate = true; if (validate) { AuthPrincipalVo principal = jwtTokenHelper.parserToUser(token); Long accountId = principal.getId(); @@ -327,7 +337,9 @@ public class LLMServiceImpl implements LLMService { } String toolsName = json.getString("tools_name"); JSONObject toolsData = json.getJSONObject("content"); - if (Objects.nonNull(toolsName) && !toolsName.equals("design_control_signal") && !toolsName.equals("generate_project_info")) { + /*&& !toolsName.equals("design_control_signal") + && !toolsName.equals("generate_project_info")*/ + if (Objects.nonNull(toolsName) && designTools.contains(toolsName)) { boolean color = true; ReceiveDesignParam receiveDesignParam = JSONObject.parseObject(JSONObject.toJSONString(toolsData), ReceiveDesignParam.class); receiveDesignParam.setProjectId(projectId); @@ -353,6 +365,11 @@ public class LLMServiceImpl implements LLMService { systemImage.setContent(JSONObject.toJSONString(receiveDesignParam.getReceiveCollectionElementList())); systemImage.setAccountId(accountId); chatMessageMapper.insert(systemImage); + } else if (Objects.nonNull(toolsName) && toolsName.equals("search_sketch_img")) { + json.put("content", processSearchSketchToolCon(toolsData)); + } else if (Objects.nonNull(toolsName) + && toolsName.equals("update_project_info")) { + updateProjectParams(projectId, toolsData); } emitter.send(json.toJSONString()); } @@ -367,7 +384,6 @@ public class LLMServiceImpl implements LLMService { } } } - emitter.complete(); } catch (Exception e) { System.out.println("走进异常"); @@ -378,6 +394,72 @@ public class LLMServiceImpl implements LLMService { return emitter; } + private String processSearchSketchToolCon(JSONObject content){ + // content内容 "{\"sketch_list\": [\"\\\\female\\\\blouse\\\\blouse_645.jpg\", \"\\\\female\\\\dress\\\\0902004968.jpg\"]}" + JSONArray sketchList = content.getJSONArray("sketch_list"); + if (sketchList.isEmpty()){ + return null; + } + ArrayList dataList = new ArrayList<>(); + sketchList.forEach(sketch -> { + ReceiveCollectionElement receiveCollectionElement = new ReceiveCollectionElement(); + receiveCollectionElement.setUrl((String) sketch); + receiveCollectionElement.setMinioUrl(minioUtil.getPreSignedUrl(sysImage + "/images" + sketch, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + dataList.add(receiveCollectionElement); + }); + ReceiveDesignParam receiveDesignParam = new ReceiveDesignParam(); + receiveDesignParam.setReceiveCollectionElementList(dataList); + return JSONArray.toJSONString(receiveDesignParam); + } + + @Resource + private WorkspaceService workspaceService; + private String updateProjectParams(Long projectId, JSONObject jsonObject){ + // 1. 获取 project_info 并转换为 List> + List> projectInfoList = (List>) jsonObject.get("project_info"); + + Long workspaceId = workspaceService.getByProjectId(projectId); + if (Objects.isNull(workspaceId)){ + throw new BusinessException("未知projectId"); + } + Workspace workspace = workspaceService.getBaseMapper().selectOne(new QueryWrapper().eq("project_id", projectId)); + if (!projectInfoList.isEmpty()){ + projectInfoList.forEach(info -> + info.forEach((key, value) -> { + switch (key){ + case "project_name": + Project project = projectMapper.selectById(projectId); + project.setName(value); + project.setUpdateTime(LocalDateTime.now()); + projectMapper.updateById(project); + break; + case "ageGroup": + workspace.setAgeGroup(value); + break; + case "gender": + workspace.setSex(value); + break; + case "position": + workspace.setPosition(value); + break; + case "style": + QueryWrapper