Просмотр исходного кода

Merge branch 'dev' into master_mint

wangqifan 2 лет назад
Родитель
Сommit
4a8d033adf
29 измененных файлов с 875 добавлено и 271 удалено
  1. 32 0
      src/main/java/com/izouma/nineth/converter/CreateCollectionConverter.java
  2. 33 0
      src/main/java/com/izouma/nineth/converter/HoldingTagConverter.java
  3. 3 0
      src/main/java/com/izouma/nineth/domain/Collection.java
  4. 4 0
      src/main/java/com/izouma/nineth/domain/DomainOrder.java
  5. 22 7
      src/main/java/com/izouma/nineth/domain/MintActivity.java
  6. 7 3
      src/main/java/com/izouma/nineth/domain/MintOrder.java
  7. 16 0
      src/main/java/com/izouma/nineth/dto/nftdomain/CreateCollection.java
  8. 10 0
      src/main/java/com/izouma/nineth/dto/nftdomain/CreateCollectionDTO.java
  9. 15 0
      src/main/java/com/izouma/nineth/dto/nftdomain/HoldingTag.java
  10. 8 3
      src/main/java/com/izouma/nineth/repo/DomainOrderRepo.java
  11. 10 0
      src/main/java/com/izouma/nineth/repo/MintActivityRepo.java
  12. 1 1
      src/main/java/com/izouma/nineth/repo/MintOrderRepo.java
  13. 4 1
      src/main/java/com/izouma/nineth/repo/nftdomain/CartRepo.java
  14. 99 33
      src/main/java/com/izouma/nineth/service/AssetService.java
  15. 47 33
      src/main/java/com/izouma/nineth/service/CollectionService.java
  16. 47 0
      src/main/java/com/izouma/nineth/service/DomainOrderService.java
  17. 62 1
      src/main/java/com/izouma/nineth/service/MintActivityService.java
  18. 131 72
      src/main/java/com/izouma/nineth/service/MintOrderService.java
  19. 59 12
      src/main/java/com/izouma/nineth/service/PhotoAssetService.java
  20. 1 9
      src/main/java/com/izouma/nineth/service/RiceService.java
  21. 21 6
      src/main/java/com/izouma/nineth/service/StatisticService.java
  22. 1 1
      src/main/java/com/izouma/nineth/web/AssetController.java
  23. 39 1
      src/main/java/com/izouma/nineth/web/DomainOrderController.java
  24. 22 12
      src/main/java/com/izouma/nineth/web/MintActivityController.java
  25. 33 31
      src/main/java/com/izouma/nineth/web/RiceInviteController.java
  26. 1 1
      src/main/vue/.env.development
  27. 2 2
      src/main/vue/src/components/CollectionSearch.vue
  28. 142 42
      src/main/vue/src/views/MintActivityEdit.vue
  29. 3 0
      src/main/vue/src/widgets/Detail.vue

+ 32 - 0
src/main/java/com/izouma/nineth/converter/CreateCollectionConverter.java

@@ -0,0 +1,32 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.dto.nftdomain.CreateCollection;
+import com.izouma.nineth.dto.nftdomain.HoldingTag;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class CreateCollectionConverter implements AttributeConverter<List<CreateCollection>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<CreateCollection> buildingPosDTOList) {
+        if (buildingPosDTOList == null) {
+            return null;
+        }
+        return JSON.toJSONString(buildingPosDTOList);
+    }
+
+    @Override
+    public List<CreateCollection> convertToEntityAttribute(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return null;
+        }
+        try {
+            return JSONArray.parseArray(s, CreateCollection.class);
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+}

+ 33 - 0
src/main/java/com/izouma/nineth/converter/HoldingTagConverter.java

@@ -0,0 +1,33 @@
+package com.izouma.nineth.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.dto.BuildingPosDTO;
+import com.izouma.nineth.dto.MintActivityRule;
+import com.izouma.nineth.dto.nftdomain.HoldingTag;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class HoldingTagConverter implements AttributeConverter<List<HoldingTag>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<HoldingTag> buildingPosDTOList) {
+        if (buildingPosDTOList == null) {
+            return null;
+        }
+        return JSON.toJSONString(buildingPosDTOList);
+    }
+
+    @Override
+    public List<HoldingTag> convertToEntityAttribute(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return null;
+        }
+        try {
+            return JSONArray.parseArray(s, HoldingTag.class);
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+}

+ 3 - 0
src/main/java/com/izouma/nineth/domain/Collection.java

@@ -74,6 +74,9 @@ public class Collection extends CollectionBaseEntity {
     @Transient
     @Transient
     private boolean appointment;
     private boolean appointment;
 
 
+    @Transient
+    private boolean inCart;
+
     @Transient
     @Transient
     private int vipSurplus;
     private int vipSurplus;
 
 

+ 4 - 0
src/main/java/com/izouma/nineth/domain/DomainOrder.java

@@ -99,4 +99,8 @@ public class DomainOrder extends BaseEntity {
     @Column(name = "current_owner_id")
     @Column(name = "current_owner_id")
     @ApiModelProperty("当前使用nft域名的人的id")
     @ApiModelProperty("当前使用nft域名的人的id")
     private Long CurrentOwnerId;
     private Long CurrentOwnerId;
+
+    @ApiModelProperty("展示id")
+    private Long publicCollectionId;
+
 }
 }

+ 22 - 7
src/main/java/com/izouma/nineth/domain/MintActivity.java

@@ -1,10 +1,11 @@
 package com.izouma.nineth.domain;
 package com.izouma.nineth.domain;
 
 
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.annotations.Searchable;
-import com.izouma.nineth.converter.LongArrayConverter;
-import com.izouma.nineth.converter.MintRuleConverter;
-import com.izouma.nineth.converter.StringArrayConverter;
+import com.izouma.nineth.converter.*;
 import com.izouma.nineth.dto.MintActivityRule;
 import com.izouma.nineth.dto.MintActivityRule;
+import com.izouma.nineth.dto.nftdomain.CreateCollection;
+import com.izouma.nineth.dto.nftdomain.CreateCollectionDTO;
+import com.izouma.nineth.dto.nftdomain.HoldingTag;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -108,10 +109,24 @@ public class MintActivity extends BaseEntity {
     @Convert(converter = LongArrayConverter.class)
     @Convert(converter = LongArrayConverter.class)
     private List<Long> holdingTags;
     private List<Long> holdingTags;
 
 
-//    private boolean delay = false;
-//
-//    private int delayHours = 0;
+    @ApiModelProperty("铸造活动规则")
+    @Convert(converter = HoldingTagConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<HoldingTag> holdingTagsList;
+
+    @ApiModelProperty("铸造活动规则")
+    @Convert(converter = CreateCollectionConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<CreateCollection> targetCollectionIds;
+
+    private boolean delay = false;
+
+    private Integer delayHours = 0;
+
+    private boolean scheduleEnd = false;
+
+    private LocalDateTime endTime;
 
 
     @Transient
     @Transient
-    private Collection airDropCollection;
+    private List<CreateCollectionDTO> airDropCollection;
 }
 }

+ 7 - 3
src/main/java/com/izouma/nineth/domain/MintOrder.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.domain;
 package com.izouma.nineth.domain;
 
 
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.converter.LongArrayConverter;
 import com.izouma.nineth.converter.MintMaterialListConverter;
 import com.izouma.nineth.converter.MintMaterialListConverter;
 import com.izouma.nineth.enums.MintOrderStatus;
 import com.izouma.nineth.enums.MintOrderStatus;
 import com.izouma.nineth.enums.PayMethod;
 import com.izouma.nineth.enums.PayMethod;
@@ -83,7 +84,10 @@ public class MintOrder extends BaseEntity {
     @Column(columnDefinition = "bigint default 1 not null")
     @Column(columnDefinition = "bigint default 1 not null")
     private Long companyId = 1L;
     private Long companyId = 1L;
 
 
-//    private boolean delay = false;
-//
-//    private LocalDateTime airDropTime;
+    private boolean delay = false;
+
+    @Convert(converter = LongArrayConverter.class)
+    private List<Long> airDropCollections;
+
+    private LocalDateTime airDropTime;
 }
 }

+ 16 - 0
src/main/java/com/izouma/nineth/dto/nftdomain/CreateCollection.java

@@ -0,0 +1,16 @@
+package com.izouma.nineth.dto.nftdomain;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+public class CreateCollection {
+    Long   id;
+    int    num;
+    int    delayHours;
+    double delayTime;
+}

+ 10 - 0
src/main/java/com/izouma/nineth/dto/nftdomain/CreateCollectionDTO.java

@@ -0,0 +1,10 @@
+package com.izouma.nineth.dto.nftdomain;
+
+import com.izouma.nineth.domain.Collection;
+import lombok.Data;
+
+@Data
+public class CreateCollectionDTO {
+    private int        num;
+    private Collection collection;
+}

+ 15 - 0
src/main/java/com/izouma/nineth/dto/nftdomain/HoldingTag.java

@@ -0,0 +1,15 @@
+package com.izouma.nineth.dto.nftdomain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
+public class HoldingTag {
+    Long id;
+    int  num;
+}

+ 8 - 3
src/main/java/com/izouma/nineth/repo/DomainOrderRepo.java

@@ -25,17 +25,19 @@ public interface DomainOrderRepo extends JpaRepository<DomainOrder, Long>, JpaSp
     void softDelete(Long id);
     void softDelete(Long id);
 
 
     //@Query(value="SELECT * FROM domain_order WHERE current_owner_id = :currentOwnerId AND open_hyper_link = true", nativeQuery = true)
     //@Query(value="SELECT * FROM domain_order WHERE current_owner_id = :currentOwnerId AND open_hyper_link = true", nativeQuery = true)
-    @Query(value="SELECT a.id as assetId,do.domain_name as domainName,do.address ,do.hyper_link_type as hyperLinkType,do.open_hyper_link as openHyperLink,do.current_owner_id as currentOwnerId,do.pic from domain_order  do LEFT JOIN asset a ON DO\n" +
+    @Query(value = "SELECT a.id as assetId,do.domain_name as domainName,do.address ,do.hyper_link_type as hyperLinkType,do.open_hyper_link as openHyperLink,do.current_owner_id as currentOwnerId,do.pic from domain_order  do LEFT JOIN asset a ON DO\n" +
             "\t.domain_name =SUBSTRING_INDEX(a.name, ' ', -1) COLLATE utf8mb4_general_ci WHERE a.`status`='NORMAL' and do.open_hyper_link = 1 and do.current_owner_id = :currentOwnerId", nativeQuery = true)
             "\t.domain_name =SUBSTRING_INDEX(a.name, ' ', -1) COLLATE utf8mb4_general_ci WHERE a.`status`='NORMAL' and do.open_hyper_link = 1 and do.current_owner_id = :currentOwnerId", nativeQuery = true)
     List<Map<String, Object>> findAllByCurrentOwnerIdAndOpenHyperLinkIsTrue(Long currentOwnerId);
     List<Map<String, Object>> findAllByCurrentOwnerIdAndOpenHyperLinkIsTrue(Long currentOwnerId);
 
 
-    DomainOrder findByDomainNameAndOrderStatus(String domainName,OrderStatus orderStatus);
+    DomainOrder findByDomainNameAndOrderStatus(String domainName, OrderStatus orderStatus);
 
 
-    @Query(value="SELECT * FROM domain_order WHERE id = :id ", nativeQuery = true)
+    @Query(value = "SELECT * FROM domain_order WHERE id = :id ", nativeQuery = true)
     DomainOrder findByAssetCollectionId(Long id);
     DomainOrder findByAssetCollectionId(Long id);
 
 
     List<DomainOrder> findAllByUserIdAndOrderStatus(Long userId, OrderStatus status);
     List<DomainOrder> findAllByUserIdAndOrderStatus(Long userId, OrderStatus status);
 
 
+    DomainOrder findByPublicCollectionId(Long publicCollectionId);
+
 
 
     List<DomainOrder> findAllByHyperLinkType(HyperLinkType hyperLinkType);
     List<DomainOrder> findAllByHyperLinkType(HyperLinkType hyperLinkType);
 
 
@@ -57,6 +59,9 @@ public interface DomainOrderRepo extends JpaRepository<DomainOrder, Long>, JpaSp
     @Query("select sum(price) from DomainOrder where createdAt <= ?2 and createdAt >= ?1 and orderStatus = 'FINISH'")
     @Query("select sum(price) from DomainOrder where createdAt <= ?2 and createdAt >= ?1 and orderStatus = 'FINISH'")
     BigDecimal sumToday(LocalDateTime start, LocalDateTime end);
     BigDecimal sumToday(LocalDateTime start, LocalDateTime end);
 
 
+    @Query("select count (id) from DomainOrder where createdAt <= ?2 and createdAt >= ?1 and orderStatus = 'FINISH'")
+    Long countToday(LocalDateTime start, LocalDateTime end);
+
     @Query(nativeQuery = true, value = "SELECT pic_name from domain_order where order_status ='FINISH' GROUP BY pic_name  having count(pic_name) > 1")
     @Query(nativeQuery = true, value = "SELECT pic_name from domain_order where order_status ='FINISH' GROUP BY pic_name  having count(pic_name) > 1")
     List<String> getDomainOrder();
     List<String> getDomainOrder();
 
 

+ 10 - 0
src/main/java/com/izouma/nineth/repo/MintActivityRepo.java

@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.Query;
 
 
 import javax.transaction.Transactional;
 import javax.transaction.Transactional;
+import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Optional;
 import java.util.Optional;
@@ -41,4 +42,13 @@ public interface MintActivityRepo extends JpaRepository<MintActivity, Long>, Jpa
     @CacheEvict(value = "mintActivity", key = "#id")
     @CacheEvict(value = "mintActivity", key = "#id")
     void scheduleOnShelf(Long id);
     void scheduleOnShelf(Long id);
 
 
