Compare commits
1 Commits
9bd10581f4
...
dev/dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 2e7004f9dc |
@@ -99,8 +99,6 @@ jobs:
|
|||||||
volumes:
|
volumes:
|
||||||
# 数据挂载
|
# 数据挂载
|
||||||
- ./log:/log
|
- ./log:/log
|
||||||
- ./temp:/temp
|
|
||||||
- ./uploads:/temp/uploads
|
|
||||||
ports:
|
ports:
|
||||||
- '10090:5567'
|
- '10090:5567'
|
||||||
restart: always
|
restart: always
|
||||||
|
|||||||
5
pom.xml
5
pom.xml
@@ -427,11 +427,6 @@
|
|||||||
<artifactId>bcpkix-jdk18on</artifactId>
|
<artifactId>bcpkix-jdk18on</artifactId>
|
||||||
<version>1.78.1</version>
|
<version>1.78.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- AOP -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-aop</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -559,7 +559,7 @@ public class GenerateConsumer {
|
|||||||
log.info("============ProcessPoseTransformResult End listening==========");
|
log.info("============ProcessPoseTransformResult End listening==========");
|
||||||
}
|
}
|
||||||
|
|
||||||
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
/*@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
|
||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void generateConsumer1(Message msg, Channel channel) {
|
public void generateConsumer1(Message msg, Channel channel) {
|
||||||
generate(msg, channel, "consumer 1");
|
generate(msg, channel, "consumer 1");
|
||||||
@@ -635,7 +635,7 @@ public class GenerateConsumer {
|
|||||||
@RabbitHandler
|
@RabbitHandler
|
||||||
public void getPoseTransformationResult(Message msg, Channel channel) {
|
public void getPoseTransformationResult(Message msg, Channel channel) {
|
||||||
processPoseTransformResult(msg, channel);
|
processPoseTransformResult(msg, channel);
|
||||||
}
|
}*/
|
||||||
// @RabbitListener(queues = "#{rabbitMQProperties.queues.designBatch}")
|
// @RabbitListener(queues = "#{rabbitMQProperties.queues.designBatch}")
|
||||||
// @RabbitHandler
|
// @RabbitHandler
|
||||||
// public void getDesignBatchResult(Message msg, Channel channel) {
|
// public void getDesignBatchResult(Message msg, Channel channel) {
|
||||||
|
|||||||
@@ -28,11 +28,6 @@ public class MQPublisher {
|
|||||||
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getSr(), mm);
|
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getSr(), mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendGenerateResultMessage(String mm) {
|
|
||||||
log.info("send generate result message: {}", mm);
|
|
||||||
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getGenerateResult(), mm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param mailParams 含有的字段
|
* @param mailParams 含有的字段
|
||||||
|
|||||||
@@ -1,170 +0,0 @@
|
|||||||
package com.ai.da.common.aspect;
|
|
||||||
|
|
||||||
import com.ai.da.common.context.UserContext;
|
|
||||||
import com.ai.da.model.vo.AuthPrincipalVo;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import org.aspectj.lang.JoinPoint;
|
|
||||||
import org.aspectj.lang.annotation.*;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.context.request.RequestContextHolder;
|
|
||||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller日志切面
|
|
||||||
* 记录所有Controller接口的请求参数和用户信息
|
|
||||||
*/
|
|
||||||
@Aspect
|
|
||||||
@Component
|
|
||||||
public class ControllerLoggingAspect {
|
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ControllerLoggingAspect.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 定义切点:所有Controller方法
|
|
||||||
*/
|
|
||||||
@Pointcut("execution(* com.ai.da.controller..*(..))")
|
|
||||||
public void controllerMethods() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller方法执行前记录日志
|
|
||||||
*/
|
|
||||||
// @Before("controllerMethods()")
|
|
||||||
public void logControllerBefore(JoinPoint joinPoint) {
|
|
||||||
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
|
||||||
if (attributes != null) {
|
|
||||||
HttpServletRequest request = attributes.getRequest();
|
|
||||||
|
|
||||||
// 获取当前用户ID
|
|
||||||
Long userId = null;
|
|
||||||
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
|
||||||
if (authPrincipalVo != null) {
|
|
||||||
userId = authPrincipalVo.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取请求参数
|
|
||||||
Map<String, Object> params = getRequestParams(joinPoint, request);
|
|
||||||
|
|
||||||
logger.info("=== 请求开始 ===");
|
|
||||||
logger.info("用户ID: {}", userId);
|
|
||||||
logger.info("请求URL: {}", request.getRequestURL().toString());
|
|
||||||
logger.info("请求方法: {}", request.getMethod());
|
|
||||||
logger.info("请求IP: {}", getClientIpAddress(request));
|
|
||||||
logger.info("调用方法: {}.{}", joinPoint.getSignature().getDeclaringType().getSimpleName(), joinPoint.getSignature().getName());
|
|
||||||
logger.info("请求参数: {}", params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取请求参数
|
|
||||||
*/
|
|
||||||
private Map<String, Object> getRequestParams(JoinPoint joinPoint, HttpServletRequest request) {
|
|
||||||
Map<String, Object> params = new HashMap<>();
|
|
||||||
|
|
||||||
// 1. 获取Query String参数
|
|
||||||
String queryString = request.getQueryString();
|
|
||||||
if (queryString != null && !queryString.isEmpty()) {
|
|
||||||
params.put("queryString", queryString);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 获取方法参数(包含 @PathVariable, @RequestParam, @RequestBody 等)
|
|
||||||
Object[] args = joinPoint.getArgs();
|
|
||||||
|
|
||||||
if (args != null && args.length > 0) {
|
|
||||||
Map<String, Object> methodParams = new HashMap<>();
|
|
||||||
for (int i = 0; i < args.length; i++) {
|
|
||||||
Object arg = args[i];
|
|
||||||
// 过滤掉不可序列化的参数
|
|
||||||
if (arg != null) {
|
|
||||||
if (isIgnorable(arg)) {
|
|
||||||
// 对于可忽略的类型,记录类型名
|
|
||||||
methodParams.put("arg" + i, "[" + arg.getClass().getSimpleName() + "]");
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
methodParams.put("arg" + i, arg);
|
|
||||||
} catch (Exception e) {
|
|
||||||
methodParams.put("arg" + i, arg.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!methodParams.isEmpty()) {
|
|
||||||
params.put("methodParams", methodParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断是否需要过滤的参数类型
|
|
||||||
*/
|
|
||||||
private boolean isIgnorable(Object obj) {
|
|
||||||
return obj instanceof HttpServletRequest
|
|
||||||
|| obj instanceof HttpServletResponse
|
|
||||||
|| obj instanceof MultipartFile
|
|
||||||
|| obj instanceof MultipartFile[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller方法抛出异常时记录日志
|
|
||||||
*/
|
|
||||||
@AfterThrowing(pointcut = "controllerMethods()", throwing = "exception")
|
|
||||||
public void logControllerAfterThrowing(JoinPoint joinPoint, Throwable exception) {
|
|
||||||
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
|
||||||
|
|
||||||
Long userId = null;
|
|
||||||
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
|
||||||
if (authPrincipalVo != null) {
|
|
||||||
userId = authPrincipalVo.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取请求参数
|
|
||||||
Map<String, Object> params = new HashMap<>();
|
|
||||||
if (attributes != null) {
|
|
||||||
HttpServletRequest request = attributes.getRequest();
|
|
||||||
params = getRequestParams(joinPoint, request);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.error("=== 请求异常 ===");
|
|
||||||
logger.error("用户ID: {}", userId);
|
|
||||||
logger.error("调用方法: {}.{}", joinPoint.getSignature().getDeclaringType().getSimpleName(), joinPoint.getSignature().getName());
|
|
||||||
logger.error("请求参数: {}", params);
|
|
||||||
logger.error("异常信息: ", exception);
|
|
||||||
logger.error("=== 异常结束 ===");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取客户端真实IP地址
|
|
||||||
*/
|
|
||||||
private String getClientIpAddress(HttpServletRequest request) {
|
|
||||||
String xForwardedFor = request.getHeader("X-Forwarded-For");
|
|
||||||
if (xForwardedFor != null && !xForwardedFor.isEmpty() && !"unknown".equalsIgnoreCase(xForwardedFor)) {
|
|
||||||
return xForwardedFor.split(",")[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
String xRealIp = request.getHeader("X-Real-IP");
|
|
||||||
if (xRealIp != null && !xRealIp.isEmpty() && !"unknown".equalsIgnoreCase(xRealIp)) {
|
|
||||||
return xRealIp;
|
|
||||||
}
|
|
||||||
|
|
||||||
String proxyClientIp = request.getHeader("Proxy-Client-IP");
|
|
||||||
if (proxyClientIp != null && !proxyClientIp.isEmpty() && !"unknown".equalsIgnoreCase(proxyClientIp)) {
|
|
||||||
return proxyClientIp;
|
|
||||||
}
|
|
||||||
|
|
||||||
String wlProxyClientIp = request.getHeader("WL-Proxy-Client-IP");
|
|
||||||
if (wlProxyClientIp != null && !wlProxyClientIp.isEmpty() && !"unknown".equalsIgnoreCase(wlProxyClientIp)) {
|
|
||||||
return wlProxyClientIp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return request.getRemoteAddr();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -202,7 +202,7 @@ public class MyTaskScheduler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 9 * * ?")
|
// @Scheduled(cron = "0 0 9 * * ?")
|
||||||
public void sendTrialOrderExcelToManagements() {
|
public void sendTrialOrderExcelToManagements() {
|
||||||
// 获取前一天日期
|
// 获取前一天日期
|
||||||
LocalDate yesterday = LocalDate.now().minusDays(1);
|
LocalDate yesterday = LocalDate.now().minusDays(1);
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ public class CommonConstant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final String GENERATE_PATH = "/api/generate_image";
|
public static final String GENERATE_PATH = "/api/generate_image";
|
||||||
public static final String GENERATE_PATH_FLUX2_KLEIN = "/api/generate_image_flux2_klein";
|
|
||||||
|
|
||||||
public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo";
|
public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo";
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public class ModelConstants {
|
|||||||
public static final String PRINTBOARD_ADVANCED_T2I = "qwen-image";
|
public static final String PRINTBOARD_ADVANCED_T2I = "qwen-image";
|
||||||
public static final String MOODBOARD_ADVANCED = "doubao-seedream-3-0-t2i-250415";
|
public static final String MOODBOARD_ADVANCED = "doubao-seedream-3-0-t2i-250415";
|
||||||
public static final String PRINTBOARD_HIGH_T2I = "doubao-seedream-3-0-t2i-250415";
|
public static final String PRINTBOARD_HIGH_T2I = "doubao-seedream-3-0-t2i-250415";
|
||||||
public static final String PRINTBOARD_HIGH_I2I = "doubao-seedream-4-0-250828-fast";
|
public static final String PRINTBOARD_HIGH_I2I = "doubao-seededit-3-0-i2i-250628";
|
||||||
public static final String PRINTBOARD_ADVANCED_I2I = "doubao-seedream-4-0-250828";
|
public static final String PRINTBOARD_ADVANCED_I2I = "doubao-seedream-4-0-250828";
|
||||||
public static final String IMAGEN_MODEL = "imagen-4.0-generate-001";
|
public static final String IMAGEN_MODEL = "imagen-4.0-generate-001";
|
||||||
public static final String NANO_BANANA = "gemini-2.5-flash-image";
|
public static final String NANO_BANANA = "gemini-2.5-flash-image";
|
||||||
|
|||||||
@@ -63,8 +63,7 @@ public class AuthenticationFilter extends OncePerRequestFilter {
|
|||||||
//GlobalAwardController
|
//GlobalAwardController
|
||||||
"/api/global-award/uploads/pdf/init", "/api/global-award/uploads/pdf/chunk", "/api/global-award/uploads/pdf/complete", "/api/global-award/uploads/pdf/status",
|
"/api/global-award/uploads/pdf/init", "/api/global-award/uploads/pdf/chunk", "/api/global-award/uploads/pdf/complete", "/api/global-award/uploads/pdf/status",
|
||||||
"/api/global-award/uploads/video/init", "/api/global-award/uploads/video/chunk", "/api/global-award/uploads/video/complete", "/api/global-award/uploads/video/status",
|
"/api/global-award/uploads/video/init", "/api/global-award/uploads/video/chunk", "/api/global-award/uploads/video/complete", "/api/global-award/uploads/video/status",
|
||||||
"/api/global-award/contestants/save", "/api/global-award/contestants/by-email", "/api/global-award/checkEmail", "/api/global-award/checkCode","/api/global-award/contestants/export",
|
"/api/global-award/contestants/save", "/api/global-award/contestants/by-email", "/api/global-award/checkEmail", "/api/global-award/checkCode"
|
||||||
"/api/global-award/contestants/export/files"
|
|
||||||
);
|
);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public class AccountTask {
|
|||||||
accountService.refreshCreditsMonthly();
|
accountService.refreshCreditsMonthly();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
||||||
public void getPaidUser() {
|
public void getPaidUser() {
|
||||||
// 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单
|
// 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单
|
||||||
accountService.extendValidityForCC();
|
accountService.extendValidityForCC();
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public class PaymentTask {
|
|||||||
@Resource
|
@Resource
|
||||||
private PayPalCheckoutService payPalCheckoutService;
|
private PayPalCheckoutService payPalCheckoutService;
|
||||||
|
|
||||||
@Scheduled(cron = "0/30 * * * * ?")
|
// @Scheduled(cron = "0/30 * * * * ?")
|
||||||
public void orderConfirmForPaypal() throws SerializeException {
|
public void orderConfirmForPaypal() throws SerializeException {
|
||||||
|
|
||||||
// log.info("PayPal orderConfirm 被执行......");
|
// log.info("PayPal orderConfirm 被执行......");
|
||||||
@@ -109,7 +109,7 @@ public class PaymentTask {
|
|||||||
affiliateService.syncLinkViewCountToDB();
|
affiliateService.syncLinkViewCountToDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 8 28-31 * ?")
|
// @Scheduled(cron = "0 0 8 28-31 * ?")
|
||||||
public void commissionSummaryReminder(){
|
public void commissionSummaryReminder(){
|
||||||
// 每个月末的最后一天的早上八点执行
|
// 每个月末的最后一天的早上八点执行
|
||||||
LocalDate today = LocalDate.now();
|
LocalDate today = LocalDate.now();
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class SubscriptionReminderTask {
|
|||||||
REMINDER_DAYS_CONFIG.put("year", 14);
|
REMINDER_DAYS_CONFIG.put("year", 14);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 9 * * ?")
|
// @Scheduled(cron = "0 0 9 * * ?")
|
||||||
public void subscriptionReminder() {
|
public void subscriptionReminder() {
|
||||||
// 获取所有需要通知的订阅
|
// 获取所有需要通知的订阅
|
||||||
List<SubscriptionInfo> subscriptionInfos = getDueSubscriptions();
|
List<SubscriptionInfo> subscriptionInfos = getDueSubscriptions();
|
||||||
@@ -97,7 +97,7 @@ public class SubscriptionReminderTask {
|
|||||||
return subscriptionInfoMapper.selectList(qw);
|
return subscriptionInfoMapper.selectList(qw);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 9 * * ?")
|
// @Scheduled(cron = "0 0 9 * * ?")
|
||||||
public void trialReminder() {
|
public void trialReminder() {
|
||||||
// 今天的 00:00:00 和 23:59:59
|
// 今天的 00:00:00 和 23:59:59
|
||||||
LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay();
|
LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay();
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -767,7 +767,7 @@ public class SendEmailUtil {
|
|||||||
try {
|
try {
|
||||||
String merchantEmail = "kimwong@code-create.com.hk";
|
String merchantEmail = "kimwong@code-create.com.hk";
|
||||||
String developer = "xupei3360@163.com";
|
String developer = "xupei3360@163.com";
|
||||||
String[] receiverEmail = {merchantEmail, developer};
|
String[] receiverEmail = {/*merchantEmail,*/ developer};
|
||||||
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||||
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||||
HttpProfile httpProfile = new HttpProfile();
|
HttpProfile httpProfile = new HttpProfile();
|
||||||
@@ -968,7 +968,7 @@ public class SendEmailUtil {
|
|||||||
req.setFromEmailAddress(SEND_ADDRESS);
|
req.setFromEmailAddress(SEND_ADDRESS);
|
||||||
String merchantEmail = "kimwong@code-create.com.hk";
|
String merchantEmail = "kimwong@code-create.com.hk";
|
||||||
String developerEmail = "xupei@code-create.com.hk";
|
String developerEmail = "xupei@code-create.com.hk";
|
||||||
req.setDestination(new String[]{merchantEmail, developerEmail});
|
req.setDestination(new String[]{/*merchantEmail,*/ developerEmail});
|
||||||
Template template = new Template();
|
Template template = new Template();
|
||||||
req.setSubject("New Credit Purchase Order");
|
req.setSubject("New Credit Purchase Order");
|
||||||
template.setTemplateID(CREDITS_PURCHASE_MERCHANT);
|
template.setTemplateID(CREDITS_PURCHASE_MERCHANT);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import io.swagger.annotations.Api;
|
|||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import io.swagger.annotations.ApiParam;
|
import io.swagger.annotations.ApiParam;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
@@ -164,24 +163,6 @@ public class GlobalAwardController {
|
|||||||
return Response.success(globalAwardService.checkCode(email, code));
|
return Response.success(globalAwardService.checkCode(email, code));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/contestants/export")
|
|
||||||
@ApiOperation(value = "导出参赛者列表为Excel", notes = "导出所有参赛者信息为xlsx并触发下载")
|
|
||||||
public void exportContestants(HttpServletResponse response) throws Exception {
|
|
||||||
byte[] data = globalAwardService.exportContestants();
|
|
||||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
||||||
response.setHeader("Content-Disposition", "attachment; filename=\"contestants.xlsx\"");
|
|
||||||
response.setContentLength(data.length);
|
|
||||||
response.getOutputStream().write(data);
|
|
||||||
response.getOutputStream().flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/contestants/export/files")
|
|
||||||
@ApiOperation(value = "导出参赛者文件到本地", notes = "根据参赛者编号范围导出PDF和视频文件到本地temp/uploads/contestants目录")
|
|
||||||
public Response<Integer> exportContestantFiles(@ApiParam(value = "参赛者文件导出请求", required = true) @RequestBody ContestantExportRequest request) throws Exception {
|
|
||||||
int exportedCount = globalAwardService.exportContestantFiles(request.getMinContestantNumber(), request.getMaxContestantNumber());
|
|
||||||
return Response.success(exportedCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public interface DesignMapper extends CommonMapper<Design> {
|
|||||||
Long insertDesign(Design design);
|
Long insertDesign(Design design);
|
||||||
|
|
||||||
List<UserDesignStatisticDTO> getDesignStatistic(String startTime, String endTime, List<Long> ids, String email,
|
List<UserDesignStatisticDTO> getDesignStatistic(String startTime, String endTime, List<Long> ids, String email,
|
||||||
String role, String organizationName, boolean filterBySecond);
|
String role, String organizationName);
|
||||||
|
|
||||||
List<Design> selectDeleteList();
|
List<Design> selectDeleteList();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,9 +26,6 @@ public class Contestant {
|
|||||||
|
|
||||||
private String email;
|
private String email;
|
||||||
|
|
||||||
@TableField("contestant_number")
|
|
||||||
private Integer contestantNumber;
|
|
||||||
|
|
||||||
@TableField("first_name")
|
@TableField("first_name")
|
||||||
private String firstName;
|
private String firstName;
|
||||||
|
|
||||||
@@ -59,15 +56,6 @@ public class Contestant {
|
|||||||
@TableField("video_path")
|
@TableField("video_path")
|
||||||
private String videoPath;
|
private String videoPath;
|
||||||
|
|
||||||
@TableField("video_duration")
|
|
||||||
private Integer videoDuration;
|
|
||||||
|
|
||||||
@TableField("video_size")
|
|
||||||
private Long videoSize;
|
|
||||||
|
|
||||||
@TableField("pdf_size")
|
|
||||||
private Long pdfSize;
|
|
||||||
|
|
||||||
@TableField("created_at")
|
@TableField("created_at")
|
||||||
private LocalDateTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
|
|
||||||
|
|||||||
@@ -49,15 +49,6 @@ public class ContestantDTO {
|
|||||||
|
|
||||||
@ApiModelProperty(value = "视频文件路径", required = false, example = "contestants/user@example.com/2024/01/video_1234567890.mp4")
|
@ApiModelProperty(value = "视频文件路径", required = false, example = "contestants/user@example.com/2024/01/video_1234567890.mp4")
|
||||||
private String videoPath;
|
private String videoPath;
|
||||||
|
|
||||||
@ApiModelProperty(value = "视频时长(秒)", required = false, example = "120")
|
|
||||||
private Integer videoDuration;
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "视频大小(字节)", required = false, example = "10485760")
|
|
||||||
private Long videoSize;
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "PDF 文件大小(字节)", required = false, example = "524288")
|
|
||||||
private Long pdfSize;
|
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
// * 是否确认覆盖已存在记录(false 表示发现已有记录时仅返回 existingRecord,不覆盖)
|
// * 是否确认覆盖已存在记录(false 表示发现已有记录时仅返回 existingRecord,不覆盖)
|
||||||
@@ -67,8 +58,6 @@ public class ContestantDTO {
|
|||||||
|
|
||||||
@NotBlank
|
@NotBlank
|
||||||
private String secureToken;
|
private String secureToken;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
package com.ai.da.model.dto;
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 参赛者文件导出请求DTO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@ApiModel(value = "参赛者文件导出请求", description = "用于导出指定范围的参赛者文件")
|
|
||||||
public class ContestantExportRequest {
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "最小参赛者编号", required = true, example = "10000")
|
|
||||||
private Integer minContestantNumber;
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "最大参赛者编号", required = true, example = "10010")
|
|
||||||
private Integer maxContestantNumber;
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
package com.ai.da.model.dto;
|
|
||||||
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 图片处理请求体
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
public class ImageProcessRequest {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OSS桶名(bucket_name)
|
|
||||||
*/
|
|
||||||
private String bucket_name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OSS对象名(object_name)
|
|
||||||
*/
|
|
||||||
private String object_name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 输入图片路径列表(input_image_paths)
|
|
||||||
*/
|
|
||||||
private List<String> input_image_paths;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 图像宽度(width)
|
|
||||||
*/
|
|
||||||
private Integer width;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 图像高度(height)
|
|
||||||
*/
|
|
||||||
private Integer height;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 文本提示(prompt)
|
|
||||||
*/
|
|
||||||
private String prompt;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 推理步数(steps)
|
|
||||||
*/
|
|
||||||
private Integer steps;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 引导系数(guidance)
|
|
||||||
*/
|
|
||||||
private Double guidance;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -2,10 +2,8 @@ package com.ai.da.python;
|
|||||||
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.exceptions.ExceptionUtil;
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
||||||
import com.ai.da.common.RabbitMQ.RabbitMQProperties;
|
|
||||||
import com.ai.da.common.config.FileProperties;
|
import com.ai.da.common.config.FileProperties;
|
||||||
import com.ai.da.common.config.exception.BusinessException;
|
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.context.UserContext;
|
||||||
import com.ai.da.common.enums.*;
|
import com.ai.da.common.enums.*;
|
||||||
import com.ai.da.common.utils.*;
|
import com.ai.da.common.utils.*;
|
||||||
@@ -22,7 +20,6 @@ import com.ai.da.model.vo.*;
|
|||||||
import com.ai.da.python.vo.*;
|
import com.ai.da.python.vo.*;
|
||||||
import com.ai.da.service.DesignHistoryService;
|
import com.ai.da.service.DesignHistoryService;
|
||||||
import com.ai.da.service.PythonTAllInfoService;
|
import com.ai.da.service.PythonTAllInfoService;
|
||||||
import com.ai.da.service.RabbitMQService;
|
|
||||||
import com.ai.da.service.SysFileService;
|
import com.ai.da.service.SysFileService;
|
||||||
import com.alibaba.fastjson.*;
|
import com.alibaba.fastjson.*;
|
||||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||||
@@ -42,7 +39,6 @@ import org.springframework.util.StringUtils;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -72,8 +68,6 @@ public class PythonService {
|
|||||||
private String accessPythonPort;
|
private String accessPythonPort;
|
||||||
@Value("${minio.bucketName.gradient}")
|
@Value("${minio.bucketName.gradient}")
|
||||||
private String gradientBucketName;
|
private String gradientBucketName;
|
||||||
@Value("${minio.bucketName.users}")
|
|
||||||
private String userBucketName;
|
|
||||||
@Value("${access.python.generate_sr_port}")
|
@Value("${access.python.generate_sr_port}")
|
||||||
private String srServicePort;
|
private String srServicePort;
|
||||||
|
|
||||||
@@ -89,12 +83,6 @@ public class PythonService {
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
@Resource
|
|
||||||
private RabbitMQService rabbitMQService;
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private RabbitMQProperties rabbitMQProperties;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成打印的图片 二合一 (废弃于2024/01/02)
|
* 生成打印的图片 二合一 (废弃于2024/01/02)
|
||||||
*
|
*
|
||||||
@@ -291,7 +279,7 @@ public class PythonService {
|
|||||||
|
|
||||||
if (isDuplicate) {
|
if (isDuplicate) {
|
||||||
elementVO.setHasUseMd5List(beforeAssemblyHasUseMd5List);
|
elementVO.setHasUseMd5List(beforeAssemblyHasUseMd5List);
|
||||||
i--;
|
i --;
|
||||||
|
|
||||||
switch (designPrintPictureType) {
|
switch (designPrintPictureType) {
|
||||||
case PIN:
|
case PIN:
|
||||||
@@ -418,14 +406,13 @@ public class PythonService {
|
|||||||
// if (CollectionUtil.isEmpty(pinData)) {
|
// if (CollectionUtil.isEmpty(pinData)) {
|
||||||
// return 0;
|
// return 0;
|
||||||
// }
|
// }
|
||||||
|
//// long topNum = sketchBoardElements.stream()
|
||||||
/// / long topNum = sketchBoardElements.stream()
|
//// .filter(skecth -> skecth.getHasPin() == 1
|
||||||
/// / .filter(skecth -> skecth.getHasPin() == 1
|
//// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count();
|
||||||
/// / && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count();
|
//// long bottomNum = sketchBoardElements.stream()
|
||||||
/// / long bottomNum = sketchBoardElements.stream()
|
//// .filter(skecth -> skecth.getHasPin() == 1
|
||||||
/// / .filter(skecth -> skecth.getHasPin() == 1
|
//// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count();
|
||||||
/// / && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count();
|
//// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue();
|
||||||
/// / int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue();
|
|
||||||
// int num = pinData.size();
|
// int num = pinData.size();
|
||||||
// return Math.min(num, 8);
|
// return Math.min(num, 8);
|
||||||
// }
|
// }
|
||||||
@@ -573,12 +560,12 @@ public class PythonService {
|
|||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
long pinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 1).count();
|
long pinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 1).count();
|
||||||
if (designNum - pinNum < 0) {
|
if (designNum - pinNum < 0){
|
||||||
return RandomsUtil.randomSysFile(0L, (long) (pinNum / 2 + 1));
|
return RandomsUtil.randomSysFile(0L, (long) (pinNum/2 + 1));
|
||||||
} else if (designNum - pinNum < designNum / 2) {
|
} else if (designNum - pinNum < designNum/2) {
|
||||||
return RandomsUtil.randomSysFile(0L, designNum - pinNum + 1);
|
return RandomsUtil.randomSysFile(0L, designNum - pinNum + 1);
|
||||||
} else {
|
} else {
|
||||||
return RandomsUtil.randomSysFile(0L, (long) (designNum / 2 + 1));
|
return RandomsUtil.randomSysFile(0L, (long) (designNum/2 + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -693,7 +680,8 @@ public class PythonService {
|
|||||||
|
|
||||||
// 其他所有情况,都回退到使用系统推荐
|
// 其他所有情况,都回退到使用系统推荐
|
||||||
String categoryParam = elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase();
|
String categoryParam = elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase();
|
||||||
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, elementVO.getBrandId(), elementVO.getBrandScale(), elementVO.getStyle());
|
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, elementVO.getBrandId(), elementVO.getBrandScale(),elementVO.getStyle());
|
||||||
|
|
||||||
if (CollectionUtils.isEmpty(recommentdUrlList)) {
|
if (CollectionUtils.isEmpty(recommentdUrlList)) {
|
||||||
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
||||||
}
|
}
|
||||||
@@ -1051,7 +1039,7 @@ public class PythonService {
|
|||||||
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
||||||
String recommendSystemSketch = recommentdUrlList.get(0);
|
String recommendSystemSketch = recommentdUrlList.get(0);
|
||||||
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
||||||
} else {
|
}else {
|
||||||
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
||||||
}
|
}
|
||||||
// JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex());
|
// JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex());
|
||||||
@@ -1074,7 +1062,7 @@ public class PythonService {
|
|||||||
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
||||||
String recommendSystemSketch = recommentdUrlList.get(0);
|
String recommendSystemSketch = recommentdUrlList.get(0);
|
||||||
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
||||||
} else {
|
}else {
|
||||||
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1110,7 +1098,7 @@ public class PythonService {
|
|||||||
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
||||||
String recommendSystemSketch = recommentdUrlList.get(0);
|
String recommendSystemSketch = recommentdUrlList.get(0);
|
||||||
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
||||||
} else {
|
}else {
|
||||||
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
||||||
}
|
}
|
||||||
// JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex());
|
// JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex());
|
||||||
@@ -1134,7 +1122,7 @@ public class PythonService {
|
|||||||
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
|
||||||
String recommendSystemSketch = recommentdUrlList.get(0);
|
String recommendSystemSketch = recommentdUrlList.get(0);
|
||||||
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
|
||||||
} else {
|
}else {
|
||||||
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
throw new BusinessException("failed.to.obtain.system.sketch.recommendation");
|
||||||
}
|
}
|
||||||
// String tableName = getTableName(validateElementVO.getModelSex(), category);
|
// String tableName = getTableName(validateElementVO.getModelSex(), category);
|
||||||
@@ -2202,7 +2190,7 @@ public class PythonService {
|
|||||||
basic.setScale_earrings(0.16);
|
basic.setScale_earrings(0.16);
|
||||||
if (Objects.nonNull(designLibraryModelPointVO)) {
|
if (Objects.nonNull(designLibraryModelPointVO)) {
|
||||||
basic.setBody_point_test(getMap(designLibraryModelPointVO));
|
basic.setBody_point_test(getMap(designLibraryModelPointVO));
|
||||||
} else {
|
}else {
|
||||||
basic.setBody_point_test(getMap(designLibraryModelPoint));
|
basic.setBody_point_test(getMap(designLibraryModelPoint));
|
||||||
}
|
}
|
||||||
return basic;
|
return basic;
|
||||||
@@ -2863,17 +2851,13 @@ public class PythonService {
|
|||||||
gradientString = JSONObject.toJSONString(designSingleItem.getGradient());
|
gradientString = JSONObject.toJSONString(designSingleItem.getGradient());
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintToPython printToPython;
|
PrintToPython printToPython = resolveDesignSinglePrint(designSingleItem.getPrintObject().getPrints(),
|
||||||
printToPython = resolveDesignSinglePrint(designSingleItem.getPrintObject().getPrints(),
|
|
||||||
designSingleItem.getPartialDesign().getPartialDesignMinioPath());
|
designSingleItem.getPartialDesign().getPartialDesignMinioPath());
|
||||||
/*PrintToPython printToPython = resolveDesignSinglePrint(designSingleItem.getPrintObject().getPrints(),
|
resolveDesignElement(designSingleItem.getTrims(), printToPython);
|
||||||
designSingleItem.getPartialDesign().getPartialDesignMinioPath());*/
|
log.info("组装参数【服装:{}的maskUrl: {}】",designSingleItem.getType(), designSingleItem.getMaskUrl());
|
||||||
// resolveDesignElement(designSingleItem.getTrims(), printToPython);
|
|
||||||
log.info("组装参数【服装:{}的maskUrl: {}】", designSingleItem.getType(), designSingleItem.getMaskUrl());
|
|
||||||
|
|
||||||
String partialDesign = designSingleItem.getPartialDesign().getPartialDesignMinioPath();
|
String mergeImagePath = !StringUtil.isNullOrEmpty(printToPython.getPartial())
|
||||||
String mergeImagePath = !StringUtil.isNullOrEmpty(partialDesign)
|
? printToPython.getPartial() : designSingleItem.getPath();
|
||||||
? partialDesign : designSingleItem.getPath();
|
|
||||||
response.add(new DesignPythonItem(
|
response.add(new DesignPythonItem(
|
||||||
designSingleItem.getType(),
|
designSingleItem.getType(),
|
||||||
designSingleItem.getPath(),
|
designSingleItem.getPath(),
|
||||||
@@ -2896,7 +2880,7 @@ public class PythonService {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (singleOverall.equals("overall")) {
|
if (singleOverall.equals("overall")){
|
||||||
String bodyPath;
|
String bodyPath;
|
||||||
if (Objects.nonNull(designLibraryModelPoint)) {
|
if (Objects.nonNull(designLibraryModelPoint)) {
|
||||||
bodyPath = designLibraryModelPoint.getTemplateUrl();
|
bodyPath = designLibraryModelPoint.getTemplateUrl();
|
||||||
@@ -2912,12 +2896,12 @@ public class PythonService {
|
|||||||
|
|
||||||
private PrintToPython resolveDesignSinglePrint(List<DesignSinglePrint> printObject, String partialDesign) {
|
private PrintToPython resolveDesignSinglePrint(List<DesignSinglePrint> printObject, String partialDesign) {
|
||||||
PrintToPython printToPython = new PrintToPython();
|
PrintToPython printToPython = new PrintToPython();
|
||||||
// DesignPythonItemPrint printSingle = new DesignPythonItemPrint();
|
DesignPythonItemPrint printSingle = new DesignPythonItemPrint();
|
||||||
DesignPythonItemPrint printOverall = new DesignPythonItemPrint();
|
DesignPythonItemPrint printOverall = new DesignPythonItemPrint();
|
||||||
// printToPython.setSingle(printSingle);
|
printToPython.setSingle(printSingle);
|
||||||
printToPython.setOverall(printOverall);
|
printToPython.setOverall(printOverall);
|
||||||
printToPython.setPartial(StringUtil.isNullOrEmpty(partialDesign) ? null : partialDesign);
|
printToPython.setPartial(StringUtil.isNullOrEmpty(partialDesign) ? null : partialDesign);
|
||||||
if (Objects.isNull(printObject) || printObject.isEmpty()) {
|
if (Objects.isNull(printObject) || printObject.isEmpty()){
|
||||||
return printToPython;
|
return printToPython;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2948,12 +2932,12 @@ public class PythonService {
|
|||||||
Integer priority = p.getPriority();
|
Integer priority = p.getPriority();
|
||||||
setUriToMinioPath(p);
|
setUriToMinioPath(p);
|
||||||
// todo 下标越界问题
|
// todo 下标越界问题
|
||||||
if (p.getIfSingle()) {
|
if (p.getIfSingle()){
|
||||||
locationS.set(priority - 1, p.getLocation());
|
locationS.set(priority - 1, p.getLocation());
|
||||||
scaleS.set(priority - 1, p.getScale());
|
scaleS.set(priority - 1, p.getScale());
|
||||||
angleS.set(priority - 1, p.getAngle());
|
angleS.set( priority - 1, p.getAngle());
|
||||||
pathsS.set(priority - 1, p.getMinIOPath());
|
pathsS.set(priority - 1, p.getMinIOPath());
|
||||||
} else {
|
}else {
|
||||||
locationO.set(priority - 1, p.getLocation());
|
locationO.set(priority - 1, p.getLocation());
|
||||||
scaleO.set(priority - 1, p.getScale());
|
scaleO.set(priority - 1, p.getScale());
|
||||||
angleO.set(priority - 1, p.getAngle());
|
angleO.set(priority - 1, p.getAngle());
|
||||||
@@ -2961,14 +2945,14 @@ public class PythonService {
|
|||||||
}
|
}
|
||||||
// log.info("本次print打点locations###{}###fileVO{}", p.getLocation(), JSON.toJSONString(fileVO));
|
// log.info("本次print打点locations###{}###fileVO{}", p.getLocation(), JSON.toJSONString(fileVO));
|
||||||
});
|
});
|
||||||
/*locationS.removeAll(Collections.singleton(null));
|
locationS.removeAll(Collections.singleton(null));
|
||||||
scaleS.removeAll(Collections.singleton(null));
|
scaleS.removeAll(Collections.singleton(null));
|
||||||
angleS.removeAll(Collections.singleton(null));
|
angleS.removeAll(Collections.singleton(null));
|
||||||
pathsS.removeAll(Collections.singleton(null));
|
pathsS.removeAll(Collections.singleton(null));
|
||||||
printSingle.setLocation(locationS);
|
printSingle.setLocation(locationS);
|
||||||
printSingle.setPrint_scale_list(scaleS);
|
printSingle.setPrint_scale_list(scaleS);
|
||||||
printSingle.setPrint_angle_list(angleS);
|
printSingle.setPrint_angle_list(angleS);
|
||||||
printSingle.setPrint_path_list(pathsS);*/
|
printSingle.setPrint_path_list(pathsS);
|
||||||
|
|
||||||
locationO.removeAll(Collections.singleton(null));
|
locationO.removeAll(Collections.singleton(null));
|
||||||
scaleO.removeAll(Collections.singleton(null));
|
scaleO.removeAll(Collections.singleton(null));
|
||||||
@@ -2983,9 +2967,9 @@ public class PythonService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 对印花类型为Generate的图片路径进行特殊处理
|
// 对印花类型为Generate的图片路径进行特殊处理
|
||||||
private void setUriToMinioPath(DesignSinglePrint print) {
|
private void setUriToMinioPath(DesignSinglePrint print){
|
||||||
if (!StringUtil.isNullOrEmpty(print.getDesignType()) && print.getDesignType().equals("Generate")) {
|
if (!StringUtil.isNullOrEmpty(print.getDesignType()) && print.getDesignType().equals("Generate")){
|
||||||
if (!StringUtil.isNullOrEmpty(print.getPath())) {
|
if (!StringUtil.isNullOrEmpty(print.getPath())){
|
||||||
try {
|
try {
|
||||||
URI uri = new URI(print.getPath());
|
URI uri = new URI(print.getPath());
|
||||||
String path = uri.getPath(); // 获取路径部分: /aida-users/87/print/9ac32f65-6043-424d-a146-92c9c6d204ee-4-87.png
|
String path = uri.getPath(); // 获取路径部分: /aida-users/87/print/9ac32f65-6043-424d-a146-92c9c6d204ee-4-87.png
|
||||||
@@ -3345,7 +3329,7 @@ public class PythonService {
|
|||||||
throw new BusinessException("system error!");
|
throw new BusinessException("system error!");
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean generateSketchOrPrint(String params, String port, String servicePath, String taskId) {
|
public Boolean generateSketchOrPrint(String params, String port, String servicePath) {
|
||||||
//限流校验
|
//限流校验
|
||||||
// AccessLimitUtils.validate("generateSketchOrPrint", 5);
|
// AccessLimitUtils.validate("generateSketchOrPrint", 5);
|
||||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||||
@@ -3407,36 +3391,12 @@ public class PythonService {
|
|||||||
if (result && jsonObject.get("code").equals(200)) {
|
if (result && jsonObject.get("code").equals(200)) {
|
||||||
log.info("Generate##responseObject###{}", jsonObject);
|
log.info("Generate##responseObject###{}", jsonObject);
|
||||||
// return setGenerateImageList(jsonObject.getJSONObject("data"));
|
// return setGenerateImageList(jsonObject.getJSONObject("data"));
|
||||||
if (servicePath == CommonConstant.GENERATE_PATH_FLUX2_KLEIN) {
|
|
||||||
//放入结果到mq
|
|
||||||
JSONObject data = jsonObject.getJSONObject("data");
|
|
||||||
String outputPath = data.getString("output_path");
|
|
||||||
|
|
||||||
|
|
||||||
Map<String, String> mqMessage = new HashMap<>();
|
|
||||||
mqMessage.put("tasks_id", taskId);
|
|
||||||
mqMessage.put("status", "SUCCESS");
|
|
||||||
mqMessage.put("message", "success");
|
|
||||||
mqMessage.put("image_url", outputPath);
|
|
||||||
mqMessage.put("category", "");
|
|
||||||
String mqMessageBody = JSON.toJSONString(mqMessage);
|
|
||||||
rabbitMQService.publishMessageToGenerateResult(mqMessageBody);
|
|
||||||
}
|
|
||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
} else {
|
} else {
|
||||||
log.info("generateSketchOrPrintPrint失败###{}", jsonObject);
|
log.info("generateSketchOrPrintPrint失败###{}", jsonObject);
|
||||||
log.info("Generate Exception! Code : " + jsonObject.get("code"));
|
log.info("Generate Exception! Code : " + jsonObject.get("code"));
|
||||||
Map<String, String> mqMessage = new HashMap<>();
|
|
||||||
mqMessage.put("tasks_id", taskId);
|
|
||||||
mqMessage.put("status", "ERROR");
|
|
||||||
mqMessage.put("message", "");
|
|
||||||
mqMessage.put("image_url", "");
|
|
||||||
mqMessage.put("category", "");
|
|
||||||
String mqMessageBody = JSON.toJSONString(mqMessage);
|
|
||||||
rabbitMQService.publishMessageToGenerateResult(mqMessageBody);
|
|
||||||
return Boolean.FALSE;
|
return Boolean.FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response sendPostToModel(String content, String portAndRoute, String functionName) {
|
public Response sendPostToModel(String content, String portAndRoute, String functionName) {
|
||||||
@@ -3478,10 +3438,7 @@ public class PythonService {
|
|||||||
|
|
||||||
return imageUrlList;
|
return imageUrlList;
|
||||||
}*/
|
}*/
|
||||||
|
/** 废弃状态 */
|
||||||
/**
|
|
||||||
* 废弃状态
|
|
||||||
*/
|
|
||||||
public String composeLayers(List<OutfitDetailPythonItem> layersDetail) {
|
public String composeLayers(List<OutfitDetailPythonItem> layersDetail) {
|
||||||
HashMap<String, List<OutfitDetailPythonItem>> layers = new HashMap<>();
|
HashMap<String, List<OutfitDetailPythonItem>> layers = new HashMap<>();
|
||||||
HashMap<String, HashMap<String, List<OutfitDetailPythonItem>>> content = new HashMap<>();
|
HashMap<String, HashMap<String, List<OutfitDetailPythonItem>>> content = new HashMap<>();
|
||||||
@@ -3792,7 +3749,7 @@ public class PythonService {
|
|||||||
throw new BusinessException("relightImage.interface.exception");
|
throw new BusinessException("relightImage.interface.exception");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String imageToSketch(String imagePath, String bucket, String objectName, String styleCode, String styleImageUrl) {
|
public String imageToSketch(String imagePath, String bucket, String objectName, String styleCode, String styleImageUrl){
|
||||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||||
.connectTimeout(30, TimeUnit.SECONDS)
|
.connectTimeout(30, TimeUnit.SECONDS)
|
||||||
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
|
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
|
||||||
@@ -3839,7 +3796,7 @@ public class PythonService {
|
|||||||
String sketchResult = jsonObject.get("data").toString();
|
String sketchResult = jsonObject.get("data").toString();
|
||||||
log.info("ImageToSketch 结果 : {}", sketchResult);
|
log.info("ImageToSketch 结果 : {}", sketchResult);
|
||||||
return sketchResult;
|
return sketchResult;
|
||||||
} else {
|
}else {
|
||||||
log.info("ImageToSketch 失败。 Response code {}", responseCode);
|
log.info("ImageToSketch 失败。 Response code {}", responseCode);
|
||||||
throw new BusinessException("ImageToSketch 失败。 Response code " + responseCode);
|
throw new BusinessException("ImageToSketch 失败。 Response code " + responseCode);
|
||||||
}
|
}
|
||||||
@@ -3892,7 +3849,7 @@ public class PythonService {
|
|||||||
throw new BusinessException("bright.interface.exception");
|
throw new BusinessException("bright.interface.exception");
|
||||||
}
|
}
|
||||||
|
|
||||||
public JSONObject attributeRecognition(List<String> pictureUrls, List<String> ids, List<String> category) {
|
public JSONObject attributeRecognition(List<String> pictureUrls,List<String> ids, List<String> category) {
|
||||||
//限流校验
|
//限流校验
|
||||||
AccessLimitUtils.validate("attributeRecognition", 20);
|
AccessLimitUtils.validate("attributeRecognition", 20);
|
||||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||||
@@ -3924,7 +3881,7 @@ public class PythonService {
|
|||||||
} catch (IOException ioException) {
|
} catch (IOException ioException) {
|
||||||
log.error("PythonService###attributeRecognition异常##{}", ExceptionUtil.getThrowableList(ioException));
|
log.error("PythonService###attributeRecognition异常##{}", ExceptionUtil.getThrowableList(ioException));
|
||||||
}
|
}
|
||||||
log.info("识别python对应的属性标签值结果###{}", bodyStr.trim());
|
log.info("识别python对应的属性标签值结果###{}",bodyStr.trim());
|
||||||
//去除限流
|
//去除限流
|
||||||
AccessLimitUtils.validateOut("attributeRecognition");
|
AccessLimitUtils.validateOut("attributeRecognition");
|
||||||
if (Objects.isNull(response)) {
|
if (Objects.isNull(response)) {
|
||||||
@@ -4008,7 +3965,7 @@ public class PythonService {
|
|||||||
throw new BusinessException("design.interface.exception");
|
throw new BusinessException("design.interface.exception");
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getSystemSketchByCategory(String category, Long brandId, Double brandScale, String style) {
|
public List<String> getSystemSketchByCategory(String category, Long brandId, Double brandScale,String style) {
|
||||||
//******3.1.2版本临时使用java推荐方案去解决style未使用的问题**********
|
//******3.1.2版本临时使用java推荐方案去解决style未使用的问题**********
|
||||||
// try {
|
// try {
|
||||||
// //使用新库attribute_retrieval_style,表命名修改为elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase()比如female_skirt,与传入的category保持一致
|
// //使用新库attribute_retrieval_style,表命名修改为elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase()比如female_skirt,与传入的category保持一致
|
||||||
@@ -4032,14 +3989,6 @@ public class PythonService {
|
|||||||
// throw new BusinessException("system.error");
|
// throw new BusinessException("system.error");
|
||||||
// }
|
// }
|
||||||
//**********************end***********************************
|
//**********************end***********************************
|
||||||
//临时补丁
|
|
||||||
if (category != null && style != null) {
|
|
||||||
String categoryPrefix = category.split("_")[0];
|
|
||||||
if ("male".equals(categoryPrefix) &&
|
|
||||||
(style.equalsIgnoreCase("lolita") || style.equalsIgnoreCase("romantic"))) {
|
|
||||||
style = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AuthPrincipalVo userHolder = UserContext.getUserHolder();
|
AuthPrincipalVo userHolder = UserContext.getUserHolder();
|
||||||
|
|
||||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||||
@@ -4161,7 +4110,6 @@ public class PythonService {
|
|||||||
//生成失败
|
//生成失败
|
||||||
throw new BusinessException("segProduct.interface.exception");
|
throw new BusinessException("segProduct.interface.exception");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 转发 seg_anything 请求到 python 服务
|
* 转发 seg_anything 请求到 python 服务
|
||||||
* 请求 body 由调用方组装(包含 user_id, image_path, type, points, labels, box 等)
|
* 请求 body 由调用方组装(包含 user_id, image_path, type, points, labels, box 等)
|
||||||
@@ -4174,9 +4122,6 @@ public class PythonService {
|
|||||||
.writeTimeout(60, TimeUnit.SECONDS)
|
.writeTimeout(60, TimeUnit.SECONDS)
|
||||||
.build();
|
.build();
|
||||||
MediaType mediaType = MediaType.parse("application/json");
|
MediaType mediaType = MediaType.parse("application/json");
|
||||||
content.put("bucket", userBucketName);
|
|
||||||
content.put("object_name", content.get("user_id") + "/" + "segment" + "/" + UUID.randomUUID() + ".png");
|
|
||||||
content.remove("user_id");
|
|
||||||
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
|
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
|
||||||
|
|
||||||
String url = accessPythonIp + ":" + accessPythonPort + "/api/seg_anything";
|
String url = accessPythonIp + ":" + accessPythonPort + "/api/seg_anything";
|
||||||
@@ -4207,18 +4152,18 @@ public class PythonService {
|
|||||||
if (responseObject != null) {
|
if (responseObject != null) {
|
||||||
JSONObject dataObj = responseObject.getJSONObject("data");
|
JSONObject dataObj = responseObject.getJSONObject("data");
|
||||||
if (dataObj != null) {
|
if (dataObj != null) {
|
||||||
String output = dataObj.getString("output");
|
String output = dataObj.getString("output");
|
||||||
if (!StringUtil.isNullOrEmpty(output)) {
|
if (!StringUtil.isNullOrEmpty(output)) {
|
||||||
try {
|
try {
|
||||||
String presigned = minioUtil.getPreSignedUrl(output, 24 * 60);
|
String presigned = minioUtil.getPreSignedUrl(output, 24 * 60);
|
||||||
return presigned;
|
return presigned;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("Failed to generate presigned url for {}: {}", output, e.getMessage());
|
log.error("Failed to generate presigned url for {}: {}", output, e.getMessage());
|
||||||
throw new BusinessException("segAnything.presign.failed");
|
throw new BusinessException("segAnything.presign.failed");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
log.error("PythonService##segAnything post-process error###{}", ex.getMessage());
|
log.error("PythonService##segAnything post-process error###{}", ex.getMessage());
|
||||||
@@ -4228,7 +4173,7 @@ public class PythonService {
|
|||||||
throw new BusinessException("segAnything.missing.output");
|
throw new BusinessException("segAnything.missing.output");
|
||||||
}
|
}
|
||||||
throw new BusinessException("segAnything.interface.exception");
|
throw new BusinessException("segAnything.interface.exception");
|
||||||
} catch (IOException | JSONException e) {
|
} catch (IOException |JSONException e) {
|
||||||
log.error("PythonService##segAnything异常###{}", e.getMessage());
|
log.error("PythonService##segAnything异常###{}", e.getMessage());
|
||||||
throw new BusinessException("segAnything.interface.exception");
|
throw new BusinessException("segAnything.interface.exception");
|
||||||
}
|
}
|
||||||
@@ -4236,7 +4181,6 @@ public class PythonService {
|
|||||||
log.error("PythonService##segAnything异常response###{}", response);
|
log.error("PythonService##segAnything异常response###{}", response);
|
||||||
throw new BusinessException("segAnything.interface.exception");
|
throw new BusinessException("segAnything.interface.exception");
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean poseTransformation(JSONObject content, String apiUri) {
|
public Boolean poseTransformation(JSONObject content, String apiUri) {
|
||||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||||
.connectTimeout(30, TimeUnit.SECONDS)
|
.connectTimeout(30, TimeUnit.SECONDS)
|
||||||
@@ -4340,7 +4284,7 @@ public class PythonService {
|
|||||||
String modifiedModel = jsonObject.get("data").toString();
|
String modifiedModel = jsonObject.get("data").toString();
|
||||||
log.info("modifyModelProportion 结果 : {}", modifiedModel);
|
log.info("modifyModelProportion 结果 : {}", modifiedModel);
|
||||||
return modifiedModel;
|
return modifiedModel;
|
||||||
} else {
|
}else {
|
||||||
log.info("modifyModelProportion 失败。 Response code {}", responseCode);
|
log.info("modifyModelProportion 失败。 Response code {}", responseCode);
|
||||||
throw new BusinessException("modifyModelProportion 失败。 Response code " + responseCode);
|
throw new BusinessException("modifyModelProportion 失败。 Response code " + responseCode);
|
||||||
}
|
}
|
||||||
@@ -4443,11 +4387,10 @@ public class PythonService {
|
|||||||
log.info("imageSegmentation 结果 : {}", jsonObject.get("data").toString());
|
log.info("imageSegmentation 结果 : {}", jsonObject.get("data").toString());
|
||||||
List<ImageSegmentation.ImageDate> seg = JSONObject.parseObject(
|
List<ImageSegmentation.ImageDate> seg = JSONObject.parseObject(
|
||||||
jsonObject.get("data").toString(),
|
jsonObject.get("data").toString(),
|
||||||
new TypeReference<List<ImageSegmentation.ImageDate>>() {
|
new TypeReference<List<ImageSegmentation.ImageDate>>() {}
|
||||||
}
|
|
||||||
);
|
);
|
||||||
return seg;
|
return seg;
|
||||||
} else {
|
}else {
|
||||||
log.info("imageSegmentation 失败。 Response code {}", responseCode);
|
log.info("imageSegmentation 失败。 Response code {}", responseCode);
|
||||||
throw new BusinessException("imageSegmentation 失败。 Response code " + responseCode);
|
throw new BusinessException("imageSegmentation 失败。 Response code " + responseCode);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package com.ai.da.python.vo;
|
package com.ai.da.python.vo;
|
||||||
|
|
||||||
import com.alibaba.fastjson.annotation.JSONField;
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class DesignPythonItemPrint {
|
public class DesignPythonItemPrint {
|
||||||
@@ -53,7 +53,7 @@ public class DesignPythonItemPrint {
|
|||||||
if (ifDesign){
|
if (ifDesign){
|
||||||
this.print_path_list = print_path_list;
|
this.print_path_list = print_path_list;
|
||||||
this.location = Collections.singletonList(Arrays.asList(0.0f, 0.0f));
|
this.location = Collections.singletonList(Arrays.asList(0.0f, 0.0f));
|
||||||
this.print_scale_list = Collections.singletonList(Arrays.asList(1.0f, 1.0f));
|
this.print_scale_list = Collections.singletonList(Arrays.asList(0.0f, 0.0f));
|
||||||
this.print_angle_list = Arrays.asList(0.0, 0.0);
|
this.print_angle_list = Arrays.asList(0.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,25 +20,6 @@ public interface GlobalAwardService {
|
|||||||
CheckOTPVO checkCode(String email, String otp);
|
CheckOTPVO checkCode(String email, String otp);
|
||||||
|
|
||||||
void checkSecurityToken(String email, String securityToken);
|
void checkSecurityToken(String email, String securityToken);
|
||||||
|
|
||||||
/**
|
|
||||||
* 导出参赛者列表为 Excel(二进制)
|
|
||||||
* @return Excel 文件的字节数组
|
|
||||||
*/
|
|
||||||
byte[] exportContestants() throws Exception;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 将参赛者列表导出并保存到服务端本地目录(使用服务配置的 uploadDir/exports)
|
|
||||||
*/
|
|
||||||
void saveContestantsToLocal() throws Exception;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据参赛者编号范围导出参赛者文件到本地目录
|
|
||||||
* @param minContestantNumber 最小参赛者编号
|
|
||||||
* @param maxContestantNumber 最大参赛者编号
|
|
||||||
* @return 导出的参赛者数量
|
|
||||||
*/
|
|
||||||
int exportContestantFiles(Integer minContestantNumber, Integer maxContestantNumber) throws Exception;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ public interface RabbitMQService {
|
|||||||
|
|
||||||
void publishMessageToGenerate(String message);
|
void publishMessageToGenerate(String message);
|
||||||
|
|
||||||
void publishMessageToGenerateResult(String message);
|
|
||||||
|
|
||||||
void publishMessageToSR(String message);
|
void publishMessageToSR(String message);
|
||||||
|
|
||||||
Integer getMessageCount(String queueUrl);
|
Integer getMessageCount(String queueUrl);
|
||||||
|
|||||||
@@ -244,13 +244,12 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
|||||||
AccountLoginVO response = CopyUtil.copyObject(account, AccountLoginVO.class);
|
AccountLoginVO response = CopyUtil.copyObject(account, AccountLoginVO.class);
|
||||||
response.setEmail(account.getUserEmail());
|
response.setEmail(account.getUserEmail());
|
||||||
String token = LocalCacheUtils.getTokenCache(String.valueOf(account.getId()));
|
String token = LocalCacheUtils.getTokenCache(String.valueOf(account.getId()));
|
||||||
/*if (StringUtils.isNotBlank(token)) {
|
if (StringUtils.isNotBlank(token)) {
|
||||||
//用户已登入
|
//用户已登入
|
||||||
response.setToken(token);
|
response.setToken(token);
|
||||||
} else {
|
} else {
|
||||||
response.setToken(createAccountToken(account));
|
response.setToken(createAccountToken(account));
|
||||||
}*/
|
}
|
||||||
response.setToken(createAccountToken(account));
|
|
||||||
response.setUserId(account.getId());
|
response.setUserId(account.getId());
|
||||||
response.setSystemUser(account.getSystemUser());
|
response.setSystemUser(account.getSystemUser());
|
||||||
// 设置头像
|
// 设置头像
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public class AffiliateServiceImpl extends ServiceImpl<AffiliateMapper, Affiliate
|
|||||||
// 邮件通知审批者
|
// 邮件通知审批者
|
||||||
String merchantEmail = "kimwong@code-create.com.hk";
|
String merchantEmail = "kimwong@code-create.com.hk";
|
||||||
String developer = "xupei3360@163.com";
|
String developer = "xupei3360@163.com";
|
||||||
String[] receiverEmail = {merchantEmail, developer};
|
String[] receiverEmail = {/*merchantEmail,*/ developer};
|
||||||
SendEmailUtil.affiliateEmailReminder(receiverEmail, new AffiliateEmailParamsDTO(userHolder.getUsername(), promotionMethod), "new");
|
SendEmailUtil.affiliateEmailReminder(receiverEmail, new AffiliateEmailParamsDTO(userHolder.getUsername(), promotionMethod), "new");
|
||||||
// emailService.affiliateEmailReminder(Arrays.asList(/*merchantEmail,*/ developer), new AffiliateEmailParamsDTO(userHolder.getUsername(), promotionMethod), "new");
|
// emailService.affiliateEmailReminder(Arrays.asList(/*merchantEmail,*/ developer), new AffiliateEmailParamsDTO(userHolder.getUsername(), promotionMethod), "new");
|
||||||
}else {
|
}else {
|
||||||
@@ -442,7 +442,7 @@ public class AffiliateServiceImpl extends ServiceImpl<AffiliateMapper, Affiliate
|
|||||||
|
|
||||||
String merchantEmail = "kimwong@code-create.com.hk";
|
String merchantEmail = "kimwong@code-create.com.hk";
|
||||||
String developer = "xupei3360@163.com";
|
String developer = "xupei3360@163.com";
|
||||||
String[] receiverEmail = {merchantEmail, developer};
|
String[] receiverEmail = {/*merchantEmail,*/ developer};
|
||||||
// 邮件通知
|
// 邮件通知
|
||||||
SendEmailUtil.affiliateEmailReminder(receiverEmail, affiliateEmailParamsDTO, "summary");
|
SendEmailUtil.affiliateEmailReminder(receiverEmail, affiliateEmailParamsDTO, "summary");
|
||||||
// emailService.affiliateEmailReminder(Arrays.asList(/*merchantEmail,*/ developer), affiliateEmailParamsDTO, "summary");
|
// emailService.affiliateEmailReminder(Arrays.asList(/*merchantEmail,*/ developer), affiliateEmailParamsDTO, "summary");
|
||||||
|
|||||||
@@ -520,10 +520,9 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
|||||||
.filter(f -> f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName()))
|
.filter(f -> f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName()))
|
||||||
.map(DesignCollectionPrintElementDTO::getId)
|
.map(DesignCollectionPrintElementDTO::getId)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
List<CollectionElement> printBoardElements = new ArrayList<>();
|
|
||||||
if (!CollectionUtils.isEmpty(printBoardIds)) {
|
if (!CollectionUtils.isEmpty(printBoardIds)) {
|
||||||
// 从数据库批量查询printBoard元素
|
// 从数据库批量查询printBoard元素
|
||||||
printBoardElements = collectionElementMapper.selectBatchIds(printBoardIds);
|
List<CollectionElement> printBoardElements = collectionElementMapper.selectBatchIds(printBoardIds);
|
||||||
// 验证查询结果的完整性
|
// 验证查询结果的完整性
|
||||||
if (CollectionUtil.isEmpty(printBoardElements) || printBoardElements.size() != printBoardIds.size()) {
|
if (CollectionUtil.isEmpty(printBoardElements) || printBoardElements.size() != printBoardIds.size()) {
|
||||||
throw new BusinessException("get.printBoards.data.is.mismatch");
|
throw new BusinessException("get.printBoards.data.is.mismatch");
|
||||||
@@ -544,8 +543,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
|||||||
Map<Long, DesignCollectionPrintElementDTO> idToMap = designDTO.getPrintBoards()
|
Map<Long, DesignCollectionPrintElementDTO> idToMap = designDTO.getPrintBoards()
|
||||||
.stream()
|
.stream()
|
||||||
.collect(Collectors.toMap(DesignCollectionPrintElementDTO::getId, v -> v));
|
.collect(Collectors.toMap(DesignCollectionPrintElementDTO::getId, v -> v));
|
||||||
printBoardElements.addAll(covertLibrarysToPrintCollections(librarys, idToMap));
|
libraryCollectionElements.addAll(covertLibrarysToPrintCollections(librarys, idToMap));
|
||||||
// libraryCollectionElements.addAll(covertLibrarysToPrintCollections(librarys, idToMap));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -561,8 +559,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
|||||||
Map<Long, DesignCollectionPrintElementDTO> idToMap = designDTO.getPrintBoards()
|
Map<Long, DesignCollectionPrintElementDTO> idToMap = designDTO.getPrintBoards()
|
||||||
.stream()
|
.stream()
|
||||||
.collect(Collectors.toMap(DesignCollectionPrintElementDTO::getId, v -> v));
|
.collect(Collectors.toMap(DesignCollectionPrintElementDTO::getId, v -> v));
|
||||||
printBoardElements.addAll(covertGeneratesToPrintCollections(generateDetailList, idToMap));
|
generateCollectionElements.addAll(covertGeneratesToPrintCollections(generateDetailList, idToMap));
|
||||||
// generateCollectionElements.addAll(covertGeneratesToPrintCollections(generateDetailList, idToMap));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import io.netty.util.internal.StringUtil;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.poi.xssf.usermodel.*;
|
import org.apache.poi.xssf.usermodel.*;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@@ -148,17 +149,7 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
|||||||
|| ADMIN_IDS.contains(account.getId())
|
|| ADMIN_IDS.contains(account.getId())
|
||||||
|| ADMIN_IDS_READ_ONLY.contains(account.getId())
|
|| ADMIN_IDS_READ_ONLY.contains(account.getId())
|
||||||
)) {
|
)) {
|
||||||
boolean filterBySecond ;
|
if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00";
|
||||||
if (StringUtil.isNullOrEmpty(startTime)) {
|
|
||||||
startTime = "2024-02-01 00:00:00";
|
|
||||||
filterBySecond = true;
|
|
||||||
} else {
|
|
||||||
LocalDateTime thresholdTime = LocalDateTime.of(2024, 5, 1, 0, 0, 0);
|
|
||||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
||||||
LocalDateTime startDateTime = LocalDateTime.parse(startTime, formatter);
|
|
||||||
filterBySecond = startDateTime.isBefore(thresholdTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StringUtil.isNullOrEmpty(endTime)) {
|
if (StringUtil.isNullOrEmpty(endTime)) {
|
||||||
// yyyy-MM-dd HH:mm:ss "HH"表示24小时制 "hh"表示12小时制
|
// yyyy-MM-dd HH:mm:ss "HH"表示24小时制 "hh"表示12小时制
|
||||||
endTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
endTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
@@ -182,7 +173,7 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
|||||||
default:
|
default:
|
||||||
throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
|
throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
|
||||||
}
|
}
|
||||||
return designMapper.getDesignStatistic(startTime, endTime, ids, email, role, account.getOrganizationName(), filterBySecond);
|
return designMapper.getDesignStatistic(startTime, endTime, ids, email, role, account.getOrganizationName());
|
||||||
} else {
|
} else {
|
||||||
throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
|
throw new BusinessException("have.no.permission", ResultEnum.PROMPT.getCode());
|
||||||
}
|
}
|
||||||
@@ -704,19 +695,14 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
|||||||
|
|
||||||
String username = UserContext.getUserHolder().getUsername();
|
String username = UserContext.getUserHolder().getUsername();
|
||||||
Account account = new Account();
|
Account account = new Account();
|
||||||
account.setId(accountId);
|
|
||||||
// 修改用户有效期截止日期、用户类型、积分
|
// 修改用户有效期截止日期、用户类型、积分
|
||||||
if (!Objects.isNull(validEndTime)) {
|
if (!Objects.isNull(validEndTime)) {
|
||||||
account.setValidEndTime(validEndTime);
|
account.setValidEndTime(validEndTime);
|
||||||
log.info("管理员:{},修改用户 {} 信息,将账号到期时间置为:{}", username, accountId, validEndTime);
|
log.info("管理员:{},修改用户 {} 信息,将账号到期时间置为:{}", username, accountId, validEndTime);
|
||||||
}
|
}
|
||||||
if (!Objects.isNull(systemUser) && !systemUser.equals(0)) {
|
if (!Objects.isNull(systemUser)) {
|
||||||
account.setSystemUser(systemUser);
|
account.setSystemUser(systemUser);
|
||||||
log.info("管理员:{},修改用户 {} 信息,将账号身份置为:{}", username, accountId, systemUser);
|
log.info("管理员:{},修改用户 {} 信息,将账号身份置为:{}", username, accountId, systemUser);
|
||||||
} else if (systemUser.equals(0)){
|
|
||||||
// 将用户身份设置为游客
|
|
||||||
accountService.toVisitor(account);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
/*if (!StringUtils.isNullOrEmpty(systemUser)) {
|
/*if (!StringUtils.isNullOrEmpty(systemUser)) {
|
||||||
int systemUser = 0;
|
int systemUser = 0;
|
||||||
@@ -742,6 +728,7 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
|||||||
}
|
}
|
||||||
|
|
||||||
// todo 如果修改管理员账号的积分上限或子账号数量,则其所有子账号的积分上限需要重新计算
|
// todo 如果修改管理员账号的积分上限或子账号数量,则其所有子账号的积分上限需要重新计算
|
||||||
|
account.setId(accountId);
|
||||||
account.setUpdateDate(new Date());
|
account.setUpdateDate(new Date());
|
||||||
return accountMapper.updateById(account) == 1;
|
return accountMapper.updateById(account) == 1;
|
||||||
// accountService.update(account,null);
|
// accountService.update(account,null);
|
||||||
@@ -870,20 +857,19 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
|||||||
if (!StringUtil.isNullOrEmpty(queryPaymentInfoDTO.getOrder()) && queryPaymentInfoDTO.getOrder().equals("ASC")) {
|
if (!StringUtil.isNullOrEmpty(queryPaymentInfoDTO.getOrder()) && queryPaymentInfoDTO.getOrder().equals("ASC")) {
|
||||||
order = "ASC";
|
order = "ASC";
|
||||||
}
|
}
|
||||||
String status = StringUtil.isNullOrEmpty(queryPaymentInfoDTO.getStatus()) ? "Success" : queryPaymentInfoDTO.getStatus();
|
|
||||||
List<PaymentInfoVO> paymentInfoVOS = paymentInfoMapper.queryPaymentInfo(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
List<PaymentInfoVO> paymentInfoVOS = paymentInfoMapper.queryPaymentInfo(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
||||||
queryPaymentInfoDTO.getType(), status,
|
queryPaymentInfoDTO.getType(), queryPaymentInfoDTO.getStatus(),
|
||||||
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
||||||
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(),
|
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(),
|
||||||
size, offset, order, queryPaymentInfoDTO.getPayer());
|
size, offset, order, queryPaymentInfoDTO.getPayer());
|
||||||
// 查询数据总量
|
// 查询数据总量
|
||||||
Long total = paymentInfoMapper.queryPaymentInfoCount(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
Long total = paymentInfoMapper.queryPaymentInfoCount(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
||||||
queryPaymentInfoDTO.getType(), status,
|
queryPaymentInfoDTO.getType(), queryPaymentInfoDTO.getStatus(),
|
||||||
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
||||||
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(), queryPaymentInfoDTO.getPayer());
|
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(), queryPaymentInfoDTO.getPayer());
|
||||||
// 查询符合查询条件的总金额
|
// 查询符合查询条件的总金额
|
||||||
BigDecimal payerTotal = paymentInfoMapper.queryTotalPaymentAmount(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
BigDecimal payerTotal = paymentInfoMapper.queryTotalPaymentAmount(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
||||||
queryPaymentInfoDTO.getType(), status,
|
queryPaymentInfoDTO.getType(), queryPaymentInfoDTO.getStatus(),
|
||||||
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
||||||
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(), queryPaymentInfoDTO.getPayer());
|
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(), queryPaymentInfoDTO.getPayer());
|
||||||
// 总页数
|
// 总页数
|
||||||
|
|||||||
@@ -497,10 +497,6 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
.collect(Collectors.toMap(DesignSingleItemDTO::getPriority, DesignSingleItemDTO::getOffset));
|
.collect(Collectors.toMap(DesignSingleItemDTO::getPriority, DesignSingleItemDTO::getOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建 priority 到 DesignSingleItemDTO 的映射,用于获取 transpose 和 rotate
|
|
||||||
Map<Integer, DesignSingleItemDTO> priorityToItemDTOMap = designSingleItemDTOList.stream()
|
|
||||||
.collect(Collectors.toMap(DesignSingleItemDTO::getPriority, dto -> dto, (old, newVal) -> old));
|
|
||||||
|
|
||||||
List<TDesignPythonOutfitDetail> list = new ArrayList<>();
|
List<TDesignPythonOutfitDetail> list = new ArrayList<>();
|
||||||
for (int i = 0; i < layers.size(); i++) {
|
for (int i = 0; i < layers.size(); i++) {
|
||||||
JSONObject jsonObject = layers.getJSONObject(i);
|
JSONObject jsonObject = layers.getJSONObject(i);
|
||||||
@@ -529,12 +525,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
designPythonOutfitDetail.setOffset(String.valueOf(priorityOffset.get(Math.abs(priority))));
|
designPythonOutfitDetail.setOffset(String.valueOf(priorityOffset.get(Math.abs(priority))));
|
||||||
}
|
}
|
||||||
designPythonOutfitDetail.setPriority(priority);
|
designPythonOutfitDetail.setPriority(priority);
|
||||||
// 从前端传入的 DesignSingleItemDTO 中获取 transpose 和 rotate,不再从 Python 返回的数据获取
|
designPythonOutfitDetail.setTranspose(jsonObject.getString("transpose"));
|
||||||
DesignSingleItemDTO itemDTO = priorityToItemDTOMap.get(Math.abs(priority));
|
designPythonOutfitDetail.setRotate(jsonObject.getDouble("rotate"));
|
||||||
if (itemDTO != null) {
|
|
||||||
designPythonOutfitDetail.setTranspose(itemDTO.getTranspose() != null ? Arrays.toString(itemDTO.getTranspose()) : null);
|
|
||||||
designPythonOutfitDetail.setRotate(itemDTO.getRotate());
|
|
||||||
}
|
|
||||||
|
|
||||||
list.add(designPythonOutfitDetail);
|
list.add(designPythonOutfitDetail);
|
||||||
}
|
}
|
||||||
@@ -1044,7 +1036,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, List<String>> setPriorityAndUndividedLayer(JSONArray layers, DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO) {
|
public Map<String, List<String>> setPriorityAndUndividedLayer(JSONArray layers, DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO) {
|
||||||
String designType = "default";
|
String designType = "default";
|
||||||
if (Objects.nonNull(designSingleIncludeLayersDTO)) {
|
if (Objects.nonNull(designSingleIncludeLayersDTO)) {
|
||||||
designType = designSingleIncludeLayersDTO.getDesignType();
|
designType = designSingleIncludeLayersDTO.getDesignType();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ import java.math.BigDecimal;
|
|||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.format.DateTimeFormatter;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
@@ -1670,24 +1669,6 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
|||||||
.lt("create_date", endTime)
|
.lt("create_date", endTime)
|
||||||
.select("count(id) as count");
|
.select("count(id) as count");
|
||||||
|
|
||||||
// 如果startTime早于2024-05-01 00:00:00,添加额外的筛选条件
|
|
||||||
LocalDateTime thresholdTime = LocalDateTime.of(2024, 5, 1, 0, 0, 0);
|
|
||||||
|
|
||||||
try {
|
|
||||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
||||||
LocalDateTime startDateTime = LocalDateTime.parse(startTime, formatter);
|
|
||||||
|
|
||||||
if (startDateTime.isBefore(thresholdTime)) {
|
|
||||||
// 使用 notLike 来排除以 ":01" 或 ":02" 结尾的时间
|
|
||||||
// 方案2.1:使用 apply 方法执行数据库函数 (create_date 字段的实际存储格式(可能包含毫秒),所以取最后三个字符进行匹配)
|
|
||||||
queryWrapper.apply("DATE_FORMAT(create_date, '%s') NOT IN ('01', '02')");
|
|
||||||
/*queryWrapper.notLike("create_date", "%:01")
|
|
||||||
.notLike("create_date", "%:02");*/
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("Failed to parse startTime: {}, skip time-based filtering", startTime, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Objects.isNull(accountIds) && !accountIds.isEmpty()) {
|
if (!Objects.isNull(accountIds) && !accountIds.isEmpty()) {
|
||||||
queryWrapper.in("account_id", accountIds);
|
queryWrapper.in("account_id", accountIds);
|
||||||
}
|
}
|
||||||
@@ -1695,7 +1676,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
|||||||
List<Map<String, Object>> result = baseMapper.selectMaps(queryWrapper);
|
List<Map<String, Object>> result = baseMapper.selectMaps(queryWrapper);
|
||||||
if (result != null && !result.isEmpty()) {
|
if (result != null && !result.isEmpty()) {
|
||||||
Object countObj = result.get(0).get("count");
|
Object countObj = result.get(0).get("count");
|
||||||
return countObj != null ? ((Number) countObj).longValue() : 0L;
|
return (Long) countObj;
|
||||||
} else {
|
} else {
|
||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -587,7 +587,7 @@ public class EmailServiceImpl implements EmailService {
|
|||||||
try {
|
try {
|
||||||
String merchantEmail = "kimwong@code-create.com.hk";
|
String merchantEmail = "kimwong@code-create.com.hk";
|
||||||
String developer = "xupei3360@163.com";
|
String developer = "xupei3360@163.com";
|
||||||
List<String> merchantReceiver = Arrays.asList(merchantEmail, developer);
|
List<String> merchantReceiver = Arrays.asList(/*merchantEmail,*/ developer);
|
||||||
|
|
||||||
String merchantSubject = null;
|
String merchantSubject = null;
|
||||||
String merchantTemplate = null;
|
String merchantTemplate = null;
|
||||||
@@ -731,7 +731,7 @@ public class EmailServiceImpl implements EmailService {
|
|||||||
jsonObject.put("quantity", quantity);
|
jsonObject.put("quantity", quantity);
|
||||||
jsonObject.put("totalFee", amount);
|
jsonObject.put("totalFee", amount);
|
||||||
|
|
||||||
sendEmail(Arrays.asList(merchantEmail, developerEmail), jsonObject, CREDITS_PURCHASE_MERCHANT, "New Credit Purchase Order", null, null);
|
sendEmail(Arrays.asList(/*merchantEmail,*/ developerEmail), jsonObject, CREDITS_PURCHASE_MERCHANT, "New Credit Purchase Order", null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final static String COMMON_EXCEPTION_REMINDER = "135279_common-exception-reminder.html";
|
private final static String COMMON_EXCEPTION_REMINDER = "135279_common-exception-reminder.html";
|
||||||
|
|||||||
@@ -48,8 +48,6 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import okhttp3.*;
|
import okhttp3.*;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.springframework.transaction.support.TransactionSynchronization;
|
|
||||||
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
import org.apache.http.client.config.RequestConfig;
|
import org.apache.http.client.config.RequestConfig;
|
||||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
@@ -61,12 +59,10 @@ import org.bytedeco.javacv.Java2DFrameConverter;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.dao.DuplicateKeyException;
|
import org.springframework.dao.DuplicateKeyException;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Propagation;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@@ -198,13 +194,10 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
generate.setText(text);
|
generate.setText(text);
|
||||||
Long elementId = generateThroughImageTextDTO.getCollectionElementId();
|
Long elementId = generateThroughImageTextDTO.getCollectionElementId();
|
||||||
// validateGeneraType(generate, text, elementId);
|
// validateGeneraType(generate, text, elementId);
|
||||||
if (!(generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())&&generateThroughImageTextDTO.getModelName().equals("high"))){
|
if (!StringUtil.isNullOrEmpty(text)) {
|
||||||
if (!StringUtil.isNullOrEmpty(text)) {
|
text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type(), generateThroughImageTextDTO.getAgeGroup());
|
||||||
text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type(), generateThroughImageTextDTO.getAgeGroup());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// todo 这一步现在还是有必要的吗?
|
// todo 这一步现在还是有必要的吗?
|
||||||
// 2.1 sketch或print在t_collection_element表/t_library表中的信息是否需要更新 如 level2Type
|
// 2.1 sketch或print在t_collection_element表/t_library表中的信息是否需要更新 如 level2Type
|
||||||
CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type(), generateThroughImageTextDTO.getDesignType());
|
CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type(), generateThroughImageTextDTO.getDesignType());
|
||||||
@@ -225,8 +218,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
version = "fast";
|
version = "fast";
|
||||||
params.put("version", "fast");
|
params.put("version", "fast");
|
||||||
}
|
}
|
||||||
// 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中
|
|
||||||
saveGenerateImmediately(generate);
|
|
||||||
// 3.1 确定不同类型的印花分别调哪个接口
|
// 3.1 确定不同类型的印花分别调哪个接口
|
||||||
if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) {
|
if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) {
|
||||||
switch (generateThroughImageTextDTO.getLevel2Type()) {
|
switch (generateThroughImageTextDTO.getLevel2Type()) {
|
||||||
@@ -252,28 +243,15 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue);
|
jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (Objects.equals(version, "fast")) {
|
GenerateToPythonDTO generateToPythonDTO = new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(),
|
||||||
GenerateToPythonDTO generateToPythonDTO = new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(),
|
mode, category, generateThroughImageTextDTO.getGender(), version);
|
||||||
mode, category, generateThroughImageTextDTO.getGender(), version);
|
jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue);
|
||||||
jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
|
|
||||||
path = CommonConstant.GENERATE_PATH_FLUX2_KLEIN;
|
|
||||||
// 构建object_name: {userId}/{category}/{uuid}.png
|
|
||||||
String objectName = generateThroughImageTextDTO.getUserId() + "/" + category + "/" + UUID.randomUUID() + ".png";
|
|
||||||
|
|
||||||
ImageProcessRequest imageProcessRequest = ImageProcessRequest.builder()
|
|
||||||
.object_name(objectName)
|
|
||||||
.bucket_name(userBucket)
|
|
||||||
.prompt(text).build();
|
|
||||||
jsonString = JSON.toJSONString(imageProcessRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, port, path, generateThroughImageTextDTO.getUniqueId());
|
Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, port, path);
|
||||||
|
|
||||||
|
// 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中
|
||||||
|
save(generate);
|
||||||
|
|
||||||
// 5、将本次请求存入redis
|
// 5、将本次请求存入redis
|
||||||
String key = generateResultKey + ":" + generateThroughImageTextDTO.getUniqueId();
|
String key = generateResultKey + ":" + generateThroughImageTextDTO.getUniqueId();
|
||||||
@@ -288,40 +266,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveGenerateImmediately(Generate generate) {
|
|
||||||
save(generate);
|
|
||||||
// 使用 TransactionSynchronizationManager 在事务真正提交后再设锁
|
|
||||||
// 否则 save() 完成后事务尚未 commit,MQ 消费者立即读到 null
|
|
||||||
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
|
||||||
@Override
|
|
||||||
public void afterCommit() {
|
|
||||||
String lockKey = "generate:lock:" + generate.getUniqueId();
|
|
||||||
redisUtil.addToString(lockKey, "1", 60L);
|
|
||||||
log.debug("Save lock set after commit for uniqueId: {}", generate.getUniqueId());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void waitForSaveLock(String uniqueId) {
|
|
||||||
String lockKey = "generate:lock:" + uniqueId;
|
|
||||||
int maxRetries = 30;
|
|
||||||
int retryIntervalMs = 200;
|
|
||||||
for (int i = 0; i < maxRetries; i++) {
|
|
||||||
if (Boolean.TRUE.equals(redisUtil.hasKey(lockKey))) {
|
|
||||||
log.debug("Save lock acquired for uniqueId: {} after {} retries", uniqueId, i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Thread.sleep(retryIntervalMs);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
log.warn("Interrupted while waiting for save lock: {}", uniqueId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.warn("Save lock timeout for uniqueId: {}, proceeding anyway", uniqueId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public GenerateModeEnum getMode(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
|
public GenerateModeEnum getMode(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
|
||||||
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText())) {
|
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText())) {
|
||||||
if (Objects.nonNull(generateThroughImageTextDTO.getCollectionElementId())) {
|
if (Objects.nonNull(generateThroughImageTextDTO.getCollectionElementId())) {
|
||||||
@@ -340,16 +284,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void processGenerateResult(String taskId, String url, String category) {
|
public void processGenerateResult(String taskId, String url, String category) {
|
||||||
log.info("============ProcessGenerateResult listening==========");
|
|
||||||
log.debug("taskId: " + taskId);
|
|
||||||
String status = null;
|
|
||||||
// 1、处理模型返回的数据
|
// 1、处理模型返回的数据
|
||||||
GenerateDetail generateDetail = new GenerateDetail();
|
GenerateDetail generateDetail = new GenerateDetail();
|
||||||
GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO();
|
GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO();
|
||||||
Generate generate;
|
Generate generate;
|
||||||
try {
|
try {
|
||||||
// 等待 HTTP 线程写入完成后再查库
|
|
||||||
waitForSaveLock(taskId);
|
|
||||||
generate = selectByUniqueId(taskId);
|
generate = selectByUniqueId(taskId);
|
||||||
} catch (MybatisPlusException e) {
|
} catch (MybatisPlusException e) {
|
||||||
log.error(e.getMessage());
|
log.error(e.getMessage());
|
||||||
@@ -372,15 +311,14 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
generateDetail.setUrl(url);
|
generateDetail.setUrl(url);
|
||||||
generateDetail.setGenerateId(generate.getId());
|
generateDetail.setGenerateId(generate.getId());
|
||||||
generateDetail.setCreateDate(LocalDateTime.now());
|
generateDetail.setCreateDate(LocalDateTime.now());
|
||||||
generateDetail.setMd5("");
|
generateDetail.setMd5(md5);
|
||||||
// 将相应的url保存到数据库
|
// 将相应的url保存到数据库
|
||||||
generateDetailMapper.insert(generateDetail);
|
generateDetailMapper.insert(generateDetail);
|
||||||
log.debug("generateDetail: " + generateDetail.toString());
|
|
||||||
|
|
||||||
// String uuid = taskId.substring(0, taskId.substring(0, taskId.lastIndexOf("-")).lastIndexOf("-"));
|
// String uuid = taskId.substring(0, taskId.substring(0, taskId.lastIndexOf("-")).lastIndexOf("-"));
|
||||||
String key = generateResultKey + ":" + taskId;
|
String key = generateResultKey + ":" + taskId;
|
||||||
String imageName = url.substring(url.lastIndexOf("/") + 1);
|
String imageName = url.substring(url.lastIndexOf("/") + 1);
|
||||||
status = imageName.equals("white_image.jpg") ? "Invalid" : "Success";
|
String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success";
|
||||||
if (StringUtil.isNullOrEmpty(category)) {
|
if (StringUtil.isNullOrEmpty(category)) {
|
||||||
Generate generateRecord = selectByUniqueId(taskId);
|
Generate generateRecord = selectByUniqueId(taskId);
|
||||||
category = generateRecord.getLevel2Type();
|
category = generateRecord.getLevel2Type();
|
||||||
@@ -388,8 +326,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, status, category);
|
GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, status, category);
|
||||||
// 更新redis
|
// 更新redis
|
||||||
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||||
log.debug("generateResultVO: " + generateResultVO.toString());
|
|
||||||
|
|
||||||
|
|
||||||
// 执行积分扣除
|
// 执行积分扣除
|
||||||
// ** 注:如果生成的图片都是空白 则不扣积分
|
// ** 注:如果生成的图片都是空白 则不扣积分
|
||||||
@@ -849,9 +785,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
long requestEndTime = System.currentTimeMillis();
|
long requestEndTime = System.currentTimeMillis();
|
||||||
log.info("HTTP请求完成 - 响应状态: {}, 耗时: {}ms, taskId: {}",
|
log.info("HTTP请求完成 - 响应状态: {}, 耗时: {}ms, taskId: {}",
|
||||||
response.code(), (requestEndTime - requestStartTime), taskId);
|
response.code(), (requestEndTime - requestStartTime), taskId);
|
||||||
String result = response.body().string();
|
|
||||||
if (!response.isSuccessful()) {
|
if (!response.isSuccessful()) {
|
||||||
log.warn("Google API响应失败,状态码: {} for taskId: {},结果:{}", response.code(), taskId, result);
|
log.warn("Google API响应失败,状态码: {} for taskId: {}", response.code(), taskId);
|
||||||
if (attempt < maxRetries) {
|
if (attempt < maxRetries) {
|
||||||
Thread.sleep(retryDelay * attempt); // 递增延迟
|
Thread.sleep(retryDelay * attempt); // 递增延迟
|
||||||
continue;
|
continue;
|
||||||
@@ -860,7 +795,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String result = response.body().string();
|
||||||
// log.info("Google 响应结果:{}", result);
|
// log.info("Google 响应结果:{}", result);
|
||||||
com.alibaba.fastjson.JSONObject jsonResponse = JSON.parseObject(result);
|
com.alibaba.fastjson.JSONObject jsonResponse = JSON.parseObject(result);
|
||||||
|
|
||||||
@@ -1130,12 +1065,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
|
|
||||||
String result = response.body().string();
|
String result = response.body().string();
|
||||||
|
|
||||||
if (response.code() != 200) {
|
|
||||||
log.error("Google API 请求失败 - taskId: {}, 尝试: {}, URL: {}, 状态码: {}, 响应结果: {}",
|
|
||||||
taskId, attempt, endpoint, response.code(), result);
|
|
||||||
throw new BusinessException("system.error");
|
|
||||||
}
|
|
||||||
|
|
||||||
// log.info("Google 响应结果:{}", result);
|
// log.info("Google 响应结果:{}", result);
|
||||||
com.alibaba.fastjson.JSONObject jsonResponse = JSON.parseObject(result);
|
com.alibaba.fastjson.JSONObject jsonResponse = JSON.parseObject(result);
|
||||||
|
|
||||||
@@ -1274,7 +1203,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
* @param modelName advanced high normal
|
* @param modelName advanced high normal
|
||||||
*/
|
*/
|
||||||
private HashMap<String, String> chooseModelAndPrompt(GenerateThroughImageTextDTO generateDTO, String modelName) {
|
private HashMap<String, String> chooseModelAndPrompt(GenerateThroughImageTextDTO generateDTO, String modelName) {
|
||||||
if (StringUtil.isNullOrEmpty(modelName)) {
|
if (StringUtil.isNullOrEmpty(modelName)){
|
||||||
throw new BusinessException("system error");
|
throw new BusinessException("system error");
|
||||||
}
|
}
|
||||||
HashMap<String, String> modelAndPromptMap = new HashMap<>();
|
HashMap<String, String> modelAndPromptMap = new HashMap<>();
|
||||||
@@ -1292,7 +1221,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
String style = generateDTO.getText().substring(0, firstCommaIndex).trim();
|
String style = generateDTO.getText().substring(0, firstCommaIndex).trim();
|
||||||
|
|
||||||
String prompt = generateDTO.getText().substring(firstCommaIndex + 1).trim();
|
String prompt = generateDTO.getText().substring(firstCommaIndex + 1).trim();
|
||||||
prompt = getPrintboardPrompt(style, prompt, modelName, isUseImage);
|
prompt = getPrintboardPrompt(style, prompt,modelName);
|
||||||
modelAndPromptMap.put(ModelConstants.PROMPT, prompt);
|
modelAndPromptMap.put(ModelConstants.PROMPT, prompt);
|
||||||
|
|
||||||
|
|
||||||
@@ -1331,31 +1260,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
modelAndPromptMap.put(ModelConstants.USE_MODEL, ModelConstants.LOCAL_MODEL);
|
modelAndPromptMap.put(ModelConstants.USE_MODEL, ModelConstants.LOCAL_MODEL);
|
||||||
}
|
}
|
||||||
} else if (ModelConstants.SKETCHBOARD.equals(generateDTO.getLevel1Type())) {
|
} else if (ModelConstants.SKETCHBOARD.equals(generateDTO.getLevel1Type())) {
|
||||||
String style = "";
|
String prompt = generateDTO.getText() + "rules:front view sketch only,plain white background, single garment only, orthographic, centered on white background, borderless canvas, thin monochrome black line art.\n" +
|
||||||
String userPrompt = "";
|
|
||||||
// 找到第一个逗号的位置
|
|
||||||
int firstCommaIndex = generateDTO.getText().indexOf(",");
|
|
||||||
if (firstCommaIndex != -1) {
|
|
||||||
// 截取第一个逗号前的内容作为style
|
|
||||||
style = generateDTO.getText().substring(0, firstCommaIndex).trim();
|
|
||||||
// 截取第一个逗号后的所有内容作为userPrompt(去除首尾空格)
|
|
||||||
userPrompt = generateDTO.getText().substring(firstCommaIndex + 1).trim();
|
|
||||||
|
|
||||||
if ("Lolita".equals(style)) {
|
|
||||||
style = "洛丽塔";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 兼容无逗号的情况:style为空,全部内容作为userPrompt
|
|
||||||
userPrompt = generateDTO.getText().trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
String prompt = userPrompt + "rules:front view sketch only,plain white background, single garment only, orthographic, centered on white background, borderless canvas, thin monochrome black line art.\n" +
|
|
||||||
" No clothes hanger, no fake clothes hanger, no human-related lines, no color fill, no words, no text, no black background, no boundary or frame.";
|
" No clothes hanger, no fake clothes hanger, no human-related lines, no color fill, no words, no text, no black background, no boundary or frame.";
|
||||||
|
|
||||||
if (!style.trim().isEmpty() && !"all".equalsIgnoreCase(style)) {
|
|
||||||
prompt += ".sketch style:" + style.trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
modelAndPromptMap.put(ModelConstants.PROMPT, prompt);
|
modelAndPromptMap.put(ModelConstants.PROMPT, prompt);
|
||||||
if (isUseImage) {
|
if (isUseImage) {
|
||||||
if (ModelConstants.ADVANCED.equals(modelName)) {
|
if (ModelConstants.ADVANCED.equals(modelName)) {
|
||||||
@@ -1553,13 +1459,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
if (imagePath != null) {
|
if (imagePath != null) {
|
||||||
requestBuilder.image(finalImagePath1);
|
requestBuilder.image(finalImagePath1);
|
||||||
}
|
}
|
||||||
if (useModel.equals(ModelConstants.PRINTBOARD_HIGH_I2I)) {
|
|
||||||
GenerateImagesRequest.OptimizePromptOptions optimizePromptOptions = new GenerateImagesRequest.OptimizePromptOptions();
|
|
||||||
optimizePromptOptions.setMode("fast");
|
|
||||||
requestBuilder.optimizePromptOptions(optimizePromptOptions);
|
|
||||||
//由于PRINTBOARD_HIGH_I2I与PRINTBOARD_ADVANCED_I2I使用模型一致,为了区别积分扣除,PRINTBOARD_HIGH_I2I加入了-fast,但传入模型时需要去掉-fast,用PRINTBOARD_ADVANCED_I2I的常量做替代
|
|
||||||
requestBuilder.model(ModelConstants.PRINTBOARD_ADVANCED_I2I);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 保存生成记录到数据库
|
// 保存生成记录到数据库
|
||||||
Generate generate = new Generate(
|
Generate generate = new Generate(
|
||||||
@@ -1671,7 +1570,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private String getPrintboardPrompt(String style, String userInput, String modelName, boolean isUseImage) {
|
private String getPrintboardPrompt(String style, String userInput, String modelName) {
|
||||||
String systemPrompt = null;
|
String systemPrompt = null;
|
||||||
String prompt;
|
String prompt;
|
||||||
|
|
||||||
@@ -1697,16 +1596,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
"Flat textile pattern printed directly on fabric surface, no three-dimensional objects, no items placed on cloth. \n" +
|
"Flat textile pattern printed directly on fabric surface, no three-dimensional objects, no items placed on cloth. \n" +
|
||||||
"Real style: fabric print, realistic woven/printed pattern, detailed surface pattern only";
|
"Real style: fabric print, realistic woven/printed pattern, detailed surface pattern only";
|
||||||
}
|
}
|
||||||
} else {
|
}else {
|
||||||
throw new BusinessException("style error:" + style);
|
throw new BusinessException("style error:"+ style);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userInput == null || userInput.trim().isEmpty()) {
|
if (userInput == null || userInput.trim().isEmpty()) {
|
||||||
if (isUseImage) {
|
throw new BusinessException("prompt null");
|
||||||
prompt = "Theme: Image content" + "\nRequirement: " + systemPrompt;
|
|
||||||
} else {
|
|
||||||
throw new BusinessException("prompt null");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
prompt = "Theme: " + userInput.trim() + "\nRequirement: " + systemPrompt;
|
prompt = "Theme: " + userInput.trim() + "\nRequirement: " + systemPrompt;
|
||||||
}
|
}
|
||||||
@@ -2106,9 +2001,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
public Generate selectByUniqueId(String uniqueId) {
|
public Generate selectByUniqueId(String uniqueId) {
|
||||||
QueryWrapper<Generate> qw = new QueryWrapper<>();
|
QueryWrapper<Generate> qw = new QueryWrapper<>();
|
||||||
qw.eq("unique_id", uniqueId);
|
qw.eq("unique_id", uniqueId);
|
||||||
log.debug("selectByUniqueId: " + uniqueId);
|
|
||||||
Generate one = getOne(qw);
|
|
||||||
log.debug("Generate: " + one);
|
|
||||||
return getOne(qw);
|
return getOne(qw);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4279,11 +4172,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
// 处理不同状态
|
// 处理不同状态
|
||||||
switch (statusEnum) {
|
switch (statusEnum) {
|
||||||
case TASK_NOT_FOUND:
|
case TASK_NOT_FOUND:
|
||||||
// 审核没过
|
// 审核没过
|
||||||
case REQUEST_MODERATED:
|
case REQUEST_MODERATED:
|
||||||
// 审核没过
|
// 审核没过
|
||||||
case CONTENT_MODERATED:
|
case CONTENT_MODERATED:
|
||||||
// 出错
|
// 出错
|
||||||
case ERROR:
|
case ERROR:
|
||||||
return "Fail";
|
return "Fail";
|
||||||
case PENDING_F:
|
case PENDING_F:
|
||||||
@@ -4402,7 +4295,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
MotionModeEnum motionModeEnum = MotionModeEnum.of(poseTransformDTO.getMode());
|
MotionModeEnum motionModeEnum = MotionModeEnum.of(poseTransformDTO.getMode());
|
||||||
switch (motionModeEnum) {
|
switch (motionModeEnum) {
|
||||||
case POSE_TO_VIDEO:
|
case POSE_TO_VIDEO:
|
||||||
params.put("pose_id", poseTransformDTO.getPoseId().toString());
|
params.put("pose_id", poseTransformDTO.getPoseId());
|
||||||
params.put("image_url", poseTransformDTO.getProductImage());
|
params.put("image_url", poseTransformDTO.getProductImage());
|
||||||
break;
|
break;
|
||||||
case PROMPT_TO_VIDEO:
|
case PROMPT_TO_VIDEO:
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
@@ -30,20 +29,6 @@ import java.io.IOException;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
|
||||||
import org.apache.poi.ss.usermodel.Row;
|
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -61,7 +46,7 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
|
|
||||||
private final RedisUtil redisUtil;
|
private final RedisUtil redisUtil;
|
||||||
|
|
||||||
@Value("${file.upload.temp.dir}")
|
@Value("${file.upload.dir:uploads}")
|
||||||
private String uploadDir;
|
private String uploadDir;
|
||||||
|
|
||||||
private static final DateTimeFormatter YYYY_MM_DD = DateTimeFormatter.ofPattern("yyyy/MM");
|
private static final DateTimeFormatter YYYY_MM_DD = DateTimeFormatter.ofPattern("yyyy/MM");
|
||||||
@@ -143,7 +128,6 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public Map<String, Object> saveContestant(ContestantDTO request) {
|
public Map<String, Object> saveContestant(ContestantDTO request) {
|
||||||
Map<String,Object> resp = new HashMap<>();
|
Map<String,Object> resp = new HashMap<>();
|
||||||
if (request.getEmail() == null) {
|
if (request.getEmail() == null) {
|
||||||
@@ -158,59 +142,26 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
|
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
if (existing == null) {
|
if (existing == null) {
|
||||||
// 通过行锁 + 重试机制保证 contestant_number 在并发下自增分配
|
Contestant toInsert = Contestant.builder()
|
||||||
final int maxAttempts = 5;
|
.email(request.getEmail())
|
||||||
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
.firstName(request.getFirstName())
|
||||||
try {
|
.lastName(request.getLastName())
|
||||||
// 获取当前最大 contestant_number 并加行锁(LIMIT 1 FOR UPDATE)
|
.gender(request.getGender())
|
||||||
QueryWrapper<Contestant> qMax = new QueryWrapper<>();
|
.occupation(request.getOccupation())
|
||||||
qMax.isNotNull("contestant_number");
|
.age(request.getAge())
|
||||||
qMax.orderByDesc("contestant_number");
|
.countryRegionCity(request.getCountryRegionCity())
|
||||||
qMax.last("LIMIT 1 FOR UPDATE");
|
.phoneNumber(request.getPhoneNumber())
|
||||||
Contestant last = contestantMapper.selectOne(qMax);
|
.designTitle(request.getDesignTitle())
|
||||||
Integer nextNumber = (last == null || last.getContestantNumber() == null) ? 10000 : last.getContestantNumber() + 1;
|
.designDescription(request.getDesignDescription())
|
||||||
|
.pdfPath(request.getPdfPath())
|
||||||
Contestant toInsert = Contestant.builder()
|
.videoPath(request.getVideoPath())
|
||||||
.email(request.getEmail())
|
.createdAt(now)
|
||||||
.firstName(request.getFirstName())
|
.updatedAt(now)
|
||||||
.lastName(request.getLastName())
|
.build();
|
||||||
.gender(request.getGender())
|
contestantMapper.insert(toInsert);
|
||||||
.occupation(request.getOccupation())
|
resp.put("success", true);
|
||||||
.age(request.getAge())
|
sendSiteMsg(toInsert.getId(), toInsert.getEmail());
|
||||||
.countryRegionCity(request.getCountryRegionCity())
|
return resp;
|
||||||
.phoneNumber(request.getPhoneNumber())
|
|
||||||
.designTitle(request.getDesignTitle())
|
|
||||||
.designDescription(request.getDesignDescription())
|
|
||||||
.pdfPath(request.getPdfPath())
|
|
||||||
.videoPath(request.getVideoPath())
|
|
||||||
.videoDuration(request.getVideoDuration())
|
|
||||||
.videoSize(request.getVideoSize())
|
|
||||||
.pdfSize(request.getPdfSize())
|
|
||||||
.contestantNumber(nextNumber)
|
|
||||||
.createdAt(now)
|
|
||||||
.updatedAt(now)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
contestantMapper.insert(toInsert);
|
|
||||||
|
|
||||||
resp.put("success", true);
|
|
||||||
sendSiteMsg(toInsert.getId(), toInsert.getEmail());
|
|
||||||
return resp;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("Attempt {} to assign contestant_number failed", attempt, e);
|
|
||||||
String msg = e.getMessage() == null ? "" : e.getMessage().toLowerCase();
|
|
||||||
if ((msg.contains("duplicate") || msg.contains("uniq_contestant_number") || msg.contains("contestant_number")) && attempt < maxAttempts) {
|
|
||||||
try {
|
|
||||||
Thread.sleep(100L);
|
|
||||||
} catch (InterruptedException ie) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new BusinessException("Failed to assign contestant number after retries.");
|
|
||||||
} else {
|
} else {
|
||||||
// update existing contestant
|
// update existing contestant
|
||||||
existing.setFirstName(request.getFirstName());
|
existing.setFirstName(request.getFirstName());
|
||||||
@@ -224,9 +175,6 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
existing.setDesignDescription(request.getDesignDescription());
|
existing.setDesignDescription(request.getDesignDescription());
|
||||||
existing.setPdfPath(request.getPdfPath());
|
existing.setPdfPath(request.getPdfPath());
|
||||||
existing.setVideoPath(request.getVideoPath());
|
existing.setVideoPath(request.getVideoPath());
|
||||||
existing.setVideoDuration(request.getVideoDuration());
|
|
||||||
existing.setVideoSize(request.getVideoSize());
|
|
||||||
existing.setPdfSize(request.getPdfSize());
|
|
||||||
existing.setUpdatedAt(now);
|
existing.setUpdatedAt(now);
|
||||||
contestantMapper.updateById(existing);
|
contestantMapper.updateById(existing);
|
||||||
resp.put("success", true);
|
resp.put("success", true);
|
||||||
@@ -234,134 +182,6 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] exportContestants() throws Exception {
|
|
||||||
List<Contestant> list = contestantMapper.selectList(new QueryWrapper<>());
|
|
||||||
try (XSSFWorkbook workbook = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream()) {
|
|
||||||
Sheet sheet = workbook.createSheet("contestants");
|
|
||||||
int rowIdx = 0;
|
|
||||||
Row header = sheet.createRow(rowIdx++);
|
|
||||||
String[] headers = new String[] {
|
|
||||||
"contestantNumber", "email", "firstName", "lastName", "gender", "occupation",
|
|
||||||
"age", "countryRegionCity", "phoneNumber", "designTitle", "designDescription",
|
|
||||||
"pdfPath", "videoPath", "videoDuration", "videoSizeMB", "pdfSizeMB", "createdAt", "updatedAt"
|
|
||||||
};
|
|
||||||
for (int i = 0; i < headers.length; i++) {
|
|
||||||
Cell c = header.createCell(i);
|
|
||||||
c.setCellValue(headers[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Contestant cst : list) {
|
|
||||||
Row r = sheet.createRow(rowIdx++);
|
|
||||||
int ci = 0;
|
|
||||||
r.createCell(ci++).setCellValue(cst.getContestantNumber() == null ? "" : cst.getContestantNumber().toString());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getEmail() == null ? "" : cst.getEmail());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getFirstName() == null ? "" : cst.getFirstName());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getLastName() == null ? "" : cst.getLastName());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getGender() == null ? "" : cst.getGender());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getOccupation() == null ? "" : cst.getOccupation());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getAge() == null ? "" : cst.getAge().toString());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getCountryRegionCity() == null ? "" : cst.getCountryRegionCity());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getPhoneNumber() == null ? "" : cst.getPhoneNumber());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getDesignTitle() == null ? "" : cst.getDesignTitle());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getDesignDescription() == null ? "" : cst.getDesignDescription());
|
|
||||||
// r.createCell(ci++).setCellValue(cst.getPdfPath() == null ? "" : cst.getPdfPath());
|
|
||||||
// r.createCell(ci++).setCellValue(cst.getVideoPath() == null ? "" : cst.getVideoPath());
|
|
||||||
// 视频时长(秒)
|
|
||||||
r.createCell(ci++).setCellValue(cst.getVideoDuration() == null ? "" : cst.getVideoDuration().toString());
|
|
||||||
// 视频大小、PDF 大小:以 MB 导出,保留两位小数
|
|
||||||
if (cst.getVideoSize() == null) {
|
|
||||||
r.createCell(ci++).setCellValue("");
|
|
||||||
} else {
|
|
||||||
double vMb = cst.getVideoSize() / 1024.0 / 1024.0;
|
|
||||||
r.createCell(ci++).setCellValue(String.format("%.2f", vMb));
|
|
||||||
}
|
|
||||||
if (cst.getPdfSize() == null) {
|
|
||||||
r.createCell(ci++).setCellValue("");
|
|
||||||
} else {
|
|
||||||
double pMb = cst.getPdfSize() / 1024.0 / 1024.0;
|
|
||||||
r.createCell(ci++).setCellValue(String.format("%.2f", pMb));
|
|
||||||
}
|
|
||||||
r.createCell(ci++).setCellValue(cst.getCreatedAt() == null ? "" : cst.getCreatedAt().toString());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getUpdatedAt() == null ? "" : cst.getUpdatedAt().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
workbook.write(out);
|
|
||||||
out.flush();
|
|
||||||
return out.toByteArray();
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error("export contestants failed", e);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveContestantsToLocal() throws Exception {
|
|
||||||
List<Contestant> list = contestantMapper.selectList(new QueryWrapper<>());
|
|
||||||
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");
|
|
||||||
String ts = LocalDateTime.now().format(fmt);
|
|
||||||
Path exportDir = Paths.get(uploadDir == null ? "uploads" : uploadDir, "exports");
|
|
||||||
Files.createDirectories(exportDir);
|
|
||||||
Path outPath = exportDir.resolve("contestants_" + ts + ".xlsx");
|
|
||||||
|
|
||||||
try (XSSFWorkbook workbook = new XSSFWorkbook(); FileOutputStream fos = new FileOutputStream(outPath.toFile())) {
|
|
||||||
Sheet sheet = workbook.createSheet("contestants");
|
|
||||||
int rowIdx = 0;
|
|
||||||
Row header = sheet.createRow(rowIdx++);
|
|
||||||
String[] headers = new String[] {
|
|
||||||
"contestantNumber", "email", "firstName", "lastName", "gender", "occupation",
|
|
||||||
"age", "countryRegionCity", "phoneNumber", "designTitle", "designDescription",
|
|
||||||
"pdfPath", "videoPath", "videoDuration", "videoSizeMB", "pdfSizeMB", "createdAt", "updatedAt"
|
|
||||||
};
|
|
||||||
for (int i = 0; i < headers.length; i++) {
|
|
||||||
Cell c = header.createCell(i);
|
|
||||||
c.setCellValue(headers[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Contestant cst : list) {
|
|
||||||
Row r = sheet.createRow(rowIdx++);
|
|
||||||
int ci = 0;
|
|
||||||
r.createCell(ci++).setCellValue(cst.getContestantNumber() == null ? "" : cst.getContestantNumber().toString());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getEmail() == null ? "" : cst.getEmail());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getFirstName() == null ? "" : cst.getFirstName());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getLastName() == null ? "" : cst.getLastName());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getGender() == null ? "" : cst.getGender());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getOccupation() == null ? "" : cst.getOccupation());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getAge() == null ? "" : cst.getAge().toString());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getCountryRegionCity() == null ? "" : cst.getCountryRegionCity());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getPhoneNumber() == null ? "" : cst.getPhoneNumber());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getDesignTitle() == null ? "" : cst.getDesignTitle());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getDesignDescription() == null ? "" : cst.getDesignDescription());
|
|
||||||
// r.createCell(ci++).setCellValue(cst.getPdfPath() == null ? "" : cst.getPdfPath());
|
|
||||||
// r.createCell(ci++).setCellValue(cst.getVideoPath() == null ? "" : cst.getVideoPath());
|
|
||||||
// 视频时长(秒)
|
|
||||||
r.createCell(ci++).setCellValue(cst.getVideoDuration() == null ? "" : cst.getVideoDuration().toString());
|
|
||||||
// 视频大小、PDF 大小:以 MB 导出,保留两位小数
|
|
||||||
if (cst.getVideoSize() == null) {
|
|
||||||
r.createCell(ci++).setCellValue("");
|
|
||||||
} else {
|
|
||||||
double vMb = cst.getVideoSize() / 1024.0 / 1024.0;
|
|
||||||
r.createCell(ci++).setCellValue(String.format("%.2f", vMb));
|
|
||||||
}
|
|
||||||
if (cst.getPdfSize() == null) {
|
|
||||||
r.createCell(ci++).setCellValue("");
|
|
||||||
} else {
|
|
||||||
double pMb = cst.getPdfSize() / 1024.0 / 1024.0;
|
|
||||||
r.createCell(ci++).setCellValue(String.format("%.2f", pMb));
|
|
||||||
}
|
|
||||||
r.createCell(ci++).setCellValue(cst.getCreatedAt() == null ? "" : cst.getCreatedAt().toString());
|
|
||||||
r.createCell(ci++).setCellValue(cst.getUpdatedAt() == null ? "" : cst.getUpdatedAt().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
workbook.write(fos);
|
|
||||||
fos.flush();
|
|
||||||
log.info("Exported contestants to local file: {}", outPath.toString());
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error("save contestants to local failed", e);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ContestantDTO getContestantByID(String id) {
|
public ContestantDTO getContestantByID(String id) {
|
||||||
if (id == null) {
|
if (id == null) {
|
||||||
@@ -384,9 +204,6 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
dto.setDesignDescription(existing.getDesignDescription());
|
dto.setDesignDescription(existing.getDesignDescription());
|
||||||
dto.setPdfPath(existing.getPdfPath());
|
dto.setPdfPath(existing.getPdfPath());
|
||||||
dto.setVideoPath(existing.getVideoPath());
|
dto.setVideoPath(existing.getVideoPath());
|
||||||
dto.setVideoDuration(existing.getVideoDuration());
|
|
||||||
dto.setPdfSize(existing.getPdfSize());
|
|
||||||
dto.setVideoSize(existing.getVideoSize());
|
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -478,111 +295,6 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
// 这里推送消息是在接受到视频生成结束后发生的,所以UserContext中没有用户信息
|
// 这里推送消息是在接受到视频生成结束后发生的,所以UserContext中没有用户信息
|
||||||
messageCenterService.pushMessage("system", userId);
|
messageCenterService.pushMessage("system", userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int exportContestantFiles(Integer minContestantNumber, Integer maxContestantNumber) throws Exception {
|
|
||||||
if (minContestantNumber == null || maxContestantNumber == null) {
|
|
||||||
throw new BusinessException("minContestantNumber and maxContestantNumber are required.");
|
|
||||||
}
|
|
||||||
if (minContestantNumber > maxContestantNumber) {
|
|
||||||
throw new BusinessException("minContestantNumber cannot be greater than maxContestantNumber.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1. 根据contestantNumber范围查询参赛者
|
|
||||||
QueryWrapper<Contestant> queryWrapper = new QueryWrapper<>();
|
|
||||||
queryWrapper.lambda()
|
|
||||||
.ge(Contestant::getContestantNumber, minContestantNumber)
|
|
||||||
.le(Contestant::getContestantNumber, maxContestantNumber)
|
|
||||||
.orderByAsc(Contestant::getContestantNumber);
|
|
||||||
List<Contestant> contestants = contestantMapper.selectList(queryWrapper);
|
|
||||||
|
|
||||||
if (contestants.isEmpty()) {
|
|
||||||
log.info("No contestants found in range [{}, {}]", minContestantNumber, maxContestantNumber);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 创建基础目录
|
|
||||||
String baseDir = uploadDir + "/contestants";
|
|
||||||
Path basePath = Paths.get(baseDir).toAbsolutePath();
|
|
||||||
Files.createDirectories(basePath);
|
|
||||||
log.info("Base directory created: {}", basePath);
|
|
||||||
|
|
||||||
int exportedCount = 0;
|
|
||||||
|
|
||||||
// 3. 遍历每个参赛者,下载文件
|
|
||||||
for (Contestant contestant : contestants) {
|
|
||||||
Integer contestantNumber = contestant.getContestantNumber();
|
|
||||||
if (contestantNumber == null) {
|
|
||||||
log.warn("Contestant {} has no contestantNumber, skipping", contestant.getId());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建参赛者文件夹
|
|
||||||
String contestantDir = baseDir + "/" + contestantNumber;
|
|
||||||
Path contestantPath = Paths.get(contestantDir);
|
|
||||||
Files.createDirectories(contestantPath);
|
|
||||||
|
|
||||||
// 下载PDF文件
|
|
||||||
String pdfPath = contestant.getPdfPath();
|
|
||||||
if (StringUtils.isNotBlank(pdfPath)) {
|
|
||||||
try {
|
|
||||||
String fileName = pdfPath.contains("/") ?
|
|
||||||
pdfPath.substring(pdfPath.lastIndexOf("/") + 1) : "design.pdf";
|
|
||||||
downloadFileFromMinio(pdfPath, contestantPath.toString(), "design.pdf");
|
|
||||||
log.info("Downloaded PDF for contestant {}", fileName);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("Failed to download PDF for contestant {}: {}", contestantNumber, e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 下载视频文件
|
|
||||||
String videoPath = contestant.getVideoPath();
|
|
||||||
if (StringUtils.isNotBlank(videoPath)) {
|
|
||||||
try {
|
|
||||||
// 根据路径判断视频格式
|
|
||||||
String fileName = videoPath.contains("/") ?
|
|
||||||
videoPath.substring(videoPath.lastIndexOf("/") + 1) : "video.mp4";
|
|
||||||
downloadFileFromMinio(videoPath, contestantPath.toString(), fileName);
|
|
||||||
log.info("Downloaded video for contestant {}", contestantNumber);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("Failed to download video for contestant {}: {}", contestantNumber, e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exportedCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
log.info("Exported {} contestants' files to {}", exportedCount, basePath);
|
|
||||||
return exportedCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 从MinIO下载文件到本地
|
|
||||||
* @param minioPath MinIO路径 (格式: bucketName/objectPath)
|
|
||||||
* @param localDir 本地目录
|
|
||||||
* @param fileName 本地文件名
|
|
||||||
*/
|
|
||||||
private void downloadFileFromMinio(String minioPath, String localDir, String fileName) {
|
|
||||||
if (StringUtils.isBlank(minioPath)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 从路径中提取bucket名称和对象名称
|
|
||||||
int index = minioPath.indexOf("/");
|
|
||||||
if (index == -1) {
|
|
||||||
log.warn("Invalid MinIO path: {}", minioPath);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String bucketName = minioPath.substring(0, index);
|
|
||||||
String objectName = minioPath.substring(index + 1);
|
|
||||||
|
|
||||||
// 构建本地文件完整路径
|
|
||||||
Path localFilePath = Paths.get(localDir, fileName);
|
|
||||||
|
|
||||||
// 下载文件
|
|
||||||
minioUtil.downloadMinioObjectToLocal(bucketName, objectName, localFilePath.toString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import io.netty.util.internal.StringUtil;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
@@ -54,11 +53,7 @@ public class LibraryModelPointServiceImpl extends ServiceImpl<LibraryModelPointM
|
|||||||
private final PythonTAllInfoService pythonTAllInfoService;
|
private final PythonTAllInfoService pythonTAllInfoService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public LibraryModelPointVO saveOrEditTemplatePoint(LibraryModelPointDTO libraryModelPointDTO) {
|
public LibraryModelPointVO saveOrEditTemplatePoint(LibraryModelPointDTO libraryModelPointDTO) {
|
||||||
// 参数校验
|
|
||||||
validateInputParams(libraryModelPointDTO);
|
|
||||||
|
|
||||||
LibraryModelPointVO libraryModelPointVO = CopyUtil.copyObject(libraryModelPointDTO, LibraryModelPointVO.class);
|
LibraryModelPointVO libraryModelPointVO = CopyUtil.copyObject(libraryModelPointDTO, LibraryModelPointVO.class);
|
||||||
|
|
||||||
// 不管是保存还是另存为,都需要传模特的libraryId
|
// 不管是保存还是另存为,都需要传模特的libraryId
|
||||||
@@ -76,8 +71,7 @@ public class LibraryModelPointServiceImpl extends ServiceImpl<LibraryModelPointM
|
|||||||
// 更新模特图片
|
// 更新模特图片
|
||||||
if (flag) {
|
if (flag) {
|
||||||
libModel.setUrl(url);
|
libModel.setUrl(url);
|
||||||
String preSignedUrl = minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
|
libModel.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), false));
|
||||||
libModel.setMd5(MD5Utils.encryptFile(preSignedUrl, false));
|
|
||||||
List<Integer> imagesWidthAndHeight = minioUtil.getImagesWidthAndHeight(url);
|
List<Integer> imagesWidthAndHeight = minioUtil.getImagesWidthAndHeight(url);
|
||||||
libModel.setWidth(imagesWidthAndHeight.get(0));
|
libModel.setWidth(imagesWidthAndHeight.get(0));
|
||||||
libModel.setHigh(imagesWidthAndHeight.get(1));
|
libModel.setHigh(imagesWidthAndHeight.get(1));
|
||||||
@@ -110,10 +104,25 @@ public class LibraryModelPointServiceImpl extends ServiceImpl<LibraryModelPointM
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// 不覆盖,即另存为
|
// 不覆盖,即另存为
|
||||||
Library saveAsModel = createNewLibraryCopy(libModel, libraryModelPointDTO);
|
// 新增模特library信息
|
||||||
|
Library saveAsModel = new Library();
|
||||||
|
saveAsModel.setAccountId(libModel.getAccountId());
|
||||||
|
saveAsModel.setLevel1Type(libModel.getLevel1Type());
|
||||||
|
saveAsModel.setLevel2Type(libModel.getLevel2Type());
|
||||||
|
String ageGroup = StringUtil.isNullOrEmpty(libModel.getLevel3Type()) ? "Adult" : libModel.getLevel3Type();
|
||||||
|
saveAsModel.setLevel3Type(ageGroup);
|
||||||
|
saveAsModel.setName(DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD));
|
||||||
|
saveAsModel.setUrl(url);
|
||||||
|
saveAsModel.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), false));
|
||||||
|
List<Integer> imagesWidthAndHeight = minioUtil.getImagesWidthAndHeight(url);
|
||||||
|
saveAsModel.setWidth(imagesWidthAndHeight.get(0));
|
||||||
|
saveAsModel.setHigh(imagesWidthAndHeight.get(1));
|
||||||
|
saveAsModel.setCreateDate(DateUtil.getByTimeZone(libraryModelPointDTO.getTimeZone()));
|
||||||
|
libraryService.save(saveAsModel);
|
||||||
|
// 更新新的模特在library中的id,用于后面新建模特点位信息用
|
||||||
|
libraryModelPointDTO.setLibraryId(saveAsModel.getId());
|
||||||
|
|
||||||
// 新增模特点位信息
|
// 新增模特点位信息
|
||||||
libraryModelPointDTO.setLibraryId(saveAsModel.getId()); // 更新libraryId为新创建的模型ID
|
|
||||||
LibraryModelPoint libraryModelPoint = resolvePoint(libraryModelPointDTO);
|
LibraryModelPoint libraryModelPoint = resolvePoint(libraryModelPointDTO);
|
||||||
libraryModelPoint.setModelType("Library");
|
libraryModelPoint.setModelType("Library");
|
||||||
libraryModelPoint.setCreateDate(DateUtil.getByTimeZone(libraryModelPointDTO.getTimeZone()));
|
libraryModelPoint.setCreateDate(DateUtil.getByTimeZone(libraryModelPointDTO.getTimeZone()));
|
||||||
@@ -121,50 +130,22 @@ public class LibraryModelPointServiceImpl extends ServiceImpl<LibraryModelPointM
|
|||||||
libraryModelPointVO.setTemplateId(libraryModelPoint.getId());
|
libraryModelPointVO.setTemplateId(libraryModelPoint.getId());
|
||||||
libraryModelPointVO.setRelationId(libraryModelPoint.getRelationId());
|
libraryModelPointVO.setRelationId(libraryModelPoint.getRelationId());
|
||||||
}
|
}
|
||||||
|
//编辑
|
||||||
|
/*if (!StringUtils.isEmpty(libraryModelPointDTO.getModelSex())) {
|
||||||
|
Library byId = libraryService.getById(libraryModelPointDTO.getLibraryId());
|
||||||
|
if (!byId.getLevel2Type().equals(libraryModelPointDTO.getModelSex())) {
|
||||||
|
if (byId.getLevel2Type().equals(Sex.FEMALE.getValue())) {
|
||||||
|
libraryService.checkModel(Sex.FEMALE.getValue(), Collections.singletonList(byId.getId()), 1);
|
||||||
|
}else {
|
||||||
|
libraryService.checkModel(Sex.MALE.getValue(), Collections.singletonList(byId.getId()), 1);
|
||||||
|
}
|
||||||
|
byId.setLevel2Type(libraryModelPointDTO.getModelSex());
|
||||||
|
libraryService.updateById(byId);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
return libraryModelPointVO;
|
return libraryModelPointVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 验证输入参数
|
|
||||||
*/
|
|
||||||
private void validateInputParams(LibraryModelPointDTO libraryModelPointDTO) {
|
|
||||||
if (libraryModelPointDTO == null) {
|
|
||||||
throw new BusinessException("libraryModelPointDTO cannot be null");
|
|
||||||
}
|
|
||||||
if (libraryModelPointDTO.getLibraryId() == null || libraryModelPointDTO.getLibraryId() <= 0) {
|
|
||||||
throw new BusinessException("libraryId is required");
|
|
||||||
}
|
|
||||||
if (StringUtils.isEmpty(libraryModelPointDTO.getModelPath())) {
|
|
||||||
throw new BusinessException("modelPath is required");
|
|
||||||
}
|
|
||||||
if (StringUtils.isEmpty(libraryModelPointDTO.getTimeZone())) {
|
|
||||||
throw new BusinessException("timeZone is required");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建新的库模型副本
|
|
||||||
*/
|
|
||||||
private Library createNewLibraryCopy(Library originalModel, LibraryModelPointDTO libraryModelPointDTO) {
|
|
||||||
// 新增模特library信息
|
|
||||||
Library saveAsModel = new Library();
|
|
||||||
saveAsModel.setAccountId(originalModel.getAccountId());
|
|
||||||
saveAsModel.setLevel1Type(originalModel.getLevel1Type());
|
|
||||||
saveAsModel.setLevel2Type(originalModel.getLevel2Type());
|
|
||||||
String ageGroup = StringUtil.isNullOrEmpty(originalModel.getLevel3Type()) ? "Adult" : originalModel.getLevel3Type();
|
|
||||||
saveAsModel.setLevel3Type(ageGroup);
|
|
||||||
saveAsModel.setName(DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD));
|
|
||||||
saveAsModel.setUrl(libraryModelPointDTO.getModelPath());
|
|
||||||
String preSignedUrl = minioUtil.getPreSignedUrl(libraryModelPointDTO.getModelPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
|
|
||||||
saveAsModel.setMd5(MD5Utils.encryptFile(preSignedUrl, false));
|
|
||||||
List<Integer> imagesWidthAndHeight = minioUtil.getImagesWidthAndHeight(libraryModelPointDTO.getModelPath());
|
|
||||||
saveAsModel.setWidth(imagesWidthAndHeight.get(0));
|
|
||||||
saveAsModel.setHigh(imagesWidthAndHeight.get(1));
|
|
||||||
saveAsModel.setCreateDate(DateUtil.getByTimeZone(libraryModelPointDTO.getTimeZone()));
|
|
||||||
libraryService.save(saveAsModel);
|
|
||||||
return saveAsModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LibraryModelPointVO saveOrEditTemplatePointOld(LibraryModelPointDTO libraryModelPointDTO) {
|
public LibraryModelPointVO saveOrEditTemplatePointOld(LibraryModelPointDTO libraryModelPointDTO) {
|
||||||
// Library library = libraryService.getById(libraryModelPointDTO.getLibraryId());
|
// Library library = libraryService.getById(libraryModelPointDTO.getLibraryId());
|
||||||
|
|||||||
@@ -31,11 +31,6 @@ public class RabbitMQServiceImpl implements RabbitMQService {
|
|||||||
mqPublisher.sendGenerateMessage(message);
|
mqPublisher.sendGenerateMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void publishMessageToGenerateResult(String message) {
|
|
||||||
mqPublisher.sendGenerateResultMessage(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void publishMessageToSR(String message) {
|
public void publishMessageToSR(String message) {
|
||||||
mqPublisher.sendSRMessage(message);
|
mqPublisher.sendSRMessage(message);
|
||||||
|
|||||||
@@ -1060,12 +1060,11 @@ public class StripeServiceImpl implements StripeService {
|
|||||||
String periodEnd = DateUtil.changeTimeStampFormat(subscriptionInfo.getCurrentPeriodEnd(), "seconds", CommonConstant.TIME_FORMAT_yyyy_MM_dd_HH_mm_ss);
|
String periodEnd = DateUtil.changeTimeStampFormat(subscriptionInfo.getCurrentPeriodEnd(), "seconds", CommonConstant.TIME_FORMAT_yyyy_MM_dd_HH_mm_ss);
|
||||||
|
|
||||||
qwPI.lambda().eq(PaymentInfo::getOrderNo, subscriptionInfo.getOrderNo())
|
qwPI.lambda().eq(PaymentInfo::getOrderNo, subscriptionInfo.getOrderNo())
|
||||||
.eq(PaymentInfo::getTradeState, "paid")
|
|
||||||
.between(PaymentInfo::getCreateTime, periodStart, periodEnd)
|
.between(PaymentInfo::getCreateTime, periodStart, periodEnd)
|
||||||
.orderByDesc(PaymentInfo::getId);
|
.orderByDesc(PaymentInfo::getId);
|
||||||
List<PaymentInfo> paymentInfos = paymentInfoMapper.selectList(qwPI);
|
List<PaymentInfo> paymentInfos = paymentInfoMapper.selectList(qwPI);
|
||||||
if (paymentInfos.isEmpty()) {
|
if (paymentInfos.isEmpty()) {
|
||||||
log.info("不发送邮件,原因:【根据order_no:{},查询到的成功的paymentInfos为空】", orderNo);
|
log.info("不发送邮件,原因:【根据order_no:{},查询到的paymentInfos为空】", orderNo);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
PaymentInfo paymentInfo = paymentInfos.get(0);
|
PaymentInfo paymentInfo = paymentInfos.get(0);
|
||||||
|
|||||||
@@ -1461,16 +1461,12 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
|||||||
if (StringUtil.isNullOrEmpty(fluxResult)) {
|
if (StringUtil.isNullOrEmpty(fluxResult)) {
|
||||||
toProductImageResult.setStatus("Fail");
|
toProductImageResult.setStatus("Fail");
|
||||||
toProductImageResultMapper.updateById(toProductImageResult);
|
toProductImageResultMapper.updateById(toProductImageResult);
|
||||||
if (toProductImageResult.getIsLike() != null && toProductImageResult.getIsLike() == 1) {
|
sortRank(toProductImageResult);
|
||||||
sortRank(toProductImageResult);
|
|
||||||
}
|
|
||||||
results.add(new MagicToolResultVO(taskId, "Fail"));
|
results.add(new MagicToolResultVO(taskId, "Fail"));
|
||||||
} else if (fluxResult.equals("Fail") || fluxResult.equals("Pending")) {
|
} else if (fluxResult.equals("Fail") || fluxResult.equals("Pending")) {
|
||||||
toProductImageResult.setStatus(fluxResult);
|
toProductImageResult.setStatus(fluxResult);
|
||||||
toProductImageResultMapper.updateById(toProductImageResult);
|
toProductImageResultMapper.updateById(toProductImageResult);
|
||||||
if (fluxResult.equals("Fail") && toProductImageResult.getIsLike() != null && toProductImageResult.getIsLike() == 1) {
|
sortRank(toProductImageResult);
|
||||||
sortRank(toProductImageResult);
|
|
||||||
}
|
|
||||||
results.add(new MagicToolResultVO(taskId, fluxResult));
|
results.add(new MagicToolResultVO(taskId, fluxResult));
|
||||||
} else {
|
} else {
|
||||||
results.add(processFluxResult(fluxResult, toProductImageResult, taskId, toProductImageRecord.getPrompt()));
|
results.add(processFluxResult(fluxResult, toProductImageResult, taskId, toProductImageRecord.getPrompt()));
|
||||||
|
|||||||
@@ -125,9 +125,9 @@ orderList.link=https://develop.aida.com.hk/home/homePage?order=
|
|||||||
# 0 不发送邮件通知 1 发送邮件通知
|
# 0 不发送邮件通知 1 发送邮件通知
|
||||||
stripe.webhook.fail.reminder=0
|
stripe.webhook.fail.reminder=0
|
||||||
# kim test
|
# kim test
|
||||||
#stripe.paymentMethodConfiguration=pmc_1LywTWH7nPZ8bkrN6FvdCUWG
|
stripe.paymentMethodConfiguration=pmc_1LywTWH7nPZ8bkrN6FvdCUWG
|
||||||
# developer test
|
# developer test
|
||||||
stripe.paymentMethodConfiguration=pmc_1QIKyq02n1TEydyNKVEYvhW7
|
#stripe.paymentMethodConfiguration=pmc_1QIKyq02n1TEydyNKVEYvhW7
|
||||||
#thymelea模板配置
|
#thymelea模板配置
|
||||||
#控制 Thymeleaf 是否启用模板缓存 生产环境用true,以提高性能
|
#控制 Thymeleaf 是否启用模板缓存 生产环境用true,以提高性能
|
||||||
spring.thymeleaf.cache=false
|
spring.thymeleaf.cache=false
|
||||||
@@ -181,4 +181,4 @@ file.upload.max.size.video=104857600
|
|||||||
# 上传任务过期时间(小时)
|
# 上传任务过期时间(小时)
|
||||||
file.upload.task.expiry.hours=24
|
file.upload.task.expiry.hours=24
|
||||||
|
|
||||||
global.award.link=https://aida-global-design-awards.com.hk/contestants?id=
|
global.award.link=https://develop.aida.com.hk/award/contestants?id=
|
||||||
@@ -179,4 +179,4 @@ file.upload.max.size.video=104857600
|
|||||||
# 上传任务过期时间(小时)
|
# 上传任务过期时间(小时)
|
||||||
file.upload.task.expiry.hours=24
|
file.upload.task.expiry.hours=24
|
||||||
|
|
||||||
global.award.link=https://aida-global-design-awards.com.hk/contestants?id=
|
global.award.link=https://www.aida.com.hk/award/contestants?id=
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#spring.profiles.active=test
|
#spring.profiles.active=test
|
||||||
|
|
||||||
#<23><><EFBFBD><EFBFBD>application-prod<6F>ļ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
#<23><><EFBFBD><EFBFBD>application-prod<6F>ļ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
spring.profiles.active=prod
|
#spring.profiles.active=prod
|
||||||
|
|
||||||
#<23><><EFBFBD><EFBFBD>application-dev<65>ļ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
#<23><><EFBFBD><EFBFBD>application-dev<65>ļ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
#spring.profiles.active=dev
|
spring.profiles.active=dev
|
||||||
|
|||||||
@@ -61,10 +61,10 @@
|
|||||||
</if>
|
</if>
|
||||||
<!-- 添加时间区间查询条件 -->
|
<!-- 添加时间区间查询条件 -->
|
||||||
<if test="startTime != null and startTime != ''">
|
<if test="startTime != null and startTime != ''">
|
||||||
AND create_time >= #{startTime}
|
AND cd.create_time >= #{startTime}
|
||||||
</if>
|
</if>
|
||||||
<if test="endTime != null and endTime != ''">
|
<if test="endTime != null and endTime != ''">
|
||||||
AND create_time <= #{endTime}
|
AND cd.create_time <= #{endTime}
|
||||||
</if>
|
</if>
|
||||||
GROUP BY
|
GROUP BY
|
||||||
account_id
|
account_id
|
||||||
|
|||||||
@@ -52,10 +52,8 @@
|
|||||||
AND b.create_date between #{startTime} and #{endTime}
|
AND b.create_date between #{startTime} and #{endTime}
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
<if test="filterBySecond">
|
and b.create_date not like '%:01'
|
||||||
and b.create_date not like '%:01'
|
and b.create_date not like '%:02'
|
||||||
and b.create_date not like '%:02'
|
|
||||||
</if>
|
|
||||||
<if test="ids != null and ids.size() > 0">
|
<if test="ids != null and ids.size() > 0">
|
||||||
and a.id in
|
and a.id in
|
||||||
<foreach item="id" collection="ids" open="(" separator="," close=")">
|
<foreach item="id" collection="ids" open="(" separator="," close=")">
|
||||||
|
|||||||
@@ -17,5 +17,3 @@
|
|||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,9 +27,9 @@ paypal.webhook_id=1D107312EX592781K
|
|||||||
##### Stripe
|
##### Stripe
|
||||||
|
|
||||||
# developer
|
# developer
|
||||||
#stripe.private-key=sk_test_51P4ZZL02n1TEydyN8qQHjOA9imsFU7Oxs2HMHGy2urHnnQgSHnZuu5vVP6pKhEACwUpsKNyrbZpdcg5TJWJLRHcY008dEO1fn2
|
stripe.private-key=sk_test_51P4ZZL02n1TEydyN8qQHjOA9imsFU7Oxs2HMHGy2urHnnQgSHnZuu5vVP6pKhEACwUpsKNyrbZpdcg5TJWJLRHcY008dEO1fn2
|
||||||
# dev 端点
|
# dev 端点
|
||||||
#stripe.webhook-sign-secret=whsec_e0dBiJngx6qqgJj6yPyJ2A9ouh1Cjv5w
|
stripe.webhook-sign-secret=whsec_e0dBiJngx6qqgJj6yPyJ2A9ouh1Cjv5w
|
||||||
# local 端点
|
# local 端点
|
||||||
#stripe.webhook-sign-secret=whsec_TJcMSnAkh4uktrNY1M6Iy8XaVze4Rzqm
|
#stripe.webhook-sign-secret=whsec_TJcMSnAkh4uktrNY1M6Iy8XaVze4Rzqm
|
||||||
|
|
||||||
@@ -43,8 +43,8 @@ paypal.webhook_id=1D107312EX592781K
|
|||||||
#stripe.webhook-sign-secret=whsec_pX0pPMQm85PaUSWnFMEzoccb3MGNkjoL
|
#stripe.webhook-sign-secret=whsec_pX0pPMQm85PaUSWnFMEzoccb3MGNkjoL
|
||||||
|
|
||||||
# kim - live
|
# kim - live
|
||||||
stripe.private-key=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
|
#stripe.private-key=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
|
||||||
# prod 端点
|
# prod 端点
|
||||||
stripe.webhook-sign-secret=whsec_hhGDgdelQRHSg4LmChtQe41crj41eb11
|
#stripe.webhook-sign-secret=whsec_hhGDgdelQRHSg4LmChtQe41crj41eb11
|
||||||
# dev 端点
|
# dev 端点
|
||||||
#stripe.webhook-sign-secret=whsec_cFUtjUOo8wnrIKZmt4GNvt7ZY1bOfrYr
|
#stripe.webhook-sign-secret=whsec_cFUtjUOo8wnrIKZmt4GNvt7ZY1bOfrYr
|
||||||
|
|||||||
Reference in New Issue
Block a user