Merge branch 'release/3.1' into dev/3.1_release_merge

# Conflicts:
#	src/main/java/com/ai/da/common/config/MyTaskScheduler.java
#	src/main/java/com/ai/da/common/enums/ProductEnum.java
#	src/main/java/com/ai/da/common/task/PaymentTask.java
#	src/main/java/com/ai/da/common/utils/LocalCacheUtils.java
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/controller/AffiliateController.java
#	src/main/java/com/ai/da/controller/ConvenientInquiryController.java
#	src/main/java/com/ai/da/controller/StripeController.java
#	src/main/java/com/ai/da/mapper/primary/entity/Library.java
#	src/main/java/com/ai/da/mapper/primary/entity/ProductCoupons.java
#	src/main/java/com/ai/da/model/dto/CreateCouponDTO.java
#	src/main/java/com/ai/da/model/vo/CheckCouponsVO.java
#	src/main/java/com/ai/da/service/AffiliateService.java
#	src/main/java/com/ai/da/service/PaymentInfoService.java
#	src/main/java/com/ai/da/service/StripeService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java
#	src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java
#	src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java
#	src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
#	src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java
#	src/main/java/com/ai/da/service/impl/StripeServiceImpl.java
#	src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
This commit is contained in:
2025-08-31 17:54:44 +08:00
30 changed files with 2571 additions and 2170 deletions

View File

@@ -53,6 +53,8 @@ public interface DesignItemService extends IService<DesignItem> {
DesignSingleVO designSingleIncludeLayers(DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO);
Map<String, String> setPriorityAndUndividedLayer(JSONArray layers);
Map<String, String> setTypeAndUndividedLayer(JSONArray layers);
ComposeLayersVO editLayersPositionAndScale(EditLayersPositionAndScaleVO positionAndScaleVO) throws IOException;

View File

@@ -61,7 +61,7 @@ public interface StripeService {
CheckCouponsVO checkProductCoupon(String promotionCode, Long price);
ProductCoupons updateCouponsInfo(Long id, Long paidCommission, String cooperator, String remark);
ProductCoupons updateCouponsInfo(Long id, String paidCommission, String cooperator, String remark, Long startTime);
ProductCoupons getProductCoupon(String promotionCode, String promotionCodeId);

View File

@@ -549,11 +549,15 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
result = true;
}
break;
case REGISTER:
result = SendEmailUtil.designWorksRegister(emailSendDTO.getEmail(), randomVerifyCode);
break;
default:
}
if (!result) {
throw new BusinessException("failed.to.send.mail");
}
log.info("向邮箱 {} 发送验证码为:{}, 邮件类型:{}", emailSendDTO.getEmail(), randomVerifyCode, authenticationOperationTypeEnum);
return Boolean.TRUE;
}
@@ -1182,13 +1186,13 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
}
String randomVerifyCode = RandomsUtil.generateVerifyCode(100000L, 999999L);
LocalCacheUtils.setVerifyCodeCache("DesignWorksRegister" + "_" + accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode);
LocalCacheUtils.setVerifyCodeCache("REGISTER" + "_" + userEmail, randomVerifyCode);
Boolean b = SendEmailUtil.designWorksRegister(accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode);
Boolean b = SendEmailUtil.designWorksRegister(userEmail, randomVerifyCode);
if (!b) {
throw new BusinessException("failed.to.send.mail");
}
log.info("注册账号。成功向 {} 账号发送验证码:{}", accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode);
log.info("邮箱 {} 发送验证码:{}, 邮件类型REGISTER", userEmail, randomVerifyCode);
return Boolean.TRUE;
}
@@ -1196,7 +1200,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
public AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO,
HttpServletRequest request) {
String verifyCode = LocalCacheUtils.getVerifyCodeCache("DesignWorksRegister" + "_" + accountDesignWorksRegisterDTO.getUserEmail());
String verifyCode = LocalCacheUtils.getVerifyCodeCache("REGISTER" + "_" + accountDesignWorksRegisterDTO.getUserEmail());
if (StringUtils.isBlank(verifyCode)) {
throw new BusinessException("the.verification.code.has.expired", ResultEnum.PROMPT.getCode());
}
@@ -1260,9 +1264,6 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
config.setJdbcUrl("jdbc:mysql://code-create.com.hk:3306/db1nfvsgmjp3b8");
config.setUsername("uafqtz4gsvfrw");
config.setPassword("aida123456.");
// config.setJdbcUrl("jdbc:mysql://18.167.251.121:33008/aida");
// config.setUsername("aida_con");
// config.setPassword("123456");
// config.setJdbcUrl("jdbc:mysql://localhost:3306/code-create-local?serverTimezone=UTC");
// config.setUsername("root");
// config.setPassword("root");

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,7 @@ import com.ai.da.common.constant.CommonConstant;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.enums.CreditsEventsEnum;
import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.response.TransactionPageResponse;
import com.ai.da.common.response.ResultEnum;
import com.ai.da.common.utils.CopyUtil;
import com.ai.da.common.utils.DateUtil;
@@ -695,16 +696,21 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
queryPaymentInfoDTO.getType(), queryPaymentInfoDTO.getStatus(),
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(), queryPaymentInfoDTO.getPayer());
// 查询符合查询条件的总金额
BigDecimal payerTotal = paymentInfoMapper.queryTotalPaymentAmount(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
queryPaymentInfoDTO.getType(), queryPaymentInfoDTO.getStatus(),
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(), queryPaymentInfoDTO.getPayer());
// 总页数
double totalPage = Math.ceil((double) total / size);
// 组装返回参数
PageBaseResponse<PaymentInfoVO> response = new PageBaseResponse<>();
TransactionPageResponse<PaymentInfoVO> response = new TransactionPageResponse<>();
response.setContent(paymentInfoVOS);
response.setPage(queryPaymentInfoDTO.getPage());
response.setSize(size);
response.setTotal(total);
response.setPages((long) totalPage);
response.setTotalAmount(Objects.isNull(payerTotal) ? BigDecimal.ZERO : payerTotal);
return response;
}