+    @Transactional
+    @Modifying
+    @Query("update MintActivity c set c.scheduleEnd = false, c.endTime = null, c.onShelf = false where c.id = ?1")
+    @CacheEvict(value = "mintActivity", key = "#id")
+    void scheduleOffShelf(Long id);
+
+    List<MintActivity> findAllByScheduleEndTrueAndEndTimeBefore(LocalDateTime localDateTime);
+
+
 }
 }

+ 1 - 1
src/main/java/com/izouma/nineth/repo/MintOrderRepo.java

@@ -32,5 +32,5 @@ public interface MintOrderRepo extends JpaRepository<MintOrder, Long>, JpaSpecif
             "select user_id userId,count(user_id)*50 num from mint_order where mint_activity_id = 8901817 group by user_id)a left join user on a.userId = user.id group by a.userId order by sum(a.num) desc ", nativeQuery = true)
             "select user_id userId,count(user_id)*50 num from mint_order where mint_activity_id = 8901817 group by user_id)a left join user on a.userId = user.id group by a.userId order by sum(a.num) desc ", nativeQuery = true)
     List<Map<String, Object>> findMintRank();
     List<Map<String, Object>> findMintRank();
 
 
-//    List<MintOrder> findByStatusAndDelayAndAirDropTimeBefore(MintOrderStatus mintOrderStatus, boolean delay, LocalDateTime airDropTime);
+    List<MintOrder> findByStatusAndAirDropTimeBefore(MintOrderStatus mintOrderStatus, LocalDateTime airDropTime);
 }
 }

+ 4 - 1
src/main/java/com/izouma/nineth/repo/nftdomain/CartRepo.java

@@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.Query;
 
 
 import javax.transaction.Transactional;
 import javax.transaction.Transactional;
+import java.util.List;
 
 
 public interface CartRepo extends JpaRepository<Cart, Long>, JpaSpecificationExecutor<Cart> {
 public interface CartRepo extends JpaRepository<Cart, Long>, JpaSpecificationExecutor<Cart> {
     @Query("update Cart t set t.del = true where t.id = ?1")
     @Query("update Cart t set t.del = true where t.id = ?1")
@@ -20,5 +21,7 @@ public interface CartRepo extends JpaRepository<Cart, Long>, JpaSpecificationExe
 
 
     Long countAllByUserIdAndDelAndEnabled(Long userId, boolean del, boolean enabled);
     Long countAllByUserIdAndDelAndEnabled(Long userId, boolean del, boolean enabled);
 
 
-    Cart findFirstByCollectionIdAndUserIdAndDel(Long collectionId,Long userId,boolean del);
+    Cart findFirstByCollectionIdAndUserIdAndDel(Long collectionId, Long userId, boolean del);
+
+    List<Cart> findByUserIdAndDel(Long userId, boolean del);
 }
 }

+ 99 - 33
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -735,29 +735,41 @@ public class AssetService {
         }
         }
 
 
         try {
         try {
-            List<DomainOrder> filteredDomainOrders = domainOrderRepo.findAllByHyperLinkType(HyperLinkType.COLLECTION);
-            for (DomainOrder filteredDomainOrder : filteredDomainOrders) {
-                String url = filteredDomainOrder.getAddress();
-                int secondSlashIndex = url.indexOf('/', url.indexOf('/') + 1);
-                if (url.length() > secondSlashIndex + 1) {
-                    String secondNumber = url.substring(secondSlashIndex + 1);
-                    if (!secondNumber.isBlank()) {
-                        if (asset.getPublicCollectionId() != null && asset.getPublicCollectionId().equals(Long.parseLong(secondNumber))) {
-                            filteredDomainOrder.setOpenHyperLink(false);
-                            filteredDomainOrder.setHyperLinkType(null);
-                            filteredDomainOrder.setAddress(null);
-                            filteredDomainOrder.setCurrentOwnerId(null);
-                            domainOrderRepo.save(filteredDomainOrder);
-                        }
-                    }
-                }
+            DomainOrder order = domainOrderRepo.findByPublicCollectionId(asset.getPublicCollectionId());
+            if (order != null) {
+                order.setOpenHyperLink(false);
+                order.setHyperLinkType(null);
+                order.setAddress(null);
+                order.setCurrentOwnerId(null);
+                order.setPublicCollectionId(null);
+                domainOrderRepo.save(order);
             }
             }
+
+
+//            List<DomainOrder> filteredDomainOrders = domainOrderRepo.findAllByHyperLinkType(HyperLinkType.COLLECTION);
+//            for (DomainOrder filteredDomainOrder : filteredDomainOrders) {
+//                String url = filteredDomainOrder.getAddress();
+//                if (!url.isBlank()) {
+//                    int secondSlashIndex = url.indexOf('/', url.indexOf('/') + 1);
+//                    if (url.length() > secondSlashIndex + 1) {
+//                        String secondNumber = url.substring(secondSlashIndex + 1);
+//                        if (!secondNumber.isBlank()) {
+//                            if (asset.getPublicCollectionId() != null && asset.getPublicCollectionId().equals(Long.parseLong(secondNumber))) {
+//                                filteredDomainOrder.setOpenHyperLink(false);
+//                                filteredDomainOrder.setHyperLinkType(null);
+//                                filteredDomainOrder.setAddress(null);
+//                                filteredDomainOrder.setCurrentOwnerId(null);
+//                                domainOrderRepo.save(filteredDomainOrder);
+//                            }
+//                        }
+//                    }
+//                }
+//            }
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("超链报错:assetId" + asset.getId(), e);
             log.error("超链报错:assetId" + asset.getId(), e);
         }
         }
 
 
 
 
-
         asset.setConsignment(false);
         asset.setConsignment(false);
         assetRepo.saveAndFlush(asset);
         assetRepo.saveAndFlush(asset);
     }
     }
@@ -788,23 +800,40 @@ public class AssetService {
 
 
 
 
         try {
         try {
-            List<DomainOrder> filteredDomainOrders = domainOrderRepo.findAllByHyperLinkType(HyperLinkType.COLLECTION);
-            for (DomainOrder filteredDomainOrder : filteredDomainOrders) {
-                String url = filteredDomainOrder.getAddress();
-                int secondSlashIndex = url.indexOf('/', url.indexOf('/') + 1);
-                if (url.length() > secondSlashIndex + 1) {
-                    String secondNumber = url.substring(secondSlashIndex + 1);
-                    if (!secondNumber.isBlank()) {
-                        if (asset.getPublicCollectionId() != null && asset.getPublicCollectionId().equals(Long.parseLong(secondNumber))) {
-                            filteredDomainOrder.setOpenHyperLink(false);
-                            filteredDomainOrder.setHyperLinkType(null);
-                            filteredDomainOrder.setAddress(null);
-                            filteredDomainOrder.setCurrentOwnerId(null);
-                            domainOrderRepo.save(filteredDomainOrder);
-                        }
-                    }
-                }
+
+            DomainOrder order = domainOrderRepo.findByPublicCollectionId(asset.getPublicCollectionId());
+            if (order != null) {
+                order.setOpenHyperLink(false);
+                order.setHyperLinkType(null);
+                order.setAddress(null);
+                order.setCurrentOwnerId(null);
+                order.setPublicCollectionId(null);
+                domainOrderRepo.save(order);
             }
             }
+
+
+
+
+//            List<DomainOrder> filteredDomainOrders = domainOrderRepo.findAllByHyperLinkType(HyperLinkType.COLLECTION);
+//            for (DomainOrder filteredDomainOrder : filteredDomainOrders) {
+//                String url = filteredDomainOrder.getAddress();
+//                if (!url.isBlank()) {
+//                    int secondSlashIndex = url.indexOf('/', url.indexOf('/') + 1);
+//                    if (url.length() > secondSlashIndex + 1) {
+//                        String secondNumber = url.substring(secondSlashIndex + 1);
+//                        if (!secondNumber.isBlank()) {
+//                            if (asset.getPublicCollectionId() != null && asset.getPublicCollectionId().equals(Long.parseLong(secondNumber))) {
+//                                filteredDomainOrder.setOpenHyperLink(false);
+//                                filteredDomainOrder.setHyperLinkType(null);
+//                                filteredDomainOrder.setAddress(null);
+//                                filteredDomainOrder.setCurrentOwnerId(null);
+//                                domainOrderRepo.save(filteredDomainOrder);
+//                            }
+//                        }
+//                    }
+//                }
+//
+//            }
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("超链报错:assetId" + asset.getId(), e);
             log.error("超链报错:assetId" + asset.getId(), e);
         }
         }
@@ -856,8 +885,45 @@ public class AssetService {
                     domainOrder.setHyperLinkType(null);
                     domainOrder.setHyperLinkType(null);
                     domainOrder.setAddress(null);
                     domainOrder.setAddress(null);
                     domainOrder.setCurrentOwnerId(null);
                     domainOrder.setCurrentOwnerId(null);
+                    domainOrder.setPublicCollectionId(null);
+                    domainOrderRepo.save(domainOrder);
+                }
+            }
+            //铸造清除超链
+            if (asset.getPublicCollectionId() != null) {
 
 
+                DomainOrder order = domainOrderRepo.findByPublicCollectionId(asset.getPublicCollectionId());
+                if (order != null) {
+                    order.setOpenHyperLink(false);
+                    order.setHyperLinkType(null);
+                    order.setAddress(null);
+                    order.setCurrentOwnerId(null);
+                    order.setPublicCollectionId(null);
+                    domainOrderRepo.save(order);
                 }
                 }
+
+
+
+//                List<DomainOrder> filteredDomainOrders = domainOrderRepo.findAllByHyperLinkType(HyperLinkType.COLLECTION);
+//                for (DomainOrder filteredDomainOrder : filteredDomainOrders) {
+//                    String url = filteredDomainOrder.getAddress();
+//                    if (!url.isBlank()) {
+//                        int secondSlashIndex = url.indexOf('/', url.indexOf('/') + 1);
+//                        if (url.length() > secondSlashIndex + 1) {
+//                            String secondNumber = url.substring(secondSlashIndex + 1);
+//                            if (!secondNumber.isBlank()) {
+//                                if (asset.getPublicCollectionId() != null && asset.getPublicCollectionId().equals(Long.parseLong(secondNumber))) {
+//                                    filteredDomainOrder.setOpenHyperLink(false);
+//                                    filteredDomainOrder.setHyperLinkType(null);
+//                                    filteredDomainOrder.setAddress(null);
+//                                    filteredDomainOrder.setCurrentOwnerId(null);
+//                                    domainOrderRepo.save(filteredDomainOrder);
+//                                }
+//                            }
+//                        }
+//                    }
+//
+//                }
             }
             }
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("超链报错:assetId" + asset.getId(), e);
             log.error("超链报错:assetId" + asset.getId(), e);

+ 47 - 33
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -10,10 +10,12 @@ import com.izouma.nineth.converter.LongArrayConverter;
 import com.izouma.nineth.converter.StringArrayConverter;
 import com.izouma.nineth.converter.StringArrayConverter;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.domain.nftdomain.Cart;
 import com.izouma.nineth.dto.*;
 import com.izouma.nineth.dto.*;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.repo.*;
