From aa1c48fcfe791271c04445a8eb2de50e469527e2 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 22 Apr 2025 13:48:36 +0800 Subject: [PATCH] =?UTF-8?q?TASK:=E6=A8=A1=E5=9D=97=E5=8C=96=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../primary/entity/PoseTransformation.java | 2 + .../com/ai/da/model/dto/CloudTaskDTO.java | 4 ++ .../da/model/dto/PoseTransformBatchDTO.java | 10 ++++ .../java/com/ai/da/model/enums/BuildType.java | 4 +- .../java/com/ai/da/python/PythonService.java | 59 +++++++++++++++++++ .../ai/da/service/impl/DesignServiceImpl.java | 41 +++++++++++++ 6 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/ai/da/model/dto/PoseTransformBatchDTO.java 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 62a7dfb4..cf52a849 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 @@ -15,6 +15,8 @@ public class PoseTransformation extends BaseEntity { private String uniqueId; + private String taskIdBatch; + private String productImage; private int poseId; diff --git a/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java b/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java index deba7f7b..7f716d87 100644 --- a/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java +++ b/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java @@ -3,9 +3,13 @@ package com.ai.da.model.dto; import com.ai.da.mapper.primary.entity.CloudTask; import lombok.Data; +import java.util.List; + @Data public class CloudTaskDTO extends CloudTask { private ToProductImageDTO toProductImage; + private List poseTransform; + } diff --git a/src/main/java/com/ai/da/model/dto/PoseTransformBatchDTO.java b/src/main/java/com/ai/da/model/dto/PoseTransformBatchDTO.java new file mode 100644 index 00000000..33020fe0 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/PoseTransformBatchDTO.java @@ -0,0 +1,10 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class PoseTransformBatchDTO { + private String productImage; + + private Integer poseId; +} diff --git a/src/main/java/com/ai/da/model/enums/BuildType.java b/src/main/java/com/ai/da/model/enums/BuildType.java index 7188b164..4265949b 100644 --- a/src/main/java/com/ai/da/model/enums/BuildType.java +++ b/src/main/java/com/ai/da/model/enums/BuildType.java @@ -5,8 +5,8 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum BuildType implements IEnumDisplay { DESIGN("design"), TO_PRODUCT_IMAGE("toProductImage"), - - RELIGHT("relight") + RELIGHT("relight"), + POSE_TRANSFORM("poseTransform") ; private String value; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 8e1d08c8..b2c07f42 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -4342,4 +4342,63 @@ public class PythonService { //生成失败 throw new BusinessException("relightImage.interface.exception"); } + + public Boolean poseTransformationBatch(String productImage, Integer poseId, String taskId) { + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .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)); + content.put("batch_size", 1); + RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); + + log.info("poseTransformation 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/pose_transform"); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/pose_transform") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + String bodyString; + try { + log.info("poseTransformation请求入参content###{}", JSON.toJSONString(content)); + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##poseTransformation异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException(ioException.getMessage()); + } + + // 判断是否生成失败 + if (Objects.isNull(response.body())) { + log.error("PythonService##poseTransformation异常###{}", "response or body is empty!"); + throw new BusinessException("PythonService##poseTransformation异常###: response or body is empty!"); + } else if (response.code() != HttpURLConnection.HTTP_OK) { + log.error("PythonService##poseTransformation异常###{}", "Response error!Response code ## " + response.code() + " ##"); + throw new BusinessException("PythonService##poseTransformation异常### Response error!Response code ## " + response.code() + " ##"); + } else { + try { + bodyString = response.body().string(); + } catch (IOException e) { + log.error(e.getMessage()); + throw new BusinessException(e.getMessage()); + } + } + JSONObject jsonObject = JSON.parseObject(bodyString); + Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful"); + + if (result && jsonObject.get("code").equals(200)) { + log.info("poseTransformation##responseObject###{}", jsonObject); + return Boolean.TRUE; + } else { + log.info("poseTransformation失败###{}", jsonObject); + log.info("poseTransformation Exception! Code : {}", jsonObject.get("code")); + return Boolean.FALSE; + } + } } diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index 54b7d180..271f6dc8 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -124,6 +124,8 @@ public class DesignServiceImpl extends ServiceImpl impleme @Resource private RedisUtil redisUtil; + @Resource + private PoseTransformationMapper poseTransformationMapper; @Resource private DesignBatchMapper designBatchMapper; @@ -2062,6 +2064,45 @@ public class DesignServiceImpl extends ServiceImpl impleme cloudTask.setStatus(0); cloudTaskMapper.insert(cloudTask); return batchTaskId; + } else if (cloudTaskDTO.getBuildType().equals(BuildType.POSE_TRANSFORM.getValue())) { + Long accountId = UserContext.getUserHolder().getId(); + + List poseTransformList = cloudTaskDTO.getPoseTransform(); + if (CollectionUtil.isNotEmpty(poseTransformList)) { + String taskBatchId = UUID.randomUUID().toString() + "-" + accountId; + for (PoseTransformBatchDTO poseTransformBatchDTO : poseTransformList) { + // 1、判断用户当前积分是否够本次生成消耗 + CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.POSE_TRANSFORMATION; + Boolean preDeduction = creditsService.creditsPreDeduction(creditsEventsEnum, 1); + if (!preDeduction) { + throw new BusinessException("remaining.credits.insufficient", ResultEnum.WARNING.getCode()); + } + + // 3、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 + String uuid = UUID.randomUUID().toString(); + String taskId = uuid + "-" + accountId; + + PoseTransformation poseTransformation = new PoseTransformation(); + poseTransformation.setProjectId(cloudTaskDTO.getProjectId()); + poseTransformation.setAccountId(accountId); + poseTransformation.setUniqueId(taskId); + poseTransformation.setProductImage(poseTransformBatchDTO.getProductImage()); + poseTransformation.setPoseId(poseTransformBatchDTO.getPoseId()); + poseTransformation.setCreateTime(LocalDateTime.now()); + poseTransformation.setTaskIdBatch(taskBatchId); + poseTransformationMapper.insert(poseTransformation); + + Boolean b = pythonService.poseTransformationBatch(poseTransformBatchDTO.getProductImage(), poseTransformBatchDTO.getPoseId(), taskId); + if (b){ + // 6、添加预扣除积分到redis + creditsService.addRecordToCreditsDeduction(accountId, uuid, creditsEventsEnum); + // 6.1 添加积分扣除记录到db + creditsService.preInsert(accountId, creditsEventsEnum.getName(), uuid, Boolean.TRUE, null); + return taskId; + } + throw new BusinessException("pose transformation error", ResultEnum.ERROR.getCode()); + } + } } return null; }