TASK:mixi;
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
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 itemCode;
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user