View File

@@ -336,7 +336,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
public List<TDesignPythonOutfitDetail> saveDesignSingleItemDetailAndLayers(DesignPythonObjects pythonObjects
, Long designId, Long designItemId, Long userId
, JSONObject outfit, String timeZone, List<DesignSingleItemDTO> designSingleItemDTOList
, Map<String, String> categoryAndUndividedLayer
, Map<String, String> priorityAndUndividedLayer
, boolean changeModelFlag
, Long modelId, String modelType, boolean isSingleCollectionFlag) {
@@ -374,7 +374,14 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
designItemDetail.setPriority(0);
}
designItemDetail.setIconPath(detail.getIcon());
designItemDetail.setUndividedLayer(categoryAndUndividedLayer.get(detail.getType().toLowerCase()));
// designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getType().toLowerCase()));
if (!detail.getType().equals("Body")) designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getPriority().toString()));
// 印花存储在design_item_detail_print表中 这里还要存吗?
// DesignPythonItemPrint printObject = detail.getPrintToPython();
// designItemDetail.setPrintPath(Objects.isNull(printObject) ? "" : printObject.getPath());
// 当有多个印花后返回的printObject太长导致存储到数据库时报错
// designItemDetail.setPrintJson(JSON.toJSONString(printObject));
designItemDetail.setPartialDesign(Objects.isNull(detail.getPrint()) ? null : detail.getPrint().getPartial());
designItemDetails.add(designItemDetail);
});
@@ -593,13 +600,13 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
JSONObject outfit = data.getJSONObject("0");
JSONArray layers = outfit.getJSONArray("layers");
Map<String, String> categoryAndUndividedLayer = setTypeAndUndividedLayer(layers);
Map<String, String> priorityAndUndividedLayer = setPriorityAndUndividedLayer(layers);
if (!designSingleIncludeLayersDTO.getIsPreview()) {
// 更新及保存图层信息
tDesignPythonOutfitDetails = saveDesignSingleItemDetailAndLayers(objects, design.getId(), designSingleIncludeLayersDTO.getDesignItemId()
, userId, outfit, designSingleIncludeLayersDTO.getTimeZone()
, designSingleIncludeLayersDTO.getDesignSingleItemDTOList()
, categoryAndUndividedLayer, changeModelFlag, modelId, modelType, isSingleCollectionFlag);
, priorityAndUndividedLayer, changeModelFlag, modelId, modelType, isSingleCollectionFlag);
saveCollectionElement(designSingleIncludeLayersDTO);
} else {
@@ -627,13 +634,14 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
}else {
updateUserLikeConvertStatus(designSingleIncludeLayersDTO.getDesignItemId(),designSingleIncludeLayersDTO.getTimeZone());
}
return assembleDesignSingleResponse(designItem.getId(),
minioUtil.getPreSignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60),
outfit.getString("synthesis_url"),
designSingleIncludeLayersDTO.getDesignSingleItemDTOList(),
detailsVO,
design.getSingleOverall(),
categoryAndUndividedLayer);
priorityAndUndividedLayer);
}
// 方法1仅查询无事务
@@ -718,15 +726,28 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
});
}
@Override
public Map<String, String> setPriorityAndUndividedLayer(JSONArray layers){
HashMap<String, String> priorityAndLayer = new HashMap<>();
for (int i = 0; i < layers.size(); i++) {
JSONObject jsonObject = layers.getJSONObject(i);
String priority = jsonObject.getString("priority");
String category = jsonObject.getString("image_category").split("_")[0];
if (!category.equals("body") && !priorityAndLayer.containsKey(priority)) priorityAndLayer.put(priority, jsonObject.getString("pattern_image_url"));
}
return priorityAndLayer;
}
// 由于在design过程中没有priority 优先级的概念并且在design时不会出现上下两件使用相同服装类型的情况所以这里依然保留这个方法。
@Override
public Map<String, String> setTypeAndUndividedLayer(JSONArray layers){
HashMap<String, String> categoryAndLayer = new HashMap<>();
HashMap<String, String> typeAndLayer = new HashMap<>();
for (int i = 0; i < layers.size(); i++) {
JSONObject jsonObject = layers.getJSONObject(i);
String category = jsonObject.getString("image_category").split("_")[0];
if (!category.equals("body") && !categoryAndLayer.containsKey(category)) categoryAndLayer.put(category, jsonObject.getString("pattern_image_url"));
if (!category.equals("body") && !typeAndLayer.containsKey(category)) typeAndLayer.put(category, jsonObject.getString("pattern_image_url"));
}
return categoryAndLayer;
return typeAndLayer;
}
@Override
@@ -827,7 +848,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
List<DesignSingleItemDTO> designSingleItemDTOList,
List<DesignPythonOutfitVO> layersObject,
String singleOrOverall,
Map<String, String> categoryAndUndividedLayer) {
Map<String, String> priorityAndUndividedLayer) {
DesignSingleVO designSingleVO = new DesignSingleVO();
ArrayList<DesignItemClothesDetailVO> clothes = new ArrayList<>();
@@ -865,7 +886,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
String partialDesignMinioPath = singleItem.getPartialDesign().getPartialDesignMinioPath();
String preSignedUrl = StringUtil.isNullOrEmpty(partialDesignMinioPath) ? null : minioUtil.getPreSignedUrl(partialDesignMinioPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME, true);
designItemClothesDetailVO.setPartialDesign(new PartialDesignDTO(partialDesignMinioPath, preSignedUrl));
if (categoryAndUndividedLayer.containsKey(singleItem.getType().toLowerCase())) designItemClothesDetailVO.setUndividedLayer(minioUtil.getPreSignedUrl(categoryAndUndividedLayer.get(singleItem.getType().toLowerCase()), CommonConstant.MINIO_IMAGE_EXPIRE_TIME, true));
if (priorityAndUndividedLayer.containsKey(singleItem.getPriority().toString())) designItemClothesDetailVO.setUndividedLayer(minioUtil.getPreSignedUrl(priorityAndUndividedLayer.get(singleItem.getPriority().toString()), CommonConstant.MINIO_IMAGE_EXPIRE_TIME, true));
body.setLayersObject(layersObject.stream().filter(layers -> layers.getImageCategory().equals("body")).collect(Collectors.toList()));
clothes.add(designItemClothesDetailVO);

View File

@@ -838,6 +838,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
d -> Math.abs(d.getPriority()),
(existing, replacement) -> replacement));
Map<String, String> typeAndUndividedLayer = designItemService.setTypeAndUndividedLayer(layers);
log.info("all typeLayers Map:{}", typeAndUndividedLayer);
for (DesignPythonItem detail : item.getItems()) {
if (null == detail) {
continue;
@@ -848,7 +849,11 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
designItemDetail.setDesignItemId(designItemId);
designItemDetail.setCollectionElementId(detail.getElementId());
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
designItemDetail.setUndividedLayer(typeAndUndividedLayer.get(designItemDetail.getType().toLowerCase()));
log.info("detail.getType():{}", detail.getType());
if (!detail.getType().equals("Body")){
log.info("layer : {}", typeAndUndividedLayer.get(designItemDetail.getType()));
designItemDetail.setUndividedLayer(typeAndUndividedLayer.get(designItemDetail.getType()));
}
if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) {
designItemDetail.setPath(detail.getBody_path());
//BODY不关联businessId
@@ -979,7 +984,10 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
designItemDetail.setDesignItemId(designItemId);
designItemDetail.setCollectionElementId(detail.getElementId());
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
designItemDetail.setUndividedLayer(typeAndUndividedLayer.get(designItemDetail.getType().toLowerCase()));
if (!detail.getType().equals("Body")){
designItemDetail.setUndividedLayer(typeAndUndividedLayer.get(designItemDetail.getType()));
}
if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) {
designItemDetail.setPath(detail.getBody_path());
//BODY不关联businessId
@@ -2633,7 +2641,9 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
designItemDetail.setDesignItemId(designItemId);
designItemDetail.setCollectionElementId(detail.getElementId());
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
designItemDetail.setUndividedLayer(typeAndUndividedLayer.get(designItemDetail.getType().toLowerCase()));
if (!detail.getType().equals("Body")){
designItemDetail.setUndividedLayer(typeAndUndividedLayer.get(designItemDetail.getType()));
}
if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) {
designItemDetail.setPath(detail.getBody_path());
//BODY不关联businessId

View File

@@ -184,8 +184,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
public void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
// 1、获取用户信息
Long accountId = generateThroughImageTextDTO.getUserId();
String generateType = generateThroughImageTextDTO.getGenerateType();
GenerateModeEnum modeEnum = getMode(generateThroughImageTextDTO);
String generateType = modeEnum.getValue();
// 2、判断必须入参是否为非空(在prepare阶段已校验)
Generate generate = new Generate();
generate.setAccountId(accountId);
@@ -214,9 +215,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type(), generateThroughImageTextDTO.getDesignType());
// 3、向模型发起请求
String mode = GenerateModeEnum.TEXT.getValue().equals(generateType) ?
GenerateModeEnum.TEXT.getType() :
GenerateModeEnum.TEXT_IMAGE.getType();
String mode = modeEnum.getType();
String category = generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName()) ? "sketch" :
generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName()) ? "print" : "moodboard";
String path = CommonConstant.GENERATE_PATH;
@@ -261,7 +260,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue);
}
Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, port, path);
// 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中
@@ -280,6 +278,21 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
}
public GenerateModeEnum getMode(GenerateThroughImageTextDTO generateThroughImageTextDTO){
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getText())){
if (Objects.nonNull(generateThroughImageTextDTO.getCollectionElementId())){
return GenerateModeEnum.TEXT_IMAGE;
}else {
return GenerateModeEnum.TEXT;
}
}else {
if (Objects.nonNull(generateThroughImageTextDTO.getCollectionElementId())){
return GenerateModeEnum.IMAGE;
}
}
return GenerateModeEnum.TEXT;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void processGenerateResult(String taskId, String url, String category) {
@@ -410,6 +423,10 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
prefix = userInput.substring(0, userInput.indexOf(",")) + ", ";
userInput = userInput.substring(userInput.indexOf(",") + 1);
}
// 替换用户输入中的中文字符
log.info("用户输入,处理前:{}", userInput);
userInput = ComprehensivePunctuationConverter.convertToHalfWidth(userInput);
log.info("用户输入,处理后:{}", userInput);
String translated = prefix + pythonService.promptTranslate(userInput);
switch (level1Type) {
case "Moodboard":
@@ -1026,7 +1043,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// todo 取消待优化
uniqueIdList.forEach(uniqueId -> {
// 1、将需要取消的唯一id加入redis以便及时取消生成
redisUtil.addToSet(cancelSetKey, uniqueId);
redisUtil.addToSet(cancelSetKey, uniqueId, CommonConstant.REDIS_SET_EXPIRE_TIME);
/*// 1、确认当前消息是否还在排队中
Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId);
@@ -1354,12 +1371,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
@Override
@Transactional(rollbackFor = Exception.class)
public GenerateResultVO modifySketch(GenerateModifyDTO generateModifyDTO) {
log.info("修改生成或library中的sketch或print");
log.info("修改生成或library中的sketch或print并加入到library");
// 提取常用参数
Long accountId = UserContext.getUserHolder().getId();
String base64 = generateModifyDTO.getBase64();
String gender = generateModifyDTO.getGender();
String gender = generateModifyDTO.getGender().toLowerCase();
String category = generateModifyDTO.getCategory();
Long originalId = generateModifyDTO.getOriginalId();
String originalIdSource = generateModifyDTO.getOriginalIdSource();
@@ -3000,6 +3017,4 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return null;
}
}
}

View File

@@ -310,6 +310,7 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
public PaymentInfo createOrUpdatePaymentInfoForStripe(Charge charge){
Stripe.apiKey = privateKey;
QueryWrapper<PaymentInfo> qw = new QueryWrapper<>();
// todo 首次支付失败没有invoiceId所以如果这个order之后成功支付后会有多条paymentInfo 是否需要优化??
qw.eq("transaction_id", charge.getInvoice());
PaymentInfo paymentInfo = baseMapper.selectOne(qw);
Charge.PaymentMethodDetails paymentMethodDetails = charge.getPaymentMethodDetails();

File diff suppressed because it is too large Load Diff