+import com.izouma.nineth.repo.nftdomain.CartRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -77,6 +79,7 @@ public class CollectionService {
     private SysConfigService              sysConfigService;
     private SysConfigService              sysConfigService;
     private NewsRepo                      newsRepo;
     private NewsRepo                      newsRepo;
     private AssetRepo                     assetRepo;
     private AssetRepo                     assetRepo;
+    private CartRepo                      cartRepo;
 
 
     private final Map<Long, ScheduledFuture<?>> tasks = new HashMap<>();
     private final Map<Long, ScheduledFuture<?>> tasks = new HashMap<>();
 
 
@@ -233,7 +236,7 @@ public class CollectionService {
         record.setVipQuota(record.getTotalQuota());
         record.setVipQuota(record.getTotalQuota());
         if (!record.getTags().isEmpty()) {
         if (!record.getTags().isEmpty()) {
             record.setTags(new HashSet<>(tagRepo.findAllById(record.getTags().stream().map(Tag::getId)
             record.setTags(new HashSet<>(tagRepo.findAllById(record.getTags().stream().map(Tag::getId)
-                    .collect(Collectors.toList()))));
+                                                                   .collect(Collectors.toList()))));
         }
         }
         if (record.isScheduleSale()) {
         if (record.isScheduleSale()) {
             if (record.getStartTime() == null) {
             if (record.getStartTime() == null) {
@@ -293,7 +296,7 @@ public class CollectionService {
             collection.setTags(null);
             collection.setTags(null);
         } else {
         } else {
             collection.setTags(new HashSet<>(tagRepo.findAllById(record.getTags().stream().map(Tag::getId)
             collection.setTags(new HashSet<>(tagRepo.findAllById(record.getTags().stream().map(Tag::getId)
-                    .collect(Collectors.toList()))));
+                                                                       .collect(Collectors.toList()))));
         }
         }
         if (record.getNewsId() != null) {
         if (record.getNewsId() != null) {
             News news = newsRepo.findById(record.getNewsId()).orElseThrow(new BusinessException("未找到新闻"));
             News news = newsRepo.findById(record.getNewsId()).orElseThrow(new BusinessException("未找到新闻"));
@@ -366,6 +369,9 @@ public class CollectionService {
                 if (collection.getType() == CollectionType.BLIND_BOX) {
                 if (collection.getType() == CollectionType.BLIND_BOX) {
                     collection.setAppointment(appointmentRepo.findFirstByBlindBoxId(collection.getId()).isPresent());
                     collection.setAppointment(appointmentRepo.findFirstByBlindBoxId(collection.getId()).isPresent());
                 }
                 }
+                Cart cart = cartRepo
+                        .findFirstByCollectionIdAndUserIdAndDel(collection.getId(), user.getId(), false);
+                collection.setInCart(cart != null);
 //                if (showVip && collection.getAssignment() > 0 && user.getVipPurchase() > 0) {
 //                if (showVip && collection.getAssignment() > 0 && user.getVipPurchase() > 0) {
 //                    int purchase = orderRepo.countByUserIdAndCollectionIdAndVipTrueAndStatusIn(user.getId(), collection.getId(), Arrays.asList(OrderStatus.FINISH, OrderStatus.NOT_PAID, OrderStatus.PROCESSING));
 //                    int purchase = orderRepo.countByUserIdAndCollectionIdAndVipTrueAndStatusIn(user.getId(), collection.getId(), Arrays.asList(OrderStatus.FINISH, OrderStatus.NOT_PAID, OrderStatus.PROCESSING));
                 collection.setVipSurplus(user.getVipPurchase());
                 collection.setVipSurplus(user.getVipPurchase());
@@ -397,9 +403,11 @@ public class CollectionService {
     public void queryUserDetail(List<Collection> collections) {
     public void queryUserDetail(List<Collection> collections) {
         List<Like> likes = new ArrayList<>();
         List<Like> likes = new ArrayList<>();
         List<Appointment> appointments = new ArrayList<>();
         List<Appointment> appointments = new ArrayList<>();
+        List<Cart> carts = new ArrayList<>();
         if (SecurityUtils.getAuthenticatedUser() != null) {
         if (SecurityUtils.getAuthenticatedUser() != null) {
             likes.addAll(likeRepo.findByUserIdAndCollectionIdIsNotNull(SecurityUtils.getAuthenticatedUser().getId()));
             likes.addAll(likeRepo.findByUserIdAndCollectionIdIsNotNull(SecurityUtils.getAuthenticatedUser().getId()));
             appointments.addAll(appointmentRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId()));
             appointments.addAll(appointmentRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId()));
+            carts.addAll(cartRepo.findByUserIdAndDel(SecurityUtils.getAuthenticatedUser().getId(), false));
         }
         }
         collections.stream().parallel().forEach(collection -> {
         collections.stream().parallel().forEach(collection -> {
             queryUserDetail(collection, false, false);
             queryUserDetail(collection, false, false);
@@ -408,7 +416,11 @@ public class CollectionService {
             }
             }
             if (!appointments.isEmpty()) {
             if (!appointments.isEmpty()) {
                 collection.setAppointment(appointments.stream()
                 collection.setAppointment(appointments.stream()
-                        .anyMatch(a -> a.getBlindBoxId().equals(collection.getId())));
+                                                      .anyMatch(a -> a.getBlindBoxId().equals(collection.getId())));
+            }
+            if (!carts.isEmpty()) {
+                collection.setInCart(carts.stream()
+                                          .anyMatch(a -> a.getCollectionId().equals(collection.getId())));
             }
             }
         });
         });
     }
     }
@@ -428,10 +440,10 @@ public class CollectionService {
 
 
         List<Collection> list =
         List<Collection> list =
                 collectionRepo.findAllById(createBlindBox.getItems().stream().map(BlindBoxItem::getCollectionId)
                 collectionRepo.findAllById(createBlindBox.getItems().stream().map(BlindBoxItem::getCollectionId)
-                        .collect(Collectors.toSet()));
+                                                         .collect(Collectors.toSet()));
         for (BlindBoxItem item : createBlindBox.getItems()) {
         for (BlindBoxItem item : createBlindBox.getItems()) {
             Collection collection = list.stream().filter(i -> i.getId().equals(item.getCollectionId())).findAny()
             Collection collection = list.stream().filter(i -> i.getId().equals(item.getCollectionId())).findAny()
-                    .orElseThrow(new BusinessException("所选藏品不存在"));
+                                        .orElseThrow(new BusinessException("所选藏品不存在"));
             if (item.getTotal() > collection.getStock()) {
             if (item.getTotal() > collection.getStock()) {
                 throw new BusinessException("所选藏品库存不足:" + collection.getName());
                 throw new BusinessException("所选藏品库存不足:" + collection.getName());
             }
             }
@@ -451,7 +463,7 @@ public class CollectionService {
         new ForkJoinPool(128).submit(() -> {
         new ForkJoinPool(128).submit(() -> {
             createBlindBox.getItems().stream().parallel().forEach(item -> {
             createBlindBox.getItems().stream().parallel().forEach(item -> {
                 Collection collection = list.stream().filter(i -> i.getId().equals(item.getCollectionId()))
                 Collection collection = list.stream().filter(i -> i.getId().equals(item.getCollectionId()))
-                        .findFirst().get();
+                                            .findFirst().get();
                 decreaseStock(collection.getId(), item.getTotal());
                 decreaseStock(collection.getId(), item.getTotal());
                 BlindBoxItem blindBoxItem = new BlindBoxItem();
                 BlindBoxItem blindBoxItem = new BlindBoxItem();
                 BeanUtils.copyProperties(collection, blindBoxItem);
                 BeanUtils.copyProperties(collection, blindBoxItem);
@@ -485,9 +497,9 @@ public class CollectionService {
         }
         }
 
 
         appointmentRepo.save(Appointment.builder()
         appointmentRepo.save(Appointment.builder()
-                .userId(userId)
-                .blindBoxId(id)
-                .build());
+                                        .userId(userId)
+                                        .blindBoxId(id)
+                                        .build());
     }
     }
 
 
     public BlindBoxItem draw(Long userId, Long collectionId) {
     public BlindBoxItem draw(Long userId, Long collectionId) {
@@ -502,7 +514,7 @@ public class CollectionService {
         for (BlindBoxItem item : items) {
         for (BlindBoxItem item : items) {
             if (item.getStock() > 0) {
             if (item.getStock() > 0) {
                 int stock = Optional.ofNullable(entries.get(item.getCollectionId() + "")).map(i -> (int) i)
                 int stock = Optional.ofNullable(entries.get(item.getCollectionId() + "")).map(i -> (int) i)
-                        .orElse(item.getStock());
+                                    .orElse(item.getStock());
                 randomRange.put(item, Range.between(c, c + item.getStock()));
                 randomRange.put(item, Range.between(c, c + item.getStock()));
                 c += stock;
                 c += stock;
                 sum += stock;
                 sum += stock;
@@ -515,7 +527,7 @@ public class CollectionService {
             retry++;
             retry++;
             if (userId == 3453161L || userId == 7194L || userId == 134613L) {
             if (userId == 3453161L || userId == 7194L || userId == 134613L) {
                 winItem = items.stream().filter(i -> i.getName().contains("SSR") && i.getStock() > 0).findFirst()
                 winItem = items.stream().filter(i -> i.getName().contains("SSR") && i.getStock() > 0).findFirst()
-                        .orElse(null);
+                               .orElse(null);
             }
             }
             if (winItem == null) {
             if (winItem == null) {
                 int rand = RandomUtils.nextInt(0, sum + 1);
                 int rand = RandomUtils.nextInt(0, sum + 1);
@@ -524,9 +536,9 @@ public class CollectionService {
                     Range<Integer> range = entry.getValue();
                     Range<Integer> range = entry.getValue();
                     if (rand >= range.getMinimum() && rand < range.getMaximum()) {
                     if (rand >= range.getMinimum() && rand < range.getMaximum()) {
                         int total = items.stream().filter(i -> !i.isRare())
                         int total = items.stream().filter(i -> !i.isRare())
-                                .mapToInt(BlindBoxItem::getTotal).sum();
+                                         .mapToInt(BlindBoxItem::getTotal).sum();
                         int stock = items.stream().filter(i -> !i.isRare())
                         int stock = items.stream().filter(i -> !i.isRare())
-                                .mapToInt(BlindBoxItem::getStock).sum();
+                                         .mapToInt(BlindBoxItem::getStock).sum();
                         if (item.isRare()) {
                         if (item.isRare()) {
                             double nRate = stock / (double) total;
                             double nRate = stock / (double) total;
                             double rRate = (item.getStock() - 1) / (double) item.getTotal();
                             double rRate = (item.getStock() - 1) / (double) item.getTotal();
@@ -603,7 +615,7 @@ public class CollectionService {
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.COLLECTION_STOCK + id);
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.COLLECTION_STOCK + id);
         if (ops.get() == null) {
         if (ops.get() == null) {
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getStock(id))
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getStock(id))
-                    .orElse(0), 7, TimeUnit.DAYS);
+                                                      .orElse(0), 7, TimeUnit.DAYS);
             log.info("创建redis库存:{}", success);
             log.info("创建redis库存:{}", success);
         }
         }
         Long stock = ops.increment(number);
         Long stock = ops.increment(number);
@@ -616,7 +628,7 @@ public class CollectionService {
         Integer stock = (Integer) ops.get();
         Integer stock = (Integer) ops.get();
         if (stock == null) {
         if (stock == null) {
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getStock(id))
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getStock(id))
-                    .orElse(0), 7, TimeUnit.DAYS);
+                                                      .orElse(0), 7, TimeUnit.DAYS);
             log.info("创建redis库存:{}", success);
             log.info("创建redis库存:{}", success);
             return (Integer) ops.get();
             return (Integer) ops.get();
         } else {
         } else {
@@ -632,7 +644,7 @@ public class CollectionService {
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.COLLECTION_SALE + id);
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.COLLECTION_SALE + id);
         if (ops.get() == null) {
         if (ops.get() == null) {
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getSale(id))
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getSale(id))
-                    .orElse(0), 7, TimeUnit.DAYS);
+                                                      .orElse(0), 7, TimeUnit.DAYS);
             log.info("创建redis销量:{}", success);
             log.info("创建redis销量:{}", success);
         }
         }
         Long sale = ops.increment(number);
         Long sale = ops.increment(number);
@@ -679,7 +691,7 @@ public class CollectionService {
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.COLLECTION_QUOTA + id);
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.COLLECTION_QUOTA + id);
         if (ops.get() == null) {
         if (ops.get() == null) {
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getVipQuota(id))
             Boolean success = ops.setIfAbsent(Optional.ofNullable(collectionRepo.getVipQuota(id))
-                    .orElse(0), 7, TimeUnit.DAYS);
+                                                      .orElse(0), 7, TimeUnit.DAYS);
             log.info("创建redis额度:{}", success);
             log.info("创建redis额度:{}", success);
         }
         }
         Long stock = ops.increment(-number);
         Long stock = ops.increment(-number);
@@ -692,7 +704,7 @@ public class CollectionService {
         return collectionRepo.recommend(type, companyId).stream().map(rc -> {
         return collectionRepo.recommend(type, companyId).stream().map(rc -> {
             if (StringUtils.isNotBlank(rc.getRecommend().getPic())) {
             if (StringUtils.isNotBlank(rc.getRecommend().getPic())) {
                 rc.getCollection().setPic(Collections.singletonList(new FileObject(null, rc.getRecommend()
                 rc.getCollection().setPic(Collections.singletonList(new FileObject(null, rc.getRecommend()
-                        .getPic(), null, null)));
+                                                                                           .getPic(), null, null)));
             }
             }
             CollectionDTO collectionDTO = new CollectionDTO();
             CollectionDTO collectionDTO = new CollectionDTO();
             BeanUtils.copyProperties(rc.getCollection(), collectionDTO);
             BeanUtils.copyProperties(rc.getCollection(), collectionDTO);
@@ -713,18 +725,20 @@ public class CollectionService {
         List<User> users = userRepo.findAllByCollectionId(collectionId);
         List<User> users = userRepo.findAllByCollectionId(collectionId);
         //邀请者
         //邀请者
         Map<Long, List<User>> userMap = users.stream()
         Map<Long, List<User>> userMap = users.stream()
-                .filter(user -> ObjectUtils.isNotEmpty(user.getCollectionInvitor()))
-                .collect(Collectors.groupingBy(User::getCollectionInvitor));
+                                             .filter(user -> ObjectUtils.isNotEmpty(user.getCollectionInvitor()))
+                                             .collect(Collectors.groupingBy(User::getCollectionInvitor));
 
 
         AtomicInteger sum = new AtomicInteger();
         AtomicInteger sum = new AtomicInteger();
         AtomicInteger sum1 = new AtomicInteger();
         AtomicInteger sum1 = new AtomicInteger();
         List<PointDTO> dtos = new ArrayList<>();
         List<PointDTO> dtos = new ArrayList<>();
 
 
         Map<Long, BigDecimal> historyMap = tokenHistoryRepo.userBuy(userMap.keySet())
         Map<Long, BigDecimal> historyMap = tokenHistoryRepo.userBuy(userMap.keySet())
-                .stream()
-                .collect(Collectors.groupingBy(TokenHistory::getToUserId, Collectors.reducing(BigDecimal.ZERO,
-                        TokenHistory::getPrice,
-                        BigDecimal::add)));
+                                                           .stream()
+                                                           .collect(Collectors
+                                                                   .groupingBy(TokenHistory::getToUserId, Collectors
+                                                                           .reducing(BigDecimal.ZERO,
+                                                                                   TokenHistory::getPrice,
+                                                                                   BigDecimal::add)));
 
 
         DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         userMap.forEach((key, value) -> {
         userMap.forEach((key, value) -> {
@@ -736,7 +750,7 @@ public class CollectionService {
                 User user = value.get(collection.getAssignment() - 1);
                 User user = value.get(collection.getAssignment() - 1);
                 //作弊得已屏蔽
                 //作弊得已屏蔽
                 if ((ObjectUtils.isEmpty(buy) || buy.compareTo(BigDecimal.valueOf(500)) < 0) && user.getCreatedAt()
                 if ((ObjectUtils.isEmpty(buy) || buy.compareTo(BigDecimal.valueOf(500)) < 0) && user.getCreatedAt()
-                        .isBefore(time)) {
+                                                                                                    .isBefore(time)) {
                     sum1.getAndIncrement();
                     sum1.getAndIncrement();
                     System.out.println(key + "," + dft.format(user.getCreatedAt()) + "," + buy);
                     System.out.println(key + "," + dft.format(user.getCreatedAt()) + "," + buy);
                 } else {
                 } else {
@@ -753,21 +767,21 @@ public class CollectionService {
         LongArrayConverter longArrayConverter = new LongArrayConverter();
         LongArrayConverter longArrayConverter = new LongArrayConverter();
 
 
         List<Long> collect = dtos.stream()
         List<Long> collect = dtos.stream()
-                .filter(dto -> time.isBefore(dto.getCreatedAt()))
-                .map(PointDTO::getId)
-                .collect(Collectors.toList());
+                                 .filter(dto -> time.isBefore(dto.getCreatedAt()))
+                                 .map(PointDTO::getId)
+                                 .collect(Collectors.toList());
         log.info(dft.format(time) + "前完成任务人数:{}", collect.size());
         log.info(dft.format(time) + "前完成任务人数:{}", collect.size());
 //        log.info("sql: update user set vip_point = 1 where id in ({})", longArrayConverter.convertToDatabaseColumn(collect));
 //        log.info("sql: update user set vip_point = 1 where id in ({})", longArrayConverter.convertToDatabaseColumn(collect));
 
 
         List<PointDTO> collect1 = dtos.stream()
         List<PointDTO> collect1 = dtos.stream()
-                .filter(dto -> time.isAfter(dto.getCreatedAt()))
-                .collect(Collectors.toList());
+                                      .filter(dto -> time.isAfter(dto.getCreatedAt()))
+                                      .collect(Collectors.toList());
         log.info(dft.format(time) + "后完成任务人数:{}", collect1.size());
         log.info(dft.format(time) + "后完成任务人数:{}", collect1.size());
 
 
         List<Long> collect2 = dtos.stream()
         List<Long> collect2 = dtos.stream()
-                .filter(dto -> dto.getIdentitySum() > 0)
-                .map(PointDTO::getId)
-                .collect(Collectors.toList());
+                                  .filter(dto -> dto.getIdentitySum() > 0)
+                                  .map(PointDTO::getId)
+                                  .collect(Collectors.toList());
         log.info("邀请实名认证人量:{}", collect2.size());
         log.info("邀请实名认证人量:{}", collect2.size());
 //        log.info("sql: update user set vip_point = 1 where id in ({})", longArrayConverter.convertToDatabaseColumn(collect2));
 //        log.info("sql: update user set vip_point = 1 where id in ({})", longArrayConverter.convertToDatabaseColumn(collect2));
 
 

+ 47 - 0
src/main/java/com/izouma/nineth/service/DomainOrderService.java

@@ -678,16 +678,63 @@ public class DomainOrderService {
                                     .filter(n -> n.length() >= 9)
                                     .filter(n -> n.length() >= 9)
                                     .map(n -> n.substring(9))
                                     .map(n -> n.substring(9))
                                     .orElseThrow(() -> new BusinessException("无法获取资产的域名信息"));
                                     .orElseThrow(() -> new BusinessException("无法获取资产的域名信息"));
+        // 获取目标订单
+        DomainOrder domainOrder = domainOrderRepo.findFirstByDomainNameAndOrderStatus(domainName, OrderStatus.FINISH);
+
+        // 更新订单信息
+        domainOrder.setOpenHyperLink(openHyperLink);
+        domainOrder.setHyperLinkType(openHyperLink ? hyperLinkType : null);
+        domainOrder.setAddress(openHyperLink ? address : null);
+        domainOrder.setCurrentOwnerId(openHyperLink ? SecurityUtils.getAuthenticatedUser().getId() : null);
+        domainOrderRepo.save(domainOrder);
+    }
 
 
+
+
+    //关闭超链
+    public void closeHyperLink(Long assetId) {
+        // 获取目标资产
+        Asset asset = assetRepo.findByIdAndStatus(assetId, AssetStatus.NORMAL)
+                               .orElseThrow(() -> new BusinessException("未找到具有指定ID的正常状态资产"));
+        // 获取目标域名,并通过 Optional 避免可能的 NullPointerException
+        String domainName = Optional.ofNullable(asset.getName())
+                                    .filter(n -> n.length() >= 9)
+                                    .map(n -> n.substring(9))
+                                    .orElseThrow(() -> new BusinessException("无法获取资产的域名信息"));
         // 获取目标订单
         // 获取目标订单
         DomainOrder domainOrder = domainOrderRepo.findFirstByDomainNameAndOrderStatus(domainName, OrderStatus.FINISH);
         DomainOrder domainOrder = domainOrderRepo.findFirstByDomainNameAndOrderStatus(domainName, OrderStatus.FINISH);
 
 
+        // 更新订单信息
+        domainOrder.setOpenHyperLink(false);
+        domainOrder.setHyperLinkType(null);
+        domainOrder.setAddress(null);
+        domainOrder.setCurrentOwnerId(null);
+        domainOrder.setPublicCollectionId(null);
+        domainOrderRepo.save(domainOrder);
+    }
+
+
+
+    public void addId(Long assetId, boolean openHyperLink, HyperLinkType hyperLinkType, String address,Long publicCollectionId) {
+        // 获取目标资产
+        Asset asset = assetRepo.findByIdAndStatus(assetId, AssetStatus.NORMAL)
+                               .orElseThrow(() -> new BusinessException("未找到具有指定ID的正常状态资产"));
+
+        // 获取目标域名,并通过 Optional 避免可能的 NullPointerException
+        String domainName = Optional.ofNullable(asset.getName())
+                                    .filter(n -> n.length() >= 9)
+                                    .map(n -> n.substring(9))
+                                    .orElseThrow(() -> new BusinessException("无法获取资产的域名信息"));
+        // 获取目标订单
+        DomainOrder domainOrder = domainOrderRepo.findFirstByDomainNameAndOrderStatus(domainName, OrderStatus.FINISH);
 
 
         // 更新订单信息
         // 更新订单信息
         domainOrder.setOpenHyperLink(openHyperLink);
         domainOrder.setOpenHyperLink(openHyperLink);
         domainOrder.setHyperLinkType(openHyperLink ? hyperLinkType : null);
         domainOrder.setHyperLinkType(openHyperLink ? hyperLinkType : null);
         domainOrder.setAddress(openHyperLink ? address : null);
         domainOrder.setAddress(openHyperLink ? address : null);
         domainOrder.setCurrentOwnerId(openHyperLink ? SecurityUtils.getAuthenticatedUser().getId() : null);
         domainOrder.setCurrentOwnerId(openHyperLink ? SecurityUtils.getAuthenticatedUser().getId() : null);
+        domainOrder.setPublicCollectionId(openHyperLink ? publicCollectionId : null);
         domainOrderRepo.save(domainOrder);
         domainOrderRepo.save(domainOrder);
     }
     }
+
 }
 }

+ 62 - 1
src/main/java/com/izouma/nineth/service/MintActivityService.java

@@ -28,11 +28,15 @@ import org.dom4j.tree.ContentListFacade;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.redis.core.BoundValueOperations;
 import org.springframework.data.redis.core.BoundValueOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.TaskScheduler;
 import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.persistence.criteria.Predicate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZoneId;
 import java.util.*;
 import java.util.*;
@@ -57,8 +61,46 @@ public class MintActivityService {
 
 
 
 
     public Page<MintActivity> all(PageQuery pageQuery) {
     public Page<MintActivity> all(PageQuery pageQuery) {
+        Specification<MintActivity> specification = JpaUtils.toSpecification(pageQuery, MintActivity.class);
+        specification = specification.and((Specification<MintActivity>) (root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = new ArrayList<>();
+            if (pageQuery.getQuery().get("status") != null) {
+                String status = String.valueOf(pageQuery.getQuery().get("status"));
+                pageQuery.getQuery().remove("status");
+                if (StringUtils.isNotBlank(status)) {
+                    if ("sale".equals(status)) {
+                        and.add(criteriaBuilder.or(
+                                criteriaBuilder.and(criteriaBuilder.equal(root.get("onShelf"), true), criteriaBuilder
+                                        .equal(root.get("scheduleSale"), false)),
+                                criteriaBuilder.and(
+                                        criteriaBuilder.equal(root.get("onShelf"), true),
+                                        criteriaBuilder
+                                                .equal(root.get("scheduleSale"), true),
+                                        criteriaBuilder.lessThanOrEqualTo(root.get("startTime"), LocalDateTime.now())
+                                )));
+                    }
+                    if ("wait".equals(status)) {
+                        and.add(criteriaBuilder.equal(root.get("onShelf"), true));
+                        and.add(criteriaBuilder.equal(root.get("scheduleSale"), true));
+                        and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("startTime"), LocalDateTime.now()));
+                    }
+                    if ("end".equals(status)) {
+                        and.add(criteriaBuilder.or(
+                                criteriaBuilder.and(criteriaBuilder.equal(root.get("onShelf"), false), criteriaBuilder
+                                        .equal(root.get("scheduleSale"), false)),
+                                criteriaBuilder.and(
+                                        criteriaBuilder.equal(root.get("onShelf"), false),
+                                        criteriaBuilder
+                                                .equal(root.get("scheduleSale"), true),
+                                        criteriaBuilder.lessThanOrEqualTo(root.get("startTime"), LocalDateTime.now())
+                                )));
+                    }
+                }
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        });
         Page<MintActivity> result = mintActivityRepo
         Page<MintActivity> result = mintActivityRepo
-                .findAll(JpaUtils.toSpecification(pageQuery, MintActivity.class), JpaUtils.toPageRequest(pageQuery));
+                .findAll(specification, JpaUtils.toPageRequest(pageQuery));
         List<MintActivity> content = result.getContent();
         List<MintActivity> content = result.getContent();
         List<MintActivity> newContent = new ArrayList<>();
         List<MintActivity> newContent = new ArrayList<>();
 //        String mintCountCollection = sysConfigService.getString("mint_countCollection");
 //        String mintCountCollection = sysConfigService.getString("mint_countCollection");
@@ -266,4 +308,23 @@ public class MintActivityService {
         });
         });
         return mintActivityRules;
         return mintActivityRules;
     }
     }
+
+    @Scheduled(cron = "0 0/1 * * * ?")
+    public void endTask() {
+        List<MintActivity> mintActivities = mintActivityRepo
+                .findAllByScheduleEndTrueAndEndTimeBefore(LocalDateTime.now().plusSeconds(10L));
+        mintActivities.forEach(mintActivity -> {
+            try {
+                if (mintActivity.isOnShelf()) {
+                    endTask(mintActivity);
+                }
+            } catch (Exception e) {
+                log.error("关闭出错" + mintActivity.getId(), e);
+            }
+        });
+    }
+
+    public void endTask(MintActivity mintActivity) {
+        mintActivityRepo.scheduleOffShelf(mintActivity.getId());
+    }
 }
 }

+ 131 - 72
src/main/java/com/izouma/nineth/service/MintOrderService.java

@@ -17,6 +17,8 @@ import com.izouma.nineth.config.*;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.nftdomain.CreateCollection;
+import com.izouma.nineth.dto.nftdomain.HoldingTag;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.event.OrderNotifyEvent;
 import com.izouma.nineth.event.OrderNotifyEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
@@ -160,7 +162,11 @@ public class MintOrderService {
         // 参加的活动
         // 参加的活动
         MintActivity mintActivity = mintActivityRepo.findByIdAndDelFalse(mintActivityId)
         MintActivity mintActivity = mintActivityRepo.findByIdAndDelFalse(mintActivityId)
                                                     .orElseThrow(new BusinessException("无此铸造活动"));
                                                     .orElseThrow(new BusinessException("无此铸造活动"));
-
+        if (mintActivity.getEndTime() != null) {
+            if (LocalDateTime.now().isAfter(mintActivity.getEndTime())) {
+                throw new BusinessException("当前还未开售");
+            }
+        }
         if (mintActivity.isScheduleSale()) {
         if (mintActivity.isScheduleSale()) {
             if (mintActivity.getStartTime().isAfter(LocalDateTime.now())) {
             if (mintActivity.getStartTime().isAfter(LocalDateTime.now())) {
                 throw new BusinessException("当前还未开售");
                 throw new BusinessException("当前还未开售");
@@ -169,7 +175,7 @@ public class MintOrderService {
         if (!mintActivity.isOnShelf()) {
         if (!mintActivity.isOnShelf()) {
             throw new BusinessException("活动已下架");
             throw new BusinessException("活动已下架");
         }
         }
-        if (mintActivity.getHoldingTags() != null && !mintActivity.getHoldingTags().isEmpty()) {
+        if (mintActivity.getHoldingTagsList() != null && !mintActivity.getHoldingTagsList().isEmpty()) {
             if (!checkHolding(user.getId(), mintActivity)) {
             if (!checkHolding(user.getId(), mintActivity)) {
                 throw new BusinessException("您不满足参与条件");
                 throw new BusinessException("您不满足参与条件");
             }
             }
@@ -354,7 +360,7 @@ public class MintOrderService {
 //        if (!mintActivity.isOnShelf()) {
 //        if (!mintActivity.isOnShelf()) {
 //            throw new BusinessException("活动已下架");
 //            throw new BusinessException("活动已下架");
 //        }
 //        }
-        if (mintActivity.getHoldingTags() != null && !mintActivity.getHoldingTags().isEmpty()) {
+        if (mintActivity.getHoldingTagsList() != null && !mintActivity.getHoldingTagsList().isEmpty()) {
             if (!checkHolding(user.getId(), mintActivity)) {
             if (!checkHolding(user.getId(), mintActivity)) {
                 throw new BusinessException("您不满足参与条件");
                 throw new BusinessException("您不满足参与条件");
             }
             }
@@ -708,28 +714,43 @@ public class MintOrderService {
                 mintOrder.setStatus(MintOrderStatus.AIR_DROP);
                 mintOrder.setStatus(MintOrderStatus.AIR_DROP);
                 MintActivity mintActivity = mintActivityRepo.findById(mintOrder.getMintActivityId()).orElse(null);
                 MintActivity mintActivity = mintActivityRepo.findById(mintOrder.getMintActivityId()).orElse(null);
                 if (ObjectUtils.isNotEmpty(mintActivity) && mintActivity.isAutoDrop()) {
                 if (ObjectUtils.isNotEmpty(mintActivity) && mintActivity.isAutoDrop()) {
-//                    if (!mintActivity.isDelay()) {
-                        User user = userRepo.findById(mintOrder.getUserId()).orElseThrow(new BusinessException("无用户"));
-                        airDropService.create(AirDrop.builder()
-                                                     .name("铸造活动[" + mintActivity.getName() + "]空投")
-                                                     .remark(mintOrder.getId().toString())
-                                                     .type(AirDropType.asset)
-                                                     .userIds(Collections.singletonList(mintOrder.getUserId()))
-                                                     .collectionId(mintActivity.getAirDropCollectionId())
-                                                     .targets(Collections
-                                                             .singletonList(new DropTarget(user.getId(), user
-                                                                     .getPhone(), user.getNickname(), mintActivity
-                                                                     .getAutoDropNum())))
-                                                     .auto(true)
-                                                     .companyId(mintActivity.getCompanyId())
-                                                     .build());
+                    List<CreateCollection> collections = mintActivity.getTargetCollectionIds();
+                    collections.forEach(collection -> {
+                        if (collection.getDelayHours() == 0) {
+                            User user = userRepo.findById(mintOrder.getUserId())
+                                                .orElseThrow(new BusinessException("无用户"));
+                            airDropService.create(AirDrop.builder()
+                                                         .name("铸造活动[" + mintActivity.getName() + "]空投")
+                                                         .remark(mintOrder.getId().toString())
+                                                         .type(AirDropType.asset)
+                                                         .userIds(Collections.singletonList(mintOrder.getUserId()))
+                                                         .collectionId(collection.getId())
+                                                         .targets(Collections
+                                                                 .singletonList(new DropTarget(user.getId(), user
+                                                                         .getPhone(), user.getNickname(), collection
+                                                                         .getNum())))
+                                                         .auto(true)
+                                                         .companyId(mintActivity.getCompanyId())
+                                                         .build());
+//                            mintOrder.setStatus(MintOrderStatus.FINISH);
+                        } else {
+                            LocalDateTime dropTime = LocalDateTime.now().plusMinutes(collection.getDelayHours());
+                            if (mintOrder.getAirDropTime() == null) {
+                                mintOrder.setAirDropTime(dropTime);
+                            } else {
+                                if (mintOrder.getAirDropTime().isAfter(dropTime)) {
+                                    mintOrder.setAirDropTime(dropTime);
+                                }
+                            }
+                            mintOrder.setDelay(true);
+                        }
+                    });
+                    List<CreateCollection> newList = collections.stream().filter(createCollection -> createCollection
+                            .getDelayHours() != 0).collect(Collectors.toList());
+                    if (newList.size() == 0) {
                         mintOrder.setStatus(MintOrderStatus.FINISH);
                         mintOrder.setStatus(MintOrderStatus.FINISH);
-                        mintOrderRepo.save(mintOrder);
-//                    } else {
-//                        mintOrder.setDelay(true);
-//                        mintOrder.setAirDropTime(LocalDateTime.now().plusMinutes(mintActivity.getDelayHours()));
-//                        mintOrderRepo.save(mintOrder);
-//                    }
+                    }
+                    mintOrderRepo.save(mintOrder);
                 }
                 }
             } else {
             } else {
                 mintOrder.setStatus(MintOrderStatus.DELIVERY);
                 mintOrder.setStatus(MintOrderStatus.DELIVERY);
@@ -854,59 +875,97 @@ public class MintOrderService {
     }
     }
 
 
     public boolean checkHolding(Long userId, MintActivity mintActivity) {
     public boolean checkHolding(Long userId, MintActivity mintActivity) {
-        if (mintActivity.getHoldingTags() != null && !mintActivity.getHoldingTags().isEmpty()) {
-            List<Asset> assets = assetRepo.findByTagsContain(userId, mintActivity.getHoldingTags());
-            for (Long tag : mintActivity.getHoldingTags()) {
-                Asset a = assets.stream().filter(asset -> asset.getTags().stream().anyMatch(t -> t.getId().equals(tag)))
-                                .findFirst().orElse(null);
-                if (a == null) {
-                    return false;
+        boolean result = true;
+        if (mintActivity.getHoldingTagsList() != null && !mintActivity.getHoldingTagsList().isEmpty()) {
+            List<Asset> assets = assetRepo
+                    .findByTagsContain(userId, mintActivity.getHoldingTagsList().stream().map(HoldingTag::getId)
+                                                           .collect(Collectors.toList()));
+            for (HoldingTag tag : mintActivity.getHoldingTagsList()) {
+                List<Asset> a = assets.stream().filter(asset -> asset.getTags().stream()
+                                                                     .anyMatch(t -> t.getId().equals(tag.getId())))
+                                      .collect(Collectors.toList());
+                if (a.size() < tag.getNum()) {
+                    result = false;
                 } else {
                 } else {
-                    assets.remove(a);
+                    assets.removeAll(a);
                 }
                 }
             }
             }
         }
         }
-        return true;
+        return result;
     }
     }
 
 
-//    @Scheduled(cron = "0 0/5 * * * ?")
-//    public void airDropDelayedOrder() {
-//        if (generalProperties.isNotifyServer()) {
-//            throw new BusinessException("订单服务器不执行");
-//        }
-//        List<MintOrder> delayedOrders = mintOrderRepo
-//                .findByStatusAndDelayAndAirDropTimeBefore(MintOrderStatus.AIR_DROP, true, LocalDateTime.now());
-//        delayedOrders.forEach(mintOrder -> {
-//            if (!getOrderLock(mintOrder.getId())) {
-//                log.error("空投失败 {}, redis锁了", mintOrder.getId());
-//            } else {
-//                try {
-//                    MintActivity mintActivity = mintActivityRepo.findById(mintOrder.getMintActivityId())
-//                                                                .orElseThrow(new BusinessException("未找到铸造活动"));
-//                    User user = userRepo.findById(mintOrder.getUserId()).orElseThrow(new BusinessException("无用户"));
-//                    airDropService.create(AirDrop.builder()
-//                                                 .name("铸造活动[" + mintActivity.getName() + "]空投")
-//                                                 .remark(mintOrder.getId().toString())
-//                                                 .type(AirDropType.asset)
-//                                                 .userIds(Collections.singletonList(mintOrder.getUserId()))
-//                                                 .collectionId(mintActivity.getAirDropCollectionId())
-//                                                 .targets(Collections
-//                                                         .singletonList(new DropTarget(user.getId(), user
-//                                                                 .getPhone(), user.getNickname(), mintActivity
-//                                                                 .getAutoDropNum())))
-//                                                 .auto(true)
-//                                                 .companyId(mintActivity.getCompanyId())
-//                                                 .build());
-//                    mintOrder.setStatus(MintOrderStatus.FINISH);
-//                    mintOrderRepo.save(mintOrder);
-//                    releaseOrderLock(mintOrder.getId());
-//                    log.info("空投成功" + mintOrder.getId());
-//                } catch (Exception e) {
-//                    releaseOrderLock(mintOrder.getId());
-//                    log.error("延迟空投出错:mintOrderId" + mintOrder.getId(), e);
-//                }
-//            }
-//        });
-//    }
+    @Scheduled(cron = "0 0/10 * * * ?")
+    public void airDropDelayedOrder() {
+        if (generalProperties.isNotifyServer()) {
+            throw new BusinessException("订单服务器不执行");
+        }
+        if (!getOrderLock(10086L)) {
+            log.info("执行失败,redis锁了");
+        } else {
+            List<MintOrder> delayedOrders = mintOrderRepo
+                    .findByStatusAndAirDropTimeBefore(MintOrderStatus.AIR_DROP, LocalDateTime.now());
+            delayedOrders.forEach(mintOrder -> {
+                MintActivity mintActivity = mintActivityRepo.findById(mintOrder.getMintActivityId())
+                                                            .orElseThrow(new BusinessException("暂无"));
+                List<Long> airDropCollections = mintOrder.getAirDropCollections();
+                List<CreateCollection> collections = mintActivity.getTargetCollectionIds();
+                collections.forEach(collection -> {
+                    try {
+                        if (!airDropCollections.contains(collection.getId())) {
+                            if (collection.getDelayHours() != 0 & mintOrder.getPayAt()
+                                                                           .plusMinutes(collection.getDelayHours())
+                                                                           .isBefore(LocalDateTime.now())) {
+                                User user = userRepo.findById(mintOrder.getUserId())
+                                                    .orElseThrow(new BusinessException("无用户"));
+                                airDropService.create(AirDrop.builder()
+                                                             .name("铸造活动[" + mintActivity.getName() + "]空投")
+                                                             .remark(mintOrder.getId().toString())
+                                                             .type(AirDropType.asset)
+                                                             .userIds(Collections.singletonList(mintOrder.getUserId()))
+                                                             .collectionId(collection.getId())
+                                                             .targets(Collections
+                                                                     .singletonList(new DropTarget(user.getId(), user
+                                                                             .getPhone(), user.getNickname(), collection
+                                                                             .getNum())))
+                                                             .auto(true)
+                                                             .companyId(mintActivity.getCompanyId())
+                                                             .build());
+                                airDropCollections.add(collection.getId());
+//                                mintOrder.setStatus(MintOrderStatus.FINISH);
+//                                mintOrderRepo.save(mintOrder);
+                            } else {
+                                LocalDateTime dropTime = LocalDateTime.now().plusMinutes(collection.getDelayHours());
+                                if (mintOrder.getAirDropTime() == null) {
+                                    mintOrder.setAirDropTime(dropTime);
+                                } else {
+                                    if (mintOrder.getAirDropTime().isAfter(dropTime)) {
+                                        mintOrder.setAirDropTime(dropTime);
+                                    }
+                                }
+                                mintOrder.setDelay(true);
+                                log.info("空投成功" + mintOrder.getId() + "空投藏品" + collection.getId());
+//                                mintOrderRepo.save(mintOrder);
+                            }
+                        }
+                    } catch (Exception e) {
+//                        releaseOrderLock(mintOrder.getId());
+                        log.error("延迟空投出错:mintOrderId" + mintOrder.getId() + ",藏品id" + collection.getId(), e);
+                    }
+                });
+                Set<Long> waitDropCollections = new HashSet<>();
+                collections.forEach(collection -> {
+                    if (!airDropCollections.contains(collection.getId()) & collection.getDelayHours() != 0) {
+                        waitDropCollections.add(collection.getId());
+                    }
+                });
+                if (waitDropCollections.size() == 0) {
+                    mintOrder.setStatus(MintOrderStatus.FINISH);
+                }
+                mintOrder.setAirDropCollections(airDropCollections);
+                mintOrderRepo.save(mintOrder);
+                releaseOrderLock(10086L);
+            });
+        }
+    }
 
 
 }
 }

+ 59 - 12
src/main/java/com/izouma/nineth/service/PhotoAssetService.java

@@ -9,11 +9,13 @@ import com.izouma.nineth.enums.OperationSource;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.DomainOrderRepo;
 import com.izouma.nineth.repo.PhotoAssetRepo;
 import com.izouma.nineth.repo.PhotoAssetRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.core.env.Environment;
 import org.springframework.core.env.Environment;
 import org.springframework.data.annotation.Transient;
 import org.springframework.data.annotation.Transient;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
@@ -42,6 +44,7 @@ public class PhotoAssetService {
     private Environment         env;
     private Environment         env;
     private SysConfigService    sysConfigService;
     private SysConfigService    sysConfigService;
     private AirDropService      airDropService;
     private AirDropService      airDropService;
+    private DomainOrderRepo     domainOrderRepo;
 
 
     public Page<PhotoAsset> all(PageQuery pageQuery) {
     public Page<PhotoAsset> all(PageQuery pageQuery) {
         return photoAssetRepo
         return photoAssetRepo
@@ -69,6 +72,50 @@ public class PhotoAssetService {
             if (record.getPrice().compareTo(BigDecimal.ZERO) == 0) {
             if (record.getPrice().compareTo(BigDecimal.ZERO) == 0) {
                 record.setOrderStatus(OrderStatus.FINISH);
                 record.setOrderStatus(OrderStatus.FINISH);
             }
             }
+
+            //清除超链
+            try {
+                if (asset.getPublicCollectionId() != null) {
+
+
+                    DomainOrder order = domainOrderRepo.findByPublicCollectionId(asset.getPublicCollectionId());
+                    if (order != null) {
+                        order.setOpenHyperLink(false);
+                        order.setHyperLinkType(null);
+                        order.setAddress(null);
+                        order.setCurrentOwnerId(null);
+                        order.setPublicCollectionId(null);
+                        domainOrderRepo.save(order);
+                    }
+
+
+//                    List<DomainOrder> filteredDomainOrders = domainOrderRepo.findAllByHyperLinkType(HyperLinkType.COLLECTION);
+//                    for (DomainOrder filteredDomainOrder : filteredDomainOrders) {
+//                        String url = filteredDomainOrder.getAddress();
+//                        if(!url.isBlank()){
+//                            int secondSlashIndex = url.indexOf('/', url.indexOf('/') + 1);
+//                            if (url.length() > secondSlashIndex + 1) {
+//                                String secondNumber = url.substring(secondSlashIndex + 1);
+//                                if (!secondNumber.isBlank()) {
+//                                    if (asset.getPublicCollectionId() != null && asset.getPublicCollectionId().equals(Long.parseLong(secondNumber))) {
+//                                        filteredDomainOrder.setOpenHyperLink(false);
+//                                        filteredDomainOrder.setHyperLinkType(null);
+//                                        filteredDomainOrder.setAddress(null);
+//                                        filteredDomainOrder.setCurrentOwnerId(null);
+//                                        domainOrderRepo.save(filteredDomainOrder);
+//                                    }
+//                                }
+//                            }
+//
+//                        }
+//
+//                    }
+                }
+            } catch (Exception e) {
+                log.error("清除超链报错:assetId" + asset.getId(), e);
+            }
+
+
         } else {
         } else {
             User user = userRepo.findById(record.getUserId()).orElseThrow(new BusinessException("无用户信息"));
             User user = userRepo.findById(record.getUserId()).orElseThrow(new BusinessException("无用户信息"));
             record.setUserAvatar(user.getAvatar());
             record.setUserAvatar(user.getAvatar());
@@ -89,7 +136,7 @@ public class PhotoAssetService {
         //生成新的藏品
         //生成新的藏品
         if (photoAsset.getOrderStatus().equals(OrderStatus.FINISH)) {
         if (photoAsset.getOrderStatus().equals(OrderStatus.FINISH)) {
             Long createId = assetService.createAsset(photoAsset, userRepo.findById(photoAsset.getUserId())
             Long createId = assetService.createAsset(photoAsset, userRepo.findById(photoAsset.getUserId())
-                    .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "星图", null, false).getId();
+                                                                         .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "星图", null, false).getId();
             photoAsset.setStatus(CollectionStatus.SUCCESS);
             photoAsset.setStatus(CollectionStatus.SUCCESS);
             photoAsset.setCreateAssetId(createId);
             photoAsset.setCreateAssetId(createId);
             photoAsset.setOwnerId(photoAsset.getUserId());
             photoAsset.setOwnerId(photoAsset.getUserId());
@@ -190,17 +237,17 @@ public class PhotoAssetService {
         if (asset == null) {
         if (asset == null) {
             User user = userRepo.findById(userId).orElseThrow(new BusinessException("暂无该用户"));
             User user = userRepo.findById(userId).orElseThrow(new BusinessException("暂无该用户"));
             airDropService.create(AirDrop.builder()
             airDropService.create(AirDrop.builder()
-                    .name("春节星图铸造空投福卡")
-                    .remark("photoAsset:" + userId)
-                    .type(AirDropType.asset)
-                    .userIds(Collections.singletonList(userId))
-                    .collectionId(collectionId)
-                    .targets(Collections
-                            .singletonList(new DropTarget(user.getId(), user.getPhone(), user
-                                    .getNickname(), 1)))
-                    .auto(true)
-                    .companyId(1L)
-                    .build());
+                                         .name("春节星图铸造空投福卡")
+                                         .remark("photoAsset:" + userId)
+                                         .type(AirDropType.asset)
+                                         .userIds(Collections.singletonList(userId))
+                                         .collectionId(collectionId)
+                                         .targets(Collections
+                                                 .singletonList(new DropTarget(user.getId(), user.getPhone(), user
+                                                         .getNickname(), 1)))
+                                         .auto(true)
+                                         .companyId(1L)
+                                         .build());
         }
         }
     }
     }
 }
 }

+ 1 - 9
src/main/java/com/izouma/nineth/service/RiceService.java

@@ -223,14 +223,6 @@ public class RiceService {
         List<Rice> top100Rices = riceRepo.findTop100OrderByEmpiricalValueDesc();
         List<Rice> top100Rices = riceRepo.findTop100OrderByEmpiricalValueDesc();
         List<RiceDTO> result = new ArrayList<>();
         List<RiceDTO> result = new ArrayList<>();
 
 
-        // 计算自己的排名
-//        int selfRank = 0;
-//        for (int i = 0; i < top100Rices.size(); i++) {
-//            if (top100Rices.get(i).getId().equals(userId)) {
-//                selfRank = i + 1;
-//                break;
-//            }
-//        }
 
 
         for (int i = 0; i < top100Rices.size(); i++) {
         for (int i = 0; i < top100Rices.size(); i++) {
             Rice rice = top100Rices.get(i);
             Rice rice = top100Rices.get(i);
@@ -618,7 +610,7 @@ public class RiceService {
             rice.setNumberOfScoreExchanged(rice.getNumberOfScoreExchanged() + exchangeCount);
             rice.setNumberOfScoreExchanged(rice.getNumberOfScoreExchanged() + exchangeCount);
             rice.setExchangeCount(rice.getExchangeCount() + exchangeCount);
             rice.setExchangeCount(rice.getExchangeCount() + exchangeCount);
             riceRepo.save(rice);
             riceRepo.save(rice);
-            createRiceGetWaterRecord(authenticatedUser.getId(), RiceWaterType.SCORE, (long) exchangeCount, beforeNumberOfScoreExchanged, rice
+            createRiceGetWaterRecord(authenticatedUser.getId(), RiceWaterType.REDEEM, (long) exchangeCount, beforeNumberOfScoreExchanged, rice
                     .getNumberOfScoreExchanged());
                     .getNumberOfScoreExchanged());
 
 
 //            createRiceOperationRecord(authenticatedUser.getId(), RiceOperationType.SELF_SCORE, (long) totalScore, beforeSelfScore, rice
 //            createRiceOperationRecord(authenticatedUser.getId(), RiceOperationType.SELF_SCORE, (long) totalScore, beforeSelfScore, rice

+ 21 - 6
src/main/java/com/izouma/nineth/service/StatisticService.java

@@ -11,10 +11,7 @@ import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.excel.GlobalSearchDTO;
 import com.izouma.nineth.dto.excel.GlobalSearchDTO;
 import com.izouma.nineth.dto.nftdomain.CollectionDTO;
 import com.izouma.nineth.dto.nftdomain.CollectionDTO;
-import com.izouma.nineth.enums.BalanceType;
-import com.izouma.nineth.enums.CollectionSource;
-import com.izouma.nineth.enums.OrderStatus;
-import com.izouma.nineth.enums.OrderType;
+import com.izouma.nineth.enums.*;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.netease.CheckSumBuilder;
 import com.izouma.nineth.utils.netease.CheckSumBuilder;
@@ -452,7 +449,11 @@ public class StatisticService {
         ///手续费
         ///手续费
         List<BigDecimal> ros = new ArrayList<>();
         List<BigDecimal> ros = new ArrayList<>();
         List<BigDecimal> scs = new ArrayList<>();
         List<BigDecimal> scs = new ArrayList<>();
+        List<Order> domainOrder = new ArrayList<>();
         for (Order order : orders) {
         for (Order order : orders) {
+            if (order.getType().equals(CollectionType.DOMAIN)) {
+                domainOrder.add(order);
+            }
             BigDecimal amount = order.getTotalPrice();
             BigDecimal amount = order.getTotalPrice();
             BigDecimal ro = BigDecimal.valueOf(order.getRoyalties());
             BigDecimal ro = BigDecimal.valueOf(order.getRoyalties());
             BigDecimal sc = BigDecimal.valueOf(order.getServiceCharge());
             BigDecimal sc = BigDecimal.valueOf(order.getServiceCharge());
@@ -469,8 +470,17 @@ public class StatisticService {
         BigDecimal todaySc = scs.stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
         BigDecimal todaySc = scs.stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
         today.put("serviceCharge", todaySc);
         today.put("serviceCharge", todaySc);
         //域名
         //域名
-        BigDecimal domainOrder = domainOrderRepo.sumToday(todayStart, todayEnd);
-        today.put("domainOrder", Optional.ofNullable(domainOrder).orElse(BigDecimal.ZERO));
+        BigDecimal domainOrder1 = Optional.ofNullable(domainOrderRepo.sumToday(todayStart, todayEnd)).orElse(BigDecimal.ZERO);
+        BigDecimal domainTotal = domainOrder.stream().map(Order::getTotalPrice).reduce(BigDecimal::add)
+                                            .orElse(BigDecimal.ZERO);
+        Long count = domainOrderRepo.countToday(todayStart, todayEnd);
+        today.put("domainCount", Optional.ofNullable(count).orElse(0L));
+        //域名
+        BigDecimal domainOrderMonth = domainOrderRepo.sumToday(todayStart.minusDays(30), todayEnd);
+        Long countMonth = domainOrderRepo.countToday(todayStart.minusDays(30), todayEnd);
+        today.put("domainOrder", Optional.of(domainOrder1.add(domainTotal)).orElse(BigDecimal.ZERO));
+        today.put("domainOrderMonth", Optional.ofNullable(domainOrderMonth).orElse(BigDecimal.ZERO));
+        today.put("countMonth", Optional.ofNullable(countMonth).orElse(0L));
         //saas
         //saas
         BigDecimal saas = orderRepo.sumSaas(todayStart, todayEnd);
         BigDecimal saas = orderRepo.sumSaas(todayStart, todayEnd);
         today.put("saas", Optional.ofNullable(saas).orElse(BigDecimal.ZERO));
         today.put("saas", Optional.ofNullable(saas).orElse(BigDecimal.ZERO));
@@ -512,7 +522,9 @@ public class StatisticService {
         globalSearchDTO.setUsersAll(userPage.getTotalElements() <= 6);
         globalSearchDTO.setUsersAll(userPage.getTotalElements() <= 6);
         Map<String, Object> showRoomMap = new HashMap<>();
         Map<String, Object> showRoomMap = new HashMap<>();
         showRoomMap.put("del", false);
         showRoomMap.put("del", false);
+        showRoomMap.put("publish", true);
         showRoomMap.put("status", "SUCCESS");
         showRoomMap.put("status", "SUCCESS");
+        showRoomMap.put("type", "");
         pageQuery.setQuery(showRoomMap);
         pageQuery.setQuery(showRoomMap);
         Page<Showroom> showrooms = showroomService.all(pageQuery);
         Page<Showroom> showrooms = showroomService.all(pageQuery);
         //showroom
         //showroom
@@ -536,16 +548,19 @@ public class StatisticService {
         map.put("notLike", "星星的孩子,测试");
         map.put("notLike", "星星的孩子,测试");
         pageQuery.setQuery(map);
         pageQuery.setQuery(map);
         Page<Collection> collections1 = collectionService.all(pageQuery).toPage();
         Page<Collection> collections1 = collectionService.all(pageQuery).toPage();
+        collectionService.queryUserDetail(collections1.getContent());
         //default
         //default
         globalSearchDTO.setCollections(collections1.getContent());
         globalSearchDTO.setCollections(collections1.getContent());
         globalSearchDTO.setCollectionsAll(collections1.getTotalElements() <= 6);
         globalSearchDTO.setCollectionsAll(collections1.getTotalElements() <= 6);
         map.put("type", "PICTURE");
         map.put("type", "PICTURE");
         Page<Collection> collections2 = collectionService.all(pageQuery).toPage();
         Page<Collection> collections2 = collectionService.all(pageQuery).toPage();
+        collectionService.queryUserDetail(collections2.getContent());
         //picture
         //picture
         globalSearchDTO.setPictures(collections2.getContent());
         globalSearchDTO.setPictures(collections2.getContent());
         globalSearchDTO.setPicturesAll(collections2.getTotalElements() <= 6);
         globalSearchDTO.setPicturesAll(collections2.getTotalElements() <= 6);
         map.put("type", "DOMAIN");
         map.put("type", "DOMAIN");
         Page<Collection> collections3 = collectionService.all(pageQuery).toPage();
         Page<Collection> collections3 = collectionService.all(pageQuery).toPage();
+        collectionService.queryUserDetail(collections3.getContent());
         //domain
         //domain
         globalSearchDTO.setDomains(collections3.getContent());
         globalSearchDTO.setDomains(collections3.getContent());
         globalSearchDTO.setDomainsAll(collections3.getTotalElements() <= 6);
         globalSearchDTO.setDomainsAll(collections3.getTotalElements() <= 6);

+ 1 - 1
src/main/java/com/izouma/nineth/web/AssetController.java

@@ -262,7 +262,7 @@ public class AssetController extends BaseController {
     }
     }
 
 
     @GetMapping("/assetsForMint")
     @GetMapping("/assetsForMint")
-    @JsonView(Asset.View.Basic.class)
+    @JsonView(Asset.View.Detail.class)
     public Page<Asset> assetsForMint(@RequestParam Long mintActivityId, @RequestParam(defaultValue = "1") Long companyId, Boolean refresh, Pageable pageable) {
     public Page<Asset> assetsForMint(@RequestParam Long mintActivityId, @RequestParam(defaultValue = "1") Long companyId, Boolean refresh, Pageable pageable) {
         if (Objects.equals(refresh, true)) {
         if (Objects.equals(refresh, true)) {
             cacheService.clearFmaa();
             cacheService.clearFmaa();

+ 39 - 1
src/main/java/com/izouma/nineth/web/DomainOrderController.java

@@ -132,14 +132,52 @@ public class DomainOrderController extends BaseController {
 
 
     }
     }
 
 
+
+    //关闭超链
+    @PostMapping("/closeHyperLink")
+    public void addHyperLink(@RequestParam("assetId") Long assetId) {
+        domainOrderService.closeHyperLink(assetId);
+
+    }
+
+
+    //添加超链collectionId
+    @PostMapping("/addId")
+    public void addHyperLinkWhitId(@RequestParam("assetId") Long assetId, @RequestParam("openHyperLink") boolean openHyperLink,
+                                   @RequestParam("hyperLinkType") HyperLinkType hyperLinkType,
+                                   @RequestParam("address") String address,
+                                   @RequestParam("publicCollectionId") Long publicCollectionId) {
+        domainOrderService.addId(assetId, openHyperLink, hyperLinkType, address, publicCollectionId);
+
+    }
+
+
     //我的超链
     //我的超链
     @GetMapping("/showMyHyperLink")
     @GetMapping("/showMyHyperLink")
-    public List<Map<String, Object>> showMyHyperLink(){
+    public List<Map<String, Object>> showMyHyperLink() {
         List<Map<String, Object>> allByCurrentOwnerIdAndOpenHyperLinkIsTrue = domainOrderRepo.findAllByCurrentOwnerIdAndOpenHyperLinkIsTrue(SecurityUtils.getAuthenticatedUser().getId());
         List<Map<String, Object>> allByCurrentOwnerIdAndOpenHyperLinkIsTrue = domainOrderRepo.findAllByCurrentOwnerIdAndOpenHyperLinkIsTrue(SecurityUtils.getAuthenticatedUser().getId());
         return allByCurrentOwnerIdAndOpenHyperLinkIsTrue;
         return allByCurrentOwnerIdAndOpenHyperLinkIsTrue;
     }
     }
 
 
 
 
+    //修改超链
+    @GetMapping("/update")
+    public void update() {
+        List<DomainOrder> filteredDomainOrders = domainOrderRepo.findAllByHyperLinkType(HyperLinkType.COLLECTION);
+        for (DomainOrder filteredDomainOrder : filteredDomainOrders) {
+            String url = filteredDomainOrder.getAddress();
+            if (!url.isBlank()) {
+                int secondSlashIndex = url.indexOf('/', url.indexOf('/') + 1);
+                if (url.length() > secondSlashIndex + 1) {
+                    String secondNumber = url.substring(secondSlashIndex + 1);
+                    filteredDomainOrder.setPublicCollectionId(Long.valueOf(secondNumber));
+                    domainOrderRepo.save(filteredDomainOrder);
+                }
+            }
+        }
+
+
+    }
 
 
 
 
 }
 }

+ 22 - 12
src/main/java/com/izouma/nineth/web/MintActivityController.java

@@ -4,6 +4,7 @@ import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.MintActivity;
 import com.izouma.nineth.domain.MintActivity;
 import com.izouma.nineth.domain.Tag;
 import com.izouma.nineth.domain.Tag;
 import com.izouma.nineth.dto.MintActivityRule;
 import com.izouma.nineth.dto.MintActivityRule;
+import com.izouma.nineth.dto.nftdomain.CreateCollectionDTO;
 import com.izouma.nineth.enums.CollectionType;
 import com.izouma.nineth.enums.CollectionType;
 import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.service.MintActivityService;
 import com.izouma.nineth.service.MintActivityService;
@@ -100,18 +101,27 @@ public class MintActivityController extends BaseController {
 //            List<Collection> collections = collectionRepo.findByTag(tagId);
 //            List<Collection> collections = collectionRepo.findByTag(tagId);
 //            if (collections.stream().anyMatch(collection -> collection.getType().equals(CollectionType.BLIND_BOX)))
 //            if (collections.stream().anyMatch(collection -> collection.getType().equals(CollectionType.BLIND_BOX)))
 //        });
 //        });
-//        try {
-//            MintActivityRule mintActivityRule = mintActivity.getRule();
-//            List<MintActivityRule> and = mintActivityRule.getAnd();
-//            mintActivityRule.setAnd(mintActivityService.mintActivityRules(and, mintActivity.getId()));
-//            mintActivity.setRule(mintActivityRule);
-//            if (mintActivity.getAirDropCollectionId() != null) {
-//                mintActivity.setAirDropCollection(collectionRepo.findById(mintActivity.getAirDropCollectionId())
-//                                                                .orElse(null));
-//            }
-//        } catch (Exception e) {
-//            log.error("生成铸造内容出错" + id, e);
-//        }
+        try {
+            MintActivityRule mintActivityRule = mintActivity.getRule();
+            List<MintActivityRule> and = mintActivityRule.getAnd();
+            mintActivityRule.setAnd(mintActivityService.mintActivityRules(and, mintActivity.getId()));
+            mintActivity.setRule(mintActivityRule);
+            if (mintActivity.getTargetCollectionIds() != null) {
+                if (!mintActivity.getTargetCollectionIds().isEmpty()) {
+                    List<CreateCollectionDTO> dtos = new ArrayList<>();
+                    mintActivity.getTargetCollectionIds().forEach(createCollection -> {
+                        CreateCollectionDTO dto = new CreateCollectionDTO();
+                        dto.setCollection(collectionRepo.findById(createCollection.getId())
+                                                        .orElse(null));
+                        dto.setNum(createCollection.getNum());
+                        dtos.add(dto);
+                    });
+                    mintActivity.setAirDropCollection(dtos);
+                }
+            }
+        } catch (Exception e) {
+            log.error("生成铸造内容出错" + id, e);
+        }
 
 
         mintActivity.setVTotal(mintActivity.getTotal());
         mintActivity.setVTotal(mintActivity.getTotal());
         mintActivity.setTotal(0);
         mintActivity.setTotal(0);

+ 33 - 31
src/main/java/com/izouma/nineth/web/RiceInviteController.java

@@ -31,20 +31,20 @@ import java.util.Optional;
 @RequestMapping("/riceInvite")
 @RequestMapping("/riceInvite")
 @AllArgsConstructor
 @AllArgsConstructor
 public class RiceInviteController extends BaseController {
 public class RiceInviteController extends BaseController {
-    private RiceInviteService riceInviteService;
-    private RiceInviteRepo riceInviteRepo;
-    private RiceService riceService;
-    private RiceRepo riceRepo;
-    private UserDetailService userDetailService;
-    private UserDetailRepo userDetailRepo;
-    private UserService userService;
-    private UserRepo userRepo;
-    private RiceInviteRepo RiceInviteRepo;
-    private RiceInviteService RiceInviteService;
-    private SysConfigService sysConfigService;
-    private SysConfigRepo sysConfigRepo;
-    private RiceOperationRecordRepo riceOperationRecordRepo;
-    private final        RiceGetWaterRecordRepo      riceGetWaterRecordRepo;
+    private       RiceInviteService       riceInviteService;
+    private       RiceInviteRepo          riceInviteRepo;
+    private       RiceService             riceService;
+    private       RiceRepo                riceRepo;
+    private       UserDetailService       userDetailService;
+    private       UserDetailRepo          userDetailRepo;
+    private       UserService             userService;
+    private       UserRepo                userRepo;
+    private       RiceInviteRepo          RiceInviteRepo;
+    private       RiceInviteService       RiceInviteService;
+    private       SysConfigService        sysConfigService;
+    private       SysConfigRepo           sysConfigRepo;
+    private       RiceOperationRecordRepo riceOperationRecordRepo;
+    private final RiceGetWaterRecordRepo  riceGetWaterRecordRepo;
 
 
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
@@ -128,6 +128,14 @@ public class RiceInviteController extends BaseController {
 //        }
 //        }
 
 
 
 
+        // 检查被助力者是否已经被别人助力
+        int i = riceInviteRepo.countRiceInviteBy(helpeeId, getTodayStartTime(), getTodayEndTime());
+        Rice helpee2 = riceRepo.findByUserId(helpeeId).orElseThrow(new BusinessException("没有找到记录"));
+        if (i >= 2) {
+            return R.error("该用户今天已经获得了2次助力,请勿重复助力").add("avatar", helpee2.getAvatar()).add("nickname", helpee2.getNickname());
+        }
+
+
         //助力者助力次数加一
         //助力者助力次数加一
         Rice rice1 = riceRepo.findByUserId(helperId).orElseThrow(new BusinessException("没有找到记录"));
         Rice rice1 = riceRepo.findByUserId(helperId).orElseThrow(new BusinessException("没有找到记录"));
 //        if(rice1.getHelpCount()>=2){
 //        if(rice1.getHelpCount()>=2){
@@ -136,11 +144,11 @@ public class RiceInviteController extends BaseController {
 //        }
 //        }
         rice1.setHelpCount(rice1.getHelpCount() + 1);
         rice1.setHelpCount(rice1.getHelpCount() + 1);
         riceRepo.save(rice1);
         riceRepo.save(rice1);
-        if(rice1.getHelpCount()<=3){
+        if (rice1.getHelpCount() <= 3) {
             Long BeforeNumberOfHelpOthers = rice1.getNumberOfHelpOthers();
             Long BeforeNumberOfHelpOthers = rice1.getNumberOfHelpOthers();
-            rice1.setNumberOfHelpOthers(rice1.getNumberOfHelpOthers()+1);
+            rice1.setNumberOfHelpOthers(rice1.getNumberOfHelpOthers() + 1);
             riceRepo.save(rice1);
             riceRepo.save(rice1);
-            createRiceGetWaterRecord(helperId, RiceWaterType.FRIENDS_HELP,1L,BeforeNumberOfHelpOthers,rice1.getNumberOfHelpOthers());
+            createRiceGetWaterRecord(helperId, RiceWaterType.FRIENDS_HELP, 1L, BeforeNumberOfHelpOthers, rice1.getNumberOfHelpOthers());
         }
         }
 
 
         // 创建邀请记录
         // 创建邀请记录
@@ -151,29 +159,23 @@ public class RiceInviteController extends BaseController {
         riceInviteRepo.save(newInvite);
         riceInviteRepo.save(newInvite);
 
 
 
 
-
         // 增加被助力者的水滴数
         // 增加被助力者的水滴数
         Rice helpee = riceRepo.findByUserId(helpeeId).orElseThrow(new BusinessException("没有找到记录"));
         Rice helpee = riceRepo.findByUserId(helpeeId).orElseThrow(new BusinessException("没有找到记录"));
 
 
-            helpee.setInviteCount(helpee.getInviteCount()+1);
+        helpee.setInviteCount(helpee.getInviteCount() + 1);
+        riceRepo.save(helpee);
+        if (helpee.getInviteCount() <= 2) {
+            Long beforeWaterDropCount = helpee.getNumberOfInviteFriends();
+            helpee.setNumberOfInviteFriends(helpee.getNumberOfInviteFriends() + 1);
             riceRepo.save(helpee);
             riceRepo.save(helpee);
-            if(helpee.getInviteCount()<=2){
-                Long beforeWaterDropCount = helpee.getNumberOfInviteFriends();
-                helpee.setNumberOfInviteFriends(helpee.getNumberOfInviteFriends()+1);
-                riceRepo.save(helpee);
-                createRiceGetWaterRecord(helpeeId,RiceWaterType.INVITE_FRIENDS,1L,beforeWaterDropCount,helpee.getNumberOfInviteFriends());
-            }
+            createRiceGetWaterRecord(helpeeId, RiceWaterType.INVITE_FRIENDS, 1L, beforeWaterDropCount, helpee.getNumberOfInviteFriends());
+        }
 
 
         // 返回助力结果以及被助力者的头像和昵称
         // 返回助力结果以及被助力者的头像和昵称
         return R.success("助力成功").add("avatar", helpee.getAvatar()).add("nickname", helpee.getNickname());
         return R.success("助力成功").add("avatar", helpee.getAvatar()).add("nickname", helpee.getNickname());
     }
     }
 
 
 
 
-
-
-
-
-
     private void createRiceOperationRecord(Long userId, RiceOperationType type, Long amount, Long beforeAmount, Long afterAmount) {
     private void createRiceOperationRecord(Long userId, RiceOperationType type, Long amount, Long beforeAmount, Long afterAmount) {
         RiceOperationRecord record = new RiceOperationRecord();
         RiceOperationRecord record = new RiceOperationRecord();
         record.setUserId(userId);
         record.setUserId(userId);
@@ -196,7 +198,7 @@ public class RiceInviteController extends BaseController {
         return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
         return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
     }
     }
 
 
-    private void  createRiceGetWaterRecord(Long userId, RiceWaterType type, Long amount, Long beforeAmount, Long afterAmount) {
+    private void createRiceGetWaterRecord(Long userId, RiceWaterType type, Long amount, Long beforeAmount, Long afterAmount) {
         RiceGetWaterRecord record = new RiceGetWaterRecord();
         RiceGetWaterRecord record = new RiceGetWaterRecord();
         record.setUserId(userId);
         record.setUserId(userId);
         record.setType(type);
         record.setType(type);

+ 1 - 1
src/main/vue/.env.development

@@ -1 +1 @@
-VUE_APP_BASE_URL=http://localhost:8080/
+VUE_APP_BASE_URL=https://test.raex.vip/

+ 2 - 2
src/main/vue/src/components/CollectionSearch.vue

@@ -16,7 +16,7 @@ export default {
                 '/collection/all',
                 '/collection/all',
                 {
                 {
                     sort: 'sort,desc;createdAt,desc',
                     sort: 'sort,desc;createdAt,desc',
-                    query: { del: false, source: 'OFFICIAL' }
+                    query: { del: false, source: 'OFFICIAL', id: this.collectionId }
                 },
                 },
                 { body: 'json' }
                 { body: 'json' }
             )
             )
@@ -62,4 +62,4 @@ export default {
         }
         }
     }
     }
 };
 };
-</script>
+</script>

+ 142 - 42
src/main/vue/src/views/MintActivityEdit.vue

@@ -2,7 +2,7 @@
     <div class="edit-view">
     <div class="edit-view">
         <page-title>
         <page-title>
             <el-button @click="$router.go(-1)" :disabled="saving">取消</el-button>
             <el-button @click="$router.go(-1)" :disabled="saving">取消</el-button>
-            <el-button @click="onDelete" :disabled="saving" type="danger" v-if="formData.id"> 删除 </el-button>
+            <el-button @click="onDelete" :disabled="saving" type="danger" v-if="formData.id"> 删除</el-button>
             <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
             <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
         </page-title>
         </page-title>
         <div class="edit-view__content-wrapper">
         <div class="edit-view__content-wrapper">
@@ -99,19 +99,57 @@
                         <el-radio v-model="formData.autoDrop" :label="false">否</el-radio>
                         <el-radio v-model="formData.autoDrop" :label="false">否</el-radio>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item
                     <el-form-item
-                        prop="airDropCollectionId"
-                        label="空投藏品"
+                        prop="targetCollectionIds"
+                        label="空投藏品列表"
                         v-if="formData.airDrop === true && formData.autoDrop === true"
                         v-if="formData.airDrop === true && formData.autoDrop === true"
                     >
                     >
-                        <collection-search v-model="formData.airDropCollectionId"></collection-search>
-                    </el-form-item>
-                    <el-form-item
-                        prop="autoDropNum"
-                        label="空投数量"
-                        v-if="formData.airDrop === true && formData.autoDrop === true"
-                    >
-                        <el-input-number v-model="formData.autoDropNum" :min="1"></el-input-number>
+                        <div v-for="(item, i) in formData.targetCollectionIds" class="rule-item">
+                            <collection-search
+                                ref="collectionSearch"
+                                v-model="formData.targetCollectionIds[i].id"
+                                style="width: 200px"
+                            >
+                            </collection-search>
+                            <!-- <el-select v-model="formData.targetCollectionIds[i].id" value-key="id" size="mini">
+                                <el-option
+                                    v-for="item in collections"
+                                    :key="item.id"
+                                    :value="item.id"
+                                    :label="item.name"
+                                ></el-option>
+                            </el-select> -->
+                            <!--                            <span style="padding: 0 10px; color: #606266; font-weight: bold">×&nbsp;1</span>-->
+                            延时空投
+                            <el-input
+                                v-model="formData.targetCollectionIds[i].delayHours"
+                                style="width: 50px; padding: 0 10px; color: #606266; font-weight: bold"
+                                :min="1"
+                            ></el-input>
+                            小时
+                            <el-input
+                                v-model="formData.targetCollectionIds[i].num"
+                                style="width: 50px; padding: 0 10px; color: #606266; font-weight: bold"
+                                :min="1"
+                            ></el-input>
+                            个
+                            <i @click="delCollection(i)" class="el-icon-delete icon-del"></i>
+                        </div>
+                        <el-button size="mini" @click="addCCollection">添加</el-button>
                     </el-form-item>
                     </el-form-item>
+                    <!--                    <el-form-item-->
+                    <!--                        prop="airDropCollectionId"-->
+                    <!--                        label="空投藏品"-->
+                    <!--                        v-if="formData.airDrop === true && formData.autoDrop === true"-->
+                    <!--                    >-->
+                    <!--                        <collection-search v-model="formData.airDropCollectionId"></collection-search>-->
+                    <!--                    </el-form-item>-->
+                    <!--                    <el-form-item-->
+                    <!--                        prop="autoDropNum"-->
+                    <!--                        label="空投数量"-->
+                    <!--                        v-if="formData.airDrop === true && formData.autoDrop === true"-->
+                    <!--                    >-->
+                    <!--                        <el-input-number v-model="formData.autoDropNum" :min="1"></el-input-number>-->
+                    <!--                    </el-form-item>-->
                     <el-form-item prop="onShelf" label="上架">
                     <el-form-item prop="onShelf" label="上架">
                         <el-radio v-model="formData.onShelf" :label="true">是</el-radio>
                         <el-radio v-model="formData.onShelf" :label="true">是</el-radio>
                         <el-radio v-model="formData.onShelf" :label="false">否</el-radio>
                         <el-radio v-model="formData.onShelf" :label="false">否</el-radio>
@@ -120,13 +158,13 @@
                         <el-radio v-model="formData.scheduleSale" :label="true">是</el-radio>
                         <el-radio v-model="formData.scheduleSale" :label="true">是</el-radio>
                         <el-radio v-model="formData.scheduleSale" :label="false">否</el-radio>
                         <el-radio v-model="formData.scheduleSale" :label="false">否</el-radio>
                     </el-form-item>
                     </el-form-item>
-                    <el-form-item prop="delay" label="延时空投">
-                        <el-radio v-model="formData.delay" :label="true">是</el-radio>
-                        <el-radio v-model="formData.delay" :label="false">否</el-radio>
-                    </el-form-item>
-                    <el-form-item prop="delayHours" label="延迟时间(分钟)">
-                        <el-input-number v-model="formData.delayHours" :min="0" class="width1"></el-input-number>
-                    </el-form-item>
+                    <!--                    <el-form-item prop="delay" label="延时空投">-->
+                    <!--                        <el-radio v-model="formData.delay" :label="true">是</el-radio>-->
+                    <!--                        <el-radio v-model="formData.delay" :label="false">否</el-radio>-->
+                    <!--                    </el-form-item>-->
+                    <!--                    <el-form-item prop="delayHours" label="延迟时间(分钟)">-->
+                    <!--                        <el-input-number v-model="formData.delayHours" :min="0" class="width1"></el-input-number>-->
+                    <!--                    </el-form-item>-->
                     <el-form-item prop="startTime" label="发布时间" v-if="formData.scheduleSale">
                     <el-form-item prop="startTime" label="发布时间" v-if="formData.scheduleSale">
                         <el-date-picker
                         <el-date-picker
                             v-model="formData.startTime"
                             v-model="formData.startTime"
@@ -135,6 +173,18 @@
                             placeholder="发布时间"
                             placeholder="发布时间"
                         ></el-date-picker>
                         ></el-date-picker>
                     </el-form-item>
                     </el-form-item>
+                    <el-form-item prop="endTime" label="定时结束">
+                        <el-radio v-model="formData.scheduleEnd" :label="true">是</el-radio>
+                        <el-radio v-model="formData.scheduleEnd" :label="false">否</el-radio>
+                    </el-form-item>
+                    <el-form-item prop="startTime" label="结束时间" v-if="formData.scheduleEnd">
+                        <el-date-picker
+                            v-model="formData.endTime"
+                            type="datetime"
+                            value-format="yyyy-MM-dd HH:mm:ss"
+                            placeholder="结束时间"
+                        ></el-date-picker>
+                    </el-form-item>
 
 
                     <el-form-item class="form-submit">
                     <el-form-item class="form-submit">
                         <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                         <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
@@ -143,9 +193,9 @@
                         </el-button>
                         </el-button>
                         <el-button @click="$router.go(-1)" :disabled="saving">取消</el-button>
                         <el-button @click="$router.go(-1)" :disabled="saving">取消</el-button>
                     </el-form-item>
                     </el-form-item>
-                    <el-form-item prop="holdingTags" label="持有藏品">
-                        <div v-for="(item, i) in formData.holdingTags" class="rule-item">
-                            <el-select v-model="formData.holdingTags[i]" value-key="id" size="mini">
+                    <el-form-item prop="holdingTagsList" label="持有藏品">
+                        <div v-for="(item, i) in formData.holdingTagsList" class="rule-item">
+                            <el-select v-model="formData.holdingTagsList[i].id" value-key="id" size="mini">
                                 <el-option
                                 <el-option
                                     v-for="item in tags"
                                     v-for="item in tags"
                                     :key="item.id"
                                     :key="item.id"
@@ -153,7 +203,13 @@
                                     :label="item.name"
                                     :label="item.name"
                                 ></el-option>
                                 ></el-option>
                             </el-select>
                             </el-select>
-                            <span style="padding: 0 10px; color: #606266; font-weight: bold">×&nbsp;1</span>
+                            <!--                            <span style="padding: 0 10px; color: #606266; font-weight: bold">×&nbsp;1</span>-->
+                            <el-input
+                                v-model="formData.holdingTagsList[i].num"
+                                style="width: 50px; padding: 0 10px; color: #606266; font-weight: bold"
+                                :min="1"
+                            ></el-input>
+                            个
                             <i @click="delHolding(i)" class="el-icon-delete icon-del"></i>
                             <i @click="delHolding(i)" class="el-icon-delete icon-del"></i>
                         </div>
                         </div>
                         <el-button size="mini" @click="addHolding">添加</el-button>
                         <el-button size="mini" @click="addHolding">添加</el-button>
@@ -166,6 +222,7 @@
 <script>
 <script>
 import { format, parse, isBefore } from 'date-fns';
 import { format, parse, isBefore } from 'date-fns';
 import TagSelect from '@/components/TagSelect';
 import TagSelect from '@/components/TagSelect';
+
 export default {
 export default {
     name: 'MintActivityEdit',
     name: 'MintActivityEdit',
     created() {
     created() {
@@ -184,6 +241,21 @@ export default {
         this.$http.post('/tag/all', { size: 10000 }, { body: 'json' }).then(res => {
         this.$http.post('/tag/all', { size: 10000 }, { body: 'json' }).then(res => {
             this.tags = res.content;
             this.tags = res.content;
         });
         });
+        let data = {
+            page: 0,
+            size: 20,
+            sort: 'createdAt,desc',
+            query: {
+                del: false,
+                source: 'OFFICIAL',
+                minterId: '',
+                companyId: '1'
+            },
+            search: ''
+        };
+        // this.$http.post('/collection/all', {size: 100}, {body: 'json'}).then(res => {
+        //     this.collections = res.content;
+        // });
     },
     },
     data() {
     data() {
         return {
         return {
@@ -271,6 +343,8 @@ export default {
                         trigger: 'blur'
                         trigger: 'blur'
                     }
                     }
                 ],
                 ],
+                // holdingTagsList: [{ required: true, message: '请选择持有藏品', trigger: 'blur' }],
+                // targetCollectionIds: [{ required: true, message: '请选择空投藏品', trigger: 'blur' }],
                 rule: [
                 rule: [
                     { required: true, message: '请选择规则', trigger: 'blur' },
                     { required: true, message: '请选择规则', trigger: 'blur' },
                     {
                     {
@@ -308,23 +382,24 @@ export default {
                         message: '请选择是否自动空投',
                         message: '请选择是否自动空投',
                         trigger: 'blur'
                         trigger: 'blur'
                     }
                     }
-                ],
-                airDropCollectionId: [
-                    {
-                        required: true,
-                        message: '请选择空投藏品',
-                        trigger: 'blur'
-                    }
-                ],
-                autoDropNum: [
-                    {
-                        required: true,
-                        message: '请输入空投数量',
-                        trigger: 'blur'
-                    }
                 ]
                 ]
+                // airDropCollectionId: [
+                //     {
+                //         required: true,
+                //         message: '请选择空投藏品',
+                //         trigger: 'blur'
+                //     }
+                // ],
+                // autoDropNum: [
+                //     {
+                //         required: true,
+                //         message: '请输入空投数量',
+                //         trigger: 'blur'
+                //     }
+                // ]
             },
             },
             tags: [],
             tags: [],
+            collections: [],
             holdingTags: []
             holdingTags: []
         };
         };
     },
     },
@@ -391,13 +466,31 @@ export default {
             this.formData.rule.and.splice(i, 1);
             this.formData.rule.and.splice(i, 1);
         },
         },
         addHolding() {
         addHolding() {
-            if (!this.formData.holdingTags) {
-                this.$set(this.formData, 'holdingTags', []);
+            if (!this.formData.holdingTagsList) {
+                this.$set(this.formData, 'holdingTagsList', []);
             }
             }
-            this.formData.holdingTags.push(null);
+            let data = {
+                id: null,
+                num: 1
+            };
+            this.formData.holdingTagsList.push(data);
         },
         },
         delHolding(i) {
         delHolding(i) {
-            this.formData.holdingTags.splice(i, 1);
+            this.formData.holdingTagsList.splice(i, 1);
+        },
+        addCCollection() {
+            if (!this.formData.targetCollectionIds) {
+                this.$set(this.formData, 'targetCollectionIds', []);
+            }
+            let data = {
+                id: null,
+                num: 1,
+                delayHours: 0
+            };
+            this.formData.targetCollectionIds.push(data);
+        },
+        delCollection(i) {
+            this.formData.targetCollectionIds.splice(i, 1);
         }
         }
     }
     }
 };
 };
@@ -409,27 +502,34 @@ export default {
         width: 270px;
         width: 270px;
     }
     }
 }
 }
+
 .tip {
 .tip {
     font-size: 12px;
     font-size: 12px;
     color: @text3;
     color: @text3;
     margin-top: 5px;
     margin-top: 5px;
 }
 }
+
 .width {
 .width {
     width: 300px;
     width: 300px;
 }
 }
+
 .width1 {
 .width1 {
     width: 150px;
     width: 150px;
 }
 }
-/deep/.el-input.is-disabled .el-input__inner {
+
+/deep/ .el-input.is-disabled .el-input__inner {
     color: #7c7e7e;
     color: #7c7e7e;
 }
 }
-/deep/.el-radio__input.is-disabled + span.el-radio__label {
+
+/deep/ .el-radio__input.is-disabled + span.el-radio__label {
     color: #7c7e7e;
     color: #7c7e7e;
 }
 }
+
 .rule-item {
 .rule-item {
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     margin-bottom: 10px;
     margin-bottom: 10px;
+
     .icon-del {
     .icon-del {
         color: #f56c6c;
         color: #f56c6c;
         cursor: pointer;
         cursor: pointer;

+ 3 - 0
src/main/vue/src/widgets/Detail.vue

@@ -37,6 +37,9 @@
                     <el-table-column align="center" prop="royalties" label="版权费"> </el-table-column>
                     <el-table-column align="center" prop="royalties" label="版权费"> </el-table-column>
                     <el-table-column align="center" prop="recharge" label="充值"> </el-table-column>
                     <el-table-column align="center" prop="recharge" label="充值"> </el-table-column>
                     <el-table-column align="center" prop="withdraw" label="提现"> </el-table-column>
                     <el-table-column align="center" prop="withdraw" label="提现"> </el-table-column>
+                    <el-table-column align="center" prop="domainOrderMonth" label="本月域名"> </el-table-column>
+                    <el-table-column align="center" prop="domainCount" label="域名注册"> </el-table-column>
+                    <el-table-column align="center" prop="countMonth" label="本月注册"> </el-table-column>
                 </el-table>
                 </el-table>
             </div>
             </div>
             <canvas ref="chart" class="chart"></canvas>
             <canvas ref="chart" class="chart"></canvas>