From 8750ea355aa6099e7a04aac790adc54de3d56799 Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 13 Nov 2025 11:40:37 +0800 Subject: [PATCH] =?UTF-8?q?TASK:1.=E4=BF=AE=E6=94=B9affiliate=E7=8A=B6?= =?UTF-8?q?=E6=80=81=202.=E6=B7=BB=E5=8A=A0=E7=B3=BB=E7=BB=9Fsketch?= =?UTF-8?q?=E5=88=B0=E4=B8=AA=E4=BA=BAlibrary=203.=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=96=B0=E5=A2=9E=E7=94=9F=E6=88=90=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=204.=E8=8E=B7=E5=8F=96=E6=89=80=E6=9C=89pose=EF=BC=8C?= =?UTF-8?q?=E4=BB=8E=E8=BF=87=E5=8E=BBgif=E6=94=B9=E4=B8=BA=E8=8E=B7?= =?UTF-8?q?=E5=8F=96video?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/constant/CommonConstant.java | 3 +- .../enums/CollectionLevel2TypeEnum.java | 3 + .../ai/da/common/enums/MotionModeEnum.java | 29 ++++ .../java/com/ai/da/common/enums/PoseEnum.java | 1 + .../com/ai/da/common/utils/MinioUtil.java | 41 +++++ .../ai/da/controller/AffiliateController.java | 6 + .../ai/da/controller/LibraryController.java | 6 + .../da/mapper/primary/entity/Affiliate.java | 2 + .../ai/da/mapper/primary/entity/Library.java | 12 ++ .../primary/entity/PoseTransformation.java | 4 + .../com/ai/da/model/dto/PoseTransformDTO.java | 11 +- .../model/vo/DesignItemClothesDetailVO.java | 3 + .../java/com/ai/da/python/PythonService.java | 10 +- .../com/ai/da/service/AffiliateService.java | 2 + .../da/service/DesignItemDetailService.java | 2 + .../com/ai/da/service/LibraryService.java | 2 + .../da/service/impl/AffiliateServiceImpl.java | 18 +++ .../impl/DesignItemDetailServiceImpl.java | 13 ++ .../ai/da/service/impl/DesignServiceImpl.java | 1 + .../da/service/impl/GenerateServiceImpl.java | 39 ++++- .../da/service/impl/LibraryServiceImpl.java | 145 +++++++++++++----- src/main/resources/messages_en.properties | 3 + src/main/resources/messages_zh.properties | 3 + 23 files changed, 311 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/ai/da/common/enums/MotionModeEnum.java diff --git a/src/main/java/com/ai/da/common/constant/CommonConstant.java b/src/main/java/com/ai/da/common/constant/CommonConstant.java index 30b5f632..4fb6ec16 100644 --- a/src/main/java/com/ai/da/common/constant/CommonConstant.java +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -32,7 +32,8 @@ public class CommonConstant { public static final String GENERATE_LOGO_SINGLE_CANCEL = "/api/generate_single_logo_cancel/"; - public static final String POSE_TRANSFORMATION_CANCEL = "/api/pose_transform_cancel/"; +// public static final String POSE_TRANSFORMATION_CANCEL = "/api/pose_transform_cancel/"; + public static final String POSE_TRANSFORMATION_CANCEL = "/api/comfyui_i_2_video_cancel/"; public static final String PYTHON_PORT_9996 = "9996"; diff --git a/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java b/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java index a538f113..f204de8b 100644 --- a/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java +++ b/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java @@ -68,4 +68,7 @@ public enum CollectionLevel2TypeEnum { public static List printType() { return Arrays.asList(LOGO.getRealName(), SLOGAN.getRealName(), Pattern.getRealName()); } + public static CollectionLevel2TypeEnum ofWithLoweCase(String realName) { + return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().toLowerCase().equals(realName)).findFirst().orElse(null); + } } diff --git a/src/main/java/com/ai/da/common/enums/MotionModeEnum.java b/src/main/java/com/ai/da/common/enums/MotionModeEnum.java new file mode 100644 index 00000000..8a187e22 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/MotionModeEnum.java @@ -0,0 +1,29 @@ +package com.ai.da.common.enums; + + +import lombok.Getter; + +import java.util.stream.Stream; + +@Getter +public enum MotionModeEnum { + POSE_TO_VIDEO(1, "/api/comfyui_image_pose_2_video"), + + PROMPT_TO_VIDEO(2, "/api/comfyui_image_2_video"), + + FIRST_LAST_FRAME_TO_VIDEO(3, "/api/comfyui_flf_2_video") + ; + + private int code; + + private String url; + + MotionModeEnum(int code, String url) { + this.code = code; + this.url = url; + } + + public static MotionModeEnum of(int code) { + return Stream.of(MotionModeEnum.values()).filter(v -> v.getCode()== code).findFirst().orElse(null); + } +} diff --git a/src/main/java/com/ai/da/common/enums/PoseEnum.java b/src/main/java/com/ai/da/common/enums/PoseEnum.java index 44361888..56956103 100644 --- a/src/main/java/com/ai/da/common/enums/PoseEnum.java +++ b/src/main/java/com/ai/da/common/enums/PoseEnum.java @@ -64,6 +64,7 @@ public enum PoseEnum { Map map = new HashMap<>(); map.put("id", String.valueOf(id)); map.put("gif", gifPath); + map.put("video", videoPath); map.put("firstFrame", firstFramePath); return map; } diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java index a2946fb1..c7ebf79b 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -744,6 +744,47 @@ public class MinioUtil { return false; } + /** + * 将A桶中的对象复制到B桶中 + * @return + */ + public void copyObject(String sourceBucket, String sourceObject, String targetBucket, String targetObject) { + // 检查目标桶是否存在 + boolean found; + try { + found = minioClient.bucketExists(BucketExistsArgs.builder() + .bucket(targetBucket) + .build()); + } catch (Exception e) { + log.error("目标桶{},不存在", targetBucket); + throw new BusinessException("Copy object failed"); + } + + if (found) { + // 复制对象 + try { + minioClient.copyObject( + CopyObjectArgs.builder() + .bucket(targetBucket) + .object(targetObject) + .source( + CopySource.builder() + .bucket(sourceBucket) + .object(sourceObject) + .build() + ) + .build() + ); + } catch (Exception e) { + log.error("对象复制失败"); + throw new BusinessException("Copy object failed"); + } + log.info("对象复制成功"); + } else { + log.error("目标桶{},不存在", targetBucket); + throw new BusinessException("Copy object failed"); + } + } } diff --git a/src/main/java/com/ai/da/controller/AffiliateController.java b/src/main/java/com/ai/da/controller/AffiliateController.java index 6db812d3..0e7701b2 100644 --- a/src/main/java/com/ai/da/controller/AffiliateController.java +++ b/src/main/java/com/ai/da/controller/AffiliateController.java @@ -126,5 +126,11 @@ public class AffiliateController { return Response.success(affiliateService.getAllAffiliateUsername()); } + @ApiOperation(value = "修改affiliate状态,Active | Inactive | Delete") + @GetMapping("/modifyAffiliateStatus") + public Response modifyAffiliateStatus(@RequestParam Long affiliateId, @RequestParam String operationType) { + affiliateService.modifyAffiliateStatus(affiliateId, operationType); + return Response.success(); + } } diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java index 1b527f44..afc3e598 100644 --- a/src/main/java/com/ai/da/controller/LibraryController.java +++ b/src/main/java/com/ai/da/controller/LibraryController.java @@ -243,4 +243,10 @@ public class LibraryController { return Response.success(libraryService.getAllSubAccLib(order, page, size)); } + @ApiOperation(value = "将系统sketch添加到library") + @GetMapping("addSysSketchToLibrary") + public Response addSysSketchToLibrary(Long clothId, String path) { + return Response.success(libraryService.addSysSketchToLibrary(clothId, path)); + } + } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Affiliate.java b/src/main/java/com/ai/da/mapper/primary/entity/Affiliate.java index 4fccea61..b43e56f2 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Affiliate.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Affiliate.java @@ -30,4 +30,6 @@ public class Affiliate extends BaseEntity{ private String link; private String promotionMethod; + + private Integer isDeleted; } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Library.java b/src/main/java/com/ai/da/mapper/primary/entity/Library.java index 2726c67d..0c7a346d 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Library.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Library.java @@ -97,4 +97,16 @@ public class Library implements Serializable { this.md5 = md5; this.createDate = createDate; } + + public Library(Long accountId, String level1Type, String level2Type, String level3Type, String ageGroup, String name, String url, String md5, Date createDate) { + this.accountId = accountId; + this.level1Type = level1Type; + this.level2Type = level2Type; + this.level3Type = level3Type; + this.ageGroup = ageGroup; + this.name = name; + this.url = url; + this.md5 = md5; + this.createDate = createDate; + } } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java b/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java index 6fe2377a..dce96110 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java @@ -20,6 +20,8 @@ public class PoseTransformation extends BaseEntity { private String productImage; + private String lastFrameProductImage; + private int poseId; private String gifUrl; @@ -37,6 +39,8 @@ public class PoseTransformation extends BaseEntity { private String taskStatus; + private String prompt; + public PoseTransformation() { } diff --git a/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java b/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java index 64991fc0..c704b637 100644 --- a/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java +++ b/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java @@ -12,10 +12,13 @@ public class PoseTransformDTO { @ApiModelProperty("项目id") private Long projectId; - @ApiModelProperty("图片的minio地址") + @ApiModelProperty("图片的minio地址 | 首帧图片的minio地址") @NotBlank(message = "please select a product image") private String productImage; + @ApiModelProperty("尾帧图片的minio地址") + private String lastFrameProductImage; + @ApiModelProperty("pose的编号") @NotNull(message = "please select a pose") private Integer poseId; @@ -31,4 +34,10 @@ public class PoseTransformDTO { @ApiModelProperty("是否默认喜欢") private Boolean isDefaultLike; + + @ApiModelProperty("动作描述") + private String prompt; + + @ApiModelProperty("生成模式 1.pose2video | 2.prompt2video | 3.FLFrame2video ") + private int mode; } diff --git a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java index 853269fe..b30f64be 100644 --- a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java @@ -37,6 +37,9 @@ public class DesignItemClothesDetailVO { @ApiModelProperty("对应图片minIO路径") private String minIOPath; + @ApiModelProperty("图片所属:sys, user") + private String scope; + @ApiModelProperty(" 颜色 存 RGB值 中间空格分隔 比如 58 58 169") // private String color; private PantoneVO color; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 10dad374..4eb4de54 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -4078,7 +4078,7 @@ public class PythonService { //生成失败 throw new BusinessException("segProduct.interface.exception"); } - public Boolean poseTransformation(String productImage, int poseId, String taskId) { + public Boolean poseTransformation(JSONObject content, String apiUri) { OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) @@ -4086,15 +4086,11 @@ public class PythonService { .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) .build(); MediaType mediaType = MediaType.parse("application/json"); - Map content = Maps.newHashMap(); - content.put("image_url", productImage); - content.put("tasks_id", taskId); - content.put("pose_id", String.valueOf(poseId)); RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); - log.info("poseTransformation 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/pose_transform"); + log.info("poseTransformation 请求地址: {}", accessPythonIp + ":" + accessPythonPort + apiUri); Request request = new Request.Builder() - .url(accessPythonIp + ":" + accessPythonPort + "/api/pose_transform") + .url(accessPythonIp + ":" + accessPythonPort + apiUri) .method("POST", body) .addHeader("Content-Type", "application/json") .build(); diff --git a/src/main/java/com/ai/da/service/AffiliateService.java b/src/main/java/com/ai/da/service/AffiliateService.java index 64b21f5a..739d7364 100644 --- a/src/main/java/com/ai/da/service/AffiliateService.java +++ b/src/main/java/com/ai/da/service/AffiliateService.java @@ -41,4 +41,6 @@ public interface AffiliateService extends IService { void calcCouponsCommission(); List> getAllAffiliateUsername(); + + void modifyAffiliateStatus(Long affiliateId, String operationType); } diff --git a/src/main/java/com/ai/da/service/DesignItemDetailService.java b/src/main/java/com/ai/da/service/DesignItemDetailService.java index 6108130e..9ae1a0d9 100644 --- a/src/main/java/com/ai/da/service/DesignItemDetailService.java +++ b/src/main/java/com/ai/da/service/DesignItemDetailService.java @@ -25,4 +25,6 @@ public interface DesignItemDetailService extends IService { void saveDesignItemDetailCanvas(Long designItemDetailId, Long exportFileId); DesignItemDetailCanvas getDIDCByDesignItemDetailId(Long designItemDetailId); + + void updateDetailPathById(Long id, String path); } diff --git a/src/main/java/com/ai/da/service/LibraryService.java b/src/main/java/com/ai/da/service/LibraryService.java index 428b24f0..7d13fd04 100644 --- a/src/main/java/com/ai/da/service/LibraryService.java +++ b/src/main/java/com/ai/da/service/LibraryService.java @@ -98,4 +98,6 @@ public interface LibraryService extends IService { PageBaseResponse getPublicLib(String order, long page, long size); PageBaseResponse getAllSubAccLib(String order, long page, long size); + + String addSysSketchToLibrary(Long clothId, String path); } diff --git a/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java b/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java index c9a3af3c..f9898b55 100644 --- a/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java @@ -554,5 +554,23 @@ public class AffiliateServiceImpl extends ServiceImpl 激活 | Inactive -> 关闭 | Delete -> 删除 + @Override + public void modifyAffiliateStatus(Long affiliateId, String operationType) { + Affiliate affiliate = baseMapper.selectById(affiliateId); + if (Objects.isNull(affiliate)) { + throw new BusinessException("unknow.affiliate"); + } + + if (operationType.equals("Delete")) { + affiliate.setIsDeleted(1); + } else if (operationType.equals("Active") || operationType.equals("Inactive")) { + affiliate.setStatus(operationType); + } else { + throw new BusinessException("unknown.operationType"); + } + + updateById(affiliate); + } } diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java index f9d53d5b..e5406560 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDateTime; +import java.util.Date; import java.util.List; import java.util.Objects; @@ -130,4 +131,16 @@ public class DesignItemDetailServiceImpl extends ServiceImpl impleme d.setId(o.getId()); d.setPath(minioUtil.getPreSignedUrl(o.getPath(), 24 * 60, true)); d.setMinIOPath(o.getPath()); + d.setScope(o.getPath().startsWith("aida-sys-image") ? "sys" : "user"); d.setLevel1Type(converTypeToLevel1(o.getType())); d.setGradient(JSONObject.parseObject(o.getGradientString(), Gradient.class)); if (!StringUtil.isNullOrEmpty(o.getUndividedLayer())){ diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index c6c0e485..29977d7b 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -1538,17 +1538,23 @@ public class GenerateServiceImpl extends ServiceImpl i } else { String uuid = UUID.randomUUID().toString(); taskId = uuid + "-" + accountId; - isRequestSuccess = pythonService.poseTransformation(productImage, poseId, taskId); + + com.alibaba.fastjson.JSONObject params = createParamsForMotion(poseTransformDTO, taskId); + String api = params.getString("api"); + params.remove("api"); + isRequestSuccess = pythonService.poseTransformation(params, api); } poseTransformation.setProjectId(projectId); poseTransformation.setAccountId(accountId); poseTransformation.setUniqueId(taskId); poseTransformation.setProductImage(productImage); + poseTransformation.setLastFrameProductImage(poseTransformDTO.getLastFrameProductImage()); poseTransformation.setPoseId(poseId); poseTransformation.setIsLiked((byte) 0); String taskStatus = isRequestSuccess ? "Executing" : "Fail"; poseTransformation.setTaskStatus(taskStatus); + poseTransformation.setPrompt(poseTransformDTO.getPrompt()); poseTransformation.setCreateTime(LocalDateTime.now()); poseTransformationMapper.insert(poseTransformation); // 当需要默认like @@ -2025,7 +2031,8 @@ public class GenerateServiceImpl extends ServiceImpl i public List> getAllPose() { List> propertyList = PoseEnum.getPropertyList(); propertyList.forEach(item -> { - item.put("gif", minioUtil.getPreSignedUrl(item.get("gif"), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); +// item.put("gif", minioUtil.getPreSignedUrl(item.get("gif"), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + item.put("video", minioUtil.getPreSignedUrl(item.get("video"), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); item.put("firstFrame", minioUtil.getPreSignedUrl(item.get("firstFrame"), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); }); return propertyList; @@ -3044,4 +3051,32 @@ public class GenerateServiceImpl extends ServiceImpl i return null; } } + + public + com.alibaba.fastjson.JSONObject createParamsForMotion(PoseTransformDTO poseTransformDTO, String taskId) { + + com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject(); + params.put("tasks_id", taskId); + // 判断当前使用的哪种生成模式 + MotionModeEnum motionModeEnum = MotionModeEnum.of(poseTransformDTO.getMode()); + switch (motionModeEnum){ + case POSE_TO_VIDEO: + params.put("pose_id", poseTransformDTO.getPoseId()); + params.put("image_url", poseTransformDTO.getProductImage()); + break; + case PROMPT_TO_VIDEO: + params.put("image_url", poseTransformDTO.getProductImage()); + params.put("prompt", poseTransformDTO.getPrompt()); + break; + case FIRST_LAST_FRAME_TO_VIDEO: + params.put("start_image_url", poseTransformDTO.getProductImage()); + params.put("end_image_url", poseTransformDTO.getLastFrameProductImage()); + params.put("prompt", poseTransformDTO.getPrompt()); + break; + default: + throw new BusinessException("unknown.mode"); + } + params.put("api", motionModeEnum.getUrl()); + return params; + } } diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index 40bcfedb..d7b2358d 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.apache.commons.fileupload.FileItem; @@ -54,6 +55,8 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static com.ai.da.common.enums.CollectionLevel2TypeEnum.OUTWEAR; + /** * 服务实现类 * @@ -62,39 +65,25 @@ import java.util.stream.Collectors; */ @Slf4j @Service +@RequiredArgsConstructor public class LibraryServiceImpl extends ServiceImpl implements LibraryService { - @Resource - private LibraryMapper libraryMapper; - @Resource - private SysFileMapper sysFileMapper; - @Resource - private SysFileExtraMapper sysFileExtraMapper; - @Resource - private FileProperties fileProperties; - @Resource - private LibraryModelPointService libraryModelPointService; - @Resource - private WorkspaceService workspaceService; - @Resource - private ClassificationService classificationService; - @Resource - private MinioUtil minioUtil; - @Resource - private AccountMapper accountMapper; - @Resource - private EductionLibraryMapper eductionLibraryMapper; - @Resource - private EnterpriseLibraryMapper enterpriseLibraryMapper; - @Resource - private LibraryCopyMapper libraryCopyMapper; - @Resource - private LibraryModelPointCopyMapper libraryModelPointCopyMapper; - @Resource - private PythonTAllInfoService pythonTAllInfoService; - @Resource - private BrandRelLibraryMapper brandRelLibraryMapper; - @Resource - private GenerateDetailMapper generateDetailMapper; + private final AccountMapper accountMapper; + private final BrandRelLibraryMapper brandRelLibraryMapper; + private final ClassificationService classificationService; + private final DesignItemDetailService designItemDetailService; + private final EductionLibraryMapper eductionLibraryMapper; + private final EnterpriseLibraryMapper enterpriseLibraryMapper; + private final FileProperties fileProperties; + private final GenerateDetailMapper generateDetailMapper; + private final MinioUtil minioUtil; + private final LibraryMapper libraryMapper; + private final LibraryCopyMapper libraryCopyMapper; + private final LibraryModelPointMapper libraryModelPointMapper; + private final LibraryModelPointCopyMapper libraryModelPointCopyMapper; + private final PythonTAllInfoService pythonTAllInfoService; + private final SysFileMapper sysFileMapper; + private final SysFileExtraMapper sysFileExtraMapper; + private final WorkspaceService workspaceService; @Value("${minio.bucketName.users}") private String users; @@ -110,7 +99,7 @@ public class LibraryServiceImpl extends ServiceImpl impl private String fastApiPythonAddress; private static List top = Arrays.asList(CollectionLevel2TypeEnum.DRESS.getRealName(), - CollectionLevel2TypeEnum.OUTWEAR.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName()); + OUTWEAR.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName()); private static List bottom = Arrays.asList(CollectionLevel2TypeEnum.SKIRT.getRealName(), CollectionLevel2TypeEnum.TROUSERS.getRealName()); @@ -233,7 +222,7 @@ public class LibraryServiceImpl extends ServiceImpl impl .filter(library -> library.getLevel1Type().equals(LibraryLevel1TypeEnum.MODELS.getRealName())) .map(Library::getId) .collect(Collectors.toList()); - List libraryModelPointVOS = libraryModelPointService.selectByLibraryIds(libraryIds); + List libraryModelPointVOS = selectByLibraryIds(libraryIds); if (!CollectionUtils.isEmpty(libraryModelPointVOS)) { map = libraryModelPointVOS.stream() .collect(Collectors.toMap(LibraryModelPointVO::getRelationId, v -> v)); @@ -307,6 +296,25 @@ public class LibraryServiceImpl extends ServiceImpl impl return PageBaseResponse.success(pageResult); } + public List selectByLibraryIds(List libraryIds) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(LibraryModelPoint::getModelType, ModelType.LIBRARY.getValue()); + queryWrapper.in("relation_id", libraryIds); + List libraryModelPoints = libraryModelPointMapper.selectList(queryWrapper); + if (CollectionUtils.isEmpty(libraryModelPoints)) { + return null; + } + return CopyUtil.copyList(libraryModelPoints, LibraryModelPointVO.class, (o, d) -> { + d.setTemplateId(o.getId()); + d.setHandLeft(JSON.parseObject(o.getHandLeft(), List.class)); + d.setHandRight(JSON.parseObject(o.getHandRight(), List.class)); + d.setShoulderRight(JSON.parseObject(o.getShoulderRight(), List.class)); + d.setShoulderLeft(JSON.parseObject(o.getShoulderLeft(), List.class)); + d.setWaistbandRight(JSON.parseObject(o.getWaistbandRight(), List.class)); + d.setWaistbandLeft(JSON.parseObject(o.getWaistbandLeft(), List.class)); + }); + } + @Override public LibraryUpdateVo upload(LibraryUploadDTO libraryUploadDTO) { //用户信息 @@ -659,7 +667,8 @@ public class LibraryServiceImpl extends ServiceImpl impl libraryModelPoint.setRelationId(newInsert.getId()); libraryModelPoint.setId(null); - libraryModelPointService.saveOrUpdate(libraryModelPoint); +// libraryModelPointService.saveOrUpdate(libraryModelPoint); + libraryModelPointMapper.insert(libraryModelPoint); continue; } if (libraryCopy.getLevel1Type().equals("Sketchboard")) { @@ -913,12 +922,12 @@ public class LibraryServiceImpl extends ServiceImpl impl libraryMapper.insert(library); // 添加点位信息到library - LibraryModelPoint sysModelPoint = libraryModelPointService.getByRelationId(sysModelId, "System"); + LibraryModelPoint sysModelPoint = getByRelationId(sysModelId, "System"); sysModelPoint.setId(null); sysModelPoint.setModelType("Library"); sysModelPoint.setRelationId(library.getId()); sysModelPoint.setCreateDate(new Date()); - libraryModelPointService.save(sysModelPoint); + libraryModelPointMapper.insert(sysModelPoint); Map resp = new HashMap<>(); resp.put("id", library.getId().toString()); @@ -926,6 +935,19 @@ public class LibraryServiceImpl extends ServiceImpl impl return resp; } + public LibraryModelPoint getByRelationId(Long relationId, String modelType) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(LibraryModelPoint::getRelationId, relationId) + .eq(LibraryModelPoint::getModelType, modelType) + .last("limit 1"); + List libraryModelPoints = libraryModelPointMapper.selectList(queryWrapper); + if (CollectionUtil.isEmpty(libraryModelPoints)) { + throw new BusinessException("modelPoint.not.found"); + } + return libraryModelPoints.get(0); + } + + public boolean saveToOrganizationLibrary(Long libraryId){ // 1、判断该用户是否属于某个组织 Long accountId = UserContext.getUserHolder().getId(); @@ -1030,4 +1052,53 @@ public class LibraryServiceImpl extends ServiceImpl impl } } + /** + * 将系统sketch添加到个人library + */ + public String addSysSketchToLibrary(Long clothId, String path) { + // 1. 判断当前路径是不是系统sketch + if (!path.startsWith("aida-sys-image/images")) { + throw new BusinessException("Non-system Sketch file cannot be added to personal library.", ResultEnum.PROMPT.getCode()); + } + + // 2. 是。获取当前用户id,随机生成4位数 + String sourceObject = path.substring(path.indexOf("/") + 1); + String subPath = sourceObject.substring(sourceObject.indexOf("images/") + 1, sourceObject.lastIndexOf(".")); + String gender = subPath.substring(0, subPath.indexOf("/")).equals("female") ? "female" : "male"; + String category = subPath.substring(subPath.indexOf("/") + 1, subPath.lastIndexOf("/")); + CollectionLevel2TypeEnum collectionLevel2TypeEnum = CollectionLevel2TypeEnum.ofWithLoweCase(category); + if (Objects.nonNull(collectionLevel2TypeEnum)){ + category = collectionLevel2TypeEnum.getRealName(); + } else { + category = OUTWEAR.getRealName(); + } + String suffix = sourceObject.substring(sourceObject.lastIndexOf(".") + 1); + Long userId = UserContext.getUserHolder().getId(); + String name = subPath.substring(subPath.lastIndexOf("/") + 1) + "_" + RandomsUtil.generateVerifyCode(1000L, 9999L); + String targetObject = userId + "/sketchboard/" + gender + "/" + category + "/" + + name + "." + suffix; + + // 3. 复制图片到用户个人图片文件夹下 + minioUtil.copyObject(sysImage, sourceObject, users, targetObject); + + // 4. 存储到数据库中 + String targetPath = users + "/" + targetObject; + String md5 = MD5Utils.encryptFile(minioUtil.getPreSignedUrl(targetPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), false); + Library library = new Library(userId, CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName(), + category, gender, "Adult", name, targetPath, md5, new Date()); + saveOne(library); + + // 5. 更新designItemDetail中的图片路径 + if (Objects.nonNull(clothId)) { + designItemDetailService.updateDetailPathById(clothId, targetPath); + } + return minioUtil.getPreSignedUrl(targetPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME); + } + + /** + * todo 低分辨率下载 + */ + public void downloadSysSketchWithWatermark() { + } + } diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 58e5091e..2fe83148 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -186,6 +186,9 @@ order.creation.failed=Order creation failed. order.deduction.failed=Order deduction failed. order.query.failed=Order query failed. do.not.have.the.permission.to.delete.this.comment=You do not have the permission to delete this comment. +unknow.affiliate=Unknown affiliate id. +unknown.operationType=Unknown operationType. +unknown.mode=unknown mode # 可能会报异常 # Informative: diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index b8bd94f2..5c9832b5 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -182,6 +182,9 @@ order.creation.failed=订单创建失败 order.deduction.failed=订单金额扣除失败。 order.query.failed=订单查询失败 do.not.have.the.permission.to.delete.this.comment=您没有权限删除此评论 +unknow.affiliate=未知推广者id +unknown.operationType=未知操作类型 +unknown.mode=未知模式 # 可能会报异常 # Informative: