TASK:mixi;

This commit is contained in:
shahaibo
2024-08-06 17:20:11 +08:00
parent cde9bbbb00
commit 52f2fb0855
8 changed files with 195 additions and 41 deletions

View File

@@ -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<OutfitRecommendation> QEfilling(@Valid @RequestBody AIRecommendDTO aiRecommendDTO) {
return Response.success(tAppProductService.aiRecommend(aiRecommendDTO));
@PostMapping("/qeFilling")
public Response<Boolean> qeFilling(@Valid @RequestBody QeFillingDTO qEFillingDTO) {
return Response.success(tAppProductService.qeFilling(qEFillingDTO));
}
@ApiOperation(value = "检测是否填写过问卷")
@PostMapping("/checkQFilling")
public Response<Boolean> checkQFilling(@Valid @RequestBody QeFillingDTO qEFillingDTO) {
return Response.success(tAppProductService.checkQFilling(qEFillingDTO));
}
}

View File

@@ -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<QeFilling> {
}

View File

@@ -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;
}

View File

@@ -0,0 +1,8 @@
package com.mixi.model.dto;
import com.mixi.mapper.entity.QeFilling;
import lombok.Data;
@Data
public class QeFillingDTO extends QeFilling {
}

View File

@@ -30,4 +30,6 @@ public class SearchProductPageDTO extends PageQueryBaseVo implements Serializabl
private String color;
private String itemCode;
}

View File

@@ -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<String> items;
private String description;
private String reasons;
private List<String> imageUrls;
private List<String> imageUrls = new ArrayList<>();
private String markdownContent;
public void addImageUrl(String imageUrl) {
this.imageUrls.add(imageUrl);
}
}

View File

@@ -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")

View File

@@ -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<TProductMapper, TProduct> {
// qw.lambda().eq(MiTuMember::getMbrCode, query.getMemberCode());
// miTuMemberMapper.selectList(qw).get(0);
// }
System.out.println(query);
// 分页数据
QueryWrapper<TProduct> queryWrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(query.getStoreId())) {
@@ -637,6 +634,18 @@ public class TAppProductService extends ServiceImpl<TProductMapper, TProduct> {
}
}
if (!StringUtils.isEmpty(query.getItemCode())) {
QueryWrapper<MiTuProduct> qw = new QueryWrapper<>();
qw.lambda().like(MiTuProduct::getItemCode, query.getItemCode());
List<MiTuProduct> miTuProductList = miTuProductMapper.selectList(qw);
if (!CollectionUtils.isEmpty(miTuProductList)) {
List<Long> 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<TProductMapper, TProduct> {
+ 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<String> urls = extractBracketContents(output);
Map<String, String> 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<TProduct> qw = new QueryWrapper<>();
qw.lambda().like(TProduct::getPictureName, pictureName);
List<TProduct> 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<String> extractBracketContents(String input) {
List<String> 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<QeFilling> qw = new QueryWrapper<>();
qw.lambda().eq(QeFilling::getPhoneNum, qEFillingDTO.getPhoneNum());
List<QeFilling> 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<QeFilling> qw = new QueryWrapper<>();
qw.lambda().eq(QeFilling::getPhoneNum, qEFillingDTO.getPhoneNum());
List<QeFilling> qeFillings = qeFillingMapper.selectList(qw);
if (CollectionUtils.isEmpty(qeFillings)) {
return Boolean.FALSE;
}else {
return Boolean.TRUE;
}
}
}