Merge remote-tracking branch 'origin/temp0516' into test/stable
# Conflicts: # pom.xml # src/main/java/com/ai/da/common/config/MyTaskScheduler.java # src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
This commit is contained in:
@@ -1,8 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.AccountLoginLog;
|
||||
import com.ai.da.model.dto.EmailSendDTO;
|
||||
import com.ai.da.model.dto.NoteSendDTO;
|
||||
import com.ai.da.mapper.primary.entity.AccountLoginLog;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,17 +1,14 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.Account;
|
||||
import com.ai.da.mapper.entity.TrialOrder;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.mapper.primary.entity.TrialOrder;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.enums.Language;
|
||||
import com.ai.da.model.vo.AccountLoginVO;
|
||||
import com.ai.da.model.vo.AccountPreLoginVO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -131,4 +128,6 @@ public interface AccountService extends IService<Account> {
|
||||
void upgradeNotification();
|
||||
|
||||
void moveLibraryDate();
|
||||
|
||||
void updateCredits(Long accountId, String value);
|
||||
}
|
||||
|
||||
24
src/main/java/com/ai/da/service/AliPayService.java
Normal file
24
src/main/java/com/ai/da/service/AliPayService.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface AliPayService {
|
||||
String tradeCreate(Integer amount,String returnUrl);
|
||||
|
||||
String tradeNotify(Map<String, String> params);
|
||||
|
||||
void processOrder(Map<String, String> params);
|
||||
|
||||
void cancelOrder(String orderNo);
|
||||
|
||||
String queryOrder(String orderNo);
|
||||
|
||||
void checkOrderStatus(String orderNo);
|
||||
|
||||
void refund(String orderNo, String reason);
|
||||
|
||||
String queryRefund(String orderNo);
|
||||
|
||||
String queryBill(String billDate, String type);
|
||||
|
||||
}
|
||||
4
src/main/java/com/ai/da/service/AlipayHKService.java
Normal file
4
src/main/java/com/ai/da/service/AlipayHKService.java
Normal file
@@ -0,0 +1,4 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
public interface AlipayHKService {
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.Library;
|
||||
import com.ai.da.mapper.primary.entity.Library;
|
||||
import com.ai.da.model.dto.ChatFlushDTO;
|
||||
import com.ai.da.model.dto.ChatRobotLibraryDTO;
|
||||
import com.ai.da.model.dto.ChatSendDTO;
|
||||
import com.ai.da.model.vo.ChatRobotLibraryVO;
|
||||
import com.ai.da.model.vo.ChatRobotVO;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
|
||||
@@ -1,15 +1,9 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.Classification;
|
||||
import com.ai.da.mapper.entity.Library;
|
||||
import com.ai.da.model.dto.ChatFlushDTO;
|
||||
import com.ai.da.model.dto.ChatRobotLibraryDTO;
|
||||
import com.ai.da.model.dto.ChatSendDTO;
|
||||
import com.ai.da.mapper.primary.entity.Classification;
|
||||
import com.ai.da.model.dto.ClassificationDTO;
|
||||
import com.ai.da.model.vo.ChatRobotVO;
|
||||
import com.ai.da.model.vo.ClassificationVO;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.CollectionElement;
|
||||
import com.ai.da.mapper.entity.LibraryModelPoint;
|
||||
import com.ai.da.mapper.primary.entity.CollectionElement;
|
||||
import com.ai.da.mapper.primary.entity.LibraryModelPoint;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.vo.*;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
@@ -134,6 +134,6 @@ public interface CollectionElementService extends IService<CollectionElement> {
|
||||
* @param level2Type
|
||||
* @return
|
||||
*/
|
||||
CollectionElement editLevel2Type(Long elementId, String level2Type);
|
||||
CollectionElement editLevel2Type(Long elementId, String level2Type, String designType);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.Collection;
|
||||
import com.ai.da.mapper.entity.CollectionElement;
|
||||
import com.ai.da.model.dto.CollectionElementUploadDTO;
|
||||
import com.ai.da.model.dto.CollectionGeneratePrintDTO;
|
||||
import com.ai.da.model.dto.CollectionSavePrintDTO;
|
||||
import com.ai.da.model.vo.CollectionElementVO;
|
||||
import com.ai.da.model.vo.CollectionGeneratePrintVO;
|
||||
import com.ai.da.mapper.primary.entity.Collection;
|
||||
import com.ai.da.model.vo.UserLikeCollectionVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 服务类
|
||||
*
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.ColorLookupTable;
|
||||
import com.ai.da.mapper.entity.PanTone;
|
||||
import com.ai.da.mapper.primary.entity.ColorLookupTable;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
33
src/main/java/com/ai/da/service/CreditsService.java
Normal file
33
src/main/java/com/ai/da/service/CreditsService.java
Normal file
@@ -0,0 +1,33 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.mapper.primary.entity.CreditsDetail;
|
||||
import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
public interface CreditsService extends IService<CreditsDetail> {
|
||||
|
||||
void initCredits();
|
||||
|
||||
Boolean buyCredits(Long accountId, Integer quantity);
|
||||
|
||||
void creditsIncrease(Long accountId, String event);
|
||||
|
||||
void creditsDecrease(Long accountId, String event);
|
||||
|
||||
String getCredits(Long accountId);
|
||||
|
||||
void creditsRefund(Long accountId, Integer quantity);
|
||||
|
||||
void insertToCreditsDetail(Long accountId, String changeEvent, String credits, String changeType);
|
||||
|
||||
PageBaseResponse<CreditsDetail> queryCreditsDetailsPage(QueryIncomeOrExpenditureDTO queryPageByTimeDTO);
|
||||
|
||||
Boolean checkCredits(Long accountId, CreditsEventsEnum event, Integer num);
|
||||
|
||||
Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num);
|
||||
|
||||
void taskCreditsDeduction(Long accountId, String taskId);
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.DesignHistory;
|
||||
import com.ai.da.mapper.entity.Library;
|
||||
import com.ai.da.mapper.primary.entity.DesignHistory;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.DesignItemDetailPrint;
|
||||
import com.ai.da.mapper.primary.entity.DesignItemDetailPrint;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.DesignItemDetail;
|
||||
import com.ai.da.mapper.primary.entity.DesignItemDetail;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import sun.security.krb5.internal.crypto.Des;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.DesignItem;
|
||||
import com.ai.da.mapper.primary.entity.DesignItem;
|
||||
import com.ai.da.model.dto.DesignSingleDTO;
|
||||
import com.ai.da.model.dto.DesignSingleIncludeLayersDTO;
|
||||
import com.ai.da.model.vo.*;
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.Design;
|
||||
import com.ai.da.mapper.primary.entity.Design;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.vo.CollectionSketchVO;
|
||||
import com.ai.da.model.vo.DesignCollectionVO;
|
||||
import com.ai.da.model.vo.DesignItemDetailVO;
|
||||
import com.ai.da.model.vo.DesignLikeVO;
|
||||
import com.ai.da.python.vo.DesignPythonObjects;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.Generate;
|
||||
import com.ai.da.mapper.entity.GenerateDetail;
|
||||
import com.ai.da.mapper.primary.entity.Generate;
|
||||
import com.ai.da.mapper.primary.entity.GenerateDetail;
|
||||
import com.ai.da.model.dto.GenerateLikeDTO;
|
||||
import com.ai.da.model.dto.GenerateThroughImageTextDTO;
|
||||
import com.ai.da.model.vo.GenerateCaptionVO;
|
||||
import com.ai.da.model.vo.GenerateCollectionVO;
|
||||
import com.ai.da.model.vo.GenerateLikeVO;
|
||||
import com.ai.da.model.vo.PrepareForGenerateVO;
|
||||
import com.ai.da.model.vo.*;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
@@ -16,7 +13,9 @@ public interface GenerateService extends IService<Generate> {
|
||||
|
||||
GenerateCaptionVO generateCaption(Long sketchElementId);
|
||||
|
||||
GenerateCollectionVO generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO);
|
||||
void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO);
|
||||
|
||||
void processGenerateResult(String taskId, String url, String category);
|
||||
|
||||
GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO);
|
||||
|
||||
@@ -26,12 +25,14 @@ public interface GenerateService extends IService<Generate> {
|
||||
|
||||
List<GenerateDetail> selectBatchByLibraryId(List<Long> libraryId);
|
||||
|
||||
GenerateCollectionVO getGenerateResult(String uniqueId);
|
||||
// GenerateCollectionVO getGenerateResult(String uniqueId);
|
||||
|
||||
List<GenerateResultVO> getGenerateResultList(List<String> taskIdList);
|
||||
|
||||
PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO);
|
||||
|
||||
Long getRankPosition(String uniqueId);
|
||||
|
||||
void cancelGenerate(Long userId, String uniqueId, String timeZone);
|
||||
void cancelGenerate(Long userId, List<String> uniqueId, String timeZone);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
|
||||
import com.ai.da.mapper.entity.TDesignPythonOutfitDetail;
|
||||
import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail;
|
||||
import com.ai.da.model.vo.DesignPythonOutfitVO;
|
||||
import com.ai.da.model.vo.TDesignPythonOutfitDetailVO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.TDesignPythonOutfit;
|
||||
import com.ai.da.mapper.primary.entity.TDesignPythonOutfit;
|
||||
import com.ai.da.model.vo.TDesignPythonOutfitVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.LibraryModelPoint;
|
||||
import com.ai.da.model.dto.DesignSingleDTO;
|
||||
import com.ai.da.mapper.primary.entity.LibraryModelPoint;
|
||||
import com.ai.da.model.dto.LibraryModelPointDTO;
|
||||
import com.ai.da.model.dto.ModelsDotDTO;
|
||||
import com.ai.da.model.vo.LibraryModelPointVO;
|
||||
import com.ai.da.model.vo.LibraryUpdateVo;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.mapper.entity.Library;
|
||||
import com.ai.da.mapper.entity.UserLike;
|
||||
import com.ai.da.mapper.primary.entity.Library;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.vo.CollectionElementVO;
|
||||
import com.ai.da.model.vo.LibraryUpdateVo;
|
||||
import com.ai.da.model.vo.LibraryVo;
|
||||
import com.ai.da.model.vo.QueryLibraryPageVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.text.ParseException;
|
||||
|
||||
31
src/main/java/com/ai/da/service/OrderInfoService.java
Normal file
31
src/main/java/com/ai/da/service/OrderInfoService.java
Normal file
@@ -0,0 +1,31 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
|
||||
import com.ai.da.common.enums.OrderStatusEnum;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.mapper.primary.entity.OrderInfo;
|
||||
import com.ai.da.model.dto.QueryPageByTimeDTO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface OrderInfoService extends IService<OrderInfo> {
|
||||
|
||||
OrderInfo createOrderByProductId(Integer productId, String paymentType);
|
||||
|
||||
void saveCodeUrl(String orderNo, String codeUrl);
|
||||
|
||||
List<OrderInfo> listOrderByCreateTimeDesc();
|
||||
|
||||
void updateStatusByOrderNo(String orderNo, OrderStatusEnum orderStatus);
|
||||
|
||||
String getOrderStatus(String orderNo);
|
||||
|
||||
List<OrderInfo> getNoPayOrderByDuration(int minutes, String paymentType);
|
||||
|
||||
OrderInfo getOrderByOrderNo(String orderNo);
|
||||
|
||||
PageBaseResponse<OrderInfo> getOrderByPage(QueryPageByTimeDTO queryPageByTimeDTO);
|
||||
|
||||
void updateOrderNoById(Long id, String orderNo);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.PanTone;
|
||||
import com.ai.da.mapper.primary.entity.PanTone;
|
||||
import com.ai.da.model.dto.GetRgbByHsvBatchDTO;
|
||||
import com.ai.da.model.vo.PantoneVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
34
src/main/java/com/ai/da/service/PayPalCheckoutService.java
Normal file
34
src/main/java/com/ai/da/service/PayPalCheckoutService.java
Normal file
@@ -0,0 +1,34 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.paypal.http.exceptions.SerializeException;
|
||||
import com.paypal.orders.Order;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public interface PayPalCheckoutService {
|
||||
|
||||
HashMap<String, String> createOrder(Integer amount,String returnUrl) throws SerializeException;
|
||||
|
||||
// String callback(@SuppressWarnings("rawtypes") Map map);
|
||||
|
||||
Boolean doPost(HttpServletRequest req, HttpServletResponse resp)
|
||||
throws ServletException, IOException;
|
||||
|
||||
Order queryOrder(String orderNo) throws SerializeException;
|
||||
|
||||
Order captureOrder(String orderId) throws IOException;
|
||||
|
||||
Boolean refundOrder(String orderId, String reason) throws IOException;
|
||||
|
||||
String getOAuth();
|
||||
|
||||
void processOrder(String orderId);
|
||||
|
||||
void checkOrderStatus(String orderNo) throws SerializeException;
|
||||
}
|
||||
|
||||
14
src/main/java/com/ai/da/service/PaymentInfoService.java
Normal file
14
src/main/java/com/ai/da/service/PaymentInfoService.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.paypal.orders.Order;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface PaymentInfoService {
|
||||
|
||||
void createPaymentInfo(String plainText);
|
||||
|
||||
void createPaymentInfoForAliPay(Map<String, String> params);
|
||||
|
||||
void createPaymentInfoForPayPal(Order order);
|
||||
}
|
||||
8
src/main/java/com/ai/da/service/ProductService.java
Normal file
8
src/main/java/com/ai/da/service/ProductService.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.primary.entity.Product;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
public interface ProductService extends IService<Product> {
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
|
||||
import com.ai.da.mapper.entity.PythonTAllInfo;
|
||||
import com.ai.da.mapper.primary.entity.PythonTAllInfo;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,7 +5,9 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
public interface RabbitMQService {
|
||||
|
||||
void publishMessage(String message);
|
||||
void publishMessageToGenerate(String message);
|
||||
|
||||
void publishMessageToSR(String message);
|
||||
|
||||
Integer getMessageCount(String queueUrl);
|
||||
}
|
||||
|
||||
22
src/main/java/com/ai/da/service/RefundInfoService.java
Normal file
22
src/main/java/com/ai/da/service/RefundInfoService.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
|
||||
import com.ai.da.mapper.primary.entity.RefundInfo;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface RefundInfoService extends IService<RefundInfo> {
|
||||
|
||||
RefundInfo createRefundByOrderNo(String orderNo, String reason);
|
||||
|
||||
void updateRefund(String content);
|
||||
|
||||
List<RefundInfo> getNoRefundOrderByDuration(int minutes);
|
||||
|
||||
RefundInfo createRefundByOrderNoForAliPay(String orderNo, String reason);
|
||||
|
||||
void updateRefundForAliPay(String refundNo, String content, String refundStatus);
|
||||
|
||||
void updateRefundForPayPal(Long id, String refundId, String content, String refundStatus);
|
||||
}
|
||||
22
src/main/java/com/ai/da/service/SuperResolutionService.java
Normal file
22
src/main/java/com/ai/da/service/SuperResolutionService.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.mapper.primary.entity.TaskList;
|
||||
import com.ai.da.model.dto.QueryTaskHistoryDTO;
|
||||
import com.ai.da.model.dto.SuperResolutionDTO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface SuperResolutionService extends IService<TaskList> {
|
||||
|
||||
List<String> prepareForSR(List<SuperResolutionDTO> superResolutionDTO);
|
||||
|
||||
void SR(SuperResolutionDTO superResolutionDTO) throws Exception;
|
||||
|
||||
void setSRResult(String taskId, String output, String status);
|
||||
|
||||
void updateSROutput(String taskId, String status, String output);
|
||||
|
||||
PageBaseResponse<TaskList> getTaskHistoryPage(QueryTaskHistoryDTO queryTaskHistoryDTO);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.SysFile;
|
||||
import com.ai.da.mapper.primary.entity.SysFile;
|
||||
import com.ai.da.model.vo.SysFileVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.TCollectionElementRelation;
|
||||
import com.ai.da.mapper.primary.entity.TCollectionElementRelation;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
22
src/main/java/com/ai/da/service/TaskListService.java
Normal file
22
src/main/java/com/ai/da/service/TaskListService.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.mapper.primary.entity.TaskList;
|
||||
import com.ai.da.model.dto.QueryTaskHistoryDTO;
|
||||
import com.ai.da.model.dto.SuperResolutionDTO;
|
||||
import com.ai.da.model.dto.TaskDTO;
|
||||
import com.ai.da.model.vo.TaskVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface TaskListService extends IService<TaskList> {
|
||||
|
||||
List<TaskDTO<SuperResolutionDTO>> getExecTask(List<String> taskIdList);
|
||||
|
||||
void addToTaskListRedis(TaskDTO<SuperResolutionDTO> taskDTO);
|
||||
|
||||
void updateTaskStatusOrOutputRedis(String taskId, String status, String output);
|
||||
|
||||
PageBaseResponse<TaskVO> getAllTask(QueryTaskHistoryDTO queryTaskHistoryDTO);
|
||||
}
|
||||
@@ -1,14 +1,9 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.UserLikeGroup;
|
||||
import com.ai.da.mapper.primary.entity.UserLikeGroup;
|
||||
import com.ai.da.model.vo.HistoryUpdateVO;
|
||||
import com.ai.da.model.vo.UserLikeChooseVO;
|
||||
import com.ai.da.model.vo.UserLikeGroupVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 服务类
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.entity.UserLike;
|
||||
import com.ai.da.mapper.primary.entity.UserLike;
|
||||
import com.ai.da.model.vo.UserLikeVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
|
||||
import com.ai.da.mapper.entity.Workspace;
|
||||
import com.ai.da.mapper.primary.entity.Workspace;
|
||||
import com.ai.da.model.dto.WorkspaceDTO;
|
||||
import com.ai.da.model.enums.BizJson;
|
||||
import com.ai.da.model.vo.ModelsVO;
|
||||
@@ -9,7 +9,6 @@ import com.ai.da.model.vo.WorkspaceVO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.AccountLoginLogMapper;
|
||||
import com.ai.da.mapper.entity.AccountLoginLog;
|
||||
import com.ai.da.mapper.primary.AccountLoginLogMapper;
|
||||
import com.ai.da.mapper.primary.entity.AccountLoginLog;
|
||||
import com.ai.da.service.AccountLoginLogService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
|
||||
@@ -8,11 +8,11 @@ import com.ai.da.common.enums.AuthenticationOperationTypeEnum;
|
||||
import com.ai.da.common.response.ResultEnum;
|
||||
import com.ai.da.common.security.jwt.JWTTokenHelper;
|
||||
import com.ai.da.common.utils.*;
|
||||
import com.ai.da.mapper.AccountMapper;
|
||||
import com.ai.da.mapper.TrialOrderMapper;
|
||||
import com.ai.da.mapper.entity.Account;
|
||||
import com.ai.da.mapper.entity.AccountLoginLog;
|
||||
import com.ai.da.mapper.entity.TrialOrder;
|
||||
import com.ai.da.mapper.primary.AccountMapper;
|
||||
import com.ai.da.mapper.primary.TrialOrderMapper;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.mapper.primary.entity.AccountLoginLog;
|
||||
import com.ai.da.mapper.primary.entity.TrialOrder;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.enums.AutoApproved;
|
||||
import com.ai.da.model.enums.Language;
|
||||
@@ -36,6 +36,7 @@ import org.springframework.util.Assert;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
@@ -76,7 +77,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
@Transactional
|
||||
public AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO) {
|
||||
log.info("aida预先登入accountDTO###{}", JSON.toJSONString(accountDTO));
|
||||
Account account = getOneByUserName(accountDTO.getUserName());
|
||||
Account account = getOneByEmail(accountDTO.getEmail());
|
||||
//用户有效期校验
|
||||
validateUserValidaExpire(account);
|
||||
if ("Third-000000".equals(account.getUserPassword())) {
|
||||
@@ -294,7 +295,6 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
return accountList.get(0);
|
||||
}
|
||||
|
||||
|
||||
private Account getOneByUserName(String userName) {
|
||||
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.lambda().eq(Account::getUserName, userName);
|
||||
@@ -470,28 +470,27 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
String ipAddress = RequestInfoUtil.getIpAddress(request);
|
||||
// 先检测试用订单
|
||||
QueryWrapper<TrialOrder> trialOrderQueryWrapper = new QueryWrapper<>();
|
||||
trialOrderQueryWrapper.lambda().eq(TrialOrder::getIp, ipAddress);
|
||||
trialOrderQueryWrapper.lambda().and(wrapper ->
|
||||
wrapper.eq(TrialOrder::getEmail, accountTrialDTO.getEmail())
|
||||
.or() // OR
|
||||
.like(TrialOrder::getUserName, accountTrialDTO.getUserName()));
|
||||
trialOrderQueryWrapper.eq("BINARY email", accountTrialDTO.getEmail());
|
||||
// trialOrderQueryWrapper.lambda().eq(TrialOrder::getIp, ipAddress);
|
||||
// trialOrderQueryWrapper.lambda().and(wrapper ->
|
||||
// wrapper.eq(TrialOrder::getEmail, accountTrialDTO.getEmail())
|
||||
// .or() // OR
|
||||
// .like(TrialOrder::getUserName, accountTrialDTO.getUserName()));
|
||||
List<TrialOrder> trialOrders = trialOrderMapper.selectList(trialOrderQueryWrapper);
|
||||
if (CollectionUtil.isNotEmpty(trialOrders)) {
|
||||
throw new BusinessException("You have submitted a trial application, please wait for approval.");
|
||||
}
|
||||
// 先检测用户名和邮箱
|
||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(Account::getUserEmail, accountTrialDTO.getEmail())
|
||||
.or()
|
||||
.eq(Account::getUserName, accountTrialDTO.getUserName());
|
||||
qw.eq("BINARY email", accountTrialDTO.getEmail());
|
||||
List<Account> accountList = accountMapper.selectList(qw);
|
||||
if (CollectionUtil.isNotEmpty(accountList)) {
|
||||
if (accountList.get(0).getIsTrial() == 1) {
|
||||
throw new BusinessException("The username or email has already been registered", ResultEnum.PROMPT.getCode());
|
||||
throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode());
|
||||
}else {
|
||||
Account account = accountList.get(0);
|
||||
if (null == account.getValidEndTime() || account.getValidEndTime() > System.currentTimeMillis()) {
|
||||
throw new BusinessException("The username or email has already been registered", ResultEnum.PROMPT.getCode());
|
||||
throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -501,9 +500,9 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
trialOrder.setStatus(0);
|
||||
trialOrder.setIp(ipAddress);
|
||||
trialOrderMapper.insert(trialOrder);
|
||||
// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,1, trialOrder.getCountry());
|
||||
// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,1, trialOrder.getCountry());
|
||||
// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,1, trialOrder.getCountry());
|
||||
// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,1);
|
||||
// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,1);
|
||||
// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,1);
|
||||
// 判断当前的试用订单是否自动批准
|
||||
if (AutoApproved.getStatus()) {
|
||||
// 改变试用订单状态,新增试用用户
|
||||
@@ -531,9 +530,9 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
accountMapper.insert(account);
|
||||
}
|
||||
// 发送邮件提醒用户试用用户已创建
|
||||
// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2, trialOrder.getCountry());
|
||||
// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2, trialOrder.getCountry());
|
||||
// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2, trialOrder.getCountry());
|
||||
// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2);
|
||||
// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2);
|
||||
// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2);
|
||||
if (trialOrder.getCountry().equals("China")) {
|
||||
SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry());
|
||||
}else {
|
||||
@@ -559,9 +558,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
trialOrderMapper.updateById(trialOrder);
|
||||
|
||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(Account::getUserEmail, trialOrder.getEmail())
|
||||
.or()
|
||||
.eq(Account::getUserName, trialOrder.getUserName());
|
||||
qw.eq("BINARY email", trialOrder.getEmail());
|
||||
List<Account> accountList = accountMapper.selectList(qw);
|
||||
|
||||
Account account = new Account();
|
||||
@@ -896,7 +893,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
public void upgradeNotification() {
|
||||
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.and(wrapper ->
|
||||
wrapper.gt("valid_end_time", 1706112000000L)
|
||||
wrapper.gt("valid_end_time", 1709515797000L)
|
||||
.or().isNull("valid_end_time"))
|
||||
.isNotNull("user_email");
|
||||
|
||||
@@ -913,4 +910,11 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
|
||||
// 未迁移过的进行迁移,注意模特数据迁移打点信息以及转换模特格式
|
||||
}
|
||||
|
||||
public void updateCredits(Long accountId, String value){
|
||||
Account account = new Account();
|
||||
account.setId(accountId);
|
||||
account.setCredits(new BigDecimal(value));
|
||||
accountMapper.updateById(account);
|
||||
}
|
||||
}
|
||||
|
||||
480
src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java
Normal file
480
src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java
Normal file
@@ -0,0 +1,480 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.enums.AliPayTradeStateEnum;
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.common.enums.OrderStatusEnum;
|
||||
import com.ai.da.common.enums.PayTypeEnum;
|
||||
import com.ai.da.mapper.primary.entity.OrderInfo;
|
||||
import com.ai.da.mapper.primary.entity.RefundInfo;
|
||||
import com.ai.da.service.*;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alipay.api.AlipayApiException;
|
||||
import com.alipay.api.AlipayClient;
|
||||
import com.alipay.api.AlipayConstants;
|
||||
import com.alipay.api.internal.util.AlipaySignature;
|
||||
import com.alipay.api.request.*;
|
||||
import com.alipay.api.response.*;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.internal.LinkedTreeMap;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class AliPayServiceImpl implements AliPayService {
|
||||
|
||||
@Resource
|
||||
private OrderInfoService orderInfoService;
|
||||
|
||||
@Resource
|
||||
private AlipayClient alipayClient;
|
||||
|
||||
@Resource
|
||||
private Environment config;
|
||||
|
||||
@Resource
|
||||
private PaymentInfoService paymentInfoService;
|
||||
|
||||
@Resource
|
||||
private RefundInfoService refundsInfoService;
|
||||
|
||||
@Resource
|
||||
private CreditsService creditsService;
|
||||
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public String tradeCreate(Integer amount, String returnUrl) {
|
||||
|
||||
try {
|
||||
//生成订单
|
||||
log.info("生成订单");
|
||||
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY.getType());
|
||||
|
||||
//调用支付宝接口
|
||||
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
|
||||
//配置需要的公共请求参数
|
||||
//支付完成后,支付宝发起异步通知的地址
|
||||
request.setNotifyUrl(config.getProperty("alipay.notify-url"));
|
||||
//支付完成后,我们想让页面跳转回aida的页面,配置returnUrl
|
||||
// request.setReturnUrl(config.getProperty("alipay.return-url"));
|
||||
request.setReturnUrl(returnUrl);
|
||||
|
||||
//组装当前业务方法的请求参数
|
||||
JSONObject bizContent = new JSONObject();
|
||||
bizContent.put("out_trade_no", orderInfo.getOrderNo());
|
||||
BigDecimal total = new BigDecimal(orderInfo.getTotalFee().toString());
|
||||
bizContent.put("total_amount", total);
|
||||
// bizContent.put("subject", orderInfo.getTitle());
|
||||
bizContent.put("subject", "积分购买");
|
||||
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
|
||||
|
||||
request.setBizContent(bizContent.toString());
|
||||
|
||||
//执行请求,调用支付宝接口
|
||||
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
|
||||
|
||||
if(response.isSuccess()){
|
||||
log.info("调用成功,返回结果 ===> " + response.getBody());
|
||||
return response.getBody();
|
||||
} else {
|
||||
log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg());
|
||||
throw new BusinessException("Order creation failed");
|
||||
}
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
throw new BusinessException("Order creation failed");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tradeNotify(Map<String, String> params) {
|
||||
log.info("支付通知正在执行");
|
||||
log.info("通知参数 ===> {}", params);
|
||||
|
||||
String result = "failure";
|
||||
|
||||
try {
|
||||
//异步通知验签
|
||||
boolean signVerified = AlipaySignature.rsaCheckV1(
|
||||
params,
|
||||
config.getProperty("alipay.alipay-public-key"),
|
||||
AlipayConstants.CHARSET_UTF8,
|
||||
AlipayConstants.SIGN_TYPE_RSA2); //调用SDK验证签名
|
||||
|
||||
if(!signVerified){
|
||||
//验签失败则记录异常日志,并在response中返回failure.
|
||||
log.error("支付成功异步通知验签失败!");
|
||||
return result;
|
||||
}
|
||||
|
||||
// 验签成功后
|
||||
log.info("支付成功异步通知验签成功!");
|
||||
|
||||
//按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,
|
||||
//1 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号
|
||||
String outTradeNo = params.get("out_trade_no");
|
||||
OrderInfo order = orderInfoService.getOrderByOrderNo(outTradeNo);
|
||||
if(order == null){
|
||||
log.error("订单不存在");
|
||||
return result;
|
||||
}
|
||||
|
||||
//2 判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额)
|
||||
String totalAmount = params.get("total_amount");
|
||||
int totalAmountInt = new BigDecimal(totalAmount).intValue();
|
||||
int totalFeeInt = order.getTotalFee().intValue();
|
||||
if(totalAmountInt != totalFeeInt){
|
||||
log.error("金额校验失败");
|
||||
return result;
|
||||
}
|
||||
|
||||
//3 校验通知中的 seller_id(或者 seller_email) 是否为 out_trade_no 这笔单据的对应的操作方
|
||||
String sellerId = params.get("seller_id");
|
||||
String sellerIdProperty = config.getProperty("alipay.seller-id");
|
||||
if(!sellerId.equals(sellerIdProperty)){
|
||||
log.error("商家pid校验失败");
|
||||
return result;
|
||||
}
|
||||
|
||||
//4 验证 app_id 是否为该商户本身
|
||||
String appId = params.get("app_id");
|
||||
String appIdProperty = config.getProperty("alipay.app-id");
|
||||
if(!appId.equals(appIdProperty)){
|
||||
log.error("appid校验失败");
|
||||
return result;
|
||||
}
|
||||
|
||||
//在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS时,
|
||||
// 支付宝才会认定为买家付款成功。
|
||||
String tradeStatus = params.get("trade_status");
|
||||
if(!"TRADE_SUCCESS".equals(tradeStatus)){
|
||||
log.error("支付未成功");
|
||||
return result;
|
||||
}
|
||||
|
||||
//处理业务 修改订单状态 记录支付日志
|
||||
processOrder(params);
|
||||
|
||||
//校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
|
||||
result = "success";
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 处理订单
|
||||
* @param params
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public void processOrder(Map<String, String> params) {
|
||||
|
||||
log.info("处理订单");
|
||||
|
||||
//获取订单号
|
||||
String orderNo = params.get("out_trade_no");
|
||||
String totalAmount = params.get("total_amount");
|
||||
|
||||
/*在对业务数据进行状态检查和处理之前,
|
||||
要采用数据锁进行并发控制,
|
||||
以避免函数重入造成的数据混乱*/
|
||||
//尝试获取锁:
|
||||
// 成功获取则立即返回true,获取失败则立即返回false。不必一直等待锁的释放
|
||||
if(lock.tryLock()) {
|
||||
try {
|
||||
//处理重复通知
|
||||
//接口调用的幂等性:无论接口被调用多少次,以下业务执行一次
|
||||
// String orderStatus = orderInfoService.getOrderStatus(orderNo);
|
||||
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
|
||||
String orderStatus = orderByOrderNo.getOrderStatus();
|
||||
// 当订单状态处于未支付或超时已关闭时,更新订单状态
|
||||
if (!OrderStatusEnum.NOT_PAY.getType().equals(orderStatus) || !OrderStatusEnum.TIMEOUT_CLOSED.getType().equals(orderStatus)) {
|
||||
return;
|
||||
}
|
||||
//更新订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS);
|
||||
//记录支付日志
|
||||
paymentInfoService.createPaymentInfoForAliPay(params);
|
||||
// 添加积分变更记录
|
||||
creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(),
|
||||
CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay",
|
||||
CreditsEventsEnum.BUY_CREDITS.getValue(),
|
||||
"positive");
|
||||
// 更新积分
|
||||
creditsService.buyCredits(orderByOrderNo.getAccountId(),Integer.parseInt(totalAmount) / Integer.parseInt(CreditsEventsEnum.PRICE.getValue()));
|
||||
} finally {
|
||||
//要主动释放锁
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户取消订单
|
||||
* @param orderNo
|
||||
*/
|
||||
@Override
|
||||
public void cancelOrder(String orderNo) {
|
||||
|
||||
//调用支付宝提供的统一收单交易关闭接口
|
||||
this.closeOrder(orderNo);
|
||||
|
||||
//更新用户订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.CANCEL);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单
|
||||
* @param orderNo
|
||||
* @return 返回订单查询结果,如果返回null则表示支付宝端尚未创建订单
|
||||
*/
|
||||
@Override
|
||||
public String queryOrder(String orderNo) {
|
||||
|
||||
try {
|
||||
log.info("查单接口调用 ===> {}", orderNo);
|
||||
|
||||
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
|
||||
JSONObject bizContent = new JSONObject();
|
||||
bizContent.put("out_trade_no", orderNo);
|
||||
request.setBizContent(bizContent.toString());
|
||||
|
||||
AlipayTradeQueryResponse response = alipayClient.execute(request);
|
||||
if(response.isSuccess()){
|
||||
log.info("调用成功,返回结果 ===> " + response.getBody());
|
||||
return response.getBody();
|
||||
} else {
|
||||
log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg());
|
||||
//throw new RuntimeException("查单接口的调用失败");
|
||||
return null;//订单不存在
|
||||
}
|
||||
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
throw new BusinessException("查单接口的调用失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据订单号调用支付宝查单接口,核实订单状态
|
||||
* 如果订单未创建,则更新商户端订单状态
|
||||
* 如果订单未支付,则调用关单接口关闭订单,并更新商户端订单状态
|
||||
* 如果订单已支付,则更新商户端订单状态,并记录支付日志
|
||||
* @param orderNo
|
||||
*/
|
||||
@Override
|
||||
public void checkOrderStatus(String orderNo) {
|
||||
|
||||
log.warn("根据订单号核实订单状态 ===> {}", orderNo);
|
||||
|
||||
String result = this.queryOrder(orderNo);
|
||||
|
||||
//订单未创建
|
||||
if(result == null){
|
||||
log.warn("核实订单未创建 ===> {}", orderNo);
|
||||
//更新本地订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED);
|
||||
}
|
||||
|
||||
//解析查单响应结果
|
||||
Gson gson = new Gson();
|
||||
HashMap<String, LinkedTreeMap> resultMap = gson.fromJson(result, HashMap.class);
|
||||
LinkedTreeMap alipayTradeQueryResponse = resultMap.get("alipay_trade_query_response");
|
||||
|
||||
String tradeStatus = (String)alipayTradeQueryResponse.get("trade_status");
|
||||
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
|
||||
if(AliPayTradeStateEnum.NOTPAY.getType().equals(tradeStatus)){
|
||||
log.warn("核实订单未支付 ===> {}", orderNo);
|
||||
//如果订单未支付,则调用关单接口关闭订单
|
||||
this.closeOrder(orderNo);
|
||||
// 并更新商户端订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED);
|
||||
}
|
||||
|
||||
if(AliPayTradeStateEnum.SUCCESS.getType().equals(tradeStatus)){
|
||||
log.warn("核实订单已支付 ===> {}", orderNo);
|
||||
//如果订单已支付,则更新商户端订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS);
|
||||
//并记录支付日志
|
||||
paymentInfoService.createPaymentInfoForAliPay(alipayTradeQueryResponse);
|
||||
// 添加积分变更记录
|
||||
creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(),
|
||||
CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay",
|
||||
CreditsEventsEnum.BUY_CREDITS.getValue(),
|
||||
"positive");
|
||||
// 更新积分
|
||||
creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 关单接口的调用
|
||||
* @param orderNo 订单号
|
||||
*/
|
||||
private void closeOrder(String orderNo) {
|
||||
|
||||
try {
|
||||
log.info("关单接口的调用,订单号 ===> {}", orderNo);
|
||||
|
||||
AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
|
||||
JSONObject bizContent = new JSONObject();
|
||||
bizContent.put("out_trade_no", orderNo);
|
||||
request.setBizContent(bizContent.toString());
|
||||
AlipayTradeCloseResponse response = alipayClient.execute(request);
|
||||
|
||||
if(response.isSuccess()){
|
||||
log.info("调用成功,返回结果 ===> " + response.getBody());
|
||||
} else {
|
||||
log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg());
|
||||
//throw new RuntimeException("关单接口的调用失败");
|
||||
}
|
||||
|
||||
} catch (AlipayApiException e) {
|
||||
log.error("关单失败,原因 ===> {}",e.getMessage());
|
||||
throw new BusinessException("关单接口的调用失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 退款
|
||||
* @param orderNo
|
||||
* @param reason
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public void refund(String orderNo, String reason) {
|
||||
|
||||
try {
|
||||
log.info("调用退款API");
|
||||
//创建退款单
|
||||
RefundInfo refundInfo = refundsInfoService.createRefundByOrderNoForAliPay(orderNo, reason);
|
||||
//调用统一收单交易退款接口
|
||||
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest ();
|
||||
//组装当前业务方法的请求参数
|
||||
JSONObject bizContent = new JSONObject();
|
||||
bizContent.put("out_trade_no", orderNo);//订单编号
|
||||
BigDecimal refund = new BigDecimal(refundInfo.getRefund().toString());
|
||||
//BigDecimal refund = new BigDecimal("2").divide(new BigDecimal("100"));
|
||||
bizContent.put("refund_amount", refund);//退款金额:不能大于支付金额
|
||||
bizContent.put("refund_reason", reason);//退款原因(可选)
|
||||
|
||||
request.setBizContent(bizContent.toString());
|
||||
|
||||
//执行请求,调用支付宝接口
|
||||
AlipayTradeRefundResponse response = alipayClient.execute(request);
|
||||
|
||||
if(response.isSuccess()){
|
||||
log.info("调用成功,返回结果 ===> " + response.getBody());
|
||||
//更新订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_SUCCESS);
|
||||
//更新退款单
|
||||
refundsInfoService.updateRefundForAliPay(
|
||||
refundInfo.getRefundNo(),
|
||||
response.getBody(),
|
||||
AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功
|
||||
// 更新积分状态
|
||||
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
|
||||
creditsService.creditsRefund(orderByOrderNo.getAccountId(), orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue()));
|
||||
|
||||
} else {
|
||||
log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg());
|
||||
//更新订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_ABNORMAL);
|
||||
//更新退款单
|
||||
refundsInfoService.updateRefundForAliPay(
|
||||
refundInfo.getRefundNo(),
|
||||
response.getBody(),
|
||||
AliPayTradeStateEnum.REFUND_ERROR.getType()); //退款失败
|
||||
}
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
throw new BusinessException("创建退款申请失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询退款
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String queryRefund(String orderNo) {
|
||||
|
||||
try {
|
||||
log.info("查询退款接口调用 ===> {}", orderNo);
|
||||
|
||||
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
|
||||
JSONObject bizContent = new JSONObject();
|
||||
bizContent.put("out_trade_no", orderNo);
|
||||
bizContent.put("out_request_no", orderNo);
|
||||
request.setBizContent(bizContent.toString());
|
||||
|
||||
AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
|
||||
if(response.isSuccess()){
|
||||
log.info("调用成功,返回结果 ===> " + response.getBody());
|
||||
return response.getBody();
|
||||
} else {
|
||||
log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg());
|
||||
//throw new RuntimeException("查单接口的调用失败");
|
||||
return null;//订单不存在
|
||||
}
|
||||
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
throw new BusinessException("查单接口的调用失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请账单
|
||||
* @param billDate
|
||||
* @param type
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String queryBill(String billDate, String type) {
|
||||
|
||||
try {
|
||||
AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();
|
||||
JSONObject bizContent = new JSONObject();
|
||||
bizContent.put("bill_type", type);
|
||||
bizContent.put("bill_date", billDate);
|
||||
request.setBizContent(bizContent.toString());
|
||||
AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);
|
||||
|
||||
if(response.isSuccess()){
|
||||
log.info("调用成功,返回结果 ===> " + response.getBody());
|
||||
|
||||
//获取账单下载地址
|
||||
Gson gson = new Gson();
|
||||
HashMap<String, LinkedTreeMap> resultMap = gson.fromJson(response.getBody(), HashMap.class);
|
||||
LinkedTreeMap billDownloadurlResponse = resultMap.get("alipay_data_dataservice_bill_downloadurl_query_response");
|
||||
String billDownloadUrl = (String)billDownloadurlResponse.get("bill_download_url");
|
||||
|
||||
return billDownloadUrl;
|
||||
} else {
|
||||
log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg());
|
||||
throw new BusinessException("申请账单失败");
|
||||
}
|
||||
} catch (AlipayApiException e) {
|
||||
log.error("申请账单失败,原因 ===> {}",e.getMessage());
|
||||
throw new BusinessException("申请账单失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.service.AlipayHKService;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.HashMap;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class AlipayHKServiceImpl implements AlipayHKService {
|
||||
|
||||
@Value("${alipay.hk.merchant-id}")
|
||||
private static String merchantId;
|
||||
|
||||
@Value("${alipay.hk.segment-id}")
|
||||
private static String segmentId;
|
||||
|
||||
@Value("${alipay.hk.AESKey}")
|
||||
private static String aesKey;
|
||||
|
||||
@Value("${alipay.hk.rsaPrivateKey}")
|
||||
private static String privateKeyPath;
|
||||
|
||||
@Value("${alipay.hk.rsaPublicKey}")
|
||||
private static String publicKeyPath;
|
||||
|
||||
|
||||
/**
|
||||
* 创建订单
|
||||
*/
|
||||
public void createOrder(Integer amount){
|
||||
|
||||
HashMap<String, Object> param = new HashMap<>();
|
||||
String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
||||
param.put("order_ref", orderRef);
|
||||
param.put("amount", Integer.parseInt(CreditsEventsEnum.PRICE.getValue()) * amount);
|
||||
param.put("subject", "AiDA Credits Purchase");
|
||||
param.put("wallet", "ALIPAYHK");
|
||||
param.put("segment_id", segmentId);
|
||||
param.put("payment_solution", "WAP");
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 异步回调
|
||||
* @return
|
||||
*/
|
||||
public void callback(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static String decrypt(String message){
|
||||
String text = "{\"success\":true,\"reference_id\":\"d4f55a35-8725-40f3-8279-37ea95837741\",\"result\":{\"nonce\":\"tUsbfFrNWcZZYrN3dWQHNQ==\",\"message\":\"6wCHtIMRXXgj0TOV7jtvCzbKc+gWEnqbgAD5pMx4sIvliL65EF+btKRheJI/0gssOj0PdwUPYLlgjTdSWQZraQLU4F05FGSYJ7lNxFZ1tXLvhUv4ukiCz0xyPJIQ5vvNH/SmQ5iIQvMO/fTg6ZiZj2I+Oahzy5h2/cXmrXBEedNFZSGIVFKMuipul3QcFEO+qQQcOHOiRDAXrhF1+qoq4GROBpcKhu5WMHxUGDHj0l/tY2Rp004FNwfArbOeR5TusgMMgm7aE8IqpFJ6w4zES1lS903fHJzFWcqKMwB9tYoxnegoHSNmOVeokgBCvLOI2uVJCWN4ZqVq1mmhoib4zVxjex+pgoMtHPvV+Gjy+IB2PA5YCid0vH9WymkBkYZIioW1KH587G3lTTEWrzTc+JWWd+yIxD1nofZxAi0t+EFOgyab2HRawdpWpkwKH5XqoZ05yj0Vl0u7nWcF4GLytC5wTWyPOU3Ua/ePlniU/z5BWZkUQGWXWSKhyEmt53mx3UUXbC6/zfk1jcbyEGHonCimmf88Xl9yE3ae02xoRsDO8bcnzCRD88UWUi3UySWNmxdYDTdWj0wCU27nmLMLjkXvesRl2CfuZbkbDxDQHHKkT1DX4XoSU+vmUmSpH7IBCHXoq+SYHfRmfDsAYv7WmiJOQeo7i3RogLnBej0bFimY5JHhWBT69FVPc0aRi19eTz9L7grjLKz92+hbb4Qj7yvb08RvMUabv1juy4YHGulE73EVoLS6+FRBdEY8ZmIFq5lQcwMKb63/v+V/63AHP+oCDMzZZ7wKmQ5+UkgKcXgxToTOzulesQXD8urGcjGUwLnJviilIQywH1XFdcnDNWv95DdOB3nQ3HorqTFC+0kZMdTCO1L7zRbZQxWoExB41wQW3CNLvEkJlpaUv5TWKkep1wcT2PKFbuSVPnFnVnxZ7qNdlVLmBzEs9nX15C61+a28gFij4wj6ed8LIJwT4KapfZAFWwl2V2KmonqiXKk60/StBK9/dWHGfZ4ysPvXBB+fxJj3hR36Vu4HceNVYg+9tf5zEJ79J664iiyEFdyKzORlXnsJF33oPKC0+cuH1qhBzyf/o6t86F4DbpMBb2xhFRt1mDgFrV40JhT+2+iLCIqUmATBYsAYZZ9XIyi3vyaRGhgdd1ND/bhddALm/GKD4AJUo8FKtdkerYSbk/TpPLhvbrEFSDpkCT+JoOLiF4EzqRwZOrQklaXBOS67aaATRBzDxKJuFSGuFAWAIdLHhXcj/wDmnh1fqj03D4NmNmVSw7wKmt1OjI9arh6Ua1Mp7+1g+NT4BEdRnPYQX3CeiyRa0RUNyWxFDYZPGGpjSVNLf0vrzRh3hLEGBUlHXCza0SWuARkGmS6YdsvJr3gt+RlxXtrnI0LC0lgi9/Vw5zM5dGYX24tUOqCEA/9/FVvVZddfimYhmP44+ST1xTDgDw0rtVZQrcQjEg4UCcFq\"}}\n";
|
||||
|
||||
String str = "6wCHtIMRXXgj0TOV7jtvCzbKc+gWEnqbgAD5pMx4sIvliL65EF+btKRheJI/0gssOj0PdwUPYLlgjTdSWQZraQLU4F05FGSYJ7lNxFZ1tXLvhUv4ukiCz0xyPJIQ5vvNH/SmQ5iIQvMO/fTg6ZiZj2I+Oahzy5h2/cXmrXBEedNFZSGIVFKMuipul3QcFEO+qQQcOHOiRDAXrhF1+qoq4GROBpcKhu5WMHxUGDHj0l/tY2Rp004FNwfArbOeR5TusgMMgm7aE8IqpFJ6w4zES1lS903fHJzFWcqKMwB9tYoxnegoHSNmOVeokgBCvLOI2uVJCWN4ZqVq1mmhoib4zVxjex+pgoMtHPvV+Gjy+IB2PA5YCid0vH9WymkBkYZIioW1KH587G3lTTEWrzTc+JWWd+yIxD1nofZxAi0t+EFOgyab2HRawdpWpkwKH5XqoZ05yj0Vl0u7nWcF4GLytC5wTWyPOU3Ua/ePlniU/z5BWZkUQGWXWSKhyEmt53mx3UUXbC6/zfk1jcbyEGHonCimmf88Xl9yE3ae02xoRsDO8bcnzCRD88UWUi3UySWNmxdYDTdWj0wCU27nmLMLjkXvesRl2CfuZbkbDxDQHHKkT1DX4XoSU+vmUmSpH7IBCHXoq+SYHfRmfDsAYv7WmiJOQeo7i3RogLnBej0bFimY5JHhWBT69FVPc0aRi19eTz9L7grjLKz92+hbb4Qj7yvb08RvMUabv1juy4YHGulE73EVoLS6+FRBdEY8ZmIFq5lQcwMKb63/v+V/63AHP+oCDMzZZ7wKmQ5+UkgKcXgxToTOzulesQXD8urGcjGUwLnJviilIQywH1XFdcnDNWv95DdOB3nQ3HorqTFC+0kZMdTCO1L7zRbZQxWoExB41wQW3CNLvEkJlpaUv5TWKkep1wcT2PKFbuSVPnFnVnxZ7qNdlVLmBzEs9nX15C61+a28gFij4wj6ed8LIJwT4KapfZAFWwl2V2KmonqiXKk60/StBK9/dWHGfZ4ysPvXBB+fxJj3hR36Vu4HceNVYg+9tf5zEJ79J664iiyEFdyKzORlXnsJF33oPKC0+cuH1qhBzyf/o6t86F4DbpMBb2xhFRt1mDgFrV40JhT+2+iLCIqUmATBYsAYZZ9XIyi3vyaRGhgdd1ND/bhddALm/GKD4AJUo8FKtdkerYSbk/TpPLhvbrEFSDpkCT+JoOLiF4EzqRwZOrQklaXBOS67aaATRBzDxKJuFSGuFAWAIdLHhXcj/wDmnh1fqj03D4NmNmVSw7wKmt1OjI9arh6Ua1Mp7+1g+NT4BEdRnPYQX3CeiyRa0RUNyWxFDYZPGGpjSVNLf0vrzRh3hLEGBUlHXCza0SWuARkGmS6YdsvJr3gt+RlxXtrnI0LC0lgi9/Vw5zM5dGYX24tUOqCEA/9/FVvVZddfimYhmP44+ST1xTDgDw0rtVZQrcQjEg4UCcFq";
|
||||
try {
|
||||
// String s = decryptAES(str, "tUsbfFrNWcZZYrN3dWQHNQ==");
|
||||
// log.info(s);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// test();
|
||||
// AESCBCWithRSA();
|
||||
// decrypt();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -9,12 +9,12 @@ import com.ai.da.common.enums.LibraryLevel1TypeEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.MD5Utils;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.AccountMapper;
|
||||
import com.ai.da.mapper.LibraryMapper;
|
||||
import com.ai.da.mapper.entity.Account;
|
||||
import com.ai.da.mapper.entity.ChatRobot;
|
||||
import com.ai.da.mapper.ChatRobotMapper;
|
||||
import com.ai.da.mapper.entity.Library;
|
||||
import com.ai.da.mapper.primary.AccountMapper;
|
||||
import com.ai.da.mapper.primary.LibraryMapper;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.mapper.primary.entity.ChatRobot;
|
||||
import com.ai.da.mapper.primary.ChatRobotMapper;
|
||||
import com.ai.da.mapper.primary.entity.Library;
|
||||
import com.ai.da.model.dto.ChatFlushDTO;
|
||||
import com.ai.da.model.dto.ChatRobotLibraryDTO;
|
||||
import com.ai.da.model.dto.ChatSendDTO;
|
||||
|
||||
@@ -8,10 +8,10 @@ import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.response.ResultEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.mapper.ClassificationMapper;
|
||||
import com.ai.da.mapper.ClassificationRelLibraryMapper;
|
||||
import com.ai.da.mapper.entity.Classification;
|
||||
import com.ai.da.mapper.entity.ClassificationRelLibrary;
|
||||
import com.ai.da.mapper.primary.ClassificationMapper;
|
||||
import com.ai.da.mapper.primary.ClassificationRelLibraryMapper;
|
||||
import com.ai.da.mapper.primary.entity.Classification;
|
||||
import com.ai.da.mapper.primary.entity.ClassificationRelLibrary;
|
||||
import com.ai.da.model.dto.ClassificationDTO;
|
||||
import com.ai.da.model.vo.AuthPrincipalVo;
|
||||
import com.ai.da.model.vo.ClassificationVO;
|
||||
|
||||
@@ -7,9 +7,9 @@ import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.*;
|
||||
import com.ai.da.common.response.ResultEnum;
|
||||
import com.ai.da.common.utils.*;
|
||||
import com.ai.da.mapper.CollectionElementMapper;
|
||||
import com.ai.da.mapper.GenerateDetailMapper;
|
||||
import com.ai.da.mapper.entity.*;
|
||||
import com.ai.da.mapper.primary.CollectionElementMapper;
|
||||
import com.ai.da.mapper.primary.GenerateDetailMapper;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.enums.ModelType;
|
||||
import com.ai.da.model.enums.Sex;
|
||||
@@ -26,6 +26,7 @@ import com.google.common.collect.Lists;
|
||||
import io.minio.errors.MinioException;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -36,6 +37,8 @@ import javax.annotation.Resource;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -622,6 +625,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
||||
Generate byId = generateService.getById(o.getGenerateId());
|
||||
d.setAccountId(byId.getAccountId());
|
||||
d.setLevel1Type(byId.getLevel1Type());
|
||||
d.setCreateDate(Date.from(o.getCreateDate().atZone(ZoneId.systemDefault()).toInstant()));
|
||||
if (null != idToMap) {
|
||||
CollectionSketchDTO sketchDTO = idToMap.get(o.getId());
|
||||
d.setLevel2Type(sketchDTO.getLevel2Type());
|
||||
@@ -644,6 +648,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
||||
Generate byId = generateService.getById(o.getGenerateId());
|
||||
d.setAccountId(byId.getAccountId());
|
||||
d.setLevel1Type(byId.getLevel1Type());
|
||||
d.setCreateDate(Date.from(o.getCreateDate().atZone(ZoneId.systemDefault()).toInstant()));
|
||||
if (null != idToMap) {
|
||||
DesignCollectionPrintElementDTO printDTO = idToMap.get(o.getId());
|
||||
d.setHasPin(printDTO.getIsPin());
|
||||
@@ -806,16 +811,36 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
||||
}
|
||||
|
||||
@Override
|
||||
public CollectionElement editLevel2Type(Long elementId, String level2Type) {
|
||||
CollectionElement collectionElement = null;
|
||||
public CollectionElement editLevel2Type(Long elementId, String level2Type, String designType) {
|
||||
CollectionElement collectionElement = new CollectionElement();
|
||||
|
||||
if (!Objects.isNull(elementId)) {
|
||||
collectionElement = collectionElementMapper.selectById(elementId);
|
||||
if (!Objects.isNull(collectionElement)) {
|
||||
if (StringUtil.isNullOrEmpty(collectionElement.getLevel2Type()) || !(collectionElement.getLevel2Type()).equals(level2Type)) {
|
||||
collectionElement.setLevel2Type(level2Type);
|
||||
updateById(collectionElement);
|
||||
if (!StringUtil.isNullOrEmpty(designType)){
|
||||
switch (designType){
|
||||
case "collection":
|
||||
collectionElement = collectionElementMapper.selectById(elementId);
|
||||
if (StringUtil.isNullOrEmpty(collectionElement.getLevel2Type()) || !(collectionElement.getLevel2Type()).equals(level2Type)) {
|
||||
collectionElement.setLevel2Type(level2Type);
|
||||
updateById(collectionElement);
|
||||
}
|
||||
break;
|
||||
case "library":
|
||||
Library libraryElement = libraryService.getById(elementId);
|
||||
if (!Objects.isNull(libraryElement)) {
|
||||
if (StringUtil.isNullOrEmpty(libraryElement.getLevel2Type()) || !(libraryElement.getLevel2Type()).equals(level2Type)){
|
||||
libraryElement.setLevel2Type(level2Type);
|
||||
libraryService.updateById(libraryElement);
|
||||
}
|
||||
BeanUtils.copyProperties(libraryElement,collectionElement);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
log.error("designType cannot be empty");
|
||||
throw new BusinessException("element source type cannot be empty!");
|
||||
}
|
||||
}else {
|
||||
return null;
|
||||
}
|
||||
return collectionElement;
|
||||
}
|
||||
@@ -849,7 +874,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
||||
generateDetail.setLibraryId(libraryIds.get(0).get("library_id"));
|
||||
}
|
||||
generateDetail.setMd5(md5);
|
||||
generateDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
|
||||
generateDetail.setCreateDate(LocalDateTime.now());
|
||||
|
||||
return generateDetail;
|
||||
}
|
||||
|
||||
@@ -6,9 +6,9 @@ import com.ai.da.common.enums.DesignTypeEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.DateUtil;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.CollectionMapper;
|
||||
import com.ai.da.mapper.entity.Collection;
|
||||
import com.ai.da.mapper.entity.CollectionElement;
|
||||
import com.ai.da.mapper.primary.CollectionMapper;
|
||||
import com.ai.da.mapper.primary.entity.Collection;
|
||||
import com.ai.da.mapper.primary.entity.CollectionElement;
|
||||
import com.ai.da.model.vo.CollectionColorVO;
|
||||
import com.ai.da.model.vo.CollectionElementVO;
|
||||
import com.ai.da.model.vo.UserLikeCollectionVO;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.ColorLoopUpTableMapper;
|
||||
import com.ai.da.mapper.entity.ColorLookupTable;
|
||||
import com.ai.da.mapper.primary.ColorLoopUpTableMapper;
|
||||
import com.ai.da.mapper.primary.entity.ColorLookupTable;
|
||||
import com.ai.da.service.ColorLoopUpTableService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
|
||||
246
src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java
Normal file
246
src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java
Normal file
@@ -0,0 +1,246 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.common.utils.RedisUtil;
|
||||
import com.ai.da.mapper.primary.AccountMapper;
|
||||
import com.ai.da.mapper.primary.CreditsDetailMapper;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.mapper.primary.entity.CreditsDetail;
|
||||
import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO;
|
||||
import com.ai.da.service.AccountService;
|
||||
import com.ai.da.service.CreditsService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Service
|
||||
public class CreditsServiceImpl extends ServiceImpl<CreditsDetailMapper, CreditsDetail> implements CreditsService {
|
||||
|
||||
@Value("${redis.key.credits.pre-deduction}")
|
||||
private String creditsDeduction;
|
||||
|
||||
@Resource
|
||||
private AccountService accountService;
|
||||
@Resource
|
||||
private AccountMapper accountMapper;
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Override
|
||||
public void initCredits() {
|
||||
accountService.updateCredits(UserContext.getUserHolder().getId(), CreditsEventsEnum.INIT.getValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean buyCredits(Long accountId, Integer quantity) {
|
||||
BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits();
|
||||
BigDecimal newCredits = new BigDecimal(CreditsEventsEnum.BUY_CREDITS.getValue()).multiply(new BigDecimal(quantity));
|
||||
BigDecimal added = existingCredits.add(newCredits);
|
||||
accountService.updateCredits(accountId, added.toString());
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void creditsIncrease(Long accountId, String creditsEvent) {
|
||||
CreditsEventsEnum event = null;
|
||||
|
||||
switch (creditsEvent) {
|
||||
case "Daily Check-In":
|
||||
event = CreditsEventsEnum.DAILY_CHECKIN;
|
||||
break;
|
||||
case "Social Media Sharing":
|
||||
event = CreditsEventsEnum.SOCIAL_MEDIA_SHARING;
|
||||
break;
|
||||
case "Other":
|
||||
event = CreditsEventsEnum.OTHER;
|
||||
break;
|
||||
case "Super Resolution":
|
||||
event = CreditsEventsEnum.SUPER_RESOLUTION;
|
||||
break;
|
||||
default:
|
||||
throw new BusinessException("UNKNOWN TYPE");
|
||||
}
|
||||
BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits();
|
||||
BigDecimal add = new BigDecimal(event.getValue()).add(existingCredits);
|
||||
accountService.updateCredits(accountId, add.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void creditsDecrease(Long accountId, String creditsEvent) {
|
||||
CreditsEventsEnum event;
|
||||
|
||||
switch (creditsEvent) {
|
||||
case "Super Resolution":
|
||||
event = CreditsEventsEnum.SUPER_RESOLUTION;
|
||||
break;
|
||||
case "Other":
|
||||
event = CreditsEventsEnum.OTHER;
|
||||
break;
|
||||
default:
|
||||
log.error("UNKNOWN TYPE");
|
||||
throw new BusinessException("UNKNOWN TYPE");
|
||||
}
|
||||
BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits();
|
||||
BigDecimal subtract = existingCredits.subtract(new BigDecimal(event.getValue()));
|
||||
accountService.updateCredits(accountId, subtract.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCredits(Long accountId) {
|
||||
Account account = accountMapper.selectById(accountId);
|
||||
return account.getCredits().toString();
|
||||
}
|
||||
|
||||
public void creditsRefund(Long accountId, Integer quantity) {
|
||||
BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits();
|
||||
BigDecimal newCredits = new BigDecimal(CreditsEventsEnum.BUY_CREDITS.getValue()).multiply(new BigDecimal(quantity));
|
||||
BigDecimal subtracted = existingCredits.subtract(newCredits);
|
||||
accountService.updateCredits(accountId, subtracted.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 向积分变更详细表添加记录
|
||||
*
|
||||
* @param changeEvent 导致积分变更的事件
|
||||
* @param credits 变更的积分
|
||||
* @param changeType 变更类型 : positive->增 negative->减
|
||||
*/
|
||||
@Override
|
||||
public void insertToCreditsDetail(Long accountId, String changeEvent, String credits, String changeType) {
|
||||
CreditsDetail creditsDetail = new CreditsDetail();
|
||||
Account account = accountMapper.selectById(accountId);
|
||||
BigDecimal finalCredits;
|
||||
String changeCredits;
|
||||
if ("positive".equals(changeType)) {
|
||||
finalCredits = account.getCredits().add(new BigDecimal(credits));
|
||||
changeCredits = "+" + credits;
|
||||
} else {
|
||||
finalCredits = account.getCredits().subtract(new BigDecimal(credits));
|
||||
changeCredits = "-" + credits;
|
||||
}
|
||||
creditsDetail.setAccountId(accountId);
|
||||
creditsDetail.setChangeEvent(changeEvent);
|
||||
creditsDetail.setChangedCredits(changeCredits);
|
||||
creditsDetail.setCredits(finalCredits);
|
||||
// creditsDetail.setCredits(account.getCredits());
|
||||
creditsDetail.setCreateTime(LocalDateTime.now());
|
||||
|
||||
baseMapper.insert(creditsDetail);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageBaseResponse<CreditsDetail> queryCreditsDetailsPage(QueryIncomeOrExpenditureDTO queryPageByTimeDTO) {
|
||||
QueryWrapper<CreditsDetail> qw = new QueryWrapper<>();
|
||||
qw.eq("account_id", UserContext.getUserHolder().getId());
|
||||
|
||||
String startTime = queryPageByTimeDTO.getStartTime();
|
||||
String endTime = queryPageByTimeDTO.getEndTime();
|
||||
if (StringUtil.isNullOrEmpty(startTime)) {
|
||||
startTime = "2024-03-01 00:00:00";
|
||||
}
|
||||
if (StringUtil.isNullOrEmpty(endTime)) {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
endTime = now.format(dateTimeFormatter);
|
||||
}
|
||||
if (!Objects.isNull(queryPageByTimeDTO.getIsIncome())) {
|
||||
if (queryPageByTimeDTO.getIsIncome()) {
|
||||
qw.likeRight("changed_credits", "+");
|
||||
} else {
|
||||
qw.likeRight("changed_credits", "-");
|
||||
}
|
||||
}
|
||||
|
||||
qw.between("create_time", startTime, endTime);
|
||||
qw.orderByDesc("create_time");
|
||||
Page<CreditsDetail> pageInfo = new Page<>(queryPageByTimeDTO.getPage(), queryPageByTimeDTO.getSize());
|
||||
Page<CreditsDetail> orderInfo = baseMapper.selectPage(pageInfo, qw);
|
||||
if (CollectionUtils.isEmpty(orderInfo.getRecords())) {
|
||||
return PageBaseResponse.success(new Page<>());
|
||||
}
|
||||
|
||||
return PageBaseResponse.success(orderInfo);
|
||||
}
|
||||
|
||||
public Boolean checkCredits(Long accountId, CreditsEventsEnum event, Integer num) {
|
||||
String credits = getCredits(accountId);
|
||||
if (new BigDecimal(credits)
|
||||
.subtract(new BigDecimal(event.getValue())
|
||||
.multiply(new BigDecimal(num)))
|
||||
.compareTo(BigDecimal.ZERO) < 0) {
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 积分扣除升级 -- 预扣积分
|
||||
* 思路:
|
||||
* 1、先判断当前积分扣除待扣积分后,剩余积分够不够当前操作需要的积分
|
||||
* 2、将需要进行积分扣除操作请求的 任务id和需要扣除的积分存到redis
|
||||
* 3、执行成功后,从redis中拿出当前任务id对应需要扣除的积分,扣除积分,更新数据库积分,移除redis的记录
|
||||
* 4、执行失败,直接移除记录
|
||||
*/
|
||||
/** 积分预扣除 */
|
||||
public Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num){
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
|
||||
// 1、获取当前需要预扣除的积分
|
||||
Set<String> keys = redisUtil.getKeysFromString(creditsDeduction + ":" + accountId + ":*");
|
||||
List<String> multiValue = redisUtil.getMultiValue(keys);
|
||||
int sum = multiValue.stream().mapToInt(Integer::parseInt).sum();
|
||||
sum += Integer.parseInt(event.getValue()) * num;
|
||||
|
||||
// 2、获取当前积分
|
||||
BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits();
|
||||
BigDecimal subtract = existingCredits.subtract(new BigDecimal(sum));
|
||||
|
||||
// 3、判断剩余积分是否够本次操作
|
||||
if (subtract.compareTo(BigDecimal.ZERO) < 0){
|
||||
// 3.1 不够,直接返回余额不够,充值
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
/** 执行扣除积分,更新数据库 */
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void taskCreditsDeduction(Long accountId, String taskId){
|
||||
String key = creditsDeduction + ":" + accountId + ":" + taskId;
|
||||
// 1、获取当前任务id对应的积分
|
||||
String value = redisUtil.getFromString(key);
|
||||
|
||||
// 1.1 没有。返回,报错,未找到当前任务
|
||||
if (StringUtil.isNullOrEmpty(value)){
|
||||
throw new BusinessException("当前任务不存在,无法扣除积分");
|
||||
}
|
||||
|
||||
// 2、操作数据库,扣除积分
|
||||
BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits();
|
||||
BigDecimal subtract = existingCredits.subtract(new BigDecimal(value));
|
||||
accountService.updateCredits(accountId, subtract.toString());
|
||||
|
||||
// 3、从redis中移除当前待扣积分
|
||||
redisUtil.removeFromString(key);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.DesignHistoryMapper;
|
||||
import com.ai.da.mapper.entity.DesignHistory;
|
||||
import com.ai.da.mapper.primary.DesignHistoryMapper;
|
||||
import com.ai.da.mapper.primary.entity.DesignHistory;
|
||||
import com.ai.da.service.DesignHistoryService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.DesignItemDetailPrintMapper;
|
||||
import com.ai.da.mapper.entity.DesignItemDetailPrint;
|
||||
import com.ai.da.mapper.entity.TDesignPythonOutfitDetail;
|
||||
import com.ai.da.mapper.primary.DesignItemDetailPrintMapper;
|
||||
import com.ai.da.mapper.primary.entity.DesignItemDetailPrint;
|
||||
import com.ai.da.service.DesignItemDetailPrintService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
|
||||
@@ -2,8 +2,8 @@ package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.enums.LayersPriorityEnum;
|
||||
import com.ai.da.mapper.DesignItemDetailMapper;
|
||||
import com.ai.da.mapper.entity.DesignItemDetail;
|
||||
import com.ai.da.mapper.primary.DesignItemDetailMapper;
|
||||
import com.ai.da.mapper.primary.entity.DesignItemDetail;
|
||||
import com.ai.da.service.DesignItemDetailService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
|
||||
@@ -3,14 +3,17 @@ package com.ai.da.service.impl;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.constant.CommonConstant;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.CollectionLevel1TypeEnum;
|
||||
import com.ai.da.common.enums.SingleOverallEnum;
|
||||
import com.ai.da.common.enums.SysFileLevel2TypeEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.DateUtil;
|
||||
import com.ai.da.common.utils.MD5Utils;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.DesignItemMapper;
|
||||
import com.ai.da.mapper.entity.*;
|
||||
import com.ai.da.mapper.primary.DesignItemMapper;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.enums.ModelType;
|
||||
import com.ai.da.model.vo.*;
|
||||
@@ -30,8 +33,10 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -488,6 +493,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
// 更新及保存图层信息
|
||||
tDesignPythonOutfitDetails = saveDesignSingleItemDetailAndLayers(objects, design.getId(), designSingleIncludeLayersDTO.getDesignItemId(),
|
||||
userInfo, outfit, designSingleIncludeLayersDTO.getTimeZone(), designSingleIncludeLayersDTO.getDesignSingleItemDTOList());
|
||||
|
||||
saveCollectionElement(designSingleIncludeLayersDTO);
|
||||
} else {
|
||||
JSONArray layers = outfit.getJSONArray("layers");
|
||||
tDesignPythonOutfitDetails = setTDesignPythonOutfitDetailList(layers, designItem.getDesignId(), null, userInfo.getId(), priorityOffset);
|
||||
@@ -537,10 +544,6 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
log.error(layer.getImageCategory() + " layer does not exists!");
|
||||
throw new BusinessException("layers.does.not.exists");
|
||||
}
|
||||
// Assert.notNull(detail, layer.getImageCategory() + " layer does not exists!");
|
||||
|
||||
/*layer.setImageUrl(detail.getImageUrl());
|
||||
layer.setMaskUrl(detail.getMaskUrl());*/
|
||||
});
|
||||
|
||||
// 3、组装python入参
|
||||
@@ -621,15 +624,21 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
designSingleVO.setCurrentFullBodyView(minioUtil.getPresignedUrl(currentFullBodyView, 24 * 60));
|
||||
designSingleVO.setClothes(clothes);
|
||||
|
||||
// 获取每个单品的id是否被改变过,该状态需要再返回给前端
|
||||
Map<Long, Boolean> idChanged = designSingleItemDTOList.stream().collect(Collectors.toMap(DesignSingleItemDTO::getId, DesignSingleItemDTO::getChanged));
|
||||
// 获取每个单品的designType,该状态需要再返回给前端
|
||||
Map<Long, String> idDesignType = designSingleItemDTOList.stream().collect(Collectors.toMap(DesignSingleItemDTO::getId, DesignSingleItemDTO::getDesignType));
|
||||
|
||||
boolean flag = singleOrOverall.equals("single");
|
||||
designSingleItemDTOList.forEach(singleItem -> {
|
||||
DesignItemClothesDetailVO designItemClothesDetailVO = new DesignItemClothesDetailVO();
|
||||
designItemClothesDetailVO.setId(singleItem.getId());
|
||||
designItemClothesDetailVO.setChanged(idChanged.get(singleItem.getId()));
|
||||
designItemClothesDetailVO.setDesignType(idDesignType.get(singleItem.getId()));
|
||||
designItemClothesDetailVO.setType(singleItem.getType());
|
||||
designItemClothesDetailVO.setPath(minioUtil.getPresignedUrl(singleItem.getPath(), 24 * 60));
|
||||
designItemClothesDetailVO.setMinIOPath(singleItem.getPath());
|
||||
designItemClothesDetailVO.setColor(panToneService.getPantoneByRgb(singleItem.getColor()));
|
||||
// designItemClothesDetailVO.setPrintObject(new DesignPythonItemPrint(singleItem.getPrintObject().getPath()));
|
||||
designItemClothesDetailVO.setPrintObject(singleItem.getPrintObject());
|
||||
designItemClothesDetailVO.setLayersObject(layersObject.stream().filter(
|
||||
layers -> (singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0])
|
||||
@@ -703,4 +712,68 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
queryWrapper.in("id",designItemIdList);
|
||||
return designItemMapper.selectList(queryWrapper);
|
||||
}
|
||||
|
||||
private void saveCollectionElement(DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO){
|
||||
|
||||
ArrayList<Library> libraries = new ArrayList<>();
|
||||
// 添加sketch到library
|
||||
designSingleIncludeLayersDTO.getDesignSingleItemDTOList().forEach(designSingleItem -> {
|
||||
|
||||
if (!StringUtil.isNullOrEmpty(designSingleItem.getDesignType()) && designSingleItem.getDesignType().equals("Collection")){
|
||||
String path = minioUtil.getPresignedUrl(designSingleItem.getPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
|
||||
try {
|
||||
String md5 = MD5Utils.encryptFile(path, false);
|
||||
// 先判断是否需要被加入到library
|
||||
Boolean needAdd = libraryService.checkMd5(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName(),
|
||||
designSingleItem.getType(),
|
||||
designSingleIncludeLayersDTO.getGender(),
|
||||
md5);
|
||||
// 加入到library
|
||||
if (needAdd){
|
||||
Library library = new Library();
|
||||
library.setAccountId(UserContext.getUserHolder().getId());
|
||||
library.setLevel1Type(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName());
|
||||
library.setLevel2Type(designSingleItem.getType());
|
||||
library.setLevel3Type(designSingleIncludeLayersDTO.getGender());
|
||||
library.setUrl(designSingleItem.getPath());
|
||||
library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
||||
library.setMd5(md5);
|
||||
library.setCreateDate(DateUtil.getByTimeZone(designSingleIncludeLayersDTO.getTimeZone()));
|
||||
libraries.add(library);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 添加print到library
|
||||
designSingleItem.getPrintObject().getPrints().forEach(print -> {
|
||||
if (!StringUtil.isNullOrEmpty(print.getDesignType()) && print.getDesignType().equals("Collection")){
|
||||
String path = minioUtil.getPresignedUrl(print.getMinIOPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
|
||||
try {
|
||||
String md5 = MD5Utils.encryptFile(path, false);
|
||||
// 先判断是否已被加入到library
|
||||
Boolean needAdd = libraryService.checkMd5(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(),
|
||||
null,
|
||||
null,
|
||||
md5);
|
||||
// 加入到library
|
||||
if (needAdd){
|
||||
Library library = new Library();
|
||||
library.setAccountId(UserContext.getUserHolder().getId());
|
||||
library.setLevel1Type(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName());
|
||||
library.setUrl(print.getMinIOPath());
|
||||
library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
||||
library.setMd5(md5);
|
||||
library.setCreateDate(DateUtil.getByTimeZone(designSingleIncludeLayersDTO.getTimeZone()));
|
||||
libraries.add(library);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
} );
|
||||
libraryService.saveBatch(libraries);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.*;
|
||||
import com.ai.da.common.utils.*;
|
||||
import com.ai.da.mapper.DesignMapper;
|
||||
import com.ai.da.mapper.GenerateDetailMapper;
|
||||
import com.ai.da.mapper.TDesignPythonOutfitMapper;
|
||||
import com.ai.da.mapper.entity.*;
|
||||
import com.ai.da.mapper.entity.Collection;
|
||||
import com.ai.da.mapper.primary.DesignMapper;
|
||||
import com.ai.da.mapper.primary.GenerateDetailMapper;
|
||||
import com.ai.da.mapper.primary.TDesignPythonOutfitMapper;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.mapper.primary.entity.Collection;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.vo.*;
|
||||
import com.ai.da.python.PythonService;
|
||||
@@ -43,7 +43,6 @@ import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.ai.da.common.enums.LayersPriorityEnum.BODY;
|
||||
import static com.ai.da.python.vo.DesignPythonItem.*;
|
||||
|
||||
/**
|
||||
@@ -305,21 +304,36 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
//保存design
|
||||
Long designId = saveOne(designDTO, collectionId, userInfo.getId());
|
||||
//计算library
|
||||
calculateLibraryAndSysFile(designDTO, elementVO, userInfo);
|
||||
// calculateLibraryAndSysFile(designDTO, elementVO, userInfo);
|
||||
//组装design入参
|
||||
long startTime = System.currentTimeMillis();
|
||||
DesignPythonObjects pythonObjects = pythonService.covertDesignParam(designDTO.getSystemScale(),
|
||||
designDTO.getSingleOverall(), designDTO.getSwitchCategory(), elementVO, designDTO.getProcessId());
|
||||
long endTime = System.currentTimeMillis();
|
||||
long totalTimeInSeconds = (endTime - startTime) / 1000;
|
||||
log.info("组装入参运行时间:" + totalTimeInSeconds + " 秒");
|
||||
// pythonObjects增加image_id关联
|
||||
startTime = System.currentTimeMillis();
|
||||
List<Long> imageIds = relationImageIds(pythonObjects);
|
||||
System.out.println(imageIds);
|
||||
endTime = System.currentTimeMillis();
|
||||
totalTimeInSeconds = (endTime - startTime) / 1000;
|
||||
log.info("增加image_id关联运行时间:" + totalTimeInSeconds + " 秒");
|
||||
//design
|
||||
startTime = System.currentTimeMillis();
|
||||
JSONObject responseJSONObject = pythonService.designNew(pythonObjects);
|
||||
endTime = System.currentTimeMillis();
|
||||
totalTimeInSeconds = (endTime - startTime) / 1000;
|
||||
log.info("design python端运行时间:" + totalTimeInSeconds + " 秒");
|
||||
//生成library
|
||||
startTime = System.currentTimeMillis();
|
||||
generateLibrary(elementVO, designDTO.getTimeZone());
|
||||
//处理关联关系,修复element覆盖得情况
|
||||
List<CollectionElement> relationElements = collectionElementService.getByOnlyCollectionId(collectionId);
|
||||
List<Long> relationElementIds = relationElements.stream().map(CollectionElement::getId).collect(Collectors.toList());
|
||||
handleCollectionElementRelation(collectionId, null != collectionIdParam, relationElementIds);
|
||||
endTime = System.currentTimeMillis();
|
||||
totalTimeInSeconds = (endTime - startTime) / 1000;
|
||||
log.info("处理关联关系运行时间:" + totalTimeInSeconds + " 秒");
|
||||
//保存python返回信息;保存designItem和detail
|
||||
return savePythonDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone(), responseJSONObject, designDTO.getSingleOverall());
|
||||
}
|
||||
@@ -703,10 +717,10 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
throw new BusinessException("collection.not.found");
|
||||
}
|
||||
AuthPrincipalVo userInfo = UserContext.getUserHolder();
|
||||
//查询用户 sketch library
|
||||
List<LibraryVo> libraryVos = libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(),
|
||||
Arrays.asList(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(),
|
||||
CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName()));
|
||||
// //查询用户 sketch library
|
||||
// List<LibraryVo> libraryVos = libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(),
|
||||
// Arrays.asList(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(),
|
||||
// CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName()));
|
||||
//校验collection element
|
||||
DesignCollectionDTO designCollectionDTO = CopyUtil.copyObject(reDesignDTO, DesignCollectionDTO.class);
|
||||
ValidateElementVO elementVO = collectionElementService.validateElement(designCollectionDTO);
|
||||
@@ -1016,49 +1030,41 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
public Integer designProcess(String processId) {
|
||||
ProcessIdObject object = new ProcessIdObject();
|
||||
object.setProcess_id(processId);
|
||||
|
||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||
.connectTimeout(30, TimeUnit.SECONDS)
|
||||
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
|
||||
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
|
||||
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
|
||||
.pingInterval(5, TimeUnit.SECONDS)
|
||||
.readTimeout(60, TimeUnit.SECONDS)
|
||||
.writeTimeout(60, TimeUnit.SECONDS)
|
||||
.build();
|
||||
|
||||
MediaType mediaType = MediaType.parse("application/json");
|
||||
//关闭FastJson的引用检测 防止出现$ref 现象
|
||||
String param = JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
|
||||
log.info("designProcess请求python 参数:####{}", param);
|
||||
RequestBody body = RequestBody.create(mediaType, param);
|
||||
|
||||
Request request = new Request.Builder()
|
||||
// .url("http://18.167.251.121:9991/api/get_progress")
|
||||
// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate")
|
||||
.url(accessPythonIp + ":" + accessPythonPort + "/api/get_progress")
|
||||
.method("POST", body)
|
||||
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
|
||||
.addHeader("Content-Type", "application/json")
|
||||
.build();
|
||||
Response response;
|
||||
try {
|
||||
response = client.newCall(request).execute();
|
||||
} catch (IOException e) {
|
||||
log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e));
|
||||
return 0;
|
||||
}
|
||||
if (response.isSuccessful()) {
|
||||
try {
|
||||
if (Objects.nonNull(response.body())) {
|
||||
String responseBody = response.body().string();
|
||||
JSONObject responseObject = JSON.parseObject(responseBody);
|
||||
String num = responseObject.getString("data");
|
||||
return Integer.valueOf(num);
|
||||
}
|
||||
return 0;
|
||||
} catch (IOException | JSONException e) {
|
||||
log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e));
|
||||
return 0;
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
if (response.isSuccessful()) {
|
||||
String responseBody = Objects.requireNonNull(response.body()).string();
|
||||
JSONObject responseObject = JSON.parseObject(responseBody);
|
||||
String num = responseObject.getString("data");
|
||||
return Integer.valueOf(num);
|
||||
}
|
||||
} catch (IOException | JSONException e) {
|
||||
log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
private String converTypeToLevel1(String type) {
|
||||
if (StringUtils.isEmpty(type)) {
|
||||
return null;
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.constant.CommonConstant;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.GenerateModeEnum;
|
||||
import com.ai.da.common.enums.ModelNameEnum;
|
||||
import com.ai.da.common.utils.*;
|
||||
import com.ai.da.mapper.CollectionElementMapper;
|
||||
import com.ai.da.mapper.GenerateCancelMapper;
|
||||
import com.ai.da.mapper.GenerateDetailMapper;
|
||||
import com.ai.da.mapper.GenerateMapper;
|
||||
import com.ai.da.mapper.entity.*;
|
||||
import com.ai.da.mapper.primary.CollectionElementMapper;
|
||||
import com.ai.da.mapper.primary.GenerateCancelMapper;
|
||||
import com.ai.da.mapper.primary.GenerateDetailMapper;
|
||||
import com.ai.da.mapper.primary.GenerateMapper;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.dto.GenerateLikeDTO;
|
||||
import com.ai.da.model.dto.GenerateThroughImageTextDTO;
|
||||
import com.ai.da.model.dto.GenerateToPythonDTO;
|
||||
@@ -22,7 +23,9 @@ import com.ai.da.service.RabbitMQService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.gson.Gson;
|
||||
import io.minio.errors.MinioException;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -33,7 +36,9 @@ import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.ai.da.common.enums.CollectionLevel1TypeEnum.*;
|
||||
|
||||
@@ -68,17 +73,17 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
@Resource
|
||||
private GenerateCancelMapper generateCancelMapper;
|
||||
|
||||
@Value("${redis.key.consumptionOrder}")
|
||||
@Value("${redis.key.orderForGenerate}")
|
||||
private String consumptionOrderKey;
|
||||
|
||||
@Value("${redis.key.cancelSet}")
|
||||
@Value("${redis.key.generateCancelSet}")
|
||||
private String cancelSetKey;
|
||||
|
||||
@Value("${redis.key.exceptionMap}")
|
||||
@Value("${redis.key.generateExceptionMap}")
|
||||
private String exceptionMapKey;
|
||||
|
||||
@Value("${redis.key.resultMap}")
|
||||
private String resultMapKey;
|
||||
@Value("${redis.key.generateResult}")
|
||||
private String generateResultKey;
|
||||
|
||||
@Override
|
||||
public GenerateCaptionVO generateCaption(Long sketchElementId) {
|
||||
@@ -95,12 +100,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public GenerateCollectionVO generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
|
||||
public void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
|
||||
// 1、获取用户信息
|
||||
Long accountId = generateThroughImageTextDTO.getUserId();
|
||||
String generateType = generateThroughImageTextDTO.getGenerateType();
|
||||
|
||||
// 2、判断必须入参是否为非空
|
||||
// 2、判断必须入参是否为非空(在prepare阶段已校验)
|
||||
Generate generate = new Generate();
|
||||
generate.setAccountId(accountId);
|
||||
generate.setUniqueId(generateThroughImageTextDTO.getUniqueId());
|
||||
@@ -111,36 +116,51 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
generateType);
|
||||
generate.setModelName(StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getVersion()) ? ModelNameEnum.MODEL_0.getCode() : generateThroughImageTextDTO.getVersion());
|
||||
generate.setCreateDate(DateUtil.getByTimeZone(generateThroughImageTextDTO.getTimeZone()));
|
||||
generate.setElementSource(StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getDesignType()) ? null : generateThroughImageTextDTO.getDesignType());
|
||||
|
||||
String text = generateThroughImageTextDTO.getText();
|
||||
Long elementId = generateThroughImageTextDTO.getCollectionElementId();
|
||||
validateGeneraType(generate, text, elementId, generateType);
|
||||
if (!StringUtil.isNullOrEmpty(text)) {
|
||||
text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type());
|
||||
}
|
||||
|
||||
// 2.1 sketch或print在t_collection_element表中的信息是否需要更新 如 level2Type
|
||||
CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type());
|
||||
// 2.1 sketch或print在t_collection_element表/t_library表中的信息是否需要更新 如 level2Type
|
||||
CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type(), generateThroughImageTextDTO.getDesignType());
|
||||
|
||||
// 3、向模型发起请求
|
||||
int mode = GenerateModeEnum.TEXT.getValue().equals(generateType) ?
|
||||
GenerateModeEnum.TEXT.getCode() :
|
||||
GenerateModeEnum.TEXT_IMAGE.getCode();
|
||||
String mode = GenerateModeEnum.TEXT.getValue().equals(generateType) ?
|
||||
GenerateModeEnum.TEXT.getType() :
|
||||
GenerateModeEnum.TEXT_IMAGE.getType();
|
||||
String category = generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName()) ? "sketch" :
|
||||
generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName()) ? "print" : "moodboard";
|
||||
AsyncCallerUtil asyncCallerUtil = new AsyncCallerUtil();
|
||||
List<String> generatedSketchUrl = asyncCallerUtil.generate(new GenerateToPythonDTO(accountId, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(),
|
||||
category, text, mode, "1", generateThroughImageTextDTO.getGender(), generateThroughImageTextDTO.getUniqueId()));
|
||||
// List<String> generatedSketchUrl = pythonService.generateSketchOrPrint(new GenerateToPythonDTO(accountId, Objects.isNull(elementId) ? null : collectionElement.getUrl(),
|
||||
// category, text, mode, "1", generateThroughImageTextDTO.getGender()));
|
||||
log.info("generate 响应 : " + generatedSketchUrl);
|
||||
if (CollectionUtils.isEmpty(generatedSketchUrl)) {
|
||||
return null;
|
||||
}
|
||||
// AsyncCallerUtil asyncCallerUtil = new AsyncCallerUtil();
|
||||
// List<String> generatedSketchUrl = asyncCallerUtil.generate(new GenerateToPythonDTO(accountId, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(),
|
||||
// category, text, mode, "1", generateThroughImageTextDTO.getGender(), generateThroughImageTextDTO.getUniqueId()));
|
||||
Boolean requestResult = pythonService.generateSketchOrPrint(new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(),
|
||||
mode, category, generateThroughImageTextDTO.getGender()));
|
||||
// log.info("generate 响应 : " + generatedSketchUrl);
|
||||
// if (CollectionUtils.isEmpty(generatedSketchUrl)) {
|
||||
// return null;
|
||||
// }
|
||||
|
||||
// 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中
|
||||
save(generate);
|
||||
|
||||
// 5、将本次请求存入redis
|
||||
String key = generateResultKey + ":" + generateThroughImageTextDTO.getUniqueId();
|
||||
String status;
|
||||
if (requestResult) {
|
||||
status = "Executing";
|
||||
} else {
|
||||
status = "Fail";
|
||||
}
|
||||
GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, status);
|
||||
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||
|
||||
// 5、处理模型返回的数据
|
||||
// 5.1 将相应的url保存到数据库
|
||||
List<GenerateCollectionItemVO> generatedCollectionItems = new ArrayList<>();
|
||||
/*List<GenerateCollectionItemVO> generatedCollectionItems = new ArrayList<>();
|
||||
generatedSketchUrl.forEach(item -> {
|
||||
GenerateDetail generateDetail = new GenerateDetail();
|
||||
GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO();
|
||||
@@ -165,7 +185,48 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
|
||||
// 6、将模型返回的图片地址返回给前端
|
||||
Long collectionId = Objects.isNull(collectionElement) ? null : collectionElement.getCollectionId();
|
||||
return new GenerateCollectionVO(generate.getId(), collectionId, generatedCollectionItems);
|
||||
return new GenerateCollectionVO(generate.getId(), collectionId, generatedCollectionItems);*/
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void processGenerateResult(String taskId, String url, String category) {
|
||||
// 5、处理模型返回的数据
|
||||
// 5.1 将相应的url保存到数据库
|
||||
GenerateDetail generateDetail = new GenerateDetail();
|
||||
GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO();
|
||||
Generate generate;
|
||||
try {
|
||||
generate = selectByUniqueId(taskId);
|
||||
} catch (MybatisPlusException e) {
|
||||
log.error(e.getMessage());
|
||||
if (e.getMessage().equals("One record is expected, but the query result is multiple records")) {
|
||||
generate = selectListByUniqueId(taskId).get(0);
|
||||
} else {
|
||||
throw new BusinessException("There are some problems with database query, please try again.");
|
||||
}
|
||||
|
||||
}
|
||||
// Generate generate = selectByUniqueId(taskId);
|
||||
String md5 = MD5Utils.encryptFile(minioUtil.getPresignedUrl(url, 24 * 60), Boolean.FALSE);
|
||||
// 通过MD5值和level1Type,判断不同level1Type下相同的图片是否被like过
|
||||
List<Map<String, Long>> libraryIdList = generateDetailMapper.getLibraryIdThroughMD5(md5, generate.getLevel1Type());
|
||||
if (!libraryIdList.isEmpty()) {
|
||||
generateDetail.setIsLike((byte) 1);
|
||||
generateDetail.setLibraryId(libraryIdList.get(0).get("library_id"));
|
||||
generateCollectionItemVO.setIsLiked(Boolean.TRUE);
|
||||
}
|
||||
generateDetail.setUrl(url);
|
||||
generateDetail.setGenerateId(generate.getId());
|
||||
generateDetail.setCreateDate(LocalDateTime.now());
|
||||
generateDetail.setMd5(md5);
|
||||
generateDetailMapper.insert(generateDetail);
|
||||
|
||||
String key = generateResultKey + ":" + taskId;
|
||||
String imageName = url.substring(url.lastIndexOf("/") + 1);
|
||||
String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success";
|
||||
GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, status, category);
|
||||
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||
}
|
||||
|
||||
private void validateGeneraType(Generate generate, String text, Long elementId, String generateType) {
|
||||
@@ -180,18 +241,45 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
if (Objects.isNull(elementId)) {
|
||||
throw new BusinessException("please.choose.an.image");
|
||||
}
|
||||
generate.setCollectionElementId(elementId);
|
||||
generate.setElementId(elementId);
|
||||
break;
|
||||
case "text-image":
|
||||
if (StringUtil.isNullOrEmpty(text) || Objects.isNull(elementId)) {
|
||||
throw new BusinessException("please.input.the.caption.and.choose.an.image");
|
||||
}
|
||||
generate.setText(text);
|
||||
generate.setCollectionElementId(elementId);
|
||||
generate.setElementId(elementId);
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
private String modifyPrompt(String userInput, Generate generate, String level1Type) {
|
||||
String text = "";
|
||||
String translated = pythonService.promptTranslate(userInput);
|
||||
switch (level1Type) {
|
||||
case "Moodboard":
|
||||
text = translated + ",high quality";
|
||||
generate.setText(text);
|
||||
break;
|
||||
case "Printboard":
|
||||
if (userInput.contains("Painting Style")) {
|
||||
userInput = "Picasso,increased color saturation,increased glossiness," + translated;
|
||||
} else if (userInput.contains("Illustration Style")) {
|
||||
userInput = "Flat coating,romantic,soft,pencil strokes,accentuating and widening the depth of pencil strokes,paper patterns,block colors,crayons,reducing image contrast,and hand drawn painting marks," + translated;
|
||||
} else if (userInput.contains("Real Style")) {
|
||||
userInput = "Still life photography,hyper realism,3d,deepened projection,increased permutation value,increased concavity and convexity value," + translated;
|
||||
}
|
||||
text = userInput + ", fabric print, high quality";
|
||||
generate.setText(text);
|
||||
break;
|
||||
case "Sketchboard":
|
||||
text = "clear lines, simple outlines monochrome white vector image of " + translated + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k";
|
||||
generate.setText(text);
|
||||
default:
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO) {
|
||||
@@ -315,6 +403,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
|
||||
@Override
|
||||
public PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
|
||||
// public List<String> prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
|
||||
// 1、参数检查,判断必须参数是否为空
|
||||
if (Objects.isNull(generateThroughImageTextDTO.getUserId())) {
|
||||
throw new BusinessException("userId cannot be empty");
|
||||
@@ -326,9 +415,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
|
||||
// 判断试用用户是否还有剩余试用机会
|
||||
int trialsCount = 0;
|
||||
if (generateThroughImageTextDTO.getIsTestUser()){
|
||||
if (generateThroughImageTextDTO.getIsTestUser()) {
|
||||
trialsCount = getTrialsCount(generateThroughImageTextDTO.getUserId(), generateThroughImageTextDTO.getLevel1Type());
|
||||
if (trialsCount >= 2){
|
||||
if (trialsCount >= 2) {
|
||||
return new PrepareForGenerateVO(0);
|
||||
}
|
||||
}
|
||||
@@ -337,41 +426,32 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
Long elementId = generateThroughImageTextDTO.getCollectionElementId();
|
||||
validateGeneraType(new Generate(), text, elementId, generateType);
|
||||
|
||||
// 2、生成唯一id 使用uuid
|
||||
// 2、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
// SnowflakeUtil idWorker = new SnowflakeUtil(0, 0);
|
||||
// long snowflakeId = idWorker.nextId();
|
||||
ArrayList<String> taskIdList = new ArrayList<>();
|
||||
for (int i = 1; i <= 4; i++) {
|
||||
String temp = uuid;
|
||||
temp += "-" + i + "-" + generateThroughImageTextDTO.getUserId();
|
||||
taskIdList.add(temp);
|
||||
generateThroughImageTextDTO.setUniqueId(temp);
|
||||
String jsonString = JSON.toJSONString(generateThroughImageTextDTO);
|
||||
|
||||
int num = 1;
|
||||
// 判断已经正常生成结果的uuid或正在排队的uuid中是否有相同的id
|
||||
while ((redisUtil.isElementExistsInMap(resultMapKey, uuid) ||
|
||||
redisUtil.isElementExistsInZSet(consumptionOrderKey, uuid))
|
||||
&& num < 10) {
|
||||
uuid = UUID.randomUUID().toString();
|
||||
num++;
|
||||
// 3、加入redis排队,便于获取实时排队信息
|
||||
Double maxScore = redisUtil.getMaxScore(consumptionOrderKey);
|
||||
redisUtil.addToZSet(consumptionOrderKey, temp, maxScore);
|
||||
|
||||
// 加入resultMap
|
||||
String key = generateResultKey + ":" + temp;
|
||||
GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Waiting");
|
||||
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||
|
||||
// 4、将消息发布到MQ消息队列
|
||||
rabbitMQService.publishMessageToGenerate(jsonString);
|
||||
}
|
||||
// 无依据确定的数字
|
||||
if (num > 10) {
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
uuid = UUID.randomUUID().toString();
|
||||
}
|
||||
generateThroughImageTextDTO.setUniqueId(uuid);
|
||||
String jsonString = JSON.toJSONString(generateThroughImageTextDTO);
|
||||
|
||||
// 3、加入redis排队,便于获取实时排队信息
|
||||
Double maxScore = redisUtil.getMaxScore(consumptionOrderKey);
|
||||
redisUtil.addToZSet(consumptionOrderKey, uuid, maxScore);
|
||||
|
||||
// 4、将消息发布到MQ消息队列
|
||||
rabbitMQService.publishMessage(jsonString);
|
||||
|
||||
// 5、返回唯一id
|
||||
return new PrepareForGenerateVO(uuid, 2 - trialsCount);
|
||||
return new PrepareForGenerateVO(taskIdList, 2 - trialsCount);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -380,7 +460,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
return redisUtil.getRank(consumptionOrderKey, uniqueId);
|
||||
}
|
||||
|
||||
@Override
|
||||
/*@Override
|
||||
public GenerateCollectionVO getGenerateResult(String uniqueId) {
|
||||
// 1、判断该请求是否已经异常
|
||||
Boolean isMember = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId);
|
||||
@@ -429,8 +509,37 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
});
|
||||
|
||||
return new GenerateCollectionVO(generateId, null, generatedCollectionItems);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public List<GenerateResultVO> getGenerateResultList(List<String> taskIdList) {
|
||||
List<GenerateResultVO> results = new ArrayList<>();
|
||||
Set<String> collect = new HashSet<>();
|
||||
taskIdList.forEach(taskId -> {
|
||||
String key = generateResultKey + ":" + taskId;
|
||||
GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class);
|
||||
if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) {
|
||||
String url = generateResultVO.getUrl();
|
||||
if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")) {
|
||||
generateResultVO.setStatus("Invalid");
|
||||
} else {
|
||||
generateResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
}
|
||||
} else if (Objects.isNull(generateResultVO)) {
|
||||
generateResultVO = new GenerateResultVO();
|
||||
}
|
||||
if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus());
|
||||
results.add(generateResultVO);
|
||||
});
|
||||
// todo
|
||||
if (taskIdList.size() == 4 && collect.size() == 1 && collect.contains("Fail")) {
|
||||
log.info("当前4个生成结果均为失败");
|
||||
throw new BusinessException("generate.interface.error");
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
|
||||
public Generate selectByUniqueId(String uniqueId) {
|
||||
QueryWrapper<Generate> qw = new QueryWrapper<>();
|
||||
qw.eq("unique_id", uniqueId);
|
||||
@@ -438,56 +547,81 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
return getOne(qw);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void cancelGenerate(Long userId, String uniqueId, String timeZone) {
|
||||
// 1、确认当前消息是否还在排队中
|
||||
Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId);
|
||||
Boolean flag = Boolean.FALSE;
|
||||
if (exists) flag = redisUtil.getRank(consumptionOrderKey, uniqueId) > 1L ? Boolean.TRUE : Boolean.FALSE;
|
||||
// 不管flag的默认值是true还是false,只要exists为false,&& 将短路
|
||||
if (exists && flag) {
|
||||
// 1.1、将需要取消的唯一id加入redis,以便及时取消生成
|
||||
redisUtil.addToSet(cancelSetKey, uniqueId);
|
||||
// 1.2 将需要取消的id从redis的ConsumptionOrder中删除
|
||||
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
|
||||
} else {
|
||||
// 2、判断该消息是否异常
|
||||
boolean hasKey = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId);
|
||||
// 3、判断该消息是否已经消费结束
|
||||
Boolean existsInResult = redisUtil.isElementExistsInMap(resultMapKey, uniqueId);
|
||||
if (!hasKey && !existsInResult) {
|
||||
// 设置取等待状态为false
|
||||
AsyncCallerUtil.waitingStatus.put(uniqueId, false);
|
||||
// 3、直接发送取消请求到python端
|
||||
pythonService.cancelGenerateTask(uniqueId);
|
||||
}
|
||||
}
|
||||
public List<Generate> selectListByUniqueId(String uniqueId) {
|
||||
QueryWrapper<Generate> qw = new QueryWrapper<>();
|
||||
qw.eq("unique_id", uniqueId).orderByDesc("id");
|
||||
|
||||
// 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作,包括已经异常的请求
|
||||
GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone));
|
||||
generateCancelMapper.insert(generateCancel);
|
||||
return baseMapper.selectList(qw);
|
||||
}
|
||||
|
||||
// 判断试用用户试用generate机会是否使用完毕
|
||||
private int getTrialsCount(Long userId, String level1Type){
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void cancelGenerate(Long userId, List<String> uniqueIdList, String timeZone) {
|
||||
// todo 取消待优化
|
||||
uniqueIdList.forEach(uniqueId -> {
|
||||
// 1、将需要取消的唯一id加入redis,以便及时取消生成
|
||||
redisUtil.addToSet(cancelSetKey, uniqueId);
|
||||
|
||||
/*// 1、确认当前消息是否还在排队中
|
||||
Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId);
|
||||
Boolean flag = Boolean.FALSE;
|
||||
if (exists) flag = redisUtil.getRank(consumptionOrderKey, uniqueId) > 1L ? Boolean.TRUE : Boolean.FALSE;
|
||||
// 不管flag的默认值是true还是false,只要exists为false,&& 将短路
|
||||
if (exists && flag) {
|
||||
// 1.1、将需要取消的唯一id加入redis,以便及时取消生成
|
||||
redisUtil.addToSet(cancelSetKey, uniqueId);
|
||||
// 1.2 将需要取消的id从redis的ConsumptionOrder中删除
|
||||
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
|
||||
} else {
|
||||
// 2、判断该消息是否异常
|
||||
boolean hasKey = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId);
|
||||
// 3、判断该消息是否已经消费结束
|
||||
Boolean existsInResult = redisUtil.isElementExistsInMap(resultMapKey, uniqueId);
|
||||
if (!hasKey && !existsInResult) {
|
||||
// 设置取等待状态为false
|
||||
AsyncCallerUtil.waitingStatus.put(uniqueId, false);
|
||||
// 3、直接发送取消请求到python端
|
||||
pythonService.cancelGenerateTask(uniqueId);
|
||||
}
|
||||
}*/
|
||||
|
||||
String key = generateResultKey + ":" + uniqueId;
|
||||
GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class);
|
||||
// 判断当前task的状态是不是Fail
|
||||
if (!generateResultVO.getStatus().equals("Fail")){
|
||||
// 2、不是,直接发送取消请求到python端
|
||||
pythonService.cancelGenerateTask(uniqueId);
|
||||
// 3、更改result中当前taskId的状态
|
||||
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(uniqueId, null, null, "Cancelled")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||
}
|
||||
|
||||
// 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作,包括已经异常的请求
|
||||
GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone));
|
||||
generateCancelMapper.insert(generateCancel);
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
// 判断试用用户试用generate机会是否使用完毕 每个board 3次机会
|
||||
private int getTrialsCount(Long userId, String level1Type) {
|
||||
List<Generate> getGenerateList = getGenerateByAccountId(userId, level1Type);
|
||||
int trialsCount ;
|
||||
if (getGenerateList.isEmpty()){
|
||||
int trialsCount;
|
||||
if (getGenerateList.isEmpty()) {
|
||||
trialsCount = 0;
|
||||
} else if (getGenerateList.size() == 1) {
|
||||
} else if (getGenerateList.size() == 1 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 1)) {
|
||||
trialsCount = 1;
|
||||
} else if (getGenerateList.size() == 2) {
|
||||
} else if (getGenerateList.size() == 2 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 2)) {
|
||||
trialsCount = 2;
|
||||
}else {
|
||||
} else {
|
||||
trialsCount = 2;
|
||||
}
|
||||
return trialsCount;
|
||||
}
|
||||
|
||||
public List<Generate> getGenerateByAccountId(Long accountId, String level1Type){
|
||||
public List<Generate> getGenerateByAccountId(Long accountId, String level1Type) {
|
||||
QueryWrapper<Generate> qw = new QueryWrapper<>();
|
||||
qw.eq("account_id",accountId);
|
||||
qw.eq("account_id", accountId);
|
||||
qw.eq("level1_type", level1Type);
|
||||
|
||||
return baseMapper.selectList(qw);
|
||||
|
||||
@@ -5,8 +5,8 @@ import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.enums.SingleOverallEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.DateUtil;
|
||||
import com.ai.da.mapper.LibraryModelPointMapper;
|
||||
import com.ai.da.mapper.entity.*;
|
||||
import com.ai.da.mapper.primary.LibraryModelPointMapper;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.dto.LibraryModelPointDTO;
|
||||
import com.ai.da.model.dto.ModelsDotDTO;
|
||||
import com.ai.da.model.enums.ModelType;
|
||||
@@ -22,7 +22,6 @@ import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.core.parameters.P;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@@ -12,11 +12,8 @@ import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.DateUtil;
|
||||
import com.ai.da.common.utils.FileUtil;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.LibraryCopyMapper;
|
||||
import com.ai.da.mapper.LibraryMapper;
|
||||
import com.ai.da.mapper.LibraryModelPointCopyMapper;
|
||||
import com.ai.da.mapper.SysFileMapper;
|
||||
import com.ai.da.mapper.entity.*;
|
||||
import com.ai.da.mapper.primary.*;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.enums.*;
|
||||
import com.ai.da.model.vo.*;
|
||||
@@ -368,7 +365,7 @@ public class LibraryServiceImpl extends ServiceImpl<LibraryMapper, Library> impl
|
||||
log.info("processSketchBoards请求python 参数:####{}", param);
|
||||
RequestBody body = RequestBody.create(mediaType, param);
|
||||
Request request = new Request.Builder()
|
||||
.url(accessPythonIp + ":" + accessPythonPort + "/api/sketches_bounding_box")
|
||||
.url(accessPythonIp + ":" + accessPythonPort + "/api/design_pre_processing")
|
||||
.method("POST", body)
|
||||
// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
|
||||
.addHeader("Content-Type", "application/json")
|
||||
@@ -412,7 +409,8 @@ public class LibraryServiceImpl extends ServiceImpl<LibraryMapper, Library> impl
|
||||
qw.lambda().eq(Library::getLevel2Type, level2Type);
|
||||
qw.lambda().eq(Library::getLevel3Type, sex);
|
||||
} else {
|
||||
qw.lambda().eq(Library::getLevel2Type, sex);
|
||||
// qw.lambda().eq(Library::getLevel2Type, sex);
|
||||
qw.lambda().eq(Library::getLevel3Type, sex);
|
||||
}
|
||||
}
|
||||
qw.lambda().eq(Library::getMd5, md5);
|
||||
@@ -597,7 +595,7 @@ public class LibraryServiceImpl extends ServiceImpl<LibraryMapper, Library> impl
|
||||
public void checkModel(String value, List<Long> modelIds, Integer deleteModelConfirm) {
|
||||
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
||||
QueryWrapper<Workspace> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(Workspace::getUserName, authPrincipalVo.getUsername());
|
||||
qw.lambda().eq(Workspace::getAccountId, authPrincipalVo.getId());
|
||||
if (value.equals(Sex.FEMALE.getValue())) {
|
||||
qw.lambda().in(Workspace::getMannequinFemaleId, modelIds);
|
||||
}
|
||||
|
||||
215
src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java
Normal file
215
src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java
Normal file
@@ -0,0 +1,215 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.common.enums.OrderStatusEnum;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.common.utils.OrderNoUtils;
|
||||
import com.ai.da.mapper.primary.OrderInfoMapper;
|
||||
import com.ai.da.mapper.primary.ProductMapper;
|
||||
import com.ai.da.mapper.primary.entity.OrderInfo;
|
||||
import com.ai.da.model.dto.QueryPageByTimeDTO;
|
||||
import com.ai.da.model.vo.AuthPrincipalVo;
|
||||
import com.ai.da.service.OrderInfoService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {
|
||||
|
||||
@Resource
|
||||
private ProductMapper productMapper;
|
||||
|
||||
@Override
|
||||
public OrderInfo createOrderByProductId(Integer amount, String paymentType) {
|
||||
|
||||
//查找已存在但未支付的订单
|
||||
/*OrderInfo orderInfo = this.getNoPayOrderByProductId(amount, paymentType);
|
||||
if( orderInfo != null){
|
||||
return orderInfo;
|
||||
}*/
|
||||
|
||||
//获取商品信息
|
||||
// Product product = productMapper.selectById(amount);
|
||||
AuthPrincipalVo userHolder = UserContext.getUserHolder();
|
||||
Long accountId = userHolder.getId();
|
||||
|
||||
//生成订单
|
||||
OrderInfo orderInfo = new OrderInfo();
|
||||
orderInfo.setAccountId(accountId);
|
||||
orderInfo.setTitle("积分购买 X" + amount );
|
||||
orderInfo.setOrderNo(OrderNoUtils.getOrderNo()); //订单号 ??
|
||||
// orderInfo.setProductId(amount);
|
||||
orderInfo.setTotalFee(Integer.parseInt(CreditsEventsEnum.PRICE.getValue()) * amount); // 元 HKD
|
||||
orderInfo.setOrderStatus(OrderStatusEnum.NOT_PAY.getType()); //未支付
|
||||
orderInfo.setPaymentType(paymentType);
|
||||
baseMapper.insert(orderInfo);
|
||||
|
||||
return orderInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 存储订单二维码
|
||||
* @param orderNo
|
||||
* @param codeUrl
|
||||
*/
|
||||
@Override
|
||||
public void saveCodeUrl(String orderNo, String codeUrl) {
|
||||
|
||||
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("order_no", orderNo);
|
||||
|
||||
OrderInfo orderInfo = new OrderInfo();
|
||||
orderInfo.setCodeUrl(codeUrl);
|
||||
|
||||
baseMapper.update(orderInfo, queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单列表,并倒序查询
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<OrderInfo> listOrderByCreateTimeDesc() {
|
||||
|
||||
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<OrderInfo>().orderByDesc("create_time");
|
||||
return baseMapper.selectList(queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据订单号更新订单状态
|
||||
* @param orderNo
|
||||
* @param orderStatus
|
||||
*/
|
||||
@Override
|
||||
public void updateStatusByOrderNo(String orderNo, OrderStatusEnum orderStatus) {
|
||||
|
||||
log.info("更新订单状态 ===> {}", orderStatus.getType());
|
||||
|
||||
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("order_no", orderNo);
|
||||
|
||||
OrderInfo orderInfo = new OrderInfo();
|
||||
orderInfo.setOrderStatus(orderStatus.getType());
|
||||
|
||||
baseMapper.update(orderInfo, queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据订单号获取订单状态
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String getOrderStatus(String orderNo) {
|
||||
|
||||
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("order_no", orderNo);
|
||||
OrderInfo orderInfo = baseMapper.selectOne(queryWrapper);
|
||||
if(orderInfo == null){
|
||||
return null;
|
||||
}
|
||||
return orderInfo.getOrderStatus();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询创建超过minutes分钟并且未支付的订单
|
||||
* @param minutes
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<OrderInfo> getNoPayOrderByDuration(int minutes, String paymentType) {
|
||||
|
||||
Instant instant = Instant.now().minus(Duration.ofMinutes(minutes));
|
||||
|
||||
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("order_status", OrderStatusEnum.NOT_PAY.getType());
|
||||
queryWrapper.le("create_time", instant);
|
||||
queryWrapper.eq("payment_type", paymentType);
|
||||
|
||||
List<OrderInfo> orderInfoList = baseMapper.selectList(queryWrapper);
|
||||
|
||||
return orderInfoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据订单号获取订单
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public OrderInfo getOrderByOrderNo(String orderNo) {
|
||||
|
||||
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("order_no", orderNo);
|
||||
OrderInfo orderInfo = baseMapper.selectOne(queryWrapper);
|
||||
|
||||
return orderInfo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据商品id查询未支付订单
|
||||
* 防止重复创建订单对象
|
||||
* @param productId
|
||||
* @return
|
||||
*/
|
||||
private OrderInfo getNoPayOrderByProductId(Long productId, String paymentType) {
|
||||
|
||||
QueryWrapper<OrderInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("product_id", productId);
|
||||
queryWrapper.eq("order_status", OrderStatusEnum.NOT_PAY.getType());
|
||||
queryWrapper.eq("payment_type", paymentType);
|
||||
// queryWrapper.eq("user_id", userId);
|
||||
OrderInfo orderInfo = baseMapper.selectOne(queryWrapper);
|
||||
return orderInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageBaseResponse<OrderInfo> getOrderByPage(QueryPageByTimeDTO queryPageByTimeDTO){
|
||||
QueryWrapper<OrderInfo> qw = new QueryWrapper<>();
|
||||
qw.eq("account_id",UserContext.getUserHolder().getId());
|
||||
|
||||
String startTime = queryPageByTimeDTO.getStartTime();
|
||||
String endTime = queryPageByTimeDTO.getEndTime();
|
||||
if (StringUtil.isNullOrEmpty(startTime)){
|
||||
startTime = "2024-02-01 00:00:00";
|
||||
}
|
||||
if (StringUtil.isNullOrEmpty(endTime)){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
endTime = now.format(dateTimeFormatter);
|
||||
}
|
||||
qw.between("create_time", startTime, endTime);
|
||||
qw.orderByDesc("create_time");
|
||||
Page<OrderInfo> pageInfo = new Page<>(queryPageByTimeDTO.getPage(), queryPageByTimeDTO.getSize());
|
||||
Page<OrderInfo> orderInfo = baseMapper.selectPage(pageInfo, qw);
|
||||
if (CollectionUtils.isEmpty(orderInfo.getRecords())) {
|
||||
return PageBaseResponse.success(new Page<>());
|
||||
}
|
||||
|
||||
return PageBaseResponse.success(orderInfo);
|
||||
}
|
||||
|
||||
public void updateOrderNoById(Long id, String orderNo){
|
||||
OrderInfo orderInfo = new OrderInfo();
|
||||
orderInfo.setId(id);
|
||||
orderInfo.setOrderNo(orderNo);
|
||||
|
||||
baseMapper.updateById(orderInfo);
|
||||
}
|
||||
}
|
||||
@@ -5,9 +5,9 @@ import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.response.ResultEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.PantoneUtils;
|
||||
import com.ai.da.mapper.entity.ColorLookupTable;
|
||||
import com.ai.da.mapper.entity.PanTone;
|
||||
import com.ai.da.mapper.PanToneMapper;
|
||||
import com.ai.da.mapper.primary.entity.ColorLookupTable;
|
||||
import com.ai.da.mapper.primary.entity.PanTone;
|
||||
import com.ai.da.mapper.primary.PanToneMapper;
|
||||
import com.ai.da.model.dto.GetRgbByHsvBatchDTO;
|
||||
import com.ai.da.model.vo.PantoneVO;
|
||||
import com.ai.da.service.ColorLoopUpTableService;
|
||||
@@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.checkerframework.checker.units.qual.A;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@@ -0,0 +1,642 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import com.ai.da.common.config.PayPalClient;
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.enums.*;
|
||||
import com.ai.da.common.utils.RedisUtil;
|
||||
import com.ai.da.common.utils.paypalRequest.AuthenticationRequest;
|
||||
import com.ai.da.common.utils.paypalRequest.WebhookVerifyRequest;
|
||||
import com.ai.da.mapper.primary.entity.OrderInfo;
|
||||
import com.ai.da.mapper.primary.entity.RefundInfo;
|
||||
import com.ai.da.service.*;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.google.gson.Gson;
|
||||
import com.paypal.api.payments.Event;
|
||||
import com.paypal.base.Constants;
|
||||
import com.paypal.base.SDKUtil;
|
||||
import com.paypal.base.rest.APIContext;
|
||||
import com.paypal.base.rest.PayPalRESTException;
|
||||
import com.paypal.http.HttpResponse;
|
||||
import com.paypal.http.exceptions.SerializeException;
|
||||
import com.paypal.http.serializer.Json;
|
||||
import com.paypal.orders.*;
|
||||
import com.paypal.payments.CapturesGetRequest;
|
||||
import com.paypal.payments.CapturesRefundRequest;
|
||||
import com.paypal.payments.RefundRequest;
|
||||
import com.paypal.payments.RefundsGetRequest;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.json.JSONObject;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SignatureException;
|
||||
import java.util.*;
|
||||
|
||||
import static com.ai.da.common.constant.PayPalCheckoutConstant.*;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
//@RefreshScope
|
||||
public class PayPalCheckoutServiceImpl implements PayPalCheckoutService {
|
||||
|
||||
@Value("${paypal.receiver.email}")
|
||||
private String receiverEmail;
|
||||
|
||||
@Value("${paypal.client-id}")
|
||||
private String clientId;
|
||||
|
||||
@Value("${paypal.client-secret}")
|
||||
private String clientSecret;
|
||||
|
||||
@Value("${paypal.mode}")
|
||||
private String mode;
|
||||
|
||||
@Value("${paypal.webhook_id}")
|
||||
private String webhookId;
|
||||
|
||||
@Resource
|
||||
private PayPalClient payPalClient;
|
||||
@Resource
|
||||
private OrderInfoService orderInfoService;
|
||||
@Resource
|
||||
private PaymentInfoService paymentInfoService;
|
||||
@Resource
|
||||
private RefundInfoService refundsInfoService;
|
||||
@Resource
|
||||
private CreditsService creditsService;
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
/**
|
||||
* 创建订单的方法
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public HashMap<String, String> createOrder(Integer amount, String returnUrl) throws SerializeException {
|
||||
// 生成订单
|
||||
log.info("生成订单");
|
||||
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.PAYPAL.getType());
|
||||
|
||||
OrdersCreateRequest request = new OrdersCreateRequest();
|
||||
request.header("prefer", "return=representation");
|
||||
request.requestBody(buildRequestBody(String.valueOf(orderInfo.getTotalFee()), returnUrl));
|
||||
HttpResponse<Order> response = null;
|
||||
try {
|
||||
response = payPalClient.client(mode, clientId, clientSecret).execute(request);
|
||||
} catch (Exception e) {
|
||||
log.error("调用paypal订单创建失败,失败原因 ===> {}", e.getMessage());
|
||||
throw new BusinessException("Order creation failed");
|
||||
}
|
||||
|
||||
String approve = "";
|
||||
assert response != null;
|
||||
if (response.statusCode() == 201) {
|
||||
log.info("Status Code = {}, Status = {}, OrderID = {}, Intent = {}", response.statusCode(), response.result().status(), response.result().id(), response.result().checkoutPaymentIntent());
|
||||
for (LinkDescription link : response.result().links()) {
|
||||
log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method());
|
||||
if (link.rel().equals("approve")) {
|
||||
approve = link.href();
|
||||
}
|
||||
}
|
||||
String totalAmount = response.result().purchaseUnits().get(0).amountWithBreakdown().currencyCode() + ":" + response.result().purchaseUnits().get(0).amountWithBreakdown().value();
|
||||
log.info("Total Amount: {}", totalAmount);
|
||||
String json = new JSONObject(new Json().serialize(response.result())).toString(4);
|
||||
log.info("createOrder response body: {}", json);
|
||||
}
|
||||
|
||||
String orderId = response.result().id();
|
||||
orderInfoService.updateOrderNoById(orderInfo.getId(), orderId);
|
||||
|
||||
HashMap<String, String> returnData = new HashMap<>();
|
||||
returnData.put("approve", approve);
|
||||
returnData.put("orderNo", orderId);
|
||||
|
||||
// 需要返回地址和订单id
|
||||
return returnData;
|
||||
}
|
||||
|
||||
// ##Validate Webhook
|
||||
public Boolean doPost(HttpServletRequest req, HttpServletResponse resp)
|
||||
throws ServletException, IOException {
|
||||
try {
|
||||
String body = getBody(req);
|
||||
Map webhookEvent = new ObjectMapper().readValue(body, Map.class);
|
||||
|
||||
HashMap<String, Object> webhookRequest = new HashMap<>();
|
||||
webhookRequest.put("auth_algo", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-AUTH-ALGO"));
|
||||
webhookRequest.put("cert_url", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-CERT-URL"));
|
||||
webhookRequest.put("transmission_id", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-ID"));
|
||||
webhookRequest.put("transmission_sig", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-SIG"));
|
||||
webhookRequest.put("transmission_time", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-TIME"));
|
||||
webhookRequest.put("webhook_id", webhookId);
|
||||
webhookRequest.put("webhook_event", webhookEvent);
|
||||
|
||||
WebhookVerifyRequest webhookVerifyRequest = new WebhookVerifyRequest();
|
||||
webhookVerifyRequest.authorization(getOAuth());
|
||||
webhookVerifyRequest.requestBody(webhookRequest);
|
||||
// 验签
|
||||
HttpResponse<HashMap> verified = payPalClient.client(mode, clientId, clientSecret).execute(webhookVerifyRequest);
|
||||
boolean verifyResult = verified.result().get("verification_status").toString().equals("SUCCESS");
|
||||
if (verifyResult) {
|
||||
// ### Api Context
|
||||
APIContext apiContext = new APIContext(clientId, clientSecret, mode);
|
||||
|
||||
// Set the webhookId that you received when you created this webhook.
|
||||
apiContext.addConfiguration(Constants.PAYPAL_WEBHOOK_ID, webhookId);
|
||||
Boolean result = Event.validateReceivedEvent(apiContext, getHeadersInfo(
|
||||
req), body);
|
||||
log.info("Webhook Validated: " + result);
|
||||
|
||||
if (result) {
|
||||
// 处理订单数据
|
||||
LinkedHashMap<String, LinkedHashMap<String, String>> webhookEventMap = (LinkedHashMap<String, LinkedHashMap<String, String>>) webhookEvent;
|
||||
String orderId = webhookEventMap.get("resource").get("id");
|
||||
processOrder(orderId);
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
} else {
|
||||
log.error("Paypal 验签失败");
|
||||
}
|
||||
} catch (PayPalRESTException | InvalidKeyException | NoSuchAlgorithmException | SignatureException e) {
|
||||
log.error(e.getMessage());
|
||||
}
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
// Simple helper method to help you extract the headers from HttpServletRequest object.
|
||||
private static Map<String, String> getHeadersInfo(HttpServletRequest request) {
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
@SuppressWarnings("rawtypes")
|
||||
Enumeration headerNames = request.getHeaderNames();
|
||||
while (headerNames.hasMoreElements()) {
|
||||
String key = (String) headerNames.nextElement();
|
||||
String value = request.getHeader(key);
|
||||
map.put(key, value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
// Simple helper method to fetch request data as a string from HttpServletRequest object.
|
||||
private static String getBody(HttpServletRequest request) throws IOException {
|
||||
String body;
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
BufferedReader bufferedReader = null;
|
||||
try {
|
||||
InputStream inputStream = request.getInputStream();
|
||||
if (inputStream != null) {
|
||||
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
|
||||
char[] charBuffer = new char[128];
|
||||
int bytesRead = -1;
|
||||
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
|
||||
stringBuilder.append(charBuffer, 0, bytesRead);
|
||||
}
|
||||
} else {
|
||||
stringBuilder.append("");
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
throw ex;
|
||||
} finally {
|
||||
if (bufferedReader != null) {
|
||||
try {
|
||||
bufferedReader.close();
|
||||
} catch (IOException ex) {
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
body = stringBuilder.toString();
|
||||
log.info("回调参数 ===> {}", body);
|
||||
return body;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成订单主体信息
|
||||
*/
|
||||
private OrderRequest buildRequestBody(String price, String returnUrl) {
|
||||
OrderRequest orderRequest = new OrderRequest();
|
||||
orderRequest.checkoutPaymentIntent(CAPTURE);
|
||||
|
||||
ApplicationContext applicationContext = new ApplicationContext()
|
||||
.brandName(BRANDNAME)
|
||||
.landingPage(LANDINGPAGE)
|
||||
.cancelUrl(returnUrl).returnUrl(returnUrl)
|
||||
.userAction(USERACTION)
|
||||
.shippingPreference(SHIPPINGPREFERENCE);
|
||||
orderRequest.applicationContext(applicationContext);
|
||||
|
||||
List<PurchaseUnitRequest> purchaseUnitRequests = new ArrayList<PurchaseUnitRequest>();
|
||||
|
||||
PurchaseUnitRequest purchaseUnitRequest = new PurchaseUnitRequest()
|
||||
.amountWithBreakdown(new AmountWithBreakdown()
|
||||
.amountBreakdown(new AmountBreakdown())
|
||||
.currencyCode(CurrencyCodesEnum.HONG_KONG_DOLLAR.getCode())
|
||||
.value(price));
|
||||
purchaseUnitRequests.add(purchaseUnitRequest);
|
||||
orderRequest.purchaseUnits(purchaseUnitRequests);
|
||||
return orderRequest;
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public String callback(@SuppressWarnings("rawtypes") Map map) {
|
||||
|
||||
log.info("paypal支付通知正在执行");
|
||||
log.info("通知参数 ===> {}", map);
|
||||
|
||||
// log.info(map.toString());
|
||||
String outTradeNo = (String) map.get("invoice");
|
||||
String paymentStatus = (String) map.get("payment_status");
|
||||
String amount = (String) map.get("mc_gross");
|
||||
String currency = (String) map.get("mc_currency");
|
||||
String paymentId = (String) map.get("txn_id");
|
||||
String parentPaymentId = (String) map.get("parent_txn_id");
|
||||
log.info("商家订单号 = {}", outTradeNo);
|
||||
log.info("订单状态 = {}", paymentStatus);
|
||||
log.info("金额 = {}", amount);
|
||||
log.info("币种 = {}", currency);
|
||||
log.info("流水号 = {}", paymentId);
|
||||
log.info("父流水号 = {}", parentPaymentId);
|
||||
|
||||
if (!receiverEmail.equals(map.get("receiver_email"))) {
|
||||
log.info("FAIL = 商户id错误, outTradeNo = {}", outTradeNo);
|
||||
return "failure";
|
||||
}
|
||||
if ("Completed".equals(paymentStatus)) {
|
||||
//进行数据库操作
|
||||
//
|
||||
//
|
||||
log.info("支付成功,状态为=COMPLETED");
|
||||
return "success";
|
||||
}
|
||||
if ("Refunded".equals(paymentStatus)) {
|
||||
//进行数据库操作
|
||||
//
|
||||
//
|
||||
log.info("退款成功");
|
||||
return "success";
|
||||
}
|
||||
if ("Pending".equals(paymentStatus) && StringUtils.isEmpty(parentPaymentId)) {
|
||||
String pendingReason = String.valueOf(map.get("pending_reason"));
|
||||
//进行数据库操作
|
||||
//
|
||||
//
|
||||
log.info("订单支付成功,状态为=PENDING,产生此状态的原因是 {}", pendingReason);
|
||||
return "success";
|
||||
}
|
||||
if (StringUtils.isEmpty(parentPaymentId)) {
|
||||
if (PayPalCheckoutConstant.PAYMENT_STATUS_REVERSED.equals(paymentStatus)
|
||||
|| PayPalCheckoutConstant.PAYMENT_STATUS_CANCELED_REVERSAL.equals(paymentStatus)
|
||||
|| PayPalCheckoutConstant.PAYMENT_STATUS_DENIED.equals(paymentStatus)) {
|
||||
String reasonCode = String.valueOf(map.get("reason_code"));
|
||||
//进行数据库操作(状态修改)
|
||||
//
|
||||
//
|
||||
log.info("订单异常,请尽快查看处理,状态为={},产生此状态的原因是 {} ", paymentStatus, reasonCode);
|
||||
return PayPalCheckoutConstant.SUCCESS;
|
||||
}
|
||||
if (PayPalCheckoutConstant.PAYMENT_STATUS_EXPIRED.equals(paymentStatus)
|
||||
|| PayPalCheckoutConstant.PAYMENT_STATUS_CREATED.equals(paymentStatus)
|
||||
|| PayPalCheckoutConstant.PAYMENT_STATUS_FAILED.equals(paymentStatus)
|
||||
|| PayPalCheckoutConstant.PAYMENT_STATUS_PROCESSED.equals(paymentStatus)
|
||||
|| PayPalCheckoutConstant.PAYMENT_STATUS_VOIDED.equals(paymentStatus)) {
|
||||
//进行数据库操作(状态修改)
|
||||
//
|
||||
//
|
||||
log.info("其他订单状态,订单异常,请尽快查看处理, 状态={}", paymentStatus);
|
||||
return PayPalCheckoutConstant.SUCCESS;
|
||||
}
|
||||
}
|
||||
return "failure";
|
||||
}*/
|
||||
|
||||
/**
|
||||
* 查询订单信息
|
||||
*
|
||||
* @param orderNo
|
||||
* @return
|
||||
* @throws SerializeException
|
||||
*/
|
||||
public Order queryOrder(String orderNo) throws SerializeException {
|
||||
OrdersGetRequest request = new OrdersGetRequest(orderNo);
|
||||
|
||||
HttpResponse<Order> response = null;
|
||||
try {
|
||||
response = payPalClient.client(mode, clientId, clientSecret).execute(request);
|
||||
} catch (Exception e) {
|
||||
log.error("paypal订单查询失败,失败原因 ===> {}", e.getMessage());
|
||||
return null;
|
||||
}
|
||||
log.debug("Status Code: " + response.statusCode() + "\tStatus: " + response.result().status() + "\tOrder id: " + response.result().id());
|
||||
if (response.result().purchaseUnits().get(0).payments() != null) {
|
||||
List<Capture> captures = response.result().purchaseUnits().get(0).payments().captures();
|
||||
if (captures != null) {
|
||||
for (Capture capture : captures) {
|
||||
log.debug("\t订单编号= " + capture.invoiceId() + "\tCapture Id= " + capture.id() + "\tCapture status= " + capture.status() + "\tCapture amount= " + capture.amount().currencyCode() + ":" + capture.amount().value());
|
||||
}
|
||||
}
|
||||
List<Refund> refunds = response.result().purchaseUnits().get(0).payments().refunds();
|
||||
if (refunds != null) {
|
||||
for (Refund refund : refunds) {
|
||||
log.debug("\t售后编号= " + refund.invoiceId() + "\tRefund Id= " + refund.id() + "\tRefund status= " + refund.status() + "\tRefund amount= " + refund.amount().currencyCode() + ":" + refund.amount().value());
|
||||
}
|
||||
}
|
||||
}
|
||||
for (com.paypal.orders.LinkDescription link : response.result().links()) {
|
||||
log.debug("Links: \t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method());
|
||||
}
|
||||
|
||||
|
||||
String json = new JSONObject(new Json().serialize(response.result())).toString(4);
|
||||
log.info("Full response body: {}", json);
|
||||
return response.result();
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户授权支付成功,进行扣款操作
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Order captureOrder(String orderId) {
|
||||
OrdersCaptureRequest request = new OrdersCaptureRequest(orderId);
|
||||
request.requestBody(new OrderRequest());
|
||||
PayPalClient payPalClient = new PayPalClient();
|
||||
HttpResponse<Order> response;
|
||||
|
||||
try {
|
||||
response = payPalClient.client(mode, clientId, clientSecret).execute(request);
|
||||
} catch (Exception e) {
|
||||
log.error("调用paypal扣款失败,失败原因 ===> {}", e.getMessage());
|
||||
throw new BusinessException("Order deduction failed.");
|
||||
}
|
||||
log.info("Status Code = {}, Status = {}, OrderID = {}", response.statusCode(), response.result().status(), response.result().id());
|
||||
for (LinkDescription link : response.result().links()) {
|
||||
log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method());
|
||||
}
|
||||
for (PurchaseUnit purchaseUnit : response.result().purchaseUnits()) {
|
||||
for (Capture capture : purchaseUnit.payments().captures()) {
|
||||
log.info("Capture id: {}", capture.id());
|
||||
log.info("status: {}", capture.status());
|
||||
log.info("invoice_id: {}", capture.invoiceId());
|
||||
if ("COMPLETED".equals(capture.status())) {
|
||||
//进行数据库操作,修改订单状态为已支付成功,尽快发货(配合回调和CapturesGet查询确定成功)
|
||||
log.info("支付成功,状态为=COMPLETED");
|
||||
}
|
||||
if ("PENDING".equals(capture.status())) {
|
||||
log.info("status_details: {}", capture.captureStatusDetails().reason());
|
||||
String reason = "PENDING";
|
||||
if (capture.captureStatusDetails() != null && capture.captureStatusDetails().reason() != null) {
|
||||
reason = capture.captureStatusDetails().reason();
|
||||
}
|
||||
//进行数据库操作,修改订单状态为已支付成功,但触发了人工审核,请审核通过后再发货(配合回调和CapturesGet查询确定成功)
|
||||
log.info("支付成功,状态为=PENDING : {}", reason);
|
||||
}
|
||||
}
|
||||
}
|
||||
Payer buyer = response.result().payer();
|
||||
log.info("Buyer Email Address: {}", buyer.email());
|
||||
log.info("Buyer Name: {} {}", buyer.name().givenName(), buyer.name().surname());
|
||||
// String jsonString = JSON.toJSONString(response.result());
|
||||
String json = null;
|
||||
try {
|
||||
json = new JSONObject(new Json().serialize(response.result())).toString(4);
|
||||
} catch (SerializeException e) {
|
||||
log.warn("response序列化出错,具体信息 ===> {}", e.getMessage());
|
||||
}
|
||||
log.info("captureOrder response body: {}", json);
|
||||
// return Convert.toStr(new Json().serialize(response.result()));
|
||||
return response.result();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询扣款
|
||||
*/
|
||||
public String queryCapture(String orderNo) throws IOException {
|
||||
CapturesGetRequest request = new CapturesGetRequest("扣款id, CaptureOrder生成");
|
||||
|
||||
HttpResponse<com.paypal.payments.Capture> response = payPalClient.client(mode, clientId, clientSecret).execute(request);
|
||||
System.out.println("Status Code: " + response.statusCode());
|
||||
System.out.println("Status: " + response.result().status());
|
||||
System.out.println("Capture ids: " + response.result().id());
|
||||
System.out.println("Links: ");
|
||||
for (com.paypal.payments.LinkDescription link : response.result().links()) {
|
||||
System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method());
|
||||
}
|
||||
System.out.println("Full response body:");
|
||||
System.out.println(new JSONObject(new Json().serialize(response.result())).toString(4));
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 申请退款
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean refundOrder(String orderId, String reason) throws IOException {
|
||||
|
||||
RefundInfo refundByOrderNo = refundsInfoService.createRefundByOrderNo(orderId, reason);
|
||||
|
||||
OrdersGetRequest ordersGetRequest = new OrdersGetRequest(orderId);
|
||||
PayPalClient payPalClient = new PayPalClient();
|
||||
HttpResponse<com.paypal.orders.Order> ordersGetResponse = null;
|
||||
ordersGetRequest.authorization("Bearer " + getOAuth());
|
||||
boolean result;
|
||||
try {
|
||||
ordersGetResponse = payPalClient.client(mode, clientId, clientSecret).execute(ordersGetRequest);
|
||||
} catch (Exception e) {
|
||||
log.error("调用paypal订单查询失败,失败原因 ===> {}", e.getMessage());
|
||||
throw new BusinessException("Order query failed");
|
||||
}
|
||||
String captureId = ordersGetResponse.result().purchaseUnits().get(0).payments().captures().get(0).id();
|
||||
CapturesRefundRequest request = new CapturesRefundRequest(captureId);
|
||||
request.authorization("Bearer " + getOAuth());
|
||||
request.prefer("return=representation");
|
||||
|
||||
OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderId);
|
||||
request.requestBody(buildRefundRequestBody(String.valueOf(orderInfo.getTotalFee()), reason));
|
||||
HttpResponse<com.paypal.payments.Refund> response = null;
|
||||
try {
|
||||
response = payPalClient.client(mode, clientId, clientSecret).execute(request);
|
||||
} catch (IOException e) {
|
||||
log.error("调用paypal退款申请失败,失败原因 {}", e.getMessage());
|
||||
throw new BusinessException("Request for refund failed");
|
||||
}
|
||||
|
||||
log.info("Status Code = {}, Status = {}, RefundID = {}", response.statusCode(), response.result().status(), response.result().id());
|
||||
if ("COMPLETED".equals(response.result().status())) {
|
||||
//进行数据库操作,修改状态为已退款(配合回调和退款查询确定退款成功)
|
||||
|
||||
//更新订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.REFUND_SUCCESS);
|
||||
|
||||
refundsInfoService.updateRefundForPayPal(
|
||||
refundByOrderNo.getId(),
|
||||
response.result().id(),
|
||||
new Gson().toJson(response.result(), com.paypal.payments.Refund.class),
|
||||
AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功
|
||||
|
||||
// 更新积分状态
|
||||
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderId);
|
||||
creditsService.creditsRefund(orderByOrderNo.getAccountId(), orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue()));
|
||||
log.info("退款成功");
|
||||
result = Boolean.TRUE;
|
||||
} else {
|
||||
//更新订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.REFUND_ABNORMAL);
|
||||
|
||||
//更新退款单
|
||||
refundsInfoService.updateRefundForPayPal(
|
||||
refundByOrderNo.getId(),
|
||||
response.result().id(),
|
||||
new Gson().toJson(response.result(), com.paypal.payments.Refund.class),
|
||||
AliPayTradeStateEnum.REFUND_ERROR.getType()); //退款失败
|
||||
result = Boolean.FALSE;
|
||||
}
|
||||
for (com.paypal.payments.LinkDescription link : response.result().links()) {
|
||||
log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method());
|
||||
}
|
||||
String json = new JSONObject(new Json().serialize(response.result())).toString(4);
|
||||
log.info("refundOrder response body: {}", json);
|
||||
return result;
|
||||
}
|
||||
|
||||
public RefundRequest buildRefundRequestBody(String price, String reason) {
|
||||
RefundRequest refundRequest = new RefundRequest();
|
||||
com.paypal.payments.Money money = new com.paypal.payments.Money();
|
||||
money.currencyCode(CurrencyCodesEnum.HONG_KONG_DOLLAR.getCode());
|
||||
money.value(price);
|
||||
refundRequest.amount(money);
|
||||
// refundRequest.invoiceId("P2020052514440001");
|
||||
refundRequest.noteToPayer(reason);
|
||||
try {
|
||||
log.info("refund order body : {}", Convert.toStr(new Json().serialize(refundRequest)));
|
||||
} catch (SerializeException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
return refundRequest;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询退款
|
||||
*/
|
||||
public String queryRefund(String orderNo) throws IOException {
|
||||
RefundsGetRequest request = new RefundsGetRequest("退款id RefundOrder生成");
|
||||
HttpResponse<com.paypal.payments.Refund> response = payPalClient.client(mode, clientId, clientSecret).execute(request);
|
||||
System.out.println("Status Code: " + response.statusCode());
|
||||
System.out.println("Status: " + response.result().status());
|
||||
System.out.println("Refund Id: " + response.result().id());
|
||||
System.out.println("Links: ");
|
||||
for (com.paypal.payments.LinkDescription link : response.result().links()) {
|
||||
System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method());
|
||||
}
|
||||
System.out.println("Full response body:");
|
||||
System.out.println(new JSONObject(new Json().serialize(response.result())).toString(4));
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getOAuth() {
|
||||
// 1、判断缓存区是否有该token
|
||||
Boolean hasKey = redisUtil.hasKey(PAYPAL_TOKEN_KEY);
|
||||
if (hasKey) {
|
||||
return redisUtil.getFromString(PAYPAL_TOKEN_KEY);
|
||||
// return "A21AAKnpozur9r9omqQ2ge5aXHBBdEERi5F8FIgNYOjhhO2N7rjmkz2irh2lScpBO3s3Cqukw3eZkpYZ4YWE7rIacjv7MHmow";
|
||||
}
|
||||
|
||||
// 2、无或者过期,重新获取token,返回
|
||||
AuthenticationRequest authenticationRequest = new AuthenticationRequest();
|
||||
authenticationRequest.authorization(clientId, clientSecret);
|
||||
try {
|
||||
HttpResponse<HashMap> authResult = payPalClient.client(mode, clientId, clientSecret).execute(authenticationRequest);
|
||||
String accessToken = authResult.result().get("access_token").toString();
|
||||
long expiresIn = Long.parseLong(authResult.result().get("expires_in").toString());
|
||||
// 3、存redis
|
||||
redisUtil.addToString(PAYPAL_TOKEN_KEY, accessToken, expiresIn);
|
||||
return accessToken;
|
||||
} catch (IOException e) {
|
||||
log.error("获取paypal token失败,失败原因 ===> {}", e.getMessage());
|
||||
throw new BusinessException(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 处理当前订单
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void processOrder(String orderId) {
|
||||
// 1、确定当前订单是否已经被扣款
|
||||
OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderId);
|
||||
if (orderInfo.getOrderStatus().equals(OrderStatusEnum.SUCCESS.getType())) {
|
||||
// 直接返回
|
||||
return;
|
||||
}
|
||||
// 发起扣款请求
|
||||
Order capturedOrder = captureOrder(orderId);
|
||||
// 业务处理
|
||||
if (PayPalOrderStatusEnum.COMPLETED.getStatus().equals(capturedOrder.status())) {
|
||||
//更新订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.SUCCESS);
|
||||
//记录支付日志
|
||||
paymentInfoService.createPaymentInfoForPayPal(capturedOrder);
|
||||
// 添加积分变更记录
|
||||
creditsService.insertToCreditsDetail(orderInfo.getAccountId(),
|
||||
CreditsEventsEnum.BUY_CREDITS.getName() + "--PayPal",
|
||||
CreditsEventsEnum.BUY_CREDITS.getValue(),
|
||||
"positive");
|
||||
// 更新积分
|
||||
creditsService.buyCredits(orderInfo.getAccountId(), orderInfo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkOrderStatus(String orderNo) throws SerializeException {
|
||||
|
||||
log.warn("根据订单号核实订单状态 ===> {}", orderNo);
|
||||
|
||||
Order result = this.queryOrder(orderNo);
|
||||
|
||||
// 订单未创建 | 订单异常 | 订单创建过但未支付
|
||||
if(result == null || PayPalOrderStatusEnum.CREATED.getStatus().equals(result.status())){
|
||||
log.warn("核实订单未创建 ===> {}", orderNo);
|
||||
//更新本地订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED);
|
||||
return ;
|
||||
}
|
||||
|
||||
// 解析查单响应结果
|
||||
String tradeStatus = result.status();
|
||||
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
|
||||
|
||||
// 支付了,但还没完成
|
||||
if(PayPalOrderStatusEnum.APPROVED.getStatus().equals(tradeStatus)){
|
||||
log.warn("核实订单未支付 ===> {}", orderNo);
|
||||
// 更新商户端订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.ORDER_PROCESSING);
|
||||
}
|
||||
|
||||
if(PayPalOrderStatusEnum.COMPLETED.getStatus().equals(tradeStatus)){
|
||||
log.warn("核实订单已支付 ===> {}", orderNo);
|
||||
//如果订单已支付,则更新商户端订单状态
|
||||
orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS);
|
||||
//并记录支付日志
|
||||
paymentInfoService.createPaymentInfoForPayPal(result);
|
||||
// 添加积分变更记录
|
||||
creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(),
|
||||
CreditsEventsEnum.BUY_CREDITS.getName() + "--Paypal",
|
||||
CreditsEventsEnum.BUY_CREDITS.getValue(),
|
||||
"positive");
|
||||
// 更新积分
|
||||
creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue()));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
114
src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java
Normal file
114
src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java
Normal file
@@ -0,0 +1,114 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.enums.PayTypeEnum;
|
||||
import com.ai.da.mapper.primary.PaymentInfoMapper;
|
||||
import com.ai.da.mapper.primary.entity.PaymentInfo;
|
||||
import com.ai.da.service.PaymentInfoService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.gson.Gson;
|
||||
import com.paypal.orders.Order;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, PaymentInfo> implements PaymentInfoService {
|
||||
|
||||
/**
|
||||
* 记录支付日志:微信支付
|
||||
* @param plainText
|
||||
*/
|
||||
@Override
|
||||
public void createPaymentInfo(String plainText) {
|
||||
|
||||
log.info("记录支付日志");
|
||||
|
||||
Gson gson = new Gson();
|
||||
HashMap plainTextMap = gson.fromJson(plainText, HashMap.class);
|
||||
|
||||
//订单号
|
||||
String orderNo = (String)plainTextMap.get("out_trade_no");
|
||||
//业务编号
|
||||
String transactionId = (String)plainTextMap.get("transaction_id");
|
||||
//支付类型
|
||||
String tradeType = (String)plainTextMap.get("trade_type");
|
||||
//交易状态
|
||||
String tradeState = (String)plainTextMap.get("trade_state");
|
||||
//用户实际支付金额
|
||||
Map<String, Object> amount = (Map)plainTextMap.get("amount");
|
||||
Integer payerTotal = ((Double) amount.get("payer_total")).intValue();
|
||||
|
||||
PaymentInfo paymentInfo = new PaymentInfo();
|
||||
paymentInfo.setOrderNo(orderNo);
|
||||
paymentInfo.setPaymentType(PayTypeEnum.WXPAY.getType());
|
||||
paymentInfo.setTransactionId(transactionId);
|
||||
paymentInfo.setTradeType(tradeType);
|
||||
paymentInfo.setTradeState(tradeState);
|
||||
paymentInfo.setPayerTotal(payerTotal);
|
||||
paymentInfo.setContent(plainText);
|
||||
|
||||
baseMapper.insert(paymentInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录支付日志:支付宝
|
||||
* @param params
|
||||
*/
|
||||
@Override
|
||||
public void createPaymentInfoForAliPay(Map<String, String> params) {
|
||||
|
||||
log.info("记录支付日志");
|
||||
|
||||
//获取订单号
|
||||
String orderNo = params.get("out_trade_no");
|
||||
//业务编号
|
||||
String transactionId = params.get("trade_no");
|
||||
//交易状态
|
||||
String tradeStatus = params.get("trade_status");
|
||||
//交易金额
|
||||
String totalAmount = params.get("total_amount");
|
||||
// int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue();
|
||||
int totalAmountInt = new BigDecimal(totalAmount).intValue();
|
||||
|
||||
PaymentInfo paymentInfo = new PaymentInfo();
|
||||
paymentInfo.setOrderNo(orderNo);
|
||||
paymentInfo.setPaymentType(PayTypeEnum.ALIPAY.getType());
|
||||
paymentInfo.setTransactionId(transactionId);
|
||||
paymentInfo.setTradeType("电脑网站支付");
|
||||
paymentInfo.setTradeState(tradeStatus);
|
||||
paymentInfo.setPayerTotal(totalAmountInt);
|
||||
|
||||
Gson gson = new Gson();
|
||||
String json = gson.toJson(params, HashMap.class);
|
||||
paymentInfo.setContent(json);
|
||||
|
||||
baseMapper.insert(paymentInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createPaymentInfoForPayPal(Order order) {
|
||||
|
||||
log.info("记录支付日志");
|
||||
|
||||
// int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue();
|
||||
int totalAmountInt = new BigDecimal(order.purchaseUnits().get(0).payments().captures().get(0).amount().value()).intValue();
|
||||
|
||||
PaymentInfo paymentInfo = new PaymentInfo();
|
||||
paymentInfo.setOrderNo(order.id());
|
||||
paymentInfo.setPaymentType(PayTypeEnum.PAYPAL.getType());
|
||||
paymentInfo.setTransactionId(order.id());
|
||||
paymentInfo.setTradeType("电脑网站支付");
|
||||
paymentInfo.setTradeState(order.status());
|
||||
paymentInfo.setPayerTotal(totalAmountInt);
|
||||
|
||||
Gson gson = new Gson();
|
||||
String json = gson.toJson(order, Order.class);
|
||||
paymentInfo.setContent(json);
|
||||
|
||||
baseMapper.insert(paymentInfo);
|
||||
}
|
||||
}
|
||||
12
src/main/java/com/ai/da/service/impl/ProductServiceImpl.java
Normal file
12
src/main/java/com/ai/da/service/impl/ProductServiceImpl.java
Normal file
@@ -0,0 +1,12 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.primary.ProductMapper;
|
||||
import com.ai.da.mapper.primary.entity.Product;
|
||||
import com.ai.da.service.ProductService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
|
||||
|
||||
}
|
||||
@@ -2,8 +2,8 @@ package com.ai.da.service.impl;
|
||||
|
||||
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.mapper.PythonTAllInfoMapper;
|
||||
import com.ai.da.mapper.entity.PythonTAllInfo;
|
||||
import com.ai.da.mapper.primary.PythonTAllInfoMapper;
|
||||
import com.ai.da.mapper.primary.entity.PythonTAllInfo;
|
||||
import com.ai.da.service.PythonTAllInfoService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
|
||||
@@ -27,10 +27,14 @@ public class RabbitMQServiceImpl implements RabbitMQService {
|
||||
private MQPublisher mqPublisher;
|
||||
|
||||
@Override
|
||||
public void publishMessage(String message) {
|
||||
public void publishMessageToGenerate(String message) {
|
||||
mqPublisher.sendGenerateMessage(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void publishMessageToSR(String message) {
|
||||
mqPublisher.sendSRMessage(message);
|
||||
}
|
||||
@Override
|
||||
public Integer getMessageCount(String queueUrl) {
|
||||
|
||||
|
||||
173
src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java
Normal file
173
src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java
Normal file
@@ -0,0 +1,173 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.utils.OrderNoUtils;
|
||||
import com.ai.da.mapper.primary.RefundInfoMapper;
|
||||
import com.ai.da.mapper.primary.entity.OrderInfo;
|
||||
import com.ai.da.mapper.primary.entity.RefundInfo;
|
||||
import com.ai.da.service.OrderInfoService;
|
||||
import com.ai.da.service.RefundInfoService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.gson.Gson;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class RefundInfoServiceImpl extends ServiceImpl<RefundInfoMapper, RefundInfo> implements RefundInfoService {
|
||||
|
||||
@Resource
|
||||
private OrderInfoService orderInfoService;
|
||||
|
||||
/**
|
||||
* 根据订单号创建退款订单
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public RefundInfo createRefundByOrderNo(String orderNo, String reason) {
|
||||
|
||||
//根据订单号获取订单信息
|
||||
OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo);
|
||||
|
||||
//根据订单号生成退款订单
|
||||
RefundInfo refundInfo = new RefundInfo();
|
||||
refundInfo.setOrderNo(orderNo);//订单编号
|
||||
refundInfo.setRefundNo(OrderNoUtils.getRefundNo());//退款单编号
|
||||
refundInfo.setTotalFee(orderInfo.getTotalFee());//原订单金额(元)
|
||||
refundInfo.setRefund(orderInfo.getTotalFee());//退款金额(元)
|
||||
refundInfo.setReason(reason);//退款原因
|
||||
|
||||
//保存退款订单
|
||||
baseMapper.insert(refundInfo);
|
||||
|
||||
return refundInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录退款记录
|
||||
* @param content
|
||||
*/
|
||||
@Override
|
||||
public void updateRefund(String content) {
|
||||
|
||||
//将json字符串转换成Map
|
||||
Gson gson = new Gson();
|
||||
Map<String, String> resultMap = gson.fromJson(content, HashMap.class);
|
||||
|
||||
//根据退款单编号修改退款单
|
||||
QueryWrapper<RefundInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("refund_no", resultMap.get("out_refund_no"));
|
||||
|
||||
//设置要修改的字段
|
||||
RefundInfo refundInfo = new RefundInfo();
|
||||
refundInfo.setRefundId(resultMap.get("refund_id"));//微信支付退款单号
|
||||
|
||||
//查询退款和申请退款中的返回参数
|
||||
if(resultMap.get("status") != null){
|
||||
refundInfo.setRefundStatus(resultMap.get("status"));//退款状态
|
||||
refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段
|
||||
}
|
||||
//退款回调中的回调参数
|
||||
if(resultMap.get("refund_status") != null){
|
||||
refundInfo.setRefundStatus(resultMap.get("refund_status"));//退款状态
|
||||
refundInfo.setContentNotify(content);//将全部响应结果存入数据库的content字段
|
||||
}
|
||||
|
||||
//更新退款单
|
||||
baseMapper.update(refundInfo, queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 找出申请退款超过minutes分钟并且未成功的退款单
|
||||
* @param minutes
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<RefundInfo> getNoRefundOrderByDuration(int minutes) {
|
||||
|
||||
//minutes分钟之前的时间
|
||||
Instant instant = Instant.now().minus(Duration.ofMinutes(minutes));
|
||||
|
||||
QueryWrapper<RefundInfo> queryWrapper = new QueryWrapper<>();
|
||||
// queryWrapper.eq("refund_status", WxRefundStatus.PROCESSING.getType());
|
||||
queryWrapper.le("create_time", instant);
|
||||
List<RefundInfo> refundInfoList = baseMapper.selectList(queryWrapper);
|
||||
return refundInfoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据订单号创建退款订单
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public RefundInfo createRefundByOrderNoForAliPay(String orderNo, String reason) {
|
||||
|
||||
//根据订单号获取订单信息
|
||||
OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo);
|
||||
|
||||
//根据订单号生成退款订单
|
||||
RefundInfo refundInfo = new RefundInfo();
|
||||
refundInfo.setOrderNo(orderNo);//订单编号
|
||||
refundInfo.setRefundNo(OrderNoUtils.getRefundNo());//退款单编号
|
||||
|
||||
refundInfo.setTotalFee(orderInfo.getTotalFee());//原订单金额(元)
|
||||
refundInfo.setRefund(orderInfo.getTotalFee());//退款金额(元)
|
||||
refundInfo.setReason(reason);//退款原因
|
||||
|
||||
//保存退款订单
|
||||
baseMapper.insert(refundInfo);
|
||||
|
||||
return refundInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新退款记录
|
||||
* @param refundNo
|
||||
* @param content
|
||||
* @param refundStatus
|
||||
*/
|
||||
@Override
|
||||
public void updateRefundForAliPay(String refundNo, String content, String refundStatus) {
|
||||
|
||||
//根据退款单编号修改退款单
|
||||
QueryWrapper<RefundInfo> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("refund_no", refundNo);
|
||||
|
||||
//设置要修改的字段
|
||||
RefundInfo refundInfo = new RefundInfo();
|
||||
refundInfo.setRefundStatus(refundStatus);//退款状态
|
||||
refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段
|
||||
|
||||
//更新退款单
|
||||
baseMapper.update(refundInfo, queryWrapper);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRefundForPayPal(Long id, String refundId,String content, String refundStatus) {
|
||||
|
||||
//根据退款单编号修改退款单
|
||||
// QueryWrapper<RefundInfo> queryWrapper = new QueryWrapper<>();
|
||||
// queryWrapper.eq("order_no", orderNo);
|
||||
|
||||
//设置要修改的字段
|
||||
RefundInfo refundInfo = new RefundInfo();
|
||||
refundInfo.setId(id);
|
||||
refundInfo.setRefundNo(null);
|
||||
refundInfo.setRefundId(refundId);
|
||||
refundInfo.setRefundStatus(refundStatus);//退款状态
|
||||
refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段
|
||||
|
||||
//更新退款单
|
||||
// baseMapper.update(refundInfo, queryWrapper);
|
||||
baseMapper.updateById(refundInfo);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.constant.CommonConstant;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.common.utils.RedisUtil;
|
||||
import com.ai.da.mapper.primary.TaskListMapper;
|
||||
import com.ai.da.mapper.primary.entity.TaskList;
|
||||
import com.ai.da.model.dto.QueryTaskHistoryDTO;
|
||||
import com.ai.da.model.dto.SuperResolutionDTO;
|
||||
import com.ai.da.model.dto.TaskDTO;
|
||||
import com.ai.da.python.PythonService;
|
||||
import com.ai.da.service.CreditsService;
|
||||
import com.ai.da.service.RabbitMQService;
|
||||
import com.ai.da.service.SuperResolutionService;
|
||||
import com.ai.da.service.TaskListService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class SuperResolutionServiceImpl extends ServiceImpl<TaskListMapper, TaskList> implements SuperResolutionService {
|
||||
|
||||
public static final Integer creditsConsumption = 100;
|
||||
|
||||
@Resource
|
||||
private CreditsService creditsService;
|
||||
@Resource
|
||||
private RabbitMQService rabbitMQService;
|
||||
@Resource
|
||||
private PythonService pythonService;
|
||||
|
||||
@Resource
|
||||
private TaskListService taskListService;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Value("${redis.key.orderForSR}")
|
||||
private String orderForSR;
|
||||
|
||||
@Value("${minio.bucketName.users}")
|
||||
private String usersBucket;
|
||||
|
||||
@Value("${minio.endpoint}")
|
||||
private String endpoint;
|
||||
|
||||
@Value("${redis.key.credits.pre-deduction}")
|
||||
private String creditsDeduction;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public List<String> prepareForSR(List<SuperResolutionDTO> superResolutionDTOList) {
|
||||
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
// 1、判断用户当前积分是否够本次超分消耗
|
||||
Boolean preDeduction = creditsService.creditsPreDeduction(CreditsEventsEnum.SUPER_RESOLUTION, superResolutionDTOList.size());
|
||||
if (!preDeduction) {
|
||||
throw new BusinessException("Not enough Credits");
|
||||
}
|
||||
|
||||
ArrayList<String> uuidList = new ArrayList<>();
|
||||
for (SuperResolutionDTO superResolutionDTO : superResolutionDTOList) {
|
||||
// todo 校验倍率是否是2的幂次(前端已做)
|
||||
|
||||
// 2、生成唯一id 使用uuid 由于uuid重复的几率很小很小,故这里取消验证uuid是否已存在
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
uuid += "-" + accountId;
|
||||
uuidList.add(uuid);
|
||||
|
||||
// 3、截取minio地址 (前提是该url是由minio地址转换来的)
|
||||
String inputString = superResolutionDTO.getImages();
|
||||
String replace = inputString.replace(endpoint + "/", "");
|
||||
String minioPath = replace.substring(0, replace.indexOf("?"));
|
||||
// log.info(minioPath);
|
||||
superResolutionDTO.setImages(minioPath);
|
||||
|
||||
superResolutionDTO.setUniqueId(uuid);
|
||||
String jsonString = JSON.toJSONString(superResolutionDTO);
|
||||
|
||||
// 4、将数据存到数据库
|
||||
TaskList taskList = new TaskList();
|
||||
taskList.setAccountId(accountId);
|
||||
taskList.setTaskType("SR");
|
||||
taskList.setInputUrl(superResolutionDTO.getImages());
|
||||
taskList.setScale(superResolutionDTO.getScale());
|
||||
taskList.setStatus("Waiting");
|
||||
taskList.setTaskId(superResolutionDTO.getUniqueId());
|
||||
taskList.setCreateTime(LocalDateTime.now());
|
||||
|
||||
baseMapper.insert(taskList);
|
||||
|
||||
// 5、添加当前任务的预扣积分到redis 任务有效期一天,若待扣积分两天还没被移除,说明任务已经失败,待扣积分自动失效
|
||||
redisUtil.addToString(creditsDeduction + ":" + accountId + ":" + uuid, CreditsEventsEnum.SUPER_RESOLUTION.getValue(), CommonConstant.CREDITS_EXPIRE_TIME);
|
||||
|
||||
// 6、加入任务列表 设置状态为 等待中
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
String name = superResolutionDTO.getImages();
|
||||
taskListService.addToTaskListRedis(new TaskDTO<>(uuid, "SR", name.substring(name.lastIndexOf("/") + 1), superResolutionDTO, "Waiting", LocalDateTime.now().format(dateTimeFormatter)));
|
||||
|
||||
// 7、将消息发布到MQ消息队列
|
||||
log.info("发送消息到SR_QUEUE,参数 :{}", jsonString);
|
||||
rabbitMQService.publishMessageToSR(jsonString);
|
||||
}
|
||||
|
||||
// 8、返回唯一id列表
|
||||
return uuidList;
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public void SR(SuperResolutionDTO superResolutionDTO) throws Exception {
|
||||
// 1、向模型发起请求
|
||||
pythonService.superResolution(superResolutionDTO);
|
||||
|
||||
// 2、更新状态
|
||||
updateSROutput(superResolutionDTO.getUniqueId(), "Executing", null);
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public void setSRResult(String taskId, String output, String status) {
|
||||
Long accountId = Long.parseLong(taskId.substring(taskId.lastIndexOf("-") + 1));
|
||||
// 获取结果后更新
|
||||
updateSROutput(taskId, status, output);
|
||||
|
||||
if ("success".equals(status)) {
|
||||
// 3、记录积分变更
|
||||
creditsService.insertToCreditsDetail(accountId,
|
||||
CreditsEventsEnum.SUPER_RESOLUTION.getName(),
|
||||
CreditsEventsEnum.SUPER_RESOLUTION.getValue(),
|
||||
"negative");
|
||||
// 4、扣除积分
|
||||
creditsService.taskCreditsDeduction(accountId, taskId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateSROutput(String taskId, String status, String output) {
|
||||
UpdateWrapper<TaskList> uw = new UpdateWrapper<>();
|
||||
uw.eq("task_id", taskId);
|
||||
|
||||
uw.set("output_url", output);
|
||||
uw.set("status", status);
|
||||
baseMapper.update(null, uw);
|
||||
|
||||
}
|
||||
|
||||
// 分页查询
|
||||
@Override
|
||||
public PageBaseResponse<TaskList> getTaskHistoryPage(QueryTaskHistoryDTO queryTaskHistoryDTO) {
|
||||
QueryWrapper<TaskList> qw = new QueryWrapper<>();
|
||||
qw.eq("account_id", UserContext.getUserHolder().getId());
|
||||
|
||||
String startTime = queryTaskHistoryDTO.getStartTime();
|
||||
String endTime = queryTaskHistoryDTO.getEndTime();
|
||||
if (StringUtil.isNullOrEmpty(startTime)) {
|
||||
startTime = "2024-03-01 00:00:00";
|
||||
}
|
||||
if (StringUtil.isNullOrEmpty(endTime)) {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
endTime = now.format(dateTimeFormatter);
|
||||
}
|
||||
|
||||
qw.between("create_time", startTime, endTime);
|
||||
qw.orderByDesc("create_time");
|
||||
Page<TaskList> pageInfo = new Page<>(queryTaskHistoryDTO.getPage(), queryTaskHistoryDTO.getSize());
|
||||
Page<TaskList> orderInfo = baseMapper.selectPage(pageInfo, qw);
|
||||
if (CollectionUtils.isEmpty(orderInfo.getRecords())) {
|
||||
return PageBaseResponse.success(new Page<>());
|
||||
}
|
||||
|
||||
return PageBaseResponse.success(orderInfo);
|
||||
}
|
||||
}
|
||||
@@ -6,8 +6,8 @@ import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.enums.SysFileLevel1TypeEnum;
|
||||
import com.ai.da.common.enums.SysFileLevel2TypeEnum;
|
||||
import com.ai.da.common.utils.*;
|
||||
import com.ai.da.mapper.SysFileMapper;
|
||||
import com.ai.da.mapper.entity.SysFile;
|
||||
import com.ai.da.mapper.primary.SysFileMapper;
|
||||
import com.ai.da.mapper.primary.entity.SysFile;
|
||||
import com.ai.da.model.vo.SysFileVO;
|
||||
import com.ai.da.service.SysFileService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.TCollectionElementRelationMapper;
|
||||
import com.ai.da.mapper.UserLikeMapper;
|
||||
import com.ai.da.mapper.entity.TCollectionElementRelation;
|
||||
import com.ai.da.mapper.entity.UserLike;
|
||||
import com.ai.da.mapper.primary.TCollectionElementRelationMapper;
|
||||
import com.ai.da.mapper.primary.entity.TCollectionElementRelation;
|
||||
import com.ai.da.service.TCollectionElementRelationService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.ai.da.common.enums.LayersPriorityEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.TDesignPythonOutfitDetailMapper;
|
||||
import com.ai.da.mapper.entity.TDesignPythonOutfitDetail;
|
||||
import com.ai.da.mapper.primary.TDesignPythonOutfitDetailMapper;
|
||||
import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail;
|
||||
import com.ai.da.model.vo.DesignPythonOutfitVO;
|
||||
import com.ai.da.model.vo.TDesignPythonOutfitDetailVO;
|
||||
import com.ai.da.service.ITDesignPythonOutfitDetailService;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.TDesignPythonOutfitMapper;
|
||||
import com.ai.da.mapper.entity.TDesignPythonOutfit;
|
||||
import com.ai.da.mapper.primary.TDesignPythonOutfitMapper;
|
||||
import com.ai.da.mapper.primary.entity.TDesignPythonOutfit;
|
||||
import com.ai.da.model.vo.TDesignPythonOutfitVO;
|
||||
import com.ai.da.service.ITDesignPythonOutfitService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
124
src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java
Normal file
124
src/main/java/com/ai/da/service/impl/TaskListServiceImpl.java
Normal file
@@ -0,0 +1,124 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.constant.CommonConstant;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.common.utils.RedisUtil;
|
||||
import com.ai.da.mapper.primary.TaskListMapper;
|
||||
import com.ai.da.mapper.primary.entity.TaskList;
|
||||
import com.ai.da.model.dto.QueryTaskHistoryDTO;
|
||||
import com.ai.da.model.dto.SuperResolutionDTO;
|
||||
import com.ai.da.model.dto.TaskDTO;
|
||||
import com.ai.da.model.vo.TaskVO;
|
||||
import com.ai.da.service.SuperResolutionService;
|
||||
import com.ai.da.service.TaskListService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.lang.reflect.Type;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> implements TaskListService {
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Value("${redis.key.taskList}")
|
||||
private String taskListKey;
|
||||
|
||||
@Resource
|
||||
private MinioUtil minioUtil;
|
||||
|
||||
@Resource
|
||||
private SuperResolutionService superResolutionService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public List<TaskDTO<SuperResolutionDTO>> getExecTask(List<String> taskIdList) {
|
||||
Long id = UserContext.getUserHolder().getId();
|
||||
// Set<String> keys = redisUtil.getKeysFromString(taskListKey + ":" + id + ":*");
|
||||
ArrayList<TaskDTO<SuperResolutionDTO>> taskDTOS = new ArrayList<>();
|
||||
taskIdList.forEach(taskId -> {
|
||||
String taskDetail = redisUtil.getFromString(taskListKey + ":" + id + ":" + taskId);
|
||||
Gson gson = new Gson();
|
||||
Type type = new TypeToken<TaskDTO<SuperResolutionDTO>>() {
|
||||
}.getType();
|
||||
TaskDTO<SuperResolutionDTO> taskDTO = gson.fromJson(taskDetail, type);
|
||||
if (Objects.isNull(taskDTO)) {
|
||||
// 未执行成功的taskId在redis被删除,将该条数据在db中的状态改为失败
|
||||
superResolutionService.updateSROutput(taskId, "fail", null);
|
||||
taskDTOS.add(new TaskDTO<>());
|
||||
} else {
|
||||
SuperResolutionDTO inputParam = taskDTO.getInputParam();
|
||||
inputParam.setImages(minioUtil.getPresignedUrl(inputParam.getImages(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
taskDTO.setOutputImage(StringUtil.isNullOrEmpty(taskDTO.getOutputImage()) ? null : minioUtil.getPresignedUrl(taskDTO.getOutputImage(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
taskDTOS.add(taskDTO);
|
||||
}
|
||||
});
|
||||
return taskDTOS;
|
||||
}
|
||||
|
||||
public void addToTaskListRedis(TaskDTO<SuperResolutionDTO> taskDTO) {
|
||||
String key = taskListKey + ":" + UserContext.getUserHolder().getId() + ":" + taskDTO.getTaskId();
|
||||
redisUtil.addToString(key, new Gson().toJson(taskDTO), CommonConstant.TASK_EXPIRE_TIME);
|
||||
}
|
||||
|
||||
// 3、更新任务状态
|
||||
@Override
|
||||
public void updateTaskStatusOrOutputRedis(String taskId, String status, String output) {
|
||||
String key = taskListKey + ":" + taskId.substring(taskId.lastIndexOf("-") + 1) + ":" + taskId;
|
||||
String taskDetail = redisUtil.getFromString(key);
|
||||
Gson gson = new Gson();
|
||||
Type type = new TypeToken<TaskDTO<SuperResolutionDTO>>() {
|
||||
}.getType();
|
||||
TaskDTO<SuperResolutionDTO> taskDTO = gson.fromJson(taskDetail, type);
|
||||
taskDTO.setStatus(status);
|
||||
if (!StringUtil.isNullOrEmpty(output)) {
|
||||
taskDTO.setOutputImage(output);
|
||||
}
|
||||
Long expire = redisUtil.getExpire(key);
|
||||
redisUtil.addToString(key, new Gson().toJson(taskDTO), expire);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageBaseResponse<TaskVO> getAllTask(QueryTaskHistoryDTO queryTaskHistoryDTO) {
|
||||
PageBaseResponse<TaskVO> response = new PageBaseResponse<>();
|
||||
ArrayList<TaskVO> taskLists = new ArrayList<>();
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
switch (queryTaskHistoryDTO.getType()) {
|
||||
case "SR":
|
||||
PageBaseResponse<TaskList> taskHistoryPage = superResolutionService.getTaskHistoryPage(queryTaskHistoryDTO);
|
||||
List<TaskList> srHistory = taskHistoryPage.getContent();
|
||||
srHistory.forEach(s -> {
|
||||
// 成功失败的都返回
|
||||
TaskVO task = new TaskVO();
|
||||
task.setImageName(s.getInputUrl().substring(s.getInputUrl().lastIndexOf("/") + 1));
|
||||
task.setInputImage(minioUtil.getPresignedUrl(s.getInputUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
task.setOutputImage(StringUtil.isNullOrEmpty(s.getOutputUrl()) ? null : minioUtil.getPresignedUrl(s.getOutputUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
task.setStatus(s.getStatus());
|
||||
task.setTaskId(s.getTaskId());
|
||||
task.setCreateDate(s.getCreateTime().format(dateTimeFormatter));
|
||||
task.setOtherInput("×" + s.getScale());
|
||||
taskLists.add(task);
|
||||
});
|
||||
BeanUtils.copyProperties(taskHistoryPage, response);
|
||||
response.setContent(taskLists);
|
||||
break;
|
||||
case "GENERATE":
|
||||
log.info("未知任务类型--GENERATE");
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
@@ -4,12 +4,10 @@ import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.utils.DateUtil;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.*;
|
||||
import com.ai.da.mapper.entity.Design;
|
||||
import com.ai.da.mapper.entity.TDesignPythonOutfit;
|
||||
import com.ai.da.mapper.entity.UserLike;
|
||||
import com.ai.da.mapper.entity.UserLikeGroup;
|
||||
import com.ai.da.model.enums.ModelType;
|
||||
import com.ai.da.mapper.primary.*;
|
||||
import com.ai.da.mapper.primary.entity.TDesignPythonOutfit;
|
||||
import com.ai.da.mapper.primary.entity.UserLike;
|
||||
import com.ai.da.mapper.primary.entity.UserLikeGroup;
|
||||
import com.ai.da.model.vo.*;
|
||||
import com.ai.da.service.AccountService;
|
||||
import com.ai.da.service.CollectionService;
|
||||
|
||||
@@ -2,10 +2,8 @@ package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.DateUtil;
|
||||
import com.ai.da.mapper.UserLikeMapper;
|
||||
import com.ai.da.mapper.entity.Collection;
|
||||
import com.ai.da.mapper.entity.DesignItem;
|
||||
import com.ai.da.mapper.entity.UserLike;
|
||||
import com.ai.da.mapper.primary.UserLikeMapper;
|
||||
import com.ai.da.mapper.primary.entity.UserLike;
|
||||
import com.ai.da.model.vo.UserLikeVO;
|
||||
import com.ai.da.service.UserLikeService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
@@ -19,8 +17,6 @@ import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 服务实现类
|
||||
|
||||
@@ -3,22 +3,18 @@ package com.ai.da.service.impl;
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.LibraryLevel1TypeEnum;
|
||||
import com.ai.da.common.enums.SysFileLevel1TypeEnum;
|
||||
import com.ai.da.common.enums.SysFileLevel2TypeEnum;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.common.response.ResultEnum;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.FileUtil;
|
||||
import com.ai.da.common.utils.MD5Utils;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.LibraryMapper;
|
||||
import com.ai.da.mapper.SysFileMapper;
|
||||
import com.ai.da.mapper.UserLikeMapper;
|
||||
import com.ai.da.mapper.WorkspaceMapper;
|
||||
import com.ai.da.mapper.entity.Library;
|
||||
import com.ai.da.mapper.entity.SysFile;
|
||||
import com.ai.da.mapper.entity.UserLike;
|
||||
import com.ai.da.mapper.entity.Workspace;
|
||||
import com.ai.da.mapper.primary.LibraryMapper;
|
||||
import com.ai.da.mapper.primary.SysFileMapper;
|
||||
import com.ai.da.mapper.primary.WorkspaceMapper;
|
||||
import com.ai.da.mapper.primary.entity.Library;
|
||||
import com.ai.da.mapper.primary.entity.SysFile;
|
||||
import com.ai.da.mapper.primary.entity.Workspace;
|
||||
import com.ai.da.model.dto.WorkspaceDTO;
|
||||
import com.ai.da.model.enums.*;
|
||||
import com.ai.da.model.vo.AuthPrincipalVo;
|
||||
@@ -35,7 +31,6 @@ import org.apache.commons.fileupload.FileItemFactory;
|
||||
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@@ -47,7 +42,6 @@ import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
@@ -92,8 +86,8 @@ public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceMapper, Workspace
|
||||
// 防止前端传值修改标识
|
||||
workspace.setIsLastIndex(null);
|
||||
AuthPrincipalVo userInfo = UserContext.getUserHolder();
|
||||
workspace.setUserName(userInfo.getUsername());
|
||||
checkWorkspaceName(workspace.getId(), workspace.getWorkSpaceName(), userInfo.getUsername());
|
||||
workspace.setAccountId(userInfo.getId());
|
||||
checkWorkspaceName(workspace.getId(), workspace.getWorkSpaceName(), userInfo.getId());
|
||||
if (null == workspace.getId()) {
|
||||
workspace.setIsLastIndex(0);
|
||||
QueryWrapper<SysFile> systemFemaleQw = new QueryWrapper<>();
|
||||
@@ -129,11 +123,11 @@ public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceMapper, Workspace
|
||||
}
|
||||
}
|
||||
|
||||
private void checkWorkspaceName(Long id, String workSpaceName, String userName) {
|
||||
private void checkWorkspaceName(Long id, String workSpaceName, Long accountId) {
|
||||
QueryWrapper<Workspace> qw = new QueryWrapper<>();
|
||||
qw.lambda().ne(null != id, Workspace::getId, id);
|
||||
qw.lambda().eq(Workspace::getWorkSpaceName, workSpaceName);
|
||||
qw.lambda().eq(Workspace::getUserName, userName);
|
||||
qw.lambda().eq(Workspace::getAccountId, accountId);
|
||||
List<Workspace> workspaces = baseMapper.selectList(qw);
|
||||
if (!CollectionUtils.isEmpty(workspaces)) {
|
||||
throw new BusinessException("the.workspaceName.already.exists", ResultEnum.PROMPT.getCode());
|
||||
@@ -143,9 +137,9 @@ public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceMapper, Workspace
|
||||
@Override
|
||||
public WorkspaceVO getPage(WorkspaceDTO query) {
|
||||
WorkspaceVO vo = new WorkspaceVO();
|
||||
String userName = UserContext.getUserHolder().getUsername();
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
QueryWrapper<Workspace> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(Workspace::getUserName, userName);
|
||||
qw.lambda().eq(Workspace::getAccountId, accountId);
|
||||
IPage<Workspace> page = workspaceMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw);
|
||||
if (page.getTotal() == 0L) {
|
||||
// 给用户新建默认workspace
|
||||
@@ -154,7 +148,7 @@ public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceMapper, Workspace
|
||||
workspace.setSex(Sex.FEMALE.getValue());
|
||||
workspace.setSystemDesignerPercentage(SYSTEM_DESIGNER_PERCENTAGE);
|
||||
workspace.setPosition("Overall");
|
||||
workspace.setUserName(userName);
|
||||
workspace.setAccountId(accountId);
|
||||
QueryWrapper<SysFile> systemFemaleQw = new QueryWrapper<>();
|
||||
systemFemaleQw.lambda().eq(SysFile::getLevel1Type, "Models");
|
||||
systemFemaleQw.lambda().eq(SysFile::getLevel2Type, "Female");
|
||||
@@ -231,7 +225,7 @@ public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceMapper, Workspace
|
||||
);
|
||||
vo.setPage(PageBaseResponse.success(convert));
|
||||
QueryWrapper<Workspace> qwIsLastIndex = new QueryWrapper<>();
|
||||
qwIsLastIndex.lambda().eq(Workspace::getUserName, userName);
|
||||
qwIsLastIndex.lambda().eq(Workspace::getAccountId, accountId);
|
||||
qwIsLastIndex.lambda().eq(Workspace::getIsLastIndex, 1);
|
||||
qwIsLastIndex.last("limit 1");
|
||||
List<Workspace> workspaces = workspaceMapper.selectList(qwIsLastIndex);
|
||||
@@ -256,9 +250,9 @@ public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceMapper, Workspace
|
||||
|
||||
@Override
|
||||
public Workspace getByIdNew(Long id) {
|
||||
String userName = UserContext.getUserHolder().getUsername();
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
QueryWrapper<Workspace> qwOld = new QueryWrapper<>();
|
||||
qwOld.lambda().eq(Workspace::getUserName, userName);
|
||||
qwOld.lambda().eq(Workspace::getAccountId, accountId);
|
||||
qwOld.lambda().eq(Workspace::getIsLastIndex, 1);
|
||||
Workspace oldIsLastIndex = workspaceMapper.selectOne(qwOld);
|
||||
oldIsLastIndex.setIsLastIndex(0);
|
||||
|
||||
Reference in New Issue
Block a user