Compare commits
14 Commits
dev-ltx
...
dev/dev_xp
| Author | SHA1 | Date | |
|---|---|---|---|
| 55978ca410 | |||
| 60027ab17f | |||
| eba6fb512f | |||
| ca6d2dcb87 | |||
| 26d2d95acc | |||
| 379392c38d | |||
| 4757149214 | |||
| f2a074b2f6 | |||
| 6a7a37dcec | |||
|
|
c4d2780f0e | ||
|
|
1da6b7728c | ||
|
|
0faf77899b | ||
|
|
5dd862ff79 | ||
|
|
edaec9884d |
@@ -202,7 +202,7 @@ public class MyTaskScheduler {
|
||||
}
|
||||
}
|
||||
|
||||
// @Scheduled(cron = "0 0 9 * * ?")
|
||||
// @Scheduled(cron = "0 0 9 * * ?")
|
||||
public void sendTrialOrderExcelToManagements() {
|
||||
// 获取前一天日期
|
||||
LocalDate yesterday = LocalDate.now().minusDays(1);
|
||||
|
||||
@@ -20,7 +20,7 @@ public class ModelConstants {
|
||||
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 PRINTBOARD_HIGH_T2I = "doubao-seedream-3-0-t2i-250415";
|
||||
public static final String PRINTBOARD_HIGH_I2I = "doubao-seedream-4-0-250828";
|
||||
public static final String PRINTBOARD_HIGH_I2I = "doubao-seedream-4-0-250828-fast";
|
||||
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 NANO_BANANA = "gemini-2.5-flash-image";
|
||||
|
||||
@@ -34,7 +34,7 @@ public class AccountTask {
|
||||
accountService.refreshCreditsMonthly();
|
||||
}
|
||||
|
||||
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
||||
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
||||
public void getPaidUser() {
|
||||
// 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单
|
||||
accountService.extendValidityForCC();
|
||||
|
||||
@@ -45,7 +45,7 @@ public class PaymentTask {
|
||||
@Resource
|
||||
private PayPalCheckoutService payPalCheckoutService;
|
||||
|
||||
// @Scheduled(cron = "0/30 * * * * ?")
|
||||
// @Scheduled(cron = "0/30 * * * * ?")
|
||||
public void orderConfirmForPaypal() throws SerializeException {
|
||||
|
||||
// log.info("PayPal orderConfirm 被执行......");
|
||||
@@ -97,7 +97,7 @@ public class PaymentTask {
|
||||
//
|
||||
}
|
||||
|
||||
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
||||
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
|
||||
public void updateAffiliateInfoWithPayment(){
|
||||
// log.info("佣金计算定时器");
|
||||
affiliateService.updateAffiliateInfoWithPayment();
|
||||
@@ -109,7 +109,7 @@ public class PaymentTask {
|
||||
affiliateService.syncLinkViewCountToDB();
|
||||
}
|
||||
|
||||
// @Scheduled(cron = "0 0 8 28-31 * ?")
|
||||
// @Scheduled(cron = "0 0 8 28-31 * ?")
|
||||
public void commissionSummaryReminder(){
|
||||
// 每个月末的最后一天的早上八点执行
|
||||
LocalDate today = LocalDate.now();
|
||||
|
||||
@@ -40,7 +40,7 @@ public class SubscriptionReminderTask {
|
||||
REMINDER_DAYS_CONFIG.put("year", 14);
|
||||
}
|
||||
|
||||
// @Scheduled(cron = "0 0 9 * * ?")
|
||||
// @Scheduled(cron = "0 0 9 * * ?")
|
||||
public void subscriptionReminder() {
|
||||
// 获取所有需要通知的订阅
|
||||
List<SubscriptionInfo> subscriptionInfos = getDueSubscriptions();
|
||||
@@ -97,7 +97,7 @@ public class SubscriptionReminderTask {
|
||||
return subscriptionInfoMapper.selectList(qw);
|
||||
}
|
||||
|
||||
// @Scheduled(cron = "0 0 9 * * ?")
|
||||
// @Scheduled(cron = "0 0 9 * * ?")
|
||||
public void trialReminder() {
|
||||
// 今天的 00:00:00 和 23:59:59
|
||||
LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay();
|
||||
|
||||
@@ -1030,15 +1030,25 @@ public class SendEmailUtil {
|
||||
|
||||
private final static Long CN_2025_618 = 141425L;
|
||||
private final static Long EN_2025_618 = 141424L;
|
||||
public static void send618PromotionEmailTemp(String receiver, String language){
|
||||
try {
|
||||
// 实例化一个认证对象
|
||||
|
||||
private final static Long CN_GLOBAL_AWARDS = 166716L;
|
||||
private final static Long EN_GLOBAL_AWARDS = 166715L;
|
||||
private final static Long GLOBAL_AWARDS_2 = 173919L;
|
||||
|
||||
// 复用 SesClient,避免每次发送都创建新连接
|
||||
private static SesClient getSesClient() {
|
||||
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
|
||||
HttpProfile httpProfile = new HttpProfile();
|
||||
httpProfile.setEndpoint("ses.tencentcloudapi.com");
|
||||
ClientProfile clientProfile = new ClientProfile();
|
||||
clientProfile.setHttpProfile(httpProfile);
|
||||
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
|
||||
return new SesClient(cred, "ap-hongkong", clientProfile);
|
||||
}
|
||||
|
||||
public static void send618PromotionEmailTemp(String receiver, String language){
|
||||
SesClient client = null;
|
||||
try {
|
||||
client = getSesClient();
|
||||
SendEmailRequest req = new SendEmailRequest();
|
||||
req.setFromEmailAddress(CODE_CREATE_SEND_ADDRESS);
|
||||
req.setDestination(new String[]{receiver});
|
||||
@@ -1046,20 +1056,15 @@ public class SendEmailUtil {
|
||||
// 根据邮件类型设置不同的主题和模板
|
||||
String subject = "";
|
||||
Template template = new Template();
|
||||
// if (type == 1) {
|
||||
// subject = "Upcoming System Upgrade for AiDA 3.0";
|
||||
// template.setTemplateID(UPGRADE_NOTIFICATION_ID);
|
||||
// }else {
|
||||
// subject = "即将到来的AiDA 3.0系统升级";
|
||||
// template.setTemplateID(UPGRADE_NOTIFICATION_ID_CHINESE);
|
||||
// }
|
||||
if (language.equals("ENGLISH")) {
|
||||
subject = "Welcome back !Subscribe AiDA with the discount code to enjoy 50% OFF!";
|
||||
template.setTemplateID(EN_2025_618);
|
||||
subject = "AiDA Global Design Awards 2026 | The Journey Starts Now ! \nAiDA 全球设计大奖 2026 | 从现在开始你的创作之旅 !";
|
||||
template.setTemplateID(GLOBAL_AWARDS_2);
|
||||
/*if (language.equals("ENGLISH")) {
|
||||
subject = "From Idea to Wow. \uD83D\uDD25 | AiDA Demo & Global Awards";
|
||||
template.setTemplateID(EN_GLOBAL_AWARDS);
|
||||
}else {
|
||||
subject = "设计时速狂飙!AiDA 618半价让灵感永不限流!";
|
||||
template.setTemplateID(CN_2025_618);
|
||||
}
|
||||
subject = "灵感开挂,创作起飞 \uD83D\uDD25 | AiDA Demo & 全球设计大奖";
|
||||
template.setTemplateID(CN_GLOBAL_AWARDS);
|
||||
}*/
|
||||
|
||||
req.setSubject(subject);
|
||||
req.setTemplate(template);
|
||||
@@ -1069,9 +1074,7 @@ public class SendEmailUtil {
|
||||
log.info("邮件发送成功,收件人地址:{}", receiver);
|
||||
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
|
||||
} catch (TencentCloudSDKException e) {
|
||||
log.info(receiver);
|
||||
log.error("邮件发送失败###{},收件人地址:{}", e.toString(), receiver);
|
||||
|
||||
log.error("邮件发送失败,收件人地址:{},错误信息:{}", receiver, e.toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -20,72 +20,92 @@ public class SendRequestUtil {
|
||||
@Value("${FREEPIK_API_KEY}")
|
||||
private String FREEPIK_API_KEY;
|
||||
|
||||
public String sendAliYunPostAsync(String apiUrl, String requestBody){
|
||||
// 发送POST请求 todo 异常处理
|
||||
HttpResponse execute = HttpRequest.post(apiUrl)
|
||||
public String sendAliYunPostAsync(String apiUrl, String requestBody) {
|
||||
// 发送POST请求
|
||||
try (HttpResponse execute = HttpRequest.post(apiUrl)
|
||||
.header(Header.AUTHORIZATION, "Bearer " + ALIYUN_API_KEY)
|
||||
.header("X-DashScope-Async", "enable")
|
||||
.header(Header.CONTENT_TYPE, "application/json")
|
||||
.body(requestBody)
|
||||
.timeout(20000) // 设置超时时间20秒
|
||||
.execute();
|
||||
.execute()) {
|
||||
|
||||
int status = execute.getStatus();
|
||||
if (status == 200){
|
||||
if (status == 200) {
|
||||
String body = execute.body();
|
||||
JSONObject bodyJson = JSONUtil.parseObj(body);
|
||||
return body;
|
||||
}
|
||||
log.warn("请求失败,状态码为 : {}", status);
|
||||
log.warn("请求失败,状态码为:{},响应内容:{}", status, execute.body());
|
||||
} catch (Exception e) {
|
||||
log.error("请求阿里云API时发生异常,URL:{},请求体:{},异常信息:{}",
|
||||
apiUrl, requestBody, e.getMessage(), e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String sendAliYunPost(String apiUrl, String requestBody){
|
||||
// 发送POST请求 todo 异常处理
|
||||
HttpResponse execute = HttpRequest.post(apiUrl)
|
||||
public String sendAliYunPost(String apiUrl, String requestBody) {
|
||||
// 发送POST请求
|
||||
try (HttpResponse execute = HttpRequest.post(apiUrl)
|
||||
.header(Header.AUTHORIZATION, "Bearer " + ALIYUN_API_KEY)
|
||||
.header(Header.CONTENT_TYPE, "application/json")
|
||||
.body(requestBody)
|
||||
.timeout(20000) // 设置超时时间20秒
|
||||
.execute();
|
||||
.execute()) {
|
||||
|
||||
int status = execute.getStatus();
|
||||
if (status == 200){
|
||||
if (status == 200) {
|
||||
String body = execute.body();
|
||||
JSONObject bodyJson = JSONUtil.parseObj(body);
|
||||
return body;
|
||||
}
|
||||
log.warn("请求失败,状态码为 : {}", status);
|
||||
log.warn("请求失败,状态码为:{},响应内容:{}", status, execute.body());
|
||||
} catch (Exception e) {
|
||||
log.error("请求阿里云API时发生异常,URL:{},请求体:{},异常信息:{}",
|
||||
apiUrl, requestBody, e.getMessage(), e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static final String FREE_PIK = "https://api.freepik.com/v1/ai/beta/text-to-image/reimagine-flux";
|
||||
public String sendFreepikPost( String requestBody){
|
||||
// 发送POST请求 todo 异常处理
|
||||
HttpResponse execute = HttpRequest.post(FREE_PIK)
|
||||
public String sendFreepikPost(String requestBody) {
|
||||
// 发送POST请求
|
||||
try (HttpResponse execute = HttpRequest.post(FREE_PIK)
|
||||
.header(Header.CONTENT_TYPE, "application/json")
|
||||
.header("x-freepik-api-key", FREEPIK_API_KEY)
|
||||
.body(requestBody)
|
||||
.timeout(20000) // 设置超时时间20秒
|
||||
.execute();
|
||||
.execute()) {
|
||||
|
||||
int status = execute.getStatus();
|
||||
if (status == 200){
|
||||
if (status == 200) {
|
||||
return execute.body();
|
||||
}
|
||||
log.warn("请求失败,状态码为 : {}", status);
|
||||
log.warn("请求失败,状态码为:{},响应内容:{}", status, execute.body());
|
||||
} catch (Exception e) {
|
||||
log.error("请求Freepik API时发生异常,请求体:{},异常信息:{}",
|
||||
requestBody, e.getMessage(), e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String sendAliYunGet(String fullUrl){
|
||||
// 发送GET请求 todo 异常处理
|
||||
HttpResponse httpResponse = HttpRequest.get(fullUrl)
|
||||
public String sendAliYunGet(String fullUrl) {
|
||||
// 发送GET请求
|
||||
try (HttpResponse httpResponse = HttpRequest.get(fullUrl)
|
||||
.header(Header.AUTHORIZATION, "Bearer " + ALIYUN_API_KEY)
|
||||
.timeout(20000) // 设置超时时间20秒
|
||||
.execute();
|
||||
.execute()) {
|
||||
|
||||
int status = httpResponse.getStatus();
|
||||
if (status == 200){
|
||||
if (status == 200) {
|
||||
return httpResponse.body();
|
||||
}else {
|
||||
return null;
|
||||
}
|
||||
log.warn("请求失败,状态码为:{},响应内容:{}", status, httpResponse.body());
|
||||
} catch (Exception e) {
|
||||
log.error("请求阿里云API时发生异常,URL:{},异常信息:{}",
|
||||
fullUrl, e.getMessage(), e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*public String sendFluxPost(String url, String requestBodyStr){
|
||||
|
||||
@@ -380,12 +380,12 @@ public class AccountController {
|
||||
return Response.success(accountService.subAccountImport(file));
|
||||
}
|
||||
|
||||
/*@GetMapping("/send618Email")
|
||||
@GetMapping("/send618Email")
|
||||
@Operation(summary = "618邮件发送")
|
||||
public Response<String> send618PromotionEmailTemp() {
|
||||
accountService.send618PromotionEmailTemp();
|
||||
return Response.success("success");
|
||||
}*/
|
||||
}
|
||||
|
||||
/*@GetMapping("/refreshCreditsMonthly")
|
||||
@Operation(summary = "刷新子账号积分")
|
||||
|
||||
@@ -239,7 +239,7 @@ public interface AccountService extends IService<Account> {
|
||||
|
||||
Set<String> organizationNameSearch(String type, String name);
|
||||
|
||||
/*void send618PromotionEmailTemp();*/
|
||||
void send618PromotionEmailTemp();
|
||||
|
||||
void checkEduAdminExpireStatus();
|
||||
|
||||
|
||||
@@ -3670,33 +3670,66 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
/* @Override
|
||||
@Override
|
||||
public void send618PromotionEmailTemp() {
|
||||
QueryWrapper<TrialOrder> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("is_deleted", 0);
|
||||
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
|
||||
|
||||
List<TrialOrder> trialOrders = trialOrderMapper.selectList(queryWrapper);
|
||||
queryWrapper.lambda()
|
||||
.isNotNull(Account::getUserEmail)
|
||||
.in(Account::getUserEmail, "xupei3360@163.com", "kimwong@code-create.com.hk", "kaicpang.pang@connect.polyu.hk", "chelseayu@code-create.com.hk")
|
||||
.apply("LENGTH(TRIM(user_email)) > 0");
|
||||
|
||||
List<Account> accounts = baseMapper.selectList(queryWrapper);
|
||||
|
||||
// 按邮箱去重,保留每个邮箱的第一条记录
|
||||
Map<String, Account> emailToAccountMap = new LinkedHashMap<>();
|
||||
for (Account account : accounts) {
|
||||
String email = account.getUserEmail();
|
||||
if (!StringUtil.isNullOrEmpty(email)) {
|
||||
email = email.trim().toLowerCase();
|
||||
// 保留第一次出现的记录
|
||||
emailToAccountMap.putIfAbsent(email, account);
|
||||
}
|
||||
}
|
||||
|
||||
List<String> uniqueEmails = new ArrayList<>(emailToAccountMap.keySet());
|
||||
int total = uniqueEmails.size();
|
||||
log.info("AiDA用户去重后邮件发送总量:{}", total);
|
||||
|
||||
// 控制发送速率:每发送20封后等待1秒,控制QPS在20以内
|
||||
int batchSize = 20;
|
||||
long sleepMillis = 1000;
|
||||
int successCount = 0;
|
||||
int failCount = 0;
|
||||
|
||||
for (int i = 0; i < uniqueEmails.size(); i++) {
|
||||
String email = uniqueEmails.get(i);
|
||||
log.info("邮件发送进度 {}/{}", i + 1, total);
|
||||
|
||||
// List<Account> accountList = accountMapper.selectList(queryWrapper);
|
||||
System.out.println(trialOrders);
|
||||
int total = trialOrders.size();
|
||||
log.info("试用用户总量:{}", total);
|
||||
int current = 1;
|
||||
for (TrialOrder trialOrder : trialOrders) {
|
||||
log.info("邮件发送进度 {}/{}", current, total);
|
||||
try {
|
||||
if (!StringUtil.isNullOrEmpty(trialOrder.getCountry()) && trialOrder.getCountry().equals("China")) {
|
||||
SendEmailUtil.send618PromotionEmailTemp(trialOrder.getEmail(), "CHINESE_SIMPLIFIED");
|
||||
} else {
|
||||
// 英文
|
||||
SendEmailUtil.send618PromotionEmailTemp(trialOrder.getEmail(), "ENGLISH");
|
||||
// 统一发送英文版本
|
||||
// log.info("邮件地址 {}", email);
|
||||
SendEmailUtil.send618PromotionEmailTemp(email, "ENGLISH");
|
||||
successCount++;
|
||||
} catch (Exception e) {
|
||||
failCount++;
|
||||
log.error("邮件发送失败,收件人:{},错误信息:{}", email, e.getMessage());
|
||||
}
|
||||
}catch (Exception e) {
|
||||
log.info(e.getMessage());
|
||||
|
||||
// 控制发送速率,每发送 batchSize 封后等待
|
||||
if ((i + 1) % batchSize == 0 && (i + 1) < uniqueEmails.size()) {
|
||||
try {
|
||||
Thread.sleep(sleepMillis);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
log.warn("邮件发送被中断");
|
||||
break;
|
||||
}
|
||||
current ++;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
log.info("邮件发送完成,成功:{},失败:{}", successCount, failCount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkEduAdminExpireStatus() {
|
||||
|
||||
@@ -521,6 +521,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
||||
.map(DesignCollectionPrintElementDTO::getId)
|
||||
.collect(Collectors.toList());
|
||||
List<CollectionElement> printBoardElements = new ArrayList<>();
|
||||
elementVO.setPrintBoardElements(printBoardElements);
|
||||
if (!CollectionUtils.isEmpty(printBoardIds)) {
|
||||
// 从数据库批量查询printBoard元素
|
||||
printBoardElements = collectionElementMapper.selectBatchIds(printBoardIds);
|
||||
@@ -528,7 +529,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
||||
if (CollectionUtil.isEmpty(printBoardElements) || printBoardElements.size() != printBoardIds.size()) {
|
||||
throw new BusinessException("get.printBoards.data.is.mismatch");
|
||||
}
|
||||
elementVO.setPrintBoardElements(printBoardElements);
|
||||
// elementVO.setPrintBoardElements(printBoardElements);
|
||||
usedElementIds.addAll(printBoardIds); // 记录已使用的元素ID
|
||||
}
|
||||
// 处理类型为LIBRARY的printBoard元素
|
||||
|
||||
@@ -764,7 +764,20 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
getPrintboardLevel2TypeQw.lambda().orderByDesc(CollectionElement::getCreateDate);
|
||||
getPrintboardLevel2TypeQw.last("limit 1");
|
||||
CollectionElement one = collectionElementService.getOne(getPrintboardLevel2TypeQw);
|
||||
if (Objects.isNull(one)) {
|
||||
QueryWrapper<Library> libraryQueryWrapper = new QueryWrapper<>();
|
||||
libraryQueryWrapper.lambda().eq(Library::getUrl, print.getPath());
|
||||
libraryQueryWrapper.lambda().orderByDesc(Library::getCreateDate);
|
||||
getPrintboardLevel2TypeQw.last("limit 1");
|
||||
Library library = libraryService.getOne(libraryQueryWrapper);
|
||||
if (Objects.isNull(library)) {
|
||||
print.setLevel2Type("Pattern");
|
||||
} else {
|
||||
print.setLevel2Type(library.getLevel2Type());
|
||||
}
|
||||
} else {
|
||||
print.setLevel2Type(one.getLevel2Type());
|
||||
}
|
||||
print.setCreateDate(LocalDateTime.now());
|
||||
designItemDetailPrintService.save(print);
|
||||
}
|
||||
|
||||
@@ -198,9 +198,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
generate.setText(text);
|
||||
Long elementId = generateThroughImageTextDTO.getCollectionElementId();
|
||||
// validateGeneraType(generate, text, elementId);
|
||||
if (!(generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())&&generateThroughImageTextDTO.getModelName().equals("high"))){
|
||||
if (!StringUtil.isNullOrEmpty(text)) {
|
||||
text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type(), generateThroughImageTextDTO.getAgeGroup());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// todo 这一步现在还是有必要的吗?
|
||||
// 2.1 sketch或print在t_collection_element表/t_library表中的信息是否需要更新 如 level2Type
|
||||
@@ -1554,6 +1557,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
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);
|
||||
}
|
||||
|
||||
// 保存生成记录到数据库
|
||||
|
||||
Reference in New Issue
Block a user