From bd543e56d5550ada9ccbea012f522844f77881fd Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 28 May 2024 14:25:03 +0800 Subject: [PATCH 01/79] =?UTF-8?q?=E5=BC=80=E5=90=AF=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=98=9F=E5=88=97=E7=9A=84=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/RabbitMQ/GenerateConsumer.java | 118 +++++++++--------- .../com/ai/da/common/RabbitMQ/SRConsumer.java | 24 ++-- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 876dfd2c..3e8e6a6e 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -154,63 +154,63 @@ public class GenerateConsumer { } -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer1(Message msg, Channel channel) { -// generate(msg, channel, "consumer 1"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer2(Message msg, Channel channel) { -// generate(msg, channel, "consumer 2"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer3(Message msg, Channel channel) { -// generate(msg, channel, "consumer 3"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer4(Message msg, Channel channel) { -// generate(msg, channel, "consumer 4"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer5(Message msg, Channel channel) { -// generate(msg, channel, "consumer 5"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer6(Message msg, Channel channel) { -// generate(msg, channel, "consumer 6"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer7(Message msg, Channel channel) { -// generate(msg, channel, "consumer 7"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer8(Message msg, Channel channel) { -// generate(msg, channel, "consumer 8"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer9(Message msg, Channel channel) { -// generate(msg, channel, "consumer 9"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) -// @RabbitHandler -// public void getGenerateResult(Message msg, Channel channel) { -// processGenerateResult(msg, channel); -// } + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer1(Message msg, Channel channel) { + generate(msg, channel, "consumer 1"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer2(Message msg, Channel channel) { + generate(msg, channel, "consumer 2"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer3(Message msg, Channel channel) { + generate(msg, channel, "consumer 3"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer4(Message msg, Channel channel) { + generate(msg, channel, "consumer 4"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer5(Message msg, Channel channel) { + generate(msg, channel, "consumer 5"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer6(Message msg, Channel channel) { + generate(msg, channel, "consumer 6"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer7(Message msg, Channel channel) { + generate(msg, channel, "consumer 7"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer8(Message msg, Channel channel) { + generate(msg, channel, "consumer 8"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer9(Message msg, Channel channel) { + generate(msg, channel, "consumer 9"); + } + + @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) + @RabbitHandler + public void getGenerateResult(Message msg, Channel channel) { + processGenerateResult(msg, channel); + } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java index b8ba32f2..6ad261bd 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java @@ -218,17 +218,17 @@ public class SRConsumer { taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null); } -// @RabbitListener(queues = MQConfig.SR_QUEUE) -// @RabbitHandler -// public void SRConsumer1(Message msg, Channel channel) { -// superResolution(msg, channel, "consumer 1"); -// } -// -// -// @RabbitListener(queues = MQConfig.SR_RESULT_QUEUE) -// @RabbitHandler -// public void SRResultConsumer1(Message msg, Channel channel) { -// getSRResult(msg, channel, "consumer 1"); -// } + @RabbitListener(queues = MQConfig.SR_QUEUE) + @RabbitHandler + public void SRConsumer1(Message msg, Channel channel) { + superResolution(msg, channel, "consumer 1"); + } + + + @RabbitListener(queues = MQConfig.SR_RESULT_QUEUE) + @RabbitHandler + public void SRResultConsumer1(Message msg, Channel channel) { + getSRResult(msg, channel, "consumer 1"); + } } From 804dc9b1b44d42d40b7a71f9a873705521c5d6ae Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 29 May 2024 16:30:27 +0800 Subject: [PATCH 02/79] =?UTF-8?q?=E6=B7=BB=E5=8A=A0aws=20S3=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ai/da/common/utils/S3Util.java | 225 ++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 src/main/java/com/ai/da/common/utils/S3Util.java diff --git a/src/main/java/com/ai/da/common/utils/S3Util.java b/src/main/java/com/ai/da/common/utils/S3Util.java new file mode 100644 index 00000000..1d4735cc --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/S3Util.java @@ -0,0 +1,225 @@ +package com.ai.da.common.utils; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.CommonConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.ResponseBytes; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3Configuration; +import software.amazon.awssdk.services.s3.model.*; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; +import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; + +import javax.annotation.PostConstruct; +import java.io.*; +import java.time.Duration; +import java.util.*; +import java.util.stream.Collectors; + + +@Slf4j +@Component +public class S3Util { + + @Value("${aws.s3.accessKeyId}") + private String accessKeyId; + + @Value("${aws.s3.secretKey}") + private String secretKey; + + @Value("${aws.s3.regionName}") + private String region; + + public static String S3_ACCESS_KEY_ID = null; + + public static String S3_SECRET_KEY = null; + + public static String S3_REGION = null; + + + @PostConstruct + public void init() { + S3_ACCESS_KEY_ID = accessKeyId; + S3_SECRET_KEY = secretKey; + S3_REGION = region; + } + + private static S3Client s3Client; + + private static S3Presigner s3Presigner; + + /** + * @description: 获取S3客户端对象 + * @return software.amazon.awssdk.services.s3.S3Client + */ + public synchronized S3Client getS3Client() { + if (null == s3Client) { + s3Client = S3Client.builder() + .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY))) +// .endpointOverride(URI.create(S3_URI)) + .serviceConfiguration(item -> item.pathStyleAccessEnabled(true).checksumValidationEnabled(false)) + .region(Region.of(S3_REGION)) + .build(); + } + + return s3Client; + } + + /** + * @description: 获取预签名对象 + * @return software.amazon.awssdk.services.s3.presigner.S3Presigner + */ + public synchronized S3Presigner getS3PreSigner() { + if (null == s3Presigner) { + s3Presigner = S3Presigner.builder() + .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY))) +// .endpointOverride(URI.create(S3_URI)) + .serviceConfiguration(S3Configuration.builder() + .checksumValidationEnabled(false) + .pathStyleAccessEnabled(true) + .build()) + .region(Region.of(S3_REGION)) + .build(); + } + return s3Presigner; + } + + public String upload(String bucketName, String path, MultipartFile file) { + S3Client s3Client = getS3Client(); + try { + String fileName = file.getOriginalFilename(); + assert fileName != null; + String[] split = fileName.split("\\."); + if (split.length > 1) { + fileName = path + "/" + UUID.randomUUID() + "." + split[split.length - 1]; + } else { + fileName = path + "/" + UUID.randomUUID(); + } + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .contentType(file.getContentType()) + .contentLength(file.getSize()) + .key(fileName) +// .acl(ObjectCannedACL.PUBLIC_READ) + .build(); + s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); + + log.info("上传的位置:桶 - {},路径 - {}", bucketName, fileName); + return fileName; + } catch (Exception e) { + log.error("上传文件到S3失败 异常:{}", e.getMessage()); + } + return null; + } + + public String getPreSignedUrl(String path, int expiry) { + if (LocalCacheUtils.getPresignedUrlCache(path) != null) { + return LocalCacheUtils.getPresignedUrlCache(path); + } else { + if (!path.contains("/")) { + throw new BusinessException("The path is error!"); + } + int index = path.indexOf("/"); + String bucketName = path.substring(0, index); + String fileName = path.substring(index + 1); + String preSignedUrl = getPreSignatureUrl(bucketName, fileName, expiry); + LocalCacheUtils.setPresignedUrlCache(path, preSignedUrl); + return preSignedUrl; + } + } + + /** + * @description: 生成预签名URL + * @param keyName key名称: test/2022/06/123.pdf + * @param signatureDurationTime 有效期 单位:秒 + * @return java.lang.String + */ + public String getPreSignatureUrl(String bucket, String keyName, Integer signatureDurationTime) { + String preSignatureUrl = ""; + try { + S3Presigner s3PreSigner = getS3PreSigner(); + GetObjectRequest getObjectRequest = + GetObjectRequest.builder() + .bucket(bucket) + .key(keyName) + .build(); + //设置预签名URL可访问时间 + signatureDurationTime = Optional.ofNullable(signatureDurationTime) + .map(item -> { + if (item.intValue() > CommonConstant.Numbers.NUMBER_10080) { + item = CommonConstant.Numbers.NUMBER_10080; + } + return item; + }) + .orElse(CommonConstant.Numbers.NUMBER_10); + GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder() + .signatureDuration(Duration.ofMinutes(signatureDurationTime)) + .getObjectRequest(getObjectRequest) + .build(); + + PresignedGetObjectRequest presignedGetObjectRequest = + s3PreSigner.presignGetObject(getObjectPresignRequest); + + preSignatureUrl = String.valueOf(presignedGetObjectRequest.url()); + + } catch (Exception e) { + log.error("生成预签名URL失败,异常:{}", e.getMessage()); + } + return preSignatureUrl; + } + + public InputStream download(String path) { + if (!path.contains("/")) { + throw new BusinessException("the.path.is.error"); + } + int index = path.indexOf("/"); + String bucketName = path.substring(0, index); + String objectName = path.substring(index + 1); + return download(bucketName, objectName); + } + + public InputStream download(String bucketName, String objectName){ + try { + S3Client s3Client = getS3Client(); + GetObjectRequest objectRequest = GetObjectRequest + .builder() + .key(objectName) + .bucket(bucketName) + .build(); + +// ResponseBytes objectBytes = s3.getObjectAsBytes(objectRequest); + ResponseBytes objectAsBytes = s3Client.getObjectAsBytes(objectRequest); + byte[] data = objectAsBytes.asByteArray(); + return new ByteArrayInputStream(data); + + /*// Write the data to a local file. + File myFile = new File("files/images.png"); + OutputStream os = new FileOutputStream(myFile); + os.write(data); + System.out.println("Successfully obtained bytes from an S3 object"); + os.close(); + return null;*/ + +// return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } catch (Exception e){ + log.error(""); + throw new BusinessException(""); + } + } + + public List listAllBucket(){ + S3Client s3Client = getS3Client(); + ListBucketsResponse listBucketsResponse = s3Client.listBuckets(); + List buckets = listBucketsResponse.buckets(); + return buckets.stream().map(Bucket::name).collect(Collectors.toList()); + } + +} From 1aea8e93f2d359bbbaf2a87059b52a03fd1c0315 Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 30 May 2024 09:54:49 +0800 Subject: [PATCH 03/79] =?UTF-8?q?AlipayHK=20=E6=96=B0=E5=A2=9E=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 34 +++++++ .../ai/da/common/constant/CommonConstant.java | 6 ++ .../ai/da/common/enums/CreditsEventsEnum.java | 6 +- .../common/utils/AlipayHKEncryptionUtil.java | 3 +- .../da/common/utils/AlipayHKRequestUtil.java | 2 +- .../ai/da/controller/AlipayHKController.java | 11 ++- .../com/ai/da/service/AlipayHKService.java | 2 + .../da/service/impl/AlipayHKServiceImpl.java | 92 +++++++------------ 8 files changed, 88 insertions(+), 68 deletions(-) diff --git a/pom.xml b/pom.xml index e2a8d0f6..8ec5336d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,19 @@ 4.0.0 1.1.1 1.6.2 + 2.20.43 + + + + software.amazon.awssdk + bom + ${aws.java.sdk.version} + pom + import + + + org.springframework.boot @@ -239,6 +251,28 @@ 25.0.0 + + + + software.amazon.awssdk + s3 + + + software.amazon.awssdk + s3-transfer-manager + 2.17.103-PREVIEW + + + software.amazon.awssdk + kms + + + software.amazon.awssdk + s3control + + + + 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 ac139e98..252350c5 100644 --- a/src/main/java/com/ai/da/common/constant/CommonConstant.java +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -11,4 +11,10 @@ public class CommonConstant { // 单位 秒 一天过期 in redis public static final Long GENERATE_RESULT_EXPIRE_TIME = 24 * 60 * 60L; + public static class Numbers{ + public static final Integer NUMBER_10 = 10; + public static final Integer NUMBER_1000 = 1000; + public static final Integer NUMBER_10080 = 10080; + } + } diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index 8a63d880..0b00fa84 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -7,9 +7,11 @@ import lombok.Getter; @Getter public enum CreditsEventsEnum { - PRICE("price","6"), +// PRICE("price","6"), + PRICE("price","0.1"), - BUY_CREDITS("Buy Credits","600"), +// BUY_CREDITS("Buy Credits","600"), + BUY_CREDITS("Buy Credits","10"), INIT("init", "500"), diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java index 5e8662a3..a26d60a0 100644 --- a/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java +++ b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java @@ -96,6 +96,7 @@ public class AlipayHKEncryptionUtil { // Serialize message body Gson gson = new GsonBuilder().disableHtmlEscaping().create(); String content = gson.toJson(requestMessage); + log.info("alipay-hk request 加密前:{}", content); // Secure random iv 获取随机种子 SecureRandom secureRandom = new SecureRandom(); @@ -153,7 +154,7 @@ public class AlipayHKEncryptionUtil { // Encode to json String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO); - log.info(jsonEncoded); + log.info("alipay-hk request 加密加签后:{}",jsonEncoded); // String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO); // log.info(info); diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java index a980e477..3bfcf9a4 100644 --- a/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java +++ b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Component; @Component public class AlipayHKRequestUtil { - public String createOrder(AlipayHKRequestDTO alipayHKRequestDTO) throws IOException { + public String requestAlipayHK(AlipayHKRequestDTO alipayHKRequestDTO) throws IOException { OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) diff --git a/src/main/java/com/ai/da/controller/AlipayHKController.java b/src/main/java/com/ai/da/controller/AlipayHKController.java index 38f2da9b..602096a6 100644 --- a/src/main/java/com/ai/da/controller/AlipayHKController.java +++ b/src/main/java/com/ai/da/controller/AlipayHKController.java @@ -21,8 +21,8 @@ public class AlipayHKController { private AlipayHKService alipayHKService; @ApiOperation(value = "创建订单") - @PostMapping(value = "/createOrder") - public Response createOrder(@RequestParam Integer amount, @RequestParam String wallet) { + @PostMapping(value = "/createOrder/{wallet}/{amount}") + public Response createOrder(@PathVariable Integer amount, @PathVariable String wallet) { String order = alipayHKService.createOrder(amount, wallet); return Response.success(order); } @@ -33,7 +33,12 @@ public class AlipayHKController { return alipayHKService.callback(params); } - + @ApiOperation("订单查询") + @PostMapping("/trade/query/{orderRef}") + public Response queryOrder(@PathVariable String orderRef){ + String s = alipayHKService.queryDetail(orderRef); + return Response.success(s); + } diff --git a/src/main/java/com/ai/da/service/AlipayHKService.java b/src/main/java/com/ai/da/service/AlipayHKService.java index 47f06d2b..e0aad9c4 100644 --- a/src/main/java/com/ai/da/service/AlipayHKService.java +++ b/src/main/java/com/ai/da/service/AlipayHKService.java @@ -11,4 +11,6 @@ public interface AlipayHKService { String callback(Map params); void processOrder(AlipayHKCallbackDTO alipayHKCallbackDTO); + + String queryDetail(String orderRef); } diff --git a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java index 53c58d5d..038168ec 100644 --- a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java @@ -11,7 +11,6 @@ import com.ai.da.model.dto.AlipayHKCallbackDTO; import com.ai.da.model.dto.AlipayHKRequestDTO; import com.ai.da.service.*; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -19,11 +18,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -80,10 +76,10 @@ public class AlipayHKServiceImpl implements AlipayHKService { // 生成订单 log.info("创建订单"); OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY_HK.getType()); - // 加密 + /*// 加密 AlipayHKRequestDTO alipayHKRequestDTO = alipayHKEncryptionUtil.AESCBCWithRSA(param, AlipayHKConstant.CREATE_ORDER); // 请求Alipay服务端 - String response = alipayHKRequestUtil.createOrder(alipayHKRequestDTO); + String response = alipayHKRequestUtil.requestAlipayHK(alipayHKRequestDTO); // 获取response中的加密数据 JSONObject responseObj = JSONObject.parseObject(response); JSONObject resultObj = JSONObject.parseObject(responseObj.get("result").toString()); @@ -91,18 +87,36 @@ public class AlipayHKServiceImpl implements AlipayHKService { String message = resultObj.get("message").toString(); // 解密 String s = alipayHKEncryptionUtil.decryptAES(message, nonce); + JSONObject jsonObject = JSONObject.parseObject(s);*/ + String s = enAndDecryption(param, AlipayHKConstant.CREATE_ORDER); JSONObject jsonObject = JSONObject.parseObject(s); - String orderId = jsonObject.get("out_trade_no").toString(); orderInfoService.updateOrderNoById(orderInfo.getId(), orderId); - - log.info("create_order 接口返回信息 :{}", s); return s; + }catch (Exception e){ + log.error("订单创建失败 : {}", e.getMessage()); + // todo 或者抛异常 + return null; + } + } + private String enAndDecryption(HashMap param, String serviceName){ + try{ + // 加密 + AlipayHKRequestDTO alipayHKRequestDTO = alipayHKEncryptionUtil.AESCBCWithRSA(param, serviceName); + // 请求Alipay服务端 + String response = alipayHKRequestUtil.requestAlipayHK(alipayHKRequestDTO); + // 获取response中的加密数据 + JSONObject responseObj = JSONObject.parseObject(response); + JSONObject resultObj = JSONObject.parseObject(responseObj.get("result").toString()); + String nonce = resultObj.get("nonce").toString(); + String message = resultObj.get("message").toString(); + // 解密 + return alipayHKEncryptionUtil.decryptAES(message, nonce); }catch (Exception e){ log.error("订单创建失败 : {}", e.getMessage()); // todo 或者抛异常 @@ -234,59 +248,15 @@ public class AlipayHKServiceImpl implements AlipayHKService { } } + // 查询订单详情 + public String queryDetail(String orderRef){ + HashMap param = new HashMap<>(); + param.put("order_ref", orderRef); + String s = enAndDecryption(param, AlipayHKConstant.ORDER_DETAILS); + JSONObject jsonObject = JSONObject.parseObject(s); + log.info("订单:{},状态为:{}", orderRef, jsonObject.get("status")); - - - - - - - - - - - - - - public static String decrypt(String message){ - String text = "{\"success\":true,\"reference_id\":\"d4f55a35-8725-40f3-8279-37ea95837741\",\"result\":{\"nonce\":\"tUsbfFrNWcZZYrN3dWQHNQ==\",\"message\":\"6wCHtIMRXXgj0TOV7jtvCzbKc+gWEnqbgAD5pMx4sIvliL65EF+btKRheJI/0gssOj0PdwUPYLlgjTdSWQZraQLU4F05FGSYJ7lNxFZ1tXLvhUv4ukiCz0xyPJIQ5vvNH/SmQ5iIQvMO/fTg6ZiZj2I+Oahzy5h2/cXmrXBEedNFZSGIVFKMuipul3QcFEO+qQQcOHOiRDAXrhF1+qoq4GROBpcKhu5WMHxUGDHj0l/tY2Rp004FNwfArbOeR5TusgMMgm7aE8IqpFJ6w4zES1lS903fHJzFWcqKMwB9tYoxnegoHSNmOVeokgBCvLOI2uVJCWN4ZqVq1mmhoib4zVxjex+pgoMtHPvV+Gjy+IB2PA5YCid0vH9WymkBkYZIioW1KH587G3lTTEWrzTc+JWWd+yIxD1nofZxAi0t+EFOgyab2HRawdpWpkwKH5XqoZ05yj0Vl0u7nWcF4GLytC5wTWyPOU3Ua/ePlniU/z5BWZkUQGWXWSKhyEmt53mx3UUXbC6/zfk1jcbyEGHonCimmf88Xl9yE3ae02xoRsDO8bcnzCRD88UWUi3UySWNmxdYDTdWj0wCU27nmLMLjkXvesRl2CfuZbkbDxDQHHKkT1DX4XoSU+vmUmSpH7IBCHXoq+SYHfRmfDsAYv7WmiJOQeo7i3RogLnBej0bFimY5JHhWBT69FVPc0aRi19eTz9L7grjLKz92+hbb4Qj7yvb08RvMUabv1juy4YHGulE73EVoLS6+FRBdEY8ZmIFq5lQcwMKb63/v+V/63AHP+oCDMzZZ7wKmQ5+UkgKcXgxToTOzulesQXD8urGcjGUwLnJviilIQywH1XFdcnDNWv95DdOB3nQ3HorqTFC+0kZMdTCO1L7zRbZQxWoExB41wQW3CNLvEkJlpaUv5TWKkep1wcT2PKFbuSVPnFnVnxZ7qNdlVLmBzEs9nX15C61+a28gFij4wj6ed8LIJwT4KapfZAFWwl2V2KmonqiXKk60/StBK9/dWHGfZ4ysPvXBB+fxJj3hR36Vu4HceNVYg+9tf5zEJ79J664iiyEFdyKzORlXnsJF33oPKC0+cuH1qhBzyf/o6t86F4DbpMBb2xhFRt1mDgFrV40JhT+2+iLCIqUmATBYsAYZZ9XIyi3vyaRGhgdd1ND/bhddALm/GKD4AJUo8FKtdkerYSbk/TpPLhvbrEFSDpkCT+JoOLiF4EzqRwZOrQklaXBOS67aaATRBzDxKJuFSGuFAWAIdLHhXcj/wDmnh1fqj03D4NmNmVSw7wKmt1OjI9arh6Ua1Mp7+1g+NT4BEdRnPYQX3CeiyRa0RUNyWxFDYZPGGpjSVNLf0vrzRh3hLEGBUlHXCza0SWuARkGmS6YdsvJr3gt+RlxXtrnI0LC0lgi9/Vw5zM5dGYX24tUOqCEA/9/FVvVZddfimYhmP44+ST1xTDgDw0rtVZQrcQjEg4UCcFq\"}}\n"; - - String str = "6wCHtIMRXXgj0TOV7jtvCzbKc+gWEnqbgAD5pMx4sIvliL65EF+btKRheJI/0gssOj0PdwUPYLlgjTdSWQZraQLU4F05FGSYJ7lNxFZ1tXLvhUv4ukiCz0xyPJIQ5vvNH/SmQ5iIQvMO/fTg6ZiZj2I+Oahzy5h2/cXmrXBEedNFZSGIVFKMuipul3QcFEO+qQQcOHOiRDAXrhF1+qoq4GROBpcKhu5WMHxUGDHj0l/tY2Rp004FNwfArbOeR5TusgMMgm7aE8IqpFJ6w4zES1lS903fHJzFWcqKMwB9tYoxnegoHSNmOVeokgBCvLOI2uVJCWN4ZqVq1mmhoib4zVxjex+pgoMtHPvV+Gjy+IB2PA5YCid0vH9WymkBkYZIioW1KH587G3lTTEWrzTc+JWWd+yIxD1nofZxAi0t+EFOgyab2HRawdpWpkwKH5XqoZ05yj0Vl0u7nWcF4GLytC5wTWyPOU3Ua/ePlniU/z5BWZkUQGWXWSKhyEmt53mx3UUXbC6/zfk1jcbyEGHonCimmf88Xl9yE3ae02xoRsDO8bcnzCRD88UWUi3UySWNmxdYDTdWj0wCU27nmLMLjkXvesRl2CfuZbkbDxDQHHKkT1DX4XoSU+vmUmSpH7IBCHXoq+SYHfRmfDsAYv7WmiJOQeo7i3RogLnBej0bFimY5JHhWBT69FVPc0aRi19eTz9L7grjLKz92+hbb4Qj7yvb08RvMUabv1juy4YHGulE73EVoLS6+FRBdEY8ZmIFq5lQcwMKb63/v+V/63AHP+oCDMzZZ7wKmQ5+UkgKcXgxToTOzulesQXD8urGcjGUwLnJviilIQywH1XFdcnDNWv95DdOB3nQ3HorqTFC+0kZMdTCO1L7zRbZQxWoExB41wQW3CNLvEkJlpaUv5TWKkep1wcT2PKFbuSVPnFnVnxZ7qNdlVLmBzEs9nX15C61+a28gFij4wj6ed8LIJwT4KapfZAFWwl2V2KmonqiXKk60/StBK9/dWHGfZ4ysPvXBB+fxJj3hR36Vu4HceNVYg+9tf5zEJ79J664iiyEFdyKzORlXnsJF33oPKC0+cuH1qhBzyf/o6t86F4DbpMBb2xhFRt1mDgFrV40JhT+2+iLCIqUmATBYsAYZZ9XIyi3vyaRGhgdd1ND/bhddALm/GKD4AJUo8FKtdkerYSbk/TpPLhvbrEFSDpkCT+JoOLiF4EzqRwZOrQklaXBOS67aaATRBzDxKJuFSGuFAWAIdLHhXcj/wDmnh1fqj03D4NmNmVSw7wKmt1OjI9arh6Ua1Mp7+1g+NT4BEdRnPYQX3CeiyRa0RUNyWxFDYZPGGpjSVNLf0vrzRh3hLEGBUlHXCza0SWuARkGmS6YdsvJr3gt+RlxXtrnI0LC0lgi9/Vw5zM5dGYX24tUOqCEA/9/FVvVZddfimYhmP44+ST1xTDgDw0rtVZQrcQjEg4UCcFq"; - try { -// String s = decryptAES(str, "tUsbfFrNWcZZYrN3dWQHNQ=="); -// log.info(s); - } catch (Exception e) { - throw new RuntimeException(e); - } - return null; - - } - - - - -// public static void main(String[] args) throws Exception { -//// test(); -//// AESCBCWithRSA(); -//// decrypt(); -// } - - public static void main(String[] args) { - System.out.println("Supported TLS versions:"); - String[] tlsVersions = getSupportedTLSVersions(); - Arrays.stream(tlsVersions).forEach(System.out::println); - } - - public static String[] getSupportedTLSVersions() { - try { - SSLContext context = SSLContext.getDefault(); - SSLSocketFactory factory = context.getSocketFactory(); - String[] supportedProtocols = factory.getDefaultCipherSuites(); - return supportedProtocols; - } catch (Exception e) { - e.printStackTrace(); - return new String[0]; - } + return s; } From 86e7119cfb6d592b82387c05a8e2d5f2eb4a88aa Mon Sep 17 00:00:00 2001 From: xupei Date: Fri, 31 May 2024 16:28:23 +0800 Subject: [PATCH 04/79] =?UTF-8?q?AlipayHK=20=E5=9B=9E=E8=B0=83=E5=8F=8A?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/COD-public-key.txt | 9 ++++ .../common/utils/AlipayHKEncryptionUtil.java | 35 +++++++------- .../da/common/utils/AlipayHKRequestUtil.java | 4 +- .../ai/da/controller/AlipayHKController.java | 6 +-- .../da/mapper/primary/entity/PaymentInfo.java | 2 +- .../ai/da/model/dto/AlipayHKCallbackDTO.java | 2 +- .../com/ai/da/service/AlipayHKService.java | 4 +- .../com/ai/da/service/CreditsService.java | 2 +- .../ai/da/service/impl/AliPayServiceImpl.java | 4 +- .../da/service/impl/AlipayHKServiceImpl.java | 46 +++++++++++-------- .../da/service/impl/CreditsServiceImpl.java | 2 +- .../impl/PayPalCheckoutServiceImpl.java | 4 +- .../service/impl/PaymentInfoServiceImpl.java | 14 +++--- src/main/resources/alipay-sandbox.properties | 4 +- src/main/resources/application-dev.properties | 6 ++- 15 files changed, 84 insertions(+), 60 deletions(-) create mode 100644 files/COD-public-key.txt diff --git a/files/COD-public-key.txt b/files/COD-public-key.txt new file mode 100644 index 00000000..ec172ee3 --- /dev/null +++ b/files/COD-public-key.txt @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAymkBAWixxUi9IAeMWgsq + K92AzFbe0qzzYPdkoh15ymL2A5MkYH7asnhFwclgdiFmd9a0TbZP+t/SzWW8UUzN + 1pXoEp48R+eguGTt5xkJwb10+H6quVXF/Ezzid5yzVW3dcYRp8qUlFr0XBpvkK9l + FpPzh2+mwVEAsgBMXq/K50ZiX2dlkPZ7ffkVPWaK2ESIo3YgfM6dmiiza0hPWJ35 + UgTH5rwJ7vN3IdOJTlkQOvrIrj2ocPcrudeEwqybIbCGhgRBwQSBsXQOO4U//rE4 + VU+0LF/3uQgXkvVY1+a1JLiTncZYKGEQ/NtxM+dGtYWV2gPhQRyJ7Z77OX0XCbcn + zwIDAQAB +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java index a26d60a0..3b706563 100644 --- a/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java +++ b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java @@ -50,6 +50,9 @@ public class AlipayHKEncryptionUtil { @Value("${alipayHK.rsaPublicKey}") private String publicKeyPath; + @Value("${alipayHK.CODPublicKey}") + private String CODPublicKeyPath; + /** * 加密 @@ -70,7 +73,8 @@ public class AlipayHKEncryptionUtil { // The path to the rsa private key file, DO NOT save this key to a publicly accessible location // 使用私钥创建数字签名 // Mode, aes-128-cbc for 128bit key - String mode = "aes-128-cbc"; +// String mode = "aes-128-cbc"; + String mode = "aes-256-cbc"; // Padding mode String padding = "pkcs7"; // signature alogrithm @@ -84,14 +88,6 @@ public class AlipayHKEncryptionUtil { requestMessage.setRequest_uuid(UUID.randomUUID().toString()); // HashMap param = new HashMap<>(); requestMessage.setParameters(param); - /*String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); - param.put("order_ref", orderRef); - param.put("amount", 208.12); - param.put("subject", "四月帳單 April Bill"); - param.put("wallet", "ALIPAYHK"); - param.put("segment_id", segmentId); - param.put("payment_solution", "WAP");*/ - // Serialize message body Gson gson = new GsonBuilder().disableHtmlEscaping().create(); @@ -342,18 +338,25 @@ public class AlipayHKEncryptionUtil { Base64.Decoder decoder = Base64.getDecoder(); // Verify key try { -// PublicKey publicKey = readPublicKey(new File(publicKeyPath)); - InputStreamReader isrPub = new InputStreamReader(new FileInputStream(publicKeyPath)); + // 从指定的路径读取公钥文件 + InputStreamReader isrPub = new InputStreamReader(new FileInputStream(CODPublicKeyPath)); PEMParser pemParserPub = new PEMParser(isrPub); + // 使用 PEMParser 解析公钥文件 SubjectPublicKeyInfo pubInfo = (SubjectPublicKeyInfo) pemParserPub.readObject(); + // 从 SubjectPublicKeyInfo 创建 AsymmetricKeyParameter 对象 AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(pubInfo); - // Verifying + // Verifying; 创建 RSADigestSigner 对象并使用 SHA-256 作为摘要算法 RSADigestSigner verifier = new RSADigestSigner(new SHA256Digest()); + // 初始化 RSADigestSigner,设置为验证模式并提供公钥参数 verifier.init(false, pubKey); - byte[] signMessageForVerifing = data.getBytes(); - byte[] signatureBase64ForVerifing = decoder.decode(signatureBase64); - verifier.update(signMessageForVerifing, 0, signMessageForVerifing.length); - Boolean verifyResult = verifier.verifySignature(signatureBase64ForVerifing); + // 将要验证的数据转换为字节数组 + byte[] signMessageForVerifying = data.getBytes(); + // 将 Base64 编码的签名转换为字节数组 + byte[] signatureBase64ForVerifying = decoder.decode(signatureBase64); + // 使用签名器更新要验证的数据 + verifier.update(signMessageForVerifying, 0, signMessageForVerifying.length); + // 验证签名并返回结果 + Boolean verifyResult = verifier.verifySignature(signatureBase64ForVerifying); return verifyResult; } catch (Exception e) { throw new RuntimeException(e); diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java index 3bfcf9a4..a7246492 100644 --- a/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java +++ b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Component; @Component public class AlipayHKRequestUtil { - public String requestAlipayHK(AlipayHKRequestDTO alipayHKRequestDTO) throws IOException { + public String requestAlipayHK(AlipayHKRequestDTO alipayHKRequestDTO) { OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) @@ -29,7 +29,7 @@ public class AlipayHKRequestUtil { log.info("Alipay-HK send request unix timestamp: {}", epochMilli); String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue); - log.info(jsonString); +// log.info(jsonString); RequestBody body = RequestBody.create(mediaType, jsonString); diff --git a/src/main/java/com/ai/da/controller/AlipayHKController.java b/src/main/java/com/ai/da/controller/AlipayHKController.java index 602096a6..006c00b9 100644 --- a/src/main/java/com/ai/da/controller/AlipayHKController.java +++ b/src/main/java/com/ai/da/controller/AlipayHKController.java @@ -8,7 +8,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.Map; @CrossOrigin @RestController @@ -29,8 +28,9 @@ public class AlipayHKController { @ApiOperation("支付通知") @PostMapping("/trade/notify") - public String callback(@RequestParam Map params){ - return alipayHKService.callback(params); + public String callback(@RequestBody String paramString){ + log.info("alipay-hk callback parameter : {}", paramString); + return alipayHKService.callback(paramString); } @ApiOperation("订单查询") diff --git a/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java index 2d7cf881..c3876106 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java @@ -17,7 +17,7 @@ public class PaymentInfo extends BaseEntity{ private String tradeState;//交易状态 - private Long payerTotal;//支付金额(元) + private Float payerTotal;//支付金额(元) private String content;//通知参数 } diff --git a/src/main/java/com/ai/da/model/dto/AlipayHKCallbackDTO.java b/src/main/java/com/ai/da/model/dto/AlipayHKCallbackDTO.java index d1e40107..560aaeb7 100644 --- a/src/main/java/com/ai/da/model/dto/AlipayHKCallbackDTO.java +++ b/src/main/java/com/ai/da/model/dto/AlipayHKCallbackDTO.java @@ -7,7 +7,7 @@ public class AlipayHKCallbackDTO { private String transaction_id; - private Long amount; + private Float amount; private String currency; diff --git a/src/main/java/com/ai/da/service/AlipayHKService.java b/src/main/java/com/ai/da/service/AlipayHKService.java index e0aad9c4..13495fe2 100644 --- a/src/main/java/com/ai/da/service/AlipayHKService.java +++ b/src/main/java/com/ai/da/service/AlipayHKService.java @@ -2,13 +2,11 @@ package com.ai.da.service; import com.ai.da.model.dto.AlipayHKCallbackDTO; -import java.util.Map; - public interface AlipayHKService { String createOrder(Integer amount, String wallet); - String callback(Map params); + String callback(String paramString); void processOrder(AlipayHKCallbackDTO alipayHKCallbackDTO); diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index a9d35d17..e6179e22 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -11,7 +11,7 @@ public interface CreditsService extends IService { void initCredits(); - Boolean buyCredits(Long accountId, Integer quantity); + Boolean buyCredits(Long accountId, Float quantity); void creditsIncrease(Long accountId, String event); diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index 2d886b2d..75c93eb6 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -216,7 +216,7 @@ public class AliPayServiceImpl implements AliPayService { CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); // 更新积分 - creditsService.buyCredits(orderByOrderNo.getAccountId(),Integer.parseInt(totalAmount) / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + creditsService.buyCredits(orderByOrderNo.getAccountId(),Float.parseFloat(totalAmount) / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); } finally { //要主动释放锁 lock.unlock(); @@ -318,7 +318,7 @@ public class AliPayServiceImpl implements AliPayService { CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); // 更新积分 - creditsService.buyCredits(orderByOrderNo.getAccountId(),(int)(orderByOrderNo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue()))); + creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); } } diff --git a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java index 038168ec..14515580 100644 --- a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java @@ -71,7 +71,8 @@ public class AlipayHKServiceImpl implements AlipayHKService { // ALIPAYHK 或者 ALIPAYCN param.put("wallet", wallet); param.put("segment_id", segmentId); - param.put("payment_solution", "WAP"); +// param.put("payment_solution", "WAP"); + param.put("payment_solution", "PC2MOBILE"); log.info("alipay-hk 创建订单,参数信息: {}", param); // 生成订单 log.info("创建订单"); @@ -125,44 +126,46 @@ public class AlipayHKServiceImpl implements AlipayHKService { } - /** * 异步回调 * @return */ - public String callback(Map params){ - log.info("支付通知正在执行"); - log.info("通知参数 ===> {}", params); + public String callback(String paramString){ + log.info("支付宝(HK)通知正在执行"); + Map params = JSONObject.parseObject(paramString, Map.class); String result = "failure"; - String data = params.get("data"); String signature = params.get("signature"); try { // 异步回调验签 Boolean verification = alipayHKEncryptionUtil.signatureVerification(data, signature); - if (!verification){ - log.error("alipay-hk 验签失败"); + log.error("Alipay-hk 验签失败"); return result; } + log.info("Alipay-HK 验签成功"); - AlipayHKCallbackDTO alipayHKCallbackDTO = JSONObject.parseObject(data, AlipayHKCallbackDTO.class); + String dataString = data.replace("\\\"", "\"") + .replace("\"{", "{") + .replace("}\"", "}"); + + AlipayHKCallbackDTO alipayHKCallbackDTO = JSONObject.parseObject(dataString, AlipayHKCallbackDTO.class); //按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验, //1 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号 String outTradeNo = alipayHKCallbackDTO.getOut_trade_no(); OrderInfo order = orderInfoService.getOrderByOrderNo(outTradeNo); if(order == null){ - log.error("订单不存在"); + log.error("订单:{} 不存在",outTradeNo); return result; } //2 判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额) - Long totalAmount = alipayHKCallbackDTO.getAmount(); - Long totalFee = order.getTotalFee().longValue(); + Float totalAmount = alipayHKCallbackDTO.getAmount(); + Float totalFee = order.getTotalFee(); if(!Objects.equals(totalAmount, totalFee)){ - log.error("金额校验失败"); + log.error("金额校验失败,回调中金额为:{},实际金额为:{}", totalAmount, totalFee); return result; } @@ -170,7 +173,7 @@ public class AlipayHKServiceImpl implements AlipayHKService { String sellerId = alipayHKCallbackDTO.getMerchant_id(); String sellerIdProperty = merchantId; if(!sellerId.equals(sellerIdProperty)){ - log.error("商家pid校验失败"); + log.error("商家merchantId校验失败,回调中merchantId为:{},实际merchantId为:{}", sellerId, sellerIdProperty); return result; } @@ -178,7 +181,7 @@ public class AlipayHKServiceImpl implements AlipayHKService { String segId = alipayHKCallbackDTO.getSegment_id(); String segmentIdProperty = segmentId; if(!segId.equals(segmentIdProperty)){ - log.error("segmentId校验失败"); + log.error("segmentId校验失败,回调中segmentId为:{},实际segmentId为:{}", segId, segmentIdProperty); return result; } @@ -190,13 +193,14 @@ public class AlipayHKServiceImpl implements AlipayHKService { return result; } + log.info("Alipay-HK参数二次校验成功,进入数据处理与存储"); processOrder(alipayHKCallbackDTO); result = "success"; }catch (Exception e){ log.error(e.getMessage()); } - + log.info("Alipay-HK 回调处理结果:{}", result); return result; } @@ -226,21 +230,25 @@ public class AlipayHKServiceImpl implements AlipayHKService { // String orderStatus = orderInfoService.getOrderStatus(orderNo); OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); String orderStatus = orderByOrderNo.getOrderStatus(); - // 当订单状态处于未支付或超时已关闭时,更新订单状态 - if (!OrderStatusEnum.NOT_PAY.getType().equals(orderStatus) || !OrderStatusEnum.TIMEOUT_CLOSED.getType().equals(orderStatus)) { + // 当订单状态处于未支付或超时已关闭时,更新订单状态,其他状态均不更新订单状态 + if (!OrderStatusEnum.NOT_PAY.getType().equals(orderStatus) && !OrderStatusEnum.TIMEOUT_CLOSED.getType().equals(orderStatus)) { + log.info("订单状态 : {}", orderStatus); return; } //更新订单状态 orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); + log.info("Alipay-HK 订单:{} 状态更新成功",orderNo); //记录支付日志 paymentInfoService.createPaymentInfoForAliPayHK(alipayHKCallbackDTO); + log.info("Alipay-HK 订单:{} 支付信息状态更新成功",orderNo); // 添加积分变更记录 creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), CreditsEventsEnum.BUY_CREDITS.getName() + "--AlipayHK", CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); // 更新积分 - creditsService.buyCredits(orderByOrderNo.getAccountId(),Integer.parseInt(totalAmount) / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + creditsService.buyCredits(orderByOrderNo.getAccountId(),Float.parseFloat(totalAmount) / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); + log.info("用户:{} 积分信息更新成功",orderByOrderNo.getAccountId()); } finally { //要主动释放锁 lock.unlock(); diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index c947ac97..13f380ce 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -48,7 +48,7 @@ public class CreditsServiceImpl extends ServiceImpl Date: Mon, 3 Jun 2024 17:13:48 +0800 Subject: [PATCH 05/79] =?UTF-8?q?generate=20=E6=B7=BB=E5=8A=A0Logo?= =?UTF-8?q?=E4=B8=8ESlogan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/RabbitMQ/GenerateConsumer.java | 124 +++++++------- .../ai/da/common/constant/CommonConstant.java | 6 + .../enums/CollectionLevel2TypeEnum.java | 19 +- .../ai/da/controller/GenerateController.java | 4 +- .../ai/da/mapper/primary/entity/Generate.java | 12 +- .../dto/GenerateThroughImageTextDTO.java | 15 +- .../ai/da/model/dto/GenerateToPythonDTO.java | 5 +- .../java/com/ai/da/python/PythonService.java | 12 +- .../da/service/impl/GenerateServiceImpl.java | 162 +++++++++++++++--- src/main/resources/messages_en.properties | 4 +- 10 files changed, 261 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 876dfd2c..ec329d28 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -67,7 +67,11 @@ public class GenerateConsumer { // redisUtil.removeFromSet(cancelSetKey, uniqueId); } else { // GenerateCollectionVO generateCollectionVO = generateService.generateThroughImageText(generateThroughImageTextDTO); - generateService.generateThroughImageText(generateThroughImageTextDTO); + try { + generateService.generateThroughImageText(generateThroughImageTextDTO); + }catch (Exception e){ + log.error(e.getMessage()); + } // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); /*if (!Objects.isNull(generateCollectionVO)) { @@ -154,63 +158,63 @@ public class GenerateConsumer { } -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer1(Message msg, Channel channel) { -// generate(msg, channel, "consumer 1"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer2(Message msg, Channel channel) { -// generate(msg, channel, "consumer 2"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer3(Message msg, Channel channel) { -// generate(msg, channel, "consumer 3"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer4(Message msg, Channel channel) { -// generate(msg, channel, "consumer 4"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer5(Message msg, Channel channel) { -// generate(msg, channel, "consumer 5"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer6(Message msg, Channel channel) { -// generate(msg, channel, "consumer 6"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer7(Message msg, Channel channel) { -// generate(msg, channel, "consumer 7"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer8(Message msg, Channel channel) { -// generate(msg, channel, "consumer 8"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer9(Message msg, Channel channel) { -// generate(msg, channel, "consumer 9"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) -// @RabbitHandler -// public void getGenerateResult(Message msg, Channel channel) { -// processGenerateResult(msg, channel); -// } + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer1(Message msg, Channel channel) { + generate(msg, channel, "consumer 1"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer2(Message msg, Channel channel) { + generate(msg, channel, "consumer 2"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer3(Message msg, Channel channel) { + generate(msg, channel, "consumer 3"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer4(Message msg, Channel channel) { + generate(msg, channel, "consumer 4"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer5(Message msg, Channel channel) { + generate(msg, channel, "consumer 5"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer6(Message msg, Channel channel) { + generate(msg, channel, "consumer 6"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer7(Message msg, Channel channel) { + generate(msg, channel, "consumer 7"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer8(Message msg, Channel channel) { + generate(msg, channel, "consumer 8"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer9(Message msg, Channel channel) { + generate(msg, channel, "consumer 9"); + } + + @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) + @RabbitHandler + public void getGenerateResult(Message msg, Channel channel) { + processGenerateResult(msg, channel); + } } 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 252350c5..0bc1af58 100644 --- a/src/main/java/com/ai/da/common/constant/CommonConstant.java +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -17,4 +17,10 @@ public class CommonConstant { public static final Integer NUMBER_10080 = 10080; } + public static final String GENERATE_PATH = "/api/generate_image"; + + public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo"; + + public static final String GENERATE_SLOGAN = "/api/slogan"; + } 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 cc344c9e..a538f113 100644 --- a/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java +++ b/src/main/java/com/ai/da/common/enums/CollectionLevel2TypeEnum.java @@ -1,5 +1,7 @@ package com.ai.da.common.enums; +import java.util.Arrays; +import java.util.List; import java.util.stream.Stream; /** @@ -36,7 +38,18 @@ public enum CollectionLevel2TypeEnum { * 男装下装 */ BOTTOMS("Bottoms"), - ; + /** + * 印花-logo + */ + LOGO("Logo"), + /** + * 印花-slogan + */ + SLOGAN("Slogan"), + /** + * 印花-图案 + */ + Pattern("Pattern"); private String realName; @@ -51,4 +64,8 @@ public enum CollectionLevel2TypeEnum { public static CollectionLevel2TypeEnum of(String realName) { return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null); } + + public static List printType() { + return Arrays.asList(LOGO.getRealName(), SLOGAN.getRealName(), Pattern.getRealName()); + } } diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java index 4e1566dd..74743856 100644 --- a/src/main/java/com/ai/da/controller/GenerateController.java +++ b/src/main/java/com/ai/da/controller/GenerateController.java @@ -27,11 +27,11 @@ public class GenerateController { @Resource private GenerateService generateService; - @ApiOperation("自动识别sketch的caption 暂时未上") + /*@ApiOperation("自动识别sketch的caption 暂时未上") @PostMapping("/caption") public Response generateCaption(@RequestParam Long sketchElementId) { return Response.success(generateService.generateCaption(sketchElementId)); - } + }*/ /*@ApiOperation("通过文字、图片生成图片") @PostMapping("/sketchAndPrint") diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Generate.java b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java index d58d72ec..6d1148db 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Generate.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java @@ -33,10 +33,15 @@ public class Generate { private String uniqueId; /** - * Sketchboard Printboard + * Sketchboard Printboard Moodboard */ private String level1Type; + /** + * Slogan Logo Pattern + */ + private String level2Type; + /** * 图片来源 collection | library */ @@ -62,6 +67,11 @@ public class Generate { */ private String modelName; + /** + * Logo 种子 相同种子 相同prompt 输出一定相同 + */ + private String seed; + /** * 创建时间 */ diff --git a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java index 602f1886..398fa9ec 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java @@ -14,24 +14,25 @@ public class GenerateThroughImageTextDTO { @ApiModelProperty("用户id") Long userId; - @ApiModelProperty("caption") + @ApiModelProperty("caption | prompt") String text; @ApiModelProperty("图片在t_collection_element表中的id") Long collectionElementId; - @NotBlank(message = "you have to choose the generate type") + // todo 后续取消这个字段的传输,由后端自行判断相关参数是否有值 +// @NotBlank(message = "you have to choose the generate type") @ApiModelProperty("text image text-image") String generateType; - @ApiModelProperty("图片是update,还是从library中选择") + @ApiModelProperty("图片是update,还是从library中选择 collection || library") String designType; @NotBlank(message = "level1Type cannot be empty!") @ApiModelProperty("Moodboard Printboard Sketchboard MarketingSketch") String level1Type; - @ApiModelProperty("Outwear Dress Blouse Skirt Trousers") + @ApiModelProperty("Outwear Dress Blouse Skirt Trousers || Logo Slogan Pattern") String level2Type; @ApiModelProperty("性别") @@ -50,4 +51,10 @@ public class GenerateThroughImageTextDTO { @NotNull(message = "Please check if the required fields are empty.(isTestUser)") @ApiModelProperty("是否是测试用户") Boolean isTestUser; + + @ApiModelProperty("页面上用户设计的slogan所截的图片") + String sloganBase64; + + @ApiModelProperty("种子 取值范围 0~99999") + String seed; } diff --git a/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java b/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java index c08a5f90..16fa7988 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java @@ -1,6 +1,5 @@ package com.ai.da.model.dto; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -26,6 +25,10 @@ public class GenerateToPythonDTO { // taskId的最后拼接用户id private String tasks_id; + private String seed; + + private String svg; + public GenerateToPythonDTO(String tasks_id, String prompt, String image_url, String mode, String category, String gender) { this.image_url = image_url; this.category = category; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 9e9d82b0..3610c7c2 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -66,7 +66,7 @@ public class PythonService { private String accessPythonIp; @Value("${access.python.port:''}") private String accessPythonPort; - @Value("${access.python.sr}") + @Value("${access.python.address}") private String srPythonPort; @Value("${minio.bucketName.gradient}") private String gradientBucketName; @@ -2936,7 +2936,7 @@ public class PythonService { throw new BusinessException("system error!"); } - public Boolean generateSketchOrPrint(GenerateToPythonDTO generateToPythonDTO) { + public Boolean generateSketchOrPrint(String params, String servicePath) { //限流校验 // AccessLimitUtils.validate("generateSketchOrPrint", 5); OkHttpClient client = new OkHttpClient().newBuilder() @@ -2946,13 +2946,14 @@ public class PythonService { .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) .build(); MediaType mediaType = MediaType.parse("application/json"); - RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue)); +// RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue)); + RequestBody body = RequestBody.create(mediaType, params); Request request = new Request.Builder() // .url("http://18.167.251.121:9992") // .url("http://127.0.0.1:5000/api/diffusion") // .url(accessPythonIp + ":" + accessPythonPort + "/api/diffusion") // .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_image") - .url(srPythonPort + "/api/generate_image") + .url(srPythonPort + servicePath) .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") @@ -2960,7 +2961,8 @@ public class PythonService { Response response = null; String bodyString; try { - log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue)); +// log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue)); + log.info("generateSketchOrPrint请求入参content###{}", params); response = client.newCall(request).execute(); } catch (IOException ioException) { log.error("PythonService##generateSketchOrPrint异常###{}", ExceptionUtil.getThrowableList(ioException)); 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 fbe8715d..4033b8aa 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -3,6 +3,7 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CollectionLevel2TypeEnum; import com.ai.da.common.enums.GenerateModeEnum; import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.*; @@ -21,7 +22,7 @@ import com.ai.da.service.GenerateService; import com.ai.da.service.LibraryService; import com.ai.da.service.RabbitMQService; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -32,13 +33,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; -import java.util.stream.Collectors; import static com.ai.da.common.enums.CollectionLevel1TypeEnum.*; @@ -85,6 +84,9 @@ public class GenerateServiceImpl extends ServiceImpl i @Value("${redis.key.generateResult}") private String generateResultKey; + @Value("${minio.bucketName.slogan}") + private String sloganBucket; + @Override public GenerateCaptionVO generateCaption(Long sketchElementId) { CollectionElement collectionElement = collectionElementMapper.selectById(sketchElementId); @@ -110,6 +112,8 @@ public class GenerateServiceImpl extends ServiceImpl i generate.setAccountId(accountId); generate.setUniqueId(generateThroughImageTextDTO.getUniqueId()); generate.setLevel1Type(generateThroughImageTextDTO.getLevel1Type()); + generate.setLevel2Type(generateThroughImageTextDTO.getLevel2Type()); + generate.setSeed(StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getSeed()) ? "" : generateThroughImageTextDTO.getSeed()); // 当level1type是sketchboard时,存数据库需要加上当前性别 generate.setGenerateType(generate.getLevel1Type().equals(SKETCH_BOARD.getRealName()) ? generateType + " (" + generateThroughImageTextDTO.getGender() + ")" : @@ -119,12 +123,15 @@ public class GenerateServiceImpl extends ServiceImpl i generate.setElementSource(StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getDesignType()) ? null : generateThroughImageTextDTO.getDesignType()); String text = generateThroughImageTextDTO.getText(); + generate.setText(text); Long elementId = generateThroughImageTextDTO.getCollectionElementId(); - validateGeneraType(generate, text, elementId, generateType); +// validateGeneraType(generate, text, elementId); if (!StringUtil.isNullOrEmpty(text)) { text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type()); } + + // todo 这一步现在还是有必要的吗? // 2.1 sketch或print在t_collection_element表/t_library表中的信息是否需要更新 如 level2Type CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type(), generateThroughImageTextDTO.getDesignType()); @@ -134,15 +141,38 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateModeEnum.TEXT_IMAGE.getType(); String category = generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName()) ? "sketch" : generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName()) ? "print" : "moodboard"; -// AsyncCallerUtil asyncCallerUtil = new AsyncCallerUtil(); -// List generatedSketchUrl = asyncCallerUtil.generate(new GenerateToPythonDTO(accountId, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), -// category, text, mode, "1", generateThroughImageTextDTO.getGender(), generateThroughImageTextDTO.getUniqueId())); - Boolean requestResult = pythonService.generateSketchOrPrint(new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), - mode, category, generateThroughImageTextDTO.getGender())); -// log.info("generate 响应 : " + generatedSketchUrl); -// if (CollectionUtils.isEmpty(generatedSketchUrl)) { -// return null; -// } + String path = CommonConstant.GENERATE_PATH; + String jsonString = ""; + HashMap params = new HashMap<>(); + // 3.1 确定不同类型的印花分别调哪个接口 + if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())){ + switch(generateThroughImageTextDTO.getLevel2Type()){ + case "Logo": + path = CommonConstant.GENERATE_SINGLE_LOGO; + params.put("tasks_id",generateThroughImageTextDTO.getUniqueId()); + params.put("prompt", text); + params.put("seed", generateThroughImageTextDTO.getSeed()); + jsonString = JSON.toJSONString(params, SerializerFeature.WriteMapNullValue); + break; + case "Slogan": + path = CommonConstant.GENERATE_SLOGAN; + params.put("tasks_id",generateThroughImageTextDTO.getUniqueId()); + params.put("prompt", text); + params.put("svg", collectionElement.getUrl()); + jsonString = JSON.toJSONString(params, SerializerFeature.WriteMapNullValue); + break; + case "Pattern": + GenerateToPythonDTO generateToPythonDTO = new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), + mode, category, generateThroughImageTextDTO.getGender()); + jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue); + } + }else { + GenerateToPythonDTO generateToPythonDTO = new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), + mode, category, generateThroughImageTextDTO.getGender()); + jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue); + } + + Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, path); // 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中 save(generate); @@ -229,8 +259,24 @@ public class GenerateServiceImpl extends ServiceImpl i redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } - private void validateGeneraType(Generate generate, String text, Long elementId, String generateType) { - switch (generateType) { + private void validateGeneraType(Generate generate, String text, Long elementId) { + String generateType = ""; + if (StringUtil.isNullOrEmpty(text.trim()) && Objects.isNull(elementId)) { + throw new BusinessException("please.input.the.caption.or.choose.an.image"); + } else if (!StringUtil.isNullOrEmpty(text.trim()) && !Objects.isNull(elementId)) { + generateType = "text-image"; + generate.setText(text); + generate.setElementId(elementId); + } else if (!StringUtil.isNullOrEmpty(text.trim())) { + generateType = "text"; + generate.setText(text); + } else if (!Objects.isNull(elementId)) { + generateType = "image"; + generate.setElementId(elementId); + } + generate.setGenerateType(generateType); + + /*switch (generateType) { case "text": if (StringUtil.isNullOrEmpty(text)) { throw new BusinessException("please.input.the.caption"); @@ -250,7 +296,7 @@ public class GenerateServiceImpl extends ServiceImpl i generate.setText(text); generate.setElementId(elementId); default: - } + }*/ } private String modifyPrompt(String userInput, Generate generate, String level1Type) { @@ -263,13 +309,15 @@ public class GenerateServiceImpl extends ServiceImpl i break; case "Printboard": if (userInput.contains("Painting Style")) { - userInput = "Picasso,increased color saturation,increased glossiness," + translated; + text = "Picasso,increased color saturation,increased glossiness," + translated + ", fabric print, high quality"; } else if (userInput.contains("Illustration Style")) { - userInput = "Flat coating,romantic,soft,pencil strokes,accentuating and widening the depth of pencil strokes,paper patterns,block colors,crayons,reducing image contrast,and hand drawn painting marks," + translated; + text = "Flat coating,romantic,soft,pencil strokes,accentuating and widening the depth of pencil strokes,paper patterns,block colors,crayons,reducing image contrast,and hand drawn painting marks," + translated + ", fabric print, high quality"; } else if (userInput.contains("Real Style")) { - userInput = "Still life photography,hyper realism,3d,deepened projection,increased permutation value,increased concavity and convexity value," + translated; + text = "Still life photography,hyper realism,3d,deepened projection,increased permutation value,increased concavity and convexity value," + translated + ", fabric print, high quality"; + }else { + text = translated; } - text = userInput + ", fabric print, high quality"; +// text = userInput + ", fabric print, high quality"; // generate.setText(text); break; case "Sketchboard": @@ -408,10 +456,10 @@ public class GenerateServiceImpl extends ServiceImpl i if (Objects.isNull(generateThroughImageTextDTO.getUserId())) { throw new BusinessException("userId cannot be empty"); } - String generateType = generateThroughImageTextDTO.getGenerateType(); + /*String generateType = generateThroughImageTextDTO.getGenerateType(); if (!GenerateModeEnum.getGenerateModeList().contains(generateType)) { throw new BusinessException("unknown.generate.type"); - } + }*/ // 判断试用用户是否还有剩余试用机会 int trialsCount = 0; @@ -422,15 +470,75 @@ public class GenerateServiceImpl extends ServiceImpl i } } - String text = generateThroughImageTextDTO.getText(); - Long elementId = generateThroughImageTextDTO.getCollectionElementId(); - validateGeneraType(new Generate(), text, elementId, generateType); + int times = 4; + // 当level1Type为Print_board时,level2Type为pattern时需要确定generateType + if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())){ + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getLevel2Type())){ + throw new BusinessException("level2Type.cannot.be.empty"); + }else if (!CollectionLevel2TypeEnum.printType().contains(generateThroughImageTextDTO.getLevel2Type())){ + throw new BusinessException("unknown.parameter.level2Type"); + } + + // Pattern 参数校验 + if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.Pattern.getRealName())){ + String text = generateThroughImageTextDTO.getText(); + Long elementId = generateThroughImageTextDTO.getCollectionElementId(); + Generate generate = new Generate(); + validateGeneraType(generate, text, elementId); + // 校验后获取 + generateThroughImageTextDTO.setGenerateType(generate.getGenerateType()); + } + // Slogan 参数校验 + if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())){ + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getSloganBase64())){ + log.error("Printboard-Slogan模式下,slogan image为空"); + throw new BusinessException("Slogan can not be empty!"); + } + + // 将图片上传到图片服务器 + String path = minioUtil.base64Upload(generateThroughImageTextDTO.getSloganBase64(), sloganBucket); + String name = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + // 保存到db,collection-element + CollectionElement collectionElement = new CollectionElement(); + collectionElement.setAccountId(generateThroughImageTextDTO.getUserId()); + collectionElement.setCollectionId(0L); + collectionElement.setLevel1Type(PRINT_BOARD.getRealName()); + collectionElement.setLevel2Type(CollectionLevel2TypeEnum.SLOGAN.getRealName()); + collectionElement.setName(name); + collectionElement.setUrl(path); + collectionElement.setHasPin((byte) 0); + collectionElement.setMd5(MD5Utils.encryptFile(minioUtil.getPresignedUrl(path, 24 * 60), Boolean.FALSE)); + collectionElement.setCreateDate(DateUtil.getByTimeZone(generateThroughImageTextDTO.getTimeZone())); + collectionElementService.save(collectionElement); + + // 将上传后的地址放在指定字段 + generateThroughImageTextDTO.setCollectionElementId(collectionElement.getId()); + generateThroughImageTextDTO.setSloganBase64(null); + generateThroughImageTextDTO.setDesignType("collection"); + } + + // Logo参数校验 + if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.LOGO.getRealName())){ + // logo模式下一次只生成一张 + times = 1; + // 校验是否输入内容 + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText().trim())){ + throw new BusinessException("please.input.the.prompt"); + } + + // 校验seed的取值范围 + int seed = Integer.parseInt(generateThroughImageTextDTO.getSeed()); + if (seed < 0 || seed > 99999){ + throw new BusinessException("the.value.range.of.seed"); + } + } + } // 2、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 String uuid = UUID.randomUUID().toString(); ArrayList taskIdList = new ArrayList<>(); - for (int i = 1; i <= 4; i++) { + for (int i = 1; i <= times; i++) { String temp = uuid; temp += "-" + i + "-" + generateThroughImageTextDTO.getUserId(); taskIdList.add(temp); @@ -588,7 +696,7 @@ public class GenerateServiceImpl extends ServiceImpl i String key = generateResultKey + ":" + uniqueId; GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); // 判断当前task的状态是不是Fail - if (!generateResultVO.getStatus().equals("Fail")){ + if (!generateResultVO.getStatus().equals("Fail")) { // 2、不是,直接发送取消请求到python端 pythonService.cancelGenerateTask(uniqueId); // 3、更改result中当前taskId的状态 diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 39096842..6d79efa8 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -54,9 +54,10 @@ save.collection.failed=Save collection failed. save.designItemDetail.failed=Save designItemDetail failed. save.classification.failed=Save classification failed. update.classification.failed=Update classification failed. -please.input.the.caption=Please input the caption. +please.input.the.prompt=Please input the prompt. please.choose.an.image=Please choose an image. please.input.the.caption.and.choose.an.image=Please input the caption and choose an image. +please.input.the.caption.or.choose.an.image=Please input the caption or choose an image. duplicate.likes.are.not.allowed=Duplicate likes are not allowed. layer.information.not.found=Layer information not found. singleOverall.cannot.be.empty=singleOverall cannot be empty. @@ -132,6 +133,7 @@ image.synthesis.failed=image synthesis failed. priority.cannot.be.repeated=priority cannot be repeated. model.not.found=model not found. libraryIdList.cannot.be.empty=libraryIdList cannot be empty. +the.value.range.of.seed=The value range of seed is 0-99999 # 可能会报异常 # Informative: From 891f6fb15fbd60c82c38432b857ccd4704ae3045 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 4 Jun 2024 15:19:30 +0800 Subject: [PATCH 06/79] =?UTF-8?q?Printboard=20level2Type=20=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/model/enums/Position.java | 5 ++++- src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java | 3 ++- src/main/resources/messages_en.properties | 5 ++++- src/main/resources/messages_zh.properties | 5 ++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ai/da/model/enums/Position.java b/src/main/java/com/ai/da/model/enums/Position.java index 498ed2f7..93ca5b63 100644 --- a/src/main/java/com/ai/da/model/enums/Position.java +++ b/src/main/java/com/ai/da/model/enums/Position.java @@ -16,7 +16,10 @@ public enum Position implements IEnumDisplay { BLOUSE("Blouse"), DRESS("Dress"), TROUSERS("Trousers"), - SKIRT("Skirt"); + SKIRT("Skirt"), + SLOGAN("Slogan"), + LOGO("Logo"), + PATTERN("Pattern"); private String value; 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 990f5848..86843f30 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -209,7 +209,8 @@ public class LibraryServiceImpl extends ServiceImpl impl if (finalMap != null && finalMap.containsKey(library.getId())) { libraryPageVO.setLibraryModelPoint(finalMap.get(library.getId())); } - if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) { + if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName()) + || libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.PRINT_BOARD.getRealName())) { if (!StringUtils.isEmpty(libraryPageVO.getLevel2Type())) { Position position = Position.getPosition(libraryPageVO.getLevel2Type()); libraryPageVO.setLevel2TypeEnum(new BizJson(position.getValue(), position.name(), BusinessException.getMessageFromResource(position.name()))); diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 6d79efa8..b2ea358f 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -184,4 +184,7 @@ DRESS=Dress TROUSERS=Trousers SKIRT=Skirt FEMALE=Women's wear -MALE=Men's wear \ No newline at end of file +MALE=Men's wear +SLOGAN=Slogan +LOGO=Logo +PATTERN=Pattern \ No newline at end of file diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index 8fecb5f9..c197c25c 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -178,4 +178,7 @@ DRESS=长裙 TROUSERS=裤子 SKIRT=短裙 FEMALE=女装 -MALE=男装 \ No newline at end of file +MALE=男装 +SLOGAN=标语 +LOGO=标志 +PATTERN=图案 \ No newline at end of file From 954f6207ec44ca2d8b5be612fd856a953e807d13 Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 5 Jun 2024 11:43:35 +0800 Subject: [PATCH 07/79] =?UTF-8?q?design=20Single=20=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E7=94=BB=E7=AC=94=E4=BF=AE=E6=94=B9sketch=E5=90=8E=E8=BF=9B?= =?UTF-8?q?=E8=A1=8Cdesign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/utils/MinioUtil.java | 29 +++++++++++++-- .../ai/da/model/dto/DesignSingleItemDTO.java | 5 ++- .../com/ai/da/model/dto/GenerateLikeDTO.java | 2 +- .../java/com/ai/da/python/PythonService.java | 2 +- .../service/impl/DesignItemServiceImpl.java | 36 +++++++++++++++++++ src/main/resources/messages_en.properties | 1 + 6 files changed, 70 insertions(+), 5 deletions(-) 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 9341e3ea..300d68d3 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -8,6 +8,8 @@ import io.minio.http.Method; import io.minio.messages.DeleteError; import io.minio.messages.DeleteObject; import io.minio.messages.Item; +import io.netty.util.internal.StringUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -26,6 +28,7 @@ import java.util.stream.Collectors; * @description: minio工具类 * @version:3.0 */ +@Slf4j @Component public class MinioUtil { @Autowired @@ -437,11 +440,33 @@ public class MinioUtil { } } - public String base64Upload(String base64, String bucketName){ + public String base64UploadToPath(String base64, String bucketName, String path){ String[] parts = base64.split(","); String imageType = parts[0].split("/")[1].split(";")[0]; String base64Data = parts[1]; - return uploadImageFromBase64(bucketName, base64Data, imageType); + + byte[] imageBytes = Base64.getDecoder().decode(base64Data); + String fileName; + if (!StringUtil.isNullOrEmpty(path)){ + fileName = path + "." + imageType; // or any other image format + }else { + fileName = UUID.randomUUID() + "." + imageType; + } + + try (InputStream in = new ByteArrayInputStream(imageBytes)) { + minioClient.putObject(PutObjectArgs.builder() + .bucket(bucketName) + .object(fileName) + .stream(in, in.available(), -1) + .contentType("image/" + imageType) // Set the content type according to your image format + .build() + ); + + return bucketName + "/" + fileName; + } catch (Exception e) { + log.error(e.getMessage()); + return null; // or throw an exception + } } } diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java index 0716bf86..d5a0e94e 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java @@ -26,7 +26,7 @@ public class DesignSingleItemDTO implements Serializable { private String designType; @NotBlank(message = "type.cannot.be.empty") - @ApiModelProperty("生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring") + @ApiModelProperty("生成item实际对应的类型 有:Outwear,Dress,Blouse,Skirt,Trousers Shoes Hairstyle Earring") private String type; @ApiModelProperty("对应的图片的minIO路径") @@ -53,4 +53,7 @@ public class DesignSingleItemDTO implements Serializable { @ApiModelProperty("渐变 颜色") private Gradient gradient; + @ApiModelProperty("画笔修改过的sketch图片的base64格式的数据") + private String sketchString; + } diff --git a/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java b/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java index 69b37038..58734272 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java @@ -19,7 +19,7 @@ public class GenerateLikeDTO { @ApiModelProperty("一级类型 Sketchboard Printboard") private String level1Type; - @ApiModelProperty("当一级类型为Sketchboard时,二级类型 Outwear Dress Blouse Skirt Trousers") + @ApiModelProperty("当一级类型为Sketchboard时,二级类型 Outwear Dress Blouse Skirt Trousers;当一级类型为Printboard时,二级类型 Slogan Logo Pattern") private String level2Type; @ApiModelProperty("性别") diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 3610c7c2..f68a9d51 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2626,7 +2626,7 @@ public class PythonService { if (StringUtil.isNullOrEmpty(colorImg)){ throw new BusinessException("The base64 data of the image is empty"); } - minioPath = minioUtil.base64Upload(colorImg, gradientBucketName); + minioPath = minioUtil.base64UploadToPath(colorImg, gradientBucketName,null); designSingleItem.getGradient().setColorImg(null); gradientString = JSONObject.toJSONString(designSingleItem.getGradient()); diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index afb5d07e..d2349f5e 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -29,6 +29,7 @@ import com.google.common.collect.Lists; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.SerializationUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -81,6 +82,9 @@ public class DesignItemServiceImpl extends ServiceImpl { + // 渐变色 if (!Objects.isNull(i.getGradient()) && !StringUtil.isNullOrEmpty(i.getGradient().getColorImg())){ + log.info("set gradient colorImage为空,便于日志打印"); i.getGradient().setColorImg(null); } + // 画笔修改过的sketch + if (!StringUtil.isNullOrEmpty(i.getSketchString())){ + log.info("set sketchString为空,便于日志打印"); + i.setSketchString(null); + } }); log.info("designSingle request入参 ==> " + JSONObject.toJSONString(clone)); @@ -470,6 +481,11 @@ public class DesignItemServiceImpl extends ServiceImpl { + // 如果sketch截图不为空,则将该截图上传,并替换path + if (!StringUtil.isNullOrEmpty(item.getSketchString())){ + if (StringUtil.isNullOrEmpty(item.getPath())){ + throw new BusinessException("path.cannot.be.empty"); + } + String sourcePath = item.getPath(); + String path = sourcePath.substring(sourcePath.indexOf("/") + 1, sourcePath.lastIndexOf(".")); + // 将原图地址作为修改后的图片地址,放在不同的桶 + String newPath = minioUtil.base64UploadToPath(item.getSketchString(), modifiedSketchBucket, path); + if (StringUtil.isNullOrEmpty(newPath)){ + log.error("修改过的sketch图片上传失败"); + throw new BusinessException("image.modify.failed"); + } + item.setPath(newPath); + } + }); + } + @Override @Transactional(rollbackFor = Exception.class) public ComposeLayersVO editLayersPositionAndScale(EditLayersPositionAndScaleVO positionAndScaleVO) throws IOException { diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index b2ea358f..ac3becbc 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -134,6 +134,7 @@ priority.cannot.be.repeated=priority cannot be repeated. model.not.found=model not found. libraryIdList.cannot.be.empty=libraryIdList cannot be empty. the.value.range.of.seed=The value range of seed is 0-99999 +image.modify.failed=Image modification failed, please try again later. # 可能会报异常 # Informative: From 3a29d25060f07b4b541f3ba2f9b29b0c7ddf0e37 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Wed, 12 Jun 2024 09:47:55 +0800 Subject: [PATCH 08/79] TASK:aida; --- .../da/common/RabbitMQ/GenerateConsumer.java | 56 ++++ .../com/ai/da/common/RabbitMQ/MQConfig.java | 1 + .../ai/da/common/config/MyTaskScheduler.java | 81 ++++- .../com/ai/da/common/utils/SendEmailUtil.java | 11 +- .../ai/da/controller/AccountController.java | 6 + .../ai/da/controller/PortfolioController.java | 19 +- .../controller/SavedCollectionController.java | 55 +++- .../ai/da/mapper/primary/CanvasMapper.java | 7 + .../da/mapper/primary/ExportFileMapper.java | 7 + .../primary/ToProductElementMapper.java | 8 + .../primary/ToProductImageRecordMapper.java | 7 + .../primary/ToProductImageResultMapper.java | 7 + .../ai/da/mapper/primary/entity/Canvas.java | 42 +++ .../primary/entity/CanvasElementUpload.java | 9 + .../da/mapper/primary/entity/ExportFile.java | 24 ++ .../da/mapper/primary/entity/Portfolio.java | 6 + .../primary/entity/ToProductElement.java | 27 ++ .../primary/entity/ToProductImageRecord.java | 27 ++ .../primary/entity/ToProductImageResult.java | 42 +++ .../dto/AccountDesignWorksRegisterDTO.java | 8 + .../da/model/dto/DesignWorksRegisterDTO.java | 10 + .../com/ai/da/model/dto/ExportSaveDTO.java | 8 + .../com/ai/da/model/dto/ExportSearchDTO.java | 8 + .../com/ai/da/model/dto/PortfolioDTO.java | 4 +- .../ai/da/model/dto/ProductImageLikeDTO.java | 10 + .../ai/da/model/dto/ToProductImageDTO.java | 13 + .../ai/da/model/enums/DesignElementsEnum.java | 8 +- .../model/enums/PrintboardLevel2TypeEnum.java | 10 +- .../java/com/ai/da/model/vo/PortfolioVO.java | 2 +- .../ai/da/model/vo/ToProductElementVO.java | 8 + .../com/ai/da/model/vo/ToProductImageVO.java | 9 + .../java/com/ai/da/model/vo/ToProductVO.java | 8 + .../java/com/ai/da/python/PythonService.java | 47 ++- .../com/ai/da/service/AccountService.java | 2 + .../com/ai/da/service/GenerateService.java | 3 +- .../com/ai/da/service/PortfolioService.java | 6 +- .../ai/da/service/UserLikeGroupService.java | 28 +- .../impl/AccountLoginLogServiceImpl.java | 2 +- .../da/service/impl/AccountServiceImpl.java | 35 ++- .../impl/ClassificationServiceImpl.java | 22 +- .../impl/CollectionElementServiceImpl.java | 6 +- .../service/impl/CollectionServiceImpl.java | 2 +- .../ai/da/service/impl/DesignServiceImpl.java | 3 +- .../da/service/impl/GenerateServiceImpl.java | 32 +- .../da/service/impl/PortfolioServiceImpl.java | 289 ++++++++++-------- .../da/service/impl/SysFileServiceImpl.java | 2 +- .../impl/UserLikeGroupServiceImpl.java | 240 ++++++++++++++- src/main/resources/application-dev.properties | 7 +- .../resources/application-prod.properties | 1 + src/main/resources/messages_en.properties | 16 +- src/main/resources/messages_zh.properties | 16 +- 51 files changed, 1114 insertions(+), 193 deletions(-) create mode 100644 src/main/java/com/ai/da/mapper/primary/CanvasMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/ExportFileMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/ToProductElementMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/ToProductImageRecordMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/ToProductImageResultMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/Canvas.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/CanvasElementUpload.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/ExportFile.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/ToProductElement.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/ToProductImageRecord.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java create mode 100644 src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/DesignWorksRegisterDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/ExportSaveDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/ExportSearchDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/ProductImageLikeDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/ToProductImageDTO.java create mode 100644 src/main/java/com/ai/da/model/vo/ToProductElementVO.java create mode 100644 src/main/java/com/ai/da/model/vo/ToProductImageVO.java create mode 100644 src/main/java/com/ai/da/model/vo/ToProductVO.java diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 876dfd2c..36540104 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -44,6 +44,8 @@ public class GenerateConsumer { @Value("${redis.key.generateResult}") private String generateResultKey; + @Value("${redis.key.toProductImageResultKey}") + private String toProductImageResultKey; public void generate(Message msg, Channel channel, String consumerName) { log.info("============start listening=========="); @@ -154,6 +156,54 @@ public class GenerateConsumer { } + public void processToProductImageResult(Message msg, Channel channel) { + log.info("============processToProductImageResult listening=========="); + long start = System.currentTimeMillis(); + + Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("toProductImage response : {}", generateResult); + + try { + log.info("tasks_id : {} start ", generateResult.get("tasks_id")); + if (generateResult.get("status").equals("SUCCESS")) { + String url = generateResult.get("image_url"); + String taskId = generateResult.get("tasks_id"); + String category = generateResult.get("category"); + generateService.processToProductImageResult(taskId, url, category); + } else { + // 修改redis中的数据状态为exception + String key = toProductImageResultKey + ":" + generateResult.get("tasks_id"); + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data")); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + } catch (Exception e) { + log.error(e.getMessage()); + try { + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id")); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + // 将入参和错误信息存入数据库 + String exceptionMessage = JSONObject.toJSONString(generateResult) + + " Exception message : " + e.getMessage(); + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + + long end = System.currentTimeMillis(); + log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); + log.info("============ProcessGenerateResult End listening=========="); + + } + // @RabbitListener(queues = MQConfig.GENERATE_QUEUE) // @RabbitHandler // public void generateConsumer1(Message msg, Channel channel) { @@ -213,4 +263,10 @@ public class GenerateConsumer { // public void getGenerateResult(Message msg, Channel channel) { // processGenerateResult(msg, channel); // } + + @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) + @RabbitHandler + public void getToProductImageResult(Message msg, Channel channel) { + processToProductImageResult(msg, channel); + } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 637fc94e..6d9e54ae 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -23,6 +23,7 @@ public class MQConfig { // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod"; + public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; public MQConfig() { } diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index bd8f2687..06294584 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -1,11 +1,11 @@ package com.ai.da.common.config; +import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.SendEmailUtil; -import com.ai.da.mapper.primary.AccountMapper; -import com.ai.da.mapper.primary.TrialOrderMapper; -import com.ai.da.mapper.primary.entity.Account; -import com.ai.da.mapper.primary.entity.TrialOrder; +import com.ai.da.mapper.primary.*; +import com.ai.da.mapper.primary.entity.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -22,10 +22,16 @@ import java.nio.file.Paths; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.stream.Collectors; @Component public class MyTaskScheduler { + @PostConstruct + public void test() { +// clearMinio(); + } + @Resource private AccountMapper accountMapper; @@ -71,7 +77,7 @@ public class MyTaskScheduler { // @Scheduled(cron = "0 0 8 * * ?") public void sendTrialOrderExcelToManagements() { // 获取前一天日期 - LocalDate yesterday = LocalDate.now().minusDays(1); + LocalDate yesterday = LocalDate.now().minusDays(3); // 查询前一天的试用订单 QueryWrapper qw = new QueryWrapper<>(); @@ -134,4 +140,69 @@ public class MyTaskScheduler { SendEmailUtil.sendNoExcelEmail("kimwong@code-create.com.hk", null); } } + + @Resource + private UserLikeGroupMapper userLikeGroupMapper; + @Resource + private UserLikeMapper userLikeMapper; + @Resource + private TDesignPythonOutfitMapper designPythonOutfitMapper; + @Resource + private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper; + @Resource + private DesignItemMapper designItemMapper; + @Resource + private DesignItemDetailMapper designItemDetailMapper; + @Resource + private MinioUtil minioUtil; + public void clearMinio() { + // 获取当前所有history + QueryWrapper userLikeGroupQueryWrapper = new QueryWrapper<>(); + List userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper); + List userLikeGroupIdList = userLikeGroupList.stream().map(UserLikeGroup::getId).collect(Collectors.toList()); + QueryWrapper userLikeQueryWrapper = new QueryWrapper<>(); + userLikeQueryWrapper.lambda().in(UserLike::getUserLikeGroupId, userLikeGroupIdList); + // 所有喜欢的图片 + List userLikes = userLikeMapper.selectList(userLikeQueryWrapper); + List designOutfitIdList = userLikes.stream().map(UserLike::getDesignOutfitId).collect(Collectors.toList()); + QueryWrapper designPythonOutfitQueryWrapper = new QueryWrapper<>(); + designPythonOutfitQueryWrapper.lambda().notIn(TDesignPythonOutfit::getId, designOutfitIdList); + List tDesignPythonOutfits = designPythonOutfitMapper.selectList(designPythonOutfitQueryWrapper); +// int i = 0; +// for (TDesignPythonOutfit tDesignPythonOutfit : tDesignPythonOutfits) { +// String designUrl = tDesignPythonOutfit.getDesignUrl(); +// if (StringUtils.isNotBlank(designUrl)) { +// minioUtil.deleteObject(designUrl); +// i ++; +// } +// QueryWrapper designPythonOutfitDetailQueryWrapper = new QueryWrapper<>(); +// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId()); +// List tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper); +// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { +// if (!tDesignPythonOutfitDetail.getImageCategory().equals("body")) { +// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getImageUrl())) { +// minioUtil.deleteObject(tDesignPythonOutfitDetail.getImageUrl()); +// i ++; +// } +// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getMaskUrl())) { +// minioUtil.deleteObject(tDesignPythonOutfitDetail.getMaskUrl()); +// i ++; +// } +// } +// } +// } + System.out.println("i"); +// List designItemIdList = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList()); +// QueryWrapper designItemQueryWrapper = new QueryWrapper<>(); +// designItemQueryWrapper.lambda().in(DesignItem::getId,designItemIdList); +// List designItems = designItemMapper.selectList(designItemQueryWrapper); +// for (DesignItem designItem : designItems) { +// QueryWrapper designItemDetailQueryWrapper = new QueryWrapper<>(); +// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId()); +// List designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper); +// for (DesignItemDetail designItemDetail : designItemDetails) { +// +// } +// } + } } diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index d72e41c6..f8f08e9f 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -136,7 +136,7 @@ public class SendEmailUtil { private final static Long TRIAL_ORDER_LIST_ID = 122273L; private final static Long NO_TRIAL_ORDER_LIST_ID = 122591L; - public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country) { + public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country, boolean link) { try { // 实例化一个认证对象 Credential cred = new Credential(SECRET_ID, SECRET_KEy); @@ -173,7 +173,7 @@ public class SendEmailUtil { }else { template.setTemplateID(NOTIFICATION_TEMPLATE_ID); } - template.setTemplateData(buildNotificationData(trialOrder)); + template.setTemplateData(buildNotificationData(trialOrder, link)); break; default: break; @@ -345,7 +345,7 @@ public class SendEmailUtil { } // 构建试用订单通过通知数据 - private static String buildNotificationData(TrialOrder trialOrder) { + private static String buildNotificationData(TrialOrder trialOrder, boolean link) { JSONObject jsonObject = new JSONObject(); // 设置试用订单通过通知相关数据 jsonObject.put("title", trialOrder.getTitle()); @@ -353,6 +353,11 @@ public class SendEmailUtil { jsonObject.put("givenName", trialOrder.getGivenName()); jsonObject.put("userName", trialOrder.getUserName()); jsonObject.put("email", trialOrder.getEmail()); + if (link) { + jsonObject.put("days", 14); + }else { + jsonObject.put("days", 5); + } return jsonObject.toJSONString(); } diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index ce1cd82f..58a58a29 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -153,4 +153,10 @@ public class AccountController { accountService.upgradeNotification(); return Response.success(true); } + + @ApiOperation(value = "广场用户注册") + @PostMapping("/designWorksRegister") + public Response designWorksRegister(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { + return Response.success(accountService.designWorksRegister(accountDesignWorksRegisterDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java index 32337e46..b8bd3193 100644 --- a/src/main/java/com/ai/da/controller/PortfolioController.java +++ b/src/main/java/com/ai/da/controller/PortfolioController.java @@ -2,6 +2,7 @@ package com.ai.da.controller; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; +import com.ai.da.model.dto.DesignWorksRegisterDTO; import com.ai.da.model.dto.PortfolioDTO; import com.ai.da.model.dto.QueryPortfolioPageDTO; import com.ai.da.model.vo.PortfolioVO; @@ -10,10 +11,8 @@ import com.ai.da.service.PortfolioService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; @@ -29,16 +28,18 @@ public class PortfolioController { @ApiOperation(value = "发布作品集") @PostMapping("/publish") - public Response preLogin(@Valid @RequestBody PortfolioDTO portfolioDTO) { - return Response.success(portfolioService.publish(portfolioDTO)); + public Response preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) { + return Response.success(portfolioService.publish(canvas, data)); } + @CrossOrigin @ApiOperation(value = "作品集page") @PostMapping("/page") public Response> page(@Valid @RequestBody QueryPortfolioPageDTO query) { return Response.success(portfolioService.page(query)); } + @CrossOrigin @ApiOperation(value = "作品详情") @PostMapping("/detail") public Response detail(@Valid @RequestBody PortfolioDTO portfolioDTO) { @@ -56,4 +57,10 @@ public class PortfolioController { public Response update(@Valid @RequestBody PortfolioDTO portfolioDTO) { return Response.success(portfolioService.update(portfolioDTO)); } + + @ApiOperation(value = "广场用户注册") + @PostMapping("/designWorksRegister") + public Response designWorksRegister(@Valid @RequestBody DesignWorksRegisterDTO designWorksRegisterDTO) { + return Response.success(portfolioService.designWorksRegister(designWorksRegisterDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index f1672d97..5ce6303f 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -8,13 +8,11 @@ import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; -import com.ai.da.mapper.primary.entity.Account; -import com.ai.da.mapper.primary.entity.Library; -import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; -import com.ai.da.mapper.primary.entity.UserLikeGroup; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.service.*; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -26,6 +24,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; @@ -159,4 +158,52 @@ public class SavedCollectionController { return Response.success(userLikeGroupService.choose(userGroupId)); } + @ApiOperation(value = "exportSave") + @PostMapping("/exportSave") + public Response exportSave(@RequestParam("file") MultipartFile file, @RequestParam("userLikeGroupId") Long userLikeGroupId) { + return Response.success(userLikeGroupService.exportSave(file, userLikeGroupId)); + } + + @ApiOperation(value = "exportSearch") + @PostMapping("/exportSearch") + public Response exportSearch(@Valid @RequestBody ExportSearchDTO exportSearchDTO) { + return Response.success(userLikeGroupService.exportSearch(exportSearchDTO.getUserLikeGroupId())); + } + + @ApiOperation(value = "toProduct") + @PostMapping("/toProduct") + public Response> toProduct(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { + return Response.success(userLikeGroupService.toProduct(toProductImageDTO)); + } + + @ApiOperation(value = "toProductImageElementUpload") + @PostMapping("/toProductImageElementUpload") + public Response toProductImageElementUpload(@RequestParam("file") MultipartFile file, @RequestParam(value = "userlikeGroupId") Long userLikeGroupId) { + return Response.success(userLikeGroupService.toProductImageElementUpload(file, userLikeGroupId)); + } + + @ApiOperation(value = "productImageLike") + @PostMapping("/productImageLike") + public Response productImageLike(@Valid @RequestBody ProductImageLikeDTO productImageLikeDTO) { + return Response.success(userLikeGroupService.productImageLike(productImageLikeDTO)); + } + + @ApiOperation(value = "获取生成结果") + @PostMapping("/toProductImageResult") + public Response> getToProductImageResult(@Valid @RequestBody List taskIdList) { + List generateResult = userLikeGroupService.getToProductImageResultList(taskIdList); + return Response.success(generateResult); + } + + @ApiOperation(value = "画布用户上传元素") + @PostMapping("/canvasElementUpload") + public Response canvasElementUpload(@RequestParam("file") MultipartFile file) { + return Response.success(userLikeGroupService.canvasElementUpload(file)); + } + + @ApiOperation("productImageLikeList") + @PostMapping("/productImageLikeList") + public Response> productImageLikeList(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { + return Response.success(userLikeGroupService.productImageLikeList(toProductImageDTO)); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/CanvasMapper.java b/src/main/java/com/ai/da/mapper/primary/CanvasMapper.java new file mode 100644 index 00000000..0007c423 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CanvasMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Canvas; + +public interface CanvasMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/ExportFileMapper.java b/src/main/java/com/ai/da/mapper/primary/ExportFileMapper.java new file mode 100644 index 00000000..93f07046 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ExportFileMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.ExportFile; + +public interface ExportFileMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/ToProductElementMapper.java b/src/main/java/com/ai/da/mapper/primary/ToProductElementMapper.java new file mode 100644 index 00000000..7bd236f5 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ToProductElementMapper.java @@ -0,0 +1,8 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.ToProductElement; + +public interface ToProductElementMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/primary/ToProductImageRecordMapper.java b/src/main/java/com/ai/da/mapper/primary/ToProductImageRecordMapper.java new file mode 100644 index 00000000..2d97878c --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ToProductImageRecordMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.ToProductImageRecord; + +public interface ToProductImageRecordMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/ToProductImageResultMapper.java b/src/main/java/com/ai/da/mapper/primary/ToProductImageResultMapper.java new file mode 100644 index 00000000..74163ae4 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ToProductImageResultMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.ToProductImageResult; + +public interface ToProductImageResultMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Canvas.java b/src/main/java/com/ai/da/mapper/primary/entity/Canvas.java new file mode 100644 index 00000000..d33d7e6f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Canvas.java @@ -0,0 +1,42 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("canvas") +public class Canvas implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("url") + private String url; + + @ApiModelProperty("accountId") + private Long accountId; + + @ApiModelProperty("createTime") + private LocalDateTime createTime; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CanvasElementUpload.java b/src/main/java/com/ai/da/mapper/primary/entity/CanvasElementUpload.java new file mode 100644 index 00000000..8311833a --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CanvasElementUpload.java @@ -0,0 +1,9 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +@Data +public class CanvasElementUpload { + private String url; + private String minioUrl; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ExportFile.java b/src/main/java/com/ai/da/mapper/primary/entity/ExportFile.java new file mode 100644 index 00000000..c62706b2 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ExportFile.java @@ -0,0 +1,24 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("export_file") +public class ExportFile implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String url; + private Long userLikeGroupId; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java index 3c1831ca..8f15354a 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java @@ -35,12 +35,18 @@ public class Portfolio implements Serializable { @ApiModelProperty(value = "作品类型") private String portfolioType; + @ApiModelProperty(value = "画布ID") + private Long canvasId; + @ApiModelProperty(value = "封面ID") private Long coverId; @ApiModelProperty(value = "作品状态1公开0隐藏") private Integer status; + @ApiModelProperty(value = "是否允许二次创作1允许0不允许") + private Integer openSource; + @ApiModelProperty(value = "作品集作者ID") private Long accountId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ToProductElement.java b/src/main/java/com/ai/da/mapper/primary/entity/ToProductElement.java new file mode 100644 index 00000000..d725806f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductElement.java @@ -0,0 +1,27 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class ToProductElement implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "userLikeGroupId") + private Long userLikeGroupId; + + @ApiModelProperty(value = "url") + private String url; + + @ApiModelProperty(value = "createTime") + private LocalDateTime createTime; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageRecord.java b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageRecord.java new file mode 100644 index 00000000..252f5065 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageRecord.java @@ -0,0 +1,27 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class ToProductImageRecord implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "userLikeGroupId") + private Long userLikeGroupId; + + @ApiModelProperty(value = "prompt") + private String prompt; + + @ApiModelProperty(value = "createTime") + private LocalDateTime createTime; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java new file mode 100644 index 00000000..f81f255b --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java @@ -0,0 +1,42 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class ToProductImageResult implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "elementId") + private Long elementId; + + @ApiModelProperty(value = "elementType") + private String elementType; + + @ApiModelProperty(value = "url") + private String url; + + @ApiModelProperty(value = "isLike 1是0否") + private Integer isLike; + + @ApiModelProperty(value = "createTime") + private LocalDateTime createTime; + + @ApiModelProperty(value = "toProductImageRecordId") + private Long toProductImageRecordId; + + @ApiModelProperty(value = "taskId") + private String taskId; + + @ApiModelProperty(value = "userLikeGroupId") + private Long userLikeGroupId; +} diff --git a/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java b/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java new file mode 100644 index 00000000..ab99249e --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.dto; + +import com.ai.da.mapper.primary.entity.Account; +import lombok.Data; + +@Data +public class AccountDesignWorksRegisterDTO extends Account { +} diff --git a/src/main/java/com/ai/da/model/dto/DesignWorksRegisterDTO.java b/src/main/java/com/ai/da/model/dto/DesignWorksRegisterDTO.java new file mode 100644 index 00000000..775ec850 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignWorksRegisterDTO.java @@ -0,0 +1,10 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class DesignWorksRegisterDTO { + private String userName; + private String email; + private String password; +} diff --git a/src/main/java/com/ai/da/model/dto/ExportSaveDTO.java b/src/main/java/com/ai/da/model/dto/ExportSaveDTO.java new file mode 100644 index 00000000..25c2fe8f --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ExportSaveDTO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class ExportSaveDTO { + private String data; +} diff --git a/src/main/java/com/ai/da/model/dto/ExportSearchDTO.java b/src/main/java/com/ai/da/model/dto/ExportSearchDTO.java new file mode 100644 index 00000000..f7f5ccda --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ExportSearchDTO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class ExportSearchDTO { + private Long userLikeGroupId; +} diff --git a/src/main/java/com/ai/da/model/dto/PortfolioDTO.java b/src/main/java/com/ai/da/model/dto/PortfolioDTO.java index 90f39bb0..add1d0c9 100644 --- a/src/main/java/com/ai/da/model/dto/PortfolioDTO.java +++ b/src/main/java/com/ai/da/model/dto/PortfolioDTO.java @@ -2,9 +2,11 @@ package com.ai.da.model.dto; import com.ai.da.mapper.primary.entity.Portfolio; import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; @Data public class PortfolioDTO extends Portfolio { private Long userLikeGroupId; - } diff --git a/src/main/java/com/ai/da/model/dto/ProductImageLikeDTO.java b/src/main/java/com/ai/da/model/dto/ProductImageLikeDTO.java new file mode 100644 index 00000000..4b4c8302 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ProductImageLikeDTO.java @@ -0,0 +1,10 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class ProductImageLikeDTO { + private List toProductImageResultId; +} diff --git a/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java new file mode 100644 index 00000000..25af4ec5 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java @@ -0,0 +1,13 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.ToProductImageVO; +import lombok.Data; + +import java.util.List; + +@Data +public class ToProductImageDTO { + private Long userLikeGroupId; + private List toProductImageVOList; + private String prompt; +} diff --git a/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java b/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java index ac58a75f..5b2547a5 100644 --- a/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java +++ b/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java @@ -2,7 +2,7 @@ package com.ai.da.model.enums; import com.fasterxml.jackson.annotation.JsonValue; -public enum DesignElementsEnum { +public enum DesignElementsEnum implements IEnumDisplay { EMBROIDERY("刺绣", "Embroidery"), BEADING("钉珠", "Beading"), PEARL("珍珠", "Pearl"), @@ -16,6 +16,12 @@ public enum DesignElementsEnum { private final String chinese; private final String english; + @Override + @JsonValue + public String getValue() { + return this.english; + } + // 构造函数 DesignElementsEnum(String chinese, String english) { this.chinese = chinese; diff --git a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java index 3dded896..338a1f0b 100644 --- a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java +++ b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java @@ -1,6 +1,8 @@ package com.ai.da.model.enums; -public enum PrintboardLevel2TypeEnum { +import com.fasterxml.jackson.annotation.JsonValue; + +public enum PrintboardLevel2TypeEnum implements IEnumDisplay { SLOGAN("标语", "Slogan"), LOGO("标志", "Logo"), PATTERN("图案", "Pattern"); @@ -14,6 +16,12 @@ public enum PrintboardLevel2TypeEnum { this.english = english; } + @Override + @JsonValue + public String getValue() { + return this.english; + } + // 获取中文描述 public String getChinese() { return chinese; diff --git a/src/main/java/com/ai/da/model/vo/PortfolioVO.java b/src/main/java/com/ai/da/model/vo/PortfolioVO.java index b313cc9a..96ed1d94 100644 --- a/src/main/java/com/ai/da/model/vo/PortfolioVO.java +++ b/src/main/java/com/ai/da/model/vo/PortfolioVO.java @@ -9,7 +9,7 @@ import java.util.List; @Data public class PortfolioVO extends Portfolio { - private String designPythonOutfitUrl; + private String canvasUrl; private List collectionElementList; private List designPythonOutfitList; diff --git a/src/main/java/com/ai/da/model/vo/ToProductElementVO.java b/src/main/java/com/ai/da/model/vo/ToProductElementVO.java new file mode 100644 index 00000000..7afd79a8 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ToProductElementVO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.ToProductElement; +import lombok.Data; + +@Data +public class ToProductElementVO extends ToProductElement { +} diff --git a/src/main/java/com/ai/da/model/vo/ToProductImageVO.java b/src/main/java/com/ai/da/model/vo/ToProductImageVO.java new file mode 100644 index 00000000..57b607be --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ToProductImageVO.java @@ -0,0 +1,9 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.ToProductImageResult; +import lombok.Data; + +@Data +public class ToProductImageVO extends ToProductImageResult { + +} diff --git a/src/main/java/com/ai/da/model/vo/ToProductVO.java b/src/main/java/com/ai/da/model/vo/ToProductVO.java new file mode 100644 index 00000000..d44ec250 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ToProductVO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.UserLike; +import lombok.Data; + +@Data +public class ToProductVO extends UserLike { +} diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 9e9d82b0..dc38079f 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -8,10 +8,7 @@ import com.ai.da.common.enums.*; import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.CollocationMapper; import com.ai.da.mapper.primary.DressingMapper; -import com.ai.da.mapper.primary.entity.CollectionElement; -import com.ai.da.mapper.primary.entity.Collocation; -import com.ai.da.mapper.primary.entity.DesignHistory; -import com.ai.da.mapper.primary.entity.Dressing; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.mapper.secondary.AttributeRetrievalMapper; import com.ai.da.mapper.secondary.entity.AttributeRetrieval; import com.ai.da.mapper.secondary.entity.AttributeRecognitionJSON; @@ -165,7 +162,7 @@ public class PythonService { * @param operateType * @return */ - @Transactional + @Transactional(rollbackFor = Exception.class) public String upload(MultipartFile file, String operateType) { //用户信息 PythonToJavaApiOperationTypeEnum operationType = PythonToJavaApiOperationTypeEnum.uploadOf(operateType); @@ -3254,4 +3251,44 @@ public class PythonService { return text; } + public Boolean toProductImage(String url, String taskId, String prompt) { + // todo 限流校验 +// AccessLimitUtils.validate("design",5); + 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"); + //关闭FastJson的引用检测 防止出现$ref 现象 + Map map = new HashMap<>(); + map.put("tasks_id", taskId); + map.put("image_url", url); + map.put("prompt", prompt); + log.info("toProductImage请求python 参数:####{}", map); + String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() +// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") + .url(accessPythonIp + ":9996/api/generate_product_image") + .method("POST", body) + .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response; + String responseBody; + try { + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##toProductImage异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("toProductImage.interface.exception"); + } + if (response.isSuccessful()) { + return Boolean.TRUE; + } + log.error("PythonService##toProductImage异常response###{}", response); + //生成失败 + throw new BusinessException("toProductImage.interface.exception"); + } } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 6d42900b..ac30940a 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -130,4 +130,6 @@ public interface AccountService extends IService { void moveLibraryDate(); void updateCredits(Long accountId, String value); + + Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); } diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index a3f6ed7d..89fd6267 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -17,6 +17,8 @@ public interface GenerateService extends IService { void processGenerateResult(String taskId, String url, String category); + void processToProductImageResult(String taskId, String url, String category); + GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO); Boolean generateDislike(Long generateDetailId, String timeZone); @@ -34,5 +36,4 @@ public interface GenerateService extends IService { Long getRankPosition(String uniqueId); void cancelGenerate(Long userId, List uniqueId, String timeZone); - } diff --git a/src/main/java/com/ai/da/service/PortfolioService.java b/src/main/java/com/ai/da/service/PortfolioService.java index 683f8c09..582406c2 100644 --- a/src/main/java/com/ai/da/service/PortfolioService.java +++ b/src/main/java/com/ai/da/service/PortfolioService.java @@ -2,14 +2,16 @@ package com.ai.da.service; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.mapper.primary.entity.Portfolio; +import com.ai.da.model.dto.DesignWorksRegisterDTO; import com.ai.da.model.dto.PortfolioDTO; import com.ai.da.model.dto.QueryPortfolioPageDTO; import com.ai.da.model.vo.PortfolioVO; import com.ai.da.model.vo.UserLikeChooseVO; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; public interface PortfolioService extends IService { - Boolean publish(PortfolioDTO portfolioDTO); + Boolean publish(MultipartFile canvas, String data); PortfolioVO update(PortfolioDTO portfolioDTO); @@ -18,4 +20,6 @@ public interface PortfolioService extends IService { PortfolioVO detail(PortfolioDTO portfolioDTO); UserLikeChooseVO choose(PortfolioDTO portfolioDTO); + + Boolean designWorksRegister(DesignWorksRegisterDTO designWorksRegisterDTO); } diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index dd4d7c86..a8316142 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -1,9 +1,17 @@ package com.ai.da.service; +import com.ai.da.mapper.primary.entity.CanvasElementUpload; +import com.ai.da.mapper.primary.entity.ToProductImageResult; import com.ai.da.mapper.primary.entity.UserLikeGroup; -import com.ai.da.model.vo.HistoryUpdateVO; -import com.ai.da.model.vo.UserLikeChooseVO; +import com.ai.da.model.dto.ExportSaveDTO; +import com.ai.da.model.dto.ProductImageLikeDTO; +import com.ai.da.model.dto.ToProductImageDTO; +import com.ai.da.model.vo.*; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; /** * 服务类 @@ -30,4 +38,20 @@ public interface UserLikeGroupService extends IService { void deleteTrialData(Long id); void updateDate(Long id,String timeZone); + + Boolean exportSave(MultipartFile file, Long userLikeGroupId); + + List toProduct(ToProductImageDTO toProductImageDTO); + + ToProductElementVO toProductImageElementUpload(MultipartFile file, Long userLikeGroupId); + + Boolean productImageLike(ProductImageLikeDTO productImageLikeDTO); + + List getToProductImageResultList(List taskIdList); + + JSONObject exportSearch(Long userLikeGroupId); + + CanvasElementUpload canvasElementUpload(MultipartFile file); + + List productImageLikeList(ToProductImageDTO toProductImageDTO); } diff --git a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java index e5c24f73..fb09cc10 100644 --- a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java @@ -29,7 +29,7 @@ public class AccountLoginLogServiceImpl extends ServiceImpl impl @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO) { log.info("aida预先登入accountDTO###{}", JSON.toJSONString(accountDTO)); Account account = getOneByEmail(accountDTO.getEmail()); @@ -127,7 +127,7 @@ public class AccountServiceImpl extends ServiceImpl impl return new AccountPreLoginVO(account.getId()); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public AccountLoginVO login(AccountLoginDTO accountLoginDTO, HttpServletRequest request) { // Assert.isTrue(StringUtils.isNotBlank(accountLoginDTO.getEmail()), "Please input a email !"); @@ -251,7 +251,7 @@ public class AccountServiceImpl extends ServiceImpl impl return Boolean.TRUE; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public Boolean forgetPwd(AccountRegisterDTO accountDTO) { // Account emailAccount = getOneByEmail(accountDTO.getEmail()); @@ -469,6 +469,10 @@ public class AccountServiceImpl extends ServiceImpl impl public Boolean addTrialUser(AccountTrialDTO accountTrialDTO, HttpServletRequest request) { // 获取用户申请试用IP String ipAddress = RequestInfoUtil.getIpAddress(request); + boolean link = false; + if (StringUtils.isNotBlank(accountTrialDTO.getRef())) { + link = true; + } // 先检测试用订单 QueryWrapper trialOrderQueryWrapper = new QueryWrapper<>(); trialOrderQueryWrapper.eq("BINARY email", accountTrialDTO.getEmail()); @@ -516,7 +520,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setIsTrial(1); account.setIsBeginner(1); account.setValidStartTime(System.currentTimeMillis()); - if (StringUtils.isNotBlank(accountTrialDTO.getRef())) { + if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); }else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); @@ -528,7 +532,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setUserEmail(trialOrder.getEmail()); account.setLanguage(Language.ENGLISH.name()); account.setValidStartTime(System.currentTimeMillis()); - if (StringUtils.isNotBlank(accountTrialDTO.getRef())) { + if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); }else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); @@ -543,9 +547,9 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2); // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); if (trialOrder.getCountry().equals("China")) { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); }else { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); } } return Boolean.TRUE; @@ -595,9 +599,9 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2, trialOrder.getCountry()); // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2, trialOrder.getCountry()); if (trialOrder.getCountry().equals("China")) { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); }else { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); } } return Boolean.TRUE; @@ -934,4 +938,17 @@ public class AccountServiceImpl extends ServiceImpl impl account.setCredits(new BigDecimal(value)); accountMapper.updateById(account); } + + @Override + public Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("BINARY user_email", accountDesignWorksRegisterDTO.getUserEmail()); + List accountList = accountMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(accountList)) { + throw new BusinessException("The email has already been registered"); + } + Account account = CopyUtil.copyObject(accountDesignWorksRegisterDTO, Account.class); + accountMapper.insert(account); + return null; + } } diff --git a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java index 940725c5..bd799fd7 100644 --- a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java @@ -109,17 +109,17 @@ public class ClassificationServiceImpl implements ClassificationService { if (CollectionUtil.isNotEmpty(classificationList)) { // 获取结果集 List classificationVOList = getClassificationVOList(classificationList); - if (classificationDTO.getType().equals("DesignElements")) { - for (ClassificationVO classificationVO : classificationVOList) { - String classificationName = classificationVO.getClassificationName(); - DesignElementsEnum designElementsEnum = DesignElementsEnum.fromName(classificationName); - if (userHolder.getLanguage().equals(Language.ENGLISH.name())) { - classificationVO.setClassificationName(designElementsEnum.getEnglish()); - }else { - classificationVO.setClassificationName(designElementsEnum.getChinese()); - } - } - } +// if (classificationDTO.getType().equals("DesignElements")) { +// for (ClassificationVO classificationVO : classificationVOList) { +// String classificationName = classificationVO.getClassificationName(); +// DesignElementsEnum designElementsEnum = DesignElementsEnum.fromName(classificationName); +// if (userHolder.getLanguage().equals(Language.ENGLISH.name())) { +// classificationVO.setClassificationName(designElementsEnum.getEnglish()); +// }else { +// classificationVO.setClassificationName(designElementsEnum.getChinese()); +// } +// } +// } return classificationVOList; } return new ArrayList<>(); diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 3f873a9b..8bced01d 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -80,7 +80,7 @@ public class CollectionElementServiceImpl extends ServiceImpl elementIds, Long collectionId) { if (CollectionUtils.isEmpty(elementIds) || null == collectionId) { @@ -723,7 +723,7 @@ public class CollectionElementServiceImpl extends ServiceImpl saveColorBoard(List colorBoards, Long collectionId, String timeZone) { //用户信息 diff --git a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java index 6cd25d76..1aad260c 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java @@ -45,7 +45,7 @@ public class CollectionServiceImpl extends ServiceImpl impleme designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url")); designPythonOutfitDetail.setUserId(userInfo.getId()); designPythonOutfitDetail.setPriority(Integer.parseInt(jsonObject.getString("priority"))); + designPythonOutfitDetail.setCreateDate(LocalDateTime.now()); list.add(designPythonOutfitDetail); } designPythonOutfitDetailService.saveBatch(list); @@ -776,7 +777,7 @@ public class DesignServiceImpl extends ServiceImpl impleme } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public DesignLikeVO like(DesignLikeDTO designLikeDTO) { Long userGroupId = designLikeDTO.getUserGroupId();; Long groupDetailId; 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 48f3655a..38bc80fc 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -6,10 +6,7 @@ import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.GenerateModeEnum; import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.primary.CollectionElementMapper; -import com.ai.da.mapper.primary.GenerateCancelMapper; -import com.ai.da.mapper.primary.GenerateDetailMapper; -import com.ai.da.mapper.primary.GenerateMapper; +import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; @@ -85,6 +82,9 @@ public class GenerateServiceImpl extends ServiceImpl i @Value("${redis.key.generateResult}") private String generateResultKey; + @Value("${redis.key.toProductImageResultKey}") + private String toProductImageResultKey; + @Override public GenerateCaptionVO generateCaption(Long sketchElementId) { CollectionElement collectionElement = collectionElementMapper.selectById(sketchElementId); @@ -229,6 +229,30 @@ public class GenerateServiceImpl extends ServiceImpl i redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } + @Resource + private ToProductImageResultMapper toProductImageResultMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void processToProductImageResult(String taskId, String url, String category) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getTaskId, taskId); + List toProductImageResults = toProductImageResultMapper.selectList(qw); + if (CollectionUtils.isEmpty(toProductImageResults)) { + return; +// throw new BusinessException(""); + } + ToProductImageResult toProductImageResult = toProductImageResults.get(0); + toProductImageResult.setUrl(url); + toProductImageResultMapper.updateById(toProductImageResult); + + String key = toProductImageResultKey + ":" + taskId; + String imageName = url.substring(url.lastIndexOf("/") + 1); + String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success"; + GenerateResultVO generateResultVO = new GenerateResultVO(taskId, toProductImageResult.getId(), url, status, category); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + } + private void validateGeneraType(Generate generate, String text, Long elementId, String generateType) { switch (generateType) { case "text": diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 6ce40146..f5a6da79 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -7,12 +7,14 @@ import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; +import com.ai.da.model.dto.DesignWorksRegisterDTO; import com.ai.da.model.dto.PortfolioDTO; import com.ai.da.model.dto.QueryPortfolioPageDTO; import com.ai.da.model.enums.Position; import com.ai.da.model.enums.Sex; import com.ai.da.model.vo.*; import com.ai.da.service.*; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -21,6 +23,7 @@ import com.google.common.base.Function; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.math.BigDecimal; @@ -85,120 +88,159 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementListOld = collectionElementService.getByCollectionId(collectionIdOld); - collectionOld.setId(null); - collectionMapper.insert(collectionOld); - Long collectionIdNew = collectionOld.getId(); - userLikeGroupNew.setCollectionId(collectionIdNew); - userLikeGroupMapper.insert(userLikeGroupNew); -// List collectionElementRelationListNew = new ArrayList<>(); - for (CollectionElement element : collectionElementListOld) { - element.setCollectionId(collectionIdNew); - element.setId(null); - collectionElementMapper.insert(element); - TCollectionElementRelation collectionElementRelationNew = new TCollectionElementRelation(); - collectionElementRelationNew.setCollectionId(collectionIdNew); - collectionElementRelationNew.setElementId(element.getId()); - collectionElementRelationNew.setCreateDate(new Date()); - collectionElementRelationMapper.insert(collectionElementRelationNew); - } - Portfolio portfolio = new Portfolio(); - Long coverIdOld = portfolioDTO.getCoverId(); - portfolio.setPortfolioName(portfolioDTO.getPortfolioName()); - portfolio.setPortfolioType("History"); - portfolio.setCollectionId(collectionIdNew); - portfolio.setAccountId(authPrincipalVo.getId()); - portfolio.setCreateDate(LocalDateTime.now()); - portfolio.setUpdateDate(LocalDateTime.now()); - portfolio.setStatus(1); - portfolio.setIsDeleted(0); - portfolio.setUserLikeGroupSourceId(portfolioDTO.getUserLikeGroupId()); - portfolioMapper.insert(portfolio); + public Boolean publish(MultipartFile file, String data) { + PortfolioDTO portfolioDTO = JSONObject.parseObject(data, PortfolioDTO.class); + AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); + if (file != null && file.getOriginalFilename() != null) { + String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file); + Canvas canvas = new Canvas(); + canvas.setUrl(upload); + canvas.setCreateTime(LocalDateTime.now()); + canvas.setAccountId(authPrincipalVo.getId()); + canvasMapper.insert(canvas); - List userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); -// List designPythonOutfitIdList = userLikeList.stream().map(UserLike::getDesignOutfitId).collect(Collectors.toList()); -// -// QueryWrapper qw = new QueryWrapper<>(); -// qw.lambda().in(TDesignPythonOutfit::getId, designPythonOutfitIdList); -// List designPythonOutfits = designPythonOutfitMapper.selectList(qw); - Long coverIdNew = null; - Boolean flag = false; - for (UserLike userLike : userLikeList) { - Long designOutfitIdOld = userLike.getDesignOutfitId(); - TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(designOutfitIdOld); - designPythonOutfit.setDesignId(-1L); - designPythonOutfit.setDesignItemId(-1L); - designPythonOutfit.setCollectionId(collectionIdNew); - if (designPythonOutfit.getId().equals(coverIdOld)) { - flag = true; + if (portfolioDTO.getOpenSource() == 1) { + UserLikeGroup userLikeGroup = userLikeGroupMapper.selectById(portfolioDTO.getUserLikeGroupId()); + UserLikeGroup userLikeGroupNew = userLikeGroup.setId(null); + userLikeGroupNew.setAccountId(-1L); + Long collectionIdOld = userLikeGroup.getCollectionId(); + Collection collectionOld = collectionMapper.selectById(collectionIdOld); + List collectionElementListOld = collectionElementService.getByCollectionId(collectionIdOld); + collectionOld.setId(null); + collectionMapper.insert(collectionOld); + Long collectionIdNew = collectionOld.getId(); + userLikeGroupNew.setCollectionId(collectionIdNew); + userLikeGroupMapper.insert(userLikeGroupNew); + for (CollectionElement element : collectionElementListOld) { + element.setCollectionId(collectionIdNew); + element.setId(null); + collectionElementMapper.insert(element); + TCollectionElementRelation collectionElementRelationNew = new TCollectionElementRelation(); + collectionElementRelationNew.setCollectionId(collectionIdNew); + collectionElementRelationNew.setElementId(element.getId()); + collectionElementRelationNew.setCreateDate(new Date()); + collectionElementRelationMapper.insert(collectionElementRelationNew); } - designPythonOutfit.setId(null); - designPythonOutfitMapper.insert(designPythonOutfit); - Long designOutfitIdNew = designPythonOutfit.getId(); - userLike.setDesignOutfitId(designOutfitIdNew); - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, designOutfitIdOld); - List tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(qw); - for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { -// Long designPythonOutfitDetailIdOld = tDesignPythonOutfitDetail.getId(); - tDesignPythonOutfitDetail.setId(null); - tDesignPythonOutfitDetail.setDesignId(-1L); - tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); - designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); + Portfolio portfolio = new Portfolio(); + QueryWrapper portfolioQueryWrapper = new QueryWrapper<>(); + portfolioQueryWrapper.lambda().eq(Portfolio::getUserLikeGroupSourceId, portfolioDTO.getUserLikeGroupId()); + List portfolios = portfolioMapper.selectList(portfolioQueryWrapper); + if (!CollectionUtils.isEmpty(portfolios)) { + portfolio = portfolios.get(0); } - - if (flag) { - coverIdNew = designOutfitIdNew; - portfolio.setCoverId(coverIdNew); + portfolio.setPortfolioName(portfolioDTO.getPortfolioName()); + portfolio.setPortfolioType("History"); + portfolio.setCollectionId(collectionIdNew); + portfolio.setAccountId(authPrincipalVo.getId()); + portfolio.setCreateDate(LocalDateTime.now()); + portfolio.setUpdateDate(LocalDateTime.now()); + portfolio.setStatus(1); + portfolio.setOpenSource(1); + portfolio.setIsDeleted(0); + portfolio.setUserLikeGroupSourceId(portfolioDTO.getUserLikeGroupId()); + portfolio.setCanvasId(canvas.getId()); + if (!CollectionUtils.isEmpty(portfolios)) { portfolioMapper.updateById(portfolio); - flag = false; + }else { + portfolioMapper.insert(portfolio); } - Long designItemIdOld = userLike.getDesignItemId(); - DesignItem designItemOld = designItemMapper.selectById(designItemIdOld); - designItemOld.setId(null); - designItemOld.setAccountId(-1L); - designItemOld.setDesignId(-1L); - designItemOld.setCollectionId(collectionIdNew); - designItemMapper.insert(designItemOld); - Long designItemIdNew = designItemOld.getDesignId(); + List userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); +// Long coverIdNew = null; +// Boolean flag = false; + for (UserLike userLike : userLikeList) { + Long designOutfitIdOld = userLike.getDesignOutfitId(); + TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(designOutfitIdOld); + designPythonOutfit.setDesignId(-1L); + designPythonOutfit.setDesignItemId(-1L); + designPythonOutfit.setCollectionId(collectionIdNew); +// if (designPythonOutfit.getId().equals(coverIdOld)) { +// flag = true; +// } + designPythonOutfit.setId(null); + designPythonOutfitMapper.insert(designPythonOutfit); + Long designOutfitIdNew = designPythonOutfit.getId(); + userLike.setDesignOutfitId(designOutfitIdNew); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, designOutfitIdOld); + List tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(qw); + for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { +// Long designPythonOutfitDetailIdOld = tDesignPythonOutfitDetail.getId(); + tDesignPythonOutfitDetail.setId(null); + tDesignPythonOutfitDetail.setDesignId(-1L); + tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); + designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); + } - designPythonOutfit.setDesignItemId(designItemIdNew); - designPythonOutfitMapper.updateById(designPythonOutfit); +// if (flag) { +// coverIdNew = designOutfitIdNew; +// portfolio.setCoverId(coverIdNew); +// portfolioMapper.updateById(portfolio); +// flag = false; +// } - userLike.setDesignItemId(designItemIdNew); - userLike.setId(null); - userLike.setDesignId(-1L); - userLike.setUserLikeGroupId(userLikeGroupNew.getId()); - userLikeMapper.insert(userLike); - QueryWrapper designItemDetailQueryWrapper = new QueryWrapper<>(); - designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemOld); - List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); - for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { - Long designItemDetailIdOld = designItemDetailOld.getId(); - designItemDetailOld.setAccountId(-1L); - designItemDetailOld.setDesignId(-1L); - designItemDetailOld.setDesignItemId(designItemIdNew); - designItemDetailMapper.insert(designItemDetailOld); - Long designItemDetailIdNew = designItemDetailOld.getId(); - QueryWrapper designItemDetailPrintQueryWrapper = new QueryWrapper<>(); - designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); - DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); - designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); - designItemDetailPrintMapper.insert(designItemDetailPrint); + Long designItemIdOld = userLike.getDesignItemId(); + DesignItem designItemOld = designItemMapper.selectById(designItemIdOld); + designItemOld.setId(null); + designItemOld.setAccountId(-1L); + designItemOld.setDesignId(-1L); + designItemOld.setCollectionId(collectionIdNew); + designItemMapper.insert(designItemOld); + Long designItemIdNew = designItemOld.getDesignId(); + + designPythonOutfit.setDesignItemId(designItemIdNew); + designPythonOutfitMapper.updateById(designPythonOutfit); + + userLike.setDesignItemId(designItemIdNew); + userLike.setId(null); + userLike.setDesignId(-1L); + userLike.setUserLikeGroupId(userLikeGroupNew.getId()); + userLikeMapper.insert(userLike); + QueryWrapper designItemDetailQueryWrapper = new QueryWrapper<>(); + designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemOld); + List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); + for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { + Long designItemDetailIdOld = designItemDetailOld.getId(); + designItemDetailOld.setAccountId(-1L); + designItemDetailOld.setDesignId(-1L); + designItemDetailOld.setDesignItemId(designItemIdNew); + designItemDetailMapper.insert(designItemDetailOld); + Long designItemDetailIdNew = designItemDetailOld.getId(); + QueryWrapper designItemDetailPrintQueryWrapper = new QueryWrapper<>(); + designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); + DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); + designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); + designItemDetailPrintMapper.insert(designItemDetailPrint); + } + } + } else { + QueryWrapper portfolioQueryWrapper = new QueryWrapper<>(); + portfolioQueryWrapper.lambda().eq(Portfolio::getUserLikeGroupSourceId, portfolioDTO.getUserLikeGroupId()); + List portfolios = portfolioMapper.selectList(portfolioQueryWrapper); + Portfolio portfolio = new Portfolio(); + if (!CollectionUtils.isEmpty(portfolios)) { + portfolio = portfolios.get(0); + } + portfolio.setPortfolioName(portfolioDTO.getPortfolioName()); + portfolio.setPortfolioType("Canvas"); + portfolio.setAccountId(authPrincipalVo.getId()); + portfolio.setCreateDate(LocalDateTime.now()); + portfolio.setUpdateDate(LocalDateTime.now()); + portfolio.setStatus(1); + portfolio.setIsDeleted(0); + portfolio.setOpenSource(0); + portfolio.setUserLikeGroupSourceId(portfolioDTO.getUserLikeGroupId()); + portfolio.setCanvasId(canvas.getId()); + if (!CollectionUtils.isEmpty(portfolios)) { + portfolioMapper.updateById(portfolio); + }else { + portfolioMapper.insert(portfolio); } } - }else { - } @@ -329,8 +371,8 @@ public class PortfolioServiceImpl extends ServiceImpl convert = page.convert((Function) portfolio -> { if (portfolio != null) { PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class); - TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(vo.getCoverId()); - vo.setDesignPythonOutfitUrl(minioUtil.getPresignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60)); + Canvas canvas = canvasMapper.selectById(vo.getCanvasId()); + vo.setCanvasUrl(minioUtil.getPresignedUrl(canvas.getUrl(), 24 * 60)); return vo; } return null; @@ -342,22 +384,26 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementList = collectionElementService.getByCollectionId(collectionId); - for (CollectionElement element : collectionElementList) { - if (StringUtils.isEmpty(element.getUrl())) { - continue; + if (vo.getOpenSource() == 1) { + Long collectionId = portfolio.getCollectionId(); + List collectionElementList = collectionElementService.getByCollectionId(collectionId); + for (CollectionElement element : collectionElementList) { + if (StringUtils.isEmpty(element.getUrl())) { + continue; + } + element.setUrl(minioUtil.getPresignedUrl(element.getUrl(), 24 * 60)); } - element.setUrl(minioUtil.getPresignedUrl(element.getUrl(), 24 * 60)); + vo.setCollectionElementList(collectionElementList); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(TDesignPythonOutfit::getCollectionId, portfolio.getCollectionId()); + List designPythonOutfitList = designPythonOutfitMapper.selectList(qw); + for (TDesignPythonOutfit tDesignPythonOutfit : designPythonOutfitList) { + tDesignPythonOutfit.setDesignUrl(minioUtil.getPresignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); + } + vo.setDesignPythonOutfitList(designPythonOutfitList); } - vo.setCollectionElementList(collectionElementList); - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(TDesignPythonOutfit::getCollectionId, portfolio.getCollectionId()); - List designPythonOutfitList = designPythonOutfitMapper.selectList(qw); - for (TDesignPythonOutfit tDesignPythonOutfit : designPythonOutfitList) { - tDesignPythonOutfit.setDesignUrl(minioUtil.getPresignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); - } - vo.setDesignPythonOutfitList(designPythonOutfitList); + Canvas canvas = canvasMapper.selectById(vo.getCanvasId()); + vo.setCanvasUrl(minioUtil.getPresignedUrl(canvas.getUrl(), 24 * 60)); return vo; } @@ -471,4 +517,9 @@ public class PortfolioServiceImpl extends ServiceImpl impl @Resource private FileProperties fileProperties; - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void initDefaultSysFile() { //删除已有的sysFile数据 diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index 4f5ff929..a4d57bdd 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -2,29 +2,43 @@ package com.ai.da.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.CommonConstant; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; +import com.ai.da.common.utils.RedisUtil; import com.ai.da.mapper.primary.*; -import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; -import com.ai.da.mapper.primary.entity.UserLike; -import com.ai.da.mapper.primary.entity.UserLikeGroup; +import com.ai.da.mapper.primary.entity.*; +import com.ai.da.model.dto.ExportSaveDTO; +import com.ai.da.model.dto.ProductImageLikeDTO; +import com.ai.da.model.dto.ToProductImageDTO; import com.ai.da.model.vo.*; +import com.ai.da.python.PythonService; import com.ai.da.service.AccountService; import com.ai.da.service.CollectionService; import com.ai.da.service.UserLikeGroupService; import com.ai.da.service.UserLikeService; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.TimeZone; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.time.LocalDateTime; +import java.util.*; import java.util.stream.Collectors; /** @@ -167,4 +181,216 @@ public class UserLikeGroupServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.lambda().eq(ExportFile::getUserLikeGroupId, userLikeGroupId); + List exportFiles = exportFileMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(exportFiles)) { + ExportFile exportFile = exportFiles.get(0); + exportFile.setUserLikeGroupId(userLikeGroupId); + exportFile.setUrl(upload); + exportFileMapper.updateById(exportFile); + }else { + ExportFile exportFile = new ExportFile(); + exportFile.setUserLikeGroupId(userLikeGroupId); + exportFile.setUrl(upload); + exportFileMapper.insert(exportFile); + } + return Boolean.TRUE; + } + + @Resource + private ToProductImageRecordMapper toProductImageRecordMapper; + @Resource + private ToProductImageResultMapper toProductImageResultMapper; + + @Resource + private PythonService pythonService; + @Override + @Transactional(rollbackFor = Exception.class) + public List toProduct(ToProductImageDTO toProductImageDTO) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + Long userLikeGroupId = toProductImageDTO.getUserLikeGroupId(); + ToProductImageRecord toProductImageRecord = new ToProductImageRecord(); + toProductImageRecord.setUserLikeGroupId(userLikeGroupId); + toProductImageRecord.setCreateTime(LocalDateTime.now()); + if (!StringUtils.isEmpty(toProductImageDTO.getPrompt())) { + toProductImageRecord.setPrompt(toProductImageDTO.getPrompt()); + } + toProductImageRecordMapper.insert(toProductImageRecord); + + List result = new ArrayList<>(); + + int i = 0; + for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) { + if (toProductImageVO.getElementType().equals("DesignOutfit")) { + String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + i ++; + TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.toProductImage(tDesignPythonOutfit.getDesignUrl(), taskId, toProductImageDTO.getPrompt()); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(tDesignPythonOutfit.getId()); + toProductImageResult.setElementType("DesignOutfit"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResult.setUserLikeGroupId(userLikeGroupId); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + }else { + String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.toProductImage(toProductElement.getUrl(), taskId, toProductImageDTO.getPrompt()); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(toProductElement.getId()); + toProductImageResult.setElementType("ProductElement"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + } + } + + return result; + } + + @Resource + private ToProductElementMapper toProductElementMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public ToProductElementVO toProductImageElementUpload(MultipartFile file, Long userLikeGroupId) { + if (null == file || StringUtils.isEmpty(file.getOriginalFilename())) { + throw new BusinessException("file.cannot.be.empty"); + } + if (userLikeGroupId == null) { + throw new BusinessException("userLikeGroupId.cannot.be.empty"); + } + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + String bucketName = "aida-users"; + String minioUrl = minioUtil.upload(bucketName, userHolder.getId() + "/toProductImageElement", file); + ToProductElement toProductElement = new ToProductElement(); + toProductElement.setUrl(minioUrl); + toProductElement.setUserLikeGroupId(userLikeGroupId); + toProductElement.setCreateTime(LocalDateTime.now()); + toProductElementMapper.insert(toProductElement); + ToProductElementVO toProductElementVO = CopyUtil.copyObject(toProductElement, ToProductElementVO.class); + toProductElementVO.setUrl(minioUtil.getPresignedUrl(toProductElementVO.getUrl(), 24 * 60)); + return toProductElementVO; + } + + @Override + public Boolean productImageLike(ProductImageLikeDTO productImageLikeDTO) { + List toProductImageResultId = productImageLikeDTO.getToProductImageResultId(); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().in(ToProductImageResult::getId, toProductImageResultId); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setIsLike(1); + toProductImageResultMapper.update(toProductImageResult, qw); + return Boolean.TRUE; + } + @Resource + private RedisUtil redisUtil; + @Value("${redis.key.toProductImageResultKey}") + private String toProductImageResultKey; + @Override + public List getToProductImageResultList(List taskIdList) { + List results = new ArrayList<>(); + Set collect = new HashSet<>(); + taskIdList.forEach(taskId -> { + String key = toProductImageResultKey + ":" + taskId; + GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); + if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { + String url = generateResultVO.getUrl(); + if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")) { + generateResultVO.setStatus("Invalid"); + } else { + generateResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + } + } else if (Objects.isNull(generateResultVO)) { + generateResultVO = new GenerateResultVO(); + } + if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus()); + results.add(generateResultVO); + }); + return results; + } + + @Override + public JSONObject exportSearch(Long userLikeGroupId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ExportFile::getUserLikeGroupId, userLikeGroupId); + List exportFiles = exportFileMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(exportFiles)) { + try { + InputStream download = minioUtil.download(exportFiles.get(0).getUrl()); + String convert = convert(download); + JSONObject jsonObject = JSONObject.parseObject(convert); + JSONArray objects = jsonObject.getJSONArray("objects"); + for (int i = 0; i < objects.size(); i++) { + JSONObject jsonObject1 = objects.getJSONObject(i); + String type = jsonObject1.getString("type"); + if (type.equals("image")) { + String minioUrl = jsonObject1.getString("minioUrl"); + jsonObject1.put("src", minioUtil.getPresignedUrl(minioUrl, 24 * 60)); + } + objects.set(i, jsonObject1); + } + jsonObject.put("objects", objects); + System.out.println(jsonObject); + return jsonObject; + }catch (Exception e){ + return null; + } + }else { + return null; + } + } + + @Override + public CanvasElementUpload canvasElementUpload(MultipartFile file) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + CanvasElementUpload canvasElementUpload = new CanvasElementUpload(); + String url = minioUtil.upload("aida-users", userHolder.getId() + "/canvasElementUpload", file); + canvasElementUpload.setUrl(url); + canvasElementUpload.setMinioUrl(minioUtil.getPresignedUrl(url, 24 * 60)); + return canvasElementUpload; + } + + @Override + public List productImageLikeList(ToProductImageDTO toProductImageDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getIsLike, 1); + qw.lambda().eq(ToProductImageResult::getUserLikeGroupId, toProductImageDTO.getUserLikeGroupId()); + List toProductImageResults = toProductImageResultMapper.selectList(qw); + for (ToProductImageResult toProductImageResult : toProductImageResults) { + toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + } + return toProductImageResults; + } + + public static String convert(InputStream inputStream) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + return reader.lines().collect(Collectors.joining("\n")); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index e0b09cfb..b5ba8dc0 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -65,8 +65,8 @@ spring.rabbitmq.username=rabbit spring.rabbitmq.password=123456 spring.rabbitmq.virtual-host=/ -spring.redis.host=172.31.11.32 -#spring.redis.host=18.167.251.121 +#spring.redis.host=172.31.11.32 +spring.redis.host=18.167.251.121 spring.redis.port=6379 spring.redis.database=1 spring.redis.password=Aidlab @@ -84,4 +84,5 @@ redis.key.SRCancelSet=SRCancelSet redis.key.SRExceptionMap=SRExceptionMap redis.key.taskList=TaskList redis.key.credits.pre-deduction=Credits:PreDeduction -redis.key.generateResult=Generate:Result \ No newline at end of file +redis.key.generateResult=Generate:Result +redis.key.toProductImageResultKey=ToProductImage:Result \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 20d02502..767baa78 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -58,6 +58,7 @@ minio.bucketName.results=aida-results minio.bucketName.sysImage=aida-sys-image minio.bucketName.users=aida-users minio.bucketName.collectionElement=aida-collection-element +minio.bucketName.gradient=aida-gradient redirect_url=http://18.167.251.121:7788 spring.rabbitmq.host=18.167.251.121 diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 39096842..1e4db453 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -182,4 +182,18 @@ DRESS=Dress TROUSERS=Trousers SKIRT=Skirt FEMALE=Women's wear -MALE=Men's wear \ No newline at end of file +MALE=Men's wear + +SLOGAN=Slogan +LOGO=Logo +PATTERN=Pattern + +EMBROIDERY=Embroidery +BEADING=Beading +PEARL=Pearl +RIVET=Rivet +BUTTON=Button +BELT=Belt +CORSAGE=Corsage +ZIPPER=Zipper +POCKET=Pocket \ No newline at end of file diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index 8fecb5f9..f6e40e34 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -178,4 +178,18 @@ DRESS=长裙 TROUSERS=裤子 SKIRT=短裙 FEMALE=女装 -MALE=男装 \ No newline at end of file +MALE=男装 + +SLOGAN=标语 +LOGO=标志 +PATTERN=图案 + +EMBROIDERY=刺绣 +BEADING=钉珠 +PEARL=珍珠 +RIVET=铆钉 +BUTTON=纽扣 +BELT=腰带 +CORSAGE=胸花 +ZIPPER=拉链 +POCKET=口袋 \ No newline at end of file From 1a48527c70c21809336bf4a99c9a59a7cfafa14a Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 12 Jun 2024 10:41:59 +0800 Subject: [PATCH 09/79] =?UTF-8?q?1=E3=80=81design=20single=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20design=20elements=202=E3=80=81design=20single=20--?= =?UTF-8?q?=20print=E6=B7=BB=E5=8A=A0level2Type=203=E3=80=81=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E9=83=A8=E5=88=86flask=E6=8E=A5=E5=8F=A3=20=E4=B8=BA?= =?UTF-8?q?=20fastAPI=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../primary/entity/DesignItemDetailPrint.java | 10 ++ .../ai/da/model/dto/CollectionColorDTO.java | 8 +- .../ai/da/model/dto/DesignSingleItemDTO.java | 7 +- .../ai/da/model/dto/DesignSinglePrintDTO.java | 5 + .../model/vo/DesignItemClothesDetailVO.java | 3 + .../com/ai/da/model/vo/DesignSinglePrint.java | 6 +- .../java/com/ai/da/python/PythonService.java | 103 +++++++++++++----- .../com/ai/da/python/vo/DesignPythonItem.java | 18 ++- .../service/DesignItemDetailPrintService.java | 2 +- .../da/service/impl/ChatRobotServiceImpl.java | 5 +- .../DesignItemDetailPrintServiceImpl.java | 3 +- .../service/impl/DesignItemServiceImpl.java | 75 ++++++++----- .../ai/da/service/impl/DesignServiceImpl.java | 13 ++- .../da/service/impl/GenerateServiceImpl.java | 7 +- .../da/service/impl/LibraryServiceImpl.java | 5 +- src/main/resources/application-dev.properties | 1 + src/main/resources/paypal-sandbox.properties | 20 ++-- 17 files changed, 206 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java index e6800e69..09e142b5 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java @@ -20,6 +20,16 @@ public class DesignItemDetailPrint { * 关联t_design_item_detail表ID */ private Long designItemDetailId; + + /** + * 印花的类型 print || trims + */ + private String printType; + + /** + * 印花二级分类 Slogan || Logo || Pattern + */ + private String level2Type; /** * 印花路径 */ diff --git a/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java b/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java index 72e59a93..d5581ee9 100644 --- a/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java +++ b/src/main/java/com/ai/da/model/dto/CollectionColorDTO.java @@ -26,10 +26,10 @@ public class CollectionColorDTO { @ApiModelProperty("潘通RGB值") private String rgbValue; -// private Gradient gradient; -// -// private String gradientString; + private Gradient gradient; -// private String gradientMinioUrl; + private String gradientString; + + private String gradientMinioUrl; } diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java index 16850c17..ea6925b1 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java @@ -50,10 +50,13 @@ public class DesignSingleItemDTO implements Serializable { @ApiModelProperty("图层优先级") private Integer priority; -// @ApiModelProperty("渐变 颜色") -// private Gradient gradient; + @ApiModelProperty("渐变 颜色") + private Gradient gradient; @ApiModelProperty("画笔修改过的sketch图片的base64格式的数据") private String sketchString; + @ApiModelProperty("衣服上的装饰") + private DesignSinglePrintDTO trims; + } diff --git a/src/main/java/com/ai/da/model/dto/DesignSinglePrintDTO.java b/src/main/java/com/ai/da/model/dto/DesignSinglePrintDTO.java index eebc36c8..163e468b 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSinglePrintDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSinglePrintDTO.java @@ -23,4 +23,9 @@ public class DesignSinglePrintDTO implements Serializable { public DesignSinglePrintDTO() { } + + public DesignSinglePrintDTO(Boolean ifSingle, List prints) { + this.ifSingle = ifSingle; + this.prints = prints; + } } \ No newline at end of file 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 130948d7..52e0008d 100644 --- a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java @@ -46,6 +46,9 @@ public class DesignItemClothesDetailVO { @ApiModelProperty("print详细") private DesignSinglePrintDTO printObject = new DesignSinglePrintDTO(); + @ApiModelProperty("design elements详细") + private DesignSinglePrintDTO trims = new DesignSinglePrintDTO(); + @ApiModelProperty("对应图层信息") private List layersObject; diff --git a/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java b/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java index 1d231b3d..0a79320a 100644 --- a/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java +++ b/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java @@ -13,6 +13,9 @@ import java.util.List; @ApiModel("design single 印花详情") public class DesignSinglePrint implements Serializable { + @ApiModelProperty("印花的类型 Slogan || Logo || Pattern") + private String level2Type; + @ApiModelProperty("印花是用户上传的还是从library中选的 collection/library") private String designType; @@ -45,7 +48,8 @@ public class DesignSinglePrint implements Serializable { this.scale = scale; } - public DesignSinglePrint(String path, String minIOPath, List location, Double scale, Double angle, Integer priority) { + public DesignSinglePrint(String level2Type, String path, String minIOPath, List location, Double scale, Double angle, Integer priority) { + this.level2Type = level2Type; this.path = path; this.minIOPath = minIOPath; this.location = location; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index f68a9d51..7bffa0ca 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -67,7 +67,7 @@ public class PythonService { @Value("${access.python.port:''}") private String accessPythonPort; @Value("${access.python.address}") - private String srPythonPort; + private String fastApiPythonAddress; @Value("${minio.bucketName.gradient}") private String gradientBucketName; @@ -270,13 +270,13 @@ public class PythonService { private void updateSketchNumbers(CurrentDesignPictureTypeEnum designPictureType, int[] sketchNumbers) { switch (designPictureType) { case PIN: - sketchNumbers[0] ++; + sketchNumbers[0]++; break; case NO_PIN: - sketchNumbers[2] --; + sketchNumbers[2]--; break; case SYS_FILE: - sketchNumbers[1] --; + sketchNumbers[1]--; break; } } @@ -316,7 +316,7 @@ public class PythonService { Long l = RandomsUtil.randomSysFile(0l, 2l); if (l == 0l) { return CurrentDesignPictureTypeEnum.NO_PIN; - }else { + } else { return CurrentDesignPictureTypeEnum.SYS_FILE; } } @@ -793,6 +793,7 @@ public class PythonService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition") +// .url(fastApiPythonAddress + "/api/attribute_recognition") .method("POST", body) .addHeader("Content-Type", "application/json") .build(); @@ -835,6 +836,7 @@ public class PythonService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition") +// .url(fastApiPythonAddress + "/api/attribute_recognition") .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") @@ -2358,7 +2360,8 @@ public class PythonService { log.info("design请求python 参数:####{}", param); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() - .url(accessPythonIp + ":" + accessPythonPort + "/api/design") +// .url(accessPythonIp + ":" + accessPythonPort + "/api/design") + .url(fastApiPythonAddress + "/api/design") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") @@ -2464,7 +2467,8 @@ public class PythonService { System.out.println(JSON.toJSONString(content)); RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); Request request = new Request.Builder() - .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_retrieve") +// .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_retrieve") + .url(fastApiPythonAddress + "/api/attribute_retrieve") // .url(accessPythonIp+":9991/aifda/api/v1.0/attribute_retrieval") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") @@ -2611,22 +2615,22 @@ public class PythonService { designSingleItemList.forEach(designSingleItem -> { Long businessId; - if (!designSingleIncludeLayersDTO.getIsPreview() && designSingleItem.getChanged()){ + if (!designSingleIncludeLayersDTO.getIsPreview() && designSingleItem.getChanged()) { String s = String.valueOf(designSingleItem.getId()); - businessId = Long.parseLong(s.substring(0,s.length() - 3)); - }else { + businessId = Long.parseLong(s.substring(0, s.length() - 3)); + } else { businessId = designSingleItem.getId(); } // 判断是否是渐变色 String minioPath = null; String gradientString = null; - if (!Objects.isNull(designSingleItem.getGradient())){ + if (!Objects.isNull(designSingleItem.getGradient())) { String colorImg = designSingleItem.getGradient().getColorImg(); - if (StringUtil.isNullOrEmpty(colorImg)){ + if (StringUtil.isNullOrEmpty(colorImg)) { throw new BusinessException("The base64 data of the image is empty"); } - minioPath = minioUtil.base64UploadToPath(colorImg, gradientBucketName,null); + minioPath = minioUtil.base64UploadToPath(colorImg, gradientBucketName, null); designSingleItem.getGradient().setColorImg(null); gradientString = JSONObject.toJSONString(designSingleItem.getGradient()); @@ -2637,7 +2641,8 @@ public class PythonService { designSingleItem.getType(), designSingleItem.getPath(), designSingleItem.getColor(), - resolveDesignSinglePrint(designSingleItem.getPrintObject(), designSingleItem.getPath()), + resolveDesignSinglePrint(designSingleItem.getPrintObject(), null), + resolveDesignElement(designSingleItem.getTrims()), // businessId designItemDetailId (python端确认没有作用,但是数据库需要存,作用:未知) // designSingleItem.getId(), businessId, @@ -2669,21 +2674,24 @@ public class PythonService { } DesignPythonItemPrint print = CopyUtil.copyObject(printObject, DesignPythonItemPrint.class); - List> location = new ArrayList<>(printObject.getPrints().size()); - List scale = new ArrayList<>(printObject.getPrints().size()); - List angle = new ArrayList<>(printObject.getPrints().size()); - ArrayList paths = new ArrayList<>(printObject.getPrints().size()); + int size = printObject.getPrints().size(); + // 占位符填充数组 + List> location = new ArrayList<>(Collections.nCopies(size, null)); + List scale = new ArrayList<>(Collections.nCopies(size, null)); + List angle = new ArrayList<>(Collections.nCopies(size, null)); + ArrayList paths = new ArrayList<>(Collections.nCopies(size, null)); // 设置印花的位置、大小、旋转角度 + // 优先级越大,越靠近顶层,在传输给python的数组中,越靠前 List prints = printObject.getPrints(); prints.forEach(p -> { p.getLocation().set(0, p.getLocation().get(0)); p.getLocation().set(1, p.getLocation().get(1)); Integer priority = p.getPriority(); - location.add(priority - 1, p.getLocation()); - scale.add(priority - 1, p.getScale()); - angle.add(priority - 1, p.getAngle()); - paths.add(priority - 1, p.getMinIOPath()); + location.set(size - priority, p.getLocation()); + scale.set(size - priority, p.getScale()); + angle.set(size - priority, p.getAngle()); + paths.set(size - priority, p.getMinIOPath()); // log.info("本次print打点locations###{}###fileVO{}", p.getLocation(), JSON.toJSONString(fileVO)); }); print.setLocation(location); @@ -2694,6 +2702,41 @@ public class PythonService { return print; } + private DesignPythonItemElement resolveDesignElement(DesignSinglePrintDTO trims) { + // 没有design element 时的参数设置 + if (Objects.isNull(trims.getIfSingle()) && CollectionUtil.isEmpty(trims.getPrints())) { + return null; + } + DesignPythonItemElement print = new DesignPythonItemElement(); + + int size = trims.getPrints().size(); + // 占位符填充数组 + List> location = new ArrayList<>(Collections.nCopies(size, null)); + List scale = new ArrayList<>(Collections.nCopies(size, null)); + List angle = new ArrayList<>(Collections.nCopies(size, null)); + ArrayList paths = new ArrayList<>(Collections.nCopies(size, null)); + + // 设置印花的位置、大小、旋转角度 + // 优先级越大,越靠近顶层,在传输给python的数组中,越靠前 + List prints = trims.getPrints(); + prints.forEach(p -> { + p.getLocation().set(0, p.getLocation().get(0)); + p.getLocation().set(1, p.getLocation().get(1)); + Integer priority = p.getPriority(); + location.set(size - priority, p.getLocation()); + scale.set(size - priority, p.getScale()); + angle.set(size - priority, p.getAngle()); + paths.set(size - priority, p.getMinIOPath()); +// log.info("本次print打点locations###{}###fileVO{}", p.getLocation(), JSON.toJSONString(fileVO)); + }); + print.setLocation(location); + print.setElement_scale_list(scale); + print.setElement_angle_list(angle); + print.setElement_path_list(paths); + + return print; + } + private DesignPythonBasic coverToSingleBasic(DesignPythonItem designPythonItem, String singleOverall, String switchCategory, List priority, DesignLibraryModelPointVO designLibraryModelPoint) { @@ -2856,6 +2899,7 @@ public class PythonService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() .url(accessPythonIp + ":" + accessPythonPort + "/api/design") +// .url(fastApiPythonAddress + "/api/design") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") @@ -2953,7 +2997,7 @@ public class PythonService { // .url("http://127.0.0.1:5000/api/diffusion") // .url(accessPythonIp + ":" + accessPythonPort + "/api/diffusion") // .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_image") - .url(srPythonPort + servicePath) + .url(fastApiPythonAddress + servicePath) .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") @@ -2997,7 +3041,7 @@ public class PythonService { log.info("Generate##responseObject###{}", jsonObject); // return setGenerateImageList(jsonObject.getJSONObject("data")); return Boolean.TRUE; - }else { + } else { log.info("generateSketchOrPrintPrint失败###{}", jsonObject); log.info("Generate Exception! Code : " + jsonObject.get("code")); return Boolean.FALSE; @@ -3016,6 +3060,7 @@ public class PythonService { RequestBody body = RequestBody.create(mediaType, content); Request request = new Request.Builder() .url(accessPythonIp + ":" + accessPythonPort + portAndRoute) +// .url(fastApiPythonAddress + portAndRoute) .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") @@ -3036,13 +3081,13 @@ public class PythonService { List imageUrlList = JSONObject.parseArray(jsonObject.get("list").toString(), String.class); if (imageUrlList.isEmpty()) { log.error("PythonService##generateSketchOrPrint异常###{}", "diffusion response list is null"); - // todo 如果这里返回为空,是判断出错还是返回给前端空 + // 如果这里返回为空,是判断出错还是返回给前端空 throw new BusinessException("The data returned on the python side is empty"); } return imageUrlList; } - + /** 废弃状态 */ public String composeLayers(List layersDetail) { HashMap> layers = new HashMap<>(); HashMap>> content = new HashMap<>(); @@ -3135,7 +3180,8 @@ public class PythonService { .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) .build(); - String url = accessPythonIp + ":" + accessPythonPort + "/api/generate_cancel/" + taskId; +// String url = accessPythonIp + ":" + accessPythonPort + "/api/generate_cancel/" + taskId; + String url = fastApiPythonAddress + "/api/generate_cancel/" + taskId; Request request = new Request.Builder() .url(url) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") @@ -3177,7 +3223,7 @@ public class PythonService { String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); RequestBody body = RequestBody.create(mediaType, jsonString); Request request = new Request.Builder() - .url(srPythonPort + "/api/super_resolution") + .url(fastApiPythonAddress + "/api/super_resolution") .method("POST", body) .addHeader("Content-Type", "application/json") .build(); @@ -3217,6 +3263,7 @@ public class PythonService { RequestBody body = RequestBody.create(mediaType, jsonString); Request request = new Request.Builder() .url(accessPythonIp + ":" + accessPythonPort + "/api/translateToEN") +// .url(fastApiPythonAddress + "/api/translateToEN") .method("POST", body) .addHeader("Content-Type", "application/json") .build(); diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java index 4e72200f..332fd8fa 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java @@ -28,15 +28,20 @@ public class DesignPythonItem { */ private String color; -// private String gradient; + private String gradient; -// private String gradientString; + private String gradientString; /** * 对应的print图片的绝对路径 */ private DesignPythonItemPrint print; + /** + * trims 衣服上的装饰 + */ + private DesignPythonItemElement element; + /** * 对应的icon的绝对路径 */ @@ -113,20 +118,21 @@ public class DesignPythonItem { this.image_id = image_id; } - public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, Long businessId, - Long image_id, List offset, Float[] resize_scale, Integer priority) { + public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, DesignPythonItemElement element, Long businessId, + Long image_id, List offset, Float[] resize_scale, Integer priority, String gradient, String gradientString) { this.type = type; this.path = path; this.color = color; this.print = print; + this.element = element; // this.icon = icon; this.businessId = businessId; this.image_id = image_id; this.offset = offset; this.resize_scale = resize_scale; this.priority = priority; -// this.gradient = gradient; -// this.gradientString = gradientString; + this.gradient = gradient; + this.gradientString = gradientString; } public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, String icon, Long businessId, Long image_id) { diff --git a/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java b/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java index 9e8b0b3d..15859fb6 100644 --- a/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java +++ b/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; public interface DesignItemDetailPrintService extends IService { - List getByDesignItemDetailId(Long designItemDetailId); + List getByDesignItemDetailId(Long designItemDetailId, String printType); void deleteByDesignItemDetailId(Long designItemDetailId); } diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index 3c7544b6..e6ea08c8 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -87,6 +87,8 @@ public class ChatRobotServiceImpl implements ChatRobotService { private String accessPythonIp; @Value("${access.python.port:''}") private String accessPythonPort; + @Value("${access.python.address}") + private String fastApiPythonAddress; @Override @Transactional(rollbackFor = Exception.class) public ChatRobotVO sendMessageToChatRobot(ChatSendDTO chatSendDTO) { @@ -150,7 +152,8 @@ public class ChatRobotServiceImpl implements ChatRobotService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() // .url("http://127.0.0.1:5000/api/chat_stream_test") - .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") +// .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") + .url(fastApiPythonAddress + "/api/chat_robot") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) .addHeader("Content-Type", "application/json") diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java index 1489c11a..21220cef 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java @@ -15,9 +15,10 @@ public class DesignItemDetailPrintServiceImpl extends ServiceImpl getByDesignItemDetailId(Long designItemDetailId) { + public List getByDesignItemDetailId(Long designItemDetailId, String printType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("design_item_detail_id", designItemDetailId); + queryWrapper.eq("print_type", printType); return baseMapper.selectList(queryWrapper); } diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index d2349f5e..82ab7971 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -681,6 +681,7 @@ public class DesignItemServiceImpl extends ServiceImpl (singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0]) && (flag ? Boolean.TRUE : singleItem.getPriority().equals(layers.getPriority()))) @@ -704,36 +705,58 @@ public class DesignItemServiceImpl extends ServiceImpl { // 1、判断有无印花,无印花则跳过 - DesignSinglePrintDTO printObject = designSingleItem.getPrintObject(); - if (printObject.getIfSingle().equals(Boolean.FALSE) - && CollectionUtil.isEmpty(printObject.getPrints())) { - return; - } else { - // 2、有印花,添加到list - printObject.getPrints().forEach(print -> { - // 2.1 判断是否第一次添加印花,是:直接添加 - List designItemDetailPrintList = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); - if (!designItemDetailPrintList.isEmpty()) { - // 2.2 否:先删除原始印花,再添加新印花信息 - designItemDetailPrintService.deleteByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); - } - DesignItemDetailPrint designItemDetailPrint = new DesignItemDetailPrint(); - designItemDetailPrint.setDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); - designItemDetailPrint.setPath(print.getMinIOPath()); - designItemDetailPrint.setScale(print.getScale()); - designItemDetailPrint.setSingleOrOverall(printObject.getIfSingle() ? "single" : "overall"); - designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); - // single、overall模式下都有position、angle和priority - designItemDetailPrint.setPosition(print.getLocation().toString()); - designItemDetailPrint.setAngle(print.getAngle()); - designItemDetailPrint.setPriority(print.getPriority()); - designItemDetailPrints.add(designItemDetailPrint); - }); - } + setDesignItemDetailPrintList(designSingleItem, designItemDetailPrints, "print", designItemDetailTypeIdMap, timeZone); + + // 2、判断有无装饰配件 + setDesignItemDetailPrintList(designSingleItem, designItemDetailPrints, "trims", designItemDetailTypeIdMap, timeZone); }); return designItemDetailPrints; } + private void setDesignItemDetailPrintList(DesignSingleItemDTO designSingleItem, + ArrayList designItemDetailPrints, + String printType, + Map designItemDetailTypeIdMap, + String timeZone){ + DesignSinglePrintDTO printObject; + if (printType.equals("print")){ + printObject = designSingleItem.getPrintObject(); + }else { + printObject = designSingleItem.getTrims(); + if (Objects.isNull(printObject.getIfSingle())){ + printObject.setIfSingle(Boolean.FALSE); + } + } + + if (printObject.getIfSingle().equals(Boolean.FALSE) + && CollectionUtil.isEmpty(printObject.getPrints())) { + return; + } else { + // 2、有印花,添加到list + printObject.getPrints().forEach(print -> { + // 2.1 判断是否第一次添加印花,是:直接添加 + List designItemDetailPrintList = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority()), printType); + if (!designItemDetailPrintList.isEmpty()) { + // 2.2 否:先删除原始印花,再添加新印花信息 + designItemDetailPrintService.deleteByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); + } + DesignItemDetailPrint designItemDetailPrint = new DesignItemDetailPrint(); + designItemDetailPrint.setDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); + designItemDetailPrint.setPrintType(printType); + designItemDetailPrint.setLevel2Type(print.getLevel2Type()); + designItemDetailPrint.setPath(print.getMinIOPath()); + designItemDetailPrint.setScale(print.getScale()); + designItemDetailPrint.setSingleOrOverall(printType.equals("print") ? printObject.getIfSingle() ? "single" : "overall" : "single"); + designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); + // single、overall模式下都有position、angle和priority + designItemDetailPrint.setPosition(print.getLocation().toString()); + designItemDetailPrint.setAngle(print.getAngle()); + designItemDetailPrint.setPriority(print.getPriority()); + designItemDetailPrints.add(designItemDetailPrint); + }); + } + } + private List convertToOutfitDetailPythonItemList(List layers) { List composeLayerPythonItem = Arrays.asList(new OutfitDetailPythonItem[layers.size()]); layers.forEach(layer -> { 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 d3b961c4..f6cd5bfd 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -1000,12 +1000,19 @@ public class DesignServiceImpl extends ServiceImpl impleme d.setLevel1Type(converTypeToLevel1(o.getType())); // d.setGradient(JSONObject.parseObject(o.getGradientString(), Gradient.class)); // 根据designItemDetailId获取印花 - List prints = designItemDetailPrintService.getByDesignItemDetailId(o.getId()); + List prints = designItemDetailPrintService.getByDesignItemDetailId(o.getId(), "print"); // 判断有无印花 if (CollectionUtil.isNotEmpty(prints)) { // 有印花 d.setPrintObject(convertToDesignSinglePrintDTO(prints)); } + // 根据designItemDetailId获取design elements + List trims = designItemDetailPrintService.getByDesignItemDetailId(o.getId(), "trims"); + // 判断有无装饰 trims + if (CollectionUtil.isNotEmpty(trims)) { + // 有印花 + d.setTrims(convertToDesignSinglePrintDTO(trims)); + } })); //single 和 Models(模特)时候 系统元素为空 List filterDetail2 = designItemDetails.stream() @@ -1196,6 +1203,7 @@ public class DesignServiceImpl extends ServiceImpl impleme DesignItemDetailPrint detailPrint = designItemDetailPrints.get(0); DesignSinglePrint designSinglePrint = new DesignSinglePrint(); designSinglePrintDTO.setIfSingle(detailPrint.getSingleOrOverall().equals("single") ? Boolean.TRUE : Boolean.FALSE); + designSinglePrint.setLevel2Type(detailPrint.getLevel2Type()); designSinglePrint.setLocation(JSONArray.parseArray(detailPrint.getPosition(), Double.class)); designSinglePrint.setAngle(detailPrint.getAngle()); designSinglePrint.setPriority(detailPrint.getPriority()); @@ -1209,6 +1217,7 @@ public class DesignServiceImpl extends ServiceImpl impleme designItemDetailPrints.forEach(print -> { if (print.getSingleOrOverall().equals("single")) { prints.add(new DesignSinglePrint( + print.getLevel2Type(), minioUtil.getPresignedUrl(print.getPath(), 24 * 60), print.getPath(), JSONArray.parseArray(print.getPosition(), Double.class), @@ -1216,12 +1225,10 @@ public class DesignServiceImpl extends ServiceImpl impleme print.getAngle(), print.getPriority())); } - }); } designSinglePrintDTO.setPrints(prints); return designSinglePrintDTO; - } @Override 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 4033b8aa..548e5a95 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -341,6 +341,11 @@ public class GenerateServiceImpl extends ServiceImpl i throw new BusinessException("gender.cannot.be.empty"); } } + if (PRINT_BOARD.getRealName().equals(generateLikeDTO.getLevel1Type())) { + if (StringUtil.isNullOrEmpty(generateLikeDTO.getLevel2Type())) { + throw new BusinessException("level2Type.cannot.be.empty"); + } + } // 1.2 判断参数是否真实有效 Long generateDetailId = generateLikeDTO.getGenerateDetailId(); GenerateDetail generateDetail = generateDetailMapper.selectById(generateDetailId); @@ -496,7 +501,7 @@ public class GenerateServiceImpl extends ServiceImpl i } // 将图片上传到图片服务器 - String path = minioUtil.base64Upload(generateThroughImageTextDTO.getSloganBase64(), sloganBucket); + String path = minioUtil.base64UploadToPath(generateThroughImageTextDTO.getSloganBase64(), sloganBucket, null); String name = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); // 保存到db,collection-element CollectionElement collectionElement = new CollectionElement(); 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 86843f30..275f37e7 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -92,6 +92,8 @@ public class LibraryServiceImpl extends ServiceImpl impl private String accessPythonIp; @Value("${access.python.port:''}") private String accessPythonPort; + @Value("${access.python.address}") + private String fastApiPythonAddress; @Resource private PythonTAllInfoService pythonTAllInfoService; @@ -367,7 +369,8 @@ public class LibraryServiceImpl extends ServiceImpl impl log.info("processSketchBoards请求python 参数:####{}", param); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() - .url(accessPythonIp + ":" + accessPythonPort + "/api/design_pre_processing") +// .url(accessPythonIp + ":" + accessPythonPort + "/api/design_pre_processing") + .url(fastApiPythonAddress + "/api/design_pre_processing") .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 0fe1b639..22264290 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -45,6 +45,7 @@ spring.servlet.multipart.max-request-size= 10MB access.python.ip=http://18.167.251.121 access.python.port=9992 access.python.sr=http://18.167.251.121:9994 +access.python.address=http://18.167.251.121:9996 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin diff --git a/src/main/resources/paypal-sandbox.properties b/src/main/resources/paypal-sandbox.properties index e6c46b5e..5036149c 100644 --- a/src/main/resources/paypal-sandbox.properties +++ b/src/main/resources/paypal-sandbox.properties @@ -1,10 +1,10 @@ # developer-sandbox-xp -#paypal.client-id=ATbaebYi7-GXWRWJqwRLYMzKEbwjh4BFRqD4Y13i4lZq0rplWIM_IpPrtPKpdkAt_KrPXd6IJTwsDqa5 -#paypal.client-secret=EHWWJqGmmbfjLXqCUpGrvxRYBPPtWvA3hR5ZaAyHlGSVJiHoQPS8skbNaJ9h39VObnchUbgiY2pPu__s -#paypal.receiver.email=sb-ukxfk29608925@business.example.com -#paypal.mode=sandbox +paypal.client-id=ATbaebYi7-GXWRWJqwRLYMzKEbwjh4BFRqD4Y13i4lZq0rplWIM_IpPrtPKpdkAt_KrPXd6IJTwsDqa5 +paypal.client-secret=EHWWJqGmmbfjLXqCUpGrvxRYBPPtWvA3hR5ZaAyHlGSVJiHoQPS8skbNaJ9h39VObnchUbgiY2pPu__s +paypal.receiver.email=sb-ukxfk29608925@business.example.com +paypal.mode=sandbox # local -#paypal.webhook_id=31797347YC028794L +paypal.webhook_id=31797347YC028794L # dev #paypal.webhook_id=51V87014T6406322F @@ -16,9 +16,9 @@ #paypal.webhook_id=1WH327112B602422N # aida-live-kim -paypal.client-id=ASWSIZ3MXJU5w5VOeOHeigWcSw6iinl30ZCipruziKpHclxP0ryf8-7VKG1Ba2VwZwa2DMvGEzTfCTgz -paypal.client-secret=EHQg_K5PSqmp4FJlzEcOEH_kFkmq4aBzaI7jridw53L6cOQRULBAnfv2KakRfrsqaU1PDSkO4Co9Vyxc -paypal.receiver.email=kimwong@code-create.com.hk -paypal.mode=live +#paypal.client-id=ASWSIZ3MXJU5w5VOeOHeigWcSw6iinl30ZCipruziKpHclxP0ryf8-7VKG1Ba2VwZwa2DMvGEzTfCTgz +#paypal.client-secret=EHQg_K5PSqmp4FJlzEcOEH_kFkmq4aBzaI7jridw53L6cOQRULBAnfv2KakRfrsqaU1PDSkO4Co9Vyxc +#paypal.receiver.email=kimwong@code-create.com.hk +#paypal.mode=live #paypal.webhook_id=41L14847MC833625B -paypal.webhook_id=1D107312EX592781K \ No newline at end of file +#paypal.webhook_id=1D107312EX592781K \ No newline at end of file From fc48d8931f9413430d1aa38f872ba9aca822dfe2 Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 12 Jun 2024 11:27:21 +0800 Subject: [PATCH 10/79] =?UTF-8?q?=E8=A1=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/python/vo/DesignPythonItemElement.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/com/ai/da/python/vo/DesignPythonItemElement.java diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItemElement.java b/src/main/java/com/ai/da/python/vo/DesignPythonItemElement.java new file mode 100644 index 00000000..f3a790dc --- /dev/null +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItemElement.java @@ -0,0 +1,24 @@ +package com.ai.da.python.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class DesignPythonItemElement { + + @ApiModelProperty("print的位置 传 [[0.2, 0.2]]") + private List> location; + + private List element_path_list; + + @ApiModelProperty("print的缩放比例 传 [0.2, 0.2]") + private List element_scale_list; + + @ApiModelProperty("print的旋转角度 传 [0.2, 0.2]") + private List element_angle_list; + + public DesignPythonItemElement() { + } +} From 18914bea7e1dc55e989a2d2f70fb1144806b04cf Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 17 Jun 2024 09:34:48 +0800 Subject: [PATCH 11/79] TASK:aida; --- .../com/ai/da/common/RabbitMQ/MQConfig.java | 8 +- .../ai/da/common/config/MyTaskScheduler.java | 4 +- .../security/filter/AuthenticationFilter.java | 5 +- .../com/ai/da/common/task/PaypalTask.java | 2 +- .../com/ai/da/common/utils/RedisUtil.java | 36 ++++++ .../com/ai/da/common/utils/SendEmailUtil.java | 31 +++++ .../ai/da/controller/AccountController.java | 8 ++ .../ai/da/controller/PortfolioController.java | 36 +++++- .../controller/SavedCollectionController.java | 6 + .../ai/da/mapper/primary/AccountMapper.java | 2 +- .../ai/da/mapper/primary/CommentMapper.java | 7 ++ .../ai/da/mapper/primary/entity/Account.java | 2 + .../ai/da/mapper/primary/entity/Comment.java | 38 ++++++ .../dto/AccountDesignWorksRegisterDTO.java | 1 + .../java/com/ai/da/model/dto/CommentDTO.java | 8 ++ .../com/ai/da/model/dto/CommentPageDTO.java | 9 ++ .../da/model/dto/QueryPortfolioPageDTO.java | 3 + .../ai/da/model/enums/DesignElementsEnum.java | 2 +- .../model/enums/PrintboardLevel2TypeEnum.java | 2 +- .../com/ai/da/model/vo/AccountLoginVO.java | 2 + .../java/com/ai/da/model/vo/CommentVO.java | 15 +++ .../java/com/ai/da/model/vo/PortfolioVO.java | 3 +- .../com/ai/da/model/vo/UserLikeChooseVO.java | 2 + .../com/ai/da/service/AccountService.java | 2 + .../com/ai/da/service/PortfolioService.java | 15 ++- .../ai/da/service/UserLikeGroupService.java | 2 + .../da/service/impl/AccountServiceImpl.java | 48 +++++++- .../impl/CollectionElementServiceImpl.java | 28 ++--- .../da/service/impl/GenerateServiceImpl.java | 1 + .../da/service/impl/LibraryServiceImpl.java | 15 ++- .../da/service/impl/PortfolioServiceImpl.java | 109 +++++++++++++++++- .../impl/UserLikeGroupServiceImpl.java | 22 +++- .../da/service/impl/WorkspaceServiceImpl.java | 16 ++- src/main/resources/application-dev.properties | 6 +- src/main/resources/application.properties | 4 +- 35 files changed, 454 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/ai/da/mapper/primary/CommentMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/Comment.java create mode 100644 src/main/java/com/ai/da/model/dto/CommentDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/CommentPageDTO.java create mode 100644 src/main/java/com/ai/da/model/vo/CommentVO.java diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 6d9e54ae..16d3c19f 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -12,16 +12,16 @@ public class MQConfig { // public static final String GENERATE_QUEUE = "generate-queue-test"; // ================================================================== // public static final String GENERATE_QUEUE = "generate-queue-local"; - public static final String GENERATE_QUEUE = "generate-queue-prod"; + public static final String GENERATE_QUEUE = "generate-queue-dev"; // public static final String SR_QUEUE = "SR-queue-local"; - public static final String SR_QUEUE = "SR-queue-prod"; + public static final String SR_QUEUE = "SR-queue-dev"; // public static final String SR_RESULT_QUEUE = "SuperResolution-local"; - public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; + public static final String SR_RESULT_QUEUE = "SuperResolution-dev"; // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; - public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod"; + public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; public MQConfig() { diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index c91d889f..06294584 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -40,7 +40,7 @@ public class MyTaskScheduler { // 定时任务,每十五天执行一次 // @Scheduled(cron = "0 0 0 ? * MON") - @Scheduled(cron = "0 0 0 */15 * ?") +// @Scheduled(cron = "0 0 0 */15 * ?") public void checkExpiry() { // 检测正式用户是否快要过期 QueryWrapper qw = new QueryWrapper<>(); @@ -74,7 +74,7 @@ public class MyTaskScheduler { } } } - @Scheduled(cron = "0 0 8 * * ?") +// @Scheduled(cron = "0 0 8 * * ?") public void sendTrialOrderExcelToManagements() { // 获取前一天日期 LocalDate yesterday = LocalDate.now().minusDays(3); diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index 24f96520..d11877e0 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -48,8 +48,9 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/third/party/addUser","/api/third/party/addTrialUser", "/api/third/party/editUser", "/api/element/initDefaultSysFile", "/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew", "/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl", -// "/api/python/chatStream", - "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify" + "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify", + "/api/portfolio/page", "/api/portfolio/detail", + "/api/account/designWorksRegister" ); @Override diff --git a/src/main/java/com/ai/da/common/task/PaypalTask.java b/src/main/java/com/ai/da/common/task/PaypalTask.java index bc0e24dd..65d5b8a3 100644 --- a/src/main/java/com/ai/da/common/task/PaypalTask.java +++ b/src/main/java/com/ai/da/common/task/PaypalTask.java @@ -23,7 +23,7 @@ public class PaypalTask { @Resource private PayPalCheckoutService payPalCheckoutService; - @Scheduled(cron = "0/30 * * * * ?") +// @Scheduled(cron = "0/30 * * * * ?") public void orderConfirm() throws SerializeException { log.info("PayPal orderConfirm 被执行......"); diff --git a/src/main/java/com/ai/da/common/utils/RedisUtil.java b/src/main/java/com/ai/da/common/utils/RedisUtil.java index ef67de8f..82cf1fd8 100644 --- a/src/main/java/com/ai/da/common/utils/RedisUtil.java +++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java @@ -7,10 +7,12 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Slf4j @Component @@ -164,4 +166,38 @@ public class RedisUtil { redisTemplate.delete(key); } + public final static String PORTFOLIO_LIKE_KEY = "portfolio:like:"; + + public void likePost(Long portfolioId, Long userId) { + redisTemplate.opsForSet().add(PORTFOLIO_LIKE_KEY + portfolioId, String.valueOf(userId)); + } + + public Long getLikeCount(Long portfolioId) { + String key = PORTFOLIO_LIKE_KEY + portfolioId; + return redisTemplate.opsForSet().size(key); + } + + public List getLikedPortfolios(Long userId) { + Set likedPortfolios = redisTemplate.keys(PORTFOLIO_LIKE_KEY + "*"); + + if (likedPortfolios == null || likedPortfolios.isEmpty()) { + return new ArrayList<>(); + } + + return likedPortfolios.stream() + .filter(key -> redisTemplate.opsForSet().isMember(key, userId.toString())) + .map(key -> Long.valueOf(key.replace(PORTFOLIO_LIKE_KEY, ""))) + .collect(Collectors.toList()); + } + + public void unLikePost(Long portfolioId, Long userId) { + redisTemplate.opsForSet().remove(PORTFOLIO_LIKE_KEY + portfolioId, userId.toString()); + } + + // 检查用户是否喜欢某个作品 + public boolean isPostLikedByUser(Long portfolioId, Long userId) { + String key = PORTFOLIO_LIKE_KEY + portfolioId; + Boolean isMember = redisTemplate.opsForSet().isMember(key, userId.toString()); + return isMember != null && isMember; + } } diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index f8f08e9f..1e7b4a1d 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -451,6 +451,37 @@ public class SendEmailUtil { } + public static Boolean designWorksRegister(String userEmail, String randomVerifyCode) { + try { + // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密 + // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + SendEmailRequest req = new SendEmailRequest(); + req.setFromEmailAddress(SEND_ADDRESS); + req.setDestination(new String[]{userEmail}); + String subject = "注册"; + req.setSubject(subject); + req.setTemplate(contractTemplate(LOGIN_TEMPLATE_ID, randomVerifyCode, null)); + + // 返回的resp是一个SendEmailResponse的实例,与请求对象对应 + SendEmailResponse resp = client.SendEmail(req); + // 输出json格式的字符串回包 + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + return Boolean.TRUE; + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } } diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 58a58a29..48769e5c 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -154,9 +154,17 @@ public class AccountController { return Response.success(true); } + @CrossOrigin @ApiOperation(value = "广场用户注册") @PostMapping("/designWorksRegister") public Response designWorksRegister(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { return Response.success(accountService.designWorksRegister(accountDesignWorksRegisterDTO)); } + + @CrossOrigin + @ApiOperation(value = "广场用户注册") + @PostMapping("/designWorksRegisterCode") + public Response designWorksRegisterCode(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { + return Response.success(accountService.designWorksRegisterCode(accountDesignWorksRegisterDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java index b8bd3193..4f8041b5 100644 --- a/src/main/java/com/ai/da/controller/PortfolioController.java +++ b/src/main/java/com/ai/da/controller/PortfolioController.java @@ -2,11 +2,11 @@ package com.ai.da.controller; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; -import com.ai.da.model.dto.DesignWorksRegisterDTO; -import com.ai.da.model.dto.PortfolioDTO; -import com.ai.da.model.dto.QueryPortfolioPageDTO; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.CommentVO; import com.ai.da.model.vo.PortfolioVO; import com.ai.da.model.vo.UserLikeChooseVO; +import com.ai.da.model.vo.UserLikeGroupVO; import com.ai.da.service.PortfolioService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -63,4 +63,34 @@ public class PortfolioController { public Response designWorksRegister(@Valid @RequestBody DesignWorksRegisterDTO designWorksRegisterDTO) { return Response.success(portfolioService.designWorksRegister(designWorksRegisterDTO)); } + + @ApiOperation(value = "喜欢") + @GetMapping("/like") + public Response like(@RequestParam("id") Long id) { + return Response.success(portfolioService.like(id)); + } + + @ApiOperation(value = "不喜欢") + @GetMapping("/unlike") + public Response unlike(@RequestParam("id") Long id) { + return Response.success(portfolioService.unlike(id)); + } + + @ApiOperation(value = "获取点赞数") + @GetMapping("/getLikeCount") + public Response getLikeCount(@RequestParam("id") Long id) { + return Response.success(portfolioService.getLikeCount(id)); + } + + @ApiOperation(value = "评论") + @PostMapping("/comment") + public Response comment(@Valid @RequestBody CommentDTO commentDTO) { + return Response.success(portfolioService.comment(commentDTO)); + } + + @ApiOperation(value = "评论列表") + @PostMapping("/commentPage") + public Response> commentPage(@Valid @RequestBody CommentPageDTO commentPageDTO) { + return Response.success(portfolioService.commentPage(commentPageDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index 5ce6303f..5b467720 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -188,6 +188,12 @@ public class SavedCollectionController { return Response.success(userLikeGroupService.productImageLike(productImageLikeDTO)); } + @ApiOperation(value = "productImageUnLike") + @PostMapping("/productImageUnLike") + public Response productImageUnLike(@Valid @RequestBody ProductImageLikeDTO productImageLikeDTO) { + return Response.success(userLikeGroupService.productImageUnLike(productImageLikeDTO)); + } + @ApiOperation(value = "获取生成结果") @PostMapping("/toProductImageResult") public Response> getToProductImageResult(@Valid @RequestBody List taskIdList) { diff --git a/src/main/java/com/ai/da/mapper/primary/AccountMapper.java b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java index d9afae89..05fb735f 100644 --- a/src/main/java/com/ai/da/mapper/primary/AccountMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java @@ -27,6 +27,6 @@ public interface AccountMapper extends CommonMapper { * @param id * @return */ - Account findById(String id); +// Account findById(String id); } diff --git a/src/main/java/com/ai/da/mapper/primary/CommentMapper.java b/src/main/java/com/ai/da/mapper/primary/CommentMapper.java new file mode 100644 index 00000000..57ec711f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CommentMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Comment; + +public interface CommentMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Account.java b/src/main/java/com/ai/da/mapper/primary/entity/Account.java index ad574fe7..025f49ef 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Account.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Account.java @@ -86,4 +86,6 @@ public class Account implements Serializable { * 积分 */ private BigDecimal credits; + + private Integer SystemUser; } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Comment.java b/src/main/java/com/ai/da/mapper/primary/entity/Comment.java new file mode 100644 index 00000000..1d6e65d1 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Comment.java @@ -0,0 +1,38 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("comment") +public class Comment implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long portfolioId; + + private Long accountId; + + private String comment; + + // 一级父节点ID + private Long parentLevel1Id; + + // 二级父节点ID + private Long parentLevel2Id; + + private LocalDateTime createTime; + + private Integer isDeleted; +} diff --git a/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java b/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java index ab99249e..db2dac3b 100644 --- a/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java +++ b/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java @@ -5,4 +5,5 @@ import lombok.Data; @Data public class AccountDesignWorksRegisterDTO extends Account { + private String emailVerifyCode; } diff --git a/src/main/java/com/ai/da/model/dto/CommentDTO.java b/src/main/java/com/ai/da/model/dto/CommentDTO.java new file mode 100644 index 00000000..06dca97f --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CommentDTO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.dto; + +import com.ai.da.mapper.primary.entity.Comment; +import lombok.Data; + +@Data +public class CommentDTO extends Comment { +} diff --git a/src/main/java/com/ai/da/model/dto/CommentPageDTO.java b/src/main/java/com/ai/da/model/dto/CommentPageDTO.java new file mode 100644 index 00000000..c78e4852 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CommentPageDTO.java @@ -0,0 +1,9 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +import lombok.Data; + +@Data +public class CommentPageDTO extends PageQueryBaseVo { + private Long portfolioId; +} diff --git a/src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java index 8694035b..8176ba00 100644 --- a/src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java +++ b/src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java @@ -11,4 +11,7 @@ import java.util.List; @ApiModel("作品集分页查询") public class QueryPortfolioPageDTO extends PageQueryBaseVo { + private Integer getMyPortfolio; + + private Integer getLikePortfolio; } diff --git a/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java b/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java index 5b2547a5..fb860781 100644 --- a/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java +++ b/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java @@ -45,7 +45,7 @@ public enum DesignElementsEnum implements IEnumDisplay { } public static DesignElementsEnum fromName(String name) { for (DesignElementsEnum designElement : DesignElementsEnum.values()) { - if (designElement.name().equals(name)) { + if (designElement.english.equals(name)) { return designElement; } } diff --git a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java index 338a1f0b..2bffc94a 100644 --- a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java +++ b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java @@ -41,7 +41,7 @@ public enum PrintboardLevel2TypeEnum implements IEnumDisplay { // 根据名称获取枚举值 public static PrintboardLevel2TypeEnum fromName(String name) { for (PrintboardLevel2TypeEnum designElement : PrintboardLevel2TypeEnum.values()) { - if (designElement.name().equals(name)) { + if (designElement.english.equals(name)) { return designElement; } } diff --git a/src/main/java/com/ai/da/model/vo/AccountLoginVO.java b/src/main/java/com/ai/da/model/vo/AccountLoginVO.java index ff4c9690..15b28c89 100644 --- a/src/main/java/com/ai/da/model/vo/AccountLoginVO.java +++ b/src/main/java/com/ai/da/model/vo/AccountLoginVO.java @@ -32,4 +32,6 @@ public class AccountLoginVO { @ApiModelProperty("是否完成引导") private Integer isBeginner; + private Integer systemUser; + } diff --git a/src/main/java/com/ai/da/model/vo/CommentVO.java b/src/main/java/com/ai/da/model/vo/CommentVO.java new file mode 100644 index 00000000..dda6474f --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/CommentVO.java @@ -0,0 +1,15 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.Comment; +import lombok.Data; + +import java.util.List; + +@Data +public class CommentVO extends Comment { + private List childCommentVOList; + + private String userName; + + private String replyTo; +} diff --git a/src/main/java/com/ai/da/model/vo/PortfolioVO.java b/src/main/java/com/ai/da/model/vo/PortfolioVO.java index 96ed1d94..030e6d16 100644 --- a/src/main/java/com/ai/da/model/vo/PortfolioVO.java +++ b/src/main/java/com/ai/da/model/vo/PortfolioVO.java @@ -10,7 +10,8 @@ import java.util.List; @Data public class PortfolioVO extends Portfolio { private String canvasUrl; - + private Long likeNum; private List collectionElementList; private List designPythonOutfitList; + private Integer isLike; } diff --git a/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java b/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java index 91de0dce..69dc235e 100644 --- a/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java +++ b/src/main/java/com/ai/da/model/vo/UserLikeChooseVO.java @@ -22,4 +22,6 @@ public class UserLikeChooseVO { private UserLikeCollectionVO collection; private String sex; + + private Integer beenPublished; } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index ac30940a..496275ce 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -132,4 +132,6 @@ public interface AccountService extends IService { void updateCredits(Long accountId, String value); Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); + + AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); } diff --git a/src/main/java/com/ai/da/service/PortfolioService.java b/src/main/java/com/ai/da/service/PortfolioService.java index 582406c2..0714ae69 100644 --- a/src/main/java/com/ai/da/service/PortfolioService.java +++ b/src/main/java/com/ai/da/service/PortfolioService.java @@ -2,9 +2,8 @@ package com.ai.da.service; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.mapper.primary.entity.Portfolio; -import com.ai.da.model.dto.DesignWorksRegisterDTO; -import com.ai.da.model.dto.PortfolioDTO; -import com.ai.da.model.dto.QueryPortfolioPageDTO; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.CommentVO; import com.ai.da.model.vo.PortfolioVO; import com.ai.da.model.vo.UserLikeChooseVO; import com.baomidou.mybatisplus.extension.service.IService; @@ -22,4 +21,14 @@ public interface PortfolioService extends IService { UserLikeChooseVO choose(PortfolioDTO portfolioDTO); Boolean designWorksRegister(DesignWorksRegisterDTO designWorksRegisterDTO); + + Boolean like(Long id); + + Boolean comment(CommentDTO commentDTO); + + PageBaseResponse commentPage(CommentPageDTO commentPageDTO); + + Boolean unlike(Long id); + + Long getLikeCount(Long id); } diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index a8316142..05837ef4 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -54,4 +54,6 @@ public interface UserLikeGroupService extends IService { CanvasElementUpload canvasElementUpload(MultipartFile file); List productImageLikeList(ToProductImageDTO toProductImageDTO); + + Boolean productImageUnLike(ProductImageLikeDTO productImageLikeDTO); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index d5702f71..6a6fb2f0 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -178,6 +178,7 @@ public class AccountServiceImpl extends ServiceImpl impl response.setToken(createAccountToken(account)); } response.setUserId(account.getId()); + response.setSystemUser(account.getSystemUser()); //判断是否常用ip 不是则发邮件提示 calculateExceptionIp(RequestInfoUtil.getIpAddress(request), account); return response; @@ -378,6 +379,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setValidEndTime(Long.valueOf(accountAddDTO.getValidEndTime())); account.setCreateDate(new Date()); account.setIsTrial(accountAddDTO.getIsTrial()); + account.setSystemUser(1); return accountMapper.insert(account) > 0; } @@ -539,6 +541,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setCreateDate(new Date()); account.setIsTrial(1); account.setIsBeginner(1); + account.setSystemUser(1); accountMapper.insert(account); } // 发送邮件提醒用户试用用户已创建 @@ -591,6 +594,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setCreateDate(new Date()); account.setIsTrial(1); account.setIsBeginner(1); + account.setSystemUser(1); accountMapper.insert(account); } // 发送邮件提醒用户试用用户已创建 @@ -668,6 +672,7 @@ public class AccountServiceImpl extends ServiceImpl impl newAccount.setLanguage(Language.ENGLISH.name()); // 插入新账户 + newAccount.setSystemUser(1); accountMapper.insert(newAccount); return Boolean.TRUE; @@ -826,6 +831,7 @@ public class AccountServiceImpl extends ServiceImpl impl newAccount.setLanguage(Language.ENGLISH.name()); // 插入新账户 + newAccount.setSystemUser(1); accountMapper.insert(newAccount); return "\n" + @@ -946,8 +952,48 @@ public class AccountServiceImpl extends ServiceImpl impl if (CollectionUtil.isNotEmpty(accountList)) { throw new BusinessException("The email has already been registered"); } + + String randomVerifyCode = RandomsUtil.generateVerifyCode(100000L, 999999L); + LocalCacheUtils.setVerifyCodeCache("DesignWorksRegister"+ "_" + accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); + + Boolean b = SendEmailUtil.designWorksRegister(accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); + if (!b) { + throw new BusinessException("failed.to.send.mail"); + } + return Boolean.TRUE; + } + + @Override + public AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { + + String verifyCode = LocalCacheUtils.getVerifyCodeCache("DesignWorksRegister"+ "_" + accountDesignWorksRegisterDTO.getUserEmail()); + if (StringUtils.isBlank(verifyCode)) { + throw new BusinessException("the.verification.code.has.expired", ResultEnum.PROMPT.getCode()); + } + if (!verifyCode.equals(accountDesignWorksRegisterDTO.getEmailVerifyCode())) { + throw new BusinessException("verification.code.error", ResultEnum.PROMPT.getCode()); + } Account account = CopyUtil.copyObject(accountDesignWorksRegisterDTO, Account.class); + account.setSystemUser(0); + if (StringUtils.isBlank(accountDesignWorksRegisterDTO.getLanguage())) { + account.setLanguage(Language.ENGLISH.name()); + } + account.setIsTrial(1); + account.setIsBeginner(1); + account.setCreateDate(new Date()); + account.setCredits(BigDecimal.valueOf(500)); accountMapper.insert(account); - return null; + AccountLoginVO response = CopyUtil.copyObject(account, AccountLoginVO.class); + response.setEmail(account.getUserEmail()); + String token = LocalCacheUtils.getTokenCache(String.valueOf(account.getId())); + if (StringUtils.isNotBlank(token)) { + //用户已登入 + response.setToken(token); + } else { + response.setToken(createAccountToken(account)); + } + response.setUserId(account.getId()); + response.setSystemUser(account.getSystemUser()); + return response; } } diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index ac6f5d82..10b547c7 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -351,20 +351,20 @@ public class CollectionElementServiceImpl extends ServiceImpl colorBoards = elementVO.getColorBoards(); -// for (CollectionColorDTO colorBoard : colorBoards) { -// if (Objects.nonNull(colorBoard.getGradient())) { -// String colorImg = colorBoard.getGradient().getColorImg(); -// String[] parts = colorImg.split(","); -// String imageType = parts[0].split("/")[1].split(";")[0]; -// String base64Data = parts[1]; -// String gradientMinioUrl = minioUtil.uploadImageFromBase64(gradientBucketName, base64Data, imageType); -// colorBoard.setGradientMinioUrl(gradientMinioUrl); -// colorBoard.getGradient().setColorImg(null); -// colorBoard.setGradientString(JSON.toJSONString(colorBoard.getGradient())); -// } -// } -// elementVO.setColorBoards(colorBoards); + List colorBoards = elementVO.getColorBoards(); + for (CollectionColorDTO colorBoard : colorBoards) { + if (Objects.nonNull(colorBoard.getGradient())) { + String colorImg = colorBoard.getGradient().getColorImg(); + String[] parts = colorImg.split(","); + String imageType = parts[0].split("/")[1].split(";")[0]; + String base64Data = parts[1]; + String gradientMinioUrl = minioUtil.uploadImageFromBase64(gradientBucketName, base64Data, imageType); + colorBoard.setGradientMinioUrl(gradientMinioUrl); + colorBoard.getGradient().setColorImg(null); + colorBoard.setGradientString(JSON.toJSONString(colorBoard.getGradient())); + } + } + elementVO.setColorBoards(colorBoards); List usedElementIds = elementVO.getUsedElementIds(); List libraryCollectionElements = elementVO.getLibraryCollectionElements(); List generateCollectionElements = elementVO.getGenerateCollectionElements(); 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 0d36ff5d..98efcc9d 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -22,6 +22,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.gson.Gson; import io.minio.errors.MinioException; 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 275f37e7..a6b0b3c8 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -116,7 +116,9 @@ public class LibraryServiceImpl extends ServiceImpl impl AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); // 分页数据 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("account_id", authPrincipalVo.getId()); + if (!query.getLevel1Type().equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS.getRealName())) { + queryWrapper.eq("account_id", authPrincipalVo.getId()); + } if (!StringUtils.isEmpty(query.getLevel1Type())) { LibraryLevel1TypeEnum level1TypeEnum = LibraryLevel1TypeEnum.uploadOf(query.getLevel1Type()); @@ -211,13 +213,20 @@ public class LibraryServiceImpl extends ServiceImpl impl if (finalMap != null && finalMap.containsKey(library.getId())) { libraryPageVO.setLibraryModelPoint(finalMap.get(library.getId())); } - if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName()) - || libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.PRINT_BOARD.getRealName())) { + if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) { if (!StringUtils.isEmpty(libraryPageVO.getLevel2Type())) { Position position = Position.getPosition(libraryPageVO.getLevel2Type()); libraryPageVO.setLevel2TypeEnum(new BizJson(position.getValue(), position.name(), BusinessException.getMessageFromResource(position.name()))); } } + if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.PRINT_BOARD.getRealName())) { + PrintboardLevel2TypeEnum printboardLevel2TypeEnum = PrintboardLevel2TypeEnum.fromName(libraryPageVO.getLevel2Type()); + libraryPageVO.setLevel2TypeEnum(new BizJson(printboardLevel2TypeEnum.getValue(), printboardLevel2TypeEnum.name(), BusinessException.getMessageFromResource(printboardLevel2TypeEnum.name()))); + } + if (libraryPageVO.getLevel1Type().equals(LibraryLevel1TypeEnum.DESIGN_ELEMENTS.getRealName())) { + DesignElementsEnum designElementsEnum = DesignElementsEnum.fromName(libraryPageVO.getLevel2Type()); + libraryPageVO.setLevel2TypeEnum(new BizJson(designElementsEnum.getValue(), designElementsEnum.name(), BusinessException.getMessageFromResource(designElementsEnum.name()))); + } return libraryPageVO; }); return PageBaseResponse.success(convert); diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index f5a6da79..d3c91007 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -5,11 +5,10 @@ import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; +import com.ai.da.common.utils.RedisUtil; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; -import com.ai.da.model.dto.DesignWorksRegisterDTO; -import com.ai.da.model.dto.PortfolioDTO; -import com.ai.da.model.dto.QueryPortfolioPageDTO; +import com.ai.da.model.dto.*; import com.ai.da.model.enums.Position; import com.ai.da.model.enums.Sex; import com.ai.da.model.vo.*; @@ -91,6 +90,9 @@ public class PortfolioServiceImpl extends ServiceImpl page(QueryPortfolioPageDTO query) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); QueryWrapper qw = new QueryWrapper<>(); + if (query.getGetMyPortfolio() == 1) { + qw.lambda().eq(Portfolio::getAccountId, userHolder.getId()); + } + if (query.getGetLikePortfolio() == 1) { + List likedPortfolioIdList = redisUtil.getLikedPortfolios(userHolder.getId()); + if (!CollectionUtils.isEmpty(likedPortfolioIdList)) { + qw.lambda().in(Portfolio::getId, likedPortfolioIdList); + } + } qw.lambda().orderByDesc(Portfolio::getUpdateDate); IPage page = portfolioMapper.selectPage(new Page<>(query.getPage(), query.getSize()),qw); IPage convert = page.convert((Function) portfolio -> { @@ -373,6 +387,7 @@ public class PortfolioServiceImpl extends ServiceImpl commentPage(CommentPageDTO commentPageDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Comment::getPortfolioId, commentPageDTO.getPortfolioId()); + qw.lambda().eq(Comment::getParentLevel1Id, 0L); + qw.lambda().orderByDesc(Comment::getCreateTime); + Page commentPage = commentMapper.selectPage(new Page<>(commentPageDTO.getPage(), commentPageDTO.getSize()), qw); + IPage convert = commentPage.convert(o -> { + CommentVO commentVO = CopyUtil.copyObject(o, CommentVO.class); + commentVO.setUserName(accountMapper.selectById(commentVO.getAccountId()).getUserName()); + List childList = getChildCommentVOList(commentVO.getId()); + if (!CollectionUtils.isEmpty(childList)) { + commentVO.setChildCommentVOList(childList); + } + return commentVO; + }); + return PageBaseResponse.success(convert); + } + + @Override + public Boolean unlike(Long id) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + redisUtil.unLikePost(id, userHolder.getId()); + return Boolean.TRUE; + } + + @Override + public Long getLikeCount(Long id) { + return redisUtil.getLikeCount(id); + } + + private List getChildCommentVOList(Long id) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Comment::getParentLevel1Id, id); + qw.lambda().orderByDesc(Comment::getCreateTime); + List comments = commentMapper.selectList(qw); + if (CollectionUtils.isEmpty(comments)) { + return new ArrayList<>(); + } + List resultList = new ArrayList<>(); + for (Comment comment : comments) { + CommentVO commentVO = CopyUtil.copyObject(comment, CommentVO.class); + commentVO.setUserName(accountMapper.selectById(commentVO.getAccountId()).getUserName()); + if (null != commentVO.getParentLevel2Id()) { + Comment comment1 = commentMapper.selectById(commentVO.getParentLevel2Id()); + commentVO.setReplyTo(accountMapper.selectById(comment1.getAccountId()).getUserName()); + } + resultList.add(commentVO); + } +// List commentVOS = CopyUtil.copyList(comments, CommentVO.class); +// for (CommentVO commentVO : commentVOS) { +// List childCommentVOList = getChildCommentVOList(commentVO.getId()); +// if (!CollectionUtils.isEmpty(childCommentVOList)) { +// commentVO.setChildCommentVOList(childCommentVOList); +// } +// } + return resultList; + } } diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index a4d57bdd..b7bd7505 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -73,6 +73,8 @@ public class UserLikeGroupServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.lambda().eq(Portfolio::getUserLikeGroupSourceId, userGroupId); + List portfolios = portfolioMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(portfolios)) { + beenPublished = 1; + } + return new UserLikeChooseVO(userGroupId, userLikeVOS, userLikeCollection, sex, beenPublished); } @Override @@ -385,6 +394,17 @@ public class UserLikeGroupServiceImpl extends ServiceImpl toProductImageResultId = productImageLikeDTO.getToProductImageResultId(); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().in(ToProductImageResult::getId, toProductImageResultId); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setIsLike(0); + toProductImageResultMapper.update(toProductImageResult, qw); + return Boolean.TRUE; + } + public static String convert(InputStream inputStream) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { return reader.lines().collect(Collectors.joining("\n")); diff --git a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java index 2d9fea7f..da3f28e3 100644 --- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java @@ -140,7 +140,7 @@ public class WorkspaceServiceImpl extends ServiceImpl qwOld = new QueryWrapper<>(); qwOld.lambda().eq(Workspace::getAccountId, accountId); @@ -305,6 +306,19 @@ public class WorkspaceServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.lambda().eq(WorkspaceRelStyle::getWorkspaceId, vo.getId()); + List workspaceRelStyles = workspaceRelStyleMapper.selectList(qw); + if (!CollectionUtils.isEmpty(workspaceRelStyles)) { + Long styleId = workspaceRelStyles.get(0).getStyleId(); + Style style = styleMapper.selectById(styleId); + StyleEnum styleEnum = StyleEnum.fromName(style.getName()); + if (authPrincipalVo.getLanguage().equals(Language.ENGLISH.name())) { + vo.setStyleName(styleEnum.getEnglish()); + }else { + vo.setStyleName(styleEnum.getChinese()); + } + } return vo; } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 9755f3a0..2a531030 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -57,6 +57,8 @@ minio.bucketName.sysImage=aida-sys-image minio.bucketName.users=aida-users minio.bucketName.collectionElement=aida-collection-element minio.bucketName.gradient=aida-gradient +minio.bucketName.modifiedSketch=aida-modified-sketch +minio.bucketName.slogan=aida-slogan redirect_url=http://18.167.251.121:7788 spring.rabbitmq.host=18.167.251.121 @@ -65,8 +67,8 @@ spring.rabbitmq.username=rabbit spring.rabbitmq.password=123456 spring.rabbitmq.virtual-host=/ -spring.redis.host=172.31.11.32 -#spring.redis.host=18.167.251.121 +#spring.redis.host=172.31.11.32 +spring.redis.host=18.167.251.121 spring.redis.port=6379 spring.redis.database=1 spring.redis.password=Aidlab diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8550475d..974fee23 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #spring.profiles.active=test #����application-prod�ļ�(��������) -spring.profiles.active=prod +#spring.profiles.active=prod #����application-dev�ļ�(��������) -#spring.profiles.active=dev +spring.profiles.active=dev From 375f71772152f155ab9acaa2aa1157ad4685b54c Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 17 Jun 2024 09:43:59 +0800 Subject: [PATCH 12/79] TASK:aida; --- src/main/resources/application-dev.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 2a531030..70ba01a1 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -67,8 +67,8 @@ spring.rabbitmq.username=rabbit spring.rabbitmq.password=123456 spring.rabbitmq.virtual-host=/ -#spring.redis.host=172.31.11.32 -spring.redis.host=18.167.251.121 +spring.redis.host=172.31.11.32 +#spring.redis.host=18.167.251.121 spring.redis.port=6379 spring.redis.database=1 spring.redis.password=Aidlab From 0017568cc7de6b740b76ba57c26260ac7b6ac771 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 10:21:49 +0800 Subject: [PATCH 13/79] slogan --- .../da/common/RabbitMQ/GenerateConsumer.java | 2 +- .../com/ai/da/common/RabbitMQ/MQConfig.java | 23 +++++++++++-------- .../ai/da/common/constant/CommonConstant.java | 8 ++++++- .../java/com/ai/da/python/PythonService.java | 8 +++---- .../da/service/impl/GenerateServiceImpl.java | 9 ++++++-- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index d201a3ee..14c8cae5 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -72,7 +72,7 @@ public class GenerateConsumer { try { generateService.generateThroughImageText(generateThroughImageTextDTO); }catch (Exception e){ - log.error(e.getMessage()); + log.error("error message : {}", e.getMessage()); } // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 6d9e54ae..40f1d522 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -12,18 +12,23 @@ public class MQConfig { // public static final String GENERATE_QUEUE = "generate-queue-test"; // ================================================================== // public static final String GENERATE_QUEUE = "generate-queue-local"; - public static final String GENERATE_QUEUE = "generate-queue-prod"; - + public static final String GENERATE_QUEUE = "generate-queue-dev"; +// public static final String GENERATE_QUEUE = "generate-queue-prod"; +// // public static final String SR_QUEUE = "SR-queue-local"; - public static final String SR_QUEUE = "SR-queue-prod"; - + public static final String SR_QUEUE = "SR-queue-dev"; +// public static final String SR_QUEUE = "SR-queue-prod"; +// // public static final String SR_RESULT_QUEUE = "SuperResolution-local"; - public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; - + public static final String SR_RESULT_QUEUE = "SuperResolution-dev"; +// public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; +// // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; - public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod"; - - public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; + public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; +// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod"; +// +// public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; + public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-dev"; public MQConfig() { } 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 0bc1af58..3fbee692 100644 --- a/src/main/java/com/ai/da/common/constant/CommonConstant.java +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -21,6 +21,12 @@ public class CommonConstant { public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo"; - public static final String GENERATE_SLOGAN = "/api/slogan"; + public static final String GENERATE_SLOGAN = "/apislogan"; + + public static final String PYTHON_PORT_9996 = "9996"; + + public static final String PYTHON_PORT_9997 = "9997"; + + } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 37453c05..5a084a06 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2977,7 +2977,7 @@ public class PythonService { throw new BusinessException("system error!"); } - public Boolean generateSketchOrPrint(String params, String servicePath) { + public Boolean generateSketchOrPrint(String params, String port, String servicePath) { //限流校验 // AccessLimitUtils.validate("generateSketchOrPrint", 5); OkHttpClient client = new OkHttpClient().newBuilder() @@ -2994,7 +2994,7 @@ public class PythonService { // .url("http://127.0.0.1:5000/api/diffusion") // .url(accessPythonIp + ":" + accessPythonPort + "/api/diffusion") // .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_image") - .url(fastApiPythonAddress + servicePath) + .url(accessPythonIp + ":" + port + servicePath) .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") @@ -3259,8 +3259,8 @@ public class PythonService { String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); RequestBody body = RequestBody.create(mediaType, jsonString); Request request = new Request.Builder() - .url(accessPythonIp + ":" + accessPythonPort + "/api/translateToEN") -// .url(fastApiPythonAddress + "/api/translateToEN") +// .url(accessPythonIp + ":" + accessPythonPort + "/api/translateToEN") + .url(fastApiPythonAddress + "/api/translateToEN") .method("POST", body) .addHeader("Content-Type", "application/json") .build(); 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 0d36ff5d..2b0f40b3 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -142,6 +142,7 @@ public class GenerateServiceImpl extends ServiceImpl i String category = generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName()) ? "sketch" : generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName()) ? "print" : "moodboard"; String path = CommonConstant.GENERATE_PATH; + String port = CommonConstant.PYTHON_PORT_9996; String jsonString = ""; HashMap params = new HashMap<>(); // 3.1 确定不同类型的印花分别调哪个接口 @@ -156,9 +157,11 @@ public class GenerateServiceImpl extends ServiceImpl i break; case "Slogan": path = CommonConstant.GENERATE_SLOGAN; + port = CommonConstant.PYTHON_PORT_9997; + params.put("num_point","16"); params.put("tasks_id",generateThroughImageTextDTO.getUniqueId()); params.put("prompt", text); - params.put("svg", collectionElement.getUrl()); + params.put("image_url", collectionElement.getUrl()); jsonString = JSON.toJSONString(params, SerializerFeature.WriteMapNullValue); break; case "Pattern": @@ -172,7 +175,7 @@ public class GenerateServiceImpl extends ServiceImpl i jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue); } - Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, path); + Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, port, path); // 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中 save(generate); @@ -524,8 +527,10 @@ public class GenerateServiceImpl extends ServiceImpl i throw new BusinessException("Slogan can not be empty!"); } + times = 1; // 将图片上传到图片服务器 String path = minioUtil.base64UploadToPath(generateThroughImageTextDTO.getSloganBase64(), sloganBucket, null); +// String path = "test/7c9114f93d08a702e00da928e66f321.png"; String name = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); // 保存到db,collection-element CollectionElement collectionElement = new CollectionElement(); From b5b6f737aa265351f1a2990935c071444e8e3601 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 10:41:36 +0800 Subject: [PATCH 14/79] =?UTF-8?q?slogan=20=E6=9A=82=E5=81=9C=E7=9B=91?= =?UTF-8?q?=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java | 2 +- src/main/java/com/ai/da/python/PythonService.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index eb0af5cc..c3892a66 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -24,7 +24,7 @@ public class MQConfig { // public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; // // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; - public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; +// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; public MQConfig() { diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 5a084a06..9ab7c05c 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2989,6 +2989,8 @@ public class PythonService { MediaType mediaType = MediaType.parse("application/json"); // RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue)); RequestBody body = RequestBody.create(mediaType, params); + + log.info("generate 请求地址: {}", accessPythonIp + ":" + port + servicePath); Request request = new Request.Builder() // .url("http://18.167.251.121:9992") // .url("http://127.0.0.1:5000/api/diffusion") From dbd89798d5b7ccc54f6220bfffeacf518fc488b7 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 10:42:45 +0800 Subject: [PATCH 15/79] =?UTF-8?q?slogan=20=E6=9A=82=E5=81=9C=E7=9B=91?= =?UTF-8?q?=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index c3892a66..903513ea 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -11,8 +11,8 @@ public class MQConfig { // public static final String GENERATE_QUEUE = "generate-queue-prod"; // public static final String GENERATE_QUEUE = "generate-queue-test"; // ================================================================== -// public static final String GENERATE_QUEUE = "generate-queue-local"; - public static final String GENERATE_QUEUE = "generate-queue-dev"; + public static final String GENERATE_QUEUE = "generate-queue-local"; +// public static final String GENERATE_QUEUE = "generate-queue-dev"; // public static final String GENERATE_QUEUE = "generate-queue-prod"; // // public static final String SR_QUEUE = "SR-queue-local"; @@ -23,7 +23,7 @@ public class MQConfig { public static final String SR_RESULT_QUEUE = "SuperResolution-dev"; // public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; // -// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; + public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; From 5e1ff16052c6046bb1bdef3ecb6a26d9d3f44da2 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 10:51:35 +0800 Subject: [PATCH 16/79] =?UTF-8?q?slogan=20=E6=9A=82=E5=81=9C=E7=9B=91?= =?UTF-8?q?=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 903513ea..eb0af5cc 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -11,8 +11,8 @@ public class MQConfig { // public static final String GENERATE_QUEUE = "generate-queue-prod"; // public static final String GENERATE_QUEUE = "generate-queue-test"; // ================================================================== - public static final String GENERATE_QUEUE = "generate-queue-local"; -// public static final String GENERATE_QUEUE = "generate-queue-dev"; +// public static final String GENERATE_QUEUE = "generate-queue-local"; + public static final String GENERATE_QUEUE = "generate-queue-dev"; // public static final String GENERATE_QUEUE = "generate-queue-prod"; // // public static final String SR_QUEUE = "SR-queue-local"; @@ -23,8 +23,8 @@ public class MQConfig { public static final String SR_RESULT_QUEUE = "SuperResolution-dev"; // public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; // - public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; -// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; +// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; + public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; public MQConfig() { From 8ff8a7480fa7a2eacc5e17a83ca19f491dc0cbe6 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 11:21:54 +0800 Subject: [PATCH 17/79] =?UTF-8?q?slogan=20=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/python/PythonService.java | 4 +++- .../java/com/ai/da/service/impl/GenerateServiceImpl.java | 6 +++++- src/main/resources/application-dev.properties | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 9ab7c05c..7eb77e1a 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -67,6 +67,8 @@ public class PythonService { private String fastApiPythonAddress; @Value("${minio.bucketName.gradient}") private String gradientBucketName; + @Value("${access.python.generate_sr_port}") + private String srServicePort; @Resource private PythonTAllInfoService pythonTAllInfoService; @@ -3222,7 +3224,7 @@ public class PythonService { String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); RequestBody body = RequestBody.create(mediaType, jsonString); Request request = new Request.Builder() - .url(fastApiPythonAddress + "/api/super_resolution") + .url(accessPythonIp + srServicePort + "/api/super_resolution") .method("POST", body) .addHeader("Content-Type", "application/json") .build(); 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 fbbb9800..f937235f 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -88,6 +88,10 @@ public class GenerateServiceImpl extends ServiceImpl i @Value("${redis.key.toProductImageResultKey}") private String toProductImageResultKey; + @Value("${access.python.generate_sr_port}") + private String generateServicePort; + + @Override public GenerateCaptionVO generateCaption(Long sketchElementId) { CollectionElement collectionElement = collectionElementMapper.selectById(sketchElementId); @@ -143,7 +147,7 @@ public class GenerateServiceImpl extends ServiceImpl i String category = generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName()) ? "sketch" : generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName()) ? "print" : "moodboard"; String path = CommonConstant.GENERATE_PATH; - String port = CommonConstant.PYTHON_PORT_9996; + String port = generateServicePort; String jsonString = ""; HashMap params = new HashMap<>(); // 3.1 确定不同类型的印花分别调哪个接口 diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 70ba01a1..f6224ea9 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -44,7 +44,7 @@ spring.servlet.multipart.max-request-size= 10MB #访问python服务的ip(对应环境) access.python.ip=http://18.167.251.121 access.python.port=9992 -access.python.sr=http://18.167.251.121:9994 +access.python.generate_sr_port=9994 access.python.address=http://18.167.251.121:9996 minio.endpoint=https://www.minio.aida.com.hk:9000 From 257c99698e647bfcd429bafdd8a05700ee3c885a Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 13:21:58 +0800 Subject: [PATCH 18/79] fastapi -> flask --- src/main/java/com/ai/da/python/PythonService.java | 14 ++++++++------ .../ai/da/service/impl/ChatRobotServiceImpl.java | 4 ++-- src/main/resources/application-dev.properties | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 7eb77e1a..9f681376 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2359,8 +2359,8 @@ public class PythonService { log.info("design请求python 参数:####{}", param); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() -// .url(accessPythonIp + ":" + accessPythonPort + "/api/design") - .url(fastApiPythonAddress + "/api/design") + .url(accessPythonIp + ":" + accessPythonPort + "/api/design") +// .url(fastApiPythonAddress + "/api/design") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") @@ -2466,8 +2466,8 @@ public class PythonService { System.out.println(JSON.toJSONString(content)); RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); Request request = new Request.Builder() -// .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_retrieve") - .url(fastApiPythonAddress + "/api/attribute_retrieve") + .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_retrieve") +// .url(fastApiPythonAddress + "/api/attribute_retrieve") // .url(accessPythonIp+":9991/aifda/api/v1.0/attribute_retrieval") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") @@ -3262,9 +3262,11 @@ public class PythonService { String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); RequestBody body = RequestBody.create(mediaType, jsonString); + String path = accessPythonIp + ":" + accessPythonPort + "/api/translateToEN"; + log.info("translateToEN 请求地址: {}", path); Request request = new Request.Builder() -// .url(accessPythonIp + ":" + accessPythonPort + "/api/translateToEN") - .url(fastApiPythonAddress + "/api/translateToEN") + .url(path) +// .url(fastApiPythonAddress + "/api/translateToEN") .method("POST", body) .addHeader("Content-Type", "application/json") .build(); diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index e6ea08c8..fdaecc96 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -152,8 +152,8 @@ public class ChatRobotServiceImpl implements ChatRobotService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() // .url("http://127.0.0.1:5000/api/chat_stream_test") -// .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") - .url(fastApiPythonAddress + "/api/chat_robot") + .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") +// .url(fastApiPythonAddress + "/api/chat_robot") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) .addHeader("Content-Type", "application/json") diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index f6224ea9..e54dd61e 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -45,7 +45,7 @@ spring.servlet.multipart.max-request-size= 10MB access.python.ip=http://18.167.251.121 access.python.port=9992 access.python.generate_sr_port=9994 -access.python.address=http://18.167.251.121:9996 +access.python.address=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin From 2a2c4b1d391ed5945f4b0df963320ed4a9d97c24 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 13:31:44 +0800 Subject: [PATCH 19/79] =?UTF-8?q?slogan=E8=AE=BF=E9=97=AE=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/constant/CommonConstant.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3fbee692..eb325fe6 100644 --- a/src/main/java/com/ai/da/common/constant/CommonConstant.java +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -21,7 +21,7 @@ public class CommonConstant { public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo"; - public static final String GENERATE_SLOGAN = "/apislogan"; + public static final String GENERATE_SLOGAN = "/api/slogan"; public static final String PYTHON_PORT_9996 = "9996"; From 19524520f4e05b716a8e7df6f347b05dfae899d4 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 17 Jun 2024 17:34:27 +0800 Subject: [PATCH 20/79] BUGFIX:sr --- src/main/java/com/ai/da/python/PythonService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 9f681376..862a0a03 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3224,7 +3224,7 @@ public class PythonService { String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); RequestBody body = RequestBody.create(mediaType, jsonString); Request request = new Request.Builder() - .url(accessPythonIp + srServicePort + "/api/super_resolution") + .url(accessPythonIp + ":" + srServicePort + "/api/super_resolution") .method("POST", body) .addHeader("Content-Type", "application/json") .build(); From 02787db0a1caabe54bbd8bb77457f75e363065b5 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 17 Jun 2024 17:37:15 +0800 Subject: [PATCH 21/79] TASK:aida; --- .../primary/entity/CollectionElement.java | 2 +- .../primary/entity/DesignItemDetail.java | 2 +- .../model/enums/PrintboardLevel2TypeEnum.java | 5 +- .../impl/CollectionElementServiceImpl.java | 8 +-- .../ai/da/service/impl/DesignServiceImpl.java | 2 +- .../da/service/impl/PortfolioServiceImpl.java | 55 ++++++++++++------- src/main/resources/application-dev.properties | 2 +- 7 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java index 764ccdb2..fa3a6df0 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java @@ -75,7 +75,7 @@ public class CollectionElement implements Serializable { */ private String md5; -// private String gradientString; + private String gradientString; /** * 创建时间 diff --git a/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java index bfba71d1..969c306b 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java @@ -64,7 +64,7 @@ public class DesignItemDetail implements Serializable { */ private String color; -// private String gradientString; + private String gradientString; /** * 对应的print图片的绝对路径 diff --git a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java index 2bffc94a..9edb56a0 100644 --- a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java +++ b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java @@ -3,9 +3,10 @@ package com.ai.da.model.enums; import com.fasterxml.jackson.annotation.JsonValue; public enum PrintboardLevel2TypeEnum implements IEnumDisplay { - SLOGAN("标语", "Slogan"), + PATTERN("图案", "Pattern"), LOGO("标志", "Logo"), - PATTERN("图案", "Pattern"); + SLOGAN("标语", "Slogan") + ; private final String chinese; private final String english; diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 10b547c7..8bced01d 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -783,10 +783,10 @@ public class CollectionElementServiceImpl extends ServiceImpl impleme d.setPath(minioUtil.getPresignedUrl(o.getPath(), 24 * 60)); d.setMinIOPath(o.getPath()); d.setLevel1Type(converTypeToLevel1(o.getType())); -// d.setGradient(JSONObject.parseObject(o.getGradientString(), Gradient.class)); + d.setGradient(JSONObject.parseObject(o.getGradientString(), Gradient.class)); // 根据designItemDetailId获取印花 List prints = designItemDetailPrintService.getByDesignItemDetailId(o.getId(), "print"); // 判断有无印花 diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index d3c91007..2e89c857 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -1,5 +1,6 @@ package com.ai.da.service.impl; +import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; @@ -20,6 +21,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.base.Function; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; @@ -165,6 +167,16 @@ public class PortfolioServiceImpl extends ServiceImpl designItemDetailQueryWrapper = new QueryWrapper<>(); - designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemOld); + designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemIdOld); List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { Long designItemDetailIdOld = designItemDetailOld.getId(); + designItemDetailOld.setId(null); designItemDetailOld.setAccountId(-1L); designItemDetailOld.setDesignId(-1L); designItemDetailOld.setDesignItemId(designItemIdNew); @@ -216,6 +218,7 @@ public class PortfolioServiceImpl extends ServiceImpl designItemDetailPrintQueryWrapper = new QueryWrapper<>(); designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); + designItemDetailPrint.setId(null); designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); designItemDetailPrintMapper.insert(designItemDetailPrint); } @@ -431,9 +434,18 @@ public class PortfolioServiceImpl extends ServiceImpl userLikeGroupQueryWrapper = new QueryWrapper<>(); + userLikeGroupQueryWrapper.lambda().eq(UserLikeGroup::getCollectionId, portfolio.getCollectionId()); + UserLikeGroup userLikeGroup = userLikeGroupMapper.selectOne(userLikeGroupQueryWrapper); + Long portfolioUserLikeGroupId = userLikeGroup.getId(); + if (Objects.isNull(userLikeGroup)) { + throw new BusinessException(""); + } +// UserLikeGroup userLikeGroup = userLikeGroupMapper.selectById(); UserLikeGroup userLikeGroupNew = userLikeGroup.setId(null); userLikeGroupNew.setAccountId(authPrincipalVo.getId()); Long collectionIdOld = userLikeGroup.getCollectionId(); @@ -479,7 +491,8 @@ public class PortfolioServiceImpl extends ServiceImpl userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); + + List userLikeList = userLikeService.getUserLikeList(portfolioUserLikeGroupId); for (UserLike userLike : userLikeList) { Long designOutfitIdOld = userLike.getDesignOutfitId(); @@ -498,7 +511,7 @@ public class PortfolioServiceImpl extends ServiceImpl designItemDetailQueryWrapper = new QueryWrapper<>(); - designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemOld); + designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemIdOld); List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { Long designItemDetailIdOld = designItemDetailOld.getId(); + designItemDetailOld.setId(null); designItemDetailOld.setAccountId(authPrincipalVo.getId()); designItemDetailOld.setDesignId(design.getId()); designItemDetailOld.setDesignItemId(designItemIdNew); @@ -534,6 +548,7 @@ public class PortfolioServiceImpl extends ServiceImpl Date: Mon, 17 Jun 2024 19:25:37 +0800 Subject: [PATCH 22/79] TASK:aida; --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index ec4b0771..4a6193f8 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -44,7 +44,7 @@ spring.servlet.multipart.max-request-size= 10MB #访问python服务的ip(对应环境) access.python.ip=http://18.167.251.121 access.python.port=9992 -access.python.sr=http://18.167.251.121:9994 +access.python.generate_sr_port=http://18.167.251.121:9994 access.python.address=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 From 1f0439c7f9b69e45d56d6134b911cb611963dab8 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 17 Jun 2024 19:33:54 +0800 Subject: [PATCH 23/79] BUGFIX:aida; --- .../da/service/impl/PortfolioServiceImpl.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 2e89c857..2d2a93d9 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -218,9 +218,11 @@ public class PortfolioServiceImpl extends ServiceImpl designItemDetailPrintQueryWrapper = new QueryWrapper<>(); designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); - designItemDetailPrint.setId(null); - designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); - designItemDetailPrintMapper.insert(designItemDetailPrint); + if (Objects.nonNull(designItemDetailPrint)) { + designItemDetailPrint.setId(null); + designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); + designItemDetailPrintMapper.insert(designItemDetailPrint); + } } } } else { @@ -355,8 +357,11 @@ public class PortfolioServiceImpl extends ServiceImpl designItemDetailPrintQueryWrapper = new QueryWrapper<>(); designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); - designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); - designItemDetailPrintMapper.insert(designItemDetailPrint); + if (Objects.nonNull(designItemDetailPrint)) { + designItemDetailPrint.setId(null); + designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); + designItemDetailPrintMapper.insert(designItemDetailPrint); + } } } } @@ -547,9 +552,11 @@ public class PortfolioServiceImpl extends ServiceImpl designItemDetailPrintQueryWrapper = new QueryWrapper<>(); designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); - designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); - designItemDetailPrint.setId(null); - designItemDetailPrintMapper.insert(designItemDetailPrint); + if (Objects.nonNull(designItemDetailPrint)) { + designItemDetailPrint.setId(null); + designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); + designItemDetailPrintMapper.insert(designItemDetailPrint); + } } } From e6a2ce2b699abe7409267d06699b0292fe8f11df Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 18 Jun 2024 10:19:56 +0800 Subject: [PATCH 24/79] =?UTF-8?q?dev=20=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 4a6193f8..e54dd61e 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -44,7 +44,7 @@ spring.servlet.multipart.max-request-size= 10MB #访问python服务的ip(对应环境) access.python.ip=http://18.167.251.121 access.python.port=9992 -access.python.generate_sr_port=http://18.167.251.121:9994 +access.python.generate_sr_port=9994 access.python.address=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 From 4f12aa92b60e5b41ba0eda922ac311e9df439a49 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 18 Jun 2024 13:13:20 +0800 Subject: [PATCH 25/79] =?UTF-8?q?slogan=20=E5=8F=82=E6=95=B0=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ai/da/service/impl/ChatRobotServiceImpl.java | 2 +- .../java/com/ai/da/service/impl/GenerateServiceImpl.java | 7 ++++++- src/main/resources/messages_en.properties | 2 ++ src/main/resources/messages_zh.properties | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index fdaecc96..9994bf73 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -252,7 +252,7 @@ public class ChatRobotServiceImpl implements ChatRobotService { throw new BusinessException("chat-bot.interface.exception"); } } - log.error("ChatRobot exception!"); + log.error("ChatRobot exception! 请求异常:{}", response); throw new BusinessException("chat-bot.interface.exception"); } 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 f937235f..ec5511bf 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -529,7 +529,12 @@ public class GenerateServiceImpl extends ServiceImpl i if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())){ if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getSloganBase64())){ log.error("Printboard-Slogan模式下,slogan image为空"); - throw new BusinessException("Slogan can not be empty!"); + throw new BusinessException("slogan.image.cannot.be.empty"); + } + + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText())){ + log.error("Printboard-Slogan模式下,slogan text为空"); + throw new BusinessException("slogan.style.cannot.be.empty"); } times = 1; diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 3c803348..6da9e45b 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -135,6 +135,8 @@ model.not.found=model not found. libraryIdList.cannot.be.empty=libraryIdList cannot be empty. the.value.range.of.seed=The value range of seed is 0-99999 image.modify.failed=Image modification failed, please try again later. +slogan.style.cannot.be.empty=Slogan style text cannot be empty. +slogan.image.cannot.be.empty=Slogan image cannot be empty. # 可能会报异常 # Informative: diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index f6e40e34..909ebb49 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -130,6 +130,8 @@ the.workspace.lastIndex.not.found=未找到工作区的lastIndex。 gender.cannot.be.empty=性别不能为空。 image.synthesis.failed=图像合成失败。 priority.cannot.be.repeated=优先级不能重复。 +slogan.style.cannot.be.empty=标语风格文本不能为空. +slogan.image.cannot.be.empty=标语图片不能为空. # 可能会报异常 # Informative: From c3179424475c7d1b706c8561894ba88efe3928f7 Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 19 Jun 2024 11:41:39 +0800 Subject: [PATCH 26/79] =?UTF-8?q?BUGFIX:=20getDetail=E5=8D=B0=E8=8A=B1?= =?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/service/impl/DesignServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 2f26ad07..07ffbec1 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -629,6 +629,7 @@ public class DesignServiceImpl extends ServiceImpl impleme if (!SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) && designItemDetail.getPrintPath() != null) { DesignItemDetailPrint print = new DesignItemDetailPrint(); print.setDesignItemDetailId(designItemDetail.getId()); + print.setPrintType("print"); print.setPath(designItemDetail.getPrintPath()); print.setSingleOrOverall("overall"); print.setPosition("[0.0,0.0]"); From 227c742f0dc6df09c861c75839a7ab2904ac1638 Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 20 Jun 2024 10:27:04 +0800 Subject: [PATCH 27/79] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=9A=E8=B0=83=E6=9F=A5=E9=97=AE=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/filter/AuthenticationFilter.java | 2 +- .../com/ai/da/common/utils/SendEmailUtil.java | 100 +++++++ .../ai/da/controller/AccountController.java | 10 + .../mapper/primary/QuestionnaireMapper.java | 7 + .../mapper/primary/entity/Questionnaire.java | 18 ++ .../com/ai/da/model/vo/QuestionnaireVO.java | 57 ++++ .../com/ai/da/service/AccountService.java | 2 + .../com/ai/da/service/CreditsService.java | 2 + .../da/service/impl/AccountServiceImpl.java | 249 ++++++++++++++++-- .../da/service/impl/CreditsServiceImpl.java | 9 + src/main/resources/messages_en.properties | 2 + src/main/resources/messages_zh.properties | 6 +- 12 files changed, 438 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/ai/da/mapper/primary/QuestionnaireMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/Questionnaire.java create mode 100644 src/main/java/com/ai/da/model/vo/QuestionnaireVO.java diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index d11877e0..32b98fb4 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -50,7 +50,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl", "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify", "/api/portfolio/page", "/api/portfolio/detail", - "/api/account/designWorksRegister" + "/api/account/designWorksRegister","/api/account/questionnaire" ); @Override diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 1e7b4a1d..2b8a832b 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -450,6 +450,106 @@ public class SendEmailUtil { } } + private final static Long QUESTIONNAIRE_FEEDBACK_EN_ID = 124151L; + private final static Long QUESTIONNAIRE_FEEDBACK_CN_ID = 124156L; + public static void questionnaireRelatedNotify(String userName, String email, String language){ + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + req.setFromEmailAddress(CODE_CREATE_SEND_ADDRESS); + req.setDestination(new String[]{email}); + + // 根据邮件类型设置不同的主题和模板 + Template template = new Template(); + String subject = "Thank You for Completing the AiDA System Survey"; + template.setTemplateID(QUESTIONNAIRE_FEEDBACK_EN_ID); + if (language.equals("CN")) { + subject = "感谢您完成AiDA系统问卷调查"; + template.setTemplateID(QUESTIONNAIRE_FEEDBACK_CN_ID); + } + + JSONObject parameter = new JSONObject(); + parameter.put("userName", userName); + + template.setTemplateData(parameter.toJSONString()); + + req.setSubject(subject); + req.setTemplate(template); + + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } + + + private final static Long NEW_USER_PAYMENT_NOTIFICATION_EN = 0L; + private final static Long NEW_USER_PAYMENT_NOTIFICATION_CN = 0L; + private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_EN = 0L; + private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_CN = 0L; + + public static void notificationForPaidUser(String receiverAddress, int emailType, String country){ + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + req.setFromEmailAddress(SEND_ADDRESS); + req.setDestination(new String[]{receiverAddress}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + switch (emailType) { + // 新用户 + case 1: + subject = "Welcome to AiDA!"; + if (country.equals("China")) { + template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_CN); + }else { + template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_EN); + } + break; + // 续费用户 + case 2: + subject = "Account renewal notification"; + if (country.equals("China")) { + template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_CN); + }else { + template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_EN); + } + break; + default: + break; + +// template.setTemplateData(buildNotificationData(trialOrder, link)); + } + + req.setSubject(subject); + req.setTemplate(template); + + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } + public static Boolean designWorksRegister(String userEmail, String randomVerifyCode) { try { diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 48769e5c..4b9087e3 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -167,4 +167,14 @@ public class AccountController { public Response designWorksRegisterCode(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { return Response.success(accountService.designWorksRegisterCode(accountDesignWorksRegisterDTO)); } + + /** + * 填写调查问卷 + * @return + */ + @ApiOperation(value = "填写调查问卷") + @PostMapping("/questionnaire") + public Response questionnaire(@Valid @RequestBody String questionnaireInfo){ + return Response.success(accountService.collectQuestionnaires(questionnaireInfo)); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/QuestionnaireMapper.java b/src/main/java/com/ai/da/mapper/primary/QuestionnaireMapper.java new file mode 100644 index 00000000..844b3bd4 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/QuestionnaireMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Questionnaire; + +public interface QuestionnaireMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Questionnaire.java b/src/main/java/com/ai/da/mapper/primary/entity/Questionnaire.java new file mode 100644 index 00000000..d6daff5b --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Questionnaire.java @@ -0,0 +1,18 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_questionnaire") +public class Questionnaire extends BaseEntity{ + + /** + * 用户所填调查问卷结果 + */ + private String questionnaireInfo; + /** + * 调查问卷标题 + */ + private String title; +} diff --git a/src/main/java/com/ai/da/model/vo/QuestionnaireVO.java b/src/main/java/com/ai/da/model/vo/QuestionnaireVO.java new file mode 100644 index 00000000..c1aeff6a --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/QuestionnaireVO.java @@ -0,0 +1,57 @@ +package com.ai.da.model.vo; + +import lombok.Data; +import java.util.List; + +@Data +public class QuestionnaireVO { + /** + * 用户名 + */ + private String userName; + /** + * 用户性别 + */ + private String gender; + /** + * 职业 + */ + private String occupation; + /** + * 国家 + */ + private String country; + /** + * 电子邮件 + */ + private String email; + /** + * 年龄区间 + */ + private String age; + /** + * How has AiDA been helpful to you? + */ + private List helpful; + /** + * What do you think AiDA should improve? + */ + private List improve; + /** + * Will you subscribe to AiDA 3.0 + */ + private String isSubscribe; + /** + * If NO, please share why: + */ + private List reasonForNotSubscribe; + /** + * Are you currently using any design tools? + */ + private String designTools; + /** + * 用户所选语言 + */ + private String language; + +} diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 496275ce..f6254484 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -134,4 +134,6 @@ public interface AccountService extends IService { Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); + + Boolean collectQuestionnaires(String questionnaireInfo); } diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index e6179e22..cf733baf 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -30,4 +30,6 @@ public interface CreditsService extends IService { Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num); void taskCreditsDeduction(Long accountId, String taskId); + + CreditsDetail getByAccountIdAndChangeEvent(Long accountId, String changeEvent, String changedCredits); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 6a6fb2f0..3d41c2a2 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -3,31 +3,31 @@ package com.ai.da.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; -import com.ai.da.common.enums.LoginTypeEnum; import com.ai.da.common.enums.AuthenticationOperationTypeEnum; +import com.ai.da.common.enums.LoginTypeEnum; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.security.jwt.JWTTokenHelper; import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.QuestionnaireMapper; import com.ai.da.mapper.primary.TrialOrderMapper; -import com.ai.da.mapper.primary.entity.Account; -import com.ai.da.mapper.primary.entity.AccountLoginLog; -import com.ai.da.mapper.primary.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.AutoApproved; import com.ai.da.model.enums.Language; import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountPreLoginVO; import com.ai.da.model.vo.AuthPrincipalVo; -import com.ai.da.service.AccountLoginLogService; -import com.ai.da.service.AccountService; -import com.ai.da.service.LibraryService; -import com.ai.da.service.UserLikeGroupService; +import com.ai.da.model.vo.QuestionnaireVO; +import com.ai.da.service.*; import com.alibaba.fastjson.JSON; 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 com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -36,9 +36,16 @@ import org.springframework.util.Assert; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.sql.DataSource; import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.List; @@ -72,6 +79,11 @@ public class AccountServiceImpl extends ServiceImpl impl @Resource private TrialOrderMapper trialOrderMapper; + @Resource + private QuestionnaireMapper questionnaireMapper; + + @Resource + private CreditsService creditsService; @Override @Transactional(rollbackFor = Exception.class) @@ -264,7 +276,7 @@ public class AccountServiceImpl extends ServiceImpl impl if (!verifyCode.equals(accountDTO.getEmailVerifyCode())) { throw new BusinessException("verification.code.error", ResultEnum.PROMPT.getCode()); } - }else { + } else { updatePwdByEmail(accountDTO.getPassword(), accountDTO.getEmail()); } return Boolean.TRUE; @@ -493,7 +505,7 @@ public class AccountServiceImpl extends ServiceImpl impl if (CollectionUtil.isNotEmpty(accountList)) { if (accountList.get(0).getIsTrial() == 1) { throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); - }else { + } else { Account account = accountList.get(0); if (null == account.getValidEndTime() || account.getValidEndTime() > System.currentTimeMillis()) { throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); @@ -523,11 +535,11 @@ public class AccountServiceImpl extends ServiceImpl impl account.setValidStartTime(System.currentTimeMillis()); if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); - }else { + } else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); } accountMapper.updateById(account); - }else { + } else { account.setUserName(trialOrder.getUserName()); account.setUserPassword("Third-000000"); account.setUserEmail(trialOrder.getEmail()); @@ -535,7 +547,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setValidStartTime(System.currentTimeMillis()); if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); - }else { + } else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); } account.setCreateDate(new Date()); @@ -550,7 +562,7 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); if (trialOrder.getCountry().equals("China")) { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); - }else { + } else { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); } } @@ -584,7 +596,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setValidStartTime(System.currentTimeMillis()); account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); accountMapper.updateById(account); - }else { + } else { account.setUserName(trialOrder.getUserName()); account.setUserPassword("Third-000000"); account.setUserEmail(trialOrder.getEmail()); @@ -603,7 +615,7 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2, trialOrder.getCountry()); if (trialOrder.getCountry().equals("China")) { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); - }else { + } else { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); } } @@ -707,7 +719,7 @@ public class AccountServiceImpl extends ServiceImpl impl accountMapper.deleteById(accountDelete); userToBeUpdate.setUserName(userName); accountMapper.updateById(userToBeUpdate); - }else { + } else { accountMapper.deleteById(accountDelete); } } @@ -845,7 +857,7 @@ public class AccountServiceImpl extends ServiceImpl impl "                        \n" + "                        \n" + "                            \n" + "                        "; } @@ -889,7 +901,7 @@ public class AccountServiceImpl extends ServiceImpl impl throw new BusinessException("Illegal serial number."); } queryWrapperDelete.lambda().eq(Account::getUserName, "PolyU-SFT-" + noLoginRequiredDTO.getId()); - }else { + } else { queryWrapperDelete.lambda().like(Account::getBrowserIdentifiers, ipAddress); } List accountList = accountMapper.selectList(queryWrapperDelete); @@ -923,7 +935,7 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendUpgradeNotification(account, null, 1); if (account.getLanguage().equals(Language.CHINESE_SIMPLIFIED.name())) { SendEmailUtil.sendUpgradeNotification(account, null, 0); - }else { + } else { // 英文 SendEmailUtil.sendUpgradeNotification(account, null, 1); } @@ -937,7 +949,7 @@ public class AccountServiceImpl extends ServiceImpl impl // 未迁移过的进行迁移,注意模特数据迁移打点信息以及转换模特格式 } - public void updateCredits(Long accountId, String value){ + public void updateCredits(Long accountId, String value) { Account account = new Account(); account.setId(accountId); account.setCredits(new BigDecimal(value)); @@ -954,7 +966,7 @@ public class AccountServiceImpl extends ServiceImpl impl } String randomVerifyCode = RandomsUtil.generateVerifyCode(100000L, 999999L); - LocalCacheUtils.setVerifyCodeCache("DesignWorksRegister"+ "_" + accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); + LocalCacheUtils.setVerifyCodeCache("DesignWorksRegister" + "_" + accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); Boolean b = SendEmailUtil.designWorksRegister(accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); if (!b) { @@ -966,7 +978,7 @@ public class AccountServiceImpl extends ServiceImpl impl @Override public AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { - String verifyCode = LocalCacheUtils.getVerifyCodeCache("DesignWorksRegister"+ "_" + accountDesignWorksRegisterDTO.getUserEmail()); + String verifyCode = LocalCacheUtils.getVerifyCodeCache("DesignWorksRegister" + "_" + accountDesignWorksRegisterDTO.getUserEmail()); if (StringUtils.isBlank(verifyCode)) { throw new BusinessException("the.verification.code.has.expired", ResultEnum.PROMPT.getCode()); } @@ -996,4 +1008,195 @@ public class AccountServiceImpl extends ServiceImpl impl response.setSystemUser(account.getSystemUser()); return response; } + + private static final String QUERY_ORDER = "SELECT * FROM pmr_wc_order_stats " + + "WHERE status = 'wc-processing' AND date_paid > '2024-06-10 00:00:00'" + + " ORDER BY order_id DESC "; + + private static final String QUERY_CUSTOMER_EMAIL = "SELECT username, email FROM pmr_wc_customer_lookup " + + "WHERE customer_id = ? "; + private static final String UPDATE_ORDER_STATUS = "UPDATE pmr_wc_order_stats " + + "SET status = 'wc-complete' , date_completed = ? " + + "WHERE order_id = ?"; + + private static final DataSource dataSource; + + static { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:mysql://code-create.com.hk:3306/db1nfvsgmjp3b8"); + config.setUsername("uafqtz4gsvfrw"); + config.setPassword("aida123456."); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + dataSource = new HikariDataSource(config); + } + + /** + * 为Code-Create的用户延长有效期 + * + * @return null + */ + public String extendValidityForCC() { + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(QUERY_ORDER)) { +// preparedStatement.setString(1, "someCondition"); + try (ResultSet queryOrderResultSet = preparedStatement.executeQuery()) { + while (queryOrderResultSet.next()) { + /* 处理结果集 */ + int orderId = queryOrderResultSet.getInt("order_id"); + int customerId = queryOrderResultSet.getInt("customer_id"); + double totalSales = queryOrderResultSet.getDouble("total_sales"); + String email = ""; + String userName = ""; + // 1、查pmr_wc_customer_lookup表;确认当前订单对应的用户邮箱 + PreparedStatement preparedQueryEmail = connection.prepareStatement(QUERY_CUSTOMER_EMAIL); + preparedQueryEmail.setInt(1, customerId); + try (ResultSet queryEmailResultSet = preparedQueryEmail.executeQuery()) { + if (queryEmailResultSet.next()) { + email = queryEmailResultSet.getString("email"); + userName = queryEmailResultSet.getString("username"); + } else { + log.error("未知错误。code-create的用户表中没有付费用户的信息"); + throw new BusinessException("user info missing"); + } + } + + // 2、查t_account表中是否有该用户 + // 2.1 没有 新建用户 + Account userInfo = null; + Long validEndTime = null; + // 标志当前用户是不是新用户 + Boolean flag = Boolean.FALSE; + try { + // 不是新用户 直接延长使用期限 + userInfo = getOneByEmail(email); + } catch (BusinessException e) { + // 通过邮箱找不到用户 说明是新用户 => 创建用户 + flag = Boolean.TRUE; + } + if (!Objects.isNull(userInfo) && !Objects.isNull(userInfo.getValidEndTime())) + validEndTime = userInfo.getValidEndTime(); + + // 2、获取当前续费费用能延长多长时间 + Account account = extendValidity(validEndTime, totalSales); + + if (flag) { + // 是新用户 => 新增一条数据 + Boolean b = addUser(new AccountAddDTO(email, StringUtil.isNullOrEmpty(userName) ? email.substring(0, email.indexOf("@") - 1) : userName, account.getValidStartTime().toString(), account.getValidEndTime().toString(), 0)); + if (b) log.info("付费新用户新增成功!"); + } else { + userInfo.setValidEndTime(account.getValidEndTime()); + baseMapper.updateById(account); + log.info("付费用户续订成功"); + } + + // 3、todo 邮件通知 + // 3.1 判断用户语言 + + // 3.2 将用户信息填到邮件中 + + // 4、更新订单状态和日期 + PreparedStatement preparedUpdateOrder = connection.prepareStatement(UPDATE_ORDER_STATUS); + LocalDateTime localDateTime = LocalDateTime.now(); + String currentTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + + preparedUpdateOrder.setString(1, currentTime); + preparedUpdateOrder.setInt(2, orderId); + int row = preparedUpdateOrder.executeUpdate(); + if (row == 1) log.info("表 pmr_wc_order_stats 订单状态更新成功"); + + + } + } + } catch (Exception e) { + // 记录异常并处理 + e.printStackTrace(); + } + + return null; + } + + private Account extendValidity(Long validEndTime, double totalSales) { + Instant specifiedInstant; + Account account = new Account(); + long epochMilli = Instant.now().toEpochMilli(); + if (!Objects.isNull(validEndTime) && validEndTime > epochMilli) { + // 将 Unix 毫秒级时间戳转换为 Instant + specifiedInstant = Instant.ofEpochMilli(validEndTime); + } else { + specifiedInstant = Instant.now(); + account.setValidStartTime(specifiedInstant.toEpochMilli()); + } + + // 指定时区 + ZoneId zoneId = ZoneId.of("Asia/Shanghai"); + // 将 Instant 转换为 ZonedDateTime,使用指定时区 + ZonedDateTime specifiedDateTime = ZonedDateTime.ofInstant(specifiedInstant, zoneId); + ZonedDateTime validityExtension; + if (totalSales == 500) { + // 一个月 + validityExtension = specifiedDateTime.plusMonths(1); + } else if (totalSales == 5000) { + // 一年 + validityExtension = specifiedDateTime.plusYears(1); + } else { + // 测试 一天 + validityExtension = specifiedDateTime.plusDays(1); + } + // 获取一个月之后的时间的 Unix 毫秒级时间戳 + account.setValidEndTime(validityExtension.toInstant().toEpochMilli()); + return account; + } + + // 收集调查问卷的信息 + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean collectQuestionnaires(String questionnaireInfo) { + log.info("调查问卷详细信息:{}", questionnaireInfo); + QuestionnaireVO questionnaireVO = JSON.parseObject(questionnaireInfo, QuestionnaireVO.class); + String email = questionnaireVO.getEmail(); + // 1、通过邮箱判断当前用户有无系统账号 + Account account; + try { + account = getOneByEmail(email); + } catch (BusinessException e) { + log.info(e.getMessage()); + log.warn("当前用户 {} 在AiDA中没有账号", email); + throw new BusinessException("user.has.no.account",ResultEnum.PROMPT.getCode()); + } + // 2、先判断当前用户是否已经填写过问卷 + CreditsDetail record = creditsService.getByAccountIdAndChangeEvent(account.getId(), "Fill out the questionnaire", "+100"); + if (!Objects.isNull(record)) { + log.info("当前用户 {} 已经填写过问卷", email); + throw new BusinessException("questionnaire.filled.out", ResultEnum.PROMPT.getCode()); + } + + // 3.1、将问卷信息存储到数据库 + Questionnaire questionnaire = new Questionnaire(); + questionnaire.setQuestionnaireInfo(questionnaireInfo); + questionnaire.setTitle("AiDA_3.0 Feedback Survey--06/2024"); + questionnaire.setCreateTime(LocalDateTime.now()); + int insert = questionnaireMapper.insert(questionnaire); + + if (insert == 1) { + // 3.2、更新 t_credits_detail表 + CreditsDetail creditsDetail = new CreditsDetail(); + creditsDetail.setAccountId(account.getId()); + creditsDetail.setChangeEvent("Fill out the questionnaire"); + creditsDetail.setChangedCredits("+100"); + BigDecimal added = account.getCredits().add(new BigDecimal("100")); + creditsDetail.setCredits(added); + creditsDetail.setCreateTime(LocalDateTime.now()); + creditsService.save(creditsDetail); + + // 3.3、更新 t_account 表 + updateCredits(account.getId(), added.toString()); + } + + // 4、发邮件 区分中英文 + SendEmailUtil.questionnaireRelatedNotify(questionnaireVO.getUserName(), email, questionnaireVO.getLanguage()); + return Boolean.TRUE; + } + } diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 13f380ce..2e2d9c66 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -243,4 +243,13 @@ public class CreditsServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.eq("account_id", accountId); + qw.eq("change_event", changeEvent); + qw.eq("changed_credits", changedCredits); + + return baseMapper.selectOne(qw); + } + } diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 6da9e45b..aa36fa05 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -137,6 +137,8 @@ the.value.range.of.seed=The value range of seed is 0-99999 image.modify.failed=Image modification failed, please try again later. slogan.style.cannot.be.empty=Slogan style text cannot be empty. slogan.image.cannot.be.empty=Slogan image cannot be empty. +questionnaire.filled.out=You have filled out the current questionnaire. +user.has.no.account=The current user has no account! # 可能会报异常 # Informative: diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index 909ebb49..e4bbeb87 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -130,8 +130,10 @@ the.workspace.lastIndex.not.found=未找到工作区的lastIndex。 gender.cannot.be.empty=性别不能为空。 image.synthesis.failed=图像合成失败。 priority.cannot.be.repeated=优先级不能重复。 -slogan.style.cannot.be.empty=标语风格文本不能为空. -slogan.image.cannot.be.empty=标语图片不能为空. +slogan.style.cannot.be.empty=标语风格文本不能为空。 +slogan.image.cannot.be.empty=标语图片不能为空。 +questionnaire.filled.out=您已填写过当前问卷。 +user.has.no.account=当前用户没有账号。 # 可能会报异常 # Informative: From ad1fa0e4c2bea8a05e22e4c89eac9b2f332095ff Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Thu, 20 Jun 2024 10:27:28 +0800 Subject: [PATCH 28/79] TASK:aida; --- .../ai/da/common/config/MyTaskScheduler.java | 32 +++++ .../security/filter/AuthenticationFilter.java | 2 +- .../com/ai/da/common/utils/RedisUtil.java | 13 ++ .../ai/da/controller/PortfolioController.java | 12 ++ .../ai/da/model/enums/StyleKeywordMapper.java | 120 ++++++++++++++++++ .../java/com/ai/da/model/vo/PortfolioVO.java | 4 + .../java/com/ai/da/model/vo/WorkspaceVO.java | 5 + .../com/ai/da/service/PortfolioService.java | 4 + .../da/service/impl/PortfolioServiceImpl.java | 15 +++ .../impl/UserLikeGroupServiceImpl.java | 7 +- .../da/service/impl/WorkspaceServiceImpl.java | 8 +- 11 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index 06294584..514797f8 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -4,6 +4,7 @@ import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.SendEmailUtil; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; +import com.ai.da.mapper.secondary.AttributeRetrievalMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Row; @@ -17,10 +18,13 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.DirectoryStream; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -205,4 +209,32 @@ public class MyTaskScheduler { // } // } } + + @Resource + private AttributeRetrievalMapper attributeRetrievalMapper; + + public void addSystemFileStyle() { + String directoryPath = "C:\\Users\\10233\\Downloads\\blouse done\\blouse done\\废土风"; + List fileNames = getFileNames(directoryPath); + for (String fileName : fileNames) { + + } + } + + public static List getFileNames(String directoryPath) { + List fileNames = new ArrayList<>(); + Path path = Paths.get(directoryPath); + + try (DirectoryStream stream = Files.newDirectoryStream(path)) { + for (Path entry : stream) { + if (Files.isRegularFile(entry)) { + fileNames.add(entry.getFileName().toString()); + } + } + } catch (IOException e) { + System.err.println("Error reading directory: " + e.getMessage()); + } + + return fileNames; + } } diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index d11877e0..4060b9a4 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -49,7 +49,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew", "/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl", "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify", - "/api/portfolio/page", "/api/portfolio/detail", + "/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease", "/api/account/designWorksRegister" ); diff --git a/src/main/java/com/ai/da/common/utils/RedisUtil.java b/src/main/java/com/ai/da/common/utils/RedisUtil.java index 82cf1fd8..e15bc5d0 100644 --- a/src/main/java/com/ai/da/common/utils/RedisUtil.java +++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java @@ -200,4 +200,17 @@ public class RedisUtil { Boolean isMember = redisTemplate.opsForSet().isMember(key, userId.toString()); return isMember != null && isMember; } + + public final static String PORTFOLIO_VIEW_KEY = "portfolio:view:"; + + public void increaseViewCount(Long portfolioId) { + String key = PORTFOLIO_VIEW_KEY + portfolioId; + redisTemplate.opsForValue().increment(key); + } + + public Long getViewCount(Long portfolioId) { + String key = PORTFOLIO_VIEW_KEY + portfolioId; + return redisTemplate.opsForValue().increment(key, 0); + } + } diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java index 4f8041b5..725c178a 100644 --- a/src/main/java/com/ai/da/controller/PortfolioController.java +++ b/src/main/java/com/ai/da/controller/PortfolioController.java @@ -93,4 +93,16 @@ public class PortfolioController { public Response> commentPage(@Valid @RequestBody CommentPageDTO commentPageDTO) { return Response.success(portfolioService.commentPage(commentPageDTO)); } + + @ApiOperation(value = "增加浏览量") + @GetMapping("/viewsIncrease") + public Response viewsIncrease(@RequestParam("id") Long id) { + return Response.success(portfolioService.viewsIncrease(id)); + } + + @ApiOperation(value = "浏览量获取") + @GetMapping("/viewsGet") + public Response viewsGet(@RequestParam("id") Long id) { + return Response.success(portfolioService.viewsGet(id)); + } } diff --git a/src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java b/src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java new file mode 100644 index 00000000..29debd77 --- /dev/null +++ b/src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java @@ -0,0 +1,120 @@ +package com.ai.da.model.enums; + +import java.util.*; + +public class StyleKeywordMapper { + + private static final Map>> styleCategoryKeywords = new HashMap<>(); + + static { + Map> neoChineseKeywords = new HashMap<>(); + neoChineseKeywords.put("Moodboard", Arrays.asList("New Chinese")); + neoChineseKeywords.put("Printboard", Arrays.asList("New Chinese", "traditional Chinese patterns", "dragons and phoenixes", "longevity peaches", "cloud patterns")); + neoChineseKeywords.put("Sketchboard", Arrays.asList("New Chinese", "blouse", "bow tie", "stand-up collars", "cross collars", "Chinese buttons")); + + Map> countryStyleKeywords = new HashMap<>(); + countryStyleKeywords.put("Moodboard", Arrays.asList("Pastoral style")); + countryStyleKeywords.put("Printboard", Arrays.asList("fresh and natural feeling", "floral")); + countryStyleKeywords.put("Sketchboard", Arrays.asList("soft and comfortable", "chiffon", "cotton")); + + Map> futurismKeywords = new HashMap<>(); + futurismKeywords.put("Moodboard", Arrays.asList("high-tech", "luminous")); + futurismKeywords.put("Printboard", Arrays.asList("geometric patterns", "lines and structured designs", "silver", "gold", "copper")); + futurismKeywords.put("Sketchboard", Arrays.asList("high tech", "exaggerated cutting", "three-dimensional design")); + + Map> minimalistKeywords = new HashMap<>(); + minimalistKeywords.put("Moodboard", Arrays.asList("Minimalist style")); + minimalistKeywords.put("Printboard", Arrays.asList("Minimalist black and white")); + minimalistKeywords.put("Sketchboard", Arrays.asList("soft and breathable")); + + Map> lolitaKeywords = new HashMap<>(); + lolitaKeywords.put("Moodboard", Arrays.asList("Lolita style")); + lolitaKeywords.put("Printboard", Arrays.asList("gentle", "cute", "elegant", "floral print")); + lolitaKeywords.put("Sketchboard", Arrays.asList("Layered skirts", "puff sleeves", "bows")); + + Map> y2kKeywords = new HashMap<>(); + y2kKeywords.put("Moodboard", Arrays.asList("Y2K Style")); + y2kKeywords.put("Printboard", Arrays.asList("highly saturated colors", "glossy fabrics", "reflective fabrics")); + y2kKeywords.put("Sketchboard", Arrays.asList("low-waist miniskirts")); + + Map> businessKeywords = new HashMap<>(); + businessKeywords.put("Moodboard", Arrays.asList("Business-style")); + businessKeywords.put("Printboard", Arrays.asList("colors are mostly black", "white", "gray", "dark blue", "brown", "neutral tones")); + businessKeywords.put("Sketchboard", Arrays.asList("simple and smooth lines")); + + Map> merladKeywords = new HashMap<>(); + merladKeywords.put("Moodboard", Arrays.asList("Maillard Style")); + merladKeywords.put("Printboard", Arrays.asList("colors of Maillard-style clothing are mainly brown", "matched with tan", "reddish brown", "yellowish brown", "leopard print", "plaid")); + merladKeywords.put("Sketchboard", Arrays.asList("wide shoulder design", "extra-long cuts")); + + Map> outdoorFunctionalKeywords = new HashMap<>(); + outdoorFunctionalKeywords.put("Moodboard", Arrays.asList("outdoor functional")); + outdoorFunctionalKeywords.put("Printboard", Arrays.asList("Simple")); + outdoorFunctionalKeywords.put("Sketchboard", Arrays.asList("multiple pocket designs")); + + Map> rockKeywords = new HashMap<>(); + rockKeywords.put("Moodboard", Arrays.asList("rock-style")); + rockKeywords.put("Printboard", Arrays.asList("printed patterns include skulls", "flames", "music elements", "rock culture symbols")); + rockKeywords.put("Sketchboard", Arrays.asList("Leather")); + + Map> dopamineKeywords = new HashMap<>(); + dopamineKeywords.put("Moodboard", Arrays.asList("dopamine-style")); + dopamineKeywords.put("Printboard", Arrays.asList("bright and highly saturated colors such as red", "orange", "yellow", "Cute and playful patterns such as flowers", "fruits", "animals")); + dopamineKeywords.put("Sketchboard", Arrays.asList("sequins", "beads", "metal decorations", "cheerful and lively atmosphere")); + + Map> gothicKeywords = new HashMap<>(); + gothicKeywords.put("Moodboard", Arrays.asList("Gothic style")); + gothicKeywords.put("Printboard", Arrays.asList("deep and dark colors", "such as black", "dark purple", "dark red", "religious or mysterious patterns or prints such as crosses", "shackles", "bats", "skulls")); + gothicKeywords.put("Sketchboard", Arrays.asList("mysterious and gloomy atmosphere", "lines and layers")); + + Map> postApocalypticKeywords = new HashMap<>(); + postApocalypticKeywords.put("Moodboard", Arrays.asList("wasteland style")); + postApocalypticKeywords.put("Printboard", Arrays.asList("damage", "graffiti", "smearing", "retro printing", "showing a shabby", "decadent", "cold appearance")); + postApocalypticKeywords.put("Sketchboard", Arrays.asList("a gloomy and heavy feeling")); + + Map> romanticKeywords = new HashMap<>(); + romanticKeywords.put("Moodboard", Arrays.asList("Romantic style")); + romanticKeywords.put("Printboard", Arrays.asList("softness", "warmth and romance", "colors such as pink", "lavender", "light blue", "beige")); + romanticKeywords.put("Sketchboard", Arrays.asList("X-shaped and A-shaped silhouettes", "organza", "satin")); + + Map> wabiSabiKeywords = new HashMap<>(); + wabiSabiKeywords.put("Moodboard", Arrays.asList("Wabi-Sabi style")); + wabiSabiKeywords.put("Printboard", Arrays.asList("natural materials such as wood", "stone", "hemp rope", "neutral tones and light colors")); + wabiSabiKeywords.put("Sketchboard", Arrays.asList("a quiet and peaceful atmosphere")); + + styleCategoryKeywords.put(StyleEnum.NEO_CHINESE, neoChineseKeywords); + styleCategoryKeywords.put(StyleEnum.COUNTRY_STYLE, countryStyleKeywords); + styleCategoryKeywords.put(StyleEnum.FUTURISM, futurismKeywords); + styleCategoryKeywords.put(StyleEnum.MINIMALISM, minimalistKeywords); + styleCategoryKeywords.put(StyleEnum.LOLITA, lolitaKeywords); + styleCategoryKeywords.put(StyleEnum.Y2K, y2kKeywords); + styleCategoryKeywords.put(StyleEnum.BUSINESS, businessKeywords); + styleCategoryKeywords.put(StyleEnum.MERLAD, merladKeywords); + styleCategoryKeywords.put(StyleEnum.OUTDOOR_FUNCTIONAL, outdoorFunctionalKeywords); + styleCategoryKeywords.put(StyleEnum.ROCK, rockKeywords); + styleCategoryKeywords.put(StyleEnum.DOPAMINE, dopamineKeywords); + styleCategoryKeywords.put(StyleEnum.GOTHIC, gothicKeywords); + styleCategoryKeywords.put(StyleEnum.POST_APOCALYPTIC, postApocalypticKeywords); + styleCategoryKeywords.put(StyleEnum.ROMANTIC, romanticKeywords); + styleCategoryKeywords.put(StyleEnum.WABI_SABI, wabiSabiKeywords); + } + + public static List getKeywords(StyleEnum style, String category) { + Map> categoryKeywords = styleCategoryKeywords.get(style); + if (categoryKeywords != null) { + List keywords = categoryKeywords.get(category); + if (keywords != null) { + return keywords; + } + } + return Collections.emptyList(); + } + + public static Map> getAllKeywordsByStyle(StyleEnum style) { + Map> allKeywords = new HashMap<>(); + allKeywords.put("Moodboard", getKeywords(style, "Moodboard")); + allKeywords.put("Printboard", getKeywords(style, "Printboard")); + allKeywords.put("Sketchboard", getKeywords(style, "Sketchboard")); + return allKeywords; + } +} diff --git a/src/main/java/com/ai/da/model/vo/PortfolioVO.java b/src/main/java/com/ai/da/model/vo/PortfolioVO.java index 030e6d16..12e9199b 100644 --- a/src/main/java/com/ai/da/model/vo/PortfolioVO.java +++ b/src/main/java/com/ai/da/model/vo/PortfolioVO.java @@ -14,4 +14,8 @@ public class PortfolioVO extends Portfolio { private List collectionElementList; private List designPythonOutfitList; private Integer isLike; + + private Long viewNums; + + private String userName; } diff --git a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java index 45800ae5..71710978 100644 --- a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java +++ b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java @@ -8,6 +8,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; +import java.util.List; +import java.util.Map; + /** * 视图实体类 * @@ -35,4 +38,6 @@ public class WorkspaceVO extends Workspace { private String styleName; + private Map> allKeywordsByStyle; + } diff --git a/src/main/java/com/ai/da/service/PortfolioService.java b/src/main/java/com/ai/da/service/PortfolioService.java index 0714ae69..aa6ca14b 100644 --- a/src/main/java/com/ai/da/service/PortfolioService.java +++ b/src/main/java/com/ai/da/service/PortfolioService.java @@ -31,4 +31,8 @@ public interface PortfolioService extends IService { Boolean unlike(Long id); Long getLikeCount(Long id); + + Boolean viewsIncrease(Long id); + + Long viewsGet(Long id); } diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 2d2a93d9..3d347b4f 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -396,6 +396,7 @@ public class PortfolioServiceImpl extends ServiceImpl getChildCommentVOList(Long id) { QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(Comment::getParentLevel1Id, id); diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index b7bd7505..22024e16 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -238,13 +238,16 @@ public class UserLikeGroupServiceImpl extends ServiceImpl result = new ArrayList<>(); int i = 0; + // 翻译 + String prompt = toProductImageDTO.getPrompt(); + String s = pythonService.promptTranslate(prompt); for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) { if (toProductImageVO.getElementType().equals("DesignOutfit")) { String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); i ++; TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId()); // 走模型 - pythonService.toProductImage(tDesignPythonOutfit.getDesignUrl(), taskId, toProductImageDTO.getPrompt()); + pythonService.toProductImage(tDesignPythonOutfit.getDesignUrl(), taskId, s); ToProductImageResult toProductImageResult = new ToProductImageResult(); toProductImageResult.setElementId(tDesignPythonOutfit.getId()); toProductImageResult.setElementType("DesignOutfit"); @@ -261,7 +264,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl> allKeywordsByStyle = StyleKeywordMapper.getAllKeywordsByStyle(styleEnum); + vo.setAllKeywordsByStyle(allKeywordsByStyle); if (authPrincipalVo.getLanguage().equals(Language.ENGLISH.name())) { vo.setStyleName(styleEnum.getEnglish()); }else { From 8457a61ded5315669d32b1a854c16b78b2941edf Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 20 Jun 2024 15:26:22 +0800 Subject: [PATCH 29/79] =?UTF-8?q?generate=20=E6=B7=BB=E5=8A=A0=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E6=89=A3=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/enums/CreditsEventsEnum.java | 24 ++-- .../da/controller/ThirdPartyController.java | 4 +- .../com/ai/da/service/CreditsService.java | 4 +- .../da/service/impl/CreditsServiceImpl.java | 23 ++-- .../da/service/impl/GenerateServiceImpl.java | 128 ++++-------------- .../impl/SuperResolutionServiceImpl.java | 3 +- 6 files changed, 59 insertions(+), 127 deletions(-) diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index 0b00fa84..2fcc8fde 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -7,20 +7,22 @@ import lombok.Getter; @Getter public enum CreditsEventsEnum { -// PRICE("price","6"), - PRICE("price","0.1"), + PRICE("price","6"), +// PRICE("price","0.1"), -// BUY_CREDITS("Buy Credits","600"), - BUY_CREDITS("Buy Credits","10"), + BUY_CREDITS("Buy Credits","60"), +// BUY_CREDITS("Buy Credits","10"), - INIT("init", "500"), + // 每月更新 + INIT_YEARLY("init", "6000"), + INIT_MONTHLY("init", "5000"), + INIT_TRIAL("init", "100"), - DAILY_CHECKIN("Daily Check-In", "20"), - - SOCIAL_MEDIA_SHARING("Social Media Sharing","20"), - -// SUPER_RESOLUTION("Super Resolution","300"), - SUPER_RESOLUTION("Super Resolution","5"), +// SUPER_RESOLUTION("Super Resolution","30"), + SUPER_RESOLUTION("Super Resolution","10"), + SLOGAN("Slogan","10"), + NORMAL_GENERATE("Normal_Generate","5"), + QUESTIONNAIRE("Questionnaire","100"), OTHER("Other","10"); diff --git a/src/main/java/com/ai/da/controller/ThirdPartyController.java b/src/main/java/com/ai/da/controller/ThirdPartyController.java index 7132d9b2..1f4f64c3 100644 --- a/src/main/java/com/ai/da/controller/ThirdPartyController.java +++ b/src/main/java/com/ai/da/controller/ThirdPartyController.java @@ -27,11 +27,11 @@ public class ThirdPartyController { @Resource private AccountService accountService; - @ApiOperation(value = "Add user information") + /*@ApiOperation(value = "Add user information") @PostMapping("/addUser") public Response addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) { return Response.success(accountService.addUser(accountAddDTO)); - } + }*/ @ApiOperation(value = "Edit user information") @PostMapping("/editUser") diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index cf733baf..ec2592c4 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -9,8 +9,6 @@ import com.baomidou.mybatisplus.extension.service.IService; public interface CreditsService extends IService { - void initCredits(); - Boolean buyCredits(Long accountId, Float quantity); void creditsIncrease(Long accountId, String event); @@ -29,6 +27,8 @@ public interface CreditsService extends IService { Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num); + void addRecordToCreditsDeduction(Long accountId, String taskId, CreditsEventsEnum creditsEventsEnum); + void taskCreditsDeduction(Long accountId, String taskId); CreditsDetail getByAccountIdAndChangeEvent(Long accountId, String changeEvent, String changedCredits); diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 2e2d9c66..61b67921 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -1,6 +1,7 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.response.PageBaseResponse; @@ -42,11 +43,6 @@ public class CreditsServiceImpl extends ServiceImpl keys = redisUtil.getKeysFromString(creditsDeduction + ":" + accountId + ":*"); List multiValue = redisUtil.getMultiValue(keys); + // 1.1 预扣除区 积分总和 int sum = multiValue.stream().mapToInt(Integer::parseInt).sum(); + // 1.2 加上本次操作需要扣除的积分 sum += Integer.parseInt(event.getValue()) * num; // 2、获取当前积分 @@ -221,6 +214,12 @@ public class CreditsServiceImpl extends ServiceImpl i @Resource private CollectionElementMapper collectionElementMapper; - @Resource private GenerateDetailMapper generateDetailMapper; - @Resource private LibraryService libraryService; - @Resource private PythonService pythonService; - @Resource private CollectionElementService collectionElementService; - + @Resource + private CreditsService creditsService; @Resource private MinioUtil minioUtil; - @Resource private RabbitMQService rabbitMQService; - @Resource private RedisUtil redisUtil; - @Resource private GenerateCancelMapper generateCancelMapper; @@ -196,41 +188,12 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, status); redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); - // 5、处理模型返回的数据 - // 5.1 将相应的url保存到数据库 - /*List generatedCollectionItems = new ArrayList<>(); - generatedSketchUrl.forEach(item -> { - GenerateDetail generateDetail = new GenerateDetail(); - GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); - String md5 = MD5Utils.encryptFile(minioUtil.getPresignedUrl(item, 24 * 60), Boolean.FALSE); - // 通过MD5值和level1Type,判断不同level1Type下相同的图片是否被like过 - List> libraryIdList = generateDetailMapper.getLibraryIdThroughMD5(md5, generateThroughImageTextDTO.getLevel1Type()); - if (!libraryIdList.isEmpty()) { - generateDetail.setIsLike((byte) 1); - generateDetail.setLibraryId(libraryIdList.get(0).get("library_id")); - generateCollectionItemVO.setIsLiked(Boolean.TRUE); - } - generateDetail.setUrl(item); - generateDetail.setGenerateId(generate.getId()); - generateDetail.setCreateDate(DateUtil.getByTimeZone(generateThroughImageTextDTO.getTimeZone())); - generateDetail.setMd5(md5); - generateDetailMapper.insert(generateDetail); - - generateCollectionItemVO.setGenerateItemId(generateDetail.getId()); - generateCollectionItemVO.setGenerateItemUrl(minioUtil.getPresignedUrl(item, 24 * 60)); - generatedCollectionItems.add(generateCollectionItemVO); - }); - - // 6、将模型返回的图片地址返回给前端 - Long collectionId = Objects.isNull(collectionElement) ? null : collectionElement.getCollectionId(); - return new GenerateCollectionVO(generate.getId(), collectionId, generatedCollectionItems);*/ } @Override @Transactional(rollbackFor = Exception.class) public void processGenerateResult(String taskId, String url, String category) { - // 5、处理模型返回的数据 - // 5.1 将相应的url保存到数据库 + // 1、处理模型返回的数据 GenerateDetail generateDetail = new GenerateDetail(); GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); Generate generate; @@ -243,7 +206,6 @@ public class GenerateServiceImpl extends ServiceImpl i } else { throw new BusinessException("There are some problems with database query, please try again."); } - } // Generate generate = selectByUniqueId(taskId); String md5 = MD5Utils.encryptFile(minioUtil.getPresignedUrl(url, 24 * 60), Boolean.FALSE); @@ -258,13 +220,20 @@ public class GenerateServiceImpl extends ServiceImpl i generateDetail.setGenerateId(generate.getId()); generateDetail.setCreateDate(LocalDateTime.now()); generateDetail.setMd5(md5); + // 将相应的url保存到数据库 generateDetailMapper.insert(generateDetail); String key = generateResultKey + ":" + taskId; String imageName = url.substring(url.lastIndexOf("/") + 1); String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success"; GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, status, category); + // 更新redis redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + + // 执行积分扣除 + String accountId = taskId.substring(taskId.lastIndexOf("-") + 1); + String uuid = taskId.substring(0,taskId.substring(0, taskId.lastIndexOf("-")).lastIndexOf("-")); + creditsService.taskCreditsDeduction(Long.parseLong(accountId), uuid); } @Resource @@ -506,7 +475,7 @@ public class GenerateServiceImpl extends ServiceImpl i return new PrepareForGenerateVO(0); } } - + CreditsEventsEnum creditsEventsEnum = null; int times = 4; // 当level1Type为Print_board时,level2Type为pattern时需要确定generateType if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())){ @@ -524,6 +493,7 @@ public class GenerateServiceImpl extends ServiceImpl i validateGeneraType(generate, text, elementId); // 校验后获取 generateThroughImageTextDTO.setGenerateType(generate.getGenerateType()); + creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; } // Slogan 参数校验 if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())){ @@ -559,6 +529,7 @@ public class GenerateServiceImpl extends ServiceImpl i generateThroughImageTextDTO.setCollectionElementId(collectionElement.getId()); generateThroughImageTextDTO.setSloganBase64(null); generateThroughImageTextDTO.setDesignType("collection"); + creditsEventsEnum = CreditsEventsEnum.SLOGAN; } // Logo参数校验 @@ -575,10 +546,17 @@ public class GenerateServiceImpl extends ServiceImpl i if (seed < 0 || seed > 99999){ throw new BusinessException("the.value.range.of.seed"); } + creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; } } - // 2、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 + // 2、判断用户当前积分是否够本次生成消耗 + Boolean preDeduction = creditsService.creditsPreDeduction(creditsEventsEnum, 1); + if (!preDeduction) { + throw new BusinessException("Not enough Credits"); + } + + // 3、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 String uuid = UUID.randomUUID().toString(); ArrayList taskIdList = new ArrayList<>(); @@ -589,7 +567,7 @@ public class GenerateServiceImpl extends ServiceImpl i generateThroughImageTextDTO.setUniqueId(temp); String jsonString = JSON.toJSONString(generateThroughImageTextDTO); - // 3、加入redis排队,便于获取实时排队信息 + // 4、加入redis排队,便于获取实时排队信息 Double maxScore = redisUtil.getMaxScore(consumptionOrderKey); redisUtil.addToZSet(consumptionOrderKey, temp, maxScore); @@ -598,11 +576,14 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Waiting"); redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); - // 4、将消息发布到MQ消息队列 + // 5、将消息发布到MQ消息队列 rabbitMQService.publishMessageToGenerate(jsonString); } - // 5、返回唯一id + // 6、添加预扣除积分到redis + creditsService.addRecordToCreditsDeduction(generateThroughImageTextDTO.getUserId(), uuid, creditsEventsEnum); + + // 7、返回唯一id return new PrepareForGenerateVO(taskIdList, 2 - trialsCount); } @@ -612,57 +593,6 @@ public class GenerateServiceImpl extends ServiceImpl i return redisUtil.getRank(consumptionOrderKey, uniqueId); } - /*@Override - public GenerateCollectionVO getGenerateResult(String uniqueId) { - // 1、判断该请求是否已经异常 - Boolean isMember = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId); - if (isMember) { - throw new BusinessException("generate.interface.error"); - } - - // 2、判断该请求是否还在排队 - Boolean existsInZSet = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId); - if (existsInZSet) { - // 排队中,给出当前排序位置,rank从0开始 - Long rankPosition = getRankPosition(uniqueId); - // 有9个消费者,所以当rank>8即当前请求至少排在第九位时,其实际排队位置为9-8+1,当rank <=8,请求均在处理中 - return new GenerateCollectionVO(rankPosition > 8L ? rankPosition - 8 + 1 : 1L); - } - - // 3、判断redis中有没有 - boolean hasHashKey = redisUtil.isElementExistsInMap(resultMapKey, uniqueId); - if (hasHashKey) { - // 3.1 有直接从redis中拿 - String resultString = redisUtil.getMapValue(resultMapKey, uniqueId); - return JSONObject.parseObject(resultString, GenerateCollectionVO.class); - } - - // 3.2 判断数据库中有没有 - Generate generate = selectByUniqueId(uniqueId); - if (Objects.isNull(generate)) { - // 3.3 还没执行完,给出当前位置 - return new GenerateCollectionVO(1L); - } - Long generateId = generate.getId(); - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("generate_id", generateId); - List generateDetails = generateDetailMapper.selectList(qw); - if (CollectionUtils.isEmpty(generateDetails)) { - // 会有这种情况吗?存到generate中,但是还没存到generateDetail中 - return new GenerateCollectionVO(1L); - } - - List generatedCollectionItems = new ArrayList<>(); - generateDetails.forEach(item -> { - GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); - generateCollectionItemVO.setGenerateItemId(item.getId()); - generateCollectionItemVO.setGenerateItemUrl(minioUtil.getPresignedUrl(item.getUrl(), 24 * 60)); - generatedCollectionItems.add(generateCollectionItemVO); - }); - - return new GenerateCollectionVO(generateId, null, generatedCollectionItems); - }*/ - @Override public List getGenerateResultList(List taskIdList) { List results = new ArrayList<>(); diff --git a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java index ee1fb6ff..be795aa4 100644 --- a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java @@ -109,7 +109,8 @@ public class SuperResolutionServiceImpl extends ServiceImpl Date: Fri, 21 Jun 2024 15:11:31 +0800 Subject: [PATCH 30/79] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9F=A5=E8=AF=A2Code-?= =?UTF-8?q?Create=E6=95=B0=E6=8D=AE=E5=BA=93=EF=BC=8C=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=98=E8=B4=B9=E8=AE=B0=E5=BD=95=E5=B9=B6?= =?UTF-8?q?=E5=AF=B9=E4=BB=98=E8=B4=B9=E7=94=A8=E6=88=B7=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=96=B0=E5=A2=9E=E6=88=96=E5=BB=B6=E9=95=BF?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=9C=89=E6=95=88=E6=9C=9F=E7=9A=84=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/task/AccountTask.java | 26 ++++++++ .../ai/da/mapper/primary/entity/Account.java | 9 ++- .../com/ai/da/model/dto/AccountAddDTO.java | 14 +++- .../com/ai/da/service/AccountService.java | 4 ++ .../da/service/impl/AccountServiceImpl.java | 66 +++++++++++++++---- 5 files changed, 104 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/ai/da/common/task/AccountTask.java diff --git a/src/main/java/com/ai/da/common/task/AccountTask.java b/src/main/java/com/ai/da/common/task/AccountTask.java new file mode 100644 index 00000000..04b57b46 --- /dev/null +++ b/src/main/java/com/ai/da/common/task/AccountTask.java @@ -0,0 +1,26 @@ +package com.ai.da.common.task; + +import com.ai.da.service.AccountService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class AccountTask { + + @Resource + private AccountService accountService; + + /** 每个月1号凌晨刷新 年付用户的积分 */ +// @Scheduled(cron = "0 0 0 1 * ?") + public void refreshCreditsMonthly(){ + accountService.refreshCreditsMonthly(); + } + + // todo 多久执行一次? + public void getPaidUser(){ + // 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单 + accountService.extendValidityForCC(); + } +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Account.java b/src/main/java/com/ai/da/mapper/primary/entity/Account.java index 025f49ef..f9f37fd9 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Account.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Account.java @@ -87,5 +87,12 @@ public class Account implements Serializable { */ private BigDecimal credits; - private Integer SystemUser; + /** + * 用于区分游客与系统用户 + * 0 : 游客 + * 1 : 年付用户 + * 2 : 月付用户 + * 3 : 试用用户 + */ + private Integer systemUser; } diff --git a/src/main/java/com/ai/da/model/dto/AccountAddDTO.java b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java index 22de2a4f..5f054973 100644 --- a/src/main/java/com/ai/da/model/dto/AccountAddDTO.java +++ b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java @@ -2,23 +2,27 @@ package com.ai.da.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; import lombok.Data; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import java.math.BigDecimal; @Data @ApiModel("AccountAdd") +@AllArgsConstructor public class AccountAddDTO { @NotBlank(message = "email.cannot.be.empty") - @ApiModelProperty("email") - private String email; + @ApiModelProperty("userEmail") + private String userEmail; @NotBlank(message = "userName.cannot.be.empty") @ApiModelProperty("userName") private String userName; + private String country; + @NotBlank(message = "validStartTime.cannot.be.empty") @ApiModelProperty("Start time of account validity ") private String validStartTime; @@ -29,4 +33,8 @@ public class AccountAddDTO { private Integer isTrial; + private BigDecimal credits; + + private Integer systemUser; + } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index f6254484..bf6b72db 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -135,5 +135,9 @@ public interface AccountService extends IService { AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); + Boolean extendValidityForCC(); + Boolean collectQuestionnaires(String questionnaireInfo); + + void refreshCreditsMonthly(); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 3d41c2a2..afc5a849 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.AuthenticationOperationTypeEnum; +import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.enums.LoginTypeEnum; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.security.jwt.JWTTokenHelper; @@ -22,6 +23,7 @@ import com.ai.da.model.vo.QuestionnaireVO; import com.ai.da.service.*; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -383,15 +385,18 @@ public class AccountServiceImpl extends ServiceImpl impl @Override public Boolean addUser(AccountAddDTO accountAddDTO) { - Account account = new Account(); - account.setUserEmail(accountAddDTO.getEmail()); - account.setUserPassword("Third-000000"); - account.setUserName(accountAddDTO.getUserName()); + Account account; + account = CopyUtil.copyObject(accountAddDTO,Account.class); +// account.setUserEmail(accountAddDTO.getUserEmail()); +// account.setUserName(accountAddDTO.getUserName()); +// account.setIsTrial(accountAddDTO.getIsTrial()); account.setValidStartTime(Long.valueOf(accountAddDTO.getValidStartTime())); account.setValidEndTime(Long.valueOf(accountAddDTO.getValidEndTime())); + account.setUserPassword("Third-000000"); + account.setLanguage(Language.ENGLISH.name()); account.setCreateDate(new Date()); - account.setIsTrial(accountAddDTO.getIsTrial()); - account.setSystemUser(1); + account.setIsTrial(0); + account.setIsBeginner(1); return accountMapper.insert(account) > 0; } @@ -1010,10 +1015,10 @@ public class AccountServiceImpl extends ServiceImpl impl } private static final String QUERY_ORDER = "SELECT * FROM pmr_wc_order_stats " + - "WHERE status = 'wc-processing' AND date_paid > '2024-06-10 00:00:00'" + + "WHERE status = 'wc-processing' AND date_paid > '2024-06-20 00:00:00'" + " ORDER BY order_id DESC "; - private static final String QUERY_CUSTOMER_EMAIL = "SELECT username, email FROM pmr_wc_customer_lookup " + + private static final String QUERY_CUSTOMER_EMAIL = "SELECT username, email, country FROM pmr_wc_customer_lookup " + "WHERE customer_id = ? "; private static final String UPDATE_ORDER_STATUS = "UPDATE pmr_wc_order_stats " + "SET status = 'wc-complete' , date_completed = ? " + @@ -1037,7 +1042,9 @@ public class AccountServiceImpl extends ServiceImpl impl * * @return null */ - public String extendValidityForCC() { + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean extendValidityForCC() { try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(QUERY_ORDER)) { // preparedStatement.setString(1, "someCondition"); @@ -1049,6 +1056,8 @@ public class AccountServiceImpl extends ServiceImpl impl double totalSales = queryOrderResultSet.getDouble("total_sales"); String email = ""; String userName = ""; + // 为什么一般没有值 + String country = ""; // 1、查pmr_wc_customer_lookup表;确认当前订单对应的用户邮箱 PreparedStatement preparedQueryEmail = connection.prepareStatement(QUERY_CUSTOMER_EMAIL); preparedQueryEmail.setInt(1, customerId); @@ -1056,6 +1065,7 @@ public class AccountServiceImpl extends ServiceImpl impl if (queryEmailResultSet.next()) { email = queryEmailResultSet.getString("email"); userName = queryEmailResultSet.getString("username"); + country = queryEmailResultSet.getString("country"); } else { log.error("未知错误。code-create的用户表中没有付费用户的信息"); throw new BusinessException("user info missing"); @@ -1083,7 +1093,27 @@ public class AccountServiceImpl extends ServiceImpl impl if (flag) { // 是新用户 => 新增一条数据 - Boolean b = addUser(new AccountAddDTO(email, StringUtil.isNullOrEmpty(userName) ? email.substring(0, email.indexOf("@") - 1) : userName, account.getValidStartTime().toString(), account.getValidEndTime().toString(), 0)); + String credits = "0"; + int systemUserType = 0; + if (totalSales == 5000.0){ + log.info("年付用户,初始积分6000"); + credits = CreditsEventsEnum.INIT_MONTHLY.getValue(); + systemUserType = 1; + }else if (totalSales == 500.0){ + log.info("月付用户,初始积分5000"); + credits = CreditsEventsEnum.INIT_MONTHLY.getValue(); + systemUserType = 2; + }else if (totalSales == 0.0){ + log.info("测试用户,初始积分10"); + credits = "10"; + systemUserType = 3; + } + + Boolean b = addUser(new AccountAddDTO(email, + StringUtil.isNullOrEmpty(userName) ? email.substring(0, email.indexOf("@")) : userName, + country, + account.getValidStartTime().toString(), + account.getValidEndTime().toString(), 0,new BigDecimal(credits),systemUserType)); if (b) log.info("付费新用户新增成功!"); } else { userInfo.setValidEndTime(account.getValidEndTime()); @@ -1112,9 +1142,10 @@ public class AccountServiceImpl extends ServiceImpl impl } catch (Exception e) { // 记录异常并处理 e.printStackTrace(); + return Boolean.FALSE; } - return null; + return Boolean.TRUE; } private Account extendValidity(Long validEndTime, double totalSales) { @@ -1199,4 +1230,17 @@ public class AccountServiceImpl extends ServiceImpl impl return Boolean.TRUE; } + /** + * 为年费用户每月更新积分 + */ + public void refreshCreditsMonthly(){ + UpdateWrapper accountUpdateWrapper = new UpdateWrapper<>(); + // 刷新账号有效期截止之前的年付用户的积分 + long epochMilli = Instant.now().toEpochMilli(); + accountUpdateWrapper.lambda().set(Account::getCredits, CreditsEventsEnum.INIT_YEARLY.getValue()) + .eq(Account::getSystemUser,1) + .gt(Account::getValidEndTime, epochMilli); + baseMapper.update(null,accountUpdateWrapper); + } + } From 5113cb0606774ce7a722f32024b68f6de078b874 Mon Sep 17 00:00:00 2001 From: xupei Date: Sat, 22 Jun 2024 17:27:50 +0800 Subject: [PATCH 31/79] to product image 9996 -> 9994 --- src/main/java/com/ai/da/python/PythonService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 862a0a03..66d18ba9 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3326,7 +3326,8 @@ public class PythonService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() // .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") - .url(accessPythonIp + ":9996/api/generate_product_image") +// .url(accessPythonIp + ":9996/api/generate_product_image") + .url(accessPythonIp + ":9994/api/generate_product_image") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") From 57ab6c64ef121f728a1b7498d84ae0b928cb1c49 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 24 Jun 2024 14:33:34 +0800 Subject: [PATCH 32/79] =?UTF-8?q?flask=20=E8=BF=81=E7=A7=BB=E5=88=B0fast-a?= =?UTF-8?q?pi=209992=20->=209994?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java | 3 ++- src/main/resources/application-dev.properties | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index 9994bf73..79eb8b37 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -152,7 +152,8 @@ public class ChatRobotServiceImpl implements ChatRobotService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() // .url("http://127.0.0.1:5000/api/chat_stream_test") - .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") +// .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") + .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_robot") // .url(fastApiPythonAddress + "/api/chat_robot") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index e54dd61e..4b0ec1e3 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -43,7 +43,7 @@ spring.servlet.multipart.max-file-size = 10MB spring.servlet.multipart.max-request-size= 10MB #访问python服务的ip(对应环境) access.python.ip=http://18.167.251.121 -access.python.port=9992 +access.python.port=9994 access.python.generate_sr_port=9994 access.python.address=http://18.167.251.121:9994 From aacbe92cdc3a2efd7f4d76bd763053d39ae98905 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 24 Jun 2024 17:02:25 +0800 Subject: [PATCH 33/79] generate cancel --- .../ai/da/common/constant/CommonConstant.java | 4 ++++ .../ai/da/controller/GenerateController.java | 5 +++-- .../java/com/ai/da/python/PythonService.java | 10 +++++----- .../com/ai/da/service/GenerateService.java | 2 +- .../da/service/impl/ChatRobotServiceImpl.java | 4 ++-- .../ai/da/service/impl/CreditsServiceImpl.java | 9 ++++++++- .../da/service/impl/GenerateServiceImpl.java | 18 +++++++++++++----- 7 files changed, 36 insertions(+), 16 deletions(-) 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 eb325fe6..09496110 100644 --- a/src/main/java/com/ai/da/common/constant/CommonConstant.java +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -23,6 +23,10 @@ public class CommonConstant { public static final String GENERATE_SLOGAN = "/api/slogan"; + public static final String GENERATE_CANCEL = "/api/generate_cancel/"; + + public static final String GENERATE_LOGO_SINGLE_CANCEL = "/api/generate_single_logo_cancel/"; + public static final String PYTHON_PORT_9996 = "9996"; public static final String PYTHON_PORT_9997 = "9997"; diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java index 74743856..caa80dcc 100644 --- a/src/main/java/com/ai/da/controller/GenerateController.java +++ b/src/main/java/com/ai/da/controller/GenerateController.java @@ -63,8 +63,9 @@ public class GenerateController { @GetMapping("/stopWaiting") public Response stopWaiting(@RequestParam("userId") Long userId, @RequestParam("uniqueId") List uniqueId, - @RequestParam("timeZone") String timeZone) { - generateService.cancelGenerate(userId, uniqueId, timeZone); + @RequestParam("timeZone") String timeZone, + @RequestParam("type") String type) { + generateService.cancelGenerate(userId, uniqueId, timeZone, type); return Response.success("stop waiting successfully"); } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 66d18ba9..f64dc3ea 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3174,15 +3174,15 @@ public class PythonService { throw new BusinessException("cloth-classification.interface.exception"); } - public Boolean cancelGenerateTask(String taskId) { + public Boolean cancelGenerateTask(String taskId, String path) { OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) .build(); -// String url = accessPythonIp + ":" + accessPythonPort + "/api/generate_cancel/" + taskId; - String url = fastApiPythonAddress + "/api/generate_cancel/" + taskId; + String url = accessPythonIp + ":" + accessPythonPort + path + taskId; +// String url = fastApiPythonAddress + "/api/generate_cancel/" + taskId; Request request = new Request.Builder() .url(url) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") @@ -3193,14 +3193,14 @@ public class PythonService { log.info("cancelGenerateTask请求入参content###{}", taskId); response = client.newCall(request).execute(); } catch (IOException ioException) { - log.error("PythonService##cancelGenerateTask异常###{}", ExceptionUtil.getThrowableList(ioException)); + log.error("PythonService##cancelGenerateTask异常###{}", response); return null; } int responseCode = response.code(); response.close(); if (responseCode != HttpURLConnection.HTTP_OK) { - log.info("generate-python 取消请求失败"); + log.info("generate-python 取消请求失败. {}", response); return Boolean.FALSE; } log.info("generate-python 取消请求成功"); diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index 89fd6267..e706a8e6 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -35,5 +35,5 @@ public interface GenerateService extends IService { Long getRankPosition(String uniqueId); - void cancelGenerate(Long userId, List uniqueId, String timeZone); + void cancelGenerate(Long userId, List uniqueId, String timeZone, String type); } diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index 9994bf73..b03e181f 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -152,8 +152,8 @@ public class ChatRobotServiceImpl implements ChatRobotService { RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() // .url("http://127.0.0.1:5000/api/chat_stream_test") - .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") -// .url(fastApiPythonAddress + "/api/chat_robot") +// .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_stream_test") + .url(accessPythonIp + ":" + accessPythonPort + "/api/chat_robot") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) .addHeader("Content-Type", "application/json") diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 61b67921..e245145f 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import io.netty.util.internal.StringUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,6 +32,7 @@ import java.util.Objects; import java.util.Set; @Service +@Slf4j public class CreditsServiceImpl extends ServiceImpl implements CreditsService { @Value("${redis.key.credits.pre-deduction}") @@ -224,13 +226,18 @@ public class CreditsServiceImpl extends ServiceImpl i return new PrepareForGenerateVO(0); } } - CreditsEventsEnum creditsEventsEnum = null; + CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; int times = 4; // 当level1Type为Print_board时,level2Type为pattern时需要确定generateType if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())){ @@ -493,7 +493,6 @@ public class GenerateServiceImpl extends ServiceImpl i validateGeneraType(generate, text, elementId); // 校验后获取 generateThroughImageTextDTO.setGenerateType(generate.getGenerateType()); - creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; } // Slogan 参数校验 if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())){ @@ -546,7 +545,6 @@ public class GenerateServiceImpl extends ServiceImpl i if (seed < 0 || seed > 99999){ throw new BusinessException("the.value.range.of.seed"); } - creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; } } @@ -638,7 +636,7 @@ public class GenerateServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) - public void cancelGenerate(Long userId, List uniqueIdList, String timeZone) { + public void cancelGenerate(Long userId, List uniqueIdList, String timeZone, String type) { // todo 取消待优化 uniqueIdList.forEach(uniqueId -> { // 1、将需要取消的唯一id加入redis,以便及时取消生成 @@ -666,13 +664,23 @@ public class GenerateServiceImpl extends ServiceImpl i pythonService.cancelGenerateTask(uniqueId); } }*/ + String path; + if (type.equals("Logo")){ + path = CommonConstant.GENERATE_LOGO_SINGLE_CANCEL; + }else { + path = CommonConstant.GENERATE_CANCEL; + } String key = generateResultKey + ":" + uniqueId; GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); + if (Objects.isNull(generateResultVO)){ + log.warn("任务不存在,无法取消"); + return; + } // 判断当前task的状态是不是Fail if (!generateResultVO.getStatus().equals("Fail")) { // 2、不是,直接发送取消请求到python端 - pythonService.cancelGenerateTask(uniqueId); + pythonService.cancelGenerateTask(uniqueId, path); // 3、更改result中当前taskId的状态 redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(uniqueId, null, null, "Cancelled")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } From 5b3a668ce7842c99211030245fe420591261110c Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 25 Jun 2024 10:56:54 +0800 Subject: [PATCH 34/79] TASK:aida; --- src/main/java/com/ai/da/model/enums/StyleEnum.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/model/enums/StyleEnum.java b/src/main/java/com/ai/da/model/enums/StyleEnum.java index efae6d82..1b059f3f 100644 --- a/src/main/java/com/ai/da/model/enums/StyleEnum.java +++ b/src/main/java/com/ai/da/model/enums/StyleEnum.java @@ -6,7 +6,7 @@ import lombok.Getter; @Getter public enum StyleEnum { // 定义风格及其对应的中英文描述 - NEO_CHINESE("新中式", "Neo Chinese"), + NEW_CHINESE("新中式", "New Chinese"), COUNTRY_STYLE("田园风", "Country Style"), FUTURISM("未来主义", "Futurism"), MINIMALISM("极简风", "Minimalism"), From 9b589eece6b503248b50f7c442e1fb801e0b5a7e Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 25 Jun 2024 10:59:58 +0800 Subject: [PATCH 35/79] TASK:aida; --- .../ai/da/common/config/MyTaskScheduler.java | 5 +++- .../ai/da/controller/PortfolioController.java | 6 +++++ .../ai/da/controller/WorkspaceController.java | 4 ++-- .../secondary/AttributeRetrievalMapper.java | 4 ++++ .../secondary/entity/AttributeRetrieval.java | 6 ++--- .../ai/da/model/enums/StyleKeywordMapper.java | 2 +- .../java/com/ai/da/model/vo/WorkspaceVO.java | 2 ++ .../com/ai/da/service/PortfolioService.java | 2 ++ .../com/ai/da/service/WorkspaceService.java | 2 +- .../da/service/impl/PortfolioServiceImpl.java | 24 +++++++++++++++++++ .../da/service/impl/WorkspaceServiceImpl.java | 9 +++++-- .../secondary/AttributeRetrievalMapper.xml | 14 +++++++++++ 12 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index 514797f8..6fb19b5a 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -217,7 +217,10 @@ public class MyTaskScheduler { String directoryPath = "C:\\Users\\10233\\Downloads\\blouse done\\blouse done\\废土风"; List fileNames = getFileNames(directoryPath); for (String fileName : fileNames) { - + String tableName = "female_top"; + String style = "feitufeng"; + Long idByFileName = attributeRetrievalMapper.getIdByFileName(fileName, tableName); + attributeRetrievalMapper.updateStyleById(idByFileName, style, tableName); } } diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java index 725c178a..d2c2fcfd 100644 --- a/src/main/java/com/ai/da/controller/PortfolioController.java +++ b/src/main/java/com/ai/da/controller/PortfolioController.java @@ -105,4 +105,10 @@ public class PortfolioController { public Response viewsGet(@RequestParam("id") Long id) { return Response.success(portfolioService.viewsGet(id)); } + + @ApiOperation(value = "删除评论") + @PostMapping("/commentDelete") + public Response commentDelete(@Valid @RequestBody CommentDTO commentDTO) { + return Response.success(portfolioService.commentDelete(commentDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/WorkspaceController.java b/src/main/java/com/ai/da/controller/WorkspaceController.java index 883239a2..436da3d8 100644 --- a/src/main/java/com/ai/da/controller/WorkspaceController.java +++ b/src/main/java/com/ai/da/controller/WorkspaceController.java @@ -95,8 +95,8 @@ public class WorkspaceController { @GetMapping("/getMannequins") @ApiOperationSupport(order = 6) @ApiOperation(value = "获取模特") - public Response> getMannequins(@RequestParam("sex") String sex) { - List modelsVO = workspaceService.getMannequins(sex); + public Response> getMannequins(@RequestParam("sex") String sex, @RequestParam("style") String style) { + List modelsVO = workspaceService.getMannequins(sex, style); return Response.success(modelsVO); } diff --git a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java index cd657a7e..6b74dc9e 100644 --- a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java +++ b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java @@ -22,4 +22,8 @@ public interface AttributeRetrievalMapper { AttributeRetrieval getSystemRandom(String tableName); List getSystemSketchPoolBySameCategory(AttributeRetrieval attributeRetrievalAttrDict, String tableName); + + Long getIdByFileName(String fileName, String tableName); + + void updateStyleById(Long idByFileName, String style, String tableName); } diff --git a/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java index c8611586..84cc1b91 100644 --- a/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java +++ b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java @@ -18,7 +18,7 @@ public class AttributeRetrieval { private String openingType; private String subtype; - private String sleeve; - private String sleeve1; - private String sleeve2; + private String style; + + private Integer deprecated; } diff --git a/src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java b/src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java index 29debd77..6f13dd6e 100644 --- a/src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java +++ b/src/main/java/com/ai/da/model/enums/StyleKeywordMapper.java @@ -82,7 +82,7 @@ public class StyleKeywordMapper { wabiSabiKeywords.put("Printboard", Arrays.asList("natural materials such as wood", "stone", "hemp rope", "neutral tones and light colors")); wabiSabiKeywords.put("Sketchboard", Arrays.asList("a quiet and peaceful atmosphere")); - styleCategoryKeywords.put(StyleEnum.NEO_CHINESE, neoChineseKeywords); + styleCategoryKeywords.put(StyleEnum.NEW_CHINESE, neoChineseKeywords); styleCategoryKeywords.put(StyleEnum.COUNTRY_STYLE, countryStyleKeywords); styleCategoryKeywords.put(StyleEnum.FUTURISM, futurismKeywords); styleCategoryKeywords.put(StyleEnum.MINIMALISM, minimalistKeywords); diff --git a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java index 71710978..fdc911da 100644 --- a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java +++ b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java @@ -38,6 +38,8 @@ public class WorkspaceVO extends Workspace { private String styleName; + private String style; + private Map> allKeywordsByStyle; } diff --git a/src/main/java/com/ai/da/service/PortfolioService.java b/src/main/java/com/ai/da/service/PortfolioService.java index aa6ca14b..bd7fcbb4 100644 --- a/src/main/java/com/ai/da/service/PortfolioService.java +++ b/src/main/java/com/ai/da/service/PortfolioService.java @@ -35,4 +35,6 @@ public interface PortfolioService extends IService { Boolean viewsIncrease(Long id); Long viewsGet(Long id); + + Boolean commentDelete(CommentDTO commentDTO); } diff --git a/src/main/java/com/ai/da/service/WorkspaceService.java b/src/main/java/com/ai/da/service/WorkspaceService.java index e74489e5..83fb4090 100644 --- a/src/main/java/com/ai/da/service/WorkspaceService.java +++ b/src/main/java/com/ai/da/service/WorkspaceService.java @@ -40,7 +40,7 @@ public interface WorkspaceService extends IService { WorkspaceVO getByIdNew(Long id); - List getMannequins(String sex); + List getMannequins(String sex, String style); void systemFileCopy(); diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 3d347b4f..8e29615c 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -15,6 +15,7 @@ import com.ai.da.model.enums.Sex; import com.ai.da.model.vo.*; import com.ai.da.service.*; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -635,6 +636,29 @@ public class PortfolioServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(Comment::getParentLevel1Id, id) + .or() + .eq(Comment::getParentLevel2Id, id); + commentMapper.delete(lambdaQueryWrapper); + + return Boolean.TRUE; + } + private List getChildCommentVOList(Long id) { QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(Comment::getParentLevel1Id, id); diff --git a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java index 05bd6a2d..c48995bd 100644 --- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java @@ -310,7 +310,7 @@ public class WorkspaceServiceImpl extends ServiceImpl> allKeywordsByStyle = StyleKeywordMapper.getAllKeywordsByStyle(styleEnum); vo.setAllKeywordsByStyle(allKeywordsByStyle); if (authPrincipalVo.getLanguage().equals(Language.ENGLISH.name())) { @@ -323,7 +323,7 @@ public class WorkspaceServiceImpl extends ServiceImpl getMannequins(String sex) { + public List getMannequins(String sex, String style) { AuthPrincipalVo userInfo = UserContext.getUserHolder(); List result = new ArrayList<>(); QueryWrapper libraryQueryWrapper = new QueryWrapper<>(); @@ -350,6 +350,11 @@ public class WorkspaceServiceImpl extends ServiceImpl sysFileList = sysFileMapper.selectList(sysFileQueryWrapper); if (!CollectionUtils.isEmpty(sysFileList)) { List modelVOList = new ArrayList<>(); diff --git a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml index 434ab153..85113c9f 100644 --- a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml +++ b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml @@ -65,4 +65,18 @@ RAND() LIMIT 20 + + + + + update ${tableName} + set style = #{style} + where ID = #{id} + From 8ea06c05e916ddf7fbeda0ed82c094ca09ac914b Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 25 Jun 2024 12:18:18 +0800 Subject: [PATCH 36/79] =?UTF-8?q?1=E3=80=81generate=20=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E6=89=A3=E9=99=A4=E5=B9=B6=E6=B7=BB=E5=8A=A0=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E8=AF=A6=E7=BB=86=202=E3=80=81=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=9C=8D=E8=A3=85category=20bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/enums/CreditsEventsEnum.java | 8 +- .../mapper/primary/entity/CreditsDetail.java | 2 + .../java/com/ai/da/python/PythonService.java | 5 +- .../com/ai/da/service/CreditsService.java | 6 +- .../da/service/impl/CreditsServiceImpl.java | 76 ++++++++++++++++--- .../da/service/impl/GenerateServiceImpl.java | 60 +++++++++------ 6 files changed, 116 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index 2fcc8fde..adefd454 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -21,10 +21,14 @@ public enum CreditsEventsEnum { // SUPER_RESOLUTION("Super Resolution","30"), SUPER_RESOLUTION("Super Resolution","10"), SLOGAN("Slogan","10"), - NORMAL_GENERATE("Normal_Generate","5"), + LOGO("Logo","5"), + PATTERN("Pattern","5"), + MOOD_BOARD("MoodBoard","5"), + SKETCH_BOARD("SketchBoard","5"), + TO_PRODUCT_IMAGE("ToProductImage","5"), QUESTIONNAIRE("Questionnaire","100"), - OTHER("Other","10"); + OTHER("Other","5"); private String name; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java index 1422ba4c..8a0aa02a 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java @@ -12,6 +12,8 @@ import java.math.BigDecimal; public class CreditsDetail extends BaseEntity { /** 用户id */ private Long accountId; + /** 任务id或uuid */ + private String taskId; /** 积分变更事件 */ private String changeEvent; /** 变更积分 ( + 表示加,- 表示减) */ diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index f64dc3ea..754c7ade 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3160,8 +3160,9 @@ public class PythonService { try { Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful"); if (result && jsonObject.get("msg").equals("OK!")) { - JSONObject data = jsonObject.getJSONObject("data"); - JSONArray list = JSONArray.parseArray(data.get("list").toString()); +// JSONObject data = jsonObject.getJSONObject("data"); +// JSONArray list = JSONArray.parseArray(data.get("list").toString()); + JSONArray list = jsonObject.getJSONArray("data"); JSONObject map = (JSONObject) list.get(0); return map.get("category").toString(); } diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index ec2592c4..faf19ce7 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -29,7 +29,11 @@ public interface CreditsService extends IService { void addRecordToCreditsDeduction(Long accountId, String taskId, CreditsEventsEnum creditsEventsEnum); - void taskCreditsDeduction(Long accountId, String taskId); + Boolean taskCreditsDeduction(Long accountId, String taskId); CreditsDetail getByAccountIdAndChangeEvent(Long accountId, String changeEvent, String changedCredits); + + void preInsert(Long accountId, String changeEventName, String taskId); + + void updateChangedCredits(String accountId, String taskId); } diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index e245145f..4ddbc568 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -14,6 +14,7 @@ import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO; import com.ai.da.service.AccountService; import com.ai.da.service.CreditsService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import io.netty.util.internal.StringUtil; @@ -190,8 +191,10 @@ public class CreditsServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); qw.eq("account_id", accountId); qw.eq("change_event", changeEvent); @@ -258,4 +264,50 @@ public class CreditsServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("account_id", accountId) + .eq("task_id", taskId); + + CreditsDetail creditsDetail = baseMapper.selectOne(queryWrapper); + String changeEvent = creditsDetail.getChangeEvent(); + BigDecimal currentCredits = creditsDetail.getCredits(); + String credits = "0"; + if (changeEvent.equals("Logo") || + changeEvent.equals("Pattern") || + changeEvent.equals("MoodBoard") || + changeEvent.equals("SketchBoard")) { + credits = CreditsEventsEnum.LOGO.getValue(); + }else if (changeEvent.equals("Slogan")){ + credits = CreditsEventsEnum.SLOGAN.getValue(); + } + + BigDecimal finalCredits = currentCredits.subtract(new BigDecimal(credits)); + String changeCredits = "-" + credits; + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda() + .eq(CreditsDetail::getTaskId, taskId) + .set(CreditsDetail::getChangedCredits, changeCredits) + .set(CreditsDetail::getCredits, finalCredits); + + baseMapper.update(null, updateWrapper); + + } + } 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 1b30e1ac..a122a1a4 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -143,11 +143,11 @@ public class GenerateServiceImpl extends ServiceImpl i String jsonString = ""; HashMap params = new HashMap<>(); // 3.1 确定不同类型的印花分别调哪个接口 - if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())){ - switch(generateThroughImageTextDTO.getLevel2Type()){ + if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) { + switch (generateThroughImageTextDTO.getLevel2Type()) { case "Logo": path = CommonConstant.GENERATE_SINGLE_LOGO; - params.put("tasks_id",generateThroughImageTextDTO.getUniqueId()); + params.put("tasks_id", generateThroughImageTextDTO.getUniqueId()); params.put("prompt", text); params.put("seed", generateThroughImageTextDTO.getSeed()); jsonString = JSON.toJSONString(params, SerializerFeature.WriteMapNullValue); @@ -155,8 +155,8 @@ public class GenerateServiceImpl extends ServiceImpl i case "Slogan": path = CommonConstant.GENERATE_SLOGAN; port = CommonConstant.PYTHON_PORT_9997; - params.put("num_point","16"); - params.put("tasks_id",generateThroughImageTextDTO.getUniqueId()); + params.put("num_point", "16"); + params.put("tasks_id", generateThroughImageTextDTO.getUniqueId()); params.put("prompt", text); params.put("image_url", collectionElement.getUrl()); jsonString = JSON.toJSONString(params, SerializerFeature.WriteMapNullValue); @@ -166,7 +166,7 @@ public class GenerateServiceImpl extends ServiceImpl i mode, category, generateThroughImageTextDTO.getGender()); jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue); } - }else { + } else { GenerateToPythonDTO generateToPythonDTO = new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), mode, category, generateThroughImageTextDTO.getGender()); jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue); @@ -231,9 +231,13 @@ public class GenerateServiceImpl extends ServiceImpl i redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); // 执行积分扣除 - String accountId = taskId.substring(taskId.lastIndexOf("-") + 1); - String uuid = taskId.substring(0,taskId.substring(0, taskId.lastIndexOf("-")).lastIndexOf("-")); - creditsService.taskCreditsDeduction(Long.parseLong(accountId), uuid); + // ** 注:如果生成的图片都是空白 则不扣积分 + if (!status.equals("Invalid")){ + String accountId = taskId.substring(taskId.lastIndexOf("-") + 1); + String uuid = taskId.substring(0, taskId.substring(0, taskId.lastIndexOf("-")).lastIndexOf("-")); + Boolean flag = creditsService.taskCreditsDeduction(Long.parseLong(accountId), uuid); + if (flag) creditsService.updateChangedCredits(accountId, uuid); + } } @Resource @@ -315,7 +319,7 @@ public class GenerateServiceImpl extends ServiceImpl i text = "Flat coating,romantic,soft,pencil strokes,accentuating and widening the depth of pencil strokes,paper patterns,block colors,crayons,reducing image contrast,and hand drawn painting marks," + translated + ", fabric print, high quality"; } else if (userInput.contains("Real Style")) { text = "Still life photography,hyper realism,3d,deepened projection,increased permutation value,increased concavity and convexity value," + translated + ", fabric print, high quality"; - }else { + } else { text = translated; } // text = userInput + ", fabric print, high quality"; @@ -475,33 +479,34 @@ public class GenerateServiceImpl extends ServiceImpl i return new PrepareForGenerateVO(0); } } - CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; + CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.OTHER; int times = 4; // 当level1Type为Print_board时,level2Type为pattern时需要确定generateType - if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())){ - if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getLevel2Type())){ + if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) { + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getLevel2Type())) { throw new BusinessException("level2Type.cannot.be.empty"); - }else if (!CollectionLevel2TypeEnum.printType().contains(generateThroughImageTextDTO.getLevel2Type())){ + } else if (!CollectionLevel2TypeEnum.printType().contains(generateThroughImageTextDTO.getLevel2Type())) { throw new BusinessException("unknown.parameter.level2Type"); } // Pattern 参数校验 - if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.Pattern.getRealName())){ + if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.Pattern.getRealName())) { String text = generateThroughImageTextDTO.getText(); Long elementId = generateThroughImageTextDTO.getCollectionElementId(); Generate generate = new Generate(); validateGeneraType(generate, text, elementId); // 校验后获取 generateThroughImageTextDTO.setGenerateType(generate.getGenerateType()); + creditsEventsEnum = CreditsEventsEnum.PATTERN; } // Slogan 参数校验 - if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())){ - if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getSloganBase64())){ + if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())) { + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getSloganBase64())) { log.error("Printboard-Slogan模式下,slogan image为空"); throw new BusinessException("slogan.image.cannot.be.empty"); } - if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText())){ + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText())) { log.error("Printboard-Slogan模式下,slogan text为空"); throw new BusinessException("slogan.style.cannot.be.empty"); } @@ -532,20 +537,25 @@ public class GenerateServiceImpl extends ServiceImpl i } // Logo参数校验 - if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.LOGO.getRealName())){ + if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.LOGO.getRealName())) { // logo模式下一次只生成一张 times = 1; // 校验是否输入内容 - if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText().trim())){ + if (StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText().trim())) { throw new BusinessException("please.input.the.prompt"); } // 校验seed的取值范围 int seed = Integer.parseInt(generateThroughImageTextDTO.getSeed()); - if (seed < 0 || seed > 99999){ + if (seed < 0 || seed > 99999) { throw new BusinessException("the.value.range.of.seed"); } + creditsEventsEnum = CreditsEventsEnum.LOGO; } + } else if (generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())) { + creditsEventsEnum = CreditsEventsEnum.MOOD_BOARD; + } else if (generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName())) { + creditsEventsEnum = CreditsEventsEnum.SKETCH_BOARD; } // 2、判断用户当前积分是否够本次生成消耗 @@ -580,6 +590,8 @@ public class GenerateServiceImpl extends ServiceImpl i // 6、添加预扣除积分到redis creditsService.addRecordToCreditsDeduction(generateThroughImageTextDTO.getUserId(), uuid, creditsEventsEnum); + // 6.1 添加积分扣除记录到db + creditsService.preInsert(generateThroughImageTextDTO.getUserId(), creditsEventsEnum.getName(), uuid); // 7、返回唯一id return new PrepareForGenerateVO(taskIdList, 2 - trialsCount); @@ -665,15 +677,15 @@ public class GenerateServiceImpl extends ServiceImpl i } }*/ String path; - if (type.equals("Logo")){ + if (type.equals("Logo")) { path = CommonConstant.GENERATE_LOGO_SINGLE_CANCEL; - }else { + } else { path = CommonConstant.GENERATE_CANCEL; } String key = generateResultKey + ":" + uniqueId; GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); - if (Objects.isNull(generateResultVO)){ + if (Objects.isNull(generateResultVO)) { log.warn("任务不存在,无法取消"); return; } From 3e150b206717115d880c4c53dc4094991762b0d9 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 25 Jun 2024 15:29:19 +0800 Subject: [PATCH 37/79] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=9C=8D=E8=A3=85categ?= =?UTF-8?q?ory=20bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/python/PythonService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 66d18ba9..a911fe84 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3160,8 +3160,9 @@ public class PythonService { try { Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful"); if (result && jsonObject.get("msg").equals("OK!")) { - JSONObject data = jsonObject.getJSONObject("data"); - JSONArray list = JSONArray.parseArray(data.get("list").toString()); +// JSONObject data = jsonObject.getJSONObject("data"); +// JSONArray list = JSONArray.parseArray(data.get("list").toString()); + JSONArray list = jsonObject.getJSONArray("data"); JSONObject map = (JSONObject) list.get(0); return map.get("category").toString(); } From a5bfc4e41d52b971c9898cd20e0b19f5c441f07f Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 25 Jun 2024 16:43:29 +0800 Subject: [PATCH 38/79] TASK:aida; --- .../da/common/RabbitMQ/GenerateConsumer.java | 178 ++++++++++++------ .../com/ai/da/common/RabbitMQ/MQConfig.java | 2 + .../com/ai/da/common/RabbitMQ/SRConsumer.java | 24 +-- .../controller/SavedCollectionController.java | 19 +- .../primary/entity/ToProductImageResult.java | 3 + .../com/ai/da/model/vo/MagicToolResultVO.java | 25 +++ .../java/com/ai/da/model/vo/WorkspaceVO.java | 2 +- .../com/ai/da/service/GenerateService.java | 2 + .../ai/da/service/UserLikeGroupService.java | 6 +- .../da/service/impl/GenerateServiceImpl.java | 25 +++ .../impl/UserLikeGroupServiceImpl.java | 133 +++++++++++-- .../da/service/impl/WorkspaceServiceImpl.java | 9 + 12 files changed, 338 insertions(+), 90 deletions(-) create mode 100644 src/main/java/com/ai/da/model/vo/MagicToolResultVO.java diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 14c8cae5..88d5ae19 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -46,6 +46,8 @@ public class GenerateConsumer { private String generateResultKey; @Value("${redis.key.toProductImageResultKey}") private String toProductImageResultKey; + @Value("${redis.key.relightResultKey}") + private String relightResultKey; public void generate(Message msg, Channel channel, String consumerName) { log.info("============start listening=========="); @@ -204,73 +206,125 @@ public class GenerateConsumer { long end = System.currentTimeMillis(); log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); - log.info("============ProcessGenerateResult End listening=========="); - + log.info("============ProcessToProductImageResult End listening=========="); } - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer1(Message msg, Channel channel) { - generate(msg, channel, "consumer 1"); + private void processRelightResult(Message msg, Channel channel) { + log.info("============processRelightResult listening=========="); + long start = System.currentTimeMillis(); + + Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("toProductImage response : {}", generateResult); + + try { + log.info("tasks_id : {} start ", generateResult.get("tasks_id")); + if (generateResult.get("status").equals("SUCCESS")) { + String url = generateResult.get("image_url"); + String taskId = generateResult.get("tasks_id"); + String category = generateResult.get("category"); + generateService.processRelightResult(taskId, url, category); + } else { + // 修改redis中的数据状态为exception + String key = relightResultKey + ":" + generateResult.get("tasks_id"); + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data")); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + } catch (Exception e) { + log.error(e.getMessage()); + try { + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id")); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + // 将入参和错误信息存入数据库 + String exceptionMessage = JSONObject.toJSONString(generateResult) + + " Exception message : " + e.getMessage(); + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + + long end = System.currentTimeMillis(); + log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); + log.info("============ProcessRelightResult End listening=========="); } - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer2(Message msg, Channel channel) { - generate(msg, channel, "consumer 2"); - } +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer1(Message msg, Channel channel) { +// generate(msg, channel, "consumer 1"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer2(Message msg, Channel channel) { +// generate(msg, channel, "consumer 2"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer3(Message msg, Channel channel) { +// generate(msg, channel, "consumer 3"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer4(Message msg, Channel channel) { +// generate(msg, channel, "consumer 4"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer5(Message msg, Channel channel) { +// generate(msg, channel, "consumer 5"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer6(Message msg, Channel channel) { +// generate(msg, channel, "consumer 6"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer7(Message msg, Channel channel) { +// generate(msg, channel, "consumer 7"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer8(Message msg, Channel channel) { +// generate(msg, channel, "consumer 8"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) +// @RabbitHandler +// public void generateConsumer9(Message msg, Channel channel) { +// generate(msg, channel, "consumer 9"); +// } +// +// @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) +// @RabbitHandler +// public void getGenerateResult(Message msg, Channel channel) { +// processGenerateResult(msg, channel); +// } +// +// @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) +// @RabbitHandler +// public void getToProductImageResult(Message msg, Channel channel) { +// processToProductImageResult(msg, channel); +// } - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitListener(queues = MQConfig.RELIGHT_RESULT_QUEUE) @RabbitHandler - public void generateConsumer3(Message msg, Channel channel) { - generate(msg, channel, "consumer 3"); - } - - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer4(Message msg, Channel channel) { - generate(msg, channel, "consumer 4"); - } - - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer5(Message msg, Channel channel) { - generate(msg, channel, "consumer 5"); - } - - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer6(Message msg, Channel channel) { - generate(msg, channel, "consumer 6"); - } - - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer7(Message msg, Channel channel) { - generate(msg, channel, "consumer 7"); - } - - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer8(Message msg, Channel channel) { - generate(msg, channel, "consumer 8"); - } - - @RabbitListener(queues = MQConfig.GENERATE_QUEUE) - @RabbitHandler - public void generateConsumer9(Message msg, Channel channel) { - generate(msg, channel, "consumer 9"); - } - - @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) - @RabbitHandler - public void getGenerateResult(Message msg, Channel channel) { - processGenerateResult(msg, channel); - } - - @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) - @RabbitHandler - public void getToProductImageResult(Message msg, Channel channel) { - processToProductImageResult(msg, channel); + public void getRelightResult(Message msg, Channel channel) { + processRelightResult(msg, channel); } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index eb0af5cc..b44bea8c 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -27,6 +27,8 @@ public class MQConfig { public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; + + public static final String RELIGHT_RESULT_QUEUE = "Relight-local"; public MQConfig() { } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java index 6ad261bd..b8ba32f2 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java @@ -218,17 +218,17 @@ public class SRConsumer { taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null); } - @RabbitListener(queues = MQConfig.SR_QUEUE) - @RabbitHandler - public void SRConsumer1(Message msg, Channel channel) { - superResolution(msg, channel, "consumer 1"); - } - - - @RabbitListener(queues = MQConfig.SR_RESULT_QUEUE) - @RabbitHandler - public void SRResultConsumer1(Message msg, Channel channel) { - getSRResult(msg, channel, "consumer 1"); - } +// @RabbitListener(queues = MQConfig.SR_QUEUE) +// @RabbitHandler +// public void SRConsumer1(Message msg, Channel channel) { +// superResolution(msg, channel, "consumer 1"); +// } +// +// +// @RabbitListener(queues = MQConfig.SR_RESULT_QUEUE) +// @RabbitHandler +// public void SRResultConsumer1(Message msg, Channel channel) { +// getSRResult(msg, channel, "consumer 1"); +// } } diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index 5b467720..d832bdb9 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -196,9 +196,9 @@ public class SavedCollectionController { @ApiOperation(value = "获取生成结果") @PostMapping("/toProductImageResult") - public Response> getToProductImageResult(@Valid @RequestBody List taskIdList) { - List generateResult = userLikeGroupService.getToProductImageResultList(taskIdList); - return Response.success(generateResult); + public Response> getToProductImageResult(@Valid @RequestBody List taskIdList) { + List magicToolResultVOList = userLikeGroupService.getToProductImageResultList(taskIdList); + return Response.success(magicToolResultVOList); } @ApiOperation(value = "画布用户上传元素") @@ -212,4 +212,17 @@ public class SavedCollectionController { public Response> productImageLikeList(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { return Response.success(userLikeGroupService.productImageLikeList(toProductImageDTO)); } + + @ApiOperation(value = "relight") + @PostMapping("/relight") + public Response> relight(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { + return Response.success(userLikeGroupService.relight(toProductImageDTO)); + } + + @ApiOperation(value = "获取relight结果") + @PostMapping("/relightResult") + public Response> getRelightResult(@Valid @RequestBody List taskIdList) { + List magicToolResultVOList = userLikeGroupService.getRelightResult(taskIdList); + return Response.success(magicToolResultVOList); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java index f81f255b..4731a6dd 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java @@ -39,4 +39,7 @@ public class ToProductImageResult implements Serializable { @ApiModelProperty(value = "userLikeGroupId") private Long userLikeGroupId; + + @ApiModelProperty(value = "generate 结果类型") + private String resultType; } diff --git a/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java b/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java new file mode 100644 index 00000000..2aabb67d --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@ApiModel("generate result 响应") +@AllArgsConstructor +@NoArgsConstructor +public class MagicToolResultVO { + + private String taskId; + + private Long id; + + private String url; + + private String status; + + private String category; + + private String sourceUrl; +} diff --git a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java index fdc911da..9fd8d049 100644 --- a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java +++ b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java @@ -24,7 +24,7 @@ public class WorkspaceVO extends Workspace { private static final long serialVersionUID = 1L; - private Long currentId; + private Long styleId; private PageBaseResponse page; diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index 89fd6267..81b772db 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -36,4 +36,6 @@ public interface GenerateService extends IService { Long getRankPosition(String uniqueId); void cancelGenerate(Long userId, List uniqueId, String timeZone); + + void processRelightResult(String taskId, String url, String category); } diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index 05837ef4..9ebc1527 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -47,7 +47,7 @@ public interface UserLikeGroupService extends IService { Boolean productImageLike(ProductImageLikeDTO productImageLikeDTO); - List getToProductImageResultList(List taskIdList); + List getToProductImageResultList(List taskIdList); JSONObject exportSearch(Long userLikeGroupId); @@ -56,4 +56,8 @@ public interface UserLikeGroupService extends IService { List productImageLikeList(ToProductImageDTO toProductImageDTO); Boolean productImageUnLike(ProductImageLikeDTO productImageLikeDTO); + + List relight(ToProductImageDTO toProductImageDTO); + + List getRelightResult(List taskIdList); } 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 ec5511bf..12af4462 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -85,6 +85,9 @@ public class GenerateServiceImpl extends ServiceImpl i @Value("${minio.bucketName.slogan}") private String sloganBucket; + @Value("${redis.key.relightResultKey}") + private String relightResultKey; + @Value("${redis.key.toProductImageResultKey}") private String toProductImageResultKey; @@ -282,6 +285,7 @@ public class GenerateServiceImpl extends ServiceImpl i } ToProductImageResult toProductImageResult = toProductImageResults.get(0); toProductImageResult.setUrl(url); + toProductImageResult.setResultType("ToProductImage"); toProductImageResultMapper.updateById(toProductImageResult); String key = toProductImageResultKey + ":" + taskId; @@ -755,6 +759,27 @@ public class GenerateServiceImpl extends ServiceImpl i } + @Override + public void processRelightResult(String taskId, String url, String category) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getTaskId, taskId); + List toProductImageResults = toProductImageResultMapper.selectList(qw); + if (CollectionUtils.isEmpty(toProductImageResults)) { + return; +// throw new BusinessException(""); + } + ToProductImageResult toProductImageResult = toProductImageResults.get(0); + toProductImageResult.setUrl(url); + toProductImageResult.setResultType("Relight"); + toProductImageResultMapper.updateById(toProductImageResult); + + String key = relightResultKey + ":" + taskId; + String imageName = url.substring(url.lastIndexOf("/") + 1); + String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success"; + GenerateResultVO generateResultVO = new GenerateResultVO(taskId, toProductImageResult.getId(), url, status, category); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + } + // 判断试用用户试用generate机会是否使用完毕 每个board 3次机会 private int getTrialsCount(Long userId, String level1Type) { List getGenerateList = getGenerateByAccountId(userId, level1Type); diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index 22024e16..0e645959 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -321,25 +321,40 @@ public class UserLikeGroupServiceImpl extends ServiceImpl getToProductImageResultList(List taskIdList) { - List results = new ArrayList<>(); + public List getToProductImageResultList(List taskIdList) { + List results = new ArrayList<>(); Set collect = new HashSet<>(); taskIdList.forEach(taskId -> { String key = toProductImageResultKey + ":" + taskId; - GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); - if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { - String url = generateResultVO.getUrl(); + MagicToolResultVO magicToolResultVO = new Gson().fromJson(redisUtil.getFromString(key), MagicToolResultVO.class); + if (!Objects.isNull(magicToolResultVO) && !StringUtil.isNullOrEmpty(magicToolResultVO.getUrl())) { + String url = magicToolResultVO.getUrl(); if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")) { - generateResultVO.setStatus("Invalid"); + magicToolResultVO.setStatus("Invalid"); } else { - generateResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + magicToolResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getTaskId, taskId); + ToProductImageResult toProductImageResult = toProductImageResultMapper.selectOne(qw); + if (Objects.isNull(toProductImageResult)) { + throw new BusinessException("The source image does not exist."); + } + if (toProductImageResult.getElementType().equals("ProductElement")) { + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageResult.getElementId()); + magicToolResultVO.setSourceUrl(minioUtil.getPresignedUrl(toProductElement.getUrl(), 24 * 60)); + }else { + UserLike userLike = userLikeMapper.selectById(toProductImageResult.getElementId()); + magicToolResultVO.setSourceUrl(minioUtil.getPresignedUrl(userLike.getUrl(), 24 * 60)); + } } - } else if (Objects.isNull(generateResultVO)) { - generateResultVO = new GenerateResultVO(); + } else if (Objects.isNull(magicToolResultVO)) { + magicToolResultVO = new MagicToolResultVO(); } - if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus()); - results.add(generateResultVO); + if (!StringUtil.isNullOrEmpty(magicToolResultVO.getStatus())) collect.add(magicToolResultVO.getStatus()); + results.add(magicToolResultVO); }); return results; } @@ -408,6 +423,102 @@ public class UserLikeGroupServiceImpl extends ServiceImpl relight(ToProductImageDTO toProductImageDTO) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + Long userLikeGroupId = toProductImageDTO.getUserLikeGroupId(); + ToProductImageRecord toProductImageRecord = new ToProductImageRecord(); + toProductImageRecord.setUserLikeGroupId(userLikeGroupId); + toProductImageRecord.setCreateTime(LocalDateTime.now()); + if (!StringUtils.isEmpty(toProductImageDTO.getPrompt())) { + toProductImageRecord.setPrompt(toProductImageDTO.getPrompt()); + } + toProductImageRecordMapper.insert(toProductImageRecord); + + List result = new ArrayList<>(); + + int i = 0; + // 翻译 + String prompt = toProductImageDTO.getPrompt(); + String s = pythonService.promptTranslate(prompt); + for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) { + if (toProductImageVO.getElementType().equals("ProductImage")) { + String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + i ++; + ToProductImageResult toProductImageResult1 = toProductImageResultMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.toProductImage(toProductImageResult1.getUrl(), taskId, s); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(toProductImageResult1.getId()); + toProductImageResult.setElementType("ProductImage"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResult.setUserLikeGroupId(userLikeGroupId); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + }else { + String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.toProductImage(toProductElement.getUrl(), taskId, s); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(toProductElement.getId()); + toProductImageResult.setElementType("ProductElement"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + } + } + + return result; + } + + @Override + public List getRelightResult(List taskIdList) { + List results = new ArrayList<>(); + Set collect = new HashSet<>(); + taskIdList.forEach(taskId -> { + String key = toProductImageResultKey + ":" + taskId; + MagicToolResultVO magicToolResultVO = new Gson().fromJson(redisUtil.getFromString(key), MagicToolResultVO.class); + if (!Objects.isNull(magicToolResultVO) && !StringUtil.isNullOrEmpty(magicToolResultVO.getUrl())) { + String url = magicToolResultVO.getUrl(); + if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")) { + magicToolResultVO.setStatus("Invalid"); + } else { + magicToolResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getTaskId, taskId); + ToProductImageResult toProductImageResult = toProductImageResultMapper.selectOne(qw); + if (Objects.isNull(toProductImageResult)) { + throw new BusinessException("The source image does not exist."); + } + if (toProductImageResult.getElementType().equals("ProductElement")) { + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageResult.getElementId()); + magicToolResultVO.setSourceUrl(minioUtil.getPresignedUrl(toProductElement.getUrl(), 24 * 60)); + }else { + ToProductImageResult toProductImageResult1 = toProductImageResultMapper.selectById(toProductImageResult.getElementId()); + magicToolResultVO.setSourceUrl(minioUtil.getPresignedUrl(toProductImageResult1.getUrl(), 24 * 60)); + } + } + } else if (Objects.isNull(magicToolResultVO)) { + magicToolResultVO = new MagicToolResultVO(); + } + if (!StringUtil.isNullOrEmpty(magicToolResultVO.getStatus())) collect.add(magicToolResultVO.getStatus()); + results.add(magicToolResultVO); + }); + return results; + } + public static String convert(InputStream inputStream) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { return reader.lines().collect(Collectors.joining("\n")); diff --git a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java index c48995bd..30b55e64 100644 --- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java @@ -141,6 +141,14 @@ public class WorkspaceServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.lambda().eq(WorkspaceRelStyle::getWorkspaceId, workspace.getId()); + List workspaceRelStyles = workspaceRelStyleMapper.selectList(qw); + if (!CollectionUtils.isEmpty(workspaceRelStyles)) { + WorkspaceRelStyle workspaceRelStyle = workspaceRelStyles.get(0); + workspaceRelStyleMapper.deleteById(workspaceRelStyle); + } } return true; } @@ -308,6 +316,7 @@ public class WorkspaceServiceImpl extends ServiceImpl workspaceRelStyles = workspaceRelStyleMapper.selectList(qw); if (!CollectionUtils.isEmpty(workspaceRelStyles)) { Long styleId = workspaceRelStyles.get(0).getStyleId(); + vo.setStyleId(styleId); Style style = styleMapper.selectById(styleId); StyleEnum styleEnum = StyleEnum.fromName(style.getName()); vo.setStyle(styleEnum.name()); From 8c65592394b12907cf4f6f5b0c7990e12aee43c0 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 25 Jun 2024 16:43:54 +0800 Subject: [PATCH 39/79] TASK:aida; --- src/main/resources/application-dev.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 4b0ec1e3..21b5e945 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -88,6 +88,7 @@ redis.key.taskList=TaskList redis.key.credits.pre-deduction=Credits:PreDeduction redis.key.generateResult=Generate:Result redis.key.toProductImageResultKey=ToProductImage:Result +redis.key.relightResultKey=Relight:Result aws.s3.accessKeyId=AKIAVD3OJIMF6UJFLSHZ aws.s3.secretKey=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 From 9bd695a24d41da873dd252986a9c05e707d35512 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Wed, 26 Jun 2024 10:47:56 +0800 Subject: [PATCH 40/79] TASK:aida; --- .../com/ai/da/common/RabbitMQ/GenerateConsumer.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 88d5ae19..791dd025 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -316,11 +316,11 @@ public class GenerateConsumer { // processGenerateResult(msg, channel); // } // -// @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) -// @RabbitHandler -// public void getToProductImageResult(Message msg, Channel channel) { -// processToProductImageResult(msg, channel); -// } + @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) + @RabbitHandler + public void getToProductImageResult(Message msg, Channel channel) { + processToProductImageResult(msg, channel); + } @RabbitListener(queues = MQConfig.RELIGHT_RESULT_QUEUE) @RabbitHandler From 58a78a5366067cc8ea4029fd367773bdf968c921 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Wed, 26 Jun 2024 13:24:27 +0800 Subject: [PATCH 41/79] TASK:aida; --- .../da/common/RabbitMQ/GenerateConsumer.java | 120 +++++++++--------- .../com/ai/da/common/RabbitMQ/MQConfig.java | 4 +- .../com/ai/da/common/RabbitMQ/SRConsumer.java | 24 ++-- 3 files changed, 74 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 791dd025..7ba3f36b 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -256,66 +256,66 @@ public class GenerateConsumer { log.info("============ProcessRelightResult End listening=========="); } -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer1(Message msg, Channel channel) { -// generate(msg, channel, "consumer 1"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer2(Message msg, Channel channel) { -// generate(msg, channel, "consumer 2"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer3(Message msg, Channel channel) { -// generate(msg, channel, "consumer 3"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer4(Message msg, Channel channel) { -// generate(msg, channel, "consumer 4"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer5(Message msg, Channel channel) { -// generate(msg, channel, "consumer 5"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer6(Message msg, Channel channel) { -// generate(msg, channel, "consumer 6"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer7(Message msg, Channel channel) { -// generate(msg, channel, "consumer 7"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer8(Message msg, Channel channel) { -// generate(msg, channel, "consumer 8"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer9(Message msg, Channel channel) { -// generate(msg, channel, "consumer 9"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) -// @RabbitHandler -// public void getGenerateResult(Message msg, Channel channel) { -// processGenerateResult(msg, channel); -// } -// + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer1(Message msg, Channel channel) { + generate(msg, channel, "consumer 1"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer2(Message msg, Channel channel) { + generate(msg, channel, "consumer 2"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer3(Message msg, Channel channel) { + generate(msg, channel, "consumer 3"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer4(Message msg, Channel channel) { + generate(msg, channel, "consumer 4"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer5(Message msg, Channel channel) { + generate(msg, channel, "consumer 5"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer6(Message msg, Channel channel) { + generate(msg, channel, "consumer 6"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer7(Message msg, Channel channel) { + generate(msg, channel, "consumer 7"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer8(Message msg, Channel channel) { + generate(msg, channel, "consumer 8"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer9(Message msg, Channel channel) { + generate(msg, channel, "consumer 9"); + } + + @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) + @RabbitHandler + public void getGenerateResult(Message msg, Channel channel) { + processGenerateResult(msg, channel); + } + @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) @RabbitHandler public void getToProductImageResult(Message msg, Channel channel) { diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index b44bea8c..7f9e4b18 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -26,9 +26,9 @@ public class MQConfig { // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; - public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; + public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-dev"; - public static final String RELIGHT_RESULT_QUEUE = "Relight-local"; + public static final String RELIGHT_RESULT_QUEUE = "Relight-dev"; public MQConfig() { } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java index b8ba32f2..6ad261bd 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java @@ -218,17 +218,17 @@ public class SRConsumer { taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null); } -// @RabbitListener(queues = MQConfig.SR_QUEUE) -// @RabbitHandler -// public void SRConsumer1(Message msg, Channel channel) { -// superResolution(msg, channel, "consumer 1"); -// } -// -// -// @RabbitListener(queues = MQConfig.SR_RESULT_QUEUE) -// @RabbitHandler -// public void SRResultConsumer1(Message msg, Channel channel) { -// getSRResult(msg, channel, "consumer 1"); -// } + @RabbitListener(queues = MQConfig.SR_QUEUE) + @RabbitHandler + public void SRConsumer1(Message msg, Channel channel) { + superResolution(msg, channel, "consumer 1"); + } + + + @RabbitListener(queues = MQConfig.SR_RESULT_QUEUE) + @RabbitHandler + public void SRResultConsumer1(Message msg, Channel channel) { + getSRResult(msg, channel, "consumer 1"); + } } From 0759452381c3540b9d2b8fc5dafd37eda8ad45da Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 26 Jun 2024 13:55:20 +0800 Subject: [PATCH 42/79] =?UTF-8?q?=E7=A7=AF=E5=88=86=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=201=E3=80=81BUGFIX:=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=A1=A8=E4=B8=AD=E7=9A=84=E7=A7=AF=E5=88=86=E4=B8=8E=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E8=AF=A6=E7=BB=86=E4=B8=AD=E4=B8=8D=E7=BB=9F=E4=B8=80?= =?UTF-8?q?;=202=E3=80=81To=5FProduct=5FImage=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=A3=E9=99=A4=E7=A7=AF=E5=88=86=203=E3=80=81=E6=AF=8F?= =?UTF-8?q?=E5=91=A8=E5=88=B7=E6=96=B0=E4=BB=98=E8=B4=B9=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/RabbitMQ/GenerateConsumer.java | 151 ++++++++---------- .../ai/da/common/enums/CreditsEventsEnum.java | 7 +- .../com/ai/da/common/task/AccountTask.java | 6 +- .../dto/GenerateThroughImageTextDTO.java | 2 +- .../com/ai/da/service/AccountService.java | 2 +- .../da/service/impl/AccountServiceImpl.java | 6 +- .../ai/da/service/impl/AliPayServiceImpl.java | 8 +- .../da/service/impl/AlipayHKServiceImpl.java | 4 +- .../da/service/impl/CreditsServiceImpl.java | 16 +- .../da/service/impl/GenerateServiceImpl.java | 28 +++- .../impl/PayPalCheckoutServiceImpl.java | 10 +- .../impl/SuperResolutionServiceImpl.java | 6 +- .../impl/UserLikeGroupServiceImpl.java | 26 ++- 13 files changed, 142 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 88d5ae19..0c5ea013 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -67,27 +67,14 @@ public class GenerateConsumer { } catch (IOException ex) { log.error("手动确认,不返回队列重新消费"); } - // 2.2 将该消息从取消列表中删除 -// redisUtil.removeFromSet(cancelSetKey, uniqueId); } else { -// GenerateCollectionVO generateCollectionVO = generateService.generateThroughImageText(generateThroughImageTextDTO); - try { - generateService.generateThroughImageText(generateThroughImageTextDTO); - }catch (Exception e){ - log.error("error message : {}", e.getMessage()); - } + generateService.generateThroughImageText(generateThroughImageTextDTO); // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); - /*if (!Objects.isNull(generateCollectionVO)) { - HashMap generateResult = new HashMap<>(); - generateResult.put(uniqueId, JSONObject.toJSONString(generateCollectionVO)); - // 将结果存在redis中 ,为空时不要存 - redisUtil.addToMap(resultMapKey, generateResult); - }*/ } - } catch (BusinessException e) { - log.error(e.getMsg()); + } catch (Exception e) { + log.error(e.getMessage()); // channel.basicNack() 为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue try { // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 @@ -102,7 +89,7 @@ public class GenerateConsumer { } // 将入参和错误信息存入数据库 String exceptionMessage = JSONObject.toJSONString(generateThroughImageTextDTO) + - " Exception message : " + e.getMsg(); + " Exception message : " + e.getMessage(); HashMap exceptionInfo = new HashMap<>(); exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage); // 存redis @@ -256,71 +243,71 @@ public class GenerateConsumer { log.info("============ProcessRelightResult End listening=========="); } -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer1(Message msg, Channel channel) { -// generate(msg, channel, "consumer 1"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer2(Message msg, Channel channel) { -// generate(msg, channel, "consumer 2"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer3(Message msg, Channel channel) { -// generate(msg, channel, "consumer 3"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer4(Message msg, Channel channel) { -// generate(msg, channel, "consumer 4"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer5(Message msg, Channel channel) { -// generate(msg, channel, "consumer 5"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer6(Message msg, Channel channel) { -// generate(msg, channel, "consumer 6"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer7(Message msg, Channel channel) { -// generate(msg, channel, "consumer 7"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer8(Message msg, Channel channel) { -// generate(msg, channel, "consumer 8"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_QUEUE) -// @RabbitHandler -// public void generateConsumer9(Message msg, Channel channel) { -// generate(msg, channel, "consumer 9"); -// } -// -// @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) -// @RabbitHandler -// public void getGenerateResult(Message msg, Channel channel) { -// processGenerateResult(msg, channel); -// } -// -// @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) -// @RabbitHandler -// public void getToProductImageResult(Message msg, Channel channel) { -// processToProductImageResult(msg, channel); -// } + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer1(Message msg, Channel channel) { + generate(msg, channel, "consumer 1"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer2(Message msg, Channel channel) { + generate(msg, channel, "consumer 2"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer3(Message msg, Channel channel) { + generate(msg, channel, "consumer 3"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer4(Message msg, Channel channel) { + generate(msg, channel, "consumer 4"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer5(Message msg, Channel channel) { + generate(msg, channel, "consumer 5"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer6(Message msg, Channel channel) { + generate(msg, channel, "consumer 6"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer7(Message msg, Channel channel) { + generate(msg, channel, "consumer 7"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer8(Message msg, Channel channel) { + generate(msg, channel, "consumer 8"); + } + + @RabbitListener(queues = MQConfig.GENERATE_QUEUE) + @RabbitHandler + public void generateConsumer9(Message msg, Channel channel) { + generate(msg, channel, "consumer 9"); + } + + @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) + @RabbitHandler + public void getGenerateResult(Message msg, Channel channel) { + processGenerateResult(msg, channel); + } + + @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) + @RabbitHandler + public void getToProductImageResult(Message msg, Channel channel) { + processToProductImageResult(msg, channel); + } @RabbitListener(queues = MQConfig.RELIGHT_RESULT_QUEUE) @RabbitHandler diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index adefd454..7978920c 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -14,9 +14,10 @@ public enum CreditsEventsEnum { // BUY_CREDITS("Buy Credits","10"), // 每月更新 - INIT_YEARLY("init", "6000"), - INIT_MONTHLY("init", "5000"), - INIT_TRIAL("init", "100"), + INIT_YEARLY("init_yearly", "6000"), + INIT_MONTHLY("init_monthly", "5000"), + INIT_TRIAL("init_trial", "100"), + INIT_WEEKLY("init_weekly","10000"), // SUPER_RESOLUTION("Super Resolution","30"), SUPER_RESOLUTION("Super Resolution","10"), diff --git a/src/main/java/com/ai/da/common/task/AccountTask.java b/src/main/java/com/ai/da/common/task/AccountTask.java index 04b57b46..fa866e9d 100644 --- a/src/main/java/com/ai/da/common/task/AccountTask.java +++ b/src/main/java/com/ai/da/common/task/AccountTask.java @@ -12,10 +12,10 @@ public class AccountTask { @Resource private AccountService accountService; - /** 每个月1号凌晨刷新 年付用户的积分 */ -// @Scheduled(cron = "0 0 0 1 * ?") + /** 每周日晚上刷新 年付用户、月付用户的积分 */ +// @Scheduled(cron = "59 59 23 ? * SUN") public void refreshCreditsMonthly(){ - accountService.refreshCreditsMonthly(); + accountService.refreshCreditsWeekly(); } // todo 多久执行一次? diff --git a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java index 398fa9ec..6320dd5d 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java @@ -55,6 +55,6 @@ public class GenerateThroughImageTextDTO { @ApiModelProperty("页面上用户设计的slogan所截的图片") String sloganBase64; - @ApiModelProperty("种子 取值范围 0~99999") + @ApiModelProperty("种子 取值范围 0~500") String seed; } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index bf6b72db..193ccff7 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -139,5 +139,5 @@ public interface AccountService extends IService { Boolean collectQuestionnaires(String questionnaireInfo); - void refreshCreditsMonthly(); + void refreshCreditsWeekly(); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index afc5a849..ed70f616 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -1233,12 +1233,12 @@ public class AccountServiceImpl extends ServiceImpl impl /** * 为年费用户每月更新积分 */ - public void refreshCreditsMonthly(){ + public void refreshCreditsWeekly(){ UpdateWrapper accountUpdateWrapper = new UpdateWrapper<>(); // 刷新账号有效期截止之前的年付用户的积分 long epochMilli = Instant.now().toEpochMilli(); - accountUpdateWrapper.lambda().set(Account::getCredits, CreditsEventsEnum.INIT_YEARLY.getValue()) - .eq(Account::getSystemUser,1) + accountUpdateWrapper.lambda().set(Account::getCredits, CreditsEventsEnum.INIT_WEEKLY.getValue()) + .eq(Account::getSystemUser,1).or().eq(Account::getSystemUser,2) .gt(Account::getValidEndTime, epochMilli); baseMapper.update(null,accountUpdateWrapper); } diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index 75c93eb6..61f8b1d2 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -210,13 +210,13 @@ public class AliPayServiceImpl implements AliPayService { orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); //记录支付日志 paymentInfoService.createPaymentInfoForAliPay(params); + // 更新积分 + creditsService.buyCredits(orderByOrderNo.getAccountId(),Float.parseFloat(totalAmount) / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); // 添加积分变更记录 creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay", CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); - // 更新积分 - creditsService.buyCredits(orderByOrderNo.getAccountId(),Float.parseFloat(totalAmount) / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); } finally { //要主动释放锁 lock.unlock(); @@ -312,13 +312,13 @@ public class AliPayServiceImpl implements AliPayService { orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); //并记录支付日志 paymentInfoService.createPaymentInfoForAliPay(alipayTradeQueryResponse); + // 更新积分 + creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); // 添加积分变更记录 creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay", CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); - // 更新积分 - creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); } } diff --git a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java index 14515580..208f82d8 100644 --- a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java @@ -241,13 +241,13 @@ public class AlipayHKServiceImpl implements AlipayHKService { //记录支付日志 paymentInfoService.createPaymentInfoForAliPayHK(alipayHKCallbackDTO); log.info("Alipay-HK 订单:{} 支付信息状态更新成功",orderNo); + // 更新积分 + creditsService.buyCredits(orderByOrderNo.getAccountId(),Float.parseFloat(totalAmount) / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); // 添加积分变更记录 creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), CreditsEventsEnum.BUY_CREDITS.getName() + "--AlipayHK", CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); - // 更新积分 - creditsService.buyCredits(orderByOrderNo.getAccountId(),Float.parseFloat(totalAmount) / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); log.info("用户:{} 积分信息更新成功",orderByOrderNo.getAccountId()); } finally { //要主动释放锁 diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 4ddbc568..bb7adbaf 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -118,20 +118,20 @@ public class CreditsServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda() .eq(CreditsDetail::getTaskId, taskId) .set(CreditsDetail::getChangedCredits, changeCredits) - .set(CreditsDetail::getCredits, finalCredits); + .set(CreditsDetail::getCredits, currentCredits); baseMapper.update(null, updateWrapper); 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 ae27cdc1..c6c07158 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -86,6 +86,8 @@ public class GenerateServiceImpl extends ServiceImpl i @Value("${access.python.generate_sr_port}") private String generateServicePort; + // 创建 Random 对象 + Random random = new Random(); @Override public GenerateCaptionVO generateCaption(Long sketchElementId) { @@ -266,6 +268,17 @@ public class GenerateServiceImpl extends ServiceImpl i String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success"; GenerateResultVO generateResultVO = new GenerateResultVO(taskId, toProductImageResult.getId(), url, status, category); redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + + Long accountId = Long.parseLong(taskId.substring(taskId.lastIndexOf("-") + 1)); + if (!status.equals("Invalid")){ + // 4、扣除积分 + Boolean b = creditsService.taskCreditsDeduction(accountId, taskId); + // 3、记录积分变更 + if (b) creditsService.insertToCreditsDetail(accountId, + CreditsEventsEnum.TO_PRODUCT_IMAGE.getName(), + CreditsEventsEnum.TO_PRODUCT_IMAGE.getValue(), + "negative"); + } } private void validateGeneraType(Generate generate, String text, Long elementId) { @@ -476,13 +489,14 @@ public class GenerateServiceImpl extends ServiceImpl i }*/ // 判断试用用户是否还有剩余试用机会 - int trialsCount = 0; + // ** 不再通过生成次数限制试用用户,统一使用积分限制 + /*int trialsCount = 0; if (generateThroughImageTextDTO.getIsTestUser()) { trialsCount = getTrialsCount(generateThroughImageTextDTO.getUserId(), generateThroughImageTextDTO.getLevel1Type()); if (trialsCount >= 2) { return new PrepareForGenerateVO(0); } - } + }*/ CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.OTHER; int times = 4; // 当level1Type为Print_board时,level2Type为pattern时需要确定generateType @@ -550,10 +564,10 @@ public class GenerateServiceImpl extends ServiceImpl i } // 校验seed的取值范围 - int seed = Integer.parseInt(generateThroughImageTextDTO.getSeed()); - if (seed < 0 || seed > 99999) { - throw new BusinessException("the.value.range.of.seed"); - } + int seed = random.nextInt(501); + log.info("随机种子:{}", seed); + generateThroughImageTextDTO.setSeed(String.valueOf(seed)); + creditsEventsEnum = CreditsEventsEnum.LOGO; } } else if (generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())) { @@ -598,7 +612,7 @@ public class GenerateServiceImpl extends ServiceImpl i creditsService.preInsert(generateThroughImageTextDTO.getUserId(), creditsEventsEnum.getName(), uuid); // 7、返回唯一id - return new PrepareForGenerateVO(taskIdList, 2 - trialsCount); + return new PrepareForGenerateVO(taskIdList, 2); } @Override diff --git a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java index 62326aed..f4fd04b4 100644 --- a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java @@ -586,13 +586,13 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.SUCCESS); //记录支付日志 paymentInfoService.createPaymentInfoForPayPal(capturedOrder); + // 更新积分 + creditsService.buyCredits(orderInfo.getAccountId(), orderInfo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); // 添加积分变更记录 creditsService.insertToCreditsDetail(orderInfo.getAccountId(), CreditsEventsEnum.BUY_CREDITS.getName() + "--PayPal", CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); - // 更新积分 - creditsService.buyCredits(orderInfo.getAccountId(), orderInfo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); } } @@ -628,14 +628,14 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); //并记录支付日志 paymentInfoService.createPaymentInfoForPayPal(result); + // 更新积分 +// creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); // 添加积分变更记录 creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), CreditsEventsEnum.BUY_CREDITS.getName() + "--Paypal", CreditsEventsEnum.BUY_CREDITS.getValue(), "positive"); - // 更新积分 -// creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); - creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Float.parseFloat(CreditsEventsEnum.PRICE.getValue())); } } diff --git a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java index be795aa4..63585f19 100644 --- a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java @@ -144,13 +144,13 @@ public class SuperResolutionServiceImpl extends ServiceImpl toProduct(ToProductImageDTO toProductImageDTO) { + // 判断用户当前积分是否够本次生成消耗 + Boolean preDeduction = creditsService.creditsPreDeduction(CreditsEventsEnum.TO_PRODUCT_IMAGE, toProductImageDTO.getToProductImageVOList().size()); + if (!preDeduction) { + throw new BusinessException("Not enough Credits"); + } + AuthPrincipalVo userHolder = UserContext.getUserHolder(); Long userLikeGroupId = toProductImageDTO.getUserLikeGroupId(); ToProductImageRecord toProductImageRecord = new ToProductImageRecord(); @@ -240,11 +246,12 @@ public class UserLikeGroupServiceImpl extends ServiceImpl Date: Wed, 26 Jun 2024 18:00:47 +0800 Subject: [PATCH 43/79] =?UTF-8?q?S3=20Util=20=E6=96=B0=E5=A2=9E=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ai/da/common/utils/S3Util.java | 215 ++++++++++++++---- 1 file changed, 171 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/ai/da/common/utils/S3Util.java b/src/main/java/com/ai/da/common/utils/S3Util.java index 1d4735cc..03bd6fbe 100644 --- a/src/main/java/com/ai/da/common/utils/S3Util.java +++ b/src/main/java/com/ai/da/common/utils/S3Util.java @@ -2,6 +2,7 @@ package com.ai.da.common.utils; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.constant.CommonConstant; +import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -57,8 +58,8 @@ public class S3Util { private static S3Presigner s3Presigner; /** - * @description: 获取S3客户端对象 * @return software.amazon.awssdk.services.s3.S3Client + * @description: 获取S3客户端对象 */ public synchronized S3Client getS3Client() { if (null == s3Client) { @@ -74,8 +75,8 @@ public class S3Util { } /** - * @description: 获取预签名对象 * @return software.amazon.awssdk.services.s3.presigner.S3Presigner + * @description: 获取预签名对象 */ public synchronized S3Presigner getS3PreSigner() { if (null == s3Presigner) { @@ -92,6 +93,29 @@ public class S3Util { return s3Presigner; } + public String uploadImageFromBase64(String bucketName, String base64Image, String imageType) { + S3Client s3Client = getS3Client(); + byte[] imageBytes = Base64.getDecoder().decode(base64Image); + String fileName = UUID.randomUUID() + "." + imageType; // or any other image format + + try (InputStream in = new ByteArrayInputStream(imageBytes)) { + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .contentType("image/png") + .contentLength((long) in.available()) + .key(fileName) +// .acl(ObjectCannedACL.PUBLIC_READ) + .build(); + s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available())); + + log.info("上传的位置:桶 - {},路径 - {}", bucketName, fileName); + return bucketName + "/" + fileName; + } catch (Exception e) { + e.printStackTrace(); + return null; // or throw an exception + } + } + public String upload(String bucketName, String path, MultipartFile file) { S3Client s3Client = getS3Client(); try { @@ -113,11 +137,104 @@ public class S3Util { s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); log.info("上传的位置:桶 - {},路径 - {}", bucketName, fileName); - return fileName; + return bucketName + "/" + fileName; } catch (Exception e) { log.error("上传文件到S3失败 异常:{}", e.getMessage()); + return null; + } + } + // todo + public String upload(String bucketName, String path, MultipartFile file, String copy) { + S3Client s3Client = getS3Client(); + InputStream in = null; + try { + in = file.getInputStream(); + + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .contentType(file.getContentType()) + .contentLength(file.getSize()) + .key(path) +// .acl(ObjectCannedACL.PUBLIC_READ) + .build(); + s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return bucketName + "/" + path; + } + + public InputStream download(String path) { + if (!path.contains("/")) { + throw new BusinessException("the.path.is.error"); + } + int index = path.indexOf("/"); + String bucketName = path.substring(0, index); + String objectName = path.substring(index + 1); + return download(bucketName, objectName); + } + + public InputStream download(String bucketName, String objectName) { + try { + S3Client s3Client = getS3Client(); + GetObjectRequest objectRequest = GetObjectRequest + .builder() + .key(objectName) + .bucket(bucketName) + .build(); + +// ResponseBytes objectBytes = s3.getObjectAsBytes(objectRequest); + ResponseBytes objectAsBytes = s3Client.getObjectAsBytes(objectRequest); + byte[] data = objectAsBytes.asByteArray(); + return new ByteArrayInputStream(data); + + /*// Write the data to a local file. + File myFile = new File("files/images.png"); + OutputStream os = new FileOutputStream(myFile); + os.write(data); + System.out.println("Successfully obtained bytes from an S3 object"); + os.close(); + return null;*/ +// return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } catch (Exception e) { + log.error(""); + throw new BusinessException(""); + } + } + + public void deleteObject(String path) { + if (!path.contains("/")) { + throw new BusinessException("The path is error!"); + } + int index = path.indexOf("/"); + String bucketName = path.substring(0, index); + String objectName = path.substring(index + 1); + deleteObject(bucketName, objectName); + } + + public void deleteObject(String bucketName, String objectName) { + try { + S3Client s3Client = getS3Client(); + DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest + .builder() + .key(objectName) + .bucket(bucketName) + .build(); + s3Client.deleteObject(deleteObjectRequest); + log.info("Object " + objectName + " successfully removed from bucket " + bucketName); + } catch (Exception e) { + e.printStackTrace(); + log.info("Error while removing object " + objectName + " from bucket " + bucketName + ": " + e.getMessage()); } - return null; } public String getPreSignedUrl(String path, int expiry) { @@ -137,20 +254,20 @@ public class S3Util { } /** - * @description: 生成预签名URL - * @param keyName key名称: test/2022/06/123.pdf + * @param keyName key名称: test/2022/06/123.pdf * @param signatureDurationTime 有效期 单位:秒 * @return java.lang.String + * @description: 生成预签名URL */ public String getPreSignatureUrl(String bucket, String keyName, Integer signatureDurationTime) { String preSignatureUrl = ""; try { S3Presigner s3PreSigner = getS3PreSigner(); - GetObjectRequest getObjectRequest = - GetObjectRequest.builder() - .bucket(bucket) - .key(keyName) - .build(); + GetObjectRequest getObjectRequest = GetObjectRequest.builder() + .bucket(bucket) + .key(keyName) + .build(); + //设置预签名URL可访问时间 signatureDurationTime = Optional.ofNullable(signatureDurationTime) .map(item -> { @@ -176,46 +293,56 @@ public class S3Util { return preSignatureUrl; } - public InputStream download(String path) { - if (!path.contains("/")) { - throw new BusinessException("the.path.is.error"); - } - int index = path.indexOf("/"); - String bucketName = path.substring(0, index); - String objectName = path.substring(index + 1); - return download(bucketName, objectName); - } - - public InputStream download(String bucketName, String objectName){ + public boolean doesObjectExist(String bucketName, String objectName) { try { S3Client s3Client = getS3Client(); - GetObjectRequest objectRequest = GetObjectRequest - .builder() - .key(objectName) + HeadObjectRequest headObjectRequest = HeadObjectRequest.builder() .bucket(bucketName) + .key(objectName) .build(); - -// ResponseBytes objectBytes = s3.getObjectAsBytes(objectRequest); - ResponseBytes objectAsBytes = s3Client.getObjectAsBytes(objectRequest); - byte[] data = objectAsBytes.asByteArray(); - return new ByteArrayInputStream(data); - - /*// Write the data to a local file. - File myFile = new File("files/images.png"); - OutputStream os = new FileOutputStream(myFile); - os.write(data); - System.out.println("Successfully obtained bytes from an S3 object"); - os.close(); - return null;*/ - -// return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); - } catch (Exception e){ - log.error(""); - throw new BusinessException(""); + HeadObjectResponse headObjectResponse = s3Client.headObject(headObjectRequest); + return true; + } catch (Exception e) { + log.info("指定文件 {}/{} 不存在", bucketName, objectName); + // 如果发生异常,说明文件不存在或者出现了其他错误 + return false; } } - public List listAllBucket(){ + public String base64UploadToPath(String base64, String bucketName, String path){ + S3Client s3Client = getS3Client(); + String[] parts = base64.split(","); + String imageType = parts[0].split("/")[1].split(";")[0]; + String base64Data = parts[1]; + + byte[] imageBytes = Base64.getDecoder().decode(base64Data); + String fileName; + if (!StringUtil.isNullOrEmpty(path)){ + fileName = path + "." + imageType; // or any other image format + }else { + fileName = UUID.randomUUID() + "." + imageType; + } + + try (InputStream in = new ByteArrayInputStream(imageBytes)) { + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .contentType("image/" + imageType) + .contentLength((long) in.available()) + .key(fileName) +// .acl(ObjectCannedACL.PUBLIC_READ) + .build(); + s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available())); + + log.info("上传的位置:桶 - {},路径 - {}", bucketName, fileName); + return bucketName + "/" + fileName; + } catch (Exception e) { + e.printStackTrace(); + return null; // or throw an exception + } + } + + + public List listAllBucket() { S3Client s3Client = getS3Client(); ListBucketsResponse listBucketsResponse = s3Client.listBuckets(); List buckets = listBucketsResponse.buckets(); From 9b438c78a38a5248210a99c71e5227b0376c2037 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Thu, 27 Jun 2024 15:33:26 +0800 Subject: [PATCH 44/79] TASK:aida; --- .../ai/da/common/config/MyTaskScheduler.java | 113 +++++++++++++++--- .../com/ai/da/common/utils/ExcelReader.java | 33 +++++ .../com/ai/da/common/utils/MinioUtil.java | 16 +++ .../ai/da/controller/PortfolioController.java | 6 + .../controller/SavedCollectionController.java | 2 +- .../secondary/AttributeRetrievalMapper.java | 8 +- .../java/com/ai/da/model/vo/SysFileVO.java | 2 + .../da/model/vo/ToProductImageResultVO.java | 9 ++ .../com/ai/da/model/vo/ValidateElementVO.java | 2 + .../java/com/ai/da/python/PythonService.java | 84 +++++++++---- .../com/ai/da/service/PortfolioService.java | 2 + .../ai/da/service/UserLikeGroupService.java | 2 +- .../impl/CollectionElementServiceImpl.java | 4 + .../ai/da/service/impl/DesignServiceImpl.java | 2 +- .../da/service/impl/LibraryServiceImpl.java | 1 + .../da/service/impl/PortfolioServiceImpl.java | 30 ++++- .../impl/UserLikeGroupServiceImpl.java | 31 +++-- src/main/resources/application-dev.properties | 2 +- .../secondary/AttributeRetrievalMapper.xml | 23 ++++ 19 files changed, 312 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/ai/da/common/utils/ExcelReader.java create mode 100644 src/main/java/com/ai/da/model/vo/ToProductImageResultVO.java diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index 6fb19b5a..3473f597 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -1,5 +1,6 @@ package com.ai.da.common.config; +import com.ai.da.common.utils.ExcelReader; import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.SendEmailUtil; import com.ai.da.mapper.primary.*; @@ -26,6 +27,9 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Component @@ -34,6 +38,7 @@ public class MyTaskScheduler { @PostConstruct public void test() { // clearMinio(); +// addSystemFileStyle(); } @Resource @@ -214,30 +219,104 @@ public class MyTaskScheduler { private AttributeRetrievalMapper attributeRetrievalMapper; public void addSystemFileStyle() { - String directoryPath = "C:\\Users\\10233\\Downloads\\blouse done\\blouse done\\废土风"; - List fileNames = getFileNames(directoryPath); - for (String fileName : fileNames) { - String tableName = "female_top"; - String style = "feitufeng"; - Long idByFileName = attributeRetrievalMapper.getIdByFileName(fileName, tableName); - attributeRetrievalMapper.updateStyleById(idByFileName, style, tableName); + ExecutorService executorService = Executors.newFixedThreadPool(5); + + try { + String[] filePaths = { + "C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Blouse style output updated25.6.2024.xlsx", + "C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Dress style output updated25.6.2024.xlsx", + "C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Outerwear style output.xlsx", + "C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Skirt style output .xlsx", + "C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Trousers style output.xlsx" + }; + + for (String filePath : filePaths) { + executorService.submit(() -> processExcelFile(filePath)); + } + } finally { + executorService.shutdown(); + try { + if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) { + executorService.shutdownNow(); + } + } catch (InterruptedException e) { + executorService.shutdownNow(); + } } } - public static List getFileNames(String directoryPath) { - List fileNames = new ArrayList<>(); - Path path = Paths.get(directoryPath); + private void processExcelFile(String filePath) { + System.out.println("线程开始"); + try { + List> excelData = ExcelReader.readExcel(filePath); + String tableName = getTableNameFromFilePath(filePath); + String prefix = getPrefixFromFilePath(filePath); - try (DirectoryStream stream = Files.newDirectoryStream(path)) { - for (Path entry : stream) { - if (Files.isRegularFile(entry)) { - fileNames.add(entry.getFileName().toString()); + for (List columnData : excelData) { + String style = columnData.get(0); + for (int i = 1; i < columnData.size(); i++) { + String fileName = columnData.get(i); + if (StringUtils.isBlank(fileName)) { + continue; + } + if ("X".equals(style)) { + attributeRetrievalMapper.updateStyleByFileName("X", prefix + fileName, tableName); + System.out.println(fileName); + } else { + attributeRetrievalMapper.updateStyleByFileName(style, prefix + fileName, tableName); + System.out.println(fileName); + } } } } catch (IOException e) { - System.err.println("Error reading directory: " + e.getMessage()); + e.printStackTrace(); } - - return fileNames; } + + private String getTableNameFromFilePath(String filePath) { + if (filePath.contains("Blouse")) { + return "female_top"; + } else if (filePath.contains("Dress")) { + return "female_dress"; + } else if (filePath.contains("Outerwear")) { + return "female_outwear"; + } else if (filePath.contains("Skirt")) { + return "female_skirt"; + } else if (filePath.contains("Trousers")) { + return "female_pants"; + } + return ""; + } + + private String getPrefixFromFilePath(String filePath) { + if (filePath.contains("Blouse")) { + return "blouse/"; + } else if (filePath.contains("Dress")) { + return "dress/"; + } else if (filePath.contains("Outerwear")) { + return "outwear/"; + } else if (filePath.contains("Skirt")) { + return "skirt/"; + } else if (filePath.contains("Trousers")) { + return "trousers/"; + } + return ""; + } + +// public static List getFileNames(String directoryPath) { +// List fileNames = new ArrayList<>(); +// Path path = Paths.get(directoryPath); +// +// try (DirectoryStream stream = Files.newDirectoryStream(path)) { +// for (Path entry : stream) { +// if (Files.isRegularFile(entry)) { +// fileNames.add(entry.getFileName().toString()); +// } +// } +// } catch (IOException e) { +// System.err.println("Error reading directory: " + e.getMessage()); +// } +// +// return fileNames; +// } } diff --git a/src/main/java/com/ai/da/common/utils/ExcelReader.java b/src/main/java/com/ai/da/common/utils/ExcelReader.java new file mode 100644 index 00000000..d053b1e9 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/ExcelReader.java @@ -0,0 +1,33 @@ +package com.ai.da.common.utils; + +import lombok.Data; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Data +public class ExcelReader { + public static List> readExcel(String filePath) throws IOException { + List> data = new ArrayList<>(); + try (FileInputStream fis = new FileInputStream(filePath); + Workbook workbook = new XSSFWorkbook(fis)) { + Sheet sheet = workbook.getSheetAt(0); + int numberOfColumns = sheet.getRow(0).getLastCellNum(); + + for (int i = 0; i < numberOfColumns; i++) { + List columnData = new ArrayList<>(); + for (Row row : sheet) { + columnData.add(row.getCell(i).getStringCellValue()); + } + data.add(columnData); + } + } + return data; + } +} 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 300d68d3..6b6dc525 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -405,6 +405,22 @@ public class MinioUtil { } } + public String getPresignedUrl(String path, int expiry, boolean resetCache) { + if (resetCache || LocalCacheUtils.getPresignedUrlCache(path) == null) { + if (!path.contains("/")) { + throw new BusinessException("The path is error!"); + } + int index = path.indexOf("/"); + String bucketName = path.substring(0, index); + String fileName = path.substring(index + 1); + String presignedUrl = getPresignedUrl(bucketName, fileName, expiry); + LocalCacheUtils.setPresignedUrlCache(path, presignedUrl); + return presignedUrl; + } else { + return LocalCacheUtils.getPresignedUrlCache(path); + } + } + /** * 将桶名、文件名从url中分离出来 * diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java index d2c2fcfd..09e8bd39 100644 --- a/src/main/java/com/ai/da/controller/PortfolioController.java +++ b/src/main/java/com/ai/da/controller/PortfolioController.java @@ -32,6 +32,12 @@ public class PortfolioController { return Response.success(portfolioService.publish(canvas, data)); } + @ApiOperation(value = "删除作品集") + @GetMapping("/delete") + public Response delete(@RequestParam("id") Long id) { + return Response.success(portfolioService.delete(id)); + } + @CrossOrigin @ApiOperation(value = "作品集page") @PostMapping("/page") diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index d832bdb9..3942b5aa 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -209,7 +209,7 @@ public class SavedCollectionController { @ApiOperation("productImageLikeList") @PostMapping("/productImageLikeList") - public Response> productImageLikeList(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { + public Response> productImageLikeList(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { return Response.success(userLikeGroupService.productImageLikeList(toProductImageDTO)); } diff --git a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java index 6b74dc9e..1c3be31b 100644 --- a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java +++ b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java @@ -17,13 +17,15 @@ import java.util.List; public interface AttributeRetrievalMapper { - List getSystemSketchPool(@Param("attributeRetrievalAttrDict") AttributeRetrieval attributeRetrievalAttrDict, @Param("tableName") String tableName, @Param("poolNum") int poolNum); + List getSystemSketchPool(@Param("attributeRetrievalAttrDict") AttributeRetrieval attributeRetrievalAttrDict, @Param("tableName") String tableName, @Param("poolNum") int poolNum, @Param("style") String style); - AttributeRetrieval getSystemRandom(String tableName); + AttributeRetrieval getSystemRandom(String tableName, String style); - List getSystemSketchPoolBySameCategory(AttributeRetrieval attributeRetrievalAttrDict, String tableName); + List getSystemSketchPoolBySameCategory(AttributeRetrieval attributeRetrievalAttrDict, String tableName, String style); Long getIdByFileName(String fileName, String tableName); void updateStyleById(Long idByFileName, String style, String tableName); + + void updateStyleByFileName(String style, String fileName, String tableName); } diff --git a/src/main/java/com/ai/da/model/vo/SysFileVO.java b/src/main/java/com/ai/da/model/vo/SysFileVO.java index 339d2902..dd03260d 100644 --- a/src/main/java/com/ai/da/model/vo/SysFileVO.java +++ b/src/main/java/com/ai/da/model/vo/SysFileVO.java @@ -33,4 +33,6 @@ public class SysFileVO implements Serializable { */ private String md5; + private String level3Type; + } diff --git a/src/main/java/com/ai/da/model/vo/ToProductImageResultVO.java b/src/main/java/com/ai/da/model/vo/ToProductImageResultVO.java new file mode 100644 index 00000000..c0c495c0 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ToProductImageResultVO.java @@ -0,0 +1,9 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.ToProductImageResult; +import lombok.Data; + +@Data +public class ToProductImageResultVO extends ToProductImageResult { + private String sourceUrl; +} diff --git a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java index 563c4ab1..f2cb87a1 100644 --- a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java +++ b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java @@ -45,4 +45,6 @@ public class ValidateElementVO { //透传sysFileVo用(attribute_retrieval 接口限定sysFile范围) List sysFileVo; private String modelSex; + + private String style; } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index a911fe84..11210996 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -602,7 +602,7 @@ public class PythonService { } else if (systemScale.compareTo(BigDecimal.ONE) != 0) { BigDecimal collectNoPinSize = BigDecimal.valueOf(collectionNoPinSize); poolNum = collectNoPinSize.divide(systemScale, 0, RoundingMode.DOWN).intValue(); - List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum, elementVO.getStyle()); collectionElements.addAll(list); int randomNum = RandomsUtil.randomSysFile(collectionElements.size()); if (randomNum < collectionNoPinSize) { @@ -612,7 +612,7 @@ public class PythonService { } } } - List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum, elementVO.getStyle()); int randomNum = RandomsUtil.randomSysFile(list.size()); return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); } @@ -622,7 +622,7 @@ public class PythonService { } private DesignPythonItem processAttributeRecognitionBySameCategory(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory) { - List list = getSystemSketchPoolBySameCategory(attributeRecognition, styleCategory, elementVO.getModelSex()); + List list = getSystemSketchPoolBySameCategory(attributeRecognition, styleCategory, elementVO.getModelSex(), elementVO.getStyle()); int randomNum = RandomsUtil.randomSysFile(list.size()); return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); } @@ -630,7 +630,7 @@ public class PythonService { @Resource private AttributeRetrievalMapper attributeRetrievalMapper; - private List getSystemSketchPool(JSONObject attributeRecognition, String styleCategory, String modelSex, int poolNum) { + private List getSystemSketchPool(JSONObject attributeRecognition, String styleCategory, String modelSex, int poolNum, String style) { /** * female trousers->female_pants * female blouse->female_top @@ -644,19 +644,19 @@ public class PythonService { AttributeRetrieval attributeRetrievalAttrDict = toAttrDict(attrDictJSON); String tableName; tableName = getTableName(modelSex, styleCategory); - List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum, style); if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) { attributeRetrievalAttrDict.setDesign(null); - attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum, style); } if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) { attributeRetrievalAttrDict.setSilhouette(null); - attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum, style); } return toColoectionElementList(attributeRetrievalList, styleCategory, modelSex); } - private List getSystemSketchPoolBySameCategory(JSONObject attributeRecognition, String styleCategory, String modelSex) { + private List getSystemSketchPoolBySameCategory(JSONObject attributeRecognition, String styleCategory, String modelSex, String style) { /** * female trousers->female_pants * female blouse->female_top @@ -712,7 +712,7 @@ public class PythonService { } } - List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPoolBySameCategory(attributeRetrievalAttrDict, tableName); + List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPoolBySameCategory(attributeRetrievalAttrDict, tableName, style); if (CollectionUtil.isEmpty(attributeRetrievalList)) { System.out.println(attributeRetrievalAttrDict); System.out.println(tableName); @@ -935,7 +935,7 @@ public class PythonService { Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); String category = dressings.get(randomNum).getStyleCategory(); String tableName = getTableName(validateElementVO.getModelSex(), category); - AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName, validateElementVO.getStyle()); CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex()); return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO); } @@ -975,7 +975,7 @@ public class PythonService { Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); String category = dressings.get(randomNum).getStyleCategory(); String tableName = getTableName(validateElementVO.getModelSex(), category); - AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName, validateElementVO.getStyle()); CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex()); return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO); } @@ -2801,23 +2801,23 @@ public class PythonService { private List coverToModelsDotPythonItem(ModelsDotDTO modelsDotDTO) { List response = Lists.newArrayList(); if (modelsDotDTO.getTemplateUrl().contains("female")) { - DesignPythonItem dress = new DesignPythonItem(); - dress.setType(SysFileLevel2TypeEnum.DRESS.getRealName()); - dress.setColor("none"); - dress.setIcon("none"); +// DesignPythonItem dress = new DesignPythonItem(); +// dress.setType(SysFileLevel2TypeEnum.DRESS.getRealName()); +// dress.setColor("none"); +// dress.setIcon("none"); DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint(); designPythonItemPrint.setIfSingle(false); designPythonItemPrint.setPrint_path_list(new ArrayList<>()); - dress.setPrint(designPythonItemPrint); - dress.setPath("aida-sys-image/images/female/blouse/blouse_p5_817.jpg"); - response.add(dress); +// dress.setPrint(designPythonItemPrint); +// dress.setPath("aida-sys-image/images/female/blouse/blouse_p5_817.jpg"); +// response.add(dress); DesignPythonItem skirt = new DesignPythonItem(); - skirt.setType(SysFileLevel2TypeEnum.TROUSERS.getRealName()); + skirt.setType(SysFileLevel2TypeEnum.DRESS.getRealName()); skirt.setColor("none"); skirt.setIcon("none"); skirt.setPrint(designPythonItemPrint); - skirt.setPath("aida-sys-image/images/female/trousers/trousers_974.jpg"); + skirt.setPath("aida-sys-image/images/female/dress/0628002038.jpeg"); response.add(skirt); } else { DesignPythonItem top = new DesignPythonItem(); @@ -2839,7 +2839,7 @@ public class PythonService { designPythonItemPrint1.setIfSingle(false); designPythonItemPrint1.setPrint_path_list(new ArrayList<>()); bottom.setPrint(designPythonItemPrint1); - bottom.setPath("aida-sys-image/images/male/bottoms/mens_test_10007.png"); + bottom.setPath("aida-sys-image/images/male/bottoms/mens_test_12.png"); response.add(bottom); } @@ -3348,4 +3348,46 @@ public class PythonService { //生成失败 throw new BusinessException("toProductImage.interface.exception"); } + + public Boolean relight(String url, String taskId, String prompt) { + // todo 限流校验 +// AccessLimitUtils.validate("design",5); + 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"); + //关闭FastJson的引用检测 防止出现$ref 现象 + Map map = new HashMap<>(); + map.put("tasks_id", taskId); + map.put("image_url", url); + map.put("prompt", prompt); + log.info("relightImage请求python 参数:####{}", map); + String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() +// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") +// .url(accessPythonIp + ":9996/api/generate_product_image") + .url(accessPythonIp + ":9994/api/generate_relight_image") + .method("POST", body) + .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response; + String responseBody; + try { + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##relightImage异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("relightImage.interface.exception"); + } + if (response.isSuccessful()) { + return Boolean.TRUE; + } + log.error("PythonService##relightImage异常response###{}", response); + //生成失败 + throw new BusinessException("relightImage.interface.exception"); + } } diff --git a/src/main/java/com/ai/da/service/PortfolioService.java b/src/main/java/com/ai/da/service/PortfolioService.java index bd7fcbb4..86191a69 100644 --- a/src/main/java/com/ai/da/service/PortfolioService.java +++ b/src/main/java/com/ai/da/service/PortfolioService.java @@ -37,4 +37,6 @@ public interface PortfolioService extends IService { Long viewsGet(Long id); Boolean commentDelete(CommentDTO commentDTO); + + Boolean delete(Long id); } diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index 9ebc1527..d50214b0 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -53,7 +53,7 @@ public interface UserLikeGroupService extends IService { CanvasElementUpload canvasElementUpload(MultipartFile file); - List productImageLikeList(ToProductImageDTO toProductImageDTO); + List productImageLikeList(ToProductImageDTO toProductImageDTO); Boolean productImageUnLike(ProductImageLikeDTO productImageLikeDTO); diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 8bced01d..3fd813e2 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -13,6 +13,7 @@ import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.ModelType; import com.ai.da.model.enums.Sex; +import com.ai.da.model.enums.StyleEnum; import com.ai.da.model.vo.*; import com.ai.da.python.PythonService; import com.ai.da.python.vo.DesignPythonItem; @@ -578,6 +579,9 @@ public class CollectionElementServiceImpl extends ServiceImpl impleme .collect(Collectors.toList()); response.setClothes(CopyUtil.copyList(filterDetail, DesignItemClothesDetailVO.class, (o, d) -> { d.setId(o.getId()); - d.setPath(minioUtil.getPresignedUrl(o.getPath(), 24 * 60)); + d.setPath(minioUtil.getPresignedUrl(o.getPath(), 24 * 60, true)); d.setMinIOPath(o.getPath()); d.setLevel1Type(converTypeToLevel1(o.getType())); d.setGradient(JSONObject.parseObject(o.getGradientString(), Gradient.class)); 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 a6b0b3c8..54345eec 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -281,6 +281,7 @@ public class LibraryServiceImpl extends ServiceImpl impl path = "models/" + libraryUploadDTO.getModelSex().toLowerCase(); String filePath = minioUtil.upload(bucketName, path, libraryUploadDTO.getFile()); String newFilePath = processMannequins(filePath); +// String newFilePath = filePath; Library library = resolveData(libraryUploadDTO, userInfo, newFilePath); LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class); libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl()); diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 8e29615c..3e0a3554 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -431,11 +431,15 @@ public class PortfolioServiceImpl extends ServiceImpl getChildCommentVOList(Long id) { QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(Comment::getParentLevel1Id, id); diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index 0e645959..ffa09292 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -346,8 +346,8 @@ public class UserLikeGroupServiceImpl extends ServiceImpl productImageLikeList(ToProductImageDTO toProductImageDTO) { + public List productImageLikeList(ToProductImageDTO toProductImageDTO) { QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(ToProductImageResult::getIsLike, 1); qw.lambda().eq(ToProductImageResult::getUserLikeGroupId, toProductImageDTO.getUserLikeGroupId()); @@ -409,7 +409,20 @@ public class UserLikeGroupServiceImpl extends ServiceImpl toProductImageResultVOS = CopyUtil.copyList(toProductImageResults, ToProductImageResultVO.class); + for (ToProductImageResultVO toProductImageResultVO : toProductImageResultVOS) { + if (toProductImageResultVO.getElementType().equals("ProductElement")) { + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageResultVO.getElementId()); + toProductImageResultVO.setSourceUrl(minioUtil.getPresignedUrl(toProductElement.getUrl(), 24 * 60)); + }else if ((toProductImageResultVO.getElementType().equals("DesignOutfit"))) { + TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageResultVO.getElementId()); + toProductImageResultVO.setSourceUrl(minioUtil.getPresignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); + }else { + ToProductImageResult toProductImageResult1 = toProductImageResultMapper.selectById(toProductImageResultVO.getElementId()); + toProductImageResultVO.setSourceUrl(minioUtil.getPresignedUrl(toProductImageResult1.getUrl(), 24 * 60)); + } + } + return toProductImageResultVOS; } @Override @@ -443,15 +456,15 @@ public class UserLikeGroupServiceImpl extends ServiceImpl results = new ArrayList<>(); Set collect = new HashSet<>(); taskIdList.forEach(taskId -> { - String key = toProductImageResultKey + ":" + taskId; + String key = relightResultKey + ":" + taskId; MagicToolResultVO magicToolResultVO = new Gson().fromJson(redisUtil.getFromString(key), MagicToolResultVO.class); if (!Objects.isNull(magicToolResultVO) && !StringUtil.isNullOrEmpty(magicToolResultVO.getUrl())) { String url = magicToolResultVO.getUrl(); diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 21b5e945..3f14f686 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -6,7 +6,7 @@ spring.datasource.primary.username=aida_con spring.datasource.primary.password=123456 spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval_new?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval_new_style?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.secondary.username=aida_con spring.datasource.secondary.password=123456 diff --git a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml index 85113c9f..8065dc00 100644 --- a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml +++ b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml @@ -29,6 +29,10 @@ AND silhouette = #{attributeRetrievalAttrDict.silhouette} + + AND style = #{style} + + AND deprecated = 0 ORDER BY RAND() @@ -40,6 +44,12 @@ * FROM ${tableName} + + + AND style = #{style} + + AND deprecated = 0 + ORDER BY RAND() LIMIT 1 @@ -60,6 +70,10 @@ AND subtype = #{attributeRetrievalAttrDict.subtype} + + AND style = #{style} + + AND deprecated = 0 ORDER BY RAND() @@ -79,4 +93,13 @@ set style = #{style} where ID = #{id} + + + UPDATE + ${tableName} + SET + style = #{style} + WHERE + image_name = #{fileName} + From bc240cd2ee516a6276db526bccac8ed6ad399237 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Thu, 27 Jun 2024 17:36:47 +0800 Subject: [PATCH 45/79] TASK:aida; --- .../com/ai/da/model/dto/ModelsDotDTO.java | 2 ++ .../java/com/ai/da/python/PythonService.java | 28 +++++++++++-------- .../secondary/AttributeRetrievalMapper.xml | 6 ++-- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java b/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java index 13d05050..f6a20db7 100644 --- a/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java +++ b/src/main/java/com/ai/da/model/dto/ModelsDotDTO.java @@ -71,4 +71,6 @@ public class ModelsDotDTO implements Serializable { */ private String templateUrl; + private String sex; + } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index da8def64..26027876 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2800,24 +2800,28 @@ public class PythonService { private List coverToModelsDotPythonItem(ModelsDotDTO modelsDotDTO) { List response = Lists.newArrayList(); - if (modelsDotDTO.getTemplateUrl().contains("female")) { -// DesignPythonItem dress = new DesignPythonItem(); -// dress.setType(SysFileLevel2TypeEnum.DRESS.getRealName()); -// dress.setColor("none"); -// dress.setIcon("none"); + if (modelsDotDTO.getSex().contains("Female")) { + DesignPythonItem dress = new DesignPythonItem(); + dress.setType(SysFileLevel2TypeEnum.BLOUSE.getRealName()); + dress.setColor("none"); + dress.setIcon("none"); DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint(); designPythonItemPrint.setIfSingle(false); designPythonItemPrint.setPrint_path_list(new ArrayList<>()); -// dress.setPrint(designPythonItemPrint); -// dress.setPath("aida-sys-image/images/female/blouse/blouse_p5_817.jpg"); -// response.add(dress); + dress.setPrint(designPythonItemPrint); + dress.setPath("aida-sys-image/images/female/blouse/0628001551.jpg"); + response.add(dress); DesignPythonItem skirt = new DesignPythonItem(); - skirt.setType(SysFileLevel2TypeEnum.DRESS.getRealName()); + skirt.setType(SysFileLevel2TypeEnum.SKIRT.getRealName()); skirt.setColor("none"); skirt.setIcon("none"); - skirt.setPrint(designPythonItemPrint); - skirt.setPath("aida-sys-image/images/female/dress/0628002038.jpeg"); + DesignPythonItemPrint designPythonItemPrint1 = new DesignPythonItemPrint(); + designPythonItemPrint1.setIfSingle(false); + designPythonItemPrint1.setPrint_path_list(new ArrayList<>()); + skirt.setPrint(designPythonItemPrint1); + skirt.setPath("aida-sys-image/images/female/skirt/0628000022.jpg"); +// skirt.setPath("aida-sys-image/images/female/dress/0628000000.jpg"); response.add(skirt); } else { DesignPythonItem top = new DesignPythonItem(); @@ -2839,7 +2843,7 @@ public class PythonService { designPythonItemPrint1.setIfSingle(false); designPythonItemPrint1.setPrint_path_list(new ArrayList<>()); bottom.setPrint(designPythonItemPrint1); - bottom.setPath("aida-sys-image/images/male/bottoms/mens_test_12.png"); + bottom.setPath("aida-sys-image/images/male/bottoms/mens_test_6252.png"); response.add(bottom); } diff --git a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml index 8065dc00..bcdfa819 100644 --- a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml +++ b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml @@ -32,7 +32,7 @@ AND style = #{style} - AND deprecated = 0 + ORDER BY RAND() @@ -48,7 +48,7 @@ AND style = #{style} - AND deprecated = 0 + ORDER BY RAND() @@ -73,7 +73,7 @@ AND style = #{style} - AND deprecated = 0 + ORDER BY RAND() From 4211bce256884cb46698699b841f7a6217056980 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 28 Jun 2024 15:45:39 +0800 Subject: [PATCH 46/79] BUGFIX:aida; --- .../com/ai/da/model/dto/DesignCollectionPrintElementDTO.java | 2 ++ .../com/ai/da/service/impl/CollectionElementServiceImpl.java | 3 +++ src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java | 3 +++ 3 files changed, 8 insertions(+) diff --git a/src/main/java/com/ai/da/model/dto/DesignCollectionPrintElementDTO.java b/src/main/java/com/ai/da/model/dto/DesignCollectionPrintElementDTO.java index 18853d95..50d4f679 100644 --- a/src/main/java/com/ai/da/model/dto/DesignCollectionPrintElementDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignCollectionPrintElementDTO.java @@ -14,6 +14,8 @@ public class DesignCollectionPrintElementDTO { @ApiModelProperty("design类型 用户design生成时候区别library和collection") private String designType; + private String level2Type; + @ApiModelProperty("是否pin 1 pin 0 不pin") private Byte isPin; diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 3fd813e2..b1f1156e 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -668,6 +668,9 @@ public class CollectionElementServiceImpl extends ServiceImpl collectionElementRelationListNew = new ArrayList<>(); for (CollectionElement element : collectionElementListOld) { From dd8f5696a2f2ffb99b2ebae2e080c6583e469a27 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 28 Jun 2024 16:52:16 +0800 Subject: [PATCH 47/79] BUGFIX:aida; --- .../ai/da/mapper/primary/entity/Portfolio.java | 4 ++++ .../da/mapper/primary/entity/UserLikeGroup.java | 4 ++++ .../ai/da/service/impl/PortfolioServiceImpl.java | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java index 8f15354a..f8cff637 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java @@ -47,6 +47,10 @@ public class Portfolio implements Serializable { @ApiModelProperty(value = "是否允许二次创作1允许0不允许") private Integer openSource; + private Integer original; + + private Long originalAccountId; + @ApiModelProperty(value = "作品集作者ID") private Long accountId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java index 2aa8cc0e..1747c83b 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java @@ -43,6 +43,10 @@ public class UserLikeGroup implements Serializable { */ private String name; + private Integer original; + + private Long originalAccountId; + /** * 创建时间 */ diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index fb7a43f3..664e73de 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -110,7 +110,8 @@ public class PortfolioServiceImpl extends ServiceImpl Date: Tue, 2 Jul 2024 13:48:53 +0800 Subject: [PATCH 48/79] BUGFIX:aida; --- .../com/ai/da/model/dto/ToProductImageDTO.java | 2 ++ .../java/com/ai/da/model/vo/PortfolioVO.java | 2 ++ .../com/ai/da/model/vo/UserLikeGroupVO.java | 4 ++++ .../java/com/ai/da/python/PythonService.java | 7 +++++-- .../da/service/impl/PortfolioServiceImpl.java | 6 ++++++ .../service/impl/UserLikeGroupServiceImpl.java | 18 +++++++++++++----- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java index 25af4ec5..e51f5fd7 100644 --- a/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java +++ b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java @@ -3,6 +3,7 @@ package com.ai.da.model.dto; import com.ai.da.model.vo.ToProductImageVO; import lombok.Data; +import java.math.BigDecimal; import java.util.List; @Data @@ -10,4 +11,5 @@ public class ToProductImageDTO { private Long userLikeGroupId; private List toProductImageVOList; private String prompt; + private BigDecimal imageStrength; } diff --git a/src/main/java/com/ai/da/model/vo/PortfolioVO.java b/src/main/java/com/ai/da/model/vo/PortfolioVO.java index 12e9199b..de059c3c 100644 --- a/src/main/java/com/ai/da/model/vo/PortfolioVO.java +++ b/src/main/java/com/ai/da/model/vo/PortfolioVO.java @@ -18,4 +18,6 @@ public class PortfolioVO extends Portfolio { private Long viewNums; private String userName; + + private String originalUserName; } diff --git a/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java b/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java index a796d902..8f35521b 100644 --- a/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java +++ b/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java @@ -22,6 +22,10 @@ public class UserLikeGroupVO { @ApiModelProperty("创建者") private String author; + private Integer original; + + private Long originalAccountId; + @ApiModelProperty("更新时间") private Long updateDate; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 26027876..f9a48575 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3311,7 +3311,7 @@ public class PythonService { return text; } - public Boolean toProductImage(String url, String taskId, String prompt) { + public Boolean toProductImage(String url, String taskId, String prompt, BigDecimal imageStrength) { // todo 限流校验 // AccessLimitUtils.validate("design",5); OkHttpClient client = new OkHttpClient().newBuilder() @@ -3322,12 +3322,14 @@ public class PythonService { .build(); MediaType mediaType = MediaType.parse("application/json"); //关闭FastJson的引用检测 防止出现$ref 现象 - Map map = new HashMap<>(); + Map map = new HashMap<>(); map.put("tasks_id", taskId); map.put("image_url", url); map.put("prompt", prompt); + map.put("image_strength", imageStrength); log.info("toProductImage请求python 参数:####{}", map); String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); + System.out.println(param); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() // .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") @@ -3370,6 +3372,7 @@ public class PythonService { map.put("prompt", prompt); log.info("relightImage请求python 参数:####{}", map); String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); + log.info(param); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() // .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 664e73de..3144ed5b 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -408,6 +408,9 @@ public class PortfolioServiceImpl extends ServiceImpl Date: Tue, 2 Jul 2024 15:23:27 +0800 Subject: [PATCH 49/79] BUGFIX:aida; --- .../da/mapper/primary/entity/Portfolio.java | 2 ++ .../mapper/primary/entity/UserLikeGroup.java | 2 ++ .../java/com/ai/da/model/vo/PortfolioVO.java | 2 ++ .../da/service/impl/PortfolioServiceImpl.java | 33 ++++++++++++++++--- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java index f8cff637..258012f1 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java @@ -51,6 +51,8 @@ public class Portfolio implements Serializable { private Long originalAccountId; + private Long originalPortfolioId; + @ApiModelProperty(value = "作品集作者ID") private Long accountId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java index 1747c83b..4f3867ca 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java @@ -47,6 +47,8 @@ public class UserLikeGroup implements Serializable { private Long originalAccountId; + private Long originalPortfolioId; + /** * 创建时间 */ diff --git a/src/main/java/com/ai/da/model/vo/PortfolioVO.java b/src/main/java/com/ai/da/model/vo/PortfolioVO.java index de059c3c..fb7b7366 100644 --- a/src/main/java/com/ai/da/model/vo/PortfolioVO.java +++ b/src/main/java/com/ai/da/model/vo/PortfolioVO.java @@ -20,4 +20,6 @@ public class PortfolioVO extends Portfolio { private String userName; private String originalUserName; + + private String originalPortfolioName; } diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 3144ed5b..b8637efb 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -97,8 +97,15 @@ public class PortfolioServiceImpl extends ServiceImpl existSameNameQw = new QueryWrapper<>(); + existSameNameQw.lambda().eq(Portfolio::getPortfolioName, portfolioDTO.getPortfolioName()); + List portfoliosSameName = portfolioMapper.selectList(existSameNameQw); + if (!CollectionUtils.isEmpty(portfoliosSameName)) { + throw new BusinessException("The title of the published work has been used."); + } AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); if (file != null && file.getOriginalFilename() != null) { String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file); @@ -141,8 +148,9 @@ public class PortfolioServiceImpl extends ServiceImpl existSameNameQw = new QueryWrapper<>(); + existSameNameQw.lambda().ne(Portfolio::getId, portfolioDTO.getId()); + existSameNameQw.lambda().eq(Portfolio::getPortfolioName, portfolioDTO.getPortfolioName()); + List portfoliosSameName = portfolioMapper.selectList(existSameNameQw); + if (!CollectionUtils.isEmpty(portfoliosSameName)) { + throw new BusinessException("The title of the published work has been used."); + } if (portfolioDTO.getPortfolioType().equals("History")) { AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); UserLikeGroup userLikeGroup = userLikeGroupMapper.selectById(portfolioDTO.getUserLikeGroupId()); @@ -459,6 +475,7 @@ public class PortfolioServiceImpl extends ServiceImpl Date: Wed, 3 Jul 2024 15:22:01 +0800 Subject: [PATCH 50/79] BUGFIX:aida; --- .../java/com/ai/da/python/PythonService.java | 2 +- .../da/service/impl/PortfolioServiceImpl.java | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index f9a48575..6e0d1d10 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3377,7 +3377,7 @@ public class PythonService { Request request = new Request.Builder() // .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") // .url(accessPythonIp + ":9996/api/generate_product_image") - .url(accessPythonIp + ":9994/api/generate_relight_image") + .url(accessPythonIp + ":9996/api/generate_relight_image") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index b8637efb..0a320af5 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; +import sun.security.krb5.internal.crypto.Des; import javax.annotation.Resource; import java.math.BigDecimal; @@ -96,6 +97,12 @@ public class PortfolioServiceImpl extends ServiceImpl getWorkspaceQw = new QueryWrapper<>(); + getWorkspaceQw.lambda().eq(Design::getCollectionId, collectionId); + List designs = designMapper.selectList(getWorkspaceQw); + if (!CollectionUtils.isEmpty(designs)) { + Design design1 = designs.get(0); + Long accountId = authPrincipalVo.getId(); + QueryWrapper currentWorkspaceQw = new QueryWrapper<>(); + currentWorkspaceQw.lambda().eq(Workspace::getAccountId, accountId); + currentWorkspaceQw.lambda().eq(Workspace::getIsLastIndex, 1); + List workspaces = workspaceMapper.selectList(currentWorkspaceQw); + if (!CollectionUtils.isEmpty(workspaces)) { + Workspace workspace1 = workspaces.get(0); + workspace1.setIsLastIndex(0); + + Workspace workspaceNew = new Workspace(); + workspaceNew.setWorkSpaceName("workspace of " + portfolio.getPortfolioName()); + workspaceNew.setAccountId(accountId); + workspaceNew.setIsDeleted(0); + workspaceNew.setIsLastIndex(1); + if (design1.getModelType().equals("System")) { + SysFile sysFile = sysFileMapper.selectById(design1.getTemplateId()); + if (sysFile.getLevel2Type().equals("Female")) { + workspaceNew.setSex("Female"); + workspaceNew.setMannequinFemaleId(design1.getTemplateId()); + QueryWrapper getAnotherOneQw = new QueryWrapper<>(); + getAnotherOneQw.lambda().eq(SysFile::getLevel1Type, "Models") + }else { + workspaceNew.setSex("Male"); + workspaceNew.setMannequinMaleId(design1.getTemplateId()); + } + if (design1.getSingleOverall().equals("overall")) { + workspaceNew.setPosition("Overall"); + }else { + workspaceNew.setPosition(design1.getSwitchCategory()); + } + } + workspaceNew.setSex(); + } + + + + } + return userLikeGroupService.choose(userLikeGroupNew.getId()); } From d2129459feb3fe626479b4ddc6bf8fda81a216a3 Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 3 Jul 2024 16:43:22 +0800 Subject: [PATCH 51/79] =?UTF-8?q?S3Util=20=E5=B7=A5=E5=85=B7=E7=B1=BB?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/enums/CreditsEventsEnum.java | 2 +- .../com/ai/da/common/task/AccountTask.java | 6 ++- .../com/ai/da/common/utils/MinioUtil.java | 8 ++-- .../java/com/ai/da/common/utils/S3Util.java | 38 ++++++++++++------- .../ai/da/controller/LibraryController.java | 2 +- .../controller/SavedCollectionController.java | 2 +- .../da/mapper/primary/entity/BaseEntity.java | 3 ++ .../da/python/vo/DesignPythonItemPrint.java | 8 ++-- .../da/service/impl/ChatRobotServiceImpl.java | 2 +- .../impl/CollectionElementServiceImpl.java | 18 +++++---- .../service/impl/CollectionServiceImpl.java | 12 +++--- .../service/impl/DesignItemServiceImpl.java | 21 +++++----- .../ai/da/service/impl/DesignServiceImpl.java | 30 +++++++-------- .../da/service/impl/GenerateServiceImpl.java | 6 +-- .../da/service/impl/LibraryServiceImpl.java | 13 +++---- .../da/service/impl/PortfolioServiceImpl.java | 10 ++--- .../TDesignPythonOutfitDetailServiceImpl.java | 6 +-- .../da/service/impl/TaskListServiceImpl.java | 8 ++-- .../impl/UserLikeGroupServiceImpl.java | 28 ++++++-------- .../da/service/impl/WorkspaceServiceImpl.java | 34 ++++++++--------- 20 files changed, 131 insertions(+), 126 deletions(-) diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index 7978920c..889c51a8 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -17,7 +17,7 @@ public enum CreditsEventsEnum { INIT_YEARLY("init_yearly", "6000"), INIT_MONTHLY("init_monthly", "5000"), INIT_TRIAL("init_trial", "100"), - INIT_WEEKLY("init_weekly","10000"), + INIT_WEEKLY("init_weekly","6000"), // SUPER_RESOLUTION("Super Resolution","30"), SUPER_RESOLUTION("Super Resolution","10"), diff --git a/src/main/java/com/ai/da/common/task/AccountTask.java b/src/main/java/com/ai/da/common/task/AccountTask.java index fa866e9d..ca7edd6d 100644 --- a/src/main/java/com/ai/da/common/task/AccountTask.java +++ b/src/main/java/com/ai/da/common/task/AccountTask.java @@ -1,20 +1,24 @@ package com.ai.da.common.task; import com.ai.da.service.AccountService; +import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; @Component +@Slf4j public class AccountTask { @Resource private AccountService accountService; /** 每周日晚上刷新 年付用户、月付用户的积分 */ -// @Scheduled(cron = "59 59 23 ? * SUN") + @Scheduled(cron = "59 59 23 ? * SUN") +// @Scheduled(cron = "59 59 23 * * ?") public void refreshCreditsMonthly(){ + log.info("每周日晚11:59:59刷新付费用户积分为 6000"); accountService.refreshCreditsWeekly(); } 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 300d68d3..581c6d0e 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -373,7 +373,7 @@ public class MinioUtil { * @param expiry 过期时间(单位:分) * @return 文件的临时URL,如果出现异常则返回null */ - public String getPresignedUrl(String bucketName, String fileName, int expiry) { + public String getPreSignedUrl(String bucketName, String fileName, int expiry) { try { return minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder() @@ -389,7 +389,7 @@ public class MinioUtil { } } - public String getPresignedUrl(String path, int expiry) { + public String getPreSignedUrl(String path, int expiry) { if (LocalCacheUtils.getPresignedUrlCache(path) != null) { return LocalCacheUtils.getPresignedUrlCache(path); } else { @@ -399,7 +399,7 @@ public class MinioUtil { int index = path.indexOf("/"); String bucketName = path.substring(0, index); String fileName = path.substring(index + 1); - String presignedUrl = getPresignedUrl(bucketName, fileName, expiry); + String presignedUrl = getPreSignedUrl(bucketName, fileName, expiry); LocalCacheUtils.setPresignedUrlCache(path, presignedUrl); return presignedUrl; } @@ -422,7 +422,7 @@ public class MinioUtil { fileName.append("/"); } } - return getPresignedUrl(bucketName, String.valueOf(fileName), expiry); + return getPreSignedUrl(bucketName, String.valueOf(fileName), expiry); } public boolean doesObjectExist(String bucketName, String objectName) { diff --git a/src/main/java/com/ai/da/common/utils/S3Util.java b/src/main/java/com/ai/da/common/utils/S3Util.java index 03bd6fbe..705aca7b 100644 --- a/src/main/java/com/ai/da/common/utils/S3Util.java +++ b/src/main/java/com/ai/da/common/utils/S3Util.java @@ -104,11 +104,11 @@ public class S3Util { .contentType("image/png") .contentLength((long) in.available()) .key(fileName) -// .acl(ObjectCannedACL.PUBLIC_READ) + .acl(ObjectCannedACL.PUBLIC_READ) .build(); s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available())); - log.info("上传的位置:桶 - {},路径 - {}", bucketName, fileName); + log.info("uploadImageFromBase64 上传的位置:桶 - {},路径 - {}", bucketName, fileName); return bucketName + "/" + fileName; } catch (Exception e) { e.printStackTrace(); @@ -132,18 +132,19 @@ public class S3Util { .contentType(file.getContentType()) .contentLength(file.getSize()) .key(fileName) -// .acl(ObjectCannedACL.PUBLIC_READ) + .acl(ObjectCannedACL.PUBLIC_READ) .build(); s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); - log.info("上传的位置:桶 - {},路径 - {}", bucketName, fileName); + log.info("upload 上传的位置:桶 - {},路径 - {}", bucketName, fileName); return bucketName + "/" + fileName; } catch (Exception e) { log.error("上传文件到S3失败 异常:{}", e.getMessage()); return null; } } - // todo + + // todo public String upload(String bucketName, String path, MultipartFile file, String copy) { S3Client s3Client = getS3Client(); InputStream in = null; @@ -155,10 +156,10 @@ public class S3Util { .contentType(file.getContentType()) .contentLength(file.getSize()) .key(path) -// .acl(ObjectCannedACL.PUBLIC_READ) + .acl(ObjectCannedACL.PUBLIC_READ) .build(); s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); - + log.info("upload-copy 上传的位置:桶 - {},路径 - {}", bucketName, path); } catch (Exception e) { e.printStackTrace(); } finally { @@ -195,6 +196,7 @@ public class S3Util { // ResponseBytes objectBytes = s3.getObjectAsBytes(objectRequest); ResponseBytes objectAsBytes = s3Client.getObjectAsBytes(objectRequest); byte[] data = objectAsBytes.asByteArray(); + log.info("download 下载图片位置:桶 - {},路径 - {}", bucketName, objectName); return new ByteArrayInputStream(data); /*// Write the data to a local file. @@ -263,6 +265,9 @@ public class S3Util { String preSignatureUrl = ""; try { S3Presigner s3PreSigner = getS3PreSigner(); + S3Client s3Client = getS3Client(); + setObjectAcl(s3Client, bucket, keyName, ObjectCannedACL.PUBLIC_READ); + GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucket) .key(keyName) @@ -286,13 +291,20 @@ public class S3Util { s3PreSigner.presignGetObject(getObjectPresignRequest); preSignatureUrl = String.valueOf(presignedGetObjectRequest.url()); - } catch (Exception e) { log.error("生成预签名URL失败,异常:{}", e.getMessage()); } return preSignatureUrl; } + public static void setObjectAcl(S3Client s3, String bucketName, String keyName, ObjectCannedACL acl) { + PutObjectAclRequest aclRequest = PutObjectAclRequest.builder() + .bucket(bucketName) + .key(keyName) + .acl(acl) + .build(); + s3.putObjectAcl(aclRequest); + } public boolean doesObjectExist(String bucketName, String objectName) { try { S3Client s3Client = getS3Client(); @@ -309,7 +321,7 @@ public class S3Util { } } - public String base64UploadToPath(String base64, String bucketName, String path){ + public String base64UploadToPath(String base64, String bucketName, String path) { S3Client s3Client = getS3Client(); String[] parts = base64.split(","); String imageType = parts[0].split("/")[1].split(";")[0]; @@ -317,9 +329,9 @@ public class S3Util { byte[] imageBytes = Base64.getDecoder().decode(base64Data); String fileName; - if (!StringUtil.isNullOrEmpty(path)){ + if (!StringUtil.isNullOrEmpty(path)) { fileName = path + "." + imageType; // or any other image format - }else { + } else { fileName = UUID.randomUUID() + "." + imageType; } @@ -329,11 +341,11 @@ public class S3Util { .contentType("image/" + imageType) .contentLength((long) in.available()) .key(fileName) -// .acl(ObjectCannedACL.PUBLIC_READ) + .acl(ObjectCannedACL.PUBLIC_READ) .build(); s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available())); - log.info("上传的位置:桶 - {},路径 - {}", bucketName, fileName); + log.info("base64UploadToPath 上传的位置:桶 - {},路径 - {}", bucketName, fileName); return bucketName + "/" + fileName; } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java index 9c3a6ebb..3330da02 100644 --- a/src/main/java/com/ai/da/controller/LibraryController.java +++ b/src/main/java/com/ai/da/controller/LibraryController.java @@ -163,7 +163,7 @@ public class LibraryController { Response response = new Response(); log.info("Models打点预览入参####{}", JSON.toJSONString(modelsDotDTO)); String url = libraryModelPointService.modelsDot(modelsDotDTO); - response.setData(minioUtil.getPresignedUrl(url, 24 * 60)); + response.setData(minioUtil.getPreSignedUrl(url, 24 * 60)); return response; } diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index d832bdb9..334c0037 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -118,7 +118,7 @@ public class SavedCollectionController { List details = groupDetailMap.get(group.getId()); for (UserLikeVO detail : details) { TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(detail.getDesignOutfitId()); - detail.setUrl(minioUtil.getPresignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); + detail.setUrl(minioUtil.getPreSignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); } userLikeGroupVO.setGroupDetails(details); userLikeGroupVO.setSketchCount(CollectionUtils.isEmpty(details) ? 0 : details.size()); diff --git a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java index f78fb748..cc960200 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java @@ -2,6 +2,7 @@ package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -24,11 +25,13 @@ public class BaseEntity implements Serializable { /** * 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private LocalDateTime createTime; /** * 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private LocalDateTime updateTime; /** diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java b/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java index 7650429c..6f44455f 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java @@ -29,7 +29,7 @@ public class DesignPythonItemPrint { * 是否打点 */ @ApiModelProperty("是否打点 是传true 否则false") - private Boolean IfSingle; + private Boolean ifSingle; @ApiModelProperty("print的位置 传 [[0.2, 0.2]]") @@ -43,14 +43,14 @@ public class DesignPythonItemPrint { @JSONField(name = "IfSingle") public Boolean getIfSingle() { - return IfSingle; + return ifSingle; } public DesignPythonItemPrint(String singlePath, String level1Type, Float scale, Boolean ifSingle) { this.path = singlePath; this.level1Type = level1Type; this.scale = scale; - IfSingle = ifSingle; + this.ifSingle = ifSingle; } public DesignPythonItemPrint() { @@ -62,6 +62,6 @@ public class DesignPythonItemPrint { public DesignPythonItemPrint(List print_path_list, Boolean ifSingle) { this.print_path_list = print_path_list; - IfSingle = ifSingle; + this.ifSingle = ifSingle; } } diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index 79eb8b37..11f4126a 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -223,7 +223,7 @@ public class ChatRobotServiceImpl implements ChatRobotService { if (!CollectionUtils.isEmpty(libraryList)) { chatRobotLibraryVO.setId(libraryList.get(0).getId()); } - String aidaSysImage = minioUtil.getPresignedUrl(bucketName + "/" + path, 24 * 60); + String aidaSysImage = minioUtil.getPreSignedUrl(bucketName + "/" + path, 24 * 60); chatRobotLibraryVO.setUrl(bucketName + "/" + path); chatRobotLibraryVO.setPresignedUrl(aidaSysImage); chatRobotLibraryVOList.add(chatRobotLibraryVO); diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 8bced01d..8cda2182 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -23,7 +23,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; -import io.minio.errors.MinioException; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -35,8 +34,6 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.ZoneId; @@ -105,7 +102,7 @@ public class CollectionElementServiceImpl extends ServiceImpl> libraryIds = generateDetailMapper.getLibraryIdThroughMD5(md5, CollectionLevel1TypeEnum.PRINT_BOARD.getRealName()); if (libraryIds.isEmpty()){ diff --git a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java index 1aad260c..871bb8f3 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java @@ -80,7 +80,7 @@ public class CollectionServiceImpl extends ServiceImpl> maps = collectionElements @@ -95,27 +95,27 @@ public class CollectionServiceImpl extends ServiceImpl { d.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); - d.setUrl(minioUtil.getPresignedUrl(o.getUrl(), 24 * 60)); + d.setUrl(minioUtil.getPreSignedUrl(o.getUrl(), 24 * 60)); })); break; case PRINT_BOARD: response.setPrintBoards(CopyUtil.copyList(v, CollectionElementVO.class, (o, d) -> { d.setIsPin(o.getHasPin()); d.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); - d.setUrl(minioUtil.getPresignedUrl(o.getUrl(), 24 * 60)); + d.setUrl(minioUtil.getPreSignedUrl(o.getUrl(), 24 * 60)); })); break; case SKETCH_BOARD: response.setSketchBoards(CopyUtil.copyList(v, CollectionElementVO.class, (o, d) -> { d.setIsPin(o.getHasPin()); d.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); - d.setUrl(minioUtil.getPresignedUrl(o.getUrl(), 24 * 60)); + d.setUrl(minioUtil.getPreSignedUrl(o.getUrl(), 24 * 60)); String url = o.getUrl(); if (url.contains(".")) { String[] split = url.split("\\."); - d.setUrlWithWhiteSide(minioUtil.getPresignedUrl(split[0] + "-show." + split[1], 24 * 60)); + d.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(split[0] + "-show." + split[1], 24 * 60)); }else { - d.setUrlWithWhiteSide(minioUtil.getPresignedUrl(url + "-show", 24 * 60)); + d.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(url + "-show", 24 * 60)); } })); break; diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index 82ab7971..593d509b 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -8,10 +8,7 @@ import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.CollectionLevel1TypeEnum; import com.ai.da.common.enums.SingleOverallEnum; import com.ai.da.common.enums.SysFileLevel2TypeEnum; -import com.ai.da.common.utils.CopyUtil; -import com.ai.da.common.utils.DateUtil; -import com.ai.da.common.utils.MD5Utils; -import com.ai.da.common.utils.MinioUtil; +import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.DesignItemMapper; import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; @@ -536,7 +533,7 @@ public class DesignItemServiceImpl extends ServiceImpl { if (!StringUtil.isNullOrEmpty(designSingleItem.getDesignType()) && designSingleItem.getDesignType().equals("Collection")){ - String path = minioUtil.getPresignedUrl(designSingleItem.getPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); + String path = minioUtil.getPreSignedUrl(designSingleItem.getPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); try { String md5 = MD5Utils.encryptFile(path, false); // 先判断是否需要被加入到library @@ -814,7 +811,7 @@ public class DesignItemServiceImpl extends ServiceImpl { if (!StringUtil.isNullOrEmpty(print.getDesignType()) && print.getDesignType().equals("Collection")){ - String path = minioUtil.getPresignedUrl(print.getMinIOPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); + String path = minioUtil.getPreSignedUrl(print.getMinIOPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); try { String md5 = MD5Utils.encryptFile(path, false); // 先判断是否已被加入到library 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 07ffbec1..4fcda3fe 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -382,9 +382,9 @@ public class DesignServiceImpl extends ServiceImpl impleme String url = byId.getUrl(); if (url.contains(".")) { String[] split = url.split("\\."); - vo.setUrlWithWhiteSide(minioUtil.getPresignedUrl(split[0] + "-show." + split[1], 24 * 60)); + vo.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(split[0] + "-show." + split[1], 24 * 60)); }else { - vo.setUrlWithWhiteSide(minioUtil.getPresignedUrl(url + "-show", 24 * 60)); + vo.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(url + "-show", 24 * 60)); } result.add(vo); }else if (collectionSketchDTO.getDesignType().equals(DesignTypeEnum.GENERATE.getRealName())) { @@ -393,9 +393,9 @@ public class DesignServiceImpl extends ServiceImpl impleme String url = generateDetail.getUrl(); if (url.contains(".")) { String[] split = url.split("\\."); - vo.setUrlWithWhiteSide(minioUtil.getPresignedUrl(split[0] + "-show." + split[1], 24 * 60)); + vo.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(split[0] + "-show." + split[1], 24 * 60)); }else { - vo.setUrlWithWhiteSide(minioUtil.getPresignedUrl(url + "-show", 24 * 60)); + vo.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(url + "-show", 24 * 60)); } result.add(vo); } @@ -411,9 +411,9 @@ public class DesignServiceImpl extends ServiceImpl impleme String url = byId.getUrl(); if (url.contains(".")) { String[] split = url.split("\\."); - vo.setUrlWithWhiteSide(minioUtil.getPresignedUrl(split[0] + "-show." + split[1], 24 * 60)); + vo.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(split[0] + "-show." + split[1], 24 * 60)); }else { - vo.setUrlWithWhiteSide(minioUtil.getPresignedUrl(url + "-show", 24 * 60)); + vo.setUrlWithWhiteSide(minioUtil.getPreSignedUrl(url + "-show", 24 * 60)); } result.add(vo); } @@ -597,7 +597,7 @@ public class DesignServiceImpl extends ServiceImpl impleme String designUrl = designPythonOutfit.getDesignUrl(); if (!StringUtils.isEmpty(designUrl) && designUrl.contains("/")) { int firstIndex = designUrl.indexOf("/"); - designCollectionItemVO.setDesignOutfitUrl(minioUtil.getPresignedUrl(designUrl.substring(0, firstIndex) + "/" + designUrl.substring(firstIndex + 1), 24 * 60)); + designCollectionItemVO.setDesignOutfitUrl(minioUtil.getPreSignedUrl(designUrl.substring(0, firstIndex) + "/" + designUrl.substring(firstIndex + 1), 24 * 60)); } //response designCollectionItems.add(designCollectionItemVO); @@ -997,7 +997,7 @@ public class DesignServiceImpl extends ServiceImpl impleme .collect(Collectors.toList()); response.setClothes(CopyUtil.copyList(filterDetail, DesignItemClothesDetailVO.class, (o, d) -> { d.setId(o.getId()); - d.setPath(minioUtil.getPresignedUrl(o.getPath(), 24 * 60)); + d.setPath(minioUtil.getPreSignedUrl(o.getPath(), 24 * 60)); d.setMinIOPath(o.getPath()); d.setLevel1Type(converTypeToLevel1(o.getType())); d.setGradient(JSONObject.parseObject(o.getGradientString(), Gradient.class)); @@ -1025,12 +1025,12 @@ public class DesignServiceImpl extends ServiceImpl impleme // todo 不确定businessId的作用,暂时取消传递,查看影响 // d.setId(o.getBusinessId()); d.setId(0L); - d.setPath(minioUtil.getPresignedUrl(o.getPath(), 24 * 60)); + d.setPath(minioUtil.getPreSignedUrl(o.getPath(), 24 * 60)); d.setMinIOPath(o.getPath()); d.setPrintObject(new DesignPythonItemPrint()); })); return editDesignItemLayer(flag, designPythonOutfit, - minioUtil.getPresignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60), + minioUtil.getPreSignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60), editResponseColor(designItemDetails, response)); } @@ -1169,7 +1169,7 @@ public class DesignServiceImpl extends ServiceImpl impleme }); // 2、将查询出的图层信息填充到designItemDetailVO中 - designItemDetailVO.setDesignItemUrl(minioUtil.getPresignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60)); + designItemDetailVO.setDesignItemUrl(minioUtil.getPreSignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60)); // 2.1 填充clothes designItemDetailVO.getClothes().forEach(c -> { // String type = c.getType().toLowerCase(); @@ -1209,7 +1209,7 @@ public class DesignServiceImpl extends ServiceImpl impleme designSinglePrint.setLocation(JSONArray.parseArray(detailPrint.getPosition(), Double.class)); designSinglePrint.setAngle(detailPrint.getAngle()); designSinglePrint.setPriority(detailPrint.getPriority()); - designSinglePrint.setPath(minioUtil.getPresignedUrl(detailPrint.getPath(), 24 * 60)); + designSinglePrint.setPath(minioUtil.getPreSignedUrl(detailPrint.getPath(), 24 * 60)); designSinglePrint.setMinIOPath(detailPrint.getPath()); designSinglePrint.setScale(detailPrint.getScale()); prints.add(designSinglePrint); @@ -1220,7 +1220,7 @@ public class DesignServiceImpl extends ServiceImpl impleme if (print.getSingleOrOverall().equals("single")) { prints.add(new DesignSinglePrint( print.getLevel2Type(), - minioUtil.getPresignedUrl(print.getPath(), 24 * 60), + minioUtil.getPreSignedUrl(print.getPath(), 24 * 60), print.getPath(), JSONArray.parseArray(print.getPosition(), Double.class), print.getScale(), @@ -1250,13 +1250,13 @@ public class DesignServiceImpl extends ServiceImpl impleme List modelFromLibIds = designs.stream().filter(design -> design.getModelType().equals("Library")).map(Design::getTemplateId).collect(Collectors.toList()); if (!CollectionUtil.isEmpty(modelFromLibIds)){ models.addAll(libraryService.getByIds(modelFromLibIds).stream() - .map(d -> minioUtil.getPresignedUrl(d.getUrl(), 24 * 60)) + .map(d -> minioUtil.getPreSignedUrl(d.getUrl(), 24 * 60)) .collect(Collectors.toList())); } List modelFromSysIds = designs.stream().filter(design -> design.getModelType().equals("System")).map(Design::getTemplateId).collect(Collectors.toList()); if (!CollectionUtil.isEmpty(modelFromSysIds)){ models.addAll(sysFileService.getByIds(modelFromSysIds).stream() - .map(d -> minioUtil.getPresignedUrl(d.getUrl(), 24 * 60)) + .map(d -> minioUtil.getPreSignedUrl(d.getUrl(), 24 * 60)) .collect(Collectors.toList())); } 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 c6c07158..15703886 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -213,7 +213,7 @@ public class GenerateServiceImpl extends ServiceImpl i } } // Generate generate = selectByUniqueId(taskId); - String md5 = MD5Utils.encryptFile(minioUtil.getPresignedUrl(url, 24 * 60), Boolean.FALSE); + String md5 = MD5Utils.encryptFile(minioUtil.getPreSignedUrl(url, 24 * 60), Boolean.FALSE); // 通过MD5值和level1Type,判断不同level1Type下相同的图片是否被like过 List> libraryIdList = generateDetailMapper.getLibraryIdThroughMD5(md5, generate.getLevel1Type()); if (!libraryIdList.isEmpty()) { @@ -543,7 +543,7 @@ public class GenerateServiceImpl extends ServiceImpl i collectionElement.setName(name); collectionElement.setUrl(path); collectionElement.setHasPin((byte) 0); - collectionElement.setMd5(MD5Utils.encryptFile(minioUtil.getPresignedUrl(path, 24 * 60), Boolean.FALSE)); + collectionElement.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(path, 24 * 60), Boolean.FALSE)); collectionElement.setCreateDate(DateUtil.getByTimeZone(generateThroughImageTextDTO.getTimeZone())); collectionElementService.save(collectionElement); @@ -633,7 +633,7 @@ public class GenerateServiceImpl extends ServiceImpl i if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")) { generateResultVO.setStatus("Invalid"); } else { - generateResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + generateResultVO.setUrl(minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); } } else if (Objects.isNull(generateResultVO)) { generateResultVO = new GenerateResultVO(); 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 a6b0b3c8..39af9761 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -8,10 +8,7 @@ import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.*; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.ResultEnum; -import com.ai.da.common.utils.CopyUtil; -import com.ai.da.common.utils.DateUtil; -import com.ai.da.common.utils.FileUtil; -import com.ai.da.common.utils.MinioUtil; +import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; @@ -209,7 +206,7 @@ public class LibraryServiceImpl extends ServiceImpl impl QueryLibraryPageVO libraryPageVO = CopyUtil.copyObject(library, QueryLibraryPageVO.class); libraryPageVO.setDesignType(DesignTypeEnum.LIBRARY.getRealName()); libraryPageVO.setMinIOPath(library.getUrl()); - libraryPageVO.setUrl(minioUtil.getPresignedUrl(library.getUrl(), 24 * 60)); + libraryPageVO.setUrl(minioUtil.getPreSignedUrl(library.getUrl(), 24 * 60)); if (finalMap != null && finalMap.containsKey(library.getId())) { libraryPageVO.setLibraryModelPoint(finalMap.get(library.getId())); } @@ -273,7 +270,7 @@ public class LibraryServiceImpl extends ServiceImpl impl Library library = resolveData(libraryUploadDTO, userInfo, newFilePath); LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class); libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl()); - libraryUpdateVo.setUrl(minioUtil.getPresignedUrl(newFilePath, 24 * 60)); + libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(newFilePath, 24 * 60)); libraryUpdateVo.setCheckMd5(Boolean.TRUE); return libraryUpdateVo; } else if (libraryUploadDTO.getModelType().equals(ModelType.SYSTEM.getValue())) { @@ -284,7 +281,7 @@ public class LibraryServiceImpl extends ServiceImpl impl Library library = resolveData(libraryUploadDTO, userInfo, newFilePath); LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class); libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl()); - libraryUpdateVo.setUrl(minioUtil.getPresignedUrl(newFilePath, 24 * 60)); + libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(newFilePath, 24 * 60)); libraryUpdateVo.setCheckMd5(Boolean.TRUE); return libraryUpdateVo; } else { @@ -299,7 +296,7 @@ public class LibraryServiceImpl extends ServiceImpl impl Library library = resolveData(libraryUploadDTO, userInfo, filePath); LibraryUpdateVo libraryUpdateVo = CopyUtil.copyObject(library, LibraryUpdateVo.class); libraryUpdateVo.setMinIOPath(libraryUpdateVo.getUrl()); - libraryUpdateVo.setUrl(minioUtil.getPresignedUrl(libraryUpdateVo.getUrl(), 24 * 60)); + libraryUpdateVo.setUrl(minioUtil.getPreSignedUrl(libraryUpdateVo.getUrl(), 24 * 60)); libraryUpdateVo.setCheckMd5(Boolean.TRUE); return libraryUpdateVo; } diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 8e29615c..fa5ddf71 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -3,7 +3,6 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.response.PageBaseResponse; -import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.RedisUtil; @@ -34,7 +33,6 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; @Service public class PortfolioServiceImpl extends ServiceImpl implements PortfolioService { @@ -395,7 +393,7 @@ public class PortfolioServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); qw.lambda().eq(TDesignPythonOutfit::getCollectionId, portfolio.getCollectionId()); List designPythonOutfitList = designPythonOutfitMapper.selectList(qw); for (TDesignPythonOutfit tDesignPythonOutfit : designPythonOutfitList) { - tDesignPythonOutfit.setDesignUrl(minioUtil.getPresignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); + tDesignPythonOutfit.setDesignUrl(minioUtil.getPreSignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); } vo.setDesignPythonOutfitList(designPythonOutfitList); } Canvas canvas = canvasMapper.selectById(vo.getCanvasId()); - vo.setCanvasUrl(minioUtil.getPresignedUrl(canvas.getUrl(), 24 * 60)); + vo.setCanvasUrl(minioUtil.getPreSignedUrl(canvas.getUrl(), 24 * 60)); vo.setLikeNum(redisUtil.getLikeCount(vo.getId())); boolean postLikedByUser = redisUtil.isPostLikedByUser(portfolioDTO.getId(), userHolder.getId()); if (postLikedByUser) { diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java index 875ed0a5..8604dccf 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java @@ -33,7 +33,7 @@ import static com.ai.da.common.enums.LayersPriorityEnum.BODY; public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl implements ITDesignPythonOutfitDetailService { @Resource - private MinioUtil minIoUtil; + private MinioUtil minioUtil; @Override public IPage selectTDesignPythonOutfitDetailPage(IPage page, TDesignPythonOutfitDetailVO tDesignPythonOutfitDetail) { @@ -57,9 +57,9 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl) JSON.parse(detail.getPosition())); designPythonOutfitVO.setImageSize(StringUtil.isNullOrEmpty(detail.getImageSize()) ? null : (List) JSON.parse(detail.getImageSize())); - designPythonOutfitVO.setImageUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : minIoUtil.getPresignedUrl(detail.getImageUrl(), 24 * 60)); + designPythonOutfitVO.setImageUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : minioUtil.getPreSignedUrl(detail.getImageUrl(), 24 * 60)); designPythonOutfitVO.setImageMinioUrl(StringUtil.isNullOrEmpty(detail.getImageUrl()) ? null : detail.getImageUrl()); - designPythonOutfitVO.setMaskUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : minIoUtil.getPresignedUrl(detail.getMaskUrl(), 24 * 60)); + designPythonOutfitVO.setMaskUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : minioUtil.getPreSignedUrl(detail.getMaskUrl(), 24 * 60)); designPythonOutfitVO.setMaskMinioUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : detail.getMaskUrl()); // designPythonOutfitVO.setScale(Float.parseFloat(detail.getScale())); designPythonOutfitVO.setScale(modifyScale(detail.getScale())); diff --git a/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java b/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java index c65c5fa5..9ea82c21 100644 --- a/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java @@ -62,8 +62,8 @@ public class TaskListServiceImpl extends ServiceImpl i taskDTOS.add(new TaskDTO<>()); } else { SuperResolutionDTO inputParam = taskDTO.getInputParam(); - inputParam.setImages(minioUtil.getPresignedUrl(inputParam.getImages(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); - taskDTO.setOutputImage(StringUtil.isNullOrEmpty(taskDTO.getOutputImage()) ? null : minioUtil.getPresignedUrl(taskDTO.getOutputImage(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + inputParam.setImages(minioUtil.getPreSignedUrl(inputParam.getImages(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + taskDTO.setOutputImage(StringUtil.isNullOrEmpty(taskDTO.getOutputImage()) ? null : minioUtil.getPreSignedUrl(taskDTO.getOutputImage(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); taskDTOS.add(taskDTO); } }); @@ -105,8 +105,8 @@ public class TaskListServiceImpl extends ServiceImpl i // 成功失败的都返回 TaskVO task = new TaskVO(); task.setImageName(s.getInputUrl().substring(s.getInputUrl().lastIndexOf("/") + 1)); - task.setInputImage(minioUtil.getPresignedUrl(s.getInputUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); - task.setOutputImage(StringUtil.isNullOrEmpty(s.getOutputUrl()) ? null : minioUtil.getPresignedUrl(s.getOutputUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + task.setInputImage(minioUtil.getPreSignedUrl(s.getInputUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + task.setOutputImage(StringUtil.isNullOrEmpty(s.getOutputUrl()) ? null : minioUtil.getPreSignedUrl(s.getOutputUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); task.setStatus(s.getStatus()); task.setTaskId(s.getTaskId()); task.setCreateDate(s.getCreateTime().format(dateTimeFormatter)); diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index b318c7b3..36ca8e6d 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -5,13 +5,9 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.CreditsEventsEnum; -import com.ai.da.common.utils.CopyUtil; -import com.ai.da.common.utils.DateUtil; -import com.ai.da.common.utils.MinioUtil; -import com.ai.da.common.utils.RedisUtil; +import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; -import com.ai.da.model.dto.ExportSaveDTO; import com.ai.da.model.dto.ProductImageLikeDTO; import com.ai.da.model.dto.ToProductImageDTO; import com.ai.da.model.vo.*; @@ -144,7 +140,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); qw.lambda().eq(TDesignPythonOutfit::getDesignItemId, o.getDesignItemId()); List tDesignPythonOutfits = designPythonOutfitMapper.selectList(qw); @@ -313,7 +309,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); qw.lambda().eq(ToProductImageResult::getTaskId, taskId); ToProductImageResult toProductImageResult = toProductImageResultMapper.selectOne(qw); @@ -354,10 +350,10 @@ public class UserLikeGroupServiceImpl extends ServiceImpl toProductImageResults = toProductImageResultMapper.selectList(qw); for (ToProductImageResult toProductImageResult : toProductImageResults) { - toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + toProductImageResult.setUrl(minioUtil.getPreSignedUrl(toProductImageResult.getUrl(), 24 * 60)); } return toProductImageResults; } @@ -505,7 +501,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); qw.lambda().eq(ToProductImageResult::getTaskId, taskId); ToProductImageResult toProductImageResult = toProductImageResultMapper.selectOne(qw); @@ -514,10 +510,10 @@ public class UserLikeGroupServiceImpl extends ServiceImpl Date: Thu, 4 Jul 2024 11:34:51 +0800 Subject: [PATCH 52/79] BUGFIX:aida; --- .../controller/SavedCollectionController.java | 6 + .../ai/da/model/dto/ToProductImageDTO.java | 1 + .../com/ai/da/model/vo/MagicToolResultVO.java | 2 + .../com/ai/da/model/vo/UserLikeGroupVO.java | 5 + .../java/com/ai/da/python/PythonService.java | 3 +- .../da/service/impl/PortfolioServiceImpl.java | 124 ++++++++++++++---- .../impl/UserLikeGroupServiceImpl.java | 6 +- 7 files changed, 117 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index 3942b5aa..b3f51429 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -49,6 +49,8 @@ public class SavedCollectionController { private MinioUtil minioUtil; @Resource private ClassificationService classificationService; + @Resource + private PortfolioService portfolioService; @ApiOperation(value = "History用户分页分组列表") @PostMapping("/queryUserGroup") @@ -122,6 +124,10 @@ public class SavedCollectionController { } userLikeGroupVO.setGroupDetails(details); userLikeGroupVO.setSketchCount(CollectionUtils.isEmpty(details) ? 0 : details.size()); + if (userLikeGroupVO.getOriginal() == 0) { + userLikeGroupVO.setOriginalAccountName(accountService.getById(userLikeGroupVO.getOriginalAccountId()).getUserName()); + userLikeGroupVO.setOriginalPortfolioName(portfolioService.getById(userLikeGroupVO.getOriginalPortfolioId()).getPortfolioName()); + } return userLikeGroupVO; } return null; diff --git a/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java index e51f5fd7..93263027 100644 --- a/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java +++ b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java @@ -12,4 +12,5 @@ public class ToProductImageDTO { private List toProductImageVOList; private String prompt; private BigDecimal imageStrength; + private String direction; } diff --git a/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java b/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java index 2aabb67d..fb313f1a 100644 --- a/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java +++ b/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java @@ -22,4 +22,6 @@ public class MagicToolResultVO { private String category; private String sourceUrl; + + private String resultType; } diff --git a/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java b/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java index 8f35521b..34d207b6 100644 --- a/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java +++ b/src/main/java/com/ai/da/model/vo/UserLikeGroupVO.java @@ -26,6 +26,8 @@ public class UserLikeGroupVO { private Long originalAccountId; + private Long originalPortfolioId; + @ApiModelProperty("更新时间") private Long updateDate; @@ -35,4 +37,7 @@ public class UserLikeGroupVO { @ApiModelProperty("分组对应的详情 一次行带出来") private List groupDetails; + private String originalAccountName; + private String originalPortfolioName; + } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 6e0d1d10..c5c5132e 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3355,7 +3355,7 @@ public class PythonService { throw new BusinessException("toProductImage.interface.exception"); } - public Boolean relight(String url, String taskId, String prompt) { + public Boolean relight(String url, String taskId, String prompt, String direction) { // todo 限流校验 // AccessLimitUtils.validate("design",5); OkHttpClient client = new OkHttpClient().newBuilder() @@ -3370,6 +3370,7 @@ public class PythonService { map.put("tasks_id", taskId); map.put("image_url", url); map.put("prompt", prompt); + map.put("direction", direction); log.info("relightImage请求python 参数:####{}", map); String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); log.info(param); diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 0a320af5..9742ebc1 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -103,17 +103,27 @@ public class PortfolioServiceImpl extends ServiceImpl existSameNameQw = new QueryWrapper<>(); existSameNameQw.lambda().eq(Portfolio::getPortfolioName, portfolioDTO.getPortfolioName()); + existSameNameQw.lambda().eq(Portfolio::getAccountId, authPrincipalVo.getId()); List portfoliosSameName = portfolioMapper.selectList(existSameNameQw); if (!CollectionUtils.isEmpty(portfoliosSameName)) { throw new BusinessException("The title of the published work has been used."); } - AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); if (file != null && file.getOriginalFilename() != null) { String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file); Canvas canvas = new Canvas(); @@ -128,11 +138,17 @@ public class PortfolioServiceImpl extends ServiceImpl designQueryWrapper = new QueryWrapper<>(); + designQueryWrapper.lambda().eq(Design::getCollectionId, collectionIdOld); + Design designOld = designMapper.selectOne(designQueryWrapper); Collection collectionOld = collectionMapper.selectById(collectionIdOld); List collectionElementListOld = collectionElementService.getByCollectionId(collectionIdOld); collectionOld.setId(null); collectionMapper.insert(collectionOld); Long collectionIdNew = collectionOld.getId(); + designOld.setCollectionId(collectionIdNew); + designOld.setId(null); + designMapper.insert(designOld); userLikeGroupNew.setCollectionId(collectionIdNew); userLikeGroupMapper.insert(userLikeGroupNew); for (CollectionElement element : collectionElementListOld) { @@ -179,17 +195,12 @@ public class PortfolioServiceImpl extends ServiceImpl userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); -// Long coverIdNew = null; -// Boolean flag = false; for (UserLike userLike : userLikeList) { Long designOutfitIdOld = userLike.getDesignOutfitId(); TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(designOutfitIdOld); designPythonOutfit.setDesignId(-1L); designPythonOutfit.setDesignItemId(-1L); designPythonOutfit.setCollectionId(collectionIdNew); -// if (designPythonOutfit.getId().equals(coverIdOld)) { -// flag = true; -// } designPythonOutfit.setId(null); Long designItemIdOld = userLike.getDesignItemId(); DesignItem designItemOld = designItemMapper.selectById(designItemIdOld); @@ -208,21 +219,12 @@ public class PortfolioServiceImpl extends ServiceImpl tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(qw); for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { -// Long designPythonOutfitDetailIdOld = tDesignPythonOutfitDetail.getId(); tDesignPythonOutfitDetail.setId(null); tDesignPythonOutfitDetail.setDesignId(-1L); tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); } -// if (flag) { -// coverIdNew = designOutfitIdNew; -// portfolio.setCoverId(coverIdNew); -// portfolioMapper.updateById(portfolio); -// flag = false; -// } -// designPythonOutfitMapper.updateById(designPythonOutfit); - userLike.setDesignItemId(designItemIdNew); userLike.setId(null); userLike.setDesignId(-1L); @@ -283,15 +285,16 @@ public class PortfolioServiceImpl extends ServiceImpl existSameNameQw = new QueryWrapper<>(); existSameNameQw.lambda().ne(Portfolio::getId, portfolioDTO.getId()); existSameNameQw.lambda().eq(Portfolio::getPortfolioName, portfolioDTO.getPortfolioName()); + existSameNameQw.lambda().eq(Portfolio::getAccountId, authPrincipalVo.getId()); List portfoliosSameName = portfolioMapper.selectList(existSameNameQw); if (!CollectionUtils.isEmpty(portfoliosSameName)) { throw new BusinessException("The title of the published work has been used."); } if (portfolioDTO.getPortfolioType().equals("History")) { - AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); UserLikeGroup userLikeGroup = userLikeGroupMapper.selectById(portfolioDTO.getUserLikeGroupId()); UserLikeGroup userLikeGroupNew = userLikeGroup.setId(null); userLikeGroupNew.setAccountId(-1L); @@ -499,9 +502,9 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementRelationListNew = new ArrayList<>(); for (CollectionElement element : collectionElementListOld) { @@ -638,34 +641,101 @@ public class PortfolioServiceImpl extends ServiceImpl getAnotherOneQw = new QueryWrapper<>(); - getAnotherOneQw.lambda().eq(SysFile::getLevel1Type, "Models") + getAnotherOneQw.lambda().eq(SysFile::getLevel1Type, "Models"); + getAnotherOneQw.lambda().eq(SysFile::getLevel2Type, "Male"); + if (!StringUtils.isEmpty(sysFile.getLevel3Type())) { + getAnotherOneQw.lambda().eq(SysFile::getLevel3Type, sysFile.getLevel3Type()); + QueryWrapper