|
|
@@ -1,19 +1,23 @@
|
|
|
package com.izouma.nineth.service;
|
|
|
|
|
|
-import com.izouma.nineth.domain.ActivityCollection;
|
|
|
-import com.izouma.nineth.domain.ActivityOrder;
|
|
|
+import com.izouma.nineth.domain.*;
|
|
|
import com.izouma.nineth.dto.PageQuery;
|
|
|
+import com.izouma.nineth.enums.AssetStatus;
|
|
|
+import com.izouma.nineth.enums.OrderStatus;
|
|
|
import com.izouma.nineth.exception.BusinessException;
|
|
|
-import com.izouma.nineth.repo.ActivityCollectionRepo;
|
|
|
-import com.izouma.nineth.repo.ActivityOrderRepo;
|
|
|
+import com.izouma.nineth.repo.*;
|
|
|
import com.izouma.nineth.utils.JpaUtils;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.util.List;
|
|
|
import java.util.Optional;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
@AllArgsConstructor
|
|
|
public class ActivityOrderService {
|
|
|
@@ -21,23 +25,65 @@ public class ActivityOrderService {
|
|
|
private ActivityOrderRepo activityOrderRepo;
|
|
|
private ActivityCollectionRepo activityCollectionRepo;
|
|
|
private ActivityCollectionService activityCollectionService;
|
|
|
+ private AssetRepo assetRepo;
|
|
|
+ private OrderRepo orderRepo;
|
|
|
+ private CollectionRepo collectionRepo;
|
|
|
|
|
|
public Page<ActivityOrder> all(PageQuery pageQuery) {
|
|
|
return activityOrderRepo.findAll(JpaUtils.toSpecification(pageQuery, ActivityOrder.class), JpaUtils.toPageRequest(pageQuery));
|
|
|
}
|
|
|
|
|
|
|
|
|
- public void created(List<Long> assetId, Long mintActivityId) {
|
|
|
- ActivityCollection collection = activityCollectionRepo.findById(mintActivityId)
|
|
|
+ public void created(Long userId, Long mintActivityId) {
|
|
|
+ ActivityCollection activity = activityCollectionRepo.findById(mintActivityId)
|
|
|
.orElseThrow(new BusinessException("活动不存在"));
|
|
|
|
|
|
+ //库存
|
|
|
int stock = Optional.ofNullable(activityCollectionService.increaseStock(mintActivityId, -1))
|
|
|
.map(Math::toIntExact)
|
|
|
.orElseThrow(new BusinessException("很遗憾,活动已无库存"));
|
|
|
-
|
|
|
if (stock < 0) {
|
|
|
throw new BusinessException("活动已无库存");
|
|
|
}
|
|
|
|
|
|
+ //数量
|
|
|
+ List<Asset> assets = assetRepo.findAllByCollectionIdAndUserIdAndStatus(activity.getCollectionId(), userId, AssetStatus.NORMAL);
|
|
|
+ if (assets.size() < activity.getNum()) {
|
|
|
+ throw new BusinessException("数量不足,无法领取");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Asset> consumption = assets.stream().limit(activity.getNum()).collect(Collectors.toList());
|
|
|
+ //消耗资产
|
|
|
+ consumption.forEach(asset -> {
|
|
|
+ if (asset.isPublicShow()) {
|
|
|
+ if (asset.isConsignment()) {
|
|
|
+ asset.setConsignment(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (asset.getPublicCollectionId() != null) {
|
|
|
+ List<Order> orders = orderRepo.findByCollectionId(asset.getPublicCollectionId());
|
|
|
+ if (orders.stream().anyMatch(o -> o.getStatus() != OrderStatus.CANCELLED)) {
|
|
|
+ throw new BusinessException("已有订单不可兑换");
|
|
|
+ }
|
|
|
+ Collection collection = collectionRepo.findById(asset.getPublicCollectionId())
|
|
|
+ .orElseThrow(new BusinessException("无展示记录"));
|
|
|
+ List<Long> collectionIds = collectionRepo.findAllByAssetId(collection.getAssetId());
|
|
|
+ if (CollectionUtils.isNotEmpty(collectionIds)) {
|
|
|
+ log.info("删除collection {}", collectionIds);
|
|
|
+ collectionRepo.deleteAllByIdIn(collectionIds);
|
|
|
+ } else {
|
|
|
+ log.info("删除collection {}", collection.getId());
|
|
|
+ collectionRepo.delete(collection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ asset.setPublicShow(false);
|
|
|
+ asset.setPublicCollectionId(null);
|
|
|
+ }
|
|
|
+ asset.setStatus(AssetStatus.REDEEMED);
|
|
|
+ assetRepo.save(asset);
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
}
|