From 52f2fb0855a6eb691a089f431a11408087a0daee Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 6 Aug 2024 17:20:11 +0800 Subject: [PATCH] TASK:mixi; --- .../mixi/controller/AppProductController.java | 14 +- .../java/com/mixi/mapper/QeFillingMapper.java | 7 + .../com/mixi/mapper/entity/QeFilling.java | 25 +++ .../java/com/mixi/model/dto/QeFillingDTO.java | 8 + .../mixi/model/dto/SearchProductPageDTO.java | 2 + .../mixi/model/vo/OutfitRecommendation.java | 10 +- .../java/com/mixi/service/PythonService.java | 2 +- .../com/mixi/service/TAppProductService.java | 168 ++++++++++++++---- 8 files changed, 195 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/mixi/mapper/QeFillingMapper.java create mode 100644 src/main/java/com/mixi/mapper/entity/QeFilling.java create mode 100644 src/main/java/com/mixi/model/dto/QeFillingDTO.java diff --git a/src/main/java/com/mixi/controller/AppProductController.java b/src/main/java/com/mixi/controller/AppProductController.java index 9d8b838..091aaa7 100644 --- a/src/main/java/com/mixi/controller/AppProductController.java +++ b/src/main/java/com/mixi/controller/AppProductController.java @@ -18,9 +18,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; -import java.math.BigDecimal; import java.util.List; -import java.util.stream.Stream; @Api(tags = "App端-商品") @Slf4j @@ -125,8 +123,14 @@ public class AppProductController { } @ApiOperation(value = "问卷填写") - @PostMapping("/QEfilling") - public Response QEfilling(@Valid @RequestBody AIRecommendDTO aiRecommendDTO) { - return Response.success(tAppProductService.aiRecommend(aiRecommendDTO)); + @PostMapping("/qeFilling") + public Response qeFilling(@Valid @RequestBody QeFillingDTO qEFillingDTO) { + return Response.success(tAppProductService.qeFilling(qEFillingDTO)); + } + + @ApiOperation(value = "检测是否填写过问卷") + @PostMapping("/checkQFilling") + public Response checkQFilling(@Valid @RequestBody QeFillingDTO qEFillingDTO) { + return Response.success(tAppProductService.checkQFilling(qEFillingDTO)); } } diff --git a/src/main/java/com/mixi/mapper/QeFillingMapper.java b/src/main/java/com/mixi/mapper/QeFillingMapper.java new file mode 100644 index 0000000..77aa8c9 --- /dev/null +++ b/src/main/java/com/mixi/mapper/QeFillingMapper.java @@ -0,0 +1,7 @@ +package com.mixi.mapper; + +import com.mixi.common.config.mybatis.plus.CommonMapper; +import com.mixi.mapper.entity.QeFilling; + +public interface QeFillingMapper extends CommonMapper { +} diff --git a/src/main/java/com/mixi/mapper/entity/QeFilling.java b/src/main/java/com/mixi/mapper/entity/QeFilling.java new file mode 100644 index 0000000..cc638a0 --- /dev/null +++ b/src/main/java/com/mixi/mapper/entity/QeFilling.java @@ -0,0 +1,25 @@ +package com.mixi.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class QeFilling implements Serializable { + + private static final long serialVersionUID = 1L; + @TableId(value = "id", type = IdType.AUTO) + private Long id; + private String phoneNum; + private String type; + private String q1; + private String q2; + private String q3; + private String q4; + private String q5; + private String q6; + private String q7; + private String q8; +} diff --git a/src/main/java/com/mixi/model/dto/QeFillingDTO.java b/src/main/java/com/mixi/model/dto/QeFillingDTO.java new file mode 100644 index 0000000..400a840 --- /dev/null +++ b/src/main/java/com/mixi/model/dto/QeFillingDTO.java @@ -0,0 +1,8 @@ +package com.mixi.model.dto; + +import com.mixi.mapper.entity.QeFilling; +import lombok.Data; + +@Data +public class QeFillingDTO extends QeFilling { +} diff --git a/src/main/java/com/mixi/model/dto/SearchProductPageDTO.java b/src/main/java/com/mixi/model/dto/SearchProductPageDTO.java index 0d5f769..ffaca61 100644 --- a/src/main/java/com/mixi/model/dto/SearchProductPageDTO.java +++ b/src/main/java/com/mixi/model/dto/SearchProductPageDTO.java @@ -30,4 +30,6 @@ public class SearchProductPageDTO extends PageQueryBaseVo implements Serializabl private String color; + private String itemCode; + } diff --git a/src/main/java/com/mixi/model/vo/OutfitRecommendation.java b/src/main/java/com/mixi/model/vo/OutfitRecommendation.java index af8cf85..70d0d35 100644 --- a/src/main/java/com/mixi/model/vo/OutfitRecommendation.java +++ b/src/main/java/com/mixi/model/vo/OutfitRecommendation.java @@ -2,11 +2,17 @@ package com.mixi.model.vo; import lombok.Data; +import java.util.ArrayList; import java.util.List; @Data public class OutfitRecommendation { - private List items; + private String description; private String reasons; - private List imageUrls; + private List imageUrls = new ArrayList<>(); + private String markdownContent; + + public void addImageUrl(String imageUrl) { + this.imageUrls.add(imageUrl); + } } diff --git a/src/main/java/com/mixi/service/PythonService.java b/src/main/java/com/mixi/service/PythonService.java index f63c52f..a068058 100644 --- a/src/main/java/com/mixi/service/PythonService.java +++ b/src/main/java/com/mixi/service/PythonService.java @@ -586,7 +586,7 @@ public class PythonService { RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); Request request = new Request.Builder() // .url(accessPythonIp + ":9993/api/similar_matchsimilar_match") - .url("http://192.168.1.3:5001/chat") + .url("http://18.167.251.121:10001/chat") .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") diff --git a/src/main/java/com/mixi/service/TAppProductService.java b/src/main/java/com/mixi/service/TAppProductService.java index 8be5c39..558e033 100644 --- a/src/main/java/com/mixi/service/TAppProductService.java +++ b/src/main/java/com/mixi/service/TAppProductService.java @@ -12,10 +12,7 @@ import com.mixi.common.config.exception.BusinessException; import com.mixi.common.context.UserContext; import com.mixi.common.response.PageBaseResponse; import com.mixi.common.utils.*; -import com.mixi.mapper.MiTuMemberMapper; -import com.mixi.mapper.MiTuProductMapper; -import com.mixi.mapper.MiTuProductSellNumMapper; -import com.mixi.mapper.TProductMapper; +import com.mixi.mapper.*; import com.mixi.mapper.entity.*; import com.mixi.model.dto.*; import com.mixi.model.vo.*; @@ -589,7 +586,7 @@ public class TAppProductService extends ServiceImpl { // qw.lambda().eq(MiTuMember::getMbrCode, query.getMemberCode()); // miTuMemberMapper.selectList(qw).get(0); // } - + System.out.println(query); // 分页数据 QueryWrapper queryWrapper = new QueryWrapper<>(); if (!StringUtils.isEmpty(query.getStoreId())) { @@ -637,6 +634,18 @@ public class TAppProductService extends ServiceImpl { } } + if (!StringUtils.isEmpty(query.getItemCode())) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().like(MiTuProduct::getItemCode, query.getItemCode()); + List miTuProductList = miTuProductMapper.selectList(qw); + if (!CollectionUtils.isEmpty(miTuProductList)) { + List collect = miTuProductList.stream().map(MiTuProduct::getProductId).collect(Collectors.toList()); + queryWrapper.in("id", collect); + }else { + return PageBaseResponse.success(new Page<>()); + } + } + //上架 queryWrapper.eq("on_sale_state", 1); queryWrapper.eq("upload_state", 1); @@ -707,48 +716,141 @@ public class TAppProductService extends ServiceImpl { + File.separator + userId + File.separator + UUID.randomUUID().toString(); } + @Resource + private TProductMapper productMapper; + +// @Resource +// private MinioUtil minioUtil; + public OutfitRecommendation aiRecommend(AIRecommendDTO aiRecommendDTO) { + // 创建推荐对象 + OutfitRecommendation recommendation = new OutfitRecommendation(); // 调用ai推荐模型 JSONObject jsonObject = pythonService.getAIRecommend(aiRecommendDTO); - OutfitRecommendation recommendation = new OutfitRecommendation(); - // 从 JSON 对象中提取 output 字符串 + // 检查jsonObject是否为null + if (jsonObject == null) { + throw new NullPointerException("The response from Python service is null"); + } + + // 从JSON对象中获取output字段 String output = jsonObject.getString("output"); - // 提取服装描述 - Pattern descriptionPattern = Pattern.compile("### Outfit Description:[\\s\\S]*?### Reasons for Recommendation:"); - Matcher descriptionMatcher = descriptionPattern.matcher(output); - if (descriptionMatcher.find()) { - String description = descriptionMatcher.group(); - String[] lines = description.split("\\n"); - for (String line : lines) { - if (line.startsWith("1.") || line.startsWith("2.") || line.startsWith("3.") || line.startsWith("4.") || line.startsWith("5.")) { - recommendation.getItems().add(line.trim()); + List urls = extractBracketContents(output); + Map map = new HashMap<>(); + for (String url : urls) { + if (url.contains("/")) { + String[] split = url.split("/"); + String s = split[split.length - 1]; + if (s.contains(".")) { + String[] split1 = s.split("\\."); + String pictureName = split1[0]; + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().like(TProduct::getPictureName, pictureName); + List productList = productMapper.selectList(qw); + if (!CollectionUtils.isEmpty(productList)) { + String pictureUrl = productList.get(0).getPictureUrl(); + String presignedUrl = minioUtil.getPresignedUrl(pictureUrl, 24 * 60); + map.put(url, presignedUrl); + recommendation.addImageUrl(presignedUrl); + } } } } - // 提取理由 - Pattern reasonsPattern = Pattern.compile("### Reasons for Recommendation:[\\s\\S]*?### Reference Images:"); - Matcher reasonsMatcher = reasonsPattern.matcher(output); - if (reasonsMatcher.find()) { - String reasons = reasonsMatcher.group(); - recommendation.setReasons(reasons.trim()); + for (String s : map.keySet()) { + output = output.replace(s, map.get(s)); } - // 提取参考图片 - Pattern imagesPattern = Pattern.compile("### Reference Images:[\\s\\S]*"); - Matcher imagesMatcher = imagesPattern.matcher(output); - if (imagesMatcher.find()) { - String images = imagesMatcher.group(); - Pattern imagePattern = Pattern.compile("\\!\\[.*?\\]\\((.*?)\\)"); - Matcher imageMatcher = imagePattern.matcher(images); - while (imageMatcher.find()) { - recommendation.getImageUrls().add(imageMatcher.group(1)); - } - } + System.out.println(output); +// // 解析output字符串 +// String[] parts = output.split("\n\n"); +// +// // 创建Markdown格式内容 +// StringBuilder markdownBuilder = new StringBuilder(); +// +// // 处理描述部分 +// if (parts.length > 1) { +// markdownBuilder.append("### Outfit Description:\n"); +// markdownBuilder.append(parts[1]).append("\n\n"); +// } +// +// // 处理推荐理由部分 +// markdownBuilder.append("### Reasons for Recommendation:\n"); +// StringBuilder reasonsBuilder = new StringBuilder(); +// for (int i = 2; i < parts.length; i++) { +// if (parts[i].contains("![") && parts[i].contains("](") && parts[i].contains(")")) { +// // 找到图像URL部分 +// try { +// String imageUrlPart = parts[i]; +// String imageUrl = imageUrlPart.substring(imageUrlPart.indexOf("](") + 2, imageUrlPart.indexOf(")")); +// recommendation.addImageUrl(imageUrl); +// +// // 添加到Markdown +// markdownBuilder.append(imageUrlPart).append("\n\n"); +// } catch (StringIndexOutOfBoundsException e) { +// // 捕获异常并继续处理剩余的部分 +// e.printStackTrace(); +// } +// } else { +// reasonsBuilder.append(parts[i]).append("\n\n"); +// } +// } +// recommendation.setReasons(reasonsBuilder.toString().trim()); +// +// // 将推荐理由添加到Markdown +// markdownBuilder.append(recommendation.getReasons()).append("\n\n"); + + // 设置Markdown内容 + recommendation.setMarkdownContent(output); + +// System.out.println(markdownBuilder.toString().trim()); return recommendation; } + + public List extractBracketContents(String input) { + List result = new ArrayList<>(); + // 定义正则表达式以匹配括号内的内容 + Pattern pattern = Pattern.compile("\\(([^)]+)\\)"); + Matcher matcher = pattern.matcher(input); + + // 遍历所有匹配项并将其添加到结果列表中 + while (matcher.find()) { + result.add(matcher.group(1)); + } + + return result; + } + + + + @Resource + private QeFillingMapper qeFillingMapper; + + public Boolean qeFilling(QeFillingDTO qEFillingDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(QeFilling::getPhoneNum, qEFillingDTO.getPhoneNum()); + List qeFillings = qeFillingMapper.selectList(qw); + if (CollectionUtils.isEmpty(qeFillings)) { + qeFillingMapper.insert(CopyUtil.copyObject(qEFillingDTO, QeFilling.class)); + }else { + QeFilling qeFilling = CopyUtil.copyObject(qEFillingDTO, QeFilling.class); + qeFilling.setId(qeFillings.get(0).getId()); + qeFillingMapper.updateById(qeFilling); + } + return Boolean.TRUE; + } + + public Boolean checkQFilling(QeFillingDTO qEFillingDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(QeFilling::getPhoneNum, qEFillingDTO.getPhoneNum()); + List qeFillings = qeFillingMapper.selectList(qw); + if (CollectionUtils.isEmpty(qeFillings)) { + return Boolean.FALSE; + }else { + return Boolean.TRUE; + } + } }