diff --git a/docker-compose.yml b/docker-compose.yml index 5b64e5f0..e69de29b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +0,0 @@ -version: "3" -services: - aida_back: - container_name: prod-version-aida-back - build: . - volumes: - # 日志目录映射 - - ./log:/log - ports: - - "10010:5567" diff --git a/files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt b/files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt new file mode 100644 index 00000000..b8487446 --- /dev/null +++ b/files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC1XpZ0+EIoJvQk +GHAdpcpr35S+UnxNdOE+1sZsIDWuyzXG0d6vOudITmYFTqVzJRaAArhwp+NQ/R9y +onsuUsEc0x2qTntySYMedHfI2TSl6qTsqpHykSLr6u0E4TuYUiGs/nf3t0A/rEvm +KK6OP4vNgUlANhOKDwiCAdmJkiOBEHJwLsN1xlcnBkUR0Wr+uauVo+A0opkM7HrB +aXXTcy+gpold+uCgCbRzFCiDr0uKsLJgb3Ce1aXTwa8k2dDg6mzhE0U65yhsNzjC +Cqg+g8tfEVha9Nrsmd6hG2iFHnk4rCqRXhjuI1V10GiZUppMWJtGD2tj7ZK0XXKh +5sAclu9RAgMBAAECggEBAKSQy8IclKKsHbA2wFwWV6Ijv2olnAYH/G0xId9wJmWQ +mx3oxb6Hmt3fzPAZ2UOuLkk+rq4Bl9+fnQ494bk5e2G1KWCjT512mFNk6F9EvmGh +k73uUvkeueoIQsG/wHxIYaf/SUlqbBCaPE/9L82AWVDBc36g0n/dfiHAnesWv8JV +agiTF/SIWDPtzRaVh8VObFOusHdqnRuLqV7n0FSVJePSNBFSSOz5XTttOtM4whg8 +kw3jlCHbVMVKtPYcebxGf0vkDapyGJiZ6wc1rD4MXJTciG+WQNfNE+Af2UB606VC +Nlq/CRkXr2Ix9ASSMeE4TcH+0EoxeITpP2NV+3hAzgECgYEA7mWSd6HgPXMdwO33 +efmx0qky+I/4bhicG9Go6021fRY+jUhRcj6VtDWBzuZwblgTSiDH4t2TbfB+hvQD +GVTJNc21+hXEVNu0ajqLuMiCgqaZCeNeJYYYowbLSbYd4t/nQh1vCZ/44aRWqG8G +eWEGruMaqSlGyFG7kyaoQaY1X6ECgYEAwsMGiupkNZ/JU3PZd2X2X+37b8BXcIt7 +itL413GDiLwCNII5pArD7GHYFQzN4GaUCt/VjrRXbTY1xYCk2RA0FyBMsxAGa+eH +9iTSLQvDJpxV/44UY3L9ZFcz4t0WjRcsdqPt30yUBNWiAIGcjtae2tMvtfxKICLQ +sYXAS+ciMbECgYEA4tnerV5pfq/7QSpw0y4Ky5ZcPXDqiwF6E3LH1dlleTlgnpqR +fjAVzp0X/+UCWc4P1PsqmjQU5YnzLMIn7MPkkAFHSEnMQJ+sp2U8rcKHhoG3oVQt +s3FOIlwFuAfHmqtLaXuOvM7wSu9R0weLVpdAf8z2AsCXbWlxH86qT4Y0xeECgYBM +NJkbw8i//qx8vciqYjf7oxeNy1mrTLhjQldhnSXVW5MVTpsVJ60vkb1Fx0PK+PgW +JSzfcIsAzYROqh5WXHO1VMsOCUgp8mcNlayzOXX7ZpJzsvkhTH3/Q+umadGIFTgt +l8jcZY9JMPn5br1+WlW/04BImdW7K0QzId1zFZYYkQKBgQDqswTLEpbBDOE/3uk4 +laZ9kTLJMP/hVmDJ0/jbETMdCkzIORnr3xFxmZIHG17E2In9PVumD0ESCh7qbCDE +isbfLSgfJR6ItdOM6W2R0GAsXQ3e0byBpR7qm0j9J3zYRhQwfVbZtkX0uywB9a/4 +q2bz4491ESrbryx16FZKUJeX8g== +-----END PRIVATE KEY----- diff --git a/files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem b/files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem new file mode 100644 index 00000000..39a68d27 --- /dev/null +++ b/files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtV6WdPhCKCb0JBhwHaXK +a9+UvlJ8TXThPtbGbCA1rss1xtHerzrnSE5mBU6lcyUWgAK4cKfjUP0fcqJ7LlLB +HNMdqk57ckmDHnR3yNk0peqk7KqR8pEi6+rtBOE7mFIhrP5397dAP6xL5iiujj+L +zYFJQDYTig8IggHZiZIjgRBycC7DdcZXJwZFEdFq/rmrlaPgNKKZDOx6wWl103Mv +oKaJXfrgoAm0cxQog69LirCyYG9wntWl08GvJNnQ4Ops4RNFOucobDc4wgqoPoPL +XxFYWvTa7JneoRtohR55OKwqkV4Y7iNVddBomVKaTFibRg9rY+2StF1yoebAHJbv +UQIDAQAB +-----END PUBLIC KEY----- diff --git a/pom.xml b/pom.xml index 4186fc61..70da458b 100644 --- a/pom.xml +++ b/pom.xml @@ -158,6 +158,12 @@ 1.4 + + com.microsoft.sqlserver + mssql-jdbc + 9.2.1.jre8 + + org.springframework.boot @@ -170,6 +176,39 @@ commons-pool2 + + + com.alipay.sdk + alipay-sdk-java + 4.22.57.ALL + + + + + com.paypal.sdk + checkout-sdk + 1.0.5 + + + + com.paypal.sdk + rest-api-sdk + LATEST + + + + org.json + json + 20230618 + + + + org.apache.logging.log4j + log4j-api + 2.17.1 + + + org.apache.poi poi diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java similarity index 59% rename from src/main/java/com/ai/da/common/RabbitMQ/MQConsumer.java rename to src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 77f46dbd..3e8e6a6e 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -1,13 +1,16 @@ package com.ai.da.common.RabbitMQ; import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.utils.RedisUtil; import com.ai.da.model.dto.GenerateThroughImageTextDTO; -import com.ai.da.model.vo.GenerateCollectionVO; +import com.ai.da.model.vo.GenerateResultVO; import com.ai.da.service.GenerateService; import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.jni.Time; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; @@ -17,12 +20,12 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.IOException; import java.util.HashMap; -import java.util.Objects; +import java.util.Map; @Slf4j @Component -public class MQConsumer { +public class GenerateConsumer { @Resource private GenerateService generateService; @@ -30,17 +33,17 @@ public class MQConsumer { @Resource private RedisUtil redisUtil; - @Value("${redis.key.consumptionOrder}") + @Value("${redis.key.orderForGenerate}") private String consumptionOrderKey; - @Value("${redis.key.cancelSet}") + @Value("${redis.key.generateCancelSet}") private String cancelSetKey; - @Value("${redis.key.exceptionMap}") + @Value("${redis.key.generateExceptionMap}") private String exceptionMapKey; - @Value("${redis.key.resultMap}") - private String resultMapKey; + @Value("${redis.key.generateResult}") + private String generateResultKey; public void generate(Message msg, Channel channel, String consumerName) { log.info("============start listening=========="); @@ -63,20 +66,16 @@ public class MQConsumer { // 2.2 将该消息从取消列表中删除 // redisUtil.removeFromSet(cancelSetKey, uniqueId); } else { - /*try { - Thread.sleep(15000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - }*/ - GenerateCollectionVO generateCollectionVO = generateService.generateThroughImageText(generateThroughImageTextDTO); +// GenerateCollectionVO generateCollectionVO = generateService.generateThroughImageText(generateThroughImageTextDTO); + generateService.generateThroughImageText(generateThroughImageTextDTO); // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); - if (!Objects.isNull(generateCollectionVO)) { + /*if (!Objects.isNull(generateCollectionVO)) { HashMap generateResult = new HashMap<>(); generateResult.put(uniqueId, JSONObject.toJSONString(generateCollectionVO)); // 将结果存在redis中 ,为空时不要存 redisUtil.addToMap(resultMapKey, generateResult); - } + }*/ } } catch (BusinessException e) { @@ -87,6 +86,9 @@ public class MQConsumer { channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); + String key = generateResultKey + ":" + uniqueId; + GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Fail"); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } catch (IOException exception) { log.error("手动确认,取消返回队列,不再重新消费"); } @@ -104,6 +106,54 @@ public class MQConsumer { log.info("=============end listening==========="); } + public void processGenerateResult(Message msg, Channel channel) { + log.info("============ProcessGenerateResult listening=========="); + long start = System.currentTimeMillis(); + + Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("generate 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.processGenerateResult(taskId, url, category); + } else { + // 修改redis中的数据状态为exception + String key = generateResultKey + ":" + 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) { @@ -158,4 +208,9 @@ public class MQConsumer { 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/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 7f7428ad..7079f02a 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -1,23 +1,27 @@ package com.ai.da.common.RabbitMQ; -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.BindingBuilder; -import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue; -import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; -import org.springframework.amqp.rabbit.connection.ConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitAdmin; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.beans.factory.annotation.Value; @Configuration public class MQConfig { public static final String GENERATE_EXCHANGE_FANOUT = "generate-exchange"; - public static final String GENERATE_QUEUE = "generate-queue-prod"; + // 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 SR_QUEUE = "SR-queue-local"; + 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-dev"; + +// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; + public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; public MQConfig() { } @@ -31,10 +35,20 @@ public class MQConfig { * 创建队列,使用工作模式,不用定义交换机 */ @Bean - public Queue queueRasa() { + public Queue generateQueue() { return new Queue(GENERATE_QUEUE); } + @Bean + public Queue SRQueue() { + return new Queue(SR_QUEUE); + } + + @Bean + public Queue SRResultQueue() { + return new Queue(SR_RESULT_QUEUE); + } + /** * 将队列绑定到交换机上【队列订阅交换机】 */ diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java b/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java index b0429110..5cffa019 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java @@ -10,7 +10,7 @@ import javax.annotation.Resource; @Component public class MQPublisher { - private final String url = "http://localhost:15672/api/queues/%2f/generate-queue"; +// private final String url = "http://localhost:15672/api/queues/%2f/generate-queue"; @Resource private AmqpTemplate amqpTemplate; @@ -18,7 +18,11 @@ public class MQPublisher { public void sendGenerateMessage(String mm) { log.info("send message:" + mm); amqpTemplate.convertAndSend(MQConfig.GENERATE_QUEUE, mm); + } + public void sendSRMessage(String mm) { + log.info("send message:" + mm); + amqpTemplate.convertAndSend(MQConfig.SR_QUEUE, mm); } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java new file mode 100644 index 00000000..6ad261bd --- /dev/null +++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java @@ -0,0 +1,234 @@ +package com.ai.da.common.RabbitMQ; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.utils.RedisUtil; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.ai.da.model.dto.TaskDTO; +import com.ai.da.service.SuperResolutionService; +import com.ai.da.service.TaskListService; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; + +@Slf4j +@Component +public class SRConsumer { + + @Resource + private RedisUtil redisUtil; + + @Resource + private TaskListService taskListService; + + @Value("${redis.key.orderForSR}") + private String consumptionOrderKey; + + @Value("${redis.key.SRCancelSet}") + private String cancelSetKey; + + @Value("${redis.key.SRExceptionMap}") + private String exceptionMapKey; + + @Value("${redis.key.taskList}") + private String taskListKey; + + @Resource + private SuperResolutionService superResolutionService; + + /** + * 请求超分处理 + */ + public void superResolution(Message msg, Channel channel, String consumerName) { + log.info("============SR start listening=========="); + long start = System.currentTimeMillis(); + + SuperResolutionDTO superResolutionDTO; + String uniqueId = null; + + try { + superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class); + uniqueId = superResolutionDTO.getUniqueId(); + log.info("From " + consumerName + " : " + uniqueId); + superResolutionService.updateSROutput(uniqueId, "Executing", null); + taskListService.updateTaskStatusOrOutputRedis(uniqueId, "Executing", null); + /*try { + Thread.sleep(2 * 60 * 1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + }*/ + // 2、判断当前消息是否在取消列表中 + Boolean isMember = redisUtil.isElementExistsInSet(cancelSetKey, uniqueId); + if (isMember) { + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费"); + } + } else { + // 请求python端进行超分 + superResolutionService.SR(superResolutionDTO); + } + } catch (BusinessException e) { + log.error(e.getMsg()); + superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class); + // channel.basicNack() 为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue + setErrorMessage(msg, channel, e.getMsg(), superResolutionDTO); + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage()); + } + } catch (JSONException e) { + log.error(e.getMessage()); + setErrorMessage(msg, channel, e.getMessage(), null); + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage()); + } + } catch (Exception e) { + log.error(e.getMessage()); + superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class); + setErrorMessage(msg, channel, e.getMessage(), superResolutionDTO); + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage()); + } + } + + long end = System.currentTimeMillis(); + + log.info(" task_id: " + uniqueId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒"); + log.info("=============SR end listening==========="); + } + + /** + * 获取超分结果 + */ + public void getSRResult(Message msg, Channel channel, String consumerName) { + log.info("============SRResult start listening=========="); + long start = System.currentTimeMillis(); + + JSONObject result = null; + String taskId = null; + + try { + result = JSONObject.parseObject(msg.getBody(), JSONObject.class); + log.info("SR response : {}", result); + taskId = result.get("tasks_id").toString(); + } catch (JSONException e) { + log.error("SRResult 返回数据格式不合规范"); + log.error(e.getMessage()); + setErrorMessage(msg, channel, e.getMessage(), null); + try { + // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + } catch (Exception e){ + log.error(e.getMessage()); + setErrorMessage(msg, channel, e.getMessage(), null); + try { + // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + } + + + try { + // 2、判断状态是否成功 + if ("SUCCESS".equals(result.get("status").toString())) { + String output = result.get("data").toString(); + superResolutionService.setSRResult(taskId, output, "success"); + taskListService.updateTaskStatusOrOutputRedis(taskId, "success", output); + } else { + superResolutionService.setSRResult(taskId, null, "fail"); + taskListService.updateTaskStatusOrOutputRedis(taskId, "fail", null); + HashMap exceptionInfo = new HashMap<>(); + // 获取输入信息 + String task = redisUtil.getFromString(taskListKey + taskId + taskId.substring(taskId.lastIndexOf("-") + 1)); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + TaskDTO taskDTO = gson.fromJson(task, type); + // 将输入信息和报错信息均存入redis todo 加判空 + exceptionInfo.put(taskId, "Input ==> " + taskDTO.getInputParam() + "Fail Message ==> " + result.get("message").toString()); + // 将报错信息存入redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + } catch (Exception e) { + log.error(e.getMessage()); + // channel.basicNack() 为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue + try { + // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + } + + long end = System.currentTimeMillis(); + + log.info(" task_id: " + taskId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒"); + log.info("=============SRResult end listening==========="); + } + + private void setErrorMessage(Message msg, Channel channel, String message, SuperResolutionDTO superResolutionDTO) { + String uniqueId; + try { + // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + uniqueId = superResolutionDTO.getUniqueId(); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); + } catch (Exception exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + throw new BusinessException("发生错误,手动确认消息"); + } + // 将入参和错误信息存入redis + String exceptionMessage = JSONObject.toJSONString(superResolutionDTO) + + " Exception message : " + message; +// " Exception message : " + e.getMessage(); + HashMap exceptionInfo = new HashMap<>(); + uniqueId = superResolutionDTO.getUniqueId(); + exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + 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"); + } + +} diff --git a/src/main/java/com/ai/da/common/config/AlipayClientConfig.java b/src/main/java/com/ai/da/common/config/AlipayClientConfig.java new file mode 100644 index 00000000..5b1ec344 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/AlipayClientConfig.java @@ -0,0 +1,43 @@ +package com.ai.da.common.config; + +import com.alipay.api.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; + +import javax.annotation.Resource; + +@Configuration +//加载配置文件 +@PropertySource("classpath:alipay-sandbox.properties") +public class AlipayClientConfig { + + @Resource + private Environment config; + + @Bean + public AlipayClient alipayClient() throws AlipayApiException { + + AlipayConfig alipayConfig = new AlipayConfig(); + + //设置网关地址 + alipayConfig.setServerUrl(config.getProperty("alipay.gateway-url")); + //设置应用Id + alipayConfig.setAppId(config.getProperty("alipay.app-id")); + //设置应用私钥 + alipayConfig.setPrivateKey(config.getProperty("alipay.merchant-private-key")); + //设置请求格式,固定值json + alipayConfig.setFormat(AlipayConstants.FORMAT_JSON); + //设置字符集 + alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8); + //设置支付宝公钥 + alipayConfig.setAlipayPublicKey(config.getProperty("alipay.alipay-public-key")); + //设置签名类型 + alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2); + //构造client + AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig); + + return alipayClient; + } +} diff --git a/src/main/java/com/ai/da/common/config/CRMReportInterface.java b/src/main/java/com/ai/da/common/config/CRMReportInterface.java new file mode 100644 index 00000000..3714d11d --- /dev/null +++ b/src/main/java/com/ai/da/common/config/CRMReportInterface.java @@ -0,0 +1,393 @@ +package com.ai.da.common.config; + +import com.ai.da.mapper.primary.entity.CustomerData; +import com.ai.da.mapper.primary.entity.TransactionData; + +import java.io.FileWriter; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class CRMReportInterface { + + // JDBC 驱动器名称以及数据库 URL + static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + static final String DB_URL = "jdbc:sqlserver://118.142.0.178:1550;databaseName=Hayman_prod"; + + // 数据库凭据 + static final String USER = "user01"; + static final String PASS = "haySIS-2302"; + + public static void main(String[] args) { + Connection conn = null; + Statement stmt = null; + try { + // 注册 JDBC 驱动器 + Class.forName(JDBC_DRIVER); + + // 打开一个连接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 执行查询步骤1: 生成 RW0095 报告以获取客户完整数据 + System.out.println("执行步骤1:生成 RW0095 报告..."); + // 执行相应的查询并获取数据 +// List customerData = retrieveCustomerData(); + // 执行查询步骤2: 使用 MZG013 报告检查客户的销售历史 + System.out.println("执行步骤2:使用 MZG013 报告检查客户的销售历史..."); + // 执行相应的查询并获取数据 + List transactionData = retrieveTransactionData(); + List collect = transactionData.stream().map(TransactionData::getUserMember).collect(Collectors.toList()); + List customerData = retrieveCustomerData(collect); + for (TransactionData transactionDatum : transactionData) { + for (CustomerData customerDatum : customerData) { + if (customerDatum.getMbrCode().equals(transactionDatum.getUserMember())) { + customerDatum.setLastMonth(transactionDatum.getSumAmt()); + break; + } + } + } + // 执行步骤3: 合并(vlookup)RW0095中的客户购买金额 + System.out.println("执行步骤3:合并客户购买金额..."); + // 执行相应的操作,如vlookup + + // 执行步骤4: 按“发行店”筛选以分离不同文件并逐个发送给店铺 + System.out.println("执行步骤4:按发行店筛选并发送文件给店铺..."); + // 执行相应的操作,如过滤和导出 + String filePath = "C:\\Users\\10233\\Desktop\\CRM.csv"; + exportToCSV(customerData, filePath); + // 关闭连接 + conn.close(); + } catch (SQLException se) { + // 处理 JDBC 错误 + se.printStackTrace(); + } catch (Exception e) { + // 处理 Class.forName 错误 + e.printStackTrace(); + } finally { + // 关闭资源 + try { + if (stmt != null) stmt.close(); + } catch (SQLException se2) { + } // 什么都不做 + try { + if (conn != null) conn.close(); + } catch (SQLException se) { + se.printStackTrace(); + } + } + System.out.println("接口执行完成!"); + } + + private static void exportToCSV(List customerDataList, String filePath) throws IOException { + FileWriter writer = new FileWriter(filePath); + +// // 写入 CSV 文件的第一行,即字段名 +// writer.append("User Member,Mbr Name,Sh Code,Sum Amt\n"); +// +// // 遍历数据列表,并将每一行数据写入 CSV 文件 +// for (TransactionData transaction : transactionDataList) { +// writer.append(transaction.getUserMember()).append(","); +// writer.append(transaction.getMbrName()).append(","); +// writer.append(transaction.getShCode()).append(","); +// writer.append(String.valueOf(transaction.getSumAmt())).append("\n"); +// } + writer.append("mbrCode,mbrName,mbrMobile,mbrGroup,mbrStatus,joinDate,mbrIssue,birthMonth,mbrSex,offBonus,effBonus,sumBonus,lastMonth\n"); + + // 遍历 customerDataList,并将数据写入 CSV 文件 + for (CustomerData customer : customerDataList) { + writer.append(customer.getMbrCode()).append(","); + writer.append(customer.getMbrName()).append(","); + writer.append(customer.getMbrMobile()).append(","); + writer.append(customer.getMbrGroup()).append(","); + writer.append(customer.getMbrStatus()).append(","); + writer.append(customer.getJoinDate().toString()).append(","); // 日期需要根据实际情况格式化 + writer.append(customer.getMbrIssue()).append(","); + writer.append(Integer.toString(customer.getBirthMonth())).append(","); + writer.append(customer.getMbrSex()).append(","); + writer.append(Double.toString(customer.getOffBonus())).append(","); + writer.append(Double.toString(customer.getEffBonus())).append(","); + writer.append(Double.toString(customer.getSumBonus())).append(","); + writer.append(Double.toString(customer.getLastMonth())).append("\n"); + } + + writer.close(); + } + + public static List retrieveCustomerData(List collect) { + List customerDataList = new ArrayList<>(); + Connection conn = null; + Statement stmt = null; + try { + // 注册 JDBC 驱动器 + Class.forName(JDBC_DRIVER); + + // 打开一个连接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 执行查询 + System.out.println("创建声明..."); + stmt = conn.createStatement(); + String sql; + // 构建 IN 子句的字符串,用于添加到 SQL 查询中 + StringBuilder inClause = new StringBuilder("("); + for (String code : collect) { + inClause.append("'").append(code).append("',"); + } + inClause.deleteCharAt(inClause.length() - 1); // 删除最后一个逗号 + inClause.append(")"); + + // 构建完整的 SQL 查询语句 + sql = "SELECT * FROM V_RW0095B WHERE mbr_code IN " + inClause.toString(); + ResultSet rs = stmt.executeQuery(sql); + + + // 处理结果集 + while (rs.next()) { + // 将每行数据转换为 CustomerData 对象并添加到列表中 + CustomerData customer = new CustomerData(); + customer.setMbrCode(rs.getString("mbr_code")); + customer.setMbrName(rs.getString("mbr_name")); + customer.setMbrMobile(rs.getString("mbr_mobile")); + customer.setMbrGroup(rs.getString("mbr_group")); + customer.setMbrStatus(rs.getString("mbr_status")); + customer.setJoinDate(rs.getDate("join_date")); + customer.setMbrIssue(rs.getString("mbr_issue")); + customer.setBirthMonth(rs.getInt("birth_m")); + customer.setMbrSex(rs.getString("mbr_sex")); + customer.setOffBonus(rs.getDouble("off_bonus")); + customer.setEffBonus(rs.getDouble("eff_bonus")); + customer.setSumBonus(rs.getDouble("sum_bonus")); + customerDataList.add(customer); + + } + + // 清理环境 + rs.close(); + stmt.close(); + conn.close(); + } catch (SQLException se) { + // 处理 JDBC 错误 + se.printStackTrace(); + } catch (Exception e) { + // 处理 Class.forName 错误 + e.printStackTrace(); + } finally { + // 关闭资源 + try { + if (stmt != null) stmt.close(); + } catch (SQLException se2) { + } // 什么都不做 + try { + if (conn != null) conn.close(); + } catch (SQLException se) { + se.printStackTrace(); + } + } + System.out.println("查询执行完成!"); + return customerDataList; + } + + public static List retrieveTransactionData() { + List transactionDataList = new ArrayList<>(); + Connection conn = null; + Statement stmt = null; + try { + // 注册 JDBC 驱动器 + Class.forName(JDBC_DRIVER); + + // 打开一个连接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 执行查询 + System.out.println("创建声明..."); + stmt = conn.createStatement(); + String sql; + sql = "SELECT user_member,mbr_name,sum(trx_bas_amt) sumAmtByMebBySh FROM V_MZG013\n" + + "WHERE trx_date >= DATEADD(day, -7, GETDATE())\n" + + "and user_member is not NULL\n" + + "GROUP BY user_member,mbr_name"; + ResultSet rs = stmt.executeQuery(sql); + + // 处理结果集 + while (rs.next()) { + // 将每行数据转换为 TransactionData 对象并添加到列表中 + TransactionData transaction = new TransactionData(); + transaction.setUserMember(rs.getString("user_member")); + transaction.setMbrName(rs.getString("mbr_name")); +// transaction.setShCode(rs.getString("sh_code")); + transaction.setSumAmt(rs.getDouble("sumAmtByMebBySh")); +// transaction.setTrxNo(rs.getString("trx_no")); +// transaction.setTrxDate(rs.getTimestamp("trx_date")); +// transaction.setTrxType(rs.getString("trx_type")); +// transaction.setTrxStatus(rs.getString("trx_status")); +// transaction.setTrxTotQty(rs.getDouble("trx_tot_qty")); +// transaction.setCurrCode(rs.getString("curr_code")); +// transaction.setExchRate(rs.getDouble("exch_rate")); +// transaction.setDiscountPerc(rs.getDouble("discount_perc")); +// transaction.setTrxAccAmt(rs.getDouble("trx_acc_amt")); +// transaction.setTrxBasAmt(rs.getDouble("trx_bas_amt")); +// transaction.setOutstandAmt(rs.getDouble("outstand_amt")); +// transaction.setReceiveAmt(rs.getDouble("receive_amt")); +// transaction.setChangeAmt(rs.getDouble("change_amt")); +// transaction.setTrxTotBonus(rs.getDouble("trx_tot_bonus")); +// transaction.setDepositNo(rs.getString("deposit_no")); +// transaction.setDepositAmt(rs.getDouble("deposit_amt")); +// transaction.setDepositStatus(rs.getString("deposit_status")); +// transaction.setTrxAmtDesc(rs.getString("trx_amt_desc")); +// transaction.setRemark(rs.getString("remark")); +// transaction.setShCode(rs.getString("sh_code")); +// transaction.setWhCodeFrom(rs.getString("wh_code_from")); +// transaction.setWhCodeTo(rs.getString("wh_code_to")); +// transaction.setIssuedBy(rs.getString("issued_by")); +// transaction.setClientCode(rs.getString("client_code")); +// transaction.setClientName(rs.getString("client_name")); +// transaction.setSalesmanCode(rs.getString("salesman_code")); +// transaction.setCtypeCode(rs.getString("ctype_code")); +// transaction.setUpdatedOn(rs.getTimestamp("updated_on")); +// transaction.setDocType(rs.getString("doc_type")); +// transaction.setRefNo(rs.getString("ref_no")); +// transaction.setAdjType(rs.getString("adj_type")); +// transaction.setRefType(rs.getString("ref_type")); +// transaction.setOrderNo(rs.getString("order_no")); +// transaction.setRecoverF(rs.getString("recover_f")); +// transaction.setRecoverT(rs.getString("recover_t")); +// transaction.setRequestBy(rs.getString("request_by")); +// transaction.setError(rs.getString("error")); +// transaction.setAuthorizedDate(rs.getTimestamp("authorized_date")); +// transaction.setAuthorizedBy(rs.getString("authorized_by")); +// transaction.setChangeCurrCode(rs.getString("change_curr_code")); +// transaction.setChgRate(rs.getDouble("chg_rate")); +// transaction.setCashier(rs.getString("cashier")); +// transaction.setCashiNo(rs.getString("cashi_no")); +// transaction.setSalesmanCode2(rs.getString("salesman_code2")); +// transaction.setClassId(rs.getString("class_id")); +// transaction.setDisAmt(rs.getDouble("dis_amt")); +// transaction.setAcStatus(rs.getString("ac_status")); +// transaction.setReprint(rs.getString("reprint")); +// transaction.setAlt1(rs.getString("alt_1")); +// transaction.setAlt2(rs.getString("alt_2")); +// transaction.setAlt3(rs.getString("alt_3")); +// transaction.setAlt4(rs.getString("alt_4")); +// transaction.setAlt5(rs.getString("alt_5")); +// transaction.setAltD1(rs.getDate("alt_d1")); +// transaction.setAltD2(rs.getDate("alt_d2")); +// transaction.setAltD3(rs.getDate("alt_d3")); +// transaction.setAltD4(rs.getDate("alt_d4")); +// transaction.setAltD5(rs.getDate("alt_d5")); +// transaction.setSalesmanCode3(rs.getString("salesman_code3")); +// transaction.setContractNo(rs.getString("contract_no")); +// transaction.setExpireDate(rs.getTimestamp("expire_date")); +// transaction.setDepositNetAmt(rs.getDouble("deposit_netamt")); +// transaction.setClientRestriction(rs.getString("client_restriction")); +// transaction.setRefStatus(rs.getString("ref_status")); +// transaction.setMbrDis(rs.getDouble("mbr_dis")); +// transaction.setPmtDiscount(rs.getDouble("pmt_discount")); +// transaction.setPmtAmount(rs.getDouble("pmt_amount")); +// transaction.setPmtNo(rs.getString("pmt_no")); +// transaction.setRefCode(rs.getString("ref_code")); +// transaction.setDocApproved(rs.getString("doc_approved")); +// transaction.setRefractionNo(rs.getString("refraction_no")); +// transaction.setCcpTot(rs.getDouble("ccp_tot")); +// transaction.setCcpRed(rs.getDouble("ccp_red")); +// transaction.setCcpExpired(rs.getDouble("ccp_expired")); +// transaction.setPrintedTimes(rs.getInt("printed_times")); +// transaction.setPickupShop(rs.getString("pickup_shop")); +// transaction.setDeliveryDate(rs.getDate("delivery_date")); +// transaction.setDeliveryTime(rs.getString("delivery_time")); +// transaction.setWsCode(rs.getString("ws_code")); +// transaction.setClCode(rs.getString("cl_code")); +// transaction.setClDesc(rs.getString("cl_desc")); +// transaction.setRatio(rs.getString("ratio")); +// transaction.setUserMember(rs.getString("user_member")); +// transaction.setHflag(rs.getString("hflag")); +// transaction.setIssueShop(rs.getString("issue_shop")); +// transaction.setHoUpdBy(rs.getString("ho_upd_by")); +// transaction.setHoUpdOn(rs.getTimestamp("ho_upd_on")); +// transaction.setBonusExpired(rs.getDouble("bonus_expired")); +// transaction.setBonusRed(rs.getDouble("bonus_red")); +// transaction.setConfirmedOn(rs.getTimestamp("confirmed_on")); +// transaction.setConfirmedBy(rs.getString("confirmed_by")); +// transaction.setDocConfirmed(rs.getString("doc_confirmed")); +// transaction.setBrNo(rs.getString("br_no")); +// transaction.setChangeAmt2(rs.getDouble("change_amt2")); +// transaction.setSalesDate(rs.getDate("sales_date")); +// transaction.setMbrName(rs.getString("mbr_name")); +// transaction.setCanEntryDis(rs.getString("can_entry_dis")); +// transaction.setReactiveClient(rs.getString("reactive_client")); +// transaction.setReactiveMbr(rs.getString("reactive_mbr")); +// transaction.setShUpdBy(rs.getString("sh_upd_by")); +// transaction.setShUpdOn(rs.getTimestamp("sh_upd_on")); +// transaction.setTax1(rs.getDouble("tax1")); +// transaction.setTax2(rs.getDouble("tax2")); +// transaction.setTax3(rs.getDouble("tax3")); +// transaction.setTax4(rs.getDouble("tax4")); +// transaction.setTax5(rs.getDouble("tax5")); +// transaction.setAltChar1(rs.getString("alt_char1")); +// transaction.setAltChar2(rs.getString("alt_char2")); +// transaction.setAltChar3(rs.getString("alt_char3")); +// transaction.setAltChar4(rs.getString("alt_char4")); +// transaction.setAltChar5(rs.getString("alt_char5")); +// transaction.setAltNum1(rs.getDouble("alt_num1")); +// transaction.setAltNum2(rs.getDouble("alt_num2")); +// transaction.setAltNum3(rs.getDouble("alt_num3")); +// transaction.setAltNum4(rs.getDouble("alt_num4")); +// transaction.setAltNum5(rs.getDouble("alt_num5")); +// transaction.setNewClient(rs.getString("new_client")); +// transaction.setNewMbr(rs.getString("new_mbr")); +// transaction.setPmtExtraDiscount(rs.getDouble("pmt_extra_discount")); +// transaction.setPmtExtraAmount(rs.getDouble("pmt_extra_amount")); +// transaction.setManualDiscount(rs.getDouble("manual_discount")); +// transaction.setManualAmount(rs.getDouble("manual_amount")); +// transaction.setUsermbrDiscount(rs.getDouble("usermbr_discount")); +// transaction.setClientDiscount(rs.getDouble("client_discount")); +// transaction.setHoldVoid(rs.getString("hold_void")); +// transaction.setPayBasAmt(rs.getDouble("pay_bas_amt")); +// transaction.setPayDesc(rs.getString("pay_desc")); +// transaction.setPayCode(rs.getString("pay_code")); +// transaction.setCardNo(rs.getString("card_no")); +// transaction.setPayCurr(rs.getString("pay_curr")); +// transaction.setPayCurrAmt(rs.getDouble("pay_curr_amt")); +// transaction.setOnbehalfPaid(rs.getString("onbehalf_paid")); +// transaction.setOnbehalfLoc(rs.getString("onbehalf_loc")); +// transaction.setOldCardNo(rs.getString("old_card_no")); +// transaction.setTrxYear(rs.getInt("TRX_YEAR")); +// transaction.setTrxMonth(rs.getInt("TRX_MONTH")); + + transactionDataList.add(transaction); + } + + + // 清理环境 + rs.close(); + stmt.close(); + conn.close(); + } catch (SQLException | ClassNotFoundException e) { + // 处理异常 + e.printStackTrace(); + } + System.out.println("查询执行完成!"); + return transactionDataList; + } + + // 示例:导出数据到CSV文件 + private static void exportToCSV(ResultSet resultSet, String filePath) throws SQLException, IOException { + FileWriter writer = new FileWriter(filePath); + + while (resultSet.next()) { + // 将结果写入CSV文件 + // 这里需要根据实际情况将数据写入CSV文件 + } + + writer.close(); + } +} + 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 79889833..6e443ba9 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -1,10 +1,10 @@ package com.ai.da.common.config; import com.ai.da.common.utils.SendEmailUtil; -import com.ai.da.mapper.AccountMapper; -import com.ai.da.mapper.TrialOrderMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TrialOrder; +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.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -32,11 +32,6 @@ public class MyTaskScheduler { @Resource private TrialOrderMapper trialOrderMapper; -// @PostConstruct -// public void executeWeeklyHeavyStockReport() { -// sendTrialOrderExcelToManagements(); -// } - // 定时任务,每十五天执行一次 // @Scheduled(cron = "0 0 0 ? * MON") @Scheduled(cron = "0 0 0 */15 * ?") @@ -132,6 +127,11 @@ public class MyTaskScheduler { } catch (IOException e) { e.printStackTrace(); } + }else { + SendEmailUtil.sendNoExcelEmail("1023316923@qq.com", null); + SendEmailUtil.sendNoExcelEmail("calvinwong@aidlab.hk", null); + SendEmailUtil.sendNoExcelEmail("kaicpang.pang@connect.polyu.hk", null); + SendEmailUtil.sendNoExcelEmail("kimwong@code-create.com.hk", null); } } } diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java b/src/main/java/com/ai/da/common/config/MybatisPlusConfig.java similarity index 56% rename from src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java rename to src/main/java/com/ai/da/common/config/MybatisPlusConfig.java index a0bdb29a..b49f7a65 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java +++ b/src/main/java/com/ai/da/common/config/MybatisPlusConfig.java @@ -1,20 +1,26 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@MapperScan("com.ai.da.mapper") -public class MybatisPlusConfig { - - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); - return interceptor; - } -} +package com.ai.da.common.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MybatisPlusConfig { + + @Bean(name = "primaryMybatisPlusInterceptor") + public MybatisPlusInterceptor primaryMybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + + @Bean(name = "secondaryMybatisPlusInterceptor") + public MybatisPlusInterceptor secondaryMybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} diff --git a/src/main/java/com/ai/da/common/config/PayPalClient.java b/src/main/java/com/ai/da/common/config/PayPalClient.java new file mode 100644 index 00000000..bcdef0a3 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/PayPalClient.java @@ -0,0 +1,51 @@ +package com.ai.da.common.config; + +import com.paypal.core.PayPalEnvironment; +import com.paypal.core.PayPalHttpClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +import java.util.Iterator; + +@Configuration +@Slf4j +@PropertySource("classpath:paypal-sandbox.properties") +public class PayPalClient { + + public PayPalHttpClient client(String mode, String clientId, String clientSecret) { + log.info("mode={}, clientId={}, clientSecret={}", mode, clientId, clientSecret); + PayPalEnvironment environment = mode.equals("live") ? new PayPalEnvironment.Live(clientId, clientSecret) : new PayPalEnvironment.Sandbox(clientId, clientSecret); + return new PayPalHttpClient(environment); + } + + /** + * @param jo + * @param pre + * @return + */ + /*public String prettyPrint(JSONObject jo, String pre) { + Iterator keys = jo.keys(); + StringBuilder pretty = new StringBuilder(); + while (keys.hasNext()) { + String key = (String) keys.next(); + pretty.append(String.format("%s%s: ", pre, StringUtils.capitalize(key))); + if (jo.get(key) instanceof JSONObject) { + pretty.append(prettyPrint(jo.getJSONObject(key), pre + "\t")); + } else if (jo.get(key) instanceof JSONArray) { + int sno = 1; + for (Object jsonObject : jo.getJSONArray(key)) { + pretty.append(String.format("\n%s\t%d:\n", pre, sno++)); + pretty.append(prettyPrint((JSONObject) jsonObject, pre + "\t\t")); + } + } else { + pretty.append(String.format("%s\n", jo.getString(key))); + } + } + return pretty.toString(); + }*/ +} + diff --git a/src/main/java/com/ai/da/common/config/PrimaryDataSourceConfig.java b/src/main/java/com/ai/da/common/config/PrimaryDataSourceConfig.java new file mode 100644 index 00000000..44a4540b --- /dev/null +++ b/src/main/java/com/ai/da/common/config/PrimaryDataSourceConfig.java @@ -0,0 +1,63 @@ +package com.ai.da.common.config; + +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +@MapperScan(basePackages = "com.ai.da.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory") +public class PrimaryDataSourceConfig { + @Autowired + private MybatisPlusProperties mybatisPlusProperties; + + @Primary + @Bean(name = "primaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource dataSource() { + return DataSourceBuilder.create().build(); + } + + @Primary + @Bean(name = "primarySqlSessionFactory") + public SqlSessionFactory sqlSessionFactory( + @Qualifier("primaryDataSource") DataSource dataSource, + ApplicationContext applicationContext, + @Qualifier("primaryMybatisPlusInterceptor") MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception { + MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); + bean.setDataSource(dataSource); + bean.setMapperLocations(applicationContext.getResources("classpath:mapper/primary/*.xml")); + // 设置 MyBatis Plus 全局配置 + GlobalConfig globalConfig = this.mybatisPlusProperties.getGlobalConfig(); + if (globalConfig != null) { + bean.setGlobalConfig(globalConfig); + } + bean.setPlugins(mybatisPlusInterceptor); + return bean.getObject(); + } + + @Primary + @Bean(name = "primarySqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } +} + + + + diff --git a/src/main/java/com/ai/da/common/config/SecondaryDataSourceConfig.java b/src/main/java/com/ai/da/common/config/SecondaryDataSourceConfig.java new file mode 100644 index 00000000..eb6f3db5 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/SecondaryDataSourceConfig.java @@ -0,0 +1,49 @@ +package com.ai.da.common.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +@MapperScan(basePackages = "com.ai.da.mapper.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory") +public class SecondaryDataSourceConfig { + + @Bean(name = "secondaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource dataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean(name = "secondarySqlSessionFactory") + public SqlSessionFactory sqlSessionFactory( + @Qualifier("secondaryDataSource") DataSource dataSource, + ApplicationContext applicationContext, + @Qualifier("secondaryMybatisPlusInterceptor") MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception { + MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); +// SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(dataSource); + bean.setMapperLocations(applicationContext.getResources("classpath:mapper/secondary/*.xml")); + bean.setPlugins(mybatisPlusInterceptor); + return bean.getObject(); + } + + @Bean(name = "secondarySqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } +} + + + diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java index f39599e3..aed7e897 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java @@ -1,12 +1,12 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; - -public interface CommonMapper extends BaseMapper { - - IPage voPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); -} +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; + +public interface CommonMapper extends BaseMapper { + + IPage voPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java index 795bd998..fc647498 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java @@ -1,48 +1,48 @@ -package com.ai.da.common.config.mybatis.plus; - -import cn.hutool.core.collection.CollUtil; -import com.ai.da.common.response.PageResponse; -import com.ai.da.common.response.Response; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - - -public class CommonServiceImpl, T, E> extends ServiceImpl { - - public PageResponse voPage(QueryCriteria criteria) { - IPage tPage = baseMapper.voPage(new Page<>(criteria.getPage(), criteria.getLimit()), criteria.buildWrapper()); - if (criteria.getMapper() != null && tPage != null && CollUtil.isNotEmpty(tPage.getRecords())) { - List convert = convert(tPage, criteria.getMapper(), criteria); - Response> response = Response.success(convert); - PageResponse pageResponse = new PageResponse<>(response, tPage.getCurrent(), tPage.getSize(), tPage.getTotal(), tPage.getPages()); - if (criteria.getPeekAllAfter() != null) { - Consumer> peekAllAfter = criteria.getPeekAllAfter(); - peekAllAfter.accept(pageResponse.getData()); - } - return pageResponse; - } - PageResponse pageResponse = new PageResponse<>(null, criteria.getPage(), criteria.getLimit(), 0, 0); - if (criteria.getPeekAllAfter() != null) { - Consumer> peekAllAfter = criteria.getPeekAllAfter(); - peekAllAfter.accept(pageResponse.getData()); - } - return pageResponse; - } - - List convert(IPage page, Function mapper, QueryCriteria criteria) { - if (criteria.getPeekBefore() != null && criteria.getPeekAfter() != null) { - return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); - } else if (criteria.getPeekBefore() != null && criteria.getPeekAfter() == null) { - return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).collect(Collectors.toList()); - } else if (criteria.getPeekBefore() == null && criteria.getPeekAfter() != null) { - return page.getRecords().stream().map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); - } - return page.getRecords().stream().map(mapper).collect(Collectors.toList()); - } -} +package com.ai.da.common.config.mybatis.plus; + +import cn.hutool.core.collection.CollUtil; +import com.ai.da.common.response.PageResponse; +import com.ai.da.common.response.Response; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + + +public class CommonServiceImpl, T, E> extends ServiceImpl { + + public PageResponse voPage(QueryCriteria criteria) { + IPage tPage = baseMapper.voPage(new Page<>(criteria.getPage(), criteria.getLimit()), criteria.buildWrapper()); + if (criteria.getMapper() != null && tPage != null && CollUtil.isNotEmpty(tPage.getRecords())) { + List convert = convert(tPage, criteria.getMapper(), criteria); + Response> response = Response.success(convert); + PageResponse pageResponse = new PageResponse<>(response, tPage.getCurrent(), tPage.getSize(), tPage.getTotal(), tPage.getPages()); + if (criteria.getPeekAllAfter() != null) { + Consumer> peekAllAfter = criteria.getPeekAllAfter(); + peekAllAfter.accept(pageResponse.getData()); + } + return pageResponse; + } + PageResponse pageResponse = new PageResponse<>(null, criteria.getPage(), criteria.getLimit(), 0, 0); + if (criteria.getPeekAllAfter() != null) { + Consumer> peekAllAfter = criteria.getPeekAllAfter(); + peekAllAfter.accept(pageResponse.getData()); + } + return pageResponse; + } + + List convert(IPage page, Function mapper, QueryCriteria criteria) { + if (criteria.getPeekBefore() != null && criteria.getPeekAfter() != null) { + return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); + } else if (criteria.getPeekBefore() != null && criteria.getPeekAfter() == null) { + return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).collect(Collectors.toList()); + } else if (criteria.getPeekBefore() == null && criteria.getPeekAfter() != null) { + return page.getRecords().stream().map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); + } + return page.getRecords().stream().map(mapper).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java index cf81a83a..047f2f00 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java @@ -1,19 +1,19 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -@Configuration -public class CustomerSqlInjector extends DefaultSqlInjector { - - @Override - public List getMethodList(Class mapperClass, TableInfo tableInfo) { - List methodList = super.getMethodList(mapperClass, tableInfo); - methodList.add(new SelectVoPage()); - return methodList; - } -} +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class CustomerSqlInjector extends DefaultSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(mapperClass, tableInfo); + methodList.add(new SelectVoPage()); + return methodList; + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java b/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java index 9942af90..13b674fa 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java @@ -1,85 +1,85 @@ -package com.ai.da.common.config.mybatis.plus; - -import cn.hutool.core.util.StrUtil; -import com.ai.da.common.annotation.Condition; -import com.ai.da.common.annotation.Order; -import com.ai.da.common.enums.ConditionType; -import com.ai.da.common.utils.ConvertUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -import java.lang.reflect.Field; -import java.util.Collection; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * @author: dangweijian - * @description: - * @create: 2020-09-14 15:47 - **/ -@Data -@Slf4j -public abstract class QueryCriteria { - - private long page = 1; - private long limit = 10; - private Function mapper; - private Consumer> appendWrapper; - private Consumer peekBefore; - private Consumer peekAfter; - private Consumer> peekAllAfter; - - public QueryCriteria(Function mapper) { - this.mapper = mapper; - } - - public QueryWrapper buildWrapper() { - QueryWrapper wrapper = new QueryWrapper<>(); - Field[] fields = this.getClass().getDeclaredFields(); - for (Field field : fields) { - Condition condition = field.getAnnotation(Condition.class); - if (condition != null) { - field.setAccessible(true); - Object value = null; - try { - value = field.get(this); - } catch (IllegalAccessException e) { - log.warn("reflection anomaly!"); - } - if (!StrUtil.isEmptyIfStr(value)) { - switch (condition.type()) { - case EQ: - wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value); - break; - case LIKE: - wrapper.like(ConvertUtil.humpToLine2(field.getName()), value); - case BETWEEN: - if (value instanceof Collection && ((List) value).size() >= 2) { - wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List) value).get(0), ((List) value).get(1)); - } - default: - } - } else if (condition.isNull()) { - wrapper.isNull(ConvertUtil.humpToLine2(field.getName())); - } - } - Order order = field.getAnnotation(Order.class); - if (order != null) { - if (!StrUtil.isEmptyIfStr(order.order())) { - switch (order.order()) { - case DESC: - wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName())); - break; - case ASC: - wrapper.orderByAsc(ConvertUtil.humpToLine2(field.getName())); - } - } - } - } - wrapper.func(this.getAppendWrapper() != null, this.getAppendWrapper()); - return wrapper; - } -} +package com.ai.da.common.config.mybatis.plus; + +import cn.hutool.core.util.StrUtil; +import com.ai.da.common.annotation.Condition; +import com.ai.da.common.annotation.Order; +import com.ai.da.common.enums.ConditionType; +import com.ai.da.common.utils.ConvertUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * @author: dangweijian + * @description: + * @create: 2020-09-14 15:47 + **/ +@Data +@Slf4j +public abstract class QueryCriteria { + + private long page = 1; + private long limit = 10; + private Function mapper; + private Consumer> appendWrapper; + private Consumer peekBefore; + private Consumer peekAfter; + private Consumer> peekAllAfter; + + public QueryCriteria(Function mapper) { + this.mapper = mapper; + } + + public QueryWrapper buildWrapper() { + QueryWrapper wrapper = new QueryWrapper<>(); + Field[] fields = this.getClass().getDeclaredFields(); + for (Field field : fields) { + Condition condition = field.getAnnotation(Condition.class); + if (condition != null) { + field.setAccessible(true); + Object value = null; + try { + value = field.get(this); + } catch (IllegalAccessException e) { + log.warn("reflection anomaly!"); + } + if (!StrUtil.isEmptyIfStr(value)) { + switch (condition.type()) { + case EQ: + wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value); + break; + case LIKE: + wrapper.like(ConvertUtil.humpToLine2(field.getName()), value); + case BETWEEN: + if (value instanceof Collection && ((List) value).size() >= 2) { + wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List) value).get(0), ((List) value).get(1)); + } + default: + } + } else if (condition.isNull()) { + wrapper.isNull(ConvertUtil.humpToLine2(field.getName())); + } + } + Order order = field.getAnnotation(Order.class); + if (order != null) { + if (!StrUtil.isEmptyIfStr(order.order())) { + switch (order.order()) { + case DESC: + wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName())); + break; + case ASC: + wrapper.orderByAsc(ConvertUtil.humpToLine2(field.getName())); + } + } + } + } + wrapper.func(this.getAppendWrapper() != null, this.getAppendWrapper()); + return wrapper; + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java b/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java index 968b0bc3..57449caa 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java @@ -1,22 +1,22 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.core.enums.SqlMethod; -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.SqlSource; - -public class SelectVoPage extends AbstractMethod { - - private static final String MAPPER_METHOD = "voPage"; - - public SelectVoPage() { - super(MAPPER_METHOD); - } - - public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { - String sql = String.format(SqlMethod.SELECT_PAGE.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment()); - SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); - return this.addSelectMappedStatementForTable(mapperClass, MAPPER_METHOD, sqlSource, tableInfo); - } -} +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +public class SelectVoPage extends AbstractMethod { + + private static final String MAPPER_METHOD = "voPage"; + + public SelectVoPage() { + super(MAPPER_METHOD); + } + + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + String sql = String.format(SqlMethod.SELECT_PAGE.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment()); + SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); + return this.addSelectMappedStatementForTable(mapperClass, MAPPER_METHOD, sqlSource, tableInfo); + } +} diff --git a/src/main/java/com/ai/da/common/constant/CommonConstant.java b/src/main/java/com/ai/da/common/constant/CommonConstant.java new file mode 100644 index 00000000..ac139e98 --- /dev/null +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -0,0 +1,14 @@ +package com.ai.da.common.constant; + +public class CommonConstant { + // 单位 秒 10分钟过期 +// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L; + public static final Long TASK_EXPIRE_TIME = 10 * 60L; + // 单位 秒 两天过期 + public static final Long CREDITS_EXPIRE_TIME = 2 * 24 * 60 * 60L; + // 单位 分钟 + public static final Integer MINIO_IMAGE_EXPIRE_TIME = 24 * 60; + // 单位 秒 一天过期 in redis + public static final Long GENERATE_RESULT_EXPIRE_TIME = 24 * 60 * 60L; + +} diff --git a/src/main/java/com/ai/da/common/constant/PayPalCheckoutConstant.java b/src/main/java/com/ai/da/common/constant/PayPalCheckoutConstant.java new file mode 100644 index 00000000..21b3694b --- /dev/null +++ b/src/main/java/com/ai/da/common/constant/PayPalCheckoutConstant.java @@ -0,0 +1,173 @@ +package com.ai.da.common.constant; + +public class PayPalCheckoutConstant { + + public static final String CAPTURE = "CAPTURE"; + /** + * 该标签将覆盖PayPal网站上PayPal帐户中的公司名称 + */ + public static final String BRANDNAME = "AIDA"; + /** + * LOGIN。当客户单击PayPal Checkout时,客户将被重定向到页面以登录PayPal并批准付款。 + * BILLING。当客户单击PayPal Checkout时,客户将被重定向到一个页面,以输入信用卡或借记卡以及完成购买所需的其他相关账单信息 + * NO_PREFERENCE。当客户单击“ PayPal Checkout”时,将根据其先前的交互方式将其重定向到页面以登录PayPal并批准付款,或重定向至页面以输入信用卡或借记卡以及完成购买所需的其他相关账单信息使用PayPal。 + * 默认值:NO_PREFERENCE + */ + public static final String LANDINGPAGE = "NO_PREFERENCE"; + /** + * CONTINUE。将客户重定向到PayPal付款页面后,将出现“ 继续”按钮。当结帐流程启动时最终金额未知时,请使用此选项,并且您想将客户重定向到商家页面而不处理付款。 + * PAY_NOW。将客户重定向到PayPal付款页面后,出现“ 立即付款”按钮。当启动结帐时知道最终金额并且您要在客户单击“ 立即付款”时立即处理付款时,请使用此选项。 + */ + public static final String USERACTION = "PAY_NOW"; + /** + * GET_FROM_FILE。使用贝宝网站上客户提供的送货地址。 + * NO_SHIPPING。从PayPal网站编辑送货地址。推荐用于数字商品 + * SET_PROVIDED_ADDRESS。使用商家提供的地址。客户无法在PayPal网站上更改此地址 + */ +// public static final String SHIPPINGPREFERENCE = "SET_PROVIDED_ADDRESS"; + public static final String SHIPPINGPREFERENCE = "NO_SHIPPING"; + /** + * 交易异常 + */ + public static final String FAILURE = "failure"; + /** + * 交易成功 + */ + public static final String SUCCESS = "success"; + + /** + * ipn回调。支付成功 + */ + public static final String PAYMENT_STATUS_COMPLETED = "Completed"; + /** + * ipn回调。退款成功 + */ + public static final String PAYMENT_STATUS_REFUNDED = "Refunded"; + /** + * ipn回调。待定 + */ + public static final String PAYMENT_STATUS_PENDING = "Pending"; + + /** + * ipn回调,付款因退款或其他类型的冲销而被冲销。资金已从您的帐户余额中删除,并退还给买方 + */ + public static final String PAYMENT_STATUS_REVERSED = "Reversed"; + + /** + * ipn回调, 撤销已被取消。例如,您赢得了与客户的纠纷,并且撤回的交易资金已退还给您 + */ + public static final String PAYMENT_STATUS_CANCELED_REVERSAL = "Canceled_Reversal"; + + /** + * ipn回调,付款被拒绝 + */ + public static final String PAYMENT_STATUS_DENIED = "Denied"; + + /** + * ipn回调, 此授权已过期,无法捕获 + */ + public static final String PAYMENT_STATUS_EXPIRED = "Expired"; + + /** + * ipn回调, 德国的ELV付款是通过Express Checkout进行的 + */ + public static final String PAYMENT_STATUS_CREATED = "Created"; + + /** + * ipn回调, 付款失败。仅当付款是通过您客户的银行帐户进行的。 + */ + public static final String PAYMENT_STATUS_FAILED = "Failed"; + + /** + * ipn回调,付款已被接受 + */ + public static final String PAYMENT_STATUS_PROCESSED = "Processed"; + + /** + * ipn回调,此授权已失效 + */ + public static final String PAYMENT_STATUS_VOIDED = "Voided"; + + //订单状态 + /** + * 1、支付完成;捕获的付款的资金已记入收款人的PayPal帐户 + * 2、退款完成;该交易的资金已记入客户的帐户 + */ + public static final String STATE_COMPLETED = "COMPLETED"; + /** + * 部分退款;少于所捕获付款金额的金额已部分退还给付款人。 + */ + public static final String STATE_PARTIALLY_REFUNDED = "PARTIALLY_REFUNDED"; + + + /** + * 1、支付待定;捕获的付款资金尚未记入收款人的PayPal帐户。有关更多信息请参见status.details。 + * 2、退款待定;有关更多信息,请参见status_details.reason。 + */ + /** + * 支付待定: + * capture_status_details + * reason 枚举 + * 捕获的付款状态为PENDING或DENIED的原因。可能的值为: + * BUYER_COMPLAINT。付款人与贝宝(PayPal)对此捕获的付款提出了争议。 + * CHARGEBACK。响应于付款人与用于支付此已捕获付款的金融工具的发行人对此已捕获的付款提出异议,已收回的资金被撤回。 + * ECHECK。由尚未结清的电子支票支付的付款人。 + * INTERNATIONAL_WITHDRAWAL。访问您的在线帐户。在您的“帐户概览”中,接受并拒绝此笔付款。 + * OTHER。无法提供其他特定原因。有关此笔付款的更多信息,请在线访问您的帐户或联系PayPal。 + * PENDING_REVIEW。捕获的付款正在等待人工审核。 + *(手动收取)RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION。收款人尚未为其帐户设置适当的接收首选项。有关如何接受或拒绝此付款的更多信息,请在线访问您的帐户。通常在某些情况下提供此原因,例如,当所捕获付款的货币与收款人的主要持有货币不同时。 + * REFUNDED。收回的资金已退还。 + * TRANSACTION_APPROVED_AWAITING_FUNDING。付款人必须将这笔付款的资金汇出。通常,此代码适用于手动EFT。 + * UNILATERAL。收款人没有PayPal帐户。 + * VERIFICATION_REQUIRED。收款人的PayPal帐户未通过验证。 + */ + /** + * 退款待定 + * 退款具有“PENDING”或“FAILED”状态的原因。 可能的值为: + * ECHECK。客户的帐户通过尚未结清的eCheck进行注资。 + */ + public static final String STATE_PENDING = "PENDING"; + /** + * 退款;大于或等于此捕获的付款金额的金额已退还给付款人 + */ + public static final String STATE_REFUNDED = "REFUNDED"; + /** + * 支付拒绝 + */ + public static final String STATE_DENIED = "DENIED"; + /** + * 退款失败 + */ + public static final String STATE_FAILED = "FAILED"; + + /** + * 争议状态 + */ + public static final String BUYER_COMPLAINT = "BUYER_COMPLAINT"; + + /** + * 沙箱环境请求网关地址 + */ + public static final String SANDBOX = "https://api.sandbox.paypal.com"; + /** + * 生产环境请求网关地址 + */ + public static final String LIVE = "https://api.paypal.com"; + /** + * 添加物流信息请求路径 + */ + public static final String ADD_TRACK_URL = "/v1/shipping/trackers-batch"; + + /** + * 修改物流信息请求路径 + */ + public static final String UPDATE_TRACK_URL = "/v1/shipping/trackers/"; + + public final static String CMD_NOTIFY_VALIDATE = "_notify-validate"; + + public final static String PAYPAL_TOKEN_KEY = "PayPalAccessToken"; + + +} + + diff --git a/src/main/java/com/ai/da/common/enums/AliPayTradeStateEnum.java b/src/main/java/com/ai/da/common/enums/AliPayTradeStateEnum.java new file mode 100644 index 00000000..573ec7dd --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/AliPayTradeStateEnum.java @@ -0,0 +1,39 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum AliPayTradeStateEnum { + + /** + * 支付成功 + */ + SUCCESS("TRADE_SUCCESS"), + + /** + * 未支付 + */ + NOTPAY("WAIT_BUYER_PAY"), + + /** + * 已关闭 + */ + CLOSED("TRADE_CLOSED"), + + /** + * 退款成功 + */ + REFUND_SUCCESS("REFUND_SUCCESS"), + + /** + * 退款失败 + */ + REFUND_ERROR("REFUND_ERROR"); + + /** + * 类型 + */ + private final String type; +} diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java new file mode 100644 index 00000000..8a63d880 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -0,0 +1,31 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum CreditsEventsEnum { + + PRICE("price","6"), + + BUY_CREDITS("Buy Credits","600"), + + INIT("init", "500"), + + DAILY_CHECKIN("Daily Check-In", "20"), + + SOCIAL_MEDIA_SHARING("Social Media Sharing","20"), + +// SUPER_RESOLUTION("Super Resolution","300"), + SUPER_RESOLUTION("Super Resolution","5"), + + OTHER("Other","10"); + + private String name; + + /** + * 对应事件需要消耗or获得的积分 + */ + private String value; +} diff --git a/src/main/java/com/ai/da/common/enums/CurrencyCodesEnum.java b/src/main/java/com/ai/da/common/enums/CurrencyCodesEnum.java new file mode 100644 index 00000000..1f0225c8 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CurrencyCodesEnum.java @@ -0,0 +1,40 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +public enum CurrencyCodesEnum { + + AUSTRALIAN_DOLLAR("AUD"), + BRAZILIAN_REAL("BRL"), + CANADIAN_DOLLAR("CAD"), + CHINESE_RENMENBI("CNY"), + CZECH_KORUNA("CZK"), + DANISH_KRONE("DKK"), + EURO("EUR"), + HONG_KONG_DOLLAR("HKD"), + HUNGARIAN_FORINT("HUF"), + ISRAELI_NEW_SHEKEL("ILS"), + JAPANESE_YEN("JPY"), + MALAYSIAN_RINGGIT("MYR"), + MEXICAN_PESO("MXN"), + NEW_TAIWAN_DOLLAR("TWD"), + NEW_ZEALAND_DOLLAR("NZD"), + NORWEGIAN_KRONE("NOK"), + PHILIPPINE_PESO("PHP"), + POLISH_ZLOTY("PLN"), + POUND_STERLING("GBP"), + RUSSIAN_RUBLE("RUB"), + SINGAPORE_DOLLAR("SGD"), + SWEDISH_KRONA("SEK"), + SWISS_FRANC("CHF"), + THAI_BAHT("THB"), + UNITED_STATES_DOLLAR("USD"); + + private String code; + + CurrencyCodesEnum(String code) { + this.code = code; + } +} diff --git a/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java b/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java index d254997d..259d93ce 100644 --- a/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java +++ b/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java @@ -20,15 +20,15 @@ public enum CurrentDesignPictureTypeEnum { /** * USER_LIBRARY */ - USER_LIBRARY(2, "userLibrary"), +// USER_LIBRARY(2, "userLibrary"), /** * SYS_FILE */ - SYS_FILE(3, "sysFile"), + SYS_FILE(2, "sysFile"), /** * noPIN */ - NO_PIN(4, "noPIN"); + NO_PIN(3, "noPIN"); private Integer code; private String desc; diff --git a/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java b/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java index 44409731..f3cc14e9 100644 --- a/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java +++ b/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java @@ -12,26 +12,33 @@ public enum GenerateModeEnum { /** * 通过文本生成 */ - TEXT(1, "text"), + TEXT(1, "text","txt2img"), /** * 通过图片生成 */ - IMAGE(2, "image"), + IMAGE(2, "image", "img2img"), /** * 通过文本和图片生成 */ - TEXT_IMAGE(2, "text-image"); + TEXT_IMAGE(2, "text-image","img2img"); private Integer code; private String value; + private String type; GenerateModeEnum(int code, String value) { this.code = code; this.value = value; } + GenerateModeEnum(Integer code, String value, String type) { + this.code = code; + this.value = value; + this.type = type; + } + public static List getGenerateModeList(){ return Stream.of(TEXT,IMAGE,TEXT_IMAGE).map(GenerateModeEnum::getValue).collect(Collectors.toList()); } diff --git a/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java b/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java new file mode 100644 index 00000000..aac9719d --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java @@ -0,0 +1,54 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum OrderStatusEnum { + /** + * 未支付 + */ + NOT_PAY("未支付"), + + + /** + * 支付成功 + */ + SUCCESS("支付成功"), + + /** + * 已关闭 + */ + TIMEOUT_CLOSED("超时已关闭"), + + /** + * 已取消 + */ + CANCEL("用户已取消"), + + /** + * 退款中 + */ + REFUND_PROCESSING("退款中"), + + /** + * 已退款 + */ + REFUND_SUCCESS("已退款"), + + /** + * 退款异常 + */ + REFUND_ABNORMAL("退款异常"), + + /** + * paypal订单状态为 APPROVED + */ + ORDER_PROCESSING("订单处理中"); + + /** + * 类型 + */ + private final String type; +} diff --git a/src/main/java/com/ai/da/common/enums/PayPalOrderStatusEnum.java b/src/main/java/com/ai/da/common/enums/PayPalOrderStatusEnum.java new file mode 100644 index 00000000..f9735c05 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/PayPalOrderStatusEnum.java @@ -0,0 +1,30 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum PayPalOrderStatusEnum { + + // The order was created with the specified context. + // 订单已创建并具有指定的上下文。 + CREATED("CREATED"), + // The order was saved and persisted. The order status continues to be in progress until a capture is made with final_capture = true for all purchase units within the order. + // 订单已保存并持久化。订单状态仍处于进行中,直到对订单中的所有购买单元进行了 final_capture = true 的捕获为止 + SAVED("SAVED"), + // The customer approved the payment through the PayPal wallet or another form of guest or unbranded payment. For example, a card, bank account, or so on. + // 客户通过PayPal钱包或其他形式的游客或非品牌支付批准了付款。例如,信用卡、银行账户等。 + APPROVED("APPROVED"), + // All purchase units in the order are voided. + // 订单中的所有购买单元都已作废。 + VOIDED("VOIDED"), + // The payment was authorized or the authorized payment was captured for the order. + // 订单的支付已被授权或已捕获授权的支付。 + COMPLETED("COMPLETED"), + // The order requires an action from the payer (e.g. 3DS authentication). Redirect the payer to the "rel":"payer-action" HATEOAS link returned as part of the response prior to authorizing or capturing the order. + // 订单需要支付者执行某项操作(例如3DS身份验证)。在授权或捕获订单之前,请将支付者重定向到响应中返回的"rel":"payer-action" HATEOAS链接。 + PAYER_ACTION_REQUIRED("PAYER_ACTION_REQUIRED"); + + private final String status; +} diff --git a/src/main/java/com/ai/da/common/enums/PayTypeEnum.java b/src/main/java/com/ai/da/common/enums/PayTypeEnum.java new file mode 100644 index 00000000..70067578 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/PayTypeEnum.java @@ -0,0 +1,28 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum PayTypeEnum { + /** + * 微信 + */ + WXPAY("微信"), + + /** + * 支付宝 + */ + ALIPAY("支付宝"), + + /** + * PayPal + */ + PAYPAL("PayPal"); + + /** + * 类型 + */ + private final String type; +} 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 6efefd84..9e404107 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 @@ -7,6 +7,7 @@ import com.ai.da.common.security.jwt.JWTTokenHelper; import com.ai.da.common.utils.LocalCacheUtils; import com.ai.da.common.utils.MultiReadHttpServletRequest; import com.ai.da.common.utils.MultiReadHttpServletResponse; +import com.ai.da.common.utils.RequestInfoUtil; import com.ai.da.model.vo.AuthPrincipalVo; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; @@ -48,8 +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/chatStream", - "/api/python/flush", - "/api/account/healthy" + "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back" ); @Override @@ -92,6 +92,8 @@ public class AuthenticationFilter extends OncePerRequestFilter { log.debug("后台检查令牌:{}", jwtToken); if (StrUtil.isBlank(jwtToken)) { + String ipAddress = RequestInfoUtil.getIpAddress(request); + log.info("本次请求的ip为 : " + ipAddress); throw new RuntimeException("请传入token!"); } if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ diff --git a/src/main/java/com/ai/da/common/task/AliPayTask.java b/src/main/java/com/ai/da/common/task/AliPayTask.java new file mode 100644 index 00000000..fa9a9b3a --- /dev/null +++ b/src/main/java/com/ai/da/common/task/AliPayTask.java @@ -0,0 +1,42 @@ +package com.ai.da.common.task; + +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.common.enums.PayTypeEnum; +import com.ai.da.service.AliPayService; +import com.ai.da.service.OrderInfoService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@Slf4j +@Component +public class AliPayTask { + + @Resource + private OrderInfoService orderInfoService; + + @Resource + private AliPayService aliPayService; + + /** + * 从第0秒开始每隔30秒执行1次,查询创建超过5分钟,并且未支付的订单 + */ +// @Scheduled(cron = "0/30 * * * * ?") + public void orderConfirm(){ + + log.info("Alipay orderConfirm 被执行......"); + + List orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType()); + + for (OrderInfo orderInfo : orderInfoList) { + String orderNo = orderInfo.getOrderNo(); + log.warn("超时订单 ===> {}", orderNo); + + //核实订单状态:调用支付宝查单接口 + aliPayService.checkOrderStatus(orderNo); + } + } +} diff --git a/src/main/java/com/ai/da/common/task/GenerateTask.java b/src/main/java/com/ai/da/common/task/GenerateTask.java new file mode 100644 index 00000000..6d13d68f --- /dev/null +++ b/src/main/java/com/ai/da/common/task/GenerateTask.java @@ -0,0 +1,21 @@ +package com.ai.da.common.task; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class GenerateTask { + + @Scheduled(cron = "0 0 */1 * * ?") + public void generateScheduled(){ + log.info("测试定时器:generate"); + + try{ + + }catch(Exception e){ + + } + } +} diff --git a/src/main/java/com/ai/da/common/task/PaypalTask.java b/src/main/java/com/ai/da/common/task/PaypalTask.java new file mode 100644 index 00000000..bc0e24dd --- /dev/null +++ b/src/main/java/com/ai/da/common/task/PaypalTask.java @@ -0,0 +1,42 @@ +package com.ai.da.common.task; + +import com.ai.da.common.enums.PayTypeEnum; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.service.OrderInfoService; +import com.ai.da.service.PayPalCheckoutService; +import com.paypal.http.exceptions.SerializeException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Slf4j +@Component +public class PaypalTask { + + @Resource + private OrderInfoService orderInfoService; + + @Resource + private PayPalCheckoutService payPalCheckoutService; + + @Scheduled(cron = "0/30 * * * * ?") + public void orderConfirm() throws SerializeException { + + log.info("PayPal orderConfirm 被执行......"); + + List orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.PAYPAL.getType()); + + for (OrderInfo orderInfo : orderInfoList) { + String orderNo = orderInfo.getOrderNo(); + log.warn("超时订单 ===> {}", orderNo); + + //核实订单状态:调用支付宝查单接口 + payPalCheckoutService.checkOrderStatus(orderNo); + + } + } +} diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java new file mode 100644 index 00000000..205c7f94 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java @@ -0,0 +1,329 @@ +package com.ai.da.common.utils; + +import com.ai.da.model.dto.AlipayHKParametersDTO; +import com.ai.da.model.dto.AlipayHKRequestDTO; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.io.pem.PemObject; +import org.bouncycastle.util.io.pem.PemReader; +import org.springframework.beans.factory.annotation.Value; + +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Base64; +import java.util.HashMap; +import java.util.UUID; + +@Slf4j +public class AlipayHKEncryptionUtil { + + @Value("${alipay.hk.merchant-id}") + private static String merchantId; + + @Value("${alipay.hk.segment-id}") + private static String segmentId; + + @Value("${alipay.hk.AESKey}") + private static String aesKey; + + @Value("${alipay.hk.rsaPrivateKey}") + private static String privateKeyPath; + + @Value("${alipay.hk.rsaPublicKey}") + private static String publicKeyPath; + + /** + * 加密 + * @param param + * @param serviceName + * @return + * @throws NoSuchPaddingException + * @throws NoSuchAlgorithmException + * @throws InvalidAlgorithmParameterException + * @throws InvalidKeyException + * @throws IllegalBlockSizeException + * @throws BadPaddingException + * @throws IOException + */ + public static AlipayHKRequestDTO AESCBCWithRSA(HashMap param, String serviceName) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException { + // Pre-shared secret key, DO NOT hardcode this key + String key = aesKey; + // 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"; + // Padding mode + String padding = "pkcs7"; + // signature alogrithm + String signatureAlgorithm = "rsa-sha256"; +// String signatureAlgorithm = "SHA256withRSA"; + // Message body + AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO(); + requestMessage.setService(serviceName); + requestMessage.setMerchant_id(merchantId); + requestMessage.setRequest_time(Long.toString(System.currentTimeMillis() / 1000L)); + 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(); + String content = gson.toJson(requestMessage); + + // Secure random iv 获取随机种子 + SecureRandom secureRandom = new SecureRandom(); + byte[] iv = new byte[16]; //NEVER REUSE THIS IV WITH THE SAME KEY + secureRandom.nextBytes(iv); + + // Algorithms + String alogrithm = "AES/CBC/PKCS5Padding"; + + // 创建 AES 密钥对象 + SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES"); + // 为加密算法提供一个随机的初始化向量,以增强加密安全性 + IvParameterSpec parameterSpec = new IvParameterSpec(iv); + // 创建 Cipher 对象 + Cipher cipher = Cipher.getInstance(alogrithm); + // 初始化为加密模式 Cipher.ENCRYPT_MODE + cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec); + + // Cipher text 对请求内容加密 + byte[] cipherText = cipher.doFinal(content.getBytes()); + + // Concat iv and cipher text for signing + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + outputStream.write(iv); + outputStream.write(cipherText); + byte signMessage[] = outputStream.toByteArray(); + + // Sign key 读取rsa私钥文件,解析并得到私钥对象 privateKey + String rsaPrivateKeyPath = privateKeyPath; + PrivateKey privateKey = null; + byte[] signature; + try { + privateKey = readPrivateKeyFromFile(rsaPrivateKeyPath); + Signature signer = Signature.getInstance("SHA256withRSA"); + signer.initSign(privateKey); + // 将加密内容和随机向量均加签 + signer.update(signMessage); + signature = signer.sign(); + } catch (SignatureException e) { + throw new RuntimeException(e); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + + Base64.Encoder encoder = Base64.getEncoder(); + // Combine result + AlipayHKRequestDTO alipayHKRequestDTO = new AlipayHKRequestDTO(); + alipayHKRequestDTO.setMerchant_id(merchantId); + alipayHKRequestDTO.setNonce(encoder.encodeToString(iv)); + alipayHKRequestDTO.setMessage(encoder.encodeToString(cipherText)); + alipayHKRequestDTO.setTag(encoder.encodeToString(signature)); + String cipherSuite = mode + "-" + padding + "-with-" + signatureAlgorithm; + alipayHKRequestDTO.setCipher_suite(cipherSuite); + + // Encode to json + String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO); + log.info(jsonEncoded); + +// String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO); +// log.info(info); + return alipayHKRequestDTO; + + } + + /** + * 从文件中读取RSA私钥 + * @param filePath + * @return + * @throws Exception + */ + private static PrivateKey readPrivateKeyFromFile(String filePath) throws Exception { + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + StringBuilder keyBuffer = new StringBuilder(); + String line; + + // 读取文本文件中的内容 + while ((line = reader.readLine()) != null) { + keyBuffer.append(line); + } + reader.close(); + + // 去除私钥内容中的头部和尾部信息 + String privateKeyContent = keyBuffer.toString() + .replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----", "") + .replaceAll("\\s+", ""); // 去除空格、换行等字符 + + // 进行 Base64 解码 + byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyContent); + + // 根据 PKCS8 格式的私钥字节数组构造私钥对象 + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); + return keyFactory.generatePrivate(keySpec); + } + + /** + * 使用 AES 密钥和随机向量进行解密 + */ + public static String decryptAES(String encryptedText, String iv) throws Exception { + byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText); + byte[] ivBytes = Base64.getDecoder().decode(iv); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + SecretKeySpec secretKeySpec = new SecretKeySpec(aesKey.getBytes(), "AES"); + IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + public static void test() throws Exception { + // 加密数据 + AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO(); + requestMessage.setService("create_order"); + requestMessage.setMerchant_id(merchantId); + requestMessage.setRequest_time(Long.toString(System.currentTimeMillis() / 1000L)); + 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"); + Gson gson = new Gson(); + String plaintext = gson.toJson(requestMessage); + System.out.println(plaintext); + + // 生成 AES 密钥 + String key = aesKey; + SecretKey aesKey = new SecretKeySpec(key.getBytes(), "AES"); + + // 使用 RSA 公钥加密 AES 密钥 + String rsaPublicKeyPath = publicKeyPath; + PublicKey publicKey = readPublicKey(new File(rsaPublicKeyPath)); + + Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); +// Cipher rsaCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()); + + // 使用 AES-128-CBC 加密数据 + Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + byte[] ivBytes = generateRandomIV(aesCipher.getBlockSize()); + IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + + aesCipher.init(Cipher.ENCRYPT_MODE, aesKey, ivSpec); + byte[] encryptedData = aesCipher.doFinal(plaintext.getBytes()); + + // 数字签名(使用 RSA 私钥) + String rsaPrivateKeyPath = privateKeyPath; + PrivateKey privateKey = readPrivateKeyFromFile(rsaPrivateKeyPath); + Signature signer = Signature.getInstance("SHA256withRSA"); + signer.initSign(privateKey); + signer.update(encryptedData); + byte[] signatureBytes = signer.sign(); + Base64.Encoder encoder = Base64.getEncoder(); + + // 将加密后的数据和签名进行Base64编码 + String base64EncryptedData = Base64.getEncoder().encodeToString(encryptedData); + String base64Signature = Base64.getEncoder().encodeToString(signatureBytes); + + // 输出加密后的数据和签名 + System.out.println("加密后的数据:" + base64EncryptedData); + System.out.println("数字签名:" + base64Signature); + + + HashMap result = new HashMap(); + result.put("merchant_id",merchantId); + result.put("nonce", encoder.encodeToString(ivBytes)); + result.put("message", encoder.encodeToString(encryptedData)); + result.put("tag", encoder.encodeToString(signatureBytes)); + + String mode = "aes-128-cbc"; + // Padding mode + String padding = "pkcs7"; + // signature alogrithm + String signatureAlgorithm = "rsa-sha256"; + String cipherSuite = mode + "-" + padding + "-with-" + signatureAlgorithm; + result.put("cipher_suite", cipherSuite); + + System.out.println("map 格式:" + result); + // Encode to json + String jsonEncoded = JSONObject.toJSONString(result); + System.out.println("json 格式:" + jsonEncoded); + + AlipayHKRequestDTO alipayHKRequestDTO = new AlipayHKRequestDTO(); + alipayHKRequestDTO.setMerchant_id(merchantId); + alipayHKRequestDTO.setNonce(encoder.encodeToString(ivBytes)); + alipayHKRequestDTO.setMessage(encoder.encodeToString(encryptedData)); + alipayHKRequestDTO.setTag(encoder.encodeToString(signatureBytes)); + alipayHKRequestDTO.setCipher_suite(cipherSuite); + +// String info = AlipayHKRequestUtil.createOrder(result); +// log.info(info); + + // 解密和验证 +// byte[] decryptedAesKey = rsaCipher.doFinal(encryptedAesKey); + byte[] decryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()); + SecretKey decryptedAesSecretKey = new SecretKeySpec(decryptedAesKey, "AES"); + + aesCipher.init(Cipher.DECRYPT_MODE, decryptedAesSecretKey, ivSpec); + byte[] decryptedData = aesCipher.doFinal(Base64.getDecoder().decode(base64EncryptedData)); + + // 验证数字签名 + Signature verifier = Signature.getInstance("SHA256withRSA"); + verifier.initVerify(publicKey); + verifier.update(decryptedData); + boolean signatureValid = verifier.verify(Base64.getDecoder().decode(base64Signature)); + + System.out.println("解密后的数据:" + new String(decryptedData)); + System.out.println("数字签名验证结果:" + signatureValid); + } + + public static PublicKey readPublicKey(File file) throws Exception { + KeyFactory factory = KeyFactory.getInstance("RSA"); + + try (FileReader keyReader = new FileReader(file); + PemReader pemReader = new PemReader(keyReader)) { + + PemObject pemObject = pemReader.readPemObject(); + byte[] content = pemObject.getContent(); + X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content); + return factory.generatePublic(pubKeySpec); + } + } + + private static byte[] generateRandomIV(int blockSize) { + SecureRandom random = new SecureRandom(); + byte[] iv = new byte[blockSize]; + random.nextBytes(iv); + return iv; + } +} diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java new file mode 100644 index 00000000..331c01ed --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java @@ -0,0 +1,53 @@ +package com.ai.da.common.utils; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.model.dto.AlipayHKRequestDTO; +import com.alibaba.fastjson.serializer.SerializerFeature; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; + +import java.io.IOException; +import java.time.Instant; +import java.util.concurrent.TimeUnit; + +import com.alibaba.fastjson.JSONObject; + +@Slf4j +public class AlipayHKRequestUtil { + + public static String createOrder(AlipayHKRequestDTO alipayHKRequestDTO) throws IOException { + 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;charset=utf-8"); + long epochMilli = Instant.now().toEpochMilli(); + log.info("Alipay-HK send request unix timestamp: {}", epochMilli); + + String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue); + log.info(jsonString); + + RequestBody body = RequestBody.create(mediaType, jsonString); + + Request request = new Request.Builder() +// .url("https://aqs-api.sandbox-codpayment.com") + .url("https://aqs-api.sandbox-codpayment.com/v1/service") + .method("POST", body) + .addHeader("Content-Type", "application/json;charset=utf-8") + .build(); + Response response = null; + String bodyString; + try { +// log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue)); + response = client.newCall(request).execute(); + } catch (Exception e) { +// log.error("PythonService##generateSketchOrPrint异常###{}", ExceptionUtil.getThrowableList(ioException)); +// throw new BusinessException("generate.interface.error"); + throw new BusinessException(e.getMessage()); + } + return response.body().string(); + } + +} diff --git a/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java b/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java index c864960c..40ae25db 100644 --- a/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java +++ b/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java @@ -14,6 +14,7 @@ import java.util.concurrent.*; @Component public class AsyncCallerUtil { + // 存放状态 表示当前任务是否需要继续等待,默认持续等待 public static Map waitingStatus = new HashMap<>(); private static PythonService pythonService; @@ -24,7 +25,8 @@ public class AsyncCallerUtil { } public CompletableFuture> callGenerateAsync(GenerateToPythonDTO generateToPython) { - return CompletableFuture.supplyAsync(() -> pythonService.generateSketchOrPrint(generateToPython)); +// return CompletableFuture.supplyAsync(() -> pythonService.generateSketchOrPrint(generateToPython)); + return null; } public List generate(GenerateToPythonDTO generateToPython) { diff --git a/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java b/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java index 48291bb8..82235e8c 100644 --- a/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java +++ b/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java @@ -1,11 +1,7 @@ package com.ai.da.common.utils; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.SysFile; import com.ai.da.model.vo.SysFileVO; import com.google.common.cache.*; -import com.google.common.collect.Lists; -import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; 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 5bd54cf8..352b4d79 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -1,29 +1,21 @@ package com.ai.da.common.utils; import com.ai.da.common.config.exception.BusinessException; -import com.ai.da.mapper.entity.ObjectItem; +import com.ai.da.mapper.primary.entity.ObjectItem; import io.minio.*; import io.minio.errors.MinioException; import io.minio.http.Method; import io.minio.messages.DeleteError; import io.minio.messages.DeleteObject; import io.minio.messages.Item; -import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.*; -import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/com/ai/da/common/utils/OrderNoUtils.java b/src/main/java/com/ai/da/common/utils/OrderNoUtils.java new file mode 100644 index 00000000..2b0108de --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/OrderNoUtils.java @@ -0,0 +1,46 @@ +package com.ai.da.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * 订单号工具类 + * + * @author qy + * @since 1.0 + */ +public class OrderNoUtils { + + /** + * 获取订单编号 + * @return + */ + public static String getOrderNo() { + return "ORDER_" + getNo(); + } + + /** + * 获取退款单编号 + * @return + */ + public static String getRefundNo() { + return "REFUND_" + getNo(); + } + + /** + * 获取编号 + * @return + */ + public static String getNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String newDate = sdf.format(new Date()); + String result = ""; + Random random = new Random(); + for (int i = 0; i < 3; i++) { + result += random.nextInt(10); + } + return newDate + result; + } + +} diff --git a/src/main/java/com/ai/da/common/utils/RandomsUtil.java b/src/main/java/com/ai/da/common/utils/RandomsUtil.java index fd4b352f..dc68ec90 100644 --- a/src/main/java/com/ai/da/common/utils/RandomsUtil.java +++ b/src/main/java/com/ai/da/common/utils/RandomsUtil.java @@ -48,5 +48,9 @@ public class RandomsUtil { return RandomUtil.randomLong(randomStart, randomEnd); } + public static Integer randomSysFile(Integer randomEnd) { + return RandomUtil.randomInt(randomEnd); + } + } 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 5121e883..ef67de8f 100644 --- a/src/main/java/com/ai/da/common/utils/RedisUtil.java +++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java @@ -7,8 +7,10 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; @Slf4j @Component @@ -17,6 +19,10 @@ public class RedisUtil { @Resource private RedisTemplate redisTemplate; + public Boolean hasKey(String key){ + return redisTemplate.hasKey(key); + } + //- - - - - - - - - - - - - - - - - - - - - ZSet类型 - - - - - - - - - - - - - - - - - - - - /** @@ -64,10 +70,15 @@ public class RedisUtil { /** * 获取当前ZSet中数据量的总和 */ - public Long getZSetTotal(String key) { + public Long getZSetTotalCount(String key) { return redisTemplate.opsForZSet().zCard(key); } + + public Set getZSetTotalData(String key){ + return redisTemplate.opsForZSet().range(key, 0, -1); + } + //- - - - - - - - - - - - - - - - - - - - - set类型 - - - - - - - - - - - - - - - - - - - - /** @@ -123,4 +134,34 @@ public class RedisUtil { public Long removeFromMap(String key, String hashKeys) { return redisTemplate.opsForHash().delete(key, hashKeys); } + + //- - - - - - - - - - - - - - - - - - - - - String类型 - - - - - - - - - - - - - - - - - - - - + public void addToString(String key, String value){ + redisTemplate.opsForValue().set(key,value); + } + + public void addToString(String key, String value, Long expiresIn){ + redisTemplate.opsForValue().set(key,value,expiresIn, TimeUnit.SECONDS); + } + + public String getFromString(String key){ + return redisTemplate.opsForValue().get(key); + } + + public Set getKeysFromString(String key){ + return redisTemplate.keys(key); + } + + public List getMultiValue(Set keys){ + return redisTemplate.opsForValue().multiGet(keys); + } + + public Long getExpire(String key){ + return redisTemplate.getExpire(key); + } + + public void removeFromString(String key){ + redisTemplate.delete(key); + } + } 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 e9389317..73c4eb17 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -1,7 +1,7 @@ package com.ai.da.common.utils; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.alibaba.fastjson.JSONObject; import com.ai.da.common.config.exception.BusinessException; import com.tencentcloudapi.common.Credential; @@ -134,6 +134,8 @@ public class SendEmailUtil { private final static Long NOTIFICATION_TEMPLATE_ID = 117216L; private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L; 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) { try { // 实例化一个认证对象 @@ -227,6 +229,40 @@ public class SendEmailUtil { throw new BusinessException("failed.to.send.mail"); } } + + + public static void sendNoExcelEmail(String receiverAddress, String senderAddress) { + 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(); + if (StringUtils.isEmpty(senderAddress)) { + senderAddress = SEND_ADDRESS; + } + req.setFromEmailAddress(senderAddress); + req.setDestination(new String[]{receiverAddress}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + subject = "昨日试用订单数据"; + template.setTemplateID(NO_TRIAL_ORDER_LIST_ID); + + 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 WILLBEEXPIRED_TEMPLATE_ID = 118178L; public static void sendWillBeExpiredEmail(Account account, String senderAddress) { try { @@ -355,4 +391,46 @@ public class SendEmailUtil { throw new BusinessException("failed.to.send.mail"); } } + + private final static Long GENERATE_EXCEPTION_WARNING_ID = 122589L; + public static void sendGenerateExceptionWarning(String message){ + 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[]{"xupei3360@163.com"}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + subject = "Warning: AiDA 3.0 Generate Exception Warning"; + template.setTemplateID(GENERATE_EXCEPTION_WARNING_ID); + + JSONObject parameter = new JSONObject(); + parameter.put("errorMessage", message); + parameter.put("time", DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS)); + + 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"); + } + } + + + + } diff --git a/src/main/java/com/ai/da/common/utils/paypalRequest/AuthenticationRequest.java b/src/main/java/com/ai/da/common/utils/paypalRequest/AuthenticationRequest.java new file mode 100644 index 00000000..eedda337 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/paypalRequest/AuthenticationRequest.java @@ -0,0 +1,30 @@ +package com.ai.da.common.utils.paypalRequest; + +import com.alibaba.fastjson.JSONObject; +import com.paypal.http.HttpRequest; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.HashMap; + +@Component +public class AuthenticationRequest extends HttpRequest { + + public AuthenticationRequest() { + super("/v1/oauth2/token", "POST", HashMap.class); + this.header("Content-Type", "application/x-www-form-urlencoded"); + body(); + } + + public AuthenticationRequest authorization(String clientId, String clientSecret) { + this.header(clientId, clientSecret); + return this; + } + + public AuthenticationRequest body() { + HashMap body = new HashMap<>(); + body.put("grant_type", "client_credentials"); + this.requestBody(body); + return this; + } +} diff --git a/src/main/java/com/ai/da/common/utils/paypalRequest/WebhookVerifyRequest.java b/src/main/java/com/ai/da/common/utils/paypalRequest/WebhookVerifyRequest.java new file mode 100644 index 00000000..957482d3 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/paypalRequest/WebhookVerifyRequest.java @@ -0,0 +1,26 @@ +package com.ai.da.common.utils.paypalRequest; + +import com.ai.da.model.dto.WebhookVerifyDTO; +import com.alibaba.fastjson.JSONObject; +import com.paypal.http.HttpRequest; +import com.paypal.orders.OrdersCreateRequest; + +import java.io.Serializable; +import java.util.HashMap; + +public class WebhookVerifyRequest extends HttpRequest { + public WebhookVerifyRequest() { + super("/v1/notifications/verify-webhook-signature", "POST", HashMap.class); + this.header("Content-Type", "application/json"); + } + + public WebhookVerifyRequest authorization(String authorization) { + this.header("Authorization", "Bearer " + String.valueOf(authorization)); + return this; + } + + public WebhookVerifyRequest requestBody(HashMap webhookVerify) { + super.requestBody(webhookVerify); + return this; + } +} diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index d9ed7803..ce1cd82f 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -2,13 +2,10 @@ package com.ai.da.controller; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; -import com.ai.da.common.security.jwt.JWTTokenHelper; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.dto.*; -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.QueryLibraryPageVO; import com.ai.da.service.AccountService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java new file mode 100644 index 00000000..b3a9c65b --- /dev/null +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -0,0 +1,113 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.service.AliPayService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +@CrossOrigin +@RestController +@RequestMapping("/api/ali-pay") +@Api(tags = "网站支付宝支付") +@Slf4j +public class AliPayController { + + @Resource + private AliPayService aliPayService; + + @ApiOperation("统一收单下单并支付页面接口的调用") + @PostMapping("/trade/page/pay/{amount}") + public Response tradePagePay(@PathVariable Integer amount, @RequestParam String returnUrl){ + log.info("统一收单下单并支付页面接口的调用"); + //支付宝开放平台接受 request 请求对象后 + // 会为开发者生成一个html 形式的 form表单,包含自动提交的脚本 + String formStr = aliPayService.tradeCreate(amount, returnUrl); + //我们将form表单字符串返回给前端程序,之后前端将会调用自动提交脚本,进行表单的提交 + //此时,表单会自动提交到action属性所指向的支付宝开放平台中,从而为用户展示一个支付页面 + return Response.success(formStr); + } + + @ApiOperation("支付通知") + @PostMapping("/trade/notify") + public String tradeNotify(@RequestParam Map params){ + return aliPayService.tradeNotify(params); + } + + /** + * 用户取消订单 + * @param orderNo + * @return + */ + @ApiOperation("用户取消订单") + @PostMapping("/trade/close/{orderNo}") + public Response cancel(@PathVariable String orderNo){ + log.info("取消订单"); + aliPayService.cancelOrder(orderNo); + return Response.success("订单已取消"); + } + + /** + * 查询订单 + * @param orderNo + * @return + */ + @ApiOperation("查询订单:测试订单状态用") + @GetMapping("/trade/query/{orderNo}") + public Response queryOrder(@PathVariable String orderNo) { + log.info("查询订单"); + String result = aliPayService.queryOrder(orderNo); + return Response.success(result); + + } + + /** + * 不在页面提供申请退款接口 + * @param orderNo + * @param reason + * @return + */ + @ApiOperation("申请退款") + @PostMapping("/trade/refund/{orderNo}/{reason}") + public Response refunds(@PathVariable String orderNo, @PathVariable String reason){ + log.info("申请退款"); + aliPayService.refund(orderNo, reason); + return Response.success(); + } + + /** + * 查询退款 + * @param orderNo + * @return + * @throws Exception + */ + @ApiOperation("查询退款:测试用") + @GetMapping("/trade/fastpay/refund/{orderNo}") + public Response queryRefund(@PathVariable String orderNo) { + log.info("查询退款"); + String result = aliPayService.queryRefund(orderNo); + return Response.success(result); + } + + /** + * 根据账单类型和日期获取账单url地址 + * + * @param billDate + * @param type + * @return + */ + @ApiOperation("获取账单url") + @GetMapping("/bill/downloadurl/query/{billDate}/{type}") + public Response queryTradeBill( + @PathVariable String billDate, + @PathVariable String type) { + log.info("获取账单url"); + String downloadUrl = aliPayService.queryBill(billDate, type); + return Response.success(downloadUrl); + } + +} diff --git a/src/main/java/com/ai/da/controller/AlipayHKController.java b/src/main/java/com/ai/da/controller/AlipayHKController.java new file mode 100644 index 00000000..9b2fca11 --- /dev/null +++ b/src/main/java/com/ai/da/controller/AlipayHKController.java @@ -0,0 +1,22 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@CrossOrigin +@RestController +@RequestMapping("/api/ali-pay-hk") +@Api(tags = "网站支付 香港支付宝") +@Slf4j +public class AlipayHKController { + + public Response createOrder(){ + return Response.success(); + } + + +} diff --git a/src/main/java/com/ai/da/controller/ClassificationController.java b/src/main/java/com/ai/da/controller/ClassificationController.java index cbe95c14..75c4e556 100644 --- a/src/main/java/com/ai/da/controller/ClassificationController.java +++ b/src/main/java/com/ai/da/controller/ClassificationController.java @@ -1,27 +1,19 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; -import com.ai.da.mapper.entity.Workspace; import com.ai.da.model.dto.ClassificationDTO; -import com.ai.da.model.dto.WorkspaceDTO; -import com.ai.da.model.enums.BizJson; import com.ai.da.model.vo.ClassificationVO; -import com.ai.da.model.vo.ModelsVO; -import com.ai.da.model.vo.WorkspaceVO; import com.ai.da.service.ClassificationService; -import com.ai.da.service.WorkspaceService; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; -import java.io.FileNotFoundException; import java.util.List; /** diff --git a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java index bca619ce..4b4526bd 100644 --- a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java +++ b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java @@ -3,16 +3,19 @@ package com.ai.da.controller; import com.ai.da.common.context.UserContext; import com.ai.da.common.response.Response; -import com.ai.da.mapper.DesignMapper; -import com.ai.da.mapper.TrialOrderMapper; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.DesignMapper; +import com.ai.da.mapper.primary.TrialOrderMapper; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.dto.UserDesignStatisticDTO; +import io.netty.util.internal.StringUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; @Api(tags = "便利查询") @@ -31,7 +34,7 @@ public class ConvenientInquiryController { @GetMapping("/getTrial") public Response> getTrial(){ Long accountId = UserContext.getUserHolder().getId(); - if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L)){ + if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ List trialOrders = trialOrderMapper.selectList(null); return Response.success(trialOrders); }else { @@ -43,7 +46,13 @@ public class ConvenientInquiryController { @GetMapping("/getDesignStatistic") public Response> getDesignStatistic(@RequestParam String startTime,@RequestParam String endTime){ Long accountId = UserContext.getUserHolder().getId(); - if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L)){ + if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ + if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00"; + if (StringUtil.isNullOrEmpty(endTime)){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + Date date = new Date(); + endTime = simpleDateFormat.format(date); + } List designStatistic = designMapper.getDesignStatistic(startTime, endTime); return Response.success(designStatistic); }else { diff --git a/src/main/java/com/ai/da/controller/CreditsController.java b/src/main/java/com/ai/da/controller/CreditsController.java new file mode 100644 index 00000000..ab02e57f --- /dev/null +++ b/src/main/java/com/ai/da/controller/CreditsController.java @@ -0,0 +1,42 @@ +package com.ai.da.controller; + +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.mapper.primary.entity.CreditsDetail; +import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO; +import com.ai.da.service.CreditsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +@CrossOrigin +@RestController +@RequestMapping("/api/credits") +@Api(tags = "积分") +@Slf4j +public class CreditsController { + + @Resource + private CreditsService creditsService; + + @ApiOperation("获取当前积分") + @GetMapping("/getCredits") + public Response getCredits() { + String credits = creditsService.getCredits(UserContext.getUserHolder().getId()); + return Response.success(credits); + } + + @ApiOperation("获取积分详细") + @PostMapping("/getCreditsDetail") + public Response> getCreditsDetail(@Valid @RequestBody QueryIncomeOrExpenditureDTO queryPageByTimeDTO) { + PageBaseResponse credits = creditsService.queryCreditsDetailsPage(queryPageByTimeDTO); + return Response.success(credits); + } + + +} diff --git a/src/main/java/com/ai/da/controller/DesignController.java b/src/main/java/com/ai/da/controller/DesignController.java index b36cf6f9..87fe11a6 100644 --- a/src/main/java/com/ai/da/controller/DesignController.java +++ b/src/main/java/com/ai/da/controller/DesignController.java @@ -30,6 +30,7 @@ public class DesignController { @ApiOperation(value = "设计 Conllection") @PostMapping("/designCollection") + @CrossOrigin public Response designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) { return Response.success(designService.designCollection(designDTO)); } diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java index c752fbc0..4e1566dd 100644 --- a/src/main/java/com/ai/da/controller/GenerateController.java +++ b/src/main/java/com/ai/da/controller/GenerateController.java @@ -3,10 +3,7 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; -import com.ai.da.model.vo.GenerateCaptionVO; -import com.ai.da.model.vo.GenerateCollectionVO; -import com.ai.da.model.vo.GenerateLikeVO; -import com.ai.da.model.vo.PrepareForGenerateVO; +import com.ai.da.model.vo.*; import com.ai.da.service.GenerateService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -16,6 +13,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.util.List; /** * @author XP @@ -35,11 +33,12 @@ public class GenerateController { return Response.success(generateService.generateCaption(sketchElementId)); } - @ApiOperation("通过文字、图片生成图片") + /*@ApiOperation("通过文字、图片生成图片") @PostMapping("/sketchAndPrint") - public Response generateThroughImageText(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) { - return Response.success(generateService.generateThroughImageText(generateThroughImageTextDTO)); - } + public void generateThroughImageText(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) { +// return Response.success(generateService.generateThroughImageText(generateThroughImageTextDTO)); + generateService.generateThroughImageText(generateThroughImageTextDTO); + }*/ @ApiOperation("喜欢生成的图片") @PostMapping("/like") @@ -63,16 +62,25 @@ public class GenerateController { @ApiOperation(value = "取消继续生成") @GetMapping("/stopWaiting") public Response stopWaiting(@RequestParam("userId") Long userId, - @RequestParam("uniqueId") String uniqueId, + @RequestParam("uniqueId") List uniqueId, @RequestParam("timeZone") String timeZone) { generateService.cancelGenerate(userId, uniqueId, timeZone); return Response.success("stop waiting successfully"); } - @ApiOperation(value = "获取生成结果") + /*@ApiOperation(value = "获取生成结果") @GetMapping("/result") public Response getGenerateResult(@RequestParam("uniqueId") String uniqueId) { GenerateCollectionVO generateResult = generateService.getGenerateResult(uniqueId); return Response.success(generateResult); + }*/ + + @ApiOperation(value = "获取生成结果") + @PostMapping("/result") + public Response> getGenerateResults(@Valid @RequestBody List taskIdList) { + List generateResult = generateService.getGenerateResultList(taskIdList); + return Response.success(generateResult); } + + } diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java index fd4aa57c..9c3a6ebb 100644 --- a/src/main/java/com/ai/da/controller/LibraryController.java +++ b/src/main/java/com/ai/da/controller/LibraryController.java @@ -7,10 +7,9 @@ import com.ai.da.common.enums.LibraryLevel1TypeEnum; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; import com.ai.da.common.utils.*; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.mapper.primary.entity.Library; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; import com.ai.da.model.dto.*; -import com.ai.da.model.enums.ModelType; import com.ai.da.model.vo.*; import com.ai.da.service.LibraryModelPointService; import com.ai.da.service.LibraryService; @@ -20,7 +19,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -30,7 +28,6 @@ import javax.validation.Valid; import java.io.File; import java.text.ParseException; import java.util.Date; -import java.util.List; import java.util.Objects; import java.util.UUID; diff --git a/src/main/java/com/ai/da/controller/OrderInfoController.java b/src/main/java/com/ai/da/controller/OrderInfoController.java new file mode 100644 index 00000000..3a9ce1d5 --- /dev/null +++ b/src/main/java/com/ai/da/controller/OrderInfoController.java @@ -0,0 +1,48 @@ +package com.ai.da.controller; + +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.response.Response; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.model.dto.QueryPageByTimeDTO; +import com.ai.da.service.OrderInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +@CrossOrigin //开放前端的跨域访问 +@Api(tags = "商品订单管理") +@RestController +@RequestMapping("/api/order-info") +public class OrderInfoController { + + @Resource + private OrderInfoService orderInfoService; + + @ApiOperation("订单列表") + @PostMapping("/list") + public Response> list(@Valid @RequestBody QueryPageByTimeDTO queryPageByTimeDTO){ + PageBaseResponse orderByAccountId = orderInfoService.getOrderByPage(queryPageByTimeDTO); +// List list = orderInfoService.listOrderByCreateTimeDesc(); + return Response.success(orderByAccountId); + } + + /** + * 查询本地订单状态 + * @param orderNo + * @return + */ + @ApiOperation("查询本地订单状态") + @GetMapping("/query-order-status/{orderNo}") + public Response queryOrderStatus(@PathVariable String orderNo){ + String orderStatus = orderInfoService.getOrderStatus(orderNo); + if(OrderStatusEnum.SUCCESS.getType().equals(orderStatus)){ + return Response.success("支付成功"); //支付成功 + } + return Response.success(101,"支付中......"); + } + +} diff --git a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java new file mode 100644 index 00000000..203da0e7 --- /dev/null +++ b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java @@ -0,0 +1,72 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.service.PayPalCheckoutService; +import com.paypal.http.HttpResponse; +import com.paypal.http.exceptions.SerializeException; +import com.paypal.orders.Order; +import com.paypal.payments.Refund; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; + +@RestController +@Api(tags = "PayPalCheckout接口") +@RequestMapping("/api/paypal") +public class PayPalCheckoutController { + + @Resource + private PayPalCheckoutService payPalCheckoutService; + + @ApiOperation(value = "创建订单") + @PostMapping(value = "/trade/{amount}") + public Response> createOrder(@PathVariable Integer amount, @RequestParam String returnUrl) throws SerializeException { + HashMap approvalUrl = payPalCheckoutService.createOrder(amount,returnUrl); + return Response.success(approvalUrl); + } + + @ApiOperation(value = "ipn异步回调") + @PostMapping(value = "/ipn/back") + public Response callback(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Boolean result = payPalCheckoutService.doPost(request, response); + if (result){ + return Response.success(200,"success"); + }else { + return Response.fail(500,"failure"); + } + } + + @ApiOperation(value = "查询指定订单") + @PostMapping(value = "/trade/query/{orderNo}") + public Response queryOrder(@PathVariable String orderNo) throws SerializeException { + Order s = payPalCheckoutService.queryOrder(orderNo); + return Response.success(s); + } + + /** 不提供退款接口 */ + @ApiOperation("申请退款") + @PostMapping("/trade/refund/{orderNo}/{reason}") + public Response> refund(@PathVariable String orderNo, @PathVariable String reason) throws IOException { + Boolean response = payPalCheckoutService.refundOrder(orderNo,reason); + if (response){ + return Response.success(); + }else { + return Response.fail("Request for refund failed."); + } + } + + @ApiOperation("执行扣款") + @PostMapping("/trade/capture/{orderNo}") + public Response captureOrder(@PathVariable String orderNo) throws IOException { + Order response = payPalCheckoutService.captureOrder(orderNo); + return Response.success(response); + } +} + diff --git a/src/main/java/com/ai/da/controller/ProductController.java b/src/main/java/com/ai/da/controller/ProductController.java new file mode 100644 index 00000000..ac2e4be0 --- /dev/null +++ b/src/main/java/com/ai/da/controller/ProductController.java @@ -0,0 +1,42 @@ +package com.ai.da.controller; + + +import com.ai.da.common.response.Response; +import com.ai.da.mapper.primary.entity.Product; +import com.ai.da.service.ProductService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@CrossOrigin //开放前端的跨域访问 +@Api(tags = "商品管理") +@RestController +@RequestMapping("/api/product") +public class ProductController { + + @Resource + private ProductService productService; + + @ApiOperation("测试接口") + @GetMapping("/test") + public Response test(){ + + return Response.success("now" + new Date()); + } + + @ApiOperation("商品列表") + @GetMapping("/list") + public Response> list(){ + + List list = productService.list(); + return Response.success(list); + } + +} diff --git a/src/main/java/com/ai/da/controller/PythonController.java b/src/main/java/com/ai/da/controller/PythonController.java index da4a8d3f..895d311a 100644 --- a/src/main/java/com/ai/da/controller/PythonController.java +++ b/src/main/java/com/ai/da/controller/PythonController.java @@ -3,16 +3,18 @@ package com.ai.da.controller; import com.ai.da.common.enums.CollectionLevel1TypeEnum; import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.ChatFlushDTO; import com.ai.da.model.dto.ChatRobotLibraryDTO; import com.ai.da.model.dto.ChatSendDTO; +import com.ai.da.model.dto.SuperResolutionDTO; import com.ai.da.model.vo.ChatRobotVO; import com.ai.da.model.vo.PythonLibraryVo; import com.ai.da.model.vo.SysFileVO; import com.ai.da.python.PythonService; import com.ai.da.service.ChatRobotService; import com.ai.da.service.LibraryService; +import com.ai.da.service.SuperResolutionService; import com.ai.da.service.SysFileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -41,10 +43,12 @@ public class PythonController { private SysFileService sysFileService; @Resource private LibraryService libraryService; - @Resource private ChatRobotService chatRobotService; + @Resource + private SuperResolutionService superResolutionService; + @ApiOperation(value = "python服务保存图片到java服务") @PostMapping("/saveGeneratePicture") public Response upload(@RequestParam("file") MultipartFile file, @@ -109,4 +113,10 @@ public class PythonController { return Response.success(chatRobotService.chatBufferFlush(chatFlushDTO)); } + @ApiOperation(value = "超分辨率") + @PostMapping("/prepareForSR") + public Response> superResolution(@RequestBody List superResolutionDTO) { + return Response.success(superResolutionService.prepareForSR(superResolutionDTO)); + } + } diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index 4373dc8b..f1672d97 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -1,15 +1,17 @@ package com.ai.da.controller; +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.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.mapper.TDesignPythonOutfitMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TDesignPythonOutfit; -import com.ai.da.mapper.entity.UserLikeGroup; +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.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.service.*; @@ -27,10 +29,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @@ -49,6 +48,8 @@ public class SavedCollectionController { private TDesignPythonOutfitMapper designPythonOutfitMapper; @Resource private MinioUtil minioUtil; + @Resource + private ClassificationService classificationService; @ApiOperation(value = "History用户分页分组列表") @PostMapping("/queryUserGroup") @@ -67,7 +68,34 @@ public class SavedCollectionController { if (Objects.nonNull(query.getEndDate())) { queryWrapper.le("update_date", new Date(query.getEndDate())); } - queryWrapper.orderByDesc("id"); + // 新增分类过滤 + if (CollectionUtil.isNotEmpty(query.getClassificationIdList())) { + List historyIdList = new ArrayList<>(); + if (query.getIntersection() == 0) { + for (Long classificationId : query.getClassificationIdList()) { + historyIdList.addAll(classificationService.getLibraryIdListByClassificationId(classificationId)); + } + if (CollectionUtil.isNotEmpty(historyIdList)) { + queryWrapper.in("id", historyIdList); + }else { + return Response.success(PageBaseResponse.success(new Page<>())); + } + }else { + for (int i = 0; i < query.getClassificationIdList().size(); i++) { + List historyIdListByClassificationId = classificationService.getLibraryIdListByClassificationId(query.getClassificationIdList().get(i)); + if (i == 0) { + historyIdList.addAll(historyIdListByClassificationId); + }else { + historyIdList.retainAll(historyIdListByClassificationId); + } + if (CollectionUtil.isEmpty(historyIdList)) { + return Response.success(PageBaseResponse.success(new Page<>())); + } + } + queryWrapper.in("id", historyIdList); + } + } + queryWrapper.orderByDesc("update_date"); IPage page = userLikeGroupService.getBaseMapper().selectPage( new Page<>(query.getPage(), query.getSize()), queryWrapper); if (CollectionUtils.isEmpty(page.getRecords())) { diff --git a/src/main/java/com/ai/da/controller/TaskListController.java b/src/main/java/com/ai/da/controller/TaskListController.java new file mode 100644 index 00000000..85485d50 --- /dev/null +++ b/src/main/java/com/ai/da/controller/TaskListController.java @@ -0,0 +1,40 @@ +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.QueryTaskHistoryDTO; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.ai.da.model.dto.TaskDTO; +import com.ai.da.model.vo.TaskVO; +import com.ai.da.service.TaskListService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +@Api(tags = "任务列表模块") +@Slf4j +@RestController +@RequestMapping("/api/tasks") +public class TaskListController { + + @Resource + private TaskListService taskListService; + + @PostMapping("/getList") + @ApiOperation("获取未执行完的任务") + public Response>> getTaskList(@Valid @RequestBody List taskIdList) { + return Response.success(taskListService.getExecTask(taskIdList)); + } + + @PostMapping("/getAllTask") + @ApiOperation("获取所有任务") + public Response> getAllTask(@Valid @RequestBody QueryTaskHistoryDTO queryTaskHistoryDTO) { + return Response.success(taskListService.getAllTask(queryTaskHistoryDTO)); + } + +} diff --git a/src/main/java/com/ai/da/controller/WorkspaceController.java b/src/main/java/com/ai/da/controller/WorkspaceController.java index 1de7008a..b0c089f0 100644 --- a/src/main/java/com/ai/da/controller/WorkspaceController.java +++ b/src/main/java/com/ai/da/controller/WorkspaceController.java @@ -1,9 +1,7 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; -import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.entity.Workspace; -import com.ai.da.model.dto.ModelsDotDTO; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.enums.BizJson; import com.ai.da.model.vo.ModelsVO; @@ -19,9 +17,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import lombok.NoArgsConstructor; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import java.io.FileNotFoundException; import java.util.List; diff --git a/src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java b/src/main/java/com/ai/da/mapper/primary/AccountLoginLogMapper.java similarity index 58% rename from src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java rename to src/main/java/com/ai/da/mapper/primary/AccountLoginLogMapper.java index 46d6e221..4d045456 100644 --- a/src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/AccountLoginLogMapper.java @@ -1,17 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.AccountLoginLog; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface AccountLoginLogMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.AccountLoginLog; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountLoginLogMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/AccountMapper.java b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java similarity index 83% rename from src/main/java/com/ai/da/mapper/AccountMapper.java rename to src/main/java/com/ai/da/mapper/primary/AccountMapper.java index dc8cb900..d9afae89 100644 --- a/src/main/java/com/ai/da/mapper/AccountMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java @@ -1,32 +1,32 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface AccountMapper extends CommonMapper { - - /** - * 手机号批量查询 - * - * @param phoneList - * @return - */ - List findByPhoneList(List phoneList); - - /** - * 主键查询 - * - * @param id - * @return - */ - Account findById(String id); - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Account; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountMapper extends CommonMapper { + + /** + * 手机号批量查询 + * + * @param phoneList + * @return + */ + List findByPhoneList(List phoneList); + + /** + * 主键查询 + * + * @param id + * @return + */ + Account findById(String id); + +} diff --git a/src/main/java/com/ai/da/mapper/ChatRobotMapper.java b/src/main/java/com/ai/da/mapper/primary/ChatRobotMapper.java similarity index 68% rename from src/main/java/com/ai/da/mapper/ChatRobotMapper.java rename to src/main/java/com/ai/da/mapper/primary/ChatRobotMapper.java index c404a90e..39b0690d 100644 --- a/src/main/java/com/ai/da/mapper/ChatRobotMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ChatRobotMapper.java @@ -1,9 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.ChatRobot; - -import java.util.List; +import com.ai.da.mapper.primary.entity.ChatRobot; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/ClassificationMapper.java b/src/main/java/com/ai/da/mapper/primary/ClassificationMapper.java similarity index 64% rename from src/main/java/com/ai/da/mapper/ClassificationMapper.java rename to src/main/java/com/ai/da/mapper/primary/ClassificationMapper.java index fdc13893..16a692f7 100644 --- a/src/main/java/com/ai/da/mapper/ClassificationMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ClassificationMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.ChatRobot; -import com.ai.da.mapper.entity.Classification; +import com.ai.da.mapper.primary.entity.Classification; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java b/src/main/java/com/ai/da/mapper/primary/ClassificationRelLibraryMapper.java similarity index 63% rename from src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java rename to src/main/java/com/ai/da/mapper/primary/ClassificationRelLibraryMapper.java index f9094830..a778a40f 100644 --- a/src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ClassificationRelLibraryMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Classification; -import com.ai.da.mapper.entity.ClassificationRelLibrary; +import com.ai.da.mapper.primary.entity.ClassificationRelLibrary; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/CollectionElementMapper.java b/src/main/java/com/ai/da/mapper/primary/CollectionElementMapper.java similarity index 64% rename from src/main/java/com/ai/da/mapper/CollectionElementMapper.java rename to src/main/java/com/ai/da/mapper/primary/CollectionElementMapper.java index 0c8a0613..55a3188a 100644 --- a/src/main/java/com/ai/da/mapper/CollectionElementMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/CollectionElementMapper.java @@ -1,16 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.CollectionElement; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author yanglei - * @since 2022-10-13 - */ -public interface CollectionElementMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.CollectionElement; + +/** + * Mapper 接口 + * + * @author yanglei + * @since 2022-10-13 + */ +public interface CollectionElementMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/CollectionMapper.java b/src/main/java/com/ai/da/mapper/primary/CollectionMapper.java similarity index 66% rename from src/main/java/com/ai/da/mapper/CollectionMapper.java rename to src/main/java/com/ai/da/mapper/primary/CollectionMapper.java index 582de4ef..b9a7bd1e 100644 --- a/src/main/java/com/ai/da/mapper/CollectionMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/CollectionMapper.java @@ -1,18 +1,15 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.Collection; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface CollectionMapper extends CommonMapper { - //返回插入数据后生成的主键 - Long insertCollection(Collection collection); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Collection; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface CollectionMapper extends CommonMapper { + //返回插入数据后生成的主键 + Long insertCollection(Collection collection); +} diff --git a/src/main/java/com/ai/da/mapper/primary/CollocationMapper.java b/src/main/java/com/ai/da/mapper/primary/CollocationMapper.java new file mode 100644 index 00000000..7e9af210 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CollocationMapper.java @@ -0,0 +1,13 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Collection; +import com.ai.da.mapper.primary.entity.Collocation; +import com.ai.da.python.vo.DesignPythonItem; + +import java.util.List; + +public interface CollocationMapper extends CommonMapper { + + List getCollocationListBySketch(String apparel, String styleCategory); +} \ No newline at end of file diff --git a/src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java b/src/main/java/com/ai/da/mapper/primary/ColorLoopUpTableMapper.java similarity index 70% rename from src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java rename to src/main/java/com/ai/da/mapper/primary/ColorLoopUpTableMapper.java index 9dcd8892..5accffbb 100644 --- a/src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ColorLoopUpTableMapper.java @@ -1,14 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.ColorLookupTable; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-09-30 - */ -public interface ColorLoopUpTableMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.ColorLookupTable; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-09-30 + */ +public interface ColorLoopUpTableMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/primary/CreditsDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/CreditsDetailMapper.java new file mode 100644 index 00000000..1ee33d4e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CreditsDetailMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.mapper.primary.entity.CreditsDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface CreditsDetailMapper extends BaseMapper { +} diff --git a/src/main/java/com/ai/da/mapper/DesignHistoryMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignHistoryMapper.java similarity index 61% rename from src/main/java/com/ai/da/mapper/DesignHistoryMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignHistoryMapper.java index 65ad15c2..c850e88a 100644 --- a/src/main/java/com/ai/da/mapper/DesignHistoryMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignHistoryMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.AccountLoginLog; -import com.ai.da.mapper.entity.DesignHistory; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignHistoryMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.DesignHistory; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignHistoryMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignItemDetailMapper.java index 6d299294..69add05d 100644 --- a/src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.DesignItem; -import com.ai.da.mapper.entity.DesignItemDetail; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignItemDetailMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.DesignItemDetail; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignItemDetailMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignItemDetailPrintMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailPrintMapper.java similarity index 61% rename from src/main/java/com/ai/da/mapper/DesignItemDetailPrintMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignItemDetailPrintMapper.java index 7f522fb1..5a1bdbb5 100644 --- a/src/main/java/com/ai/da/mapper/DesignItemDetailPrintMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailPrintMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.DesignItemDetailPrint; +import com.ai.da.mapper.primary.entity.DesignItemDetailPrint; public interface DesignItemDetailPrintMapper extends CommonMapper { diff --git a/src/main/java/com/ai/da/mapper/DesignItemMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignItemMapper.java similarity index 67% rename from src/main/java/com/ai/da/mapper/DesignItemMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignItemMapper.java index 26222874..cdede99b 100644 --- a/src/main/java/com/ai/da/mapper/DesignItemMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignItemMapper.java @@ -1,16 +1,15 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.DesignItem; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignItemMapper extends CommonMapper { - - Long insertDesignItem(DesignItem designItem); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.DesignItem; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignItemMapper extends CommonMapper { + + Long insertDesignItem(DesignItem designItem); +} diff --git a/src/main/java/com/ai/da/mapper/DesignMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignMapper.java similarity index 78% rename from src/main/java/com/ai/da/mapper/DesignMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignMapper.java index 3c7c3de9..e6b1aa58 100644 --- a/src/main/java/com/ai/da/mapper/DesignMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignMapper.java @@ -1,21 +1,22 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.model.dto.UserDesignStatisticDTO; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignMapper extends CommonMapper { - - //返回插入数据后生成的主键 - Long insertDesign(Design design); - - List getDesignStatistic(String startTime, String endTime); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +//import com.ai.da.mapper.entity.Design; +import com.ai.da.model.dto.UserDesignStatisticDTO; + +import java.util.List; +import com.ai.da.mapper.primary.entity.Design; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignMapper extends CommonMapper { + + //返回插入数据后生成的主键 + Long insertDesign(Design design); + + List getDesignStatistic(String startTime, String endTime); +} diff --git a/src/main/java/com/ai/da/mapper/primary/DressingMapper.java b/src/main/java/com/ai/da/mapper/primary/DressingMapper.java new file mode 100644 index 00000000..ca0f5bf5 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/DressingMapper.java @@ -0,0 +1,11 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Dressing; + +import java.util.List; + +public interface DressingMapper extends CommonMapper { + + List getOtherSketchCategoryNameList(Long id, String styleCategory); +} diff --git a/src/main/java/com/ai/da/mapper/GenerateCancelMapper.java b/src/main/java/com/ai/da/mapper/primary/GenerateCancelMapper.java similarity index 60% rename from src/main/java/com/ai/da/mapper/GenerateCancelMapper.java rename to src/main/java/com/ai/da/mapper/primary/GenerateCancelMapper.java index 3e24ea09..3a9cfee8 100644 --- a/src/main/java/com/ai/da/mapper/GenerateCancelMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/GenerateCancelMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.GenerateCancel; +import com.ai.da.mapper.primary.entity.GenerateCancel; public interface GenerateCancelMapper extends CommonMapper { } diff --git a/src/main/java/com/ai/da/mapper/GenerateDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/GenerateDetailMapper.java similarity index 83% rename from src/main/java/com/ai/da/mapper/GenerateDetailMapper.java rename to src/main/java/com/ai/da/mapper/primary/GenerateDetailMapper.java index d4c0212d..6c0ed893 100644 --- a/src/main/java/com/ai/da/mapper/GenerateDetailMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/GenerateDetailMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.GenerateDetail; +import com.ai.da.mapper.primary.entity.GenerateDetail; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/ai/da/mapper/GenerateMapper.java b/src/main/java/com/ai/da/mapper/primary/GenerateMapper.java similarity index 60% rename from src/main/java/com/ai/da/mapper/GenerateMapper.java rename to src/main/java/com/ai/da/mapper/primary/GenerateMapper.java index 43436d81..9da22dbb 100644 --- a/src/main/java/com/ai/da/mapper/GenerateMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/GenerateMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Generate; +import com.ai.da.mapper.primary.entity.Generate; public interface GenerateMapper extends CommonMapper { } diff --git a/src/main/java/com/ai/da/mapper/LibraryCopyMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryCopyMapper.java similarity index 65% rename from src/main/java/com/ai/da/mapper/LibraryCopyMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryCopyMapper.java index 3cec4a2e..6d7954a4 100644 --- a/src/main/java/com/ai/da/mapper/LibraryCopyMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryCopyMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.LibraryCopy; +import com.ai.da.mapper.primary.entity.LibraryCopy; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/LibraryMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/LibraryMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryMapper.java index 6e438d74..c78aa467 100644 --- a/src/main/java/com/ai/da/mapper/LibraryMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.Library; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface LibraryMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Library; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface LibraryMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointCopyMapper.java similarity index 63% rename from src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryModelPointCopyMapper.java index 05447f66..93767df6 100644 --- a/src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointCopyMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.LibraryModelPoint; -import com.ai.da.mapper.entity.LibraryModelPointCopy; +import com.ai.da.mapper.primary.entity.LibraryModelPointCopy; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryModelPointMapper.java index c1cfd1ba..ee79efad 100644 --- a/src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.LibraryModelPoint; -import com.ai.da.mapper.entity.SysFile; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-11-11 - */ -public interface LibraryModelPointMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-11-11 + */ +public interface LibraryModelPointMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/primary/OrderInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/OrderInfoMapper.java new file mode 100644 index 00000000..b9d74a0f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/OrderInfoMapper.java @@ -0,0 +1,8 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface OrderInfoMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/PanToneMapper.java b/src/main/java/com/ai/da/mapper/primary/PanToneMapper.java similarity index 75% rename from src/main/java/com/ai/da/mapper/PanToneMapper.java rename to src/main/java/com/ai/da/mapper/primary/PanToneMapper.java index a83be55a..81e47ed0 100644 --- a/src/main/java/com/ai/da/mapper/PanToneMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/PanToneMapper.java @@ -1,20 +1,19 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.PanTone; -import com.ai.da.model.dto.GetRgbByHsvBatchDTO; -import io.swagger.v3.oas.annotations.Parameter; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface PanToneMapper extends CommonMapper { - - List getRgbByHsvBatch(@Param("rgbByHsvBatch") List rgbByHsvBatch); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.PanTone; +import com.ai.da.model.dto.GetRgbByHsvBatchDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface PanToneMapper extends CommonMapper { + + List getRgbByHsvBatch(@Param("rgbByHsvBatch") List rgbByHsvBatch); +} diff --git a/src/main/java/com/ai/da/mapper/primary/PaymentInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/PaymentInfoMapper.java new file mode 100644 index 00000000..27b147a4 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/PaymentInfoMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.mapper.primary.entity.PaymentInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface PaymentInfoMapper extends BaseMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/ProductMapper.java b/src/main/java/com/ai/da/mapper/primary/ProductMapper.java new file mode 100644 index 00000000..69850d55 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ProductMapper.java @@ -0,0 +1,8 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.mapper.primary.entity.Product; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ProductMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/PythonTAllInfoMapper.java similarity index 56% rename from src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java rename to src/main/java/com/ai/da/mapper/primary/PythonTAllInfoMapper.java index 9b4bbd14..b5e7a49c 100644 --- a/src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/PythonTAllInfoMapper.java @@ -1,11 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.PythonTAllInfo; -import org.apache.ibatis.annotations.Param; -import org.springframework.data.domain.Pageable; - -import java.util.List; +import com.ai.da.mapper.primary.entity.PythonTAllInfo; /** * (PythonTAllInfo)表数据库访问层 diff --git a/src/main/java/com/ai/da/mapper/primary/RefundInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/RefundInfoMapper.java new file mode 100644 index 00000000..d625e3ed --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/RefundInfoMapper.java @@ -0,0 +1,9 @@ +package com.ai.da.mapper.primary; + + +import com.ai.da.mapper.primary.entity.RefundInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface RefundInfoMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/SysFileMapper.java b/src/main/java/com/ai/da/mapper/primary/SysFileMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/SysFileMapper.java rename to src/main/java/com/ai/da/mapper/primary/SysFileMapper.java index ab4d995d..94842a00 100644 --- a/src/main/java/com/ai/da/mapper/SysFileMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/SysFileMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.SysFile; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-10-6 - */ -public interface SysFileMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.SysFile; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-10-6 + */ +public interface SysFileMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/TCollectionElementRelationMapper.java b/src/main/java/com/ai/da/mapper/primary/TCollectionElementRelationMapper.java similarity index 76% rename from src/main/java/com/ai/da/mapper/TCollectionElementRelationMapper.java rename to src/main/java/com/ai/da/mapper/primary/TCollectionElementRelationMapper.java index a09b17bf..508a7533 100644 --- a/src/main/java/com/ai/da/mapper/TCollectionElementRelationMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TCollectionElementRelationMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.TCollectionElementRelation; +import com.ai.da.mapper.primary.entity.TCollectionElementRelation; import org.apache.ibatis.annotations.Mapper; /** diff --git a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitDetailMapper.java similarity index 86% rename from src/main/java/com/ai/da/mapper/TDesignPythonOutfitDetailMapper.java rename to src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitDetailMapper.java index 68f42c82..ecdf8b45 100644 --- a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitDetailMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitDetailMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import com.ai.da.model.vo.TDesignPythonOutfitDetailVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitMapper.java b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitMapper.java similarity index 86% rename from src/main/java/com/ai/da/mapper/TDesignPythonOutfitMapper.java rename to src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitMapper.java index 1423c794..c3284391 100644 --- a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitMapper.java @@ -1,8 +1,8 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import com.ai.da.model.vo.TDesignPythonOutfitVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/mapper/primary/TaskListMapper.java b/src/main/java/com/ai/da/mapper/primary/TaskListMapper.java new file mode 100644 index 00000000..cbda70e9 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/TaskListMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.mapper.primary.entity.TaskList; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface TaskListMapper extends BaseMapper { +} diff --git a/src/main/java/com/ai/da/mapper/TrialOrderMapper.java b/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java similarity index 61% rename from src/main/java/com/ai/da/mapper/TrialOrderMapper.java rename to src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java index 45a9a621..39def53f 100644 --- a/src/main/java/com/ai/da/mapper/TrialOrderMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java @@ -1,10 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TrialOrder; - -import java.util.List; +import com.ai.da.mapper.primary.entity.TrialOrder; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java b/src/main/java/com/ai/da/mapper/primary/UserLikeGroupMapper.java similarity index 71% rename from src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java rename to src/main/java/com/ai/da/mapper/primary/UserLikeGroupMapper.java index df5f4629..4d71e0b2 100644 --- a/src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/UserLikeGroupMapper.java @@ -1,16 +1,15 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.UserLikeGroup; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface UserLikeGroupMapper extends CommonMapper { - //返回插入数据后生成的主键 - Long insertUserLikeGroup(UserLikeGroup userLikeGroup); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.UserLikeGroup; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface UserLikeGroupMapper extends CommonMapper { + //返回插入数据后生成的主键 + Long insertUserLikeGroup(UserLikeGroup userLikeGroup); +} diff --git a/src/main/java/com/ai/da/mapper/UserLikeMapper.java b/src/main/java/com/ai/da/mapper/primary/UserLikeMapper.java similarity index 70% rename from src/main/java/com/ai/da/mapper/UserLikeMapper.java rename to src/main/java/com/ai/da/mapper/primary/UserLikeMapper.java index 35ae30df..1d5e4761 100644 --- a/src/main/java/com/ai/da/mapper/UserLikeMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/UserLikeMapper.java @@ -1,14 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.UserLike; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface UserLikeMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.UserLike; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface UserLikeMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/WorkspaceMapper.java b/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java similarity index 85% rename from src/main/java/com/ai/da/mapper/WorkspaceMapper.java rename to src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java index e1525d4a..214e97c0 100644 --- a/src/main/java/com/ai/da/mapper/WorkspaceMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.vo.WorkspaceVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/mapper/entity/Account.java b/src/main/java/com/ai/da/mapper/primary/entity/Account.java similarity index 91% rename from src/main/java/com/ai/da/mapper/entity/Account.java rename to src/main/java/com/ai/da/mapper/primary/entity/Account.java index 3dd607b6..ad574fe7 100644 --- a/src/main/java/com/ai/da/mapper/entity/Account.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Account.java @@ -1,83 +1,89 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_account") -public class Account implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 邮箱 - */ - private String userEmail; - - /** - * 用户名 - */ - private String userName; - - /** - * 密码 - */ - private String userPassword; - - /** - * 语言 - */ - private String language; - - /** - * 城市 - */ - private String country; - - /** - * 账户有效期开始时间 - */ - private Long validStartTime; - - /** - * 账户有效期结束时间 - */ - private Long validEndTime; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - - private Integer isTrial; - - private Integer isBeginner; - - private String browserIdentifiers; -} +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.math.BigDecimal; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_account") +public class Account implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 邮箱 + */ + private String userEmail; + + /** + * 用户名 + */ + private String userName; + + /** + * 密码 + */ + private String userPassword; + + /** + * 语言 + */ + private String language; + + /** + * 城市 + */ + private String country; + + /** + * 账户有效期开始时间 + */ + private Long validStartTime; + + /** + * 账户有效期结束时间 + */ + private Long validEndTime; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + private Integer isTrial; + + private Integer isBeginner; + + private String browserIdentifiers; + + /** + * 积分 + */ + private BigDecimal credits; +} diff --git a/src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java b/src/main/java/com/ai/da/mapper/primary/entity/AccountLoginLog.java similarity index 91% rename from src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java rename to src/main/java/com/ai/da/mapper/primary/entity/AccountLoginLog.java index 9218813e..1eb5fb30 100644 --- a/src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/AccountLoginLog.java @@ -1,53 +1,53 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * 账户登入日志 - * - * @author yl - * @since 2022-09-03 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_account_login_log") -public class AccountLoginLog implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 账户id - */ - private Long accountId; - - /** - * ip - */ - private String ip; - - /** - * ip地址 - */ - private String ipAddr; - - /** - * 创建时间 - */ - private Date createDate; - -} +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.util.Date; + +/** + * 账户登入日志 + * + * @author yl + * @since 2022-09-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_account_login_log") +public class AccountLoginLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 账户id + */ + private Long accountId; + + /** + * ip + */ + private String ip; + + /** + * ip地址 + */ + private String ipAddr; + + /** + * 创建时间 + */ + private Date createDate; + +} 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 new file mode 100644 index 00000000..f78fb748 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java @@ -0,0 +1,44 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +public class BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 是否已删除 + */ +// private Integer isDeleted; + + /** + * 用户ID + */ +// private Long userId; + +} diff --git a/src/main/java/com/ai/da/mapper/entity/ChatRobot.java b/src/main/java/com/ai/da/mapper/primary/entity/ChatRobot.java similarity index 94% rename from src/main/java/com/ai/da/mapper/entity/ChatRobot.java rename to src/main/java/com/ai/da/mapper/primary/entity/ChatRobot.java index dd470187..31397ada 100644 --- a/src/main/java/com/ai/da/mapper/entity/ChatRobot.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ChatRobot.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -11,7 +11,6 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) diff --git a/src/main/java/com/ai/da/mapper/entity/Classification.java b/src/main/java/com/ai/da/mapper/primary/entity/Classification.java similarity index 95% rename from src/main/java/com/ai/da/mapper/entity/Classification.java rename to src/main/java/com/ai/da/mapper/primary/entity/Classification.java index 65a8c238..b41a2b0f 100644 --- a/src/main/java/com/ai/da/mapper/entity/Classification.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Classification.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -10,7 +10,6 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) diff --git a/src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java b/src/main/java/com/ai/da/mapper/primary/entity/ClassificationRelLibrary.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java rename to src/main/java/com/ai/da/mapper/primary/entity/ClassificationRelLibrary.java index c8449830..41649ab3 100644 --- a/src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ClassificationRelLibrary.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/entity/Collection.java b/src/main/java/com/ai/da/mapper/primary/entity/Collection.java similarity index 86% rename from src/main/java/com/ai/da/mapper/entity/Collection.java rename to src/main/java/com/ai/da/mapper/primary/entity/Collection.java index 1ff7cbb2..73f9a769 100644 --- a/src/main/java/com/ai/da/mapper/entity/Collection.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Collection.java @@ -1,53 +1,52 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_collection") -public class Collection implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户ID - */ - private Long accountId; - - /** - * mood模板id - */ - private String moodTemplateId; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_collection") +public class Collection implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + + /** + * mood模板id + */ + private String moodTemplateId; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/CollectionElement.java b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/CollectionElement.java rename to src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java index 320a8ed7..b15b9418 100644 --- a/src/main/java/com/ai/da/mapper/entity/CollectionElement.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java @@ -1,87 +1,87 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_collection_element") -public class CollectionElement implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - - private String type; - - /** - * 一级类型 - */ - private String level1Type; - - /** - * 二级类型 - */ - private String level2Type; - - /** - * 元素名(如果是颜色board 存潘通id+潘通名字 形式 ""11_mds") - */ - private String name; - - /** - * 元素存放地址 - */ - private String url; - /** - * 是否pin 1pin 0 不pin - */ - @TableField("is_pin") - private Byte hasPin; - /** - * 颜色的rgb值 空格分割 - */ - private String colorRgb; - /** - * md5值 - */ - private String md5; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_collection_element") +public class CollectionElement implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + + private String type; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + /** + * 元素名(如果是颜色board 存潘通id+潘通名字 形式 ""11_mds") + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * 是否pin 1pin 0 不pin + */ + @TableField("is_pin") + private Byte hasPin; + /** + * 颜色的rgb值 空格分割 + */ + private String colorRgb; + /** + * md5值 + */ + private String md5; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Collocation.java b/src/main/java/com/ai/da/mapper/primary/entity/Collocation.java new file mode 100644 index 00000000..cbc6edba --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Collocation.java @@ -0,0 +1,50 @@ +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.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("collocation") +public class Collocation implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private String name; + + /** + * mood模板id + */ + private Integer isSystem; + + private Long userId; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + private Integer isDeleted; +} diff --git a/src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java b/src/main/java/com/ai/da/mapper/primary/entity/ColorLookupTable.java similarity index 75% rename from src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java rename to src/main/java/com/ai/da/mapper/primary/entity/ColorLookupTable.java index b26cec78..04515738 100644 --- a/src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ColorLookupTable.java @@ -1,35 +1,32 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-09-30 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("color_lookup_table") -public class ColorLookupTable implements Serializable { - - private static final long serialVersionUID = 1L; - /** - * colorValue - */ - private Integer colorValue; - - /** - * color_index - */ - private Integer colorIndex; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-09-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("color_lookup_table") +public class ColorLookupTable implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * colorValue + */ + private Integer colorValue; + + /** + * color_index + */ + private Integer colorIndex; +} 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 new file mode 100644 index 00000000..1422ba4c --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java @@ -0,0 +1,21 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("t_credits_detail") +public class CreditsDetail extends BaseEntity { + /** 用户id */ + private Long accountId; + /** 积分变更事件 */ + private String changeEvent; + /** 变更积分 ( + 表示加,- 表示减) */ + private String changedCredits; + /** 当前积分 */ + private BigDecimal credits; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CustomerData.java b/src/main/java/com/ai/da/mapper/primary/entity/CustomerData.java new file mode 100644 index 00000000..0056e030 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CustomerData.java @@ -0,0 +1,23 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class CustomerData { + private String mbrCode; + private String mbrName; + private String mbrMobile; + private String mbrGroup; + private String mbrStatus; + private Date joinDate; + private String mbrIssue; + private int birthMonth; + private String mbrSex; + private double offBonus; + private double effBonus; + private double sumBonus; + + private double lastMonth; +} diff --git a/src/main/java/com/ai/da/mapper/entity/Design.java b/src/main/java/com/ai/da/mapper/primary/entity/Design.java similarity index 89% rename from src/main/java/com/ai/da/mapper/entity/Design.java rename to src/main/java/com/ai/da/mapper/primary/entity/Design.java index 8c990b6f..f891ab78 100644 --- a/src/main/java/com/ai/da/mapper/entity/Design.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Design.java @@ -1,73 +1,72 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -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.math.BigDecimal; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design") -public class Design implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - /** - * 模特id - */ - private Long templateId; - - private String modelType; - - /** - * system scale值 - */ - private BigDecimal systemScale; - - /** - * 控制生成类型的参数,两个选项:“overall”或“single” - */ - private String singleOverall; - - /** - * single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers - */ - private String switchCategory; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +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.math.BigDecimal; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design") +public class Design implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + /** + * 模特id + */ + private Long templateId; + + private String modelType; + + /** + * system scale值 + */ + private BigDecimal systemScale; + + /** + * 控制生成类型的参数,两个选项:“overall”或“single” + */ + private String singleOverall; + + /** + * single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers + */ + private String switchCategory; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignHistory.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignHistory.java similarity index 91% rename from src/main/java/com/ai/da/mapper/entity/DesignHistory.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignHistory.java index 87f11e7f..6d9af783 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignHistory.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignHistory.java @@ -1,55 +1,55 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design_history") -public class DesignHistory implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - - /** - * collectionId - */ - private Long collectionId; - - /** - * md5值 - */ - private String md5; - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_history") +public class DesignHistory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + + /** + * collectionId + */ + private Long collectionId; + + /** + * md5值 + */ + private String md5; + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItem.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItem.java similarity index 93% rename from src/main/java/com/ai/da/mapper/entity/DesignItem.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignItem.java index 7a47111b..f6532eea 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignItem.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItem.java @@ -1,75 +1,75 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design_item") -public class DesignItem implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - /** - * designId - */ - private Long designId; - - /** - * print scale值 - */ - private String printScale; - - /** - * design后的用户文件地址(python 返回) - */ - private String designUrl; - - /** - * 二次(高级,基础design的图再次design)design后的用户文件地址(python 返回) - */ - private String highDesignUrl; - /** - * 是否like 0 否 1是 - */ - @TableField("is_like") - private Byte hasLike; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_item") +public class DesignItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + /** + * designId + */ + private Long designId; + + /** + * print scale值 + */ + private String printScale; + + /** + * design后的用户文件地址(python 返回) + */ + private String designUrl; + + /** + * 二次(高级,基础design的图再次design)design后的用户文件地址(python 返回) + */ + private String highDesignUrl; + /** + * 是否like 0 否 1是 + */ + @TableField("is_like") + private Byte hasLike; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java similarity index 93% rename from src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java index f3a866b9..437a9264 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java @@ -1,106 +1,106 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design_item_detail") -public class DesignItemDetail implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - - /** - * designId - */ - private Long designId; - - /** - * designItemId - */ - private Long designItemId; - - /** - * elemntId - */ - private Long collectionElementId; - - /** - * 生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring Body - */ - private String type; - - /** - * 对应的图片的绝对路径 - */ - private String path; - - /** - * 颜色 存 RGB值 中间空格分隔 比如 "58 58 169" - */ - private String color; - - /** - * 对应的print图片的绝对路径 - */ - private String printPath; - - /** - * 对应的icon的绝对路径 - */ - private String iconPath; - - /** - * 对应上游业务id - */ - private Long businessId; - - /** - * 存储print打点的的参数json对象 - */ - private String printJson; - - /** - * item的优先级 - */ - private Integer priority; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - - /** - * 逻辑删除 1->删除 0->未删除 默认null - */ - private Byte isDeleted; -} +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_item_detail") +public class DesignItemDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + + /** + * designId + */ + private Long designId; + + /** + * designItemId + */ + private Long designItemId; + + /** + * elemntId + */ + private Long collectionElementId; + + /** + * 生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring Body + */ + private String type; + + /** + * 对应的图片的绝对路径 + */ + private String path; + + /** + * 颜色 存 RGB值 中间空格分隔 比如 "58 58 169" + */ + private String color; + + /** + * 对应的print图片的绝对路径 + */ + private String printPath; + + /** + * 对应的icon的绝对路径 + */ + private String iconPath; + + /** + * 对应上游业务id + */ + private Long businessId; + + /** + * 存储print打点的的参数json对象 + */ + private String printJson; + + /** + * item的优先级 + */ + private Integer priority; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + /** + * 逻辑删除 1->删除 0->未删除 默认null + */ + private Byte isDeleted; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItemDetailPrint.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/DesignItemDetailPrint.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java index be009476..e6800e69 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignItemDetailPrint.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Dressing.java b/src/main/java/com/ai/da/mapper/primary/entity/Dressing.java new file mode 100644 index 00000000..306d39bc --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Dressing.java @@ -0,0 +1,30 @@ +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.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("dressing") +public class Dressing implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String apparel; + private String styleCategory; + private String ageGroup; + private String position; + private Integer priority; + +} diff --git a/src/main/java/com/ai/da/mapper/entity/Generate.java b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java similarity index 87% rename from src/main/java/com/ai/da/mapper/entity/Generate.java rename to src/main/java/com/ai/da/mapper/primary/entity/Generate.java index 9fad23fb..d58d72ec 100644 --- a/src/main/java/com/ai/da/mapper/entity/Generate.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; @@ -37,10 +37,15 @@ public class Generate { */ private String level1Type; + /** + * 图片来源 collection | library + */ + private String elementSource; + /** * 关联collection element id */ - private Long collectionElementId; + private Long elementId; /** * caption的内容 diff --git a/src/main/java/com/ai/da/mapper/entity/GenerateCancel.java b/src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java similarity index 95% rename from src/main/java/com/ai/da/mapper/entity/GenerateCancel.java rename to src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java index 8726b9ed..efa0d7c9 100644 --- a/src/main/java/com/ai/da/mapper/entity/GenerateCancel.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/GenerateDetail.java similarity index 89% rename from src/main/java/com/ai/da/mapper/entity/GenerateDetail.java rename to src/main/java/com/ai/da/mapper/primary/entity/GenerateDetail.java index cce89e29..6cf9f0b3 100644 --- a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/GenerateDetail.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; @@ -8,6 +8,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.time.LocalDateTime; import java.util.Date; @Data @@ -50,7 +51,7 @@ public class GenerateDetail { /** * 创建时间 */ - private Date createDate; + private LocalDateTime createDate; /** * 更新时间 diff --git a/src/main/java/com/ai/da/mapper/entity/Library.java b/src/main/java/com/ai/da/mapper/primary/entity/Library.java similarity index 89% rename from src/main/java/com/ai/da/mapper/entity/Library.java rename to src/main/java/com/ai/da/mapper/primary/entity/Library.java index 5ed6f488..cc5250a4 100644 --- a/src/main/java/com/ai/da/mapper/entity/Library.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Library.java @@ -1,84 +1,83 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_library") -public class Library implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户ID - */ - private Long accountId; - - /** - * 一级类型 - */ - private String level1Type; - - /** - * 二级类型 - */ - private String level2Type; - - private String level3Type; - - /** - * 元素名 - */ - private String name; - - /** - * 元素存放地址 - */ - private String url; - /** - * md5值 - */ - private String md5; - /** - * 图片高度,目前只争对 models类型 - */ - private Integer high; - /** - * 图片宽度,目前只争对 models类型 - */ - private Integer width; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - -// private Integer isCopy; -} +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library") +public class Library implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + private String level3Type; + + /** + * 元素名 + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * md5值 + */ + private String md5; + /** + * 图片高度,目前只争对 models类型 + */ + private Integer high; + /** + * 图片宽度,目前只争对 models类型 + */ + private Integer width; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + +// private Integer isCopy; +} diff --git a/src/main/java/com/ai/da/mapper/entity/LibraryCopy.java b/src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java similarity index 95% rename from src/main/java/com/ai/da/mapper/entity/LibraryCopy.java rename to src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java index 99e5377f..42171cec 100644 --- a/src/main/java/com/ai/da/mapper/entity/LibraryCopy.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -45,7 +45,7 @@ public class LibraryCopy implements Serializable { */ private String level2Type; -// private String level3Type; + private String level3Type; /** * 元素名 diff --git a/src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPoint.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java rename to src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPoint.java index 01adf7b7..d3e1fbdf 100644 --- a/src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPoint.java @@ -1,81 +1,81 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-11-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_library_model_point") -public class LibraryModelPoint implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * modelType - */ - private String modelType; - - /** - * 关联的 library或sys Id - */ - private Long relationId; - - /** - * 左肩 - */ - private String shoulderLeft; - - /** - * 右肩 - */ - private String shoulderRight; - - /** - * 左腰 - */ - private String waistbandLeft; - - /** - * 右腰 - */ - private String waistbandRight; - /** - * 左手 - */ - private String handLeft; - - /** - * 右手 - */ - private String handRight; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library_model_point") +public class LibraryModelPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * modelType + */ + private String modelType; + + /** + * 关联的 library或sys Id + */ + private Long relationId; + + /** + * 左肩 + */ + private String shoulderLeft; + + /** + * 右肩 + */ + private String shoulderRight; + + /** + * 左腰 + */ + private String waistbandLeft; + + /** + * 右腰 + */ + private String waistbandRight; + /** + * 左手 + */ + private String handLeft; + + /** + * 右手 + */ + private String handRight; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/LibraryModelPointCopy.java b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/LibraryModelPointCopy.java rename to src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java index 01cb6901..a14b5579 100644 --- a/src/main/java/com/ai/da/mapper/entity/LibraryModelPointCopy.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -30,6 +30,11 @@ public class LibraryModelPointCopy implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Long id; + /** + * modelType + */ + private String modelType; + /** * 关联的 library或sys Id */ diff --git a/src/main/java/com/ai/da/mapper/entity/ObjectItem.java b/src/main/java/com/ai/da/mapper/primary/entity/ObjectItem.java similarity index 73% rename from src/main/java/com/ai/da/mapper/entity/ObjectItem.java rename to src/main/java/com/ai/da/mapper/primary/entity/ObjectItem.java index 80d33e2d..631d6db1 100644 --- a/src/main/java/com/ai/da/mapper/entity/ObjectItem.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ObjectItem.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java new file mode 100644 index 00000000..c3b0be10 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java @@ -0,0 +1,25 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_order_info") +public class OrderInfo extends BaseEntity{ + + private String title;//订单标题 + + private String orderNo;//商户订单编号 + + private Long accountId;//用户id + + private Long productId;//支付产品id + + private Integer totalFee;//订单金额(元) + + private String codeUrl;//订单二维码连接 + + private String orderStatus;//订单状态 + + private String paymentType;//支付方式 +} diff --git a/src/main/java/com/ai/da/mapper/entity/PanTone.java b/src/main/java/com/ai/da/mapper/primary/entity/PanTone.java similarity index 84% rename from src/main/java/com/ai/da/mapper/entity/PanTone.java rename to src/main/java/com/ai/da/mapper/primary/entity/PanTone.java index dc14ae1a..bc854838 100644 --- a/src/main/java/com/ai/da/mapper/entity/PanTone.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PanTone.java @@ -1,72 +1,70 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("pantone") -public class PanTone implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * pantone_index - */ - @TableId("pantone_index") - private Integer pantoneIndex; - - /** - * name - */ - private String name; - - /** - * TCX - */ - private String tcx; - - /** - * R - */ - private Integer r; - - /** - * G - */ - private Integer g; - - /** - * B - */ - private Integer b; - - /** - * H - */ - private Integer h; - - /** - * S - */ - private Integer s; - - /** - * V - */ - private Integer v; -} +package com.ai.da.mapper.primary.entity; + +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; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("pantone") +public class PanTone implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * pantone_index + */ + @TableId("pantone_index") + private Integer pantoneIndex; + + /** + * name + */ + private String name; + + /** + * TCX + */ + private String tcx; + + /** + * R + */ + private Integer r; + + /** + * G + */ + private Integer g; + + /** + * B + */ + private Integer b; + + /** + * H + */ + private Integer h; + + /** + * S + */ + private Integer s; + + /** + * V + */ + private Integer v; +} 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 new file mode 100644 index 00000000..8557aa83 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java @@ -0,0 +1,23 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_payment_info") +public class PaymentInfo extends BaseEntity{ + + private String orderNo;//商品订单编号 + + private String transactionId;//支付系统交易编号 + + private String paymentType;//支付类型 + + private String tradeType;//交易类型 + + private String tradeState;//交易状态 + + private Integer payerTotal;//支付金额(分) + + private String content;//通知参数 +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Product.java b/src/main/java/com/ai/da/mapper/primary/entity/Product.java new file mode 100644 index 00000000..ddea327e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Product.java @@ -0,0 +1,15 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_product") +public class Product extends BaseEntity{ + + private String title; //商品名称 + + private Integer price; //价格(分) + + private Integer credits; // 积分 +} diff --git a/src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/PythonTAllInfo.java similarity index 97% rename from src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java rename to src/main/java/com/ai/da/mapper/primary/entity/PythonTAllInfo.java index ae16fdd8..40f89ff2 100644 --- a/src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PythonTAllInfo.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java new file mode 100644 index 00000000..19719a98 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java @@ -0,0 +1,27 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_refund_info") +public class RefundInfo extends BaseEntity{ + + private String orderNo;//商品订单编号 + + private String refundNo;//退款单编号 + + private String refundId;//支付系统退款单号(微信) + + private Integer totalFee;//原订单金额(分) + + private Integer refund;//退款金额(分) + + private String reason;//退款原因 + + private String refundStatus;//退款单状态 + + private String contentReturn;//申请退款返回参数 + + private String contentNotify;//退款结果通知参数 +} diff --git a/src/main/java/com/ai/da/mapper/entity/Sketches.java b/src/main/java/com/ai/da/mapper/primary/entity/Sketches.java similarity index 78% rename from src/main/java/com/ai/da/mapper/entity/Sketches.java rename to src/main/java/com/ai/da/mapper/primary/entity/Sketches.java index a3fb57b4..a6bc9460 100644 --- a/src/main/java/com/ai/da/mapper/entity/Sketches.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Sketches.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/entity/SketchesBoundingBox.java b/src/main/java/com/ai/da/mapper/primary/entity/SketchesBoundingBox.java similarity index 75% rename from src/main/java/com/ai/da/mapper/entity/SketchesBoundingBox.java rename to src/main/java/com/ai/da/mapper/primary/entity/SketchesBoundingBox.java index 24c5b1df..6c687e25 100644 --- a/src/main/java/com/ai/da/mapper/entity/SketchesBoundingBox.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/SketchesBoundingBox.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/entity/SysFile.java b/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java similarity index 93% rename from src/main/java/com/ai/da/mapper/entity/SysFile.java rename to src/main/java/com/ai/da/mapper/primary/entity/SysFile.java index f4977130..24466611 100644 --- a/src/main/java/com/ai/da/mapper/entity/SysFile.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java @@ -1,81 +1,81 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_sys_file") -public class SysFile implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 一级类型 accessories icon Images - */ - private String level1Type; - - /** - * 二级类型 目前有outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring - */ - private String level2Type; - - private String level3Type; - - /** - * 名字 - */ - private String name; - - /** - * md5值 - */ - private String md5; - - /** - * 路径 绝对路径 - */ - private String url; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - - public SysFile() { - } - - public SysFile(String level1Type, String level2Type, String name, String md5, String url, Date createDate) { - this.level1Type = level1Type; - this.level2Type = level2Type; - this.name = name; - this.md5 = md5; - this.url = url; - this.createDate = createDate; - } -} +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.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_sys_file") +public class SysFile implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 一级类型 accessories icon Images + */ + private String level1Type; + + /** + * 二级类型 目前有outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring + */ + private String level2Type; + + private String level3Type; + + /** + * 名字 + */ + private String name; + + /** + * md5值 + */ + private String md5; + + /** + * 路径 绝对路径 + */ + private String url; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + public SysFile() { + } + + public SysFile(String level1Type, String level2Type, String name, String md5, String url, Date createDate) { + this.level1Type = level1Type; + this.level2Type = level2Type; + this.name = name; + this.md5 = md5; + this.url = url; + this.createDate = createDate; + } +} diff --git a/src/main/java/com/ai/da/mapper/entity/TCollectionElementRelation.java b/src/main/java/com/ai/da/mapper/primary/entity/TCollectionElementRelation.java similarity index 94% rename from src/main/java/com/ai/da/mapper/entity/TCollectionElementRelation.java rename to src/main/java/com/ai/da/mapper/primary/entity/TCollectionElementRelation.java index cb6dbbcd..dac90348 100644 --- a/src/main/java/com/ai/da/mapper/entity/TCollectionElementRelation.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TCollectionElementRelation.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; @@ -7,7 +7,6 @@ import lombok.*; import lombok.experimental.Accessors; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; diff --git a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfit.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java rename to src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfit.java index 8fe281a6..e08f19bc 100644 --- a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfit.java @@ -1,5 +1,5 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -8,7 +8,6 @@ import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; -import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfitDetail.java similarity index 97% rename from src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java rename to src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfitDetail.java index f49ea93e..3d69de8e 100644 --- a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfitDetail.java @@ -1,5 +1,5 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -8,7 +8,6 @@ import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; -import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/TaskList.java b/src/main/java/com/ai/da/mapper/primary/entity/TaskList.java new file mode 100644 index 00000000..81797448 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/TaskList.java @@ -0,0 +1,27 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("t_task_list") +public class TaskList extends BaseEntity{ + + private Long accountId; + + private String taskType; + + private String inputUrl; + + private Integer scale; + + /* 可选状态 : 成功:success 失败:fail */ + private String status; + + private String outputUrl; + + private String taskId; + +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/TransactionData.java b/src/main/java/com/ai/da/mapper/primary/entity/TransactionData.java new file mode 100644 index 00000000..8209be65 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/TransactionData.java @@ -0,0 +1,149 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +import java.sql.Date; +import java.sql.Timestamp; + +@Data +public class TransactionData { + private String trxNo; + private Timestamp trxDate; + private String trxType; + private String trxStatus; + private double trxTotQty; + private String currCode; + private double exchRate; + private double discountPerc; + private double trxAccAmt; + private double trxBasAmt; + private double outstandAmt; + private double receiveAmt; + private double changeAmt; + private double trxTotBonus; + private String depositNo; + private double depositAmt; + private String depositStatus; + private String trxAmtDesc; + private String remark; + private String shCode; + private String whCodeFrom; + private String whCodeTo; + private String issuedBy; + private String clientCode; + private String clientName; + private String salesmanCode; + private String ctypeCode; + private Timestamp updatedOn; + private String docType; + private String refNo; + private String adjType; + private String refType; + private String orderNo; + private String recoverF; + private String recoverT; + private String requestBy; + private String error; + private Timestamp authorizedDate; + private String authorizedBy; + private String changeCurrCode; + private double chgRate; + private String cashier; + private String cashiNo; + private String salesmanCode2; + private String classId; + private double disAmt; + private String acStatus; + private String reprint; + private String alt1; + private String alt2; + private String alt3; + private String alt4; + private String alt5; + private Date altD1; + private Date altD2; + private Date altD3; + private Date altD4; + private Date altD5; + private String salesmanCode3; + private String contractNo; + private Timestamp expireDate; + private double depositNetAmt; + private String clientRestriction; + private String refStatus; + private double mbrDis; + private double pmtDiscount; + private double pmtAmount; + private String pmtNo; + private String refCode; + private String docApproved; + private String refractionNo; + private double ccpTot; + private double ccpRed; + private double ccpExpired; + private int printedTimes; + private String pickupShop; + private Date deliveryDate; + private String deliveryTime; + private String wsCode; + private String clCode; + private String clDesc; + private String ratio; + private String userMember; + private String hflag; + private String issueShop; + private String hoUpdBy; + private Timestamp hoUpdOn; + private double bonusExpired; + private double bonusRed; + private Timestamp confirmedOn; + private String confirmedBy; + private String docConfirmed; + private String brNo; + private double changeAmt2; + private Date salesDate; + private String mbrName; + private String canEntryDis; + private String reactiveClient; + private String reactiveMbr; + private String shUpdBy; + private Timestamp shUpdOn; + private double tax1; + private double tax2; + private double tax3; + private double tax4; + private double tax5; + private String altChar1; + private String altChar2; + private String altChar3; + private String altChar4; + private String altChar5; + private double altNum1; + private double altNum2; + private double altNum3; + private double altNum4; + private double altNum5; + private String newClient; + private String newMbr; + private double pmtExtraDiscount; + private double pmtExtraAmount; + private double manualDiscount; + private double manualAmount; + private double usermbrDiscount; + private double clientDiscount; + private String holdVoid; + private double payBasAmt; + private String payDesc; + private String payCode; + private String cardNo; + private String payCurr; + private double payCurrAmt; + private String onbehalfPaid; + private String onbehalfLoc; + private String oldCardNo; + private int trxYear; + private int trxMonth; + + private double sumAmt; +} + diff --git a/src/main/java/com/ai/da/mapper/entity/TrialOrder.java b/src/main/java/com/ai/da/mapper/primary/entity/TrialOrder.java similarity index 93% rename from src/main/java/com/ai/da/mapper/entity/TrialOrder.java rename to src/main/java/com/ai/da/mapper/primary/entity/TrialOrder.java index 72183c97..0e908b59 100644 --- a/src/main/java/com/ai/da/mapper/entity/TrialOrder.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TrialOrder.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -10,7 +10,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Date; + @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @@ -25,7 +25,7 @@ public class TrialOrder implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Long id; - @ApiModelProperty("surname") + @ApiModelProperty("title") private String title; @ApiModelProperty("surname") diff --git a/src/main/java/com/ai/da/mapper/entity/UserLike.java b/src/main/java/com/ai/da/mapper/primary/entity/UserLike.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/UserLike.java rename to src/main/java/com/ai/da/mapper/primary/entity/UserLike.java index c35ed12f..61a4deee 100644 --- a/src/main/java/com/ai/da/mapper/entity/UserLike.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/UserLike.java @@ -1,62 +1,62 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * UserLikeGroup - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_user_like") -public class UserLike implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 关联的用户收藏分组 ID - */ - private Long userLikeGroupId; - /** - * 关联的design ID - */ - private Long designId; - /** - * 关联的design_item ID - */ - private Long designItemId; - /** - * 关联的design_python_outfit ID - */ - private Long designOutfitId; - /** - * 图片地址 - */ - private String url; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +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.util.Date; + +/** + * UserLikeGroup + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_user_like") +public class UserLike implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 关联的用户收藏分组 ID + */ + private Long userLikeGroupId; + /** + * 关联的design ID + */ + private Long designId; + /** + * 关联的design_item ID + */ + private Long designItemId; + /** + * 关联的design_python_outfit ID + */ + private Long designOutfitId; + /** + * 图片地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java rename to src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java index 496cf9ab..2aa8cc0e 100644 --- a/src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java @@ -1,55 +1,55 @@ -package com.ai.da.mapper.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.util.Date; - -/** - * UserLikeGroup - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_user_like_group") -public class UserLikeGroup implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - - /** - * 用户收藏分组表 - */ - private String name; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +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.util.Date; + +/** + * UserLikeGroup + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_user_like_group") +public class UserLikeGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + + /** + * 用户收藏分组表 + */ + private String name; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/Workspace.java b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/Workspace.java rename to src/main/java/com/ai/da/mapper/primary/entity/Workspace.java index 16e520a1..2fe6fe9e 100644 --- a/src/main/java/com/ai/da/mapper/entity/Workspace.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java @@ -1,17 +1,14 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.*; import java.time.LocalDateTime; import java.io.Serializable; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import org.springframework.format.annotation.DateTimeFormat; /** * 实体类 @@ -38,10 +35,15 @@ public class Workspace implements Serializable { @ApiModelProperty(value = "工作空间名称") private String workSpaceName; /** - * 用户ID + * 用户名 */ @ApiModelProperty(value = "用户名") private String userName; + /** + * 用户ID + */ + @ApiModelProperty(value = "用户ID") + private Long accountId; /** * 性别 */ diff --git a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java new file mode 100644 index 00000000..cd657a7e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java @@ -0,0 +1,25 @@ +package com.ai.da.mapper.secondary; + +import com.ai.da.mapper.secondary.entity.AttributeRetrieval; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ + +@Mapper +public interface AttributeRetrievalMapper { + + + List getSystemSketchPool(@Param("attributeRetrievalAttrDict") AttributeRetrieval attributeRetrievalAttrDict, @Param("tableName") String tableName, @Param("poolNum") int poolNum); + + AttributeRetrieval getSystemRandom(String tableName); + + List getSystemSketchPoolBySameCategory(AttributeRetrieval attributeRetrievalAttrDict, String tableName); +} diff --git a/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRecognitionJSON.java b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRecognitionJSON.java new file mode 100644 index 00000000..a04f4e4b --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRecognitionJSON.java @@ -0,0 +1,22 @@ +package com.ai.da.mapper.secondary.entity; + +import lombok.Data; + +import java.util.List; + +@Data +public class AttributeRecognitionJSON { + private Long id; + private List imgName; + private List length; + private List sleeveLength; + private List sleeveShape; + private List sleeveShoulder; + private List neckline; + private List collar; + private List design; + private List silhouette; + private List type; + private List openingType; + private List subtype; +} 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 new file mode 100644 index 00000000..c8611586 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java @@ -0,0 +1,24 @@ +package com.ai.da.mapper.secondary.entity; + +import lombok.Data; + +@Data +public class AttributeRetrieval { + private Long id; + private String imgName; + private String length; + private String sleeveLength; + private String sleeveShape; + private String sleeveShoulder; + private String neckline; + private String collar; + private String design; + private String silhouette; + private String type; + private String openingType; + private String subtype; + + private String sleeve; + private String sleeve1; + private String sleeve2; +} diff --git a/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java b/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java index 49d59692..700426a2 100644 --- a/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java +++ b/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java @@ -1,8 +1,7 @@ package com.ai.da.model.dto; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.TrialOrder; import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/ai/da/model/dto/AlipayHKParametersDTO.java b/src/main/java/com/ai/da/model/dto/AlipayHKParametersDTO.java new file mode 100644 index 00000000..69d38a2e --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AlipayHKParametersDTO.java @@ -0,0 +1,18 @@ +package com.ai.da.model.dto; + +import lombok.*; + +import java.util.HashMap; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AlipayHKParametersDTO { + + private String request_uuid; + private String request_time; + private String service; + private String merchant_id; + private HashMap parameters; + +} diff --git a/src/main/java/com/ai/da/model/dto/AlipayHKRequestDTO.java b/src/main/java/com/ai/da/model/dto/AlipayHKRequestDTO.java new file mode 100644 index 00000000..005fa9dd --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AlipayHKRequestDTO.java @@ -0,0 +1,24 @@ +package com.ai.da.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AlipayHKRequestDTO implements Serializable { + + private String merchant_id; + + private String nonce; + + private String message; + + private String tag; + + private String cipher_suite; + +} diff --git a/src/main/java/com/ai/da/model/dto/AlipayHKResponseDTO.java b/src/main/java/com/ai/da/model/dto/AlipayHKResponseDTO.java new file mode 100644 index 00000000..a6bd9953 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AlipayHKResponseDTO.java @@ -0,0 +1,22 @@ +package com.ai.da.model.dto; + +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AlipayHKResponseDTO { + + private boolean success; + + private String reference_id; + + private JSONObject result; + + private String error; + + private String error_code; +} diff --git a/src/main/java/com/ai/da/model/dto/ClassificationDTO.java b/src/main/java/com/ai/da/model/dto/ClassificationDTO.java index 22abc61d..8a24260c 100644 --- a/src/main/java/com/ai/da/model/dto/ClassificationDTO.java +++ b/src/main/java/com/ai/da/model/dto/ClassificationDTO.java @@ -1,6 +1,6 @@ package com.ai.da.model.dto; -import com.ai.da.mapper.entity.Classification; +import com.ai.da.mapper.primary.entity.Classification; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java index 76161990..b2b5828d 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java @@ -26,6 +26,9 @@ public class DesignSingleIncludeLayersDTO { @ApiModelProperty("进度") private String processId; + @ApiModelProperty("性别") + private String gender; + @NotBlank(message = "timeZone.cannot.be.empty") @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") private String timeZone; 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 a21cb699..099708e5 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; @@ -14,6 +15,14 @@ public class DesignSingleItemDTO { @ApiModelProperty("切换图片对应的id") private Long id; + @NotEmpty(message = "changed cannot be empty") + @ApiModelProperty("当前服装的id是否被添加随机数") + private Boolean changed; + + @NotBlank(message = "designType cannot be empty") + @ApiModelProperty("当前图片来源于用户上传还是从library选择 Collection/Library") + private String designType; + @NotBlank(message = "type.cannot.be.empty") @ApiModelProperty("生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring") private String type; @@ -38,4 +47,10 @@ public class DesignSingleItemDTO { @NotNull(message = "priority.cannot.be.empty") @ApiModelProperty("图层优先级") private Integer priority; + +// @ApiModelProperty("渐变 起始/目标 颜色") +// private List> gradient; +// +// @ApiModelProperty("渐变角度") +// private Float gradient_angle; } 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 1adfdbef..602f1886 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java @@ -24,7 +24,6 @@ public class GenerateThroughImageTextDTO { @ApiModelProperty("text image text-image") String generateType; - /** 暂时没有用上 */ @ApiModelProperty("图片是update,还是从library中选择") String designType; @@ -48,6 +47,7 @@ public class GenerateThroughImageTextDTO { @ApiModelProperty("唯一id,用于保持消息唯一性") String uniqueId; + @NotNull(message = "Please check if the required fields are empty.(isTestUser)") @ApiModelProperty("是否是测试用户") Boolean isTestUser; } 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 927fff70..c08a5f90 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java @@ -6,22 +6,32 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor -@AllArgsConstructor +//@AllArgsConstructor public class GenerateToPythonDTO { - - private Long user_id; + // 去掉 +// private Long user_id; private String image_url; private String category; + // 改为prompt +// private String content; + private String prompt; - private String content; - - private Integer mode; - - private String version; - + private String mode; + // 去除 +// private String version; + // 去掉 private String gender; - + // taskId的最后拼接用户id private String tasks_id; + + public GenerateToPythonDTO(String tasks_id, String prompt, String image_url, String mode, String category, String gender) { + this.image_url = image_url; + this.category = category; + this.prompt = prompt; + this.mode = mode; + this.tasks_id = tasks_id; + this.gender = gender; + } } diff --git a/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java b/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java index 00163d18..22eefcf9 100644 --- a/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java +++ b/src/main/java/com/ai/da/model/dto/QueryHistoryPageDTO.java @@ -7,6 +7,7 @@ import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.util.List; @Data @ApiModel("History分页查询") @@ -20,4 +21,9 @@ public class QueryHistoryPageDTO extends PageQueryBaseVo { @ApiModelProperty("开始时间 时间戳") private Long endDate; + + private List classificationIdList; + + @ApiModelProperty("1交集2并集") + private Integer intersection; } diff --git a/src/main/java/com/ai/da/model/dto/QueryIncomeOrExpenditureDTO.java b/src/main/java/com/ai/da/model/dto/QueryIncomeOrExpenditureDTO.java new file mode 100644 index 00000000..748d6108 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryIncomeOrExpenditureDTO.java @@ -0,0 +1,13 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("查积分的收支详情") +public class QueryIncomeOrExpenditureDTO extends QueryPageByTimeDTO{ + + private Boolean isIncome; +} diff --git a/src/main/java/com/ai/da/model/dto/QueryPageByTimeDTO.java b/src/main/java/com/ai/da/model/dto/QueryPageByTimeDTO.java new file mode 100644 index 00000000..c0c37a98 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryPageByTimeDTO.java @@ -0,0 +1,19 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("分页查询,限制时间区间") +public class QueryPageByTimeDTO extends PageQueryBaseVo { + + @ApiModelProperty("开始时间 yyyy-mm-dd hh:mm:ss 可以不要时分秒") + private String startTime; + + @ApiModelProperty("结束时间 yyyy-mm-dd hh:mm:ss 可以不要时分秒") + private String endTime; +} diff --git a/src/main/java/com/ai/da/model/dto/QueryTaskHistoryDTO.java b/src/main/java/com/ai/da/model/dto/QueryTaskHistoryDTO.java new file mode 100644 index 00000000..db8dbc69 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryTaskHistoryDTO.java @@ -0,0 +1,18 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("按分类分页查询历史任务") +public class QueryTaskHistoryDTO extends QueryPageByTimeDTO { + + @NotEmpty(message = "type cannot be empty") + @ApiModelProperty("可选类型 : SR") + private String type; +} diff --git a/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java b/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java new file mode 100644 index 00000000..36b15ce6 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java @@ -0,0 +1,25 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SuperResolutionDTO { + + @NotBlank(message = "You have to select at least one image") + @ApiModelProperty("图片") + private String images; + + @NotBlank(message = "You must choose the magnification") + @ApiModelProperty("放大倍数") + private Integer scale; + + @ApiModelProperty("唯一id,用于保持消息唯一性") + private String uniqueId; +} diff --git a/src/main/java/com/ai/da/model/dto/TaskDTO.java b/src/main/java/com/ai/da/model/dto/TaskDTO.java new file mode 100644 index 00000000..83b3c7fa --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/TaskDTO.java @@ -0,0 +1,46 @@ +package com.ai.da.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TaskDTO { + + private String taskId; + + // 可选type : SR GENERATE + private String type; + + // 输入的图片名 + private String imageName; + + private T inputParam; + + private String outputImage; + + // 任务状态,暂定状态:排队中、执行中、成功/失败 + private String status; + + // 当前任务的创建时间 + private String createDate; + + public TaskDTO(String taskId, String type, String imageName, T inputParam, String status, String createDate) { + this.taskId = taskId; + this.type = type; + this.imageName = imageName; + this.inputParam = inputParam; + this.status = status; + this.createDate = createDate; + } + + public TaskDTO(String taskId, String type, T inputParam, String status, String createDate) { + this.taskId = taskId; + this.type = type; + this.inputParam = inputParam; + this.status = status; + this.createDate = createDate; + } +} diff --git a/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java b/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java index 25bd7038..b0713077 100644 --- a/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java +++ b/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java @@ -7,11 +7,25 @@ public class UserDesignStatisticDTO { private Long accountId; - private Long useDesignTimes; + private Long designTimes; private String userEmail; private String userName; private String isTrial; + + private String trialOrderId; + + private String title; + + private String surname; + + private String givenName; + + private String country; + + private String occupation; + + private String createTime; } diff --git a/src/main/java/com/ai/da/model/dto/WebhookVerifyDTO.java b/src/main/java/com/ai/da/model/dto/WebhookVerifyDTO.java new file mode 100644 index 00000000..4bcbc352 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/WebhookVerifyDTO.java @@ -0,0 +1,35 @@ +package com.ai.da.model.dto; + +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WebhookVerifyDTO implements Serializable { + + private String transmission_id; + private String transmission_time; + private String cert_url; + private String auth_algo; + private String transmission_sig; + private String webhook_id; + private Object webhook_event; + +} + + + + + + + + + diff --git a/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java b/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java index 68c33673..4ffe191c 100644 --- a/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java +++ b/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java @@ -1,7 +1,6 @@ package com.ai.da.model.dto; -import com.ai.da.mapper.entity.Workspace; import com.ai.da.model.vo.PageQueryBaseVo; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/ai/da/model/vo/ChatRobotVO.java b/src/main/java/com/ai/da/model/vo/ChatRobotVO.java index 9ef86aa7..05b2ee43 100644 --- a/src/main/java/com/ai/da/model/vo/ChatRobotVO.java +++ b/src/main/java/com/ai/da/model/vo/ChatRobotVO.java @@ -1,6 +1,6 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.ChatRobot; +import com.ai.da.mapper.primary.entity.ChatRobot; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/ai/da/model/vo/ClassificationVO.java b/src/main/java/com/ai/da/model/vo/ClassificationVO.java index 88506041..1bb7062a 100644 --- a/src/main/java/com/ai/da/model/vo/ClassificationVO.java +++ b/src/main/java/com/ai/da/model/vo/ClassificationVO.java @@ -1,6 +1,6 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.Classification; +import com.ai.da.mapper.primary.entity.Classification; import lombok.Data; import lombok.EqualsAndHashCode; 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 70ca7b46..2b5c3667 100644 --- a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java @@ -17,6 +17,12 @@ public class DesignItemClothesDetailVO { @ApiModelProperty("对应的上游id") private Long id; + @ApiModelProperty("该id末尾是否被加了随机数") + private Boolean changed; + + @ApiModelProperty("该图片来源 Collection / Library") + private String designType; + @ApiModelProperty("对应的类型 有:Outwear,Dress,Blouse,Skirt,Trousers Shoes Hairstyle Earring Body") private String type; 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 94575022..54818442 100644 --- a/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java +++ b/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java @@ -12,6 +12,9 @@ import java.util.List; @ApiModel("design single 印花详情") public class DesignSinglePrint { + @ApiModelProperty("印花是用户上传的还是从library中选的 collection/library") + private String designType; + @ApiModelProperty("印花url") private String path; diff --git a/src/main/java/com/ai/da/model/vo/GenerateResultVO.java b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java new file mode 100644 index 00000000..4a5f1453 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java @@ -0,0 +1,36 @@ +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 GenerateResultVO { + + private String taskId; + + private Long id; + + private String url; + + private String status; + + private String category; + + public GenerateResultVO(String taskId, Long id, String url, String status) { + this.taskId = taskId; + this.id = id; + this.url = url; + this.status = status; + } + + public GenerateResultVO(Long id, String url, String status) { + this.id = id; + this.url = url; + this.status = status; + } +} diff --git a/src/main/java/com/ai/da/model/vo/PrepareForGenerateVO.java b/src/main/java/com/ai/da/model/vo/PrepareForGenerateVO.java index 438d94db..78c7260c 100644 --- a/src/main/java/com/ai/da/model/vo/PrepareForGenerateVO.java +++ b/src/main/java/com/ai/da/model/vo/PrepareForGenerateVO.java @@ -4,17 +4,19 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data @ApiModel("prepare for generate响应vo") public class PrepareForGenerateVO { @ApiModelProperty("uniqueId") - private String uniqueId; + private List uniqueId; @ApiModelProperty("剩余使用次数") private Integer leftUsageCount; - public PrepareForGenerateVO(String uniqueId, Integer leftUsageCount) { + public PrepareForGenerateVO(List uniqueId, Integer leftUsageCount) { this.uniqueId = uniqueId; this.leftUsageCount = leftUsageCount; } diff --git a/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java index eca67503..eaff197f 100644 --- a/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java +++ b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java @@ -23,6 +23,9 @@ public class QueryLibraryPageVO { @ApiModelProperty("二级类型") private String level2Type; + @ApiModelProperty("三级类型") + private String level3Type; + @ApiModelProperty("design类型 用户design生成时候区别library和collection") private String designType; diff --git a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java index 028e7ba8..72c28642 100644 --- a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java @@ -1,7 +1,7 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java index 8afb8629..065d963b 100644 --- a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java +++ b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java @@ -2,7 +2,7 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/com/ai/da/model/vo/TaskVO.java b/src/main/java/com/ai/da/model/vo/TaskVO.java new file mode 100644 index 00000000..1c0a3f63 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/TaskVO.java @@ -0,0 +1,22 @@ +package com.ai.da.model.vo; + +import lombok.Data; + +@Data +public class TaskVO { + + // 图片名 + private String imageName; + + private String inputImage; + + private String outputImage; + + private String otherInput; + + private String status; + + private String taskId; + + private String createDate; +} 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 cceef691..563c4ab1 100644 --- a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java +++ b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java @@ -1,6 +1,6 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.primary.entity.CollectionElement; import com.ai.da.model.dto.CollectionColorDTO; import com.ai.da.python.vo.DesignPythonItemPrint; import com.google.common.collect.Lists; 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 209563f2..378014d9 100644 --- a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java +++ b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java @@ -2,12 +2,8 @@ package com.ai.da.model.vo; import com.ai.da.common.response.PageBaseResponse; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.enums.BizJson; -import com.ai.da.model.enums.FemalePosition; -import com.ai.da.model.enums.Position; -import com.ai.da.model.enums.Sex; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index b4f8e847..eaa1c786 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -6,8 +6,15 @@ import com.ai.da.common.config.FileProperties; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.*; import com.ai.da.common.utils.*; -import com.ai.da.mapper.entity.CollectionElement; -import com.ai.da.mapper.entity.DesignHistory; +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.secondary.AttributeRetrievalMapper; +import com.ai.da.mapper.secondary.entity.AttributeRetrieval; +import com.ai.da.mapper.secondary.entity.AttributeRecognitionJSON; import com.ai.da.model.dto.*; import com.ai.da.model.enums.MalePosition; import com.ai.da.model.enums.Sex; @@ -21,6 +28,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; @@ -37,6 +45,7 @@ import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.net.HttpURLConnection; import java.util.*; import java.util.concurrent.TimeUnit; @@ -56,6 +65,8 @@ public class PythonService { private String accessPythonIp; @Value("${access.python.port:''}") private String accessPythonPort; + @Value("${access.python.sr}") + private String srPythonPort; @Resource private PythonTAllInfoService pythonTAllInfoService; @@ -208,50 +219,25 @@ public class PythonService { public DesignPythonObjects covertDesignParam(BigDecimal systemScale, String singleOverall, String switchCategory, ValidateElementVO elementVO, String processId) { DesignPythonObjects designPythonObjects = new DesignPythonObjects(); - List objects = Lists.newArrayList(); + List objects = new ArrayList<>(); designPythonObjects.setObjects(objects); designPythonObjects.setProcess_id(processId); + long pinPrintNum = calculateDesignPinPrintNum(elementVO.getPrintBoardElements()); long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements()); - //没有print的 long noPrintNum = 8 - pinPrintNum - noPinPrintNum; elementVO.setNoPinPrintNum(noPinPrintNum); - //系统比列 - BigDecimal sysRatio = systemScale; - int pinPictureNum = calculatePinPictureNum(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); - int sysPictureNum = calculateSysPictureNum(sysRatio, pinPictureNum); - int userPictureNum = calculateUserLibraryPictureNum(sysPictureNum, pinPictureNum); - int noPinPictureNum = 8 - pinPictureNum - sysPictureNum - userPictureNum; + int[] sketchNumbers = new int[3]; for (int i = 0; i < 8; i++) { - //sketch计算 - CurrentDesignPictureTypeEnum designPictureType = - calculateCurrentDesignPictureType(pinPictureNum, sysPictureNum, userPictureNum, noPinPictureNum); - if (Objects.isNull(designPictureType)) { - break; - } - switch (designPictureType) { - case PIN: - pinPictureNum--; - break; - case USER_LIBRARY: - userPictureNum--; - break; - case SYS_FILE: - sysPictureNum--; - break; - case NO_PIN: - noPinPictureNum--; - break; - default: - } - //print计算 - CurrentDesignPrintPictureTypeEnum designPrintPictureType = - calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); - if (Objects.isNull(designPrintPictureType)) { - break; - } + CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, sketchNumbers, systemScale); + if (designPictureType == null) break; + + CurrentDesignPrintPictureTypeEnum designPrintPictureType = calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); + if (designPrintPictureType == null) break; + + updateSketchNumbers(designPictureType, sketchNumbers); switch (designPrintPictureType) { case PIN: pinPrintNum--; @@ -262,38 +248,121 @@ public class PythonService { case NO: noPrintNum--; break; - default: } - //确定本次designSingle是否print +// updatePrintNumbers(designPrintPictureType, pinPrintNum, noPinPrintNum, noPrintNum); + DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); elementVO.setDesignPythonItemPrint(designPythonItemPrint); - //参数透传 确定本次designSingle如果需要print对应的种类 elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex())); - //designSingle具体参数组装 - DesignPythonObject pythonObject = new DesignPythonObject(); - pythonObject.setItems(coverToDesignPythonItem(elementVO, designPictureType)); - pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), - singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); + + DesignPythonObject pythonObject = createDesignPythonObject(elementVO, designPictureType, systemScale, singleOverall, switchCategory); objects.add(pythonObject); } return designPythonObjects; } + private void updateSketchNumbers(CurrentDesignPictureTypeEnum designPictureType, int[] sketchNumbers) { + switch (designPictureType) { + case PIN: + sketchNumbers[0] ++; + break; + case NO_PIN: + sketchNumbers[2] --; + break; + case SYS_FILE: + sketchNumbers[1] --; + break; + } + } + + private void updatePrintNumbers(CurrentDesignPrintPictureTypeEnum designPrintPictureType, long pinPrintNum, long noPinPrintNum, long noPrintNum) { + switch (designPrintPictureType) { + case PIN: + pinPrintNum--; + break; + case NO_PIN: + noPinPrintNum--; + break; + case NO: + noPrintNum--; + break; + } + } + + private DesignPythonObject createDesignPythonObject(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale, String singleOverall, String switchCategory) { + DesignPythonObject pythonObject = new DesignPythonObject(); + pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale)); + pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); + return pythonObject; + } + + + private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int[] sketchNumbers, BigDecimal systemScale) { + List pinData = getPinData(elementVO); + if (CollectionUtil.isNotEmpty(pinData)) { + return CurrentDesignPictureTypeEnum.PIN; + } else { + if (sketchNumbers[1] == 0 && sketchNumbers[2] == 0) { + sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(8 - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + sketchNumbers[2] = 8 - sketchNumbers[0] - sketchNumbers[1]; + } + if (sketchNumbers[2] > 0 && sketchNumbers[1] > 0) { + Long l = RandomsUtil.randomSysFile(0l, 2l); + if (l == 0l) { + return CurrentDesignPictureTypeEnum.NO_PIN; + }else { + return CurrentDesignPictureTypeEnum.SYS_FILE; + } + } + if (sketchNumbers[2] > 0) { + return CurrentDesignPictureTypeEnum.NO_PIN; + } + return CurrentDesignPictureTypeEnum.SYS_FILE; + } + } + + private int calculateNoPinSketchNum(int pinSketchNum, int sysSketchNum) { + return 8 - pinSketchNum - sysSketchNum; + } + + private int calculateSysSketchNum(BigDecimal sysRatio, int pinSketchNum) { + // Calculate sysRatio * (8 - pinSketchNum) + BigDecimal result = sysRatio.multiply(BigDecimal.valueOf(8 - pinSketchNum)); + + // Round the result to the nearest integer using half-up rounding + + return result.setScale(0, RoundingMode.HALF_UP).intValue(); + } + +// private int calculatePinSketchNum(List sketchBoardElements, List hasUseMd5List) { +// List pinData = getPinData(sketchBoardElements, hasUseMd5List); +// if (CollectionUtil.isEmpty(pinData)) { +// return 0; +// } +//// long topNum = sketchBoardElements.stream() +//// .filter(skecth -> skecth.getHasPin() == 1 +//// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); +//// long bottomNum = sketchBoardElements.stream() +//// .filter(skecth -> skecth.getHasPin() == 1 +//// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); +//// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); +// int num = pinData.size(); +// return Math.min(num, 8); +// } + //计算当前的图片类型 - private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinPictureNum, int sysPictureNum, int userPictureNum, int noPinPictureNum) { + private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinSketchNum, int sysSketchNum, int noPinSketchNum) { List codes = Lists.newArrayList(); - if (pinPictureNum > 0) { + if (pinSketchNum > 0) { //pin默认优先选择 不参与计算 后续有调整再说 // codes.add(pinPictureNum); return CurrentDesignPictureTypeEnum.PIN; } - if (sysPictureNum > 0) { + if (sysSketchNum > 0) { codes.add(CurrentDesignPictureTypeEnum.SYS_FILE.getCode()); } - if (userPictureNum > 0) { - codes.add(CurrentDesignPictureTypeEnum.USER_LIBRARY.getCode()); - } - if (noPinPictureNum > 0) { + + if (noPinSketchNum > 0) { codes.add(CurrentDesignPictureTypeEnum.NO_PIN.getCode()); } List pictureTypeEnums = CurrentDesignPictureTypeEnum.ofList(codes); @@ -331,23 +400,23 @@ public class PythonService { } //计算Pin图片张数 - private int calculatePinPictureNum(List sketchBoardElements, List hasUseMd5List) { - List pinData = getPinData(sketchBoardElements, hasUseMd5List); - if (CollectionUtil.isEmpty(pinData)) { - return 0; - } - long topNum = sketchBoardElements.stream() - .filter(skecth -> skecth.getHasPin() == 1 - && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); - long bottomNum = sketchBoardElements.stream() - .filter(skecth -> skecth.getHasPin() == 1 - && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); - int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); - if (num > 8) { - return 8; - } - return num; - } +// private int calculatePinPictureNum(List sketchBoardElements, List hasUseMd5List) { +// List pinData = getPinData(sketchBoardElements, hasUseMd5List); +// if (CollectionUtil.isEmpty(pinData)) { +// return 0; +// } +// long topNum = sketchBoardElements.stream() +// .filter(skecth -> skecth.getHasPin() == 1 +// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); +// long bottomNum = sketchBoardElements.stream() +// .filter(skecth -> skecth.getHasPin() == 1 +// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); +// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); +// if (num > 8) { +// return 8; +// } +// return num; +// } //计算当前的Print图片类型 private CurrentDesignPrintPictureTypeEnum calculateCurrentDesignPintPictureType(long pinPrintNum, long noPinPrintNum, long noPrintNum) { @@ -432,41 +501,522 @@ public class PythonService { } } - private List coverToDesignPythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { - //Pin的数据 - List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); - //计算填充PythonItemBlouse - List items = Lists.newArrayList(); - if (elementVO.getModelSex().equals("Female")) { - List blouseList = calculatePythonItemBlouse(pinData, elementVO, designPictureType); - if (!CollectionUtils.isEmpty(blouseList)) { - items.addAll(blouseList); - } - //计算填充PythonItemSkirt - DesignPythonItem skirt = calculatePythonItemSkirt(pinData, elementVO, designPictureType); - if (Objects.nonNull(skirt)) { - items.add(skirt); +// private List coverToDesignPythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { +// //Pin的数据 +// List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); +// //计算填充PythonItemBlouse +// List items = Lists.newArrayList(); +// if (elementVO.getModelSex().equals("Female")) { +// List blouseList = calculatePythonItemBlouse(pinData, elementVO, designPictureType); +// if (!CollectionUtils.isEmpty(blouseList)) { +// items.addAll(blouseList); +// } +// //计算填充PythonItemSkirt +// DesignPythonItem skirt = calculatePythonItemSkirt(pinData, elementVO, designPictureType); +// if (Objects.nonNull(skirt)) { +// items.add(skirt); +// } +// } else { +// // 男装逻辑 +// DesignPythonItem top = calculatePythonItemTop(pinData, elementVO, designPictureType); +// if (Objects.nonNull(top)) { +// items.add(top); +// } +// DesignPythonItem bottom = calculatePythonItemBottom(pinData, elementVO, designPictureType); +// if (Objects.nonNull(bottom)) { +// items.add(bottom); +// } +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall()) && elementVO.getSwitchCategory().equals("Outwear")) { +// DesignPythonItem outwear = calculatePythonItemOutwear(pinData, elementVO, designPictureType); +// if (Objects.nonNull(outwear)) { +// items.add(outwear); +// } +// } +// } +// //计算填充Hairstyle Earring Shoes Body +// items.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint())); +// return items; +// } + + private List coverToDesignPythonItemNew(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale) { + List itemList = new ArrayList<>(); + DesignPythonItem designPythonItem = calculatePythonItem(elementVO, designPictureType); + if (Objects.nonNull(designPythonItem)) { + itemList.add(designPythonItem); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.OVERALL.getRealName())) { + List otherSketchCategoryList = getOtherSketchCategoryList(elementVO.getModelSex(), designPythonItem); + if (!otherSketchCategoryList.isEmpty()) { + JSONObject attributeRecognition = getAttributeRecognition(designPythonItem, designPythonItem.getType(), elementVO.getModelSex()); + for (String styleCategory : otherSketchCategoryList) { + DesignPythonItem otherSketch = processAttributeRecognition(attributeRecognition, elementVO, designPictureType, styleCategory, systemScale); + itemList.add(otherSketch); + } + } + itemList.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint())); } + } + return itemList; + } + + private DesignPythonItem processAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, String styleCategory, BigDecimal systemScale) { + switch (designPictureType) { + case PIN: + return processPinAttributeRecognition(attributeRecognition, elementVO, styleCategory, systemScale); + case NO_PIN: + case SYS_FILE: + return processNoPinOrSysFileAttributeRecognition(attributeRecognition, elementVO, styleCategory, systemScale); + default: + throw new BusinessException("unknown designPictureType"); + } + } + + private DesignPythonItem processPinAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) { + List collectPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 1, styleCategory); + if (CollectionUtil.isNotEmpty(collectPin)) { + int randomNum = RandomsUtil.randomSysFile(collectPin.size()); + elementVO.getHasUseMd5List().add(collectPin.get(randomNum).getMd5()); + return coverSketchToDesignPythonItem(collectPin.get(randomNum).getId(), collectPin.get(randomNum), elementVO); } else { - // 男装逻辑 - DesignPythonItem top = calculatePythonItemTop(pinData, elementVO, designPictureType); - if (Objects.nonNull(top)) { - items.add(top); - } - DesignPythonItem bottom = calculatePythonItemBottom(pinData, elementVO, designPictureType); - if (Objects.nonNull(bottom)) { - items.add(bottom); - } - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall()) && elementVO.getSwitchCategory().equals("Outwear")) { - DesignPythonItem outwear = calculatePythonItemOutwear(pinData, elementVO, designPictureType); - if (Objects.nonNull(outwear)) { - items.add(outwear); + List collectNoPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 0, styleCategory); + return processNoPinOrSysFileAttributeRecognitionWithPool(collectNoPin, attributeRecognition, elementVO, styleCategory, systemScale); + } + } + + private DesignPythonItem processNoPinOrSysFileAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) { + List collectNoPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 0, styleCategory); + return processNoPinOrSysFileAttributeRecognitionWithPool(collectNoPin, attributeRecognition, elementVO, styleCategory, systemScale); + } + + private DesignPythonItem processNoPinOrSysFileAttributeRecognitionWithPool(List collectionElements, JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) { + int poolNum = 20; + if (CollectionUtil.isNotEmpty(collectionElements)) { + int collectionNoPinSize = collectionElements.size(); + if (systemScale.compareTo(BigDecimal.ZERO) == 0) { + int randomNum = RandomsUtil.randomSysFile(collectionNoPinSize); + return coverSketchToDesignPythonItem(null, collectionElements.get(randomNum), elementVO); + } 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); + collectionElements.addAll(list); + int randomNum = RandomsUtil.randomSysFile(collectionElements.size()); + if (randomNum < collectionNoPinSize) { + return coverSketchToDesignPythonItem(collectionElements.get(randomNum).getId(), collectionElements.get(randomNum), elementVO); + } else { + return coverSketchToDesignPythonItem(null, collectionElements.get(randomNum), elementVO); } } } - //计算填充Hairstyle Earring Shoes Body - items.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint())); - return items; + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + int randomNum = RandomsUtil.randomSysFile(list.size()); + return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); + } + + private List getFilteredCollectionElements(List elements, int hasPin, String styleCategory) { + return CollectionUtil.isNotEmpty(elements) ? elements.stream().filter(o -> o.getHasPin() == hasPin && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()) : null; + } + + private DesignPythonItem processAttributeRecognitionBySameCategory(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory) { + List list = getSystemSketchPoolBySameCategory(attributeRecognition, styleCategory, elementVO.getModelSex()); + int randomNum = RandomsUtil.randomSysFile(list.size()); + return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); + } + + @Resource + private AttributeRetrievalMapper attributeRetrievalMapper; + + private List getSystemSketchPool(JSONObject attributeRecognition, String styleCategory, String modelSex, int poolNum) { + /** + * female trousers->female_pants + * female blouse->female_top + * female skirt->female_skirt + * female outwear->female_outwear + * female dress->female_dress + */ + JSONObject data = attributeRecognition.getJSONObject("data"); + JSONObject attrDict = ((JSONObject) data.getJSONArray("list").get(0)).getJSONObject("attr_dict"); + AttributeRecognitionJSON attrDictJSON = attrDict.toJavaObject(AttributeRecognitionJSON.class); + AttributeRetrieval attributeRetrievalAttrDict = toAttrDict(attrDictJSON); + String tableName; + tableName = getTableName(modelSex, styleCategory); + List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) { + attributeRetrievalAttrDict.setDesign(null); + attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + } + if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) { + attributeRetrievalAttrDict.setSilhouette(null); + attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + } + return toColoectionElementList(attributeRetrievalList, styleCategory, modelSex); + } + + private List getSystemSketchPoolBySameCategory(JSONObject attributeRecognition, String styleCategory, String modelSex) { + /** + * female trousers->female_pants + * female blouse->female_top + * female skirt->female_skirt + * female outwear->female_outwear + * female dress->female_dress + */ + JSONObject data = attributeRecognition.getJSONObject("data"); + JSONObject attrDict = ((JSONObject) data.getJSONArray("list").get(0)).getJSONObject("attr_dict"); + AttributeRecognitionJSON attrDictJSON = attrDict.toJavaObject(AttributeRecognitionJSON.class); + AttributeRetrieval attributeRetrievalAttrDict = toAttrDict(attrDictJSON); + String tableName; + tableName = getTableName(modelSex, styleCategory); + + // 存储非空字段的列表 + List nonNullFields = new ArrayList<>(); + if (attributeRetrievalAttrDict.getType() != null) { + nonNullFields.add("type"); + } + if (attributeRetrievalAttrDict.getOpeningType() != null) { + nonNullFields.add("openingType"); + if (tableName.equals("male_outwear")) { + nonNullFields.remove("openingType"); + attributeRetrievalAttrDict.setOpeningType(null); + } + } + if (attributeRetrievalAttrDict.getSubtype() != null) { + nonNullFields.add("subtype"); + } + + // 只有当非空字段数量大于等于2时才进行处理 + if (nonNullFields.size() >= 2) { + // 随机数生成器 + Random random = new Random(); + // 随机选择一个字段保留 + String fieldToKeep = nonNullFields.get(random.nextInt(nonNullFields.size())); + + // 设置保留的字段为非null,其他字段为null + for (String field : nonNullFields) { + if (!field.equals(fieldToKeep)) { + switch (field) { + case "type": + attributeRetrievalAttrDict.setType(null); + break; + case "openingType": + attributeRetrievalAttrDict.setOpeningType(null); + break; + case "subtype": + attributeRetrievalAttrDict.setSubtype(null); + break; + } + } + } + } + + List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPoolBySameCategory(attributeRetrievalAttrDict, tableName); + if (CollectionUtil.isEmpty(attributeRetrievalList)) { + System.out.println(attributeRetrievalAttrDict); + System.out.println(tableName); + } + return toColoectionElementList(attributeRetrievalList, styleCategory, modelSex); + } + + private List toColoectionElementList(List attributeRetrievalList, String styleCategory, String modelSex) { + List systemPool = new ArrayList<>(); + for (AttributeRetrieval attributeRetrieval : attributeRetrievalList) { + CollectionElement system = toCollectionElement(attributeRetrieval, styleCategory, modelSex); + systemPool.add(system); + } + return systemPool; + } + + private CollectionElement toCollectionElement(AttributeRetrieval attributeRetrieval, String styleCategory, String modelSex) { + CollectionElement element = new CollectionElement(); + element.setLevel2Type(styleCategory); + element.setUrl("aida-sys-image/images/" + modelSex.toLowerCase() + "/" + attributeRetrieval.getImgName()); + if (element.getUrl().contains("top")) { + element.setUrl(element.getUrl().replace("top", "tops")); + } + if (element.getUrl().contains("bottom")) { + element.setUrl(element.getUrl().replace("bottom", "bottoms")); + } + if (element.getUrl().contains("outer")) { + element.setUrl(element.getUrl().replace("outer", "outwear")); + } + return element; + } + + private AttributeRetrieval toAttrDict(AttributeRecognitionJSON attrDictJSON) { + AttributeRetrieval attributeRetrieval = new AttributeRetrieval(); +// attributeRetrieval.setImgName(attrDictJSON.getImgName().get(0)); +// attributeRetrieval.setLength(attrDictJSON.getLength().get(0)); +// attributeRetrieval.setSleeveLength(attrDictJSON.getSleeveLength().get(0)); +// attributeRetrieval.setSleeveShape(attrDictJSON.getSleeveShape().get(0)); +// attributeRetrieval.setSleeveShoulder(attrDictJSON.getSleeveShoulder().get(0)); +// attributeRetrieval.setNeckline(attrDictJSON.getNeckline().get(0)); +// attributeRetrieval.setCollar(attrDictJSON.getCollar().get(0)); + if (CollectionUtil.isNotEmpty(attrDictJSON.getDesign()) && attrDictJSON.getDesign().get(0) != null) { + attributeRetrieval.setDesign(attrDictJSON.getDesign().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getSilhouette()) && attrDictJSON.getSilhouette().get(0) != null) { + attributeRetrieval.setSilhouette(attrDictJSON.getSilhouette().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getType()) && attrDictJSON.getType().get(0) != null) { + attributeRetrieval.setType(attrDictJSON.getType().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getSubtype()) && attrDictJSON.getSubtype().get(0) != null) { + attributeRetrieval.setSubtype(attrDictJSON.getSubtype().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getOpeningType()) && attrDictJSON.getOpeningType().get(0) != null) { + attributeRetrieval.setOpeningType(attrDictJSON.getOpeningType().get(0)); + } + return attributeRetrieval; + } + + public JSONObject getAttributeRecognition(DesignPythonItem designPythonItem, String styleCategory, String modelSex) { + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) + .build(); + MediaType mediaType = MediaType.parse("application/json"); + + JSONObject paramJSONObject = new JSONObject(); + paramJSONObject.put("category", styleCategory); + paramJSONObject.put("colony", modelSex); + paramJSONObject.put("sketch_img_url", designPythonItem.getPath()); + JSONArray paramArray = new JSONArray(); + paramArray.add(paramJSONObject); + String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect); + + log.info("PythonService##design 请求参数:####{}", param); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .build(); + + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + String responseBody = Objects.requireNonNull(response.body()).string(); + JSONObject responseObject = JSON.parseObject(responseBody); + log.info("PythonService##responseObject###{}", responseObject); + return responseObject; + } else { + log.error("PythonService##design 请求异常:{}", response); + throw new BusinessException("attributeRecognition.interface.exception"); + } + } catch (IOException e) { + log.error("PythonService##design 请求异常:{}", e.getMessage()); + throw new BusinessException("attributeRecognition.interface.exception"); + } + } + + public JSONObject getAttributeRecognitionBySameCategory(CollectionElement element, String modelSex) { + // 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 现象 + JSONObject paramJSONObject = new JSONObject(); + paramJSONObject.put("category", element.getLevel2Type()); + paramJSONObject.put("colony", modelSex); + paramJSONObject.put("sketch_img_url", element.getUrl()); + JSONArray paramArray = new JSONArray(); + paramArray.add(paramJSONObject); + String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect); + log.info("design请求python 参数:####{}", param); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition") + .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) { + AccessLimitUtils.validateOut("design"); + log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("design.interface.exception"); + } + //去除限流 +// AccessLimitUtils.validateOut("design"); + if (response.isSuccessful()) { + try { + if (Objects.nonNull(response.body())) { + responseBody = response.body().string(); + JSONObject responseObject = JSON.parseObject(responseBody); + log.info("PythonService##responseObject###{}", responseObject); + return responseObject; + } + throw new BusinessException("design.interface.exception"); + } catch (IOException | JSONException e) { + log.error("PythonService##design异常###{}", e.getMessage()); + throw new BusinessException("design.interface.exception"); + } + } + log.error("PythonService##design异常response###{}", response); + //生成失败 + throw new BusinessException("design.interface.exception"); + } + + @Resource + private CollocationMapper collocationMapper; + @Resource + private DressingMapper dressingMapper; + + private List getOtherSketchCategoryList(String modelSex, DesignPythonItem designPythonItem) { + List collocationList = collocationMapper.getCollocationListBySketch(modelSex, designPythonItem.getType()); + if (CollectionUtil.isNotEmpty(collocationList)) { + Random random = new Random(); + int randomNumber = random.nextInt(collocationList.size()); + List otherSketchCategoryList = dressingMapper.getOtherSketchCategoryNameList(collocationList.get(randomNumber).getId(), designPythonItem.getType().toLowerCase()); + return otherSketchCategoryList; + } + return null; + } + + private DesignPythonItem calculatePythonItem(ValidateElementVO validateElementVO, CurrentDesignPictureTypeEnum currentDesignPictureType) { + switch (currentDesignPictureType) { + case PIN: + return calculatePinPythonItem(validateElementVO); + case NO_PIN: + return calculateNoPinPythonItem(validateElementVO); + case SYS_FILE: + return calculateSysFilePythonItem(validateElementVO); + default: + return null; + } + } + + private DesignPythonItem calculatePinPythonItem(ValidateElementVO validateElementVO) { + List pinCollectionData = getPinData(validateElementVO); + if (CollectionUtil.isEmpty(pinCollectionData)) { + throw new BusinessException("pinData is null"); + } + Random random = new Random(); + int randomNumber = random.nextInt(pinCollectionData.size()); + validateElementVO.getHasUseMd5List().add(pinCollectionData.get(randomNumber).getMd5()); + return coverSketchToDesignPythonItem(pinCollectionData.get(randomNumber).getId(), pinCollectionData.get(randomNumber), validateElementVO); + } + + private DesignPythonItem calculateNoPinPythonItem(ValidateElementVO validateElementVO) { + List noPinCollectionData = getNoPinData(validateElementVO); + if (CollectionUtil.isEmpty(noPinCollectionData)) { + List sketchBoardPins = getPinDataWhole(validateElementVO); + if (CollectionUtil.isNotEmpty(sketchBoardPins) && validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardPins)) { + Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); + CollectionElement element = sketchBoardPins.get(randomNum); + JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex()); + return processAttributeRecognitionBySameCategory(attributeRecognition, validateElementVO, element.getLevel2Type()); + } + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Dressing::getApparel, validateElementVO.getModelSex()); + if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + qw.lambda().eq(Dressing::getStyleCategory, validateElementVO.getSwitchCategory()); + } + List dressings = dressingMapper.selectList(qw); + if (CollectionUtil.isEmpty(dressings)) { + throw new BusinessException("dressings is null"); + } + Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); + String category = dressings.get(randomNum).getStyleCategory(); + String tableName = getTableName(validateElementVO.getModelSex(), category); + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex()); + return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO); + } + Random random = new Random(); + int randomNumber = random.nextInt(noPinCollectionData.size()); + return coverSketchToDesignPythonItem(noPinCollectionData.get(randomNumber).getId(), noPinCollectionData.get(randomNumber), validateElementVO); + } + + private DesignPythonItem calculateSysFilePythonItem(ValidateElementVO validateElementVO) { + List sketchBoardCollectionElements = validateElementVO.getSketchBoardElements(); + if (!CollectionUtils.isEmpty(sketchBoardCollectionElements)) { + if (validateElementVO.getModelSex().equals(Sex.MALE.getValue())) { + sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (validateElementVO.getModelSex().equals(Sex.FEMALE.getValue())) { + sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardCollectionElements) && validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardCollectionElements)) { + Integer randomNum = RandomsUtil.randomSysFile(sketchBoardCollectionElements.size()); + CollectionElement element = sketchBoardCollectionElements.get(randomNum); + JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex()); + return processAttributeRecognitionBySameCategory(attributeRecognition, validateElementVO, element.getLevel2Type()); + } + } + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Dressing::getApparel, validateElementVO.getModelSex()); + if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + qw.lambda().eq(Dressing::getApparel, validateElementVO.getSwitchCategory()); + } + List dressings = dressingMapper.selectList(qw); + if (CollectionUtil.isEmpty(dressings)) { + throw new BusinessException("dressings is null"); + } + Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); + String category = dressings.get(randomNum).getStyleCategory(); + String tableName = getTableName(validateElementVO.getModelSex(), category); + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex()); + return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO); + } + + private String getTableName(String modelSex, String category) { + switch (modelSex) { + case "Female": { + switch (category) { + case "Blouse": { + return "female_top"; + } + case "Trousers": { + return "female_pants"; + } + case "Skirt": { + return "female_skirt"; + } + case "Outwear": { + return "female_outwear"; + } + case "Dress": { + return "female_dress"; + } + default: { + throw new BusinessException("unknown attributeRetrieval dressing"); + } + } + } + case "Male": { + switch (category) { + case "Tops": { + return "male_top"; + } + case "Bottoms": { + return "male_bottom"; + } + case "Outwear": { + return "male_outwear"; + } + default: { + throw new BusinessException("unknown male dressing"); + } + } + } + default: { + throw new BusinessException("unknown modelSex"); + } + } } private DesignPythonItem calculatePythonItemOutwear(List pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { @@ -546,39 +1096,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - outwear.setBusinessId(sysFileVO.getId()); - return outwear; - } - outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - outwear.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.OUTWEAR, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - outwear.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return outwear; - } - outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - outwear.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// outwear.setBusinessId(sysFileVO.getId()); +// return outwear; +// } +// outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// outwear.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.OUTWEAR, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// outwear.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return outwear; +// } +// outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// outwear.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -713,39 +1263,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - bottom.setBusinessId(sysFileVO.getId()); - return bottom; - } - bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - bottom.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.BOTTOMS, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - bottom.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return bottom; - } - bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - bottom.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// bottom.setBusinessId(sysFileVO.getId()); +// return bottom; +// } +// bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// bottom.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.BOTTOMS, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// bottom.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return bottom; +// } +// bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// bottom.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -880,39 +1430,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - top.setBusinessId(sysFileVO.getId()); - return top; - } - top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - top.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.TOPS, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - top.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return top; - } - top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - top.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// top.setBusinessId(sysFileVO.getId()); +// return top; +// } +// top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// top.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.TOPS, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// top.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return top; +// } +// top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// top.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -1083,39 +1633,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - skirt.setBusinessId(sysFileVO.getId()); - return skirt; - } - skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - skirt.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.SKIRT_TROUSERS, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - skirt.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return skirt; - } - skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - skirt.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// skirt.setBusinessId(sysFileVO.getId()); +// return skirt; +// } +// skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// skirt.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.SKIRT_TROUSERS, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// skirt.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return skirt; +// } +// skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// skirt.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -1254,42 +1804,42 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - item.setBusinessId(sysFileVO.getId()); - items.add(item); - return items; - } - DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - item.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - items.add(item); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.OUTWEAR_DRESS_BLOUSE, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - item.setBusinessId(sysFileVO.getId()); - items.add(item); - return items; - } - DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - item.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - items.add(item); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// item.setBusinessId(sysFileVO.getId()); +// items.add(item); +// return items; +// } +// DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// item.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// items.add(item); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.OUTWEAR_DRESS_BLOUSE, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// item.setBusinessId(sysFileVO.getId()); +// items.add(item); +// return items; +// } +// DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// item.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// items.add(item); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -1377,6 +1927,32 @@ public class PythonService { return designPythonItemBlouse; } + private DesignPythonItem coverSketchToDesignPythonItem(Long elementId, CollectionElement collectionElement, ValidateElementVO elementVO) { + DesignPythonItem designPythonItemBlouse = new DesignPythonItem(); + if (Objects.nonNull(elementId)) { + designPythonItemBlouse.setElementId(elementId); + designPythonItemBlouse.setBusinessId(elementId); + } + designPythonItemBlouse.setType(collectionElement.getLevel2Type()); + designPythonItemBlouse.setPath(collectionElement.getUrl()); + //所有的icon都是none + designPythonItemBlouse.setIcon("none"); + designPythonItemBlouse.setColor(getRandomColor(elementVO.getColorBoards())); + if (!elementVO.getDesignPythonItemPrint().getPath().equals("none") + && elementVO.getDesignPrintPictureTypeLayoutList().contains(collectionElement.getLevel2Type())) { + DesignPythonItemPrint designPythonItemPrint = CopyUtil.copyObject(elementVO.getDesignPythonItemPrint(), DesignPythonItemPrint.class); + designPythonItemPrint.setIfSingle(false); + designPythonItemPrint.setPrint_path_list(Collections.singletonList(designPythonItemPrint.getPath())); + designPythonItemBlouse.setPrint(designPythonItemPrint); + } else { + DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint(); + designPythonItemPrint.setIfSingle(false); + designPythonItemPrint.setPrint_path_list(new ArrayList<>()); + designPythonItemBlouse.setPrint(designPythonItemPrint); + } + return designPythonItemBlouse; + } + private List residuePinData(List pinData, List existPinDataIds, List hasUseMd5List) { if (CollectionUtils.isEmpty(pinData)) { return null; @@ -1390,9 +1966,9 @@ public class PythonService { DesignPythonBasic basic = new DesignPythonBasic(); basic.setSingle_overall(singleOverall); basic.setSwitch_category(switchCategory); - basic.setSave_name(getPythonOutputPath( - StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(), - PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION)); +// basic.setSave_name(getPythonOutputPath( +// StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(), +// PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION)); basic.setScale_bag(0.7); basic.setSelf_template(Boolean.FALSE); if (Objects.nonNull(designLibraryModelPoint)) { @@ -1443,20 +2019,99 @@ public class PythonService { return integerList; } - private List getPinData(List sketchBoardElements, List hasUseMd5List) { + private List getPinData(ValidateElementVO elementVO) { + List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List(), elementVO.getModelSex()); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + if (!CollectionUtils.isEmpty(pinData)) { + return pinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + } else { + return pinData; + } + } else { + return pinData; + } + } + + private List getPinDataWhole(ValidateElementVO elementVO) { + List pinData = getPinDataWhole(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List(), elementVO.getModelSex()); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + if (!CollectionUtils.isEmpty(pinData)) { + return pinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + } else { + return pinData; + } + } else { + return pinData; + } + } + + private List getPinDataWhole(List sketchBoardElements, List hasUseMd5List, String modelSex) { + if (CollectionUtils.isEmpty(sketchBoardElements)) { + return null; + } + List sketchBoardPins = sketchBoardElements + .stream().filter(v -> v.getHasPin() == 1).collect(Collectors.toList()); + if (modelSex.equals(Sex.MALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (modelSex.equals(Sex.FEMALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (CollectionUtils.isEmpty(sketchBoardPins)) { + return null; + } + return sketchBoardPins; + } + + public final static List FEMALE_CATEGORY = Arrays.asList("Dress", "Blouse", "Skirt", "Trousers", "Outwear"); + public final static List MALE_CATEGORY = Arrays.asList("Tops", "Bottoms", "Outwear"); + + private List getPinData(List sketchBoardElements, List hasUseMd5List, String modelSex) { if (CollectionUtils.isEmpty(sketchBoardElements)) { return null; } List sketchBoardPins = sketchBoardElements .stream().filter(v -> v.getHasPin() == 1 && (!hasUseMd5List.contains(v.getMd5()))).collect(Collectors.toList()); + if (modelSex.equals(Sex.MALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (modelSex.equals(Sex.FEMALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } if (CollectionUtils.isEmpty(sketchBoardPins)) { return null; } - List response = resolveElementFilterHistoryMd5(sketchBoardPins); - if (CollectionUtils.isEmpty(response)) { + return sketchBoardPins; + } + + private List getNoPinData(ValidateElementVO elementVO) { + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + List noPinData = getNoPinData(elementVO.getSketchBoardElements(), elementVO.getModelSex()); + if (CollectionUtils.isEmpty(noPinData)) { + return null; + } + return noPinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + } else { + return getNoPinData(elementVO.getSketchBoardElements(), elementVO.getModelSex()); + } + } + + private List getNoPinData(List sketchBoardElements, String modelSex) { + if (CollectionUtils.isEmpty(sketchBoardElements)) { return null; } - return CopyUtil.copyList(sketchBoardPins, CollectionElement.class); + List sketchBoardPins = sketchBoardElements + .stream().filter(v -> v.getHasPin() == 0).collect(Collectors.toList()); + if (modelSex.equals(Sex.MALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (modelSex.equals(Sex.FEMALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (CollectionUtils.isEmpty(sketchBoardPins)) { + return null; + } + return sketchBoardPins; } private List resolveElementFilterHistoryMd5(List elemet) { @@ -1940,13 +2595,21 @@ public class PythonService { List response = new ArrayList<>(); designSingleItemList.forEach(designSingleItem -> { + Long businessId; + if (!designSingleIncludeLayersDTO.getIsPreview() && designSingleItem.getChanged()){ + String s = String.valueOf(designSingleItem.getId()); + businessId = Long.parseLong(s.substring(0,s.length() - 3)); + }else { + businessId = designSingleItem.getId(); + } response.add(new DesignPythonItem( designSingleItem.getType(), designSingleItem.getPath(), designSingleItem.getColor(), resolveDesignSinglePrint(designSingleItem.getPrintObject(), designSingleItem.getPath()), // businessId designItemDetailId (python端确认没有作用,但是数据库需要存,作用:未知) - designSingleItem.getId(), +// designSingleItem.getId(), + businessId, pythonTAllInfoService.getImageIdByPath(designSingleItem.getPath()), designSingleItem.getOffset(), designSingleItem.getScale(), @@ -2240,7 +2903,7 @@ public class PythonService { throw new BusinessException("system error!"); } - public List generateSketchOrPrint(GenerateToPythonDTO generateToPythonDTO) { + public Boolean generateSketchOrPrint(GenerateToPythonDTO generateToPythonDTO) { //限流校验 // AccessLimitUtils.validate("generateSketchOrPrint", 5); OkHttpClient client = new OkHttpClient().newBuilder() @@ -2255,7 +2918,8 @@ public class PythonService { // .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(accessPythonIp + ":" + accessPythonPort + "/api/generate_image") + .url(srPythonPort + "/api/generate_image") .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") @@ -2296,12 +2960,13 @@ public class PythonService { if (result && jsonObject.get("code").equals(200)) { log.info("Generate##responseObject###{}", jsonObject); - return setGenerateImageList(jsonObject.getJSONObject("data")); +// return setGenerateImageList(jsonObject.getJSONObject("data")); + return Boolean.TRUE; + }else { + log.info("generateSketchOrPrintPrint失败###{}", jsonObject); + log.info("Generate Exception! Code : " + jsonObject.get("code")); + return Boolean.FALSE; } - log.info("generateSketchOrPrintPrint失败###{}", jsonObject); - log.info("Generate Exception! Code : " + jsonObject.get("code")); - //生成失败 - throw new BusinessException("generate.interface.error"); } public Response sendPostToModel(String content, String portAndRoute, String functionName) { @@ -2441,7 +3106,7 @@ public class PythonService { // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") // .addHeader("Content-Type", "application/json") .build(); - Response response; + Response response = null; try { log.info("cancelGenerateTask请求入参content###{}", taskId); response = client.newCall(request).execute(); @@ -2449,8 +3114,10 @@ public class PythonService { log.error("PythonService##cancelGenerateTask异常###{}", ExceptionUtil.getThrowableList(ioException)); return null; } + int responseCode = response.code(); + response.close(); - if (response.code() != HttpURLConnection.HTTP_OK) { + if (responseCode != HttpURLConnection.HTTP_OK) { log.info("generate-python 取消请求失败"); return Boolean.FALSE; } @@ -2458,4 +3125,100 @@ public class PythonService { return Boolean.TRUE; } + public Boolean superResolution(SuperResolutionDTO superResolutionDTO) throws BusinessException { + 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"); + + HashMap content = new HashMap<>(); + content.put("sr_image_url", superResolutionDTO.getImages()); + content.put("sr_xn", superResolutionDTO.getScale().toString()); + content.put("sr_tasks_id", superResolutionDTO.getUniqueId()); + + String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); + RequestBody body = RequestBody.create(mediaType, jsonString); + Request request = new Request.Builder() + .url(srPythonPort + "/api/super_resolution") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + try { + log.info("superResolution请求入参content###{}", jsonString); + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##superResolution异常###{}", ExceptionUtil.getThrowableList(ioException)); + return null; + } + int responseCode = response.code(); + response.close(); + + if (responseCode != HttpURLConnection.HTTP_OK) { + // 基本不会有除200以外的code + log.info("superResolution 请求超分操作失败。 Response code " + response.code()); + throw new BusinessException("superResolution 请求超分操作失败。 Response code " + response.code()); + } + log.info("superResolution 请求超分操作成功"); + return Boolean.TRUE; + } + + public String promptTranslate(String text) throws BusinessException { + 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"); + + HashMap content = new HashMap<>(); + content.put("text", text); + + String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); + RequestBody body = RequestBody.create(mediaType, jsonString); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/translateToEN") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + try { + log.info("promptTranslation请求入参content###{}", jsonString); + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##promptTranslation异常###{}", ExceptionUtil.getThrowableList(ioException)); + return text; + } + int responseCode = response.code(); + String bodyString; + try { + bodyString = response.body().string(); + if (responseCode != HttpURLConnection.HTTP_OK) { + // 基本不会有除200以外的code + log.info("promptTranslation 用户输入翻译失败。 Response code " + responseCode); + throw new BusinessException("promptTranslation 用户输入翻译失败。 Response code " + responseCode); + } + JSONObject jsonObject = JSON.parseObject(bodyString); + Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful"); + if (result && jsonObject.get("msg").equals("OK!")) { + String translated = jsonObject.get("data").toString(); + log.info("翻译或处理后的文本 : {}", translated); + return translated; + } + } catch (IOException e) { + log.error("promptTranslation 用户输入翻译失败; error message => " + e.getMessage()); + throw new RuntimeException(e); + + } finally { + response.close(); + } + + log.info("promptTranslation 用户输入翻译失败,返回用户输入"); + return text; + } + } 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 efb82472..1bbbfa45 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java @@ -74,6 +74,12 @@ public class DesignPythonItem { */ private Integer priority; + /** + * 渐变图片的minio地址 + */ + private String gradient; +// +// private Float gradient_angle; public static List OUTWEAR_DRESS_BLOUSE = Arrays.asList(CollectionLevel2TypeEnum.OUTWEAR.getRealName(), CollectionLevel2TypeEnum.DRESS.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName()); @@ -123,6 +129,21 @@ public class DesignPythonItem { this.priority = priority; } +// public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, Long businessId, Long image_id, List offset, Float resize_scale,Integer priority) { +// this.type = type; +// this.path = path; +// this.color = color; +// this.print = print; +//// 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.gradient_angle = gradient_angle; +// } + public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, String icon, Long businessId, Long image_id) { this.type = type; this.path = path; diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java b/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java index 22563da6..af5fa3be 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java @@ -1,6 +1,6 @@ package com.ai.da.python.vo; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.Library; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/ai/da/service/AccountLoginLogService.java b/src/main/java/com/ai/da/service/AccountLoginLogService.java index 773f49a5..575f5e69 100644 --- a/src/main/java/com/ai/da/service/AccountLoginLogService.java +++ b/src/main/java/com/ai/da/service/AccountLoginLogService.java @@ -1,8 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.AccountLoginLog; -import com.ai.da.model.dto.EmailSendDTO; -import com.ai.da.model.dto.NoteSendDTO; +import com.ai.da.mapper.primary.entity.AccountLoginLog; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index aa646554..6d42900b 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -1,17 +1,14 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.dto.*; -import com.ai.da.model.enums.Language; import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountPreLoginVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import org.springframework.web.bind.annotation.RequestBody; import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; import java.util.List; /** @@ -131,4 +128,6 @@ public interface AccountService extends IService { void upgradeNotification(); void moveLibraryDate(); + + void updateCredits(Long accountId, String value); } diff --git a/src/main/java/com/ai/da/service/AliPayService.java b/src/main/java/com/ai/da/service/AliPayService.java new file mode 100644 index 00000000..66dd334d --- /dev/null +++ b/src/main/java/com/ai/da/service/AliPayService.java @@ -0,0 +1,24 @@ +package com.ai.da.service; + +import java.util.Map; + +public interface AliPayService { + String tradeCreate(Integer amount,String returnUrl); + + String tradeNotify(Map params); + + void processOrder(Map params); + + void cancelOrder(String orderNo); + + String queryOrder(String orderNo); + + void checkOrderStatus(String orderNo); + + void refund(String orderNo, String reason); + + String queryRefund(String orderNo); + + String queryBill(String billDate, String type); + +} diff --git a/src/main/java/com/ai/da/service/AlipayHKService.java b/src/main/java/com/ai/da/service/AlipayHKService.java new file mode 100644 index 00000000..baf56c8e --- /dev/null +++ b/src/main/java/com/ai/da/service/AlipayHKService.java @@ -0,0 +1,4 @@ +package com.ai.da.service; + +public interface AlipayHKService { +} diff --git a/src/main/java/com/ai/da/service/ChatRobotService.java b/src/main/java/com/ai/da/service/ChatRobotService.java index a48efc00..1deaa19d 100644 --- a/src/main/java/com/ai/da/service/ChatRobotService.java +++ b/src/main/java/com/ai/da/service/ChatRobotService.java @@ -1,12 +1,10 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.ChatFlushDTO; import com.ai.da.model.dto.ChatRobotLibraryDTO; import com.ai.da.model.dto.ChatSendDTO; -import com.ai.da.model.vo.ChatRobotLibraryVO; import com.ai.da.model.vo.ChatRobotVO; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.math.BigDecimal; diff --git a/src/main/java/com/ai/da/service/ClassificationService.java b/src/main/java/com/ai/da/service/ClassificationService.java index 2cdbe5de..c68db66b 100644 --- a/src/main/java/com/ai/da/service/ClassificationService.java +++ b/src/main/java/com/ai/da/service/ClassificationService.java @@ -1,15 +1,9 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Classification; -import com.ai.da.mapper.entity.Library; -import com.ai.da.model.dto.ChatFlushDTO; -import com.ai.da.model.dto.ChatRobotLibraryDTO; -import com.ai.da.model.dto.ChatSendDTO; +import com.ai.da.mapper.primary.entity.Classification; import com.ai.da.model.dto.ClassificationDTO; -import com.ai.da.model.vo.ChatRobotVO; import com.ai.da.model.vo.ClassificationVO; -import java.math.BigDecimal; import java.util.List; /** diff --git a/src/main/java/com/ai/da/service/CollectionElementService.java b/src/main/java/com/ai/da/service/CollectionElementService.java index a32b3b75..7f015d3b 100644 --- a/src/main/java/com/ai/da/service/CollectionElementService.java +++ b/src/main/java/com/ai/da/service/CollectionElementService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.CollectionElement; -import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.mapper.primary.entity.CollectionElement; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.baomidou.mybatisplus.extension.service.IService; @@ -134,6 +134,6 @@ public interface CollectionElementService extends IService { * @param level2Type * @return */ - CollectionElement editLevel2Type(Long elementId, String level2Type); + CollectionElement editLevel2Type(Long elementId, String level2Type, String designType); } diff --git a/src/main/java/com/ai/da/service/CollectionService.java b/src/main/java/com/ai/da/service/CollectionService.java index 5efe520d..919ebf4f 100644 --- a/src/main/java/com/ai/da/service/CollectionService.java +++ b/src/main/java/com/ai/da/service/CollectionService.java @@ -1,17 +1,9 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.CollectionElement; -import com.ai.da.model.dto.CollectionElementUploadDTO; -import com.ai.da.model.dto.CollectionGeneratePrintDTO; -import com.ai.da.model.dto.CollectionSavePrintDTO; -import com.ai.da.model.vo.CollectionElementVO; -import com.ai.da.model.vo.CollectionGeneratePrintVO; +import com.ai.da.mapper.primary.entity.Collection; import com.ai.da.model.vo.UserLikeCollectionVO; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.List; - /** * 服务类 * diff --git a/src/main/java/com/ai/da/service/ColorLoopUpTableService.java b/src/main/java/com/ai/da/service/ColorLoopUpTableService.java index 3d9721f4..833b93ed 100644 --- a/src/main/java/com/ai/da/service/ColorLoopUpTableService.java +++ b/src/main/java/com/ai/da/service/ColorLoopUpTableService.java @@ -1,7 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.ColorLookupTable; -import com.ai.da.mapper.entity.PanTone; +import com.ai.da.mapper.primary.entity.ColorLookupTable; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java new file mode 100644 index 00000000..a9d35d17 --- /dev/null +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -0,0 +1,33 @@ +package com.ai.da.service; + + +import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.mapper.primary.entity.CreditsDetail; +import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface CreditsService extends IService { + + void initCredits(); + + Boolean buyCredits(Long accountId, Integer quantity); + + void creditsIncrease(Long accountId, String event); + + void creditsDecrease(Long accountId, String event); + + String getCredits(Long accountId); + + void creditsRefund(Long accountId, Integer quantity); + + void insertToCreditsDetail(Long accountId, String changeEvent, String credits, String changeType); + + PageBaseResponse queryCreditsDetailsPage(QueryIncomeOrExpenditureDTO queryPageByTimeDTO); + + Boolean checkCredits(Long accountId, CreditsEventsEnum event, Integer num); + + Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num); + + void taskCreditsDeduction(Long accountId, String taskId); +} diff --git a/src/main/java/com/ai/da/service/DesignHistoryService.java b/src/main/java/com/ai/da/service/DesignHistoryService.java index 249bc2c2..80235cf3 100644 --- a/src/main/java/com/ai/da/service/DesignHistoryService.java +++ b/src/main/java/com/ai/da/service/DesignHistoryService.java @@ -1,7 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignHistory; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.DesignHistory; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java b/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java index a8a33cc4..9e8b0b3d 100644 --- a/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java +++ b/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignItemDetailPrint; +import com.ai.da.mapper.primary.entity.DesignItemDetailPrint; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/DesignItemDetailService.java b/src/main/java/com/ai/da/service/DesignItemDetailService.java index 1f5663b5..77836af0 100644 --- a/src/main/java/com/ai/da/service/DesignItemDetailService.java +++ b/src/main/java/com/ai/da/service/DesignItemDetailService.java @@ -1,8 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignItemDetail; +import com.ai.da.mapper.primary.entity.DesignItemDetail; import com.baomidou.mybatisplus.extension.service.IService; -import sun.security.krb5.internal.crypto.Des; import java.util.List; diff --git a/src/main/java/com/ai/da/service/DesignItemService.java b/src/main/java/com/ai/da/service/DesignItemService.java index 26163bf1..26e87015 100644 --- a/src/main/java/com/ai/da/service/DesignItemService.java +++ b/src/main/java/com/ai/da/service/DesignItemService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignItem; +import com.ai.da.mapper.primary.entity.DesignItem; import com.ai.da.model.dto.DesignSingleDTO; import com.ai.da.model.dto.DesignSingleIncludeLayersDTO; import com.ai.da.model.vo.*; diff --git a/src/main/java/com/ai/da/service/DesignService.java b/src/main/java/com/ai/da/service/DesignService.java index bbca6f7f..839ce443 100644 --- a/src/main/java/com/ai/da/service/DesignService.java +++ b/src/main/java/com/ai/da/service/DesignService.java @@ -1,13 +1,12 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Design; +import com.ai.da.mapper.primary.entity.Design; import com.ai.da.model.dto.*; import com.ai.da.model.vo.CollectionSketchVO; import com.ai.da.model.vo.DesignCollectionVO; import com.ai.da.model.vo.DesignItemDetailVO; import com.ai.da.model.vo.DesignLikeVO; import com.ai.da.python.vo.DesignPythonObjects; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; import java.math.BigDecimal; diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index 06ca4122..a3f6ed7d 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -1,13 +1,10 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Generate; -import com.ai.da.mapper.entity.GenerateDetail; +import com.ai.da.mapper.primary.entity.Generate; +import com.ai.da.mapper.primary.entity.GenerateDetail; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; -import com.ai.da.model.vo.GenerateCaptionVO; -import com.ai.da.model.vo.GenerateCollectionVO; -import com.ai.da.model.vo.GenerateLikeVO; -import com.ai.da.model.vo.PrepareForGenerateVO; +import com.ai.da.model.vo.*; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -16,7 +13,9 @@ public interface GenerateService extends IService { GenerateCaptionVO generateCaption(Long sketchElementId); - GenerateCollectionVO generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO); + void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO); + + void processGenerateResult(String taskId, String url, String category); GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO); @@ -26,12 +25,14 @@ public interface GenerateService extends IService { List selectBatchByLibraryId(List libraryId); - GenerateCollectionVO getGenerateResult(String uniqueId); +// GenerateCollectionVO getGenerateResult(String uniqueId); + + List getGenerateResultList(List taskIdList); PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO); Long getRankPosition(String uniqueId); - void cancelGenerate(Long userId, String uniqueId, String timeZone); + void cancelGenerate(Long userId, List uniqueId, String timeZone); } diff --git a/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java b/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java index e5296840..c11bb759 100644 --- a/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java +++ b/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import com.ai.da.model.vo.DesignPythonOutfitVO; import com.ai.da.model.vo.TDesignPythonOutfitDetailVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java b/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java index ab98f0ab..a6b5b749 100644 --- a/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java +++ b/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import com.ai.da.model.vo.TDesignPythonOutfitVO; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/service/LibraryModelPointService.java b/src/main/java/com/ai/da/service/LibraryModelPointService.java index 24dc3331..adeb61d5 100644 --- a/src/main/java/com/ai/da/service/LibraryModelPointService.java +++ b/src/main/java/com/ai/da/service/LibraryModelPointService.java @@ -1,13 +1,10 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.LibraryModelPoint; -import com.ai.da.model.dto.DesignSingleDTO; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; import com.ai.da.model.dto.LibraryModelPointDTO; import com.ai.da.model.dto.ModelsDotDTO; import com.ai.da.model.vo.LibraryModelPointVO; -import com.ai.da.model.vo.LibraryUpdateVo; import com.baomidou.mybatisplus.extension.service.IService; -import org.springframework.web.bind.annotation.RequestBody; import java.util.List; diff --git a/src/main/java/com/ai/da/service/LibraryService.java b/src/main/java/com/ai/da/service/LibraryService.java index 0b23577e..d2083312 100644 --- a/src/main/java/com/ai/da/service/LibraryService.java +++ b/src/main/java/com/ai/da/service/LibraryService.java @@ -1,15 +1,12 @@ package com.ai.da.service; import com.ai.da.common.response.PageBaseResponse; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.*; -import com.ai.da.model.vo.CollectionElementVO; import com.ai.da.model.vo.LibraryUpdateVo; import com.ai.da.model.vo.LibraryVo; import com.ai.da.model.vo.QueryLibraryPageVO; import com.baomidou.mybatisplus.extension.service.IService; -import org.springframework.web.bind.annotation.RequestBody; import javax.validation.Valid; import java.text.ParseException; diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java new file mode 100644 index 00000000..35da4881 --- /dev/null +++ b/src/main/java/com/ai/da/service/OrderInfoService.java @@ -0,0 +1,31 @@ +package com.ai.da.service; + + +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.model.dto.QueryPageByTimeDTO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface OrderInfoService extends IService { + + OrderInfo createOrderByProductId(Integer productId, String paymentType); + + void saveCodeUrl(String orderNo, String codeUrl); + + List listOrderByCreateTimeDesc(); + + void updateStatusByOrderNo(String orderNo, OrderStatusEnum orderStatus); + + String getOrderStatus(String orderNo); + + List getNoPayOrderByDuration(int minutes, String paymentType); + + OrderInfo getOrderByOrderNo(String orderNo); + + PageBaseResponse getOrderByPage(QueryPageByTimeDTO queryPageByTimeDTO); + + void updateOrderNoById(Long id, String orderNo); +} diff --git a/src/main/java/com/ai/da/service/PanToneService.java b/src/main/java/com/ai/da/service/PanToneService.java index 77effded..344ff885 100644 --- a/src/main/java/com/ai/da/service/PanToneService.java +++ b/src/main/java/com/ai/da/service/PanToneService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.PanTone; +import com.ai.da.mapper.primary.entity.PanTone; import com.ai.da.model.dto.GetRgbByHsvBatchDTO; import com.ai.da.model.vo.PantoneVO; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/src/main/java/com/ai/da/service/PayPalCheckoutService.java b/src/main/java/com/ai/da/service/PayPalCheckoutService.java new file mode 100644 index 00000000..450c521d --- /dev/null +++ b/src/main/java/com/ai/da/service/PayPalCheckoutService.java @@ -0,0 +1,34 @@ +package com.ai.da.service; + +import com.paypal.http.exceptions.SerializeException; +import com.paypal.orders.Order; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public interface PayPalCheckoutService { + + HashMap createOrder(Integer amount,String returnUrl) throws SerializeException; + +// String callback(@SuppressWarnings("rawtypes") Map map); + + Boolean doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException; + + Order queryOrder(String orderNo) throws SerializeException; + + Order captureOrder(String orderId) throws IOException; + + Boolean refundOrder(String orderId, String reason) throws IOException; + + String getOAuth(); + + void processOrder(String orderId); + + void checkOrderStatus(String orderNo) throws SerializeException; +} + diff --git a/src/main/java/com/ai/da/service/PaymentInfoService.java b/src/main/java/com/ai/da/service/PaymentInfoService.java new file mode 100644 index 00000000..4a350dff --- /dev/null +++ b/src/main/java/com/ai/da/service/PaymentInfoService.java @@ -0,0 +1,14 @@ +package com.ai.da.service; + +import com.paypal.orders.Order; + +import java.util.Map; + +public interface PaymentInfoService { + + void createPaymentInfo(String plainText); + + void createPaymentInfoForAliPay(Map params); + + void createPaymentInfoForPayPal(Order order); +} diff --git a/src/main/java/com/ai/da/service/ProductService.java b/src/main/java/com/ai/da/service/ProductService.java new file mode 100644 index 00000000..bf086fba --- /dev/null +++ b/src/main/java/com/ai/da/service/ProductService.java @@ -0,0 +1,8 @@ +package com.ai.da.service; + +import com.ai.da.mapper.primary.entity.Product; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ProductService extends IService { + +} diff --git a/src/main/java/com/ai/da/service/PythonTAllInfoService.java b/src/main/java/com/ai/da/service/PythonTAllInfoService.java index 904aed88..8fd59225 100644 --- a/src/main/java/com/ai/da/service/PythonTAllInfoService.java +++ b/src/main/java/com/ai/da/service/PythonTAllInfoService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.PythonTAllInfo; +import com.ai.da.mapper.primary.entity.PythonTAllInfo; import com.baomidou.mybatisplus.extension.service.IService; /** diff --git a/src/main/java/com/ai/da/service/RabbitMQService.java b/src/main/java/com/ai/da/service/RabbitMQService.java index b03a578d..7797c905 100644 --- a/src/main/java/com/ai/da/service/RabbitMQService.java +++ b/src/main/java/com/ai/da/service/RabbitMQService.java @@ -5,7 +5,9 @@ import org.springframework.stereotype.Service; @Service public interface RabbitMQService { - void publishMessage(String message); + void publishMessageToGenerate(String message); + + void publishMessageToSR(String message); Integer getMessageCount(String queueUrl); } diff --git a/src/main/java/com/ai/da/service/RefundInfoService.java b/src/main/java/com/ai/da/service/RefundInfoService.java new file mode 100644 index 00000000..5cfeca4c --- /dev/null +++ b/src/main/java/com/ai/da/service/RefundInfoService.java @@ -0,0 +1,22 @@ +package com.ai.da.service; + + +import com.ai.da.mapper.primary.entity.RefundInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface RefundInfoService extends IService { + + RefundInfo createRefundByOrderNo(String orderNo, String reason); + + void updateRefund(String content); + + List getNoRefundOrderByDuration(int minutes); + + RefundInfo createRefundByOrderNoForAliPay(String orderNo, String reason); + + void updateRefundForAliPay(String refundNo, String content, String refundStatus); + + void updateRefundForPayPal(Long id, String refundId, String content, String refundStatus); +} diff --git a/src/main/java/com/ai/da/service/SuperResolutionService.java b/src/main/java/com/ai/da/service/SuperResolutionService.java new file mode 100644 index 00000000..8f989e15 --- /dev/null +++ b/src/main/java/com/ai/da/service/SuperResolutionService.java @@ -0,0 +1,22 @@ +package com.ai.da.service; + +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.mapper.primary.entity.TaskList; +import com.ai.da.model.dto.QueryTaskHistoryDTO; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface SuperResolutionService extends IService { + + List prepareForSR(List superResolutionDTO); + + void SR(SuperResolutionDTO superResolutionDTO) throws Exception; + + void setSRResult(String taskId, String output, String status); + + void updateSROutput(String taskId, String status, String output); + + PageBaseResponse getTaskHistoryPage(QueryTaskHistoryDTO queryTaskHistoryDTO); +} diff --git a/src/main/java/com/ai/da/service/SysFileService.java b/src/main/java/com/ai/da/service/SysFileService.java index 0cef4818..d7d1a454 100644 --- a/src/main/java/com/ai/da/service/SysFileService.java +++ b/src/main/java/com/ai/da/service/SysFileService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.SysFile; +import com.ai.da.mapper.primary.entity.SysFile; import com.ai.da.model.vo.SysFileVO; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/src/main/java/com/ai/da/service/TCollectionElementRelationService.java b/src/main/java/com/ai/da/service/TCollectionElementRelationService.java index 860618ab..20bead1e 100644 --- a/src/main/java/com/ai/da/service/TCollectionElementRelationService.java +++ b/src/main/java/com/ai/da/service/TCollectionElementRelationService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.TCollectionElementRelation; +import com.ai.da.mapper.primary.entity.TCollectionElementRelation; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/TaskListService.java b/src/main/java/com/ai/da/service/TaskListService.java new file mode 100644 index 00000000..9f43deb6 --- /dev/null +++ b/src/main/java/com/ai/da/service/TaskListService.java @@ -0,0 +1,22 @@ +package com.ai.da.service; + +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.mapper.primary.entity.TaskList; +import com.ai.da.model.dto.QueryTaskHistoryDTO; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.ai.da.model.dto.TaskDTO; +import com.ai.da.model.vo.TaskVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface TaskListService extends IService { + + List> getExecTask(List taskIdList); + + void addToTaskListRedis(TaskDTO taskDTO); + + void updateTaskStatusOrOutputRedis(String taskId, String status, String output); + + PageBaseResponse getAllTask(QueryTaskHistoryDTO queryTaskHistoryDTO); +} diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index 5ec308fd..dd4d7c86 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -1,14 +1,9 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.UserLikeGroup; +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.vo.UserLikeGroupVO; import com.baomidou.mybatisplus.extension.service.IService; -import io.swagger.annotations.ApiParam; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; /** * 服务类 diff --git a/src/main/java/com/ai/da/service/UserLikeService.java b/src/main/java/com/ai/da/service/UserLikeService.java index 6bb3bc01..510d1e0c 100644 --- a/src/main/java/com/ai/da/service/UserLikeService.java +++ b/src/main/java/com/ai/da/service/UserLikeService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.entity.UserLike; import com.ai.da.model.vo.UserLikeVO; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/src/main/java/com/ai/da/service/WorkspaceService.java b/src/main/java/com/ai/da/service/WorkspaceService.java index 324ceeed..17a66f29 100644 --- a/src/main/java/com/ai/da/service/WorkspaceService.java +++ b/src/main/java/com/ai/da/service/WorkspaceService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.enums.BizJson; import com.ai.da.model.vo.ModelsVO; @@ -9,7 +9,6 @@ import com.ai.da.model.vo.WorkspaceVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import javax.servlet.http.HttpServletRequest; import java.io.FileNotFoundException; import java.util.List; 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 f7b80773..e5c24f73 100644 --- a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.AccountLoginLogMapper; -import com.ai.da.mapper.entity.AccountLoginLog; +import com.ai.da.mapper.primary.AccountLoginLogMapper; +import com.ai.da.mapper.primary.entity.AccountLoginLog; import com.ai.da.service.AccountLoginLogService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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 592459d9..d8340592 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -8,11 +8,11 @@ import com.ai.da.common.enums.AuthenticationOperationTypeEnum; 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.AccountMapper; -import com.ai.da.mapper.TrialOrderMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.AccountLoginLog; -import com.ai.da.mapper.entity.TrialOrder; +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.AccountLoginLog; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.dto.*; import com.ai.da.model.enums.AutoApproved; import com.ai.da.model.enums.Language; @@ -36,6 +36,7 @@ import org.springframework.util.Assert; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; @@ -76,7 +77,7 @@ public class AccountServiceImpl extends ServiceImpl impl @Transactional public AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO) { log.info("aida预先登入accountDTO###{}", JSON.toJSONString(accountDTO)); - Account account = getOneByUserName(accountDTO.getUserName()); + Account account = getOneByEmail(accountDTO.getEmail()); //用户有效期校验 validateUserValidaExpire(account); if ("Third-000000".equals(account.getUserPassword())) { @@ -294,7 +295,6 @@ public class AccountServiceImpl extends ServiceImpl impl return accountList.get(0); } - private Account getOneByUserName(String userName) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(Account::getUserName, userName); @@ -470,28 +470,27 @@ public class AccountServiceImpl extends ServiceImpl impl String ipAddress = RequestInfoUtil.getIpAddress(request); // 先检测试用订单 QueryWrapper trialOrderQueryWrapper = new QueryWrapper<>(); - trialOrderQueryWrapper.lambda().eq(TrialOrder::getIp, ipAddress); - trialOrderQueryWrapper.lambda().and(wrapper -> - wrapper.eq(TrialOrder::getEmail, accountTrialDTO.getEmail()) - .or() // OR - .like(TrialOrder::getUserName, accountTrialDTO.getUserName())); + trialOrderQueryWrapper.eq("BINARY email", accountTrialDTO.getEmail()); +// trialOrderQueryWrapper.lambda().eq(TrialOrder::getIp, ipAddress); +// trialOrderQueryWrapper.lambda().and(wrapper -> +// wrapper.eq(TrialOrder::getEmail, accountTrialDTO.getEmail()) +// .or() // OR +// .like(TrialOrder::getUserName, accountTrialDTO.getUserName())); List trialOrders = trialOrderMapper.selectList(trialOrderQueryWrapper); if (CollectionUtil.isNotEmpty(trialOrders)) { throw new BusinessException("You have submitted a trial application, please wait for approval."); } // 先检测用户名和邮箱 QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Account::getUserEmail, accountTrialDTO.getEmail()) - .or() - .eq(Account::getUserName, accountTrialDTO.getUserName()); + qw.eq("BINARY email", accountTrialDTO.getEmail()); List accountList = accountMapper.selectList(qw); if (CollectionUtil.isNotEmpty(accountList)) { if (accountList.get(0).getIsTrial() == 1) { - throw new BusinessException("The username or email has already been registered", ResultEnum.PROMPT.getCode()); + throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); }else { Account account = accountList.get(0); if (null == account.getValidEndTime() || account.getValidEndTime() > System.currentTimeMillis()) { - throw new BusinessException("The username or email has already been registered", ResultEnum.PROMPT.getCode()); + throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); } } } @@ -501,9 +500,9 @@ public class AccountServiceImpl extends ServiceImpl impl trialOrder.setStatus(0); trialOrder.setIp(ipAddress); trialOrderMapper.insert(trialOrder); -// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,1, trialOrder.getCountry()); -// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,1, trialOrder.getCountry()); -// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,1, trialOrder.getCountry()); +// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,1); +// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,1); +// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,1); // 判断当前的试用订单是否自动批准 if (AutoApproved.getStatus()) { // 改变试用订单状态,新增试用用户 @@ -531,9 +530,9 @@ public class AccountServiceImpl extends ServiceImpl impl accountMapper.insert(account); } // 发送邮件提醒用户试用用户已创建 -// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2, trialOrder.getCountry()); -// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2, trialOrder.getCountry()); -// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2, trialOrder.getCountry()); +// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2); +// 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()); }else { @@ -559,9 +558,7 @@ public class AccountServiceImpl extends ServiceImpl impl trialOrderMapper.updateById(trialOrder); QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Account::getUserEmail, trialOrder.getEmail()) - .or() - .eq(Account::getUserName, trialOrder.getUserName()); + qw.eq("BINARY email", trialOrder.getEmail()); List accountList = accountMapper.selectList(qw); Account account = new Account(); @@ -896,7 +893,7 @@ public class AccountServiceImpl extends ServiceImpl impl public void upgradeNotification() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.and(wrapper -> - wrapper.gt("valid_end_time", 1706112000000L) + wrapper.gt("valid_end_time", 1709515797000L) .or().isNull("valid_end_time")) .isNotNull("user_email"); @@ -913,4 +910,11 @@ public class AccountServiceImpl extends ServiceImpl impl // 未迁移过的进行迁移,注意模特数据迁移打点信息以及转换模特格式 } + + public void updateCredits(Long accountId, String value){ + Account account = new Account(); + account.setId(accountId); + account.setCredits(new BigDecimal(value)); + accountMapper.updateById(account); + } } diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java new file mode 100644 index 00000000..e0f5c107 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -0,0 +1,480 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.enums.AliPayTradeStateEnum; +import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.enums.PayTypeEnum; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; +import com.ai.da.service.*; +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConstants; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.request.*; +import com.alipay.api.response.*; +import com.google.gson.Gson; +import com.google.gson.internal.LinkedTreeMap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; + +@Service +@Slf4j +public class AliPayServiceImpl implements AliPayService { + + @Resource + private OrderInfoService orderInfoService; + + @Resource + private AlipayClient alipayClient; + + @Resource + private Environment config; + + @Resource + private PaymentInfoService paymentInfoService; + + @Resource + private RefundInfoService refundsInfoService; + + @Resource + private CreditsService creditsService; + + private final ReentrantLock lock = new ReentrantLock(); + + @Transactional(rollbackFor = Exception.class) + @Override + public String tradeCreate(Integer amount, String returnUrl) { + + try { + //生成订单 + log.info("生成订单"); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY.getType()); + + //调用支付宝接口 + AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); + //配置需要的公共请求参数 + //支付完成后,支付宝发起异步通知的地址 + request.setNotifyUrl(config.getProperty("alipay.notify-url")); + //支付完成后,我们想让页面跳转回aida的页面,配置returnUrl +// request.setReturnUrl(config.getProperty("alipay.return-url")); + request.setReturnUrl(returnUrl); + + //组装当前业务方法的请求参数 + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderInfo.getOrderNo()); + BigDecimal total = new BigDecimal(orderInfo.getTotalFee().toString()); + bizContent.put("total_amount", total); +// bizContent.put("subject", orderInfo.getTitle()); + bizContent.put("subject", "积分购买"); + bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); + + request.setBizContent(bizContent.toString()); + + //执行请求,调用支付宝接口 + AlipayTradePagePayResponse response = alipayClient.pageExecute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + return response.getBody(); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + throw new BusinessException("Order creation failed"); + } + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new BusinessException("Order creation failed"); + } + } + + @Override + public String tradeNotify(Map params) { + log.info("支付通知正在执行"); + log.info("通知参数 ===> {}", params); + + String result = "failure"; + + try { + //异步通知验签 + boolean signVerified = AlipaySignature.rsaCheckV1( + params, + config.getProperty("alipay.alipay-public-key"), + AlipayConstants.CHARSET_UTF8, + AlipayConstants.SIGN_TYPE_RSA2); //调用SDK验证签名 + + if(!signVerified){ + //验签失败则记录异常日志,并在response中返回failure. + log.error("支付成功异步通知验签失败!"); + return result; + } + + // 验签成功后 + log.info("支付成功异步通知验签成功!"); + + //按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验, + //1 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号 + String outTradeNo = params.get("out_trade_no"); + OrderInfo order = orderInfoService.getOrderByOrderNo(outTradeNo); + if(order == null){ + log.error("订单不存在"); + return result; + } + + //2 判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额) + String totalAmount = params.get("total_amount"); + int totalAmountInt = new BigDecimal(totalAmount).intValue(); + int totalFeeInt = order.getTotalFee().intValue(); + if(totalAmountInt != totalFeeInt){ + log.error("金额校验失败"); + return result; + } + + //3 校验通知中的 seller_id(或者 seller_email) 是否为 out_trade_no 这笔单据的对应的操作方 + String sellerId = params.get("seller_id"); + String sellerIdProperty = config.getProperty("alipay.seller-id"); + if(!sellerId.equals(sellerIdProperty)){ + log.error("商家pid校验失败"); + return result; + } + + //4 验证 app_id 是否为该商户本身 + String appId = params.get("app_id"); + String appIdProperty = config.getProperty("alipay.app-id"); + if(!appId.equals(appIdProperty)){ + log.error("appid校验失败"); + return result; + } + + //在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS时, + // 支付宝才会认定为买家付款成功。 + String tradeStatus = params.get("trade_status"); + if(!"TRADE_SUCCESS".equals(tradeStatus)){ + log.error("支付未成功"); + return result; + } + + //处理业务 修改订单状态 记录支付日志 + processOrder(params); + + //校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure + result = "success"; + } catch (AlipayApiException e) { + e.printStackTrace(); + } + + return result; + } + + + /** + * 处理订单 + * @param params + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void processOrder(Map params) { + + log.info("处理订单"); + + //获取订单号 + String orderNo = params.get("out_trade_no"); + String totalAmount = params.get("total_amount"); + + /*在对业务数据进行状态检查和处理之前, + 要采用数据锁进行并发控制, + 以避免函数重入造成的数据混乱*/ + //尝试获取锁: + // 成功获取则立即返回true,获取失败则立即返回false。不必一直等待锁的释放 + if(lock.tryLock()) { + try { + //处理重复通知 + //接口调用的幂等性:无论接口被调用多少次,以下业务执行一次 +// 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)) { + return; + } + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); + //记录支付日志 + paymentInfoService.createPaymentInfoForAliPay(params); + // 添加积分变更记录 + creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), + CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay", + CreditsEventsEnum.BUY_CREDITS.getValue(), + "positive"); + // 更新积分 + creditsService.buyCredits(orderByOrderNo.getAccountId(),Integer.parseInt(totalAmount) / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + } finally { + //要主动释放锁 + lock.unlock(); + } + } + } + + /** + * 用户取消订单 + * @param orderNo + */ + @Override + public void cancelOrder(String orderNo) { + + //调用支付宝提供的统一收单交易关闭接口 + this.closeOrder(orderNo); + + //更新用户订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.CANCEL); + } + + /** + * 查询订单 + * @param orderNo + * @return 返回订单查询结果,如果返回null则表示支付宝端尚未创建订单 + */ + @Override + public String queryOrder(String orderNo) { + + try { + log.info("查单接口调用 ===> {}", orderNo); + + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo); + request.setBizContent(bizContent.toString()); + + AlipayTradeQueryResponse response = alipayClient.execute(request); + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + return response.getBody(); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + //throw new RuntimeException("查单接口的调用失败"); + return null;//订单不存在 + } + + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new BusinessException("查单接口的调用失败"); + } + } + + /** + * 根据订单号调用支付宝查单接口,核实订单状态 + * 如果订单未创建,则更新商户端订单状态 + * 如果订单未支付,则调用关单接口关闭订单,并更新商户端订单状态 + * 如果订单已支付,则更新商户端订单状态,并记录支付日志 + * @param orderNo + */ + @Override + public void checkOrderStatus(String orderNo) { + + log.warn("根据订单号核实订单状态 ===> {}", orderNo); + + String result = this.queryOrder(orderNo); + + //订单未创建 + if(result == null){ + log.warn("核实订单未创建 ===> {}", orderNo); + //更新本地订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED); + } + + //解析查单响应结果 + Gson gson = new Gson(); + HashMap resultMap = gson.fromJson(result, HashMap.class); + LinkedTreeMap alipayTradeQueryResponse = resultMap.get("alipay_trade_query_response"); + + String tradeStatus = (String)alipayTradeQueryResponse.get("trade_status"); + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); + if(AliPayTradeStateEnum.NOTPAY.getType().equals(tradeStatus)){ + log.warn("核实订单未支付 ===> {}", orderNo); + //如果订单未支付,则调用关单接口关闭订单 + this.closeOrder(orderNo); + // 并更新商户端订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED); + } + + if(AliPayTradeStateEnum.SUCCESS.getType().equals(tradeStatus)){ + log.warn("核实订单已支付 ===> {}", orderNo); + //如果订单已支付,则更新商户端订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); + //并记录支付日志 + paymentInfoService.createPaymentInfoForAliPay(alipayTradeQueryResponse); + // 添加积分变更记录 + creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), + CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay", + CreditsEventsEnum.BUY_CREDITS.getValue(), + "positive"); + // 更新积分 + creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + } + + } + + /** + * 关单接口的调用 + * @param orderNo 订单号 + */ + private void closeOrder(String orderNo) { + + try { + log.info("关单接口的调用,订单号 ===> {}", orderNo); + + AlipayTradeCloseRequest request = new AlipayTradeCloseRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo); + request.setBizContent(bizContent.toString()); + AlipayTradeCloseResponse response = alipayClient.execute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + //throw new RuntimeException("关单接口的调用失败"); + } + + } catch (AlipayApiException e) { + log.error("关单失败,原因 ===> {}",e.getMessage()); + throw new BusinessException("关单接口的调用失败"); + } + } + + /** + * 退款 + * @param orderNo + * @param reason + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void refund(String orderNo, String reason) { + + try { + log.info("调用退款API"); + //创建退款单 + RefundInfo refundInfo = refundsInfoService.createRefundByOrderNoForAliPay(orderNo, reason); + //调用统一收单交易退款接口 + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest (); + //组装当前业务方法的请求参数 + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo);//订单编号 + BigDecimal refund = new BigDecimal(refundInfo.getRefund().toString()); + //BigDecimal refund = new BigDecimal("2").divide(new BigDecimal("100")); + bizContent.put("refund_amount", refund);//退款金额:不能大于支付金额 + bizContent.put("refund_reason", reason);//退款原因(可选) + + request.setBizContent(bizContent.toString()); + + //执行请求,调用支付宝接口 + AlipayTradeRefundResponse response = alipayClient.execute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_SUCCESS); + //更新退款单 + refundsInfoService.updateRefundForAliPay( + refundInfo.getRefundNo(), + response.getBody(), + AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功 + // 更新积分状态 + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); + creditsService.creditsRefund(orderByOrderNo.getAccountId(), orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_ABNORMAL); + //更新退款单 + refundsInfoService.updateRefundForAliPay( + refundInfo.getRefundNo(), + response.getBody(), + AliPayTradeStateEnum.REFUND_ERROR.getType()); //退款失败 + } + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new BusinessException("创建退款申请失败"); + } + } + + /** + * 查询退款 + * @param orderNo + * @return + */ + @Override + public String queryRefund(String orderNo) { + + try { + log.info("查询退款接口调用 ===> {}", orderNo); + + AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo); + bizContent.put("out_request_no", orderNo); + request.setBizContent(bizContent.toString()); + + AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request); + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + return response.getBody(); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + //throw new RuntimeException("查单接口的调用失败"); + return null;//订单不存在 + } + + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new BusinessException("查单接口的调用失败"); + } + } + + /** + * 申请账单 + * @param billDate + * @param type + * @return + */ + @Override + public String queryBill(String billDate, String type) { + + try { + AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("bill_type", type); + bizContent.put("bill_date", billDate); + request.setBizContent(bizContent.toString()); + AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + + //获取账单下载地址 + Gson gson = new Gson(); + HashMap resultMap = gson.fromJson(response.getBody(), HashMap.class); + LinkedTreeMap billDownloadurlResponse = resultMap.get("alipay_data_dataservice_bill_downloadurl_query_response"); + String billDownloadUrl = (String)billDownloadurlResponse.get("bill_download_url"); + + return billDownloadUrl; + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + throw new BusinessException("申请账单失败"); + } + } catch (AlipayApiException e) { + log.error("申请账单失败,原因 ===> {}",e.getMessage()); + throw new BusinessException("申请账单失败"); + } + } +} diff --git a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java new file mode 100644 index 00000000..4445c6cb --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java @@ -0,0 +1,98 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.service.AlipayHKService; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; + +@Service +@Slf4j +public class AlipayHKServiceImpl implements AlipayHKService { + + @Value("${alipay.hk.merchant-id}") + private static String merchantId; + + @Value("${alipay.hk.segment-id}") + private static String segmentId; + + @Value("${alipay.hk.AESKey}") + private static String aesKey; + + @Value("${alipay.hk.rsaPrivateKey}") + private static String privateKeyPath; + + @Value("${alipay.hk.rsaPublicKey}") + private static String publicKeyPath; + + + /** + * 创建订单 + */ + public void createOrder(Integer amount){ + + HashMap param = new HashMap<>(); + String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + param.put("order_ref", orderRef); + param.put("amount", Integer.parseInt(CreditsEventsEnum.PRICE.getValue()) * amount); + param.put("subject", "AiDA Credits Purchase"); + param.put("wallet", "ALIPAYHK"); + param.put("segment_id", segmentId); + param.put("payment_solution", "WAP"); + + + } + + + /** + * 异步回调 + * @return + */ + public void callback(){ + + } + + + + + + + + + + + + + + + + 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(); + } + + +} 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 9cfffaf1..3c7544b6 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -9,12 +9,12 @@ import com.ai.da.common.enums.LibraryLevel1TypeEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MD5Utils; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.AccountMapper; -import com.ai.da.mapper.LibraryMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.ChatRobot; -import com.ai.da.mapper.ChatRobotMapper; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.LibraryMapper; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.ChatRobot; +import com.ai.da.mapper.primary.ChatRobotMapper; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.ChatFlushDTO; import com.ai.da.model.dto.ChatRobotLibraryDTO; import com.ai.da.model.dto.ChatSendDTO; 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 089052d1..1cd31f03 100644 --- a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java @@ -8,10 +8,10 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.CopyUtil; -import com.ai.da.mapper.ClassificationMapper; -import com.ai.da.mapper.ClassificationRelLibraryMapper; -import com.ai.da.mapper.entity.Classification; -import com.ai.da.mapper.entity.ClassificationRelLibrary; +import com.ai.da.mapper.primary.ClassificationMapper; +import com.ai.da.mapper.primary.ClassificationRelLibraryMapper; +import com.ai.da.mapper.primary.entity.Classification; +import com.ai.da.mapper.primary.entity.ClassificationRelLibrary; import com.ai.da.model.dto.ClassificationDTO; import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.ClassificationVO; 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 a44defca..fc1455ec 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -7,9 +7,9 @@ import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.*; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.CollectionElementMapper; -import com.ai.da.mapper.GenerateDetailMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.CollectionElementMapper; +import com.ai.da.mapper.primary.GenerateDetailMapper; +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; @@ -26,6 +26,7 @@ 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; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,6 +37,8 @@ import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.*; import java.util.stream.Collectors; @@ -622,6 +625,7 @@ public class CollectionElementServiceImpl extends ServiceImpl implements CreditsService { + + @Value("${redis.key.credits.pre-deduction}") + private String creditsDeduction; + + @Resource + private AccountService accountService; + @Resource + private AccountMapper accountMapper; + @Resource + private RedisUtil redisUtil; + + @Override + public void initCredits() { + accountService.updateCredits(UserContext.getUserHolder().getId(), CreditsEventsEnum.INIT.getValue()); + } + + @Override + public Boolean buyCredits(Long accountId, Integer quantity) { + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal newCredits = new BigDecimal(CreditsEventsEnum.BUY_CREDITS.getValue()).multiply(new BigDecimal(quantity)); + BigDecimal added = existingCredits.add(newCredits); + accountService.updateCredits(accountId, added.toString()); + return Boolean.TRUE; + } + + @Override + public void creditsIncrease(Long accountId, String creditsEvent) { + CreditsEventsEnum event = null; + + switch (creditsEvent) { + case "Daily Check-In": + event = CreditsEventsEnum.DAILY_CHECKIN; + break; + case "Social Media Sharing": + event = CreditsEventsEnum.SOCIAL_MEDIA_SHARING; + break; + case "Other": + event = CreditsEventsEnum.OTHER; + break; + case "Super Resolution": + event = CreditsEventsEnum.SUPER_RESOLUTION; + break; + default: + throw new BusinessException("UNKNOWN TYPE"); + } + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal add = new BigDecimal(event.getValue()).add(existingCredits); + accountService.updateCredits(accountId, add.toString()); + } + + @Override + public void creditsDecrease(Long accountId, String creditsEvent) { + CreditsEventsEnum event; + + switch (creditsEvent) { + case "Super Resolution": + event = CreditsEventsEnum.SUPER_RESOLUTION; + break; + case "Other": + event = CreditsEventsEnum.OTHER; + break; + default: + log.error("UNKNOWN TYPE"); + throw new BusinessException("UNKNOWN TYPE"); + } + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal subtract = existingCredits.subtract(new BigDecimal(event.getValue())); + accountService.updateCredits(accountId, subtract.toString()); + } + + @Override + public String getCredits(Long accountId) { + Account account = accountMapper.selectById(accountId); + return account.getCredits().toString(); + } + + public void creditsRefund(Long accountId, Integer quantity) { + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal newCredits = new BigDecimal(CreditsEventsEnum.BUY_CREDITS.getValue()).multiply(new BigDecimal(quantity)); + BigDecimal subtracted = existingCredits.subtract(newCredits); + accountService.updateCredits(accountId, subtracted.toString()); + } + + /** + * 向积分变更详细表添加记录 + * + * @param changeEvent 导致积分变更的事件 + * @param credits 变更的积分 + * @param changeType 变更类型 : positive->增 negative->减 + */ + @Override + public void insertToCreditsDetail(Long accountId, String changeEvent, String credits, String changeType) { + CreditsDetail creditsDetail = new CreditsDetail(); + Account account = accountMapper.selectById(accountId); + BigDecimal finalCredits; + String changeCredits; + if ("positive".equals(changeType)) { + finalCredits = account.getCredits().add(new BigDecimal(credits)); + changeCredits = "+" + credits; + } else { + finalCredits = account.getCredits().subtract(new BigDecimal(credits)); + changeCredits = "-" + credits; + } + creditsDetail.setAccountId(accountId); + creditsDetail.setChangeEvent(changeEvent); + creditsDetail.setChangedCredits(changeCredits); + creditsDetail.setCredits(finalCredits); +// creditsDetail.setCredits(account.getCredits()); + creditsDetail.setCreateTime(LocalDateTime.now()); + + baseMapper.insert(creditsDetail); + } + + @Override + public PageBaseResponse queryCreditsDetailsPage(QueryIncomeOrExpenditureDTO queryPageByTimeDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("account_id", UserContext.getUserHolder().getId()); + + String startTime = queryPageByTimeDTO.getStartTime(); + String endTime = queryPageByTimeDTO.getEndTime(); + if (StringUtil.isNullOrEmpty(startTime)) { + startTime = "2024-03-01 00:00:00"; + } + if (StringUtil.isNullOrEmpty(endTime)) { + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + endTime = now.format(dateTimeFormatter); + } + if (!Objects.isNull(queryPageByTimeDTO.getIsIncome())) { + if (queryPageByTimeDTO.getIsIncome()) { + qw.likeRight("changed_credits", "+"); + } else { + qw.likeRight("changed_credits", "-"); + } + } + + qw.between("create_time", startTime, endTime); + qw.orderByDesc("create_time"); + Page pageInfo = new Page<>(queryPageByTimeDTO.getPage(), queryPageByTimeDTO.getSize()); + Page orderInfo = baseMapper.selectPage(pageInfo, qw); + if (CollectionUtils.isEmpty(orderInfo.getRecords())) { + return PageBaseResponse.success(new Page<>()); + } + + return PageBaseResponse.success(orderInfo); + } + + public Boolean checkCredits(Long accountId, CreditsEventsEnum event, Integer num) { + String credits = getCredits(accountId); + if (new BigDecimal(credits) + .subtract(new BigDecimal(event.getValue()) + .multiply(new BigDecimal(num))) + .compareTo(BigDecimal.ZERO) < 0) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + + + /* + * 积分扣除升级 -- 预扣积分 + * 思路: + * 1、先判断当前积分扣除待扣积分后,剩余积分够不够当前操作需要的积分 + * 2、将需要进行积分扣除操作请求的 任务id和需要扣除的积分存到redis + * 3、执行成功后,从redis中拿出当前任务id对应需要扣除的积分,扣除积分,更新数据库积分,移除redis的记录 + * 4、执行失败,直接移除记录 + */ + /** 积分预扣除 */ + public Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num){ + Long accountId = UserContext.getUserHolder().getId(); + + // 1、获取当前需要预扣除的积分 + Set keys = redisUtil.getKeysFromString(creditsDeduction + ":" + accountId + ":*"); + List multiValue = redisUtil.getMultiValue(keys); + int sum = multiValue.stream().mapToInt(Integer::parseInt).sum(); + sum += Integer.parseInt(event.getValue()) * num; + + // 2、获取当前积分 + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal subtract = existingCredits.subtract(new BigDecimal(sum)); + + // 3、判断剩余积分是否够本次操作 + if (subtract.compareTo(BigDecimal.ZERO) < 0){ + // 3.1 不够,直接返回余额不够,充值 + return Boolean.FALSE; + } + + return Boolean.TRUE; + } + + /** 执行扣除积分,更新数据库 */ + @Override + @Transactional(rollbackFor = Exception.class) + public void taskCreditsDeduction(Long accountId, String taskId){ + String key = creditsDeduction + ":" + accountId + ":" + taskId; + // 1、获取当前任务id对应的积分 + String value = redisUtil.getFromString(key); + + // 1.1 没有。返回,报错,未找到当前任务 + if (StringUtil.isNullOrEmpty(value)){ + throw new BusinessException("当前任务不存在,无法扣除积分"); + } + + // 2、操作数据库,扣除积分 + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal subtract = existingCredits.subtract(new BigDecimal(value)); + accountService.updateCredits(accountId, subtract.toString()); + + // 3、从redis中移除当前待扣积分 + redisUtil.removeFromString(key); + } + +} diff --git a/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java index 8532c905..8937556f 100644 --- a/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.DesignHistoryMapper; -import com.ai.da.mapper.entity.DesignHistory; +import com.ai.da.mapper.primary.DesignHistoryMapper; +import com.ai.da.mapper.primary.entity.DesignHistory; import com.ai.da.service.DesignHistoryService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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 189bca2e..1489c11a 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java @@ -1,8 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.DesignItemDetailPrintMapper; -import com.ai.da.mapper.entity.DesignItemDetailPrint; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.DesignItemDetailPrintMapper; +import com.ai.da.mapper.primary.entity.DesignItemDetailPrint; import com.ai.da.service.DesignItemDetailPrintService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java index 30ff7c1b..e35c0ea3 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java @@ -2,8 +2,8 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.LayersPriorityEnum; -import com.ai.da.mapper.DesignItemDetailMapper; -import com.ai.da.mapper.entity.DesignItemDetail; +import com.ai.da.mapper.primary.DesignItemDetailMapper; +import com.ai.da.mapper.primary.entity.DesignItemDetail; import com.ai.da.service.DesignItemDetailService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 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 7b8853ca..613d8e71 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -3,14 +3,17 @@ package com.ai.da.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; 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.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.mapper.DesignItemMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.DesignItemMapper; +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.vo.*; @@ -30,8 +33,10 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.IOException; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -488,6 +493,8 @@ public class DesignItemServiceImpl extends ServiceImpl idChanged = designSingleItemDTOList.stream().collect(Collectors.toMap(DesignSingleItemDTO::getId, DesignSingleItemDTO::getChanged)); + // 获取每个单品的designType,该状态需要再返回给前端 + Map idDesignType = designSingleItemDTOList.stream().collect(Collectors.toMap(DesignSingleItemDTO::getId, DesignSingleItemDTO::getDesignType)); + boolean flag = singleOrOverall.equals("single"); designSingleItemDTOList.forEach(singleItem -> { DesignItemClothesDetailVO designItemClothesDetailVO = new DesignItemClothesDetailVO(); designItemClothesDetailVO.setId(singleItem.getId()); + designItemClothesDetailVO.setChanged(idChanged.get(singleItem.getId())); + designItemClothesDetailVO.setDesignType(idDesignType.get(singleItem.getId())); designItemClothesDetailVO.setType(singleItem.getType()); designItemClothesDetailVO.setPath(minioUtil.getPresignedUrl(singleItem.getPath(), 24 * 60)); designItemClothesDetailVO.setMinIOPath(singleItem.getPath()); designItemClothesDetailVO.setColor(panToneService.getPantoneByRgb(singleItem.getColor())); -// designItemClothesDetailVO.setPrintObject(new DesignPythonItemPrint(singleItem.getPrintObject().getPath())); designItemClothesDetailVO.setPrintObject(singleItem.getPrintObject()); designItemClothesDetailVO.setLayersObject(layersObject.stream().filter( layers -> (singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0]) @@ -703,4 +712,68 @@ public class DesignItemServiceImpl extends ServiceImpl libraries = new ArrayList<>(); + // 添加sketch到library + designSingleIncludeLayersDTO.getDesignSingleItemDTOList().forEach(designSingleItem -> { + + if (!StringUtil.isNullOrEmpty(designSingleItem.getDesignType()) && designSingleItem.getDesignType().equals("Collection")){ + String path = minioUtil.getPresignedUrl(designSingleItem.getPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); + try { + String md5 = MD5Utils.encryptFile(path, false); + // 先判断是否需要被加入到library + Boolean needAdd = libraryService.checkMd5(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName(), + designSingleItem.getType(), + designSingleIncludeLayersDTO.getGender(), + md5); + // 加入到library + if (needAdd){ + Library library = new Library(); + library.setAccountId(UserContext.getUserHolder().getId()); + library.setLevel1Type(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName()); + library.setLevel2Type(designSingleItem.getType()); + library.setLevel3Type(designSingleIncludeLayersDTO.getGender()); + library.setUrl(designSingleItem.getPath()); + library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); + library.setMd5(md5); + library.setCreateDate(DateUtil.getByTimeZone(designSingleIncludeLayersDTO.getTimeZone())); + libraries.add(library); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + // 添加print到library + designSingleItem.getPrintObject().getPrints().forEach(print -> { + if (!StringUtil.isNullOrEmpty(print.getDesignType()) && print.getDesignType().equals("Collection")){ + String path = minioUtil.getPresignedUrl(print.getMinIOPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); + try { + String md5 = MD5Utils.encryptFile(path, false); + // 先判断是否已被加入到library + Boolean needAdd = libraryService.checkMd5(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), + null, + null, + md5); + // 加入到library + if (needAdd){ + Library library = new Library(); + library.setAccountId(UserContext.getUserHolder().getId()); + library.setLevel1Type(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName()); + library.setUrl(print.getMinIOPath()); + library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); + library.setMd5(md5); + library.setCreateDate(DateUtil.getByTimeZone(designSingleIncludeLayersDTO.getTimeZone())); + libraries.add(library); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + } ); + libraryService.saveBatch(libraries); + } } 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 d24874c2..f5fe6222 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -7,11 +7,11 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.*; import com.ai.da.common.utils.*; -import com.ai.da.mapper.DesignMapper; -import com.ai.da.mapper.GenerateDetailMapper; -import com.ai.da.mapper.TDesignPythonOutfitMapper; -import com.ai.da.mapper.entity.*; -import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.primary.DesignMapper; +import com.ai.da.mapper.primary.GenerateDetailMapper; +import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; +import com.ai.da.mapper.primary.entity.*; +import com.ai.da.mapper.primary.entity.Collection; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.python.PythonService; @@ -43,7 +43,6 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static com.ai.da.common.enums.LayersPriorityEnum.BODY; import static com.ai.da.python.vo.DesignPythonItem.*; /** @@ -305,21 +304,36 @@ public class DesignServiceImpl extends ServiceImpl impleme //保存design Long designId = saveOne(designDTO, collectionId, userInfo.getId()); //计算library - calculateLibraryAndSysFile(designDTO, elementVO, userInfo); +// calculateLibraryAndSysFile(designDTO, elementVO, userInfo); //组装design入参 + long startTime = System.currentTimeMillis(); DesignPythonObjects pythonObjects = pythonService.covertDesignParam(designDTO.getSystemScale(), designDTO.getSingleOverall(), designDTO.getSwitchCategory(), elementVO, designDTO.getProcessId()); + long endTime = System.currentTimeMillis(); + long totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("组装入参运行时间:" + totalTimeInSeconds + " 秒"); // pythonObjects增加image_id关联 + startTime = System.currentTimeMillis(); List imageIds = relationImageIds(pythonObjects); - System.out.println(imageIds); + endTime = System.currentTimeMillis(); + totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("增加image_id关联运行时间:" + totalTimeInSeconds + " 秒"); //design + startTime = System.currentTimeMillis(); JSONObject responseJSONObject = pythonService.designNew(pythonObjects); + endTime = System.currentTimeMillis(); + totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("design python端运行时间:" + totalTimeInSeconds + " 秒"); //生成library + startTime = System.currentTimeMillis(); generateLibrary(elementVO, designDTO.getTimeZone()); //处理关联关系,修复element覆盖得情况 List relationElements = collectionElementService.getByOnlyCollectionId(collectionId); List relationElementIds = relationElements.stream().map(CollectionElement::getId).collect(Collectors.toList()); handleCollectionElementRelation(collectionId, null != collectionIdParam, relationElementIds); + endTime = System.currentTimeMillis(); + totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("处理关联关系运行时间:" + totalTimeInSeconds + " 秒"); //保存python返回信息;保存designItem和detail return savePythonDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone(), responseJSONObject, designDTO.getSingleOverall()); } @@ -703,10 +717,10 @@ public class DesignServiceImpl extends ServiceImpl impleme throw new BusinessException("collection.not.found"); } AuthPrincipalVo userInfo = UserContext.getUserHolder(); - //查询用户 sketch library - List libraryVos = libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(), - Arrays.asList(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), - CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())); +// //查询用户 sketch library +// List libraryVos = libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(), +// Arrays.asList(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), +// CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())); //校验collection element DesignCollectionDTO designCollectionDTO = CopyUtil.copyObject(reDesignDTO, DesignCollectionDTO.class); ValidateElementVO elementVO = collectionElementService.validateElement(designCollectionDTO); @@ -1016,49 +1030,41 @@ public class DesignServiceImpl extends ServiceImpl impleme public Integer designProcess(String processId) { ProcessIdObject object = new ProcessIdObject(); object.setProcess_id(processId); + OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) - .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) - .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) - .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .pingInterval(5, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) .build(); + MediaType mediaType = MediaType.parse("application/json"); - //关闭FastJson的引用检测 防止出现$ref 现象 String param = JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect); log.info("designProcess请求python 参数:####{}", param); RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() - // .url("http://18.167.251.121:9991/api/get_progress") -// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .url(accessPythonIp + ":" + accessPythonPort + "/api/get_progress") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") .build(); - Response response; - try { - response = client.newCall(request).execute(); - } catch (IOException e) { - log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e)); - return 0; - } - if (response.isSuccessful()) { - try { - if (Objects.nonNull(response.body())) { - String responseBody = response.body().string(); - JSONObject responseObject = JSON.parseObject(responseBody); - String num = responseObject.getString("data"); - return Integer.valueOf(num); - } - return 0; - } catch (IOException | JSONException e) { - log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e)); - return 0; + + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + String responseBody = Objects.requireNonNull(response.body()).string(); + JSONObject responseObject = JSON.parseObject(responseBody); + String num = responseObject.getString("data"); + return Integer.valueOf(num); } + } catch (IOException | JSONException e) { + log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e)); } + return 0; } + private String converTypeToLevel1(String type) { if (StringUtils.isEmpty(type)) { return null; 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 0ea8e713..48f3655a 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -1,15 +1,16 @@ 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.GenerateModeEnum; import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.CollectionElementMapper; -import com.ai.da.mapper.GenerateCancelMapper; -import com.ai.da.mapper.GenerateDetailMapper; -import com.ai.da.mapper.GenerateMapper; -import com.ai.da.mapper.entity.*; +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.entity.*; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.dto.GenerateToPythonDTO; @@ -22,7 +23,9 @@ import com.ai.da.service.RabbitMQService; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; import io.minio.errors.MinioException; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; @@ -33,7 +36,9 @@ 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.*; @@ -68,17 +73,17 @@ public class GenerateServiceImpl extends ServiceImpl i @Resource private GenerateCancelMapper generateCancelMapper; - @Value("${redis.key.consumptionOrder}") + @Value("${redis.key.orderForGenerate}") private String consumptionOrderKey; - @Value("${redis.key.cancelSet}") + @Value("${redis.key.generateCancelSet}") private String cancelSetKey; - @Value("${redis.key.exceptionMap}") + @Value("${redis.key.generateExceptionMap}") private String exceptionMapKey; - @Value("${redis.key.resultMap}") - private String resultMapKey; + @Value("${redis.key.generateResult}") + private String generateResultKey; @Override public GenerateCaptionVO generateCaption(Long sketchElementId) { @@ -95,12 +100,12 @@ public class GenerateServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) - public GenerateCollectionVO generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO) { + public void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO) { // 1、获取用户信息 Long accountId = generateThroughImageTextDTO.getUserId(); String generateType = generateThroughImageTextDTO.getGenerateType(); - // 2、判断必须入参是否为非空 + // 2、判断必须入参是否为非空(在prepare阶段已校验) Generate generate = new Generate(); generate.setAccountId(accountId); generate.setUniqueId(generateThroughImageTextDTO.getUniqueId()); @@ -111,36 +116,51 @@ public class GenerateServiceImpl extends ServiceImpl i generateType); generate.setModelName(StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getVersion()) ? ModelNameEnum.MODEL_0.getCode() : generateThroughImageTextDTO.getVersion()); generate.setCreateDate(DateUtil.getByTimeZone(generateThroughImageTextDTO.getTimeZone())); + generate.setElementSource(StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getDesignType()) ? null : generateThroughImageTextDTO.getDesignType()); String text = generateThroughImageTextDTO.getText(); Long elementId = generateThroughImageTextDTO.getCollectionElementId(); validateGeneraType(generate, text, elementId, generateType); + if (!StringUtil.isNullOrEmpty(text)) { + text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type()); + } - // 2.1 sketch或print在t_collection_element表中的信息是否需要更新 如 level2Type - CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type()); + // 2.1 sketch或print在t_collection_element表/t_library表中的信息是否需要更新 如 level2Type + CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type(), generateThroughImageTextDTO.getDesignType()); // 3、向模型发起请求 - int mode = GenerateModeEnum.TEXT.getValue().equals(generateType) ? - GenerateModeEnum.TEXT.getCode() : - GenerateModeEnum.TEXT_IMAGE.getCode(); + String mode = GenerateModeEnum.TEXT.getValue().equals(generateType) ? + GenerateModeEnum.TEXT.getType() : + 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())); -// List generatedSketchUrl = pythonService.generateSketchOrPrint(new GenerateToPythonDTO(accountId, Objects.isNull(elementId) ? null : collectionElement.getUrl(), -// category, text, mode, "1", generateThroughImageTextDTO.getGender())); - log.info("generate 响应 : " + generatedSketchUrl); - if (CollectionUtils.isEmpty(generatedSketchUrl)) { - return null; - } +// 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; +// } // 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中 save(generate); + // 5、将本次请求存入redis + String key = generateResultKey + ":" + generateThroughImageTextDTO.getUniqueId(); + String status; + if (requestResult) { + status = "Executing"; + } else { + status = "Fail"; + } + 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<>(); + /*List generatedCollectionItems = new ArrayList<>(); generatedSketchUrl.forEach(item -> { GenerateDetail generateDetail = new GenerateDetail(); GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); @@ -165,7 +185,48 @@ public class GenerateServiceImpl extends ServiceImpl i // 6、将模型返回的图片地址返回给前端 Long collectionId = Objects.isNull(collectionElement) ? null : collectionElement.getCollectionId(); - return new GenerateCollectionVO(generate.getId(), collectionId, generatedCollectionItems); + 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保存到数据库 + GenerateDetail generateDetail = new GenerateDetail(); + GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); + Generate generate; + try { + generate = selectByUniqueId(taskId); + } catch (MybatisPlusException e) { + log.error(e.getMessage()); + if (e.getMessage().equals("One record is expected, but the query result is multiple records")) { + generate = selectListByUniqueId(taskId).get(0); + } 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); + // 通过MD5值和level1Type,判断不同level1Type下相同的图片是否被like过 + List> libraryIdList = generateDetailMapper.getLibraryIdThroughMD5(md5, generate.getLevel1Type()); + if (!libraryIdList.isEmpty()) { + generateDetail.setIsLike((byte) 1); + generateDetail.setLibraryId(libraryIdList.get(0).get("library_id")); + generateCollectionItemVO.setIsLiked(Boolean.TRUE); + } + generateDetail.setUrl(url); + generateDetail.setGenerateId(generate.getId()); + generateDetail.setCreateDate(LocalDateTime.now()); + generateDetail.setMd5(md5); + 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); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } private void validateGeneraType(Generate generate, String text, Long elementId, String generateType) { @@ -180,18 +241,45 @@ public class GenerateServiceImpl extends ServiceImpl i if (Objects.isNull(elementId)) { throw new BusinessException("please.choose.an.image"); } - generate.setCollectionElementId(elementId); + generate.setElementId(elementId); break; case "text-image": if (StringUtil.isNullOrEmpty(text) || Objects.isNull(elementId)) { throw new BusinessException("please.input.the.caption.and.choose.an.image"); } generate.setText(text); - generate.setCollectionElementId(elementId); + generate.setElementId(elementId); default: } } + private String modifyPrompt(String userInput, Generate generate, String level1Type) { + String text = ""; + String translated = pythonService.promptTranslate(userInput); + switch (level1Type) { + case "Moodboard": + text = translated + ",high quality"; + generate.setText(text); + break; + case "Printboard": + if (userInput.contains("Painting Style")) { + userInput = "Picasso,increased color saturation,increased glossiness," + translated; + } 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; + } 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 = userInput + ", fabric print, high quality"; + generate.setText(text); + break; + case "Sketchboard": + text = "clear lines, simple outlines monochrome white vector image of " + translated + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k"; + generate.setText(text); + default: + } + return text; + } + @Override @Transactional(rollbackFor = Exception.class) public GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO) { @@ -315,6 +403,7 @@ public class GenerateServiceImpl extends ServiceImpl i @Override public PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) { +// public List prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) { // 1、参数检查,判断必须参数是否为空 if (Objects.isNull(generateThroughImageTextDTO.getUserId())) { throw new BusinessException("userId cannot be empty"); @@ -326,9 +415,9 @@ public class GenerateServiceImpl extends ServiceImpl i // 判断试用用户是否还有剩余试用机会 int trialsCount = 0; - if (generateThroughImageTextDTO.getIsTestUser()){ + if (generateThroughImageTextDTO.getIsTestUser()) { trialsCount = getTrialsCount(generateThroughImageTextDTO.getUserId(), generateThroughImageTextDTO.getLevel1Type()); - if (trialsCount >= 2){ + if (trialsCount >= 2) { return new PrepareForGenerateVO(0); } } @@ -337,41 +426,32 @@ public class GenerateServiceImpl extends ServiceImpl i Long elementId = generateThroughImageTextDTO.getCollectionElementId(); validateGeneraType(new Generate(), text, elementId, generateType); - // 2、生成唯一id 使用uuid + // 2、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 String uuid = UUID.randomUUID().toString(); -// SnowflakeUtil idWorker = new SnowflakeUtil(0, 0); -// long snowflakeId = idWorker.nextId(); + ArrayList taskIdList = new ArrayList<>(); + for (int i = 1; i <= 4; i++) { + String temp = uuid; + temp += "-" + i + "-" + generateThroughImageTextDTO.getUserId(); + taskIdList.add(temp); + generateThroughImageTextDTO.setUniqueId(temp); + String jsonString = JSON.toJSONString(generateThroughImageTextDTO); - int num = 1; - // 判断已经正常生成结果的uuid或正在排队的uuid中是否有相同的id - while ((redisUtil.isElementExistsInMap(resultMapKey, uuid) || - redisUtil.isElementExistsInZSet(consumptionOrderKey, uuid)) - && num < 10) { - uuid = UUID.randomUUID().toString(); - num++; + // 3、加入redis排队,便于获取实时排队信息 + Double maxScore = redisUtil.getMaxScore(consumptionOrderKey); + redisUtil.addToZSet(consumptionOrderKey, temp, maxScore); + + // 加入resultMap + String key = generateResultKey + ":" + temp; + GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Waiting"); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + + // 4、将消息发布到MQ消息队列 + rabbitMQService.publishMessageToGenerate(jsonString); } - // 无依据确定的数字 - if (num > 10) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - uuid = UUID.randomUUID().toString(); - } - generateThroughImageTextDTO.setUniqueId(uuid); - String jsonString = JSON.toJSONString(generateThroughImageTextDTO); - - // 3、加入redis排队,便于获取实时排队信息 - Double maxScore = redisUtil.getMaxScore(consumptionOrderKey); - redisUtil.addToZSet(consumptionOrderKey, uuid, maxScore); - - // 4、将消息发布到MQ消息队列 - rabbitMQService.publishMessage(jsonString); // 5、返回唯一id - return new PrepareForGenerateVO(uuid, 2 - trialsCount); + return new PrepareForGenerateVO(taskIdList, 2 - trialsCount); } @Override @@ -380,7 +460,7 @@ public class GenerateServiceImpl extends ServiceImpl i return redisUtil.getRank(consumptionOrderKey, uniqueId); } - @Override + /*@Override public GenerateCollectionVO getGenerateResult(String uniqueId) { // 1、判断该请求是否已经异常 Boolean isMember = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId); @@ -429,8 +509,37 @@ public class GenerateServiceImpl extends ServiceImpl i }); return new GenerateCollectionVO(generateId, null, generatedCollectionItems); + }*/ + + @Override + public List getGenerateResultList(List taskIdList) { + List results = new ArrayList<>(); + Set collect = new HashSet<>(); + taskIdList.forEach(taskId -> { + String key = generateResultKey + ":" + 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); + }); + // todo + if (taskIdList.size() == 4 && collect.size() == 1 && collect.contains("Fail")) { + log.info("当前4个生成结果均为失败"); + throw new BusinessException("generate.interface.error"); + } + return results; } + public Generate selectByUniqueId(String uniqueId) { QueryWrapper qw = new QueryWrapper<>(); qw.eq("unique_id", uniqueId); @@ -438,56 +547,81 @@ public class GenerateServiceImpl extends ServiceImpl i return getOne(qw); } - @Override - @Transactional(rollbackFor = Exception.class) - public void cancelGenerate(Long userId, String uniqueId, String timeZone) { - // 1、确认当前消息是否还在排队中 - Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId); - Boolean flag = Boolean.FALSE; - if (exists) flag = redisUtil.getRank(consumptionOrderKey, uniqueId) > 1L ? Boolean.TRUE : Boolean.FALSE; - // 不管flag的默认值是true还是false,只要exists为false,&& 将短路 - if (exists && flag) { - // 1.1、将需要取消的唯一id加入redis,以便及时取消生成 - redisUtil.addToSet(cancelSetKey, uniqueId); - // 1.2 将需要取消的id从redis的ConsumptionOrder中删除 - redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); - } else { - // 2、判断该消息是否异常 - boolean hasKey = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId); - // 3、判断该消息是否已经消费结束 - Boolean existsInResult = redisUtil.isElementExistsInMap(resultMapKey, uniqueId); - if (!hasKey && !existsInResult) { - // 设置取等待状态为false - AsyncCallerUtil.waitingStatus.put(uniqueId, false); - // 3、直接发送取消请求到python端 - pythonService.cancelGenerateTask(uniqueId); - } - } + public List selectListByUniqueId(String uniqueId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("unique_id", uniqueId).orderByDesc("id"); - // 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作 - GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone)); - generateCancelMapper.insert(generateCancel); + return baseMapper.selectList(qw); } - // 判断试用用户试用generate机会是否使用完毕 - private int getTrialsCount(Long userId, String level1Type){ + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelGenerate(Long userId, List uniqueIdList, String timeZone) { + // todo 取消待优化 + uniqueIdList.forEach(uniqueId -> { + // 1、将需要取消的唯一id加入redis,以便及时取消生成 + redisUtil.addToSet(cancelSetKey, uniqueId); + + /*// 1、确认当前消息是否还在排队中 + Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId); + Boolean flag = Boolean.FALSE; + if (exists) flag = redisUtil.getRank(consumptionOrderKey, uniqueId) > 1L ? Boolean.TRUE : Boolean.FALSE; + // 不管flag的默认值是true还是false,只要exists为false,&& 将短路 + if (exists && flag) { + // 1.1、将需要取消的唯一id加入redis,以便及时取消生成 + redisUtil.addToSet(cancelSetKey, uniqueId); + // 1.2 将需要取消的id从redis的ConsumptionOrder中删除 + redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); + } else { + // 2、判断该消息是否异常 + boolean hasKey = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId); + // 3、判断该消息是否已经消费结束 + Boolean existsInResult = redisUtil.isElementExistsInMap(resultMapKey, uniqueId); + if (!hasKey && !existsInResult) { + // 设置取等待状态为false + AsyncCallerUtil.waitingStatus.put(uniqueId, false); + // 3、直接发送取消请求到python端 + pythonService.cancelGenerateTask(uniqueId); + } + }*/ + + String key = generateResultKey + ":" + uniqueId; + GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); + // 判断当前task的状态是不是Fail + if (!generateResultVO.getStatus().equals("Fail")){ + // 2、不是,直接发送取消请求到python端 + pythonService.cancelGenerateTask(uniqueId); + // 3、更改result中当前taskId的状态 + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(uniqueId, null, null, "Cancelled")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + } + + // 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作,包括已经异常的请求 + GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone)); + generateCancelMapper.insert(generateCancel); + }); + + + } + + // 判断试用用户试用generate机会是否使用完毕 每个board 3次机会 + private int getTrialsCount(Long userId, String level1Type) { List getGenerateList = getGenerateByAccountId(userId, level1Type); - int trialsCount ; - if (getGenerateList.isEmpty()){ + int trialsCount; + if (getGenerateList.isEmpty()) { trialsCount = 0; - } else if (getGenerateList.size() == 1) { + } else if (getGenerateList.size() == 1 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 1)) { trialsCount = 1; - } else if (getGenerateList.size() == 2) { + } else if (getGenerateList.size() == 2 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 2)) { trialsCount = 2; - }else { + } else { trialsCount = 2; } return trialsCount; } - public List getGenerateByAccountId(Long accountId, String level1Type){ + public List getGenerateByAccountId(Long accountId, String level1Type) { QueryWrapper qw = new QueryWrapper<>(); - qw.eq("account_id",accountId); + qw.eq("account_id", accountId); qw.eq("level1_type", level1Type); return baseMapper.selectList(qw); diff --git a/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java index f8a33ca1..2f643368 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java @@ -5,8 +5,8 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.SingleOverallEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; -import com.ai.da.mapper.LibraryModelPointMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.LibraryModelPointMapper; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.LibraryModelPointDTO; import com.ai.da.model.dto.ModelsDotDTO; import com.ai.da.model.enums.ModelType; @@ -22,7 +22,6 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; 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 49edc997..bc09dd9c 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -12,11 +12,8 @@ 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.mapper.LibraryCopyMapper; -import com.ai.da.mapper.LibraryMapper; -import com.ai.da.mapper.LibraryModelPointCopyMapper; -import com.ai.da.mapper.SysFileMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.*; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.*; import com.ai.da.model.vo.*; @@ -368,7 +365,7 @@ 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/sketches_bounding_box") + .url(accessPythonIp + ":" + accessPythonPort + "/api/design_pre_processing") .method("POST", body) // .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") @@ -412,7 +409,8 @@ public class LibraryServiceImpl extends ServiceImpl impl qw.lambda().eq(Library::getLevel2Type, level2Type); qw.lambda().eq(Library::getLevel3Type, sex); } else { - qw.lambda().eq(Library::getLevel2Type, sex); +// qw.lambda().eq(Library::getLevel2Type, sex); + qw.lambda().eq(Library::getLevel3Type, sex); } } qw.lambda().eq(Library::getMd5, md5); @@ -597,7 +595,7 @@ public class LibraryServiceImpl extends ServiceImpl impl public void checkModel(String value, List modelIds, Integer deleteModelConfirm) { AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Workspace::getUserName, authPrincipalVo.getUsername()); + qw.lambda().eq(Workspace::getAccountId, authPrincipalVo.getId()); if (value.equals(Sex.FEMALE.getValue())) { qw.lambda().in(Workspace::getMannequinFemaleId, modelIds); } diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java new file mode 100644 index 00000000..36f02676 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java @@ -0,0 +1,215 @@ +package com.ai.da.service.impl; + + +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.utils.OrderNoUtils; +import com.ai.da.mapper.primary.OrderInfoMapper; +import com.ai.da.mapper.primary.ProductMapper; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.model.dto.QueryPageByTimeDTO; +import com.ai.da.model.vo.AuthPrincipalVo; +import com.ai.da.service.OrderInfoService; +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.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Service +@Slf4j +public class OrderInfoServiceImpl extends ServiceImpl implements OrderInfoService { + + @Resource + private ProductMapper productMapper; + + @Override + public OrderInfo createOrderByProductId(Integer amount, String paymentType) { + + //查找已存在但未支付的订单 + /*OrderInfo orderInfo = this.getNoPayOrderByProductId(amount, paymentType); + if( orderInfo != null){ + return orderInfo; + }*/ + + //获取商品信息 +// Product product = productMapper.selectById(amount); + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + Long accountId = userHolder.getId(); + + //生成订单 + OrderInfo orderInfo = new OrderInfo(); + orderInfo.setAccountId(accountId); + orderInfo.setTitle("积分购买 X" + amount ); + orderInfo.setOrderNo(OrderNoUtils.getOrderNo()); //订单号 ?? +// orderInfo.setProductId(amount); + orderInfo.setTotalFee(Integer.parseInt(CreditsEventsEnum.PRICE.getValue()) * amount); // 元 HKD + orderInfo.setOrderStatus(OrderStatusEnum.NOT_PAY.getType()); //未支付 + orderInfo.setPaymentType(paymentType); + baseMapper.insert(orderInfo); + + return orderInfo; + } + + /** + * 存储订单二维码 + * @param orderNo + * @param codeUrl + */ + @Override + public void saveCodeUrl(String orderNo, String codeUrl) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.setCodeUrl(codeUrl); + + baseMapper.update(orderInfo, queryWrapper); + } + + /** + * 查询订单列表,并倒序查询 + * @return + */ + @Override + public List listOrderByCreateTimeDesc() { + + QueryWrapper queryWrapper = new QueryWrapper().orderByDesc("create_time"); + return baseMapper.selectList(queryWrapper); + } + + /** + * 根据订单号更新订单状态 + * @param orderNo + * @param orderStatus + */ + @Override + public void updateStatusByOrderNo(String orderNo, OrderStatusEnum orderStatus) { + + log.info("更新订单状态 ===> {}", orderStatus.getType()); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.setOrderStatus(orderStatus.getType()); + + baseMapper.update(orderInfo, queryWrapper); + } + + /** + * 根据订单号获取订单状态 + * @param orderNo + * @return + */ + @Override + public String getOrderStatus(String orderNo) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + OrderInfo orderInfo = baseMapper.selectOne(queryWrapper); + if(orderInfo == null){ + return null; + } + return orderInfo.getOrderStatus(); + } + + /** + * 查询创建超过minutes分钟并且未支付的订单 + * @param minutes + * @return + */ + @Override + public List getNoPayOrderByDuration(int minutes, String paymentType) { + + Instant instant = Instant.now().minus(Duration.ofMinutes(minutes)); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_status", OrderStatusEnum.NOT_PAY.getType()); + queryWrapper.le("create_time", instant); + queryWrapper.eq("payment_type", paymentType); + + List orderInfoList = baseMapper.selectList(queryWrapper); + + return orderInfoList; + } + + /** + * 根据订单号获取订单 + * @param orderNo + * @return + */ + @Override + public OrderInfo getOrderByOrderNo(String orderNo) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + OrderInfo orderInfo = baseMapper.selectOne(queryWrapper); + + return orderInfo; + } + + + /** + * 根据商品id查询未支付订单 + * 防止重复创建订单对象 + * @param productId + * @return + */ + private OrderInfo getNoPayOrderByProductId(Long productId, String paymentType) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("product_id", productId); + queryWrapper.eq("order_status", OrderStatusEnum.NOT_PAY.getType()); + queryWrapper.eq("payment_type", paymentType); +// queryWrapper.eq("user_id", userId); + OrderInfo orderInfo = baseMapper.selectOne(queryWrapper); + return orderInfo; + } + + @Override + public PageBaseResponse getOrderByPage(QueryPageByTimeDTO queryPageByTimeDTO){ + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("account_id",UserContext.getUserHolder().getId()); + + String startTime = queryPageByTimeDTO.getStartTime(); + String endTime = queryPageByTimeDTO.getEndTime(); + if (StringUtil.isNullOrEmpty(startTime)){ + startTime = "2024-02-01 00:00:00"; + } + if (StringUtil.isNullOrEmpty(endTime)){ + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + endTime = now.format(dateTimeFormatter); + } + qw.between("create_time", startTime, endTime); + qw.orderByDesc("create_time"); + Page pageInfo = new Page<>(queryPageByTimeDTO.getPage(), queryPageByTimeDTO.getSize()); + Page orderInfo = baseMapper.selectPage(pageInfo, qw); + if (CollectionUtils.isEmpty(orderInfo.getRecords())) { + return PageBaseResponse.success(new Page<>()); + } + + return PageBaseResponse.success(orderInfo); + } + + public void updateOrderNoById(Long id, String orderNo){ + OrderInfo orderInfo = new OrderInfo(); + orderInfo.setId(id); + orderInfo.setOrderNo(orderNo); + + baseMapper.updateById(orderInfo); + } +} diff --git a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java index ace532b9..958e4b4e 100644 --- a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java @@ -5,9 +5,9 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.PantoneUtils; -import com.ai.da.mapper.entity.ColorLookupTable; -import com.ai.da.mapper.entity.PanTone; -import com.ai.da.mapper.PanToneMapper; +import com.ai.da.mapper.primary.entity.ColorLookupTable; +import com.ai.da.mapper.primary.entity.PanTone; +import com.ai.da.mapper.primary.PanToneMapper; import com.ai.da.model.dto.GetRgbByHsvBatchDTO; import com.ai.da.model.vo.PantoneVO; import com.ai.da.service.ColorLoopUpTableService; @@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import io.netty.util.internal.StringUtil; -import org.checkerframework.checker.units.qual.A; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java new file mode 100644 index 00000000..39eb3206 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java @@ -0,0 +1,642 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.convert.Convert; +import com.ai.da.common.config.PayPalClient; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.enums.*; +import com.ai.da.common.utils.RedisUtil; +import com.ai.da.common.utils.paypalRequest.AuthenticationRequest; +import com.ai.da.common.utils.paypalRequest.WebhookVerifyRequest; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; +import com.ai.da.service.*; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.paypal.api.payments.Event; +import com.paypal.base.Constants; +import com.paypal.base.SDKUtil; +import com.paypal.base.rest.APIContext; +import com.paypal.base.rest.PayPalRESTException; +import com.paypal.http.HttpResponse; +import com.paypal.http.exceptions.SerializeException; +import com.paypal.http.serializer.Json; +import com.paypal.orders.*; +import com.paypal.payments.CapturesGetRequest; +import com.paypal.payments.CapturesRefundRequest; +import com.paypal.payments.RefundRequest; +import com.paypal.payments.RefundsGetRequest; +import lombok.extern.slf4j.Slf4j; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; +import java.util.*; + +import static com.ai.da.common.constant.PayPalCheckoutConstant.*; + +@Slf4j +@Service +//@RefreshScope +public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { + + @Value("${paypal.receiver.email}") + private String receiverEmail; + + @Value("${paypal.client-id}") + private String clientId; + + @Value("${paypal.client-secret}") + private String clientSecret; + + @Value("${paypal.mode}") + private String mode; + + @Value("${paypal.webhook_id}") + private String webhookId; + + @Resource + private PayPalClient payPalClient; + @Resource + private OrderInfoService orderInfoService; + @Resource + private PaymentInfoService paymentInfoService; + @Resource + private RefundInfoService refundsInfoService; + @Resource + private CreditsService creditsService; + @Resource + private RedisUtil redisUtil; + + /** + * 创建订单的方法 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public HashMap createOrder(Integer amount, String returnUrl) throws SerializeException { + // 生成订单 + log.info("生成订单"); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.PAYPAL.getType()); + + OrdersCreateRequest request = new OrdersCreateRequest(); + request.header("prefer", "return=representation"); + request.requestBody(buildRequestBody(String.valueOf(orderInfo.getTotalFee()), returnUrl)); + HttpResponse response = null; + try { + response = payPalClient.client(mode, clientId, clientSecret).execute(request); + } catch (Exception e) { + log.error("调用paypal订单创建失败,失败原因 ===> {}", e.getMessage()); + throw new BusinessException("Order creation failed"); + } + + String approve = ""; + assert response != null; + if (response.statusCode() == 201) { + log.info("Status Code = {}, Status = {}, OrderID = {}, Intent = {}", response.statusCode(), response.result().status(), response.result().id(), response.result().checkoutPaymentIntent()); + for (LinkDescription link : response.result().links()) { + log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method()); + if (link.rel().equals("approve")) { + approve = link.href(); + } + } + String totalAmount = response.result().purchaseUnits().get(0).amountWithBreakdown().currencyCode() + ":" + response.result().purchaseUnits().get(0).amountWithBreakdown().value(); + log.info("Total Amount: {}", totalAmount); + String json = new JSONObject(new Json().serialize(response.result())).toString(4); + log.info("createOrder response body: {}", json); + } + + String orderId = response.result().id(); + orderInfoService.updateOrderNoById(orderInfo.getId(), orderId); + + HashMap returnData = new HashMap<>(); + returnData.put("approve", approve); + returnData.put("orderNo", orderId); + + // 需要返回地址和订单id + return returnData; + } + + // ##Validate Webhook + public Boolean doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + try { + String body = getBody(req); + Map webhookEvent = new ObjectMapper().readValue(body, Map.class); + + HashMap webhookRequest = new HashMap<>(); + webhookRequest.put("auth_algo", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-AUTH-ALGO")); + webhookRequest.put("cert_url", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-CERT-URL")); + webhookRequest.put("transmission_id", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-ID")); + webhookRequest.put("transmission_sig", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-SIG")); + webhookRequest.put("transmission_time", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-TIME")); + webhookRequest.put("webhook_id", webhookId); + webhookRequest.put("webhook_event", webhookEvent); + + WebhookVerifyRequest webhookVerifyRequest = new WebhookVerifyRequest(); + webhookVerifyRequest.authorization(getOAuth()); + webhookVerifyRequest.requestBody(webhookRequest); + // 验签 + HttpResponse verified = payPalClient.client(mode, clientId, clientSecret).execute(webhookVerifyRequest); + boolean verifyResult = verified.result().get("verification_status").toString().equals("SUCCESS"); + if (verifyResult) { + // ### Api Context + APIContext apiContext = new APIContext(clientId, clientSecret, mode); + + // Set the webhookId that you received when you created this webhook. + apiContext.addConfiguration(Constants.PAYPAL_WEBHOOK_ID, webhookId); + Boolean result = Event.validateReceivedEvent(apiContext, getHeadersInfo( + req), body); + log.info("Webhook Validated: " + result); + + if (result) { + // 处理订单数据 + LinkedHashMap> webhookEventMap = (LinkedHashMap>) webhookEvent; + String orderId = webhookEventMap.get("resource").get("id"); + processOrder(orderId); + return Boolean.TRUE; + } + } else { + log.error("Paypal 验签失败"); + } + } catch (PayPalRESTException | InvalidKeyException | NoSuchAlgorithmException | SignatureException e) { + log.error(e.getMessage()); + } + return Boolean.FALSE; + } + + // Simple helper method to help you extract the headers from HttpServletRequest object. + private static Map getHeadersInfo(HttpServletRequest request) { + Map map = new HashMap(); + @SuppressWarnings("rawtypes") + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String key = (String) headerNames.nextElement(); + String value = request.getHeader(key); + map.put(key, value); + } + return map; + } + + // Simple helper method to fetch request data as a string from HttpServletRequest object. + private static String getBody(HttpServletRequest request) throws IOException { + String body; + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + log.info("回调参数 ===> {}", body); + return body; + } + + /** + * 生成订单主体信息 + */ + private OrderRequest buildRequestBody(String price, String returnUrl) { + OrderRequest orderRequest = new OrderRequest(); + orderRequest.checkoutPaymentIntent(CAPTURE); + + ApplicationContext applicationContext = new ApplicationContext() + .brandName(BRANDNAME) + .landingPage(LANDINGPAGE) + .cancelUrl(returnUrl).returnUrl(returnUrl) + .userAction(USERACTION) + .shippingPreference(SHIPPINGPREFERENCE); + orderRequest.applicationContext(applicationContext); + + List purchaseUnitRequests = new ArrayList(); + + PurchaseUnitRequest purchaseUnitRequest = new PurchaseUnitRequest() + .amountWithBreakdown(new AmountWithBreakdown() + .amountBreakdown(new AmountBreakdown()) + .currencyCode(CurrencyCodesEnum.HONG_KONG_DOLLAR.getCode()) + .value(price)); + purchaseUnitRequests.add(purchaseUnitRequest); + orderRequest.purchaseUnits(purchaseUnitRequests); + return orderRequest; + } + + /*@Override + public String callback(@SuppressWarnings("rawtypes") Map map) { + + log.info("paypal支付通知正在执行"); + log.info("通知参数 ===> {}", map); + +// log.info(map.toString()); + String outTradeNo = (String) map.get("invoice"); + String paymentStatus = (String) map.get("payment_status"); + String amount = (String) map.get("mc_gross"); + String currency = (String) map.get("mc_currency"); + String paymentId = (String) map.get("txn_id"); + String parentPaymentId = (String) map.get("parent_txn_id"); + log.info("商家订单号 = {}", outTradeNo); + log.info("订单状态 = {}", paymentStatus); + log.info("金额 = {}", amount); + log.info("币种 = {}", currency); + log.info("流水号 = {}", paymentId); + log.info("父流水号 = {}", parentPaymentId); + + if (!receiverEmail.equals(map.get("receiver_email"))) { + log.info("FAIL = 商户id错误, outTradeNo = {}", outTradeNo); + return "failure"; + } + if ("Completed".equals(paymentStatus)) { + //进行数据库操作 + // + // + log.info("支付成功,状态为=COMPLETED"); + return "success"; + } + if ("Refunded".equals(paymentStatus)) { + //进行数据库操作 + // + // + log.info("退款成功"); + return "success"; + } + if ("Pending".equals(paymentStatus) && StringUtils.isEmpty(parentPaymentId)) { + String pendingReason = String.valueOf(map.get("pending_reason")); + //进行数据库操作 + // + // + log.info("订单支付成功,状态为=PENDING,产生此状态的原因是 {}", pendingReason); + return "success"; + } + if (StringUtils.isEmpty(parentPaymentId)) { + if (PayPalCheckoutConstant.PAYMENT_STATUS_REVERSED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_CANCELED_REVERSAL.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_DENIED.equals(paymentStatus)) { + String reasonCode = String.valueOf(map.get("reason_code")); + //进行数据库操作(状态修改) + // + // + log.info("订单异常,请尽快查看处理,状态为={},产生此状态的原因是 {} ", paymentStatus, reasonCode); + return PayPalCheckoutConstant.SUCCESS; + } + if (PayPalCheckoutConstant.PAYMENT_STATUS_EXPIRED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_CREATED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_FAILED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_PROCESSED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_VOIDED.equals(paymentStatus)) { + //进行数据库操作(状态修改) + // + // + log.info("其他订单状态,订单异常,请尽快查看处理, 状态={}", paymentStatus); + return PayPalCheckoutConstant.SUCCESS; + } + } + return "failure"; + }*/ + + /** + * 查询订单信息 + * + * @param orderNo + * @return + * @throws SerializeException + */ + public Order queryOrder(String orderNo) throws SerializeException { + OrdersGetRequest request = new OrdersGetRequest(orderNo); + + HttpResponse response = null; + try { + response = payPalClient.client(mode, clientId, clientSecret).execute(request); + } catch (Exception e) { + log.error("paypal订单查询失败,失败原因 ===> {}", e.getMessage()); + return null; + } + log.debug("Status Code: " + response.statusCode() + "\tStatus: " + response.result().status() + "\tOrder id: " + response.result().id()); + if (response.result().purchaseUnits().get(0).payments() != null) { + List captures = response.result().purchaseUnits().get(0).payments().captures(); + if (captures != null) { + for (Capture capture : captures) { + log.debug("\t订单编号= " + capture.invoiceId() + "\tCapture Id= " + capture.id() + "\tCapture status= " + capture.status() + "\tCapture amount= " + capture.amount().currencyCode() + ":" + capture.amount().value()); + } + } + List refunds = response.result().purchaseUnits().get(0).payments().refunds(); + if (refunds != null) { + for (Refund refund : refunds) { + log.debug("\t售后编号= " + refund.invoiceId() + "\tRefund Id= " + refund.id() + "\tRefund status= " + refund.status() + "\tRefund amount= " + refund.amount().currencyCode() + ":" + refund.amount().value()); + } + } + } + for (com.paypal.orders.LinkDescription link : response.result().links()) { + log.debug("Links: \t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method()); + } + + + String json = new JSONObject(new Json().serialize(response.result())).toString(4); + log.info("Full response body: {}", json); + return response.result(); + } + + /** + * 用户授权支付成功,进行扣款操作 + */ + @Transactional(rollbackFor = Exception.class) + public Order captureOrder(String orderId) { + OrdersCaptureRequest request = new OrdersCaptureRequest(orderId); + request.requestBody(new OrderRequest()); + PayPalClient payPalClient = new PayPalClient(); + HttpResponse response; + + try { + response = payPalClient.client(mode, clientId, clientSecret).execute(request); + } catch (Exception e) { + log.error("调用paypal扣款失败,失败原因 ===> {}", e.getMessage()); + throw new BusinessException("Order deduction failed."); + } + log.info("Status Code = {}, Status = {}, OrderID = {}", response.statusCode(), response.result().status(), response.result().id()); + for (LinkDescription link : response.result().links()) { + log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method()); + } + for (PurchaseUnit purchaseUnit : response.result().purchaseUnits()) { + for (Capture capture : purchaseUnit.payments().captures()) { + log.info("Capture id: {}", capture.id()); + log.info("status: {}", capture.status()); + log.info("invoice_id: {}", capture.invoiceId()); + if ("COMPLETED".equals(capture.status())) { + //进行数据库操作,修改订单状态为已支付成功,尽快发货(配合回调和CapturesGet查询确定成功) + log.info("支付成功,状态为=COMPLETED"); + } + if ("PENDING".equals(capture.status())) { + log.info("status_details: {}", capture.captureStatusDetails().reason()); + String reason = "PENDING"; + if (capture.captureStatusDetails() != null && capture.captureStatusDetails().reason() != null) { + reason = capture.captureStatusDetails().reason(); + } + //进行数据库操作,修改订单状态为已支付成功,但触发了人工审核,请审核通过后再发货(配合回调和CapturesGet查询确定成功) + log.info("支付成功,状态为=PENDING : {}", reason); + } + } + } + Payer buyer = response.result().payer(); + log.info("Buyer Email Address: {}", buyer.email()); + log.info("Buyer Name: {} {}", buyer.name().givenName(), buyer.name().surname()); +// String jsonString = JSON.toJSONString(response.result()); + String json = null; + try { + json = new JSONObject(new Json().serialize(response.result())).toString(4); + } catch (SerializeException e) { + log.warn("response序列化出错,具体信息 ===> {}", e.getMessage()); + } + log.info("captureOrder response body: {}", json); +// return Convert.toStr(new Json().serialize(response.result())); + return response.result(); + } + + /** + * 查询扣款 + */ + public String queryCapture(String orderNo) throws IOException { + CapturesGetRequest request = new CapturesGetRequest("扣款id, CaptureOrder生成"); + + HttpResponse response = payPalClient.client(mode, clientId, clientSecret).execute(request); + System.out.println("Status Code: " + response.statusCode()); + System.out.println("Status: " + response.result().status()); + System.out.println("Capture ids: " + response.result().id()); + System.out.println("Links: "); + for (com.paypal.payments.LinkDescription link : response.result().links()) { + System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method()); + } + System.out.println("Full response body:"); + System.out.println(new JSONObject(new Json().serialize(response.result())).toString(4)); + return null; + } + + + /** + * 申请退款 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean refundOrder(String orderId, String reason) throws IOException { + + RefundInfo refundByOrderNo = refundsInfoService.createRefundByOrderNo(orderId, reason); + + OrdersGetRequest ordersGetRequest = new OrdersGetRequest(orderId); + PayPalClient payPalClient = new PayPalClient(); + HttpResponse ordersGetResponse = null; + ordersGetRequest.authorization("Bearer " + getOAuth()); + boolean result; + try { + ordersGetResponse = payPalClient.client(mode, clientId, clientSecret).execute(ordersGetRequest); + } catch (Exception e) { + log.error("调用paypal订单查询失败,失败原因 ===> {}", e.getMessage()); + throw new BusinessException("Order query failed"); + } + String captureId = ordersGetResponse.result().purchaseUnits().get(0).payments().captures().get(0).id(); + CapturesRefundRequest request = new CapturesRefundRequest(captureId); + request.authorization("Bearer " + getOAuth()); + request.prefer("return=representation"); + + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderId); + request.requestBody(buildRefundRequestBody(String.valueOf(orderInfo.getTotalFee()), reason)); + HttpResponse response = null; + try { + response = payPalClient.client(mode, clientId, clientSecret).execute(request); + } catch (IOException e) { + log.error("调用paypal退款申请失败,失败原因 {}", e.getMessage()); + throw new BusinessException("Request for refund failed"); + } + + log.info("Status Code = {}, Status = {}, RefundID = {}", response.statusCode(), response.result().status(), response.result().id()); + if ("COMPLETED".equals(response.result().status())) { + //进行数据库操作,修改状态为已退款(配合回调和退款查询确定退款成功) + + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.REFUND_SUCCESS); + + refundsInfoService.updateRefundForPayPal( + refundByOrderNo.getId(), + response.result().id(), + new Gson().toJson(response.result(), com.paypal.payments.Refund.class), + AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功 + + // 更新积分状态 + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderId); + creditsService.creditsRefund(orderByOrderNo.getAccountId(), orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + log.info("退款成功"); + result = Boolean.TRUE; + } else { + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.REFUND_ABNORMAL); + + //更新退款单 + refundsInfoService.updateRefundForPayPal( + refundByOrderNo.getId(), + response.result().id(), + new Gson().toJson(response.result(), com.paypal.payments.Refund.class), + AliPayTradeStateEnum.REFUND_ERROR.getType()); //退款失败 + result = Boolean.FALSE; + } + for (com.paypal.payments.LinkDescription link : response.result().links()) { + log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method()); + } + String json = new JSONObject(new Json().serialize(response.result())).toString(4); + log.info("refundOrder response body: {}", json); + return result; + } + + public RefundRequest buildRefundRequestBody(String price, String reason) { + RefundRequest refundRequest = new RefundRequest(); + com.paypal.payments.Money money = new com.paypal.payments.Money(); + money.currencyCode(CurrencyCodesEnum.HONG_KONG_DOLLAR.getCode()); + money.value(price); + refundRequest.amount(money); +// refundRequest.invoiceId("P2020052514440001"); + refundRequest.noteToPayer(reason); + try { + log.info("refund order body : {}", Convert.toStr(new Json().serialize(refundRequest))); + } catch (SerializeException e) { + throw new RuntimeException(e); + } + + return refundRequest; + } + + /** + * 查询退款 + */ + public String queryRefund(String orderNo) throws IOException { + RefundsGetRequest request = new RefundsGetRequest("退款id RefundOrder生成"); + HttpResponse response = payPalClient.client(mode, clientId, clientSecret).execute(request); + System.out.println("Status Code: " + response.statusCode()); + System.out.println("Status: " + response.result().status()); + System.out.println("Refund Id: " + response.result().id()); + System.out.println("Links: "); + for (com.paypal.payments.LinkDescription link : response.result().links()) { + System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method()); + } + System.out.println("Full response body:"); + System.out.println(new JSONObject(new Json().serialize(response.result())).toString(4)); + return null; + } + + public String getOAuth() { + // 1、判断缓存区是否有该token + Boolean hasKey = redisUtil.hasKey(PAYPAL_TOKEN_KEY); + if (hasKey) { + return redisUtil.getFromString(PAYPAL_TOKEN_KEY); +// return "A21AAKnpozur9r9omqQ2ge5aXHBBdEERi5F8FIgNYOjhhO2N7rjmkz2irh2lScpBO3s3Cqukw3eZkpYZ4YWE7rIacjv7MHmow"; + } + + // 2、无或者过期,重新获取token,返回 + AuthenticationRequest authenticationRequest = new AuthenticationRequest(); + authenticationRequest.authorization(clientId, clientSecret); + try { + HttpResponse authResult = payPalClient.client(mode, clientId, clientSecret).execute(authenticationRequest); + String accessToken = authResult.result().get("access_token").toString(); + long expiresIn = Long.parseLong(authResult.result().get("expires_in").toString()); + // 3、存redis + redisUtil.addToString(PAYPAL_TOKEN_KEY, accessToken, expiresIn); + return accessToken; + } catch (IOException e) { + log.error("获取paypal token失败,失败原因 ===> {}", e.getMessage()); + throw new BusinessException(e); + } + } + + // 处理当前订单 + @Transactional(rollbackFor = Exception.class) + public void processOrder(String orderId) { + // 1、确定当前订单是否已经被扣款 + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderId); + if (orderInfo.getOrderStatus().equals(OrderStatusEnum.SUCCESS.getType())) { + // 直接返回 + return; + } + // 发起扣款请求 + Order capturedOrder = captureOrder(orderId); + // 业务处理 + if (PayPalOrderStatusEnum.COMPLETED.getStatus().equals(capturedOrder.status())) { + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.SUCCESS); + //记录支付日志 + paymentInfoService.createPaymentInfoForPayPal(capturedOrder); + // 添加积分变更记录 + creditsService.insertToCreditsDetail(orderInfo.getAccountId(), + CreditsEventsEnum.BUY_CREDITS.getName() + "--PayPal", + CreditsEventsEnum.BUY_CREDITS.getValue(), + "positive"); + // 更新积分 + creditsService.buyCredits(orderInfo.getAccountId(), orderInfo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); + } + } + + @Override + public void checkOrderStatus(String orderNo) throws SerializeException { + + log.warn("根据订单号核实订单状态 ===> {}", orderNo); + + Order result = this.queryOrder(orderNo); + + // 订单未创建 | 订单异常 | 订单创建过但未支付 + if(result == null || PayPalOrderStatusEnum.CREATED.getStatus().equals(result.status())){ + log.warn("核实订单未创建 ===> {}", orderNo); + //更新本地订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED); + return ; + } + + // 解析查单响应结果 + String tradeStatus = result.status(); + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); + + // 支付了,但还没完成 + if(PayPalOrderStatusEnum.APPROVED.getStatus().equals(tradeStatus)){ + log.warn("核实订单未支付 ===> {}", orderNo); + // 更新商户端订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.ORDER_PROCESSING); + } + + if(PayPalOrderStatusEnum.COMPLETED.getStatus().equals(tradeStatus)){ + log.warn("核实订单已支付 ===> {}", orderNo); + //如果订单已支付,则更新商户端订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); + //并记录支付日志 + paymentInfoService.createPaymentInfoForPayPal(result); + // 添加积分变更记录 + 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())); + } + + } +} + + diff --git a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java new file mode 100644 index 00000000..367dd376 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java @@ -0,0 +1,114 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.enums.PayTypeEnum; +import com.ai.da.mapper.primary.PaymentInfoMapper; +import com.ai.da.mapper.primary.entity.PaymentInfo; +import com.ai.da.service.PaymentInfoService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import com.paypal.orders.Order; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class PaymentInfoServiceImpl extends ServiceImpl implements PaymentInfoService { + + /** + * 记录支付日志:微信支付 + * @param plainText + */ + @Override + public void createPaymentInfo(String plainText) { + + log.info("记录支付日志"); + + Gson gson = new Gson(); + HashMap plainTextMap = gson.fromJson(plainText, HashMap.class); + + //订单号 + String orderNo = (String)plainTextMap.get("out_trade_no"); + //业务编号 + String transactionId = (String)plainTextMap.get("transaction_id"); + //支付类型 + String tradeType = (String)plainTextMap.get("trade_type"); + //交易状态 + String tradeState = (String)plainTextMap.get("trade_state"); + //用户实际支付金额 + Map amount = (Map)plainTextMap.get("amount"); + Integer payerTotal = ((Double) amount.get("payer_total")).intValue(); + + PaymentInfo paymentInfo = new PaymentInfo(); + paymentInfo.setOrderNo(orderNo); + paymentInfo.setPaymentType(PayTypeEnum.WXPAY.getType()); + paymentInfo.setTransactionId(transactionId); + paymentInfo.setTradeType(tradeType); + paymentInfo.setTradeState(tradeState); + paymentInfo.setPayerTotal(payerTotal); + paymentInfo.setContent(plainText); + + baseMapper.insert(paymentInfo); + } + + /** + * 记录支付日志:支付宝 + * @param params + */ + @Override + public void createPaymentInfoForAliPay(Map params) { + + log.info("记录支付日志"); + + //获取订单号 + String orderNo = params.get("out_trade_no"); + //业务编号 + String transactionId = params.get("trade_no"); + //交易状态 + String tradeStatus = params.get("trade_status"); + //交易金额 + String totalAmount = params.get("total_amount"); +// int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue(); + int totalAmountInt = new BigDecimal(totalAmount).intValue(); + + PaymentInfo paymentInfo = new PaymentInfo(); + paymentInfo.setOrderNo(orderNo); + paymentInfo.setPaymentType(PayTypeEnum.ALIPAY.getType()); + paymentInfo.setTransactionId(transactionId); + paymentInfo.setTradeType("电脑网站支付"); + paymentInfo.setTradeState(tradeStatus); + paymentInfo.setPayerTotal(totalAmountInt); + + Gson gson = new Gson(); + String json = gson.toJson(params, HashMap.class); + paymentInfo.setContent(json); + + baseMapper.insert(paymentInfo); + } + + @Override + public void createPaymentInfoForPayPal(Order order) { + + log.info("记录支付日志"); + +// int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue(); + int totalAmountInt = new BigDecimal(order.purchaseUnits().get(0).payments().captures().get(0).amount().value()).intValue(); + + PaymentInfo paymentInfo = new PaymentInfo(); + paymentInfo.setOrderNo(order.id()); + paymentInfo.setPaymentType(PayTypeEnum.PAYPAL.getType()); + paymentInfo.setTransactionId(order.id()); + paymentInfo.setTradeType("电脑网站支付"); + paymentInfo.setTradeState(order.status()); + paymentInfo.setPayerTotal(totalAmountInt); + + Gson gson = new Gson(); + String json = gson.toJson(order, Order.class); + paymentInfo.setContent(json); + + baseMapper.insert(paymentInfo); + } +} diff --git a/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java b/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java new file mode 100644 index 00000000..3797b913 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java @@ -0,0 +1,12 @@ +package com.ai.da.service.impl; + +import com.ai.da.mapper.primary.ProductMapper; +import com.ai.da.mapper.primary.entity.Product; +import com.ai.da.service.ProductService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class ProductServiceImpl extends ServiceImpl implements ProductService { + +} diff --git a/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java index 9364ecb1..03d003c3 100644 --- a/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java @@ -2,8 +2,8 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; -import com.ai.da.mapper.PythonTAllInfoMapper; -import com.ai.da.mapper.entity.PythonTAllInfo; +import com.ai.da.mapper.primary.PythonTAllInfoMapper; +import com.ai.da.mapper.primary.entity.PythonTAllInfo; import com.ai.da.service.PythonTAllInfoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java b/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java index 41743964..0923d634 100644 --- a/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java @@ -27,10 +27,14 @@ public class RabbitMQServiceImpl implements RabbitMQService { private MQPublisher mqPublisher; @Override - public void publishMessage(String message) { + public void publishMessageToGenerate(String message) { mqPublisher.sendGenerateMessage(message); } + @Override + public void publishMessageToSR(String message) { + mqPublisher.sendSRMessage(message); + } @Override public Integer getMessageCount(String queueUrl) { diff --git a/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java new file mode 100644 index 00000000..ff1db544 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java @@ -0,0 +1,173 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.utils.OrderNoUtils; +import com.ai.da.mapper.primary.RefundInfoMapper; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; +import com.ai.da.service.OrderInfoService; +import com.ai.da.service.RefundInfoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.time.Instant; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class RefundInfoServiceImpl extends ServiceImpl implements RefundInfoService { + + @Resource + private OrderInfoService orderInfoService; + + /** + * 根据订单号创建退款订单 + * @param orderNo + * @return + */ + @Override + public RefundInfo createRefundByOrderNo(String orderNo, String reason) { + + //根据订单号获取订单信息 + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo); + + //根据订单号生成退款订单 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setOrderNo(orderNo);//订单编号 + refundInfo.setRefundNo(OrderNoUtils.getRefundNo());//退款单编号 + refundInfo.setTotalFee(orderInfo.getTotalFee());//原订单金额(元) + refundInfo.setRefund(orderInfo.getTotalFee());//退款金额(元) + refundInfo.setReason(reason);//退款原因 + + //保存退款订单 + baseMapper.insert(refundInfo); + + return refundInfo; + } + + /** + * 记录退款记录 + * @param content + */ + @Override + public void updateRefund(String content) { + + //将json字符串转换成Map + Gson gson = new Gson(); + Map resultMap = gson.fromJson(content, HashMap.class); + + //根据退款单编号修改退款单 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("refund_no", resultMap.get("out_refund_no")); + + //设置要修改的字段 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setRefundId(resultMap.get("refund_id"));//微信支付退款单号 + + //查询退款和申请退款中的返回参数 + if(resultMap.get("status") != null){ + refundInfo.setRefundStatus(resultMap.get("status"));//退款状态 + refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段 + } + //退款回调中的回调参数 + if(resultMap.get("refund_status") != null){ + refundInfo.setRefundStatus(resultMap.get("refund_status"));//退款状态 + refundInfo.setContentNotify(content);//将全部响应结果存入数据库的content字段 + } + + //更新退款单 + baseMapper.update(refundInfo, queryWrapper); + } + + /** + * 找出申请退款超过minutes分钟并且未成功的退款单 + * @param minutes + * @return + */ + @Override + public List getNoRefundOrderByDuration(int minutes) { + + //minutes分钟之前的时间 + Instant instant = Instant.now().minus(Duration.ofMinutes(minutes)); + + QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("refund_status", WxRefundStatus.PROCESSING.getType()); + queryWrapper.le("create_time", instant); + List refundInfoList = baseMapper.selectList(queryWrapper); + return refundInfoList; + } + + /** + * 根据订单号创建退款订单 + * @param orderNo + * @return + */ + @Override + public RefundInfo createRefundByOrderNoForAliPay(String orderNo, String reason) { + + //根据订单号获取订单信息 + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo); + + //根据订单号生成退款订单 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setOrderNo(orderNo);//订单编号 + refundInfo.setRefundNo(OrderNoUtils.getRefundNo());//退款单编号 + + refundInfo.setTotalFee(orderInfo.getTotalFee());//原订单金额(元) + refundInfo.setRefund(orderInfo.getTotalFee());//退款金额(元) + refundInfo.setReason(reason);//退款原因 + + //保存退款订单 + baseMapper.insert(refundInfo); + + return refundInfo; + } + + /** + * 更新退款记录 + * @param refundNo + * @param content + * @param refundStatus + */ + @Override + public void updateRefundForAliPay(String refundNo, String content, String refundStatus) { + + //根据退款单编号修改退款单 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("refund_no", refundNo); + + //设置要修改的字段 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setRefundStatus(refundStatus);//退款状态 + refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段 + + //更新退款单 + baseMapper.update(refundInfo, queryWrapper); + + } + + @Override + public void updateRefundForPayPal(Long id, String refundId,String content, String refundStatus) { + + //根据退款单编号修改退款单 +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("order_no", orderNo); + + //设置要修改的字段 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setId(id); + refundInfo.setRefundNo(null); + refundInfo.setRefundId(refundId); + refundInfo.setRefundStatus(refundStatus);//退款状态 + refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段 + + //更新退款单 +// baseMapper.update(refundInfo, queryWrapper); + baseMapper.updateById(refundInfo); + } +} diff --git a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java new file mode 100644 index 00000000..ee1fb6ff --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java @@ -0,0 +1,195 @@ +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; +import com.ai.da.common.utils.RedisUtil; +import com.ai.da.mapper.primary.TaskListMapper; +import com.ai.da.mapper.primary.entity.TaskList; +import com.ai.da.model.dto.QueryTaskHistoryDTO; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.ai.da.model.dto.TaskDTO; +import com.ai.da.python.PythonService; +import com.ai.da.service.CreditsService; +import com.ai.da.service.RabbitMQService; +import com.ai.da.service.SuperResolutionService; +import com.ai.da.service.TaskListService; +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.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; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Slf4j +@Service +public class SuperResolutionServiceImpl extends ServiceImpl implements SuperResolutionService { + + public static final Integer creditsConsumption = 100; + + @Resource + private CreditsService creditsService; + @Resource + private RabbitMQService rabbitMQService; + @Resource + private PythonService pythonService; + + @Resource + private TaskListService taskListService; + + @Resource + private RedisUtil redisUtil; + + @Value("${redis.key.orderForSR}") + private String orderForSR; + + @Value("${minio.bucketName.users}") + private String usersBucket; + + @Value("${minio.endpoint}") + private String endpoint; + + @Value("${redis.key.credits.pre-deduction}") + private String creditsDeduction; + + @Override + @Transactional(rollbackFor = Exception.class) + public List prepareForSR(List superResolutionDTOList) { + + Long accountId = UserContext.getUserHolder().getId(); + // 1、判断用户当前积分是否够本次超分消耗 + Boolean preDeduction = creditsService.creditsPreDeduction(CreditsEventsEnum.SUPER_RESOLUTION, superResolutionDTOList.size()); + if (!preDeduction) { + throw new BusinessException("Not enough Credits"); + } + + ArrayList uuidList = new ArrayList<>(); + for (SuperResolutionDTO superResolutionDTO : superResolutionDTOList) { + // todo 校验倍率是否是2的幂次(前端已做) + + // 2、生成唯一id 使用uuid 由于uuid重复的几率很小很小,故这里取消验证uuid是否已存在 + String uuid = UUID.randomUUID().toString(); + uuid += "-" + accountId; + uuidList.add(uuid); + + // 3、截取minio地址 (前提是该url是由minio地址转换来的) + String inputString = superResolutionDTO.getImages(); + String replace = inputString.replace(endpoint + "/", ""); + String minioPath = replace.substring(0, replace.indexOf("?")); +// log.info(minioPath); + superResolutionDTO.setImages(minioPath); + + superResolutionDTO.setUniqueId(uuid); + String jsonString = JSON.toJSONString(superResolutionDTO); + + // 4、将数据存到数据库 + TaskList taskList = new TaskList(); + taskList.setAccountId(accountId); + taskList.setTaskType("SR"); + taskList.setInputUrl(superResolutionDTO.getImages()); + taskList.setScale(superResolutionDTO.getScale()); + taskList.setStatus("Waiting"); + taskList.setTaskId(superResolutionDTO.getUniqueId()); + taskList.setCreateTime(LocalDateTime.now()); + + baseMapper.insert(taskList); + + // 5、添加当前任务的预扣积分到redis 任务有效期一天,若待扣积分两天还没被移除,说明任务已经失败,待扣积分自动失效 + redisUtil.addToString(creditsDeduction + ":" + accountId + ":" + uuid, CreditsEventsEnum.SUPER_RESOLUTION.getValue(), CommonConstant.CREDITS_EXPIRE_TIME); + + // 6、加入任务列表 设置状态为 等待中 + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String name = superResolutionDTO.getImages(); + taskListService.addToTaskListRedis(new TaskDTO<>(uuid, "SR", name.substring(name.lastIndexOf("/") + 1), superResolutionDTO, "Waiting", LocalDateTime.now().format(dateTimeFormatter))); + + // 7、将消息发布到MQ消息队列 + log.info("发送消息到SR_QUEUE,参数 :{}", jsonString); + rabbitMQService.publishMessageToSR(jsonString); + } + + // 8、返回唯一id列表 + return uuidList; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void SR(SuperResolutionDTO superResolutionDTO) throws Exception { + // 1、向模型发起请求 + pythonService.superResolution(superResolutionDTO); + + // 2、更新状态 + updateSROutput(superResolutionDTO.getUniqueId(), "Executing", null); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void setSRResult(String taskId, String output, String status) { + Long accountId = Long.parseLong(taskId.substring(taskId.lastIndexOf("-") + 1)); + // 获取结果后更新 + updateSROutput(taskId, status, output); + + if ("success".equals(status)) { + // 3、记录积分变更 + creditsService.insertToCreditsDetail(accountId, + CreditsEventsEnum.SUPER_RESOLUTION.getName(), + CreditsEventsEnum.SUPER_RESOLUTION.getValue(), + "negative"); + // 4、扣除积分 + creditsService.taskCreditsDeduction(accountId, taskId); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateSROutput(String taskId, String status, String output) { + UpdateWrapper uw = new UpdateWrapper<>(); + uw.eq("task_id", taskId); + + uw.set("output_url", output); + uw.set("status", status); + baseMapper.update(null, uw); + + } + + // 分页查询 + @Override + public PageBaseResponse getTaskHistoryPage(QueryTaskHistoryDTO queryTaskHistoryDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("account_id", UserContext.getUserHolder().getId()); + + String startTime = queryTaskHistoryDTO.getStartTime(); + String endTime = queryTaskHistoryDTO.getEndTime(); + if (StringUtil.isNullOrEmpty(startTime)) { + startTime = "2024-03-01 00:00:00"; + } + if (StringUtil.isNullOrEmpty(endTime)) { + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + endTime = now.format(dateTimeFormatter); + } + + qw.between("create_time", startTime, endTime); + qw.orderByDesc("create_time"); + Page pageInfo = new Page<>(queryTaskHistoryDTO.getPage(), queryTaskHistoryDTO.getSize()); + Page orderInfo = baseMapper.selectPage(pageInfo, qw); + if (CollectionUtils.isEmpty(orderInfo.getRecords())) { + return PageBaseResponse.success(new Page<>()); + } + + return PageBaseResponse.success(orderInfo); + } +} diff --git a/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java index ea2a0de3..2872409f 100644 --- a/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java @@ -6,8 +6,8 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.SysFileLevel1TypeEnum; import com.ai.da.common.enums.SysFileLevel2TypeEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.SysFileMapper; -import com.ai.da.mapper.entity.SysFile; +import com.ai.da.mapper.primary.SysFileMapper; +import com.ai.da.mapper.primary.entity.SysFile; import com.ai.da.model.vo.SysFileVO; import com.ai.da.service.SysFileService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; diff --git a/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java b/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java index 22c2e0e4..e15aac6b 100644 --- a/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java @@ -1,9 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.TCollectionElementRelationMapper; -import com.ai.da.mapper.UserLikeMapper; -import com.ai.da.mapper.entity.TCollectionElementRelation; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.TCollectionElementRelationMapper; +import com.ai.da.mapper.primary.entity.TCollectionElementRelation; import com.ai.da.service.TCollectionElementRelationService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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 b24ba13e..a83b84d8 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java @@ -1,11 +1,10 @@ package com.ai.da.service.impl; -import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.enums.LayersPriorityEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.TDesignPythonOutfitDetailMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.TDesignPythonOutfitDetailMapper; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import com.ai.da.model.vo.DesignPythonOutfitVO; import com.ai.da.model.vo.TDesignPythonOutfitDetailVO; import com.ai.da.service.ITDesignPythonOutfitDetailService; diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java index 59ddda04..fad8e6e7 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.TDesignPythonOutfitMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import com.ai.da.model.vo.TDesignPythonOutfitVO; import com.ai.da.service.ITDesignPythonOutfitService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; diff --git a/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java b/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java new file mode 100644 index 00000000..c65c5fa5 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java @@ -0,0 +1,124 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.constant.CommonConstant; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.utils.MinioUtil; +import com.ai.da.common.utils.RedisUtil; +import com.ai.da.mapper.primary.TaskListMapper; +import com.ai.da.mapper.primary.entity.TaskList; +import com.ai.da.model.dto.QueryTaskHistoryDTO; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.ai.da.model.dto.TaskDTO; +import com.ai.da.model.vo.TaskVO; +import com.ai.da.service.SuperResolutionService; +import com.ai.da.service.TaskListService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import io.netty.util.internal.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.lang.reflect.Type; +import java.time.format.DateTimeFormatter; +import java.util.*; + +@Service +@Slf4j +public class TaskListServiceImpl extends ServiceImpl implements TaskListService { + + @Resource + private RedisUtil redisUtil; + + @Value("${redis.key.taskList}") + private String taskListKey; + + @Resource + private MinioUtil minioUtil; + + @Resource + private SuperResolutionService superResolutionService; + + @Override + @Transactional(rollbackFor = Exception.class) + public List> getExecTask(List taskIdList) { + Long id = UserContext.getUserHolder().getId(); +// Set keys = redisUtil.getKeysFromString(taskListKey + ":" + id + ":*"); + ArrayList> taskDTOS = new ArrayList<>(); + taskIdList.forEach(taskId -> { + String taskDetail = redisUtil.getFromString(taskListKey + ":" + id + ":" + taskId); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + TaskDTO taskDTO = gson.fromJson(taskDetail, type); + if (Objects.isNull(taskDTO)) { + // 未执行成功的taskId在redis被删除,将该条数据在db中的状态改为失败 + superResolutionService.updateSROutput(taskId, "fail", null); + 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)); + taskDTOS.add(taskDTO); + } + }); + return taskDTOS; + } + + public void addToTaskListRedis(TaskDTO taskDTO) { + String key = taskListKey + ":" + UserContext.getUserHolder().getId() + ":" + taskDTO.getTaskId(); + redisUtil.addToString(key, new Gson().toJson(taskDTO), CommonConstant.TASK_EXPIRE_TIME); + } + + // 3、更新任务状态 + @Override + public void updateTaskStatusOrOutputRedis(String taskId, String status, String output) { + String key = taskListKey + ":" + taskId.substring(taskId.lastIndexOf("-") + 1) + ":" + taskId; + String taskDetail = redisUtil.getFromString(key); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + TaskDTO taskDTO = gson.fromJson(taskDetail, type); + taskDTO.setStatus(status); + if (!StringUtil.isNullOrEmpty(output)) { + taskDTO.setOutputImage(output); + } + Long expire = redisUtil.getExpire(key); + redisUtil.addToString(key, new Gson().toJson(taskDTO), expire); + } + + @Override + public PageBaseResponse getAllTask(QueryTaskHistoryDTO queryTaskHistoryDTO) { + PageBaseResponse response = new PageBaseResponse<>(); + ArrayList taskLists = new ArrayList<>(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + switch (queryTaskHistoryDTO.getType()) { + case "SR": + PageBaseResponse taskHistoryPage = superResolutionService.getTaskHistoryPage(queryTaskHistoryDTO); + List srHistory = taskHistoryPage.getContent(); + srHistory.forEach(s -> { + // 成功失败的都返回 + 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.setStatus(s.getStatus()); + task.setTaskId(s.getTaskId()); + task.setCreateDate(s.getCreateTime().format(dateTimeFormatter)); + task.setOtherInput("×" + s.getScale()); + taskLists.add(task); + }); + BeanUtils.copyProperties(taskHistoryPage, response); + response.setContent(taskLists); + break; + case "GENERATE": + log.info("未知任务类型--GENERATE"); + } + return response; + } +} 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 6749de7a..29d70e13 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -4,12 +4,10 @@ import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.*; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.TDesignPythonOutfit; -import com.ai.da.mapper.entity.UserLike; -import com.ai.da.mapper.entity.UserLikeGroup; -import com.ai.da.model.enums.ModelType; +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.model.vo.*; import com.ai.da.service.AccountService; import com.ai.da.service.CollectionService; diff --git a/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java index 9006479a..29b53710 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java @@ -2,10 +2,8 @@ package com.ai.da.service.impl; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; -import com.ai.da.mapper.UserLikeMapper; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.DesignItem; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.UserLikeMapper; +import com.ai.da.mapper.primary.entity.UserLike; import com.ai.da.model.vo.UserLikeVO; import com.ai.da.service.UserLikeService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,8 +17,6 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * 服务实现类 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 01f2064a..6d1478ec 100644 --- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java @@ -3,22 +3,18 @@ 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.enums.LibraryLevel1TypeEnum; -import com.ai.da.common.enums.SysFileLevel1TypeEnum; -import com.ai.da.common.enums.SysFileLevel2TypeEnum; 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.FileUtil; import com.ai.da.common.utils.MD5Utils; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.LibraryMapper; -import com.ai.da.mapper.SysFileMapper; -import com.ai.da.mapper.UserLikeMapper; -import com.ai.da.mapper.WorkspaceMapper; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.SysFile; -import com.ai.da.mapper.entity.UserLike; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.LibraryMapper; +import com.ai.da.mapper.primary.SysFileMapper; +import com.ai.da.mapper.primary.WorkspaceMapper; +import com.ai.da.mapper.primary.entity.Library; +import com.ai.da.mapper.primary.entity.SysFile; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.enums.*; import com.ai.da.model.vo.AuthPrincipalVo; @@ -35,7 +31,6 @@ import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.springframework.beans.factory.annotation.Value; 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; @@ -47,7 +42,6 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -92,8 +86,8 @@ public class WorkspaceServiceImpl extends ServiceImpl systemFemaleQw = new QueryWrapper<>(); @@ -129,11 +123,11 @@ public class WorkspaceServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); qw.lambda().ne(null != id, Workspace::getId, id); qw.lambda().eq(Workspace::getWorkSpaceName, workSpaceName); - qw.lambda().eq(Workspace::getUserName, userName); + qw.lambda().eq(Workspace::getAccountId, accountId); List workspaces = baseMapper.selectList(qw); if (!CollectionUtils.isEmpty(workspaces)) { throw new BusinessException("the.workspaceName.already.exists", ResultEnum.PROMPT.getCode()); @@ -143,9 +137,9 @@ public class WorkspaceServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); - qw.lambda().eq(Workspace::getUserName, userName); + qw.lambda().eq(Workspace::getAccountId, accountId); IPage page = workspaceMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); if (page.getTotal() == 0L) { // 给用户新建默认workspace @@ -154,7 +148,7 @@ public class WorkspaceServiceImpl extends ServiceImpl systemFemaleQw = new QueryWrapper<>(); systemFemaleQw.lambda().eq(SysFile::getLevel1Type, "Models"); systemFemaleQw.lambda().eq(SysFile::getLevel2Type, "Female"); @@ -231,7 +225,7 @@ public class WorkspaceServiceImpl extends ServiceImpl qwIsLastIndex = new QueryWrapper<>(); - qwIsLastIndex.lambda().eq(Workspace::getUserName, userName); + qwIsLastIndex.lambda().eq(Workspace::getAccountId, accountId); qwIsLastIndex.lambda().eq(Workspace::getIsLastIndex, 1); qwIsLastIndex.last("limit 1"); List workspaces = workspaceMapper.selectList(qwIsLastIndex); @@ -256,9 +250,9 @@ public class WorkspaceServiceImpl extends ServiceImpl qwOld = new QueryWrapper<>(); - qwOld.lambda().eq(Workspace::getUserName, userName); + qwOld.lambda().eq(Workspace::getAccountId, accountId); qwOld.lambda().eq(Workspace::getIsLastIndex, 1); Workspace oldIsLastIndex = workspaceMapper.selectOne(qwOld); oldIsLastIndex.setIsLastIndex(0); diff --git a/src/main/resources/alipay-hk.properties b/src/main/resources/alipay-hk.properties new file mode 100644 index 00000000..bba6e790 --- /dev/null +++ b/src/main/resources/alipay-hk.properties @@ -0,0 +1,11 @@ +alipay.hk.merchant-id=3015240422190522 + +alipay.hk.segment-id=2971373831 + +alipay.hk.AESKey=UzRC2CncDUP6VlEd + +alipay.hk.rsaPrivateKey=files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt + +alipay.hk.rsaPublicKey=files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem + +alipay.hk.api.url=https://aqs-api.sandbox-codpayment.com/ \ No newline at end of file diff --git a/src/main/resources/alipay-sandbox.properties b/src/main/resources/alipay-sandbox.properties new file mode 100644 index 00000000..bdaac42d --- /dev/null +++ b/src/main/resources/alipay-sandbox.properties @@ -0,0 +1,39 @@ +# 支付宝支付相关参数 + +# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 +#alipay.app-id=2021000119635499 +alipay.app-id=9021000134653815 + +# 商户PID,卖家支付宝账号ID +#alipay.seller-id=2088621957993562 +alipay.seller-id=2088721029614572 + +# 支付宝网关 +#alipay.gateway-url=https://openapi.alipaydev.com/gateway.do +alipay.gateway-url=https://openapi-sandbox.dl.alipaydev.com/gateway.do + +# 商户私钥,您的PKCS8格式RSA2私钥 +#alipay.merchant-private-key=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJPnt6TMZ1A06SMeNxQT0WhGbRd74JBCcdqQt4POzBMJ1NE6U/OiG2xZEnUqYWC2ukkOgZZEvTuWDI9q2aEFN7E2Fcj39JCwRmE0an153JIOkb9L2nngTsAAN7cwLZZ6/dAPnrZjtN0f/HRVBXPSNLBdpoS/pbKRurM2NccZkbTZtluCdt4IvBBjjcV3DJOCYP9yrLTP3HYDxep3HrZCvXuR2Iseb+c6qc4IF/2UKQTz+iavxCy3zJTYbDzD0cL7yC4HmSD7vbNGZvkzZB1RNWt0NILj2LdFG10T7zZahN461FiYozRfD7LDPXqq+uuZMM5i0jpXVrs2MDk6HeS0lJAgMBAAECggEAF87wCrpQ3zGwqqne4+HGYCad046rN9MxmfKeW8Bt7eGqGBnlW7+Q460ITkMHLuHSTZ0ZtnXwtYz+Hj60xPo6ESq+hBkcoqY3oCGN60X7SE3eQoxFblN6VRp3gC3me6KCHpuxv0Vf2lMoxP/gPRINElG0ns03ZCMQerWSchH+1n5xUX/SrsgYDLaHfCxSpGsI/iyjTHXl+KqZeiFoRY+0tlJCTsc6P8JBYEeI5l8Iza/CjxDgFT41B4RksMw9ZEUCwxMiQhqIOThdTxtpA+MpUjoizhngq1xAXMcEz3QlnV7V2icyWjDAAz7bMCISUBa2MLkNWb392/yROKCBcXKYZQKBgQDY5T8QbC3GiUw0IQrVwm1A46zBzMDuQV+a4/2q63f8BBRZcbOluzxuCSfsTIVFKF1eJqpD75+76rB2z39P5xSS2/9SuO9FofV5iUDZuC93mOvR5nwh0rkgizhes81p+i7S9VcQcLTM/gK8ta3VXC3Pv/9bIGlTyFPLS0iMLUJlywKBgQCh/PIjoBFqKWpB6wSTn8hotvvE0WU1XMhm09WnlrMN2O+TuL71PoVS5vhCBgCJW5e3OOOS1K8uYLWaAQY9g/PvzYWLKF7CkCZNTvdds67QMreU9Cfm3jOwUkOibXarJEwY0l52k4xihQ6o8QGvG6XmNw3oq3RX/t/Y0DC84lMKuwKBgQCBQnYIAoBxToe0lXCQnfNgdY8SXEUqeJlShMc7YmM6NPAvsfxfK6vC4///6kaORZUHNEHKhPcMFbyeweBcrRlswGF0WjR2qiPSD4MvfX4EZ4U6rYKS4bNkerPYdI1ZuDjJjl8ZtCF7/XGCJz/25J2Eryauly1OOhf+Etqkd6CXawKBgDlmf4seMm2TBWMcW3/QM9zfUnHY3Ws+WIkPcXs0THiQsbx/z7Lpl6bbz4bdx5zkxusXDpU+JmFhxZgv2r07n9oO0s6P3JxHJjtoywD6Je0Cu8jdh7IodNp7HBpXfaCBeTGmgfC0sh9LFPnKhRU+z9e3FIepEc4Is9uJUmvsKw73AoGAM44/Oz7axzcVEIaD/7jyy1GiaYCmI55qqjocXfbK9QlWDiLnGfbx2UB6BC1y7WD6a9bMpatLXppTDEL+qHX0jUp0u06LQnJi9SAUBcff4LioSJxBrYx6ovYjAEmpoyiW/AAQBJ1oyp1UvpX0avfMa0Hdo1e+YnFEZluCr184uns= +alipay.merchant-private-key=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCS8D3aAKvh+juT+5GEXkbKsHtoSK8odQ3htEH3XE+TP5PiXiOiv7pCnVDaIJ5gxfVBeQNC/D7E0zD7J+F1pRFtXA2MQ/ZMXd21hCjkXjIdBBo7iprPKD51AQIHJ8ocjKH0AnCcWAKPN03HvwCbPyYVXHcGO7XrIE2XFgTszsJYOw/dvruVxVF/OEXtVmgOJYIbHQnd+EfJ68BbMWbebzNBgy2YN/EBJldMMoaFcwtei7wCvUcNxWWqaus+n5u9+xFzPX/5495F3clu9yDydIdmvoRYEMdlzb0PbEzGg1KAaIHb8weNVd0bypOTkVK4Y/2tkPfAAv1hF4e6Uf2MAFw5AgMBAAECggEAc1/mAP4T+F0mWLzodrob9dz7GVgxCKBYpQeH4HWAGguKz+zBKHJJCzNBH/UKxsvJFn6xe/BaTOvTAvI+isRw2aC1FpTqmO3/Px6liSMZUEU/X88mXVCpMe/3qqyoeyBFrjYYO/qzD8cJ8LReAohkG9O9tYw+/H8hzWdBuLtkSCft1iHMUFT9M78lHgHIidUZHio+ga55yLEzx8iLibKXeRTFBAtrzknP0SWO25yHtPuPQhmAF8MGDzACm7fFOsccqBH11EmJGUlMAygT89bWXkWSGtPtbmprNe1lVsg0BlyZdgts5qHIrQYAEr/8o/MZI1d3dXv0UC4YTbA1ibaDsQKBgQDWui+5fJ/Xxc30XsSqGU9mgmM2Qf6PrriixTWfbe0Xdw090D+n4zjyfHOjZCEchFbv1FaDNpTt04IZ0bt2Fx6TwhHFxZnIWAMuLLt0ei4A/iCgTfkCrSwvhJ5uuAA5wFDTJIfyQ+JOpk79BVXm5uk2WuvXWTZXIcz2gA4E8PPnJQKBgQCvLnSQkmWCRv9TU8Mk9lXpWruQf8c3oVxvJ0CFDJK3+33PswiZTX+jcymAvK6kd1H0Mg8jJvH+uyeNPyF7aQW8NHasejqRNhyGyj1ZhRTuDIDGs2qIkZv1RAoDB12T0zATMeoJRbycQpOvi6FGI6KkOmjbgVzrrOPLdYh7wKxOhQKBgBg9MEH6BXkwBQ2+3Ohurv3dXiGz1W6WxJTrOiBjIk5xy/bcWTM0fSsyTUN2fB5h+gZcq99n++vU4mzTthughH0dfTAcHD33YXSG7Co72JGYHkq6Qo/AyKociF3rO2tJgFY1W3tHmnZSY7xAK/BCxLS0EsdedLnlQOPalLqOEJpZAoGAOFCq0D7/ut2v/s2SkjNOcvHkEhPBqzSIToNDzoG4OMT0MOzQ+tdbDORclzIQwnZJNkNRcm92o/juQg3laZLdcR88dz3jzgKjMQGar0iE7fG/BCFxQe3tQO9aeJbJklf1wHXvUoPEmkccyvYMJkwWYM0WIFp50JmHsURbV80clzECgYEAjJdoYgyJSKyuOSJQ8DSyAGGmUZdUILNDZl3KTYWAlPySmDqtqRb0nHpr/iOSlCuazEfOm3CnKaNqa7lx+Fyp3JYdYKa218crif4mjAnEoINcxTrCFVCe+bQqj2oYNi+rSptO6ingTUMv9HPjz0U2DhBRFI/pLPyQnOZx70hOCyQ= + +# 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥 +#alipay.alipay-public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvKoCpGtG31iY2Llj3t8MKRpaVCntnalWmXbKcHCiaYcUUjzcMPH3/tOr5ORK5W1NjuLu9uRrsXqROBmQYN+0y4nea+fU989i2IxtOGR/h2Kvhyyk/lPjNkmgz7K8VqbGGeVzTadPSK49FcrDVEshJ6C92vEKq6TmUfhKgCLiLZ288fHBDRvzUnoj8O/LBXiDroq1zX+DXYCHcQeFljkF5ivyxDZBkWl23hYTtnFClvN5lVLK4d294wyprF7IMv3XhQOfJS+Pr527CsfwT0JE44lyidCvslvn9DSdHdIfTIzHDsIEiDzB/OvRCbwpEA7UGnWQxQf7AusX2TTRQHWW7wIDAQAB +alipay.alipay-public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhDXg0niJ+GSB4VRvPJqzgDhNCP68TRZRLSKLCr/cw6qy911UxRNS96f/ALE7TOLYEsqsolV1inrJ1PU3+BZY9LiKthzEJhdVNzEwXtQrZVknRt3rDtWM2PkKanlQt9LN1Kr28eZ1jJipbkyTLBZOR5RxQ6M6BW0hewrMq/aJLzugP6I7pFHy2iF9zmIm0upy3bUiO5kJwCCXAXfKTG4bLPzhMZCWmDipuscnvR/TN2Nka3WGAJVpiUuRo/poxWKlQpKl6K9rz5RypiAJSaW8zacNyBZ45xIoep3d48v/izOSq2NxLDs6oMUb/BwpJRgfex6dOrnqyIXy0+i9DwEDEwIDAQAB + +# 接口内容加密秘钥,对称秘钥 +#alipay.content-key=D8entyfafkkFwtMbUqj3Mw== +alipay.content-key=hKZgxtPGmOivCphtHM5gNg== + +# 页面跳转同步通知页面路径 +alipay.return-url=http://localhost:8080/#/success + +# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 +# 注意:每次重新启动ngrok,都需要根据实际情况修改这个配置 +#alipay.notify-url=https://77ea-221-239-177-21.ngrok.io/api/ali-pay/trade/notify +alipay.notify-url=http://18.167.251.121:10090/api/ali-pay/trade/notify +#alipay.notify-url=https://3b38-18-167-251-121.ngrok-free.app/api/ali-pay/trade/notify + + + + + diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 0d7a298c..b57dad01 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,12 +1,11 @@ server.port=5567 #datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true 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.username=aida_con @@ -20,7 +19,8 @@ spring.security.jwtTokenPrefix=Bearer- spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ - /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/** + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ + /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/**,/api/credits/**,/api/inquiry/**,/api/tasks/**,/api/python/prepareForSR spring.security.authApi=/auth/login @@ -28,8 +28,7 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml -#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 @@ -44,10 +43,9 @@ file.windows.path=D:\\upload\\ spring.servlet.multipart.max-file-size = 10MB spring.servlet.multipart.max-request-size= 10MB #访问python服务的ip(对应环境) -#access.python.ip=http://43.198.80.117 access.python.ip=http://18.167.251.121 -#access.python.ip=http://18.167.251.121:9991/ -access.python.port=9990 +access.python.port=9992 +access.python.sr=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin @@ -76,7 +74,13 @@ spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=0 spring.redis.lettuce.pool.max-wait=5 -redis.key.consumptionOrder=ConsumptionOrder -redis.key.cancelSet=CancelSet -redis.key.exceptionMap=ExceptionMap -redis.key.resultMap=ResultMap \ No newline at end of file +redis.key.orderForGenerate=OrderForGenerate +redis.key.generateCancelSet=GenerateCancelSet +redis.key.generateExceptionMap=Generate:Exception +redis.key.resultMap=ResultMap +redis.key.orderForSR=OrderForSR +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 diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 147a635b..14ff67a9 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,7 +1,7 @@ server.port=5567 #datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.primary.username=root spring.datasource.primary.password=QWa998345 @@ -19,7 +19,8 @@ spring.security.jwtTokenPrefix=Bearer- spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ - /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,/api/inquiry/** + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ + /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/**,/api/credits/**,/api/inquiry/**,/api/tasks/**,/api/python/prepareForSR spring.security.authApi=/auth/login @@ -27,8 +28,7 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml -#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 @@ -47,6 +47,7 @@ spring.servlet.multipart.max-request-size= 10MB access.python.ip=http://18.167.251.121 #access.python.ip=http://18.167.251.121:9991/ access.python.port=9990 +access.python.sr=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin @@ -75,7 +76,13 @@ spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=0 spring.redis.lettuce.pool.max-wait=5 -redis.key.consumptionOrder=ConsumptionOrder -redis.key.cancelSet=CancelSet -redis.key.exceptionMap=ExceptionMap -redis.key.resultMap=ResultMap \ No newline at end of file +redis.key.orderForGenerate=OrderForGenerate +redis.key.generateCancelSet=GenerateCancelSet +redis.key.generateExceptionMap=Generate:Exception +redis.key.resultMap=ResultMap +redis.key.orderForSR=OrderForSR +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 diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 77222db5..31595f52 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,7 +1,7 @@ server.port=5567 #datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.primary.username=root spring.datasource.primary.password=QWa998345 @@ -19,7 +19,8 @@ spring.security.jwtTokenPrefix=Bearer- spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ - /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/** + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ + /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/**,/api/credits/**,/api/inquiry/**,/api/tasks/**,/api/python/prepareForSR spring.security.authApi=/auth/login @@ -27,8 +28,7 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml -#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 @@ -46,7 +46,8 @@ spring.servlet.multipart.max-request-size= 10MB #access.python.ip=http://43.198.80.117 access.python.ip=http://18.167.251.121 #access.python.ip=http://18.167.251.121:9991/ -access.python.port=9990 +access.python.port=9992 +access.python.sr=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin @@ -75,7 +76,13 @@ spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=0 spring.redis.lettuce.pool.max-wait=5 -redis.key.consumptionOrder=ConsumptionOrder -redis.key.cancelSet=CancelSet -redis.key.exceptionMap=ExceptionMap -redis.key.resultMap=ResultMap \ No newline at end of file +redis.key.orderForGenerate=OrderForGenerate +redis.key.generateCancelSet=GenerateCancelSet +redis.key.generateExceptionMap=Generate:Exception +redis.key.resultMap=ResultMap +redis.key.orderForSR=OrderForSR +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 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 diff --git a/src/main/resources/mapper/DesignMapper.xml b/src/main/resources/mapper/DesignMapper.xml deleted file mode 100644 index d5f589cd..00000000 --- a/src/main/resources/mapper/DesignMapper.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - insert into t_design - (account_id,collection_id,system_scale,single_overall,switch_category,create_date) - values( - #{accountId}, - #{collectionId}, - #{systemScale}, - #{singleOverall}, - #{switchCategory}, - #{createDate}); - - - - - diff --git a/src/main/resources/mapper/AccountMapper.xml b/src/main/resources/mapper/primary/AccountMapper.xml similarity index 75% rename from src/main/resources/mapper/AccountMapper.xml rename to src/main/resources/mapper/primary/AccountMapper.xml index 2e2bd6b6..d38f734a 100644 --- a/src/main/resources/mapper/AccountMapper.xml +++ b/src/main/resources/mapper/primary/AccountMapper.xml @@ -1,27 +1,27 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/ChatRobotMapper.xml b/src/main/resources/mapper/primary/ChatRobotMapper.xml similarity index 85% rename from src/main/resources/mapper/ChatRobotMapper.xml rename to src/main/resources/mapper/primary/ChatRobotMapper.xml index 5a379683..0dc78d00 100644 --- a/src/main/resources/mapper/ChatRobotMapper.xml +++ b/src/main/resources/mapper/primary/ChatRobotMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/ClassificationMapper.xml b/src/main/resources/mapper/primary/ClassificationMapper.xml similarity index 81% rename from src/main/resources/mapper/ClassificationMapper.xml rename to src/main/resources/mapper/primary/ClassificationMapper.xml index 20ea5ce1..689bbc7a 100644 --- a/src/main/resources/mapper/ClassificationMapper.xml +++ b/src/main/resources/mapper/primary/ClassificationMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/ClassificationRelLibraryMapper.xml b/src/main/resources/mapper/primary/ClassificationRelLibraryMapper.xml similarity index 78% rename from src/main/resources/mapper/ClassificationRelLibraryMapper.xml rename to src/main/resources/mapper/primary/ClassificationRelLibraryMapper.xml index 3db8b654..2ffa0dd4 100644 --- a/src/main/resources/mapper/ClassificationRelLibraryMapper.xml +++ b/src/main/resources/mapper/primary/ClassificationRelLibraryMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/CollectionMapper.xml b/src/main/resources/mapper/primary/CollectionMapper.xml similarity index 66% rename from src/main/resources/mapper/CollectionMapper.xml rename to src/main/resources/mapper/primary/CollectionMapper.xml index 3dddf4ec..055fb4be 100644 --- a/src/main/resources/mapper/CollectionMapper.xml +++ b/src/main/resources/mapper/primary/CollectionMapper.xml @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - insert into t_collection - (account_id,create_date) - values( - #{accountId}, - #{createDate}); - - - + + + + + + + + + + + + + + insert into t_collection + (account_id,create_date) + values( + #{accountId}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/primary/CollocationMapper.xml b/src/main/resources/mapper/primary/CollocationMapper.xml new file mode 100644 index 00000000..8eeeda2a --- /dev/null +++ b/src/main/resources/mapper/primary/CollocationMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/DesignItemMapper.xml b/src/main/resources/mapper/primary/DesignItemMapper.xml similarity index 79% rename from src/main/resources/mapper/DesignItemMapper.xml rename to src/main/resources/mapper/primary/DesignItemMapper.xml index b4a089d8..c6b9689d 100644 --- a/src/main/resources/mapper/DesignItemMapper.xml +++ b/src/main/resources/mapper/primary/DesignItemMapper.xml @@ -1,33 +1,33 @@ - - - - - - - - - - - - - - - - - - - - insert into t_design_item - (account_id,design_id,collection_id,print_scale,design_url,high_design_url,is_like,create_date) - values( - #{accountId}, - #{designId}, - #{collectionId}, - #{printScale}, - #{designUrl}, - #{highDesignUrl}, - #{hasLike}, - #{createDate}); - - - + + + + + + + + + + + + + + + + + + + + insert into t_design_item + (account_id,design_id,collection_id,print_scale,design_url,high_design_url,is_like,create_date) + values( + #{accountId}, + #{designId}, + #{collectionId}, + #{printScale}, + #{designUrl}, + #{highDesignUrl}, + #{hasLike}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/primary/DesignMapper.xml b/src/main/resources/mapper/primary/DesignMapper.xml new file mode 100644 index 00000000..6fc69739 --- /dev/null +++ b/src/main/resources/mapper/primary/DesignMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + insert into t_design + (account_id, collection_id, system_scale, single_overall, switch_category, create_date) + values (#{accountId}, + #{collectionId}, + #{systemScale}, + #{singleOverall}, + #{switchCategory}, + #{createDate}); + + + + + diff --git a/src/main/resources/mapper/primary/DressingMapper.xml b/src/main/resources/mapper/primary/DressingMapper.xml new file mode 100644 index 00000000..9e112248 --- /dev/null +++ b/src/main/resources/mapper/primary/DressingMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/GenerateDetailMapper.xml b/src/main/resources/mapper/primary/GenerateDetailMapper.xml similarity index 87% rename from src/main/resources/mapper/GenerateDetailMapper.xml rename to src/main/resources/mapper/primary/GenerateDetailMapper.xml index 3dd87411..b3c0e9e3 100644 --- a/src/main/resources/mapper/GenerateDetailMapper.xml +++ b/src/main/resources/mapper/primary/GenerateDetailMapper.xml @@ -1,6 +1,6 @@ - + - select * from pantone - - - - r = #{item.r} and g = #{item.g} and b = #{item.b} - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/PythonTAllInfoMapper.xml b/src/main/resources/mapper/primary/PythonTAllInfoMapper.xml similarity index 92% rename from src/main/resources/mapper/PythonTAllInfoMapper.xml rename to src/main/resources/mapper/primary/PythonTAllInfoMapper.xml index b661a036..0fdcd2b3 100644 --- a/src/main/resources/mapper/PythonTAllInfoMapper.xml +++ b/src/main/resources/mapper/primary/PythonTAllInfoMapper.xml @@ -1,8 +1,8 @@ - + - + diff --git a/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml b/src/main/resources/mapper/primary/TDesignPythonOutfitDetailMapper.xml similarity index 90% rename from src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml rename to src/main/resources/mapper/primary/TDesignPythonOutfitDetailMapper.xml index b231cdcb..b7b9b67d 100644 --- a/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml +++ b/src/main/resources/mapper/primary/TDesignPythonOutfitDetailMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/TDesignPythonOutfitMapper.xml b/src/main/resources/mapper/primary/TDesignPythonOutfitMapper.xml similarity index 89% rename from src/main/resources/mapper/TDesignPythonOutfitMapper.xml rename to src/main/resources/mapper/primary/TDesignPythonOutfitMapper.xml index b739bdfe..9079c1b0 100644 --- a/src/main/resources/mapper/TDesignPythonOutfitMapper.xml +++ b/src/main/resources/mapper/primary/TDesignPythonOutfitMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/TrialOrderMapper.xml b/src/main/resources/mapper/primary/TrialOrderMapper.xml similarity index 84% rename from src/main/resources/mapper/TrialOrderMapper.xml rename to src/main/resources/mapper/primary/TrialOrderMapper.xml index 71abbf01..30f62bf0 100644 --- a/src/main/resources/mapper/TrialOrderMapper.xml +++ b/src/main/resources/mapper/primary/TrialOrderMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/UserLikeGroupMapper.xml b/src/main/resources/mapper/primary/UserLikeGroupMapper.xml similarity index 71% rename from src/main/resources/mapper/UserLikeGroupMapper.xml rename to src/main/resources/mapper/primary/UserLikeGroupMapper.xml index 66bbecc3..463fc854 100644 --- a/src/main/resources/mapper/UserLikeGroupMapper.xml +++ b/src/main/resources/mapper/primary/UserLikeGroupMapper.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - insert into t_user_like_group - (account_id,collection_id,`name`,create_date,update_date) - values( - #{accountId}, - #{collectionId}, - #{name}, - #{createDate}, - #{updateDate}); - - - + + + + + + + + + + + + + + + + insert into t_user_like_group + (account_id,collection_id,`name`,create_date,update_date) + values( + #{accountId}, + #{collectionId}, + #{name}, + #{createDate}, + #{updateDate}); + + + diff --git a/src/main/resources/mapper/WorkspaceMapper.xml b/src/main/resources/mapper/primary/WorkspaceMapper.xml similarity index 54% rename from src/main/resources/mapper/WorkspaceMapper.xml rename to src/main/resources/mapper/primary/WorkspaceMapper.xml index 72ff882e..592084e1 100644 --- a/src/main/resources/mapper/WorkspaceMapper.xml +++ b/src/main/resources/mapper/primary/WorkspaceMapper.xml @@ -1,18 +1,23 @@ - + - + + - - - + + + + + + + diff --git a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml new file mode 100644 index 00000000..434ab153 --- /dev/null +++ b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index ca17378d..39096842 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -169,6 +169,8 @@ generate.interface.error=We encountered an error with the generate interface. (P chat-bot.interface.exception=We encountered an error with the chat robot interface.(Please try again later. If this issue persists, please contact us at help@aida.com.hk.) compose-layer.interface.exception=We encountered issues while flattening the layers.(Please try again later. If this issue persists, please contact us at help@aida.com.hk.) cloth-classification.interface.exception=We encountered some issues while obtaining clothing categories.(Please try again later. If this issue persists, please contact us at help@aida.com.hk.) +sr.interface.error=We encountered an error with the super resolution. (Please try again later. If this issue persists, please contact us at help@aida.com.hk.) + # 多语言返回 OVERALL=Overall diff --git a/src/main/resources/paypal-sandbox.properties b/src/main/resources/paypal-sandbox.properties new file mode 100644 index 00000000..3b0eaef2 --- /dev/null +++ b/src/main/resources/paypal-sandbox.properties @@ -0,0 +1,23 @@ +# 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 +# local +#paypal.webhook_id=31797347YC028794L +# dev +#paypal.webhook_id=51V87014T6406322F + +# aida-sandbox-kim +#paypal.client-id=AbDDH8jnTrKqjnWLFgEu6LogYzVz2ZLuirE4W54t1M4lrofrP5OzXfhbxqktLLFB-rAO9KeYQVYFJ_tO +#paypal.client-secret=EOOoiIAe_dyR2YhY7qCIqWipZvYXCDrmBlFYchphuvkPFms1spsBGTlStlrx580y4hN-EukWwF9m_LAs +#paypal.receiver.email=sb-4xe8i29784722@business.example.com +#paypal.mode=sandbox +#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.webhook_id=41L14847MC833625B \ No newline at end of file