Compare commits
13 Commits
dev/dev-xp
...
3561cd098a
| Author | SHA1 | Date | |
|---|---|---|---|
| 3561cd098a | |||
| dbf6c45ec8 | |||
|
|
adde1b007e | ||
|
|
9fb7f3128b | ||
|
|
e285b252df | ||
|
|
61faf40ca4 | ||
|
|
002e39a99f | ||
|
|
e08517cdcc | ||
|
|
8fb082d5bc | ||
|
|
e665b50bb4 | ||
| 71343010d5 | |||
| 5a4201595b | |||
| 8d48ba94f5 |
@@ -1,9 +1,11 @@
|
|||||||
package com.aida.lanecarford.controller;
|
package com.aida.lanecarford.controller;
|
||||||
|
|
||||||
import com.aida.lanecarford.common.ApiResponse;
|
import com.aida.lanecarford.common.ApiResponse;
|
||||||
|
import com.aida.lanecarford.entity.Suggestion;
|
||||||
import com.aida.lanecarford.entity.TryOnEffect;
|
import com.aida.lanecarford.entity.TryOnEffect;
|
||||||
import com.aida.lanecarford.service.TryOnEffectService;
|
import com.aida.lanecarford.service.TryOnEffectService;
|
||||||
import com.aida.lanecarford.vo.TryOnResultVo;
|
import com.aida.lanecarford.vo.TryOnResultVo;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
@@ -11,6 +13,7 @@ import jakarta.validation.Valid;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -77,4 +80,39 @@ public class TryOnEffectController {
|
|||||||
tryOnEffectService.cancelFavoriteTryOnEffect(tryOnId);
|
tryOnEffectService.cancelFavoriteTryOnEffect(tryOnId);
|
||||||
return ApiResponse.success();
|
return ApiResponse.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 为生成结果添加意见和建议
|
||||||
|
*/
|
||||||
|
@Operation(summary = "为生成结果添加意见和建议", description = "为指定试穿效果添加意见和建议")
|
||||||
|
@PostMapping("/add-comment")
|
||||||
|
public ApiResponse<Void> addComment(@RequestBody Suggestion suggestion) {
|
||||||
|
tryOnEffectService.addComment(suggestion);
|
||||||
|
return ApiResponse.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 首页默认图换脸演示
|
||||||
|
*/
|
||||||
|
@Operation(summary = "首页点击换脸", description = "传入上传顾客照片后得到的ID")
|
||||||
|
@PostMapping("/reFace")
|
||||||
|
public ApiResponse<String> reFace(@Nullable @RequestParam Long customerPhotoId,
|
||||||
|
@Nullable @RequestParam String prompt,
|
||||||
|
@Nullable @RequestParam String tryonUrl) {
|
||||||
|
if (customerPhotoId == null&& StringUtil.isNullOrEmpty(prompt)&& StringUtil.isNullOrEmpty(tryonUrl)){
|
||||||
|
return ApiResponse.error("system error:Parameter null");
|
||||||
|
}
|
||||||
|
String result = "";
|
||||||
|
if (StringUtil.isNullOrEmpty(prompt)){
|
||||||
|
//换脸
|
||||||
|
result = tryOnEffectService.reFace(customerPhotoId);
|
||||||
|
}else {
|
||||||
|
if (StringUtil.isNullOrEmpty(tryonUrl)){
|
||||||
|
return ApiResponse.error("system error:Parameter null");
|
||||||
|
}
|
||||||
|
//根据提示词修改图像
|
||||||
|
result = tryOnEffectService.generateUrl(prompt,tryonUrl);
|
||||||
|
}
|
||||||
|
return ApiResponse.success("操作成功",result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
53
src/main/java/com/aida/lanecarford/entity/Suggestion.java
Normal file
53
src/main/java/com/aida/lanecarford/entity/Suggestion.java
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
package com.aida.lanecarford.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 意见建议实体类
|
||||||
|
*
|
||||||
|
* @author AI Assistant
|
||||||
|
* @since 2024-01-01
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("suggestions")
|
||||||
|
public class Suggestion extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 顾客ID
|
||||||
|
*/
|
||||||
|
@Schema(description = "顾客ID", example = "1", required = true)
|
||||||
|
@TableField("customer_id")
|
||||||
|
private Long customerId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 进店记录ID
|
||||||
|
*/
|
||||||
|
@Schema(description = "进店记录ID", example = "1", required = true)
|
||||||
|
@TableField("visit_record_id")
|
||||||
|
private Long visitRecordId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 试穿效果ID
|
||||||
|
*/
|
||||||
|
@Schema(description = "试穿效果ID", example = "1", required = true)
|
||||||
|
@TableField("try_on_effects_id")
|
||||||
|
private Long tryOnEffectsId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 意见建议内容
|
||||||
|
*/
|
||||||
|
@Schema(description = "意见建议内容", example = "这件衣服颜色不太合适,建议换成浅色系", required = true)
|
||||||
|
@TableField("suggestion")
|
||||||
|
private String suggestion;
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.aida.lanecarford.mapper;
|
||||||
|
|
||||||
|
import com.aida.lanecarford.entity.Suggestion;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 意见建议Mapper接口
|
||||||
|
*
|
||||||
|
* @author AI Assistant
|
||||||
|
* @since 2024-01-01
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface SuggestionMapper extends BaseMapper<Suggestion> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.aida.lanecarford.service;
|
package com.aida.lanecarford.service;
|
||||||
|
|
||||||
|
import com.aida.lanecarford.entity.Suggestion;
|
||||||
import com.aida.lanecarford.entity.TryOnEffect;
|
import com.aida.lanecarford.entity.TryOnEffect;
|
||||||
import com.aida.lanecarford.vo.TryOnResultVo;
|
import com.aida.lanecarford.vo.TryOnResultVo;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
@@ -32,4 +33,15 @@ public interface TryOnEffectService extends IService<TryOnEffect> {
|
|||||||
void cancelFavoriteTryOnEffect(Long tryOnId);
|
void cancelFavoriteTryOnEffect(Long tryOnId);
|
||||||
|
|
||||||
List<TryOnResultVo> getTryOnEffectsByStyleId(Long styleId);
|
List<TryOnResultVo> getTryOnEffectsByStyleId(Long styleId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加意见建议
|
||||||
|
* @param suggestion 意见建议实体
|
||||||
|
* @return 是否添加成功
|
||||||
|
*/
|
||||||
|
boolean addComment(Suggestion suggestion);
|
||||||
|
|
||||||
|
String reFace(Long customerPhotoId);
|
||||||
|
|
||||||
|
String generateUrl(String prompt, String tryonUrl);
|
||||||
}
|
}
|
||||||
@@ -10,8 +10,10 @@ import com.aida.lanecarford.entity.*;
|
|||||||
import com.aida.lanecarford.exception.BusinessException;
|
import com.aida.lanecarford.exception.BusinessException;
|
||||||
import com.aida.lanecarford.mapper.CustomerMapper;
|
import com.aida.lanecarford.mapper.CustomerMapper;
|
||||||
import com.aida.lanecarford.mapper.OutfitRequestMapper;
|
import com.aida.lanecarford.mapper.OutfitRequestMapper;
|
||||||
|
import com.aida.lanecarford.mapper.SuggestionMapper;
|
||||||
import com.aida.lanecarford.mapper.TryOnEffectMapper;
|
import com.aida.lanecarford.mapper.TryOnEffectMapper;
|
||||||
import com.aida.lanecarford.service.*;
|
import com.aida.lanecarford.service.*;
|
||||||
|
import com.aida.lanecarford.entity.Suggestion;
|
||||||
import com.aida.lanecarford.util.MinioUtil;
|
import com.aida.lanecarford.util.MinioUtil;
|
||||||
import com.aida.lanecarford.util.StringListConverter;
|
import com.aida.lanecarford.util.StringListConverter;
|
||||||
import com.aida.lanecarford.vo.TryOnResultVo;
|
import com.aida.lanecarford.vo.TryOnResultVo;
|
||||||
@@ -53,6 +55,7 @@ public class TryOnEffectServiceImpl extends ServiceImpl<TryOnEffectMapper, TryOn
|
|||||||
private final MinioUtil minioUtil;
|
private final MinioUtil minioUtil;
|
||||||
private final MinioConfig minioConfig;
|
private final MinioConfig minioConfig;
|
||||||
private final FaceSwapConfig faceSwapConfig;
|
private final FaceSwapConfig faceSwapConfig;
|
||||||
|
private final SuggestionMapper suggestionMapper;
|
||||||
private final OutfitRequestMapper outfitRequestMapper;
|
private final OutfitRequestMapper outfitRequestMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -115,7 +118,7 @@ public class TryOnEffectServiceImpl extends ServiceImpl<TryOnEffectMapper, TryOn
|
|||||||
sb.append(",");
|
sb.append(",");
|
||||||
}
|
}
|
||||||
|
|
||||||
prompt = "A full-body, photorealistic professional studio shot of a **young " + outfitRequest.getGender() + "**, mid-20s, with **clear facial features and a confident expression**. The model is centered in the frame.They are **standing in a direct, static, full-view pose** on a **clean, light white backdrop** **The entire figure, from head to toe, should be in frame and occupy approximately 80% of the vertical space.**.\n" +
|
prompt = "A full-body, photorealistic professional studio shot of a **young " + outfitRequest.getGender() + "**, mid-20s, with **clear facial features and a confident expression**. The model is centered in the frame.They are **standing in a direct, static, full-view pose** on a **clean, pure white background** **The entire figure, from head to toe, should be in frame and occupy approximately 80% of the vertical space.**.\n" +
|
||||||
"\n" +
|
"\n" +
|
||||||
"**CRITICAL COMPOSITION INSTRUCTION:**\n" +
|
"**CRITICAL COMPOSITION INSTRUCTION:**\n" +
|
||||||
"Generate a single, seamless image of the model with a complete and fully visible head,**wearing ALL distinct items("+sb.toString()+")** from the uploaded image. **ALL items MUST be visible and correctly worn in the final outfit.**" +
|
"Generate a single, seamless image of the model with a complete and fully visible head,**wearing ALL distinct items("+sb.toString()+")** from the uploaded image. **ALL items MUST be visible and correctly worn in the final outfit.**" +
|
||||||
@@ -179,6 +182,79 @@ public class TryOnEffectServiceImpl extends ServiceImpl<TryOnEffectMapper, TryOn
|
|||||||
return tryOnResultVos;
|
return tryOnResultVos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加意见建议
|
||||||
|
* @param suggestion 意见建议实体
|
||||||
|
* @return 是否添加成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean addComment(Suggestion suggestion) {
|
||||||
|
try {
|
||||||
|
// 保存意见建议
|
||||||
|
int result = suggestionMapper.insert(suggestion);
|
||||||
|
|
||||||
|
if (result > 0) {
|
||||||
|
log.info("意见建议添加成功 - id: {}", suggestion.getId());
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
log.error("意见建议添加失败");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("添加意见建议时发生异常: {}", e.getMessage(), e);
|
||||||
|
throw new BusinessException("Add suggestion failed", "添加意见建议失败", ResultEnum.ERROR.getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String reFace(Long customerPhotoId) {
|
||||||
|
|
||||||
|
List<String> imageUrls = new ArrayList<>();
|
||||||
|
//默认展示图片
|
||||||
|
imageUrls.add("lanecarford/try_on_result/default.jpg");
|
||||||
|
|
||||||
|
if (customerPhotoId != null) {
|
||||||
|
//根据id查到对应customerurl
|
||||||
|
CustomerPhoto customerPhoto = customerPhotoService.getById(customerPhotoId);
|
||||||
|
String customerPhotoUrl = customerPhoto.getPhotoUrl();
|
||||||
|
if (customerPhotoUrl != null && !customerPhotoUrl.trim().isEmpty()) {
|
||||||
|
imageUrls.add(customerPhotoUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String aiRreultlogicalUrl = callFaceSwapAPI(imageUrls);
|
||||||
|
String presignedUrl = minioUtil.getPresignedUrl(aiRreultlogicalUrl, CommonConstants.MINIO_PATH_TIMEOUT);
|
||||||
|
return presignedUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String generateUrl(String prompt, String tryonUrl) {
|
||||||
|
int startIndex = tryonUrl.indexOf("lanecarford");
|
||||||
|
String aiRreultlogicalUrl = "";
|
||||||
|
if (startIndex != -1) {
|
||||||
|
// 支持jpg和png格式的图片识别
|
||||||
|
int jpgEndIndex = tryonUrl.indexOf(".jpg");
|
||||||
|
int pngEndIndex = tryonUrl.indexOf(".png");
|
||||||
|
|
||||||
|
int endIndex = -1;
|
||||||
|
|
||||||
|
if (jpgEndIndex != -1 && (pngEndIndex == -1 || jpgEndIndex < pngEndIndex)) {
|
||||||
|
// 找到jpg格式
|
||||||
|
endIndex = jpgEndIndex + ".jpg".length();
|
||||||
|
} else if (pngEndIndex != -1 && (jpgEndIndex == -1 || pngEndIndex < jpgEndIndex)) {
|
||||||
|
// 找到png格式
|
||||||
|
endIndex = pngEndIndex + ".png".length();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endIndex != -1) {
|
||||||
|
String resultString = tryonUrl.substring(startIndex, endIndex);
|
||||||
|
aiRreultlogicalUrl = AITryOnEffect(prompt, Arrays.asList(resultString));
|
||||||
|
} else {
|
||||||
|
log.error("未找到jpg或png格式的图片,无法识别图片类型");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minioUtil.convertToPresignedUrl(aiRreultlogicalUrl, CommonConstants.MINIO_PATH_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
//目前用于customize your look页面点击finish后的显示
|
//目前用于customize your look页面点击finish后的显示
|
||||||
@Override
|
@Override
|
||||||
public List<TryOnResultVo> getTryOnEffectsByStyleId(Long styleId) {
|
public List<TryOnResultVo> getTryOnEffectsByStyleId(Long styleId) {
|
||||||
|
|||||||
@@ -166,4 +166,19 @@ CREATE TABLE `outfit_request` (
|
|||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='穿搭请求表';
|
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='穿搭请求表';
|
||||||
|
|
||||||
|
-- 9. 意见建议表
|
||||||
|
CREATE TABLE `suggestions` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '意见建议ID',
|
||||||
|
`customer_id` bigint NOT NULL COMMENT '顾客ID',
|
||||||
|
`visit_record_id` bigint NOT NULL COMMENT '进店记录ID',
|
||||||
|
`try_on_effects_id` bigint NOT NULL COMMENT '试穿效果ID',
|
||||||
|
`suggestion` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '意见建议内容',
|
||||||
|
`created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` tinyint DEFAULT '0' COMMENT '逻辑删除标志(0-未删除,1-已删除)',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='意见建议表';
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user