sunkean 3 年 前
コミット
cdc89bbf52

+ 68 - 0
src/main/java/com/izouma/nineth/domain/AssetSuperimposition.java

@@ -0,0 +1,68 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.converter.FileObjectListConverter;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Table(indexes = {
+        @Index(columnList = "userId")
+})
+public class AssetSuperimposition extends BaseEntity {
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("资产总数")
+    private Integer num;
+
+    @ApiModelProperty("拍卖中数量")
+    private Integer auctioningNum;
+
+    @ApiModelProperty("寄售数量")
+    private Integer consignmentNum;
+
+    @ApiModelProperty("仅展示数量")
+    private Integer openShowNum;
+
+    @ApiModelProperty("未展示数量")
+    private Integer closeShowNum;
+
+    @ApiModelProperty("市场交易完成数量")
+    private Integer transferredNum;
+
+    @ApiModelProperty("拍卖完成数量")
+    private Integer auctionedNum;
+
+    @ApiModelProperty("资产分类")
+    private String prefixName;
+
+    @ApiModelProperty("图片")
+    @Convert(converter = FileObjectListConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<FileObject> pic;
+
+    @ApiModelProperty("铸造者")
+    private String minter;
+
+    private String assetStatus;
+
+    public static AssetSuperimposition create(Collection collection, Long userId) {
+        return AssetSuperimposition.builder()
+                .userId(userId)
+                .minter(collection.getMinter())
+                .pic(collection.getPic())
+                .prefixName(collection.getPrefixName())
+                .build();
+    }
+}

+ 26 - 0
src/main/java/com/izouma/nineth/enums/AssetOperationType.java

@@ -0,0 +1,26 @@
+package com.izouma.nineth.enums;
+
+public enum AssetOperationType {
+
+    BUY("购买"),
+    OPEN("公开展示"),
+    CLOSE("取消公开"),
+    CONSIGNMENT("寄售"),
+    CANCEL_CONSIGNMENT("取消寄售"),
+    CONSIGNMENT_SUCCESS("转让成功"),
+    AUCTIONING("拍卖"),
+    AUCTIONING_FAIL("拍卖失败/取消拍卖"),
+    AUCTIONING_SUCCESS("拍卖成功"),
+    GIFTING("赠送"),
+    DESTORY("销毁");
+
+    private final String description;
+
+    AssetOperationType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 19 - 0
src/main/java/com/izouma/nineth/repo/AssetSuperimpositionRepo.java

@@ -0,0 +1,19 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.AssetSuperimposition;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.Optional;
+
+public interface AssetSuperimpositionRepo extends JpaRepository<AssetSuperimposition, Long>, JpaSpecificationExecutor<AssetSuperimposition> {
+    @Query("update AssetSuperimposition t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    Optional<AssetSuperimposition> findByUserIdAndPrefixName(Long userId, String prefixName);
+}

+ 12 - 3
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -64,6 +64,8 @@ public class AssetService {
     private AirDropService          airDropService;
     private HCChainService          hcChainService;
 
+    private AssetSuperimpositionService assetSuperimpositionService;
+
     public Page<Asset> all(PageQuery pageQuery) {
         Page<Asset> all = assetRepo
                 .findAll(JpaUtils.toSpecification(pageQuery, Asset.class), JpaUtils.toPageRequest(pageQuery));
@@ -137,7 +139,7 @@ public class AssetService {
             asset.setOwnerAvatar(fakeUser.getAvatar());
         }
         assetRepo.saveAndFlush(asset);
-
+        assetSuperimpositionService.adjustNum(asset, AssetOperationType.BUY, null);
         tokenHistoryRepo.save(TokenHistory.builder()
                 .tokenId(asset.getTokenId())
                 .fromUser(collection.getMinter())
@@ -203,7 +205,7 @@ public class AssetService {
             asset.setOwnerAvatar(fakeUser.getAvatar());
         }
         assetRepo.saveAndFlush(asset);
-
+        assetSuperimpositionService.adjustNum(asset, AssetOperationType.BUY, null);
         tokenHistoryRepo.save(TokenHistory.builder()
                 .tokenId(asset.getTokenId())
                 .fromUser(winItem.getMinter())
@@ -268,6 +270,7 @@ public class AssetService {
         asset.setPublicShow(true);
         asset.setPublicCollectionId(collection.getId());
         assetRepo.save(asset);
+        assetSuperimpositionService.adjustNum(asset, AssetOperationType.OPEN, null);
     }
 
     public synchronized void consignment(Long id, BigDecimal price, String tradeCode) {
@@ -360,6 +363,7 @@ public class AssetService {
         asset.setPublicCollectionId(collection.getId());
         asset.setSellPrice(price);
         assetRepo.save(asset);
+        assetSuperimpositionService.adjustNum(asset, AssetOperationType.CONSIGNMENT, null);
     }
 
     public void cancelConsignment(Long id) {
@@ -368,6 +372,7 @@ public class AssetService {
             throw new BusinessException("此藏品不属于你");
         }
         cancelConsignment(asset);
+        assetSuperimpositionService.adjustNum(asset, AssetOperationType.CANCEL_CONSIGNMENT, null);
     }
 
     public void cancelConsignment(Asset asset) {
@@ -395,6 +400,7 @@ public class AssetService {
             throw new BusinessException("此藏品不属于你");
         }
         cancelPublic(asset);
+        assetSuperimpositionService.adjustNum(asset, AssetOperationType.CLOSE, null);
     }
 
     public void cancelPublic(Asset asset) {
@@ -495,12 +501,15 @@ public class AssetService {
         switch (reason) {
             case GIFT:
                 asset.setStatus(AssetStatus.GIFTED);
+                assetSuperimpositionService.adjustNum(asset, AssetOperationType.GIFTING, toUser.getId());
                 break;
             case AUCTION:
                 asset.setStatus(AssetStatus.AUCTIONED);
+                assetSuperimpositionService.adjustNum(asset, AssetOperationType.AUCTIONING_SUCCESS, toUser.getId());
                 break;
             case TRANSFER:
                 asset.setStatus(AssetStatus.TRANSFERRED);
+                assetSuperimpositionService.adjustNum(asset, AssetOperationType.CONSIGNMENT_SUCCESS, toUser.getId());
         }
         asset.setOwner(newOwner.getNickname());
         asset.setOwnerId(newOwner.getId());
@@ -786,7 +795,7 @@ public class AssetService {
         asset.setOwnerId(toUser.getId());
         asset.setOwnerAvatar(toUser.getAvatar());
         assetRepo.save(asset);
-
+        assetSuperimpositionService.adjustNum(asset, AssetOperationType.DESTORY, null);
         //积分记录
         destroyRecordRepo.save(DestroyRecord.builder()
                 .userId(userId)

+ 176 - 0
src/main/java/com/izouma/nineth/service/AssetSuperimpositionService.java

@@ -0,0 +1,176 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.AssetSuperimposition;
+import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.AssetOperationType;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.AssetSuperimpositionRepo;
+import com.izouma.nineth.repo.CollectionRepo;
+import com.izouma.nineth.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+@Slf4j
+public class AssetSuperimpositionService {
+
+    private final int NUM = 1;
+
+    private AssetSuperimpositionRepo assetSuperimpositionRepo;
+
+    private CollectionRepo collectionRepo;
+
+    public Page<AssetSuperimposition> all(PageQuery pageQuery) {
+        return assetSuperimpositionRepo.findAll(JpaUtils.toSpecification(pageQuery, AssetSuperimposition.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /**
+     * 调整各操作藏品叠加的数量信息
+     *
+     * @param asset         资产信息
+     * @param type          操作类型
+     * @param relatedUserId 相关用户id(买入人,被赠送人)
+     */
+    public void adjustNum(Asset asset, AssetOperationType type, Long relatedUserId) {
+        Collection collection = null;
+        if (Objects.nonNull(asset.getCollectionId())) {
+            collection = collectionRepo.findById(asset.getCollectionId()).orElseThrow(new BusinessException("没有该藏品信息"));
+        }
+        if (Objects.isNull(type)) {
+            throw new BusinessException("操作类型不能为空");
+        }
+        if (StringUtils.isBlank(asset.getPrefixName())) {
+            throw new BusinessException("prefixName不能为空");
+        }
+        if (Objects.isNull(asset.getUserId())) {
+            throw new BusinessException("用户id不能为空");
+        }
+        AssetSuperimposition assetSuperimposition = assetSuperimpositionRepo.findByUserIdAndPrefixName(asset.getUserId(), asset.getPrefixName()).orElse(null);
+        if (Objects.isNull(assetSuperimposition)) {
+            assetSuperimposition = AssetSuperimposition.create(collection, asset.getUserId());
+        }
+        switch (type) {
+            case OPEN:
+                log.info("调整数量 -> 公开展示");
+                assetSuperimposition.setCloseShowNum(assetSuperimposition.getConsignmentNum() - NUM);
+                assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() + NUM);
+                break;
+            case CLOSE:
+                log.info("调整数量 -> 关闭公开展示");
+                // 关闭公开展示同时取消已经寄售的数量
+                if (asset.isConsignment()) {
+                    assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() - NUM);
+                }
+                assetSuperimposition.setCloseShowNum(assetSuperimposition.getConsignmentNum() + NUM);
+                assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() - NUM);
+                break;
+            case CONSIGNMENT:
+                log.info("调整数量 -> 寄售");
+                publicShowOrFalseReduce(assetSuperimposition, asset);
+                assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() + NUM);
+                break;
+            case CANCEL_CONSIGNMENT:
+                log.info("调整数量 -> 取消寄售");
+                publicShowOrFalseAdd(assetSuperimposition, asset);
+                assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() - NUM);
+                break;
+            case CONSIGNMENT_SUCCESS:
+                log.info("调整数量 -> 转让成功");
+                assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
+                assetSuperimposition.setConsignmentNum(assetSuperimposition.getConsignmentNum() - NUM);
+                publicShowOrFalseReduce(assetSuperimposition, asset);
+                relatedUserAdjustNum(relatedUserId, asset.getPrefixName(), collection);
+                break;
+            case AUCTIONING:
+                log.info("调整数量 -> 拍卖");
+                assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() + NUM);
+                break;
+            case AUCTIONING_FAIL:
+                log.info("调整数量 -> 拍卖失败/取消");
+                assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() - NUM);
+                break;
+            case AUCTIONING_SUCCESS:
+                log.info("调整数量 -> 拍卖成功");
+                assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
+                assetSuperimposition.setAuctioningNum(assetSuperimposition.getAuctionedNum() - NUM);
+                publicShowOrFalseReduce(assetSuperimposition, asset);
+                relatedUserAdjustNum(relatedUserId, asset.getPrefixName(), collection);
+                break;
+            case GIFTING:
+                log.info("调整数量 -> 赠送");
+                assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
+                publicShowOrFalseReduce(assetSuperimposition, asset);
+                relatedUserAdjustNum(relatedUserId, asset.getPrefixName(), collection);
+                break;
+            case BUY:
+                log.info("调整数量 -> 购买");
+                assetSuperimposition.setNum(assetSuperimposition.getNum() + NUM);
+                assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM);
+                break;
+            case DESTORY:
+                log.info("调整数量 -> 销毁");
+                assetSuperimposition.setNum(assetSuperimposition.getNum() - NUM);
+                assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM);
+                break;
+        }
+        assetSuperimpositionRepo.save(assetSuperimposition);
+    }
+
+    /**
+     * 根据藏品是否展示判断仅展示或未展示对应数量减去一
+     *
+     * @param assetSuperimposition 资产叠加数量信息
+     * @param asset                资产信息
+     * @return 资产叠加数量信息
+     */
+    private void publicShowOrFalseReduce(AssetSuperimposition assetSuperimposition, Asset asset) {
+        if (asset.isPublicShow()) {
+            assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() - NUM);
+            return;
+        }
+        assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() - NUM);
+    }
+
+    /**
+     * 根据藏品是否展示判断仅展示或未展示对应数量加一
+     *
+     * @param assetSuperimposition 资产叠加数量信息
+     * @param asset                资产信息
+     * @return 资产叠加数量信息
+     */
+    private void publicShowOrFalseAdd(AssetSuperimposition assetSuperimposition, Asset asset) {
+        if (asset.isPublicShow()) {
+            assetSuperimposition.setOpenShowNum(assetSuperimposition.getOpenShowNum() + NUM);
+            return;
+        }
+        assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM);
+    }
+
+    /**
+     * 相关用户藏品叠加数量(买入人,被转增人等)
+     *
+     * @param relatedUserId 相关用户id
+     * @param prefixName    叠加分类
+     * @param collection    藏品信息
+     */
+    private void relatedUserAdjustNum(Long relatedUserId, String prefixName, Collection collection) {
+        if (Objects.isNull(relatedUserId)) {
+            throw new BusinessException("涉及相关用户id为空");
+        }
+        AssetSuperimposition assetSuperimposition = assetSuperimpositionRepo.findByUserIdAndPrefixName(relatedUserId, prefixName).orElse(null);
+        if (Objects.isNull(assetSuperimposition)) {
+            assetSuperimposition = AssetSuperimposition.create(collection, relatedUserId);
+        }
+        assetSuperimposition.setNum(assetSuperimposition.getNum() + NUM);
+        assetSuperimposition.setCloseShowNum(assetSuperimposition.getCloseShowNum() + NUM);
+        assetSuperimpositionRepo.save(assetSuperimposition);
+    }
+}

+ 2 - 0
src/main/java/com/izouma/nineth/service/AuctionActivityService.java

@@ -50,6 +50,7 @@ public class AuctionActivityService {
     private final Environment                   env;
     private final TokenHistoryRepo              tokenHistoryRepo;
     private final SysConfigService              sysConfigService;
+    private final AssetSuperimpositionService assetSuperimpositionService;
 
     private final Map<Long, ScheduledFuture<?>> tasks = new HashMap<>();
 
@@ -151,6 +152,7 @@ public class AuctionActivityService {
 
             asset.setStatus(AssetStatus.AUCTIONING);
             assetRepo.save(asset);
+            assetSuperimpositionService.adjustNum(asset, AssetOperationType.AUCTIONING, null);
         }
 
         //上架

+ 60 - 0
src/main/java/com/izouma/nineth/web/AssetSuperimpositionController.java

@@ -0,0 +1,60 @@
+package com.izouma.nineth.web;
+import com.izouma.nineth.domain.AssetSuperimposition;
+import com.izouma.nineth.service.AssetSuperimpositionService;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.AssetSuperimpositionRepo;
+import com.izouma.nineth.utils.ObjUtils;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/assetSuperimposition")
+@AllArgsConstructor
+public class AssetSuperimpositionController extends BaseController {
+    private AssetSuperimpositionService assetSuperimpositionService;
+    private AssetSuperimpositionRepo assetSuperimpositionRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public AssetSuperimposition save(@RequestBody AssetSuperimposition record) {
+        if (record.getId() != null) {
+            AssetSuperimposition orig = assetSuperimpositionRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return assetSuperimpositionRepo.save(orig);
+        }
+        return assetSuperimpositionRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<AssetSuperimposition> all(@RequestBody PageQuery pageQuery) {
+        return assetSuperimpositionService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public AssetSuperimposition get(@PathVariable Long id) {
+        return assetSuperimpositionRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        assetSuperimpositionRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<AssetSuperimposition> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+