diff --git a/src/main/java/com/ai/da/common/enums/CollectionLevel1TypeEnum.java b/src/main/java/com/ai/da/common/enums/CollectionLevel1TypeEnum.java index c16b5b51..76d8a375 100644 --- a/src/main/java/com/ai/da/common/enums/CollectionLevel1TypeEnum.java +++ b/src/main/java/com/ai/da/common/enums/CollectionLevel1TypeEnum.java @@ -27,7 +27,9 @@ public enum CollectionLevel1TypeEnum { /** * 市场 */ - MARKETING_SKETCH("MarketingSketch"); + MARKETING_SKETCH("MarketingSketch"), + + MODEL("Models"); private String realName; diff --git a/src/main/java/com/ai/da/controller/LLMController.java b/src/main/java/com/ai/da/controller/LLMController.java index f6053132..208ca947 100644 --- a/src/main/java/com/ai/da/controller/LLMController.java +++ b/src/main/java/com/ai/da/controller/LLMController.java @@ -55,17 +55,21 @@ public class LLMController { @CrossOrigin @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter streamPrompt(@RequestParam String prompt, - @RequestParam Long projectId, + @RequestParam(required = false) Long projectId, @RequestParam(required = false) String fileUrl, @RequestParam(required = false) List imageUrlList, - @RequestParam String token) { - return llmService.stream(prompt, projectId, fileUrl, imageUrlList, token); + @RequestParam(required = false) String process, + @RequestParam String token, + @RequestParam Boolean enableThinking) { + return llmService.stream(prompt, projectId, fileUrl, imageUrlList, token, enableThinking, process); } @ApiOperation(value = "对话创建项目") @GetMapping(value = "/chatCreateProject") - public Response chatCreateProject(@RequestParam String prompt, @RequestParam String process) { - return Response.success(llmService.chatCreateProject(prompt, process)); + public Response chatCreateProject(@RequestParam String prompt, @RequestParam String process, + @RequestParam(required = false) String fileUrl, + @RequestParam(required = false) List imageUrlList) { + return Response.success(llmService.chatCreateProject(prompt, process, fileUrl, imageUrlList)); } @ApiOperation(value = "上传文件") diff --git a/src/main/java/com/ai/da/mapper/primary/CollectionElementRelModelMapper.java b/src/main/java/com/ai/da/mapper/primary/CollectionElementRelModelMapper.java new file mode 100644 index 00000000..fb61a84f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CollectionElementRelModelMapper.java @@ -0,0 +1,10 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.CollectionElementRelModel; + +import java.util.Set; + +public interface CollectionElementRelModelMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ChatMessage.java b/src/main/java/com/ai/da/mapper/primary/entity/ChatMessage.java index b1886773..70859881 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/ChatMessage.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ChatMessage.java @@ -31,5 +31,7 @@ public class ChatMessage implements Serializable { private Long accountId; + private Integer isImage; + private LocalDateTime createTime; } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CollectionElementRelModel.java b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElementRelModel.java new file mode 100644 index 00000000..cc929505 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElementRelModel.java @@ -0,0 +1,34 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("collection_element_rel_model") +public class CollectionElementRelModel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long relationId; + + private String relationType; + + private Long collectionElementId; + + private String ageGroup; + +} 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 e4277c63..c3714550 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 @@ -101,7 +101,7 @@ public class Workspace implements Serializable { private Long projectId; - private Integer userBrandDna; + private Long userBrandDna; private Integer brandPercentage; diff --git a/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java b/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java index 45da3381..038846db 100644 --- a/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java @@ -29,6 +29,8 @@ public class DesignCollectionDTO { @ApiModelProperty("手稿板图片id 数组") private List sketchBoards; + private List mannequins; + @NotNull(message = "systemScale.cannot.be.empty") @ApiModelProperty("系统取图比列") private BigDecimal systemScale; diff --git a/src/main/java/com/ai/da/model/dto/MannequinDTO.java b/src/main/java/com/ai/da/model/dto/MannequinDTO.java index e79dcc98..1ecc9b8e 100644 --- a/src/main/java/com/ai/da/model/dto/MannequinDTO.java +++ b/src/main/java/com/ai/da/model/dto/MannequinDTO.java @@ -9,6 +9,9 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class MannequinDTO { private Long id; + + private Long collectionElementId; + private String type; // private String modelType; } diff --git a/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java b/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java index 950647c8..6b160b11 100644 --- a/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java +++ b/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java @@ -1,5 +1,6 @@ package com.ai.da.model.dto; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.vo.CollectionColorVO; import com.ai.da.model.vo.CollectionElementVO; import com.ai.da.model.vo.MoodBoardModuleChooseVO; @@ -29,6 +30,8 @@ public class ModuleSaveDTO { private PatternMaking3DDTO patternMaking3D; + private List mannequin; + // private MoodBoardModuleChooseVO moodBoard; // private List printBoard; // private List colorBoard; diff --git a/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java b/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java index 5396036e..8c8c829c 100644 --- a/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java +++ b/src/main/java/com/ai/da/model/dto/QueryLibraryPageServiceDTO.java @@ -31,6 +31,8 @@ public class QueryLibraryPageServiceDTO extends PageQueryBaseVo { @ApiModelProperty("1交集2并集") private Integer intersection; + private String ageGroup; + private Long brandId; } diff --git a/src/main/java/com/ai/da/model/dto/ReceiveCollectionElement.java b/src/main/java/com/ai/da/model/dto/ReceiveCollectionElement.java index ab6f257b..3c980a3c 100644 --- a/src/main/java/com/ai/da/model/dto/ReceiveCollectionElement.java +++ b/src/main/java/com/ai/da/model/dto/ReceiveCollectionElement.java @@ -9,4 +9,5 @@ public class ReceiveCollectionElement { private String level2Type; private String rgb; private String hsv; + private String minioUrl; } diff --git a/src/main/java/com/ai/da/model/vo/ChatMessageVO.java b/src/main/java/com/ai/da/model/vo/ChatMessageVO.java new file mode 100644 index 00000000..db179a62 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ChatMessageVO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.ChatMessage; +import lombok.Data; + +@Data +public class ChatMessageVO extends ChatMessage { +} diff --git a/src/main/java/com/ai/da/model/vo/CollectionElementVO.java b/src/main/java/com/ai/da/model/vo/CollectionElementVO.java index 5662f16a..505ed4ef 100644 --- a/src/main/java/com/ai/da/model/vo/CollectionElementVO.java +++ b/src/main/java/com/ai/da/model/vo/CollectionElementVO.java @@ -46,4 +46,7 @@ public class CollectionElementVO { private List segmentedImages; + private Long mannequinRelationId; + private String mannequinRelationType; + } diff --git a/src/main/java/com/ai/da/model/vo/DesignLibraryModelPointVO.java b/src/main/java/com/ai/da/model/vo/DesignLibraryModelPointVO.java index 1360ab7e..1c2d642a 100644 --- a/src/main/java/com/ai/da/model/vo/DesignLibraryModelPointVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignLibraryModelPointVO.java @@ -40,5 +40,9 @@ public class DesignLibraryModelPointVO implements Serializable { private String templateUrl; + private Long relationId; + + private String relationType; + } diff --git a/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java b/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java index e5786ba8..0d899a9f 100644 --- a/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java +++ b/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java @@ -35,4 +35,6 @@ public class ModuleChooseVO { private SketchReconstructionVO deReconstruction; private ThreeDModuleVO patternMaking3D; + + private List mannequin; } diff --git a/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java b/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java index b8f9956a..0bbc9230 100644 --- a/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java +++ b/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java @@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.List; + @AllArgsConstructor @Data @ApiModel("用户choose详细-响应") @@ -15,7 +17,7 @@ public class UserLikeChooseVO { private Long userGroupId; @ApiModelProperty("分组详细数组") - private java.util.List userLikeDetails; + private List userLikeDetails; @ApiModelProperty("关联的collection") private UserLikeCollectionVO collection; diff --git a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java index 85dd456f..682b3da2 100644 --- a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java +++ b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java @@ -2,6 +2,7 @@ package com.ai.da.model.vo; import com.ai.da.mapper.primary.entity.CollectionElement; import com.ai.da.model.dto.CollectionColorDTO; +import com.ai.da.model.dto.MannequinDTO; import com.ai.da.python.vo.DesignPythonItemPrint; import com.google.common.collect.Lists; import io.swagger.annotations.ApiModel; @@ -59,4 +60,6 @@ public class ValidateElementVO { private Long brandId; private Double brandScale; + private List mannequins; + private DesignLibraryModelPointVO designLibraryModelPointVO; } diff --git a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java index 9fd8d049..5a117ac5 100644 --- a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java +++ b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java @@ -40,6 +40,9 @@ public class WorkspaceVO extends Workspace { private String style; + private String userBrandDnaImg; + private String userBrandDnaName; + private Map> allKeywordsByStyle; } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 18623875..a82607f2 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -29,7 +29,6 @@ import com.google.common.collect.Maps; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import okhttp3.*; -import org.apache.catalina.User; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -45,7 +44,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.HttpURLConnection; -import java.net.URLEncoder; import java.util.*; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; @@ -350,7 +348,7 @@ public class PythonService { private DesignPythonObject createDesignPythonObject(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale, String singleOverall, String switchCategory, int i) { DesignPythonObject pythonObject = new DesignPythonObject(); pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale)); - pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); + pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint(), elementVO.getDesignLibraryModelPointVO())); if (CollectionUtil.isNotEmpty(elementVO.getRequestIdList())) { pythonObject.setObjectSign(elementVO.getRequestIdList().get(i)); } @@ -1698,12 +1696,20 @@ public class PythonService { //类型 pythonItem.setType(type); if (SysFileLevel2TypeEnum.BODY.getRealName().equals(type)) { - if (Objects.nonNull(designLibraryModelPoint)) { - pythonItem.setBody_path(designLibraryModelPoint.getTemplateUrl()); + if (!CollectionUtils.isEmpty(elementVO.getMannequins())) { + DesignLibraryModelPointVO vo = getRandomDesignLibraryModelPoint(elementVO.getMannequins()); + pythonItem.setBody_path(vo.getTemplateUrl()); + elementVO.setDesignLibraryModelPointVO(vo); } else { // pythonItem.setBody_path("/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"); pythonItem.setBody_path("aida-mannequins/model_1693218345.2714432.png"); } +// if (Objects.nonNull(designLibraryModelPoint)) { +// pythonItem.setBody_path(designLibraryModelPoint.getTemplateUrl()); +// } else { +//// pythonItem.setBody_path("/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"); +// pythonItem.setBody_path("aida-mannequins/model_1693218345.2714432.png"); +// } } else { SysFileVO sysFileVO = getRandomSysFileByLevel2Type(type, Lists.newArrayList(), elementVO.getModelSex()); pythonItem.setPath(sysFileVO.getUrl()); @@ -2169,7 +2175,7 @@ public class PythonService { } private DesignPythonBasic coverToBasic(DesignPythonItem designPythonItem, String singleOverall, - String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint) { + String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint, DesignLibraryModelPointVO designLibraryModelPointVO) { DesignPythonBasic basic = new DesignPythonBasic(); basic.setSingle_overall(singleOverall); basic.setSwitch_category(switchCategory); @@ -2182,12 +2188,24 @@ public class PythonService { basic.setSelf_template(Boolean.TRUE); } basic.setScale_earrings(0.16); - basic.setBody_point_test(getMap(designLibraryModelPoint)); + if (Objects.nonNull(designLibraryModelPointVO)) { + basic.setBody_point_test(getMap(designLibraryModelPointVO)); + }else { + basic.setBody_point_test(getMap(designLibraryModelPoint)); + } return basic; } - private Map> getMap(DesignLibraryModelPointVO designLibraryModelPointOld) { - Map> body_point = Maps.newHashMap(); + private DesignLibraryModelPointVO getRandomDesignLibraryModelPoint(List mannequins) { + DesignLibraryModelPointVO vo = new DesignLibraryModelPointVO(); + Random random = new Random(); + int randomNumber = random.nextInt(mannequins.size()); + return mannequins.get(randomNumber); + + } + + private Map getMap(DesignLibraryModelPointVO designLibraryModelPointOld) { + Map body_point = Maps.newHashMap(); if (Objects.nonNull(designLibraryModelPointOld)) { DesignLibraryModelPointVO designLibraryModelPoint = CopyUtil.copyObject(designLibraryModelPointOld, DesignLibraryModelPointVO.class); @@ -2198,6 +2216,8 @@ public class PythonService { body_point.put("waistband_right", resolve(designLibraryModelPoint.getWaistbandRight())); body_point.put("hand_point_left", resolve(designLibraryModelPoint.getHandLeft())); body_point.put("hand_point_right", resolve(designLibraryModelPoint.getHandRight())); + body_point.put("relation_id", designLibraryModelPoint.getRelationId()); + body_point.put("relation_type", designLibraryModelPoint.getRelationType()); } else { //默认是13个点 body_point.put("shoulder_left", Arrays.asList(755, 519)); @@ -4383,7 +4403,7 @@ public class PythonService { throw new BusinessException("poseTransferBatch.interface.exception"); } - public JSONObject getProjectParam(String prompt) { + public JSONObject getProjectParam(String prompt, String fileUrl, List imageUrlList) { OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) @@ -4393,6 +4413,8 @@ public class PythonService { MediaType mediaType = MediaType.parse("application/json"); Map content = Maps.newHashMap(); content.put("prompt", prompt); + content.put("image_list", !CollectionUtils.isEmpty(imageUrlList) ? imageUrlList : new ArrayList<>()); + content.put("file_list", !StringUtils.isEmpty(fileUrl) ? Collections.singletonList(fileUrl) : new ArrayList<>()); RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); log.info("getProjectParam 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/extraction_project_info"); diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java b/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java index b2d89c3c..e0edad78 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java @@ -36,7 +36,7 @@ public class DesignPythonBasic { private Double scale_earrings; - private Map> body_point_test = Maps.newHashMap(); + private Map body_point_test = Maps.newHashMap(); private Boolean layer_order = Boolean.FALSE; diff --git a/src/main/java/com/ai/da/service/LLMService.java b/src/main/java/com/ai/da/service/LLMService.java index 016e033c..5ecbe895 100644 --- a/src/main/java/com/ai/da/service/LLMService.java +++ b/src/main/java/com/ai/da/service/LLMService.java @@ -31,9 +31,9 @@ import java.util.Set; */ public interface LLMService { - SseEmitter stream(String prompt, Long projectId, String fileUrl, List imageUrlList, String token); + SseEmitter stream(String prompt, Long projectId, String fileUrl, List imageUrlList, String token, Boolean enableThinking, String process); - Long chatCreateProject(String prompt, String process); + Long chatCreateProject(String prompt, String process, String fileUrl, List imageUrlList); List uploadFile(MultipartFile file); diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 7b1ae53f..a5d9aca7 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -601,18 +601,37 @@ public class CollectionElementServiceImpl extends ServiceImpl designLibraryModelPointVOList = new ArrayList<>(); + for (MannequinDTO mannequin : designDTO.getMannequins()) { + if (mannequin.getType().equals("System")) { + SysFileVO byId = sysFileService.getById(mannequin.getId()); +// if (!StringUtils.isEmpty(byId.getLevel3Type()) && byId.getLevel2Type().equals("Female")) { +// elementVO.setStyle(byId.getLevel3Type()); +// } + LibraryModelPoint modelPoint = libraryModelPointService.getByRelationId(byId.getId(), mannequin.getType()); + designLibraryModelPointVOList.add(calculateTemplatePointTemplate(modelPoint, 700, 320, byId.getUrl())); + }else { + Library byId = libraryService.getById(mannequin.getId()); + LibraryModelPoint modelPoint = libraryModelPointService.getByRelationId(byId.getId(), mannequin.getType()); + designLibraryModelPointVOList.add(calculateTemplatePointTemplate(modelPoint, byId.getHigh(), byId.getWidth(), byId.getUrl())); + } + } + elementVO.setMannequins(designLibraryModelPointVOList); + }else { + if (!StringUtils.isEmpty(designDTO.getModelType())) { + if (designDTO.getModelType().equals(ModelType.LIBRARY.getValue())) { + Library byId = libraryService.getById(designDTO.getTemplateId()); + LibraryModelPoint modelPoint = libraryModelPointService.getByRelationId(byId.getId(), designDTO.getModelType()); + elementVO.setDesignLibraryModelPoint(calculateTemplatePointTemplate(modelPoint, byId.getHigh(), byId.getWidth(), byId.getUrl())); + } else if (designDTO.getModelType().equals(ModelType.SYSTEM.getValue())) { + SysFileVO byId = sysFileService.getById(designDTO.getTemplateId()); + if (!StringUtils.isEmpty(byId.getLevel3Type()) && byId.getLevel2Type().equals("Female")) { + elementVO.setStyle(byId.getLevel3Type()); + } + LibraryModelPoint modelPoint = libraryModelPointService.getByRelationId(byId.getId(), designDTO.getModelType()); + elementVO.setDesignLibraryModelPoint(calculateTemplatePointTemplate(modelPoint, 700, 320, byId.getUrl())); } - LibraryModelPoint modelPoint = libraryModelPointService.getByRelationId(byId.getId(), designDTO.getModelType()); - elementVO.setDesignLibraryModelPoint(calculateTemplatePointTemplate(modelPoint, 700, 320, byId.getUrl())); } } elementVO.setModelSex(designDTO.getModelSex()); @@ -660,6 +679,8 @@ public class CollectionElementServiceImpl extends ServiceImpl impleme designItem.setDesignUrl(item.getBasic().getSave_name()); designItem.setHasLike((byte) 0); //生成designItem + Map bodyPointTest = item.getBasic().getBody_point_test(); + // 转换 relation_id (Long) + Long relationId = Optional.ofNullable(bodyPointTest.get("relation_id")) + .filter(Number.class::isInstance) + .map(num -> ((Number) num).longValue()) + .orElseThrow(null); + + // 转换 relation_type (String) + String relationType = Optional.ofNullable(bodyPointTest.get("relation_type")) + .filter(String.class::isInstance) + .map(String.class::cast) + .orElse(null); + designItem.setModelId(relationId); + designItem.setModelType(relationType); Long designItemId = designItemService.saveOne(designItem); // python design返回入库及封装 // JSONObject outfit = data.getJSONObject(i + ""); @@ -1753,6 +1767,7 @@ public class DesignServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) public Boolean receiveDesignResults(JSONObject responseJSONObject) { // String requestId = "UUID.randomUUID().toString()"; + System.out.println(responseJSONObject.toJSONString()); String requestId = responseJSONObject.getString("requestId"); Map context; synchronized (designContext) { 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 68717832..5ed22e3b 100644 --- a/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LLMServiceImpl.java @@ -9,6 +9,7 @@ import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.ChatHistoryDTO; +import com.ai.da.model.dto.ReceiveCollectionElement; import com.ai.da.model.dto.ReceiveDesignParam; import com.ai.da.model.enums.*; import com.ai.da.model.vo.AuthPrincipalVo; @@ -18,10 +19,12 @@ import com.ai.da.service.DesignService; import com.ai.da.service.LLMService; import com.ai.da.service.SysFileService; 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 org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -34,10 +37,7 @@ import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.UUID; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -67,7 +67,7 @@ public class LLMServiceImpl implements LLMService { private final ExecutorService executor = Executors.newCachedThreadPool(); @Override - public SseEmitter stream(String prompt, Long projectId, String fileUrl, List imageUrlList, String token) { + public SseEmitter stream(String prompt, Long projectParamId, String fileUrl, List imageUrlList, String token, Boolean enableThinking, String process) { SseEmitter emitter = new SseEmitter(0L); // 永不超时 executor.submit(() -> { @@ -76,38 +76,60 @@ public class LLMServiceImpl implements LLMService { if (validate) { AuthPrincipalVo principal = jwtTokenHelper.parserToUser(token); Long accountId = principal.getId(); - int userSeq = getNextSeq(projectId); // 获取当前session下一条消息序号 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); conn.setRequestProperty("Content-Type", "application/json"); + Long projectId = null; + if (null == projectParamId) { + Project project = new Project(); + project.setCreateTime(LocalDateTime.now()); + projectMapper.insert(project); + projectId = project.getId(); + }else { + projectId = projectParamId; + } JSONObject jsonBodyObject = new JSONObject(); - jsonBodyObject.put("session_id", projectId.toString()); + jsonBodyObject.put("project_id", projectId.toString()); jsonBodyObject.put("role", "user"); - jsonBodyObject.put("image", imageUrlList); // 可扩展 - jsonBodyObject.put("file", fileUrl != null ? fileUrl : ""); + jsonBodyObject.put("image", !CollectionUtils.isEmpty(imageUrlList) ? imageUrlList : new ArrayList<>()); // 可扩展 +// jsonBodyObject.put("image", ""); // 可扩展 + jsonBodyObject.put("file", !StringUtils.isEmpty(fileUrl) ? Collections.singletonList(fileUrl) : new ArrayList<>()); jsonBodyObject.put("message", prompt); - jsonBodyObject.put("enable_thinking", false); + jsonBodyObject.put("enable_thinking", enableThinking); + jsonBodyObject.put("process", !StringUtils.isEmpty(process) ? process : ""); + jsonBodyObject.put("is_create_project", false); // 1. 存储用户输入 ChatMessage userMessage = new ChatMessage(); userMessage.setRole("user"); userMessage.setProjectId(projectId); - userMessage.setSeq(userSeq); + userMessage.setSeq(getNextSeq(projectId)); userMessage.setCreateTime(LocalDateTime.now()); userMessage.setContent(jsonBodyObject.toJSONString()); userMessage.setAccountId(accountId); chatMessageMapper.insert(userMessage); try (OutputStream os = conn.getOutputStream()) { + System.out.println(jsonBodyObject.toJSONString()); byte[] input = jsonBodyObject.toJSONString().getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } // 2. 流式接收并累积内容 - StringBuilder responseBuilder = new StringBuilder(); + // 3. 存储系统回复 + ChatMessage systemMessage = new ChatMessage(); + systemMessage.setRole("system"); + systemMessage.setIsImage(0); + systemMessage.setProjectId(projectId); +// systemMessage.setCreateTime(LocalDateTime.now()); +// systemMessage.setContent(responseBuilder.toString()); + systemMessage.setAccountId(accountId); +// chatMessageMapper.insert(systemMessage); + StringBuilder responseContentBuilder = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { String line; while ((line = reader.readLine()) != null) { @@ -117,42 +139,169 @@ public class LLMServiceImpl implements LLMService { System.out.println(jsonStr); JSONObject json = JSON.parseObject(jsonStr); String status = json.getString("status"); - - if ("[DONE]".equals(status)) { - break; - } - if (!StringUtils.isEmpty(status)) { String content = json.getString("content"); - if (!status.equals("[RUNNING]") && !status.equals("[DESIGN_SIGNAL]")) { + // 结束标识 + if ("[DONE]".equals(status)) { + break; + }else if ("[RUNNING]".equals(status)) { + if (content.startsWith("\n[TOOL_CALL]") || content.startsWith("\n[TOOL_RESPONSE]")) { + // 不发送不存储 + }else { + responseContentBuilder.append(content); + emitter.send(json.toJSONString()); + } + }else { + if (responseContentBuilder.length() != 0) { + systemMessage.setSeq(getNextSeq(projectId)); + systemMessage.setCreateTime(LocalDateTime.now()); + systemMessage.setContent(responseContentBuilder.toString()); + chatMessageMapper.insert(systemMessage); + systemMessage.setId(null); + responseContentBuilder = new StringBuilder(); + } JSONObject toolsData = json.getJSONObject("tools_data"); - ReceiveDesignParam receiveDesignParam = JSONObject.parseObject(JSONObject.toJSONString(toolsData), ReceiveDesignParam.class); - receiveDesignParam.setProjectId(projectId); - designService.receiveDesignParams(receiveDesignParam); - } - if (content != null) { - responseBuilder.append(content); + if (Objects.nonNull(toolsData) && !status.equals("[DESIGN_SIGNAL]") && !status.equals("[PROJECT_CREATE_SIGNAL]")) { + boolean color = true; + ReceiveDesignParam receiveDesignParam = JSONObject.parseObject(JSONObject.toJSONString(toolsData), ReceiveDesignParam.class); + receiveDesignParam.setProjectId(projectId); + designService.receiveDesignParams(receiveDesignParam); + for (ReceiveCollectionElement receiveCollectionElement : receiveDesignParam.getReceiveCollectionElementList()) { + if (!StringUtils.isEmpty(receiveCollectionElement.getUrl())) { + color = false; + receiveCollectionElement.setMinioUrl(minioUtil.getPreSignedUrl(receiveCollectionElement.getUrl(), 24 * 60)); + } + } + String jsonString = JSONObject.toJSONString(receiveDesignParam); + json.put("tools_data", jsonString); + ChatMessage systemImage = new ChatMessage(); + systemImage.setRole("system"); + if (color) { + systemImage.setIsImage(1); + }else { + systemImage.setIsImage(2); + } + systemImage.setProjectId(projectId); + systemImage.setSeq(getNextSeq(projectId)); + systemImage.setCreateTime(LocalDateTime.now()); + systemImage.setContent(JSONObject.toJSONString(receiveDesignParam.getReceiveCollectionElementList())); + systemImage.setAccountId(accountId); + chatMessageMapper.insert(systemImage); + } +// if (status.equals("[PROJECT_CREATE_SIGNAL]")) { +// JSONObject data = toolsData; +// Project project = projectMapper.selectById(projectId); +// LocalDateTime now = LocalDateTime.now(); +// project.setUpdateTime(now); +// project.setAccountId(accountId); +// project.setName(data.getString("project_name")); +// project.setOriginal(1); +// project.setProcess(process); +// projectMapper.updateById(project); +// +// Workspace workspace = new Workspace(); +// workspace.setAccountId(accountId); +// workspace.setCreateTime(now); +// String ageGroup = data.getString("ageGroup"); +// if (StringUtils.isEmpty(ageGroup)) { +// workspace.setAgeGroup("Adult"); +// }else { +// if (AgeGroup.isValidName(process)) { +// workspace.setAgeGroup(ageGroup); +// }else { +// workspace.setAgeGroup("Adult"); +// } +// } +// String gender = data.getString("gender"); +// if (StringUtils.isEmpty(gender)) { +// workspace.setSex("Female"); +// }else { +// if (Sex.isValidName(gender)) { +// workspace.setSex(gender); +// }else { +// workspace.setSex("Female"); +// } +// } +// String position = data.getString("position"); +// if (process.equals(DesignProcess.SERIES_DESIGN.name())) { +// workspace.setPosition("Overall"); +// }else { +// if (StringUtils.isEmpty(position)) { +// if (workspace.getSex().equals("Female")) { +// workspace.setPosition(Position.BLOUSE.getValue()); +// }else { +// workspace.setPosition(Position.TOPS.getValue()); +// } +// }else { +// if (Position.isValidName(position)) { +// workspace.setPosition(position); +// }else { +// if (workspace.getSex().equals("Female")) { +// workspace.setPosition(Position.BLOUSE.getValue()); +// }else { +// workspace.setPosition(Position.TOPS.getValue()); +// } +// } +// } +// } +// workspace.setSystemDesignerPercentage(30); +// workspace.setProjectId(project.getId()); +// workspace.setAccountId(accountId); +// String style = data.getString("style"); +// String styleName = null; +// if (StringUtils.isEmpty(style)) { +// styleName = StyleEnum.NEW_CHINESE.name(); +// }else { +// if (StyleEnum.isValidName(style)) { +// styleName = style; +// }else { +// styleName = StyleEnum.NEW_CHINESE.name(); +// } +// } +// +// SysFile sysFile = sysFileService.getOneBySex(styleName, workspace.getSex(), workspace.getAgeGroup()); +// +// if (workspace.getSex().equals(Sex.FEMALE.getValue())) { +// workspace.setMannequinFemaleId(sysFile.getId()); +// workspace.setMannequinFemaleType("System"); +// }else { +// workspace.setMannequinMaleId(sysFile.getId()); +// workspace.setMannequinMaleType("System"); +// } +// +// workspaceMapper.insert(workspace); +// +// if (!StringUtils.isEmpty(styleName)) { +// QueryWrapper