TASK:mixi;
This commit is contained in:
@@ -18,9 +18,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
@Api(tags = "App端-商品")
|
@Api(tags = "App端-商品")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -125,8 +123,14 @@ public class AppProductController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "问卷填写")
|
@ApiOperation(value = "问卷填写")
|
||||||
@PostMapping("/QEfilling")
|
@PostMapping("/qeFilling")
|
||||||
public Response<OutfitRecommendation> QEfilling(@Valid @RequestBody AIRecommendDTO aiRecommendDTO) {
|
public Response<Boolean> qeFilling(@Valid @RequestBody QeFillingDTO qEFillingDTO) {
|
||||||
return Response.success(tAppProductService.aiRecommend(aiRecommendDTO));
|
return Response.success(tAppProductService.qeFilling(qEFillingDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "检测是否填写过问卷")
|
||||||
|
@PostMapping("/checkQFilling")
|
||||||
|
public Response<Boolean> checkQFilling(@Valid @RequestBody QeFillingDTO qEFillingDTO) {
|
||||||
|
return Response.success(tAppProductService.checkQFilling(qEFillingDTO));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/main/java/com/mixi/mapper/QeFillingMapper.java
Normal file
7
src/main/java/com/mixi/mapper/QeFillingMapper.java
Normal 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> {
|
||||||
|
}
|
||||||
25
src/main/java/com/mixi/mapper/entity/QeFilling.java
Normal file
25
src/main/java/com/mixi/mapper/entity/QeFilling.java
Normal 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;
|
||||||
|
}
|
||||||
8
src/main/java/com/mixi/model/dto/QeFillingDTO.java
Normal file
8
src/main/java/com/mixi/model/dto/QeFillingDTO.java
Normal 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 {
|
||||||
|
}
|
||||||
@@ -30,4 +30,6 @@ public class SearchProductPageDTO extends PageQueryBaseVo implements Serializabl
|
|||||||
|
|
||||||
private String color;
|
private String color;
|
||||||
|
|
||||||
|
private String itemCode;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,17 @@ package com.mixi.model.vo;
|
|||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class OutfitRecommendation {
|
public class OutfitRecommendation {
|
||||||
private List<String> items;
|
private String description;
|
||||||
private String reasons;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -586,7 +586,7 @@ public class PythonService {
|
|||||||
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
|
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
|
||||||
Request request = new Request.Builder()
|
Request request = new Request.Builder()
|
||||||
// .url(accessPythonIp + ":9993/api/similar_matchsimilar_match")
|
// .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)
|
.method("POST", body)
|
||||||
// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
|
// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
|
||||||
.addHeader("Content-Type", "application/json")
|
.addHeader("Content-Type", "application/json")
|
||||||
|
|||||||
@@ -12,10 +12,7 @@ import com.mixi.common.config.exception.BusinessException;
|
|||||||
import com.mixi.common.context.UserContext;
|
import com.mixi.common.context.UserContext;
|
||||||
import com.mixi.common.response.PageBaseResponse;
|
import com.mixi.common.response.PageBaseResponse;
|
||||||
import com.mixi.common.utils.*;
|
import com.mixi.common.utils.*;
|
||||||
import com.mixi.mapper.MiTuMemberMapper;
|
import com.mixi.mapper.*;
|
||||||
import com.mixi.mapper.MiTuProductMapper;
|
|
||||||
import com.mixi.mapper.MiTuProductSellNumMapper;
|
|
||||||
import com.mixi.mapper.TProductMapper;
|
|
||||||
import com.mixi.mapper.entity.*;
|
import com.mixi.mapper.entity.*;
|
||||||
import com.mixi.model.dto.*;
|
import com.mixi.model.dto.*;
|
||||||
import com.mixi.model.vo.*;
|
import com.mixi.model.vo.*;
|
||||||
@@ -589,7 +586,7 @@ public class TAppProductService extends ServiceImpl<TProductMapper, TProduct> {
|
|||||||
// qw.lambda().eq(MiTuMember::getMbrCode, query.getMemberCode());
|
// qw.lambda().eq(MiTuMember::getMbrCode, query.getMemberCode());
|
||||||
// miTuMemberMapper.selectList(qw).get(0);
|
// miTuMemberMapper.selectList(qw).get(0);
|
||||||
// }
|
// }
|
||||||
|
System.out.println(query);
|
||||||
// 分页数据
|
// 分页数据
|
||||||
QueryWrapper<TProduct> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<TProduct> queryWrapper = new QueryWrapper<>();
|
||||||
if (!StringUtils.isEmpty(query.getStoreId())) {
|
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("on_sale_state", 1);
|
||||||
queryWrapper.eq("upload_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();
|
+ File.separator + userId + File.separator + UUID.randomUUID().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private TProductMapper productMapper;
|
||||||
|
|
||||||
|
// @Resource
|
||||||
|
// private MinioUtil minioUtil;
|
||||||
|
|
||||||
public OutfitRecommendation aiRecommend(AIRecommendDTO aiRecommendDTO) {
|
public OutfitRecommendation aiRecommend(AIRecommendDTO aiRecommendDTO) {
|
||||||
|
// 创建推荐对象
|
||||||
|
OutfitRecommendation recommendation = new OutfitRecommendation();
|
||||||
|
|
||||||
// 调用ai推荐模型
|
// 调用ai推荐模型
|
||||||
JSONObject jsonObject = pythonService.getAIRecommend(aiRecommendDTO);
|
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");
|
String output = jsonObject.getString("output");
|
||||||
|
|
||||||
// 提取服装描述
|
List<String> urls = extractBracketContents(output);
|
||||||
Pattern descriptionPattern = Pattern.compile("### Outfit Description:[\\s\\S]*?### Reasons for Recommendation:");
|
Map<String, String> map = new HashMap<>();
|
||||||
Matcher descriptionMatcher = descriptionPattern.matcher(output);
|
for (String url : urls) {
|
||||||
if (descriptionMatcher.find()) {
|
if (url.contains("/")) {
|
||||||
String description = descriptionMatcher.group();
|
String[] split = url.split("/");
|
||||||
String[] lines = description.split("\\n");
|
String s = split[split.length - 1];
|
||||||
for (String line : lines) {
|
if (s.contains(".")) {
|
||||||
if (line.startsWith("1.") || line.startsWith("2.") || line.startsWith("3.") || line.startsWith("4.") || line.startsWith("5.")) {
|
String[] split1 = s.split("\\.");
|
||||||
recommendation.getItems().add(line.trim());
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提取理由
|
for (String s : map.keySet()) {
|
||||||
Pattern reasonsPattern = Pattern.compile("### Reasons for Recommendation:[\\s\\S]*?### Reference Images:");
|
output = output.replace(s, map.get(s));
|
||||||
Matcher reasonsMatcher = reasonsPattern.matcher(output);
|
|
||||||
if (reasonsMatcher.find()) {
|
|
||||||
String reasons = reasonsMatcher.group();
|
|
||||||
recommendation.setReasons(reasons.trim());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提取参考图片
|
System.out.println(output);
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// // 解析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;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user